diff -uNr old/thumbnail-checker.glade new_thumbnail/thumbnail-checker.glade --- old/thumbnail-checker.glade 2006-08-30 23:53:11.000000000 +0800 +++ new_thumbnail/thumbnail-checker.glade 2006-08-30 22:43:48.000000000 +0800 @@ -29,37 +29,81 @@ 12 - + + 128 True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - + False + 6 - - - True - GTK_PROGRESS_LEFT_TO_RIGHT - 0 - 0.10000000149 - PANGO_ELLIPSIZE_NONE + + + True + False + 0 + + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + True + True + + + + + + True + GTK_PROGRESS_LEFT_TO_RIGHT + 0 + 0.10000000149 + PANGO_ELLIPSIZE_NONE + + + 0 + True + False + + + + + 0 + True + True + + + + + + 128 + 128 + True + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + 0 @@ -90,6 +134,8 @@ False False False + + @@ -101,111 +147,213 @@ - + True - GTK_BUTTONBOX_END - 6 + False + 0 - + True - False - True - True - gtk-stop - True - GTK_RELIEF_NORMAL - True - + GTK_BUTTONBOX_START + 6 + + + + True + False + True + True + GTK_RELIEF_NORMAL + True + + + + + True + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 + + + + True + False + 2 + + + + True + gtk-delete + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Remove All + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + + + + + 0 + True + True + - + True - True - True - GTK_RELIEF_NORMAL - True - + GTK_BUTTONBOX_END + 6 - + True - 0.5 - 0.5 - 0 - 0 - 0 - 0 - 0 - 0 + False + True + True + gtk-stop + True + GTK_RELIEF_NORMAL + True + + + + + + + True + True + True + GTK_RELIEF_NORMAL + True + - + True - False - 2 + 0.5 + 0.5 + 0 + 0 + 0 + 0 + 0 + 0 - + True - gtk-go-forward - 4 - 0.5 - 0.5 - 0 - 0 - - - 0 - False - False - - + False + 2 - - - True - _Start - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + + + True + gtk-go-forward + 4 + 0.5 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + True + _Start + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + - - 0 - False - False - - - - - - True - True - True - gtk-close - True - GTK_RELIEF_NORMAL - True - + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + + + + + 0 + True + True + diff -uNr old/thumbnail-checker.py new_thumbnail/thumbnail-checker.py --- old/thumbnail-checker.py 2006-08-30 23:53:33.000000000 +0800 +++ new_thumbnail/thumbnail-checker.py 2006-08-30 23:50:58.000000000 +0800 @@ -3,6 +3,7 @@ from gnomevfs import get_local_path_from_uri from gc import collect from os.path import join, getsize +from string import atoi import gtk import gtk.gdk @@ -18,24 +19,26 @@ self.first_time = True xml = gtk.glade.XML('thumbnail-checker.glade', None, None) - self.model = gtk.TreeStore(str, str) + self.model = gtk.TreeStore(str, str, str, int) self.window = xml.get_widget('window') - treeview = xml.get_widget('treeview') + self.treeview = xml.get_widget('treeview') self.progressbar = xml.get_widget('progressbar') self.progress = xml.get_widget('progress') self.button_start = xml.get_widget('button_start') self.button_stop = xml.get_widget('button_stop') + self.image_view = xml.get_widget('image2') + self.removeall = xml.get_widget('RemoveAllButton') xml.signal_autoconnect(self) - treeview.set_search_column(1) - treeview.set_model(self.model) + self.treeview.set_search_column(1) + self.treeview.set_model(self.model) renderer = gtk.CellRendererText() column = gtk.TreeViewColumn("File name or Thumbnail file", renderer, text=0) column.set_resizable(True) column.set_expand(True) - treeview.append_column(column) + self.treeview.append_column(column) renderer = gtk.CellRendererText() renderer.set_property('xalign', 1.0) @@ -43,7 +46,20 @@ column.set_resizable(True) column.set_min_width(80) column.set_resizable(True) - treeview.append_column(column) + self.treeview.append_column(column) + + column = gtk.TreeViewColumn("Thumbnail Path", None) + column.set_visible(False) + self.treeview.append_column(column) + + column = gtk.TreeViewColumn("Size", None) + column.set_visible(False) + self.treeview.append_column(column) + + self.homedir = os.path.expanduser('~') + (self.invalid_size, self.invalid_count, self.non_fd_size, self.non_fd_count, + self.orphan_size, self.orphan_count, self.external_size, self.external_count) = (0,0,0,0,0,0,0,0) + (self.orphan_iter, self.external_iter, self.invalid_iter, self.non_fd_iter) = (None, None, None, None) def show(self): self.window.show_all() @@ -65,18 +81,17 @@ self.id = gobject.idle_add(self.task.next) def walk(self, *args): - (invalid_size, invalid_count) = (0, 0) - (non_fd_size, non_fd_count) = (0, 0) - (orphan_size, orphan_count) = (0, 0) - (external_size, external_count) = (0, 0) + (self.invalid_size, self.invalid_count) = (0, 0) + (self.non_fd_size, self.non_fd_count) = (0, 0) + (self.orphan_size, self.orphan_count) = (0, 0) + (self.external_size, self.external_count) = (0, 0) - orphan_iter = self.model.append(None, ["Orphans", '0']) - external_iter = self.model.append(None, ["Orphans and/or Externals", '0']) - invalid_iter = self.model.append(None, ["Invalid (broken image)", '0']) - non_fd_iter = self.model.append(None, ["No Free Desktop compliant", '0']) + self.orphan_iter = self.model.append(None, ["Orphans", '0','',0]) + self.external_iter = self.model.append(None, ["Orphans and/or Externals", '0','',0]) + self.invalid_iter = self.model.append(None, ["Invalid (broken image)", '0','',0]) + self.non_fd_iter = self.model.append(None, ["No Free Desktop compliant", '0','',0]) rootdir = os.path.expanduser('~/.thumbnails') - homedir = os.path.expanduser('~') for root, dirs, files in os.walk(rootdir): i = 0.0 @@ -89,7 +104,7 @@ i = i + 1.0 uri = None filename = join(root, name) - shortname = filename.replace(homedir, '~') + shortname = filename.replace(self.homedir, '~') self.progressbar.set_fraction(i / len(files)) text = "%d of %d" % (i, len(files)) @@ -111,59 +126,59 @@ if len(local_path) == 0 and uri is not None and len(uri): # external resource (vfs method and/or orphan) size = getsize(filename) - external_size += size - external_count += 1 + self.external_size += size + self.external_count += 1 str_size = locale.format("%d", size, grouping=True) - self.model.append(external_iter, [uri, str_size]) + self.model.append(self.external_iter, [uri, str_size, filename, size]) - str_size = locale.format("%d", external_size, grouping=True) - self.model.set(external_iter, 1, str_size) - self.model.set(external_iter, 0, - "Orphans and/or Externals [%d]" % external_count) + str_size = locale.format("%d", self.external_size, grouping=True) + self.model.set(self.external_iter, 1, str_size) + self.model.set(self.external_iter, 0, + "Orphans and/or Externals [%d]" % self.external_count) elif len(local_path) and not os.path.lexists(local_path): # orphan thumbnail size = getsize(filename) - orphan_size += size - orphan_count += 1 - shortname = local_path.replace(homedir, '~') + self.orphan_size += size + self.orphan_count += 1 + shortname = local_path.replace(self.homedir, '~') str_size = locale.format("%d", size, grouping=True) - self.model.append(orphan_iter, [shortname, str_size]) + self.model.append(self.orphan_iter, [shortname, str_size, filename, size]) - str_size = locale.format("%d", orphan_size, grouping=True) - self.model.set(orphan_iter, 1, str_size) - self.model.set(orphan_iter, 0, "Orphans [%d]" % orphan_count) + str_size = locale.format("%d", self.orphan_size, grouping=True) + self.model.set(self.orphan_iter, 1, str_size) + self.model.set(self.orphan_iter, 0, "Orphans [%d]" % self.orphan_count) elif uri is None: # pixbuf is ok, but no FD compliant. size = getsize(filename) - non_fd_size += size - non_fd_count += 1 + self.non_fd_size += size + self.non_fd_count += 1 str_size = locale.format("%d", size, grouping=True) - self.model.append(non_fd_iter, [shortname, str_size]) + self.model.append(self.non_fd_iter, [shortname, str_size, filename, size]) - str_size = locale.format("%d", non_fd_size, grouping=True) - self.model.set(non_fd_iter, 1, str_size) - self.model.set(non_fd_iter, 0, - "No Free Desktop compliant [%d]" % non_fd_count) + str_size = locale.format("%d", self.non_fd_size, grouping=True) + self.model.set(self.non_fd_iter, 1, str_size) + self.model.set(self.non_fd_iter, 0, + "Non Free Desktop compliant [%d]" % self.non_fd_count) elif len(uri) == 0: # thumbnail is not a valid pixbuf size = getsize(filename) - invalid_size += size - invalid_count += 1 - shortname = filename.replace(homedir, '~') + self.invalid_size += size + self.invalid_count += 1 + shortname = filename.replace(self.homedir, '~') str_size = locale.format("%d", size, grouping=True) - self.model.append(invalid_iter, [shortname, str_size]) + self.model.append(self.invalid_iter, [shortname, str_size, filename, size]) - str_size = locale.format("%d", invalid_size, grouping=True) - self.model.set(invalid_iter, 1, str_size) - self.model.set(invalid_iter, 0, - "Invalid (broken images) [%d]" % invalid_count) + str_size = locale.format("%d", self.invalid_size, grouping=True) + self.model.set(self.invalid_iter, 1, str_size) + self.model.set(self.invalid_iter, 0, + "Invalid (broken images) [%d]" % self.invalid_count) collect() yield True @@ -172,13 +187,102 @@ self.progress.set_text(text) yield True + if self.non_fd_count+self.external_count+self.orphan_count+self.invalid_count != 0: + self.removeall.set_sensitive(True) + + self.button_stop.set_sensitive(False) + self.button_start.set_sensitive(True) + self.progressbar.set_text('Done') self.progress.set_text('') yield False + + def on_treeview_cursor_changed(self, *args): + (path, col) = self.treeview.get_cursor() + iter = self.model.get_iter(path) + if self.model.iter_depth(iter) != 0: + value = self.model.get_value(iter, 2) + self.image_view.set_from_file(value) + + def on_treeview_key_press_event(self, widget, event, *args): + if event.hardware_keycode == 107: # Delete key + (path, col) = self.treeview.get_cursor() + if path != None: + iter = self.model.get_iter(path) + if self.model.iter_depth(iter) != 0: + parent = self.model.iter_parent(iter) + value = self.model.get_value(iter, 2) + size = self.model.get_value(iter,3) + print "Deleting %s" % value + os.remove(value) + self.model.remove(iter) + if self.model.get_string_from_iter(parent) == self.model.get_string_from_iter(self.external_iter): + self.external_size -= size + self.external_count -= 1 + str_size = locale.format("%d", self.external_size, grouping=True) + self.model.set(self.external_iter, 1, str_size) + if self.external_count != 0: + self.model.set(self.external_iter, 0, + "Orphans and/or Externals [%d]" % self.external_count) + else: + self.model.set(self.external_iter, 0, "Orphans and/or Externals") + + elif self.model.get_string_from_iter(parent) == self.model.get_string_from_iter(self.orphan_iter): + self.orphan_size -= size + self.orphan_count -= 1 + str_size = locale.format("%d", self.orphan_size, grouping=True) + self.model.set(self.orphan_iter, 1, str_size) + if self.orphan_count != 0: + self.model.set(self.orphan_iter, 0, + "Orphans [%d]" % self.orphan_count) + else: + self.model.set(self.orphan_iter, 0, "Orphans") + + elif self.model.get_string_from_iter(parent) == self.model.get_string_from_iter(self.non_fd_iter): + self.non_fd_size -= size + self.non_fd_count -= 1 + str_size = locale.format("%d", self.non_fd_size, grouping=True) + self.model.set(self.non_fd_iter, 1, str_size) + if self.non_fd_count != 0: + self.model.set(self.non_fd_iter, 0, + "Non Free Desktop compliant [%d]" % self.non_fd_count) + else: + self.model.set(self.non_fd_iter, 0, "Non Free Desktop compliant") + + elif self.model.get_string_from_iter(parent) == self.model.get_string_from_iter(self.invalid_iter): + self.invalid_size -= size + self.invalid_count -= 1 + str_size = locale.format("%d", self.invalid_size, grouping=True) + self.model.set(self.invalid_iter, 1, str_size) + if self.invalid_count != 0: + self.model.set(self.invalid_iter, 0, + "Invalid (broken images) [%d]" % self.invalid_count) + else: + self.model.set(self.invalid_iter, 0, "Invalid (broken images)") + + if self.non_fd_count+self.external_count+self.orphan_count+self.invalid_count == 0: + self.removeall.set_sensitive(False) + + if self.model.iter_is_valid(iter) == True: + self.treeview.set_cursor(path, None, False) + + def on_RemoveAllButton_clicked(self, *args): + + iter = self.model.get_iter_root() + while iter != None: + if self.model.iter_has_child(iter) == True: + child_iter = self.model.iter_children(iter) + while child_iter != None: + filename = self.model.get_value(child_iter,2) +# print "Deleting %s" % filename + os.remove(filename) + child_iter = self.model.iter_next(child_iter) + iter = self.model.iter_next(iter) + self.model.clear() + if __name__ == "__main__": - (lang_code, encoding) = locale.getdefaultlocale() - locale.setlocale(locale.LC_ALL, lang_code) + locale.setlocale(locale.LC_ALL,locale.getdefaultlocale()) checker = ThumbnailChecker() checker.show()