File indexing completed on 2024-04-28 05:26:22

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