QmlMaterial 0.1.0
Loading...
Searching...
No Matches
tab_bar.hpp
1#pragma once
2#include "qml_material/control/container.hpp"
3#include "qml_material/control/tab_button.hpp"
4#include "qml_material/control/button_group.hpp"
5
6namespace qml_material
7{
8class TabBarAttached;
9class QML_MATERIAL_API TabBar : public Container {
10 Q_OBJECT
11 QML_NAMED_ELEMENT(TabBarBase)
12 QML_ATTACHED(TabBarAttached)
13 Q_PROPERTY(
14 qml_material::TabButton* currentItem READ currentItem NOTIFY currentItemChanged FINAL)
15 Q_PROPERTY(Position position READ position WRITE setPosition NOTIFY positionChanged FINAL)
16 Q_PROPERTY(Mode mode READ mode WRITE setMode NOTIFY modeChanged FINAL)
17 Q_PROPERTY(qreal minimumTabWidth READ minimumTabWidth WRITE setMinimumTabWidth NOTIFY
18 minimumTabWidthChanged FINAL)
19 Q_PROPERTY(
20 qreal edgePadding READ edgePadding WRITE setEdgePadding NOTIFY edgePaddingChanged FINAL)
21 Q_PROPERTY(qreal autoGutter READ autoGutter WRITE setAutoGutter NOTIFY autoGutterChanged FINAL)
22public:
23 enum Mode
24 {
25 Fixed,
26 Scrollable,
27 Auto
28 };
29 Q_ENUM(Mode)
30 enum Position
31 {
32 Header,
33 Footer
34 };
35 Q_ENUM(Position)
36 explicit TabBar(QQuickItem* parent = nullptr);
37 ~TabBar() override;
38 static TabBarAttached* qmlAttachedProperties(QObject*);
39 TabButton* currentItem() const { return qobject_cast<TabButton*>(Container::currentItem()); }
40 Position position() const { return m_position; }
41 void setPosition(Position);
42 Mode mode() const { return m_mode; }
43 void setMode(Mode);
44 qreal minimumTabWidth() const { return m_minimumTabWidth; }
45 void setMinimumTabWidth(qreal);
46 qreal edgePadding() const { return m_edgePadding; }
47 void setEdgePadding(qreal);
48 qreal autoGutter() const { return m_autoGutter; }
49 void setAutoGutter(qreal);
50 Q_SIGNAL void modeChanged();
51 Q_SIGNAL void minimumTabWidthChanged();
52 Q_SIGNAL void edgePaddingChanged();
53 Q_SIGNAL void autoGutterChanged();
54 Q_INVOKABLE TabButton* itemAt(int index) const {
55 return qobject_cast<TabButton*>(Container::itemAt(index));
56 }
57 void incrementCurrentIndex() override;
58 void decrementCurrentIndex() override;
59 Q_SIGNAL void positionChanged();
60
61protected:
62 bool isContent(QQuickItem*) const override;
63 void itemAdded(QQuickItem*) override;
64 void itemRemoved(QQuickItem*) override;
65 void itemsChanged() override;
66 void currentItemChange() override;
67 int initialIndex() const override;
68 void updatePolish() override;
69 void keyPressEvent(QKeyEvent*) override;
70
71private:
72 void navigate(int);
73 ButtonGroup* m_group;
74 QHash<QQuickItem*, QList<QMetaObject::Connection>> m_connections;
75 Position m_position = Header;
76 Mode m_mode = Fixed;
77 qreal m_minimumTabWidth = 90;
78 qreal m_edgePadding = 52;
79 qreal m_autoGutter = 16;
80 bool m_selecting = false;
81 bool m_selection_dirty = false;
82};
83class QML_MATERIAL_API TabBarAttached : public QObject {
84 Q_OBJECT
85 Q_PROPERTY(int index READ index NOTIFY indexChanged FINAL)
86 Q_PROPERTY(TabBar* tabBar READ tabBar NOTIFY tabBarChanged FINAL)
87 Q_PROPERTY(TabBar::Position position READ position NOTIFY positionChanged FINAL)
88public:
89 explicit TabBarAttached(QObject* parent): QObject(parent) {}
90 int index() const { return m_index; }
91 TabBar* tabBar() const { return m_bar; }
92 TabBar::Position position() const { return m_bar ? m_bar->position() : TabBar::Header; }
93 Q_SIGNAL void indexChanged();
94 Q_SIGNAL void tabBarChanged();
95 Q_SIGNAL void positionChanged();
96
97private:
98 friend class TabBar;
99 void update(TabBar*, int);
100 QPointer<TabBar> m_bar;
101 int m_index = -1;
102};
103} // namespace qml_material
104QML_DECLARE_TYPEINFO(qml_material::TabBar, QML_HAS_ATTACHED_PROPERTIES)