Skip to content

Commit

Permalink
Don't silently close QGIS with unsaved changes in the console script
Browse files Browse the repository at this point in the history
editors

Instead prompt the user what to do with these changes

Fixes #38529
  • Loading branch information
nyalldawson committed Oct 6, 2020
1 parent df6c8d7 commit 9093bdf
Showing 1 changed file with 48 additions and 2 deletions.
50 changes: 48 additions & 2 deletions python/console/console.py
Expand Up @@ -23,14 +23,23 @@
from qgis.PyQt.QtCore import Qt, QTimer, QCoreApplication, QSize, QByteArray, QFileInfo, QUrl, QDir
from qgis.PyQt.QtWidgets import QToolBar, QToolButton, QWidget, QSplitter, QTreeWidget, QAction, QFileDialog, QCheckBox, QSizePolicy, QMenu, QGridLayout, QApplication, QShortcut
from qgis.PyQt.QtGui import QDesktopServices, QKeySequence
from qgis.PyQt.QtWidgets import QVBoxLayout
from qgis.PyQt.QtWidgets import (
QVBoxLayout,
QMessageBox
)
from qgis.utils import iface
from .console_sci import ShellScintilla
from .console_output import ShellOutputScintilla
from .console_editor import EditorTabWidget
from .console_settings import ConsoleOptionsFactory
from qgis.core import Qgis, QgsApplication, QgsSettings
from qgis.gui import QgsFilterLineEdit, QgsHelp, QgsDockWidget, QgsGui
from qgis.gui import (
QgsFilterLineEdit,
QgsHelp,
QgsDockWidget,
QgsGui,
QgsApplicationExitBlockerInterface
)
from functools import partial

import sys
Expand Down Expand Up @@ -80,6 +89,16 @@ def init_options_widget():
iface.registerOptionsWidgetFactory(_options_factory)


class ConsoleExitBlocker(QgsApplicationExitBlockerInterface):

def __init__(self, console):
super().__init__()
self.console = console

def allowExit(self):
return self.console.allowExit()


class PythonConsole(QgsDockWidget):

def __init__(self, parent=None):
Expand Down Expand Up @@ -543,6 +562,33 @@ def __init__(self, parent=None):
self.findScut.setContext(Qt.WidgetWithChildrenShortcut)
self.findScut.activated.connect(self._closeFind)

self.exit_blocker = ConsoleExitBlocker(self)
iface.registerApplicationExitBlocker(self.exit_blocker)

def allowExit(self):
tab_count = self.tabEditorWidget.count()
for i in range(tab_count):
# iterate backwards through tabs, as we may be closing some as we go
tab_index = tab_count - i - 1
tab_widget = self.tabEditorWidget.widget(tab_index)
if tab_widget.newEditor.isModified():
ret = QMessageBox.question(self, self.tr("Save {}").format(self.tabEditorWidget.tabText(tab_index)),
self.tr("There are unsaved changes in this script. Do you want to keep those?"),
QMessageBox.Save | QMessageBox.Cancel | QMessageBox.Discard, QMessageBox.Cancel)
if ret == QMessageBox.Save:
tab_widget.save()
if tab_widget.newEditor.isModified():
# save failed, treat as cancel
return False
elif ret == QMessageBox.Discard:
pass
else:
return False

self.tabEditorWidget.removeTab(tab_index)

return True

def _toggleFind(self):
self.tabEditorWidget.currentWidget().newEditor.toggleFindWidget()

Expand Down

0 comments on commit 9093bdf

Please sign in to comment.