1 | /* |
2 | SPDX-FileCopyrightText: 2001, 2002, 2003 Joseph Wenninger <jowenn@kde.org> |
3 | |
4 | SPDX-License-Identifier: LGPL-2.0-or-later |
5 | */ |
6 | |
7 | #ifndef _KMultitabbar_h_ |
8 | #define _KMultitabbar_h_ |
9 | |
10 | #include <QPushButton> |
11 | #include <QString> |
12 | #include <memory> |
13 | |
14 | #include <kwidgetsaddons_export.h> |
15 | |
16 | class QPixmap; |
17 | class ; |
18 | class QStyleOptionToolButton; |
19 | |
20 | class KMultiTabBarInternal; |
21 | |
22 | /** |
23 | * @class KMultiTabBar kmultitabbar.h KMultiTabBar |
24 | * |
25 | * A Widget for horizontal and vertical tabs. |
26 | * (Note that in Qt4, QTabBar can be vertical as well) |
27 | * |
28 | * It is possible to add normal buttons to the top/left |
29 | * The handling if only one tab at a time or multiple tabs |
30 | * should be raisable is left to the "user". |
31 | * |
32 | * \image html kmultitabbar.png "KMultiTabBar Widget" |
33 | * |
34 | * @author Joseph Wenninger |
35 | */ |
36 | class KWIDGETSADDONS_EXPORT KMultiTabBar : public QWidget |
37 | { |
38 | Q_OBJECT |
39 | Q_PROPERTY(KMultiTabBarPosition position READ position WRITE setPosition) |
40 | Q_PROPERTY(KMultiTabBarStyle tabStyle READ tabStyle WRITE setStyle) |
41 | public: |
42 | enum KMultiTabBarPosition { Left, Right, Top, Bottom }; |
43 | Q_ENUM(KMultiTabBarPosition) |
44 | |
45 | /** |
46 | * The list of available styles for KMultiTabBar |
47 | */ |
48 | enum KMultiTabBarStyle { |
49 | VSNET = 0, ///< Visual Studio .Net like, always shows icon, only show the text of active tabs |
50 | KDEV3ICON = 2, ///< KDevelop 3 like, always shows the text and icons |
51 | STYLELAST = 0xffff, |
52 | }; |
53 | Q_ENUM(KMultiTabBarStyle) |
54 | |
55 | /** |
56 | * Create a KMultiTabBar with Left as KMultiTabBar position. |
57 | * @param parent The parent of the widget. |
58 | * @since 5.24 |
59 | */ |
60 | explicit KMultiTabBar(QWidget *parent = nullptr); |
61 | |
62 | explicit KMultiTabBar(KMultiTabBarPosition pos, QWidget *parent = nullptr); |
63 | ~KMultiTabBar() override; |
64 | |
65 | /** |
66 | * append a new button to the button area. The button can later on be accessed with button(ID) |
67 | * eg for connecting signals to it |
68 | * @param icon a icon for the button |
69 | * @param id an arbitrary ID value. It will be emitted in the clicked signal for identifying the button |
70 | * if more than one button is connected to a signals. |
71 | * @param popup A popup menu which should be displayed if the button is clicked |
72 | * @param not_used_yet will be used for a popup text in the future |
73 | * @since 5.13 |
74 | */ |
75 | int (const QIcon &icon, int id = -1, QMenu * = nullptr, const QString ¬_used_yet = QString()); |
76 | |
77 | /** |
78 | * remove a button with the given ID |
79 | */ |
80 | void removeButton(int id); |
81 | |
82 | /** |
83 | * append a new tab to the tab area. It can be accessed lateron with tabb(id); |
84 | * @param icon a icon for the tab |
85 | * @param id an arbitrary ID which can be used later on to identify the tab |
86 | * @param text if a mode with text is used it will be the tab text, otherwise a mouse over hint |
87 | * @since 5.13 |
88 | */ |
89 | int appendTab(const QIcon &icon, int id = -1, const QString &text = QString()); |
90 | |
91 | /** |
92 | * remove a tab with a given ID |
93 | */ |
94 | void removeTab(int id); |
95 | /** |
96 | * set a tab to "raised" |
97 | * @param id The ID of the tab to manipulate |
98 | * @param state true == activated/raised, false == not active |
99 | */ |
100 | void setTab(int id, bool state); |
101 | /** |
102 | * return the state of a tab, identified by its ID |
103 | */ |
104 | bool isTabRaised(int id) const; |
105 | /** |
106 | * get a pointer to a button within the button area identified by its ID |
107 | */ |
108 | class KMultiTabBarButton *button(int id) const; |
109 | |
110 | /** |
111 | * get a pointer to a tab within the tab area, identified by its ID |
112 | */ |
113 | class KMultiTabBarTab *tab(int id) const; |
114 | |
115 | /** |
116 | * set the real position of the widget. |
117 | * @param pos if the mode is horizontal, only use top, bottom, if it is vertical use left or right |
118 | */ |
119 | void setPosition(KMultiTabBarPosition pos); |
120 | |
121 | /** |
122 | * get the tabbar position. |
123 | * @return position |
124 | */ |
125 | KMultiTabBarPosition position() const; |
126 | |
127 | /** |
128 | * set the display style of the tabs |
129 | */ |
130 | void setStyle(KMultiTabBarStyle style); |
131 | |
132 | /** |
133 | * get the display style of the tabs |
134 | * @return display style |
135 | */ |
136 | KMultiTabBarStyle tabStyle() const; |
137 | |
138 | protected: |
139 | friend class KMultiTabBarButton; |
140 | virtual void fontChange(const QFont &); |
141 | void paintEvent(class QPaintEvent *) override; |
142 | void updateSeparator(); |
143 | |
144 | private: |
145 | std::unique_ptr<class KMultiTabBarPrivate> const d; |
146 | }; |
147 | |
148 | /** |
149 | * @class KMultiTabBarButton kmultitabbar.h KMultiTabBarButton |
150 | * |
151 | * Use KMultiTabBar::appendButton to append a button, which creates a KMultiTabBarButton instance |
152 | */ |
153 | class KWIDGETSADDONS_EXPORT KMultiTabBarButton : public QPushButton |
154 | { |
155 | Q_OBJECT |
156 | public: |
157 | int id() const; |
158 | ~KMultiTabBarButton() override; |
159 | |
160 | public Q_SLOTS: |
161 | void setText(const QString &text); |
162 | |
163 | Q_SIGNALS: |
164 | /** |
165 | * this is emitted if the button is clicked |
166 | * @param id the ID identifying the button |
167 | */ |
168 | void clicked(int id); |
169 | protected Q_SLOTS: |
170 | virtual void slotClicked(); |
171 | |
172 | protected: |
173 | void hideEvent(class QHideEvent *) override; |
174 | void showEvent(class QShowEvent *) override; |
175 | void paintEvent(class QPaintEvent *) override; |
176 | |
177 | /** |
178 | * Should not be created directly. Use KMultiTabBar::appendButton |
179 | */ |
180 | KMultiTabBarButton(const QIcon &icon, const QString &, int id, QWidget *parent); |
181 | |
182 | private: |
183 | friend class KMultiTabBar; |
184 | |
185 | int m_id; |
186 | std::unique_ptr<class KMultiTabBarButtonPrivate> const d; |
187 | }; |
188 | |
189 | /** |
190 | * @class KMultiTabBarTab kmultitabbar.h KMultiTabBarTab |
191 | * |
192 | * Use KMultiTabBar::appendTab to append a tab, which creates a KMultiTabBarTab instance |
193 | */ |
194 | class KWIDGETSADDONS_EXPORT KMultiTabBarTab : public KMultiTabBarButton |
195 | { |
196 | Q_OBJECT |
197 | public: |
198 | ~KMultiTabBarTab() override; |
199 | QSize sizeHint() const override; |
200 | QSize minimumSizeHint() const override; |
201 | |
202 | public Q_SLOTS: |
203 | /** |
204 | * this is used internally, but can be used by the user, if (s)he wants to |
205 | * It the according call of KMultiTabBar is invoked though this modifications will be overwritten |
206 | */ |
207 | void setPosition(KMultiTabBar::KMultiTabBarPosition); |
208 | |
209 | /** |
210 | * this is used internally, but can be used by the user, if (s)he wants to |
211 | * It the according call of KMultiTabBar is invoked though this modifications will be overwritten |
212 | */ |
213 | void setStyle(KMultiTabBar::KMultiTabBarStyle); |
214 | |
215 | /** |
216 | * set the active state of the tab |
217 | * @param state true==active false==not active |
218 | */ |
219 | void setState(bool state); |
220 | |
221 | public: |
222 | using KMultiTabBarButton::setIcon; |
223 | |
224 | protected: |
225 | void paintEvent(QPaintEvent *) override; |
226 | |
227 | private: |
228 | KMultiTabBar::KMultiTabBarPosition m_position; |
229 | KMultiTabBar::KMultiTabBarStyle m_style; |
230 | |
231 | KWIDGETSADDONS_NO_EXPORT void computeMargins(int *hMargin, int *vMargin) const; |
232 | KWIDGETSADDONS_NO_EXPORT QSize computeSizeHint(bool withText) const; |
233 | KWIDGETSADDONS_NO_EXPORT bool shouldDrawText() const; |
234 | KWIDGETSADDONS_NO_EXPORT bool isVertical() const; |
235 | |
236 | KWIDGETSADDONS_NO_EXPORT void initStyleOption(QStyleOptionToolButton *opt) const; |
237 | |
238 | friend class KMultiTabBarInternal; |
239 | /** |
240 | * This class should never be created except with the appendTab call of KMultiTabBar |
241 | */ |
242 | KWIDGETSADDONS_NO_EXPORT |
243 | KMultiTabBarTab(const QIcon &icon, const QString &, int id, QWidget *parent, KMultiTabBar::KMultiTabBarPosition pos, KMultiTabBar::KMultiTabBarStyle style); |
244 | |
245 | std::unique_ptr<class KMultiTabBarTabPrivate> const d; |
246 | }; |
247 | |
248 | #endif |
249 | |