Changeset 11299:0d7f328b766a in orange


Ignore:
Timestamp:
02/04/13 12:23:17 (15 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

PyQt4 < 4.8.3 QSettings compatibility class (type parameter for value method).

Always use the type parameter instead of QVariant transformations.

Location:
Orange/OrangeCanvas
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/application/canvasmain.py

    r11281 r11299  
    1818 
    1919from PyQt4.QtCore import ( 
    20     Qt, QEvent, QSize, QUrl, QSettings, QTimer, QFile 
     20    Qt, QEvent, QSize, QUrl, QTimer, QFile, QByteArray 
    2121) 
    2222 
     
    2525from PyQt4.QtCore import pyqtProperty as Property 
    2626 
     27# Compatibility with PyQt < v4.8.3 
     28from ..utils.qtcompat import QSettings 
    2729 
    2830from ..gui.dropshadow import DropShadowFrame 
     
    169171 
    170172        self.widget_registry = None 
    171         self.last_scheme_dir = None 
     173 
     174        self.last_scheme_dir = QDesktopServices.StandardLocation( 
     175            QDesktopServices.DocumentsLocation 
     176        ) 
    172177 
    173178        self.recent_schemes = config.recent_schemes() 
     
    631636 
    632637        self.dock_widget.setExpanded( 
    633             settings.value("canvasdock/expanded", True).toBool() 
     638            settings.value("canvasdock/expanded", True, type=bool) 
    634639        ) 
    635640 
    636         floatable = settings.value("toolbox-dock-floatable", False).toBool() 
     641        floatable = settings.value("toolbox-dock-floatable", False, type=bool) 
    637642        if floatable: 
    638643            self.dock_widget.setFeatures(self.dock_widget.features() | \ 
     
    640645 
    641646        self.widgets_tool_box.setExclusive( 
    642             settings.value("toolbox-dock-exclusive", False).toBool() 
     647            settings.value("toolbox-dock-exclusive", False, type=bool) 
    643648        ) 
    644649 
    645650        self.toogle_margins_action.setChecked( 
    646             settings.value("scheme-margins-enabled", True).toBool() 
     651            settings.value("scheme-margins-enabled", True, type=bool) 
    647652        ) 
    648653 
    649         self.last_scheme_dir = \ 
    650             settings.value("last-scheme-dir", None).toPyObject() 
    651  
    652         if self.last_scheme_dir is not None and \ 
    653                 not os.path.exists(self.last_scheme_dir): 
     654        default_dir = QDesktopServices.storageLocation( 
     655            QDesktopServices.DocumentsLocation 
     656        ) 
     657 
     658        self.last_scheme_dir = settings.value("last-scheme-dir", default_dir, 
     659                                              type=unicode) 
     660 
     661        if not os.path.exists(self.last_scheme_dir): 
    654662            # if directory no longer exists reset the saved location. 
    655             self.last_scheme_dir = None 
     663            self.last_scheme_dir = default_dir 
    656664 
    657665        self.canvas_tool_dock.setQuickHelpVisible( 
    658             settings.value("quick-help/visible", True).toBool() 
     666            settings.value("quick-help/visible", True, type=bool) 
    659667        ) 
    660668 
     
    697705        # Restore possibly saved widget toolbox tab states 
    698706        settings = QSettings() 
     707 
    699708        state = settings.value("mainwindow/widgettoolbox/state", 
    700                                 defaultValue=None) 
    701         state = state.toPyObject() 
     709                                defaultValue=QByteArray(), 
     710                                type=QByteArray) 
    702711        if state: 
    703712            self.widgets_tool_box.restoreState(state) 
     
    786795 
    787796        settings = QSettings() 
    788         show = settings.value("schemeinfo/show-at-new-scheme", True).toBool() 
     797        show = settings.value("schemeinfo/show-at-new-scheme", True, 
     798                              type=bool) 
    789799 
    790800        if show: 
     
    11701180 
    11711181        dialog.setShowAtStartup( 
    1172             settings.value("startup/show-welcome-screen", True).toBool() 
     1182            settings.value("startup/show-welcome-screen", True, type=bool) 
    11731183        ) 
    11741184 
     
    11941204 
    11951205        dialog.setDontShowAtNewScheme( 
    1196             not settings.value(value_key, True).toBool() 
     1206            not settings.value(value_key, True, type=bool) 
    11971207        ) 
    11981208 
     
    14401450 
    14411451            # Restore geometry and dock/toolbar state 
    1442             state = settings.value("state") 
    1443             if state.isValid(): 
    1444                 self.restoreState(state.toByteArray(), 
    1445                                   version=self.SETTINGS_VERSION) 
    1446             geom_data = settings.value("geometry") 
    1447             if geom_data.isValid(): 
    1448                 self.restoreGeometry(geom_data.toByteArray()) 
     1452            state = settings.value("state", QByteArray(), type=QByteArray) 
     1453            if state: 
     1454                self.restoreState(state, version=self.SETTINGS_VERSION) 
     1455 
     1456            geom_data = settings.value("geometry", QByteArray(), 
     1457                                       type=QByteArray) 
     1458            if geom_data: 
     1459                self.restoreGeometry(geom_data) 
     1460 
    14491461            self.__first_show = False 
    14501462 
     
    15241536        settings.beginGroup("mainwindow") 
    15251537        toolbox_floatable = settings.value("toolbox-dock-floatable", 
    1526                                            defaultValue=False) 
     1538                                           defaultValue=False, 
     1539                                           type=bool) 
    15271540 
    15281541        features = self.dock_widget.features() 
    15291542        features = updated_flags(features, QDockWidget.DockWidgetFloatable, 
    1530                                  toolbox_floatable.toBool()) 
     1543                                 toolbox_floatable) 
    15311544        self.dock_widget.setFeatures(features) 
    15321545 
    15331546        toolbox_exclusive = settings.value("toolbox-dock-exclusive", 
    1534                                            defaultValue=False) 
    1535         self.widgets_tool_box.setExclusive(toolbox_exclusive.toBool()) 
     1547                                           defaultValue=False, 
     1548                                           type=bool) 
     1549        self.widgets_tool_box.setExclusive(toolbox_exclusive) 
    15361550 
    15371551        settings.endGroup() 
     
    15401554        triggers = 0 
    15411555        dbl_click = settings.value("trigger-on-double-click", 
    1542                                    defaultValue=True) 
    1543         if dbl_click.toBool(): 
     1556                                   defaultValue=True, 
     1557                                   type=bool) 
     1558        if dbl_click: 
    15441559            triggers |= SchemeEditWidget.DoubleClicked 
    15451560 
    15461561        left_click = settings.value("trigger-on-left-click", 
    1547                                     defaultValue=False) 
    1548         if left_click.toBool(): 
     1562                                    defaultValue=False, 
     1563                                    type=bool) 
     1564        if left_click: 
    15491565            triggers |= SchemeEditWidget.Clicked 
    15501566 
    15511567        space_press = settings.value("trigger-on-space-key", 
    1552                                      defaultValue=True) 
    1553         if space_press.toBool(): 
     1568                                     defaultValue=True, 
     1569                                     type=bool) 
     1570        if space_press: 
    15541571            triggers |= SchemeEditWidget.SpaceKey 
    15551572 
    15561573        any_press = settings.value("trigger-on-any-key", 
    1557                                    defaultValue=False) 
    1558         if any_press.toBool(): 
     1574                                   defaultValue=False, 
     1575                                   type=bool) 
     1576        if any_press: 
    15591577            triggers |= SchemeEditWidget.AnyKey 
    15601578 
     
    15641582        settings.beginGroup("schemeedit") 
    15651583        show_channel_names = settings.value("show-channel-names", 
    1566                                             defaultValue=True) 
    1567         self.scheme_widget.setChannelNamesVisible(show_channel_names.toBool()) 
     1584                                            defaultValue=True, 
     1585                                            type=bool) 
     1586        self.scheme_widget.setChannelNamesVisible(show_channel_names) 
    15681587 
    15691588        settings.endGroup() 
    15701589 
    15711590        settings.beginGroup("output") 
    1572         stay_on_top = settings.value("stay-on-top", defaultValue=True) 
    1573         if stay_on_top.toBool(): 
     1591        stay_on_top = settings.value("stay-on-top", defaultValue=True, 
     1592                                     type=bool) 
     1593        if stay_on_top: 
    15741594            self.output_dock.setFloatingWindowFlags(Qt.Tool) 
    15751595        else: 
    15761596            self.output_dock.setFloatingWindowFlags(Qt.Window) 
    15771597 
    1578         dockable = settings.value("dockable", defaultValue=True,) 
    1579         if dockable.toBool(): 
     1598        dockable = settings.value("dockable", defaultValue=True, 
     1599                                  type=bool) 
     1600        if dockable: 
    15801601            self.output_dock.setAllowedAreas(Qt.BottomDockWidgetArea) 
    15811602        else: 
     
    15851606 
    15861607        settings.beginGroup("help") 
    1587         stay_on_top = settings.value("stay-on-top", defaultValue=True) 
    1588         if stay_on_top.toBool(): 
     1608        stay_on_top = settings.value("stay-on-top", defaultValue=True, 
     1609                                     type=bool) 
     1610        if stay_on_top: 
    15891611            self.help_dock.setFloatingWindowFlags(Qt.Tool) 
    15901612        else: 
    15911613            self.help_dock.setFloatingWindowFlags(Qt.Window) 
    15921614 
    1593         dockable = settings.value("dockable", defaultValue=False) 
    1594         if dockable.toBool(): 
     1615        dockable = settings.value("dockable", defaultValue=False, 
     1616                                  type=bool) 
     1617        if dockable: 
    15951618            self.help_dock.setAllowedAreas(Qt.LeftDockWidgetArea | \ 
    15961619                                           Qt.RightDockWidgetArea) 
  • Orange/OrangeCanvas/application/settings.py

    r11256 r11299  
    2222 
    2323from PyQt4.QtCore import ( 
    24     Qt, QEventLoop, QAbstractItemModel, QModelIndex, QSettings, 
     24    Qt, QEventLoop, QAbstractItemModel, QModelIndex 
    2525) 
    2626 
     
    482482    def hideEvent(self, event): 
    483483        QMainWindow.hideEvent(self, event) 
    484         self.__loop.exit(0) 
     484        if self.__loop is not None: 
     485            self.__loop.exit(0) 
     486            self.__loop = None 
    485487 
    486488    def __macOnToolBarAction(self, action): 
  • Orange/OrangeCanvas/application/tests/test_settings.py

    r11250 r11299  
    22 
    33from PyQt4.QtGui import QTreeView 
    4 from PyQt4.QtCore import QSettings 
    54 
    65from ...gui import test 
     
    87from ..settings import UserSettingsDialog, UserSettingsModel 
    98from ...utils.settings import Settings, config_slot 
     9from ...utils.qtcompat import QSettings 
    1010 
    1111 
  • Orange/OrangeCanvas/config.py

    r11285 r11299  
    1212 
    1313from PyQt4.QtGui import QDesktopServices 
    14 from PyQt4.QtCore import QCoreApplication, QSettings 
     14from PyQt4.QtCore import QCoreApplication 
    1515 
    1616from .utils.settings import Settings, config_slot 
     17 
     18# Import QSettings from qtcompat module (compatibility with PyQt < 4.8.3 
     19from .utils.qtcompat import QSettings 
    1720 
    1821log = logging.getLogger(__name__) 
  • Orange/OrangeCanvas/main.py

    r11285 r11299  
    1616 
    1717from PyQt4.QtGui import QFont, QColor 
    18 from PyQt4.QtCore import Qt, QRect, QSettings, QDir 
     18from PyQt4.QtCore import Qt, QRect, QDir 
    1919 
    2020from Orange import OrangeCanvas 
     
    2727from Orange.OrangeCanvas import config 
    2828from Orange.OrangeCanvas.utils.redirect import redirect_stdout, redirect_stderr 
     29from Orange.OrangeCanvas.utils.qtcompat import QSettings 
    2930 
    3031from Orange.OrangeCanvas.registry import qt 
     
    172173 
    173174    want_splash = \ 
    174         settings.value("startup/show-splash-screen", True).toBool() and \ 
     175        settings.value("startup/show-splash-screen", True, type=bool) and \ 
    175176        not options.no_splash 
    176177 
     
    209210 
    210211    want_welcome = \ 
    211         settings.value("startup/show-welcome-screen", True).toBool() \ 
     212        settings.value("startup/show-welcome-screen", True, type=bool) \ 
    212213        and not options.no_welcome 
    213214 
     
    227228 
    228229    stdout_redirect = \ 
    229         settings.value("output/redirect-stdout", True).toBool() 
     230        settings.value("output/redirect-stdout", True, type=bool) 
    230231 
    231232    stderr_redirect = \ 
    232         settings.value("output/redirect-stderr", True).toBool() 
     233        settings.value("output/redirect-stderr", True, type=bool) 
    233234 
    234235    # cmd line option overrides settings / no redirect is possible 
  • Orange/OrangeCanvas/utils/qtcompat.py

    r11247 r11299  
    11""" 
    2 PyQt4 compatibility utility functions 
     2PyQt4 compatibility utility functions. 
     3 
     4.. warning:: It is important that any `sip.setapi` (at least for QVariant 
     5             and QString) calls are already made before importing this 
     6             module. 
    37 
    48""" 
     9from operator import methodcaller 
     10 
    511import sip 
    612 
     
    2329 
    2430 
    25 def toPyObject(obj): 
     31HAS_QVARIANT = sip_getapi("QVariant") == 1 
     32HAS_QSTRING = sip_getapi("QString") == 1 
     33 
     34if HAS_QVARIANT: 
     35    from PyQt4.QtCore import QVariant 
     36 
     37from PyQt4.QtCore import QSettings, QByteArray 
     38from PyQt4.QtCore import PYQT_VERSION 
     39 
     40QSETTINGS_HAS_TYPE = PYQT_VERSION >= 0x40803 
     41"""QSettings.value has a `type` parameter""" 
     42 
     43 
     44def toPyObject(variant): 
    2645    """ 
    27     Return `obj` as a python object if it is wrapped in a `QVariant` 
    28     instance (using `obj.toPyObject()`). In case the sip API version for 
    29     QVariant does not export it just return the object unchanged. 
     46    Return `variant` as a python object if it is wrapped in a `QVariant` 
     47    instance (using `variant.toPyObject()`). In case the sip API version 
     48    for QVariant does not export it just return the object unchanged. 
    3049 
    3150    """ 
    32     if sip_getapi("QVariant") > 1: 
    33         return obj 
     51    if HAS_QVARIANT: 
     52        return variant 
     53    elif isinstance(variant, QVariant): 
     54        return variant.toPyObject() 
    3455    else: 
    35         try: 
    36             return obj.toPyObject() 
    37         except AttributeError: 
    38             return obj 
     56        raise TypeError("Expected a 'QVariant'") 
     57 
     58 
     59if HAS_QVARIANT: 
     60    toBitArray = methodcaller("toBitArray") 
     61    toBool = methodcaller("toBool") 
     62    toByteArray = methodcaller("toByteArray") 
     63    toChar = methodcaller("toChar") 
     64    toDate = methodcaller("") 
     65    toPyObject = methodcaller("toPyObject") 
     66 
     67    toFlaot = methodcaller("toFlaot") 
     68 
     69 
     70def _check_error((val, status)): 
     71    if not status: 
     72        raise TypeError() 
     73    else: 
     74        return val 
     75 
     76 
     77def qvariant_to_py(variant, py_type): 
     78    """ 
     79    Convert a `QVariant` object to a python object of type `py_type`. 
     80    """ 
     81    if py_type == bool: 
     82        return variant.toBool() 
     83    elif py_type == int: 
     84        return _check_error(variant.toInt()) 
     85    elif py_type == str: 
     86        return unicode(variant.toString()) 
     87    elif py_type == unicode: 
     88        return unicode(variant.toString()) 
     89    elif py_type == QByteArray: 
     90        return variant.toByteArray() 
     91 
     92    else: 
     93        raise TypeError("Unsuported type {0!s}".format(py_type)) 
     94 
     95 
     96if not QSETTINGS_HAS_TYPE: 
     97    _QSettings = QSettings 
     98 
     99    class QSettings(QSettings): 
     100        """ 
     101        A subclass of QSettings with a simulated `type` parameter in 
     102        value method. 
     103 
     104        """ 
     105        # QSettings.value does not have `type` type before PyQt4 4.8.3 
     106        # We dont't check if QVariant is exported, it is assumed on such old 
     107        # installations the new api is not used. 
     108        def value(self, key, 
     109                  defaultValue=QVariant(), 
     110                  type=None): 
     111            """ 
     112            Returns the value for setting key. If the setting doesn't exist, 
     113            returns defaultValue. 
     114 
     115            """ 
     116            if not _QSettings.contains(self, key): 
     117                return defaultValue 
     118 
     119            value = _QSettings.value(self, key) 
     120 
     121            if type is not None: 
     122                value = qvariant_to_py(value, type) 
     123 
     124            return value 
  • Orange/OrangeCanvas/utils/tests/test_settings.py

    r11249 r11299  
    44""" 
    55import logging 
     6import tempfile 
    67 
    7 from PyQt4.QtCore import QSettings 
    8  
     8from ..qtcompat import QSettings 
     9from ..settings import Settings, config_slot 
    910 
    1011from ...gui import test 
     
    1718 
    1819    def test_settings(self): 
    19         from ..settings import Settings, config_slot 
    20  
    2120        spec = [config_slot("foo", bool, True, "foo doc"), 
    2221                config_slot("bar", int, 0, "bar doc"), 
     
    103102        self.assertSetEqual(set(settings.keys()), 
    104103                            set(["foo", "bar", "foobar/foo"])) 
     104 
     105    def test_qsettings_type(self): 
     106        """ 
     107        Test if QSettings as exported by qtcompat has the 'type' parameter. 
     108        """ 
     109        with tempfile.NamedTemporaryFile("w+b", suffix=".ini", 
     110                                         delete=False) as f: 
     111            settings = QSettings(f.name, QSettings.IniFormat) 
     112            settings.setValue("bar", "foo") 
     113 
     114            self.assertEqual(settings.value("bar", type=str), "foo") 
     115            settings.setValue("frob", 4) 
     116 
     117            del settings 
     118            settings = QSettings(f.name, QSettings.IniFormat) 
     119            self.assertEqual(settings.value("bar", type=str), "foo") 
     120            self.assertEqual(settings.value("frob", type=int), 4) 
Note: See TracChangeset for help on using the changeset viewer.