Locales now available! langs: russian, english
This commit is contained in:
parent
60e0394859
commit
f92b708b3c
167
trunk/forms.py
167
trunk/forms.py
@ -6,8 +6,13 @@ import wx.grid
|
|||||||
import wx.propgrid as wxpg
|
import wx.propgrid as wxpg
|
||||||
import wx.lib.plot as wxplot
|
import wx.lib.plot as wxplot
|
||||||
import wx.lib.agw.aui as aui
|
import wx.lib.agw.aui as aui
|
||||||
|
import gettext
|
||||||
|
import json
|
||||||
|
import os
|
||||||
# import wx.aui as aui
|
# import wx.aui as aui
|
||||||
|
|
||||||
|
_ = gettext.gettext
|
||||||
|
|
||||||
ID_NEW = wx.NewId()
|
ID_NEW = wx.NewId()
|
||||||
ID_SAVE = wx.NewId()
|
ID_SAVE = wx.NewId()
|
||||||
ID_OPEN = wx.NewId()
|
ID_OPEN = wx.NewId()
|
||||||
@ -29,6 +34,9 @@ ID_ADD_PLOT = wx.NewId()
|
|||||||
ID_ADD_CURVES = wx.NewId()
|
ID_ADD_CURVES = wx.NewId()
|
||||||
ID_ADD_MARKERS = wx.NewId()
|
ID_ADD_MARKERS = wx.NewId()
|
||||||
|
|
||||||
|
ID_ENGLISH_LANG = wx.NewId()
|
||||||
|
ID_RUSSIAN_LANG = wx.NewId()
|
||||||
|
|
||||||
ID_ABOUT = wx.NewId()
|
ID_ABOUT = wx.NewId()
|
||||||
|
|
||||||
ID_EXPORT_CSV = wx.NewId()
|
ID_EXPORT_CSV = wx.NewId()
|
||||||
@ -75,6 +83,20 @@ class MainFrame(wx.Frame):
|
|||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wx.Frame.__init__ (self, parent, title = 'Opal', size = wx.Size(873,594))
|
wx.Frame.__init__ (self, parent, title = 'Opal', size = wx.Size(873,594))
|
||||||
|
|
||||||
|
self.settings = {}
|
||||||
|
self.LoadSettings()
|
||||||
|
|
||||||
|
lang = self.settings['locale']
|
||||||
|
if not lang:
|
||||||
|
locale = wx.Locale(wx.LANGUAGE_DEFAULT)
|
||||||
|
lang = locale.GetCanonicalName()
|
||||||
|
self.settings['locale'] = lang
|
||||||
|
Lang = gettext.translation('opal', './locale', languages=[lang], fallback=True)
|
||||||
|
Lang.install(unicode=True)
|
||||||
|
global _
|
||||||
|
_ = Lang.ugettext
|
||||||
|
self.gettext = Lang.ugettext
|
||||||
|
|
||||||
self.auimgr = aui.AuiManager()
|
self.auimgr = aui.AuiManager()
|
||||||
self.auimgr.SetManagedWindow(self)
|
self.auimgr.SetManagedWindow(self)
|
||||||
self.auimgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_SASH_SIZE, 3)
|
self.auimgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_SASH_SIZE, 3)
|
||||||
@ -89,7 +111,7 @@ class MainFrame(wx.Frame):
|
|||||||
# self.m_specs.SetMinSize(wx.Size(200,-1))
|
# self.m_specs.SetMinSize(wx.Size(200,-1))
|
||||||
|
|
||||||
self.auimgr.AddPane(self.m_specs,
|
self.auimgr.AddPane(self.m_specs,
|
||||||
aui.AuiPaneInfo().Name("m_specs").Caption("Templates").
|
aui.AuiPaneInfo().Name("m_specs").Caption(_("Templates")).
|
||||||
Left().Layer(1).CloseButton(False))
|
Left().Layer(1).CloseButton(False))
|
||||||
|
|
||||||
# Пользовательские модели
|
# Пользовательские модели
|
||||||
@ -97,15 +119,15 @@ class MainFrame(wx.Frame):
|
|||||||
self.m_user_models = TreeListCtrl(self, size = (200, -1),
|
self.m_user_models = TreeListCtrl(self, size = (200, -1),
|
||||||
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
|
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
|
||||||
| wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
|
| wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
|
||||||
self.m_user_models.AddColumn("Model name")
|
self.m_user_models.AddColumn(_("Model name"))
|
||||||
self.m_user_models.AddColumn("Status")
|
self.m_user_models.AddColumn(_("Status"))
|
||||||
self.m_user_models.AddColumn("Progress")
|
self.m_user_models.AddColumn(_("Progress"))
|
||||||
self.m_user_models.AddColumn("Comment")
|
self.m_user_models.AddColumn(_("Comment"))
|
||||||
self.m_user_models.SetMainColumn(0)
|
self.m_user_models.SetMainColumn(0)
|
||||||
self.m_user_models.SetImageList(self.ilist)
|
self.m_user_models.SetImageList(self.ilist)
|
||||||
|
|
||||||
self.auimgr.AddPane(self.m_user_models,
|
self.auimgr.AddPane(self.m_user_models,
|
||||||
aui.AuiPaneInfo().Name("m_user_models").Caption("Models").
|
aui.AuiPaneInfo().Name("m_user_models").Caption(_("Models")).
|
||||||
CenterPane().Position(1))
|
CenterPane().Position(1))
|
||||||
|
|
||||||
# Параметры модели
|
# Параметры модели
|
||||||
@ -113,7 +135,7 @@ class MainFrame(wx.Frame):
|
|||||||
self.m_params = PropertyCtrl(self, size = (-1, 300))
|
self.m_params = PropertyCtrl(self, size = (-1, 300))
|
||||||
|
|
||||||
self.auimgr.AddPane(self.m_params,
|
self.auimgr.AddPane(self.m_params,
|
||||||
aui.AuiPaneInfo().Name("m_params").Caption("Parameters").CloseButton(False).
|
aui.AuiPaneInfo().Name("m_params").Caption(_("Parameters")).CloseButton(False).
|
||||||
CenterPane().Bottom().Position(2))
|
CenterPane().Bottom().Position(2))
|
||||||
|
|
||||||
# Быстрые результаты
|
# Быстрые результаты
|
||||||
@ -121,7 +143,7 @@ class MainFrame(wx.Frame):
|
|||||||
self.m_quick_result = PropertyCtrl(self, size = (200, -1))
|
self.m_quick_result = PropertyCtrl(self, size = (200, -1))
|
||||||
|
|
||||||
self.auimgr.AddPane(self.m_quick_result,
|
self.auimgr.AddPane(self.m_quick_result,
|
||||||
aui.AuiPaneInfo().Name("m_quick_result").Caption("Quick results").CloseButton(False).
|
aui.AuiPaneInfo().Name("m_quick_result").Caption(_("Quick results")).CloseButton(False).
|
||||||
Right().Position(1).Layer(1))
|
Right().Position(1).Layer(1))
|
||||||
|
|
||||||
# Графики
|
# Графики
|
||||||
@ -131,7 +153,7 @@ class MainFrame(wx.Frame):
|
|||||||
self.m_plots.SetImageList(self.ilist)
|
self.m_plots.SetImageList(self.ilist)
|
||||||
|
|
||||||
self.auimgr.AddPane(self.m_plots,
|
self.auimgr.AddPane(self.m_plots,
|
||||||
aui.AuiPaneInfo().Name("m_plots").Caption("Plots").CloseButton(False).
|
aui.AuiPaneInfo().Name("m_plots").Caption(_("Plots")).CloseButton(False).
|
||||||
Right().Position(2).Layer(1))
|
Right().Position(2).Layer(1))
|
||||||
|
|
||||||
# Меню, панель инструментов и панель статуса
|
# Меню, панель инструментов и панель статуса
|
||||||
@ -145,6 +167,11 @@ class MainFrame(wx.Frame):
|
|||||||
|
|
||||||
self.BuildToolBar()
|
self.BuildToolBar()
|
||||||
|
|
||||||
|
layout = self.settings['layout']
|
||||||
|
if layout:
|
||||||
|
self.auimgr.LoadPerspective(layout, False)
|
||||||
|
print 'layout loaded'
|
||||||
|
|
||||||
self.auimgr.Update()
|
self.auimgr.Update()
|
||||||
|
|
||||||
def LoadIcons(self):
|
def LoadIcons(self):
|
||||||
@ -168,62 +195,74 @@ class MainFrame(wx.Frame):
|
|||||||
menubar = wx.MenuBar()
|
menubar = wx.MenuBar()
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_NEW, "&New\tCtrl+N")
|
menu.Append(ID_NEW, _("&New\tCtrl+N"))
|
||||||
menu.Append(ID_OPEN, "&Open\tCtrl+O")
|
menu.Append(ID_OPEN, _("&Open\tCtrl+O"))
|
||||||
menu.Append(ID_SAVE, "&Save\tCtrl+S")
|
menu.Append(ID_SAVE, _("&Save\tCtrl+S"))
|
||||||
menubar.Append(menu, '&Project')
|
menubar.Append(menu, _('&Project'))
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root')
|
menu.Append(ID_ADD_MODEL_ROOT, _('Add model to root'))
|
||||||
menu.Append(ID_ADD_MODEL_SELECTED, 'Append model to selected')
|
menu.Append(ID_ADD_MODEL_SELECTED, _('Append model to selected'))
|
||||||
menu.AppendSeparator()
|
menu.AppendSeparator()
|
||||||
menu.Append(ID_DUPLICATE_MODEL, "&Duplicate\tCtrl+D")
|
menu.Append(ID_DUPLICATE_MODEL, _("&Duplicate\tCtrl+D"))
|
||||||
menu.Append(ID_DUPLICATE_TREE, "&Duplicate with subitems\tCtrl+Shift+D")
|
menu.Append(ID_DUPLICATE_TREE, _("&Duplicate with subitems\tCtrl+Shift+D"))
|
||||||
menu.Append(ID_DELETE_MODEL, 'Delete\tCtrl+E')
|
menu.Append(ID_DELETE_MODEL, _('Delete\tCtrl+E'))
|
||||||
menu.AppendSeparator()
|
menu.AppendSeparator()
|
||||||
menu.Append(ID_TEST, "&Test\tCtrl+T")
|
menu.Append(ID_TEST, _("&Test\tCtrl+T"))
|
||||||
menubar.Append(menu, '&Model')
|
menubar.Append(menu, _('&Model'))
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_PROCESS_MODEL, 'Process\tF5')
|
menu.Append(ID_PROCESS_MODEL, _('Process\tF5'))
|
||||||
menu.Append(ID_STOP_MODEL, 'Stop\tF6')
|
menu.Append(ID_STOP_MODEL, _('Stop\tF6'))
|
||||||
#menu.AppendSeparator()
|
#menu.AppendSeparator()
|
||||||
menubar.Append(menu, '&Run')
|
menubar.Append(menu, _('&Run'))
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_SHOW_RESULT, 'Show report\tF7')
|
menu.Append(ID_SHOW_RESULT, _('Show report\tF7'))
|
||||||
menu.AppendSeparator()
|
menu.AppendSeparator()
|
||||||
menu.Append(ID_SHOW_PLOT, 'Show plot\tF8')
|
menu.Append(ID_SHOW_PLOT, _('Show plot\tF8'))
|
||||||
menu.Append(ID_ADD_PLOT, 'Add plot')
|
menu.Append(ID_ADD_PLOT, _('Add plot'))
|
||||||
#menu.Append(ID_ADD_LINE, 'Add line')
|
#menu.Append(ID_ADD_LINE, _('Add line'))
|
||||||
menubar.Append(menu, '&Result')
|
menubar.Append(menu, _('&Result'))
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_ABOUT, "&About\tF1")
|
submenu = wx.Menu()
|
||||||
menubar.Append(menu, '&Help')
|
submenu.Append(ID_ENGLISH_LANG, _('English'))
|
||||||
|
submenu.Append(ID_RUSSIAN_LANG, _('Russian'))
|
||||||
|
menu.AppendSubMenu(submenu, _('Language'))
|
||||||
|
menu.AppendSeparator()
|
||||||
|
# menu.Append(ID_SHOW_PLOT, _('Layout'))
|
||||||
|
# menu.Append(ID_ADD_PLOT, _('Options'))
|
||||||
|
#menu.Append(ID_ADD_LINE, _('Add line'))
|
||||||
|
menubar.Append(menu, _('&Settings'))
|
||||||
|
|
||||||
|
|
||||||
|
menu = wx.Menu()
|
||||||
|
menu.Append(ID_ABOUT, _("&About\tF1"))
|
||||||
|
menubar.Append(menu, _('&Help'))
|
||||||
|
|
||||||
return menubar
|
return menubar
|
||||||
|
|
||||||
def BuildContextMenu(self):
|
def BuildContextMenu(self):
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_ADD_MODEL_ROOT, 'Add model to root')
|
menu.Append(ID_ADD_MODEL_ROOT, _('Add model to root'))
|
||||||
menu.Append(ID_ADD_MODEL_SELECTED, 'Add model to selected')
|
menu.Append(ID_ADD_MODEL_SELECTED, _('Add model to selected'))
|
||||||
self.m_specs.Bind(wx.EVT_CONTEXT_MENU,
|
self.m_specs.Bind(wx.EVT_CONTEXT_MENU,
|
||||||
lambda x: self.m_specs.PopupMenu(menu))
|
lambda x: self.m_specs.PopupMenu(menu))
|
||||||
|
|
||||||
menu1 = wx.Menu()
|
menu1 = wx.Menu()
|
||||||
menu1.Append(ID_ADD_PLOT, 'Add plot')
|
menu1.Append(ID_ADD_PLOT, _('Add plot'))
|
||||||
menu1.AppendSeparator()
|
menu1.AppendSeparator()
|
||||||
menu1.Append(ID_ADD_CURVES, 'Add curves')
|
menu1.Append(ID_ADD_CURVES, _('Add curves'))
|
||||||
menu1.Append(ID_ADD_MARKERS, 'Add markers')
|
menu1.Append(ID_ADD_MARKERS, _('Add markers'))
|
||||||
self.m_plots.Bind(wx.EVT_CONTEXT_MENU,
|
self.m_plots.Bind(wx.EVT_CONTEXT_MENU,
|
||||||
lambda x: self.m_plots.PopupMenu(menu1))
|
lambda x: self.m_plots.PopupMenu(menu1))
|
||||||
|
|
||||||
menu2 = wx.Menu()
|
menu2 = wx.Menu()
|
||||||
menu2.Append(ID_SHOW_RESULT, 'Show report')
|
menu2.Append(ID_SHOW_RESULT, _('Show report'))
|
||||||
menu2.AppendSeparator()
|
menu2.AppendSeparator()
|
||||||
menu2.Append(ID_ADD_CURVES, 'Add curves')
|
menu2.Append(ID_ADD_CURVES, _('Add curves'))
|
||||||
menu2.Append(ID_ADD_MARKERS, 'Add markers')
|
menu2.Append(ID_ADD_MARKERS, _('Add markers'))
|
||||||
self.m_user_models.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK,
|
self.m_user_models.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK,
|
||||||
lambda x: self.m_user_models.PopupMenu(menu2))
|
lambda x: self.m_user_models.PopupMenu(menu2))
|
||||||
|
|
||||||
@ -233,34 +272,52 @@ class MainFrame(wx.Frame):
|
|||||||
tb1.SetToolBitmapSize(wx.Size(16, 16))
|
tb1.SetToolBitmapSize(wx.Size(16, 16))
|
||||||
|
|
||||||
tb1.AddSimpleTool(ID_ADD_MODEL_SELECTED, "model-new", wx.Bitmap('share/model-add.png'),
|
tb1.AddSimpleTool(ID_ADD_MODEL_SELECTED, "model-new", wx.Bitmap('share/model-add.png'),
|
||||||
'Add specification to selected model')
|
_('Add specification to selected model'))
|
||||||
tb1.AddSimpleTool(ID_DUPLICATE_MODEL, "model-dup", wx.Bitmap('share/model-dup.png'),
|
tb1.AddSimpleTool(ID_DUPLICATE_MODEL, "model-dup", wx.Bitmap('share/model-dup.png'),
|
||||||
'Duplicate selected model')
|
_('Duplicate selected model'))
|
||||||
tb1.AddSimpleTool(ID_DUPLICATE_TREE, "model-dup-tree", wx.Bitmap('share/model-dup-tree.png'),
|
tb1.AddSimpleTool(ID_DUPLICATE_TREE, "model-dup-tree", wx.Bitmap('share/model-dup-tree.png'),
|
||||||
'Duplicate selected model and all submodels')
|
_('Duplicate selected model and all submodels'))
|
||||||
tb1.AddSimpleTool(ID_DELETE_MODEL, "model-del", wx.Bitmap('share/model-delete.png'),
|
tb1.AddSimpleTool(ID_DELETE_MODEL, "model-del", wx.Bitmap('share/model-delete.png'),
|
||||||
'Delete selected model')
|
_('Delete selected model'))
|
||||||
tb1.AddSeparator()
|
tb1.AddSeparator()
|
||||||
tb1.AddSimpleTool(ID_PROCESS_MODEL, "model-go", wx.Bitmap('share/model-go.png'),
|
tb1.AddSimpleTool(ID_PROCESS_MODEL, "model-go", wx.Bitmap('share/model-go.png'),
|
||||||
'Start processing of selected models')
|
_('Start processing of selected models'))
|
||||||
tb1.AddSimpleTool(ID_STOP_MODEL, "model-stop", wx.Bitmap('share/model-cancel.png'),
|
tb1.AddSimpleTool(ID_STOP_MODEL, "model-stop", wx.Bitmap('share/model-cancel.png'),
|
||||||
'Stop processing of selected models')
|
_('Stop processing of selected models'))
|
||||||
tb1.AddSeparator()
|
tb1.AddSeparator()
|
||||||
tb1.AddSimpleTool(ID_SHOW_PLOT, "plot-quick", wx.Bitmap('share/plot-line.png'),
|
tb1.AddSimpleTool(ID_SHOW_PLOT, "plot-quick", wx.Bitmap('share/plot-line.png'),
|
||||||
'Show quick plot for selected model')
|
_('Show quick plot for selected model'))
|
||||||
tb1.AddSimpleTool(ID_SHOW_RESULT, "report-show", wx.Bitmap('share/report-show.png'),
|
tb1.AddSimpleTool(ID_SHOW_RESULT, "report-show", wx.Bitmap('share/report-show.png'),
|
||||||
'Show result data and table for selected model')
|
_('Show result data and table for selected model'))
|
||||||
tb1.AddSeparator()
|
tb1.AddSeparator()
|
||||||
tb1.AddSimpleTool(ID_ABOUT, "app-about", wx.Bitmap('share/app-about.png'),
|
tb1.AddSimpleTool(ID_ABOUT, "app-about", wx.Bitmap('share/app-about.png'),
|
||||||
'Show infomation about application')
|
_('Show infomation about application'))
|
||||||
tb1.Realize()
|
tb1.Realize()
|
||||||
|
|
||||||
self.auimgr.AddPane(tb1, aui.AuiPaneInfo().Name("tb1").Caption("Toolbar").
|
self.auimgr.AddPane(tb1, aui.AuiPaneInfo().Name("tb1").Caption(_("Toolbar")).
|
||||||
ToolbarPane().Left().Floatable(False).Movable(False).Gripper(False))
|
ToolbarPane().Left().Floatable(False).Movable(False).Gripper(False))
|
||||||
|
|
||||||
|
def SaveSettings(self):
|
||||||
|
self.settings['layout'] = self.auimgr.SavePerspective()
|
||||||
|
with open('settings.conf', 'w') as f:
|
||||||
|
json.dump(self.settings, f, indent = 2)
|
||||||
|
|
||||||
|
def LoadSettings(self):
|
||||||
|
default = {
|
||||||
|
'workers': 2,
|
||||||
|
'conf': 'tasks.conf',
|
||||||
|
'locale': None,
|
||||||
|
'layout': None,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.settings = default
|
||||||
|
if os.path.exists('settings.conf'):
|
||||||
|
with open('settings.conf', 'r') as f:
|
||||||
|
self.settings.update(json.load(f))
|
||||||
|
|
||||||
class SelectModelDialog(wx.Dialog):
|
class SelectModelDialog(wx.Dialog):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wx.Dialog.__init__(self, parent, -1, 'Select model')
|
wx.Dialog.__init__(self, parent, -1, _('Select model'))
|
||||||
|
|
||||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
self.mlist = wx.ListCtrl(self, style = wx.LC_ICON | wx.LC_SINGLE_SEL)
|
self.mlist = wx.ListCtrl(self, style = wx.LC_ICON | wx.LC_SINGLE_SEL)
|
||||||
@ -301,9 +358,9 @@ class ResultFrame(wx.Frame):
|
|||||||
menubar = wx.MenuBar()
|
menubar = wx.MenuBar()
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_EXPORT_CSV, 'CSV\tCtrl+E')
|
menu.Append(ID_EXPORT_CSV, _('CSV\tCtrl+E'))
|
||||||
#menu.Append(wx.NewId(), 'TeX')
|
#menu.Append(wx.NewId(), 'TeX')
|
||||||
menubar.Append(menu, 'Export to')
|
menubar.Append(menu, _('Export to'))
|
||||||
|
|
||||||
return menubar
|
return menubar
|
||||||
|
|
||||||
@ -331,7 +388,7 @@ class LineSelectDialog(wx.Dialog):
|
|||||||
|
|
||||||
class SizeSelector(wx.Dialog):
|
class SizeSelector(wx.Dialog):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wx.Dialog.__init__(self, parent, -1, 'Image size', size = (200, 100))
|
wx.Dialog.__init__(self, parent, -1, _('Image size'), size = (200, 100))
|
||||||
|
|
||||||
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
bSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
@ -387,8 +444,8 @@ class PlotFrame(wx.Frame):
|
|||||||
|
|
||||||
menubar = wx.MenuBar()
|
menubar = wx.MenuBar()
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
menu.Append(ID_SAVE_PLOT, 'Save to file\tCtrl+S')
|
menu.Append(ID_SAVE_PLOT, _('Save to file\tCtrl+S'))
|
||||||
menubar.Append(menu, 'Plot')
|
menubar.Append(menu, _('Plot'))
|
||||||
self.SetMenuBar(menubar)
|
self.SetMenuBar(menubar)
|
||||||
|
|
||||||
self.plot.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnZoom)
|
self.plot.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnZoom)
|
||||||
@ -419,7 +476,7 @@ class PlotFrame(wx.Frame):
|
|||||||
|
|
||||||
class AboutDialog(wx.Dialog):
|
class AboutDialog(wx.Dialog):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
wx.Dialog.__init__(self, parent, title = 'About Opal', size = (300, 330))
|
wx.Dialog.__init__(self, parent, title = _('About Opal'), size = (300, 330))
|
||||||
|
|
||||||
title = 'Opal System'
|
title = 'Opal System'
|
||||||
version = 'Aurora version'
|
version = 'Aurora version'
|
||||||
|
BIN
trunk/locale/ru_RU/LC_MESSAGES/opal.mo
Normal file
BIN
trunk/locale/ru_RU/LC_MESSAGES/opal.mo
Normal file
Binary file not shown.
@ -27,6 +27,9 @@ import json
|
|||||||
import zlib
|
import zlib
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
|
import gettext
|
||||||
|
_ = gettext.gettext
|
||||||
|
|
||||||
# состояния модели, унаследованные от состояния задачи
|
# состояния модели, унаследованные от состояния задачи
|
||||||
MODEL_READY = server.JOB_READY
|
MODEL_READY = server.JOB_READY
|
||||||
MODEL_RUNNING = server.JOB_RUNNING
|
MODEL_RUNNING = server.JOB_RUNNING
|
||||||
@ -133,10 +136,15 @@ class MainFrame(forms.MainFrame):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
forms.MainFrame.__init__(self, None)
|
forms.MainFrame.__init__(self, None)
|
||||||
|
|
||||||
|
global _
|
||||||
|
_ = self.gettext
|
||||||
|
|
||||||
self.model = None
|
self.model = None
|
||||||
self.name_id = 1
|
self.name_id = 1
|
||||||
|
|
||||||
s = server.LocalServer()
|
conf = self.settings['conf']
|
||||||
|
workers = int(self.settings['workers'])
|
||||||
|
s = server.LocalServer(conf=conf, workers=workers)
|
||||||
s.LoadModels()
|
s.LoadModels()
|
||||||
self.models = s.GetModels()
|
self.models = s.GetModels()
|
||||||
s.Start()
|
s.Start()
|
||||||
@ -200,6 +208,11 @@ class MainFrame(forms.MainFrame):
|
|||||||
self.Bind(wx.EVT_MENU, self.OnAddMarkers,
|
self.Bind(wx.EVT_MENU, self.OnAddMarkers,
|
||||||
id = forms.ID_ADD_MARKERS)
|
id = forms.ID_ADD_MARKERS)
|
||||||
|
|
||||||
|
self.Bind(wx.EVT_MENU, lambda x: self.ChangeLocale('en_EN'),
|
||||||
|
id = forms.ID_ENGLISH_LANG)
|
||||||
|
self.Bind(wx.EVT_MENU, lambda x: self.ChangeLocale('ru_RU'),
|
||||||
|
id = forms.ID_RUSSIAN_LANG)
|
||||||
|
|
||||||
self.Bind(wx.EVT_MENU, self.OnAbout,
|
self.Bind(wx.EVT_MENU, self.OnAbout,
|
||||||
id = forms.ID_ABOUT)
|
id = forms.ID_ABOUT)
|
||||||
|
|
||||||
@ -224,8 +237,13 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
# Функции приложения и обработки сервера
|
# Функции приложения и обработки сервера
|
||||||
|
|
||||||
|
def ChangeLocale(self, locale):
|
||||||
|
self.settings['locale'] = locale
|
||||||
|
wx.MessageBox(_('Locale changed. Restart application to apply settings'), _('Information'))
|
||||||
|
|
||||||
def OnClose(self, event):
|
def OnClose(self, event):
|
||||||
self.server.Stop()
|
self.server.Stop()
|
||||||
|
self.SaveSettings()
|
||||||
self.Destroy()
|
self.Destroy()
|
||||||
|
|
||||||
def OnAbout(self, event):
|
def OnAbout(self, event):
|
||||||
@ -272,7 +290,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
data.state = state
|
data.state = state
|
||||||
self.SetModelState(item, data.state)
|
self.SetModelState(item, data.state)
|
||||||
|
|
||||||
p = 'Unknown' if percent < 0 else '{:%}'.format(percent)
|
p = _('Unknown') if percent < 0 else '{:%}'.format(percent)
|
||||||
um.SetItemText(item, p, 2)
|
um.SetItemText(item, p, 2)
|
||||||
um.SetItemText(item, comment, 3)
|
um.SetItemText(item, comment, 3)
|
||||||
|
|
||||||
@ -355,7 +373,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
# Создаем корневой элемент для окна с графиками
|
# Создаем корневой элемент для окна с графиками
|
||||||
self.m_plots.AddRoot('root')
|
self.m_plots.AddRoot('root')
|
||||||
|
|
||||||
self.SetStatusText('Model "{}" selected'.format(model.GetTitle()), 0)
|
self.SetStatusText(_('Model "{}" selected').format(model.GetTitle()), 0)
|
||||||
|
|
||||||
return True # Project(model)
|
return True # Project(model)
|
||||||
|
|
||||||
@ -412,7 +430,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
selector = wx.FileDialog(
|
selector = wx.FileDialog(
|
||||||
self,
|
self,
|
||||||
'Select file to load project',
|
_('Select file to load project'),
|
||||||
'',
|
'',
|
||||||
'',
|
'',
|
||||||
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
|
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
|
||||||
@ -451,7 +469,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
self.m_plots.ExpandAll()
|
self.m_plots.ExpandAll()
|
||||||
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
wx.MessageBox("Can't load saved file", 'Error', wx.ICON_ERROR | wx.OK)
|
wx.MessageBox(_("Can't load saved file"), _('Error'), wx.ICON_ERROR | wx.OK)
|
||||||
print 'Oops', type(e), e
|
print 'Oops', type(e), e
|
||||||
finally:
|
finally:
|
||||||
wx.EndBusyCursor()
|
wx.EndBusyCursor()
|
||||||
@ -513,7 +531,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
selector = wx.FileDialog(
|
selector = wx.FileDialog(
|
||||||
self,
|
self,
|
||||||
'Select file to save project',
|
_('Select file to save project'),
|
||||||
'',
|
'',
|
||||||
self.model.GetTitle() + ' project',
|
self.model.GetTitle() + ' project',
|
||||||
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
|
'Opal files (*.opl)|*.opl|Text files (*.txt)|*.txt',
|
||||||
@ -548,7 +566,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
f.write(dump)
|
f.write(dump)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
wx.MessageBox("Can't save the project", 'Error', wx.ICON_ERROR | wx.OK)
|
wx.MessageBox(_("Can't save the project"), _('Error'), wx.ICON_ERROR | wx.OK)
|
||||||
print e
|
print e
|
||||||
finally:
|
finally:
|
||||||
wx.EndBusyCursor()
|
wx.EndBusyCursor()
|
||||||
@ -589,23 +607,23 @@ class MainFrame(forms.MainFrame):
|
|||||||
def SetModelState(self, item, state):
|
def SetModelState(self, item, state):
|
||||||
if state == MODEL_READY:
|
if state == MODEL_READY:
|
||||||
icon = self.icons.mready
|
icon = self.icons.mready
|
||||||
text = 'Ready'
|
text = _('Ready')
|
||||||
|
|
||||||
elif state == MODEL_RUNNING:
|
elif state == MODEL_RUNNING:
|
||||||
icon = self.icons.mrun
|
icon = self.icons.mrun
|
||||||
text = 'Running'
|
text = _('Running')
|
||||||
|
|
||||||
elif state == MODEL_COMPLETED:
|
elif state == MODEL_COMPLETED:
|
||||||
icon = self.icons.mcomplete
|
icon = self.icons.mcomplete
|
||||||
text = 'Completed'
|
text = _('Completed')
|
||||||
|
|
||||||
elif state == MODEL_STOPPED:
|
elif state == MODEL_STOPPED:
|
||||||
icon = self.icons.mstopped
|
icon = self.icons.mstopped
|
||||||
text = 'Stopped'
|
text = _('Stopped')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
icon = self.icons.mnoexec
|
icon = self.icons.mnoexec
|
||||||
text = 'No executable'
|
text = _('No executable')
|
||||||
|
|
||||||
self.m_user_models.SetItemImage(item, icon)
|
self.m_user_models.SetItemImage(item, icon)
|
||||||
self.m_user_models.SetItemText(item, text, 1)
|
self.m_user_models.SetItemText(item, text, 1)
|
||||||
@ -673,7 +691,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
um.Expand(item)
|
um.Expand(item)
|
||||||
um.SelectItem(child)
|
um.SelectItem(child)
|
||||||
else:
|
else:
|
||||||
wx.MessageBox('It\'s impossible to append model', 'Error')
|
wx.MessageBox(_("It's impossible to append model"), _('Error'))
|
||||||
|
|
||||||
# Реакция на выбор модели
|
# Реакция на выбор модели
|
||||||
|
|
||||||
@ -743,7 +761,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
data.state = MODEL_READY
|
data.state = MODEL_READY
|
||||||
self.SetModelState(item, data.state)
|
self.SetModelState(item, data.state)
|
||||||
|
|
||||||
child, _ = um.GetFirstChild(item)
|
child, _null = um.GetFirstChild(item)
|
||||||
while child.IsOk():
|
while child.IsOk():
|
||||||
Walk(child)
|
Walk(child)
|
||||||
child = um.GetNextSibling(child)
|
child = um.GetNextSibling(child)
|
||||||
@ -768,21 +786,21 @@ class MainFrame(forms.MainFrame):
|
|||||||
def GetSelectedItem(self, source):
|
def GetSelectedItem(self, source):
|
||||||
item = source.GetSelection()
|
item = source.GetSelection()
|
||||||
if not item.IsOk():
|
if not item.IsOk():
|
||||||
raise ItemError('Invalid item')
|
raise ItemError(_('Invalid item'))
|
||||||
return item
|
return item
|
||||||
|
|
||||||
def GetSelectedData(self, source):
|
def GetSelectedData(self, source):
|
||||||
item = self.GetSelectedItem(source)
|
item = self.GetSelectedItem(source)
|
||||||
data = source.GetPyData(item)
|
data = source.GetPyData(item)
|
||||||
if not data:
|
if not data:
|
||||||
raise ItemError('Empty data')
|
raise ItemError(_('Empty data'))
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def GetSelectedItemData(self, source):
|
def GetSelectedItemData(self, source):
|
||||||
item = self.GetSelectedItem(source)
|
item = self.GetSelectedItem(source)
|
||||||
data = source.GetPyData(item)
|
data = source.GetPyData(item)
|
||||||
if not data:
|
if not data:
|
||||||
raise ItemError('Empty data')
|
raise ItemError(_('Empty data'))
|
||||||
return (item, data)
|
return (item, data)
|
||||||
|
|
||||||
# Дублирование модели
|
# Дублирование модели
|
||||||
@ -862,7 +880,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
def OnShowResult(self, event):
|
def OnShowResult(self, event):
|
||||||
item, data = self.GetSelectedItemData(self.m_user_models)
|
item, data = self.GetSelectedItemData(self.m_user_models)
|
||||||
title = self.m_user_models.GetItemText(item)
|
title = self.m_user_models.GetItemText(item)
|
||||||
title = 'Result for model "{}"'.format(title)
|
title = _('Result for model "{}"').format(title)
|
||||||
rframe = ResultFrame(self, title, data.res)
|
rframe = ResultFrame(self, title, data.res)
|
||||||
rframe.Show()
|
rframe.Show()
|
||||||
|
|
||||||
@ -870,7 +888,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
def OnAddPlot(self, event):
|
def OnAddPlot(self, event):
|
||||||
root = self.m_plots.GetRootItem()
|
root = self.m_plots.GetRootItem()
|
||||||
child = self.m_plots.AppendItem(root, 'New plot')
|
child = self.m_plots.AppendItem(root, _('New plot'))
|
||||||
self.m_plots.SetPyData(child, 'plot')
|
self.m_plots.SetPyData(child, 'plot')
|
||||||
self.m_plots.SetItemImage(child, self.icons.porg)
|
self.m_plots.SetItemImage(child, self.icons.porg)
|
||||||
self.m_plots.SelectItem(child)
|
self.m_plots.SelectItem(child)
|
||||||
@ -916,11 +934,11 @@ class MainFrame(forms.MainFrame):
|
|||||||
data = um.GetPyData(item)
|
data = um.GetPyData(item)
|
||||||
title = um.GetItemText(item)
|
title = um.GetItemText(item)
|
||||||
|
|
||||||
msg = 'Line(s) for "{}" ({}/{})'.format(title, index, count)
|
msg = _('Line(s) for "{}" ({}/{})').format(title, index, count)
|
||||||
|
|
||||||
if not data.res:
|
if not data.res:
|
||||||
wx.MessageBox(
|
wx.MessageBox(
|
||||||
'There is no any result data for model!',
|
_('There is no any result data for model!'),
|
||||||
msg, wx.OK | wx.ICON_EXCLAMATION)
|
msg, wx.OK | wx.ICON_EXCLAMATION)
|
||||||
else:
|
else:
|
||||||
f = CreateLineSelectDialog(self, msg, data)
|
f = CreateLineSelectDialog(self, msg, data)
|
||||||
@ -963,7 +981,7 @@ class MainFrame(forms.MainFrame):
|
|||||||
|
|
||||||
def ShowPlot(self, lines, plot_title = ''):
|
def ShowPlot(self, lines, plot_title = ''):
|
||||||
if lines:
|
if lines:
|
||||||
p = PlotFrame(self, 'Plot', lines)
|
p = PlotFrame(self, _('Plot'), lines)
|
||||||
wx.FutureCall(20, p.Show)
|
wx.FutureCall(20, p.Show)
|
||||||
# p.Show()
|
# p.Show()
|
||||||
|
|
||||||
@ -1076,7 +1094,8 @@ class ResultFrame(forms.ResultFrame):
|
|||||||
if not self.result or not self.result.table:
|
if not self.result or not self.result.table:
|
||||||
return
|
return
|
||||||
|
|
||||||
text_file = wx.FileSelector('Save table to CSV',
|
text_file = wx.FileSelector(
|
||||||
|
_('Save table to CSV'),
|
||||||
default_filename = 'table.csv',
|
default_filename = 'table.csv',
|
||||||
wildcard = 'PNG files (*.csv)|*.csv|Text files (*.txt)|*.txt',
|
wildcard = 'PNG files (*.csv)|*.csv|Text files (*.txt)|*.txt',
|
||||||
flags = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
|
flags = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
|
||||||
@ -1177,7 +1196,8 @@ class PlotFrame(forms.PlotFrame):
|
|||||||
self.plot.Draw(graph)
|
self.plot.Draw(graph)
|
||||||
|
|
||||||
def OnSaveImage(self, event):
|
def OnSaveImage(self, event):
|
||||||
img_file = wx.FileSelector('Save plot',
|
img_file = wx.FileSelector(
|
||||||
|
_('Save plot'),
|
||||||
default_filename = 'plot.png',
|
default_filename = 'plot.png',
|
||||||
default_extension = 'png',
|
default_extension = 'png',
|
||||||
wildcard = 'PNG files (*.png)|*.png',
|
wildcard = 'PNG files (*.png)|*.png',
|
||||||
|
Loading…
Reference in New Issue
Block a user