def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap(topbar, bitmap=ICON_NODEGRAPH_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.zoom_field = NumberField(topbar, default_value=100, label=_("Zoom"), min_value=25, max_value=250, suffix="%", show_p=False) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.zoom_field, (0, 3), flag=wx.ALL, border=3) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.nodegraph = NodeGraph(self, self.registry, size=(-1, self.Size[0]-20)) # here for testing self.nodegraph.AddNode('image_node', wx.Point(100, 10)) self.nodegraph.AddNode('image_node', wx.Point(400, 100)) self.nodegraph.AddNode('blur_node', wx.Point(600, 200)) self.nodegraph.AddNode('mix_node', wx.Point(100, 200)) self.nodegraph.AddNode('output_node', wx.Point(300, 270)) self.nodegraph.AddNode('flip_node', wx.Point(400, 270)) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.nodegraph, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODESELECT, self.UpdateNodePropertiesPnl) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODECONNECT, self.NodeConnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODEDISCONNECT, self.NodeDisconnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_MOUSEZOOM, self.ZoomNodeGraph) self.zoom_field.Bind(EVT_NUMBERFIELD_CHANGE, self.ChangeZoom) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.nodegraph.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus)
def CreateUI(self, parent, sizer): fold_panel = self.CreateFoldPanel(sizer) fold_panel.SetBackgroundColour(wx.Colour("#464646")) self.numberfield = NumberField(fold_panel, default_value=self.GetValue(), label=self.GetLabel(), min_value=self.GetMinValue(), max_value=self.GetMaxValue(), suffix="px", show_p=False, size=(-1, 32)) self.AddToFoldPanel(sizer, fold_panel, self.numberfield, spacing=10) self.numberfield.Bind(EVT_NUMBERFIELD, self.WidgetEvent)
class PositiveIntegerProp(Property): """ Allows the user to select a positive integer. """ def __init__(self, idname, default=0, min_val=0, max_val=10, widget="slider", label="", visible=True): Property.__init__(self, idname, default, label, visible) self.min_value = min_val self.max_value = max_val self.widget = widget self._RunErrorCheck() def _RunErrorCheck(self): if self.value > self.max_value: raise TypeError( "PositiveIntegerField value must be set to an integer less than 'max_val'" ) if self.value < self.min_value: raise TypeError( "PositiveIntegerField value must be set to an integer greater than 'min_val'" ) def GetMinValue(self): return self.min_value def GetMaxValue(self): return self.max_value def CreateUI(self, parent, sizer): fold_panel = self.CreateFoldPanel(sizer) fold_panel.SetBackgroundColour(wx.Colour("#464646")) self.numberfield = NumberField(fold_panel, default_value=self.GetValue(), label=self.GetLabel(), min_value=self.GetMinValue(), max_value=self.GetMaxValue(), suffix="px", show_p=False, size=(-1, 32)) self.AddToFoldPanel(sizer, fold_panel, self.numberfield, spacing=10) self.numberfield.Bind(EVT_NUMBERFIELD, self.WidgetEvent) def WidgetEvent(self, event): self.SetValue(event.value)
class NodeGraphPanel(wx.Panel): def __init__(self, parent, registry, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.NO_BORDER | wx.TAB_TRAVERSAL): wx.Panel.__init__(self, parent, id, pos, size, style) self.parent = parent self.registry = registry self.SetBackgroundColour(wx.Colour("#464646")) self.BuildUI() def BuildUI(self): main_sizer = wx.BoxSizer(wx.VERTICAL) topbar = wx.Panel(self) topbar.SetBackgroundColour("#424242") topbar_sizer = wx.GridBagSizer(vgap=1, hgap=1) self.area_icon = wx.StaticBitmap( topbar, bitmap=ICON_NODEGRAPH_PANEL.GetBitmap()) self.area_label = wx.StaticText(topbar, label="") self.area_label.SetForegroundColour("#fff") self.area_label.SetFont(self.area_label.GetFont().Bold()) self.zoom_field = NumberField(topbar, default_value=100, label=_("Zoom"), min_value=25, max_value=250, suffix="%", show_p=False) self.menu_button = Button(topbar, label="", flat=True, bmp=(ICON_MORE_MENU_SMALL.GetBitmap(), 'left')) topbar_sizer.Add(self.area_icon, (0, 0), flag=wx.LEFT | wx.TOP | wx.BOTTOM, border=8) topbar_sizer.Add(self.area_label, (0, 1), flag=wx.ALL, border=8) topbar_sizer.Add(self.zoom_field, (0, 3), flag=wx.ALL, border=3) topbar_sizer.Add(self.menu_button, (0, 4), flag=wx.ALL, border=3) topbar_sizer.AddGrowableCol(2) topbar.SetSizer(topbar_sizer) self.nodegraph = NodeGraph(self, self.registry, size=(-1, self.Size[0] - 20)) # here for testing self.nodegraph.AddNode('image_node', wx.Point(100, 10)) self.nodegraph.AddNode('image_node', wx.Point(400, 100)) self.nodegraph.AddNode('blur_node', wx.Point(600, 200)) self.nodegraph.AddNode('mix_node', wx.Point(100, 200)) self.nodegraph.AddNode('output_node', wx.Point(300, 270)) main_sizer.Add(topbar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) main_sizer.Add(self.nodegraph, 1, flag=wx.EXPAND | wx.BOTH) self.SetSizer(main_sizer) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODESELECT, self.UpdateNodePropertiesPnl) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODECONNECT, self.NodeConnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_NODEDISCONNECT, self.NodeDisconnectEvent) self.nodegraph.Bind(EVT_GSNODEGRAPH_MOUSEZOOM, self.ZoomNodeGraph) self.zoom_field.Bind(EVT_NUMBERFIELD_CHANGE, self.ChangeZoom) self.menu_button.Bind(EVT_BUTTON, self.OnAreaMenuButton) self.Bind(wx.EVT_MENU, self.OnMenuUndockPanel, id=ID_MENU_UNDOCKPANEL) self.Bind(wx.EVT_MENU, self.OnMenuHidePanel, id=ID_MENU_HIDEPANEL) self.nodegraph.Bind(wx.EVT_ENTER_WINDOW, self.OnAreaFocus) @property def AUIManager(self): return self.parent._mgr @property def NodeGraph(self): return self.nodegraph @property def PropertiesPanel(self): return self.parent.prop_pnl @property def Statusbar(self): return self.parent.statusbar @property def ImageViewport(self): return self.parent.imageviewport_pnl def UpdateNodePropertiesPnl(self, event): self.PropertiesPanel.UpdatePanelContents(event.value) def NodeConnectEvent(self, event): self.parent.Render() def NodeDisconnectEvent(self, event): pass def ChangeZoom(self, event): level = event.value / 100.0 self.nodegraph.SetZoomLevel(level) def ZoomNodeGraph(self, event): self.zoom_field.SetValue(event.value) self.zoom_field.UpdateDrawing() self.zoom_field.Refresh() def OnAreaFocus(self, event): self.Statusbar.PushContextHints(2, mouseicon=ICON_MOUSE_LMB_MOVEMENT, text=_("Box Select Nodes"), clear=True) self.Statusbar.PushContextHints(3, mouseicon=ICON_MOUSE_LMB, text=_("Select Node")) self.Statusbar.PushContextHints( 4, mouseicon=ICON_MOUSE_LMB, keyicon=ICON_KEY_CTRL, text=_("Connect Selected Node To Output")) self.Statusbar.PushContextHints(5, mouseicon=ICON_MOUSE_MMB_MOVEMENT, text=_("Pan Nodegraph")) self.Statusbar.PushContextHints(6, mouseicon=ICON_MOUSE_RMB, text=_("Node Context Menu")) self.Statusbar.PushMessage(_("Nodegraph Area")) self.Statusbar.UpdateStatusBar() def OnAreaMenuButton(self, event): self.CreateAreaMenu() pos = ComputeMenuPosAlignedLeft(self.area_dropdownmenu, self.menu_button) self.area_dropdownmenu.Popup(pos, self) def OnMenuUndockPanel(self, event): self.AUIManager.GetPane("nodegraph").Float() self.AUIManager.Update() def OnMenuHidePanel(self, event): self.AUIManager.GetPane("nodegraph").Hide() self.AUIManager.Update() def CreateAreaMenu(self): self.area_dropdownmenu = flatmenu.FlatMenu() undockpanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_UNDOCKPANEL, _("Undock panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(undockpanel_menuitem) hidepanel_menuitem = flatmenu.FlatMenuItem(self.area_dropdownmenu, ID_MENU_HIDEPANEL, _("Hide panel"), "", wx.ITEM_NORMAL) self.area_dropdownmenu.AppendItem(hidepanel_menuitem)
def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.SetSize((600, 800)) self.SetBackgroundColour(wx.Colour("#464646")) sz = wx.BoxSizer(wx.VERTICAL) ctrl1 = NumberField(self, default_value=10, label="Resolution", min_value=0, max_value=25, suffix="px") ctrl2 = NumberField(self, default_value=98, label="Opacity", min_value=0, max_value=100, suffix="%") ctrl3 = NumberField(self, default_value=0, label="Radius", min_value=0, max_value=10, suffix="", show_p=False) ctrl4 = NumberField(self, default_value=50, label="X:", min_value=0, max_value=100, suffix="", show_p=False) ctrl5 = NumberField(self, default_value=13, label="Y:", min_value=0, max_value=100, suffix="", show_p=False) ctrl6 = TextCtrl(self, value="", style=wx.BORDER_SIMPLE, placeholder="", size=(-1, 24)) ctrl7 = NativeTextCtrl(self, size=(-1, 26)) ctrl8 = ColorPickerButton(self, label="Background Color:") ctrl9 = ColorPickerButton(self, label="Highlight Color:", default=(0, 54, 78, 215)) ctrl10 = ColorPickerButton(self, label="Text Color:", default=(255, 255, 255, 255)) ctrl11 = Button(self, label="Contrast", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl12 = Button(self, label="Render Image") ctrl13 = Button(self, label="Contrast", bmp=(TEST_ICON.GetBitmap(), 'top')) ctrl14 = Button(self, label="Choose Layer", bmp=(TEST_ICON.GetBitmap(), 'left')) sz2 = wx.BoxSizer(wx.HORIZONTAL) ctrl15 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl16 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl17 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) ctrl18 = Button(self, label="", bmp=(TEST_ICON.GetBitmap(), 'left')) sz2.Add(ctrl15, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl16, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl17, flag=wx.EXPAND | wx.ALL, border=6) sz2.Add(ctrl18, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl1, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl2, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl3, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl4, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl5, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl6, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl7, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl8, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl9, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl10, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl11, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl12, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl13, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(ctrl14, flag=wx.EXPAND | wx.ALL, border=6) sz.Add(sz2, border=20) self.SetSizer(sz) # Events self.Bind(EVT_NUMBERFIELD_CHANGE, self.OnFieldChange, ctrl1) self.Bind(EVT_NUMBERFIELD, self.OnField, ctrl1) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl8) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl9) self.Bind(EVT_BUTTON, self.OnColorChosen, ctrl10) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl11) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl12) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl13) self.Bind(EVT_BUTTON, self.OnButtonClick, ctrl14)