def __init__(self, is_editable, playlist_manager): super(BlaMetadataViewer, self).__init__(spacing=blaconst.WIDGET_SPACING) model = gtk.ListStore(gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT) self._treeview = BlaMetadataViewer.TreeView(model, is_editable=is_editable) self._treeview.set_reorderable(False) self._treeview.set_rubber_banding(True) self._treeview.set_property("rules_hint", True) # Name column r = gtk.CellRendererText() self._treeview.insert_column_with_data_func(-1, "Name", r, self.__cdf_name) # Value column r = gtk.CellRendererText() r.set_property("ellipsize", pango.ELLIPSIZE_END) r.set_property("editable", is_editable) self._treeview.insert_column_with_data_func(-1, "Value", r, self.__cdf_value) if is_editable: def editing_started(renderer, editable, path): self._treeview.set_cursor(path) model = self._treeview.get_model() # Remove the "Varies between tracks" label. if model[path][1] is None: editable.set_text("") r.connect("editing_started", editing_started) def edited(renderer, path, text): row = self._treeview.get_model()[path] identifier = row[0] if row[1] != text: row[1] = text self.emit("value_changed", identifier, text) r.connect("edited", edited) for column in self._treeview.get_columns(): column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE) # Wrap the treeview. sw = BlaScrolledWindow() sw.add(self._treeview) self._pb = gtk.ProgressBar() self._pb.set_visible(False) self.pack_start(sw, expand=True) self.pack_start(self._pb, expand=False) playlist_manager.connect_object("selection_changed", BlaMetadataViewer._update_model, self) self._uris = [] sw.show_all() self.show()
def __init__(self, views): super(BlaSidePane, self).__init__(spacing=blaconst.WIDGET_SPACING) notebook = gtk.Notebook() notebook.set_scrollable(True) # Set up the lyrics textview. self.__tv = gtk.TextView() self.__tv.set_size_request(self.__MIN_WIDTH, -1) self.__tv.set_editable(False) self.__tv.set_cursor_visible(False) self.__tv.set_wrap_mode(gtk.WRAP_WORD) self.__tv.set_justification(gtk.JUSTIFY_CENTER) sw = BlaScrolledWindow() sw.set_shadow_type(gtk.SHADOW_NONE) sw.add(self.__tv) sw.show_all() self.__style = self.__tv.get_modifier_style().copy() self.__tb = self.__tv.get_buffer() self.__tb.create_tag("bold", weight=pango.WEIGHT_BOLD) self.__tb.create_tag("large", scale=pango.SCALE_LARGE) self.__tb.create_tag("italic", style=pango.STYLE_ITALIC) self.__tag = self.__tb.create_tag("color") # Set up the view selector. viewport = gtk.Viewport() viewport.set_shadow_type(gtk.SHADOW_IN) self.__treeview = blaguiutils.BlaTreeViewBase( allow_empty_selection=False) self.__treeview.get_selection().set_mode(gtk.SELECTION_SINGLE) self.__treeview.set_headers_visible(False) self.__treeview.set_property("rules_hint", True) r = gtk.CellRendererText() r.set_property("ellipsize", pango.ELLIPSIZE_END) c = gtk.TreeViewColumn() c.pack_start(r, expand=True) c.add_attribute(r, "text", 0) r = gtk.CellRendererText() r.set_alignment(1.0, 0.5) c.pack_start(r, expand=False) def cell_data_func(column, renderer, model, iterator): count = model[iterator][1] renderer.set_property( "markup", "<i>(%d)</i>" % count if count > 0 else "") c.set_cell_data_func(r, cell_data_func) self.__treeview.append_column(c) viewport.add(self.__treeview) model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT) self.__treeview.set_model(model) [model.append([view.view_name, 0]) for view in views] selection = self.__treeview.get_selection() selection.select_path(blacfg.getint("general", "view")) self.__treeview.get_selection().connect( "changed", self.__selection_changed) self.cover_display = BlaSidePane.BlaCoverDisplay() hbox = gtk.HBox(spacing=blaconst.WIDGET_SPACING) hbox.pack_start(viewport, expand=True) hbox.pack_start(self.cover_display, expand=False, fill=True) notebook.append_page(BlaTagEditor(views[blaconst.VIEW_PLAYLISTS]), gtk.Label("Tags")) notebook.append_page(BlaProperties(views[blaconst.VIEW_PLAYLISTS]), gtk.Label("Properties")) notebook.append_page(sw, gtk.Label("Lyrics")) def switch_page(notebook, page, page_num): action_widget = notebook.get_action_widget(gtk.PACK_END) if action_widget.child is not None: action_widget.remove(action_widget.child) page = notebook.get_nth_page(page_num) blacfg.set("general", "metadata.view", page_num) if page_num == blaconst.METADATA_TAGS: widget = page.get_control_widget() elif page_num == blaconst.METADATA_LYRICS: button = gtk.Button() button.set_tooltip_text("Edit lyrics") button.set_relief(gtk.RELIEF_NONE) button.set_focus_on_click(False) button.add( gtk.image_new_from_stock(gtk.STOCK_EDIT, gtk.ICON_SIZE_MENU)) style = gtk.RcStyle() style.xthickness = style.ythickness = 0 button.modify_style(style) # TODO: Implement a widget to edit metadata. button.connect("clicked", lambda *x: False) button.show_all() widget = button action_widget.set_visible(False) return else: action_widget.set_visible(False) return action_widget.add(widget) action_widget.set_visible(True) action_widget.show_all() viewport = gtk.Viewport() viewport.set_shadow_type(gtk.SHADOW_NONE) notebook.set_action_widget(viewport, gtk.PACK_END) notebook.connect("switch_page", switch_page) page_num = blacfg.getint("general", "metadata.view") notebook.set_current_page(page_num) # Make sure the notebook's action widget gets initialized. switch_page(notebook, None, page_num) self.pack_start(notebook, expand=True) self.pack_start(hbox, expand=False) # Hook up the metadata callbacks. BlaSidePane.fetcher = blametadata.BlaFetcher() self.fetcher.connect_object( "lyrics", BlaSidePane.__update_lyrics, self) self.fetcher.connect_object( "cover", type(self.cover_display).update, self.cover_display) notebook.show() hbox.show_all() self.show()