Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

qtconsole : allow copy with shortcut in pager #1091

Closed
wants to merge 4 commits into from

2 participants

Matthias Bussonnier Min RK
Matthias Bussonnier
Owner

closes #1088

Carreau added some commits
Matthias Bussonnier
Owner

I also added a little fix that avoid some error message when trying qtconsole with --pure as there won't be user_expressionin message comming from the kernel.

Actually I suspect that some of the gui menu of qtconsole might be broken with --pure

Matthias Bussonnier
Owner

note that we might want to add a warning in the docstring of
console/console_widget.py: def can_copy(self):
Or change the implementation to check wether or not it returns true if selected text is in the pager...

Which way you think is the best ?

Min RK
Owner

@Carreau - you are right, there are probably quite a few things broken in pure mode. I wish we would remove it, because nobody ever tests it, and there are huge amounts of duplicate code that typically are not updated in tandem with every change.

Min RK minrk commented on the diff
IPython/frontend/qt/console/ipython_widget.py
@@ -267,11 +267,17 @@ def copy(self):
""" Copy the currently selected text to the clipboard, removing prompts
if possible.
"""
- text = self._control.textCursor().selection().toPlainText()
- if text:
- lines = map(transform_ipy_prompt, text.splitlines())
- text = '\n'.join(lines)
- QtGui.QApplication.clipboard().setText(text)
+ if self.layout().currentWidget() == self._page_control :
+ self._page_control.copy()
+ elif self.layout().currentWidget() == self._control :
+ text = self._control.textCursor().selection().toPlainText()
+ if text:
+ lines = map(transform_ipy_prompt, text.splitlines())
+ text = '\n'.join(lines)
+ QtGui.QApplication.clipboard().setText(text)
Min RK Owner
minrk added a note

Let's make 'transform_prompt` a widget trait (should be transform_classic_prompt in FrontendWidget, and transform_ipy_prompt in IPythonWidget), then we shouldn't have to override copy() in IPythonWidget at all.

Matthias Bussonnier Owner
Carreau added a note

I'm not quite comfortable with trait , I can give a shot, bu you'll probably be done before I read enough to do it the right way.

Min RK Owner
minrk added a note

Sorry, it can just be a class attribute. The traitness is unimportant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Min RK
Owner

When doing ipython qtconsole --pylab --paging vsplit, and do plot?, I cannot actually copy anything out of the pager area. So it would appear that this does not do what it claims, unless I am mistaken.

Matthias Bussonnier
Owner

hum... I didn't thought of vsplit. I'll take a look.

Matthias Bussonnier Carreau copy pager also hsplit, vsplit
	check which of the two widget have focus to know from which to copy
594f294
Matthias Bussonnier
Owner

@minrk,
this seem to work with hsplit/vsplit and without splitter

Min RK minrk referenced this pull request from a commit
Min RK minrk Merge PR #1091 (qtconsole pager copy)
closes #1088
closes #1091
7a144e2
Min RK minrk closed this pull request from a commit
Min RK minrk Merge PR #1091 (qtconsole pager copy)
closes #1088
closes #1091
7a144e2
Min RK minrk closed this in 7a144e2
Brian E. Granger ellisonbg referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
matthew von rocketstein mattvonrocketstein referenced this pull request from a commit in mattvonrocketstein/ipython
Min RK minrk Merge PR #1091 (qtconsole pager copy)
closes #1088
closes #1091
5ce2c2f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Dec 3, 2011
  1. Matthias Bussonnier
  2. Matthias Bussonnier

    qtconsole --pure, avoid 'user_expression'

    Carreau authored
    	'user_expression' does not exist with --pure, be more carefull..
  3. Matthias Bussonnier

    shorten 32dd9b5 logic for one file

    Carreau authored
Commits on Dec 7, 2011
  1. Matthias Bussonnier

    copy pager also hsplit, vsplit

    Carreau authored
    	check which of the two widget have focus to know from which to copy
This page is out of date. Refresh to see the latest.
2  IPython/frontend/qt/console/console_widget.py
View
@@ -441,7 +441,7 @@ def clear(self, keep_input=True):
def copy(self):
""" Copy the currently selected text to the clipboard.
"""
- self._control.copy()
+ self.layout().currentWidget().copy()
def cut(self):
""" Copy the currently selected text to the clipboard and delete it
19 IPython/frontend/qt/console/frontend_widget.py
View
@@ -174,11 +174,16 @@ def __init__(self, *args, **kw):
def copy(self):
""" Copy the currently selected text to the clipboard, removing prompts.
"""
- text = self._control.textCursor().selection().toPlainText()
- if text:
- lines = map(transform_classic_prompt, text.splitlines())
- text = '\n'.join(lines)
- QtGui.QApplication.clipboard().setText(text)
+ if self.layout().currentWidget() == self._page_control :
+ self._page_control.copy()
+ elif self.layout().currentWidget() == self._control :
+ text = self._control.textCursor().selection().toPlainText()
+ if text:
+ lines = map(transform_classic_prompt, text.splitlines())
+ text = '\n'.join(lines)
+ QtGui.QApplication.clipboard().setText(text)
+ else:
+ self.log.debug("frontend widget : unknown copy target")
#---------------------------------------------------------------------------
# 'ConsoleWidget' abstract interface
@@ -365,7 +370,9 @@ def _handle_exec_callback(self, msg):
"""
- user_exp = msg['content']['user_expressions']
+ user_exp = msg['content'].get('user_expressions')
+ if not user_exp:
+ return
for expression in user_exp:
if expression in self._callback_dict:
self._callback_dict.pop(expression)(user_exp[expression])
16 IPython/frontend/qt/console/ipython_widget.py
View
@@ -267,11 +267,17 @@ def copy(self):
""" Copy the currently selected text to the clipboard, removing prompts
if possible.
"""
- text = self._control.textCursor().selection().toPlainText()
- if text:
- lines = map(transform_ipy_prompt, text.splitlines())
- text = '\n'.join(lines)
- QtGui.QApplication.clipboard().setText(text)
+ if self._page_control.hasFocus() :
+ self._page_control.copy()
+ elif self._control.hasFocus() :
+ text = self._control.textCursor().selection().toPlainText()
+ if text:
+ lines = map(transform_ipy_prompt, text.splitlines())
+ text = '\n'.join(lines)
+ QtGui.QApplication.clipboard().setText(text)
Min RK Owner
minrk added a note

Let's make 'transform_prompt` a widget trait (should be transform_classic_prompt in FrontendWidget, and transform_ipy_prompt in IPythonWidget), then we shouldn't have to override copy() in IPythonWidget at all.

Matthias Bussonnier Owner
Carreau added a note

I'm not quite comfortable with trait , I can give a shot, bu you'll probably be done before I read enough to do it the right way.

Min RK Owner
minrk added a note

Sorry, it can just be a class attribute. The traitness is unimportant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ else :
+ self.log.debug("ipython_widget : unknown copy taget")
+
#---------------------------------------------------------------------------
# 'FrontendWidget' public interface
3  IPython/frontend/qt/console/mainwindow.py
View
@@ -795,8 +795,7 @@ def cut_active_frontend(self):
def copy_active_frontend(self):
widget = self.active_frontend
- if widget.can_copy():
- widget.copy()
+ widget.copy()
def copy_raw_active_frontend(self):
self.active_frontend._copy_raw_action.trigger()
Something went wrong with that request. Please try again.