Source code for timelinelib.wxgui.dialogs.editevent.view

# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline.  If not, see <http://www.gnu.org/licenses/>.


import wx

from timelinelib.db.utils import safe_locking
from timelinelib.repositories.dbwrapper import DbWrapperEventRepository
from timelinelib.wxgui.dialogs.editcontainer.view import EditContainerDialog
from timelinelib.wxgui.dialogs.editevent.controller import EditEventDialogController
from timelinelib.wxgui.framework import Dialog
from timelinelib.wxgui.utils import _set_focus_and_select
from timelinelib.wxgui.dialogs.duplicateevent.view import DuplicateEventDialog


[docs]class EditEventDialog(Dialog): """ <BoxSizerVertical> <StaticBoxSizerVertical label="$(properties_label)" border="ALL" proportion="1"> <FlexGridSizer name="grid_sizer" columns="2" growableColumns="1" border="ALL" proportion="1"> %s </FlexGridSizer> </StaticBoxSizerVertical> <CheckBox name="add_more_checkbox" label="$(add_more_label)" border="LEFT|RIGHT|BOTTOM" /> <BoxSizerHorizontal border="LEFT|RIGHT|BOTTOM"> <TwoStateButton initial_state_label="$(enlarge)" second_state_label="$(reduce)" event_EVT_INITIAL_STATE_CLICKED="on_enlarge_click" event_EVT_SECOND_STATE_CLICKED="on_reduce_click" /> <Spacer /> <Button name="duplicate" label="$(duplicate_label)" event_EVT_BUTTON="on_duplicate" /> <StretchSpacer /> <DialogButtonsOkCancelSizer event_EVT_BUTTON__ID_OK="on_ok_clicked" /> </BoxSizerHorizontal> </BoxSizerVertical> """ TIME_DETAILS_ROW = """ <StaticText align="ALIGN_CENTER_VERTICAL" label="$(when_label)" /> <BoxSizerHorizontal> <PeriodPicker name="period_picker" time_type="$(time_type)" config="$(config)" /> </BoxSizerHorizontal> """ CHECKBOX_ROW = """ <Spacer /> <FlexGridSizer rows="1"> <CheckBox name="fuzzy_start_checkbox" label="$(fuzzy_start_checkbox_text)" /> <CheckBox name="fuzzy_end_checkbox" label="$(fuzzy_end_checkbox_text)" /> <CheckBox name="locked_checkbox" event_EVT_CHECKBOX="on_locked_checkbox_changed" label="$(locked_checkbox_text)" /> <CheckBox name="ends_today_checkbox" label="$(ends_today_checkbox_text)" /> </FlexGridSizer> """ TEXT_FIELD_ROW = """ <StaticText align="ALIGN_CENTER_VERTICAL" label="$(text_label)" /> <TextCtrl name="name" /> """ CATEGORY_LISTBOX_ROW = """ <StaticText align="ALIGN_CENTER_VERTICAL" label="$(category_label)" /> <CategoryChoice name="category_choice" allow_add="True" timeline="$(db)" align="ALIGN_LEFT" /> """ CONTAINER_LISTBOX_ROW = """ <StaticText align="ALIGN_CENTER_VERTICAL" label="$(container_label)" /> <ContainerChoice name="container_choice" event_EVT_CONTAINER_CHANGED="on_container_changed" db="$(db)" align="ALIGN_LEFT" /> """ NOTEBOOK_ROW = """ <Spacer /> <Notebook name="notebook" style="BK_DEFAULT"> <DescriptionEditor name="description" notebookLabel="$(page_description)" editor="$(self)" proportion="1" /> <DescriptionEditor name="labels" notebookLabel="$(page_labels)" editor="$(self)" proportion="1" /> <IconEditor name="icon" notebookLabel="$(page_icon)" editor="$(self)" proportion="1" /> <AlertEditor name="alert" notebookLabel="$(page_alert)" editor="$(self)" proportion="1" /> <HyperlinkEditor name="hyperlink" notebookLabel="$(page_hyperlink)" editor="$(self)" proportion="1" /> <ProgressEditor name="progress" notebookLabel="$(page_progress)" editor="$(self)" proportion="1" /> <ColorEditor name="default_color" notebookLabel="$(color)" editor="$(self)" proportion="1" /> </Notebook> """
[docs] def __init__(self, parent, config, title, db, start=None, end=None, event=None): self.parent = parent self.timeline = db self.config = config self.start = start self.event = event self._insert_rows_in_correct_order_in_xml() Dialog.__init__(self, EditEventDialogController, parent, { "self": self, "db": db, "time_type": db.get_time_type(), "config": config, "properties_label": _("Event Properties"), "when_label": _("When:"), "fuzzy_start_checkbox_text": _("Fuzzy Start"), "fuzzy_end_checkbox_text": _("Fuzzy End"), "locked_checkbox_text": _("Locked"), "ends_today_checkbox_text": _("Ends today"), "text_label": _("Text:"), "category_label": _("Category:"), "container_label": _("Container:"), "page_description": _("Description"), "page_labels": _("Labels"), "page_icon": _("Icon"), "page_alert": _("Alert"), "page_hyperlink": _("Hyperlink"), "page_progress": _("Progress"), "color": _("Default color"), "add_more_label": _("Add more events after this one"), "enlarge": _("&Enlarge"), "reduce": _("&Reduce"), "duplicate_label": _("Save and Duplicate"), }, title=title, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) self.controller.on_init( config, db.get_time_type(), DbWrapperEventRepository(db), db, start, end, event) self._make_row_with_notebook_growable() self.SetMinSize((800, -1)) self.Fit() self.SetMinSize(self.GetSize())
[docs] def GetDuplicateEventDialog(self, timeline, event): return DuplicateEventDialog(self.parent, timeline, event)
[docs] def GetPeriod(self): return self.period_picker.GetValue()
[docs] def SetPeriod(self, value): self.period_picker.SetValue(value)
[docs] def GetShowPeriod(self): return self.period_picker.GetShowPeriod()
[docs] def SetShowPeriod(self, value): self.period_picker.SetShowPeriod(value)
[docs] def GetShowTime(self): return self.period_picker.GetShowTime()
[docs] def SetShowTime(self, value): self.period_picker.SetShowTime(value)
[docs] def DisableTime(self): self.period_picker.DisableTime()
[docs] def GetFuzzy(self): return False
[docs] def GetFuzzyStart(self): return self.fuzzy_start_checkbox.GetValue()
[docs] def SetFuzzyStart(self, value): self.fuzzy_start_checkbox.SetValue(value)
[docs] def GetFuzzyEnd(self): return self.fuzzy_end_checkbox.GetValue()
[docs] def SetFuzzyEnd(self, value): self.fuzzy_end_checkbox.SetValue(value)
[docs] def GetLocked(self): return self.locked_checkbox.GetValue()
[docs] def SetLocked(self, value): self.locked_checkbox.SetValue(value)
[docs] def EnableLocked(self, value): self.locked_checkbox.Enable(value)
[docs] def GetEndsToday(self): return self.ends_today_checkbox.GetValue()
[docs] def SetEndsToday(self, value): self.ends_today_checkbox.SetValue(value)
[docs] def EnableEndsToday(self, value): self.ends_today_checkbox.Enable(value)
[docs] def GetName(self): return self.name.GetValue().strip()
[docs] def SetName(self, value): self.name.SetValue(value)
[docs] def GetCategory(self): return self.category_choice.GetSelectedCategory()
[docs] def SetCategory(self, value): self.category_choice.Populate(select=value)
[docs] def GetContainer(self): return self.container_choice.GetSelectedContainer()
[docs] def SetContainer(self, value): self.container_choice.Fill(value)
[docs] def GetEventData(self): event_data = {} for data_id, editor in self._get_event_data(): data = editor.get_data() if data is not None: event_data[data_id] = editor.get_data() return event_data
[docs] def SetEventData(self, event_data): for data_id, editor in self._get_event_data(): if data_id in event_data: data = event_data[data_id] if data is not None: editor.set_data(data)
[docs] def ClearEventData(self): for _, editor in self._get_event_data(): editor.clear_data()
[docs] def IsAddMoreChecked(self): return self.add_more_checkbox.GetValue()
[docs] def SetShowAddMoreCheckbox(self, value): self.add_more_checkbox.Show(value) self.add_more_checkbox.SetValue(False) self.SetSizerAndFit(self.GetSizer())
[docs] def SetFocusOnFirstControl(self): control = { "0": self.period_picker, "1": self.fuzzy_start_checkbox, "2": self.fuzzy_end_checkbox, "3": self.name, "4": self.category_choice, "5": self.container_choice, ":": self.notebook, }[self.config.event_editor_tab_order[0]] _set_focus_and_select(control)
[docs] def DisplayInvalidPeriod(self, message): self._display_invalid_input(message, self.period_picker)
def _display_invalid_input(self, message, control): self.DisplayErrorMessage(message) _set_focus_and_select(control) def _get_event_data(self): return [ ("description", self.description), ("labels", self.labels), ("alert", self.alert), ("icon", self.icon), ("hyperlink", self.hyperlink), ("progress", self.progress), ("default_color", self.default_color) ] def _insert_rows_in_correct_order_in_xml(self): rows_by_key = { "0": self.TIME_DETAILS_ROW, "1": self.CHECKBOX_ROW, "2": self.TEXT_FIELD_ROW, "3": self.CATEGORY_LISTBOX_ROW, "4": self.CONTAINER_LISTBOX_ROW, ":": self.NOTEBOOK_ROW, } placeholder_content = "".join(rows_by_key[key] for key in self.config.event_editor_tab_order) self.__doc__ = self.__doc__ % placeholder_content def _make_row_with_notebook_growable(self): self.grid_sizer.AddGrowableRow(self.config.event_editor_tab_order.index(":"))
[docs]def open_event_editor_for(main_frame, parent, config, db, event): def create_event_editor(): if event.is_container(): title = _("Edit Container") return EditContainerDialog(parent, title, db, event) else: return EditEventDialog( parent, config, _("Edit Event"), db, event=event) def edit_function(): dialog = create_event_editor() dialog.ShowModal() dialog.Destroy() safe_locking(main_frame.controller, edit_function)
[docs]def open_create_event_editor(edit_controller, parent, config, db, start=None, end=None): def create_event_editor(): label = _("Create Event") return EditEventDialog(parent, config, label, db, start, end) def edit_function(): dialog = create_event_editor() dialog.ShowModal() dialog.Destroy() safe_locking(edit_controller, edit_function)