From f17886aa568f4e2fae0d4bf70757514e830e27d0 Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 30 Apr 2013 16:27:59 +0200 Subject: [PATCH] new GTK gui --- gui/gtk.py | 1364 ++++++++++++++++++++--------------------- gui/noise-texture.png | Bin 0 -> 79464 bytes mcgGtk.py | 2 +- 3 files changed, 669 insertions(+), 697 deletions(-) create mode 100644 gui/noise-texture.png diff --git a/gui/gtk.py b/gui/gtk.py index 8e99d33..7c1002f 100755 --- a/gui/gtk.py +++ b/gui/gtk.py @@ -6,14 +6,15 @@ __author__ = "coderkun" __email__ = "" __license__ = "GPL" -__version__ = "0.2" +__version__ = "0.3" __status__ = "Development" +import math import os import time -import urllib import threading +import urllib from gi.repository import Gtk, Gdk, GdkPixbuf, GObject @@ -24,6 +25,12 @@ import mcg class MCGGtk(Gtk.Window): TITLE = "MPDCoverGrid (Gtk)" + VIEW_COVER = 'cover' + VIEW_PLAYLIST = 'playlist' + VIEW_LIBRARY = 'library' + STYLE_CLASS_BG_TEXTURE = 'bg-texture' + STYLE_CLASS_NO_BG = 'no-bg' + def __init__(self): Gtk.Window.__init__(self, title=MCGGtk.TITLE) @@ -31,22 +38,50 @@ class MCGGtk(Gtk.Window): self._config = Configuration() self._maximized = False self._fullscreened = False - + self._albums = {} + # Widgets self._main_box = Gtk.VBox() self.add(self._main_box) self._bar_box = Gtk.VBox() + self._main_box.pack_start(self._bar_box, False, False, 0) self._toolbar = Toolbar(self._config) self._bar_box.pack_start(self._toolbar, True, True, 0) self._infobar = InfoBar() self._infobar.show() - self._main_box.pack_start(self._bar_box, False, False, 0) + self._view_box = Gtk.EventBox() + self._main_box.pack_end(self._view_box, True, True, 0) self._connection_panel = ConnectionPanel(self._config) - self._main_box.pack_end(self._connection_panel, True, True, 0) - self._cover_panel = CoverPanel(self._config) + self._view_box.add(self._connection_panel) + + # Views + self._cover_panel = CoverPanel() + self._playlist_panel = PlaylistPanel(self._config) + self._library_panel = LibraryPanel(self._config) # Properties self.set_hide_titlebar_when_maximized(True) + self._view_box.get_style_context().add_class(MCGGtk.STYLE_CLASS_BG_TEXTURE) + provider = Gtk.CssProvider() + provider.load_from_data(b""" + GtkWidget.bg-texture { + box-shadow:inset 4px 4px 10px rgba(0,0,0,0.3); + background-image:url('gui/noise-texture.png'); + } + GtkWidget.no-bg { + background:none; + } + GtkIconView.cell:selected, + GtkIconView.cell:selected:focus { + background-color:@theme_selected_bg_color; + } + GtkToolbar.primary-toolbar { + background:none; + border:none; + box-shadow:none; + } + """) + self.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) # Actions self.resize(self._config.window_width, self._config.window_height) @@ -58,21 +93,16 @@ class MCGGtk(Gtk.Window): self.connect('window-state-event', self.on_state) self.connect('delete-event', self.on_destroy) self._toolbar.connect_signal(Toolbar.SIGNAL_CONNECT, self.on_toolbar_connect) - self._toolbar.connect_signal(Toolbar.SIGNAL_UPDATE, self.on_toolbar_update) - self._toolbar.connect_signal(Toolbar.SIGNAL_SET_VOLUME, self.on_toolbar_set_volume) self._toolbar.connect_signal(Toolbar.SIGNAL_PLAYPAUSE, self.on_toolbar_playpause) - self._toolbar.connect_signal(Toolbar.SIGNAL_LIST_MODE, self.on_toolbar_list_mode) - self._toolbar.connect_signal(Toolbar.SIGNAL_CLEAR_PLAYLIST, self.on_toolbar_clear_playlist) - self._toolbar.connect_signal(Toolbar.SIGNAL_FILTER, self.on_toolbar_filter) - self._toolbar.connect_signal(Toolbar.SIGNAL_SORT, self.on_toolbar_sort) - self._toolbar.connect_signal(Toolbar.SIGNAL_SORT_TYPE, self.on_toolbar_sort_type) - self._toolbar.connect_signal(Toolbar.SIGNAL_GRID_SIZE_CHANGE, self.on_toolbar_grid_size_change) - self._toolbar.connect_signal(Toolbar.SIGNAL_GRID_SIZE_CHANGED, self.on_toolbar_grid_size_changed) + self._toolbar.connect_signal(Toolbar.SIGNAL_VIEW, self.on_toolbar_view) + self._toolbar.connect_signal(Toolbar.SIGNAL_SET_VOLUME, self.on_toolbar_set_volume) self._infobar.connect_signal(InfoBar.SIGNAL_CLOSE, self.on_infobar_close) self._connection_panel.connect_signal(ConnectionPanel.SIGNAL_PROFILE_CHANGED, self.on_connection_profile_changed) - self._cover_panel.connect_signal(CoverPanel.SIGNAL_ALBUMS_SET, self.on_albums_set) self._cover_panel.connect_signal(CoverPanel.SIGNAL_TOGGLE_FULLSCREEN, self.on_cover_panel_toggle_fullscreen) - self._cover_panel.connect_signal(CoverPanel.SIGNAL_PLAY, self.on_cover_panel_play) + self._playlist_panel.connect_signal(PlaylistPanel.SIGNAL_CLEAR_PLAYLIST, self.on_playlist_panel_clear_playlist) + self._library_panel.connect_signal(LibraryPanel.SIGNAL_PLAY, self.on_library_panel_play) + self._library_panel.connect_signal(LibraryPanel.SIGNAL_UPDATE, self.on_library_panel_update) + # View panels self._mcg.connect_signal(mcg.MCGClient.SIGNAL_CONNECT, self.on_mcg_connect) self._mcg.connect_signal(mcg.MCGClient.SIGNAL_STATUS, self.on_mcg_status) self._mcg.connect_signal(mcg.MCGClient.SIGNAL_LOAD_PLAYLIST, self.on_mcg_load_playlist) @@ -106,45 +136,24 @@ class MCGGtk(Gtk.Window): self._connect() - def on_toolbar_update(self): - self._mcg.update() - - - def on_toolbar_set_volume(self, volume): - self._mcg.set_volume(volume) - - def on_toolbar_playpause(self): self._mcg.playpause() - def on_toolbar_list_mode(self): - self._config.list_mode = self._toolbar.get_list_mode() - self._cover_panel.set_list_mode(self._toolbar.get_list_mode()) + def on_toolbar_view(self, view): + self._config.view = view + self._view_box.remove(self._view_box.get_children()[0]) + if view == MCGGtk.VIEW_COVER: + self._view_box.add(self._cover_panel) + elif view == MCGGtk.VIEW_PLAYLIST: + self._view_box.add(self._playlist_panel) + elif view == MCGGtk.VIEW_LIBRARY: + self._view_box.add(self._library_panel) + self._view_box.show_all() - def on_toolbar_clear_playlist(self): - self._mcg.clear_playlist() - - - def on_toolbar_filter(self, filter_string): - self._cover_panel.filter(filter_string) - - - def on_toolbar_sort(self, sort_order): - self._cover_panel.set_sort_order(sort_order) - - - def on_toolbar_sort_type(self, sort_type): - self._cover_panel.set_sort_type(sort_type) - - - def on_toolbar_grid_size_change(self, size): - self._cover_panel.set_grid_size(size) - - - def on_toolbar_grid_size_changed(self, size): - self._cover_panel.redraw() + def on_toolbar_set_volume(self, volume): + self._mcg.set_volume(volume) # Infobar callbacks @@ -163,15 +172,23 @@ class MCGGtk(Gtk.Window): # Cover Panel callbacks - def on_albums_set(self): - GObject.idle_add(self._toolbar.set_sensitive, True) - - def on_cover_panel_toggle_fullscreen(self): self._toggle_fullscreen() - def on_cover_panel_play(self, album): + # Playlist Panel callbacks + + def on_playlist_panel_clear_playlist(self): + self._mcg.clear_playlist() + + + # Library Panel callbacks + + def on_library_panel_update(self): + self._mcg.update() + + + def on_library_panel_play(self, album): self._mcg.play_album(album) @@ -180,25 +197,26 @@ class MCGGtk(Gtk.Window): def on_mcg_connect(self, connected, error): if connected: GObject.idle_add(self._connect_connected) - GObject.idle_add(self._load_albums) - GObject.idle_add(self._load_playlist) - GObject.idle_add(self._mcg.get_status) + self._mcg.load_playlist() + self._mcg.load_albums() + self._mcg.get_status() else: if error: self._show_error(str(error)) GObject.idle_add(self._connect_disconnected) - def on_mcg_status(self, state, album, pos, volume, error): - # State - if state == 'play': - GObject.idle_add(self._toolbar.set_pause) - elif state == 'pause' or state == 'stop': - GObject.idle_add(self._toolbar.set_play) + def on_mcg_status(self, state, album, pos, time, volume, error): # Album if album: - GObject.idle_add(self._toolbar.set_album, album, pos); GObject.idle_add(self._cover_panel.set_album, album) + # State + if state == 'play': + GObject.idle_add(self._toolbar.set_play) + GObject.idle_add(self._cover_panel.set_play, pos, time) + elif state == 'pause' or state == 'stop': + GObject.idle_add(self._toolbar.set_pause) + GObject.idle_add(self._cover_panel.set_pause) # Volume GObject.idle_add(self._toolbar.set_volume, volume) # Error @@ -209,11 +227,12 @@ class MCGGtk(Gtk.Window): def on_mcg_load_playlist(self, playlist, error): - self._cover_panel.set_playlist(self._connection_panel.get_host(), playlist) + self._playlist_panel.set_playlist(self._connection_panel.get_host(), playlist) def on_mcg_load_albums(self, albums, error): - self._cover_panel.set_albums(self._connection_panel.get_host(), albums) + self._albums = {} + self._library_panel.set_albums(self._connection_panel.get_host(), albums) def on_mcg_error(self, error): @@ -238,29 +257,25 @@ class MCGGtk(Gtk.Window): def _connect_connected(self): self._toolbar.connected() self._toolbar.set_sensitive(True) - self._connection_panel.set_sensitive(True) - self._main_box.remove(self._connection_panel) - self._main_box.pack_start(self._cover_panel, True, True, 0) - self._main_box.show_all() + self._view_box.remove(self._view_box.get_children()[0]) + if self._config.view == MCGGtk.VIEW_COVER: + self._view_box.add(self._cover_panel) + elif self._config.view == MCGGtk.VIEW_PLAYLIST: + self._view_box.add(self._playlist_panel) + elif self._config.view == MCGGtk.VIEW_LIBRARY: + self._view_box.add(self._library_panel) + self._view_box.show_all() def _connect_disconnected(self): self._toolbar.disconnected() self._toolbar.set_sensitive(True) self._connection_panel.set_sensitive(True) - self._main_box.remove(self._main_box.get_children()[1]) - self._main_box.pack_end(self._connection_panel, True, True, 0) - self._main_box.show_all() + self._view_box.remove(self._view_box.get_children()[0]) + self._view_box.add(self._connection_panel) + self._view_box.show_all() - def _load_playlist(self): - self._mcg.load_playlist() - - - def _load_albums(self): - self._toolbar.set_sensitive(False) - self._mcg.load_albums() - def _save_size(self): if not self._maximized: self._config.window_width = self.get_allocation().width @@ -284,10 +299,10 @@ class MCGGtk(Gtk.Window): self._fullscreened = fullscreened_new if self._fullscreened: self._toolbar.hide() - self._cover_panel.set_fullscreen_mode(True); + self._cover_panel.set_fullscreen(True) else: self._toolbar.show() - self._cover_panel.set_fullscreen_mode(False); + self._cover_panel.set_fullscreen(False) def _show_error(self, message): @@ -302,20 +317,48 @@ class MCGGtk(Gtk.Window): self._bar_box.remove(self._infobar) + def load_thumbnail(cache, album, size): + cache_url = cache.create_filename(album) + pixbuf = None + + if os.path.isfile(cache_url): + try: + pixbuf = GdkPixbuf.Pixbuf.new_from_file(cache_url) + except Exception as e: + print(e) + else: + url = album.get_cover() + if url is not None: + if url.startswith('/'): + try: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(url, size, size) + except Exception as e: + print(e) + else: + try: + response = urllib.request.urlopen(url) + loader = GdkPixbuf.PixbufLoader() + loader.write(response.read()) + loader.close() + pixbuf = loader.get_pixbuf().scale_simple(size, size, GdkPixbuf.InterpType.HYPER) + except Exception as e: + print(e) + if pixbuf is not None: + filetype = os.path.splitext(url)[1][1:] + if filetype == 'jpg': + filetype = 'jpeg' + pixbuf.savev(cache.create_filename(album), filetype, [], []) + return pixbuf + + + class Toolbar(mcg.MCGBase, Gtk.Toolbar): SIGNAL_CONNECT = 'connect' - SIGNAL_UPDATE = 'update' - SIGNAL_SET_VOLUME = 'set-volume' + SIGNAL_VIEW = 'view' SIGNAL_PLAYPAUSE = 'playpause' - SIGNAL_LIST_MODE = 'mode' - SIGNAL_CLEAR_PLAYLIST = 'clear-playlist' - SIGNAL_FILTER = 'filter' - SIGNAL_SORT = 'sort' - SIGNAL_SORT_TYPE = 'sort-type' - SIGNAL_GRID_SIZE_CHANGE = 'grid-size-temp' - SIGNAL_GRID_SIZE_CHANGED = 'grid-size' + SIGNAL_SET_VOLUME = 'set-volume' def __init__(self, config): @@ -327,114 +370,71 @@ class Toolbar(mcg.MCGBase, Gtk.Toolbar): # Widgets # Connection - self._connection_button = Gtk.ToolButton(Gtk.STOCK_DISCONNECT) + self._connection_button = Gtk.ToggleToolButton.new_from_stock(Gtk.STOCK_CONNECT) self.add(self._connection_button) - # Playback + # Separator self.add(Gtk.SeparatorToolItem()) - self._update_button = Gtk.ToolButton(Gtk.STOCK_REFRESH) - self._update_button.set_sensitive(False) - self.add(self._update_button) - self._volume_button = Gtk.VolumeButton()#None, 0, 100, 1) - self._volume_button.set_sensitive(False) - tool_item = Gtk.ToolItem() - tool_item.add(self._volume_button) - self.add(tool_item) - self._playpause_button = Gtk.ToolButton(Gtk.STOCK_MEDIA_PLAY) + # Playback + self._playpause_button = Gtk.ToggleToolButton.new_from_stock(Gtk.STOCK_MEDIA_PAUSE) self._playpause_button.set_sensitive(False) self.add(self._playpause_button) - self._list_mode_button = Gtk.ToggleToolButton(Gtk.STOCK_PAGE_SETUP) - self._list_mode_button.set_sensitive(False) - self.add(self._list_mode_button) - self._clear_playlist_button = Gtk.ToolButton(Gtk.STOCK_CLEAR) - self._clear_playlist_button.set_sensitive(False) - self.add(self._clear_playlist_button) - # Info - self.add(Gtk.SeparatorToolItem()) - tool_item = Gtk.ToolItem() - info_box = Gtk.VBox() - self._info_title_label = Gtk.Label() - self._info_title_label.set_justify(Gtk.Justification.LEFT) - self._info_title_label.set_alignment(0, 0) - info_box.pack_start(self._info_title_label, False, False, 0) - self._info_artist_label = Gtk.Label() - self._info_artist_label.set_justify(Gtk.Justification.LEFT) - self._info_artist_label.set_alignment(0, 0) - info_box.pack_end(self._info_artist_label, True, False, 0) - tool_item.add(info_box) - self.add(tool_item) - # Library Settings + # Separator separator = Gtk.SeparatorToolItem() separator.set_draw(False) separator.set_expand(True) self.add(separator) - tool_item = Gtk.ToolItem() - self._filter_entry = Gtk.SearchEntry() - self._filter_entry.set_sensitive(False) - tool_item.add(self._filter_entry) - self.add(tool_item) - tool_item = Gtk.ToolItem() - self._grid_size_scale = Gtk.HScale() - self._grid_size_scale.set_range(100,600) - self._grid_size_scale.set_round_digits(0) - self._grid_size_scale.set_value(self._config.item_size) - self._grid_size_scale.set_size_request(100, -1) - self._grid_size_scale.set_draw_value(False) - self._grid_size_scale.set_sensitive(False) - tool_item.add(self._grid_size_scale) - self.add(tool_item) - # Library grid menu - self._library_grid_menu = Gtk.Menu() - self._library_grid_menu.show() - menu_item = Gtk.RadioMenuItem(label="sort by artist") - menu_item.set_active(self._config.library_sort_order == mcg.MCGAlbum.SORT_BY_ARTIST) - menu_item.connect('activate', self.on_library_grid_menu_sort, mcg.MCGAlbum.SORT_BY_ARTIST) - menu_item.show() - library_grid_menu_group_sort = menu_item - self._library_grid_menu.add(menu_item) - menu_item = Gtk.RadioMenuItem(label="by title", group=library_grid_menu_group_sort) - menu_item.set_active(self._config.library_sort_order == mcg.MCGAlbum.SORT_BY_TITLE) - menu_item.connect('activate', self.on_library_grid_menu_sort, mcg.MCGAlbum.SORT_BY_TITLE) - menu_item.show() - self._library_grid_menu.add(menu_item) - menu_item = Gtk.RadioMenuItem(label="by year", group=library_grid_menu_group_sort) - menu_item.set_active(self._config.library_sort_order == mcg.MCGAlbum.SORT_BY_YEAR) - menu_item.connect('activate', self.on_library_grid_menu_sort, mcg.MCGAlbum.SORT_BY_YEAR) - menu_item.show() - self._library_grid_menu.add(menu_item) - menu_item_separator = Gtk.SeparatorMenuItem() - menu_item_separator.show() - self._library_grid_menu.add(menu_item_separator) - menu_item = Gtk.CheckMenuItem("Descending") - menu_item.set_active(self._config.library_sort_type == Gtk.SortType.DESCENDING) - menu_item.connect('activate', self.on_library_grid_menu_descending) - menu_item.show() - self._library_grid_menu.add(menu_item) - self._menu_button = Gtk.MenuToolButton() - self._menu_button.set_menu(self._library_grid_menu) - self._menu_button.set_direction(Gtk.ArrowType.DOWN) - self._menu_button.set_halign(Gtk.Align.END) - self._menu_button.set_sensitive(False) - self.add(self._menu_button) - + # View Buttons + item = Gtk.ToolItem() + item.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED); + self._view_box = Gtk.ButtonBox() + self._view_box.set_layout(Gtk.ButtonBoxStyle.CENTER) + self._view_box.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED); + self._view_box.get_style_context().add_class(Gtk.STYLE_CLASS_LINKED); + self._view_box.set_sensitive(False) + self._view_cover_button = Gtk.RadioButton(label="Cover") + self._view_cover_button.set_mode(False) + self._view_cover_button.set_active(self._config.view == MCGGtk.VIEW_COVER) + self._view_box.add(self._view_cover_button) + self._view_playlist_button = Gtk.RadioButton.new_with_label_from_widget(self._view_cover_button, "Playlist") + self._view_playlist_button.set_mode(False) + self._view_playlist_button.set_active(self._config.view == MCGGtk.VIEW_PLAYLIST) + self._view_box.add(self._view_playlist_button) + self._view_library_button = Gtk.RadioButton.new_with_label_from_widget(self._view_playlist_button, "Library") + self._view_library_button.set_mode(False) + self._view_library_button.set_active(self._config.view == MCGGtk.VIEW_LIBRARY) + self._view_box.add(self._view_library_button) + item.add(self._view_box) + item.show_all() + self.add(item) + # Separator + separator = Gtk.SeparatorToolItem() + separator.set_draw(False) + separator.set_expand(True) + self.add(separator) + # Volume + item = Gtk.ToolItem() + self._volume_button = Gtk.VolumeButton() + self._volume_button.set_sensitive(False) + item.add(self._volume_button) + self.add(item) # Properties self.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) - # Actions - self.set_list_mode(self._config.list_mode) - # Signals - self._connection_button.connect('clicked', self.callback_with_function, self.SIGNAL_CONNECT) - self._update_button.connect('clicked', self.callback_with_function, self.SIGNAL_UPDATE) + self._connection_button_handler = self._connection_button.connect('toggled', self._callback_from_widget, self.SIGNAL_CONNECT) + self._playpause_button_handler = self._playpause_button.connect('toggled', self._callback_from_widget, self.SIGNAL_PLAYPAUSE) + self._view_cover_button.connect('toggled', self.on_set_view, MCGGtk.VIEW_COVER) + self._view_playlist_button.connect('toggled', self.on_set_view, MCGGtk.VIEW_PLAYLIST) + self._view_library_button.connect('toggled', self.on_set_view, MCGGtk.VIEW_LIBRARY) self._volume_button.connect('value-changed', self.on_volume_changed) self._volume_button.connect('button-press-event', self.on_volume_set_active, True) self._volume_button.connect('button-release-event', self.on_volume_set_active, False) - self._playpause_button.connect('clicked', self.callback_with_function, self.SIGNAL_PLAYPAUSE) - self._list_mode_button.connect('clicked', self.callback_with_function, self.SIGNAL_LIST_MODE) - self._clear_playlist_button.connect('clicked', self.callback_with_function, self.SIGNAL_CLEAR_PLAYLIST) - self._filter_entry.connect('changed', self.callback_with_function, self.SIGNAL_FILTER, self._filter_entry.get_text) - self._grid_size_scale.connect('change-value', self.on_grid_size_change) - self._grid_size_scale.connect('button-release-event', self.on_grid_size_changed) + + + def on_set_view(self, button, view): + if button.get_active(): + self._callback(self.SIGNAL_VIEW, view) def on_volume_changed(self, widget, value): @@ -446,55 +446,32 @@ class Toolbar(mcg.MCGBase, Gtk.Toolbar): self._changing_volume = active - def on_grid_size_change(self, widget, scroll, value): - value = round(value) - range = self._grid_size_scale.get_adjustment() - if value < range.get_lower() or value > range.get_upper(): - return - self._callback(self.SIGNAL_GRID_SIZE_CHANGE, value) - - - def on_grid_size_changed(self, widget, event): - value = round(self._grid_size_scale.get_value()) - range = self._grid_size_scale.get_adjustment() - if value < range.get_lower() or value > range.get_upper(): - return - self._callback(self.SIGNAL_GRID_SIZE_CHANGED, value) - - - def on_library_grid_menu_sort(self, widget, sort_order): - self._callback(self.SIGNAL_SORT, sort_order) - - - def on_library_grid_menu_descending(self, widget): - if widget.get_active(): - self._callback(self.SIGNAL_SORT_TYPE, Gtk.SortType.DESCENDING) - else: - self._callback(self.SIGNAL_SORT_TYPE, Gtk.SortType.ASCENDING) - - def connected(self): self._connection_button.set_stock_id(Gtk.STOCK_CONNECT) - self._update_button.set_sensitive(True) - self._volume_button.set_sensitive(True) + with self._connection_button.handler_block(self._connection_button_handler): + self._connection_button.set_active(True) self._playpause_button.set_sensitive(True) - self._list_mode_button.set_sensitive(True) - self._clear_playlist_button.set_sensitive(True) - self._filter_entry.set_sensitive(True) - self._grid_size_scale.set_sensitive(True) - self._menu_button.set_sensitive(True) + self._view_box.set_sensitive(True) + self._volume_button.set_sensitive(True) def disconnected(self): self._connection_button.set_stock_id(Gtk.STOCK_DISCONNECT) - self._update_button.set_sensitive(False) - self._volume_button.set_sensitive(False) + self._connection_button.set_active(False) self._playpause_button.set_sensitive(False) - self._list_mode_button.set_sensitive(False) - self._clear_playlist_button.set_sensitive(False) - self._filter_entry.set_sensitive(False) - self._grid_size_scale.set_sensitive(False) - self._menu_button.set_sensitive(False) + self._view_box.set_sensitive(False) + self._volume_button.set_sensitive(False) + + + def set_play(self): + self._playpause_button.set_stock_id(Gtk.STOCK_MEDIA_PLAY) + with self._playpause_button.handler_block(self._playpause_button_handler): + self._playpause_button.set_active(True) + + + def set_pause(self): + self._playpause_button.set_stock_id(Gtk.STOCK_MEDIA_PAUSE) + self._playpause_button.set_active(False) def set_volume(self, volume): @@ -504,31 +481,7 @@ class Toolbar(mcg.MCGBase, Gtk.Toolbar): self._setting_volume = False - def set_play(self): - self._playpause_button.set_stock_id(Gtk.STOCK_MEDIA_PLAY) - - - def set_pause(self): - self._playpause_button.set_stock_id(Gtk.STOCK_MEDIA_PAUSE) - - - def set_list_mode(self, active): - self._list_mode_button.set_active(active) - - - def get_list_mode(self): - return self._list_mode_button.get_active() - - - def set_album(self, album, pos): - self._info_title_label.set_text("{} ({})".format(album.get_title(), album.get_date())) - self._info_artist_label.set_text(', '.join(album.get_artists())) - - - def callback_with_function(self, widget, signal, data_function=None): - data = [] - if data_function is not None: - data = {data_function()} + def _callback_from_widget(self, widget, signal, *data): self._callback(signal, *data) @@ -785,197 +738,106 @@ class ConnectionPanel(mcg.MCGBase, Gtk.Box): -class CoverPanel(mcg.MCGBase, Gtk.HPaned): - SIGNAL_ALBUMS_SET = 'albums-set' +class CoverPanel(mcg.MCGBase, Gtk.VBox): SIGNAL_TOGGLE_FULLSCREEN = 'toggle-fullscreen' - SIGNAL_PLAY = 'play' - MODE_GRID = 'grid' - MODE_LIST = 'list' - MODE_PROGRESS = 'progress' - MODE_FULLSCREEN = 'fullscreen' - def __init__(self, config): + def __init__(self): mcg.MCGBase.__init__(self) - Gtk.HPaned.__init__(self) - self._config = config - self._mode = None - self._cache = None + Gtk.VBox.__init__(self) self._current_album = None self._cover_pixbuf = None - self._host = None - self._albums = [] - self._playlist = [] - self._grid_pixbufs = {} - self._filter_string = "" - self._old_ranges = {} - self._playlist_lock = threading.Lock() - self._playlist_stop = threading.Event() - self._library_lock = threading.Lock() - self._library_stop = threading.Event() + self._timer = None # Widgets - self._current = Gtk.VPaned() + self._current_box = Gtk.Box(Gtk.Orientation.HORIZONTAL) + self._current_box.set_halign(Gtk.Align.FILL) + self._current_box.set_homogeneous(True) + self.pack_start(self._current_box, True, True, 10) # Cover self._cover_image = Gtk.Image() self._cover_box = Gtk.EventBox() - self._cover_box.override_background_color(Gtk.StateFlags.NORMAL, self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL)) self._cover_box.add(self._cover_image) self._cover_scroll = Gtk.ScrolledWindow() - self._cover_scroll.add_with_viewport(self._cover_box) - # Playlist - self._playlist_scroll = Gtk.ScrolledWindow() - # Playlist: GridModel - self._playlist_grid_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str) - self._playlist_grid_filter = self._playlist_grid_model.filter_new() - # Playlist: GridView - self._playlist_grid = Gtk.IconView(self._playlist_grid_filter) - self._playlist_grid.set_pixbuf_column(0) - self._playlist_grid.set_text_column(-1) - self._playlist_grid.set_tooltip_column(2) - self._playlist_grid.set_columns(-1) - self._playlist_grid.set_margin(0) - self._playlist_grid.set_spacing( 0) - self._playlist_grid.set_row_spacing(0) - self._playlist_grid.set_column_spacing(0) - self._playlist_grid.set_item_padding(0) - self._playlist_grid.set_reorderable(False) - self._playlist_grid.set_selection_mode(Gtk.SelectionMode.SINGLE) - self._playlist_grid.override_background_color(Gtk.StateFlags.NORMAL, self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL)) - # Playlist: ListModel - self._playlist_list_model = Gtk.ListStore(str, str, str, str, str, str) - # Playlist: ListView - self._playlist_list = Gtk.TreeView(self._playlist_list_model) - renderer = Gtk.CellRendererText() - column_artist = Gtk.TreeViewColumn("Artist", renderer, text=0) - column_album = Gtk.TreeViewColumn("Album", renderer, text=1) - column_track = Gtk.TreeViewColumn("Track", renderer, text=2) - column_title = Gtk.TreeViewColumn("Title", renderer, text=3) - column_date = Gtk.TreeViewColumn("Year", renderer, text=4) - self._playlist_list.append_column(column_artist) - self._playlist_list.append_column(column_album) - self._playlist_list.append_column(column_track) - self._playlist_list.append_column(column_title) - self._playlist_list.append_column(column_date) - # Library - self._library_scroll = Gtk.ScrolledWindow() - # Library: GridModel - self._library_grid_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str, str) - self._library_grid_model.set_sort_func(3, self.compare_albums, self._config.library_sort_order) - self._library_grid_model.set_sort_column_id(3, self._config.library_sort_type) - self._library_grid_filter = self._library_grid_model.filter_new() - self._library_grid_filter.set_visible_func(self.on_filter_visible) - # Library: GridView - self._library_grid = Gtk.IconView(self._library_grid_filter) - self._library_grid.set_pixbuf_column(0) - self._library_grid.set_text_column(-1) - self._library_grid.set_tooltip_column(2) - self._library_grid.set_columns(-1) - self._library_grid.set_margin(0) - self._library_grid.set_spacing( 0) - self._library_grid.set_row_spacing(0) - self._library_grid.set_column_spacing(0) - self._library_grid.set_item_padding(0) - self._library_grid.set_reorderable(False) - self._library_grid.set_selection_mode(Gtk.SelectionMode.SINGLE) - self._library_grid.override_background_color(Gtk.StateFlags.NORMAL, self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL)) - # Library: ListModel - self._library_list_model = Gtk.ListStore(str, str, str, str, str, str) - self._library_list_filter = self._library_list_model.filter_new() - self._library_list_filter.set_visible_func(self.on_filter_visible) - # Library: ListView - self._library_list = Gtk.TreeView(self._library_list_filter) - renderer = Gtk.CellRendererText() - column_artist = Gtk.TreeViewColumn("Artist", renderer, text=0) - column_album = Gtk.TreeViewColumn("Album", renderer, text=1) - column_track = Gtk.TreeViewColumn("Track", renderer, text=2) - column_title = Gtk.TreeViewColumn("Title", renderer, text=3) - column_date = Gtk.TreeViewColumn("Year", renderer, text=4) - self._library_list.append_column(column_artist) - self._library_list.append_column(column_album) - self._library_list.append_column(column_track) - self._library_list.append_column(column_title) - self._library_list.append_column(column_date) - # Progress Bar - self._progress_bar = Gtk.ProgressBar() - # Layout - self.pack1(self._current, True, True) - self._current.pack1(self._cover_scroll, True, True) - self._current.pack2(self._playlist_scroll, False, False) - self.pack2(self._library_scroll, False, False) - - # Actions - self.set_list_mode(self._config.list_mode) - self.set_position(self._config.library_position) - self._current.set_position(self._config.playlist_position) + self._cover_scroll.add(self._cover_box) + self._current_box.pack_start(self._cover_scroll, True, True, 10) + # Songs + self._songs_scale = Gtk.VScale() + self._songs_scale.set_halign(Gtk.Align.START) + self._songs_scale.set_vexpand(True) + self._songs_scale.set_digits(0) + self._songs_scale.set_draw_value(False) + self._songs_scale.override_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 1)) + self._current_box.pack_end(self._songs_scale, True, True, 10) + # Album Infos + self._info_grid = Gtk.Grid() + self._info_grid.set_halign(Gtk.Align.CENTER) + self._info_grid.set_row_spacing(5) + self._album_title_label = Gtk.Label() + self._info_grid.add(self._album_title_label) + self._album_date_label = Gtk.Label() + self._info_grid.attach_next_to(self._album_date_label, self._album_title_label, Gtk.PositionType.BOTTOM, 1, 1) + self._album_artist_label = Gtk.Label() + self._info_grid.attach_next_to(self._album_artist_label, self._album_date_label, Gtk.PositionType.BOTTOM, 1, 1) + self.pack_end(self._info_grid, False, True, 10) # Signals - self.connect('size-allocate', self.on_size_allocate) - self._current.connect('size-allocate', self.on_size_allocate) - self._cover_scroll.connect('size-allocate', self.on_cover_size_allocate) self._cover_box.connect('button-press-event', self.on_cover_box_pressed) - self._library_grid.connect('item-activated', self.on_library_grid_clicked) + self._cover_scroll.connect('size-allocate', self.on_cover_size_allocate) - def on_size_allocate(self, widget, allocation): - if widget is self: - self._config.library_position = self.get_position() - elif widget is self._current: - self._config.playlist_position = self._current.get_position() - - - def on_cover_size_allocate(self, widget, allocation): - self._resize_image() - def on_cover_box_pressed(self, widget, event): if event.type == Gdk.EventType._2BUTTON_PRESS: self._callback(self.SIGNAL_TOGGLE_FULLSCREEN) - - def on_library_grid_clicked(self, widget, path): - path = self._library_grid_filter.convert_path_to_child_path(path) - iter = self._library_grid_model.get_iter(path) - self._callback(self.SIGNAL_PLAY, self._library_grid_model.get_value(iter, 3)) - - - def on_filter_visible(self, model, iter, data): - if model is self._library_grid_model: - hash = model.get_value(iter, 3) - elif model is self._library_list_model: - hash = model.get_value(iter, 5) - if not hash in self._albums.keys(): - return - album = self._albums[hash] - return album.filter(self._filter_string) - - - def set_list_mode(self, active): - mode = CoverPanel.MODE_GRID - if active: - mode = CoverPanel.MODE_LIST - self.set_mode(mode) - - - def set_fullscreen_mode(self, active): - mode = CoverPanel.MODE_FULLSCREEN - if not active: - mode = self._mode - self._set_mode(mode) - - - def set_mode(self, mode): - if mode != self._mode: - self._mode = mode - GObject.idle_add(self._set_mode, mode) + def on_cover_size_allocate(self, widget, allocation): + self._resize_image() def set_album(self, album): + self._album_title_label.set_markup("{}".format(album.get_title())) + self._album_date_label.set_markup("{}".format(album.get_date())) + self._album_artist_label.set_markup("{}".format(', '.join(album.get_artists()))) + self._set_cover(album) + self._set_tracks(album) + + + def set_play(self, pos, time): + if self._timer is not None: + GObject.source_remove(self._timer) + for index in range(0, pos): + time = time + self._current_album.get_tracks()[index].get_time() + self._songs_scale.set_value(time+1) + self._timer = GObject.timeout_add(1000, self._playing) + + + def set_pause(self): + if self._timer is not None: + GObject.source_remove(self._timer) + self._timer = None + + + def set_fullscreen(self, active): + if active: + self._songs_scale.hide() + self._info_grid.hide() + self.child_set_property(self._current_box, 'padding', 0) + self._current_box.child_set_property(self._cover_scroll, 'padding', 0) + self._cover_box.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 1)) + else: + self._songs_scale.show() + self._info_grid.show() + self.child_set_property(self._current_box, 'padding', 10) + self._current_box.child_set_property(self._cover_scroll, 'padding', 10) + self._cover_box.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 0)) + + + def _set_cover(self, album): if self._current_album is not None and album.get_hash() == self._current_album.get_hash(): return self._current_album = album url = album.get_cover() - if url is not None and url is not "": # Load image and draw it self._cover_pixbuf = self._load_cover(url) @@ -986,6 +848,114 @@ class CoverPanel(mcg.MCGBase, Gtk.HPaned): self._cover_image.clear() + def _set_tracks(self, album): + self._songs_scale.clear_marks() + self._songs_scale.set_range(0, album.get_length()) + length = 0 + for track in album.get_tracks(): + self._songs_scale.add_mark(length, Gtk.PositionType.RIGHT, track.get_title()) + length = length + track.get_time() + self._songs_scale.add_mark(length, Gtk.PositionType.RIGHT, "{0[0]:02d}:{0[1]:02d} minutes".format(divmod(length, 60))) + + + def _playing(self): + value = self._songs_scale.get_value() + 1 + self._songs_scale.set_value(value) + return True + + + def _load_cover(self, url): + if url.startswith('/'): + try: + return GdkPixbuf.Pixbuf.new_from_file(url) + except Exception as e: + print(e) + return None + else: + try: + response = urllib.request.urlopen(url) + loader = GdkPixbuf.PixbufLoader() + loader.write(response.read()) + loader.close() + return loader.get_pixbuf() + except Exception as e: + print(e) + return None + + + def _resize_image(self): + """Diese Methode skaliert das geladene Bild aus dem Pixelpuffer + auf die Größe des Fensters unter Beibehalt der Seitenverhältnisse + """ + pixbuf = self._cover_pixbuf + size = self._cover_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(round(pixbuf.get_width()*ratio)) + height = int(round(pixbuf.get_height()*ratio)) + # Pixelpuffer auf Oberfläche zeichnen + self._cover_image.set_from_pixbuf(pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) + + + + +class PlaylistPanel(mcg.MCGBase, Gtk.VBox): + SIGNAL_CLEAR_PLAYLIST = 'clear-playlist' + + + def __init__(self, config): + mcg.MCGBase.__init__(self) + Gtk.VBox.__init__(self) + self._config = config + self._host = None + self._playlist = [] + self._playlist_lock = threading.Lock() + self._playlist_stop = threading.Event() + + # Widgets + # Toolbar + self._playlist_toolbar = Gtk.Toolbar() + self.pack_start(self._playlist_toolbar, False, True, 5) + # Clear button + self._clear_playlist_button = Gtk.ToolButton(Gtk.STOCK_CLEAR) + self._playlist_toolbar.add(self._clear_playlist_button) + # Playlist Grid: Model + self._playlist_grid_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + # Playlist Grid + self._playlist_grid = Gtk.IconView(self._playlist_grid_model) + self._playlist_grid.set_pixbuf_column(0) + self._playlist_grid.set_text_column(-1) + self._playlist_grid.set_tooltip_column(1) + self._playlist_grid.set_margin(0) + self._playlist_grid.set_spacing(0) + self._playlist_grid.set_row_spacing(0) + self._playlist_grid.set_column_spacing(0) + self._playlist_grid.set_item_padding(10) + self._playlist_grid.set_reorderable(False) + self._playlist_grid.set_item_width(-1) + #self._playlist_grid.set_selection_mode(Gtk.SelectionMode.SINGLE) + self._playlist_scroll = Gtk.ScrolledWindow() + self._playlist_scroll.add(self._playlist_grid) + self.pack_end(self._playlist_scroll, True, True, 0) + self.show_all(); + + # Properties + self._playlist_toolbar.get_style_context().add_class(MCGGtk.STYLE_CLASS_NO_BG) + self._playlist_grid.get_style_context().add_class(MCGGtk.STYLE_CLASS_NO_BG) + + # Signals + self._clear_playlist_button.connect('clicked' ,self._callback_from_widget, self.SIGNAL_CLEAR_PLAYLIST) + + def set_playlist(self, host, playlist): self._host = host self._playlist = playlist @@ -993,6 +963,227 @@ class CoverPanel(mcg.MCGBase, Gtk.HPaned): threading.Thread(target=self._set_playlist, args=(host, playlist, self._config.item_size,)).start() + def _set_playlist(self, host, playlist, size): + self._playlist_lock.acquire() + self._playlist_stop.clear() + Gdk.threads_enter() + self._playlist_grid.set_model(None) + self._playlist_grid.freeze_child_notify() + self._playlist_grid_model.clear() + Gdk.threads_leave() + + cache = mcg.MCGCache(host, size) + for album in playlist: + pixbuf = None + if album.get_cover() is not None: + try: + pixbuf = MCGGtk.load_thumbnail(cache, album, size) + except Exception as e: + print(e) + if pixbuf is None: + pixbuf = self._playlist_grid.render_icon_pixbuf(Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.DIALOG) + if pixbuf is not None: + self._playlist_grid_model.append([ + pixbuf, + GObject.markup_escape_text("\n".join([ + album.get_title(), + album.get_date(), + ', '.join(album.get_artists()) + ])), + album.get_hash() + ]) + + if self._playlist_stop.is_set(): + self._playlist_lock.release() + return + + Gdk.threads_enter() + self._playlist_grid.set_model(self._playlist_grid_model) + self._playlist_grid.thaw_child_notify() + self._playlist_grid.set_columns(len(playlist)) + Gdk.threads_leave() + self._playlist_lock.release() + + + def _callback_from_widget(self, widget, signal, *data): + self._callback(signal, *data) + + + + +class LibraryPanel(mcg.MCGBase, Gtk.VBox): + SIGNAL_UPDATE = 'update' + SIGNAL_PLAY = 'play' + + + def __init__(self, config): + mcg.MCGBase.__init__(self) + Gtk.VBox.__init__(self) + self._config = config + self._host = None + self._albums = [] + self._filter_string = "" + self._grid_pixbufs = {} + self._old_ranges = {} + self._library_lock = threading.Lock() + self._library_stop = threading.Event() + + # Widgets + # Toolbar + self._library_toolbar = Gtk.Toolbar() + self.pack_start(self._library_toolbar, False, True, 5) + # Update Button + self._update_library_button = Gtk.ToolButton(Gtk.STOCK_REFRESH) + self._library_toolbar.add(self._update_library_button) + # Separator + separator = Gtk.SeparatorToolItem() + separator.set_draw(False) + separator.set_expand(True) + self._library_toolbar.add(separator) + # Filter Entry + self._filter_entry = Gtk.SearchEntry() + self._filter_entry.set_placeholder_text("Bibliothek durchsuchen") + item = Gtk.ToolItem() + item.add(self._filter_entry) + self._library_toolbar.add(item) + # Separator + separator = Gtk.SeparatorToolItem() + separator.set_draw(False) + separator.set_expand(True) + self._library_toolbar.add(separator) + # Grid Scale + self._grid_scale = Gtk.HScale() + self._grid_scale.set_range(100,600) + self._grid_scale.set_round_digits(0) + self._grid_scale.set_value(self._config.item_size) + self._grid_scale.set_size_request(100, -1) + self._grid_scale.set_draw_value(False) + item = Gtk.ToolItem() + item.add(self._grid_scale) + self._library_toolbar.add(item) + # Library Sort Menu + library_sort_store = Gtk.ListStore(str, str) + library_sort_store.append([mcg.MCGAlbum.SORT_BY_ARTIST, "sort by artist"]) + library_sort_store.append([mcg.MCGAlbum.SORT_BY_TITLE, "sort by title"]) + library_sort_store.append([mcg.MCGAlbum.SORT_BY_YEAR, "sort by year"]) + self._library_sort_combo = Gtk.ComboBox.new_with_model(library_sort_store) + renderer_text = Gtk.CellRendererText() + self._library_sort_combo.pack_start(renderer_text, True) + self._library_sort_combo.add_attribute(renderer_text, "text", 1) + self._library_sort_combo.set_id_column(0) + self._library_sort_combo.set_active_id(self._config.library_sort_order) + item = Gtk.ToolItem() + item.add(self._library_sort_combo) + self._library_toolbar.add(item) + # Library Sort Type + self._library_sort_type_button = Gtk.ToggleToolButton.new_from_stock(Gtk.STOCK_SORT_ASCENDING) + if self._config.library_sort_type == Gtk.SortType.DESCENDING: + self._library_sort_type_button.set_active(True) + self._library_sort_type_button.set_stock_id(Gtk.STOCK_SORT_DESCENDING) + self._library_toolbar.add(self._library_sort_type_button) + # Progress Bar + self._progress_bar = Gtk.ProgressBar() + # Library Grid: TextRenderer +# text_renderer = Gtk.CellRendererText() +# text_renderer.props.alignment = Pango.Alignment.CENTER +# text_renderer.props.wrap_mode = Pango.WrapMode.WORD +# text_renderer.props.xalign = 0.5 +# text_renderer.props.yalign = 0 +# text_renderer.props.width = 150 +# text_renderer.props.wrap_width = 150 + # Library Grid: Model + self._library_grid_model = Gtk.ListStore(GdkPixbuf.Pixbuf, str, str) + self._library_grid_model.set_sort_func(2, self.compare_albums, self._config.library_sort_order) + self._library_grid_model.set_sort_column_id(2, self._config.library_sort_type) + self._library_grid_filter = self._library_grid_model.filter_new() + self._library_grid_filter.set_visible_func(self.on_filter_visible) + # Library Grid + self._library_grid = Gtk.IconView(self._library_grid_filter) +# self._library_grid.pack_end(text_renderer, False) +# self._library_grid.add_attribute(text_renderer, "markup", 0) + self._library_grid.set_pixbuf_column(0) + self._library_grid.set_text_column(-1) + self._library_grid.set_tooltip_column(1) + self._library_grid.set_margin(0) + self._library_grid.set_spacing(0) + self._library_grid.set_row_spacing(0) + self._library_grid.set_column_spacing(0) + self._library_grid.set_item_padding(10) + self._library_grid.set_reorderable(False) + self._library_grid.set_item_width(-1) + self._library_grid.set_selection_mode(Gtk.SelectionMode.SINGLE) + self._library_scroll = Gtk.ScrolledWindow() + self._library_scroll.add(self._library_grid) + self.pack_end(self._library_scroll, True, True, 0) + #self.show_all(); + + # Properties + self._library_grid.get_style_context().add_class(MCGGtk.STYLE_CLASS_NO_BG) + self._library_toolbar.get_style_context().add_class(MCGGtk.STYLE_CLASS_NO_BG) + + # Signals + self._update_library_button.connect('clicked', self._callback_from_widget, self.SIGNAL_UPDATE) + self._filter_entry.connect('changed', self.on_filter_entry_changed) + self._grid_scale.connect('change-value', self.on_grid_scale_change) + self._grid_scale.connect('button-release-event', self.on_grid_scale_changed) + self._library_sort_combo.connect("changed", self.on_library_sort_combo_changed) + self._library_sort_type_button.connect('clicked', self.on_library_sort_type_button_activated) + self._library_grid.connect('item-activated', self.on_library_grid_clicked) + + + def on_filter_entry_changed(self, widget): + self._filter_string = self._filter_entry.get_text() + GObject.idle_add(self._library_grid_filter.refilter) + + + def on_filter_visible(self, model, iter, data): + hash = model.get_value(iter, 2) + if not hash in self._albums.keys(): + return + album = self._albums[hash] + return album.filter(self._filter_string) + + + def on_grid_scale_change(self, widget, scroll, value): + size = round(value) + range = self._grid_scale.get_adjustment() + if size < range.get_lower() or size > range.get_upper(): + return + self._config.item_width = size + GObject.idle_add(self._set_widget_grid_size, self._library_grid, size, True) + + + def on_grid_scale_changed(self, widget, event): + size = round(self._grid_scale.get_value()) + range = self._grid_scale.get_adjustment() + if size < range.get_lower() or size > range.get_upper(): + return + self._redraw() + + + def on_library_sort_combo_changed(self, combo): + sort_order = combo.get_active_id() + self._config.library_sort_order = sort_order + self._library_grid_model.set_sort_func(2, self.compare_albums, sort_order) + + + def on_library_sort_type_button_activated(self, button): + if button.get_active(): + sort_type = Gtk.SortType.DESCENDING + button.set_stock_id(Gtk.STOCK_SORT_DESCENDING) + else: + sort_type = Gtk.SortType.ASCENDING + button.set_stock_id(Gtk.STOCK_SORT_ASCENDING) + self._config.library_sort_type = sort_type + self._library_grid_model.set_sort_column_id(2, sort_type) + + + def on_library_grid_clicked(self, widget, path): + path = self._library_grid_filter.convert_path_to_child_path(path) + iter = self._library_grid_model.get_iter(path) + self._callback(self.SIGNAL_PLAY, self._library_grid_model.get_value(iter, 2)) + + def set_albums(self, host, albums): self._host = host self._albums = albums @@ -1000,30 +1191,67 @@ class CoverPanel(mcg.MCGBase, Gtk.HPaned): threading.Thread(target=self._set_albums, args=(host, albums, self._config.item_size,)).start() - def filter(self, filter_string): - self._filter_string = filter_string - GObject.idle_add(self._library_grid_filter.refilter) - GObject.idle_add(self._library_list_filter.refilter) + def compare_albums(self, model, row1, row2, criterion): + hash1 = model.get_value(row1, 2) + hash2 = model.get_value(row2, 2) + + if hash1 == "" or hash2 == "": + return + return mcg.MCGAlbum.compare(self._albums[hash1], self._albums[hash2], criterion) - def set_sort_order(self, sort_order): - self._config.library_sort_order = sort_order - self._library_grid_model.set_sort_func(3, self.compare_albums, sort_order) + def _set_albums(self, host, albums, size): + self._library_lock.acquire() + self._library_stop.clear() + self.remove(self._library_toolbar) + self._progress_bar.set_fraction(0.0) + self.pack_start(self._progress_bar, False, True, 5) + self.show_all() + Gdk.threads_enter() + self._library_grid.set_model(None) + self._library_grid.freeze_child_notify() + self._library_grid_model.clear() + Gdk.threads_leave() + i = 0 + n = len(albums) + cache = mcg.MCGCache(host, size) + self._grid_pixbufs.clear() + for hash in albums.keys(): + album = albums[hash] + pixbuf = None + try: + pixbuf = MCGGtk.load_thumbnail(cache, album, size) + except Exception as e: + print(e) + if pixbuf is None: + pixbuf = self._library_grid.render_icon_pixbuf(Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.DIALOG) + if pixbuf is not None: + self._grid_pixbufs[album.get_hash()] = pixbuf + self._library_grid_model.append([ + pixbuf, + GObject.markup_escape_text("\n".join([ + album.get_title(), + album.get_date(), + ', '.join(album.get_artists()) + ])), + hash + ]) - def set_sort_type(self, sort_type): - self._config.library_sort_type = sort_type - self._library_grid_model.set_sort_column_id(3, sort_type) + i += 1 + GObject.idle_add(self._progress_bar.set_fraction, i/n) + if self._library_stop.is_set(): + self._library_lock.release() + return - - def set_grid_size(self, size): - self._config.item_width = size - GObject.idle_add(self._set_grid_size, size) - - - def _set_grid_size(self, size): - self._set_widget_grid_size(self._playlist_grid, size, False) - self._set_widget_grid_size(self._library_grid, size, True) + Gdk.threads_enter() + self._library_grid.set_model(self._library_grid_filter) + self._library_grid.thaw_child_notify() + Gdk.threads_leave() + self._library_lock.release() + self.remove(self._progress_bar) + self.pack_start(self._library_toolbar, False, True, 5) + self.show_all() def _set_widget_grid_size(self, grid_widget, size, vertical): @@ -1056,7 +1284,7 @@ class CoverPanel(mcg.MCGBase, Gtk.HPaned): for index in cur_range: iter = grid_filter.convert_iter_to_child_iter(grid_filter[index].iter) if index in vis_range: - hash = grid_model.get_value(iter, 3) + hash = grid_model.get_value(iter, 2) pixbuf = self._grid_pixbufs[hash] pixbuf = pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.NEAREST) else: @@ -1065,265 +1293,15 @@ class CoverPanel(mcg.MCGBase, Gtk.HPaned): self._old_ranges[grid_widget_id] = vis_range grid_widget.set_item_width(size) - self._config.item_size = size + #self._config.item_size = size - def redraw(self): - threading.Thread(target=self._set_playlist_and_albums, args=(self._host, self._playlist, self._albums, self._config.item_size,)).start() + def _redraw(self): + threading.Thread(target=self._set_albums, args=(self._host, self._albums, self._config.item_size,)).start() - def compare_albums(self, model, row1, row2, criterion): - hash1 = model.get_value(row1, 3) - hash2 = model.get_value(row2, 3) - - if hash1 == "" or hash2 == "": - return - return mcg.MCGAlbum.compare(self._albums[hash1], self._albums[hash2], criterion) - - - def _set_mode(self, mode): - # Layout - if len(self.get_children()) > 1: - self.remove(self.get_children()[1]) - if len(self._current.get_children()) > 1: - self._current.remove(self._current.get_children()[1]) - if mode != CoverPanel.MODE_FULLSCREEN: - self._current.pack2(self._playlist_scroll, False, False) - self.pack2(self._library_scroll, False, False) - - # Scroll content - if self._playlist_scroll.get_child() is not None: - self._playlist_scroll.remove(self._playlist_scroll.get_child()) - if self._library_scroll.get_child() is not None: - self._library_scroll.remove(self._library_scroll.get_child()) - if mode == CoverPanel.MODE_GRID: - self._playlist_scroll.add(self._playlist_grid) - self._playlist_scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.NEVER) - self._library_scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - self._library_scroll.add(self._library_grid) - elif mode == CoverPanel.MODE_LIST: - self._playlist_scroll.add(self._playlist_list) - self._playlist_scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self._library_scroll.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) - self._library_scroll.add(self._library_list) - elif mode == CoverPanel.MODE_PROGRESS: - self._playlist_scroll.add(self._playlist_grid) - self._library_scroll.add_with_viewport(self._progress_bar) - elif mode == CoverPanel.MODE_FULLSCREEN: - self._library_scroll.hide() - - # Cover background - if mode == CoverPanel.MODE_FULLSCREEN: - self._cover_box.override_background_color(Gtk.StateFlags.NORMAL, Gdk.RGBA(0, 0, 0, 1)) - else: - self._cover_box.override_background_color(Gtk.StateFlags.NORMAL, self.get_style_context().get_background_color(Gtk.StateFlags.NORMAL)) - - self.show_all() - - - def _set_playlist_and_albums(self, host, playlist, albums, size): - self._set_playlist(host, playlist, size) - self._set_albums(host, albums, size) - - - def _set_playlist(self, host, playlist, size): - self._playlist_lock.acquire() - self._playlist_stop.clear() - Gdk.threads_enter() - self._playlist_grid.set_model(None) - self._playlist_list.set_model(None) - self._playlist_grid.freeze_child_notify() - self._playlist_list.freeze_child_notify() - self._playlist_grid_model.clear() - self._playlist_list_model.clear() - Gdk.threads_leave() - - cache = mcg.MCGCache(host, size) - for album in playlist: - for track in album.get_tracks(): - self._playlist_list_model.append([ - ', '.join(track.get_artists()), - album.get_title(), - track.get_track(), - track.get_title(), - album.get_date(), - album.get_hash() - ]) - pixbuf = None - if album.get_cover() is not None: - try: - pixbuf = self._load_thumbnail(cache, album, size) - except Exception as e: - print(e) - if pixbuf is None: - pixbuf = self._playlist_grid.render_icon_pixbuf(Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.DIALOG) - if pixbuf is not None: - self._playlist_grid_model.append([ - pixbuf, - album.get_title(), - GObject.markup_escape_text("\n".join([ - album.get_title(), - album.get_date(), - ', '.join(album.get_artists()) - ])), - album.get_hash() - ]) - - if self._playlist_stop.is_set(): - self._playlist_lock.release() - return - - Gdk.threads_enter() - self._playlist_grid.set_model(self._playlist_grid_filter) - self._playlist_list.set_model(self._playlist_list_model) - self._playlist_grid.thaw_child_notify() - self._playlist_list.thaw_child_notify() - self._playlist_grid.set_columns(len(playlist)) - Gdk.threads_leave() - self._playlist_lock.release() - - - def _set_albums(self, host, albums, size): - self._library_lock.acquire() - self._library_stop.clear() - Gdk.threads_enter() - self._library_grid.set_model(None) - self._library_list.set_model(None) - self._library_grid.freeze_child_notify() - self._library_list.freeze_child_notify() - self._library_grid_model.clear() - self._library_list_model.clear() - self._progress_bar.set_fraction(0.0) - self._set_mode(CoverPanel.MODE_PROGRESS) - Gdk.threads_leave() - - i = 0 - n = len(albums) - cache = mcg.MCGCache(host, size) - self._grid_pixbufs.clear() - for hash in albums.keys(): - album = albums[hash] - pixbuf = None - for track in album.get_tracks(): - self._library_list_model.append([ - ', '.join(track.get_artists()), - album.get_title(), - track.get_track(), - track.get_title(), - album.get_date(), - hash - ]) - try: - pixbuf = self._load_thumbnail(cache, album, size) - except Exception as e: - print(e) - if pixbuf is None: - pixbuf = self._library_grid.render_icon_pixbuf(Gtk.STOCK_MISSING_IMAGE, Gtk.IconSize.DIALOG) - if pixbuf is not None: - self._grid_pixbufs[album.get_hash()] = pixbuf - self._library_grid_model.append([ - pixbuf, - album.get_title(), - GObject.markup_escape_text("\n".join([ - album.get_title(), - album.get_date(), - ', '.join(album.get_artists()) - ])), - hash - ]) - - i += 1 - GObject.idle_add(self._progress_bar.set_fraction, i/n) - if self._library_stop.is_set(): - self._library_lock.release() - return - - Gdk.threads_enter() - self._library_grid.set_model(self._library_grid_filter) - self._library_list.set_model(self._library_list_filter) - self._library_grid.thaw_child_notify() - self._library_list.thaw_child_notify() - self._set_mode(self._mode) - Gdk.threads_leave() - self._library_lock.release() - self._callback(self.SIGNAL_ALBUMS_SET) - - - def _load_cover(self, url): - if url.startswith('/'): - try: - return GdkPixbuf.Pixbuf.new_from_file(url) - except Exception as e: - print(e) - return None - else: - try: - response = urllib.request.urlopen(url) - loader = GdkPixbuf.PixbufLoader() - loader.write(response.read()) - loader.close() - return loader.get_pixbuf() - except Exception as e: - print(e) - return None - - - def _load_thumbnail(self, cache, album, size): - cache_url = cache.create_filename(album) - pixbuf = None - - if os.path.isfile(cache_url): - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file(cache_url) - except Exception as e: - print(e) - else: - url = album.get_cover() - if url is not None: - if url.startswith('/'): - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(url, size, size) - except Exception as e: - print(e) - else: - try: - response = urllib.request.urlopen(url) - loader = GdkPixbuf.PixbufLoader() - loader.write(response.read()) - loader.close() - pixbuf = loader.get_pixbuf().scale_simple(size, size, GdkPixbuf.InterpType.HYPER) - except Exception as e: - print(e) - if pixbuf is not None: - filetype = os.path.splitext(url)[1][1:] - if filetype == 'jpg': - filetype = 'jpeg' - pixbuf.savev(cache.create_filename(album), filetype, [], []) - return pixbuf - - - def _resize_image(self): - """Diese Methode skaliert das geladene Bild aus dem Pixelpuffer - auf die Größe des Fensters unter Beibehalt der Seitenverhältnisse - """ - pixbuf = self._cover_pixbuf - size = self._cover_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(round(pixbuf.get_width()*ratio)) - height = int(round(pixbuf.get_height()*ratio)) - # Pixelpuffer auf Oberfläche zeichnen - self._cover_image.set_from_pixbuf(pixbuf.scale_simple(width, height, GdkPixbuf.InterpType.HYPER)) - + def _callback_from_widget(self, widget, signal, *data): + self._callback(signal, *data) @@ -1344,14 +1322,12 @@ class Configuration(mcg.MCGConfig): self.window_height = self.getint('gui', 'window-height') self.window_maximized = self.getboolean('gui', 'window-maximized') self.item_size = self.getint('gui', 'item-size') - self.list_mode = self.getboolean('gui', 'list-mode') - self.library_position = self.getint('gui', 'library-position') + self.view = self.get('gui', 'view') self.library_sort_order = self.get('gui', 'library-sort-order') if self.getint('gui', 'library-sort-type') == 0: self.library_sort_type = Gtk.SortType.ASCENDING else: self.library_sort_type = Gtk.SortType.DESCENDING - self.playlist_position = self.getint('gui', 'playlist-position') self.save() @@ -1361,14 +1337,12 @@ class Configuration(mcg.MCGConfig): self.set('gui', 'window-height', str(self.window_height)) self.set('gui', 'window-maximized', str(self.window_maximized)) self.set('gui', 'item-size', str(self.item_size)) - self.set('gui', 'list-mode', str(self.list_mode)) - self.set('gui', 'library-position', str(self.library_position)) + self.set('gui', 'view', str(self.view)) self.set('gui', 'library-sort-order', str(self.library_sort_order)) if self.library_sort_type == Gtk.SortType.ASCENDING: self.set('gui', 'library-sort-type', str(0)) else: self.set('gui', 'library-sort-type', str(1)) - self.set('gui', 'playlist-position', str(self.playlist_position)) super().save() @@ -1382,9 +1356,7 @@ class Configuration(mcg.MCGConfig): self.set('gui', 'window-height', str(600)) self.set('gui', 'window-maximized', str(False)) self.set('gui', 'item-size', str(100)) - self.set('gui', 'list-mode', str(False)) - self.set('gui', 'library-position', str(450)) + self.set('gui', 'view', MCGGtk.VIEW_COVER) self.set('gui', 'library-sort-order', mcg.MCGAlbum.SORT_BY_YEAR) self.set('gui', 'library-sort-type', str(1)) - self.set('gui', 'playlist-position', str(450)) diff --git a/gui/noise-texture.png b/gui/noise-texture.png new file mode 100644 index 0000000000000000000000000000000000000000..6b70a2d40790fcbec68b2db067f4f6b0d47ec740 GIT binary patch literal 79464 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