From 3d888bb6554e52aa9ee8e670ec74ca2650804f72 2011-10-17 08:46:51
From: Matthias BUSSONNIER <bussonniermatthias@gmail.com>
Date: 2011-10-17 08:46:51
Subject: [PATCH] add copy_raw, interrupt kernel and restart kernel into menu

---

diff --git a/IPython/frontend/qt/console/frontend_widget.py b/IPython/frontend/qt/console/frontend_widget.py
index b54d9ef..b80aa5b 100644
--- a/IPython/frontend/qt/console/frontend_widget.py
+++ b/IPython/frontend/qt/console/frontend_widget.py
@@ -241,6 +241,14 @@ class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):
                 break
         return menu
 
+    def request_interrupt_kernel(self):
+        if self._executing:
+            self.interrupt_kernel()
+
+    def request_restart_kernel(self):
+        message = 'Are you sure you want to restart the kernel?'
+        self.restart_kernel(message, now=False)
+
     def _event_filter_console_keypress(self, event):
         """ Reimplemented for execution interruption and smart backspace.
         """
@@ -248,12 +256,11 @@ class FrontendWidget(HistoryConsoleWidget, BaseFrontendMixin):
         if self._control_key_down(event.modifiers(), include_command=False):
 
             if key == QtCore.Qt.Key_C and self._executing:
-                self.interrupt_kernel()
+                self.request_interrupt_kernel()
                 return True
 
             elif key == QtCore.Qt.Key_Period:
-                message = 'Are you sure you want to restart the kernel?'
-                self.restart_kernel(message, now=False)
+                self.request_restart_kernel()
                 return True
 
         elif not event.modifiers() & QtCore.Qt.AltModifier:
diff --git a/IPython/frontend/qt/console/qtconsoleapp.py b/IPython/frontend/qt/console/qtconsoleapp.py
index 59ec0b8..0ea0ff5 100644
--- a/IPython/frontend/qt/console/qtconsoleapp.py
+++ b/IPython/frontend/qt/console/qtconsoleapp.py
@@ -373,6 +373,13 @@ class MainWindow(QtGui.QMainWindow):
             )
         self.edit_menu.addAction(self.copy_action)
 
+        self.copy_raw_action = QtGui.QAction("Copy (&Raw Text)",
+            self,
+            shortcut="Ctrl+Shift+C",
+            triggered=self.copy_raw_active_frontend
+            )
+        self.edit_menu.addAction(self.copy_raw_action)
+
         self.cut_action = QtGui.QAction("&Cut",
             self,
             shortcut=QtGui.QKeySequence.Cut,
@@ -483,6 +490,20 @@ class MainWindow(QtGui.QMainWindow):
             )
         self.help_menu.addAction(self.quickref_active_frontend_action)
 
+        self.interrupt_kernel_action = QtGui.QAction("Interrupt current Kernel",
+            self,
+            triggered=self.interrupt_kernel_active_frontend
+            )
+        self.kernel_menu.addAction(self.interrupt_kernel_action)
+
+        self.restart_kernel_action = QtGui.QAction("Restart current  Kernel",
+            self,
+            triggered=self.restart_kernel_active_frontend
+            )
+        self.kernel_menu.addAction(self.restart_kernel_action)
+        self.kernel_menu.addSeparator()
+
+        #for now this is just a copy and paste, but we should get this dynamically
         magiclist=["%alias", "%autocall", "%automagic", "%bookmark", "%cd", "%clear",
             "%colors", "%debug", "%dhist", "%dirs", "%doctest_mode", "%ed", "%edit", "%env", "%gui",
             "%guiref", "%hist", "%history", "%install_default_config", "%install_profiles",
@@ -507,12 +528,21 @@ class MainWindow(QtGui.QMainWindow):
                 )
             self.all_magic_menu.addAction(xaction)
 
+    def restart_kernel_active_frontend(self):
+        self.active_frontend.request_restart_kernel()
+
+    def interrupt_kernel_active_frontend(self):
+        self.active_frontend.request_interrupt_kernel()
+
     def cut_active_frontend(self):
         self.active_frontend.cut_action.trigger()
 
     def copy_active_frontend(self):
         self.active_frontend.copy_action.trigger()
 
+    def copy_raw_active_frontend(self):
+        self.active_frontend._copy_raw_action.trigger()
+
     def paste_active_frontend(self):
         self.active_frontend.paste_action.trigger()