Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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()