def __init__(self, journal): self.journal = journal # Load Glade file. # TODO: Remove workaround for Windows once it is no longer needed. self.gladefile = os.path.join(filesystem.files_dir, 'main_window.glade') self.builder = Gtk.Builder() if filesystem.IS_WIN: import xml.etree.ElementTree as ET tree = ET.parse(self.gladefile) for node in tree.iter(): if 'translatable' in node.attrib: node.text = _(node.text) xml_text = ET.tostring(tree.getroot(), encoding='unicode') self.builder = Gtk.Builder.new_from_string(xml_text, len(xml_text)) else: self.builder.set_translation_domain('rednotebook') self.builder.add_from_file(self.gladefile) # Get the main window and set the icon self.main_frame = self.builder.get_object('main_frame') self.main_frame.set_title('RedNotebook') icon = GdkPixbuf.Pixbuf.new_from_file( os.path.join(filesystem.frame_icon_dir, 'rednotebook.svg')) self.main_frame.set_icon(icon) self.is_fullscreen = False self.uimanager = Gtk.UIManager() # Before fetching the menubar, add all menus and actiongroups. # Setup the toolbar items first to avoid warnings for missing actions. insert_menu.InsertMenu(self) format_menu.FormatMenu(self) self.menubar_manager = MainMenuBar(self) self.menubar = self.menubar_manager.get_menu_bar() main_vbox = self.builder.get_object('vbox3') main_vbox.pack_start(self.menubar, False, False, 0) main_vbox.reorder_child(self.menubar, 0) self.undo_redo_manager = undo.UndoRedoManager(self) self.calendar = MainCalendar(self.journal, self.builder.get_object('calendar')) self.day_text_field = DayEditor( self.builder.get_object('day_text_view'), self.undo_redo_manager) self.day_text_field.day_text_view.grab_focus() can_spell_check = self.day_text_field.can_spell_check() spell_check_enabled = bool(self.journal.config.read('spellcheck')) for actiongroup in self.menubar_manager.uimanager.get_action_groups(): if actiongroup.get_name() == 'MainMenuActionGroup': for action in actiongroup.list_actions(): if action.get_name() == 'CheckSpelling': action.set_sensitive(can_spell_check) action.set_active(spell_check_enabled and can_spell_check) self.day_text_field.enable_spell_check(spell_check_enabled) self.statusbar = Statusbar(self.builder.get_object('statusbar')) self.new_entry_dialog = NewEntryDialog(self) self.categories_tree_view = categories.CategoriesTreeView( self.builder.get_object('categories_tree_view'), self) self.new_entry_dialog.categories_tree_view = self.categories_tree_view self.back_one_day_button = self.builder.get_object( 'back_one_day_button') self.today_button = self.builder.get_object('today_button') self.forward_one_day_button = self.builder.get_object( 'forward_one_day_button') self.edit_pane = self.builder.get_object('edit_pane') self.text_vbox = self.builder.get_object('text_vbox') if browser.WebKit2: class Preview(browser.HtmlView): def __init__(self, journal): browser.HtmlView.__init__(self) self.journal = journal def show_day(self, new_day): html = self.journal.convert(new_day.text, 'xhtml') self.load_html(html) self.html_editor = Preview(self.journal) self.html_editor.connect('button-press-event', self.on_browser_clicked) self.html_editor.connect('decide-policy', self.on_browser_decide_policy) self.text_vbox.pack_start(self.html_editor, True, True, 0) self.html_editor.hide() self.html_editor.set_editable(False) else: self.html_editor = mock.MagicMock() preview_button = self.builder.get_object('preview_button') preview_button.set_label(_('Preview in Browser')) self.preview_mode = False # Let the edit_paned respect its childs size requests self.edit_pane.child_set_property(self.text_vbox, 'shrink', False) # Add InfoBar. self.infobar = customwidgets.Info() self.text_vbox.pack_start(self.infobar, False, False, 0) self.text_vbox.reorder_child(self.infobar, 1) # Add TemplateBar. self.template_bar = customwidgets.TemplateBar() self.text_vbox.pack_start(self.template_bar, False, False, 0) self.text_vbox.reorder_child(self.template_bar, 1) self.template_bar.hide() self.load_values_from_config() self.main_frame.show() self.options_manager = OptionsManager(self) self.export_assistant = ExportAssistant(self.journal) self.export_assistant.set_transient_for(self.main_frame) self.setup_clouds() self.setup_search() # Create an event->method dictionary and connect it to the widgets dic = { 'on_back_one_day_button_clicked': self.on_back_one_day_button_clicked, 'on_today_button_clicked': self.on_today_button_clicked, 'on_forward_one_day_button_clicked': self.on_forward_one_day_button_clicked, 'on_preview_button_clicked': self.on_preview_button_clicked, 'on_edit_button_clicked': self.on_edit_button_clicked, 'on_main_frame_configure_event': self.on_main_frame_configure_event, 'on_main_frame_window_state_event': self.on_main_frame_window_state_event, 'on_add_new_entry_button_clicked': self.on_add_new_entry_button_clicked, 'on_main_frame_delete_event': self.on_main_frame_delete_event, # connect_signals can only be called once, it seems # Otherwise RuntimeWarnings are raised: RuntimeWarning: missing handler '...' } self.builder.connect_signals(dic) self.set_shortcuts() self.setup_stats_dialog() self.template_manager = templates.TemplateManager(self) self.template_manager.make_empty_template_files() self.setup_template_menu() self.set_tooltips() self.setup_tray_icon() # Show/hide the "tags" panel on the right. self.builder.get_object('annotations_pane').set_visible( self.journal.config.read('showTagsPane'))
def __init__(self, journal): self.journal = journal # Load Glade file. # TODO: Remove workaround for Windows once it is no longer needed. self.gladefile = os.path.join(filesystem.files_dir, "main_window.glade") self.builder = Gtk.Builder() # Register GtkSourceView so builder can use it when loading the file # https://stackoverflow.com/q/10524196/434217 GObject.type_register(GtkSource.View) if filesystem.IS_WIN: from xml.etree import ElementTree as ET tree = ET.parse(self.gladefile) for node in tree.iter(): if "translatable" in node.attrib: node.text = _(node.text) xml_text = ET.tostring(tree.getroot(), encoding="unicode") self.builder = Gtk.Builder.new_from_string(xml_text, len(xml_text)) else: self.builder.set_translation_domain("rednotebook") self.builder.add_from_file(self.gladefile) # Get the main window and set the icon self.main_frame = self.builder.get_object("main_frame") self.main_frame.set_title("RedNotebook") icon = GdkPixbuf.Pixbuf.new_from_file( os.path.join(filesystem.frame_icon_dir, "rn-128.png")) self.main_frame.set_icon(icon) self.is_fullscreen = False self.uimanager = Gtk.UIManager() # Before fetching the menubar, add all menus and actiongroups. # Setup the toolbar items first to avoid warnings for missing actions. insert_menu.InsertMenu(self) format_menu.FormatMenu(self) self.menubar_manager = MainMenuBar(self) self.menubar = self.menubar_manager.get_menu_bar() main_vbox = self.builder.get_object("vbox3") main_vbox.pack_start(self.menubar, False, False, 0) main_vbox.reorder_child(self.menubar, 0) self.undo_action = self.uimanager.get_action("/MainMenuBar/Edit/Undo") self.redo_action = self.uimanager.get_action("/MainMenuBar/Edit/Redo") self.calendar = MainCalendar(self.journal, self.builder.get_object("calendar")) self.day_text_field = DayEditor( self.builder.get_object("day_text_view")) self.day_text_field.connect("can-undo-redo-changed", self.update_undo_redo_buttons) self.update_undo_redo_buttons() self.day_text_field.day_text_view.grab_focus() can_spell_check = self.day_text_field.can_spell_check() spell_check_enabled = bool(self.journal.config.read("spellcheck")) for actiongroup in self.menubar_manager.uimanager.get_action_groups(): if actiongroup.get_name() == "MainMenuActionGroup": for action in actiongroup.list_actions(): if action.get_name() == "CheckSpelling": action.set_sensitive(can_spell_check) action.set_active(spell_check_enabled and can_spell_check) self.day_text_field.enable_spell_check(spell_check_enabled) self.statusbar = Statusbar(self.builder.get_object("statusbar")) self.new_entry_dialog = NewEntryDialog(self) self.categories_tree_view = categories.CategoriesTreeView( self.builder.get_object("categories_tree_view"), self) self.new_entry_dialog.categories_tree_view = self.categories_tree_view self.back_one_day_button = self.builder.get_object( "back_one_day_button") self.today_button = self.builder.get_object("today_button") self.forward_one_day_button = self.builder.get_object( "forward_one_day_button") self.edit_pane = self.builder.get_object("edit_pane") self.text_vbox = self.builder.get_object("text_vbox") use_internal_preview = self.journal.config.read( "useInternalPreview", 1) if use_internal_preview and browser.WebKit2: class Preview(browser.HtmlView): def __init__(self, journal): browser.HtmlView.__init__(self) self.journal = journal self.internal = True def show_day(self, new_day): html = self.journal.convert(new_day.text, "xhtml", use_gtk_theme=True) self.load_html(html) def shutdown(self): pass self.html_editor = Preview(self.journal) self.html_editor.connect("button-press-event", self.on_browser_clicked) self.html_editor.connect("decide-policy", self.on_browser_decide_policy) self.text_vbox.pack_start(self.html_editor, True, True, 0) self.html_editor.set_editable(False) elif use_internal_preview and browser_cef.cef: class Preview(browser_cef.HtmlView): def __init__(self, journal): super().__init__() self.journal = journal self.internal = True def show_day(self, new_day): html = self.journal.convert(new_day.text, "xhtml", use_gtk_theme=True) self.load_html(html) def highlight(self, text): pass self.html_editor = Preview(self.journal) self.html_editor.connect("on-url-clicked", lambda _, url: self.navigate_to_uri(url)) self.text_vbox.pack_start(self.html_editor, True, True, 0) else: self.html_editor = mock.MagicMock() self.html_editor.internal = False preview_button = self.builder.get_object("preview_button") preview_button.set_label(_("Preview in Browser")) self.html_editor.hide() self.preview_mode = False # Let the edit_paned respect its childs size requests self.edit_pane.child_set_property(self.text_vbox, "shrink", False) # Add InfoBar. self.infobar = customwidgets.Info() self.text_vbox.pack_start(self.infobar, False, False, 0) self.text_vbox.reorder_child(self.infobar, 1) # Add TemplateBar. self.template_bar = customwidgets.TemplateBar() self.text_vbox.pack_start(self.template_bar, False, False, 0) self.text_vbox.reorder_child(self.template_bar, 1) self.template_bar.hide() self.load_values_from_config() self.main_frame.show() self.options_manager = OptionsManager(self) self.export_assistant = ExportAssistant(self.journal) self.export_assistant.set_transient_for(self.main_frame) self.setup_clouds() self.setup_search() # Create an event->method dictionary and connect it to the widgets dic = { "on_back_one_day_button_clicked": self.on_back_one_day_button_clicked, "on_today_button_clicked": self.on_today_button_clicked, "on_forward_one_day_button_clicked": self.on_forward_one_day_button_clicked, "on_preview_button_clicked": self.on_preview_button_clicked, "on_edit_button_clicked": self.on_edit_button_clicked, "on_main_frame_configure_event": self.on_main_frame_configure_event, "on_main_frame_window_state_event": self.on_main_frame_window_state_event, "on_add_new_entry_button_clicked": self.on_add_new_entry_button_clicked, "on_main_frame_delete_event": self.on_main_frame_delete_event, # connect_signals can only be called once, it seems # Otherwise RuntimeWarnings are raised: RuntimeWarning: missing handler '...' } self.builder.connect_signals(dic) self.set_shortcuts() self.setup_stats_dialog() self.template_manager = templates.TemplateManager(self) self.template_manager.make_empty_template_files() self.setup_template_menu() self.set_tooltips() self.setup_tray_icon() # Show/hide the "tags" panel on the right. self.builder.get_object("annotations_pane").set_visible( self.journal.config.read("showTagsPane"))