Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 import os
00032
00033 from python_qt_binding import loadUi
00034 from python_qt_binding.QtCore import QEvent, QObject, Qt, qWarning
00035 from python_qt_binding.QtGui import QDockWidget, QIcon, QWidget
00036
00037
00038 class DockWidgetTitleBar(QWidget):
00039
00040 """Title bar for dock widgets providing custom actions."""
00041
00042 def __init__(self, dock_widget, qtgui_path):
00043 super(DockWidgetTitleBar, self).__init__(dock_widget)
00044 self._dock_widget = dock_widget
00045
00046 ui_file = os.path.join(qtgui_path, 'resource', 'dock_widget_title_bar.ui')
00047 loadUi(ui_file, self)
00048 self._extra_buttons = {
00049 'configuration': self.configuration_button,
00050 'reload': self.reload_button,
00051 'help': self.help_button,
00052 'close': self.close_button,
00053 }
00054
00055 icon = QIcon.fromTheme('emblem-system')
00056 if not icon.isNull():
00057 self.configuration_button.setIcon(icon)
00058 self.configuration_button.setText("")
00059 icon = QIcon.fromTheme('view-refresh')
00060 if not icon.isNull():
00061 self.reload_button.setIcon(icon)
00062 self.reload_button.setText("")
00063 icon = QIcon.fromTheme('help-browser')
00064 if not icon.isNull():
00065 self.help_button.setIcon(icon)
00066 self.help_button.setText("")
00067
00068 icon = QIcon.fromTheme('window-close')
00069 if not icon.isNull():
00070 self.close_button.setIcon(icon)
00071 self.close_button.setText("")
00072 self.close_button.clicked.connect(self._close_clicked)
00073
00074 self.float_button.clicked.connect(self._toggle_floating)
00075 self.dockable_button.clicked[bool].connect(self._toggle_dockable)
00076 self.minimize_button.clicked.connect(self._minimize_dock_widget)
00077
00078 self._dock_widget.featuresChanged.connect(self._features_changed)
00079 self._features_changed()
00080
00081 self._update_icon()
00082 self._update_title()
00083
00084 self._close_callbacks = []
00085 self._event_callbacks = {
00086 QEvent.WindowIconChange: self._update_icon,
00087 QEvent.WindowTitleChange: self._update_title,
00088 }
00089 self._dock_widget.installEventFilter(self)
00090
00091 def __del__(self):
00092 self._dock_widget.removeEventFilter(self)
00093
00094 def connect_button(self, button_id, callback):
00095 button = self._extra_buttons.get(button_id, None)
00096 if button is None:
00097 qWarning('DockWidgetTitleBar.connect_button(): unknown button_id: %s' % button_id)
00098 return
00099 button.clicked.connect(callback)
00100
00101 def connect_close_button(self, callback):
00102 self._close_callbacks.append(callback)
00103
00104 def _close_clicked(self):
00105 for callback in self._close_callbacks:
00106 callback(self.parent())
00107
00108 def show_button(self, button_id, visibility=True):
00109 button = self._extra_buttons.get(button_id, None)
00110 if button is None:
00111 qWarning('DockWidgetTitleBar.show_button(): unknown button_id: %s' % button_id)
00112 return
00113 button.setVisible(visibility)
00114
00115 def hide_button(self, button_id):
00116 self.show_button(button_id, False)
00117
00118 def eventFilter(self, obj, event):
00119 if event.type() in self._event_callbacks:
00120 ret_val = self._event_callbacks[event.type()](obj, event)
00121 if ret_val is not None:
00122 return ret_val
00123 return QObject.eventFilter(self, obj, event)
00124
00125 def _update_icon(self, *args):
00126 pixmap = None
00127 if self.parentWidget().windowIcon():
00128 pixmap = self.parentWidget().windowIcon().pixmap(self.close_button.iconSize())
00129 self.icon_label.setPixmap(pixmap)
00130
00131 def _update_title(self, *args):
00132 self.title_label.setText(self.parentWidget().windowTitle())
00133
00134 def _toggle_dockable(self, enabled):
00135 dock_widget = self.parentWidget()
00136 if enabled:
00137 dock_widget.setAllowedAreas(Qt.AllDockWidgetAreas)
00138 else:
00139 dock_widget.setAllowedAreas(Qt.NoDockWidgetArea)
00140
00141 def _toggle_floating(self):
00142 dock_widget = self.parentWidget()
00143 dock_widget.setFloating(not dock_widget.isFloating())
00144
00145 def _minimize_dock_widget(self):
00146 dock_widget = self.parentWidget()
00147 dock_widget.hide()
00148
00149 def _features_changed(self, features=None):
00150 if features is None:
00151 features = self.parentWidget().features()
00152
00153 closable = bool(features & QDockWidget.DockWidgetClosable)
00154 self.close_button.setVisible(closable)
00155 self.reload_button.setVisible(closable)
00156
00157 movable = bool(features & QDockWidget.DockWidgetMovable)
00158 self.dockable_button.setChecked(movable)
00159 self._toggle_dockable(self.dockable_button.isChecked())
00160 self.dockable_button.setVisible(movable)
00161 self.float_button.setVisible(movable)
00162 self.minimize_button.setVisible(movable)
00163
00164 def save_settings(self, settings):
00165
00166 movable = bool(self.parentWidget().features() & QDockWidget.DockWidgetMovable)
00167 if movable:
00168 settings.set_value('dockable', self.dockable_button.isChecked())
00169
00170 def restore_settings(self, settings):
00171 dockable = settings.value('dockable', True) in [True, 'true']
00172
00173 movable = bool(self.parentWidget().features() & QDockWidget.DockWidgetMovable)
00174 self.dockable_button.setChecked(dockable and movable)
00175 self._toggle_dockable(self.dockable_button.isChecked())
00176
00177
00178 if __name__ == '__main__':
00179 import sys
00180 from python_qt_binding.QtGui import QApplication
00181 from .dockable_main_window import DockableMainWindow
00182
00183 app = QApplication(sys.argv)
00184
00185 win = DockableMainWindow()
00186
00187 dock1 = QDockWidget('dockwidget1', win)
00188 win.addDockWidget(Qt.LeftDockWidgetArea, dock1)
00189 title_bar = DockWidgetTitleBar(dock1)
00190 dock1.setTitleBarWidget(title_bar)
00191
00192 dock2 = QDockWidget('dockwidget2')
00193 win.addDockWidget(Qt.RightDockWidgetArea, dock2)
00194 title_bar = DockWidgetTitleBar(dock2)
00195 dock2.setTitleBarWidget(title_bar)
00196
00197 win.resize(640, 480)
00198 win.show()
00199
00200 app.exec_()