def set_filename(self, filename): """Set the filename to be displayed to <filename>. Call this before set_main_info(). """ label = labels.BoldLabel(encoding.to_unicode(filename)) label.set_alignment(0, 0.5) self._mainbox.pack_start(label, False, False) self._mainbox.pack_start(gtk.VBox()) # Just to add space (better way?)
def __init__(self, library, paths, collection): """Adds the books at <paths> to the library, and also to the <collection>, unless it is None. """ gtk.Dialog.__init__(self, _('Adding books'), library, gtk.DIALOG_MODAL, (gtk.STOCK_STOP, gtk.RESPONSE_CLOSE)) self._destroy = False self.set_size_request(400, -1) self.set_has_separator(False) self.set_resizable(False) self.set_border_width(4) self.connect('response', self._response) self.set_default_response(gtk.RESPONSE_CLOSE) main_box = gtk.VBox(False, 5) main_box.set_border_width(6) self.vbox.pack_start(main_box, False, False) hbox = gtk.HBox(False, 10) main_box.pack_start(hbox, False, False, 5) left_box = gtk.VBox(True, 5) right_box = gtk.VBox(True, 5) hbox.pack_start(left_box, False, False) hbox.pack_start(right_box, False, False) label = labels.BoldLabel('%s:' % _('Added books')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) number_label = gtk.Label('0') number_label.set_alignment(0, 1.0) right_box.pack_start(number_label, True, True) bar = gtk.ProgressBar() main_box.pack_start(bar, False, False) added_label = labels.ItalicLabel() added_label.set_alignment(0, 0.5) added_label.set_ellipsize(pango.ELLIPSIZE_MIDDLE) main_box.pack_start(added_label, False, False) self.show_all() total_paths = float(len(paths)) total_added = 0 for i, path in enumerate(paths): if library.backend.add_book(path, collection): total_added += 1 number_label.set_text('%d' % total_added) added_label.set_text( _("Adding '%s'...") % encoding.to_unicode(path)) bar.set_fraction((i + 1) / total_paths) while gtk.events_pending(): gtk.main_iteration(False) if self._destroy: return self._response()
def __init__(self, header, right_column_width=150): """Contruct a new section with the header set to the text in <header>, and the width request of the (possible) right columns set to that of <right_column_width>. """ gtk.VBox.__init__(self, False, 0) self._right_column_width = right_column_width self.contentbox = gtk.VBox(False, 6) label = labels.BoldLabel(header) label.set_alignment(0, 0.5) hbox = gtk.HBox(False, 0) hbox.pack_start(gtk.HBox(), False, False, 6) hbox.pack_start(self.contentbox) self.pack_start(label, False, False) self.pack_start(hbox, False, False, 6)
def set_secondary_info(self, info): """Set the information below the main info box to the values in the sequence <info>. Each entry in info should be a tuple (desc, value). """ hbox = gtk.HBox(False, 10) self.pack_start(hbox, False, False) left_box = gtk.VBox(True, 8) right_box = gtk.VBox(True, 8) hbox.pack_start(left_box, False, False) hbox.pack_start(right_box, False, False) for desc, value in info: desc_label = labels.BoldLabel('%s:' % desc) desc_label.set_alignment(1.0, 1.0) left_box.pack_start(desc_label, True, True) value_label = gtk.Label(value) value_label.set_alignment(0, 1.0) right_box.pack_start(value_label, True, True)
def __init__(self, library): self._library = library gtk.HBox.__init__(self, False, 12) self.set_border_width(10) borderbox = gtk.EventBox() borderbox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#333')) borderbox.set_size_request(350, -1) insidebox = gtk.EventBox() insidebox.set_border_width(1) insidebox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#ddb')) infobox = gtk.VBox(False, 5) infobox.set_border_width(10) self.pack_start(borderbox, False, False) borderbox.add(insidebox) insidebox.add(infobox) self._namelabel = labels.BoldLabel() self._namelabel.set_ellipsize(pango.ELLIPSIZE_MIDDLE) self._namelabel.set_alignment(0, 0.5) infobox.pack_start(self._namelabel, False, False) self._pageslabel = gtk.Label() self._pageslabel.set_ellipsize(pango.ELLIPSIZE_MIDDLE) self._pageslabel.set_alignment(0, 0.5) infobox.pack_start(self._pageslabel, False, False) self._filelabel = gtk.Label() self._filelabel.set_ellipsize(pango.ELLIPSIZE_MIDDLE) self._filelabel.set_alignment(0, 0.5) infobox.pack_start(self._filelabel, False, False) self._dirlabel = gtk.Label() self._dirlabel.set_ellipsize(pango.ELLIPSIZE_MIDDLE) self._dirlabel.set_alignment(0, 0.5) infobox.pack_start(self._dirlabel, False, False) vbox = gtk.VBox(False, 10) self.pack_start(vbox, True, True) hbox = gtk.HBox(False) vbox.pack_start(hbox, False, False) label = gtk.Label('%s:' % _('Search')) hbox.pack_start(label, False, False) search_entry = gtk.Entry() search_entry.connect('activate', self._filter_books) search_entry.set_tooltip_text( _('Display only those books that have ' 'the specified text string in their ' 'full path. The search is not case ' 'sensitive.')) hbox.pack_start(search_entry, True, True, 6) label = gtk.Label('%s:' % _('Cover size')) hbox.pack_start(label, False, False, 6) adjustment = gtk.Adjustment(prefs['library cover size'], 50, 128, 1, 10, 0) cover_size_scale = gtk.HScale(adjustment) cover_size_scale.set_size_request(150, -1) cover_size_scale.set_draw_value(False) cover_size_scale.connect('value_changed', self._change_cover_size) hbox.pack_start(cover_size_scale, False, False) vbox.pack_start(gtk.HBox(), True, True) hbox = gtk.HBox(False, 10) vbox.pack_start(hbox, False, False) add_book_button = gtk.Button(_('Add books')) add_book_button.set_image( gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)) add_book_button.connect('clicked', self._add_books) add_book_button.set_tooltip_text(_('Add more books to the library.')) hbox.pack_start(add_book_button, False, False) add_collection_button = gtk.Button(_('Add collection')) add_collection_button.connect('clicked', self._add_collection) add_collection_button.set_image( gtk.image_new_from_stock(gtk.STOCK_ADD, gtk.ICON_SIZE_BUTTON)) add_collection_button.set_tooltip_text( _('Add a new empty collection.')) hbox.pack_start(add_collection_button, False, False) hbox.pack_start(gtk.HBox(), True, True) self._open_button = gtk.Button(None, gtk.STOCK_OPEN) self._open_button.connect('clicked', self._library.book_area.open_selected_book) self._open_button.set_tooltip_text(_('Open the selected book.')) self._open_button.set_sensitive(False) hbox.pack_start(self._open_button, False, False)
def __init__(self, window): gtk.Dialog.__init__(self, _('About'), window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)) self.set_has_separator(False) self.set_resizable(False) self.connect('response', _close_dialog) self.set_default_response(gtk.RESPONSE_CLOSE) notebook = gtk.Notebook() self.vbox.pack_start(notebook, False, False, 0) self.set_border_width(4) notebook.set_border_width(6) # ---------------------------------------------------------------- # About tab. # ---------------------------------------------------------------- box = gtk.VBox(False, 0) box.set_border_width(5) base = os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0]))) icon_path = os.path.join(base, 'images/comix.svg') if not os.path.isfile(icon_path): for prefix in [base, '/usr', '/usr/local', '/usr/X11R6']: icon_path = os.path.join(prefix, 'share/comix/images/comix.svg') if os.path.isfile(icon_path): break try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(icon_path, 200, 200) icon = gtk.Image() icon.set_from_pixbuf(pixbuf) box.pack_start(icon, False, False, 10) except Exception: print('! Could not find the icon file "comix.svg"\n') label = gtk.Label() label.set_markup( '<big><big><big><big><b><span foreground="#333333">Com</span>' + '<span foreground="#79941b">ix</span> <span foreground="#333333">' + constants.VERSION + '</span></b></big></big></big></big>\n\n' + _('Comix is an image viewer specifically designed to handle comic books.') + '\n' + _('It reads ZIP, RAR and tar archives, as well as plain image files.') + '\n\n' + _('Comix is licensed under the GNU General Public License.') + '\n\n' + '<small>Copyright © 2005-2009 Pontus Ekberg\n\n' + '[email protected]\n' + 'http://comix.sourceforge.net</small>\n' + '<small>Copyright © 2010-2017 David Pineau\n\n' + '[email protected]\n' + 'https://github.com/Joacchim/Comix</small>\n' + '<small>Copyright © 2014-2017 Sergey Dryabzhinsky\n\n' + '[email protected]\n' + 'https://github.com/sergey-dryabzhinksy/Comix</small>\n' + '\n' + _('Image processing library') + ': {}\n'.format(ImageVersion) ) box.pack_start(label, True, True, 0) label.set_justify(gtk.JUSTIFY_CENTER) label.set_selectable(True) notebook.insert_page(box, gtk.Label(_('About'))) # ---------------------------------------------------------------- # Credits tab. # ---------------------------------------------------------------- scrolled = gtk.ScrolledWindow() scrolled.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) hbox = gtk.HBox(False, 5) hbox.set_border_width(5) scrolled.add_with_viewport(hbox) left_box = gtk.VBox(True, 8) right_box = gtk.VBox(True, 8) hbox.pack_start(left_box, False, False) hbox.pack_start(right_box, False, False) for nice_person, description in ( ('Pontus Ekberg', _('Developer')), ('Emfox Zhou', _('Simplified Chinese translation')), ('Xie Yanbo', _('Simplified Chinese translation')), ('Manuel Quiñones', _('Spanish translation')), ('Marcelo Góes', _('Brazilian Portuguese translation')), ('Christoph Wolk', _('German translation and Nautilus thumbnailer')), ('Chris Leick', _('German translation')), ('Raimondo Giammanco', _('Italian translation')), ('GhePeU', _('Italian translation')), ('Arthur Nieuwland', _('Dutch translation')), ('Achraf Cherti', _('French translation')), ('Benoît H.', _('French translation')), ('Kamil Leduchowski', _('Polish translation')), ('Darek Jakoniuk', _('Polish translation')), ('Paul Chatzidimitriou', _('Greek translation')), ('Carles Escrig Royo', _('Catalan translation')), ('Hsin-Lin Cheng', _('Traditional Chinese translation')), ('Wayne Su', _('Traditional Chinese translation')), ('Mamoru Tasaka', _('Japanese translation')), ('Ernő Drabik', _('Hungarian translation')), ('Artyom Smirnov', _('Russian translation')), ('Adrian C.', _('Croatian translation')), ('김민기', _('Korean translation')), ('Maryam Sanaat', _('Persian translation')), ('Andhika Padmawan', _('Indonesian translation')), ('Jan Nekvasil', _('Czech translation')), ('Олександр Заяц', _('Ukrainian translation')), ('Roxerio Roxo Carrillo', _('Galician translation')), ('Victor Castillejo', _('Icon design'))): name_label = labels.BoldLabel('{}:'.format(nice_person)) name_label.set_alignment(1.0, 1.0) left_box.pack_start(name_label, True, True) desc_label = gtk.Label(description) desc_label.set_alignment(0, 1.0) right_box.pack_start(desc_label, True, True) notebook.insert_page(scrolled, gtk.Label(_('Credits'))) self.show_all()
def __init__(self, window): self._num_thumbs = 0 gtk.Dialog.__init__(self, _('Thumbnail maintenance'), window, 0, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)) button = self.add_button(_('Cleanup'), gtk.RESPONSE_OK) button.set_image( gtk.image_new_from_stock(gtk.STOCK_CLEAR, gtk.ICON_SIZE_BUTTON)) self.set_has_separator(False) self.set_resizable(False) self.set_border_width(4) self.connect('response', self._response) self.set_default_response(gtk.RESPONSE_OK) main_box = gtk.VBox(False, 5) main_box.set_border_width(6) self.vbox.pack_start(main_box, False, False) label = labels.BoldLabel(_('Cleanup thumbnails')) label.set_alignment(0, 0.5) attrlist = label.get_attributes() attrlist.insert( pango.AttrScale(pango.SCALE_LARGE, 0, len(label.get_text()))) label.set_attributes(attrlist) main_box.pack_start(label, False, False, 2) main_box.pack_start(gtk.HSeparator(), False, False, 5) label = labels.ItalicLabel( _('Thumbnails for files (such as image ' 'files and comic book archives) are stored ' 'in your home directory. Many different ' 'applications use and create these thumbnails,' ' but sometimes thumbnails remain even though ' 'the original files have been removed - wasting ' 'space. This dialog can cleanup your stored ' 'thumbnails by removing orphaned and outdated ' 'thumbnails.')) label.set_alignment(0, 0.5) label.set_line_wrap(True) main_box.pack_start(label, False, False, 10) hbox = gtk.HBox(False, 10) main_box.pack_start(hbox, False, False) left_box = gtk.VBox(True, 5) right_box = gtk.VBox(True, 5) hbox.pack_start(left_box, False, False) hbox.pack_start(right_box, False, False) label = labels.BoldLabel('%s:' % _('Thumbnail directory')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) label = gtk.Label('%s' % encoding.to_unicode(_thumb_base)) label.set_alignment(0, 1.0) right_box.pack_start(label, True, True) label = labels.BoldLabel('%s:' % _('Total number of thumbnails')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) self._num_thumbs_label = gtk.Label(_('Calculating...')) self._num_thumbs_label.set_alignment(0, 1.0) right_box.pack_start(self._num_thumbs_label, True, True) label = labels.BoldLabel('%s:' % _('Total size of thumbnails')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) self._size_thumbs_label = gtk.Label(_('Calculating...')) self._size_thumbs_label.set_alignment(0, 1.0) right_box.pack_start(self._size_thumbs_label, True, True) label = labels.ItalicLabel( _('Do you want to cleanup orphaned and outdated thumbnails now?')) label.set_alignment(0, 0.5) main_box.pack_start(label, False, False, 10) self.show_all() while gtk.events_pending(): gtk.main_iteration(False) self._update_num_and_size()
def __init__(self, parent, total_thumbs): self._total_thumbs = total_thumbs self._destroy = False gtk.Dialog.__init__(self, _('Removing thumbnails'), parent, 0, (gtk.STOCK_STOP, gtk.RESPONSE_CLOSE)) self.set_size_request(400, -1) self.set_has_separator(False) self.set_resizable(False) self.set_border_width(4) self.connect('response', self._response) self.set_default_response(gtk.RESPONSE_CLOSE) main_box = gtk.VBox(False, 5) main_box.set_border_width(6) self.vbox.pack_start(main_box, False, False) hbox = gtk.HBox(False, 10) main_box.pack_start(hbox, False, False, 5) left_box = gtk.VBox(True, 5) right_box = gtk.VBox(True, 5) hbox.pack_start(left_box, False, False) hbox.pack_start(right_box, False, False) label = labels.BoldLabel('%s:' % _('Number of removed thumbnails')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) number_label = gtk.Label('0') number_label.set_alignment(0, 1.0) right_box.pack_start(number_label, True, True) label = labels.BoldLabel('%s:' % _('Total size of removed thumbnails')) label.set_alignment(1.0, 1.0) left_box.pack_start(label, True, True) size_label = gtk.Label('0.0 MiB') size_label.set_alignment(0, 1.0) right_box.pack_start(size_label, True, True) bar = gtk.ProgressBar() main_box.pack_start(bar, False, False) removing_label = labels.ItalicLabel() removing_label.set_alignment(0, 0.5) removing_label.set_ellipsize(pango.ELLIPSIZE_MIDDLE) main_box.pack_start(removing_label, False, False) self.show_all() iteration = 0.0 removed_thumbs = 0 thumbs_size = 0 for subdir in ('normal', 'large'): dir_path = os.path.join(_thumb_base, subdir) if not os.path.isdir(dir_path) or not os.access(dir_path, os.X_OK): continue for entry in os.listdir(dir_path): if self._destroy: return iteration += 1 entry_path = os.path.join(dir_path, entry) if not os.path.isfile(entry_path) or not os.access( entry_path, os.W_OK | os.R_OK): continue try: im_info = Image.open(entry_path).info thumb_mtime = int(im_info['Thumb::MTime']) src_path = _uri_to_path(im_info['Thumb::URI']) broken = False except Exception: src_path = '?' broken = True else: try: src_mtime = os.stat(src_path).st_mtime except Exception: src_mtime = None # Thumb is orphaned, outdated or invalid. if broken or not os.path.isfile( src_path) or src_mtime != thumb_mtime: size = os.stat(entry_path).st_size try: os.remove(entry_path) except Exception: continue removed_thumbs += 1 thumbs_size += size number_label.set_text('%d' % removed_thumbs) size_label.set_text('%.1f MiB' % (thumbs_size / 1048576.0)) if broken: src_path = '?' else: src_path = encoding.to_unicode(src_path) removing_label.set_text( _("Removed thumbnail for '%s'") % src_path) if iteration % 50 == 0: bar.set_fraction(min(1, iteration / self._total_thumbs)) while gtk.events_pending(): gtk.main_iteration(False) self._response()