]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Ask for confirmation when Closing Dolphin windows with a terminal panel running a...
authorNate Graham <nate@kde.org>
Sat, 19 Jan 2019 15:11:26 +0000 (08:11 -0700)
committerNate Graham <nate@kde.org>
Sat, 19 Jan 2019 15:15:11 +0000 (08:15 -0700)
Summary:
Ask for confirmation when Closing Dolphin windows with a terminal panel running a program.

FEATURE: 304816
FIXED-IN: 19.04.0

Test Plan:
# Open terminal panel
# Run `watch ls`
# Close Dolphin
# Observe confirmation
# Disable confirmation
# Repeat, observe no confirmation
# Enable confirmation in the settings
# Repeat, observe a confirmation

Reviewers: #dolphin, markg, elvisangelaccio, rominf

Reviewed By: #dolphin, elvisangelaccio

Subscribers: kfm-devel, elvisangelaccio, markg, ngraham, rkflx, broulik, #dolphin

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D10960

src/dolphinmainwindow.cpp
src/panels/terminal/terminalpanel.cpp
src/panels/terminal/terminalpanel.h
src/settings/dolphin_generalsettings.kcfg
src/settings/general/confirmationssettingspage.cpp
src/settings/general/confirmationssettingspage.h

index ae586bc34527dc86b7eca29885cb01afa49c1904..ea19468f93277ec738cc1d9ce1b59ad96f6038bd 100644 (file)
@@ -407,7 +407,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
 
         bool doNotAskAgainCheckboxResult = false;
 
 
         bool doNotAskAgainCheckboxResult = false;
 
-        const int result = KMessageBox::createKMessageBox(dialog,
+        const auto result = KMessageBox::createKMessageBox(dialog,
             buttons,
             QMessageBox::Warning,
             i18n("You have multiple tabs open in this window, are you sure you want to quit?"),
             buttons,
             QMessageBox::Warning,
             i18n("You have multiple tabs open in this window, are you sure you want to quit?"),
@@ -434,6 +434,58 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
         }
     }
 
         }
     }
 
+    if (m_terminalPanel->hasProgramRunning() && GeneralSettings::confirmClosingTerminalRunningProgram() && closedByUser) {
+        // Ask if the user really wants to quit Dolphin with a program that is still running in the Terminal panel
+        // Open a confirmation dialog with 3 buttons:
+        // QDialogButtonBox::Yes    -> Quit
+        // QDialogButtonBox::No     -> Show Terminal Panel
+        // QDialogButtonBox::Cancel -> do nothing
+        QDialog *dialog = new QDialog(this, Qt::Dialog);
+        dialog->setWindowTitle(i18nc("@title:window", "Confirmation"));
+        dialog->setModal(true);
+        auto standardButtons = QDialogButtonBox::Yes | QDialogButtonBox::Cancel;
+        if (!m_terminalPanel->isVisible()) {
+            standardButtons |= QDialogButtonBox::No;
+        }
+        QDialogButtonBox *buttons = new QDialogButtonBox(standardButtons);
+        KGuiItem::assign(buttons->button(QDialogButtonBox::Yes), KStandardGuiItem::quit());
+        if (!m_terminalPanel->isVisible()) {
+            KGuiItem::assign(
+                    buttons->button(QDialogButtonBox::No),
+                    KGuiItem(i18n("Show &Terminal Panel"), QIcon::fromTheme(QStringLiteral("utilities-terminal"))));
+        }
+        KGuiItem::assign(buttons->button(QDialogButtonBox::Cancel), KStandardGuiItem::cancel());
+
+        bool doNotAskAgainCheckboxResult = false;
+
+        const auto result = KMessageBox::createKMessageBox(
+                dialog,
+                buttons,
+                QMessageBox::Warning,
+                i18n("The program '%1' is still running in the Terminal panel. Are you sure you want to quit?", m_terminalPanel->runningProgramName()),
+                QStringList(),
+                i18n("Do not ask again"),
+                &doNotAskAgainCheckboxResult,
+                KMessageBox::Dangerous);
+
+        if (doNotAskAgainCheckboxResult) {
+            GeneralSettings::setConfirmClosingTerminalRunningProgram(false);
+        }
+
+        switch (result) {
+            case QDialogButtonBox::Yes:
+                // Quit
+                break;
+            case QDialogButtonBox::No:
+                actionCollection()->action("show_terminal_panel")->trigger();
+                // Do not quit, ignore quit event
+                Q_FALLTHROUGH();
+            default:
+                event->ignore();
+                return;
+        }
+    }
+
     GeneralSettings::setVersion(CurrentDolphinVersion);
     GeneralSettings::self()->save();
 
     GeneralSettings::setVersion(CurrentDolphinVersion);
     GeneralSettings::self()->save();
 
index b6c30c29c36b45f9e4d8a1a19ac79c7cf6a17e9d..3377bab24af4c1b10fc5cc469ce4fb570098f9e9 100644 (file)
@@ -79,12 +79,12 @@ void TerminalPanel::terminalExited()
     emit hideTerminalPanel();
 }
 
     emit hideTerminalPanel();
 }
 
-bool TerminalPanel::isHiddenInVisibleWindow()
+bool TerminalPanel::isHiddenInVisibleWindow() const
 {
     return parentWidget()
         && parentWidget()->isHidden()
         && m_terminal
 {
     return parentWidget()
         && parentWidget()->isHidden()
         && m_terminal
-        && (m_terminal->foregroundProcessId() == -1);
+        && !hasProgramRunning();
 }
 
 void TerminalPanel::dockVisibilityChanged()
 }
 
 void TerminalPanel::dockVisibilityChanged()
@@ -107,13 +107,23 @@ void TerminalPanel::dockVisibilityChanged()
     }
 }
 
     }
 }
 
+QString TerminalPanel::runningProgramName() const
+{
+    return m_terminal ? m_terminal->foregroundProcessName() : QString();
+}
+
+bool TerminalPanel::hasProgramRunning() const
+{
+    return m_terminal && (m_terminal->foregroundProcessId() != -1);
+}
+
 bool TerminalPanel::urlChanged()
 {
     if (!url().isValid()) {
         return false;
     }
 
 bool TerminalPanel::urlChanged()
 {
     if (!url().isValid()) {
         return false;
     }
 
-    const bool sendInput = m_terminal && (m_terminal->foregroundProcessId() == -1) && isVisible();
+    const bool sendInput = m_terminal && !hasProgramRunning() && isVisible();
     if (sendInput) {
         changeDir(url());
     }
     if (sendInput) {
         changeDir(url());
     }
index a6f93d76721deb48ffd1f65f8a337d89acac32a0..f5d66e548ece30e5ed2fa4aaea250f2fa049f559 100644 (file)
@@ -55,7 +55,9 @@ public:
      */
     void goHome();
     QString currentWorkingDirectory();
      */
     void goHome();
     QString currentWorkingDirectory();
-    bool isHiddenInVisibleWindow();
+    bool isHiddenInVisibleWindow() const;
+    bool hasProgramRunning() const;
+    QString runningProgramName() const;
 
 public slots:
     void terminalExited();
 
 public slots:
     void terminalExited();
index 5878abcbe1f33a5eaa7a073e7b0de422f5ba6825..b06b3a1f3dc11dd494ab11aaf04c356ae342584d 100644 (file)
             <label>Ask for confirmation when closing windows with multiple tabs.</label>
             <default>true</default>
         </entry>
             <label>Ask for confirmation when closing windows with multiple tabs.</label>
             <default>true</default>
         </entry>
+        <entry name="ConfirmClosingTerminalRunningProgram" type="Bool">
+            <label>Ask for confirmation when closing windows with a program that is still running in the Terminal panel.</label>
+            <default>true</default>
+        </entry>
         <entry name="RenameInline" type="Bool">
             <label>Rename inline</label>
             <default>true</default>
         <entry name="RenameInline" type="Bool">
             <label>Rename inline</label>
             <default>true</default>
index b881b7a52fdbdf7e6bb7ec23d67c1c8c634acf4c..27e4ab662f2bd27e1d7af8c4e4d27ecf0c483e13 100644 (file)
@@ -40,6 +40,11 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
     m_confirmMoveToTrash(nullptr),
     m_confirmEmptyTrash(nullptr),
     m_confirmDelete(nullptr),
     m_confirmMoveToTrash(nullptr),
     m_confirmEmptyTrash(nullptr),
     m_confirmDelete(nullptr),
+
+    #ifndef Q_OS_WIN
+    m_confirmClosingTerminalRunningProgram(nullptr),
+    #endif
+
     m_confirmClosingMultipleTabs(nullptr)
 {
     QVBoxLayout* topLayout = new QVBoxLayout(this);
     m_confirmClosingMultipleTabs(nullptr)
 {
     QVBoxLayout* topLayout = new QVBoxLayout(this);
@@ -62,6 +67,11 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
     m_confirmClosingMultipleTabs = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when",
                                                        "Closing windows with multiple tabs"), this);
 
     m_confirmClosingMultipleTabs = new QCheckBox(i18nc("@option:check Ask for confirmation in Dolphin when",
                                                        "Closing windows with multiple tabs"), this);
 
+    #ifndef Q_OS_WIN
+    m_confirmClosingTerminalRunningProgram = new QCheckBox(i18nc("@option:check Ask for confirmation when",
+                                                       "Closing windows with a program running in the Terminal panel"), this);
+    #endif
+
     topLayout->addWidget(confirmLabelKde);
     topLayout->addWidget(m_confirmMoveToTrash);
     topLayout->addWidget(m_confirmEmptyTrash);
     topLayout->addWidget(confirmLabelKde);
     topLayout->addWidget(m_confirmMoveToTrash);
     topLayout->addWidget(m_confirmEmptyTrash);
@@ -70,6 +80,11 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
     topLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
     topLayout->addWidget(confirmLabelDolphin);
     topLayout->addWidget(m_confirmClosingMultipleTabs);
     topLayout->addSpacing(Dolphin::VERTICAL_SPACER_HEIGHT);
     topLayout->addWidget(confirmLabelDolphin);
     topLayout->addWidget(m_confirmClosingMultipleTabs);
+
+    #ifndef Q_OS_WIN
+    topLayout->addWidget(m_confirmClosingTerminalRunningProgram);
+    #endif
+
     topLayout->addStretch();
 
     loadSettings();
     topLayout->addStretch();
 
     loadSettings();
@@ -79,6 +94,10 @@ ConfirmationsSettingsPage::ConfirmationsSettingsPage(QWidget* parent) :
     connect(m_confirmDelete, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmScriptExecution, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmClosingMultipleTabs, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmDelete, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmScriptExecution, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
     connect(m_confirmClosingMultipleTabs, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
+
+    #ifndef Q_OS_WIN
+    connect(m_confirmClosingTerminalRunningProgram, &QCheckBox::toggled, this, &ConfirmationsSettingsPage::changed);
+    #endif
 }
 
 ConfirmationsSettingsPage::~ConfirmationsSettingsPage()
 }
 
 ConfirmationsSettingsPage::~ConfirmationsSettingsPage()
@@ -103,6 +122,11 @@ void ConfirmationsSettingsPage::applySettings()
 
     GeneralSettings* settings = GeneralSettings::self();
     settings->setConfirmClosingMultipleTabs(m_confirmClosingMultipleTabs->isChecked());
 
     GeneralSettings* settings = GeneralSettings::self();
     settings->setConfirmClosingMultipleTabs(m_confirmClosingMultipleTabs->isChecked());
+
+    #ifndef Q_OS_WIN
+    settings->setConfirmClosingTerminalRunningProgram(m_confirmClosingTerminalRunningProgram->isChecked());
+    #endif
+
     settings->save();
 }
 
     settings->save();
 }
 
@@ -132,5 +156,9 @@ void ConfirmationsSettingsPage::loadSettings()
     m_confirmScriptExecution->setChecked(value == QLatin1String("alwaysAsk"));
 
     m_confirmClosingMultipleTabs->setChecked(GeneralSettings::confirmClosingMultipleTabs());
     m_confirmScriptExecution->setChecked(value == QLatin1String("alwaysAsk"));
 
     m_confirmClosingMultipleTabs->setChecked(GeneralSettings::confirmClosingMultipleTabs());
+
+    #ifndef Q_OS_WIN
+    m_confirmClosingTerminalRunningProgram->setChecked(GeneralSettings::confirmClosingTerminalRunningProgram());
+    #endif
 }
 
 }
 
index 4cdb32b20040e5c1f144aea4ae9a85421dbe98c0..a96af554d530d8270e9e9a519ceb9cb80531b09a 100644 (file)
@@ -47,6 +47,11 @@ private:
     QCheckBox* m_confirmMoveToTrash;
     QCheckBox* m_confirmEmptyTrash;
     QCheckBox* m_confirmDelete;
     QCheckBox* m_confirmMoveToTrash;
     QCheckBox* m_confirmEmptyTrash;
     QCheckBox* m_confirmDelete;
+
+    #ifndef Q_OS_WIN
+    QCheckBox* m_confirmClosingTerminalRunningProgram;
+    #endif
+
     QCheckBox* m_confirmClosingMultipleTabs;
     QCheckBox* m_confirmScriptExecution;
 };
     QCheckBox* m_confirmClosingMultipleTabs;
     QCheckBox* m_confirmScriptExecution;
 };