diff --git a/data/org.mpdevil.mpdevil.gschema.xml b/data/org.mpdevil.mpdevil.gschema.xml index b55b23f..44fe63c 100644 --- a/data/org.mpdevil.mpdevil.gschema.xml +++ b/data/org.mpdevil.mpdevil.gschema.xml @@ -16,6 +16,14 @@ 691 Default height of window + + 300 + Default width of mini player + + + 300 + Default height of mini player + 350 Default position of cover/playlist separator @@ -44,10 +52,6 @@ 160 Size of covers in album view - - 350 - Size of main cover - 24 Size of icons in main control bar diff --git a/src/mpdevil.py b/src/mpdevil.py index 6e1ae95..f703cfe 100755 --- a/src/mpdevil.py +++ b/src/mpdevil.py @@ -600,23 +600,26 @@ class Song(collections.UserDict): return f"{title}\n{GLib.markup_escape_text(self.get_album_with_date())}" class BinaryCover(bytes): - def get_pixbuf(self, size): + def get_pixbuf(self, size=-1): loader=GdkPixbuf.PixbufLoader() try: loader.write(self) loader.close() - raw_pixbuf=loader.get_pixbuf() - ratio=raw_pixbuf.get_width()/raw_pixbuf.get_height() - if ratio > 1: - pixbuf=raw_pixbuf.scale_simple(size,size/ratio,GdkPixbuf.InterpType.BILINEAR) + if size == -1: + pixbuf=loader.get_pixbuf() else: - pixbuf=raw_pixbuf.scale_simple(size*ratio,size,GdkPixbuf.InterpType.BILINEAR) + raw_pixbuf=loader.get_pixbuf() + ratio=raw_pixbuf.get_width()/raw_pixbuf.get_height() + if ratio > 1: + pixbuf=raw_pixbuf.scale_simple(size,size/ratio,GdkPixbuf.InterpType.BILINEAR) + else: + pixbuf=raw_pixbuf.scale_simple(size*ratio,size,GdkPixbuf.InterpType.BILINEAR) except gi.repository.GLib.Error: # load fallback if cover can't be loaded pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_size(FALLBACK_COVER, size, size) return pixbuf class FileCover(str): - def get_pixbuf(self, size): + def get_pixbuf(self, size=-1): try: pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_size(self, size, size) except gi.repository.GLib.Error: # load fallback if cover can't be loaded @@ -1066,7 +1069,6 @@ class ViewSettings(SettingsList): row=ToggleRow(label, settings, key, restart_required) self.append(row) int_data=( - (_("Main cover size"), (100, 1200, 10), "track-cover"), (_("Album view cover size"), (50, 600, 10), "album-cover"), (_("Action bar icon size"), (16, 64, 2), "icon-size"), ) @@ -1211,7 +1213,6 @@ class SettingsDialog(Gtk.Dialog): else: super().__init__(title=_("Preferences"), transient_for=parent) self.add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK) - self.set_default_size(500, 400) # widgets view=ViewSettings(settings) @@ -2872,30 +2873,31 @@ class CoverEventBox(Gtk.EventBox): def _on_disconnected(self, *args): self._album_popover.popdown() -class MainCover(Gtk.Image): +class MainCover(Gtk.DrawingArea): def __init__(self, client, settings): super().__init__() self._client=client self._settings=settings - # set default size - size=self._settings.get_int("track-cover") - self.set_size_request(size, size) + self._pixbuf=GdkPixbuf.Pixbuf() + self._surface=Gdk.cairo_surface_create_from_pixbuf(self._pixbuf, 0, None) # connect self._client.emitter.connect("current_song", self._refresh) self._client.emitter.connect("disconnected", self._on_disconnected) self._client.emitter.connect("reconnected", self._on_reconnected) - self._settings.connect("changed::track-cover", self._on_settings_changed) def _clear(self): - size=self._settings.get_int("track-cover") - self.set_from_pixbuf(GdkPixbuf.Pixbuf.new_from_file_at_size(FALLBACK_COVER, size, size)) + self._pixbuf=GdkPixbuf.Pixbuf.new_from_file(FALLBACK_COVER) + self._surface=Gdk.cairo_surface_create_from_pixbuf(self._pixbuf, 0, None) + self.queue_draw() def _refresh(self, *args): if self._client.current_cover is None: self._clear() else: - self.set_from_pixbuf(self._client.current_cover.get_pixbuf(self._settings.get_int("track-cover"))) + self._pixbuf=self._client.current_cover.get_pixbuf() + self._surface=Gdk.cairo_surface_create_from_pixbuf(self._pixbuf, 0, None) + self.queue_draw() def _on_disconnected(self, *args): self.set_sensitive(False) @@ -2904,10 +2906,16 @@ class MainCover(Gtk.Image): def _on_reconnected(self, *args): self.set_sensitive(True) - def _on_settings_changed(self, *args): - size=self._settings.get_int("track-cover") - self.set_size_request(size, size) - self._refresh() + def do_draw(self, context): + height_factor=self.get_allocated_height()/self._pixbuf.get_height() + width_factor=self.get_allocated_width()/self._pixbuf.get_width() + if height_factor < width_factor: + context.scale(height_factor, height_factor) + context.set_source_surface(self._surface, ((self.get_allocated_width()/height_factor)-self._pixbuf.get_width())/2, 0) + else: + context.scale(width_factor, width_factor) + context.set_source_surface(self._surface, 0, ((self.get_allocated_height()/width_factor)-self._pixbuf.get_height())/2) + context.paint() class CoverLyricsWindow(Gtk.Overlay): def __init__(self, client, settings): @@ -3644,10 +3652,10 @@ class MainWindow(Gtk.ApplicationWindow): idle_add(callback) def _mini_player(self, *args): + if self.is_maximized(): + self.unmaximize() if self._settings.get_boolean("mini-player"): - if self.is_maximized(): - self.unmaximize() - self.resize(1,1) + self.resize(self._settings.get_int("mini-player-width"), self._settings.get_int("mini-player-height")) else: self.resize(self._settings.get_int("width"), self._settings.get_int("height")) self.show_all() @@ -3751,10 +3759,14 @@ class MainWindow(Gtk.ApplicationWindow): self._search_button.set_sensitive(False) def _on_size_allocate(self, widget, rect): - if not self.is_maximized() and not self._settings.get_boolean("mini-player"): + if not self.is_maximized(): if (size:=self.get_size()) != self._size: # prevent unneeded write operations - self._settings.set_int("width", size[0]) - self._settings.set_int("height", size[1]) + if self._settings.get_boolean("mini-player"): + self._settings.set_int("mini-player-width", size[0]) + self._settings.set_int("mini-player-height", size[1]) + else: + self._settings.set_int("width", size[0]) + self._settings.set_int("height", size[1]) self._size=size def _on_cursor_watch(self, obj, typestring):