Skip to content

Commit 2c795e3

Browse files
committed
move 'copy' and 'preview' squeezed output actions to a context menu
1 parent 18106e8 commit 2c795e3

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

Lib/idlelib/idle_test/test_squeezer.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from idlelib.config import idleConf
99
from idlelib.squeezer import count_lines_with_wrapping, ExpandingButton, \
1010
Squeezer
11+
from idlelib import macosx
1112
from idlelib.textview import view_text
1213
from idlelib.tooltip import Hovertip
1314
from idlelib.pyshell import PyShell
@@ -452,8 +453,8 @@ def test_init_no_tooltip(self, MockHovertip):
452453

453454
# check that the mouse events are bound
454455
self.assertIn('<Double-Button-1>', expandingbutton.bind())
455-
self.assertIn('<Button-2>', expandingbutton.bind())
456-
self.assertIn('<Button-3>', expandingbutton.bind())
456+
right_button_code = '<Button-%s>' % ('2' if macosx.isAquaTk() else '3')
457+
self.assertIn(right_button_code, expandingbutton.bind())
457458

458459
@patch('idlelib.squeezer.Hovertip', autospec=Hovertip)
459460
def test_init_tooltip(self, MockHovertip):
@@ -564,13 +565,6 @@ def test_copy(self):
564565
self.assertEqual(expandingbutton.clipboard_append.call_count, 1)
565566
expandingbutton.clipboard_append.assert_called_with('TEXT')
566567

567-
def _file_cleanup(self, filename):
568-
if os.path.exists(filename):
569-
try:
570-
os.remove(filename)
571-
except OSError:
572-
pass
573-
574568
def test_preview(self):
575569
"""test the preview event"""
576570
squeezer = self.make_mock_squeezer()
@@ -587,3 +581,19 @@ def test_preview(self):
587581

588582
# check that the proper text was passed
589583
self.assertEqual(mock_view_text.call_args[0][2], 'TEXT')
584+
585+
def test_rmenu(self):
586+
"""test the context menu"""
587+
squeezer = self.make_mock_squeezer()
588+
expandingbutton = ExpandingButton('TEXT', 'TAGS', 50, squeezer)
589+
with patch('tkinter.Menu') as mock_Menu:
590+
mock_menu = Mock()
591+
mock_Menu.return_value = mock_menu
592+
mock_event = Mock()
593+
mock_event.x = 10
594+
mock_event.y = 10
595+
expandingbutton.context_menu_event(event=mock_event)
596+
self.assertEqual(mock_menu.add_command.call_count,
597+
len(expandingbutton.rmenu_specs))
598+
for label, *data in expandingbutton.rmenu_specs:
599+
mock_menu.add_command.assert_any_call(label=label, command=ANY)

Lib/idlelib/squeezer.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from idlelib.config import idleConf
2424
from idlelib.textview import view_text
2525
from idlelib.tooltip import Hovertip
26+
from idlelib import macosx
2627

2728

2829
def _add_to_rmenu(editwin, specs):
@@ -122,15 +123,17 @@ def __init__(self, s, tags, numoflines, squeezer):
122123

123124
if self.squeezer.should_show_tooltip:
124125
button_tooltip_text = (
125-
"Double-click to expand, middle-click to copy, " +
126-
"right-click to preview."
126+
"Double-click to expand, right-click for more options."
127127
)
128128
Hovertip(self, button_tooltip_text,
129129
hover_delay=self.squeezer.tooltip_delay)
130130

131131
self.bind("<Double-Button-1>", self.expand)
132-
self.bind("<Button-2>", self.copy)
133-
self.bind("<Button-3>", self.preview)
132+
if macosx.isAquaTk():
133+
# AquaTk defines <2> as the right button, not <3>.
134+
self.bind("<Button-2>", self.context_menu_event)
135+
else:
136+
self.bind("<Button-3>", self.context_menu_event)
134137
self.selection_handle(
135138
lambda offset, length: s[int(offset):int(offset) + int(length)])
136139

@@ -148,7 +151,7 @@ def set_is_dangerous(self):
148151
)
149152
)
150153

151-
def expand(self, event):
154+
def expand(self, event=None):
152155
"""expand event handler
153156
154157
This inserts the original text in place of the button in the Text
@@ -177,21 +180,35 @@ def expand(self, event):
177180
self.base_text.delete(self)
178181
self.squeezer.expandingbuttons.remove(self)
179182

180-
def copy(self, event):
183+
def copy(self, event=None):
181184
"""copy event handler
182185
183186
Copy the original text to the clipboard.
184187
"""
185188
self.clipboard_clear()
186189
self.clipboard_append(self.s)
187190

188-
def preview(self, event):
191+
def preview(self, event=None):
189192
"""preview event handler
190193
191194
View the original text in a separate text viewer window.
192195
"""
193196
view_text(self.text, "Squeezed Output Viewer", self.s, wrap='none')
194197

198+
rmenu_specs = (
199+
# item structure: (label, method_name)
200+
('copy', 'copy'),
201+
('preview', 'preview'),
202+
)
203+
204+
def context_menu_event(self, event):
205+
self.text.mark_set("insert", "@%d,%d" % (event.x, event.y))
206+
rmenu = tk.Menu(self.text, tearoff=0)
207+
for label, method_name in self.rmenu_specs:
208+
rmenu.add_command(label=label, command=getattr(self, method_name))
209+
rmenu.tk_popup(event.x_root, event.y_root)
210+
return "break"
211+
195212

196213
class Squeezer:
197214
"""Replace long outputs in the shell with a simple button.

0 commit comments

Comments
 (0)