File indexing completed on 2024-05-19 09:27:58

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