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

#include <kis_layer_filter_widget.h>

+ Inheritance diagram for KisLayerFilterWidget:

Signals

void filteringOptionsChanged ()
 

Public Member Functions

QSet< int > getActiveColors () const
 
int getDesiredMinimumHeight () const
 
int getDesiredMinimumWidth () const
 
QString getTextFilter () const
 
bool hasTextFilter () const
 
bool isCurrentlyFiltering () const
 
 KisLayerFilterWidget (QWidget *parent=nullptr)
 
void reset ()
 
void showEvent (QShowEvent *show) override
 
QSize sizeHint () const override
 
void updateColorLabels (KisNodeSP root)
 

Static Public Member Functions

static void scanUsedColorLabels (KisNodeSP node, QSet< int > &colorLabels)
 

Private Attributes

class KisColorLabelMouseDragFilterbuttonEventFilter
 
class KisColorLabelFilterGroupbuttonGroup
 
class QPushButton * resetButton
 
class QLineEdit * textFilter
 

Detailed Description

Definition at line 17 of file kis_layer_filter_widget.h.

Constructor & Destructor Documentation

◆ KisLayerFilterWidget()

KisLayerFilterWidget::KisLayerFilterWidget ( QWidget * parent = nullptr)

Definition at line 36 of file kis_layer_filter_widget.cpp.

36 : QWidget(parent)
37{
38 QVBoxLayout *layout = new QVBoxLayout(this);
39 setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
40
42 textFilter->setPlaceholderText(i18n("Filter by name..."));
43 textFilter->setMinimumWidth(200);
44 textFilter->setMinimumHeight(28);
45 textFilter->setClearButtonEnabled(true);
46
47 connect(textFilter, SIGNAL(textChanged(QString)), this, SIGNAL(filteringOptionsChanged()));
48 connect(textFilter, &QLineEdit::returnPressed, [this]() {
49 QMenu* menu = dynamic_cast<QMenu*>(parentWidget());
50 if (menu) {
51 menu->close();
52 }
53 });
54
55 KisNodeViewColorScheme colorScheme;
56
57 QWidget* buttonContainer = new QWidget(this);
58 MouseClickIgnore* mouseEater = new MouseClickIgnore(this);
59 buttonContainer->setToolTip(i18n("Filter by color label..."));
60 buttonContainer->installEventFilter(mouseEater);
62 {
63 QHBoxLayout *subLayout = new QHBoxLayout(buttonContainer);
64 subLayout->setContentsMargins(0,0,0,0);
65 subLayout->setSpacing(2);
66 subLayout->setAlignment(Qt::AlignLeft);
67 buttonGroup = new KisColorLabelFilterGroup(buttonContainer);
68 buttonGroup->setExclusive(false);
69 QVector<QColor> colors = colorScheme.allColorLabels();
70
71 for (int id = 0; id < colors.count(); id++) {
72 KisColorLabelButton* btn = new KisColorLabelButton(colors[id], 22, buttonContainer);
73 buttonGroup->addButton(btn, id);
74 btn->installEventFilter(buttonEventFilter);
75 subLayout->addWidget(btn);
76 }
77
78 connect(buttonGroup, SIGNAL(idToggled(int,bool)), this, SIGNAL(filteringOptionsChanged()));
79 }
80
81 resetButton = new QPushButton(i18n("Reset Filters"), this);
82 resetButton->setMinimumHeight(28);
83 connect(resetButton, &QPushButton::clicked, [this](){
84 this->reset();
85 });
86
87
88 layout->addWidget(textFilter);
89 layout->addWidget(buttonContainer);
90 layout->addWidget(resetButton);
91}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
class QPushButton * resetButton
class KisColorLabelMouseDragFilter * buttonEventFilter
class KisColorLabelFilterGroup * buttonGroup
void filteringOptionsChanged()

References buttonEventFilter, buttonGroup, connect(), filteringOptionsChanged(), reset(), resetButton, and textFilter.

Member Function Documentation

◆ filteringOptionsChanged

void KisLayerFilterWidget::filteringOptionsChanged ( )
signal

◆ getActiveColors()

QSet< int > KisLayerFilterWidget::getActiveColors ( ) const

Definition at line 127 of file kis_layer_filter_widget.cpp.

128{
129 QSet<int> activeColors = buttonGroup->getActiveLabels();
130
131 return activeColors;
132}

References buttonGroup, and KisColorLabelFilterGroup::getActiveLabels().

◆ getDesiredMinimumHeight()

int KisLayerFilterWidget::getDesiredMinimumHeight ( ) const

Definition at line 143 of file kis_layer_filter_widget.cpp.

143 {
145 if (viableButtons.count() > 1) {
146 return viableButtons[0]->sizeHint().height() + textFilter->minimumHeight() + resetButton->minimumHeight();
147 } else {
148 return textFilter->minimumHeight() + resetButton->minimumHeight();
149 }
150}
QList< QAbstractButton * > viableButtons() const

References buttonGroup, resetButton, textFilter, and KisColorLabelFilterGroup::viableButtons().

◆ getDesiredMinimumWidth()

int KisLayerFilterWidget::getDesiredMinimumWidth ( ) const

Definition at line 139 of file kis_layer_filter_widget.cpp.

139 {
140 return qMax(textFilter->minimumWidth(), buttonGroup->countViableButtons() * 32);
141}

References buttonGroup, KisColorLabelFilterGroup::countViableButtons(), and textFilter.

◆ getTextFilter()

QString KisLayerFilterWidget::getTextFilter ( ) const

Definition at line 134 of file kis_layer_filter_widget.cpp.

135{
136 return textFilter->text();
137}

References textFilter.

◆ hasTextFilter()

bool KisLayerFilterWidget::hasTextFilter ( ) const

Definition at line 122 of file kis_layer_filter_widget.cpp.

123{
124 return !textFilter->text().isEmpty();
125}

References textFilter.

◆ isCurrentlyFiltering()

bool KisLayerFilterWidget::isCurrentlyFiltering ( ) const

Definition at line 114 of file kis_layer_filter_widget.cpp.

115{
116 const bool isFilteringText = hasTextFilter();
117 const bool isFilteringColors = buttonGroup->getActiveLabels().count() > 0;
118
119 return isFilteringText || isFilteringColors;
120}

References buttonGroup, KisColorLabelFilterGroup::getActiveLabels(), and hasTextFilter().

◆ reset()

void KisLayerFilterWidget::reset ( )

◆ scanUsedColorLabels()

void KisLayerFilterWidget::scanUsedColorLabels ( KisNodeSP node,
QSet< int > & colorLabels )
static

Definition at line 93 of file kis_layer_filter_widget.cpp.

94{
95 if (node->parent()) {
96 colorLabels.insert(node->colorLabelIndex());
97 }
98
99 KisNodeSP child = node->firstChild();
100 while(child) {
101 scanUsedColorLabels(child, colorLabels);
102 child = child->nextSibling();
103 }
104}
static void scanUsedColorLabels(KisNodeSP node, QSet< int > &colorLabels)
int colorLabelIndex() const
KisNodeSP firstChild() const
Definition kis_node.cpp:361
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References KisBaseNode::colorLabelIndex(), KisNode::firstChild(), KisNode::nextSibling(), KisNode::parent, and scanUsedColorLabels().

◆ showEvent()

void KisLayerFilterWidget::showEvent ( QShowEvent * show)
override

Definition at line 164 of file kis_layer_filter_widget.cpp.

165{
166 QMenu *parentMenu = dynamic_cast<QMenu*>(parentWidget());
167
168 if (parentMenu) {
169 const int widthBefore = parentMenu->width();
170 const int rightEdgeThreshold = 5;
171
172 //Fake resize event needs to be made to register change in widget menu size.
173 //Not doing this will cause QMenu to not resize properly!
174 resize(sizeHint());
175
176 adjustSize();
177 QResizeEvent event = QResizeEvent(sizeHint(), parentMenu->size());
178
179 parentMenu->resize(sizeHint());
180 parentMenu->adjustSize();
181 qApp->sendEvent(parentMenu, &event);
182 QScreen *screen = QGuiApplication::screenAt(parentMenu->mapToGlobal(parentMenu->pos()));
183 QRect screenGeometry = screen ? screen->geometry() : parentMenu->parentWidget()->window()->geometry();
184 const bool onRightEdge = (parentMenu->pos().x() + widthBefore + rightEdgeThreshold) > screenGeometry.width();
185 const int widthAfter = parentMenu->width();
186
187
188 if (onRightEdge) {
189 if (widthAfter > widthBefore) {
190 const QRect newGeo = kisEnsureInRect( parentMenu->geometry(), screenGeometry );
191 const int xShift = newGeo.x() - parentMenu->pos().x();
192 parentMenu->move(parentMenu->pos().x() + xShift, parentMenu->pos().y() + 0);
193 } else {
194 const int xShift = widthBefore - widthAfter;
195 parentMenu->move(parentMenu->pos().x() + xShift, parentMenu->pos().y() + 0);
196 }
197 }
198 }
199 QWidget::showEvent(show);
200}
QSize sizeHint() const override
QRect kisEnsureInRect(QRect rc, const QRect &bounds)
Definition kis_global.h:267

References kisEnsureInRect(), and sizeHint().

◆ sizeHint()

QSize KisLayerFilterWidget::sizeHint ( ) const
override

◆ updateColorLabels()

void KisLayerFilterWidget::updateColorLabels ( KisNodeSP root)

Definition at line 106 of file kis_layer_filter_widget.cpp.

107{
108 QSet<int> colorLabels;
109
110 scanUsedColorLabels(root, colorLabels);
111 buttonGroup->setViableLabels(colorLabels);
112}
void setViableLabels(const QSet< int > &buttons)

References buttonGroup, scanUsedColorLabels(), and KisColorLabelFilterGroup::setViableLabels().

Member Data Documentation

◆ buttonEventFilter

class KisColorLabelMouseDragFilter* KisLayerFilterWidget::buttonEventFilter
private

Definition at line 21 of file kis_layer_filter_widget.h.

◆ buttonGroup

class KisColorLabelFilterGroup* KisLayerFilterWidget::buttonGroup
private

Definition at line 23 of file kis_layer_filter_widget.h.

◆ resetButton

class QPushButton* KisLayerFilterWidget::resetButton
private

Definition at line 24 of file kis_layer_filter_widget.h.

◆ textFilter

class QLineEdit* KisLayerFilterWidget::textFilter
private

Definition at line 22 of file kis_layer_filter_widget.h.


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