Krita Source Code Documentation
Loading...
Searching...
No Matches
KisWidgetChooser Class Reference

#include <kis_widget_chooser.h>

+ Inheritance diagram for KisWidgetChooser:

Classes

struct  Data
 

Public Slots

void showPopupWidget ()
 
void updateThemedIcons ()
 

Public Member Functions

void addLabelWidget (const QString &id, const QString &label, QWidget *widget)
 
template<class TWidget >
TWidget * addWidget (const QString &id, const QString &label="")
 
QWidget * chooseWidget (const QString &id)
 
QWidget * getWidget (const QString &id) const
 
template<class TWidget >
TWidget * getWidget (const QString &id) const
 
 KisWidgetChooser (int id, QWidget *parent=0)
 
 ~KisWidgetChooser () override
 

Protected Slots

void slotButtonPressed ()
 
void slotWidgetChosen (int index)
 

Protected Member Functions

void changeEvent (QEvent *e) override
 

Private Types

typedef QList< Data >::const_iterator ConstIterator
 
typedef QList< Data >::iterator Iterator
 

Private Member Functions

QLayout * createLayout ()
 
QLayout * createPopupLayout ()
 
void removeWidget (const QString &id)
 
void updateArrowIcon ()
 

Private Attributes

QIcon m_acceptIcon
 
QToolButton * m_arrowButton
 
QButtonGroup * m_buttons
 
int m_chooserid
 
QString m_chosenID
 
QFrame * m_popup
 
QList< Datam_widgets
 

Detailed Description

Definition at line 19 of file kis_widget_chooser.h.

Member Typedef Documentation

◆ ConstIterator

typedef QList<Data>::const_iterator KisWidgetChooser::ConstIterator
private

Definition at line 43 of file kis_widget_chooser.h.

◆ Iterator

typedef QList<Data>::iterator KisWidgetChooser::Iterator
private

Definition at line 42 of file kis_widget_chooser.h.

Constructor & Destructor Documentation

◆ KisWidgetChooser()

KisWidgetChooser::KisWidgetChooser ( int id,
QWidget * parent = 0 )

Definition at line 24 of file kis_widget_chooser.cpp.

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}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
QButtonGroup * m_buttons
QToolButton * m_arrowButton
QIcon loadIcon(const QString &name)

References connect(), KisIconUtils::loadIcon(), m_acceptIcon, m_arrowButton, m_buttons, m_popup, slotButtonPressed(), and updateArrowIcon().

◆ ~KisWidgetChooser()

KisWidgetChooser::~KisWidgetChooser ( )
override

Definition at line 42 of file kis_widget_chooser.cpp.

43{
44 delete m_buttons;
45 delete m_popup;
46 delete m_arrowButton;
47}

References m_arrowButton, m_buttons, and m_popup.

Member Function Documentation

◆ addLabelWidget()

void KisWidgetChooser::addLabelWidget ( const QString & id,
const QString & label,
QWidget * widget )

Definition at line 70 of file kis_widget_chooser.cpp.

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}
void removeWidget(const QString &id)
QList< Data > m_widgets

References createLayout(), createPopupLayout(), m_popup, m_widgets, and removeWidget().

◆ addWidget()

template<class TWidget >
TWidget * KisWidgetChooser::addWidget ( const QString & id,
const QString & label = "" )
inline

Definition at line 54 of file kis_widget_chooser.h.

54 {
55 if (id.isEmpty()) {
56 return 0;
57 }
58
59 TWidget* widget = new TWidget();
60 addLabelWidget(id, label, widget);
61 return widget;
62 }
void addLabelWidget(const QString &id, const QString &label, QWidget *widget)

◆ changeEvent()

void KisWidgetChooser::changeEvent ( QEvent * e)
overrideprotected

Definition at line 255 of file kis_widget_chooser.cpp.

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}

References updateArrowIcon().

◆ chooseWidget()

QWidget * KisWidgetChooser::chooseWidget ( const QString & id)

Definition at line 178 of file kis_widget_chooser.cpp.

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);
198 cfg.setToolbarSlider(m_chooserid, id);
199
200 return chosenWidget;
201}
QList< Data >::iterator Iterator

References createLayout(), createPopupLayout(), m_chooserid, m_popup, m_widgets, and KisConfig::setToolbarSlider().

◆ createLayout()

QLayout * KisWidgetChooser::createLayout ( )
private

Definition at line 89 of file kis_widget_chooser.cpp.

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}

References m_arrowButton, and m_widgets.

◆ createPopupLayout()

QLayout * KisWidgetChooser::createPopupLayout ( )
private

Definition at line 108 of file kis_widget_chooser.cpp.

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}
void slotWidgetChosen(int index)
QString buttons(const T &ev)

References buttons(), connect(), KisIconUtils::loadIcon(), m_acceptIcon, m_buttons, m_widgets, and slotWidgetChosen().

◆ getWidget() [1/2]

QWidget * KisWidgetChooser::getWidget ( const QString & id) const

Definition at line 203 of file kis_widget_chooser.cpp.

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}
QList< Data >::const_iterator ConstIterator

References m_widgets.

◆ getWidget() [2/2]

template<class TWidget >
TWidget * KisWidgetChooser::getWidget ( const QString & id) const
inline

Definition at line 65 of file kis_widget_chooser.h.

65 {
66 return dynamic_cast<TWidget*>(getWidget(id));
67 }
QWidget * getWidget(const QString &id) const

◆ removeWidget()

void KisWidgetChooser::removeWidget ( const QString & id)
private

Definition at line 158 of file kis_widget_chooser.cpp.

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}

References createPopupLayout(), m_popup, and m_widgets.

◆ showPopupWidget

void KisWidgetChooser::showPopupWidget ( )
slot

Definition at line 213 of file kis_widget_chooser.cpp.

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}

References m_popup.

◆ slotButtonPressed

void KisWidgetChooser::slotButtonPressed ( )
protectedslot

Definition at line 243 of file kis_widget_chooser.cpp.

244{
246}

References showPopupWidget().

◆ slotWidgetChosen

void KisWidgetChooser::slotWidgetChosen ( int index)
protectedslot

Definition at line 248 of file kis_widget_chooser.cpp.

249{
250 chooseWidget(m_widgets[index].id);
251 m_popup->hide();
252}
QWidget * chooseWidget(const QString &id)

References chooseWidget(), m_popup, and m_widgets.

◆ updateArrowIcon()

void KisWidgetChooser::updateArrowIcon ( )
private

Definition at line 49 of file kis_widget_chooser.cpp.

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}
rgba palette[MAX_PALETTE]
Definition palette.c:35

References m_arrowButton, and palette.

◆ updateThemedIcons

void KisWidgetChooser::updateThemedIcons ( )
slot

Definition at line 234 of file kis_widget_chooser.cpp.

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}
qreal length(const QPointF &vec)
Definition Ellipse.cc:82

References length(), KisIconUtils::loadIcon(), and m_buttons.

Member Data Documentation

◆ m_acceptIcon

QIcon KisWidgetChooser::m_acceptIcon
private

Definition at line 89 of file kis_widget_chooser.h.

◆ m_arrowButton

QToolButton* KisWidgetChooser::m_arrowButton
private

Definition at line 90 of file kis_widget_chooser.h.

◆ m_buttons

QButtonGroup* KisWidgetChooser::m_buttons
private

Definition at line 91 of file kis_widget_chooser.h.

◆ m_chooserid

int KisWidgetChooser::m_chooserid
private

Definition at line 88 of file kis_widget_chooser.h.

◆ m_chosenID

QString KisWidgetChooser::m_chosenID
private

Definition at line 93 of file kis_widget_chooser.h.

◆ m_popup

QFrame* KisWidgetChooser::m_popup
private

Definition at line 92 of file kis_widget_chooser.h.

◆ m_widgets

QList<Data> KisWidgetChooser::m_widgets
private

Definition at line 94 of file kis_widget_chooser.h.


The documentation for this class was generated from the following files: