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: