From cb585cda1ec47dfc9a1ea01b69c2a2083718f81c Mon Sep 17 00:00:00 2001 From: coderkun Date: Tue, 10 Jul 2018 22:45:29 +0200 Subject: [PATCH] Handle window state properly (implements #52) Handle the window state as recommended by the Gnome HowDoI guide by using the wrapper class WindowState with GObject properties and bindings. Additionally use separate settings for width and height instead of an array. --- data/de.coderkun.mcg.gschema.xml | 17 +++++---- data/gtk.glade | 1 - mcg/widgets.py | 61 ++++++++++++++++++++------------ 3 files changed, 49 insertions(+), 30 deletions(-) diff --git a/data/de.coderkun.mcg.gschema.xml b/data/de.coderkun.mcg.gschema.xml index 241666a..f3994aa 100644 --- a/data/de.coderkun.mcg.gschema.xml +++ b/data/de.coderkun.mcg.gschema.xml @@ -26,15 +26,20 @@ Connection state State of last connection - - [800, 600] - Window size - Window size (width and height). + + 800 + Window width + The window width in pixels. - + + 600 + Window height + The window height in pixels. + + false Window maximized - Window maximized state. + Whether or not the window is in maximized state. diff --git a/data/gtk.glade b/data/gtk.glade index be6e68f..aa487b9 100644 --- a/data/gtk.glade +++ b/data/gtk.glade @@ -277,7 +277,6 @@ False - diff --git a/mcg/widgets.py b/mcg/widgets.py index 252781e..4cc060e 100644 --- a/mcg/widgets.py +++ b/mcg/widgets.py @@ -74,13 +74,31 @@ class InfoDialog(): +class WindowState(GObject.Object): + WIDTH = 'width' + HEIGHT = 'height' + IS_MAXIMIZED = 'is_maximized' + IS_FULLSCREENED = 'is_fullscreened' + width = GObject.Property(type=int, default=800) + height = GObject.Property(type=int, default=600) + is_maximized = GObject.Property(type=bool, default=False) + is_fullscreened = GObject.Property(type=bool, default=False) + + + def __init__(self): + GObject.Object.__init__(self) + + + + class Window(): SETTING_HOST = 'host' SETTING_PORT = 'port' SETTING_CONNECTED = 'connected' SETTING_IMAGE_DIR = 'image-dir' - SETTING_WINDOW_SIZE = 'window-size' - SETTING_WINDOW_MAXIMIZED = 'window-maximized' + SETTING_WINDOW_WIDTH = 'width' + SETTING_WINDOW_HEIGHT = 'height' + SETTING_WINDOW_MAXIMIZED = 'is-maximized' SETTING_PANEL = 'panel' SETTING_ITEM_SIZE = 'item-size' SETTING_SORT_ORDER = 'sort-order' @@ -101,9 +119,7 @@ class Window(): self._panels = [] self._mcg = client.Client() self._logger = logging.getLogger(__name__) - self._size = self._settings.get_value(Window.SETTING_WINDOW_SIZE) - self._maximized = self._settings.get_boolean(Window.SETTING_WINDOW_MAXIMIZED) - self._fullscreened = False + self._state = WindowState() # Login screen self._connection_panel = ConnectionPanel(builder) @@ -166,10 +182,13 @@ class Window(): self._settings.connect('changed::'+Window.SETTING_ITEM_SIZE, self.on_settings_item_size_changed) self._settings.connect('changed::'+Window.SETTING_SORT_ORDER, self.on_settings_sort_order_changed) self._settings.connect('changed::'+Window.SETTING_SORT_TYPE, self.on_settings_sort_type_changed) + self._settings.bind(Window.SETTING_WINDOW_WIDTH, self._state, WindowState.WIDTH, Gio.SettingsBindFlags.DEFAULT) + self._settings.bind(Window.SETTING_WINDOW_HEIGHT, self._state, WindowState.HEIGHT, Gio.SettingsBindFlags.DEFAULT) + self._settings.bind(Window.SETTING_WINDOW_MAXIMIZED, self._state, WindowState.IS_MAXIMIZED, Gio.SettingsBindFlags.DEFAULT) + handlers = { 'on_appwindow_size_allocate': self.on_resize, - 'on_appwindow_window_state_event': self.on_state, - 'on_appwindow_destroy': self.on_destroy + 'on_appwindow_window_state_event': self.on_state } handlers.update(self._header_bar.get_signal_handlers()) handlers.update(self._infobar.get_signal_handlers()) @@ -180,8 +199,8 @@ class Window(): builder.connect_signals(handlers) # Actions - self._appwindow.resize(int(self._size[0]), int(self._size[1])) - if self._maximized: + self._appwindow.set_default_size(self._state.width, self._state.height) + if self._state.get_property(WindowState.IS_MAXIMIZED): self._appwindow.maximize() self._appwindow.show_all() self._content_stack.set_visible_child(self._connection_panel.get()) @@ -213,22 +232,18 @@ class Window(): def present(self): self._appwindow.present() - self._appwindow.resize(800, 600) def on_resize(self, widget, event): - if not self._maximized: - self._size = (self._appwindow.get_allocation().width, self._appwindow.get_allocation().height) + if not self._state.get_property(WindowState.IS_MAXIMIZED): + size = self._appwindow.get_size() + self._state.set_property(WindowState.WIDTH, size.width) + self._state.set_property(WindowState.HEIGHT, size.height) def on_state(self, widget, state): - self._maximized = (state.new_window_state & Gdk.WindowState.MAXIMIZED > 0) + self._state.set_property(WindowState.IS_MAXIMIZED, (state.new_window_state & Gdk.WindowState.MAXIMIZED > 0)) self._fullscreen((state.new_window_state & Gdk.WindowState.FULLSCREEN > 0)) - self._settings.set_boolean(Window.SETTING_WINDOW_MAXIMIZED, self._maximized) - - - def on_destroy(self, window): - self._settings.set_value(Window.SETTING_WINDOW_SIZE, GLib.Variant('ai', list(self._size))) def on_menu_connect(self, action, value): @@ -304,7 +319,7 @@ class Window(): def on_cover_panel_toggle_fullscreen(self, widget): - if not self._fullscreened: + if not self._state.get_property(WindowState.IS_FULLSCREENED): self._appwindow.fullscreen() else: self._appwindow.unfullscreen() @@ -364,7 +379,7 @@ class Window(): def on_mcg_status(self, state, album, pos, time, volume, file, audio, bitrate, error): # Album GObject.idle_add(self._panels[Window._PANEL_INDEX_COVER].set_album, album) - if not album and self._fullscreened: + if not album and self._state.get_property(WindowState.IS_FULLSCREENED): self._fullscreen(False) # State if state == 'play': @@ -464,9 +479,9 @@ class Window(): def _fullscreen(self, fullscreened_new): - if fullscreened_new != self._fullscreened: - self._fullscreened = fullscreened_new - if self._fullscreened: + if fullscreened_new != self._state.get_property(WindowState.IS_FULLSCREENED): + self._state.set_property(WindowState.IS_FULLSCREENED, fullscreened_new) + if self._state.get_property(WindowState.IS_FULLSCREENED): self._header_bar.get().hide() self._panels[Window._PANEL_INDEX_COVER].set_fullscreen(True) else: