mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-14 10:04:46 -07:00
Close the TabGames when closing the TabSupervisor (#5735)
* Close the `TabGame`s when closing the `TabSupervisor` This ensures that we go through the same code path (in terms of Qt events) when closing the whole supervisor as when closing a single tab. Also, use the `close` event instead of the `hide` event to detect when we are closing a game. Fixes #5697 * Compat with old Qt versions * Old Qt, reloaded * Review: use hideEvent and call super
This commit is contained in:
parent
57a8960841
commit
37382dea44
5 changed files with 47 additions and 27 deletions
|
|
@ -119,7 +119,6 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
|
||||||
refreshShortcuts();
|
refreshShortcuts();
|
||||||
messageLog->logReplayStarted(gameInfo.game_id());
|
messageLog->logReplayStarted(gameInfo.game_id());
|
||||||
|
|
||||||
this->installEventFilter(this);
|
|
||||||
QTimer::singleShot(0, this, SLOT(loadLayout()));
|
QTimer::singleShot(0, this, SLOT(loadLayout()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -164,7 +163,6 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor,
|
||||||
for (int i = gameInfo.game_types_size() - 1; i >= 0; i--)
|
for (int i = gameInfo.game_types_size() - 1; i >= 0; i--)
|
||||||
gameTypes.append(roomGameTypes.find(gameInfo.game_types(i)).value());
|
gameTypes.append(roomGameTypes.find(gameInfo.game_types(i)).value());
|
||||||
|
|
||||||
this->installEventFilter(this);
|
|
||||||
QTimer::singleShot(0, this, SLOT(loadLayout()));
|
QTimer::singleShot(0, this, SLOT(loadLayout()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1753,6 +1751,27 @@ void TabGame::createMessageDock(bool bReplay)
|
||||||
connect(messageLayoutDock, SIGNAL(topLevelChanged(bool)), this, SLOT(dockTopLevelChanged(bool)));
|
connect(messageLayoutDock, SIGNAL(topLevelChanged(bool)), this, SLOT(dockTopLevelChanged(bool)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TabGame::hideEvent(QHideEvent *event)
|
||||||
|
{
|
||||||
|
LayoutsSettings &layouts = SettingsCache::instance().layouts();
|
||||||
|
if (replay) {
|
||||||
|
layouts.setReplayPlayAreaState(saveState());
|
||||||
|
layouts.setReplayPlayAreaGeometry(saveGeometry());
|
||||||
|
layouts.setReplayCardInfoSize(cardInfoDock->size());
|
||||||
|
layouts.setReplayMessageLayoutSize(messageLayoutDock->size());
|
||||||
|
layouts.setReplayPlayerListSize(playerListDock->size());
|
||||||
|
layouts.setReplayReplaySize(replayDock->size());
|
||||||
|
} else {
|
||||||
|
layouts.setGamePlayAreaState(saveState());
|
||||||
|
layouts.setGamePlayAreaGeometry(saveGeometry());
|
||||||
|
layouts.setGameCardInfoSize(cardInfoDock->size());
|
||||||
|
layouts.setGameMessageLayoutSize(messageLayoutDock->size());
|
||||||
|
layouts.setGamePlayerListSize(playerListDock->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
Tab::hideEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
// Method uses to sync docks state with menu items state
|
// Method uses to sync docks state with menu items state
|
||||||
bool TabGame::eventFilter(QObject *o, QEvent *e)
|
bool TabGame::eventFilter(QObject *o, QEvent *e)
|
||||||
{
|
{
|
||||||
|
|
@ -1772,23 +1791,6 @@ bool TabGame::eventFilter(QObject *o, QEvent *e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (o == this && e->type() == QEvent::Hide) {
|
|
||||||
LayoutsSettings &layouts = SettingsCache::instance().layouts();
|
|
||||||
if (replay) {
|
|
||||||
layouts.setReplayPlayAreaState(saveState());
|
|
||||||
layouts.setReplayPlayAreaGeometry(saveGeometry());
|
|
||||||
layouts.setReplayCardInfoSize(cardInfoDock->size());
|
|
||||||
layouts.setReplayMessageLayoutSize(messageLayoutDock->size());
|
|
||||||
layouts.setReplayPlayerListSize(playerListDock->size());
|
|
||||||
layouts.setReplayReplaySize(replayDock->size());
|
|
||||||
} else {
|
|
||||||
layouts.setGamePlayAreaState(saveState());
|
|
||||||
layouts.setGamePlayAreaGeometry(saveGeometry());
|
|
||||||
layouts.setGameCardInfoSize(cardInfoDock->size());
|
|
||||||
layouts.setGameMessageLayoutSize(messageLayoutDock->size());
|
|
||||||
layouts.setGamePlayerListSize(playerListDock->size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -208,6 +208,7 @@ private slots:
|
||||||
void actResetLayout();
|
void actResetLayout();
|
||||||
void freeDocksSize();
|
void freeDocksSize();
|
||||||
|
|
||||||
|
void hideEvent(QHideEvent *event) override;
|
||||||
bool eventFilter(QObject *o, QEvent *e) override;
|
bool eventFilter(QObject *o, QEvent *e) override;
|
||||||
void dockVisibleTriggered();
|
void dockVisibleTriggered();
|
||||||
void dockFloatingTriggered();
|
void dockFloatingTriggered();
|
||||||
|
|
|
||||||
|
|
@ -232,22 +232,39 @@ void TabSupervisor::refreshShortcuts()
|
||||||
aTabLog->setShortcuts(shortcuts.getShortcut("Tabs/aTabLog"));
|
aTabLog->setShortcuts(shortcuts.getShortcut("Tabs/aTabLog"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TabSupervisor::closeRequest()
|
void TabSupervisor::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
|
// This will accept the event, which we may then override.
|
||||||
|
QTabWidget::closeEvent(event);
|
||||||
|
|
||||||
if (getGameCount()) {
|
if (getGameCount()) {
|
||||||
if (QMessageBox::question(this, tr("Are you sure?"),
|
if (QMessageBox::question(this, tr("Are you sure?"),
|
||||||
tr("There are still open games. Are you sure you want to quit?"),
|
tr("There are still open games. Are you sure you want to quit?"),
|
||||||
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
|
QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
|
||||||
return false;
|
event->ignore();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (AbstractTabDeckEditor *tab : deckEditorTabs) {
|
for (AbstractTabDeckEditor *tab : deckEditorTabs) {
|
||||||
if (!tab->confirmClose())
|
if (!tab->confirmClose()) {
|
||||||
return false;
|
event->ignore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
// Close the game tabs in order to make sure they store their layout.
|
||||||
|
QSet<int> gameTabsToRemove;
|
||||||
|
for (auto it = gameTabs.begin(), end = gameTabs.end(); it != end; ++it) {
|
||||||
|
if (it.value()->close()) {
|
||||||
|
gameTabsToRemove.insert(it.key());
|
||||||
|
} else {
|
||||||
|
event->ignore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto tabId : gameTabsToRemove) {
|
||||||
|
gameTabs.remove(tabId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractClient *TabSupervisor::getClient() const
|
AbstractClient *TabSupervisor::getClient() const
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ public:
|
||||||
return deckEditorTabs;
|
return deckEditorTabs;
|
||||||
}
|
}
|
||||||
bool getAdminLocked() const;
|
bool getAdminLocked() const;
|
||||||
bool closeRequest();
|
void closeEvent(QCloseEvent *event) override;
|
||||||
bool switchToGameTabIfAlreadyExists(const int gameId);
|
bool switchToGameTabIfAlreadyExists(const int gameId);
|
||||||
static void actShowPopup(const QString &message);
|
static void actShowPopup(const QString &message);
|
||||||
signals:
|
signals:
|
||||||
|
|
@ -192,4 +192,4 @@ private slots:
|
||||||
void processNotifyUserEvent(const Event_NotifyUser &event);
|
void processNotifyUserEvent(const Event_NotifyUser &event);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -1018,7 +1018,7 @@ void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
return;
|
return;
|
||||||
bClosingDown = true;
|
bClosingDown = true;
|
||||||
|
|
||||||
if (!tabSupervisor->closeRequest()) {
|
if (!tabSupervisor->close()) {
|
||||||
event->ignore();
|
event->ignore();
|
||||||
bClosingDown = false;
|
bClosingDown = false;
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue