# 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 os
import wx
from timelinelib.features.experimental.experimentalfeatures import ExperimentalFeatures
from timelinelib.wxgui.components.font import edit_font_data
from timelinelib.wxgui.dialogs.eventeditortabselection.view import EventEditorTabSelectionDialog
from timelinelib.wxgui.dialogs.dateformat.view import DateFormatDialog
from timelinelib.wxgui.dialogs.preferences.controller import PreferencesDialogController
from timelinelib.wxgui.framework import Dialog
from timelinelib.config.paths import EVENT_ICONS_DIR
from timelinelib.db.utils import safe_locking
[docs]class PreferencesDialog(Dialog):
"""
<BoxSizerVertical>
<Notebook border="ALL" proportion="1" width="600">
<Panel notebookLabel="$(general_text)">
<BoxSizerVertical>
<FlexGridSizer columns="1" border="ALL">
<CheckBox
name="open_recent_checkbox"
event_EVT_CHECKBOX="on_open_recent_change"
label="$(open_recent_text)"
/>
<CheckBox
name="inertial_scrolling_checkbox"
event_EVT_CHECKBOX="on_inertial_scrolling_changed"
label="$(inertial_scrolling_text)"
/>
<CheckBox
name="never_period_point_checkbox"
event_EVT_CHECKBOX="on_never_period_point_changed"
label="$(never_period_point_text)"
/>
<CheckBox
name="center_text_checkbox"
event_EVT_CHECKBOX="on_center_text_changed"
label="$(center_text_text)"
/>
<CheckBox
name="display_checkmark_on_events_done_checkbox"
event_EVT_CHECKBOX="on_display_checkmark_on_events_done_changed"
label="$(display_checkmark_on_events_done_text)"
/>
<CheckBox
name="uncheck_time_for_new_events"
event_EVT_CHECKBOX="on_uncheck_time_for_new_events"
label="$(uncheck_time_for_new_events_text)"
/>
<CheckBox
name="text_below_icon"
event_EVT_CHECKBOX="on_text_below_icon"
label="$(text_below_icon_text)"
/>
<CheckBox
name="filtered_listbox_export"
event_EVT_CHECKBOX="on_filtered_listbox_export"
label="$(text_filtered_listbox_export)"
/>
<CheckBox
name="use_sidebar_filter_hint_checkbox"
event_EVT_CHECKBOX="on_use_sidebar_filter_hint"
label="$(use_sidebar_filter_hint_text)"
/>
<Button
name="select_tab_order"
event_EVT_BUTTON="on_tab_order_click"
label="$(tab_order_text)"
align="ALIGN_LEFT"
/>
<BoxSizerHorizontal>
<StaticText
name="vertical_space_between_events_text"
label="$(vertical_space_between_events_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<SpinCtrl
name="vertical_space_between_events"
event_EVT_SPINCTRL="on_vertical_space_between_events_click"
align="ALIGN_LEFT"
width="50"
/>
</BoxSizerHorizontal>
<RadioBox
name="legend_positions"
choices="$(legend_positions)"
label="$(legend_positions_text)"
/>
</FlexGridSizer>
</BoxSizerVertical>
</Panel>
<Panel notebookLabel="$(date_time_text)">
<BoxSizerVertical>
<FlexGridSizer columns="2" border="ALL">
<StaticText
label="$(week_start_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Choice
name="week_start_choice"
event_EVT_CHOICE="on_week_start_changed"
choices="$(week_start_choices)"
/>
<Button
name="select_date_formatter"
event_EVT_BUTTON="on_date_formatter_click"
label="$(date_formatter_text)"
align="ALIGN_LEFT"
/>
<StaticText
name="current_date_format"
align="ALIGN_CENTER_VERTICAL"
/>
<CheckBox
name="skip_s_in_decade_text"
event_EVT_CHECKBOX="on_skip_s_in_decade_text"
label="$(skip_s_in_decade_text_text)"
/>
<Spacer />
<CheckBox
name="never_use_time_checkbox"
event_EVT_CHECKBOX="on_never_use_time_change"
label="$(never_use_time_text)"
/>
<Spacer />
<CheckBox
name="use_second_checkbox"
event_EVT_CHECKBOX="on_use_second_change"
label="$(use_second_text)"
/>
<Spacer />
<CheckBox
name="use_date_default_values_checkbox"
event_EVT_CHECKBOX="on_use_date_default_values"
label="$(use_date_default_values)"
/>
<Spacer />
<StaticText
label="$(default_year)"
align="ALIGN_CENTER_VERTICAL"
/>
<TextCtrl
name="txt_default_year"
fit_text="MMMM"
/>
<StaticText
label="$(default_month)"
align="ALIGN_CENTER_VERTICAL"
/>
<TextCtrl
name="txt_default_month"
fit_text="MM"
/>
<StaticText
label="$(default_day)"
align="ALIGN_CENTER_VERTICAL"
/>
<TextCtrl
name="txt_default_day"
fit_text="MM"
/>
<RadioBox
name="time_scale_positions"
choices="$(time_scale_positions)"
label="$(time_scale_positions_text)"
/>
<Spacer />
<StaticText
label="$(weekday_length_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Choice
name="workday_length_choices"
choices="$(workday_length_choices)"
align="ALIGN_CENTER_VERTICAL"
/>
</FlexGridSizer>
</BoxSizerVertical>
</Panel>
<Panel notebookLabel="$(fonts_text)">
<BoxSizerVertical name="font_sizer">
<FlexGridSizer columns="3" border="ALL">
<StaticText
label="$(major_strip_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_major_strip"
event_EVT_BUTTON="on_major_strip_click"
label="$(edit_text)"
/>
<StaticText
name="major_strip_font_sample"
label="Timeline"
/>
<StaticText
label="$(minor_strip_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_minor_strip"
event_EVT_BUTTON="on_minor_strip_click"
label="$(edit_text)"
/>
<StaticText
name="minor_strip_font_sample"
label="Timeline"
align="ALIGN_CENTER_VERTICAL"
/>
<StaticText
label="$(legends_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_legend"
event_EVT_BUTTON="on_legend_click"
label="$(edit_text)"
/>
<StaticText
name="legend_font_sample"
label="Timeline"
align="ALIGN_CENTER_VERTICAL"
/>
<StaticText
label="$(balloon_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_balloon"
event_EVT_BUTTON="on_balloon_click"
label="$(edit_text)"
/>
<StaticText
name="balloon_font_sample"
label="Timeline"
/>
<StaticText
label="$(event_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_event"
event_EVT_BUTTON="on_event_click"
label="$(edit_text)"
/>
<StaticText
name="event_font_sample"
label="Timeline"
/>
<StaticText
label="$(era_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Button
name="select_era"
event_EVT_BUTTON="on_era_click"
label="$(edit_text)"
/>
<StaticText
name="era_font_sample"
label="Timeline"
/>
</FlexGridSizer>
</BoxSizerVertical>
</Panel>
<Panel notebookLabel="$(colours_text)">
<BoxSizerVertical>
<FlexGridSizer columns="2" border="ALL">
<StaticText
label="$(bg_colour_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<ColourSelect
name="bg_colorpicker"
align="ALIGN_CENTER_VERTICAL"
width="60"
height="30"
/>
<StaticText
label="$(minor_strip_colour_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<ColourSelect
name="minor_strip_colorpicker"
align="ALIGN_CENTER_VERTICAL"
width="60"
height="30"
/>
<StaticText
label="$(major_strip_colour_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<ColourSelect
name="major_strip_colorpicker"
align="ALIGN_CENTER_VERTICAL"
width="60"
height="30"
/>
<StaticText
label="$(now_line_colour_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<BoxSizerHorizontal>
<ColourSelect
name="now_line_colorpicker"
align="ALIGN_CENTER_VERTICAL"
width="60"
height="30"
/>
<Spacer />
<CheckBox
name="use_bold_nowline"
event_EVT_CHECKBOX="on_use_bold_nowline"
label="$(use_bold_nowline_text)"
/>
</BoxSizerHorizontal>
<StaticText
label="$(weekend_colour_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<BoxSizerHorizontal>
<ColourSelect
name="weekend_colorpicker"
align="ALIGN_CENTER_VERTICAL"
width="60"
height="30"
/>
<Spacer />
<CheckBox
name="colorize_weekends"
event_EVT_CHECKBOX="on_colorize_weekends"
label="$(colorize_weekends_text)"
/>
</BoxSizerHorizontal>
<CheckBox
name="use_sidebar_text_coloring_checkbox"
event_EVT_CHECKBOX="on_use_sidebar_text_coloring"
label="$(use_sidebar_text_coloring_text)"
/>
</FlexGridSizer>
</BoxSizerVertical>
</Panel>
<Panel notebookLabel="$(icons_text)">
<BoxSizerVertical name="x">
<FlexGridSizer columns="3" border="ALL">
<StaticText
label="$(fuzzy_icon_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Choice
name="fuzzy_icon_choice"
event_EVT_CHOICE="on_fuzzy_icon_changed"
/>
<StaticBitmap
name="fuzzy_icon"
/>
<StaticText
label="$(locked_icon_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Choice
name="locked_icon_choice"
event_EVT_CHOICE="on_locked_icon_changed"
/>
<StaticBitmap
name="locked_icon"
/>
<StaticText
label="$(hyperlink_icon_text)"
align="ALIGN_CENTER_VERTICAL"
/>
<Choice
name="hyperlink_icon_choice"
event_EVT_CHOICE="on_hyperlink_icon_changed"
/>
<StaticBitmap
name="hyperlink_icon"
/>
</FlexGridSizer>
</BoxSizerVertical>
</Panel>
<Panel name="experimental_panel" notebookLabel="$(experimental_text)">
<BoxSizerVertical>
<FlexGridSizer
name="experimental_panel_sizer"
columns="1"
border="ALL"
/>
</BoxSizerVertical>
</Panel>
</Notebook>
<DialogButtonsCloseSizer border="LEFT|BOTTOM|RIGHT" />
</BoxSizerVertical>
"""
[docs] def __init__(self, parent, config):
Dialog.__init__(self, PreferencesDialogController, parent, {
"general_text": _("General"),
"open_recent_text": _("Open most recent timeline on startup"),
"inertial_scrolling_text": _("Use inertial scrolling"),
"never_period_point_text": _("Never show period Events as point Events"),
"center_text_text": _("Center Event texts"),
"uncheck_time_for_new_events_text": _("Uncheck time checkbox for new events"),
"text_below_icon_text": _("Balloon text below icon"),
"text_filtered_listbox_export": _("Filter items in listbox export, on categories"),
"tab_order_text": _("Select Event Editor Tab Order"),
"date_formatter_text": _("Select Date format"),
"date_time_text": _("Date && Time"),
"week_start_text": _("Week start on:"),
"week_start_choices": [_("Monday"), _("Sunday")],
"weekday_length_text": f'{_("Weekday Length")}:',
"fonts_text": _("Fonts"),
"colours_text": _("Colours"),
"major_strip_text": _("Major Strips:"),
"minor_strip_text": _("Minor Strips:"),
"balloon_text": _("Balloons:"),
"event_text": _("Events") + ":",
"era_text": _("Eras") + ":",
"icons_text": _("Icons"),
"fuzzy_icon_text": _("Fuzzy icon"),
"locked_icon_text": _("Locked icon"),
"hyperlink_icon_text": _("Hyperlink icon"),
"legends_text": _("Legends:"),
"edit_text": _("Edit"),
"experimental_text": _("Experimental Features"),
"minor_strip_colour_text": _("Minor strip divider line:"),
"major_strip_colour_text": _("Major strip divider line:"),
"now_line_colour_text": _("Now line:"),
"weekend_colour_text": _("Weekends:"),
"use_bold_nowline_text": _("Use bold line"),
"bg_colour_text": _("Background"),
"vertical_space_between_events_text": _("Vertical space between Events (px)"),
"colorize_weekends_text": _("Colorize weekends"),
"skip_s_in_decade_text_text": _("Skip s in decade text"),
"display_checkmark_on_events_done_text": _("Display checkmark when events are done"),
"never_use_time_text": _("Never use time precision for events"),
"use_second_text": _("Use second precision for time"),
"legend_positions_text": _("Legend Position"),
"legend_positions": [_("Bottom-Left"), _("Top-Left"), _("Top-Right"), _("Bottom-Right")],
"time_scale_positions": [_("Top"), _("Center"), _("Bottom")],
"time_scale_positions_text": _("Time scale position"),
"default_year": _("Default Year"),
"default_month": _("Default Month"),
"default_day": _("Default Day"),
"use_date_default_values": _("Use date default values"),
"workday_length_choices": list([str(n) for n in range(1, 25)]),
"use_sidebar_text_coloring_text": _("Use colored text in sidebar instead of colored boxes"),
"use_sidebar_filter_hint_text": _("Use hint in sidebar filter textbox instead of label")
}, title=_("Preferences"))
self.controller.on_init(config, ExperimentalFeatures())
self.font_sizer.Layout()
[docs] def SetIconsChoices(self, choices):
self.fuzzy_icon_choice.SetItems(choices)
self.locked_icon_choice.SetItems(choices)
self.hyperlink_icon_choice.SetItems(choices)
[docs] def SetFuzzyIcon(self, icon_name):
self._setIcon(self.fuzzy_icon_choice, icon_name)
[docs] def SetLockedIcon(self, icon_name):
self._setIcon(self.locked_icon_choice, icon_name)
[docs] def SetHyperlinkIcon(self, icon_name):
self._setIcon(self.hyperlink_icon_choice, icon_name)
def _setIcon(self, icon_ctrl, icon_name):
if not icon_ctrl.SetStringSelection(icon_name):
icon_ctrl.Select(0)
[docs] def DisplayIcons(self):
self.fuzzy_icon.SetBitmap(wx.Bitmap(os.path.join(EVENT_ICONS_DIR, self.fuzzy_icon_choice.GetStringSelection())))
self.locked_icon.SetBitmap(wx.Bitmap(os.path.join(EVENT_ICONS_DIR, self.locked_icon_choice.GetStringSelection())))
self.hyperlink_icon.SetBitmap(wx.Bitmap(os.path.join(EVENT_ICONS_DIR, self.hyperlink_icon_choice.GetStringSelection())))
self.Refresh()
[docs] def Destroy(self):
self.controller.on_close()
super(PreferencesDialog, self).Destroy()
[docs] def SetOpenRecentCheckboxValue(self, value):
self.open_recent_checkbox.SetValue(value)
[docs] def SetNeverPeriodPointCheckboxValue(self, value):
self.never_period_point_checkbox.SetValue(value)
[docs] def SetUncheckTimeForNewEventsCheckboxValue(self, value):
self.uncheck_time_for_new_events.SetValue(value)
[docs] def SetTextBelowIconCheckboxValue(self, value):
self.text_below_icon.SetValue(value)
[docs] def SetFilteredListboxExport(self, value):
self.filtered_listbox_export.SetValue(value)
[docs] def SetCenterTextCheckboxValue(self, value):
self.center_text_checkbox.SetValue(value)
[docs] def SetDisplayCheckmarkOnEventsDone(self, value):
self.display_checkmark_on_events_done_checkbox.SetValue(value)
[docs] def SetWeekStartSelection(self, value):
self.week_start_choice.Select(value)
[docs] def SetNeverUseTime(self, value):
self.never_use_time_checkbox.SetValue(value)
[docs] def SetUseSecond(self, value):
self.use_second_checkbox.SetValue(value)
[docs] def SetUseDateDefaultValues(self, value):
self.use_date_default_values_checkbox.SetValue(value)
[docs] def SetDefaultYear(self, value):
self.txt_default_year.SetValue(value)
[docs] def SetDefaultMonth(self, value):
self.txt_default_month.SetValue(value)
[docs] def SetDefaultDay(self, value):
self.txt_default_day.SetValue(value)
[docs] def GetDefaultYear(self):
return self.txt_default_year.GetValue()
[docs] def GetDefaultMonth(self):
return self.txt_default_month.GetValue()
[docs] def GetDefaultDay(self):
return self.txt_default_day.GetValue()
[docs] def GetNeverUseTime(self):
return self.never_use_time_checkbox.GetValue()
[docs] def GetUseSecond(self):
return self.use_second_checkbox.GetValue()
[docs] def GetUseDateDefaultValues(self):
return self.use_date_default_values_checkbox.GetValue()
[docs] def SetWorkdayLength(self, value):
self.workday_length_choices.Select(value - 1)
[docs] def GetWorkdayLength(self):
inx = self.workday_length_choices.GetSelection()
return int(self.workday_length_choices.GetString(inx))
[docs] def AddExperimentalFeatures(self, features):
for feature in features:
name = feature.display_name
cb = wx.CheckBox(self.experimental_panel, label=name, name=name)
cb.SetValue(feature.enabled())
self.experimental_panel_sizer.Add(cb)
self.Bind(wx.EVT_CHECKBOX, self.controller.on_experimental_changed, cb)
self.experimental_panel_sizer.Fit(self)
self.Fit()
[docs] def ShowSelectTabOrderDialog(self, config):
dialog = EventEditorTabSelectionDialog(self, config)
dialog.ShowModal()
dialog.Destroy()
[docs] def ShowEditFontDialog(self, font):
return edit_font_data(self, font)
[docs] def GetMinorStripColor(self):
return self.minor_strip_colorpicker.GetValue()
[docs] def SetMinorStripColor(self, new_color):
self.minor_strip_colorpicker.SetValue(new_color)
[docs] def GetMajorStripColor(self):
return self.major_strip_colorpicker.GetValue()
[docs] def SetMajorStripColor(self, new_color):
self.major_strip_colorpicker.SetValue(new_color)
[docs] def GetNowLineColor(self):
return self.now_line_colorpicker.GetValue()
[docs] def SetNowLineColor(self, new_color):
self.now_line_colorpicker.SetValue(new_color)
[docs] def GetBgColor(self):
return self.bg_colorpicker.GetValue()
[docs] def SetBgColor(self, new_color):
self.bg_colorpicker.SetValue(new_color)
[docs] def GetWeekendColor(self):
return self.weekend_colorpicker.GetValue()
[docs] def SetWeekendColor(self, new_color):
self.weekend_colorpicker.SetValue(new_color)
[docs] def SetVerticalSpaceBetweenEvents(self, value):
self.vertical_space_between_events.SetValue(value)
[docs] def GetVerticalSpaceBetweenEvents(self):
return self.vertical_space_between_events.GetValue()
[docs] def SetColorizeWeekends(self, value):
return self.colorize_weekends.SetValue(value)
[docs] def GetUseBoldNowline(self):
return self.use_bold_nowline.IsChecked()
[docs] def SetUseBoldNowline(self, value):
return self.use_bold_nowline.SetValue(value)
[docs] def GetColorizeWeekends(self):
return self.colorize_weekends.IsChecked()
[docs] def SetSkipSInDecadeText(self, value):
return self.skip_s_in_decade_text.SetValue(value)
[docs] def GetSkipSInDecadeText(self):
return self.skip_s_in_decade_text.IsChecked()
[docs] def SetMajorStripFont(self, font):
self._SetFont(self.major_strip_font_sample, font)
[docs] def SetMinorStripFont(self, font):
self._SetFont(self.minor_strip_font_sample, font)
[docs] def SetLegendFont(self, font):
self._SetFont(self.legend_font_sample, font)
[docs] def SetBalloonFont(self, font):
self._SetFont(self.balloon_font_sample, font)
[docs] def SetEventFont(self, font):
self._SetFont(self.event_font_sample, font)
[docs] def SetEraFont(self, font):
self._SetFont(self.era_font_sample, font)
[docs] def GetLegendPos(self):
return self.legend_positions.GetSelection()
[docs] def SetLegendPos(self, pos):
self.legend_positions.SetSelection(pos)
[docs] def GetTimeScalePos(self):
return self.time_scale_positions.GetSelection()
[docs] def SetTimeScalePos(self, pos):
self.time_scale_positions.SetSelection(pos)
def _SetFont(self, control, font):
control.SetFont(font)
control.SetForegroundColour(font.WxColor)
self.font_sizer.Layout()
[docs]def open_preferences_dialog(main_frame, config):
def open_dialog():
dialog = PreferencesDialog(main_frame, config)
dialog.ShowModal()
dialog.Destroy()
safe_locking(main_frame.controller, open_dialog)