now main window is managed by aui
This commit is contained in:
parent
fe4748ba2a
commit
c24a76d476
93
forms.py
93
forms.py
@ -5,6 +5,8 @@ import wx.gizmos
|
||||
import wx.grid
|
||||
import wx.propgrid as wxpg
|
||||
import wx.lib.plot as wxplot
|
||||
import wx.lib.agw.aui as aui
|
||||
# import wx.aui as aui
|
||||
|
||||
ID_NEW = wx.NewId()
|
||||
ID_SAVE = wx.NewId()
|
||||
@ -55,27 +57,40 @@ class Icons:
|
||||
"""
|
||||
pass
|
||||
|
||||
class PropertyCtrl(wxpg.PropertyGrid):
|
||||
|
||||
def GetPosition(self):
|
||||
return self.GetPanel().GetPosition()
|
||||
|
||||
def Clear(self):
|
||||
wxpg.PropertyGrid.Clear(self)
|
||||
|
||||
class MainFrame(wx.Frame):
|
||||
def __init__(self, parent):
|
||||
wx.Frame.__init__ (self, parent, title = 'Opal', size = wx.Size(873,594))
|
||||
|
||||
self.auimgr = aui.AuiManager()
|
||||
self.auimgr.SetManagedWindow(self)
|
||||
self.auimgr.GetArtProvider().SetMetric(aui.AUI_DOCKART_SASH_SIZE, 3)
|
||||
|
||||
self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
|
||||
|
||||
self.ilist, self.icons = self.LoadIcons()
|
||||
|
||||
bSizer3 = wx.BoxSizer(wx.HORIZONTAL)
|
||||
# Спецификации
|
||||
|
||||
self.m_specs = wx.TreeCtrl(self, style = wx.TR_DEFAULT_STYLE)
|
||||
self.m_specs.SetMinSize(wx.Size(200,-1))
|
||||
self.m_specs = wx.TreeCtrl(self, size = (200, -1), style = wx.TR_DEFAULT_STYLE)
|
||||
# self.m_specs.SetMinSize(wx.Size(200,-1))
|
||||
|
||||
bSizer3.Add(self.m_specs, 0, wx.ALL|wx.EXPAND, 1)
|
||||
self.auimgr.AddPane(self.m_specs,
|
||||
aui.AuiPaneInfo().Name("m_specs").Caption("Templates").
|
||||
Left().Layer(1).CloseButton(False))
|
||||
|
||||
bSizer4 = wx.BoxSizer(wx.VERTICAL)
|
||||
# Пользовательские модели
|
||||
|
||||
self.m_user_models = TreeListCtrl(self,
|
||||
self.m_user_models = TreeListCtrl(self, size = (200, -1),
|
||||
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT
|
||||
| wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_ROW_LINES | wx.TR_MULTIPLE)
|
||||
self.m_user_models.SetMinSize(wx.Size(-1, 300))
|
||||
self.m_user_models.AddColumn("Model name")
|
||||
self.m_user_models.AddColumn("Status")
|
||||
self.m_user_models.AddColumn("Progress")
|
||||
@ -83,42 +98,49 @@ class MainFrame (wx.Frame):
|
||||
self.m_user_models.SetMainColumn(0)
|
||||
self.m_user_models.SetImageList(self.ilist)
|
||||
|
||||
bSizer4.Add(self.m_user_models, 0, wx.ALL | wx.EXPAND, 1)
|
||||
self.auimgr.AddPane(self.m_user_models,
|
||||
aui.AuiPaneInfo().Name("m_user_models").Caption("Models").
|
||||
CenterPane().Position(1))
|
||||
|
||||
# WARNING: wxPython code generation isn't supported for this widget yet.
|
||||
self.m_params = wxpg.PropertyGridManager(self)
|
||||
self.m_params.AddPage('fp')
|
||||
bSizer4.Add(self.m_params, 1, wx.EXPAND | wx.ALL, 1)
|
||||
# Параметры модели
|
||||
|
||||
bSizer3.Add(bSizer4, 1, wx.EXPAND, 5)
|
||||
self.m_params = PropertyCtrl(self, size = (-1, 300))
|
||||
|
||||
bSizer5 = wx.BoxSizer(wx.VERTICAL)
|
||||
self.auimgr.AddPane(self.m_params,
|
||||
aui.AuiPaneInfo().Name("m_params").Caption("Parameters").CloseButton(False).
|
||||
CenterPane().Bottom().Position(2))
|
||||
|
||||
self.m_quick_result = wxpg.PropertyGridManager(self)
|
||||
self.m_quick_result.AddPage('fp')
|
||||
self.m_quick_result.SetMinSize(wx.Size(200, -1))
|
||||
bSizer5.Add(self.m_quick_result, 1, wx.EXPAND | wx.ALL, 1)
|
||||
# Быстрые результаты
|
||||
|
||||
self.m_plots = wx.TreeCtrl(self,
|
||||
self.m_quick_result = PropertyCtrl(self, size = (200, -1))
|
||||
|
||||
self.auimgr.AddPane(self.m_quick_result,
|
||||
aui.AuiPaneInfo().Name("m_quick_result").Caption("Quick results").CloseButton(False).
|
||||
Right().Position(1).Layer(1))
|
||||
|
||||
# Графики
|
||||
|
||||
self.m_plots = wx.TreeCtrl(self, size = (200, -1),
|
||||
style = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.TR_EDIT_LABELS)
|
||||
bSizer5.Add(self.m_plots, 1, wx.EXPAND | wx.ALL, 1)
|
||||
self.m_plots.SetImageList(self.ilist)
|
||||
|
||||
bSizer3.Add(bSizer5, 0, wx.ALL | wx.EXPAND, 1)
|
||||
self.auimgr.AddPane(self.m_plots,
|
||||
aui.AuiPaneInfo().Name("m_plots").Caption("Plots").CloseButton(False).
|
||||
Right().Position(2).Layer(1))
|
||||
|
||||
# Меню, панель инструментов и панель статуса
|
||||
|
||||
sbar = wx.StatusBar(self)
|
||||
self.SetStatusBar(sbar)
|
||||
|
||||
mbar = self.BuildMenu()
|
||||
self.SetMenuBar(mbar)
|
||||
self.SetMenuBar(self.BuildMenu())
|
||||
|
||||
self.BuildContextMenu()
|
||||
|
||||
# tbar = self.BuildToolBar()
|
||||
# self.SetToolBar(tbar)
|
||||
|
||||
self.SetSizer(bSizer3)
|
||||
self.Layout()
|
||||
self.Centre(wx.BOTH)
|
||||
self.auimgr.Update()
|
||||
|
||||
def LoadIcons(self):
|
||||
icons = Icons()
|
||||
@ -217,8 +239,8 @@ class ResultFrame(wx.Frame):
|
||||
|
||||
sizer = wx.BoxSizer(wx.VERTICAL)
|
||||
|
||||
self.scalar = wxpg.PropertyGridManager(self)
|
||||
self.scalar.AddPage('fp')
|
||||
self.scalar = PropertyCtrl(self)
|
||||
self.scalar.SetMinSize((-1, 200))
|
||||
|
||||
self.table = wx.grid.Grid(self)
|
||||
self.table.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
|
||||
@ -226,10 +248,23 @@ class ResultFrame(wx.Frame):
|
||||
sizer.Add(self.scalar, 0, wx.EXPAND | wx.ALL, 1)
|
||||
sizer.Add(self.table, 1, wx.EXPAND | wx.ALL, 1)
|
||||
|
||||
self.SetMenuBar(self.BuildMenu())
|
||||
|
||||
self.SetSizer(sizer)
|
||||
self.Layout()
|
||||
self.Centre(wx.BOTH)
|
||||
|
||||
def BuildMenu(self):
|
||||
|
||||
menubar = wx.MenuBar()
|
||||
|
||||
menu = wx.Menu()
|
||||
menu.Append(wx.NewId(), 'CSV\tCtrl+E')
|
||||
menu.Append(wx.NewId(), 'TeX')
|
||||
menubar.Append(menu, 'Export to')
|
||||
|
||||
return menubar
|
||||
|
||||
class LineSelectDialog(wx.Dialog):
|
||||
def __init__(self, parent, title):
|
||||
wx.Dialog.__init__ (self, parent, -1, title, size = wx.Size(400, 300))
|
||||
@ -262,3 +297,5 @@ class PlotFrame(wx.Frame):
|
||||
self.plot.SetEnableAntiAliasing(True)
|
||||
self.plot.SetEnableHiRes(True)
|
||||
self.plot.SetEnableLegend(True)
|
||||
|
||||
self.Centre(wx.BOTH)
|
||||
|
39
opal.py
39
opal.py
@ -40,7 +40,6 @@ class ModelData:
|
||||
|
||||
self.res = None
|
||||
|
||||
|
||||
LINE_CURVE = 1
|
||||
LINE_MARKER = 2
|
||||
LINE_HISTOGRAM = 3
|
||||
@ -87,6 +86,8 @@ class MainFrame(forms.MainFrame):
|
||||
|
||||
self.m_user_models.Bind(wx.EVT_TREE_SEL_CHANGED,
|
||||
self.OnModelActivated)
|
||||
self.m_user_models.Bind(wx.EVT_TREE_DELETE_ITEM,
|
||||
self.OnDeleteModelsItem)
|
||||
self.m_params.Bind(wxpg.EVT_PG_CHANGING,
|
||||
self.OnParamChanging)
|
||||
self.m_params.Bind(wxpg.EVT_PG_CHANGED,
|
||||
@ -97,7 +98,8 @@ class MainFrame(forms.MainFrame):
|
||||
self.OnModelProcess)
|
||||
self.m_plots.Bind(wx.EVT_TREE_ITEM_ACTIVATED,
|
||||
self.OnPlotProcess)
|
||||
|
||||
self.m_plots.Bind(wx.EVT_CHAR,
|
||||
self.OnPlotsKeyPressed)
|
||||
|
||||
# События меню
|
||||
|
||||
@ -253,8 +255,8 @@ class MainFrame(forms.MainFrame):
|
||||
"""
|
||||
self.m_specs.DeleteAllItems()
|
||||
self.m_user_models.DeleteAllItems()
|
||||
self.m_params.ClearPage(0)
|
||||
self.m_quick_result.ClearPage(0)
|
||||
self.m_params.Clear()
|
||||
self.m_quick_result.Clear()
|
||||
self.m_plots.DeleteAllItems()
|
||||
# Строим спецификации
|
||||
self.BuildSpecs(model)
|
||||
@ -392,7 +394,7 @@ class MainFrame(forms.MainFrame):
|
||||
raise KeyError()
|
||||
|
||||
pg = self.m_params
|
||||
pg.ClearPage(0)
|
||||
pg.Clear()
|
||||
for label, value in model_def.params.iteritems():
|
||||
param = model_def.DD[label]
|
||||
title = param.GetTitle()
|
||||
@ -405,7 +407,7 @@ class MainFrame(forms.MainFrame):
|
||||
if not result:
|
||||
return
|
||||
pg = self.m_quick_result
|
||||
pg.ClearPage(0)
|
||||
pg.Clear()
|
||||
for label, param in result.data.iteritems():
|
||||
pg.Append(wxpg.StringProperty(label, value = str(param.GetValue())))
|
||||
pg.SetSplitterLeft()
|
||||
@ -486,9 +488,14 @@ class MainFrame(forms.MainFrame):
|
||||
|
||||
# Удаление модели
|
||||
|
||||
def OnDeleteModel(self, event):
|
||||
item, data = self.GetSelectedItemData(self.m_user_models)
|
||||
def OnDeleteModelsItem(self, event):
|
||||
item = event.GetItem()
|
||||
data = self.m_user_models.GetPyData(item)
|
||||
if data:
|
||||
self.server.DeleteJob(data.jid)
|
||||
|
||||
def OnDeleteModel(self, event):
|
||||
item = self.GetSelectedItem(self.m_user_models)
|
||||
self.m_user_models.Delete(item)
|
||||
|
||||
# Функции запуска модели на выполнение и управления очередью
|
||||
@ -528,7 +535,7 @@ class MainFrame(forms.MainFrame):
|
||||
item, data = self.GetSelectedItemData(um)
|
||||
title = um.GetItemText(item)
|
||||
if not data.res:
|
||||
self.SetStatusText("There is no results in model")
|
||||
wx.MessageBox('There is no any result data', 'Warning', wx.OK | wx.ICON_EXCLAMATION)
|
||||
return []
|
||||
f = LineSelectDialog(self, 'Select lines for "{}"'.format(title))
|
||||
for index, col in enumerate(data.res.columns):
|
||||
@ -579,6 +586,7 @@ class MainFrame(forms.MainFrame):
|
||||
self.AddLines(LINE_MARKER)
|
||||
|
||||
def ShowPlot(self, lines, plot_title = ''):
|
||||
if lines:
|
||||
p = PlotFrame(self, 'Plot', lines)
|
||||
p.Show()
|
||||
|
||||
@ -613,6 +621,13 @@ class MainFrame(forms.MainFrame):
|
||||
|
||||
self.ShowPlot(lines)
|
||||
|
||||
def OnPlotsKeyPressed(self, event):
|
||||
keycode = event.GetKeyCode()
|
||||
item = self.GetSelectedItem(self.m_plots)
|
||||
if keycode == wx.WXK_DELETE:
|
||||
self.m_plots.Delete(item)
|
||||
event.Skip()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Форма с выбором модели из представленного списка
|
||||
#-----------------------------------------------------------------------------
|
||||
@ -653,7 +668,7 @@ class ResultFrame(forms.ResultFrame):
|
||||
self.UpdateResults()
|
||||
|
||||
def UpdateResults(self):
|
||||
self.scalar.ClearPage(0)
|
||||
self.scalar.Clear()
|
||||
self.table.ClearGrid()
|
||||
if not self.result:
|
||||
return
|
||||
@ -681,6 +696,9 @@ class ResultFrame(forms.ResultFrame):
|
||||
pg.Append(wxpg.StringProperty(label,
|
||||
value = str(param.GetValue())))
|
||||
|
||||
def OnExportToCSV(self, event):
|
||||
pass
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Форма с выбором наборов значений для построения графика
|
||||
#-----------------------------------------------------------------------------
|
||||
@ -723,7 +741,6 @@ class LineSelectDialog(forms.LineSelectDialog):
|
||||
|
||||
return [ (x, y) for y in ys ]
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Форма с изображением графика
|
||||
#-----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user