@@ -26,6 +26,7 @@ limitations under the License.
2626#include < QDir>
2727#include < QDockWidget>
2828#include < QErrorMessage>
29+ #include < QEvent>
2930#include < QFileDialog>
3031#include < QFileInfo>
3132#include < QGuiApplication>
@@ -98,6 +99,12 @@ MainWindow::MainWindow(QWidget* parent)
9899 setupMapDock ();
99100 setupStatusBar ();
100101 checkForUpdates ();
102+
103+ // needed so Copy/Paste (triggered from the Edit menu) know which widget
104+ // was last being edited, since opening the menu steals keyboard focus
105+ _ui->charsetWidget ->installEventFilter (this );
106+ _ui->tilesetWidget ->installEventFilter (this );
107+ _ui->mapWidget ->installEventFilter (this );
101108}
102109
103110MainWindow::~MainWindow ()
@@ -246,6 +253,15 @@ void MainWindow::closeEvent(QCloseEvent* event)
246253 }
247254}
248255
256+ bool MainWindow::eventFilter (QObject* watched, QEvent* event)
257+ {
258+ if (event->type () == QEvent::FocusIn
259+ && (watched == _ui->charsetWidget || watched == _ui->tilesetWidget || watched == _ui->mapWidget )) {
260+ _lastFocusedEditorWidget = qobject_cast<QWidget*>(watched);
261+ }
262+ return QMainWindow::eventFilter (watched, event);
263+ }
264+
249265void MainWindow::createUndoView ()
250266{
251267 auto undoDock = new QDockWidget (tr (" Undo List" ), this );
@@ -1268,8 +1284,8 @@ void MainWindow::on_actionPaste_triggered()
12681284 // src: TILES dst: Charset / Tileset
12691285 // src: MAP dst: Map
12701286 if (!(((range->type == State::CopyRange::CHARS || range->type == State::CopyRange::TILES )
1271- && (_ui->charsetWidget -> hasFocus () || _ui->tilesetWidget -> hasFocus () ))
1272- || (range->type == State::CopyRange::MAP && _ui->mapWidget -> hasFocus () ))) {
1287+ && (_lastFocusedEditorWidget == _ui->charsetWidget || _lastFocusedEditorWidget == _ui->tilesetWidget ))
1288+ || (range->type == State::CopyRange::MAP && _lastFocusedEditorWidget == _ui->mapWidget ))) {
12731289 QApplication::beep ();
12741290 return ;
12751291 }
@@ -1579,11 +1595,11 @@ State* MainWindow::getState() const
15791595State::CopyRange MainWindow::bufferToClipboard (State* state) const
15801596{
15811597 State::CopyRange copyRange = {};
1582- if (_ui->charsetWidget -> hasFocus () ) {
1598+ if (_lastFocusedEditorWidget == _ui->charsetWidget ) {
15831599 _ui->charsetWidget ->getSelectionRange (©Range);
1584- } else if (_ui->tilesetWidget -> hasFocus () ) {
1600+ } else if (_lastFocusedEditorWidget == _ui->tilesetWidget ) {
15851601 _ui->tilesetWidget ->getSelectionRange (©Range);
1586- } else if (_ui->mapWidget -> hasFocus () ) {
1602+ } else if (_lastFocusedEditorWidget == _ui->mapWidget ) {
15871603 _ui->mapWidget ->getSelectionRange (©Range);
15881604 } else {
15891605 copyRange.offset = -1 ;
0 commit comments