eg/Classes/OptionsDialog.py
# -*- coding: utf-8 -*-
#
# This file is part of EventGhost.
# Copyright © 2005-2020 EventGhost Project <http://www.eventghost.net/>
#
# EventGhost 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 2 of the License, or (at your option)
# any later version.
#
# EventGhost 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 EventGhost. If not, see <http://www.gnu.org/licenses/>.
import os
import wx
from os.path import exists, join
from time import localtime, strftime
from wx.combo import BitmapComboBox
# Local imports
import eg
INDENT_WIDTH = 18
class Text(eg.TranslatableStrings):
Title = "Options"
Tab1 = "General"
CheckPreRelease = "Always notify about new pre-releases"
CheckUpdate = "Check for EventGhost updates at launch"
confirmDelete = "Confirm deletion of tree items"
confirmRestart = (
"Language changes only take effect after restarting the application."
"\n\n"
"Do you want to restart EventGhost now?"
)
Datestamp = "Datestamp format for log:"
DatestampHelp = (
"For imformation on format codes read Python's strftime "
"documentation:\n"
"http://docs.python.org/2/library/datetime.html#strftime-and-strptime-"
"behavior\n"
"\nHere you can find examples:\n"
"http://strftime.org/\n"
)
HideOnClose = "Keep running in background when window closed"
HideOnStartup = "Hide on startup"
LanguageGroup = "Language"
limitMemory1 = "Limit memory consumption while minimized to"
limitMemory2 = "MB"
propResize = "Resize window proportionally"
refreshEnv = 'Refresh environment before executing "Run" actions'
showTrayIcon = "Display EventGhost icon in system tray"
StartWithWindows = 'Autostart EventGhost for user "%s"' % os.environ["USERNAME"]
UseAutoloadFile = "Autoload file"
UseFixedFont = 'Use fixed-size font in the "Log" pane'
class OptionsDialog(eg.TaskletDialog):
instance = None
@eg.LogItWithReturn
def Configure(self, parent=None):
if OptionsDialog.instance:
OptionsDialog.instance.Raise()
return
OptionsDialog.instance = self
text = Text
config = eg.config
self.useFixedFont = config.useFixedFont
eg.TaskletDialog.__init__(
self,
parent=parent,
title=text.Title,
)
languageNames = eg.Translation.languageNames
languageList = ["en_US"]
for item in os.listdir(eg.languagesDir):
name, ext = os.path.splitext(item)
if ext == ".py" and name in languageNames:
languageList.append(name)
languageList.sort()
languageNameList = [languageNames[x] for x in languageList]
notebook = wx.Notebook(self, -1)
page1 = eg.Panel(notebook)
notebook.AddPage(page1, text.Tab1)
# page 1 controls
startWithWindowsCtrl = page1.CheckBox(
exists(join((eg.folderPath.Startup or ""), eg.APP_NAME + ".lnk")),
text.StartWithWindows
)
if eg.folderPath.Startup is None:
startWithWindowsCtrl.Enable(False)
checkUpdateCtrl = page1.CheckBox(config.checkUpdate, text.CheckUpdate)
checkPreReleaseCtrl = page1.CheckBox(config.checkPreRelease, text.CheckPreRelease)
checkPreReleaseCtrl.Enable(config.checkUpdate)
def OnCheckUpdateCheckBox(event):
checkPreReleaseCtrl.Enable(event.IsChecked())
checkUpdateCtrl.Bind(wx.EVT_CHECKBOX, OnCheckUpdateCheckBox)
confirmDeleteCtrl = page1.CheckBox(
config.confirmDelete,
text.confirmDelete
)
showTrayIconCtrl = page1.CheckBox(
config.showTrayIcon,
text.showTrayIcon
)
hideOnCloseCtrl = page1.CheckBox(
config.hideOnClose,
text.HideOnClose
)
memoryLimitCtrl = page1.CheckBox(config.limitMemory, text.limitMemory1)
memoryLimitSpinCtrl = page1.SpinIntCtrl(
config.limitMemorySize,
min=4,
max=999
)
def OnMemoryLimitCheckBox(dummyEvent):
memoryLimitSpinCtrl.Enable(memoryLimitCtrl.IsChecked())
memoryLimitCtrl.Bind(wx.EVT_CHECKBOX, OnMemoryLimitCheckBox)
OnMemoryLimitCheckBox(None)
refreshEnvCtrl = page1.CheckBox(
config.refreshEnv,
text.refreshEnv
)
propResizeCtrl = page1.CheckBox(
config.propResize,
text.propResize
)
useFixedFontCtrl = page1.CheckBox(
config.useFixedFont,
text.UseFixedFont
)
def OnFixedFontBox(evt):
self.UpdateFont(evt.IsChecked())
useFixedFontCtrl.Bind(wx.EVT_CHECKBOX, OnFixedFontBox)
datestampCtrl = page1.TextCtrl(config.datestamp)
datestampCtrl.SetToolTipString(text.DatestampHelp)
datestampLabel = page1.StaticText(text.Datestamp)
datestampLabel.SetToolTipString(text.DatestampHelp)
datestampSzr = wx.BoxSizer(wx.HORIZONTAL)
datestampSzr.AddMany((
(datestampLabel, 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5),
(datestampCtrl, 1, wx.EXPAND)
))
def OnDatestampKillFocus(_):
dt_fmt = datestampCtrl.GetValue()
try:
strftime(dt_fmt, localtime())
except ValueError:
wx.MessageBox("Invalid format string!", "Error")
datestampCtrl.SetBackgroundColour("pink")
datestampCtrl.Refresh()
wx.CallAfter(datestampCtrl.SetFocus)
else:
datestampCtrl.SetBackgroundColour(
wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
)
datestampCtrl.Refresh()
datestampCtrl.Bind(wx.EVT_KILL_FOCUS, OnDatestampKillFocus)
languageChoice = BitmapComboBox(page1, style=wx.CB_READONLY)
for name, code in zip(languageNameList, languageList):
filename = os.path.join(eg.imagesDir, "flags", "%s.png" % code)
if os.path.exists(filename):
image = wx.Image(filename)
image.Resize((16, 16), (0, 3))
bmp = image.ConvertToBitmap()
languageChoice.Append(name, bmp)
else:
languageChoice.Append(name)
if config.language not in languageList:
config.language='en_EN'
languageChoice.SetSelection(languageList.index(config.language))
languageChoice.SetMinSize((150, -1))
buttonRow = eg.ButtonRow(self, (wx.ID_OK, wx.ID_CANCEL))
# construction of the layout with sizers
flags = wx.ALIGN_CENTER_VERTICAL
memoryLimitSizer = eg.HBoxSizer(
(memoryLimitCtrl, 0, flags),
(memoryLimitSpinCtrl, 0, flags),
(page1.StaticText(text.limitMemory2), 0, flags | wx.LEFT, 2),
)
startGroupSizer = wx.GridSizer(cols=1, vgap=2, hgap=2)
startGroupSizer.AddMany(
(
(startWithWindowsCtrl, 0, flags),
(checkUpdateCtrl, 0, flags),
(checkPreReleaseCtrl, 0, flags | wx.LEFT, INDENT_WIDTH),
(confirmDeleteCtrl, 0, flags),
(showTrayIconCtrl, 0, flags),
(hideOnCloseCtrl, 0, flags),
(memoryLimitSizer, 0, flags),
(refreshEnvCtrl, 0, flags),
(propResizeCtrl, 0, flags),
(useFixedFontCtrl, 0, flags),
(datestampSzr, 0, flags),
)
)
langGroupSizer = page1.VStaticBoxSizer(
text.LanguageGroup,
(languageChoice, 0, wx.LEFT | wx.RIGHT, INDENT_WIDTH),
)
page1Sizer = eg.VBoxSizer(
((15, 7), 1),
(startGroupSizer, 0, wx.EXPAND | wx.ALL, 5),
((15, 7), 1),
(langGroupSizer, 0, wx.EXPAND | wx.ALL, 5),
)
page1.SetSizer(page1Sizer)
page1.SetAutoLayout(True)
sizer = eg.VBoxSizer(
(notebook, 1, wx.EXPAND | wx.TOP | wx.LEFT | wx.RIGHT, 5),
(buttonRow.sizer, 0, wx.EXPAND),
)
self.SetSizerAndFit(sizer)
self.SetMinSize(self.GetSize())
notebook.ChangeSelection(0)
oldLanguage = config.language
while self.Affirmed():
config.checkUpdate = checkUpdateCtrl.GetValue()
config.checkPreRelease = checkPreReleaseCtrl.GetValue()
config.confirmDelete = confirmDeleteCtrl.GetValue()
config.showTrayIcon = showTrayIconCtrl.GetValue()
config.hideOnClose = hideOnCloseCtrl.GetValue()
config.limitMemory = bool(memoryLimitCtrl.GetValue())
config.limitMemorySize = memoryLimitSpinCtrl.GetValue()
config.refreshEnv = refreshEnvCtrl.GetValue()
config.propResize = propResizeCtrl.GetValue()
config.useFixedFont = useFixedFontCtrl.GetValue()
config.datestamp = datestampCtrl.GetValue()
config.language = languageList[languageChoice.GetSelection()]
config.Save()
self.SetResult()
eg.Utils.UpdateStartupShortcut(startWithWindowsCtrl.GetValue())
if config.showTrayIcon:
eg.taskBarIcon.Show()
else:
eg.taskBarIcon.Hide()
if eg.mainFrame:
eg.mainFrame.SetWindowStyleFlag()
eg.mainFrame.logCtrl.SetDTLogging()
if config.language != oldLanguage:
wx.CallAfter(self.ShowLanguageWarning)
OptionsDialog.instance = None
@eg.LogItWithReturn
def OnCancel(self, event):
self.UpdateFont(self.useFixedFont)
self.DispatchEvent(event, wx.ID_CANCEL)
@eg.LogItWithReturn
def OnClose(self, event):
self.UpdateFont(self.useFixedFont)
self.DispatchEvent(event, wx.ID_CANCEL)
def ShowLanguageWarning(self):
dlg = wx.MessageDialog(
eg.document.frame,
Text.confirmRestart,
"",
wx.YES_NO | wx.ICON_QUESTION
)
res = dlg.ShowModal()
dlg.Destroy()
if res == wx.ID_YES:
eg.app.Restart()
def UpdateFont(self, val):
font = eg.document.frame.treeCtrl.GetFont()
if val:
font = wx.Font(font.GetPointSize(), wx.DEFAULT, wx.NORMAL, wx.NORMAL, False, "Courier New")
wx.CallAfter(eg.document.frame.logCtrl.SetFont, font)