From 80635ac4c063391ca832ea03b1ac4e99c4eca927 Mon Sep 17 00:00:00 2001 From: somas95 Date: Sat, 23 Jun 2018 21:34:53 +0200 Subject: [PATCH] Migrate right menu to GMenuModel --- data/media/style.css | 17 ++--- data/ui/UberwriterWindow.ui | 1 - data/ui/WindowMenu.ui | 5 +- uberwriter/UberwriterInlinePreview.py | 1 + uberwriter/UberwriterWindow.py | 100 ++++++++------------------ uberwriter_lib/AppWindow.py | 66 +++++++++++++---- 6 files changed, 94 insertions(+), 96 deletions(-) diff --git a/data/media/style.css b/data/media/style.css index 103b242..26b485f 100644 --- a/data/media/style.css +++ b/data/media/style.css @@ -12,15 +12,8 @@ bind "o" { "open-file" () }; bind "s" { "save-file" () }; bind "s" { "save-file-as" () }; - bind "d" { "toggle-focusmode" () }; - bind "p" { "toggle-preview" () }; bind "w" { "close-window" () }; - bind "f" { "toggle-search" () }; bind "b" { "toggle-bibtex" () }; - bind "r" { "toggle-search-replace" () }; - bind "f" { "toggle-search-replace" () }; - bind "F11" { "toggle-fullscreen" () }; - bind "F7" { "toggle-spellcheck" () }; } @binding-set editor-bindings { @@ -220,14 +213,14 @@ padding: 5px; } -#QuickPreviewPopup { +/* .QuickPreviewPopup { padding: 5px; margin: 5px; border: 1px solid #333; background: @ligth_bg; border-radius: 3px; border-color: @light_bg; -} +} */ #LexikonBubble label { /*padding: 5px;*/ @@ -254,16 +247,16 @@ padding-left: 20px; } -popover { +.QuickPreviewPopup { background-color: @light_bg; } -popover grid { +.QuickPreviewPopup grid { background-color: @light_bg; color: @dark_bg; border-color: @light_bg; } -popover label { +.QuickPreviewPopup label { color: @dark_bg; } \ No newline at end of file diff --git a/data/ui/UberwriterWindow.ui b/data/ui/UberwriterWindow.ui index 7d7516a..53c4e6c 100644 --- a/data/ui/UberwriterWindow.ui +++ b/data/ui/UberwriterWindow.ui @@ -461,7 +461,6 @@ Show HTML preview start none - 2 diff --git a/data/ui/WindowMenu.ui b/data/ui/WindowMenu.ui index 29633eb..e9842c4 100644 --- a/data/ui/WindowMenu.ui +++ b/data/ui/WindowMenu.ui @@ -16,14 +16,17 @@ Preview + app.preview
- Search and Replace ... + Search and Replace + app.search Auto _Spellcheck + app.spellcheck
diff --git a/uberwriter/UberwriterInlinePreview.py b/uberwriter/UberwriterInlinePreview.py index bb57d2c..5f52c4c 100644 --- a/uberwriter/UberwriterInlinePreview.py +++ b/uberwriter/UberwriterInlinePreview.py @@ -307,6 +307,7 @@ class UberwriterInlinePreview(): # b.show_all() # a.show_all() self.popover = Gtk.Popover.new(lbl) + self.popover.get_style_context().add_class("QuickPreviewPopup") self.popover.add(alignment) # a.add(alignment) dismiss, rect = self.popover.get_pointing_to() diff --git a/uberwriter/UberwriterWindow.py b/uberwriter/UberwriterWindow.py index a0f035c..4d7cac0 100644 --- a/uberwriter/UberwriterWindow.py +++ b/uberwriter/UberwriterWindow.py @@ -83,10 +83,7 @@ class UberwriterWindow(Window): 'save-file-as': (GObject.SIGNAL_ACTION, None, ()), 'new-file': (GObject.SIGNAL_ACTION, None, ()), 'toggle-bibtex': (GObject.SIGNAL_ACTION, None, ()), - 'toggle-spellcheck': (GObject.SIGNAL_ACTION, None, ()), 'toggle-preview': (GObject.SIGNAL_ACTION, None, ()), - 'toggle-search': (GObject.SIGNAL_ACTION, None, ()), - 'toggle-search-replace': (GObject.SIGNAL_ACTION, None, ()), 'close-window': (GObject.SIGNAL_ACTION, None, ()) } @@ -163,21 +160,10 @@ class UberwriterWindow(Window): def toggle_fullscreen(self, state): if state.get_boolean(): self.fullscreen() - key, mod = Gtk.accelerator_parse("Escape") - self.fullscreen_button.add_accelerator("activate", - self.accel_group, key, mod, Gtk.AccelFlags.VISIBLE) self.fullscreen_button.set_active(True) - self.fullscreen_menu_button.set_active(True) - # Hide Menu - self.menubar.hide() else: self.unfullscreen() - key, mod = Gtk.accelerator_parse("Escape") - self.fullscreen_button.remove_accelerator( - self.accel_group, key, mod) self.fullscreen_button.set_active(False) - self.fullscreen_menu_button.set_active(False) - self.menubar.hide() self.TextEditor.grab_focus() @@ -595,51 +581,35 @@ class UberwriterWindow(Window): self.set_filename() self.set_headerbar_title("New File" + self.title_end) - def menu_activate_fullscreen(self, widget=None): - self.fullscreen_button.emit('activate') - def menu_toggle_sidebar(self, widget=None): self.sidebar.toggle_sidebar() -# def menu_activate_preview(self, widget=None): -# self.preview_button.emit('activate') - - def toggle_spellcheck(self, widget=None, data=None): - if widget: - if self.spellcheck: - if widget.get_active(): - self.SpellChecker.enable() - else: - self.SpellChecker.disable() - - elif widget.get_active(): - self.SpellChecker = SpellChecker(self.TextEditor, self, locale.getdefaultlocale()[0], collapse=False) - if self.auto_correct: - self.auto_correct.set_language(self.SpellChecker.language) - self.SpellChecker.connect_language_change(self.auto_correct.set_language) - try: - self.spellcheck = True - except: - self.SpellChecker = None - self.spellcheck = False - dialog = Gtk.MessageDialog(self, - Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, - Gtk.MessageType.INFO, - Gtk.ButtonsType.NONE, - _("You can not enable the Spell Checker.") - ) - dialog.format_secondary_text(_("Please install 'hunspell' or 'aspell' dictionarys for your language from the software center.")) - response = dialog.run() - return - else: - widget = self.spellcheck_button - if self.spellcheck and self.SpellChecker.enabled(): - self.SpellChecker.disable() - widget.set_active(False) - else: + def toggle_spellcheck(self, status): + if self.spellcheck: + if status.get_boolean(): self.SpellChecker.enable() - widget.set_active(True) + else: + self.SpellChecker.disable() + elif status.get_boolean(): + self.SpellChecker = SpellChecker(self.TextEditor, self, locale.getdefaultlocale()[0], collapse=False) + if self.auto_correct: + self.auto_correct.set_language(self.SpellChecker.language) + self.SpellChecker.connect_language_change(self.auto_correct.set_language) + try: + self.spellcheck = True + except: + self.SpellChecker = None + self.spellcheck = False + dialog = Gtk.MessageDialog(self, + Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, + Gtk.MessageType.INFO, + Gtk.ButtonsType.NONE, + _("You can not enable the Spell Checker.") + ) + dialog.format_secondary_text(_("Please install 'hunspell' or 'aspell' dictionarys for your language from the software center.")) + response = dialog.run() + return return def on_drag_data_received(self, widget, drag_context, x, y, @@ -682,13 +652,12 @@ class UberwriterWindow(Window): self.present() return False - def toggle_preview(self, widget, data=None): - if widget.get_active(): + def toggle_preview(self, state): - # Toggle buttons + self.preview_button.set_active(state.get_boolean()) + + if state.get_boolean(): - # self.preview_button.set_active(True) - # self.preview_mnu_button.set_active(True) # Insert a tag with ID to scroll to # self.TextBuffer.insert_at_cursor('') # TODO @@ -748,8 +717,6 @@ class UberwriterWindow(Window): self.ScrolledWindow.add(self.TextEditor) self.TextEditor.show() - # self.preview_button.set_active(False) - # self.preview_mnu_button.set_active(False) self.queue_draw() return True @@ -822,7 +789,7 @@ class UberwriterWindow(Window): def open_uberwriter_markdown(self, widget, data=None): self.load_file(helpers.get_media_file('uberwriter_markdown.md')) - def open_search_and_replace(self, widget, data=None): + def open_search_and_replace(self): self.searchreplace.toggle_search() def open_advanced_export(self, widget, data=None): @@ -953,10 +920,7 @@ class UberwriterWindow(Window): self.connect('save-file-as', self.save_document_as) self.connect('new-file', self.new_document) self.connect('open-file', self.open_document) - #self.connect('toggle-preview', self.menu_activate_preview) - self.connect('toggle-spellcheck', self.toggle_spellcheck) self.connect('close-window', self.on_mnu_close_activate) - self.connect('toggle-search', self.open_search_and_replace) self.scroll_adjusted = False # Code for other initialization actions should be added here. @@ -1016,10 +980,10 @@ class UberwriterWindow(Window): self.fullscreen_button = builder.get_object('fullscreen_toggle') self.focusmode_button = builder.get_object('focus_toggle') self.preview_button = builder.get_object('preview_toggle') - self.preview_mnu_button = builder.get_object('mnu_preview') self.fullscreen_button.set_action_name("app.fullscreen") self.focusmode_button.set_action_name("app.focus_mode") + self.preview_button.set_action_name("app.preview") self.fullscreen_button.set_name('fullscreen_toggle') self.focusmode_button.set_name('focus_toggle') @@ -1161,7 +1125,6 @@ class UberwriterWindow(Window): self.vadjustment.connect('value-changed', self.scrolled) - self.spellcheck_button = builder.get_object("disable_spellcheck") # Setting up spellcheck self.auto_correct = None try: @@ -1175,7 +1138,6 @@ class UberwriterWindow(Window): except: self.SpellChecker = None self.spellcheck = False - builder.get_object("disable_spellcheck").set_active(False) if self.spellcheck: self.SpellChecker.append_filter('[#*]+', SpellChecker.FILTER_WORD) @@ -1266,13 +1228,11 @@ class UberwriterWindow(Window): logger.debug("Error writing settings file to disk. Error: %r" % e) def load_settings(self, builder): - spellcheck_button = builder.get_object("disable_spellcheck") try: f = open(CONFIG_PATH + "settings.pickle", "rb") settings = pickle.load(f) f.close() self.dark_mode = settings['dark_mode'] - spellcheck_button.set_active(settings['spellcheck']) logger.debug("loaded settings: %r" % settings) except Exception as e: logger.debug("(First Run?) Error loading settings from home dir. \ diff --git a/uberwriter_lib/AppWindow.py b/uberwriter_lib/AppWindow.py index dc53b00..5376e55 100644 --- a/uberwriter_lib/AppWindow.py +++ b/uberwriter_lib/AppWindow.py @@ -110,6 +110,8 @@ class Application(Gtk.Application): def do_startup(self): Gtk.Application.do_startup(self) + '''AppMenu Actions''' + action = Gio.SimpleAction.new("help", None) action.connect("activate", self.on_help) self.add_action(action) @@ -134,31 +136,60 @@ class Application(Gtk.Application): action.connect("activate", self.on_quit) self.add_action(action) + '''Right menu actions''' + set_dark_mode = self.settings.get_value("dark-mode") - action = Gio.SimpleAction.new_stateful( - "dark_mode", - None, - GLib.Variant.new_boolean(set_dark_mode)) + action = Gio.SimpleAction.new_stateful("dark_mode", + None, + GLib.Variant.new_boolean(set_dark_mode)) action.connect("change-state", self.on_dark_mode) self.add_action(action) - action = Gio.SimpleAction.new_stateful( - "focus_mode", - None, - GLib.Variant.new_boolean(False)) + action = Gio.SimpleAction.new_stateful("focus_mode", + None, + GLib.Variant.new_boolean(False)) action.connect("change-state", self.on_focus_mode) self.add_action(action) - action = Gio.SimpleAction.new_stateful( - "fullscreen", - None, - GLib.Variant.new_boolean(False)) + action = Gio.SimpleAction.new_stateful("fullscreen", + None, + GLib.Variant.new_boolean(False)) action.connect("change-state", self.on_fullscreen) self.add_action(action) + action = Gio.SimpleAction.new_stateful("preview", + None, + GLib.Variant.new_boolean(False)) + action.connect("change-state", self.on_preview) + self.add_action(action) + + action = Gio.SimpleAction.new("search", None) + action.connect("activate", self.on_search) + self.add_action(action) + + action = Gio.SimpleAction.new_stateful("preview", + None, + GLib.Variant.new_boolean(False)) + action.connect("change-state", self.on_preview) + self.add_action(action) + + action = Gio.SimpleAction.new_stateful("spellcheck", + None, + GLib.Variant.new_boolean(True)) + action.connect("change-state", self.on_spellcheck) + self.add_action(action) + builder = get_builder('App_menu') self.set_app_menu(builder.get_object("app-menu")) + '''Shortcuts''' + + self.set_accels_for_action("app.focus_mode",["d"]) + self.set_accels_for_action("app.fullscreen",["F11"]) + self.set_accels_for_action("app.preview",["p"]) + self.set_accels_for_action("app.search",["f"]) + self.set_accels_for_action("app.spellcheck",["F7"]) + def do_activate(self): # We only allow a single window and raise any existing ones @@ -242,6 +273,17 @@ class Application(Gtk.Application): def on_fullscreen(self, action, value): action.set_state(value) self.window.toggle_fullscreen(value) + + def on_preview(self, action, value): + action.set_state(value) + self.window.toggle_preview(value) + + def on_search(self, action, value): + self.window.open_search_and_replace() + + def on_spellcheck(self, action, value): + action.set_state(value) + self.window.toggle_spellcheck(value) def on_quit(self, action, param): self.quit()