File indexing completed on 2024-05-12 16:58:29

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