From 2a1658a1d39e44e811e5f5c05756401854fb44f0 Mon Sep 17 00:00:00 2001 From: Bastian Kleineidam Date: Wed, 17 Nov 2010 20:28:43 +0100 Subject: [PATCH] Refactor QSettings --- linkcheck/gui/__init__.py | 52 +++++++++++++--------------------- linkcheck/gui/settings.py | 59 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 33 deletions(-) create mode 100644 linkcheck/gui/settings.py diff --git a/linkcheck/gui/__init__.py b/linkcheck/gui/__init__.py index a40b2046..6d4ca3d8 100644 --- a/linkcheck/gui/__init__.py +++ b/linkcheck/gui/__init__.py @@ -30,6 +30,7 @@ from .checker import CheckerThread from .contextmenu import ContextMenu from .editor import EditorWindow from .urlmodel import UrlItem, UrlItemModel +from .settings import Settings from .. import configuration, checker, director, add_intern_pattern, \ strformat, fileutil from ..containers import enum @@ -42,20 +43,6 @@ RegistryBase = "Bastian" Status = enum('idle', 'checking') -def save_point (qpoint): - """Ensure positive X and Y values of point.""" - qpoint.setX(max(0, qpoint.x())) - qpoint.setY(max(0, qpoint.y())) - return qpoint - - -def save_size (qsize): - """Ensure minimum width and height values of the given size.""" - qsize.setWidth(max(400, qsize.width())) - qsize.setHeight(max(400, qsize.height())) - return qsize - - class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): def __init__(self, parent=None, url=None): @@ -66,6 +53,8 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): self.urlinput.setText(url) self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowContextHelpButtonHint) self.setWindowTitle(configuration.App) + # app settings + self.settings = Settings(RegistryBase, configuration.AppName) # init subdialogs self.options = LinkCheckerOptions(parent=self) self.progress = LinkCheckerProgress(parent=self) @@ -74,16 +63,26 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): self.contextmenu = ContextMenu(parent=self) self.editor = EditorWindow(parent=self) self.properties = PropertiesDialog(parent=self) - # Note: we can't use QT assistant here because of the .exe packaging + # Note: do not use QT assistant here because of the .exe packaging self.assistant = HelpWindow(self, self.get_qhcpath()) self.init_treeview() - self.read_settings() self.connect_widgets() self.init_config() + # init application + self.init_app() + + def init_app (self): + size, pos = self.settings.read_geometry() + if size is not None: + self.resize(size) + if pos is not None: + self.move(pos) self.status = Status.idle self.set_statusbar(_("Ready.")) def get_qhcpath (self): + """Helper function to search for the QHC help file in different + locations.""" paths = [ # when developing os.path.join(configuration.configdata.install_data, "doc", "html"), @@ -98,14 +97,6 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): break return qhcfile - def read_settings (self): - settings = QtCore.QSettings(RegistryBase, configuration.AppName) - settings.beginGroup('mainwindow') - if settings.contains('size'): - self.resize(save_size(settings.value('size').toSize())) - self.move(save_point(settings.value('pos').toPoint())) - settings.endGroup() - def connect_widgets (self): """Connect widget signals. Some signals use the AutoConnect feature. Autoconnected methods have the form on__. @@ -164,17 +155,12 @@ class LinkCheckerMain (QtGui.QMainWindow, Ui_MainWindow): self.close() def closeEvent (self, e=None): - """Save settings on close.""" - settings = QtCore.QSettings(RegistryBase, configuration.AppName) - settings.beginGroup('mainwindow') - settings.setValue("size", QtCore.QVariant(save_size(self.size()))) - settings.setValue("pos", QtCore.QVariant(save_point(self.pos()))) - settings.endGroup() - settings.sync() + """Save settings and remove registered logging handler""" + self.settings.save_geometry(self.size(), self.pos()) + self.settings.sync() + self.config.remove_loghandler(self.handler) if e is not None: e.accept() - # remove registered logging handler - self.config.remove_loghandler(self.handler) @QtCore.pyqtSignature("") def on_actionAbout_triggered (self): diff --git a/linkcheck/gui/settings.py b/linkcheck/gui/settings.py new file mode 100644 index 00000000..b67521c6 --- /dev/null +++ b/linkcheck/gui/settings.py @@ -0,0 +1,59 @@ +# -*- coding: iso-8859-1 -*- +# Copyright (C) 2010 Bastian Kleineidam +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +"""Read and store QSettings for this application.""" + +from PyQt4 import QtCore + + +def save_point (qpoint): + """Ensure positive X and Y values of point.""" + qpoint.setX(max(0, qpoint.x())) + qpoint.setY(max(0, qpoint.y())) + return qpoint + + +def save_size (qsize): + """Ensure minimum width and height values of the given size.""" + qsize.setWidth(max(400, qsize.width())) + qsize.setHeight(max(400, qsize.height())) + return qsize + + +class Settings (object): + + def __init__ (self, base, appname): + self.settings = QtCore.QSettings(base, appname) + + def read_geometry (self): + self.settings.beginGroup('mainwindow') + size = pos = None + if self.settings.contains('size'): + size = save_size(self.settings.value('size').toSize()) + if self.settings.contains('pos'): + pos = save_point(self.settings.value('pos').toPoint()) + self.settings.endGroup() + return size, pos + + + def save_geometry (self, size, pos): + self.settings.beginGroup('mainwindow') + self.settings.setValue("size", QtCore.QVariant(save_size(size))) + self.settings.setValue("pos", QtCore.QVariant(save_point(pos))) + self.settings.endGroup() + + def sync (self): + self.settings.sync()