diff options
author | Alan Aguiar <alanjas@hotmail.com> | 2012-10-21 08:55:07 (GMT) |
---|---|---|
committer | Alan Aguiar <alanjas@hotmail.com> | 2012-10-21 08:55:07 (GMT) |
commit | a6161308da868451f2250df8e6b11823953122ff (patch) | |
tree | 3f8d5cb662327f6a016a0f91fe2f6b3a614b9199 /timelinelib/wxgui/dialogs | |
parent | e573e421998cc051256811ab56729e3b21eaf8a3 (diff) |
add new timeline 0.18
Diffstat (limited to 'timelinelib/wxgui/dialogs')
-rw-r--r-- | timelinelib/wxgui/dialogs/categorieseditor.py | 4 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/containereditor.py | 20 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/duplicateevent.py | 28 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/eventeditor.py | 78 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/mainframe.py | 156 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/preferences.py | 18 | ||||
-rw-r--r-- | timelinelib/wxgui/dialogs/textdisplay.py | 81 |
7 files changed, 216 insertions, 169 deletions
diff --git a/timelinelib/wxgui/dialogs/categorieseditor.py b/timelinelib/wxgui/dialogs/categorieseditor.py index af8980a..46a02d7 100644 --- a/timelinelib/wxgui/dialogs/categorieseditor.py +++ b/timelinelib/wxgui/dialogs/categorieseditor.py @@ -84,7 +84,7 @@ class CategoriesEditor(wx.Dialog): def _btn_edit_on_click(self, e): selected_category = self.cat_tree.get_selected_category() if selected_category is not None: - edit_category(self, self.db, selected_category, + edit_category(self, self.db, selected_category, self.db_error_handler) self._updateButtons() @@ -108,7 +108,7 @@ class CategoriesEditor(wx.Dialog): def _btn_del_on_click(self, e): selected_category = self.cat_tree.get_selected_category() if selected_category is not None: - delete_category(self, self.db, selected_category, + delete_category(self, self.db, selected_category, self.db_error_handler) self._updateButtons() diff --git a/timelinelib/wxgui/dialogs/containereditor.py b/timelinelib/wxgui/dialogs/containereditor.py index b78f58e..144604c 100644 --- a/timelinelib/wxgui/dialogs/containereditor.py +++ b/timelinelib/wxgui/dialogs/containereditor.py @@ -69,7 +69,7 @@ class StaticContainerEditorDialog(wx.Dialog): def _create_buttons(self, properties_box): button_box = self.CreateStdDialogButtonSizer(wx.OK|wx.CANCEL) properties_box.Add(button_box, flag=wx.EXPAND|wx.ALL, border=BORDER) - + class ContainerEditorControllerApi(object): @@ -79,19 +79,19 @@ class ContainerEditorControllerApi(object): def set_name(self, name): self.txt_name.SetValue(name) - + def get_name(self): return self.txt_name.GetValue().strip() def set_category(self, category): self.lst_category.select(category) - + def get_category(self): return self.lst_category.get() - + def display_invalid_name(self, message): _display_error_message(message, self) - _set_focus_and_select(self.txt_name) + _set_focus_and_select(self.txt_name) def display_db_exception(self, e): gui_utils.handle_db_error_in_dialog(self, e) @@ -102,12 +102,12 @@ class ContainerEditorControllerApi(object): def _bind_events(self): self.Bind(wx.EVT_BUTTON, self._btn_ok_on_click, id=wx.ID_OK) self.Bind(wx.EVT_CHOICE, self.lst_category.on_choice, self.lst_category) - + def _btn_ok_on_click(self, evt): - self.controller.save() - - -class ContainerEditorDialog(StaticContainerEditorDialog, + self.controller.save() + + +class ContainerEditorDialog(StaticContainerEditorDialog, ContainerEditorControllerApi): """ This dialog is used for two purposes, editing an existing container diff --git a/timelinelib/wxgui/dialogs/duplicateevent.py b/timelinelib/wxgui/dialogs/duplicateevent.py index fd5d11d..2480b00 100644 --- a/timelinelib/wxgui/dialogs/duplicateevent.py +++ b/timelinelib/wxgui/dialogs/duplicateevent.py @@ -18,10 +18,10 @@ import wx +from timelinelib.editors.duplicateevent import DuplicateEventEditor from timelinelib.wxgui.utils import BORDER -from timelinelib.wxgui.utils import _set_focus_and_select from timelinelib.wxgui.utils import _display_error_message -from timelinelib.editors.duplicateevent import DuplicateEventEditor +from timelinelib.wxgui.utils import _set_focus_and_select import timelinelib.wxgui.utils as gui_utils @@ -37,13 +37,13 @@ class DuplicateEventDialog(wx.Dialog): self.sc_count.SetValue(count) def get_count(self): - return self.sc_count.GetValue() + return self.sc_count.GetValue() def set_frequency(self, count): self.sc_frequency.SetValue(count) def get_frequency(self): - return self.sc_frequency.GetValue() + return self.sc_frequency.GetValue() def select_move_period_fn_at_index(self, index): self.rb_period.SetSelection(index) @@ -52,10 +52,10 @@ class DuplicateEventDialog(wx.Dialog): return self._move_period_fns[self.rb_period.GetSelection()] def set_direction(self, direction): - self.rb_direction.SetSelection(direction) + self.rb_direction.SetSelection(direction) def get_direction(self): - return self.rb_direction.GetSelection() + return self.rb_direction.GetSelection() def close(self): self.EndModal(wx.ID_OK) @@ -65,7 +65,7 @@ class DuplicateEventDialog(wx.Dialog): def handle_date_errors(self, error_count): _display_error_message( - _("%d Events not duplicated due to missing dates.") + _("%d Events not duplicated due to missing dates.") % error_count) def _create_gui(self, move_period_config): @@ -95,9 +95,9 @@ class DuplicateEventDialog(wx.Dialog): return hbox def _create_and_add_rb_period(self, form, period_list): - self.rb_period = wx.RadioBox(self, wx.ID_ANY, _("Period"), - wx.DefaultPosition, wx.DefaultSize, - period_list) + self.rb_period = wx.RadioBox(self, wx.ID_ANY, _("Period"), + wx.DefaultPosition, wx.DefaultSize, + period_list) form.Add(self.rb_period, flag=wx.ALL|wx.EXPAND, border=BORDER) def _create_and_add_sc_frequency_box(self, form): @@ -116,7 +116,7 @@ class DuplicateEventDialog(wx.Dialog): def _create_and_add_rb_direction(self, form): direction_list = [_("Forward"), _("Backward"), _("Both")] - self.rb_direction = wx.RadioBox(self, wx.ID_ANY, _("Direction"), + self.rb_direction = wx.RadioBox(self, wx.ID_ANY, _("Direction"), choices=direction_list) form.Add(self.rb_direction, flag=wx.ALL|wx.EXPAND, border=BORDER) @@ -129,3 +129,9 @@ class DuplicateEventDialog(wx.Dialog): gui_utils.set_wait_cursor(self) self.controller.create_duplicates_and_save() gui_utils.set_default_cursor(self) + + +def open_duplicate_event_dialog_for_event(parent, db, handle_db_error, event): + def create_dialog(): + return DuplicateEventDialog(parent, db, event) + gui_utils.show_modal(create_dialog, handle_db_error) diff --git a/timelinelib/wxgui/dialogs/eventeditor.py b/timelinelib/wxgui/dialogs/eventeditor.py index 37cc9a0..d2b2a53 100644 --- a/timelinelib/wxgui/dialogs/eventeditor.py +++ b/timelinelib/wxgui/dialogs/eventeditor.py @@ -20,16 +20,16 @@ import os.path import wx -from timelinelib.db.interface import TimelineIOError +from timelinelib.db.exceptions import TimelineIOError from timelinelib.editors.event import EventEditor -from timelinelib.wxgui.dialogs.containereditor import ContainerEditorDialog +from timelinelib.repositories.dbwrapper import DbWrapperEventRepository from timelinelib.wxgui.components.categorychoice import CategoryChoice +from timelinelib.wxgui.dialogs.containereditor import ContainerEditorDialog from timelinelib.wxgui.utils import BORDER from timelinelib.wxgui.utils import _display_error_message from timelinelib.wxgui.utils import _set_focus_and_select from timelinelib.wxgui.utils import time_picker_for import timelinelib.wxgui.utils as gui_utils -from timelinelib.repositories.dbwrapper import DbWrapperEventRepository class EventEditorDialog(wx.Dialog): @@ -63,12 +63,12 @@ class EventEditorDialog(wx.Dialog): main_box_content = wx.StaticBoxSizer(groupbox, wx.VERTICAL) self._create_detail_content(main_box_content) self._create_notebook_content(main_box_content) - sizer.Add(main_box_content, flag=wx.EXPAND|wx.ALL, + sizer.Add(main_box_content, flag=wx.EXPAND|wx.ALL, border=BORDER, proportion=1) def _create_detail_content(self, properties_box_content): details = self._create_details() - properties_box_content.Add(details, flag=wx.ALL|wx.EXPAND, + properties_box_content.Add(details, flag=wx.ALL|wx.EXPAND, border=BORDER) def _create_details(self): @@ -79,7 +79,7 @@ class EventEditorDialog(wx.Dialog): self._create_text_field(grid) self._create_categories_listbox(grid) self._create_container_listbox(grid) - return grid + return grid def _create_time_details(self, grid): grid.Add(wx.StaticText(self, label=_("When:")), @@ -123,7 +123,7 @@ class EventEditorDialog(wx.Dialog): label = wx.StaticText(self, label=_("Container:")) grid.Add(label, flag=wx.ALIGN_CENTER_VERTICAL) grid.Add(self.lst_containers) - self.Bind(wx.EVT_CHOICE, self._lst_containers_on_choice, + self.Bind(wx.EVT_CHOICE, self._lst_containers_on_choice, self.lst_containers) def _lst_containers_on_choice(self, e): @@ -137,14 +137,15 @@ class EventEditorDialog(wx.Dialog): else: self.current_container_selection = new_selection_index self._enable_disable_checkboxes() - + def _enable_disable_checkboxes(self): self._enable_disable_ends_today() self._enable_disable_locked() def _enable_disable_ends_today(self): - enable = (self._container_not_selected() and - not self.chb_locked.GetValue()) + enable = (self._container_not_selected() and + not self.chb_locked.GetValue() and + self.controller.start_is_in_history()) self.chb_ends_today.Enable(enable) def _enable_disable_locked(self): @@ -154,7 +155,7 @@ class EventEditorDialog(wx.Dialog): def _container_not_selected(self): index = self.lst_containers.GetSelection() return (index == 0) - + def _add_container(self): def create_container_editor(): return ContainerEditorDialog(self, _("Add Container"), self.timeline, None) @@ -167,7 +168,7 @@ class EventEditorDialog(wx.Dialog): gui_utils.show_modal(create_container_editor, gui_utils.create_dialog_db_error_handler(self), handle_success) - + def _create_period_checkbox(self, box): handler = self._chb_period_on_checkbox return self._create_chb(box, _("Period"), handler) @@ -220,7 +221,7 @@ class EventEditorDialog(wx.Dialog): def _create_notebook_content(self, properties_box_content): notebook = self._create_notebook() - properties_box_content.Add(notebook, border=BORDER, + properties_box_content.Add(notebook, border=BORDER, flag=wx.ALL|wx.EXPAND, proportion=1) def _create_notebook(self): @@ -242,7 +243,7 @@ class EventEditorDialog(wx.Dialog): "alert" : (_("Alert"), AlertEditor), "icon" : (_("Icon"), IconEditor) } if editors.has_key(editor_class_id): - return editors[editor_class_id] + return editors[editor_class_id] else: return None @@ -293,7 +294,7 @@ class EventEditorDialog(wx.Dialog): self.lst_containers.SetSelection(current_item_index) selection_set = True current_item_index += 1 - + self.last_real_container_index = current_item_index - 1 self.add_container_item_index = self.last_real_container_index + 2 self.edit_container_item_index = self.last_real_container_index + 3 @@ -343,19 +344,19 @@ class EventEditorDialog(wx.Dialog): def set_name(self, name): self.txt_text.SetValue(name) - + def get_name(self): return self.txt_text.GetValue().strip() def set_category(self, category): self.lst_category.select(category) - + def get_category(self): return self.lst_category.get() def set_container(self, container): self._fill_containers_listbox(container) - + def get_container(self): selection = self.lst_containers.GetSelection() if selection != -1: @@ -402,7 +403,7 @@ class EventEditorDialog(wx.Dialog): def _display_invalid_input(self, message, control): _display_error_message(message, self) - _set_focus_and_select(control) + _set_focus_and_select(control) def display_db_exception(self, e): gui_utils.handle_db_error_in_dialog(self, e) @@ -445,8 +446,8 @@ class IconEditor(wx.Panel): self.MAX_SIZE = (128, 128) # Controls self.img_icon = wx.StaticBitmap(self, size=self.MAX_SIZE) - label = _("Images will be scaled to fit inside a 128x128 box.") - description = wx.StaticText(self, label=label) + label = _("Images will be scaled to fit inside a %ix%i box.") + description = wx.StaticText(self, label=label % self.MAX_SIZE) btn_select = wx.Button(self, wx.ID_OPEN) btn_clear = wx.Button(self, wx.ID_CLEAR) self.Bind(wx.EVT_BUTTON, self._btn_select_on_click, btn_select) @@ -517,7 +518,7 @@ class AlertEditor(wx.Panel): self.editor = editor self._create_gui() self._initialize_data() - + def _create_gui(self): self._create_controls() self._layout_controls() @@ -526,7 +527,7 @@ class AlertEditor(wx.Panel): self._set_initial_time() self._set_initial_text() self._set_visible(False) - + def _set_initial_time(self): if self.editor.event is not None: self.dtp_start.set_value(self.editor.event.time_period.start_time) @@ -535,12 +536,12 @@ class AlertEditor(wx.Panel): def _set_initial_text(self): self.text_data.SetValue("") - + def _create_controls(self): self.btn_add = self._create_add_button() self.btn_clear = self._create_clear_button() self.alert_panel = self._create_input_controls() - + def _layout_controls(self): self._layout_input_controls(self.alert_panel) sizer = wx.GridBagSizer(5, 5) @@ -548,7 +549,7 @@ class AlertEditor(wx.Panel): sizer.Add(self.btn_clear, wx.GBPosition(0, 1), wx.GBSpan(1, 1)) sizer.Add(self.alert_panel, wx.GBPosition(1, 0), wx.GBSpan(4, 5)) self.SetSizerAndFit(sizer) - + def _create_add_button(self): btn_add = wx.Button(self, wx.ID_ADD) self.Bind(wx.EVT_BUTTON, self._btn_add_on_click, btn_add) @@ -558,7 +559,7 @@ class AlertEditor(wx.Panel): btn_clear = wx.Button(self, wx.ID_CLEAR) self.Bind(wx.EVT_BUTTON, self._btn_clear_on_click, btn_clear) return btn_clear - + def _create_input_controls(self): alert_panel = wx.Panel(self) time_type = self.editor.timeline.get_time_type() @@ -583,7 +584,7 @@ class AlertEditor(wx.Panel): return (time, text) else: return None - + def set_data(self, data): if data == None: self._set_visible(False) @@ -597,6 +598,9 @@ class AlertEditor(wx.Panel): self._set_visible(True) def _btn_clear_on_click(self, evt): + self.clear_data() + + def clear_data(self): self._set_initial_time() self._set_initial_text() self._set_visible(False) @@ -607,3 +611,21 @@ class AlertEditor(wx.Panel): self.btn_add.Enable(not value) self.btn_clear.Enable(value) self.GetSizer().Layout() + + +def open_event_editor_for(parent, config, db, handle_db_error, event): + def create_event_editor(): + if event.is_container(): + title = _("Edit Container") + return ContainerEditorDialog(parent, title, db, event) + else: + return EventEditorDialog( + parent, config, _("Edit Event"), db, event=event) + gui_utils.show_modal(create_event_editor, handle_db_error) + + +def open_create_event_editor(parent, config, db, handle_db_error, start=None, end=None): + def create_event_editor(): + return EventEditorDialog( + parent, config, _("Create Event"), db, start, end) + gui_utils.show_modal(create_event_editor, handle_db_error) diff --git a/timelinelib/wxgui/dialogs/mainframe.py b/timelinelib/wxgui/dialogs/mainframe.py index 51eb64f..179ebeb 100644 --- a/timelinelib/wxgui/dialogs/mainframe.py +++ b/timelinelib/wxgui/dialogs/mainframe.py @@ -23,8 +23,8 @@ import wx from timelinelib.application import TimelineApplication from timelinelib.config.dotfile import read_config from timelinelib.config.paths import ICONS_DIR +from timelinelib.db.exceptions import TimelineIOError from timelinelib.db import db_open -from timelinelib.db.interface import TimelineIOError from timelinelib.db.objects import TimePeriod from timelinelib.export.bitmap import export_to_image from timelinelib.meta.about import APPLICATION_NAME @@ -36,9 +36,8 @@ from timelinelib.wxgui.components.hyperlinkbutton import HyperlinkButton from timelinelib.wxgui.components.search import SearchBar from timelinelib.wxgui.components.timelineview import DrawingAreaPanel from timelinelib.wxgui.dialogs.categorieseditor import CategoriesEditor -from timelinelib.wxgui.dialogs.containereditor import ContainerEditorDialog -from timelinelib.wxgui.dialogs.duplicateevent import DuplicateEventDialog -from timelinelib.wxgui.dialogs.eventeditor import EventEditorDialog +from timelinelib.wxgui.dialogs.duplicateevent import open_duplicate_event_dialog_for_event +from timelinelib.wxgui.dialogs.eventeditor import open_create_event_editor from timelinelib.wxgui.dialogs.helpbrowser import HelpBrowser from timelinelib.wxgui.dialogs.playframe import PlayFrame from timelinelib.wxgui.dialogs.preferences import PreferencesDialog @@ -49,7 +48,6 @@ from timelinelib.wxgui.utils import _display_error_message from timelinelib.wxgui.utils import WildcardHelper import timelinelib.printing as printing import timelinelib.wxgui.utils as gui_utils -from timelinelib.time.wxtime import WxTimeType class MainFrame(wx.Frame): @@ -57,7 +55,7 @@ class MainFrame(wx.Frame): def __init__(self, application_arguments): self.config = read_config(application_arguments.get_config_file_path()) - wx.Frame.__init__(self, None, size=self.config.get_window_size(), + wx.Frame.__init__(self, None, size=self.config.get_window_size(), pos=self.config.get_window_pos(), style=wx.DEFAULT_FRAME_STYLE, name="main_frame") @@ -87,7 +85,7 @@ class MainFrame(wx.Frame): self.Bind(wx.EVT_TIMER, self._timer_tick, self.timer) self.timer.Start(10000) self.alert_dialog_open = False - + def _set_initial_values_to_member_variables(self): self.timeline = None self.timeline_wildcard_helper = WildcardHelper( @@ -112,7 +110,7 @@ class MainFrame(wx.Frame): self.status_bar_adapter = StatusBarAdapter(self.GetStatusBar()) def _create_main_panel(self): - self.main_panel = MainPanel(self, self.config) + self.main_panel = MainPanel(self, self.config, self) def _create_main_menu_bar(self): main_menu_bar = wx.MenuBar() @@ -303,7 +301,6 @@ class MainFrame(wx.Frame): def _mnu_file_exit_on_click(self, evt): self.Close() - exit() def _create_edit_menu(self, main_menu_bar): edit_menu = wx.Menu() @@ -387,14 +384,8 @@ class MainFrame(wx.Frame): self.menu_controller.add_menu_requiring_writable_timeline(create_event_item) def _mnu_timeline_create_event_on_click(self, evt): - self.create_new_event() - - def create_new_event(self, start=None, end=None): - def create_event_editor(): - return EventEditorDialog( - self, self.config, _("Create Event"), self.timeline, - start, end) - gui_utils.show_modal(create_event_editor, self.handle_db_error) + open_create_event_editor( + self, self.config, self.timeline, self.handle_db_error) def _create_timeline_duplicate_event_menu_item(self, timeline_menu): self.mnu_timeline_duplicate_event = timeline_menu.Append( @@ -404,31 +395,27 @@ class MainFrame(wx.Frame): self.menu_controller.add_menu_requiring_writable_timeline(self.mnu_timeline_duplicate_event) def _mnu_timeline_duplicate_event_on_click(self, evt): - self.duplicate_event() + try: + drawing_area = self.main_panel.drawing_area + id = drawing_area.get_view_properties().get_selected_event_ids()[0] + event = self.timeline.find_event_with_id(id) + except IndexError, e: + # No event selected so do nothing! + return + open_duplicate_event_dialog_for_event( + self, + self.timeline, + self.handle_db_error, + event) def _create_timeline_measure_distance_between_events_menu_item(self, timeline_menu): self.mnu_timeline_measure_distance_between_events = timeline_menu.Append( - wx.ID_ANY, _("&Measure Distance between two Events..."), + wx.ID_ANY, _("&Measure Distance between two Events..."), _("Measure the Distance between two Events")) self.Bind(wx.EVT_MENU, self._mnu_timeline_measure_distance_between_events_on_click, self.mnu_timeline_measure_distance_between_events) self.menu_controller.add_menu_requiring_writable_timeline(self.mnu_timeline_measure_distance_between_events) - def duplicate_event(self, event=None): - def show_dialog(event): - def create_dialog(): - return DuplicateEventDialog(self, self.timeline, event) - gui_utils.show_modal(create_dialog, self.handle_db_error) - if event is None: - try: - drawing_area = self.main_panel.drawing_area - id = drawing_area.get_view_properties().get_selected_event_ids()[0] - event = self.timeline.find_event_with_id(id) - except IndexError, e: - # No event selected so do nothing! - return - show_dialog(event) - def _mnu_timeline_measure_distance_between_events_on_click(self, evt): self._measure_distance_between_events() @@ -445,12 +432,12 @@ class MainFrame(wx.Frame): event2 = self.timeline.find_event_with_id(event_id_2) return event1, event2 - def _calc_events_distance(self,event1, event2): + def _calc_events_distance(self,event1, event2): if event1.time_period.start_time <= event2.time_period.start_time: - distance = (event2.time_period.start_time - + distance = (event2.time_period.start_time - event1.time_period.end_time) - else: - distance = (event1.time_period.start_time - + else: + distance = (event1.time_period.start_time - event2.time_period.end_time) return distance @@ -462,7 +449,7 @@ class MainFrame(wx.Frame): self._display_text(header, distance_text) def _display_text(self, header, text): - dialog = wx.MessageDialog(self, text, header, + dialog = wx.MessageDialog(self, text, header, wx.OK | wx.ICON_INFORMATION) dialog.ShowModal() dialog.Destroy() @@ -504,7 +491,7 @@ class MainFrame(wx.Frame): if event: start = event.time_period.start_time delta = self.main_panel.drawing_area.get_view_properties().displayed_period.delta() - end = start + delta + end = start + delta margin_delta = self.timeline.get_time_type().margin_delta(delta) self._navigate_timeline(lambda tp: tp.update(start, end, -margin_delta)) @@ -630,18 +617,6 @@ class MainFrame(wx.Frame): self.controller.open_timeline(input_file) self._update_navigation_menu_items() - def edit_event(self, event): - def create_event_editor(): - if event.is_container(): - parent = self - title = _("Edit Container") - timeline = self.timeline - return ContainerEditorDialog(parent, title, timeline, event) - else: - return EventEditorDialog(self, self.config, _("Edit Event"), - self.timeline, event=event) - gui_utils.show_modal(create_event_editor, self.handle_db_error) - def handle_db_error(self, error): _display_error_message(ex_msg(error), self) self._switch_to_error_view(error) @@ -738,7 +713,7 @@ class MainFrame(wx.Frame): _display_error_message(_("File '%s' does not exist.") % path, self) def enable_disable_menus(self): - self.menu_controller.enable_disable_menus(self.main_panel.timeline_panel_visible()) + self.menu_controller.enable_disable_menus(self.main_panel.timeline_panel_visible()) self._enable_disable_duplicate_event_menu() self._enable_disable_measure_distance_between_two_events_menu() self._enable_disable_searchbar() @@ -753,7 +728,7 @@ class MainFrame(wx.Frame): two_events_selected = len(view_properties.selected_event_ids) == 2 self.mnu_timeline_measure_distance_between_events.Enable(two_events_selected) - def _enable_disable_searchbar(self): + def _enable_disable_searchbar(self): if self.timeline == None: self.main_panel.show_searchbar(False) @@ -792,7 +767,7 @@ class MainFrame(wx.Frame): def _timer_tick(self, evt): self._handle_event_alerts() - + def _handle_event_alerts(self): if self.timeline is None: return @@ -804,44 +779,43 @@ class MainFrame(wx.Frame): def _display_events_alerts(self): self.alert_dialog_open = True all_events = self.timeline.get_all_events() - AlertController().display_events_alerts(all_events, self.timeline.time_type) + AlertController().display_events_alerts(all_events, self.timeline.get_time_type()) class AlertController(object): - + def display_events_alerts(self, all_events, time_type): self.time_type = time_type for event in all_events: alert = event.get_data("alert") if alert is not None: - alert_time = self._alert_time_as_text(alert) - if self._time_has_expired(alert_time): + if self._time_has_expired(alert[0]): self._display_and_delete_event_alert(event, alert) def _display_and_delete_event_alert(self, event, alert): self._display_alert_dialog(alert, event) event.set_data("alert", None) - + def _alert_time_as_text(self, alert): return "%s" % alert[0] - - def _time_has_expired(self, time_as_text): - now_as_text = "%s" % self.time_type.now() - return time_as_text <= now_as_text - + + def _time_has_expired(self, time): + return time <= self.time_type.now() + + def _display_alert_dialog(self, alert, event): text = self._format_alert_text(alert, event) dialog = TextDisplayDialog("Alert", text) dialog.ShowModal() dialog.Destroy() - - def _format_alert_text(self, alert, event): + + def _format_alert_text(self, alert, event): text1 = "Trigger time: %s\n\n" % alert[0] text2 = "Event: %s\n\n" % event.get_label() text = "%s%s%s" % (text1, text2, alert[1]) return text - + class MenuController(object): def __init__(self): @@ -899,9 +873,10 @@ class MainPanel(wx.Panel): Also displays the search bar. """ - def __init__(self, parent, config): + def __init__(self, parent, config, main_frame): wx.Panel.__init__(self, parent) self.config = config + self.main_frame = main_frame self._create_gui() # Install variables for backwards compatibility self.cattree = self.timeline_panel.sidebar.cattree @@ -935,9 +910,11 @@ class MainPanel(wx.Panel): self.searchbar = SearchBar(self, search_close) self.searchbar.Show(False) # Panels - self.welcome_panel = WelcomePanel(self) - self.timeline_panel = TimelinePanel(self, self.config) - self.error_panel = ErrorPanel(self) + self.welcome_panel = WelcomePanel(self, self.main_frame) + self.timeline_panel = TimelinePanel( + self, self.config, self.main_frame.handle_db_error, + self.main_frame.status_bar_adapter, self.main_frame) + self.error_panel = ErrorPanel(self, self.main_frame) # Layout self.sizerOuter = wx.BoxSizer(wx.VERTICAL) self.sizer = wx.BoxSizer(wx.HORIZONTAL) @@ -961,8 +938,9 @@ class MainPanel(wx.Panel): class WelcomePanel(wx.Panel): - def __init__(self, parent): + def __init__(self, parent, main_frame): wx.Panel.__init__(self, parent) + self.main_frame = main_frame self._create_gui() def _create_gui(self): @@ -985,7 +963,7 @@ class WelcomePanel(wx.Panel): self.SetSizer(hsizer) def _btn_tutorial_on_click(self, e): - wx.GetTopLevelParent(self).open_timeline(":tutorial:") + self.main_frame.open_timeline(":tutorial:") def activated(self): pass @@ -993,9 +971,13 @@ class WelcomePanel(wx.Panel): class TimelinePanel(wx.Panel): - def __init__(self, parent, config): + def __init__(self, parent, config, handle_db_error, status_bar_adapter, + main_frame): wx.Panel.__init__(self, parent) self.config = config + self.handle_db_error = handle_db_error + self.status_bar_adapter = status_bar_adapter + self.main_frame = main_frame self.sidebar_width = self.config.get_sidebar_width() self._create_gui() @@ -1023,16 +1005,16 @@ class TimelinePanel(wx.Panel): self.sidebar_width = self.splitter.GetSashPosition() def _create_sidebar(self): - self.sidebar = Sidebar(self.splitter) + self.sidebar = Sidebar(self.splitter, self.handle_db_error) def _create_drawing_area(self): - main_frame = wx.GetTopLevelParent(self) self.drawing_area = DrawingAreaPanel( self.splitter, - main_frame.status_bar_adapter, + self.status_bar_adapter, self.divider_line_slider, - main_frame.handle_db_error, - self.config) + self.handle_db_error, + self.config, + self.main_frame) def _layout_components(self): sizer = wx.BoxSizer(wx.HORIZONTAL) @@ -1058,8 +1040,9 @@ class TimelinePanel(wx.Panel): class ErrorPanel(wx.Panel): - def __init__(self, parent): + def __init__(self, parent, main_frame): wx.Panel.__init__(self, parent) + self.main_frame = main_frame self._create_gui() def populate(self, error): @@ -1085,7 +1068,7 @@ class ErrorPanel(wx.Panel): self.SetSizer(hsizer) def _btn_contact_on_click(self, e): - wx.GetTopLevelParent(self).help_browser.show_page("contact") + self.main_frame.help_browser.show_page("contact") def activated(self): pass @@ -1098,13 +1081,12 @@ class Sidebar(wx.Panel): Currently only shows the categories with visibility check boxes. """ - def __init__(self, parent): + def __init__(self, parent, handle_db_error): wx.Panel.__init__(self, parent, style=wx.BORDER_NONE) - self._create_gui() + self._create_gui(handle_db_error) - def _create_gui(self): - main_frame = wx.GetTopLevelParent(self) - self.cattree = CategoriesTree(self, main_frame.handle_db_error) + def _create_gui(self, handle_db_error): + self.cattree = CategoriesTree(self, handle_db_error) # Layout sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.cattree, flag=wx.GROW, proportion=1) diff --git a/timelinelib/wxgui/dialogs/preferences.py b/timelinelib/wxgui/dialogs/preferences.py index cb2d280..25cdd9c 100644 --- a/timelinelib/wxgui/dialogs/preferences.py +++ b/timelinelib/wxgui/dialogs/preferences.py @@ -36,7 +36,7 @@ class PreferencesDialog(wx.Dialog): def set_checkbox_use_inertial_scrolling(self, value): self.chb_inertial_scrolling.SetValue(value) - def set_checkbox_open_recent_at_startup(self, value): + def set_checkbox_open_recent_at_startup(self, value): self.chb_open_recent.SetValue(value) def set_week_start(self, index): @@ -69,7 +69,7 @@ class PreferencesDialog(wx.Dialog): return button_box def _create_general_tab(self, notebook): - panel = self._create_tab_panel(notebook, _("General")) + panel = self._create_tab_panel(notebook, _("General")) controls = self._create_general_tab_controls(panel) self._size_tab_panel(panel, controls) @@ -79,7 +79,7 @@ class PreferencesDialog(wx.Dialog): return (self.chb_open_recent, self.chb_inertial_scrolling) def _create_date_time_tab(self, notebook): - panel = self._create_tab_panel(notebook, _("Date && Time")) + panel = self._create_tab_panel(notebook, _("Date && Time")) controls = self._create_date_time_tab_controls(panel) self._size_tab_panel(panel, controls) @@ -87,7 +87,7 @@ class PreferencesDialog(wx.Dialog): self.chb_wide_date_range = self._create_chb_wide_date_range(panel) self.choice_week = self._create_choice_week(panel) grid = wx.FlexGridSizer(1, 2, BORDER, BORDER) - grid.Add(wx.StaticText(panel, label=_("Week start on:")), + grid.Add(wx.StaticText(panel, label=_("Week start on:")), flag=wx.ALIGN_CENTER_VERTICAL) grid.Add(self.choice_week, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT) warning = _("This feature is experimental. If events are\ncreated in the extended range, you can not\ndisable this option and successfully load\nthe timeline again. A reload of the timeline\nis also needed for this to take effect.") @@ -110,19 +110,19 @@ class PreferencesDialog(wx.Dialog): label = _("Open most recent timeline on startup") handler = self._chb_open_recent_startup_on_checkbox chb = self._create_chb(panel, label, handler) - return chb + return chb def _create_chb_inertial_scrolling(self, panel): label = _("Use inertial scrolling") handler = self._chb_use_inertial_scrolling_on_checkbox - chb = self._create_chb(panel, label, handler) + chb = self._create_chb(panel, label, handler) return chb def _create_chb_wide_date_range(self, panel): label = _("Use extended date range (before 1 AD)") handler = self._chb_use_wide_date_range_on_checkbox - chb = self._create_chb(panel, label, handler) - return chb + chb = self._create_chb(panel, label, handler) + return chb def _create_chb(self, panel, label, handler): chb = wx.CheckBox(panel, label=label) @@ -140,7 +140,7 @@ class PreferencesDialog(wx.Dialog): btn_close.SetFocus() self.SetAffirmativeId(wx.ID_CLOSE) self.Bind(wx.EVT_BUTTON, self._btn_close_on_click, btn_close) - return btn_close + return btn_close def _chb_use_wide_date_range_on_checkbox(self, evt): self._controller.on_use_wide_date_range_changed(evt.IsChecked()) diff --git a/timelinelib/wxgui/dialogs/textdisplay.py b/timelinelib/wxgui/dialogs/textdisplay.py index cbc0713..4c13a95 100644 --- a/timelinelib/wxgui/dialogs/textdisplay.py +++ b/timelinelib/wxgui/dialogs/textdisplay.py @@ -16,45 +16,82 @@ # along with Timeline. If not, see <http://www.gnu.org/licenses/>. -from timelinelib.wxgui.utils import BORDER - import wx +from timelinelib.wxgui.utils import BORDER +from timelinelib.wxgui.utils import _display_error_message +from timelinelib.editors.textdisplay import TextDisplayEditor -class TextDisplayDialog(wx.Dialog): - def __init__(self, title, text, parent=None): +class TextDisplayDialogGui(wx.Dialog): + + def __init__(self, title, parent=None): wx.Dialog.__init__(self, parent, title=title) self._create_gui() - self._text.SetValue(text) def _create_gui(self): - self._text = wx.TextCtrl(self, size=(660, 300), style=wx.TE_MULTILINE) + self._text = self._create_text_control() + button_box = self._create_button_box() + vbox = self._create_vbox(self._text, button_box) + self.SetSizerAndFit(vbox) + + def _create_text_control(self): + return wx.TextCtrl(self, size=(660, 300), style=wx.TE_MULTILINE) + + def _create_button_box(self): + self.btn_copy = self._create_copy_btn() + self.btn_close = self._create_close_btn() + button_box = wx.BoxSizer(wx.HORIZONTAL) + button_box.Add(self.btn_copy, flag=wx.RIGHT, border=BORDER) + button_box.AddStretchSpacer() + button_box.Add(self.btn_close, flag=wx.LEFT, border=BORDER) + return button_box + + def _create_vbox(self, text, btn_box): + vbox = wx.BoxSizer(wx.VERTICAL) + vbox.Add(text, flag=wx.ALL|wx.EXPAND, border=BORDER) + vbox.Add(btn_box, flag=wx.ALL|wx.EXPAND, border=BORDER) + return vbox + + def _create_copy_btn(self): btn_copy = wx.Button(self, wx.ID_COPY) - self.Bind(wx.EVT_BUTTON, self._btn_copy_on_click, btn_copy) + return btn_copy + + def _create_close_btn(self): btn_close = wx.Button(self, wx.ID_CLOSE) btn_close.SetDefault() btn_close.SetFocus() self.SetAffirmativeId(wx.ID_CLOSE) - self.Bind(wx.EVT_BUTTON, self._btn_close_on_click, btn_close) - # Layout - vbox = wx.BoxSizer(wx.VERTICAL) - vbox.Add(self._text, flag=wx.ALL|wx.EXPAND, border=BORDER) - button_box = wx.BoxSizer(wx.HORIZONTAL) - button_box.Add(btn_copy, flag=wx.RIGHT, border=BORDER) - button_box.AddStretchSpacer() - button_box.Add(btn_close, flag=wx.LEFT, border=BORDER) - vbox.Add(button_box, flag=wx.ALL|wx.EXPAND, border=BORDER) - self.SetSizerAndFit(vbox) + return btn_close + + +class TextDisplayDialog(TextDisplayDialogGui): + + def __init__(self, title, text, parent=None): + TextDisplayDialogGui.__init__(self, title, parent) + self._bind_events() + self.controller = TextDisplayEditor(self, text) + self.controller.initialize() + + def set_text(self, text): + self._text.SetValue(text) + + def get_text(self): + return self._text.GetValue() + + def _bind_events(self): + self.Bind(wx.EVT_BUTTON, self._btn_copy_on_click, self.btn_copy) + self.Bind(wx.EVT_BUTTON, self._btn_close_on_click, self.btn_close) def _btn_copy_on_click(self, evt): if wx.TheClipboard.Open(): - obj = wx.TextDataObject(self._text.GetValue()) - wx.TheClipboard.SetData(obj) - wx.TheClipboard.Close() + self._copy_text_to_clipboard() else: - msg = _("Unable to copy to clipboard.") - _display_error_message(msg) + _display_error_message(_("Unable to copy to clipboard.")) + def _copy_text_to_clipboard(self): + obj = wx.TextDataObject(self.controller.get_text()) + wx.TheClipboard.SetData(obj) + wx.TheClipboard.Close() def _btn_close_on_click(self, evt): self.Close() |