# # # patch "src/view/dialogs/CheckoutRevision.cpp" # from [c7260153678322e42542431f32fd5d4b4d386bc2] # to [de2e69f03edb0666452374c0a97a80d50ea8e987] # # patch "src/view/dialogs/DatabaseDialogManager.cpp" # from [b4353b273d52faae3b84744adaeb69b3219919a8] # to [0d6ea129e2b2a9435c8a6313cad98c1cf093a970] # # patch "src/view/dialogs/DialogManager.cpp" # from [90d6052ad4732ea509b6c5b906236c8ab1429fcc] # to [e1a5206b9901d201692458e3e72719cb228ad917] # # patch "src/view/dialogs/DialogManager.h" # from [fadd225819f225b729781dfd66bd90f9f9f6164d] # to [0a0c6eab2209d8a96f277d922231e469a0521aa2] # # patch "src/view/dialogs/WorkspaceDialogManager.cpp" # from [9b2ce3991dc8eb8ba04599131783829dac1972f8] # to [2653389421d692448d35b2ce7e5ce14f769bbd99] # ============================================================ --- src/view/dialogs/CheckoutRevision.cpp c7260153678322e42542431f32fd5d4b4d386bc2 +++ src/view/dialogs/CheckoutRevision.cpp de2e69f03edb0666452374c0a97a80d50ea8e987 @@ -247,12 +247,6 @@ void CheckoutRevision::setSelectedRevisi void CheckoutRevision::setSelectedRevision(const QString & revision) { - if (!isHidden()) - { - raise(); - activateWindow(); - } - selectedRevision->setText(revision); } ============================================================ --- src/view/dialogs/DatabaseDialogManager.cpp b4353b273d52faae3b84744adaeb69b3219919a8 +++ src/view/dialogs/DatabaseDialogManager.cpp 0d6ea129e2b2a9435c8a6313cad98c1cf093a970 @@ -76,7 +76,7 @@ void DatabaseDialogManager::showChangese ); } - changesetBrowser->show(); + showDialog(changesetBrowser); } void DatabaseDialogManager::showCheckoutRevision() @@ -97,7 +97,7 @@ void DatabaseDialogManager::showCheckout ); } - checkoutRevision->show(); + showDialog(checkoutRevision); } void DatabaseDialogManager::showFileDiff(const QString & file, const QString & base, const QString & target) @@ -108,7 +108,7 @@ void DatabaseDialogManager::showFileDiff } fileDiff->forDatabase(databaseFile, file, base, target); - fileDiff->show(); + showDialog(fileDiff); } void DatabaseDialogManager::showFileHistory(const QString & file, const QString & startRevision) @@ -124,7 +124,7 @@ void DatabaseDialogManager::showFileHist } fileHistory->readHistory(file, startRevision); - fileHistory->show(); + showDialog(fileHistory); } void DatabaseDialogManager::showGenerateKeypair() @@ -142,7 +142,7 @@ void DatabaseDialogManager::showGenerate } } - generateKeypair->show(); + showDialog(generateKeypair); } void DatabaseDialogManager::showKeyManagement() @@ -153,7 +153,7 @@ void DatabaseDialogManager::showKeyManag } keyManagement->readKeys(); - keyManagement->show(); + showDialog(keyManagement); } void DatabaseDialogManager::showRevisionDiff(const QString & file, const QString & base, const QString & target) @@ -169,7 +169,7 @@ void DatabaseDialogManager::showRevision } revisionDiff->forDatabase(databaseFile, file, base, target); - revisionDiff->show(); + showDialog(revisionDiff); } void DatabaseDialogManager::showRevisionManifest(const QString & revision) @@ -185,7 +185,7 @@ void DatabaseDialogManager::showRevision } revisionManifest->readManifest(revision); - revisionManifest->show(); + showDialog(revisionManifest); } void DatabaseDialogManager::showSelectRevision(const QString & selector) @@ -218,6 +218,6 @@ void DatabaseDialogManager::showSelectRe selectRevision->queryRevisions(selector); } - selectRevision->show(); + showDialog(selectRevision); } ============================================================ --- src/view/dialogs/DialogManager.cpp 90d6052ad4732ea509b6c5b906236c8ab1429fcc +++ src/view/dialogs/DialogManager.cpp e1a5206b9901d201692458e3e72719cb228ad917 @@ -47,7 +47,7 @@ void DialogManager::showAbout() { about = new About(parentWidget()); } - about->show(); + showDialog(about); } void DialogManager::showPreferences() @@ -56,6 +56,73 @@ void DialogManager::showPreferences() { preferences = new Preferences(parentWidget()); } - preferences->show(); + showDialog(preferences); } +void DialogManager::showDialog(Dialog * dlg) +{ + if (!openDialogs.contains(dlg)) + { + connect( + dlg, SIGNAL(finished(int)), + this, SLOT(dialogFinished()) + ); + openDialogs.push(dlg); + } + + dlg->raise(); + dlg->activateWindow(); + dlg->show(); +} + +void DialogManager::dialogFinished() +{ + Dialog * dlg = qobject_cast(sender()); + I(openDialogs.contains(dlg)); + + disconnect( + dlg, SIGNAL(finished(int)), + this, SLOT(dialogFinished()) + ); + + // this is the simple case, the closed dialog is on top of the stack + if (openDialogs.top() == dlg) + { + openDialogs.pop(); + } + else + { + // Now apparently the user accepted / rejected a window from which he + // navigated to other windows. Since all of these are not modal, but + // show dependent information, we close them one after another. + // Since this triggers this slot again, we need to ensure before + // that this code path is aborted. + // FIXME: not sure this is really what users want, but we're cleaning + // up here for them... + while (true) + { + Dialog * other = openDialogs.pop(); + disconnect( + other, SIGNAL(finished(int)), + this, SLOT(dialogFinished()) + ); + other->reject(); + if (other == dlg) break; + } + } + + // is there anything to raise? + if (!openDialogs.isEmpty()) + { + Dialog * other = openDialogs.top(); + other->raise(); + other->activateWindow(); + } + else + { + QWidget * parent = parentWidget(); + parent->raise(); + parent->activateWindow(); + } +} + ============================================================ --- src/view/dialogs/DialogManager.h fadd225819f225b729781dfd66bd90f9f9f6164d +++ src/view/dialogs/DialogManager.h 0a0c6eab2209d8a96f277d922231e469a0521aa2 @@ -24,7 +24,6 @@ #include "About.h" #include "Preferences.h" -#include #include class DialogManager : public QObject @@ -42,12 +41,18 @@ protected: protected: QWidget * parentWidget() const; + void showDialog(Dialog *); About * about; Preferences * preferences; private: void cleanup(); + + QStack openDialogs; + +private slots: + void dialogFinished(); }; #endif ============================================================ --- src/view/dialogs/WorkspaceDialogManager.cpp 9b2ce3991dc8eb8ba04599131783829dac1972f8 +++ src/view/dialogs/WorkspaceDialogManager.cpp 2653389421d692448d35b2ce7e5ce14f769bbd99 @@ -66,7 +66,7 @@ void WorkspaceDialogManager::showCommitR ); } - commitRevision->show(); + showDialog(commitRevision); } void WorkspaceDialogManager::showFileDiff(const QString & file) @@ -82,7 +82,7 @@ void WorkspaceDialogManager::showFileDif } fileDiff->forWorkspace(workspacePath, file, base, target); - fileDiff->show(); + showDialog(fileDiff); } void WorkspaceDialogManager::showFileHistory(const QString & file) @@ -104,7 +104,7 @@ void WorkspaceDialogManager::showRevisio } revisionDiff->forWorkspace(workspacePath, file, base, target); - revisionDiff->show(); + showDialog(revisionDiff); } void WorkspaceDialogManager::showUnaccountedRenames(const QMap & renames) { @@ -136,6 +136,6 @@ void WorkspaceDialogManager::showUpdateW } } - updateWorkspace->show(); + showDialog(updateWorkspace); }