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)
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)
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))
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)
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)
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()))
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)
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))
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)
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)
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)
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))
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)
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()
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')
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)
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)
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))
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()
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)
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)
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)
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)
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)
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))
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))
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))
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))
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
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)
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))
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))
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)
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)
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)
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")
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)
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')