From d3b383109d05147615f0d5e3df07012133befea4 Mon Sep 17 00:00:00 2001 From: Zsolt Foldvari Date: Fri, 16 Feb 2007 21:20:36 +0000 Subject: [PATCH] 2007-02-16 Zsolt Foldvari * src/data/mainX.css: enable formatted notes on narrative web * src/plugins/NarrativeWeb.py: enable formatted notes on narrative web * src/MarkupText.py: properly reset xml generator output: fix #924 * src/ManagedWindow.py: enable accelerators in editor windows * src/Editors/_EditPrimary.py: enable accelerators in editor windows * src/Editors/_EditSecondary.py: enable accelerators in editor windows * src/Editors/_EditReference.py: enable accelerators in editor windows * src/DisplayTabs/_NoteTab.py: enable accelerators in editor windows * src/DisplayTabs/_ButtonTab.py: enable accelerators in editor windows * src/DisplayTabs/_GrampsTab.py: enable accelerators in editor windows svn: r8137 --- ChangeLog | 12 ++++++++++ src/DisplayTabs/_ButtonTab.py | 16 ++++++++++++- src/DisplayTabs/_GrampsTab.py | 2 ++ src/DisplayTabs/_NoteTab.py | 31 +++++++++++++++++--------- src/Editors/_EditPrimary.py | 16 ++++++++++--- src/Editors/_EditReference.py | 13 ++++++++++- src/Editors/_EditSecondary.py | 14 ++++++++++-- src/ManagedWindow.py | 14 ++++++++++++ src/MarkupText.py | 24 ++++++++++++-------- src/data/main1.css | 4 ++++ src/data/main2.css | 4 ++++ src/data/main3.css | 5 +++++ src/data/main4.css | 8 +++++++ src/data/main5.css | 5 +++++ src/data/main6.css | 2 ++ src/plugins/NarrativeWeb.py | 42 +++++++++++++++++------------------ 16 files changed, 164 insertions(+), 48 deletions(-) diff --git a/ChangeLog b/ChangeLog index baf677cbd..fef12dae8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2007-02-16 Zsolt Foldvari + * src/data/mainX.css: enable formatted notes on narrative web + * src/plugins/NarrativeWeb.py: enable formatted notes on narrative web + * src/MarkupText.py: properly reset xml generator output: fix #924 + * src/ManagedWindow.py: enable accelerators in editor windows + * src/Editors/_EditPrimary.py: enable accelerators in editor windows + * src/Editors/_EditSecondary.py: enable accelerators in editor windows + * src/Editors/_EditReference.py: enable accelerators in editor windows + * src/DisplayTabs/_NoteTab.py: enable accelerators in editor windows + * src/DisplayTabs/_ButtonTab.py: enable accelerators in editor windows + * src/DisplayTabs/_GrampsTab.py: enable accelerators in editor windows + 2007-02-16 Richard Taylor * src/ProgressDialog.py: more work on progress dialog diff --git a/src/DisplayTabs/_ButtonTab.py b/src/DisplayTabs/_ButtonTab.py index f57d7f267..b6e8e2764 100644 --- a/src/DisplayTabs/_ButtonTab.py +++ b/src/DisplayTabs/_ButtonTab.py @@ -60,7 +60,14 @@ class ButtonTab(GrampsTab): 'del' : _('Remove'), 'edit' : _('Edit'), 'share' : _('Share'), - } + } + + _ACCEL = { + 'add': 'Insert', + 'del': 'Delete', + 'edit': 'E', + 'share': 'S', + } def __init__(self, dbstate, uistate, track, name, share_button=False): """ @@ -97,6 +104,13 @@ class ButtonTab(GrampsTab): self.tooltips.set_tip(self.edit_btn, self._MSG['edit']) self.tooltips.set_tip(self.del_btn, self._MSG['del']) + key, mod = gtk.accelerator_parse(self._ACCEL['add']) + self.add_btn.add_accelerator('activate', self.accel_group, key, mod, gtk.ACCEL_VISIBLE) + key, mod = gtk.accelerator_parse(self._ACCEL['edit']) + self.edit_btn.add_accelerator('activate', self.accel_group, key, mod, gtk.ACCEL_VISIBLE) + key, mod = gtk.accelerator_parse(self._ACCEL['del']) + self.del_btn.add_accelerator('activate', self.accel_group, key, mod, gtk.ACCEL_VISIBLE) + if share_button: self.share_btn = SimpleButton(gtk.STOCK_INDEX, self.share_button_clicked) self.tooltips.set_tip(self.share_btn, self._MSG['share']) diff --git a/src/DisplayTabs/_GrampsTab.py b/src/DisplayTabs/_GrampsTab.py index 207a71448..721bc011d 100644 --- a/src/DisplayTabs/_GrampsTab.py +++ b/src/DisplayTabs/_GrampsTab.py @@ -73,6 +73,7 @@ class GrampsTab(gtk.HBox): self.label_container = self.build_label_widget() # build the interface + self.accel_group = gtk.AccelGroup() self.share_btn = None self.build_interface() @@ -158,3 +159,4 @@ class GrampsTab(gtk.HBox): can be used to add widgets to the interface. """ pass + \ No newline at end of file diff --git a/src/DisplayTabs/_NoteTab.py b/src/DisplayTabs/_NoteTab.py index 1b6265e73..a465ef197 100644 --- a/src/DisplayTabs/_NoteTab.py +++ b/src/DisplayTabs/_NoteTab.py @@ -79,11 +79,16 @@ class NoteTab(GrampsTab): return self.buf.get_char_count() == 0 def build_interface(self): + BUTTON = [(_('Italic'),gtk.STOCK_ITALIC,'i','I'), + (_('Bold'),gtk.STOCK_BOLD,'b','B'), + (_('Underline'),gtk.STOCK_UNDERLINE,'u','U'), + ] + vbox = gtk.VBox() - + self.text = gtk.TextView() self.text.set_accepts_tab(True) - + self.flowed = gtk.RadioButton(None, _('Flowed')) self.format = gtk.RadioButton(self.flowed, _('Formatted')) @@ -112,25 +117,29 @@ class NoteTab(GrampsTab): hbox.set_border_width(6) hbox.pack_start(self.flowed, False) hbox.pack_start(self.format, False) - vbox.pack_start(hbox, False) - self.pack_start(vbox, True) + self.buf = EditorBuffer() self.text.set_buffer(self.buf) tooltips = gtk.Tooltips() - for tip,stock,font in [('Italic',gtk.STOCK_ITALIC,'i'), - ('Bold',gtk.STOCK_BOLD,'b'), - ('Underline',gtk.STOCK_UNDERLINE,'u'), - ]: - button = gtk.ToggleButton() + for tip, stock, markup, accel in BUTTON: image = gtk.Image() image.set_from_stock(stock, gtk.ICON_SIZE_MENU) + + button = gtk.ToggleButton() button.set_image(image) - tooltips.set_tip(button, tip) button.set_relief(gtk.RELIEF_NONE) - self.buf.setup_widget_from_xml(button,font) + tooltips.set_tip(button, tip) + + self.buf.setup_widget_from_xml(button, markup) + + key, mod = gtk.accelerator_parse(accel) + button.add_accelerator('activate', self.accel_group, + key, mod, gtk.ACCEL_VISIBLE) + hbox.pack_start(button, False) + if self.note_obj: self.empty = False self.buf.set_text(self.note_obj.get(markup=True)) diff --git a/src/Editors/_EditPrimary.py b/src/Editors/_EditPrimary.py index 1aca82b82..375369fc2 100644 --- a/src/Editors/_EditPrimary.py +++ b/src/Editors/_EditPrimary.py @@ -84,14 +84,24 @@ class EditPrimary(ManagedWindow.ManagedWindow): return obj.get_handle() else: return id(self) - + def _setup_notebook_tabs(self, notebook): for child in notebook.get_children(): label = notebook.get_tab_label(child) page_no = notebook.page_num(child) label.drag_dest_set(0, [], 0) - label.connect('drag_motion', self._switch_page_on_dnd,notebook,page_no) - + label.connect('drag_motion', + self._switch_page_on_dnd, + notebook, + page_no) + try: + self.window.get_toplevel().add_accel_group(child.accel_group) + except AttributeError: + pass + + self.register_accelerator('Page_Down', notebook.next_page) + self.register_accelerator('Page_Up', notebook.prev_page) + def _switch_page_on_dnd(self, widget, context, x, y, time, notebook, page_no): if notebook.get_current_page() != page_no: notebook.set_current_page(page_no) diff --git a/src/Editors/_EditReference.py b/src/Editors/_EditReference.py index eb40588bd..8e74960e9 100644 --- a/src/Editors/_EditReference.py +++ b/src/Editors/_EditReference.py @@ -92,7 +92,18 @@ class EditReference(ManagedWindow.ManagedWindow): label = notebook.get_tab_label(child) page_no = notebook.page_num(child) label.drag_dest_set(0, [], 0) - label.connect('drag_motion', self._switch_page_on_dnd,notebook,page_no) + label.connect('drag_motion', + self._switch_page_on_dnd, + notebook, + page_no) + try: + self.window.get_toplevel().add_accel_group(child.accel_group) + except AttributeError: + pass + # FIXME: Since Reference editors have two notebooks accelerators + # are not working this way!! + self.register_accelerator('Page_Down', notebook.next_page) + self.register_accelerator('Page_Up', notebook.prev_page) def _switch_page_on_dnd(self, widget, context, x, y, time, notebook, page_no): if notebook.get_current_page() != page_no: diff --git a/src/Editors/_EditSecondary.py b/src/Editors/_EditSecondary.py index 2a0f90a03..210611d67 100644 --- a/src/Editors/_EditSecondary.py +++ b/src/Editors/_EditSecondary.py @@ -88,8 +88,18 @@ class EditSecondary(ManagedWindow.ManagedWindow): label = notebook.get_tab_label(child) page_no = notebook.page_num(child) label.drag_dest_set(0, [], 0) - label.connect('drag_motion', self._switch_page_on_dnd,notebook,page_no) - + label.connect('drag_motion', + self._switch_page_on_dnd, + notebook, + page_no) + try: + self.window.get_toplevel().add_accel_group(child.accel_group) + except AttributeError: + pass + + self.register_accelerator('Page_Down', notebook.next_page) + self.register_accelerator('Page_Up', notebook.prev_page) + def _switch_page_on_dnd(self, widget, context, x, y, time, notebook, page_no): if notebook.get_current_page() != page_no: notebook.set_current_page(page_no) diff --git a/src/ManagedWindow.py b/src/ManagedWindow.py index d2b1bc44c..7582c2ada 100644 --- a/src/ManagedWindow.py +++ b/src/ManagedWindow.py @@ -306,6 +306,8 @@ class ManagedWindow: ... """ + self.accel_group = gtk.AccelGroup() + self.accelerators = {} window_key = self.build_window_key(obj) menu_label,submenu_label = self.build_menu_names(obj) self._gladeobj = None @@ -340,10 +342,22 @@ class ManagedWindow: # On the top level: we use gramps top window self.parent_window = self.uistate.window + def register_accelerator(self, accelerator, callback, *args): + key, mod = gtk.accelerator_parse(accelerator) + self.accelerators[(key, mod)] = (callback, args) + self.accel_group.connect_group(key, mod, gtk.ACCEL_VISIBLE, + self.accel_func) + + def accel_func(self, accel_group, acceleratable, keyval, modifier): + if self.accelerators.has_key((keyval, modifier)): + callback, args = self.accelerators[(keyval, modifier)] + callback(*args) + def set_window(self,window,title,text,msg=None): set_titles(window, title, text, msg) self.window = window self.window.connect('delete-event', self.close) + self.window.get_toplevel().add_accel_group(self.accel_group) def build_menu_names(self,obj): return ('Undefined Menu','Undefined Submenu') diff --git a/src/MarkupText.py b/src/MarkupText.py index 50cef50c9..5db0fe156 100644 --- a/src/MarkupText.py +++ b/src/MarkupText.py @@ -57,9 +57,9 @@ import gtk class MarkupParser(ContentHandler): """A simple ContentHandler class to parse Gramps markup'ed text. - Use it with xml.sax.parse() or xml.sax.parseString(). - Parsing result can be obtained via it's public attributes. - + Use it with xml.sax.parse() or xml.sax.parseString(). A root tag, 'gramps', + is required. Parsing result can be obtained via the public attributes of + the class: @attr content: clean text @attr type: str @attr elements: list of markup elements @@ -220,7 +220,7 @@ class MarkupWriter: def generate(self, text, elements): # reset output and start root element - self._output.seek(0) + self._output.truncate(0) self._writer.startElement('gramps', self._attrs) # split the elements to events @@ -528,7 +528,10 @@ if __name__ == '__main__': def cb(window, event): gtk.main_quit() win.connect('delete-event', cb) - + + accel_group = gtk.AccelGroup() + win.add_accel_group(accel_group) + vbox = gtk.VBox() win.add(vbox) @@ -568,10 +571,10 @@ if __name__ == '__main__': buf = EditorBuffer() text.set_buffer(buf) tooltips = gtk.Tooltips() - for tip,stock,font in [('Italic',gtk.STOCK_ITALIC,'i'), - ('Bold',gtk.STOCK_BOLD,'b'), - ('Underline',gtk.STOCK_UNDERLINE,'u'), - ]: + for tip,stock,font,accel in [('Italic',gtk.STOCK_ITALIC,'i','I'), + ('Bold',gtk.STOCK_BOLD,'b','B'), + ('Underline',gtk.STOCK_UNDERLINE,'u','U'), + ]: button = gtk.ToggleButton() image = gtk.Image() image.set_from_stock(stock, gtk.ICON_SIZE_MENU) @@ -579,6 +582,9 @@ if __name__ == '__main__': tooltips.set_tip(button, tip) button.set_relief(gtk.RELIEF_NONE) buf.setup_widget_from_xml(button,font) + key, mod = gtk.accelerator_parse(accel) + button.add_accelerator('activate', accel_group, + key, mod, gtk.ACCEL_VISIBLE) hbox.pack_start(button, False) buf.set_text('' diff --git a/src/data/main1.css b/src/data/main1.css index 122f7fbce..90520bf4f 100644 --- a/src/data/main1.css +++ b/src/data/main1.css @@ -110,6 +110,10 @@ TD.data { padding: 1px 3em 1px 1px; /* Defines spacing between rows */ font-weight: bold; } +TD.note { + padding: 1px 3em 1px 1px; /* Defines spacing between rows */ + /*font-weight: bold;*/ +} TD.field { padding: 1px 3em 1px 1px; /* Defines spacing between rows */ /*width: 15%;*/ diff --git a/src/data/main2.css b/src/data/main2.css index 14ef26904..9a13987a0 100644 --- a/src/data/main2.css +++ b/src/data/main2.css @@ -112,6 +112,10 @@ TD.data { padding: 3px 3em 3px 3px; /* Defines spacing between rows */ font-weight: bold; } +TD.note { + padding: 3px 3em 3px 3px; /* Defines spacing between rows */ + /*font-weight: bold;*/ +} TD.field { padding: 3px 3em 3px 3px; /* Defines spacing between rows */ /*width: 15%;*/ diff --git a/src/data/main3.css b/src/data/main3.css index fd76bae60..451726fa0 100644 --- a/src/data/main3.css +++ b/src/data/main3.css @@ -115,6 +115,11 @@ TD.data { padding-right: 3em; font-weight: bold; } +TD.note { + padding: 4px; /* Defines spacing between rows */ + padding-right: 3em; + /*font-weight: bold;*/ +} TD.field { padding: 4px; /* Defines spacing between rows */ padding-right: 3em; diff --git a/src/data/main4.css b/src/data/main4.css index 2adea174a..81ac13026 100644 --- a/src/data/main4.css +++ b/src/data/main4.css @@ -123,6 +123,14 @@ TD.data { font-weight: bold; background-color: #f0ece6; } +TD.note { + margin: 0; + padding: 4px; /* Defines spacing between rows */ + padding-left: 10px; + padding-right: 3em; + /*font-weight: bold;*/ + background-color: #f0ece6; +} TD.field { margin: 0; padding: 4px; /* Defines spacing between rows */ diff --git a/src/data/main5.css b/src/data/main5.css index 760345b04..7ffe357f1 100644 --- a/src/data/main5.css +++ b/src/data/main5.css @@ -132,6 +132,11 @@ TD.data { padding-right: 3em; font-weight: bold; } +TD.note { + padding: 3px; /* Defines spacing between rows */ + padding-right: 3em; + /*font-weight: bold;*/ +} /* float left and right */ .leftwrap { float: left; diff --git a/src/data/main6.css b/src/data/main6.css index 9f978daf8..a0d4bb7be 100644 --- a/src/data/main6.css +++ b/src/data/main6.css @@ -110,6 +110,8 @@ TD.field { } TD.data { } +TD.note { +} #summaryarea TABLE.infolist TR TD { font-weight: bold; } diff --git a/src/plugins/NarrativeWeb.py b/src/plugins/NarrativeWeb.py index 9679d9ac5..6bbec984d 100644 --- a/src/plugins/NarrativeWeb.py +++ b/src/plugins/NarrativeWeb.py @@ -158,7 +158,7 @@ class BasePage: self.graphgens = options.handler.options_dict['NWEBgraphgens'] self.use_home = self.options.handler.options_dict['NWEBhomenote'] != "" self.page_title = "" - self.warn_dir = True + self.warn_dir = True def store_file(self,archive,html_dir,from_path,to_path): if archive: @@ -168,18 +168,18 @@ class BasePage: dirname = os.path.dirname(dest) if not os.path.isdir(dirname): os.makedirs(dirname) - if from_path != dest: - shutil.copyfile(from_path,dest) - elif self.warn_dir: - WarningDialog( - _("Possible destination error") + "\n" + - _("You appear to have set your target directory " - "to a directory used for data storage. This " - "could create problems with file management. " - "It is recommended that you consider using " - "a different directory to store your generated " - "web pages.")) - self.warn_dir = False + if from_path != dest: + shutil.copyfile(from_path,dest) + elif self.warn_dir: + WarningDialog( + _("Possible destination error") + "\n" + + _("You appear to have set your target directory " + "to a directory used for data storage. This " + "could create problems with file management. " + "It is recommended that you consider using " + "a different directory to store your generated " + "web pages.")) + self.warn_dir = False def copy_media(self,photo,store_ref=True): @@ -277,7 +277,7 @@ class BasePage: obj = db.get_object_from_handle(self.footer) if obj: of.write('\n') of.write('\n') of.write('\n') @@ -312,7 +312,7 @@ class BasePage: obj = db.get_object_from_handle(self.header) if obj: of.write('
\n') - of.write(obj.get_note()) + of.write(obj.get_note(markup=True)) of.write('
\n') of.write('