Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/timelinelib/wxgui/dialogs
diff options
context:
space:
mode:
authorAlan Aguiar <alanjas@hotmail.com>2012-10-21 08:55:07 (GMT)
committer Alan Aguiar <alanjas@hotmail.com>2012-10-21 08:55:07 (GMT)
commita6161308da868451f2250df8e6b11823953122ff (patch)
tree3f8d5cb662327f6a016a0f91fe2f6b3a614b9199 /timelinelib/wxgui/dialogs
parente573e421998cc051256811ab56729e3b21eaf8a3 (diff)
add new timeline 0.18
Diffstat (limited to 'timelinelib/wxgui/dialogs')
-rw-r--r--timelinelib/wxgui/dialogs/categorieseditor.py4
-rw-r--r--timelinelib/wxgui/dialogs/containereditor.py20
-rw-r--r--timelinelib/wxgui/dialogs/duplicateevent.py28
-rw-r--r--timelinelib/wxgui/dialogs/eventeditor.py78
-rw-r--r--timelinelib/wxgui/dialogs/mainframe.py156
-rw-r--r--timelinelib/wxgui/dialogs/preferences.py18
-rw-r--r--timelinelib/wxgui/dialogs/textdisplay.py81
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()