mirror of https://github.com/python/cpython
Issue #1207589: Add Cut/Copy/Paste items to IDLE right click Context Menu
Patch by Todd Rovito.
This commit is contained in:
parent
2c184c6d75
commit
5018db76aa
|
@ -183,6 +183,15 @@ Edit context menu
|
|||
|
||||
* Right-click in Edit window (Control-click on OS X)
|
||||
|
||||
Cut
|
||||
Copy selection into system-wide clipboard; then delete selection
|
||||
|
||||
Copy
|
||||
Copy selection into system-wide clipboard
|
||||
|
||||
Paste
|
||||
Insert system-wide clipboard into window
|
||||
|
||||
Set Breakpoint
|
||||
Sets a breakpoint. Breakpoints are only enabled when the debugger is open.
|
||||
|
||||
|
@ -190,6 +199,9 @@ Clear Breakpoint
|
|||
Clears the breakpoint on that line.
|
||||
|
||||
.. index::
|
||||
single: Cut
|
||||
single: Copy
|
||||
single: Paste
|
||||
single: Set Breakpoint
|
||||
single: Clear Breakpoint
|
||||
single: breakpoints
|
||||
|
@ -200,6 +212,15 @@ Shell context menu
|
|||
|
||||
* Right-click in Python Shell window (Control-click on OS X)
|
||||
|
||||
Cut
|
||||
Copy selection into system-wide clipboard; then delete selection
|
||||
|
||||
Copy
|
||||
Copy selection into system-wide clipboard
|
||||
|
||||
Paste
|
||||
Insert system-wide clipboard into window
|
||||
|
||||
Go to file/line
|
||||
Same as in Debug menu.
|
||||
|
||||
|
|
|
@ -470,7 +470,6 @@ class EditorWindow(object):
|
|||
rmenu = None
|
||||
|
||||
def right_menu_event(self, event):
|
||||
self.text.tag_remove("sel", "1.0", "end")
|
||||
self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
|
||||
if not self.rmenu:
|
||||
self.make_rmenu()
|
||||
|
@ -479,23 +478,52 @@ class EditorWindow(object):
|
|||
iswin = sys.platform[:3] == 'win'
|
||||
if iswin:
|
||||
self.text.config(cursor="arrow")
|
||||
|
||||
for label, eventname, verify_state in self.rmenu_specs:
|
||||
if verify_state is None:
|
||||
continue
|
||||
state = getattr(self, verify_state)()
|
||||
rmenu.entryconfigure(label, state=state)
|
||||
|
||||
rmenu.tk_popup(event.x_root, event.y_root)
|
||||
if iswin:
|
||||
self.text.config(cursor="ibeam")
|
||||
|
||||
rmenu_specs = [
|
||||
# ("Label", "<<virtual-event>>"), ...
|
||||
("Close", "<<close-window>>"), # Example
|
||||
# ("Label", "<<virtual-event>>", "statefuncname"), ...
|
||||
("Close", "<<close-window>>", None), # Example
|
||||
]
|
||||
|
||||
def make_rmenu(self):
|
||||
rmenu = Menu(self.text, tearoff=0)
|
||||
for label, eventname in self.rmenu_specs:
|
||||
def command(text=self.text, eventname=eventname):
|
||||
text.event_generate(eventname)
|
||||
rmenu.add_command(label=label, command=command)
|
||||
for label, eventname, _ in self.rmenu_specs:
|
||||
if label is not None:
|
||||
def command(text=self.text, eventname=eventname):
|
||||
text.event_generate(eventname)
|
||||
rmenu.add_command(label=label, command=command)
|
||||
else:
|
||||
rmenu.add_separator()
|
||||
self.rmenu = rmenu
|
||||
|
||||
def rmenu_check_cut(self):
|
||||
return self.rmenu_check_copy()
|
||||
|
||||
def rmenu_check_copy(self):
|
||||
try:
|
||||
indx = self.text.index('sel.first')
|
||||
except TclError:
|
||||
return 'disabled'
|
||||
else:
|
||||
return 'normal' if indx else 'disabled'
|
||||
|
||||
def rmenu_check_paste(self):
|
||||
try:
|
||||
self.text.tk.call('tk::GetSelection', self.text, 'CLIPBOARD')
|
||||
except TclError:
|
||||
return 'disabled'
|
||||
else:
|
||||
return 'normal'
|
||||
|
||||
def about_dialog(self, event=None):
|
||||
aboutDialog.AboutDialog(self.top,'About IDLE')
|
||||
|
||||
|
|
|
@ -57,7 +57,11 @@ class OutputWindow(EditorWindow):
|
|||
# Our own right-button menu
|
||||
|
||||
rmenu_specs = [
|
||||
("Go to file/line", "<<goto-file-line>>"),
|
||||
("Cut", "<<cut>>", "rmenu_check_cut"),
|
||||
("Copy", "<<copy>>", "rmenu_check_copy"),
|
||||
("Paste", "<<paste>>", "rmenu_check_paste"),
|
||||
(None, None, None),
|
||||
("Go to file/line", "<<goto-file-line>>", None),
|
||||
]
|
||||
|
||||
file_line_pats = [
|
||||
|
|
|
@ -122,8 +122,13 @@ class PyShellEditorWindow(EditorWindow):
|
|||
old_hook()
|
||||
self.io.set_filename_change_hook(filename_changed_hook)
|
||||
|
||||
rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"),
|
||||
("Clear Breakpoint", "<<clear-breakpoint-here>>")]
|
||||
rmenu_specs = [
|
||||
("Cut", "<<cut>>", "rmenu_check_cut"),
|
||||
("Copy", "<<copy>>", "rmenu_check_copy"),
|
||||
("Paste", "<<paste>>", "rmenu_check_paste"),
|
||||
("Set Breakpoint", "<<set-breakpoint-here>>", None),
|
||||
("Clear Breakpoint", "<<clear-breakpoint-here>>", None)
|
||||
]
|
||||
|
||||
def set_breakpoint(self, lineno):
|
||||
text = self.text
|
||||
|
@ -1261,6 +1266,19 @@ class PyShell(OutputWindow):
|
|||
if not use_subprocess:
|
||||
raise KeyboardInterrupt
|
||||
|
||||
def rmenu_check_cut(self):
|
||||
try:
|
||||
if self.text.compare('sel.first', '<', 'iomark'):
|
||||
return 'disabled'
|
||||
except TclError: # no selection, so the index 'sel.first' doesn't exist
|
||||
return 'disabled'
|
||||
return super(PyShell, self).rmenu_check_cut()
|
||||
|
||||
def rmenu_check_paste(self):
|
||||
if self.text.compare('insert', '<', 'iomark'):
|
||||
return 'disabled'
|
||||
return super(PyShell, self).rmenu_check_paste()
|
||||
|
||||
class PseudoFile(object):
|
||||
|
||||
def __init__(self, shell, tags, encoding=None):
|
||||
|
|
|
@ -120,14 +120,23 @@ Help Menu:
|
|||
---
|
||||
(Additional Help Sources may be added here)
|
||||
|
||||
Edit context menu (Right-click / Control-click in Edit window):
|
||||
Edit context menu (Right-click / Control-click on OS X in Edit window):
|
||||
|
||||
Cut -- Copy a selection into system-wide clipboard,
|
||||
then delete the selection
|
||||
Copy -- Copy selection into system-wide clipboard
|
||||
Paste -- Insert system-wide clipboard into window
|
||||
Set Breakpoint -- Sets a breakpoint (when debugger open)
|
||||
Clear Breakpoint -- Clears the breakpoint on that line
|
||||
|
||||
Shell context menu (Right-click / Control-click in Shell window):
|
||||
Shell context menu (Right-click / Control-click on OS X in Shell window):
|
||||
|
||||
Go to file/line -- Same as in Debug menu
|
||||
Cut -- Copy a selection into system-wide clipboard,
|
||||
then delete the selection
|
||||
Copy -- Copy selection into system-wide clipboard
|
||||
Paste -- Insert system-wide clipboard into window
|
||||
---
|
||||
Go to file/line -- Same as in Debug menu
|
||||
|
||||
|
||||
** TIPS **
|
||||
|
|
Loading…
Reference in New Issue