Skip to content

Commit a308348

Browse files
jnhyperionJohnny Huang
andauthored
Fixed: (#2216)
1. On Mac OS, copy/paste/cut not working in grid cell edit mode 2. Cannot save modifications in grid cell edit mode via shortcut 3. On Windows, performing menu action "cut" in grid cell edit mode will raise exception 4. Typos in actiontriggers.py Co-authored-by: Johnny Huang <[email protected]>
1 parent 840fcfd commit a308348

File tree

5 files changed

+43
-21
lines changed

5 files changed

+43
-21
lines changed

src/robotide/editor/clipboard.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515

1616
import os
1717
import wx
18-
from robotide.context import IS_WINDOWS
18+
from robotide.context import IS_WINDOWS, IS_MAC
1919

2020

2121
class _ClipboardHandler(object):
@@ -100,13 +100,20 @@ def cut(self):
100100
if self._edit_control_shown():
101101
self._get_edit_control().Cut()
102102
else:
103-
_ClipboardHandler.copy(self)
103+
_ClipboardHandler.cut(self)
104104

105105
def _paste_to_cell_editor(self):
106106
self._get_edit_control().Paste()
107107

108+
def paste(self):
109+
if self._edit_control_shown():
110+
self._paste_to_cell_editor()
111+
else:
112+
_ClipboardHandler.paste(self)
113+
108114

109-
ClipboardHandler = IS_WINDOWS and _WindowsClipboardHandler or _ClipboardHandler
115+
# for now mac clipboard handler is the same with windows
116+
ClipboardHandler = _WindowsClipboardHandler if IS_WINDOWS or IS_MAC else _ClipboardHandler
110117

111118

112119
class _GridClipboard(object):

src/robotide/editor/kweditor.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
InsertArea
2828
from robotide.controller.cellinfo import TipMessage, ContentType, CellType
2929
from robotide.publish import (RideItemStepsChanged, RideSaved,
30-
RideSettingsChanged, PUBLISHER)
30+
RideSettingsChanged, PUBLISHER, RideBeforeSaving)
3131
from robotide.usages.UsageRunner import Usages, VariableUsages
3232
from robotide.ui.progress import RenameProgressObserver
3333
from robotide import robotapi, utils
@@ -103,6 +103,7 @@ def __init__(self, parent, controller, tree):
103103
self._counter = 0 # Workaround for double delete actions
104104
self._dcells = None # Workaround for double delete actions
105105
self._icells = None # Workaround for double insert actions
106+
PUBLISHER.subscribe(self._before_saving, RideBeforeSaving)
106107
PUBLISHER.subscribe(self._data_changed, RideItemStepsChanged)
107108
PUBLISHER.subscribe(self.OnSettingsChanged, RideSettingsChanged)
108109
PUBLISHER.subscribe(self._resize_grid, RideSaved)
@@ -361,6 +362,14 @@ def _select_rows(self, rows):
361362
def OnMotion(self, event):
362363
pass
363364

365+
def _before_saving(self, data):
366+
if self.IsCellEditControlShown():
367+
# Fix: cannot save modifications in edit mode
368+
# Exit edit mode before saving
369+
self.HideCellEditControl()
370+
self.SaveEditControlValue()
371+
self.SetFocus()
372+
364373
def _data_changed(self, data):
365374
if self._controller == data.item:
366375
self._write_steps(data.item)
@@ -437,18 +446,16 @@ def OnCut(self, event=None):
437446
self.OnDelete(event)
438447

439448
def OnDelete(self, event=None):
440-
_iscelleditcontrolshown = self.IsCellEditControlShown()
441-
if _iscelleditcontrolshown: # TODO Review if still needed
442-
# On Windows, Delete key does not work in TextCtrl automatically
443-
self.delete()
444-
elif self.has_focus():
445-
self._execute(ClearArea(self.selection.topleft,
446-
self.selection.bottomright))
449+
self._execute(ClearArea(self.selection.topleft,
450+
self.selection.bottomright))
447451
self._resize_grid()
448452

449453
# DEBUG @requires_focus
450454
def OnPaste(self, event=None):
451-
self._execute_clipboard_command(PasteArea)
455+
if self.IsCellEditControlShown():
456+
self.paste()
457+
else:
458+
self._execute_clipboard_command(PasteArea)
452459
self._resize_grid()
453460

454461
def _execute_clipboard_command(self, command_class):
@@ -487,6 +494,7 @@ def OnRedo(self, event=None):
487494
def close(self):
488495
self._colorizer.close()
489496
self.save()
497+
PUBLISHER.unsubscribe(self._before_saving, RideBeforeSaving)
490498
PUBLISHER.unsubscribe(self._data_changed, RideItemStepsChanged)
491499
if self._namespace_updated:
492500
# Prevent re-entry to unregister method
@@ -942,11 +950,11 @@ def EndEdit(self, row, col, grid, *ignored):
942950
def ApplyEdit(self, row, col, grid):
943951
val = self._tc.GetValue()
944952
grid.GetTable().SetValue(row, col, val) # update the table
945-
946953
self._original_value = ''
947954
self._tc.SetValue('')
948-
if self._value and val != '': # DEBUG Fix #1967 crash when click other cell
949-
self._grid.cell_value_edited(row, col, self._value)
955+
# if self._value and val != '': # DEBUG Fix #1967 crash when click other cell
956+
# this will cause deleting all text in edit mode not working
957+
self._grid.cell_value_edited(row, col, self._value)
950958

951959
def _get_value(self):
952960
suggestion = self._tc.content_assist_value()

src/robotide/publish/messages.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,11 @@ class RideSaving(RideMessage):
237237
data = ['path', 'datafile']
238238

239239

240+
class RideBeforeSaving(RideMessage):
241+
"""Sent before files are going to be saved."""
242+
pass
243+
244+
240245
class RideSaved(RideMessage):
241246
"""Sent after the file has been actually saved to disk."""
242247
data = ['path']

src/robotide/ui/actiontriggers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ def _get_name(self, action, build_new):
131131
return '%s' % get_name(action.name)
132132

133133
def _create_menu_item(self, action):
134-
name_with_accerelator = self._get_name(action, build_new=True)
135-
menu_item = MenuItem(self._frame, self, name_with_accerelator)
134+
name_with_accelerator = self._get_name(action, build_new=True)
135+
menu_item = MenuItem(self._frame, self, name_with_accelerator)
136136
pos = action.get_insertion_index(self.wx_menu)
137137
wx_menu_item = self.wx_menu.Insert(pos, menu_item.id,
138138
menu_item.name, action.doc)
@@ -282,15 +282,15 @@ def register(self, action):
282282
action.shortcut))
283283
delegator.add(action)
284284
action.register(self)
285-
self._update_accerelator_table()
285+
self._update_accelerator_table()
286286

287287
def unregister(self, action):
288288
key = action.get_shortcut()
289289
if self._actions[key].remove(action):
290290
del(self._actions[key])
291-
self._update_accerelator_table()
291+
self._update_accelerator_table()
292292

293-
def _update_accerelator_table(self):
293+
def _update_accelerator_table(self):
294294
accelerators = []
295295
for delegator in self._actions.values():
296296
try:

src/robotide/ui/mainframe.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from robotide.context import ABOUT_RIDE, SHORTCUT_KEYS
2323
from robotide.controller.ctrlcommands import SaveFile, SaveAll
2424
from robotide.publish import RideSaveAll, RideClosing, RideSaved, PUBLISHER,\
25-
RideInputValidationError, RideTreeSelection, RideModificationPrevented
25+
RideInputValidationError, RideTreeSelection, RideModificationPrevented, RideBeforeSaving
2626
from robotide.ui.tagdialogs import ViewAllTagsDialog
2727
from robotide.ui.filedialogs import RobotFilePathDialog
2828
from robotide.utils import RideEventHandler
@@ -475,9 +475,11 @@ def OnOpenDirectory(self, event):
475475
self.open_suite(path)
476476

477477
def OnSave(self, event):
478+
RideBeforeSaving().publish()
478479
self.save()
479480

480481
def OnSaveAll(self, event):
482+
RideBeforeSaving().publish()
481483
self.save_all()
482484

483485
def save_all(self):

0 commit comments

Comments
 (0)