itom 1.3.0
|
00001 /* ******************************************************************** 00002 itom software 00003 URL: http://www.uni-stuttgart.de/ito 00004 Copyright (C) 2013, Institut für Technische Optik (ITO), 00005 Universität Stuttgart, Germany 00006 00007 This file is part of itom. 00008 00009 itom is free software; you can redistribute it and/or modify it 00010 under the terms of the GNU Library General Public Licence as published by 00011 the Free Software Foundation; either version 2 of the Licence, or (at 00012 your option) any later version. 00013 00014 itom is distributed in the hope that it will be useful, but 00015 WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library 00017 General Public Licence for more details. 00018 00019 You should have received a copy of the GNU Library General Public License 00020 along with itom. If not, see <http://www.gnu.org/licenses/>. 00021 *********************************************************************** */ 00022 00023 #ifndef ABSTRACTDOCKWIDGET_H 00024 #define ABSTRACTDOCKWIDGET_H 00025 00026 #include "../global.h" 00027 #include "../common/sharedStructures.h" 00028 00029 #include <qmainwindow.h> 00030 #include <qdockwidget.h> 00031 #include <qmenubar.h> 00032 #include <qevent.h> 00033 #include <qmap.h> 00034 #include <qtoolbar.h> 00035 #include <qdebug.h> 00036 #include <qstring.h> 00037 #include <qaction.h> 00038 #include <qshortcut.h> 00039 #include <qrect.h> 00040 #include <qwidget.h> 00041 00042 00043 namespace ito 00044 { 00045 class AbstractDockWidget : public QDockWidget 00046 { 00047 Q_OBJECT 00048 00049 //these properties are taken from QWidget in order to redirect them either to the QDockWidget or to the main window (depending on dock status) 00050 Q_PROPERTY(bool visible READ isVisible WRITE setVisible DESIGNABLE false) 00051 Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled) 00052 00053 Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry) 00054 Q_PROPERTY(QRect frameGeometry READ frameGeometry) 00055 Q_PROPERTY(QRect normalGeometry READ normalGeometry) 00056 Q_PROPERTY(int x READ x) 00057 Q_PROPERTY(int y READ y) 00058 Q_PROPERTY(QPoint pos READ pos WRITE move DESIGNABLE false STORED false) 00059 Q_PROPERTY(QSize frameSize READ frameSize) 00060 Q_PROPERTY(QSize size READ size WRITE resize DESIGNABLE false STORED false) 00061 Q_PROPERTY(int width READ width) 00062 Q_PROPERTY(int height READ height) 00063 Q_PROPERTY(QRect rect READ rect) 00064 Q_PROPERTY(QRect childrenRect READ childrenRect) 00065 Q_PROPERTY(QRegion childrenRegion READ childrenRegion) 00066 00067 public: 00068 00069 enum tFloatingStyle { floatingNone, floatingStandard, floatingWindow }; 00070 enum tMovingStyle { movingDisabled, movingEnabled }; 00071 enum tTopLevelStyle { topLevelOverall, topLevelParentOnly, topLevelNothing }; 00072 00073 struct Toolbar 00074 { 00075 Toolbar() : section(0), key(""), tb(NULL) {} 00076 Qt::ToolBarArea area; 00077 int section; 00078 QString key; 00079 QToolBar *tb; 00080 }; 00081 00082 AbstractDockWidget(bool docked, bool isDockAvailable, tFloatingStyle floatingStyle, tMovingStyle movingStyle, const QString &title = QString(), const QString &objName = QString(), QWidget *parent = 0); 00083 virtual ~AbstractDockWidget(); 00084 00085 inline bool docked() const { return m_docked; } 00087 RetVal setAdvancedWindowTitle( QString newCompleteTitle = QString(), bool appendToBasicTitle = true ); 00088 00089 RetVal setTopLevel( tTopLevelStyle topLevel ); 00090 00091 void setParent ( QWidget * parent ) { m_overallParent = parent; QDockWidget::setParent(parent); } 00092 00093 QWidget *getActiveInstance() 00094 { 00095 if(!m_docked && m_floatingStyle == floatingWindow) 00096 { 00097 return m_pWindow; 00098 } 00099 return this; 00100 } 00101 00102 //these methods are mainly redirected to QDockWidget or QMainWindow (depending on dock status) 00103 #define QWIDGETPROPGETTER(gettername) if(m_docked && m_dockAvailable) { return QDockWidget::gettername(); } else { return m_pWindow->gettername(); } 00104 00105 #define QWIDGETPROPSETTER(settername,...) \ 00106 if (m_docked) \ 00107 { \ 00108 QDockWidget::settername(__VA_ARGS__); \ 00109 } \ 00110 else \ 00111 { \ 00112 if (m_floatingStyle == floatingWindow) \ 00113 { \ 00114 m_pWindow->settername(__VA_ARGS__); \ 00115 QDockWidget::settername(__VA_ARGS__); \ 00116 } \ 00117 else \ 00118 { \ 00119 QDockWidget::settername(__VA_ARGS__); \ 00120 } \ 00121 } 00122 00123 #define QWIDGETPROPSETTERSPECIAL(settername,...) \ 00124 if (m_docked) \ 00125 { \ 00126 QDockWidget::settername(__VA_ARGS__); \ 00127 } \ 00128 else \ 00129 { \ 00130 if (m_floatingStyle == floatingWindow) \ 00131 { \ 00132 m_pWindow->settername(__VA_ARGS__); \ 00133 } \ 00134 else \ 00135 { \ 00136 QDockWidget::settername(__VA_ARGS__); \ 00137 } \ 00138 } 00139 00140 QRect frameGeometry() const; 00141 const QRect &geometry() const; 00142 QRect normalGeometry() const; 00143 00144 int x() const; 00145 int y() const; 00146 QPoint pos() const; 00147 QSize frameSize() const; 00148 QSize size() const; 00149 int width() const; 00150 int height() const; 00151 QRect rect() const; 00152 QRect childrenRect() const; 00153 QRegion childrenRegion() const; 00154 00155 void move(int x, int y); 00156 void move(const QPoint &); 00157 void resize(int w, int h); 00158 void resize(const QSize &); 00159 void setGeometry(int x, int y, int w, int h); 00160 void setGeometry(const QRect &); 00161 00162 bool isEnabled() const; 00163 bool isVisible() const; 00164 00165 void saveState(const QString &iniName) const; 00166 void restoreState(const QString &iniName) const; 00167 00168 public Q_SLOTS: 00169 void setEnabled(bool); 00170 virtual void setVisible(bool visible); 00171 00172 protected: 00173 00174 class ShortcutAction : public QObject 00175 { 00176 public: 00177 ShortcutAction(const QString &text, AbstractDockWidget *parent) : QObject(parent), m_action(NULL), m_shortcut(NULL) 00178 { 00179 m_action = new QAction(text, parent); 00180 QString toolTipText = text; 00181 toolTipText.replace("&", ""); 00182 m_action->setToolTip(toolTipText); 00183 } 00184 00185 ShortcutAction(const QIcon &icon, const QString &text, AbstractDockWidget *parent) : QObject(parent), m_action(NULL), m_shortcut(NULL) 00186 { 00187 m_action = new QAction(icon, text, parent); 00188 QString toolTipText = text; 00189 toolTipText.replace("&", ""); 00190 m_action->setToolTip(toolTipText); 00191 } 00192 00193 ShortcutAction(const QIcon &icon, const QString &text, AbstractDockWidget *parent, const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut) : QObject(parent), m_action(NULL), m_shortcut(NULL) 00194 { 00195 QString text2 = text; 00196 QString text3 = text; 00197 text3.replace("&", ""); 00198 00199 //some key sequences do not exist as default on all operating systems 00200 if (key.isEmpty() == false) 00201 { 00202 text2 += "\t" + key.toString(QKeySequence::NativeText); 00203 text3 += " (" + key.toString(QKeySequence::NativeText) + ")"; 00204 00205 m_shortcut = new QShortcut(key, parent->getCanvas()); 00206 m_shortcut->setContext(context); 00207 } 00208 00209 m_action = new QAction(icon, text2, parent); 00210 m_action->setToolTip(text3); 00211 } 00212 00213 ~ShortcutAction() 00214 { 00215 //do not delete action and shortcut here, since it will be deleted by common parent. 00216 } 00217 00218 void connectTrigger(const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) 00219 { 00220 if(m_action) 00221 { 00222 QObject::connect(m_action, SIGNAL(triggered()), receiver, method, type); 00223 } 00224 if(m_shortcut) 00225 { 00226 QObject::connect(m_shortcut, SIGNAL(activated()), receiver, method, type); 00227 } 00228 } 00229 00230 void setEnabled(bool actionEnabled, bool shortcutEnabled) 00231 { 00232 if(m_action) 00233 { 00234 m_action->setEnabled(actionEnabled); 00235 if(m_shortcut) m_shortcut->setEnabled(shortcutEnabled); 00236 } 00237 } 00238 00239 void setEnabled(bool enabled) 00240 { 00241 setEnabled(enabled,enabled); 00242 } 00243 00244 void setVisible(bool actionVisible, bool shortcutEnabled) 00245 { 00246 if(m_action) 00247 { 00248 m_action->setVisible(actionVisible); 00249 if(m_shortcut) m_shortcut->setEnabled(shortcutEnabled); 00250 } 00251 } 00252 00253 void setVisible(bool visible) 00254 { 00255 setVisible(visible,visible); 00256 } 00257 00258 QAction* action() { return m_action; } 00259 00260 private: 00261 QAction *m_action; 00262 QShortcut *m_shortcut; 00263 }; 00264 00266 00271 bool eventFilter(QObject *obj, QEvent *event) 00272 { 00273 if (event->type() == QEvent::Close) 00274 { 00275 closeEvent((QCloseEvent*)event); 00276 if(testAttribute(Qt::WA_DeleteOnClose) && event->isAccepted() ) //if window should be closed and dockwidget is assigned with WA_DeleteOnClose, delete this dockwidget first. 00277 { 00278 deleteLater(); 00279 } 00280 00281 return true; 00282 } 00283 else 00284 { 00285 return QObject::eventFilter(obj,event); 00286 } 00287 }; 00288 00289 //void showEvent(QShowEvent * event); 00290 00291 void init(); 00292 00293 virtual void closeEvent(QCloseEvent *event); 00294 00295 virtual void createActions() = 0; 00296 virtual void createMenus() = 0; 00297 virtual void createToolBars() = 0; 00298 virtual void createStatusBar() = 0; 00299 virtual void updateActions() {} 00300 virtual void updatePythonActions() = 0; 00301 00302 Qt::WindowFlags modifyFlags(const Qt::WindowFlags &flags, const Qt::WindowFlags &setFlags, const Qt::WindowFlags &unsetFlags); 00303 00304 virtual void windowStateChanged( bool /*windowNotToolbox*/ ) {} 00305 00306 void setContentWidget(QWidget *widget); 00307 inline QWidget* getContentWidget() const { return m_pWindow->centralWidget(); } 00308 inline QMainWindow* getCanvas() { return m_pWindow; } 00309 00310 inline bool pythonBusy() const { return m_pythonBusy; } 00311 inline bool pythonDebugMode() const { return m_pythonDebugMode; } 00312 inline bool pythonInWaitingMode() const { return m_pythonInWaitingMode; } 00314 //RetVal addAndRegisterToolBar(QToolBar* tb, QString key); 00315 //RetVal unregisterToolBar(QString key); 00316 QToolBar* getToolBar(QString key) const; 00317 inline QMenuBar* getMenuBar() const { return (m_pWindow == NULL) ? NULL : m_pWindow->menuBar(); } 00318 00319 RetVal addToolBar(QToolBar *tb, const QString &key, Qt::ToolBarArea area = Qt::TopToolBarArea, int section = 1); 00320 RetVal removeToolBar(const QString &key); 00321 00322 QAction *m_actStayOnTop; 00323 QAction *m_actStayOnTopOfApp; 00324 00325 private: 00326 00327 void contextMenuEvent(QContextMenuEvent *e) 00328 { 00329 e->accept(); 00330 qDebug() << "context menu of abstractDockWidget clicked. [placeholder for (un)docking feature.] pos: " << e->pos(); 00331 } 00332 00333 QMainWindow *m_pWindow; 00334 00335 bool m_docked; 00336 bool m_dockAvailable; 00337 tFloatingStyle m_floatingStyle; 00338 tMovingStyle m_movingStyle; 00339 QString m_basicTitle; 00340 QString m_completeTitle; 00342 QMap<QString,QToolBar*> m_toolBars; 00343 QList<Toolbar> m_toolbars; 00344 00345 bool m_pythonBusy; 00346 bool m_pythonDebugMode; 00347 bool m_pythonInWaitingMode; 00349 QToolBar* m_dockToolbar; 00350 QAction* m_actDock; 00351 QAction* m_actUndock; 00352 00353 QWidget* m_overallParent; 00354 tTopLevelStyle m_recentTopLevelStyle; 00355 00356 QSize m_oldMinSize; 00357 QSize m_oldMaxSize; 00358 QRect m_lastUndockedSize; 00359 00360 //signals: 00361 // void addDockToMainWindow(AbstractDockWidget *widget); /*!< signal emitted if widget should be docked to main window */ 00362 // void removeDockFromMainWindow(AbstractDockWidget *widget); 00363 // void dockCloseRequest(AbstractDockWidget *widget); 00364 00365 public slots: 00366 virtual void dockedToMainWindow(AbstractDockWidget * /*widget*/){} 00367 virtual void removedFromMainWindow(AbstractDockWidget * /*widget*/){} 00368 virtual void pythonStateChanged(tPythonTransitions pyTransition); 00369 00370 void raiseAndActivate(); 00372 void setDockSize(int newWidth, int newHeight); 00373 00374 void dockWidget(); 00375 void undockWidget(); 00376 00377 private slots: 00378 void mnuStayOnTop(bool checked); 00379 void mnuStayOnTopOfApp(bool checked); 00380 00381 void returnToOldMinMaxSizes(); 00382 00383 }; 00384 00385 } //end namespace ito 00386 00387 #endif