diff --git a/NEWS.md b/NEWS.md
index 3d1e0854d..d8e111d67 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -9,6 +9,8 @@
file names selected for saving on platforms that don't add one itself
(e.g. GNOME). For example, when saving multiplexer settings the extension
`.mtxcfg` will be added. Implements #2983.
+* MKVToolNix GUI: added an option to the preferences for the window to stay on
+ top of other windows. Implements #2967.
## Bug fixes
diff --git a/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui b/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui
index 2c4869991..35c59e2d0 100644
--- a/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui
+++ b/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui
@@ -133,6 +133,13 @@
+ -
+
+
+ Stay on top of other &windows
+
+
+
-
@@ -2158,6 +2165,7 @@
cbGuiInterfaceLanguage
fcbGuiFontFamily
sbGuiFontPointSize
+ cbGuiStayOnTop
cbGuiDisableHighDPIScaling
cbGuiDisableDarkStyleSheet
cbGuiDisableToolTips
diff --git a/src/mkvtoolnix-gui/main_window/main_window.cpp b/src/mkvtoolnix-gui/main_window/main_window.cpp
index 268dfb82b..8e59d5af2 100644
--- a/src/mkvtoolnix-gui/main_window/main_window.cpp
+++ b/src/mkvtoolnix-gui/main_window/main_window.cpp
@@ -86,6 +86,7 @@ MainWindow::MainWindow(QWidget *parent)
p->ui->setupUi(this);
setToolSelectorVisibility();
+ setStayOnTopStatus();
setupAuxiliaryWidgets();
setupToolSelector();
setupHelpURLs();
@@ -225,6 +226,7 @@ MainWindow::setupConnections() {
// Auxiliary actions:
connect(this, &MainWindow::preferencesChanged, this, &MainWindow::setToolSelectorVisibility);
+ connect(this, &MainWindow::preferencesChanged, this, &MainWindow::setStayOnTopStatus);
connect(this, &MainWindow::preferencesChanged, app, &App::reinitializeLanguageLists);
connect(this, &MainWindow::preferencesChanged, app, &App::setupAppearance);
@@ -630,6 +632,19 @@ MainWindow::setToolSelectorVisibility() {
p->ui->tool->tabBar()->setVisible(Util::Settings::get().m_showToolSelector);
}
+void
+MainWindow::setStayOnTopStatus() {
+ auto oldFlags = windowFlags();
+ auto newFlags = Util::Settings::get().m_uiStayOnTop ? oldFlags | Qt::WindowStaysOnTopHint
+ : oldFlags & ~Qt::WindowStaysOnTopHint;
+
+ if (oldFlags == newFlags)
+ return;
+
+ setWindowFlags(newFlags);
+ show();
+}
+
std::optional
MainWindow::filterWheelEventForStrongFocus(QObject *watched,
QEvent *event) {
diff --git a/src/mkvtoolnix-gui/main_window/main_window.h b/src/mkvtoolnix-gui/main_window/main_window.h
index 58191aac2..060c67908 100644
--- a/src/mkvtoolnix-gui/main_window/main_window.h
+++ b/src/mkvtoolnix-gui/main_window/main_window.h
@@ -83,6 +83,7 @@ public Q_SLOTS:
virtual void showCodeOfConduct();
virtual void showSystemInformation();
virtual void setToolSelectorVisibility();
+ virtual void setStayOnTopStatus();
virtual void raiseAndActivate();
#if defined(HAVE_UPDATE_CHECK)
diff --git a/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp b/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp
index de9bf5003..21d602c15 100644
--- a/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp
+++ b/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp
@@ -853,6 +853,8 @@ PreferencesDialog::setupFontAndScaling() {
#if !defined(SYS_WINDOWS)
ui->cbGuiDisableDarkStyleSheet->setVisible(false);
#endif
+
+ ui->cbGuiStayOnTop->setChecked(m_cfg.m_uiStayOnTop);
}
void
@@ -863,6 +865,7 @@ PreferencesDialog::save() {
m_cfg.m_bcp47LanguageEditingMode = static_cast(ui->cbGuiBCP47LanguageEditingMode->currentData().toInt());
m_cfg.m_uiFontFamily = ui->fcbGuiFontFamily->currentFont().family();
m_cfg.m_uiFontPointSize = ui->sbGuiFontPointSize->value();
+ m_cfg.m_uiStayOnTop = ui->cbGuiStayOnTop->isChecked();
m_cfg.m_uiDisableHighDPIScaling = ui->cbGuiDisableHighDPIScaling->isChecked();
m_cfg.m_uiDisableDarkStyleSheet = ui->cbGuiDisableDarkStyleSheet->isChecked();
m_cfg.m_uiDisableToolTips = ui->cbGuiDisableToolTips->isChecked();
diff --git a/src/mkvtoolnix-gui/util/settings.cpp b/src/mkvtoolnix-gui/util/settings.cpp
index e1f327745..81f36c9af 100644
--- a/src/mkvtoolnix-gui/util/settings.cpp
+++ b/src/mkvtoolnix-gui/util/settings.cpp
@@ -409,6 +409,7 @@ Settings::load() {
m_uiDisableToolTips = reg.value(s_valUiDisableToolTips).toBool();
m_uiFontFamily = reg.value(s_valUiFontFamily, defaultFont.family()).toString();
m_uiFontPointSize = reg.value(s_valUiFontPointSize, defaultFont.pointSize()).toInt();
+ m_uiStayOnTop = reg.value(s_valUiStayOnTop, false).toBool();
reg.beginGroup(s_grpUpdates);
m_checkForUpdates = reg.value(s_valCheckForUpdates, true).toBool();
@@ -761,6 +762,7 @@ Settings::save()
reg.setValue(s_valUiDisableToolTips, m_uiDisableToolTips);
reg.setValue(s_valUiFontFamily, m_uiFontFamily);
reg.setValue(s_valUiFontPointSize, m_uiFontPointSize);
+ reg.setValue(s_valUiStayOnTop, m_uiStayOnTop);
reg.setValue(s_valMediaInfoExe, m_mediaInfoExe);
diff --git a/src/mkvtoolnix-gui/util/settings.h b/src/mkvtoolnix-gui/util/settings.h
index 0061a0e16..cfdf92624 100644
--- a/src/mkvtoolnix-gui/util/settings.h
+++ b/src/mkvtoolnix-gui/util/settings.h
@@ -194,6 +194,7 @@ public:
bool m_showToolSelector, m_warnBeforeClosingModifiedTabs, m_warnBeforeAbortingJobs, m_warnBeforeOverwriting, m_showMoveUpDownButtons;
QString m_uiLocale, m_uiFontFamily;
int m_uiFontPointSize;
+ bool m_uiStayOnTop;
bool m_enableMuxingTracksByLanguage, m_enableMuxingAllVideoTracks, m_enableMuxingAllAudioTracks, m_enableMuxingAllSubtitleTracks;
QStringList m_enableMuxingTracksByTheseLanguages;
diff --git a/src/mkvtoolnix-gui/util/settings_names.h b/src/mkvtoolnix-gui/util/settings_names.h
index 5bf80ef08..cd9376805 100644
--- a/src/mkvtoolnix-gui/util/settings_names.h
+++ b/src/mkvtoolnix-gui/util/settings_names.h
@@ -118,6 +118,7 @@ char const * const s_valUiDisableHighDPIScaling = "uiDisableHighDPIS
char const * const s_valUiDisableToolTips = "uiDisableToolTips";
char const * const s_valUiFontFamily = "uiFontFamily";
char const * const s_valUiFontPointSize = "uiFontPointSize";
+char const * const s_valUiStayOnTop = "uiStayOnTop";
char const * const s_valUiLocale = "uiLocale";
char const * const s_valUniqueOutputFileNames = "uniqueOutputFileNames";
char const * const s_valUseDefaultJobDescription = "useDefaultJobDescription";