summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lockwidget.cpp73
-rw-r--r--src/lockwidget.h2
-rw-r--r--src/mainwindow.cpp6
-rw-r--r--src/modinfodialogconflicts.cpp6
-rw-r--r--src/processrunner.cpp25
-rw-r--r--src/processrunner.h13
6 files changed, 75 insertions, 50 deletions
diff --git a/src/lockwidget.cpp b/src/lockwidget.cpp
index 720cac36..ad9aefe3 100644
--- a/src/lockwidget.cpp
+++ b/src/lockwidget.cpp
@@ -59,17 +59,22 @@ LockWidget::Results LockWidget::result() const
void LockWidget::createUi(Reasons reason)
{
- if (m_parent) {
- m_overlay.reset(createTransparentWidget(m_parent));
+ QWidget* overlayTarget = m_parent;
+ if (auto* w = qApp->activeWindow()) {
+ overlayTarget = w;
+ }
+
+ if (overlayTarget) {
+ m_overlay.reset(createTransparentWidget(overlayTarget));
m_overlay->setWindowFlags(m_overlay->windowFlags() & Qt::FramelessWindowHint);
- m_overlay->setGeometry(m_parent->rect());
+ m_overlay->setGeometry(overlayTarget->rect());
} else {
m_overlay.reset(new QDialog);
}
auto* center = new QFrame;
- if (m_parent) {
+ if (overlayTarget) {
center->setFrameStyle(QFrame::StyledPanel);
center->setLineWidth(1);
center->setAutoFillBackground(true);
@@ -86,7 +91,7 @@ void LockWidget::createUi(Reasons reason)
auto* ly = new QVBoxLayout(center);
- if (!m_parent) {
+ if (!overlayTarget) {
ly->setContentsMargins(0, 0, 0, 0);
}
@@ -115,7 +120,7 @@ void LockWidget::createUi(Reasons reason)
case OutputRequired:
{
message->setText(QObject::tr(
- "The executable must run to completion because a its output is "
+ "The executable must run to completion because its output is "
"required."));
auto* unlockButton = new QPushButton(QObject::tr("Unlock"));
@@ -149,7 +154,7 @@ void LockWidget::createUi(Reasons reason)
grid->addWidget(createTransparentWidget(), 1, 2);
grid->addWidget(center, 1, 1);
- if (!m_parent) {
+ if (!overlayTarget) {
grid->setContentsMargins(0, 0, 0, 0);
}
@@ -160,10 +165,10 @@ void LockWidget::createUi(Reasons reason)
disableAll();
- if (m_parent) {
+ if (overlayTarget) {
m_filter.reset(new Filter);
- m_filter->resized = [=]{ m_overlay->setGeometry(m_parent->rect()); };
- m_parent->installEventFilter(m_filter.get());
+ m_filter->resized = [=]{ m_overlay->setGeometry(overlayTarget->rect()); };
+ overlayTarget->installEventFilter(m_filter.get());
}
m_overlay->setFocusPolicy(Qt::TabFocus);
@@ -184,32 +189,48 @@ void LockWidget::onCancel()
unlock();
}
+template <class T>
+QList<T> findChildrenImmediate(QWidget* parent)
+{
+ return parent->findChildren<T>(QString(), Qt::FindDirectChildrenOnly);
+}
+
void LockWidget::disableAll()
{
- if (!m_parent) {
- // nothing to disable without a main window
- return;
- }
+ const auto topLevels = QApplication::topLevelWidgets();
- if (auto* mw=dynamic_cast<QMainWindow*>(m_parent)) {
- disable(mw->centralWidget());
- disable(mw->menuBar());
- disable(mw->statusBar());
- }
+ for (auto* w : topLevels) {
+ if (auto* mw=dynamic_cast<QMainWindow*>(w)) {
+ disable(mw->centralWidget());
+ disable(mw->menuBar());
+ disable(mw->statusBar());
- for (auto* tb : m_parent->findChildren<QToolBar*>()) {
- disable(tb);
- }
+ for (auto* tb : findChildrenImmediate<QToolBar*>(w)) {
+ disable(tb);
+ }
+
+ for (auto* d : findChildrenImmediate<QDockWidget*>(w)) {
+ disable(d);
+ }
+ }
- for (auto* d : m_parent->findChildren<QDockWidget*>()) {
- disable(d);
+ if (auto* d=dynamic_cast<QDialog*>(w)) {
+ // no central widget, just disable the children, except for the overlay
+ for (auto* child : findChildrenImmediate<QWidget*>(d)) {
+ if (child != m_overlay.get()) {
+ disable(child);
+ }
+ }
+ }
}
}
void LockWidget::enableAll()
{
- for (auto* w : m_disabled) {
- w->setEnabled(true);
+ for (auto w : m_disabled) {
+ if (w) {
+ w->setEnabled(true);
+ }
}
m_disabled.clear();
diff --git a/src/lockwidget.h b/src/lockwidget.h
index bfb0b30f..9c555ac9 100644
--- a/src/lockwidget.h
+++ b/src/lockwidget.h
@@ -55,7 +55,7 @@ private:
QLabel* m_info;
Results m_result;
std::unique_ptr<Filter> m_filter;
- std::vector<QWidget*> m_disabled;
+ std::vector<QPointer<QWidget>> m_disabled;
void createUi(Reasons reason);
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 7d3d20b3..63f6c680 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -5422,7 +5422,11 @@ void MainWindow::openDataFile()
const QString path = m_ContextItem->data(0, Qt::UserRole).toString();
const QFileInfo targetInfo(path);
- m_OrganizerCore.processRunner().runFile(this, targetInfo);
+
+ m_OrganizerCore.processRunner()
+ .setFromFile(this, targetInfo)
+ .setWaitForCompletion(ProcessRunner::NoRefresh)
+ .run();
}
void MainWindow::openDataOriginExplorer_clicked()
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index 758112cc..8aefd4c6 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -527,7 +527,11 @@ void ConflictsTab::openItems(QTreeView* tree)
// the menu item is only shown for a single selection, but handle all of them
// in case this changes
for_each_in_selection(tree, [&](const ConflictItem* item) {
- core().processRunner().runFile(parentWidget(), item->fileName());
+ core().processRunner()
+ .setFromFile(parentWidget(), item->fileName())
+ .setWaitForCompletion(ProcessRunner::NoRefresh)
+ .run();
+
return true;
});
}
diff --git a/src/processrunner.cpp b/src/processrunner.cpp
index 62c77efc..1d9da96b 100644
--- a/src/processrunner.cpp
+++ b/src/processrunner.cpp
@@ -368,7 +368,7 @@ void SpawnedProcess::destroy()
ProcessRunner::ProcessRunner(OrganizerCore& core, IUserInterface* ui) :
- m_core(core), m_ui(ui), m_lock(LockWidget::NoReason), m_refresh(false),
+ m_core(core), m_ui(ui), m_lock(LockWidget::NoReason), m_refresh(NoRefresh),
m_handle(INVALID_HANDLE_VALUE), m_exitCode(-1)
{
m_sp.hooked = true;
@@ -417,10 +417,10 @@ ProcessRunner& ProcessRunner::setProfileName(const QString& profileName)
}
ProcessRunner& ProcessRunner::setWaitForCompletion(
- LockWidget::Reasons reason, bool refresh)
+ RefreshModes refresh, LockWidget::Reasons reason)
{
- m_lock = reason;
m_refresh = refresh;
+ m_lock = reason;
return *this;
}
@@ -655,7 +655,7 @@ ProcessRunner::Results ProcessRunner::run()
const auto r = waitForProcessCompletionWithLock(
m_handle, &m_exitCode, m_lock);
- if (r == Completed && m_refresh) {
+ if (r == Completed && m_refresh == Refresh) {
m_core.afterRun(m_sp.binary, m_exitCode);
}
@@ -669,15 +669,6 @@ DWORD ProcessRunner::exitCode()
}
-bool ProcessRunner::runFile(QWidget* parent, const QFileInfo& targetInfo)
-{
- setFromFile(parent, targetInfo);
- setWaitForCompletion(LockWidget::LockUI, true);
-
- const auto r = run();
- return (r != Error);
-}
-
bool ProcessRunner::runExecutableFile(
const QFileInfo &binary, const QString &arguments,
const QDir &currentDirectory, const QString &steamAppID,
@@ -691,7 +682,7 @@ bool ProcessRunner::runExecutableFile(
setSteamID(steamAppID);
setCustomOverwrite(customOverwrite);
setForcedLibraries(forcedLibraries);
- setWaitForCompletion(LockWidget::LockUI, refresh);
+ setWaitForCompletion(refresh ? Refresh : NoRefresh);
const auto r = run();
return (r != Error);
@@ -700,7 +691,7 @@ bool ProcessRunner::runExecutableFile(
bool ProcessRunner::runExecutable(const Executable& exe, bool refresh)
{
setFromExecutable(exe);
- setWaitForCompletion(LockWidget::LockUI, refresh);
+ setWaitForCompletion(refresh ? Refresh : NoRefresh);
const auto r = run();
return (r != Error);
@@ -709,7 +700,7 @@ bool ProcessRunner::runExecutable(const Executable& exe, bool refresh)
bool ProcessRunner::runShortcut(const MOShortcut& shortcut)
{
setFromShortcut(shortcut);
- setWaitForCompletion(LockWidget::LockUI, false);
+ setWaitForCompletion(NoRefresh);
const auto r = run();
return (r != Error);
@@ -724,7 +715,7 @@ HANDLE ProcessRunner::runExecutableOrExecutableFile(
executable, args, cwd, profileOverride, forcedCustomOverwrite,
ignoreCustomOverwrite);
- setWaitForCompletion(LockWidget::LockUI, true);
+ setWaitForCompletion(Refresh);
run();
return m_handle;
diff --git a/src/processrunner.h b/src/processrunner.h
index b7895903..21840bfe 100644
--- a/src/processrunner.h
+++ b/src/processrunner.h
@@ -44,6 +44,12 @@ public:
ForceUnlocked
};
+ enum RefreshModes
+ {
+ NoRefresh = 1,
+ Refresh
+ };
+
using ForcedLibraries = QList<MOBase::ExecutableForcedLoadSetting>;
ProcessRunner(OrganizerCore& core, IUserInterface* ui);
@@ -55,7 +61,8 @@ public:
ProcessRunner& setCustomOverwrite(const QString& customOverwrite);
ProcessRunner& setForcedLibraries(const ForcedLibraries& forcedLibraries);
ProcessRunner& setProfileName(const QString& profileName);
- ProcessRunner& setWaitForCompletion(LockWidget::Reasons reason, bool refresh);
+ ProcessRunner& setWaitForCompletion(
+ RefreshModes refresh, LockWidget::Reasons reason=LockWidget::LockUI);
ProcessRunner& setFromFile(QWidget* parent, const QFileInfo& targetInfo);
ProcessRunner& setFromExecutable(const Executable& exe);
@@ -73,8 +80,6 @@ public:
DWORD exitCode();
- bool runFile(QWidget* parent, const QFileInfo& targetInfo);
-
bool runExecutableFile(
const QFileInfo &binary, const QString &arguments,
const QDir &currentDirectory, const QString &steamAppID={},
@@ -108,7 +113,7 @@ private:
ForcedLibraries m_forcedLibraries;
QString m_profileName;
LockWidget::Reasons m_lock;
- bool m_refresh;
+ RefreshModes m_refresh;
QString m_shellOpen;
HANDLE m_handle;
DWORD m_exitCode;