diff --git a/data/gtk.glade b/data/gtk.glade index ace5bd7..39312dd 100644 --- a/data/gtk.glade +++ b/data/gtk.glade @@ -58,6 +58,62 @@ + + True + False + + + True + True + True + + + + True + False + go-previous-symbolic + + + + + + + True + False + vertical + + + True + False + Title + True + + + + + + + False + True + 0 + + + + + True + False + Artist + True + + + False + True + 1 + + + + + 100 1000 @@ -553,28 +609,109 @@ - + True - True + False + slide-left-right - + True True - 0 - horizontal - 3 - 0 - 0 - 1 - 0 + + + True + True + 0 + horizontal + 0 + 0 + 1 + 0 + True + + + + + + page0 + page0 + + + + + True + False + vertical + + + True + False + + + True + False + + + standalone-spinne + + + + + True + True + False + False + + + True + False + + + True + False + gtk-missing-image + 6 + + + + + + + standalone-scroll + 1 + + + + + True + True + 0 + + + + + True + False + + + False + True + 1 + + + + + page1 + page1 + 1 + - playlist diff --git a/mcg/mcgGtk.py b/mcg/mcgGtk.py index d7dcc00..53f05f2 100755 --- a/mcg/mcgGtk.py +++ b/mcg/mcgGtk.py @@ -969,13 +969,22 @@ class PlaylistPanel(mcg.Base): self._host = None self._item_size = 150 self._playlist = None + self._playlist_albums = None self._playlist_lock = threading.Lock() self._playlist_stop = threading.Event() self._icon_theme = Gtk.IconTheme.get_default() + self._standalone_pixbuf = None + self._selected_albums = [] # Widgets + self._appwindow = builder.get_object('appwindow') self._panel = builder.get_object('playlist-panel') self._toolbar = builder.get_object('playlist-toolbar') + self._headerbar = builder.get_object('headerbar') + self._headerbar_standalone = builder.get_object('headerbar-playlist-standalone') + self._panel_normal = builder.get_object('playlist-panel-normal') + self._panel_standalone = builder.get_object('playlist-panel-standalone') + # Clear button self._playlist_clear_button = builder.get_object('playlist-toolbar-clear') # Playlist Grid: Model @@ -987,6 +996,17 @@ class PlaylistPanel(mcg.Base): self._playlist_grid.set_text_column(-1) self._playlist_grid.set_tooltip_column(1) + # Standalone labels + self._standalone_title = builder.get_object('headerbar-playlist-standalone-title') + self._standalone_artist = builder.get_object('headerbar-playlist-standalone-artist') + # Standalone Image + self._standalone_stack = builder.get_object('playlist-standalone-stack') + self._standalone_spinner = builder.get_object('playlist-standalone-spinner') + self._standalone_scroll = builder.get_object('playlist-standalone-scroll') + self._standalone_image = builder.get_object('playlist-standalone-image') + # Action bar + action_bar = builder.get_object('playlist-standalone-actionbar') + def get(self): return self._panel @@ -998,10 +1018,41 @@ class PlaylistPanel(mcg.Base): def get_signal_handlers(self): return { - 'on_playlist-toolbar-clear_clicked': self._callback_from_widget + 'on_playlist-toolbar-clear_clicked': self._callback_from_widget, + 'on_playlist-iconview_item_activated': self.on_playlist_grid_clicked, + 'on_playlist-standalone-scroll_size_allocate': self.on_standalone_scroll_size_allocate, + 'on_headerbar-playlist-standalone-close_clicked': self.on_standalone_close_clicked } + def on_playlist_grid_clicked(self, widget, path): + # Get selected album + iter = self._playlist_grid_model.get_iter(path) + hash = self._playlist_grid_model.get_value(iter, 2) + album = self._playlist_albums[hash] + self._selected_albums = [album] + + # Set labels + self._standalone_title.set_text(album.get_title()) + self._standalone_artist.set_text(", ".join(album.get_artists())) + + # Show panel + self._panel.set_visible_child(self._panel_standalone) + self._appwindow.set_titlebar(self._headerbar_standalone) + + # Load cover + threading.Thread(target=self._show_standalone_image, args=(album,)).start() + + + def on_standalone_scroll_size_allocate(self, widget, allocation): + self._resize_standalone_image() + + + def on_standalone_close_clicked(self, widget): + self._panel.set_visible_child(self._panel.get_children()[0]) + self._appwindow.set_titlebar(self._headerbar) + + def set_item_size(self, item_size): if self._item_size != item_size: self._item_size = item_size @@ -1026,6 +1077,9 @@ class PlaylistPanel(mcg.Base): self._playlist_lock.acquire() self._playlist_stop.clear() self._playlist = playlist + self._playlist_albums = {} + for album in playlist: + self._playlist_albums[album.get_hash()] = album self._playlist_grid.set_model(None) self._playlist_grid.freeze_child_notify() self._playlist_grid_model.clear() @@ -1068,6 +1122,48 @@ class PlaylistPanel(mcg.Base): self.set_playlist(self._host, self._playlist) + def _show_standalone_image(self, album): + self._standalone_stack.set_visible_child(self._standalone_spinner) + self._standalone_spinner.start() + url = album.get_cover() + if url is not None and url is not "": + # Load image and draw it + self._standalone_pixbuf = Application.load_cover(url) + self._resize_standalone_image() + else: + # Reset image + self._standalone_image.clear() + self._standalone_stack.set_visible_child(self._standalone_scroll) + self._standalone_spinner.stop() + + + def _resize_standalone_image(self): + """Diese Methode skaliert das geladene Bild aus dem Pixelpuffer + auf die Größe des Fensters unter Beibehalt der Seitenverhältnisse + """ + pixbuf = self._standalone_pixbuf + size = self._standalone_scroll.get_allocation() + # Check pixelbuffer + if pixbuf is None: + return + + # Skalierungswert für Breite und Höhe ermitteln + ratioW = float(size.width) / float(pixbuf.get_width()) + ratioH = float(size.height) / float(pixbuf.get_height()) + # Kleineren beider Skalierungswerte nehmen, nicht Hochskalieren + ratio = min(ratioW, ratioH) + ratio = min(ratio, 1) + # Neue Breite und Höhe berechnen + width = int(math.floor(pixbuf.get_width()*ratio)) + height = int(math.floor(pixbuf.get_height()*ratio)) + if width <= 0 or height <= 0: + return + # Pixelpuffer auf Oberfläche zeichnen + self._standalone_image.set_allocation(self._standalone_scroll.get_allocation()) + self._standalone_image.set_from_pixbuf(pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) + self._standalone_image.show() + + def _callback_from_widget(self, widget): if widget is self._playlist_clear_button: self._callback(PlaylistPanel.SIGNAL_CLEAR_PLAYLIST)