1"""Incremental demo for wx support of tasks. 2 3Multiple tasks 4 5Note that naively subclassing SecondTask from ExampleTask, it initially used 6the same menu_bar and tool_bars traits from ExampleTask. This caused the 7incorrect tying of the controls to SecondTask because the class attributes 8were shared between both classes. 9""" 10 11from pyface.api import ( 12 GUI, 13 ConfirmationDialog, 14 FileDialog, 15 ImageResource, 16 YES, 17 OK, 18 CANCEL, 19) 20from pyface.tasks.api import ( 21 Task, 22 TaskWindow, 23 TaskLayout, 24 PaneItem, 25 IEditor, 26 IEditorAreaPane, 27 EditorAreaPane, 28 Editor, 29 DockPane, 30 HSplitter, 31 VSplitter, 32) 33from pyface.tasks.action.api import ( 34 DockPaneToggleGroup, 35 SMenuBar, 36 SMenu, 37 SToolBar, 38 TaskAction, 39 TaskToggleGroup, 40) 41from traits.api import on_trait_change, Property, Instance 42 43 44class Pane1(DockPane): 45 # TaskPane interface --------------------------------------------------- 46 47 id = "steps.pane1" 48 name = "Pane 1" 49 50 51class Pane2(DockPane): 52 # TaskPane interface --------------------------------------------------- 53 54 id = "steps.pane2" 55 name = "Pane 2" 56 57 58class Pane3(DockPane): 59 # TaskPane interface --------------------------------------------------- 60 61 id = "steps.pane3" 62 name = "Pane 3" 63 64 65class Pane4(DockPane): 66 # TaskPane interface --------------------------------------------------- 67 68 id = "steps.pane4" 69 name = "Pane 4" 70 71 72class Pane5(DockPane): 73 # TaskPane interface --------------------------------------------------- 74 75 id = "steps.pane5" 76 name = "Pane 5" 77 78 79class Pane6(DockPane): 80 # TaskPane interface --------------------------------------------------- 81 82 id = "steps.pane6" 83 name = "Pane 6" 84 85 86class Pane7(DockPane): 87 # TaskPane interface --------------------------------------------------- 88 89 id = "steps.pane7" 90 name = "Pane 7" 91 92 93class ExampleTask(Task): 94 """ A simple task for opening a blank editor. 95 """ 96 97 # Task interface ------------------------------------------------------- 98 99 id = "example.example_task" 100 name = "Multi-Tab Editor" 101 102 active_editor = Property( 103 Instance(IEditor), depends_on="editor_area.active_editor" 104 ) 105 106 editor_area = Instance(IEditorAreaPane) 107 108 menu_bar = SMenuBar( 109 SMenu( 110 TaskAction(name="New", method="new", accelerator="Ctrl+N"), 111 id="File", 112 name="&File", 113 ), 114 SMenu( 115 DockPaneToggleGroup(), TaskToggleGroup(), id="View", name="&View" 116 ), 117 ) 118 119 tool_bars = [ 120 SToolBar( 121 TaskAction( 122 method="new", 123 tooltip="New file", 124 image=ImageResource("document_new"), 125 ), 126 image_size=(32, 32), 127 ) 128 ] 129 130 # ------------------------------------------------------------------------ 131 # 'Task' interface. 132 # ------------------------------------------------------------------------ 133 134 def _default_layout_default(self): 135 return TaskLayout( 136 top=HSplitter( 137 PaneItem("steps.pane1"), 138 PaneItem("steps.pane2"), 139 PaneItem("steps.pane3"), 140 ) 141 ) 142 143 def create_central_pane(self): 144 """ Create the central pane: the script editor. 145 """ 146 self.editor_area = EditorAreaPane() 147 return self.editor_area 148 149 def create_dock_panes(self): 150 """ Create the file browser and connect to its double click event. 151 """ 152 return [Pane1(), Pane2(), Pane3()] 153 154 # ------------------------------------------------------------------------ 155 # 'ExampleTask' interface. 156 # ------------------------------------------------------------------------ 157 158 def new(self): 159 """ Opens a new empty window 160 """ 161 editor = Editor() 162 self.editor_area.add_editor(editor) 163 self.editor_area.activate_editor(editor) 164 self.activated() 165 166 # Trait property getter/setters ---------------------------------------- 167 168 def _get_active_editor(self): 169 if self.editor_area is not None: 170 return self.editor_area.active_editor 171 return None 172 173 174class SecondTask(ExampleTask): 175 """ A simple task for opening a blank editor. 176 """ 177 178 # Task interface ------------------------------------------------------- 179 180 id = "example.second_task" 181 name = "Second Multi-Tab Editor" 182 183 menu_bar = SMenuBar( 184 SMenu( 185 TaskAction(name="New", method="new", accelerator="Ctrl+N"), 186 id="File", 187 name="&File", 188 ), 189 SMenu( 190 DockPaneToggleGroup(), TaskToggleGroup(), id="View", name="&View" 191 ), 192 ) 193 194 tool_bars = [ 195 SToolBar( 196 TaskAction( 197 method="new", 198 tooltip="New file", 199 image=ImageResource("document_new"), 200 ), 201 image_size=(32, 32), 202 ) 203 ] 204 205 # ------------------------------------------------------------------------ 206 # 'Task' interface. 207 # ------------------------------------------------------------------------ 208 209 def _default_layout_default(self): 210 return TaskLayout( 211 left=VSplitter( 212 PaneItem("steps.pane1"), 213 PaneItem("steps.pane2"), 214 PaneItem("steps.pane3"), 215 ) 216 ) 217 218 219def main(argv): 220 """ A simple example of using Tasks. 221 """ 222 # Create the GUI (this does NOT start the GUI event loop). 223 gui = GUI() 224 225 # Create a Task and add it to a TaskWindow. 226 task1 = ExampleTask() 227 task2 = SecondTask() 228 window = TaskWindow(size=(800, 600)) 229 window.add_task(task1) 230 window.add_task(task2) 231 232 # Show the window. 233 window.open() 234 235 # Start the GUI event loop. 236 gui.start_event_loop() 237 238 239if __name__ == "__main__": 240 import sys 241 242 main(sys.argv) 243