Ejemplo n.º 1
0
 def __on_leave_notify(self, widget, event):
     """
         Stop preview
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     allocation = widget.get_allocation()
     if event.x <= 0 or\
        event.x >= allocation.width or\
        event.y <= 0 or\
        event.y >= allocation.height:
         if self.__context is not None and\
                 self.__context_timeout_id is None:
             self.__context_timeout_id = GLib.timeout_add(
                                                   1000,
                                                   self.__on_button_clicked,
                                                   self.__menu_button)
         if Lp().settings.get_value('preview-output').get_string() != '':
             if self.__preview_timeout_id is not None:
                 GLib.source_remove(self.__preview_timeout_id)
                 self.__preview_timeout_id = None
             self.set_indicator(
                             Lp().player.current_track.id == self._track.id,
                             utils.is_loved(self._track.id))
             Lp().player.preview.set_state(Gst.State.NULL)
Ejemplo n.º 2
0
 def add_album(self, track_id, album, num, title, length, pos):
     """
         Add album row to the list
         @param track id as int
         @param album as album (None)
         @param track number as int
         @param title as str
         @param length as str
         @param pos as int
         @param show cover as bool
     """
     album_row = AlbumRow(self._show_loved)
     album_row.show_indicator(Lp().player.current_track.id == track_id,
                              utils.is_loved(track_id))
     if pos:
         album_row.set_num_label(
             '''<span foreground="%s"
             font_desc="Bold">%s</span>''' %
             (rgba_to_hex(Lp().window.get_selected_color()), str(pos)))
     elif num > 0:
         album_row.set_num_label(str(num))
     album_row.set_number(num)
     album_row.set_title_label(title)
     album_row.set_duration_label(seconds_to_string(length))
     album_row.set_object_id(track_id)
     if album is not None:
         album_row.set_album_and_artist(album.id)
         surface = Lp().art.get_album_artwork(
             album, ArtSize.MEDIUM * album_row.get_scale_factor())
         album_row.set_cover(surface, Lp().albums.get_name(album.id))
         del surface
         album_row.show_header()
     album_row.show()
     self.add(album_row)
Ejemplo n.º 3
0
 def update_playing(self, track_id):
     """
         Update playing track
         @param track id as int
     """
     for row in self.get_children():
         row.set_indicator(row.id == track_id, utils.is_loved(row.id))
Ejemplo n.º 4
0
    def add_track(self, track_id, num, title, length, pos):
        """
            Add track to list
            @param track id as int
            @param track number as int
            @param title as str
            @param length as str
            @param pos as int
            @param show cover as bool
        """
        track_row = TrackRow(self._show_menu, self._show_loved)

        track_row.show_indicator(Lp().player.current_track.id == track_id,
                                 utils.is_loved(track_id))

        if pos:
            track_row.set_num_label(
                '''<span foreground="%s"
                font_desc="Bold">%s</span>''' %
                (rgba_to_hex(Lp().window.get_selected_color()),
                 str(pos)))
        elif num > 0:
            track_row.set_num_label(str(num))

        track_row.set_number(num)
        track_row.set_title_label(title)
        track_row.set_duration_label(seconds_to_string(length))
        track_row.set_object_id(track_id)
        track_row.show()
        self.add(track_row)
Ejemplo n.º 5
0
 def _on_leave_notify(self, widget, event):
     """
         On leave notify, change love opacity
         @param widget as Gtk.EventBox (can be None)
         @param event as Gdk.Event (can be None)
     """
     self.set_opacity(0.8 if is_loved(self._track_id) else 0.1)
Ejemplo n.º 6
0
 def update_playing(self, track_id):
     """
         Update playing track
         @param track id as int
     """
     for row in self.get_children():
         row.show_indicator(row.get_object_id() == track_id, utils.is_loved(row.get_object_id()))
Ejemplo n.º 7
0
 def add_album(self, track_id, album, num, title, length, pos):
     """
         Add album row to the list
         @param track id as int
         @param album as album (None)
         @param track number as int
         @param title as str
         @param length as str
         @param pos as int
         @param show cover as bool
     """
     album_row = AlbumRow(self._show_loved)
     album_row.show_indicator(Lp().player.current_track.id == track_id, utils.is_loved(track_id))
     if pos:
         album_row.set_num_label(
             """<span foreground="%s"
             font_desc="Bold">%s</span>"""
             % (rgba_to_hex(Lp().window.get_selected_color()), str(pos))
         )
     elif num > 0:
         album_row.set_num_label(str(num))
     album_row.set_number(num)
     album_row.set_title_label(title)
     album_row.set_duration_label(seconds_to_string(length))
     album_row.set_object_id(track_id)
     if album is not None:
         album_row.set_album_and_artist(album.id)
         surface = Lp().art.get_album_artwork(album, ArtSize.MEDIUM * album_row.get_scale_factor())
         album_row.set_cover(surface, Lp().albums.get_name(album.id))
         del surface
         album_row.show_header()
     album_row.show()
     self.add(album_row)
Ejemplo n.º 8
0
 def __on_button_clicked(self, button):
     """
         Popup menu for track relative to button
         @param button as Gtk.Button
     """
     self.__context_timeout_id = None
     image = self.__menu_button.get_image()
     if self.__context is None:
         image.set_from_icon_name('go-next-symbolic',
                                  Gtk.IconSize.MENU)
         self.__context = ContextWidget(self._track, button)
         self.__context.set_property('halign', Gtk.Align.END)
         self.__context.show()
         self._duration_label.hide()
         self._grid.insert_next_to(button, Gtk.PositionType.LEFT)
         self._grid.attach_next_to(self.__context, button,
                                   Gtk.PositionType.LEFT, 1, 1)
         self.set_indicator(Lp().player.current_track.id == self._track.id,
                            False)
     else:
         image.set_from_icon_name('go-previous-symbolic',
                                  Gtk.IconSize.MENU)
         self.__context.destroy()
         self._duration_label.show()
         self.__context = None
         self.set_indicator(Lp().player.current_track.id == self._track.id,
                            utils.is_loved(self._track.id))
Ejemplo n.º 9
0
 def _on_leave_notify(self, widget, event):
     """
         On leave notify, change love opacity
         @param widget as Gtk.EventBox (can be None)
         @param event as Gdk.Event (can be None)
     """
     self.set_opacity(0.8 if is_loved(self.__track_id) else 0.2)
Ejemplo n.º 10
0
 def __on_leave_notify(self, widget, event):
     """
         Stop preview
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     allocation = widget.get_allocation()
     if event.x <= 0 or\
        event.x >= allocation.width or\
        event.y <= 0 or\
        event.y >= allocation.height:
         if self.__context is not None and\
                 self.__context_timeout_id is None:
             self.__context_timeout_id = GLib.timeout_add(
                                                   1000,
                                                   self.__on_button_clicked,
                                                   self.__menu_button)
         if Lp().settings.get_value('preview-output').get_string() != '':
             if self.__preview_timeout_id is not None:
                 GLib.source_remove(self.__preview_timeout_id)
                 self.__preview_timeout_id = None
             self.set_indicator(
                             Lp().player.current_track.id == self._track.id,
                             utils.is_loved(self._track.id))
             Lp().player.preview.set_state(Gst.State.NULL)
Ejemplo n.º 11
0
    def add_track(self, track_id, num, title, length, pos):
        """
            Add track to list
            @param track id as int
            @param track number as int
            @param title as str
            @param length as str
            @param pos as int
            @param show cover as bool
        """
        track_row = TrackRow(self._show_menu, self._show_loved)

        track_row.show_indicator(Lp.player.current_track.id == track_id,
                                 utils.is_loved(track_id))

        if pos:
            track_row.set_num_label(
                '''<span foreground="%s"
                font_desc="Bold">%s</span>''' %
                (rgba_to_hex(Lp.window.get_selected_color()),
                 str(pos)))
        elif num > 0:
            track_row.set_num_label(str(num))

        track_row.set_number(num)
        track_row.set_title_label(title)
        track_row.set_duration_label(seconds_to_string(length))
        track_row.set_object_id(track_id)
        track_row.show()
        self.add(track_row)
Ejemplo n.º 12
0
 def _on_enter_notify(self, widget, event):
     """
         On enter notify, change love opacity
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     self.set_opacity(0.1 if is_loved(self._track_id) else 0.8)
Ejemplo n.º 13
0
 def __on_button_clicked(self, button):
     """
         Popup menu for track relative to button
         @param button as Gtk.Button
     """
     self.__context_timeout_id = None
     image = self.__menu_button.get_image()
     if self.__context is None:
         image.set_from_icon_name("go-next-symbolic", Gtk.IconSize.MENU)
         self.__context = ContextWidget(self._track, button)
         self.__context.set_property("halign", Gtk.Align.END)
         self.__context.show()
         self._duration_label.hide()
         self._grid.insert_next_to(button, Gtk.PositionType.LEFT)
         self._grid.attach_next_to(self.__context, button,
                                   Gtk.PositionType.LEFT, 1, 1)
         self.set_indicator(Lp().player.current_track.id == self._track.id,
                            False)
     else:
         image.set_from_icon_name("go-previous-symbolic", Gtk.IconSize.MENU)
         self.__context.destroy()
         self._duration_label.show()
         self.__context = None
         self.set_indicator(Lp().player.current_track.id == self._track.id,
                            utils.is_loved(self._track.id))
Ejemplo n.º 14
0
 def _on_enter_notify(self, widget, event):
     """
         On enter notify, change love opacity
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     self.set_opacity(0.2 if is_loved(self.__track_id) else 0.8)
Ejemplo n.º 15
0
 def _on_leave_notify(self, widget, event):
     """
         Show love button or play button again
     """
     if self._id == Lp().player.current_track.id:
         self.play()
     elif is_loved(self._id):
         self.loved()
Ejemplo n.º 16
0
 def __init__(self, rowid, num):
     """
         Init row widgets
         @param rowid as int
         @param num as int
         @param show loved as bool
     """
     # We do not use Gtk.Builder for speed reasons
     Gtk.ListBoxRow.__init__(self)
     self.set_sensitive(False)
     self._track = Track(rowid)
     self._number = num
     self._indicator = IndicatorWidget(self._track.id)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self.set_sensitive(True)
     self._row_widget = Gtk.EventBox()
     self._row_widget.connect('button-press-event', self._on_button_press)
     self._row_widget.connect('enter-notify-event', self._on_enter_notify)
     self._grid = Gtk.Grid()
     self._grid.set_column_spacing(5)
     self._row_widget.add(self._grid)
     self._title_label = Gtk.Label.new(self._track.formated_name())
     self._title_label.set_use_markup(True)
     self._title_label.set_property('has-tooltip', True)
     self._title_label.connect('query-tooltip',
                               self._on_title_query_tooltip)
     self._title_label.set_property('hexpand', True)
     self._title_label.set_property('halign', Gtk.Align.START)
     self._title_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._duration_label = Gtk.Label.new(
                                    seconds_to_string(self._track.duration))
     self._duration_label.get_style_context().add_class('dim-label')
     self._num_label = Gtk.Label()
     self._num_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._num_label.set_property('valign', Gtk.Align.CENTER)
     self._num_label.set_width_chars(4)
     self._num_label.get_style_context().add_class('dim-label')
     self.update_num_label()
     self._menu_image = Gtk.Image.new()
     self._menu_image.set_opacity(0.2)
     self._menu_button = Gtk.Button.new()
     self._menu_button.set_relief(Gtk.ReliefStyle.NONE)
     self._menu_button.get_style_context().add_class('menu-button')
     self._menu_button.get_style_context().add_class('track-menu-button')
     self._menu_button.set_image(self._menu_image)
     self._menu_button.connect('clicked', self._on_button_clicked)
     self._grid.add(self._num_label)
     self._grid.add(self._title_label)
     self._grid.add(self._duration_label)
     # TODO Remove this later
     if Gtk.get_minor_version() > 16:
         self._grid.add(self._menu_button)
     else:
         self.connect('map', self._on_map)
     self.add(self._row_widget)
     self.get_style_context().add_class('trackrow')
Ejemplo n.º 17
0
 def __init__(self, rowid, num):
     """
         Init row widgets
         @param rowid as int
         @param num as int
         @param show loved as bool
     """
     # We do not use Gtk.Builder for speed reasons
     Gtk.ListBoxRow.__init__(self)
     self.set_sensitive(False)
     self._track = Track(rowid)
     self._number = num
     self._indicator = IndicatorWidget(self._track.id)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self.set_sensitive(True)
     self._row_widget = Gtk.EventBox()
     self._row_widget.connect('button-press-event', self._on_button_press)
     self._row_widget.connect('enter-notify-event', self._on_enter_notify)
     self._grid = Gtk.Grid()
     self._grid.set_column_spacing(5)
     self._row_widget.add(self._grid)
     self._title_label = Gtk.Label.new(self._track.formated_name())
     self._title_label.set_use_markup(True)
     self._title_label.set_property('has-tooltip', True)
     self._title_label.connect('query-tooltip',
                               self._on_title_query_tooltip)
     self._title_label.set_property('hexpand', True)
     self._title_label.set_property('halign', Gtk.Align.START)
     self._title_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._duration_label = Gtk.Label.new(
         seconds_to_string(self._track.duration))
     self._duration_label.get_style_context().add_class('dim-label')
     self._num_label = Gtk.Label()
     self._num_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._num_label.set_property('valign', Gtk.Align.CENTER)
     self._num_label.set_width_chars(4)
     self._num_label.get_style_context().add_class('dim-label')
     self.update_num_label()
     self._menu_image = Gtk.Image.new()
     self._menu_image.set_opacity(0.2)
     self._menu_button = Gtk.Button.new()
     self._menu_button.set_relief(Gtk.ReliefStyle.NONE)
     self._menu_button.get_style_context().add_class('menu-button')
     self._menu_button.get_style_context().add_class('track-menu-button')
     self._menu_button.set_image(self._menu_image)
     self._menu_button.connect('clicked', self._on_button_clicked)
     self._grid.add(self._num_label)
     self._grid.add(self._title_label)
     self._grid.add(self._duration_label)
     # TODO Remove this later
     if Gtk.get_minor_version() > 16:
         self._grid.add(self._menu_button)
     else:
         self.connect('map', self._on_map)
     self.add(self._row_widget)
     self.get_style_context().add_class('trackrow')
Ejemplo n.º 18
0
 def _on_button_press(self, widget, event):
     """
         On button press, toggle loved status
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     loved = not is_loved(self._track_id)
     set_loved(self._track_id, loved)
     self.set_opacity(0.8 if loved else 0.1)
Ejemplo n.º 19
0
 def _on_button_press(self, widget, event):
     """
         On button press, toggle loved status
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     loved = not is_loved(self._track_id)
     set_loved(self._track_id, loved)
     self.set_opacity(0.8 if loved else 0.1)
Ejemplo n.º 20
0
 def _on_leave_notify(self, widget, event):
     """
         On leave notify, change love opacity
         @param widget as Gtk.EventBox (can be None)
         @param event as Gdk.Event (can be None)
     """
     if isinstance(self.__object, Album):
         self.set_opacity(0.8 if self.__object.loved else 0.2)
     else:
         self.set_opacity(0.8 if is_loved(self.__object.id) else 0.2)
Ejemplo n.º 21
0
    def _update_loved_icon(self, widget, playlist_id):
        """
            Updates the loved icon
        """
        if playlist_id != Type.LOVED:
            return

        for row in self.get_children():
            track_id = row.get_object_id()
            row.show_indicator(track_id == Lp().player.current_track.id, utils.is_loved(track_id))
Ejemplo n.º 22
0
 def __on_leave_notify(self, widget, event):
     """
         Show love button or play button again
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     if self.__id == Lp().player.current_track.id:
         self.play()
     elif is_loved(self.__id):
         self.loved()
Ejemplo n.º 23
0
 def __on_leave_notify(self, widget, event):
     """
         Show love button or play button again
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     if self.__id == Lp().player.current_track.id:
         self.play()
     elif is_loved(self.__id):
         self.loved()
Ejemplo n.º 24
0
 def _on_leave_notify(self, widget, event):
     """
         On leave notify, change love opacity
         @param widget as Gtk.EventBox (can be None)
         @param event as Gdk.Event (can be None)
     """
     if isinstance(self.__object, Album):
         self.set_opacity(0.8 if self.__object.loved else 0.2)
     else:
         self.set_opacity(0.8 if is_loved(self.__object.id) else 0.2)
Ejemplo n.º 25
0
 def _on_enter_notify(self, widget, event):
     """
         On enter notify, change love opacity
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     if isinstance(self.__object, Album):
         self.set_opacity(0.2 if self.__object.loved else 0.8)
     else:
         self.set_opacity(0.2 if is_loved(self.__object.id) else 0.8)
Ejemplo n.º 26
0
 def _on_enter_notify(self, widget, event):
     """
         On enter notify, change love opacity
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     if isinstance(self.__object, Album):
         self.set_opacity(0.2 if self.__object.loved else 0.8)
     else:
         self.set_opacity(0.2 if is_loved(self.__object.id) else 0.8)
Ejemplo n.º 27
0
    def _update_loved_icon(self, widget, playlist_id):
        """
            Updates the loved icon
        """
        if playlist_id != Type.LOVED:
            return

        for row in self.get_children():
            track_id = row.get_object_id()
            row.show_indicator(track_id == Lp().player.current_track.id,
                               utils.is_loved(track_id))
Ejemplo n.º 28
0
 def _on_leave_notify(self, widget, event):
     """
         Stop preview
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     if self._timeout_id is not None:
         GLib.source_remove(self._timeout_id)
         self._timeout_id = None
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     Lp().player.preview.set_state(Gst.State.NULL)
     widget.disconnect_by_func(self._on_leave_notify)
Ejemplo n.º 29
0
    def __init__(self, track_id):
        """
            Init widget
            @param track_id as int
        """
        Gtk.Bin.__init__(self)
        self.__track_id = track_id
        builder = Gtk.Builder()
        builder.add_from_resource('/org/gnome/Lollypop/LovedWidget.ui')
        builder.connect_signals(self)

        self.add(builder.get_object('widget'))
        self.set_opacity(0.8 if is_loved(track_id) else 0.2)
Ejemplo n.º 30
0
 def __on_leave_notify(self, widget, event):
     """
         Stop preview
         @param widget as Gtk.Widget
         @param event as Gdk.Event
     """
     if self.__timeout_id is not None:
         GLib.source_remove(self.__timeout_id)
         self.__timeout_id = None
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     Lp().player.preview.set_state(Gst.State.NULL)
     widget.disconnect_by_func(self.__on_leave_notify)
Ejemplo n.º 31
0
    def __init__(self, track_id):
        """
            Init widget
            @param track_id as int
        """
        Gtk.Bin.__init__(self)
        self._track_id = track_id
        builder = Gtk.Builder()
        builder.add_from_resource('/org/gnome/Lollypop/LovedWidget.ui')
        builder.connect_signals(self)

        self.add(builder.get_object('widget'))
        self.set_opacity(0.8 if is_loved(track_id) else 0.1)
Ejemplo n.º 32
0
 def _on_player_action(self, action, param):
     """
         Change player state
         @param action as Gio.SimpleAction
         @param param as GLib.Variant
     """
     string = param.get_string()
     if string == "play_pause":
         Lp().player.play_pause()
     elif string == "play":
         Lp().player.play()
     elif string == "stop":
         Lp().player.stop()
     elif string == "next":
         Lp().player.next()
     elif string == "next_album":
         # In party or shuffle, just update next track
         if Lp().player.is_party() or\
                 Lp().settings.get_enum('shuffle') == Shuffle.TRACKS:
             Lp().player.set_next()
             # We send this signal to update next popover
             Lp().player.emit('queue-changed')
         else:
             Lp().player.set_next_context(NextContext.START_NEW_ALBUM)
             Lp().player.set_next()
             Lp().player.next()
     elif string == "prev":
         Lp().player.prev()
     elif string == "locked":
         if Lp().player.locked:
             Lp().player.set_state(PlayerState.NONE)
         else:
             Lp().player.set_state(PlayerState.LOCKED)
     elif string == "queued":
         if Lp().player.queued:
             Lp().player.set_state(PlayerState.NONE)
         else:
             Lp().player.set_state(PlayerState.QUEUED)
     elif string == "loved":
         if Lp().player.current_track.id is not None:
             isloved = is_loved(Lp().player.current_track.id)
             set_loved(Lp().player.current_track.id, not isloved)
             if Lp().notify is not None:
                 if isloved:
                     heart = "♡"
                 else:
                     heart = "❤"
                 Lp().notify.send("%s - %s: %s" % (
                             ", ".join(Lp().player.current_track.artists),
                             Lp().player.current_track.name,
                             heart))
Ejemplo n.º 33
0
    def _on_loved_playlist_changed(self, widget, playlist_id, track_id):
        """
            Updates the loved icon
            @param playlist as Playlist
            @param playlist id as int
            @param track id as int
        """
        if playlist_id != Type.LOVED:
            return

        for row in self.get_children():
            if track_id == row.get_id():
                row.set_indicator(track_id == Lp().player.current_track.id,
                                  utils.is_loved(track_id))
Ejemplo n.º 34
0
    def __on_loved_playlist_changed(self, widget, playlist_id, track_id):
        """
            Updates the loved icon
            @param playlist as Playlist
            @param playlist id as int
            @param track id as int
        """
        if playlist_id != Type.LOVED:
            return

        for row in self.get_children():
            if track_id == row.id:
                row.set_indicator(track_id == Lp().player.current_track.id,
                                  utils.is_loved(track_id))
Ejemplo n.º 35
0
 def __on_player_action(self, action, param):
     """
         Change player state
         @param action as Gio.SimpleAction
         @param param as GLib.Variant
     """
     string = param.get_string()
     if string == "play_pause":
         Lp().player.play_pause()
     elif string == "play":
         Lp().player.play()
     elif string == "stop":
         Lp().player.stop()
     elif string == "next":
         Lp().player.next()
     elif string == "next_album":
         # In party or shuffle, just update next track
         if Lp().player.is_party or\
                 Lp().settings.get_enum('shuffle') == Shuffle.TRACKS:
             Lp().player.set_next()
             # We send this signal to update next popover
             Lp().player.emit('queue-changed')
         else:
             Lp().player.set_next_context(NextContext.START_NEW_ALBUM)
             Lp().player.set_next()
             Lp().player.next()
     elif string == "prev":
         Lp().player.prev()
     elif string == "locked":
         Lp().player.lock()
     elif string == "volume":
         self.__toolbar.show_hide_volume_control()
     elif string == "show-genres":
         state = not Lp().settings.get_value('show-genres')
         Lp().settings.set_value('show-genres', GLib.Variant('b', state))
         Lp().window.show_genres(state)
     elif string == "loved":
         if Lp().player.current_track.id is not None:
             isloved = is_loved(Lp().player.current_track.id)
             set_loved(Lp().player.current_track.id, not isloved)
             if Lp().notify is not None:
                 if isloved:
                     heart = "♡"
                 else:
                     heart = "❤"
                 Lp().notify.send(
                     "%s - %s: %s" %
                     (", ".join(Lp().player.current_track.artists),
                      Lp().player.current_track.name, heart))
Ejemplo n.º 36
0
 def _on_button_press(self, widget, event):
     """
         On button press, toggle loved status
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     if isinstance(self.__object, Album):
         loved = not self.__object.loved
         self.__object.set_loved(loved)
         self.__object.loved = loved
     else:
         loved = not is_loved(self.__object.id)
         set_loved(self.__object.id, loved)
     self.set_opacity(0.8 if loved else 0.2)
     return True
Ejemplo n.º 37
0
 def _on_button_press(self, widget, event):
     """
         On button press, toggle loved status
         @param widget as Gtk.EventBox
         @param event as Gdk.Event
     """
     if isinstance(self.__object, Album):
         loved = not self.__object.loved
         self.__object.set_loved(loved)
         self.__object.loved = loved
     else:
         loved = not is_loved(self.__object.id)
         set_loved(self.__object.id, loved)
     self.set_opacity(0.8 if loved else 0.2)
     return True
Ejemplo n.º 38
0
    def __init__(self, object):
        """
            Init widget
            @param object as Album/Track
        """
        Gtk.Bin.__init__(self)
        self.__object = object
        builder = Gtk.Builder()
        builder.add_from_resource('/org/gnome/Lollypop/LovedWidget.ui')
        builder.connect_signals(self)

        self.add(builder.get_object('widget'))
        if isinstance(object, Album):
            self.set_opacity(0.8 if object.loved else 0.2)
        else:
            self.set_opacity(0.8 if is_loved(object.id) else 0.2)
Ejemplo n.º 39
0
    def __init__(self, object):
        """
            Init widget
            @param object as Album/Track
        """
        Gtk.Bin.__init__(self)
        self.__object = object
        builder = Gtk.Builder()
        builder.add_from_resource('/org/gnome/Lollypop/LovedWidget.ui')
        builder.connect_signals(self)

        self.add(builder.get_object('widget'))
        if isinstance(object, Album):
            self.set_opacity(0.8 if object.loved else 0.2)
        else:
            self.set_opacity(0.8 if is_loved(object.id) else 0.2)
Ejemplo n.º 40
0
 def __on_player_action(self, action, param):
     """
         Change player state
         @param action as Gio.SimpleAction
         @param param as GLib.Variant
     """
     string = param.get_string()
     if string == "play_pause":
         Lp().player.play_pause()
     elif string == "play":
         Lp().player.play()
     elif string == "stop":
         Lp().player.stop()
     elif string == "next":
         Lp().player.next()
     elif string == "next_album":
         Lp().player.skip_album()
     elif string == "prev":
         Lp().player.prev()
     elif string == "locked":
         Lp().player.lock()
     elif string == "hide_pane":
         self._hide_pane()
     elif string == "filter":
         if self.view is not None:
             self.view.set_search_mode()
     elif string == "volume":
         self.__toolbar.show_hide_volume_control()
     elif string == "show_genres":
         state = not Lp().settings.get_value("show-genres")
         Lp().settings.set_value("show-genres",
                                 GLib.Variant("b", state))
         Lp().window.show_genres(state)
     elif string == "loved":
         if Lp().player.current_track.id is not None and\
                 Lp().player.current_track.id >= 0:
             isloved = is_loved(Lp().player.current_track.id)
             set_loved(Lp().player.current_track.id, not isloved)
             if Lp().notify is not None:
                 if isloved:
                     heart = "♡"
                 else:
                     heart = "❤"
                 Lp().notify.send("%s - %s: %s" % (
                             ", ".join(Lp().player.current_track.artists),
                             Lp().player.current_track.name,
                             heart))
Ejemplo n.º 41
0
 def __on_player_action(self, action, param):
     """
         Change player state
         @param action as Gio.SimpleAction
         @param param as GLib.Variant
     """
     string = param.get_string()
     if string == "play_pause":
         Lp().player.play_pause()
     elif string == "play":
         Lp().player.play()
     elif string == "stop":
         Lp().player.stop()
     elif string == "next":
         Lp().player.next()
     elif string == "next_album":
         Lp().player.skip_album()
     elif string == "prev":
         Lp().player.prev()
     elif string == "locked":
         Lp().player.lock()
     elif string == "hide_pane":
         self._hide_pane()
     elif string == "filter":
         if self.view is not None:
             self.view.set_search_mode()
     elif string == "volume":
         self.__toolbar.show_hide_volume_control()
     elif string == "show_genres":
         state = not Lp().settings.get_value('show-genres')
         Lp().settings.set_value('show-genres',
                                 GLib.Variant('b', state))
         Lp().window.show_genres(state)
     elif string == "loved":
         if Lp().player.current_track.id is not None:
             isloved = is_loved(Lp().player.current_track.id)
             set_loved(Lp().player.current_track.id, not isloved)
             if Lp().notify is not None:
                 if isloved:
                     heart = "♡"
                 else:
                     heart = "❤"
                 Lp().notify.send("%s - %s: %s" % (
                             ", ".join(Lp().player.current_track.artists),
                             Lp().player.current_track.name,
                             heart))
Ejemplo n.º 42
0
 def set_row(self, row, track_id, pos, show_cover=False):
     """
         Set row content
         @param row as Row
         @param track id as int
         @param pos as position
         @param show cover as bool
     """
     track = Track(track_id)
     row.show_indicator(Lp().player.current_track.id == track_id,
                        utils.is_loved(track_id))
     row.set_number(pos)
     self._update_pos_label(row, track_id)
     row.set_title_label(track.formated_name())
     row.set_duration_label(seconds_to_string(track.duration))
     row.set_id(track_id)
     if show_cover:
         surface = Lp().art.get_album_artwork(
                     track.album,
                     ArtSize.MEDIUM*row.get_scale_factor())
         row.set_cover(surface, track.album.name)
         del surface
         row.show_header(True)
Ejemplo n.º 43
0
 def __init__(self, rowid, num, show_headers):
     """
         Init row widget
         @param rowid as int
         @param num as int
         @param show headers as bool
     """
     Row.__init__(self, rowid, num)
     self._show_headers = show_headers
     self._indicator.set_margin_start(5)
     self._row_widget.set_margin_start(5)
     self._row_widget.set_margin_top(2)
     self._row_widget.set_margin_end(5)
     self._grid.insert_row(0)
     self._grid.insert_column(0)
     self._grid.insert_column(1)
     self._grid.attach(self._indicator, 1, 1, 1, 2)
     self._cover = Gtk.Image()
     self._cover_frame = Gtk.Frame()
     self._cover_frame.set_shadow_type(Gtk.ShadowType.NONE)
     self._cover_frame.set_property('halign', Gtk.Align.CENTER)
     self._cover_frame.set_property('valign', Gtk.Align.CENTER)
     self._cover_frame.get_style_context().add_class('small-cover-frame')
     self._cover_frame.add(self._cover)
     # We force width with a Box
     box = Gtk.Box()
     box.set_homogeneous(True)
     box.add(self._cover_frame)
     box.set_property('width-request', ArtSize.MEDIUM + 2)
     self._grid.attach(box, 0, 0, 1, 2)
     self.show_all()
     self._header = Gtk.Grid()
     self._header.set_column_spacing(5)
     self._artist_label = Gtk.Label()
     self._artist_label.set_markup(
         "<b>" + escape(", ".join(self._track.album.artists)) + "</b>")
     self._artist_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._artist_label.get_style_context().add_class('dim-label')
     self._album_label = Gtk.Label.new(self._track.album.name)
     self._album_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._album_label.get_style_context().add_class('dim-label')
     self._header.add(self._artist_label)
     self._header.add(self._album_label)
     self._num_label.set_property('valign', Gtk.Align.END)
     self._title_label.set_property('valign', Gtk.Align.END)
     self._duration_label.set_property('valign', Gtk.Align.END)
     self._indicator.set_property('valign', Gtk.Align.END)
     self._grid.attach(self._header, 1, 0, 4, 1)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self.show_headers(self._show_headers)
     self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [],
                          Gdk.DragAction.MOVE)
     self.drag_source_add_text_targets()
     self.drag_dest_set(Gtk.DestDefaults.DROP | Gtk.DestDefaults.MOTION, [],
                        Gdk.DragAction.MOVE)
     self.drag_dest_add_text_targets()
     self.connect('drag-begin', self._on_drag_begin)
     self.connect('drag-data-get', self._on_drag_data_get)
     self.connect('drag-data-received', self._on_drag_data_received)
     self.connect('drag-motion', self._on_drag_motion)
     self.connect('drag-leave', self._on_drag_leave)
Ejemplo n.º 44
0
 def __init__(self, rowid, num, show_headers):
     """
         Init row widget
         @param rowid as int
         @param num as int
         @param show headers as bool
     """
     Row.__init__(self, rowid, num)
     self.__parent_filter = False
     self.__show_headers = show_headers
     self._indicator.set_margin_start(5)
     self._row_widget.set_margin_start(5)
     self._row_widget.set_margin_top(2)
     self._row_widget.set_margin_end(5)
     self._grid.insert_row(0)
     self._grid.insert_column(0)
     self._grid.insert_column(1)
     self._grid.attach(self._indicator, 1, 1, 1, 2)
     self.__cover = Gtk.Image()
     self.__cover.set_property("halign", Gtk.Align.CENTER)
     self.__cover.set_property("valign", Gtk.Align.CENTER)
     self.__cover.get_style_context().add_class("small-cover-frame")
     self.__cover.set_no_show_all(True)
     # We force width with a Box
     box = Gtk.Box()
     box.set_homogeneous(True)
     box.add(self.__cover)
     box.set_property("width-request", ArtSize.MEDIUM + 2)
     self._grid.attach(box, 0, 0, 1, 2)
     self.show_all()
     self.__header = Gtk.Grid()
     self.__header.set_column_spacing(5)
     if self._track.album.artist_ids[0] != Type.COMPILATIONS:
         self.__album_artist_label = Gtk.Label()
         self.__album_artist_label.set_markup(
             "<b>" +
             GLib.markup_escape_text(", ".join(self._track.album.artists)) +
             "</b>")
         self.__album_artist_label.set_ellipsize(Pango.EllipsizeMode.END)
         self.__album_artist_label.get_style_context().add_class(
             "dim-label")
         artist_eventbox = Gtk.EventBox()
         artist_eventbox.add(self.__album_artist_label)
         artist_eventbox.connect("realize", self.__on_eventbox_realize)
         artist_eventbox.connect("button-press-event",
                                 self.__on_artist_button_press)
         artist_eventbox.show()
         self.__header.add(artist_eventbox)
     self.__album_label = Gtk.Label.new(self._track.album.name)
     self.__album_label.set_ellipsize(Pango.EllipsizeMode.END)
     self.__album_label.get_style_context().add_class("dim-label")
     self.__album_label.set_hexpand(True)
     self.__album_label.set_property("halign", Gtk.Align.END)
     self.__header.add(self.__album_label)
     self._num_label.set_property("valign", Gtk.Align.END)
     self._title_label.set_property("valign", Gtk.Align.END)
     if self._artists_label is not None:
         self._artists_label.set_property("valign", Gtk.Align.END)
     self._duration_label.set_property("valign", Gtk.Align.END)
     self._indicator.set_property("valign", Gtk.Align.END)
     if self._artists_label is not None:
         self._grid.attach(self.__header, 1, 0, 5, 1)
     else:
         self._grid.attach(self.__header, 1, 0, 4, 1)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self.show_headers(self.__show_headers)
     self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [],
                          Gdk.DragAction.MOVE)
     self.drag_source_add_text_targets()
     self.drag_dest_set(Gtk.DestDefaults.DROP | Gtk.DestDefaults.MOTION, [],
                        Gdk.DragAction.MOVE)
     self.drag_dest_add_text_targets()
     self.connect("drag-begin", self.__on_drag_begin)
     self.connect("drag-data-get", self.__on_drag_data_get)
     self.connect("drag-data-received", self.__on_drag_data_received)
     self.connect("drag-motion", self.__on_drag_motion)
     self.connect("drag-leave", self.__on_drag_leave)
Ejemplo n.º 45
0
 def __init__(self, rowid, num):
     """
         Init row widgets
         @param rowid as int
         @param num as int
         @param show loved as bool
     """
     # We do not use Gtk.Builder for speed reasons
     Gtk.ListBoxRow.__init__(self)
     self._artists_label = None
     self._track = Track(rowid)
     self.__number = num
     self.__preview_timeout_id = None
     self.__context_timeout_id = None
     self.__context = None
     self._indicator = IndicatorWidget(self._track.id)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self._row_widget = Gtk.EventBox()
     self._row_widget.connect("button-press-event", self.__on_button_press)
     self._row_widget.connect("enter-notify-event", self.__on_enter_notify)
     self._row_widget.connect("leave-notify-event", self.__on_leave_notify)
     self._grid = Gtk.Grid()
     self._grid.set_column_spacing(5)
     self._row_widget.add(self._grid)
     self._title_label = Gtk.Label.new(self._track.name)
     self._title_label.set_property("has-tooltip", True)
     self._title_label.connect("query-tooltip", self.__on_query_tooltip)
     self._title_label.set_property("hexpand", True)
     self._title_label.set_property("halign", Gtk.Align.START)
     self._title_label.set_ellipsize(Pango.EllipsizeMode.END)
     if self._track.non_album_artists:
         self._artists_label = Gtk.Label.new(
             GLib.markup_escape_text(", ".join(
                 self._track.non_album_artists)))
         self._artists_label.set_use_markup(True)
         self._artists_label.set_property("has-tooltip", True)
         self._artists_label.connect("query-tooltip",
                                     self.__on_query_tooltip)
         self._artists_label.set_property("hexpand", True)
         self._artists_label.set_property("halign", Gtk.Align.END)
         self._artists_label.set_ellipsize(Pango.EllipsizeMode.END)
         self._artists_label.set_opacity(0.3)
         self._artists_label.set_margin_end(5)
         self._artists_label.show()
     self._duration_label = Gtk.Label.new(
         seconds_to_string(self._track.duration))
     self._duration_label.get_style_context().add_class("dim-label")
     self._num_label = Gtk.Label()
     self._num_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._num_label.set_property("valign", Gtk.Align.CENTER)
     self._num_label.set_width_chars(4)
     self._num_label.get_style_context().add_class("dim-label")
     self.update_num_label()
     self.__menu_button = Gtk.Button.new()
     # Here a hack to make old Gtk version support min-height css attribute
     # min-height = 24px, borders = 2px, we set directly on stack
     # min-width = 24px, borders = 2px, padding = 8px
     self.__menu_button.set_size_request(34, 26)
     self.__menu_button.set_relief(Gtk.ReliefStyle.NONE)
     self.__menu_button.get_style_context().add_class("menu-button")
     self.__menu_button.get_style_context().add_class("track-menu-button")
     self._grid.add(self._num_label)
     self._grid.add(self._title_label)
     if self._artists_label is not None:
         self._grid.add(self._artists_label)
     self._grid.add(self._duration_label)
     self._grid.add(self.__menu_button)
     self.add(self._row_widget)
     self.get_style_context().add_class("trackrow")
Ejemplo n.º 46
0
 def __init__(self, rowid, num, show_headers):
     """
         Init row widget
         @param rowid as int
         @param num as int
         @param show headers as bool
     """
     Row.__init__(self, rowid, num)
     self._show_headers = show_headers
     self._indicator.set_margin_start(5)
     self._row_widget.set_margin_start(5)
     self._row_widget.set_margin_top(2)
     self._row_widget.set_margin_end(5)
     self._grid.insert_row(0)
     self._grid.insert_column(0)
     self._grid.insert_column(1)
     self._grid.attach(self._indicator, 1, 1, 1, 2)
     self._cover = Gtk.Image()
     self._cover.set_property('halign', Gtk.Align.CENTER)
     self._cover.set_property('valign', Gtk.Align.CENTER)
     self._cover.get_style_context().add_class('small-cover-frame')
     self._cover.set_no_show_all(True)
     # We force width with a Box
     box = Gtk.Box()
     box.set_homogeneous(True)
     box.add(self._cover)
     box.set_property('width-request', ArtSize.MEDIUM+2)
     self._grid.attach(box, 0, 0, 1, 2)
     self.show_all()
     self._header = Gtk.Grid()
     self._header.set_column_spacing(5)
     self._artist_label = Gtk.Label()
     self._artist_label.set_markup(
                              "<b>" +
                              escape(", ".join(self._track.artists)) +
                              "</b>")
     self._artist_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._artist_label.get_style_context().add_class('dim-label')
     self._album_label = Gtk.Label.new(self._track.album.name)
     self._album_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._album_label.get_style_context().add_class('dim-label')
     self._header.add(self._artist_label)
     self._header.add(self._album_label)
     self._num_label.set_property('valign', Gtk.Align.END)
     self._title_label.set_property('valign', Gtk.Align.END)
     self._duration_label.set_property('valign', Gtk.Align.END)
     self._indicator.set_property('valign', Gtk.Align.END)
     self._grid.attach(self._header, 1, 0, 4, 1)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self.show_headers(self._show_headers)
     self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [],
                          Gdk.DragAction.MOVE)
     self.drag_source_add_text_targets()
     self.drag_dest_set(Gtk.DestDefaults.DROP | Gtk.DestDefaults.MOTION,
                        [], Gdk.DragAction.MOVE)
     self.drag_dest_add_text_targets()
     self.connect('drag-begin', self._on_drag_begin)
     self.connect('drag-data-get', self._on_drag_data_get)
     self.connect('drag-data-received', self._on_drag_data_received)
     self.connect('drag-motion', self._on_drag_motion)
     self.connect('drag-leave', self._on_drag_leave)
Ejemplo n.º 47
0
 def __init__(self, rowid, num):
     """
         Init row widgets
         @param rowid as int
         @param num as int
         @param show loved as bool
     """
     # We do not use Gtk.Builder for speed reasons
     Gtk.ListBoxRow.__init__(self)
     self._artists_label = None
     self._track = Track(rowid)
     self._number = num
     self._timeout_id = None
     self._player_preview = None
     self._indicator = IndicatorWidget(self._track.id)
     self.set_indicator(Lp().player.current_track.id == self._track.id,
                        utils.is_loved(self._track.id))
     self._row_widget = Gtk.EventBox()
     self._row_widget.connect('button-press-event', self._on_button_press)
     self._row_widget.connect('enter-notify-event', self._on_enter_notify)
     self._grid = Gtk.Grid()
     self._grid.set_column_spacing(5)
     self._row_widget.add(self._grid)
     self._title_label = Gtk.Label.new(self._track.name)
     self._title_label.set_property('has-tooltip', True)
     self._title_label.connect('query-tooltip',
                               self._on_query_tooltip)
     self._title_label.set_property('hexpand', True)
     self._title_label.set_property('halign', Gtk.Align.START)
     self._title_label.set_ellipsize(Pango.EllipsizeMode.END)
     if self._track.non_album_artists:
         self._artists_label = Gtk.Label.new(escape(
                                  ", ".join(self._track.non_album_artists)))
         self._artists_label.set_use_markup(True)
         self._artists_label.set_property('has-tooltip', True)
         self._artists_label.connect('query-tooltip',
                                     self._on_query_tooltip)
         self._artists_label.set_property('hexpand', True)
         self._artists_label.set_property('halign', Gtk.Align.END)
         self._artists_label.set_ellipsize(Pango.EllipsizeMode.END)
         self._artists_label.set_opacity(0.3)
         self._artists_label.set_margin_end(5)
         self._artists_label.show()
     self._duration_label = Gtk.Label.new(
                                    seconds_to_string(self._track.duration))
     self._duration_label.get_style_context().add_class('dim-label')
     self._num_label = Gtk.Label()
     self._num_label.set_ellipsize(Pango.EllipsizeMode.END)
     self._num_label.set_property('valign', Gtk.Align.CENTER)
     self._num_label.set_width_chars(4)
     self._num_label.get_style_context().add_class('dim-label')
     self.update_num_label()
     self._menu_button = Gtk.Button.new()
     # Here a hack to make old Gtk version support min-height css attribute
     # min-height = 24px, borders = 2px, we set directly on stack
     # min-width = 24px, borders = 2px, padding = 8px
     self._menu_button.set_size_request(34, 26)
     self._menu_button.set_relief(Gtk.ReliefStyle.NONE)
     self._menu_button.get_style_context().add_class('menu-button')
     self._menu_button.get_style_context().add_class('track-menu-button')
     self._grid.add(self._num_label)
     self._grid.add(self._title_label)
     if self._artists_label is not None:
         self._grid.add(self._artists_label)
     self._grid.add(self._duration_label)
     # TODO Remove this later
     if Gtk.get_minor_version() > 16:
         self._grid.add(self._menu_button)
     else:
         self.connect('map', self._on_map)
     self.add(self._row_widget)
     self.get_style_context().add_class('trackrow')