def buttons(app): """constructor for the headerbar buttons Returns: [NamedTupple] -- tupple of Gtk.Buttons """ Button = namedtuple("Button", "new open_recent save search menu") btn = Button( Gtk.Button().new_with_label(_("New")), Gtk.Box().new(0, 0), Gtk.Button().new_with_label(_("Save")), Gtk.Button().new_from_icon_name("system-search-symbolic", Gtk.IconSize.BUTTON), Gtk.MenuButton().new()) builder_window_menu = get_builder('Menu') model = builder_window_menu.get_object("Menu") open_button = Gtk.Button().new_with_label(_("Open")) open_button.set_action_name("app.open") recents_builder = get_builder('Recents') recents = recents_builder.get_object("recent_md_popover") recents_treeview = get_descendant(recents, "recent_view", level=0) recents_treeview.set_activate_on_single_click(True) recents_wd = recents_builder.get_object("recent_md_widget") recents_wd.connect('item-activated', app.on_open_recent) recents_button = Gtk.MenuButton().new() recents_button.set_image( Gtk.Image.new_from_icon_name("pan-down-symbolic", Gtk.IconSize.BUTTON)) recents_button.set_tooltip_text(_("Open Recent")) recents_button.set_popover(recents) btn.open_recent.get_style_context().add_class("linked") btn.open_recent.pack_start(open_button, False, False, 0) btn.open_recent.pack_end(recents_button, False, False, 0) btn.search.set_tooltip_text(_("Search and replace")) btn.menu.set_tooltip_text(_("Menu")) btn.menu.set_image( Gtk.Image.new_from_icon_name("open-menu-symbolic", Gtk.IconSize.BUTTON)) btn.menu.set_use_popover(True) btn.menu.set_menu_model(model) btn.new.set_action_name("app.new") btn.save.set_action_name("app.save") btn.search.set_action_name("app.search") return btn
def __init__(self, window, content, editor, text_view): self.text_view = text_view self.web_view = None self.web_view_pending_html = None builder = get_builder("Preview") preview = builder.get_object("preview") mode_button = builder.get_object("preview_mode_button") self.mode_revealer = builder.get_object("preview_mode_revealer") self.preview_converter = PreviewConverter() self.preview_renderer = PreviewRenderer( window, content, editor, text_view, preview, self.mode_revealer, mode_button) window.connect("style-updated", self.reload) self.text_changed_handler_id = None self.settings = Settings.new() self.web_scroll_handler_id = None self.text_scroll_handler_id = None self.loading = False self.shown = False
def __init__(self, window, content, editor, text_view): self.text_view = text_view self.web_view = None self.web_view_pending_html = None builder = get_builder("Preview") preview = builder.get_object("preview") mode_button = builder.get_object("preview_mode_button") self.mode_revealer = builder.get_object("preview_mode_revealer") self.preview_converter = PreviewConverter() self.preview_renderer = PreviewRenderer(window, content, editor, text_view, preview, self.mode_revealer, mode_button) window.connect("style-updated", self.reload) self.text_changed_handler_id = None self.settings = Settings.new() self.web_scroll_handler_id = None self.text_scroll_handler_id = None self.loading = False self.shown = False
def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated PreferencesDialog object. """ builder = get_builder('Preferences') new_object = builder.get_object("PreferencesWindow") return new_object
def on_about(self, _action, _param): builder = get_builder('About') about_dialog = builder.get_object("AboutDialog") about_dialog.set_transient_for(self.window) logo_file = get_media_path("de.wolfvollprecht.UberWriter.svg") logo = GdkPixbuf.Pixbuf.new_from_file(logo_file) about_dialog.set_logo(logo) about_dialog.present()
def on_about(self, _action, _param): builder = get_builder('About') about_dialog = builder.get_object("AboutDialog") about_dialog.set_transient_for(self.window) logo_file = get_media_path("de.wolfvollprecht.UberWriter.svg") logo = GdkPixbuf.Pixbuf.new_from_file(logo_file) about_dialog.set_logo(logo) about_dialog.present()
def __init__(self, settings): self.settings = settings self.builder = get_builder("Preferences") self.dark_mode_auto_switch = self.builder.get_object( "dark_mode_auto_switch") self.dark_mode_auto_switch.set_active( self.settings.get_value("dark-mode-auto")) self.dark_mode_auto_switch.connect("state-set", self.on_dark_mode_auto) self.dark_mode_switch = self.builder.get_object("dark_mode_switch") self.dark_mode_switch.set_active(self.settings.get_value("dark-mode")) self.dark_mode_switch.connect("state-set", self.on_dark_mode) self.spellcheck_switch = self.builder.get_object("spellcheck_switch") self.spellcheck_switch.set_active( self.settings.get_value("spellcheck")) self.spellcheck_switch.connect("state-set", self.on_spellcheck) self.gradient_overlay_switch = self.builder.get_object( "gradient_overlay_switch") self.gradient_overlay_switch.set_active( self.settings.get_value("gradient-overlay")) self.gradient_overlay_switch.connect("state-set", self.on_gradient_overlay) self.sync_scroll_switch = self.builder.get_object("sync_scroll_switch") self.sync_scroll_switch.set_active( self.settings.get_value("sync-scroll")) self.sync_scroll_switch.connect("state-set", self.on_sync_scroll) input_format_store = Gtk.ListStore(int, str) input_format = self.settings.get_string("input-format") input_format_active = 0 for i, fmt in enumerate(self.formats): input_format_store.append([i, fmt["name"]]) if fmt["format"] == input_format: input_format_active = i self.input_format_combobox = self.builder.get_object( "input_format_combobox") self.input_format_combobox.set_model(input_format_store) input_format_renderer = Gtk.CellRendererText() self.input_format_combobox.pack_start(input_format_renderer, True) self.input_format_combobox.add_attribute(input_format_renderer, "text", 1) self.input_format_combobox.set_active(input_format_active) self.input_format_combobox.connect("changed", self.on_input_format) self.input_format_help_button = self.builder.get_object( "input_format_help_button") self.input_format_help_button.connect('clicked', self.on_input_format_help)
def __init__(self, filename): """Set up the about dialog""" self.builder = get_builder('Export') self.dialog = self.builder.get_object("Export") self.stack = self.builder.get_object("export_stack") self.stack_switcher = self.builder.get_object("format_switcher") stack_pdf_disabled = self.builder.get_object("pdf_disabled") filename = filename or _("Untitled document.md") self.filechoosers = { export_format: self.stack.get_child_by_name(export_format) for export_format in ["pdf", "html", "advanced"] } for export_format, filechooser in self.filechoosers.items(): filechooser.set_do_overwrite_confirmation(True) filechooser.set_current_folder(os.path.dirname(filename)) if export_format == "advanced": self.adv_export_name = self.builder.get_object( "advanced_export_name") self.adv_export_name.set_text(os.path.basename(filename)[:-3]) else: filechooser.set_current_name( os.path.basename(filename)[:-2] + export_format) # Disable pdf if Texlive not installed texlive_installed = helpers.exist_executable("pdftex") if not texlive_installed: self.filechoosers["pdf"].set_visible(False) stack_pdf_disabled.set_visible(True) stack_pdf_disabled.set_text(disabled_text()) stack_pdf_disabled.set_justify(Gtk.Justification.CENTER) self.stack.connect('notify', self.allow_export, 'visible_child_name') self.builder.get_object("highlight_style").set_active(0) self.builder.get_object("css_filechooser").set_uri( helpers.path_to_file(Theme.get_current().web_css_path)) format_store = Gtk.ListStore(int, str) for i, fmt in enumerate(self.formats): format_store.append([i, fmt["name"]]) self.format_field = self.builder.get_object('choose_format') self.format_field.set_model(format_store) format_renderer = Gtk.CellRendererText() self.format_field.pack_start(format_renderer, True) self.format_field.add_attribute(format_renderer, "text", 1) self.format_field.set_active(0)
def __init__(self, filename): """Set up the about dialog""" self.builder = get_builder('Export') self.dialog = self.builder.get_object("Export") self.stack = self.builder.get_object("export_stack") self.stack_switcher = self.builder.get_object("format_switcher") stack_pdf_disabled = self.builder.get_object("pdf_disabled") filename = filename or _("Untitled document.md") self.filechoosers = {export_format: self.stack.get_child_by_name(export_format) for export_format in ["pdf", "html", "advanced"]} for export_format, filechooser in self.filechoosers.items(): filechooser.set_do_overwrite_confirmation(True) filechooser.set_current_folder(os.path.dirname(filename)) if export_format == "advanced": self.adv_export_name = self.builder.get_object("advanced_export_name") self.adv_export_name.set_text(os.path.basename(filename)[:-3]) else: filechooser.set_current_name(os.path.basename(filename)[:-2] + export_format) # Disable pdf if Texlive not installed texlive_installed = helpers.exist_executable("pdftex") if not texlive_installed: self.filechoosers["pdf"].set_visible(False) stack_pdf_disabled.set_visible(True) stack_pdf_disabled.set_text(disabled_text()) stack_pdf_disabled.set_justify(Gtk.Justification.CENTER) self.stack.connect('notify', self.allow_export, 'visible_child_name') self.builder.get_object("highlight_style").set_active(0) self.builder.get_object("css_filechooser").set_uri( helpers.path_to_file(Theme.get_current().web_css_path)) format_store = Gtk.ListStore(int, str) for i, fmt in enumerate(self.formats): format_store.append([i, fmt["name"]]) self.format_field = self.builder.get_object('choose_format') self.format_field.set_model(format_store) format_renderer = Gtk.CellRendererText() self.format_field.pack_start(format_renderer, True) self.format_field.add_attribute(format_renderer, "text", 1) self.format_field.set_active(0)
def __init__(self, settings): self.settings = settings self.builder = get_builder("Preferences") self.dark_mode_auto_switch = self.builder.get_object("dark_mode_auto_switch") self.dark_mode_auto_switch.set_active(self.settings.get_value("dark-mode-auto")) self.dark_mode_auto_switch.connect("state-set", self.on_dark_mode_auto) self.dark_mode_switch = self.builder.get_object("dark_mode_switch") self.dark_mode_switch.set_active(self.settings.get_value("dark-mode")) self.dark_mode_switch.connect("state-set", self.on_dark_mode) self.spellcheck_switch = self.builder.get_object("spellcheck_switch") self.spellcheck_switch.set_active(self.settings.get_value("spellcheck")) self.spellcheck_switch.connect("state-set", self.on_spellcheck) self.gradient_overlay_switch = self.builder.get_object("gradient_overlay_switch") self.gradient_overlay_switch.set_active(self.settings.get_value("gradient-overlay")) self.gradient_overlay_switch.connect("state-set", self.on_gradient_overlay) self.sync_scroll_switch = self.builder.get_object("sync_scroll_switch") self.sync_scroll_switch.set_active(self.settings.get_value("sync-scroll")) self.sync_scroll_switch.connect("state-set", self.on_sync_scroll) input_format_store = Gtk.ListStore(int, str) input_format = self.settings.get_string("input-format") input_format_active = 0 for i, fmt in enumerate(self.formats): input_format_store.append([i, fmt["name"]]) if fmt["format"] == input_format: input_format_active = i self.input_format_combobox = self.builder.get_object("input_format_combobox") self.input_format_combobox.set_model(input_format_store) input_format_renderer = Gtk.CellRendererText() self.input_format_combobox.pack_start(input_format_renderer, True) self.input_format_combobox.add_attribute(input_format_renderer, "text", 1) self.input_format_combobox.set_active(input_format_active) self.input_format_combobox.connect("changed", self.on_input_format) self.input_format_help_button = self.builder.get_object("input_format_help_button") self.input_format_help_button.connect('clicked', self.on_input_format_help)
def __init__(self, app): """Set up the main window""" Gtk.ApplicationWindow.__init__(self, application=Gio.Application.get_default(), title="Uberwriter") self.builder = get_builder('UberwriterWindow') self.add(self.builder.get_object("FullscreenOverlay")) self.set_default_size(850, 500) # preferences self.settings = Settings.new() self.set_name('UberwriterWindow') # Headerbars self.headerbar = headerbars.MainHeaderbar(app) self.set_titlebar(self.headerbar.hb_container) self.fs_headerbar = headerbars.FsHeaderbar(self.builder, app) self.title_end = " – UberWriter" self.set_headerbar_title("New File" + self.title_end) self.focusmode = False self.word_count = self.builder.get_object('word_count') self.char_count = self.builder.get_object('char_count') # Setup status bar hide after 3 seconds self.status_bar = self.builder.get_object('status_bar_box') self.statusbar_revealer = self.builder.get_object('status_bar_revealer') self.status_bar.get_style_context().add_class('status_bar_box') self.status_bar_visible = True self.was_motion = True self.buffer_modified_for_status_bar = False if self.settings.get_value("poll-motion"): self.connect("motion-notify-event", self.on_motion_notify) GObject.timeout_add(3000, self.poll_for_motion) self.accel_group = Gtk.AccelGroup() self.add_accel_group(self.accel_group) # Setup text editor self.text_editor = TextEditor() self.text_editor.set_name('UberwriterEditor') self.get_style_context().add_class('uberwriter_window') base_leftmargin = 100 self.text_editor.set_left_margin(base_leftmargin) self.text_editor.set_left_margin(40) self.text_editor.set_top_margin(80) self.text_editor.props.width_request = 600 self.text_editor.props.halign = Gtk.Align.CENTER self.text_editor.set_vadjustment(self.builder.get_object('vadjustment1')) self.text_editor.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) self.text_editor.connect('focus-out-event', self.focus_out) self.text_editor.get_style_context().connect('changed', self.style_changed) self.text_editor.set_top_margin(80) self.text_editor.set_bottom_margin(16) self.text_editor.set_pixels_above_lines(4) self.text_editor.set_pixels_below_lines(4) self.text_editor.set_pixels_inside_wrap(8) tab_array = Pango.TabArray.new(1, True) tab_array.set_tab(0, Pango.TabAlign.LEFT, 20) self.text_editor.set_tabs(tab_array) self.text_editor.show() self.text_editor.grab_focus() # Setup preview webview self.preview_webview = None self.editor_alignment = self.builder.get_object('editor_alignment') self.scrolled_window = self.builder.get_object('editor_scrolledwindow') self.scrolled_window.props.width_request = 600 self.scrolled_window.add(self.text_editor) self.alignment_padding = 40 self.editor_viewport = self.builder.get_object('editor_viewport') # some people seems to have performance problems with the overlay. # Let them disable it if self.settings.get_value("gradient-overlay"): self.overlay = self.scrolled_window.connect_after("draw", self.draw_gradient) self.smooth_scroll_starttime = 0 self.smooth_scroll_endtime = 0 self.smooth_scroll_acttarget = 0 self.smooth_scroll_data = { 'target_pos': -1, 'source_pos': -1, 'duration': 0 } self.smooth_scroll_tickid = -1 self.text_buffer = self.text_editor.get_buffer() self.text_buffer.set_text('') # Init Window height for top/bottom padding self.window_height = self.get_size()[1] self.text_change_event = self.text_buffer.connect( 'changed', self.text_changed) # Init file name with None self.set_filename() # Markup and Shortcuts for the TextBuffer self.markup_buffer = MarkupBuffer( self, self.text_buffer, base_leftmargin) self.markup_buffer.markup_buffer() # Set current theme self.apply_current_theme() # Scrolling -> Dark or not? self.textchange = False self.scroll_count = 0 self.timestamp_last_mouse_motion = 0 self.text_buffer.connect_after('mark-set', self.mark_set) # Drag and drop # self.TextEditor.drag_dest_unset() # self.TextEditor.drag_dest_set(Gtk.DestDefaults.ALL, [], Gdk.DragAction.COPY) self.target_list = Gtk.TargetList.new([]) self.target_list.add_uri_targets(1) self.target_list.add_text_targets(2) self.text_editor.drag_dest_set_target_list(self.target_list) self.text_editor.connect_after( 'drag-data-received', self.on_drag_data_received) def on_drop(_widget, *_args): print("drop") self.text_editor.connect('drag-drop', on_drop) self.text_buffer.connect('paste-done', self.paste_done) # self.connect('key-press-event', self.alt_mod) # Events for Typewriter mode # Setting up inline preview self.inline_preview = InlinePreview( self.text_editor, self.text_buffer) # Vertical scrolling self.vadjustment = self.scrolled_window.get_vadjustment() self.vadjustment.connect('value-changed', self.scrolled) # Setting up spellcheck self.auto_correct = None self.toggle_spellcheck(self.settings.get_value("spellcheck")) self.did_change = False ### # Sidebar initialization test ### self.paned_window = self.builder.get_object("main_pained") self.sidebar_box = self.builder.get_object("sidebar_box") self.sidebar = Sidebar(self) self.sidebar_box.hide() ### # Search and replace initialization # Same interface as Sidebar ;) ### self.searchreplace = SearchAndReplace(self) # Window resize self.window_resize(self) self.connect("configure-event", self.window_resize) self.connect("delete-event", self.on_delete_called)
def on_shortcuts(self, _action, _param): builder = get_builder('Shortcuts') builder.get_object("shortcuts").set_transient_for(self.window) builder.get_object("shortcuts").show()
def __init__(self, app): """Set up the main window""" super().__init__(application=Gio.Application.get_default(), title="Uberwriter") self.get_style_context().add_class('uberwriter-window') # Set UI builder = get_builder('Window') root = builder.get_object("FullscreenOverlay") self.connect("delete-event", self.on_delete_called) self.add(root) self.set_default_size(1000, 600) # Preferences self.settings = Settings.new() # Headerbars self.headerbar = headerbars.MainHeaderbar(app) self.set_titlebar(self.headerbar.hb_container) self.fs_headerbar = headerbars.FullscreenHeaderbar(builder, app) self.title_end = " – UberWriter" self.set_headerbar_title("New File" + self.title_end) self.timestamp_last_mouse_motion = 0 if self.settings.get_value("poll-motion"): self.connect("motion-notify-event", self.on_motion_notify) GObject.timeout_add(3000, self.poll_for_motion) self.accel_group = Gtk.AccelGroup() self.add_accel_group(self.accel_group) self.scrolled_window = builder.get_object('editor_scrolledwindow') # Setup text editor self.text_view = TextView(self.settings.get_int("characters-per-line")) self.text_view.connect('focus-out-event', self.focus_out) self.text_view.get_buffer().connect('changed', self.on_text_changed) self.text_view.show() self.text_view.grab_focus() self.scrolled_window.add(self.text_view) # Setup stats counter self.stats_revealer = builder.get_object('editor_stats_revealer') self.stats_button = builder.get_object('editor_stats_button') self.stats_handler = StatsHandler(self.stats_button, self.text_view) # Setup preview content = builder.get_object('content') editor = builder.get_object('editor') self.preview_handler = PreviewHandler(self, content, editor, self.text_view) # Setup header/stats bar hide after 3 seconds self.top_bottom_bars_visible = True self.was_motion = True self.buffer_modified_for_status_bar = False # some people seems to have performance problems with the overlay. # Let them disable it self.overlay_id = None self.toggle_gradient_overlay(self.settings.get_value("gradient-overlay")) # Init file name with None self.set_filename() # Setting up spellcheck self.auto_correct = None self.toggle_spellcheck(self.settings.get_value("spellcheck")) self.did_change = False ### # Sidebar initialization test ### self.paned_window = builder.get_object("main_paned") self.sidebar_box = builder.get_object("sidebar_box") self.sidebar = Sidebar(self) self.sidebar_box.hide() ### # Search and replace initialization # Same interface as Sidebar ;) ### self.searchreplace = SearchAndReplace(self, self.text_view, builder)
def on_shortcuts(self, _action, _param): builder = get_builder('Shortcuts') builder.get_object("shortcuts").set_transient_for(self.window) builder.get_object("shortcuts").show()
def __init__(self, app): """Set up the main window""" Gtk.ApplicationWindow.__init__( self, application=Gio.Application.get_default(), title="Uberwriter") # Set UI self.builder = get_builder('Window') root = self.builder.get_object("FullscreenOverlay") root.connect('style-updated', self.apply_current_theme) self.add(root) self.set_default_size(900, 500) # Preferences self.settings = Settings.new() # Headerbars self.headerbar = headerbars.MainHeaderbar(app) self.set_titlebar(self.headerbar.hb_container) self.fs_headerbar = headerbars.FullscreenHeaderbar(self.builder, app) self.title_end = " – UberWriter" self.set_headerbar_title("New File" + self.title_end) self.timestamp_last_mouse_motion = 0 if self.settings.get_value("poll-motion"): self.connect("motion-notify-event", self.on_motion_notify) GObject.timeout_add(3000, self.poll_for_motion) self.accel_group = Gtk.AccelGroup() self.add_accel_group(self.accel_group) # Setup text editor self.text_view = TextView() self.text_view.props.halign = Gtk.Align.CENTER self.text_view.connect('focus-out-event', self.focus_out) self.text_view.get_buffer().connect('changed', self.on_text_changed) self.text_view.show() self.text_view.grab_focus() # Setup preview webview self.preview_webview = None self.scrolled_window = self.builder.get_object('editor_scrolledwindow') self.scrolled_window.get_style_context().add_class( 'uberwriter-scrolled-window') self.scrolled_window.add(self.text_view) self.editor_viewport = self.builder.get_object('editor_viewport') # Stats counter self.stats_counter_revealer = self.builder.get_object( 'stats_counter_revealer') self.stats_button = self.builder.get_object('stats_counter') self.stats_button.get_style_context().add_class('stats-counter') self.stats_handler = StatsHandler(self.stats_button, self.text_view) # Setup header/stats bar hide after 3 seconds self.top_bottom_bars_visible = True self.was_motion = True self.buffer_modified_for_status_bar = False # some people seems to have performance problems with the overlay. # Let them disable it self.overlay_id = None self.toggle_gradient_overlay( self.settings.get_value("gradient-overlay")) # Init file name with None self.set_filename() # Setting up spellcheck self.auto_correct = None self.toggle_spellcheck(self.settings.get_value("spellcheck")) self.did_change = False ### # Sidebar initialization test ### self.paned_window = self.builder.get_object("main_pained") self.sidebar_box = self.builder.get_object("sidebar_box") self.sidebar = Sidebar(self) self.sidebar_box.hide() ### # Search and replace initialization # Same interface as Sidebar ;) ### self.searchreplace = SearchAndReplace(self, self.text_view) # Window resize self.window_resize(self) self.connect("configure-event", self.window_resize) self.connect("delete-event", self.on_delete_called) # Set current theme self.apply_current_theme() self.get_style_context().add_class('uberwriter-window')