Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_widget_chooser.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8
9#include <kis_icon.h>
10
11#include <QGridLayout>
12#include <QHBoxLayout>
13#include <QToolButton>
14#include <QApplication>
15#include <QScreen>
16#include <QFrame>
17#include <QLabel>
18#include <QButtonGroup>
19#include <QStylePainter>
20#include <QStyleOption>
21
22#include "kis_config.h"
23
24KisWidgetChooser::KisWidgetChooser(int id, QWidget* parent)
25 : QFrame(parent)
26 , m_chooserid(id)
27{
29 m_buttons = new QButtonGroup();
30 m_popup = new QFrame(0, Qt::Popup);
31 m_arrowButton = new QToolButton();
32
33 m_popup->setFrameStyle(QFrame::Panel|QFrame::Raised);
34 m_arrowButton->setFixedWidth(m_arrowButton->sizeHint().height());
35 m_arrowButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
36 m_arrowButton->setAutoRaise(true);
38
39 connect(m_arrowButton, SIGNAL(clicked(bool)), SLOT(slotButtonPressed()));
40}
41
43{
44 delete m_buttons;
45 delete m_popup;
46 delete m_arrowButton;
47}
48
50{
51 QImage image(16, 16, QImage::Format_ARGB32);
52 image.fill(0);
53
54 QStylePainter painter(&image, this);
55 QStyleOption option;
56
57 option.rect = image.rect();
58 option.palette = palette();
59 option.state = QStyle::State_Enabled;
60 option.palette.setBrush(QPalette::ButtonText, option.palette.text());
61
62 painter.setBrush(option.palette.text().color());
63 painter.setPen(option.palette.text().color());
64 painter.drawPrimitive(QStyle::PE_IndicatorArrowDown, option);
65 painter.end(); // Otherwise there will always be a copy
66
67 m_arrowButton->setIcon(QIcon(QPixmap::fromImage(image)));
68}
69
70void KisWidgetChooser::addLabelWidget(const QString& id, const QString& label, QWidget* widget)
71{
72 removeWidget(id);
73
74 if (label.isEmpty()) {
75 m_widgets.push_back(Data(id, widget, 0));
76 }
77 else {
78 m_widgets.push_back(Data(id, widget, new QLabel(label)));
79 }
80
81 delete m_popup->layout();
82 m_popup->setLayout(createPopupLayout());
83 m_popup->adjustSize();
84
85 delete QWidget::layout();
86 QWidget::setLayout(createLayout());
87}
88
90{
91 QHBoxLayout* layout = new QHBoxLayout();
92 layout->setContentsMargins(0, 0, 0, 0);
93 layout->setSpacing(0);
94 layout->addWidget(m_arrowButton);
95
96 for(Iterator i=m_widgets.begin(); i!=m_widgets.end(); ++i) {
97 if(i->chosen) {
98 if (i->label) {
99 layout->addWidget(i->label);
100 }
101 layout->addWidget(i->widget);
102 break;
103 }
104 }
105 return layout;
106}
107
109{
110 QGridLayout* layout = new QGridLayout();
111 int row = 0;
112 int idx = 0;
113
114 layout->setContentsMargins(0, 0, 0, 0);
115 layout->setSpacing(0);
116
117 QButtonGroup* group = new QButtonGroup();
119
120 for(Iterator i=m_widgets.begin(); i!=m_widgets.end(); ++i) {
121 if(!i->chosen) {
122 if(row == buttons.size()) {
123 QToolButton* bn = new QToolButton();
124
126 bn->setIcon(m_acceptIcon);
127 bn->setAutoRaise(true);
128 buttons.push_back(bn);
129 }
130
131 if (i->label) {
132 layout->addWidget(i->label , row, 0);
133 layout->addWidget(i->widget , row, 1);
134 layout->addWidget(buttons[row], row, 2);
135 }
136 else {
137 layout->addWidget(i->widget , row, 0);
138 layout->addWidget(buttons[row], row, 1);
139 }
140 group->addButton(buttons[row], idx);
141 ++row;
142 }
143
144 ++idx;
145 }
146
147 for(int i=row; i<buttons.size(); ++i)
148 delete buttons[i];
149
150 delete m_buttons;
151
152 m_buttons = group;
153 connect(m_buttons, SIGNAL(idClicked(int)), SLOT(slotWidgetChosen(int)));
154
155 return layout;
156}
157
158void KisWidgetChooser::removeWidget(const QString& id)
159{
160 Iterator data = std::find(m_widgets.begin(), m_widgets.end(), Data(id));
161
162 if(data != m_widgets.end()) {
163 if(!data->chosen) {
164 delete m_popup->layout();
165 m_popup->setLayout(createPopupLayout());
166 m_popup->adjustSize();
167 }
168 else delete QWidget::layout();
169
170 if (data->label) {
171 delete data->label;
172 }
173 delete data->widget;
174 m_widgets.erase(data);
175 }
176}
177
178QWidget* KisWidgetChooser::chooseWidget(const QString& id)
179{
180 QWidget* chosenWidget = 0;
181
182 for(Iterator i=m_widgets.begin(); i!=m_widgets.end(); ++i) {
183 if(i->id == id) {
184 chosenWidget = i->widget;
185 i->chosen = true;
186 }
187 else i->chosen = false;
188 }
189
190 delete m_popup->layout();
191 m_popup->setLayout(createPopupLayout());
192 m_popup->adjustSize();
193
194 delete QWidget::layout();
195 QWidget::setLayout(createLayout());
196
197 KisConfig cfg(false);
199
200 return chosenWidget;
201}
202
203QWidget* KisWidgetChooser::getWidget(const QString& id) const
204{
205 ConstIterator data = std::find(m_widgets.begin(), m_widgets.end(), Data(id));
206
207 if(data != m_widgets.end())
208 return data->widget;
209
210 return 0;
211}
212
214{
215 QSize popSize = m_popup->size();
216 QRect popupRect(QFrame::mapToGlobal(QPoint(-1, QFrame::height())), popSize);
217
218 // Get the available geometry of the screen which contains this KisPopupButton
219 QRect screenRect = this->screen()->availableGeometry();
220
221 // Make sure the popup is not drawn outside the screen area
222 if(popupRect.right() > screenRect.right())
223 popupRect.translate(screenRect.right() - popupRect.right(), 0);
224 if(popupRect.left() < screenRect.left())
225 popupRect.translate(screenRect.left() - popupRect.left(), 0);
226 if(popupRect.bottom() > screenRect.bottom())
227 popupRect.translate(0, -popupRect.height());
228
229 m_popup->setGeometry(popupRect);
230 m_popup->show();
231}
232
233
235{
236 for (int i = 0; i < m_buttons->buttons().length(); i++) {
237 if ( m_buttons->button(i)) {
238 m_buttons->button(i)->setIcon(KisIconUtils::loadIcon("list-add"));
239 }
240 }
241}
242
247
249{
250 chooseWidget(m_widgets[index].id);
251 m_popup->hide();
252}
253
254
256{
257 QFrame::changeEvent(e);
258
259 switch (e->type()) {
260 case QEvent::StyleChange:
261 case QEvent::PaletteChange:
262 case QEvent::EnabledChange:
264 break;
265 default:
266 ;
267 }
268}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setToolbarSlider(int sliderNumber, const QString &slider)
QList< Data >::const_iterator ConstIterator
void slotWidgetChosen(int index)
QButtonGroup * m_buttons
void removeWidget(const QString &id)
KisWidgetChooser(int id, QWidget *parent=0)
QList< Data >::iterator Iterator
QToolButton * m_arrowButton
QList< Data > m_widgets
QWidget * getWidget(const QString &id) const
void changeEvent(QEvent *e) override
QWidget * chooseWidget(const QString &id)
void addLabelWidget(const QString &id, const QString &label, QWidget *widget)
QString buttons(const T &ev)
QIcon loadIcon(const QString &name)
rgba palette[MAX_PALETTE]
Definition palette.c:35