Updating from skeleton
[gonvert] / src / util / qui_utils.py
index 56a3408..11b3453 100644 (file)
@@ -3,8 +3,9 @@ import contextlib
 import datetime
 import logging
 
-from PyQt4 import QtCore
-from PyQt4 import QtGui
+import qt_compat
+QtCore = qt_compat.QtCore
+QtGui = qt_compat.import_module("QtGui")
 
 import misc
 
@@ -54,8 +55,8 @@ class ErrorMessage(object):
 
 class QErrorLog(QtCore.QObject):
 
-       messagePushed = QtCore.pyqtSignal()
-       messagePopped = QtCore.pyqtSignal()
+       messagePushed = qt_compat.Signal()
+       messagePopped = qt_compat.Signal()
 
        def __init__(self):
                QtCore.QObject.__init__(self)
@@ -113,21 +114,7 @@ class ErrorDisplay(object):
                self._errorLog.messagePushed.connect(self._on_message_pushed)
                self._errorLog.messagePopped.connect(self._on_message_popped)
 
-               self._icons = {
-                       ErrorMessage.LEVEL_BUSY:
-                               get_theme_icon(
-                                       #("process-working", "view-refresh", "general_refresh", "gtk-refresh")
-                                       ("view-refresh", "general_refresh", "gtk-refresh", )
-                               ).pixmap(32, 32),
-                       ErrorMessage.LEVEL_INFO:
-                               get_theme_icon(
-                                       ("dialog-information", "general_notes", "gtk-info")
-                               ).pixmap(32, 32),
-                       ErrorMessage.LEVEL_ERROR:
-                               get_theme_icon(
-                                       ("dialog-error", "app_install_error", "gtk-dialog-error")
-                               ).pixmap(32, 32),
-               }
+               self._icons = None
                self._severityLabel = QtGui.QLabel()
                self._severityLabel.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
 
@@ -136,17 +123,11 @@ class ErrorDisplay(object):
                self._message.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
                self._message.setWordWrap(True)
 
-               closeIcon = get_theme_icon(("window-close", "general_close", "gtk-close"), self._SENTINEL_ICON)
-               if closeIcon is not self._SENTINEL_ICON:
-                       self._closeLabel = QtGui.QPushButton(closeIcon, "")
-               else:
-                       self._closeLabel = QtGui.QPushButton("X")
-               self._closeLabel.clicked.connect(self._on_close)
+               self._closeLabel = None
 
                self._controlLayout = QtGui.QHBoxLayout()
                self._controlLayout.addWidget(self._severityLabel, 1, QtCore.Qt.AlignCenter)
                self._controlLayout.addWidget(self._message, 1000)
-               self._controlLayout.addWidget(self._closeLabel, 1, QtCore.Qt.AlignCenter)
 
                self._widget = QtGui.QWidget()
                self._widget.setLayout(self._controlLayout)
@@ -157,23 +138,47 @@ class ErrorDisplay(object):
                return self._widget
 
        def _show_error(self):
+               if self._icons is None:
+                       self._icons = {
+                               ErrorMessage.LEVEL_BUSY:
+                                       get_theme_icon(
+                                               #("process-working", "view-refresh", "general_refresh", "gtk-refresh")
+                                               ("view-refresh", "general_refresh", "gtk-refresh", )
+                                       ).pixmap(32, 32),
+                               ErrorMessage.LEVEL_INFO:
+                                       get_theme_icon(
+                                               ("dialog-information", "general_notes", "gtk-info")
+                                       ).pixmap(32, 32),
+                               ErrorMessage.LEVEL_ERROR:
+                                       get_theme_icon(
+                                               ("dialog-error", "app_install_error", "gtk-dialog-error")
+                                       ).pixmap(32, 32),
+                       }
+               if self._closeLabel is None:
+                       closeIcon = get_theme_icon(("window-close", "general_close", "gtk-close"), self._SENTINEL_ICON)
+                       if closeIcon is not self._SENTINEL_ICON:
+                               self._closeLabel = QtGui.QPushButton(closeIcon, "")
+                       else:
+                               self._closeLabel = QtGui.QPushButton("X")
+                       self._closeLabel.clicked.connect(self._on_close)
+                       self._controlLayout.addWidget(self._closeLabel, 1, QtCore.Qt.AlignCenter)
                error = self._errorLog.peek_message()
                self._message.setText(error.message)
                self._severityLabel.setPixmap(self._icons[error.level])
                self._widget.show()
 
-       @QtCore.pyqtSlot()
-       @QtCore.pyqtSlot(bool)
+       @qt_compat.Slot()
+       @qt_compat.Slot(bool)
        @misc.log_exception(_moduleLogger)
        def _on_close(self, checked = False):
                self._errorLog.pop()
 
-       @QtCore.pyqtSlot()
+       @qt_compat.Slot()
        @misc.log_exception(_moduleLogger)
        def _on_message_pushed(self):
                self._show_error()
 
-       @QtCore.pyqtSlot()
+       @qt_compat.Slot()
        @misc.log_exception(_moduleLogger)
        def _on_message_popped(self):
                if len(self._errorLog) == 0:
@@ -231,9 +236,17 @@ class QHtmlDelegate(QtGui.QStyledItemDelegate):
                doc.documentLayout().draw(painter, ctx)
                painter.restore()
 
-       def setWidth(self, width):
-               # @bug we need to be emitting sizeHintChanged but it requires an index
+       def setWidth(self, width, model):
+               if self._width == width:
+                       return
                self._width = width
+               for c in xrange(model.rowCount()):
+                       cItem = model.item(c, 0)
+                       for r in xrange(model.rowCount()):
+                               rItem = cItem.child(r, 0)
+                               rIndex = model.indexFromItem(rItem)
+                               self.sizeHintChanged.emit(rIndex)
+                               return
 
        def sizeHint(self, option, index):
                newOption = QtGui.QStyleOptionViewItemV4(option)
@@ -250,6 +263,45 @@ class QHtmlDelegate(QtGui.QStyledItemDelegate):
                return size
 
 
+class QSignalingMainWindow(QtGui.QMainWindow):
+
+       closed = qt_compat.Signal()
+       hidden = qt_compat.Signal()
+       shown = qt_compat.Signal()
+       resized = qt_compat.Signal()
+
+       def __init__(self, *args, **kwd):
+               QtGui.QMainWindow.__init__(*((self, )+args), **kwd)
+
+       def closeEvent(self, event):
+               val = QtGui.QMainWindow.closeEvent(self, event)
+               self.closed.emit()
+               return val
+
+       def hideEvent(self, event):
+               val = QtGui.QMainWindow.hideEvent(self, event)
+               self.hidden.emit()
+               return val
+
+       def showEvent(self, event):
+               val = QtGui.QMainWindow.showEvent(self, event)
+               self.shown.emit()
+               return val
+
+       def resizeEvent(self, event):
+               val = QtGui.QMainWindow.resizeEvent(self, event)
+               self.resized.emit()
+               return val
+
+def set_current_index(selector, itemText, default = 0):
+       for i in xrange(selector.count()):
+               if selector.itemText(i) == itemText:
+                       selector.setCurrentIndex(i)
+                       break
+       else:
+               itemText.setCurrentIndex(default)
+
+
 def _null_set_stackable(window, isStackable):
        pass
 
@@ -265,12 +317,12 @@ except AttributeError:
        set_stackable = _null_set_stackable
 
 
-def _null_set_autorient(window, isStackable):
+def _null_set_autorient(window, doAutoOrient):
        pass
 
 
-def _maemo_set_autorient(window, isStackable):
-       window.setAttribute(QtCore.Qt.WA_Maemo5AutoOrientation, isStackable)
+def _maemo_set_autorient(window, doAutoOrient):
+       window.setAttribute(QtCore.Qt.WA_Maemo5AutoOrientation, doAutoOrient)
 
 
 try:
@@ -294,13 +346,16 @@ def _null_set_window_orientation(window, orientation):
 
 def _maemo_set_window_orientation(window, orientation):
        if orientation == QtCore.Qt.Vertical:
-               oldHint = QtCore.Qt.WA_Maemo5LandscapeOrientation
-               newHint = QtCore.Qt.WA_Maemo5PortraitOrientation
+               window.setAttribute(QtCore.Qt.WA_Maemo5LandscapeOrientation, False)
+               window.setAttribute(QtCore.Qt.WA_Maemo5PortraitOrientation, True)
        elif orientation == QtCore.Qt.Horizontal:
-               oldHint = QtCore.Qt.WA_Maemo5PortraitOrientation
-               newHint = QtCore.Qt.WA_Maemo5LandscapeOrientation
-       window.setAttribute(oldHint, False)
-       window.setAttribute(newHint, True)
+               window.setAttribute(QtCore.Qt.WA_Maemo5LandscapeOrientation, True)
+               window.setAttribute(QtCore.Qt.WA_Maemo5PortraitOrientation, False)
+       elif orientation is None:
+               window.setAttribute(QtCore.Qt.WA_Maemo5LandscapeOrientation, False)
+               window.setAttribute(QtCore.Qt.WA_Maemo5PortraitOrientation, False)
+       else:
+               raise RuntimeError("Unknown orientation: %r" % orientation)
 
 
 try: