File indexing completed on 2024-05-05 05:35:25

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 class SplitterProxy;
0033 
0034 //* factory
0035 class SplitterFactory : public QObject
0036 {
0037 public:
0038     //* constructor
0039     explicit SplitterFactory(QObject *parent)
0040         : QObject(parent)
0041     {
0042     }
0043 
0044     //* enabled state
0045     void setEnabled(bool);
0046 
0047     //* register widget
0048     bool registerWidget(QWidget *);
0049 
0050     //* unregister widget
0051     void unregisterWidget(QWidget *);
0052 
0053 private:
0054     //* enabled state
0055     bool _enabled = false;
0056 
0057     //* needed to block ChildAdded events when creating proxy
0058     AddEventFilter _addEventFilter;
0059 
0060     //* pointer to SplitterProxy
0061     using SplitterProxyPointer = WeakPointer<SplitterProxy>;
0062 
0063     //* registered widgets
0064     using WidgetMap = QMap<QWidget *, SplitterProxyPointer>;
0065     WidgetMap _widgets;
0066 };
0067 
0068 //* splitter 'proxy' widget, with extended hit area
0069 class SplitterProxy : public QWidget
0070 {
0071 public:
0072     //* constructor
0073     explicit SplitterProxy(QWidget *, bool = false);
0074 
0075     //* event filter
0076     bool eventFilter(QObject *, QEvent *) override;
0077 
0078     //* enable state
0079     void setEnabled(bool);
0080 
0081     //* enable state
0082     bool enabled(void) const
0083     {
0084         return _enabled;
0085     }
0086 
0087 protected:
0088     //* event handler
0089     bool event(QEvent *) override;
0090 
0091 private:
0092     //* reset 'true' splitter widget
0093     void clearSplitter(void);
0094 
0095     //* keep track of 'true' splitter widget
0096     void setSplitter(QWidget *);
0097 
0098     //* enabled state
0099     bool _enabled = false;
0100 
0101     //* splitter object
0102     WeakPointer<QWidget> _splitter;
0103 
0104     //* hook
0105     QPoint _hook;
0106 
0107     //* timer id
0108     int _timerId = 0;
0109 };
0110 }
0111 
0112 #endif