Refactor to make QSettings more python friendly

This commit is contained in:
Kovid Goyal 2008-03-19 03:37:51 +00:00
parent 6663154e16
commit e6b649d8a0
12 changed files with 86 additions and 50 deletions

View file

@ -19,7 +19,7 @@
__appname__ = 'libprs500'
import sys, os, logging, mechanize, locale, copy, cStringIO, re, subprocess, \
textwrap, atexit
textwrap, atexit, cPickle
from gettext import GNUTranslations
from math import floor
from optparse import OptionParser as _OptionParser
@ -27,6 +27,7 @@
from logging import Formatter
from ttfquery import findsystem, describe
from PyQt4.QtCore import QSettings, QVariant
from libprs500.translations.msgfmt import make
from libprs500.ebooks.chardet import detect
@ -307,6 +308,10 @@ def get_font_families(cached=None):
else:
zlist = []
for ff in ffiles:
if 'Optane' in str(ff):
font = describe.openFont(ff)
wt, italic = describe.modifiers(font)
print ff, wt, italic
try:
font = describe.openFont(ff)
except: # Some font files cause ttfquery to raise an exception, in which case they are ignored
@ -450,3 +455,32 @@ def singleinstance(name):
return False
return False
class Settings(QSettings):
def __init__(self):
QSettings.__init__(self, QSettings.IniFormat, QSettings.UserScope,
'kovidgoyal.net', 'calibre')
def migrate(self, settings):
for key in settings.allKeys():
self.setValue(key, settings.value(key, QVariant()))
def get(self, key, default=None):
key = str(key)
if not self.contains(key):
return default
val = str(self.value(key, QVariant()).toString())
if not val:
return None
return cPickle.loads(val)
def set(self, key, val):
val = cPickle.dumps(val, -1)
self.setValue(str(key), QVariant(val))
_settings = Settings()
if not _settings.get('migrated from QSettings'):
_settings.migrate(QSettings('KovidsBrain', 'libprs500'))
_settings.set('migrated from QSettings', True)
_settings.sync()

View file

@ -14,7 +14,7 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
""" The GUI """
import sys, os, re, StringIO, traceback
from PyQt4.QtCore import QVariant, QSettings, QFileInfo, QObject, SIGNAL, QBuffer, \
from PyQt4.QtCore import QVariant, QFileInfo, QObject, SIGNAL, QBuffer, \
QByteArray, QLocale, QTranslator, QUrl
from PyQt4.QtGui import QFileDialog, QMessageBox, QPixmap, QFileIconProvider, \
QIcon, QTableView
@ -85,14 +85,14 @@ def __init__(self, parent):
def read_settings(self):
self.cw = str(QSettings().value(self.__class__.__name__ + ' column widths', QVariant('')).toString())
self.cw = str(Settings().value(self.__class__.__name__ + ' column widths', QVariant('')).toString())
try:
self.cw = tuple(int(i) for i in self.cw.split(','))
except ValueError:
self.cw = None
def write_settings(self):
settings = QSettings()
settings = Settings()
settings.setValue(self.__class__.__name__ + ' column widths',
QVariant(','.join(str(self.columnWidth(i))
for i in range(self.model().columnCount(None)))))
@ -109,10 +109,10 @@ def set_visible_columns(self, cols=None):
is hidden, if True it is shown.
'''
if cols:
QSettings().setValue(self.__class__.__name__ + ' visible columns',
Settings().setValue(self.__class__.__name__ + ' visible columns',
QVariant(repr(cols)))
else:
cols = qstring_to_unicode(QSettings().value(self.__class__.__name__ + ' visible columns',
cols = qstring_to_unicode(Settings().value(self.__class__.__name__ + ' visible columns',
QVariant('')).toString())
if cols:
cols = eval(cols)
@ -219,7 +219,7 @@ def file_icon_provider():
def set_sidebar_directories(dirs):
global _sidebar_directories
if dirs is None:
dirs = QSettings().value('frequently used directories', QVariant([])).toStringList()
dirs = Settings().value('frequently used directories', QVariant([])).toStringList()
_sidebar_directories = [QUrl.fromLocalFile(i) for i in dirs]
class FileDialog(QObject):
@ -242,7 +242,7 @@ def __init__(self, title='Choose Files',
if add_all_files_filter or not ftext:
ftext += 'All files (*)'
settings = QSettings()
settings = Settings()
self.dialog_name = name if name else 'dialog_' + title
self.selected_files = None
self.fd = None
@ -298,7 +298,7 @@ def get_files(self):
def save_dir(self):
if self.fd:
settings = QSettings()
settings = Settings()
settings.setValue(self.dialog_name, QVariant(self.fd.saveState()))

View file

@ -15,9 +15,9 @@
import os
from PyQt4.QtGui import QDialog, QMessageBox, QListWidgetItem, QVBoxLayout
from PyQt4.QtCore import QSettings, QVariant, SIGNAL, QStringList, QTimer, Qt
from PyQt4.QtCore import QVariant, SIGNAL, QStringList, QTimer, Qt
from libprs500 import islinux
from libprs500 import islinux, Settings
from libprs500.gui2.dialogs.config_ui import Ui_Dialog
from libprs500.gui2 import qstring_to_unicode, choose_dir, error_dialog
from libprs500.gui2.widgets import FilenamePattern
@ -31,7 +31,7 @@ def __init__(self, window, db, columns):
self.db = db
self.current_cols = columns
settings = QSettings()
settings = Settings()
path = qstring_to_unicode(\
settings.value("database path",
QVariant(os.path.join(os.path.expanduser('~'),'library1.db'))).toString())
@ -89,7 +89,7 @@ def remove_dir(self):
self.directory_list.takeItem(idx)
def accept(self):
settings = QSettings()
settings = Settings()
settings.setValue('use roman numerals for series number', QVariant(self.roman_numerals.isChecked()))
settings.setValue('network timeout', QVariant(self.timeout.value()))
path = qstring_to_unicode(self.location.text())
@ -121,4 +121,4 @@ def __init__(self, parent, db):
def vacuum(self):
self.db.vacuum()
self.accept()

View file

@ -18,13 +18,14 @@
import logging, cStringIO
from PyQt4.QtCore import Qt, QObject, SIGNAL, QSettings, QVariant, \
from PyQt4.QtCore import Qt, QObject, SIGNAL, QVariant, \
QAbstractTableModel, QCoreApplication
from PyQt4.QtGui import QDialog, QItemSelectionModel
from libprs500.gui2.dialogs.fetch_metadata_ui import Ui_FetchMetadata
from libprs500.gui2 import error_dialog, NONE
from libprs500.ebooks.metadata.isbndb import create_books, option_parser
from libprs500 import Settings
class Matches(QAbstractTableModel):
@ -87,7 +88,7 @@ def __init__(self, parent, isbn, title, author, publisher, timeout):
self.timeout = timeout
QObject.connect(self.fetch, SIGNAL('clicked()'), self.fetch_metadata)
self.key.setText(QSettings().value('isbndb.com key', QVariant('')).toString())
self.key.setText(Settings().value('isbndb.com key', QVariant('')).toString())
self.setWindowTitle(title if title else 'Unknown')
self.tlabel.setText(self.tlabel.text().arg(title if title else 'Unknown'))
@ -113,7 +114,7 @@ def fetch_metadata(self):
_('You must specify a valid access key for isbndb.com'))
return
else:
QSettings().setValue('isbndb.com key', QVariant(self.key.text()))
Settings().setValue('isbndb.com key', QVariant(self.key.text()))
args = ['isbndb']
if self.isbn:

View file

@ -14,7 +14,7 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import os, cPickle, codecs
from PyQt4.QtCore import QObject, SIGNAL, Qt, QSettings, QVariant, QByteArray
from PyQt4.QtCore import QObject, SIGNAL, Qt, QVariant, QByteArray
from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, \
QPixmap, QTextEdit
@ -25,7 +25,7 @@
from libprs500.gui2.widgets import FontFamilyModel
from libprs500.ebooks.lrf import option_parser
from libprs500.ptempfile import PersistentTemporaryFile
from libprs500 import __appname__
from libprs500 import __appname__, Settings
font_family_model = None
@ -110,7 +110,7 @@ def __init__(self, window, db, row):
def load_saved_global_defaults(self):
cmdline = QSettings().value('LRF conversion defaults', QVariant(QByteArray(''))).toByteArray().data()
cmdline = Settings().value('LRF conversion defaults', QVariant(QByteArray(''))).toByteArray().data()
if cmdline:
cmdline = cPickle.loads(cmdline)
self.set_options_from_cmdline(cmdline)
@ -390,7 +390,7 @@ def accept(self):
cmdline.extend([u'--cover', self.cover_file.name])
self.cmdline = [unicode(i) for i in cmdline]
else:
QSettings().setValue('LRF conversion defaults', QVariant(QByteArray(cPickle.dumps(cmdline))))
Settings().setValue('LRF conversion defaults', QVariant(QByteArray(cPickle.dumps(cmdline))))
QDialog.accept(self)
class LRFBulkDialog(LRFSingleDialog):
@ -411,4 +411,4 @@ def accept(self):
self.cmdline = self.cmdline = [unicode(i) for i in self.build_commandline()]
self.cover_file = None
QDialog.accept(self)

View file

@ -18,7 +18,7 @@
'''
import os
from PyQt4.QtCore import SIGNAL, QObject, QCoreApplication, Qt, QVariant, QSettings
from PyQt4.QtCore import SIGNAL, QObject, QCoreApplication, Qt, QVariant
from PyQt4.QtGui import QPixmap, QListWidgetItem, QErrorMessage, QDialog
@ -30,6 +30,7 @@
from libprs500.gui2.dialogs.password import PasswordDialog
from libprs500.ebooks import BOOK_EXTENSIONS
from libprs500.ebooks.metadata.library_thing import login, cover_from_isbn, LibraryThingError
from libprs500 import Settings
class Format(QListWidgetItem):
def __init__(self, parent, ext, size, path=None):
@ -154,7 +155,7 @@ def __init__(self, window, row, db):
self.edit_tags)
QObject.connect(self.remove_series_button, SIGNAL('clicked()'),
self.remove_unused_series)
self.timeout = float(QSettings().value('network timeout', QVariant(5)).toInt()[0])
self.timeout = float(Settings().value('network timeout', QVariant(5)).toInt()[0])
self.title.setText(db.title(row))
isbn = db.isbn(self.id, index_is_id=True)
if not isbn:
@ -332,4 +333,4 @@ def accept(self):
self.db.set_cover(self.id, pixmap_to_data(self.cover.pixmap()))
self.changed = True
QDialog.accept(self)

View file

@ -14,10 +14,11 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from PyQt4.QtGui import QDialog, QLineEdit
from PyQt4.QtCore import QSettings, QVariant, SIGNAL, Qt
from PyQt4.QtCore import QVariant, SIGNAL, Qt
from libprs500.gui2.dialogs.password_ui import Ui_Dialog
from libprs500.gui2 import qstring_to_unicode
from libprs500 import Settings
class PasswordDialog(QDialog, Ui_Dialog):
@ -26,7 +27,7 @@ def __init__(self, window, name, msg):
Ui_Dialog.__init__(self)
self.setupUi(self)
settings = QSettings()
settings = Settings()
un = settings.value(name+': un', QVariant('')).toString()
pw = settings.value(name+': pw', QVariant('')).toString()
self.gui_username.setText(un)
@ -48,7 +49,7 @@ def password(self):
return qstring_to_unicode(self.gui_password.text())
def accept(self):
settings = QSettings()
settings = Settings()
settings.setValue(self.sname+': un', QVariant(self.gui_username.text()))
settings.setValue(self.sname+': pw', QVariant(self.gui_password.text()))
QDialog.accept(self)
QDialog.accept(self)

View file

@ -15,10 +15,10 @@
import traceback, logging, collections, time
from PyQt4.QtCore import QAbstractTableModel, QMutex, QObject, SIGNAL, Qt, \
QVariant, QThread, QSettings
QVariant, QThread
from PyQt4.QtGui import QIcon, QDialog
from libprs500 import detect_ncpus
from libprs500 import detect_ncpus, Settings
from libprs500.gui2 import NONE, error_dialog
from libprs500.parallel import Server
from libprs500.gui2.dialogs.job_view_ui import Ui_Dialog
@ -258,7 +258,7 @@ def run_conversion_job(self, slot, callable, args=[], **kwargs):
desc = kwargs.pop('job_description', '')
if args and hasattr(args[0], 'append') and '--verbose' not in args[0]:
args[0].append('--verbose')
priority = self.PRIORITY[str(QSettings().value('conversion job priority',
priority = self.PRIORITY[str(Settings().value('conversion job priority',
QVariant('Normal')).toString())]
job = self.create_job(ConversionJob, desc, slot, priority,
callable, *args, **kwargs)

View file

@ -21,10 +21,9 @@
QPen, QStyle, QPainter, QLineEdit, QApplication, \
QPalette
from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt, QString, \
QCoreApplication, SIGNAL, QObject, QSize, QModelIndex, \
QSettings
QCoreApplication, SIGNAL, QObject, QSize, QModelIndex
from libprs500 import iswindows
from libprs500 import iswindows, Settings
from libprs500.ptempfile import PersistentTemporaryFile
from libprs500.library.database import LibraryDatabase, SearchToken
from libprs500.gui2 import NONE, TableView, qstring_to_unicode
@ -115,7 +114,7 @@ def __init__(self, parent):
self.read_config()
def read_config(self):
self.use_roman_numbers = bool(QSettings().value('use roman numerals for series number',
self.use_roman_numbers = bool(Settings().value('use roman numerals for series number',
QVariant(True)).toBool())
@ -800,4 +799,4 @@ def set_search_string(self, txt):
self.setText(txt)
self.emit(SIGNAL('search(PyQt_PyObject, PyQt_PyObject)'), txt, False)
self.end(False)
self.initial_state = False
self.initial_state = False

View file

@ -16,9 +16,9 @@
from PyQt4.QtGui import QApplication, QKeySequence, QPainter, QDialog
from PyQt4.QtCore import Qt, QObject, SIGNAL, QCoreApplication, QThread, \
QSettings, QVariant
QVariant
from libprs500 import __appname__, __version__, __author__, setup_cli_handlers, islinux
from libprs500 import __appname__, __version__, __author__, setup_cli_handlers, islinux, Settings
from libprs500.ebooks.lrf.parser import LRFDocument
from libprs500.gui2 import ORG_NAME, APP_UID, error_dialog, choose_files
@ -112,13 +112,13 @@ def __init__(self, logger, opts, parent=None):
def configure(self, triggered):
opts = cPickle.loads(str(QSettings().value('ebook viewer options', QVariant(cPickle.dumps(self.opts))).toString()))
opts = cPickle.loads(str(Settings().value('ebook viewer options', QVariant(cPickle.dumps(self.opts))).toString()))
d = Config(self, opts)
d.exec_()
if d.result() == QDialog.Accepted:
opts.white_background = bool(d.white_background.isChecked())
opts.hyphenate = bool(d.hyphenate.isChecked())
QSettings().setValue('ebook viewer options', QVariant(cPickle.dumps(opts)))
Settings().setValue('ebook viewer options', QVariant(cPickle.dumps(opts)))
def set_ebook(self, stream):
self.progress_bar.setMinimum(0)
@ -281,7 +281,7 @@ def option_parser():
return parser
def normalize_settings(parser, opts):
settings = QSettings()
settings = Settings()
saved_opts = cPickle.loads(str(settings.value('ebook viewer options', QVariant(cPickle.dumps(opts))).toString()))
for opt in parser.option_list:
if not opt.dest:

View file

@ -15,12 +15,12 @@
import os, sys, textwrap, collections, traceback, shutil, time
from PyQt4.QtCore import Qt, SIGNAL, QObject, QCoreApplication, \
QSettings, QVariant, QThread, QString
QVariant, QThread, QString
from PyQt4.QtGui import QPixmap, QColor, QPainter, QMenu, QIcon, QMessageBox, \
QToolButton, QDialog
from PyQt4.QtSvg import QSvgRenderer
from libprs500 import __version__, __appname__, islinux, sanitize_file_name, launch
from libprs500 import __version__, __appname__, islinux, sanitize_file_name, launch, Settings
from libprs500.ptempfile import PersistentTemporaryFile
from libprs500.ebooks.metadata.meta import get_metadata, get_filename_pat, set_filename_pat
from libprs500.devices.errors import FreeSpaceError
@ -865,7 +865,7 @@ def do_config(self):
_('<p>An invalid database already exists at %s, delete it before trying to move the existing database.<br>Error: %s')%(newloc, str(err)))
newloc = self.database_path
self.database_path = newloc
settings = QSettings()
settings = Settings()
settings.setValue("database path", QVariant(self.database_path))
os.unlink(src.name)
except Exception, err:
@ -952,7 +952,7 @@ def conversion_job_exception(self, id, description, exception, formatted_traceba
def read_settings(self):
settings = QSettings()
settings = Settings()
settings.beginGroup("Main Window")
geometry = settings.value('main window geometry', QVariant()).toByteArray()
self.restoreGeometry(geometry)
@ -965,7 +965,7 @@ def read_settings(self):
def write_settings(self):
settings = QSettings()
settings = Settings()
settings.beginGroup("Main Window")
settings.setValue("main window geometry", QVariant(self.saveGeometry()))
settings.endGroup()

View file

@ -20,12 +20,12 @@
QListWidgetItem, QTextCharFormat, QApplication, \
QSyntaxHighlighter, QCursor, QColor, QWidget
from PyQt4.QtCore import QAbstractListModel, QVariant, Qt, QSize, SIGNAL, \
QObject, QRegExp, QSettings
QObject, QRegExp
from libprs500.gui2.jobs import DetailView
from libprs500.gui2 import human_readable, NONE, TableView, qstring_to_unicode, error_dialog
from libprs500.gui2.filename_pattern_ui import Ui_Form
from libprs500 import fit_image, get_font_families
from libprs500 import fit_image, get_font_families, Settings
from libprs500.ebooks.metadata.meta import get_filename_pat, metadata_from_filename, \
set_filename_pat
@ -303,7 +303,7 @@ def setDefaultString(name, default):
value = default
Config[name] = value
settings = QSettings()
settings = Settings()
for name in ("window", "shell"):
Config["%swidth" % name] = settings.value("%swidth" % name,
QVariant(QApplication.desktop() \