Show More
@@ -102,7 +102,7 b' class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):' | |||
|
102 | 102 | executed = QtCore.Signal(object) |
|
103 | 103 | |
|
104 | 104 | # Emitted when an exit request has been received from the kernel. |
|
105 | exit_requested = QtCore.Signal() | |
|
105 | exit_requested = QtCore.Signal(object) | |
|
106 | 106 | |
|
107 | 107 | # Protected class variables. |
|
108 | 108 | _CallTipRequest = namedtuple('_CallTipRequest', ['id', 'pos']) |
@@ -422,7 +422,7 b' class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):' | |||
|
422 | 422 | "Close the Console?", |
|
423 | 423 | QtGui.QMessageBox.Yes,QtGui.QMessageBox.No) |
|
424 | 424 | if reply == QtGui.QMessageBox.Yes: |
|
425 |
s |
|
|
425 | self.exit_requested.emit(self) | |
|
426 | 426 | else: |
|
427 | 427 | reply = QtGui.QMessageBox.question(self, title, |
|
428 | 428 | "Kernel has been reset. Clear the Console?", |
@@ -583,7 +583,7 b' class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):' | |||
|
583 | 583 | if content['ename']=='SystemExit': |
|
584 | 584 | keepkernel = content['evalue']=='-k' or content['evalue']=='True' |
|
585 | 585 | self._keep_kernel_on_exit = keepkernel |
|
586 | self.exit_requested.emit() | |
|
586 | self.exit_requested.emit(self) | |
|
587 | 587 | else: |
|
588 | 588 | traceback = ''.join(content['traceback']) |
|
589 | 589 | self._append_plain_text(traceback) |
@@ -503,7 +503,7 b' class IPythonWidget(FrontendWidget):' | |||
|
503 | 503 | |
|
504 | 504 | def _handle_payload_exit(self, item): |
|
505 | 505 | self._keep_kernel_on_exit = item['keepkernel'] |
|
506 | self.exit_requested.emit() | |
|
506 | self.exit_requested.emit(self) | |
|
507 | 507 | |
|
508 | 508 | def _handle_payload_next_input(self, item): |
|
509 | 509 | self.input_buffer = dedent(item['text'].rstrip()) |
@@ -97,8 +97,66 b' class MainWindow(QtGui.QMainWindow):' | |||
|
97 | 97 | self._may_close = True |
|
98 | 98 | self._frontend.exit_requested.connect(self.close) |
|
99 | 99 | self._confirm_exit = confirm_exit |
|
100 | self.setCentralWidget(frontend) | |
|
101 | 100 | |
|
101 | self.tabWidget = QtGui.QTabWidget(self) | |
|
102 | self.tabWidget.setDocumentMode(True) | |
|
103 | self.tabWidget.setTabsClosable(True) | |
|
104 | self.tabWidget.addTab(frontend,"QtConsole1") | |
|
105 | self.tabWidget.tabCloseRequested[int].connect(self.closetab) | |
|
106 | ||
|
107 | self.setCentralWidget(self.tabWidget) | |
|
108 | self.updateTabBarVisibility() | |
|
109 | ||
|
110 | def updateTabBarVisibility(self): | |
|
111 | """ update visibility of the tabBar depending of the number of tab | |
|
112 | ||
|
113 | 0 or 1 tab, tabBar hiddent | |
|
114 | 2+ tabs, tabbarHidden | |
|
115 | ||
|
116 | need to be called explicitely, or be connected to tabInserted/tabRemoved | |
|
117 | """ | |
|
118 | if self.tabWidget.count() <= 1: | |
|
119 | self.tabWidget.tabBar().setVisible(False) | |
|
120 | else: | |
|
121 | self.tabWidget.tabBar().setVisible(True) | |
|
122 | ||
|
123 | def activeFrontend(self): | |
|
124 | return self.tabWidget.currentWidget() | |
|
125 | ||
|
126 | def closetab(self,tab): | |
|
127 | """ Called when a user try to close a tab | |
|
128 | ||
|
129 | It takes the number of the tab to be closed as argument, (does not for | |
|
130 | now, but should) take care of whether or not shuting down the kernel | |
|
131 | attached to the frontend | |
|
132 | """ | |
|
133 | print "closing tab",tab | |
|
134 | try: | |
|
135 | if self.tabWidget.widget(tab)._local_kernel: | |
|
136 | kernel_manager = self.tabWidget.widget(tab).kernel_manager.shutdown_kernel() | |
|
137 | else: | |
|
138 | print "not owning the kernel" | |
|
139 | except: | |
|
140 | print "can't ask the kernel to shutdown" | |
|
141 | #if self.tabWidget.count() == 1: | |
|
142 | #self.close() | |
|
143 | self.tabWidget.removeTab(tab) | |
|
144 | self.updateTabBarVisibility() | |
|
145 | ||
|
146 | def addTabWithFrontend(self,frontend,name=None): | |
|
147 | """ insert a tab with a given frontend in the tab bar, and give it a name | |
|
148 | ||
|
149 | """ | |
|
150 | if not name: | |
|
151 | name=str('no Name '+str(self.tabWidget.count())) | |
|
152 | self.tabWidget.addTab(frontend,name) | |
|
153 | self.updateTabBarVisibility() | |
|
154 | frontend.exit_requested.connect(self.irequest) | |
|
155 | ||
|
156 | def irequest(self,obj): | |
|
157 | print "I request to exit",obj | |
|
158 | print "which is tab:",self.tabWidget.indexOf(obj) | |
|
159 | self.closetab(self.tabWidget.indexOf(obj)) | |
|
102 | 160 | # MenuBar is always present on Mac Os, so let's populate it with possible |
|
103 | 161 | # action, don't do it on other platform as some user might not want the |
|
104 | 162 | # menu bar, or give them an option to remove it |
@@ -123,14 +181,24 b' class MainWindow(QtGui.QMainWindow):' | |||
|
123 | 181 | # as we are not sure of instanciating a _frontend which support all |
|
124 | 182 | # theses actions, but there might be a better way |
|
125 | 183 | try: |
|
126 | self.fileMenu.addAction(self._frontend.print_action) | |
|
184 | pass | |
|
185 | self.print_action = QtGui.QAction("Print", | |
|
186 | self, | |
|
187 | shortcut="Ctrl+P", | |
|
188 | triggered=self.undo_active_frontend) | |
|
189 | self.fileMenu.addAction(self.print_action) | |
|
127 | 190 | except AttributeError: |
|
128 | print "trying to add unexisting action, skipping" | |
|
191 | print "trying to add unexisting action (print), skipping" | |
|
129 | 192 | |
|
130 | 193 | try: |
|
131 | self.fileMenu.addAction(self._frontend.export_action) | |
|
194 | self.export_action=QtGui.QAction("Export", | |
|
195 | self, | |
|
196 | shortcut="Ctrl+S", | |
|
197 | triggered=self.export_action_active_frontend | |
|
198 | ) | |
|
199 | self.fileMenu.addAction(self.export_action) | |
|
132 | 200 | except AttributeError: |
|
133 | print "trying to add unexisting action, skipping" | |
|
201 | print "trying to add unexisting action (Export), skipping" | |
|
134 | 202 | |
|
135 | 203 | try: |
|
136 | 204 | self.fileMenu.addAction(self._frontend.select_all_action) |
@@ -142,42 +210,42 b' class MainWindow(QtGui.QMainWindow):' | |||
|
142 | 210 | self, |
|
143 | 211 | shortcut="Ctrl+Z", |
|
144 | 212 | statusTip="Undo last action if possible", |
|
145 |
triggered=self._frontend |
|
|
213 | triggered=self.undo_active_frontend) | |
|
146 | 214 | |
|
147 | 215 | self.editMenu.addAction(self.undo_action) |
|
148 | 216 | except AttributeError: |
|
149 | print "trying to add unexisting action, skipping" | |
|
217 | print "trying to add unexisting action (undo), skipping" | |
|
150 | 218 | |
|
151 | 219 | try: |
|
152 | 220 | self.redo_action = QtGui.QAction("Redo", |
|
153 | 221 | self, |
|
154 | 222 | shortcut="Ctrl+Shift+Z", |
|
155 | 223 | statusTip="Redo last action if possible", |
|
156 |
triggered=self._frontend |
|
|
224 | triggered=self.redo_active_frontend) | |
|
157 | 225 | self.editMenu.addAction(self.redo_action) |
|
158 | 226 | except AttributeError: |
|
159 | print "trying to add unexisting action, skipping" | |
|
227 | print "trying to add unexisting action(redo), skipping" | |
|
160 | 228 | |
|
161 | 229 | try: |
|
162 |
self.fontMenu.addAction(self. |
|
|
230 | pass#self.fontMenu.addAction(self.increase_font_size_active_frontend) | |
|
163 | 231 | except AttributeError: |
|
164 | print "trying to add unexisting action, skipping" | |
|
232 | print "trying to add unexisting action (increase font size), skipping" | |
|
165 | 233 | |
|
166 | 234 | try: |
|
167 |
self.fontMenu.addAction(self. |
|
|
235 | pass#self.fontMenu.addAction(self.decrease_font_size_active_frontend) | |
|
168 | 236 | except AttributeError: |
|
169 | print "trying to add unexisting action, skipping" | |
|
237 | print "trying to add unexisting action (decrease font size), skipping" | |
|
170 | 238 | |
|
171 | 239 | try: |
|
172 |
self.fontMenu.addAction(self. |
|
|
240 | pass#self.fontMenu.addAction(self.reset_font_size_active_frontend) | |
|
173 | 241 | except AttributeError: |
|
174 | print "trying to add unexisting action, skipping" | |
|
242 | print "trying to add unexisting action (reset font size), skipping" | |
|
175 | 243 | |
|
176 | 244 | try: |
|
177 | 245 | self.reset_action = QtGui.QAction("Reset", |
|
178 | 246 | self, |
|
179 | 247 | statusTip="Clear all varible from workspace", |
|
180 |
triggered=self. |
|
|
248 | triggered=self.reset_magic_active_frontend) | |
|
181 | 249 | self.magicMenu.addAction(self.reset_action) |
|
182 | 250 | except AttributeError: |
|
183 | 251 | print "trying to add unexisting action (reset), skipping" |
@@ -186,7 +254,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
186 | 254 | self.history_action = QtGui.QAction("History", |
|
187 | 255 | self, |
|
188 | 256 | statusTip="show command history", |
|
189 |
triggered=self. |
|
|
257 | triggered=self.history_magic_active_frontend) | |
|
190 | 258 | self.magicMenu.addAction(self.history_action) |
|
191 | 259 | except AttributeError: |
|
192 | 260 | print "trying to add unexisting action (history), skipping" |
@@ -195,7 +263,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
195 | 263 | self.save_action = QtGui.QAction("Export History ", |
|
196 | 264 | self, |
|
197 | 265 | statusTip="Export History as Python File", |
|
198 |
triggered=self. |
|
|
266 | triggered=self.save_magic_active_frontend) | |
|
199 | 267 | self.magicMenu.addAction(self.save_action) |
|
200 | 268 | except AttributeError: |
|
201 | 269 | print "trying to add unexisting action (save), skipping" |
@@ -204,7 +272,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
204 | 272 | self.clear_action = QtGui.QAction("Clear", |
|
205 | 273 | self, |
|
206 | 274 | statusTip="Clear the console", |
|
207 |
triggered=self. |
|
|
275 | triggered=self.clear_magic_active_frontend) | |
|
208 | 276 | self.magicMenu.addAction(self.clear_action) |
|
209 | 277 | except AttributeError: |
|
210 | 278 | print "trying to add unexisting action, skipping" |
@@ -213,7 +281,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
213 | 281 | self.who_action = QtGui.QAction("Who", |
|
214 | 282 | self, |
|
215 | 283 | statusTip="List interactive variable", |
|
216 |
triggered=self. |
|
|
284 | triggered=self.who_magic_active_frontend) | |
|
217 | 285 | self.magicMenu.addAction(self.who_action) |
|
218 | 286 | except AttributeError: |
|
219 | 287 | print "trying to add unexisting action (who), skipping" |
@@ -222,7 +290,7 b' class MainWindow(QtGui.QMainWindow):' | |||
|
222 | 290 | self.who_ls_action = QtGui.QAction("Who ls", |
|
223 | 291 | self, |
|
224 | 292 | statusTip="Return a list of interactive variable", |
|
225 |
triggered=self. |
|
|
293 | triggered=self.who_ls_magic_active_frontend) | |
|
226 | 294 | self.magicMenu.addAction(self.who_ls_action) |
|
227 | 295 | except AttributeError: |
|
228 | 296 | print "trying to add unexisting action (who_ls), skipping" |
@@ -231,12 +299,46 b' class MainWindow(QtGui.QMainWindow):' | |||
|
231 | 299 | self.whos_action = QtGui.QAction("Whos", |
|
232 | 300 | self, |
|
233 | 301 | statusTip="List interactive variable with detail", |
|
234 |
triggered=self. |
|
|
302 | triggered=self.whos_magic_active_frontend) | |
|
235 | 303 | self.magicMenu.addAction(self.whos_action) |
|
236 | 304 | except AttributeError: |
|
237 | 305 | print "trying to add unexisting action (whos), skipping" |
|
238 | 306 | |
|
239 | ||
|
307 | def undo_active_frontend(self): | |
|
308 | self.activeFrontend().undo() | |
|
309 | ||
|
310 | def redo_active_frontend(self): | |
|
311 | self.activeFrontend().redo() | |
|
312 | def reset_magic_active_frontend(self): | |
|
313 | self.activeFrontend().reset_magic() | |
|
314 | def history_magic_active_frontend(self): | |
|
315 | self.activeFrontend().history_magic() | |
|
316 | def save_magic_active_frontend(self): | |
|
317 | self.activeFrontend().save_magic() | |
|
318 | def clear_magic_active_frontend(self): | |
|
319 | self.activeFrontend().clear_magic() | |
|
320 | def who_magic_active_frontend(self): | |
|
321 | self.activeFrontend().who_magic() | |
|
322 | def who_ls_magic_active_frontend(self): | |
|
323 | self.activeFrontend().who_ls_magic() | |
|
324 | def whos_magic_active_frontend(self): | |
|
325 | self.activeFrontend().whos_magic() | |
|
326 | ||
|
327 | def print_action_active_frontend(self): | |
|
328 | self.activeFrontend().print_action() | |
|
329 | ||
|
330 | def export_action_active_frontend(self): | |
|
331 | self.activeFrontend().export_action() | |
|
332 | ||
|
333 | def select_all_action_frontend(self): | |
|
334 | self.activeFrontend().select_all_action() | |
|
335 | ||
|
336 | def increase_font_size_active_frontend(self): | |
|
337 | self.activeFrontend().increase_font_size() | |
|
338 | def decrease_font_size_active_frontend(self): | |
|
339 | self.activeFrontend().decrease_font_size() | |
|
340 | def reset_font_size_active_frontend(self): | |
|
341 | self.activeFrontend().reset_font_size() | |
|
240 | 342 | #--------------------------------------------------------------------------- |
|
241 | 343 | # QWidget interface |
|
242 | 344 | #--------------------------------------------------------------------------- |
@@ -617,6 +719,44 b' class IPythonQtConsoleApp(BaseIPythonApplication):' | |||
|
617 | 719 | self.kernel_manager.write_connection_file() |
|
618 | 720 | self.kernel_manager.start_channels() |
|
619 | 721 | |
|
722 | def createTabWithNewFrontend(self): | |
|
723 | kernel_manager = QtKernelManager( | |
|
724 | shell_address=(self.ip, self.shell_port), | |
|
725 | sub_address=(self.ip, self.iopub_port), | |
|
726 | stdin_address=(self.ip, self.stdin_port), | |
|
727 | hb_address=(self.ip, self.hb_port), | |
|
728 | config=self.config | |
|
729 | ) | |
|
730 | # start the kernel | |
|
731 | if not self.existing: | |
|
732 | kwargs = dict(ip=self.ip, ipython=not self.pure) | |
|
733 | kwargs['extra_arguments'] = self.kernel_argv | |
|
734 | kernel_manager.start_kernel(**kwargs) | |
|
735 | kernel_manager.start_channels() | |
|
736 | local_kernel = (not self.existing) or self.ip in LOCAL_IPS | |
|
737 | widget = self.widget_factory(config=self.config, | |
|
738 | local_kernel=local_kernel) | |
|
739 | widget.kernel_manager = kernel_manager | |
|
740 | self.window.addTabWithFrontend(widget) | |
|
741 | ||
|
742 | def createTabAttachedToCurrentTabKernel(self): | |
|
743 | currentWidget=self.window.tabWidget.currentWidget() | |
|
744 | currentWidgetIndex=self.window.tabWidget.indexOf(currentWidget) | |
|
745 | ckm=currentWidget.kernel_manager; | |
|
746 | cwname=self.window.tabWidget.tabText(currentWidgetIndex); | |
|
747 | kernel_manager = QtKernelManager( | |
|
748 | shell_address=ckm.shell_address, | |
|
749 | sub_address=ckm.sub_address, | |
|
750 | stdin_address=ckm.stdin_address, | |
|
751 | hb_address=ckm.hb_address, | |
|
752 | config=self.config | |
|
753 | ) | |
|
754 | kernel_manager.start_channels() | |
|
755 | local_kernel = (not self.existing) or self.ip in LOCAL_IPS | |
|
756 | widget = self.widget_factory(config=self.config, | |
|
757 | local_kernel=False) | |
|
758 | widget.kernel_manager = kernel_manager | |
|
759 | self.window.addTabWithFrontend(widget,name=str('('+cwname+') slave')) | |
|
620 | 760 | |
|
621 | 761 | def init_qt_elements(self): |
|
622 | 762 | # Create the widget. |
@@ -716,6 +856,17 b' class IPythonQtConsoleApp(BaseIPythonApplication):' | |||
|
716 | 856 | statusTip="Toggle between Fullscreen and Normal Size", |
|
717 | 857 | triggered=self.toggleFullScreen) |
|
718 | 858 | |
|
859 | self.tabAndNewKernelAct =QtGui.QAction("Tab with New kernel", | |
|
860 | self.window, | |
|
861 | shortcut="Ctrl+T", | |
|
862 | triggered=self.createTabWithNewFrontend) | |
|
863 | self.window.windowMenu.addAction(self.tabAndNewKernelAct) | |
|
864 | self.tabSameKernalAct =QtGui.QAction("Tab with Same kernel", | |
|
865 | self.window, | |
|
866 | shortcut="Ctrl+Shift+T", | |
|
867 | triggered=self.createTabAttachedToCurrentTabKernel) | |
|
868 | self.window.windowMenu.addAction(self.tabSameKernalAct) | |
|
869 | self.window.windowMenu.addSeparator() | |
|
719 | 870 | |
|
720 | 871 | # creating shortcut in menubar only for Mac OS as I don't |
|
721 | 872 | # know the shortcut or if the windows manager assign it in |
General Comments 0
You need to be logged in to leave comments.
Login now