File indexing completed on 2024-05-19 13:22:06
0001 #ifndef oxygensplitterproxy_h 0002 #define oxygensplitterproxy_h 0003 0004 ////////////////////////////////////////////////////////////////////////////// 0005 // oxygensplitterproxy.h 0006 // Extended hit area for Splitters 0007 // ------------------- 0008 // 0009 // SPDX-FileCopyrightText: 2011 Hugo Pereira Da Costa <hugo.pereira@free.fr> 0010 // 0011 // Based on Bespin splitterproxy code 0012 // SPDX-FileCopyrightText: 2011 Thomas Luebking <thomas.luebking@web.de> 0013 // 0014 // 0015 // SPDX-License-Identifier: LGPL-2.0-only 0016 ////////////////////////////////////////////////////////////////////////////// 0017 0018 #include "oxygen.h" 0019 0020 #include <QEvent> 0021 #include <QHoverEvent> 0022 #include <QMainWindow> 0023 #include <QMap> 0024 #include <QMouseEvent> 0025 #include <QSplitterHandle> 0026 #include <QWidget> 0027 0028 #include "oxygenaddeventfilter.h" 0029 0030 namespace Oxygen 0031 { 0032 0033 class SplitterProxy; 0034 0035 //* factory 0036 class SplitterFactory : public QObject 0037 { 0038 public: 0039 //* constructor 0040 explicit SplitterFactory(QObject *parent) 0041 : QObject(parent) 0042 { 0043 } 0044 0045 //* enabled state 0046 void setEnabled(bool); 0047 0048 //* register widget 0049 bool registerWidget(QWidget *); 0050 0051 //* unregister widget 0052 void unregisterWidget(QWidget *); 0053 0054 private: 0055 //* enabled state 0056 bool _enabled = false; 0057 0058 //* needed to block ChildAdded events when creating proxy 0059 AddEventFilter _addEventFilter; 0060 0061 //* pointer to SplitterProxy 0062 using SplitterProxyPointer = WeakPointer<SplitterProxy>; 0063 0064 //* registered widgets 0065 using WidgetMap = QMap<QWidget *, SplitterProxyPointer>; 0066 WidgetMap _widgets; 0067 }; 0068 0069 //* splitter 'proxy' widget, with extended hit area 0070 class SplitterProxy : public QWidget 0071 { 0072 public: 0073 //* constructor 0074 explicit SplitterProxy(QWidget *, bool = false); 0075 0076 //* event filter 0077 bool eventFilter(QObject *, QEvent *) override; 0078 0079 //* enable state 0080 void setEnabled(bool); 0081 0082 //* enable state 0083 bool enabled(void) const 0084 { 0085 return _enabled; 0086 } 0087 0088 protected: 0089 //* event handler 0090 bool event(QEvent *) override; 0091 0092 private: 0093 //* reset 'true' splitter widget 0094 void clearSplitter(void); 0095 0096 //* keep track of 'true' splitter widget 0097 void setSplitter(QWidget *); 0098 0099 //* enabled state 0100 bool _enabled = false; 0101 0102 //* splitter object 0103 WeakPointer<QWidget> _splitter; 0104 0105 //* hook 0106 QPoint _hook; 0107 0108 //* timer id 0109 int _timerId = 0; 0110 }; 0111 } 0112 0113 #endif