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

#include <LayerBox.h>

+ Inheritance diagram for LayerBox:

Signals

void imageChanged ()
 

Public Member Functions

 LayerBox ()
 
QString observerName () override
 
void setCanvas (KoCanvasBase *canvas) override
 
void setViewManager (KisViewManager *kisview) override
 reimplemented from KisMainwindowObserver
 
void unsetCanvas () override
 
 ~LayerBox () override
 
- Public Member Functions inherited from KisMainwindowObserver
 KisMainwindowObserver ()
 
 ~KisMainwindowObserver () override
 
- Public Member Functions inherited from KoCanvasObserverBase
 KoCanvasObserverBase ()
 
KoCanvasBaseobservedCanvas () const
 
void setObservedCanvas (KoCanvasBase *canvas)
 
void unsetObservedCanvas ()
 
virtual ~KoCanvasObserverBase ()
 

Protected Member Functions

void hideEvent (QHideEvent *event) override
 
void showEvent (QShowEvent *event) override
 

Private Slots

void notifyImageDeleted ()
 
void selectionChanged (const QModelIndexList &selection)
 
void setCurrentNode (KisNodeSP node)
 
void slotAddLayerBnClicked ()
 
void slotAdjustCurrentBeforeRemoveRows (const QModelIndex &parent, int first, int last)
 
void slotChangeCloneSourceClicked ()
 
void slotCollapsed (const QModelIndex &index)
 
void slotColorLabelChanged (int index)
 
void slotCompositeOpChanged (int index)
 
void slotContextMenuRequested (const QPoint &pos, const QModelIndex &index)
 
void slotEditGlobalSelection (bool showSelections)
 
void slotExpanded (const QModelIndex &index)
 
void slotForgetAboutSavedNodeBeforeEditSelectionMode ()
 
void slotImageTimeChanged (int time)
 
void slotLayerOpMenuClosed ()
 
void slotLayerOpMenuOpened ()
 
void slotLowerClicked ()
 
void slotModelReset ()
 
void slotNodeCollapsedChanged ()
 
void slotNodeManagerChangedSelection (const QList< KisNodeSP > &nodes)
 
void slotOpacityChanged ()
 
void slotOpacitySliderMoved (qreal opacity)
 
void slotPropertiesClicked ()
 
void slotRaiseClicked ()
 
void slotRenameCurrentNode ()
 
void slotRmClicked ()
 
void slotSelectOpaque ()
 
void slotSetCompositeOp (const KoCompositeOp *compositeOp)
 
void slotSetOpacity (double opacity)
 
void slotUpdateIcons ()
 
void slotUpdateLayerInfoTextOpacity ()
 
void slotUpdateLayerInfoTextStyle ()
 
void slotUpdateOpacitySlider (quint8 value)
 
void slotUpdateThumbnailIconSize ()
 
void slotUpdateTreeIndentation ()
 
void slotUpdateUseInlineLayerInfoText ()
 
void slotUpdateUseLayerSelectionCheckbox ()
 
void toggleActiveLayerSolo ()
 
void updateAvailableLabels ()
 
void updateLayerFiltering ()
 
void updateLayerOpMenu (const QModelIndex &index, QMenu &menu)
 
void updateUI ()
 

Private Member Functions

void addActionToMenu (QMenu *menu, const QString &id)
 
void connectActionToButton (KisViewManager *view, QAbstractButton *button, const QString &id)
 
qint32 convertOpacityToInt (qreal opacity)
 
KisNodeSP findNonHidableNode (KisNodeSP startNode)
 

Private Attributes

QSlider * indentationSlider
 
QComboBox * infoTextCombobox
 
QCheckBox * infoTextInlineChkbox
 
KisSliderSpinBoxinfoTextOpacitySlider
 
KisLayerFilterWidgetlayerFilterWidget
 
QCheckBox * layerSelectionCheckBox {nullptr}
 
KisNodeSP m_activeNode
 
KisSignalAutoConnectionsStore m_activeNodeConnections
 
QPointer< KisCanvas2m_canvas
 
KisActionm_changeCloneSourceAction
 
KisNodeSP m_changedOpacityNode
 
KisSignalCompressor m_colorLabelCompressor
 
QPointer< KisColorLabelSelectorWidgetMenuWrapperm_colorSelector
 
QPointer< QWidgetAction > m_colorSelectorAction
 
QPointer< KisNodeFilterProxyModelm_filteringModel
 
KisImageWSP m_image
 
KisSignalCompressor m_infoTextOpacityCompressor
 
KisActionm_layerToggleSolo
 
QMenu * m_newLayerMenu
 
int m_newOpacity
 
QPointer< KisNodeManagerm_nodeManager
 
QPointer< KisNodeModelm_nodeModel
 
KisSignalCompressor m_nodeOpacityCompressor
 
QMenu * m_opLayerMenu
 
KisActionm_propertiesAction
 
KisActionm_removeAction
 
KisNodeWSP m_savedNodeBeforeEditSelectionMode
 
QScopedPointer< KisSelectionActionsAdapterm_selectionActionsAdapter
 
KisActionm_showGlobalSelectionMask
 
KisSignalCompressor m_thumbnailSizeCompressor
 
KisSignalCompressor m_treeIndentationCompressor
 
Ui_WdgLayerBox * m_wdgLayerBox
 
QSlider * thumbnailSizeSlider
 

Detailed Description

A widget that shows a visualization of the layer structure.

The center of the layer box is KisNodeModel, which shows the actual layers. This widget adds docking functionality and command buttons.

Definition at line 63 of file LayerBox.h.

Constructor & Destructor Documentation

◆ LayerBox()

LayerBox::LayerBox ( )

Connect model updateUI() to enable/disable controls. Note: nodeActivated() is connected separately in setImage(), because it needs particular order of calls: first the connection to the node manager should be called, then updateUI()

Definition at line 158 of file LayerBox.cpp.

159 : QDockWidget(i18n("Layers"))
160 , m_canvas(0)
161 , m_wdgLayerBox(new Ui_WdgLayerBox)
167{
168 KisConfig cfg(false);
169
170 QWidget* mainWidget = new QWidget(this);
171 setWidget(mainWidget);
172
173 m_wdgLayerBox->setupUi(mainWidget);
174
175 QStyle *newStyle = QStyleFactory::create(m_wdgLayerBox->listLayers->style()->objectName());
176 // proxy style steals the ownership of the style and deletes it later
177 LayerBoxStyle *proxyStyle = new LayerBoxStyle(newStyle);
178
179 proxyStyle->setParent(m_wdgLayerBox->listLayers);
180 m_wdgLayerBox->listLayers->setStyle(proxyStyle);
181
182 connect(m_wdgLayerBox->listLayers,
183 SIGNAL(contextMenuRequested(QPoint,QModelIndex)),
184 this, SLOT(slotContextMenuRequested(QPoint,QModelIndex)));
185 connect(m_wdgLayerBox->listLayers,
186 SIGNAL(collapsed(QModelIndex)), SLOT(slotCollapsed(QModelIndex)));
187 connect(m_wdgLayerBox->listLayers,
188 SIGNAL(expanded(QModelIndex)), SLOT(slotExpanded(QModelIndex)));
189 connect(m_wdgLayerBox->listLayers,
191
193
194 m_wdgLayerBox->bnAdd->setIconSize(QSize(22, 22));
195 m_wdgLayerBox->bnDelete->setIconSize(QSize(22, 22));
196 m_wdgLayerBox->bnRaise->setIconSize(QSize(22, 22));
197 m_wdgLayerBox->bnLower->setIconSize(QSize(22, 22));
198 m_wdgLayerBox->bnProperties->setIconSize(QSize(22, 22));
199 m_wdgLayerBox->bnDuplicate->setIconSize(QSize(22, 22));
200
201 m_wdgLayerBox->bnLower->setEnabled(false);
202 m_wdgLayerBox->bnRaise->setEnabled(false);
203
204 m_wdgLayerBox->doubleOpacity->setRange(0, 100, 0);
205 if (cfg.sliderLabels()) {
206 m_wdgLayerBox->opacityLabel->hide();
208 i18nc("{n} is the number value, % is the percent sign", "Opacity: {n}%"));
209 } else {
211 i18nc("{n} is the number value, % is the percent sign", "{n}%"));
212 }
213
214 connect(m_wdgLayerBox->doubleOpacity, SIGNAL(valueChanged(qreal)), SLOT(slotOpacitySliderMoved(qreal)));
215 connect(&m_nodeOpacityCompressor, SIGNAL(timeout()), SLOT(slotOpacityChanged()));
216
217 connect(m_wdgLayerBox->cmbComposite, SIGNAL(activated(int)), SLOT(slotCompositeOpChanged(int)));
218
219 m_newLayerMenu = new QMenu(this);
220 m_wdgLayerBox->bnAdd->setMenu(m_newLayerMenu);
221 m_wdgLayerBox->bnAdd->setPopupMode(QToolButton::MenuButtonPopup);
222
223 m_opLayerMenu = new QMenu(this);
224 m_wdgLayerBox->bnProperties->setMenu(m_opLayerMenu);
225 m_wdgLayerBox->bnProperties->setPopupMode(QToolButton::MenuButtonPopup);
226
227 m_nodeModel = new KisNodeModel(this, 2);
229 m_filteringModel->setNodeModel(m_nodeModel);
230
237 connect(m_nodeModel, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(updateUI()));
238 connect(m_nodeModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(updateUI()));
239 connect(m_nodeModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), SLOT(updateUI()));
240 connect(m_nodeModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(updateUI()));
241 connect(m_nodeModel, SIGNAL(modelReset()), SLOT(slotModelReset()));
242
243 connect(m_nodeModel, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(slotForgetAboutSavedNodeBeforeEditSelectionMode()));
244 connect(m_nodeModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(slotForgetAboutSavedNodeBeforeEditSelectionMode()));
245 connect(m_nodeModel, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), SLOT(slotForgetAboutSavedNodeBeforeEditSelectionMode()));
246 connect(m_nodeModel, SIGNAL(modelReset()), SLOT(slotForgetAboutSavedNodeBeforeEditSelectionMode()));
247
248 // we should update expanded state of the nodes on adding the nodes
249 connect(m_nodeModel, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(slotNodeCollapsedChanged()));
250 connect(m_nodeModel, SIGNAL(modelReset()), SLOT(slotNodeCollapsedChanged()));
251
252 m_showGlobalSelectionMask = new KisAction(i18n("&Show Global Selection Mask"), this);
253 m_showGlobalSelectionMask->setObjectName("show-global-selection-mask");
255 m_showGlobalSelectionMask->setToolTip(i18nc("@info:tooltip", "Shows global selection as a usual selection mask in <b>Layers</b> docker"));
256 m_showGlobalSelectionMask->setCheckable(true);
257 connect(m_showGlobalSelectionMask, SIGNAL(triggered(bool)), SLOT(slotEditGlobalSelection(bool)));
258
259 m_showGlobalSelectionMask->setChecked(cfg.showGlobalSelection());
260
262 MouseClickIgnore* mouseEater = new MouseClickIgnore(this);
263 m_colorSelector->installEventFilter(mouseEater);
264 connect(m_colorSelector->colorLabelSelector(), SIGNAL(currentIndexChanged(int)), SLOT(slotColorLabelChanged(int)));
265 m_colorSelectorAction = new QWidgetAction(this);
266 m_colorSelectorAction->setDefaultWidget(m_colorSelector);
267
268 connect(m_nodeModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
269 &m_colorLabelCompressor, SLOT(start()));
270
271 m_wdgLayerBox->listLayers->setModel(m_filteringModel);
272 // this connection should be done *after* the setModel() call to
273 // happen later than the internal selection model
276
277
278 //LayerFilter Menu
279 QMenu *layerFilterMenu = new QMenu(this);
280 m_wdgLayerBox->bnLayerFilters->setMenu(layerFilterMenu);
281 m_wdgLayerBox->bnLayerFilters->setPopupMode(QToolButton::InstantPopup);
282
283 const QIcon filterIcon = KisIconUtils::loadIcon("view-filter");
284 m_wdgLayerBox->bnLayerFilters->setIcon(filterIcon);
285 m_wdgLayerBox->bnLayerFilters->setAutoRaise(true);
286 QPixmap filterEnabledPixmap = filterIcon.pixmap(64,64);
287 const QBitmap filterEnabledBitmask = filterEnabledPixmap.mask();
288 filterEnabledPixmap.fill(palette().color(QPalette::Highlight));
289 filterEnabledPixmap.setMask(filterEnabledBitmask);
290 const QIcon filterEnabledIcon = QIcon(filterEnabledPixmap);
291
293 connect(layerFilterWidget, SIGNAL(filteringOptionsChanged()), this, SLOT(updateLayerFiltering()));
294 connect(layerFilterWidget, &KisLayerFilterWidget::filteringOptionsChanged, [this, filterIcon, filterEnabledIcon](){
296 m_wdgLayerBox->bnLayerFilters->setIcon(filterEnabledIcon);
297 } else {
298 m_wdgLayerBox->bnLayerFilters->setIcon(filterIcon);
299 }
300
301 auto activeColors = layerFilterWidget->getActiveColors();
302 m_wdgLayerBox->bnLayerFilters->setSelectedColors(QList(activeColors.begin(), activeColors.end()));
303 m_wdgLayerBox->bnLayerFilters->setTextFilter(layerFilterWidget->hasTextFilter());
304 });
305
306 QWidgetAction *layerFilterMenuAction = new QWidgetAction(this);
307 layerFilterMenuAction->setDefaultWidget(layerFilterWidget);
308 layerFilterMenu->addAction(layerFilterMenuAction);
309
310
311 KisMenuStyleDontCloseOnAlt *menuStyle = new KisMenuStyleDontCloseOnAlt(layerFilterMenu->style());
312 menuStyle->setParent(layerFilterMenu);
313 layerFilterMenu->setStyle(menuStyle);
314
315 setEnabled(false);
316
317 connect(&m_colorLabelCompressor, SIGNAL(timeout()), SLOT(updateAvailableLabels()));
318
319
320 // set up the configure menu for changing thumbnail size
321 QMenu* configureMenu = new QMenu(this);
322 configureMenu->setContentsMargins(6, 6, 6, 6);
323 configureMenu->addSection(i18n("Thumbnail Size"));
324
325 m_wdgLayerBox->configureLayerDockerToolbar->setMenu(configureMenu);
326 m_wdgLayerBox->configureLayerDockerToolbar->setIconSize(QSize(16, 16));
327 m_wdgLayerBox->configureLayerDockerToolbar->setPopupMode(QToolButton::InstantPopup);
328 m_wdgLayerBox->configureLayerDockerToolbar->setAutoRaise(true);
329
330
331 // add horizontal slider
332 thumbnailSizeSlider = new QSlider(this);
333 thumbnailSizeSlider->setOrientation(Qt::Horizontal);
334 thumbnailSizeSlider->setRange(20, 80);
335
336 thumbnailSizeSlider->setValue(cfg.layerThumbnailSize(false)); // grab this from the kritarc
337
338 thumbnailSizeSlider->setMinimumHeight(20);
339 thumbnailSizeSlider->setMinimumWidth(40);
340 thumbnailSizeSlider->setTickInterval(5);
341 m_nodeModel->setPreferredThumnalSize(cfg.layerThumbnailSize());
342
343 QWidgetAction *sliderAction= new QWidgetAction(this);
344 sliderAction->setDefaultWidget(thumbnailSizeSlider);
345 configureMenu->addAction(sliderAction);
346
347
348 connect(thumbnailSizeSlider, SIGNAL(valueChanged(int)), &m_thumbnailSizeCompressor, SLOT(start()));
349 connect(&m_thumbnailSizeCompressor, SIGNAL(timeout()), SLOT(slotUpdateThumbnailIconSize()));
350
351 configureMenu->addSection(i18nc("@item:inmenu Layers Docker settings, slider", "Tree Indentation"));
352
353 // add horizontal slider
354 indentationSlider = new QSlider(Qt::Horizontal, this);
355 indentationSlider->setRange(20, 100);
356 indentationSlider->setMinimumSize(40, 20);
357 indentationSlider->setSingleStep(5);
358 indentationSlider->setPageStep(20);
359 indentationSlider->setValue(cfg.layerTreeIndentation());
360
361
362 sliderAction= new QWidgetAction(this);
363 sliderAction->setDefaultWidget(indentationSlider);
364 configureMenu->addAction(sliderAction);
365
366 // NOTE: if KisConfig would just compress its file sync events, we wouldn't need
367 // this extra compressor that juggles between slow UI and disk thrashing
368 connect(indentationSlider, SIGNAL(valueChanged(int)), &m_treeIndentationCompressor, SLOT(start()));
369 connect(&m_treeIndentationCompressor, SIGNAL(timeout()), SLOT(slotUpdateTreeIndentation()));
370
371
372 // Layer info-text settings:
373 // blending info-text style combobox
374 configureMenu->addSection(i18nc("@item:inmenu Layers Docker settings, combobox", "Blending Info Style"));
375 infoTextCombobox = new QComboBox(this);
376 infoTextCombobox->setToolTip(i18nc("@item:tooltip", "None: Show nothing.\n"
377 "Simple: Show changed opacities or blending modes.\n"
378 "Balanced: Show both opacity and blending mode if either are changed.\n"
379 "Detailed: Show both opacity and blending mode even if unchanged."));
380 infoTextCombobox->insertItems(0, QStringList ({
381 i18nc("@item:inlistbox Layer Docker blending info style", "None"),
382 i18nc("@item:inlistbox Layer Docker blending info style", "Simple"),
383 i18nc("@item:inlistbox Layer Docker blending info style", "Balanced"),
384 i18nc("@item:inlistbox Layer Docker blending info style", "Detailed"),
385 }));
386 infoTextCombobox->setCurrentIndex((int)cfg.layerInfoTextStyle());
387
388 QWidgetAction *cmbboxAction = new QWidgetAction(this);
389 cmbboxAction->setDefaultWidget(infoTextCombobox);
390 configureMenu->addAction(cmbboxAction);
391 connect(infoTextCombobox, SIGNAL(currentIndexChanged(int)), SLOT(slotUpdateLayerInfoTextStyle()));
392
393 // info-text opacity slider
396 i18nc("{n} is the number value, % is the percent sign", "Opacity: {n}%"));
397 infoTextOpacitySlider->setToolTip(i18nc("@item:tooltip", "Blending info text opacity"));
398 // 55% is the opacity of nonvisible layer text
400 infoTextOpacitySlider->setMinimumSize(40, 20);
401 infoTextOpacitySlider->setSingleStep(5);
403 infoTextOpacitySlider->setValue(cfg.layerInfoTextOpacity());
404 if (infoTextCombobox->currentIndex() == 0) {
405 infoTextOpacitySlider->setDisabled(true);
406 }
407
408 sliderAction= new QWidgetAction(this);
409 sliderAction->setDefaultWidget(infoTextOpacitySlider);
410 configureMenu->addAction(sliderAction);
411 connect(infoTextOpacitySlider, SIGNAL(valueChanged(int)), &m_infoTextOpacityCompressor, SLOT(start()));
412 connect(&m_infoTextOpacityCompressor, SIGNAL(timeout()), SLOT(slotUpdateLayerInfoTextOpacity()));
413
414 // info-text inline checkbox
415 infoTextInlineChkbox = new QCheckBox(i18nc("@item:inmenu Layers Docker settings, checkbox", "Inline"), this);
416 infoTextInlineChkbox->setChecked(cfg.useInlineLayerInfoText());
417 infoTextInlineChkbox->setToolTip(i18nc("@item:tooltip", "If enabled, show blending info beside layer names.\n"
418 "If disabled, show below layer names (when enough space)."));
419 if (infoTextCombobox->currentIndex() == 0) {
420 infoTextInlineChkbox->setDisabled(true);
421 }
422
423 QWidgetAction *chkboxAction = new QWidgetAction(this);
424 chkboxAction->setDefaultWidget(infoTextInlineChkbox);
425 configureMenu->addAction(chkboxAction);
426 connect(infoTextInlineChkbox, SIGNAL(stateChanged(int)), SLOT(slotUpdateUseInlineLayerInfoText()));
427
428 layerSelectionCheckBox = new QCheckBox(
429 i18nc("@item:inmenu Layers Docker settings, checkbox", "Checkbox for Selecting Layers"), this);
430 layerSelectionCheckBox->setToolTip(i18nc("@item:tooltip", "Show checkbox to select/unselect layers."));
431 layerSelectionCheckBox->setChecked(cfg.useLayerSelectionCheckbox());
432
433 QWidgetAction *layerSelectionAction = new QWidgetAction(this);
434 layerSelectionAction->setDefaultWidget(layerSelectionCheckBox);
435 configureMenu->addAction(layerSelectionAction);
436 connect(layerSelectionCheckBox, SIGNAL(stateChanged(int)), SLOT(slotUpdateUseLayerSelectionCheckbox()));
437}
void setActivationFlags(ActivationFlags flags)
@ ACTIVE_IMAGE
Activate if there is at least one image.
Definition kis_action.h:43
QSet< int > getActiveColors() const
void filteringOptionsChanged()
void sigBeforeBeginRemoveRows(const QModelIndex &parent, int start, int end)
This class is a spinbox in which you can click and drag to set the value. A slider like bar is displa...
void setValue(int newValue)
void setRange(int newMinimum, int newMaximum, bool computeNewFastSliderStep=true)
Set the minimum and the maximum values of the range, computing a new "fast slider step" based on the ...
void setPageStep(int newPageStep)
Does nothing currently.
void slotForgetAboutSavedNodeBeforeEditSelectionMode()
QComboBox * infoTextCombobox
Definition LayerBox.h:181
void updateAvailableLabels()
void slotOpacitySliderMoved(qreal opacity)
Definition LayerBox.cpp:879
void slotCollapsed(const QModelIndex &index)
Definition LayerBox.cpp:886
void slotCompositeOpChanged(int index)
Definition LayerBox.cpp:864
KisSignalCompressor m_colorLabelCompressor
Definition LayerBox.h:172
void slotContextMenuRequested(const QPoint &pos, const QModelIndex &index)
Definition LayerBox.cpp:807
KisLayerFilterWidget * layerFilterWidget
Definition LayerBox.h:178
void selectionChanged(const QModelIndexList &selection)
void slotUpdateThumbnailIconSize()
QSlider * thumbnailSizeSlider
Definition LayerBox.h:179
KisSignalCompressor m_thumbnailSizeCompressor
Definition LayerBox.h:173
QCheckBox * infoTextInlineChkbox
Definition LayerBox.h:183
void slotUpdateLayerInfoTextStyle()
void slotUpdateUseInlineLayerInfoText()
void updateUI()
Definition LayerBox.cpp:670
QSlider * indentationSlider
Definition LayerBox.h:180
void slotModelReset()
Definition LayerBox.cpp:763
void slotEditGlobalSelection(bool showSelections)
Definition LayerBox.cpp:956
void slotUpdateIcons()
void slotExpanded(const QModelIndex &index)
Definition LayerBox.cpp:894
KisSignalCompressor m_infoTextOpacityCompressor
Definition LayerBox.h:175
KisAction * m_showGlobalSelectionMask
Definition LayerBox.h:171
KisSignalCompressor m_nodeOpacityCompressor
Definition LayerBox.h:176
void updateLayerFiltering()
void slotOpacityChanged()
Definition LayerBox.cpp:873
KisSliderSpinBox * infoTextOpacitySlider
Definition LayerBox.h:182
Ui_WdgLayerBox * m_wdgLayerBox
Definition LayerBox.h:163
QMenu * m_newLayerMenu
Definition LayerBox.h:155
QPointer< KisNodeFilterProxyModel > m_filteringModel
Definition LayerBox.h:159
void slotUpdateTreeIndentation()
QPointer< QWidgetAction > m_colorSelectorAction
Definition LayerBox.h:162
QPointer< KisColorLabelSelectorWidgetMenuWrapper > m_colorSelector
Definition LayerBox.h:161
void slotUpdateUseLayerSelectionCheckbox()
void slotUpdateLayerInfoTextOpacity()
void slotColorLabelChanged(int index)
QMenu * m_opLayerMenu
Definition LayerBox.h:156
void slotNodeCollapsedChanged()
Definition LayerBox.cpp:911
QPointer< KisNodeModel > m_nodeModel
Definition LayerBox.h:158
void slotAdjustCurrentBeforeRemoveRows(const QModelIndex &parent, int first, int last)
QCheckBox * layerSelectionCheckBox
Definition LayerBox.h:184
QPointer< KisCanvas2 > m_canvas
Definition LayerBox.h:153
KisSignalCompressor m_treeIndentationCompressor
Definition LayerBox.h:174
QIcon loadIcon(const QString &name)
void setText(QSpinBox *spinBox, const QStringView textTemplate)
rgba palette[MAX_PALETTE]
Definition palette.c:35

References KisAction::ACTIVE_IMAGE, KisLayerFilterWidget::filteringOptionsChanged(), KisLayerFilterWidget::getActiveColors(), KisLayerFilterWidget::hasTextFilter(), indentationSlider, infoTextCombobox, infoTextInlineChkbox, infoTextOpacitySlider, KisLayerFilterWidget::isCurrentlyFiltering(), layerFilterWidget, KisConfig::layerInfoTextOpacity(), KisConfig::layerInfoTextStyle(), layerSelectionCheckBox, KisConfig::layerThumbnailSize(), KisConfig::layerTreeIndentation(), KisIconUtils::loadIcon(), m_colorLabelCompressor, m_colorSelector, m_colorSelectorAction, m_filteringModel, m_infoTextOpacityCompressor, m_newLayerMenu, m_nodeModel, m_nodeOpacityCompressor, m_opLayerMenu, m_showGlobalSelectionMask, m_thumbnailSizeCompressor, m_treeIndentationCompressor, m_wdgLayerBox, palette, selectionChanged(), KisAction::setActivationFlags(), KisSliderSpinBox::setPageStep(), KisSliderSpinBox::setRange(), KisSpinBoxI18nHelper::setText(), KisSliderSpinBox::setValue(), KisConfig::showGlobalSelection(), KisNodeFilterProxyModel::sigBeforeBeginRemoveRows(), KisConfig::sliderLabels(), slotAdjustCurrentBeforeRemoveRows(), slotCollapsed(), slotColorLabelChanged(), slotCompositeOpChanged(), slotContextMenuRequested(), slotEditGlobalSelection(), slotExpanded(), slotForgetAboutSavedNodeBeforeEditSelectionMode(), slotModelReset(), slotNodeCollapsedChanged(), slotOpacityChanged(), slotOpacitySliderMoved(), slotUpdateIcons(), slotUpdateLayerInfoTextOpacity(), slotUpdateLayerInfoTextStyle(), slotUpdateThumbnailIconSize(), slotUpdateTreeIndentation(), slotUpdateUseInlineLayerInfoText(), slotUpdateUseLayerSelectionCheckbox(), thumbnailSizeSlider, updateAvailableLabels(), updateLayerFiltering(), updateUI(), KisConfig::useInlineLayerInfoText(), and KisConfig::useLayerSelectionCheckbox().

◆ ~LayerBox()

LayerBox::~LayerBox ( )
override

Definition at line 439 of file LayerBox.cpp.

440{
441 delete m_wdgLayerBox;
442}

References m_wdgLayerBox.

Member Function Documentation

◆ addActionToMenu()

void LayerBox::addActionToMenu ( QMenu * menu,
const QString & id )
inlineprivate

Definition at line 141 of file LayerBox.cpp.

142{
143 if (m_canvas) {
144 menu->addAction(m_canvas->viewManager()->actionManager()->actionByName(id));
145 }
146}

References m_canvas.

◆ connectActionToButton()

void LayerBox::connectActionToButton ( KisViewManager * view,
QAbstractButton * button,
const QString & id )
inlineprivate

Definition at line 128 of file LayerBox.cpp.

129{
130 if (!viewManager || !button) return;
131
132 KisAction *action = viewManager->actionManager()->actionByName(id);
133
134 if (!action) return;
135
136 connect(button, SIGNAL(clicked()), action, SLOT(trigger()));
137 connect(action, SIGNAL(sigEnableSlaves(bool)), button, SLOT(setEnabled(bool)));
138 connect(viewManager->mainWindowAsQWidget(), SIGNAL(themeChanged()), this, SLOT(slotUpdateIcons()));
139}
KisAction * actionByName(const QString &name) const
KisActionManager * actionManager
QString button(const QWheelEvent &ev)

References KisActionManager::actionByName(), KisViewManager::actionManager(), button(), KisViewManager::mainWindowAsQWidget(), and slotUpdateIcons().

◆ convertOpacityToInt()

qint32 LayerBox::convertOpacityToInt ( qreal opacity)
private

Scales opacity from the range 0...100 to the integer range 0...255

Definition at line 148 of file LayerBox.cpp.

149{
155 return qMin(255, int(opacity * 2.55 + 0.5));
156}

◆ findNonHidableNode()

KisNodeSP LayerBox::findNonHidableNode ( KisNodeSP startNode)
private

Definition at line 923 of file LayerBox.cpp.

924{
925 if (KisNodeManager::isNodeHidden(startNode, true) &&
926 startNode->parent() &&
927 !startNode->parent()->parent()) {
928
929
930 KisNodeSP node = startNode->prevSibling();
931 while (node && KisNodeManager::isNodeHidden(node, true)) {
932 node = node->prevSibling();
933 }
934
935 if (!node) {
936 node = startNode->nextSibling();
937 while (node && KisNodeManager::isNodeHidden(node, true)) {
938 node = node->nextSibling();
939 }
940 }
941
942 if (!node) {
943 node = m_image->root()->lastChild();
944 while (node && KisNodeManager::isNodeHidden(node, true)) {
945 node = node->prevSibling();
946 }
947 }
948
949 KIS_ASSERT_RECOVER_NOOP(node && "cannot activate any node!");
950 startNode = node;
951 }
952
953 return startNode;
954}
static bool isNodeHidden(KisNodeSP node, bool isGlobalSelectionHidden)
KisImageWSP m_image
Definition LayerBox.h:157
#define KIS_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:97
KisNodeSP prevSibling() const
Definition kis_node.cpp:402
KisNodeWSP parent
Definition kis_node.cpp:86
KisNodeSP lastChild() const
Definition kis_node.cpp:367
KisNodeSP nextSibling() const
Definition kis_node.cpp:408

References KisNodeManager::isNodeHidden(), KIS_ASSERT_RECOVER_NOOP, KisNode::lastChild(), m_image, KisNode::nextSibling(), KisNode::parent, KisNode::prevSibling(), and KisNodeFacade::root.

◆ hideEvent()

void LayerBox::hideEvent ( QHideEvent * event)
overrideprotected

Definition at line 659 of file LayerBox.cpp.

660{
661 QDockWidget::hideEvent(event);
662 m_nodeModel->setIdleTaskManager(0);
663}

References m_nodeModel.

◆ imageChanged

void LayerBox::imageChanged ( )
signal

◆ notifyImageDeleted

void LayerBox::notifyImageDeleted ( )
privateslot

Definition at line 665 of file LayerBox.cpp.

666{
667 setCanvas(0);
668}
void setCanvas(KoCanvasBase *canvas) override
Definition LayerBox.cpp:539

References setCanvas().

◆ observerName()

QString LayerBox::observerName ( )
inlineoverridevirtual

Reimplemented from KoCanvasObserverBase.

Definition at line 72 of file LayerBox.h.

72{ return "LayerBox"; }

◆ selectionChanged

void LayerBox::selectionChanged ( const QModelIndexList & selection)
privateslot

When the user clears the extended selection by clicking on the empty area of the docker, the selection should be reset on to the active layer, which might be even unselected(!).

Definition at line 1040 of file LayerBox.cpp.

1041{
1042 if (!m_nodeManager) return;
1043
1049 if (selection.isEmpty() && m_nodeManager->activeNode()) {
1050 QModelIndex selectedIndex =
1051 m_filteringModel->indexFromNode(m_nodeManager->activeNode());
1052
1053 m_wdgLayerBox->listLayers->selectionModel()->
1054 setCurrentIndex(selectedIndex, QItemSelectionModel::ClearAndSelect);
1055 return;
1056 }
1057
1058 QList<KisNodeSP> selectedNodes;
1059 Q_FOREACH (const QModelIndex &idx, selection) {
1060 // Precaution because node manager doesn't like duplicates in that list.
1061 // NodeView Selection behavior is SelectRows, although currently only column 0 allows selections.
1062 if (idx.column() != 0) {
1063 continue;
1064 }
1065 selectedNodes << m_filteringModel->nodeFromIndex(idx);
1066 }
1067
1068 m_nodeManager->slotSetSelectedNodes(selectedNodes);
1069 updateUI();
1070}
QPointer< KisNodeManager > m_nodeManager
Definition LayerBox.h:160

References m_filteringModel, m_nodeManager, m_wdgLayerBox, and updateUI().

◆ setCanvas()

void LayerBox::setCanvas ( KoCanvasBase * canvas)
overridevirtual

re-implement this method in your canvas observer. It will be called whenever a canvas becomes active. Note that you are responsible for not connecting more than one time to the signals of a canvas or any of the QObjects you can access through the canvas.

Implements KoCanvasObserverBase.

Definition at line 539 of file LayerBox.cpp.

540{
541 if (m_canvas == canvas)
542 return;
543
544 setEnabled(canvas != 0);
545
546 if (m_canvas) {
547 m_canvas->disconnectCanvasObserver(this);
548 m_nodeModel->setIdleTaskManager(0);
549 m_nodeModel->setDummiesFacade(0, 0, 0, 0, 0);
551
552 if (m_image) {
554 animation->disconnect(this);
555 }
556
557 disconnect(m_image, 0, this, 0);
558 disconnect(m_nodeManager, 0, this, 0);
559 disconnect(m_nodeModel, 0, m_nodeManager, 0);
560 m_nodeManager->slotSetSelectedNodes(KisNodeList());
561 }
562
563 m_canvas = dynamic_cast<KisCanvas2*>(canvas);
564
565 if (m_canvas) {
566 m_image = m_canvas->image();
567 Q_EMIT imageChanged();
568
569 KisDocument* doc = static_cast<KisDocument*>(m_canvas->imageView()->document());
570 KisShapeController *kritaShapeController =
571 dynamic_cast<KisShapeController*>(doc->shapeController());
572 KisDummiesFacadeBase *kritaDummiesFacade =
573 static_cast<KisDummiesFacadeBase*>(kritaShapeController);
574
575
576 m_selectionActionsAdapter.reset(new KisSelectionActionsAdapter(m_canvas->viewManager()->selectionManager()));
577 m_nodeModel->setDummiesFacade(kritaDummiesFacade,
578 m_image,
579 kritaShapeController,
582
583 if (isVisible()) {
584 m_nodeModel->setIdleTaskManager(m_canvas->viewManager()->idleTasksManager());
585 }
586
587 connect(m_image, SIGNAL(sigAboutToBeDeleted()), SLOT(notifyImageDeleted()));
588 connect(m_image, SIGNAL(sigNodeCollapsedChanged()), SLOT(slotNodeCollapsedChanged()));
589
590 // cold start
591 if (m_nodeManager) {
592 setCurrentNode(m_nodeManager->activeNode());
593 // Connection KisNodeManager -> LayerBox
594 connect(m_nodeManager, SIGNAL(sigUiNeedChangeActiveNode(KisNodeSP)),
595 this, SLOT(setCurrentNode(KisNodeSP)));
596
597 connect(m_nodeManager,
598 SIGNAL(sigUiNeedChangeSelectedNodes(QList<KisNodeSP>)),
600 }
601 else {
602 setCurrentNode(m_canvas->imageView()->currentNode());
603 }
604
605 // Connection LayerBox -> KisNodeManager (isolate layer)
606 connect(m_nodeModel, SIGNAL(toggleIsolateActiveNode()),
607 m_nodeManager, SLOT(toggleIsolateActiveNode()));
608
611
613 m_wdgLayerBox->listLayers->scrollTo(m_wdgLayerBox->listLayers->currentIndex());
615
616 addActionToMenu(m_newLayerMenu, "add_new_paint_layer");
617 addActionToMenu(m_newLayerMenu, "add_new_group_layer");
618 addActionToMenu(m_newLayerMenu, "add_new_clone_layer");
619 addActionToMenu(m_newLayerMenu, "add_new_shape_layer");
620 addActionToMenu(m_newLayerMenu, "add_new_adjustment_layer");
621 addActionToMenu(m_newLayerMenu, "add_new_fill_layer");
622 addActionToMenu(m_newLayerMenu, "add_new_file_layer");
623 m_newLayerMenu->addSeparator();
624 addActionToMenu(m_newLayerMenu, "add_new_transparency_mask");
625 addActionToMenu(m_newLayerMenu, "add_new_filter_mask");
626 addActionToMenu(m_newLayerMenu, "add_new_fast_color_overlay_mask");
627 addActionToMenu(m_newLayerMenu, "add_new_colorize_mask");
628 addActionToMenu(m_newLayerMenu, "add_new_transform_mask");
629 addActionToMenu(m_newLayerMenu, "add_new_selection_mask");
630 }
631}
void expandNodesRecursively(KisNodeSP root, QPointer< KisNodeFilterProxyModel > filteringModel, NodeView *nodeView)
Definition LayerBox.cpp:445
KisShapeController * shapeController
void sigUiTimeChanged(int newTime)
KisGroupLayerSP rootLayer() const
KisImageAnimationInterface * animationInterface() const
void slotImageTimeChanged(int time)
void imageChanged()
void addActionToMenu(QMenu *menu, const QString &id)
Definition LayerBox.cpp:141
void slotNodeManagerChangedSelection(const QList< KisNodeSP > &nodes)
QScopedPointer< KisSelectionActionsAdapter > m_selectionActionsAdapter
Definition LayerBox.h:154
void setCurrentNode(KisNodeSP node)
Definition LayerBox.cpp:740
void notifyImageDeleted()
Definition LayerBox.cpp:665
QList< KisNodeSP > KisNodeList
Definition kis_types.h:264

References addActionToMenu(), KisImage::animationInterface(), expandNodesRecursively(), imageChanged(), m_canvas, m_filteringModel, m_image, m_newLayerMenu, m_nodeManager, m_nodeModel, m_selectionActionsAdapter, m_wdgLayerBox, notifyImageDeleted(), KisImage::rootLayer(), setCurrentNode(), KisDocument::shapeController, KisImageAnimationInterface::sigUiTimeChanged(), slotImageTimeChanged(), slotNodeCollapsedChanged(), slotNodeManagerChangedSelection(), and updateAvailableLabels().

◆ setCurrentNode

void LayerBox::setCurrentNode ( KisNodeSP node)
privateslot

This method is called only when non-GUI code requested the change of the current node

setCanvas() calls to node managed and layer box are coming out-of-sync, so it might happen that setCurrentNode() call will arrive with a node from a different image. We should check that and ignore such calls.

TODO: make bootstrapping of layers-related structures a bit more straight-forward. We need to have a single source of truth for the "active layer", and all the initialization should happen in one direction without cycles.

Definition at line 740 of file LayerBox.cpp.

741{
752 if (node && m_image && node->graphListener() != m_image.data()) {
753 return;
754 }
755
756 m_filteringModel->setActiveNode(node);
757
758 QModelIndex index = node ? m_filteringModel->indexFromNode(node) : QModelIndex();
759 m_filteringModel->setData(index, true, KisNodeModel::ActiveRole);
760 updateUI();
761}
@ ActiveRole
Whether the section is the active one.
KisNodeGraphListener * graphListener
Definition kis_node.cpp:87

References KisNodeModel::ActiveRole, KisWeakSharedPtr< T >::data(), KisNode::graphListener, m_filteringModel, m_image, and updateUI().

◆ setViewManager()

void LayerBox::setViewManager ( KisViewManager * kisview)
overridevirtual

reimplemented from KisMainwindowObserver

Implements KisMainwindowObserver.

Definition at line 482 of file LayerBox.cpp.

483{
484 m_nodeManager = kisview->nodeManager();
485
486 if (m_nodeManager) {
487 connect(m_nodeManager, SIGNAL(sigNodeActivated(KisNodeSP)), SLOT(slotForgetAboutSavedNodeBeforeEditSelectionMode()));
488 }
489
490 kisview->actionManager()->
491 addAction(m_showGlobalSelectionMask->objectName(),
493
494 connect(m_wdgLayerBox->bnAdd, SIGNAL(clicked()), this, SLOT(slotAddLayerBnClicked()));
495
496 connectActionToButton(kisview, m_wdgLayerBox->bnDuplicate, "duplicatelayer");
497
498 KisActionManager *actionManager = kisview->actionManager();
499
500 KisAction *action = actionManager->createAction("RenameCurrentLayer");
501 Q_ASSERT(action);
502 connect(action, SIGNAL(triggered()), this, SLOT(slotRenameCurrentNode()));
503
504 m_propertiesAction = actionManager->createAction("layer_properties");
505 Q_ASSERT(m_propertiesAction);
506 new SyncButtonAndAction(m_propertiesAction, m_wdgLayerBox->bnProperties, this);
507 connect(m_propertiesAction, SIGNAL(triggered()), this, SLOT(slotPropertiesClicked()));
508
509 connect(m_opLayerMenu, SIGNAL(aboutToShow()), this, SLOT(slotLayerOpMenuOpened()));
510
511 // It's necessary to clear the layer operations menu when it closes, else
512 // the color selector can't be shared with the right-click context menu
513 connect(m_opLayerMenu, SIGNAL(aboutToHide()), this, SLOT(slotLayerOpMenuClosed()));
514
515 m_removeAction = actionManager->createAction("remove_layer");
516 Q_ASSERT(m_removeAction);
518 connect(m_removeAction, SIGNAL(triggered()), this, SLOT(slotRmClicked()));
519
520 action = actionManager->createAction("move_layer_up");
521 Q_ASSERT(action);
522 new SyncButtonAndAction(action, m_wdgLayerBox->bnRaise, this);
523 connect(action, SIGNAL(triggered()), this, SLOT(slotRaiseClicked()));
524
525 action = actionManager->createAction("move_layer_down");
526 Q_ASSERT(action);
527 new SyncButtonAndAction(action, m_wdgLayerBox->bnLower, this);
528 connect(action, SIGNAL(triggered()), this, SLOT(slotLowerClicked()));
529
530 m_changeCloneSourceAction = actionManager->createAction("set-copy-from");
532 connect(m_changeCloneSourceAction, &KisAction::triggered,
534
535 m_layerToggleSolo = actionManager->createAction("toggle_layer_soloing");
536 connect(m_layerToggleSolo, SIGNAL(triggered(bool)), this, SLOT(toggleActiveLayerSolo()));
537}
A KisActionManager class keeps track of KisActions. These actions are always associated with the GUI....
KisAction * createAction(const QString &name)
KisActionManager * actionManager() const
KisNodeManager * nodeManager() const
The node manager handles everything about nodes.
void slotRmClicked()
Definition LayerBox.cpp:820
KisAction * m_changeCloneSourceAction
Definition LayerBox.h:169
void slotRaiseClicked()
Definition LayerBox.cpp:826
void connectActionToButton(KisViewManager *view, QAbstractButton *button, const QString &id)
Definition LayerBox.cpp:128
void toggleActiveLayerSolo()
KisAction * m_layerToggleSolo
Definition LayerBox.h:170
void slotLayerOpMenuOpened()
Definition LayerBox.cpp:846
KisAction * m_propertiesAction
Definition LayerBox.h:168
void slotLowerClicked()
Definition LayerBox.cpp:832
void slotAddLayerBnClicked()
Definition LayerBox.cpp:467
void slotPropertiesClicked()
Definition LayerBox.cpp:838
void slotRenameCurrentNode()
void slotChangeCloneSourceClicked()
Definition LayerBox.cpp:858
KisAction * m_removeAction
Definition LayerBox.h:167
void slotLayerOpMenuClosed()
Definition LayerBox.cpp:852

References KisViewManager::actionManager(), connectActionToButton(), KisActionManager::createAction(), m_changeCloneSourceAction, m_layerToggleSolo, m_nodeManager, m_opLayerMenu, m_propertiesAction, m_removeAction, m_showGlobalSelectionMask, m_wdgLayerBox, KisViewManager::nodeManager(), slotAddLayerBnClicked(), slotChangeCloneSourceClicked(), slotForgetAboutSavedNodeBeforeEditSelectionMode(), slotLayerOpMenuClosed(), slotLayerOpMenuOpened(), slotLowerClicked(), slotPropertiesClicked(), slotRaiseClicked(), slotRenameCurrentNode(), slotRmClicked(), and toggleActiveLayerSolo().

◆ showEvent()

void LayerBox::showEvent ( QShowEvent * event)
overrideprotected

Definition at line 650 of file LayerBox.cpp.

651{
652 QDockWidget::showEvent(event);
653
654 if (m_canvas) {
655 m_nodeModel->setIdleTaskManager(m_canvas->viewManager()->idleTasksManager());
656 }
657}

References m_canvas, and m_nodeModel.

◆ slotAddLayerBnClicked

void LayerBox::slotAddLayerBnClicked ( )
privateslot

Definition at line 467 of file LayerBox.cpp.

468{
469 if (m_canvas) {
470 KisNodeList nodes = m_nodeManager->selectedNodes();
471
472 if (nodes.size() == 1) {
473 KisAction *action = m_canvas->viewManager()->actionManager()->actionByName("add_new_paint_layer");
474 action->trigger();
475 } else {
476 KisAction *action = m_canvas->viewManager()->actionManager()->actionByName("create_quick_group");
477 action->trigger();
478 }
479 }
480}

References m_canvas, and m_nodeManager.

◆ slotAdjustCurrentBeforeRemoveRows

void LayerBox::slotAdjustCurrentBeforeRemoveRows ( const QModelIndex & parent,
int first,
int last )
privateslot

Qt has changed its behavior when deleting an item. Previously the selection priority was on the next item in the list, and now it has changed to the previous item. Here we just adjust the selected item after the node removal.

This method is called right before the Qt's beginRemoveRows() is called, that is we make sure that Qt will never have to adjust the position of the removed cursor.

See bug: https://bugs.kde.org/show_bug.cgi?id=345601

Definition at line 1072 of file LayerBox.cpp.

1073{
1087 QModelIndex currentIndex = m_wdgLayerBox->listLayers->currentIndex();
1088 QAbstractItemModel *model = m_filteringModel;
1089
1090 if (currentIndex.isValid() && parent == currentIndex.parent()
1091 && currentIndex.row() >= start && currentIndex.row() <= end) {
1092 QModelIndex old = currentIndex;
1093
1094 if (model && end < model->rowCount(parent) - 1) // there are rows left below the change
1095 currentIndex = model->index(end + 1, old.column(), parent);
1096 else if (model && start > 0) // there are rows left above the change
1097 currentIndex = model->index(start - 1, old.column(), parent);
1098 else // there are no rows left in the table
1099 currentIndex = QModelIndex();
1100
1101 if (currentIndex.isValid() && currentIndex != old) {
1102 m_wdgLayerBox->listLayers->setCurrentIndex(currentIndex);
1103 }
1104 }
1105}

References m_filteringModel, and m_wdgLayerBox.

◆ slotChangeCloneSourceClicked

void LayerBox::slotChangeCloneSourceClicked ( )
privateslot

Definition at line 858 of file LayerBox.cpp.

859{
860 if (!m_canvas) return;
861 m_nodeManager->changeCloneSource();
862}

References m_canvas, and m_nodeManager.

◆ slotCollapsed

void LayerBox::slotCollapsed ( const QModelIndex & index)
privateslot

Definition at line 886 of file LayerBox.cpp.

887{
888 KisNodeSP node = m_filteringModel->nodeFromIndex(index);
889 if (node) {
890 node->setCollapsed(true);
891 }
892}
void setCollapsed(bool collapsed)

References m_filteringModel, and KisBaseNode::setCollapsed().

◆ slotColorLabelChanged

void LayerBox::slotColorLabelChanged ( int index)
privateslot

Definition at line 1135 of file LayerBox.cpp.

1136{
1137 KisNodeList selectedNodes = m_nodeManager->selectedNodes();
1138
1139 Q_FOREACH(KisNodeSP selectedNode, selectedNodes) {
1140 //Always apply label to selected nodes..
1141 selectedNode->setColorLabelIndex(label);
1142
1143 //Apply label only to unlabelled children..
1144 KisNodeList children = selectedNode->childNodes(QStringList(), KoProperties());
1145
1146 auto applyLabelFunc =
1147 [label](KisNodeSP child) {
1148 if (child->colorLabelIndex() == 0) {
1149 child->setColorLabelIndex(label);
1150 }
1151 };
1152
1153 Q_FOREACH(KisNodeSP child, children) {
1154 KisLayerUtils::recursiveApplyNodes(child, applyLabelFunc);
1155 }
1156 }
1157}
QList< QString > QStringList
void recursiveApplyNodes(NodePointer node, Functor func)
void setColorLabelIndex(int index)
QList< KisNodeSP > childNodes(const QStringList &nodeTypes, const KoProperties &properties) const
Definition kis_node.cpp:439

References KisNode::childNodes(), m_nodeManager, KisLayerUtils::recursiveApplyNodes(), and KisBaseNode::setColorLabelIndex().

◆ slotCompositeOpChanged

void LayerBox::slotCompositeOpChanged ( int index)
privateslot

Definition at line 864 of file LayerBox.cpp.

865{
866 Q_UNUSED(index);
867 if (!m_canvas) return;
868
869 QString compositeOp = m_wdgLayerBox->cmbComposite->selectedCompositeOp().id();
870 m_nodeManager->nodeCompositeOpChanged(m_nodeManager->activeColorSpace()->compositeOp(compositeOp));
871}

References m_canvas, m_nodeManager, and m_wdgLayerBox.

◆ slotContextMenuRequested

void LayerBox::slotContextMenuRequested ( const QPoint & pos,
const QModelIndex & index )
privateslot

Definition at line 807 of file LayerBox.cpp.

808{
809 KisNodeList nodes = m_nodeManager->selectedNodes();
810 KisNodeSP activeNode = m_nodeManager->activeNode();
811 if (nodes.isEmpty() || !activeNode) return;
812
813 if (m_canvas) {
814 QMenu menu;
815 updateLayerOpMenu(index, menu);
816 menu.exec(pos);
817 }
818}
void updateLayerOpMenu(const QModelIndex &index, QMenu &menu)

References m_canvas, m_nodeManager, and updateLayerOpMenu().

◆ slotEditGlobalSelection

void LayerBox::slotEditGlobalSelection ( bool showSelections)
privateslot

Definition at line 956 of file LayerBox.cpp.

957{
958 KisNodeSP lastActiveNode = m_nodeManager->activeNode();
959 KisNodeSP activateNode = lastActiveNode;
960 KisSelectionMaskSP globalSelectionMask;
961
962 if (!showSelections) {
963 activateNode =
966 findNonHidableNode(activateNode);
967 }
968
969 m_nodeModel->setShowGlobalSelection(showSelections);
970
971 globalSelectionMask = m_image->rootLayer()->selectionMask();
972
973 // try to find deactivated, but visible masks
974 if (!globalSelectionMask) {
975 KoProperties properties;
976 properties.setProperty("visible", true);
977 QList<KisNodeSP> masks = m_image->rootLayer()->childNodes(QStringList("KisSelectionMask"), properties);
978 if (!masks.isEmpty()) {
979 globalSelectionMask = dynamic_cast<KisSelectionMask*>(masks.first().data());
980 }
981 }
982
983 // try to find at least any selection mask
984 if (!globalSelectionMask) {
985 KoProperties properties;
986 QList<KisNodeSP> masks = m_image->rootLayer()->childNodes(QStringList("KisSelectionMask"), properties);
987 if (!masks.isEmpty()) {
988 globalSelectionMask = dynamic_cast<KisSelectionMask*>(masks.first().data());
989 }
990 }
991
992 if (globalSelectionMask) {
993 if (showSelections) {
994 activateNode = globalSelectionMask;
995 }
996 }
997
998 if (activateNode != lastActiveNode) {
999 m_nodeManager->slotNonUiActivatedNode(activateNode);
1000 } else if (lastActiveNode) {
1001 setCurrentNode(lastActiveNode);
1002 }
1003
1004 if (showSelections && !globalSelectionMask) {
1005 KisProcessingApplicator applicator(m_image, 0,
1008 kundo2_i18n("Quick Selection Mask"));
1009
1010 applicator.applyCommand(
1012 m_nodeManager->selectedNodes(), KisNodeList(),
1013 lastActiveNode, 0, m_image, false),
1015 applicator.applyCommand(new KisSetEmptyGlobalSelectionCommand(m_image),
1018 applicator.applyCommand(new KisLayerUtils::SelectGlobalSelectionMask(m_image),
1021
1022 applicator.end();
1023 } else if (!showSelections &&
1024 globalSelectionMask &&
1025 globalSelectionMask->selection()->selectedRect().isEmpty()) {
1026
1027 KisProcessingApplicator applicator(m_image, 0,
1030 kundo2_i18n("Cancel Quick Selection Mask"));
1032 applicator.end();
1033 }
1034
1035 if (showSelections) {
1036 m_savedNodeBeforeEditSelectionMode = lastActiveNode;
1037 }
1038}
QVector< KisImageSignalType > KisImageSignalVector
void setProperty(const QString &name, const QVariant &value)
KisNodeSP findNonHidableNode(KisNodeSP startNode)
Definition LayerBox.cpp:923
KisNodeWSP m_savedNodeBeforeEditSelectionMode
Definition LayerBox.h:187
KisSharedPtr< KisNode > KisNodeSP
Definition kis_types.h:86
KUndo2MagicString kundo2_i18n(const char *text)
virtual KisSelectionMaskSP selectionMask() const
Definition kis_layer.cc:498
KisSelectionSP selection
Definition kis_mask.cc:44
QRect selectedRect() const

References KisProcessingApplicator::applyCommand(), KisNode::childNodes(), KisProcessingApplicator::end(), KisStrokeJobData::EXCLUSIVE, findNonHidableNode(), kundo2_i18n(), m_image, m_nodeManager, m_nodeModel, m_savedNodeBeforeEditSelectionMode, KisProcessingApplicator::NONE, KisImage::rootLayer(), KisSelection::selectedRect(), KisMask::selection, KisLayer::selectionMask(), KisStrokeJobData::SEQUENTIAL, setCurrentNode(), and KoProperties::setProperty().

◆ slotExpanded

void LayerBox::slotExpanded ( const QModelIndex & index)
privateslot

Definition at line 894 of file LayerBox.cpp.

895{
896 KisNodeSP node = m_filteringModel->nodeFromIndex(index);
897 if (node) {
898 node->setCollapsed(false);
899 }
900}

References m_filteringModel, and KisBaseNode::setCollapsed().

◆ slotForgetAboutSavedNodeBeforeEditSelectionMode

void LayerBox::slotForgetAboutSavedNodeBeforeEditSelectionMode ( )
privateslot

Definition at line 1293 of file LayerBox.cpp.

1294{
1296}

References m_savedNodeBeforeEditSelectionMode.

◆ slotImageTimeChanged

void LayerBox::slotImageTimeChanged ( int time)
privateslot

Definition at line 1171 of file LayerBox.cpp.

1172{
1173 Q_UNUSED(time);
1174 updateUI();
1175}

References updateUI().

◆ slotLayerOpMenuClosed

void LayerBox::slotLayerOpMenuClosed ( )
privateslot

Definition at line 852 of file LayerBox.cpp.

853{
854 if (!m_canvas) return;
855 m_opLayerMenu->clear();
856}

References m_canvas, and m_opLayerMenu.

◆ slotLayerOpMenuOpened

void LayerBox::slotLayerOpMenuOpened ( )
privateslot

Definition at line 846 of file LayerBox.cpp.

847{
848 if (!m_canvas) return;
849 updateLayerOpMenu(m_wdgLayerBox->listLayers->currentIndex(), *m_opLayerMenu);
850}

References m_canvas, m_opLayerMenu, m_wdgLayerBox, and updateLayerOpMenu().

◆ slotLowerClicked

void LayerBox::slotLowerClicked ( )
privateslot

Definition at line 832 of file LayerBox.cpp.

833{
834 if (!m_canvas) return;
835 m_nodeManager->lowerNode();
836}

References m_canvas, and m_nodeManager.

◆ slotModelReset

void LayerBox::slotModelReset ( )
privateslot

Definition at line 763 of file LayerBox.cpp.

764{
765 if(m_nodeModel->hasDummiesFacade()) {
766 QItemSelection selection;
767 Q_FOREACH (const KisNodeSP node, m_nodeManager->selectedNodes()) {
768 const QModelIndex &idx = m_filteringModel->indexFromNode(node);
769 if(idx.isValid()){
770 QItemSelectionRange selectionRange(idx);
771 selection << selectionRange;
772 }
773 }
774
775 m_wdgLayerBox->listLayers->selectionModel()->select(selection, QItemSelectionModel::ClearAndSelect);
776 }
777
778 updateUI();
779}

References m_filteringModel, m_nodeManager, m_nodeModel, m_wdgLayerBox, and updateUI().

◆ slotNodeCollapsedChanged

void LayerBox::slotNodeCollapsedChanged ( )
privateslot

Definition at line 911 of file LayerBox.cpp.

912{
913 if (m_nodeModel->hasDummiesFacade()) {
915 }
916}

References expandNodesRecursively(), m_filteringModel, m_image, m_nodeModel, m_wdgLayerBox, and KisImage::rootLayer().

◆ slotNodeManagerChangedSelection

void LayerBox::slotNodeManagerChangedSelection ( const QList< KisNodeSP > & nodes)
privateslot

Definition at line 1107 of file LayerBox.cpp.

1108{
1109 if (!m_nodeManager) return;
1110
1111 QModelIndexList newSelection;
1112 Q_FOREACH(KisNodeSP node, nodes) {
1113 newSelection << m_filteringModel->indexFromNode(node);
1114 }
1115
1116 QItemSelectionModel *model = m_wdgLayerBox->listLayers->selectionModel();
1117
1118 if (KritaUtils::compareListsUnordered(newSelection, model->selectedRows())) {
1119 return;
1120 }
1121
1122 QItemSelection selection;
1123 Q_FOREACH(const QModelIndex &idx, newSelection) {
1124 selection.select(idx, idx);
1125 }
1126
1127 model->select(selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
1128}
bool compareListsUnordered(const QList< T > &a, const QList< T > &b)

References KritaUtils::compareListsUnordered(), m_filteringModel, m_nodeManager, and m_wdgLayerBox.

◆ slotOpacityChanged

void LayerBox::slotOpacityChanged ( )
privateslot

Definition at line 873 of file LayerBox.cpp.

874{
875 if (!m_canvas) return;
877}
qint32 convertOpacityToInt(qreal opacity)
Definition LayerBox.cpp:148
KisNodeSP m_changedOpacityNode
Definition LayerBox.h:165
int m_newOpacity
Definition LayerBox.h:164

References convertOpacityToInt(), m_canvas, m_changedOpacityNode, m_newOpacity, and m_nodeManager.

◆ slotOpacitySliderMoved

void LayerBox::slotOpacitySliderMoved ( qreal opacity)
privateslot

◆ slotPropertiesClicked

void LayerBox::slotPropertiesClicked ( )
privateslot

Definition at line 838 of file LayerBox.cpp.

839{
840 if (!m_canvas) return;
841 if (KisNodeSP active = m_nodeManager->activeNode()) {
842 m_nodeManager->nodeProperties(active);
843 }
844}

References m_canvas, and m_nodeManager.

◆ slotRaiseClicked

void LayerBox::slotRaiseClicked ( )
privateslot

Definition at line 826 of file LayerBox.cpp.

827{
828 if (!m_canvas) return;
829 m_nodeManager->raiseNode();
830}

References m_canvas, and m_nodeManager.

◆ slotRenameCurrentNode

void LayerBox::slotRenameCurrentNode ( )
privateslot

Definition at line 1130 of file LayerBox.cpp.

1131{
1132 m_wdgLayerBox->listLayers->edit(m_wdgLayerBox->listLayers->currentIndex());
1133}

References m_wdgLayerBox.

◆ slotRmClicked

void LayerBox::slotRmClicked ( )
privateslot

Definition at line 820 of file LayerBox.cpp.

821{
822 if (!m_canvas) return;
823 m_nodeManager->removeNode();
824}

References m_canvas, and m_nodeManager.

◆ slotSelectOpaque

void LayerBox::slotSelectOpaque ( )
privateslot

Definition at line 902 of file LayerBox.cpp.

903{
904 if (!m_canvas) return;
905 QAction *action = m_canvas->viewManager()->actionManager()->actionByName("selectopaque");
906 if (action) {
907 action->trigger();
908 }
909}

References m_canvas.

◆ slotSetCompositeOp

void LayerBox::slotSetCompositeOp ( const KoCompositeOp * compositeOp)
privateslot

Definition at line 781 of file LayerBox.cpp.

782{
783 KoID opId = KoCompositeOpRegistry::instance().getKoID(compositeOp->id());
784
785 m_wdgLayerBox->cmbComposite->blockSignals(true);
786 m_wdgLayerBox->cmbComposite->selectCompositeOp(opId);
787 m_wdgLayerBox->cmbComposite->blockSignals(false);
788}
static const KoCompositeOpRegistry & instance()
KoID getKoID(const QString &compositeOpID) const
Definition KoID.h:30

References KoCompositeOpRegistry::getKoID(), KoCompositeOp::id, KoCompositeOpRegistry::instance(), and m_wdgLayerBox.

◆ slotSetOpacity

void LayerBox::slotSetOpacity ( double opacity)
privateslot

Definition at line 791 of file LayerBox.cpp.

792{
793 Q_ASSERT(opacity >= 0 && opacity <= 100);
794 m_wdgLayerBox->doubleOpacity->blockSignals(true);
795 m_wdgLayerBox->doubleOpacity->setValue(opacity);
796 m_wdgLayerBox->doubleOpacity->blockSignals(false);
797}

References m_wdgLayerBox.

◆ slotUpdateIcons

void LayerBox::slotUpdateIcons ( )
privateslot

Definition at line 1298 of file LayerBox.cpp.

1298 {
1299 m_wdgLayerBox->bnAdd->setIcon(KisIconUtils::loadIcon("addlayer"));
1300 m_wdgLayerBox->bnRaise->setIcon(KisIconUtils::loadIcon("arrowup"));
1301 m_wdgLayerBox->bnDelete->setIcon(KisIconUtils::loadIcon("deletelayer"));
1302 m_wdgLayerBox->bnLower->setIcon(KisIconUtils::loadIcon("arrowdown"));
1303 m_wdgLayerBox->bnProperties->setIcon(KisIconUtils::loadIcon("properties"));
1304 m_wdgLayerBox->bnDuplicate->setIcon(KisIconUtils::loadIcon("duplicatelayer"));
1305 m_wdgLayerBox->configureLayerDockerToolbar->setIcon(KisIconUtils::loadIcon("view-choose"));
1306
1307 // call child function about needing to update icons
1308 m_wdgLayerBox->listLayers->slotUpdateIcons();
1309}

References KisIconUtils::loadIcon(), and m_wdgLayerBox.

◆ slotUpdateLayerInfoTextOpacity

void LayerBox::slotUpdateLayerInfoTextOpacity ( )
privateslot

Definition at line 1365 of file LayerBox.cpp.

1366{
1367 KisConfig cfg(false);
1368 if (infoTextOpacitySlider->value() == cfg.layerInfoTextOpacity()) {
1369 return;
1370 }
1371 cfg.setLayerInfoTextOpacity(infoTextOpacitySlider->value());
1372 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1373 m_wdgLayerBox->listLayers->viewport()->update();
1374}

References infoTextOpacitySlider, KisConfig::layerInfoTextOpacity(), m_wdgLayerBox, and KisConfig::setLayerInfoTextOpacity().

◆ slotUpdateLayerInfoTextStyle

void LayerBox::slotUpdateLayerInfoTextStyle ( )
privateslot

Definition at line 1346 of file LayerBox.cpp.

1347{
1348 KisConfig cfg(false);
1349 if (infoTextCombobox->currentIndex() == cfg.layerInfoTextStyle()) {
1350 return;
1351 }
1352 cfg.setLayerInfoTextStyle((KisConfig::LayerInfoTextStyle)infoTextCombobox->currentIndex());
1353 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1354 m_wdgLayerBox->listLayers->viewport()->update();
1355 if (infoTextCombobox->currentIndex() == 0) {
1356 infoTextOpacitySlider->setDisabled(true);
1357 infoTextInlineChkbox->setDisabled(true);
1358 }
1359 else {
1360 infoTextOpacitySlider->setDisabled(false);
1361 infoTextInlineChkbox->setDisabled(false);
1362 }
1363}

References infoTextCombobox, infoTextInlineChkbox, infoTextOpacitySlider, KisConfig::layerInfoTextStyle(), m_wdgLayerBox, and KisConfig::setLayerInfoTextStyle().

◆ slotUpdateOpacitySlider

void LayerBox::slotUpdateOpacitySlider ( quint8 value)
privateslot

Definition at line 799 of file LayerBox.cpp.

799 {
800 double percentage = value * 100.0 / 255.0;
801
802 m_wdgLayerBox->doubleOpacity->blockSignals(true);
803 m_wdgLayerBox->doubleOpacity->setValue(percentage);
804 m_wdgLayerBox->doubleOpacity->blockSignals(false);
805}
float value(const T *src, size_t ch)

References m_wdgLayerBox, and value().

◆ slotUpdateThumbnailIconSize

void LayerBox::slotUpdateThumbnailIconSize ( )
privateslot

Definition at line 1327 of file LayerBox.cpp.

1328{
1329 KisConfig cfg(false);
1330 cfg.setLayerThumbnailSize(thumbnailSizeSlider->value());
1331
1332 m_nodeModel->setPreferredThumnalSize(thumbnailSizeSlider->value());
1333 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1334}

References m_nodeModel, m_wdgLayerBox, KisConfig::setLayerThumbnailSize(), and thumbnailSizeSlider.

◆ slotUpdateTreeIndentation

void LayerBox::slotUpdateTreeIndentation ( )
privateslot

Definition at line 1336 of file LayerBox.cpp.

1337{
1338 KisConfig cfg(false);
1339 if (indentationSlider->value() == cfg.layerTreeIndentation()) {
1340 return;
1341 }
1342 cfg.setLayerTreeIndentation(indentationSlider->value());
1343 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1344}

References indentationSlider, KisConfig::layerTreeIndentation(), m_wdgLayerBox, and KisConfig::setLayerTreeIndentation().

◆ slotUpdateUseInlineLayerInfoText

void LayerBox::slotUpdateUseInlineLayerInfoText ( )
privateslot

Definition at line 1376 of file LayerBox.cpp.

1377{
1378 KisConfig cfg(false);
1379 if (infoTextInlineChkbox->isChecked() == cfg.useInlineLayerInfoText()) {
1380 return;
1381 }
1382 cfg.setUseInlineLayerInfoText(infoTextInlineChkbox->isChecked());
1383 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1384 m_wdgLayerBox->listLayers->viewport()->update();
1385}

References infoTextInlineChkbox, m_wdgLayerBox, KisConfig::setUseInlineLayerInfoText(), and KisConfig::useInlineLayerInfoText().

◆ slotUpdateUseLayerSelectionCheckbox

void LayerBox::slotUpdateUseLayerSelectionCheckbox ( )
privateslot

Definition at line 1388 of file LayerBox.cpp.

1389{
1390 KisConfig cfg(false);
1391 if (layerSelectionCheckBox->isChecked() == cfg.useLayerSelectionCheckbox()) {
1392 return;
1393 }
1394 cfg.setUseLayerSelectionCheckbox(layerSelectionCheckBox->isChecked());
1395 m_wdgLayerBox->listLayers->slotConfigurationChanged();
1396 m_wdgLayerBox->listLayers->viewport()->update();
1397}

References layerSelectionCheckBox, m_wdgLayerBox, KisConfig::setUseLayerSelectionCheckbox(), and KisConfig::useLayerSelectionCheckbox().

◆ toggleActiveLayerSolo

void LayerBox::toggleActiveLayerSolo ( )
privateslot

Definition at line 1311 of file LayerBox.cpp.

1311 {
1312 NodeView* view = m_wdgLayerBox->listLayers;
1313 if (!view)
1314 return;
1315
1316 KisNodeSP node = m_nodeManager->activeNode();
1317 if (!node)
1318 return;
1319
1320 QModelIndex index = m_filteringModel->indexFromNode(node);
1321 if (!index.isValid())
1322 return;
1323
1324 view->toggleSolo(index);
1325}
void toggleSolo(const QModelIndex &index)
Definition NodeView.cpp:147

References m_filteringModel, m_nodeManager, m_wdgLayerBox, and NodeView::toggleSolo().

◆ unsetCanvas()

void LayerBox::unsetCanvas ( )
overridevirtual

Re-implement to notify the observer that its canvas is no longer among the living. The daisies, it is pushing up. This means you don't have to disconnect, it's dead.

The old canvas should be deleted already, so if you stored a pointer to it, don't touch!

Note that currently there is a bug where in certain specific circumstances unsetCanvas can be called when it shouldn't, see for example KWStatisticsDocker for a workaround for this problem.

Implements KoCanvasObserverBase.

Definition at line 634 of file LayerBox.cpp.

635{
636 setEnabled(false);
637 if (m_canvas) {
638 m_newLayerMenu->clear();
639 }
640
641 m_filteringModel->unsetDummiesFacade();
642 disconnect(m_image, 0, this, 0);
643 disconnect(m_nodeManager, 0, this, 0);
644 disconnect(m_nodeModel, 0, m_nodeManager, 0);
645 m_nodeManager->slotSetSelectedNodes(KisNodeList());
646
647 m_canvas = 0;
648}

References m_canvas, m_filteringModel, m_image, m_newLayerMenu, m_nodeManager, and m_nodeModel.

◆ updateAvailableLabels

void LayerBox::updateAvailableLabels ( )
privateslot

Definition at line 1159 of file LayerBox.cpp.

1160{
1161 if (!m_image) return;
1163}
void updateColorLabels(KisNodeSP root)

References layerFilterWidget, m_image, KisNodeFacade::root, and KisLayerFilterWidget::updateColorLabels().

◆ updateLayerFiltering

void LayerBox::updateLayerFiltering ( )
privateslot

◆ updateLayerOpMenu

void LayerBox::updateLayerOpMenu ( const QModelIndex & index,
QMenu & menu )
privateslot

Definition at line 1177 of file LayerBox.cpp.

1177 {
1178
1179 KisNodeList nodes = m_nodeManager->selectedNodes();
1180 KisNodeSP activeNode = m_nodeManager->activeNode();
1181 const bool singleNode = nodes.size() == 1;
1182
1183 if (index.isValid()) {
1184 menu.addAction(m_propertiesAction);
1185
1186 KisLayerSP singleLayer = dynamic_cast<KisLayer*>(activeNode.data());
1187
1188 if (singleLayer) {
1189 addActionToMenu(&menu, "layer_style");
1190
1191 if (singleLayer->layerStyle()) {
1192 addActionToMenu(&menu, "copy_layer_style");
1193 }
1194
1195 if (KisClipboard::instance()->hasLayerStyles()) {
1196 addActionToMenu(&menu, "paste_layer_style");
1197 }
1198 }
1199
1200 Q_FOREACH(KisNodeSP node, nodes) {
1201 if (node && node->inherits("KisCloneLayer")) {
1202 menu.addAction(m_changeCloneSourceAction);
1203 break;
1204 }
1205 }
1206
1207 {
1208 KisSignalsBlocker b(m_colorSelector->colorLabelSelector());
1209 m_colorSelector->colorLabelSelector()->setCurrentIndex(singleNode ? activeNode->colorLabelIndex() : -1);
1210 }
1211
1212 menu.addAction(m_colorSelectorAction);
1213
1214 menu.addSeparator();
1215
1216 addActionToMenu(&menu, "cut_layer_clipboard");
1217 addActionToMenu(&menu, "copy_layer_clipboard");
1218 addActionToMenu(&menu, "paste_layer_from_clipboard");
1219 menu.addAction(m_removeAction);
1220 addActionToMenu(&menu, "duplicatelayer");
1221 addActionToMenu(&menu, "merge_layer");
1222 addActionToMenu(&menu, "new_from_visible");
1223
1224 if (singleNode) {
1225 addActionToMenu(&menu, "flatten_image");
1226 addActionToMenu(&menu, "flatten_layer");
1227 }
1228
1229 menu.addSeparator();
1230 QMenu *selectMenu = menu.addMenu(i18n("&Select"));
1231 addActionToMenu(selectMenu, "select_all_layers");
1232 addActionToMenu(selectMenu, "select_visible_layers");
1233 addActionToMenu(selectMenu, "select_invisible_layers");
1234 addActionToMenu(selectMenu, "select_locked_layers");
1235 addActionToMenu(selectMenu, "select_unlocked_layers");
1236 QMenu *groupMenu = menu.addMenu(i18nc("A group of layers", "&Group"));
1237 addActionToMenu(groupMenu, "create_quick_group");
1238 addActionToMenu(groupMenu, "create_quick_clipping_group");
1239 addActionToMenu(groupMenu, "quick_ungroup");
1240 QMenu *locksMenu = menu.addMenu(i18n("&Toggle Locks && Visibility"));
1241 addActionToMenu(locksMenu, "toggle_layer_visibility");
1242 addActionToMenu(locksMenu, "toggle_layer_lock");
1243 addActionToMenu(locksMenu, "toggle_layer_inherit_alpha");
1244 addActionToMenu(locksMenu, "toggle_layer_alpha_lock");
1245
1246 if (singleNode) {
1247 QMenu *addLayerMenu = menu.addMenu(i18n("&Add"));
1248 addActionToMenu(addLayerMenu, "add_new_transparency_mask");
1249 addActionToMenu(addLayerMenu, "add_new_filter_mask");
1250 addActionToMenu(addLayerMenu, "add_new_fast_color_overlay_mask");
1251 addActionToMenu(addLayerMenu, "add_new_colorize_mask");
1252 addActionToMenu(addLayerMenu, "add_new_transform_mask");
1253 addActionToMenu(addLayerMenu, "add_new_selection_mask");
1254 addLayerMenu->addSeparator();
1255 addActionToMenu(addLayerMenu, "add_new_clone_layer");
1256
1257 QMenu *convertToMenu = menu.addMenu(i18n("&Convert"));
1258 addActionToMenu(convertToMenu, "convert_to_paint_layer");
1259 addActionToMenu(convertToMenu, "convert_to_transparency_mask");
1260 addActionToMenu(convertToMenu, "convert_to_filter_mask");
1261 addActionToMenu(convertToMenu, "convert_to_selection_mask");
1262 addActionToMenu(convertToMenu, "convert_to_file_layer");
1263 addActionToMenu(convertToMenu, "convert_group_to_animated");
1264 addActionToMenu(convertToMenu, "layercolorspaceconversion");
1265
1266 QMenu *splitAlphaMenu = menu.addMenu(i18n("S&plit Alpha"));
1267 addActionToMenu(splitAlphaMenu, "split_alpha_into_mask");
1268 addActionToMenu(splitAlphaMenu, "split_alpha_write");
1269 addActionToMenu(splitAlphaMenu, "split_alpha_save_merged");
1270 } else {
1271 QMenu *addLayerMenu = menu.addMenu(i18n("&Add"));
1272 addActionToMenu(addLayerMenu, "add_new_clone_layer");
1273 }
1274
1275 menu.addSeparator();
1276
1277 addActionToMenu(&menu, "pin_to_timeline");
1278
1279
1280 if (singleNode) {
1281 KisNodeSP node = m_filteringModel->nodeFromIndex(index);
1282 if (node && !node->inherits("KisTransformMask")) {
1283 addActionToMenu(&menu, "isolate_active_layer");
1284 addActionToMenu(&menu, "isolate_active_group");
1285 }
1286
1287 addActionToMenu(&menu, "selectopaque");
1288
1289 }
1290 }
1291}
static KisClipboard * instance()
int colorLabelIndex() const
KisPSDLayerStyleSP layerStyle
Definition kis_layer.cc:171

References addActionToMenu(), KisBaseNode::colorLabelIndex(), KisSharedPtr< T >::data(), KisClipboard::instance(), KisLayer::layerStyle, m_changeCloneSourceAction, m_colorSelector, m_colorSelectorAction, m_filteringModel, m_nodeManager, m_propertiesAction, and m_removeAction.

◆ updateUI

void LayerBox::updateUI ( )
privateslot

the composite op works in the color space of the parent layer, not the active one.

Definition at line 670 of file LayerBox.cpp.

671{
672 if (!m_canvas) return;
673 if (!m_nodeManager) return;
674
675 KisNodeSP activeNode = m_nodeManager->activeNode();
676
677 if (activeNode != m_activeNode) {
679 m_activeNode = activeNode;
680
681 if (activeNode) {
682 KisPaintDeviceSP parentLayerDevice = activeNode->parent() ? activeNode->parent()->original() : 0;
683 if (parentLayerDevice) {
684 // update blending modes availability
686 parentLayerDevice, SIGNAL(colorSpaceChanged(const KoColorSpace*)),
687 this, SLOT(updateUI()));
688 }
689
691 activeNode, SIGNAL(opacityChanged(quint8)),
692 this, SLOT(slotUpdateOpacitySlider(quint8)));
693 }
694 }
695
696 m_wdgLayerBox->bnRaise->setEnabled(activeNode && activeNode->isEditable(false) && (activeNode->nextSibling()
697 || (activeNode->parent() && activeNode->parent() != m_image->root())));
698 m_wdgLayerBox->bnLower->setEnabled(activeNode && activeNode->isEditable(false) && (activeNode->prevSibling()
699 || (activeNode->parent() && activeNode->parent() != m_image->root())));
700
701 m_wdgLayerBox->doubleOpacity->setEnabled(activeNode && activeNode->isEditable(false));
702
703 m_wdgLayerBox->cmbComposite->setEnabled(activeNode && activeNode->isEditable(false));
704
705 if (activeNode) {
706 if (activeNode->inherits("KisColorizeMask") || activeNode->inherits("KisLayer")) {
707
708 m_wdgLayerBox->doubleOpacity->setEnabled(true);
709
710 if (!m_wdgLayerBox->doubleOpacity->isDragging()) {
711 slotSetOpacity(activeNode->opacity() * 100.0 / 255);
712 }
713
714 const KoCompositeOp* compositeOp = activeNode->compositeOp();
715 if (compositeOp) {
718 m_wdgLayerBox->cmbComposite->validate(compositeOp->colorSpace());
719 slotSetCompositeOp(compositeOp);
720 } else {
721 m_wdgLayerBox->cmbComposite->setEnabled(false);
722 }
723
724 const KisGroupLayer *group = qobject_cast<const KisGroupLayer*>(activeNode.data());
725 bool compositeSelectionActive = !(group && group->passThroughMode());
726
727 m_wdgLayerBox->cmbComposite->setEnabled(compositeSelectionActive);
728 } else if (activeNode->inherits("KisMask")) {
729 m_wdgLayerBox->cmbComposite->setEnabled(false);
730 m_wdgLayerBox->doubleOpacity->setEnabled(false);
731 }
732 }
733}
void addConnection(Sender sender, Signal signal, Receiver receiver, Method method, Qt::ConnectionType type=Qt::AutoConnection)
void slotUpdateOpacitySlider(quint8 value)
Definition LayerBox.cpp:799
void slotSetCompositeOp(const KoCompositeOp *compositeOp)
Definition LayerBox.cpp:781
KisSignalAutoConnectionsStore m_activeNodeConnections
Definition LayerBox.h:188
void slotSetOpacity(double opacity)
Definition LayerBox.cpp:791
bool isEditable(bool checkVisibility=true) const
virtual KisPaintDeviceSP original() const =0
QString compositeOp
quint8 opacity() const
const KoColorSpace * colorSpace

References KisSignalAutoConnectionsStore::addConnection(), KisSignalAutoConnectionsStore::clear(), KoCompositeOp::colorSpace, KisBaseNode::compositeOp, KisSharedPtr< T >::data(), KisBaseNode::isEditable(), m_activeNode, m_activeNodeConnections, m_canvas, m_image, m_nodeManager, m_wdgLayerBox, KisNode::nextSibling(), KisBaseNode::opacity(), KisBaseNode::original(), KisNode::parent, KisGroupLayer::passThroughMode, KisNode::prevSibling(), KisNodeFacade::root, slotSetCompositeOp(), slotSetOpacity(), slotUpdateOpacitySlider(), and updateUI().

Member Data Documentation

◆ indentationSlider

QSlider* LayerBox::indentationSlider
private

Definition at line 180 of file LayerBox.h.

◆ infoTextCombobox

QComboBox* LayerBox::infoTextCombobox
private

Definition at line 181 of file LayerBox.h.

◆ infoTextInlineChkbox

QCheckBox* LayerBox::infoTextInlineChkbox
private

Definition at line 183 of file LayerBox.h.

◆ infoTextOpacitySlider

KisSliderSpinBox* LayerBox::infoTextOpacitySlider
private

Definition at line 182 of file LayerBox.h.

◆ layerFilterWidget

KisLayerFilterWidget* LayerBox::layerFilterWidget
private

Definition at line 178 of file LayerBox.h.

◆ layerSelectionCheckBox

QCheckBox* LayerBox::layerSelectionCheckBox {nullptr}
private

Definition at line 184 of file LayerBox.h.

184{nullptr};

◆ m_activeNode

KisNodeSP LayerBox::m_activeNode
private

Definition at line 186 of file LayerBox.h.

◆ m_activeNodeConnections

KisSignalAutoConnectionsStore LayerBox::m_activeNodeConnections
private

Definition at line 188 of file LayerBox.h.

◆ m_canvas

QPointer<KisCanvas2> LayerBox::m_canvas
private

Definition at line 153 of file LayerBox.h.

◆ m_changeCloneSourceAction

KisAction* LayerBox::m_changeCloneSourceAction
private

Definition at line 169 of file LayerBox.h.

◆ m_changedOpacityNode

KisNodeSP LayerBox::m_changedOpacityNode
private

Definition at line 165 of file LayerBox.h.

◆ m_colorLabelCompressor

KisSignalCompressor LayerBox::m_colorLabelCompressor
private

Definition at line 172 of file LayerBox.h.

◆ m_colorSelector

QPointer<KisColorLabelSelectorWidgetMenuWrapper> LayerBox::m_colorSelector
private

Definition at line 161 of file LayerBox.h.

◆ m_colorSelectorAction

QPointer<QWidgetAction> LayerBox::m_colorSelectorAction
private

Definition at line 162 of file LayerBox.h.

◆ m_filteringModel

QPointer<KisNodeFilterProxyModel> LayerBox::m_filteringModel
private

Definition at line 159 of file LayerBox.h.

◆ m_image

KisImageWSP LayerBox::m_image
private

Definition at line 157 of file LayerBox.h.

◆ m_infoTextOpacityCompressor

KisSignalCompressor LayerBox::m_infoTextOpacityCompressor
private

Definition at line 175 of file LayerBox.h.

◆ m_layerToggleSolo

KisAction* LayerBox::m_layerToggleSolo
private

Definition at line 170 of file LayerBox.h.

◆ m_newLayerMenu

QMenu* LayerBox::m_newLayerMenu
private

Definition at line 155 of file LayerBox.h.

◆ m_newOpacity

int LayerBox::m_newOpacity
private

Definition at line 164 of file LayerBox.h.

◆ m_nodeManager

QPointer<KisNodeManager> LayerBox::m_nodeManager
private

Definition at line 160 of file LayerBox.h.

◆ m_nodeModel

QPointer<KisNodeModel> LayerBox::m_nodeModel
private

Definition at line 158 of file LayerBox.h.

◆ m_nodeOpacityCompressor

KisSignalCompressor LayerBox::m_nodeOpacityCompressor
private

Definition at line 176 of file LayerBox.h.

◆ m_opLayerMenu

QMenu* LayerBox::m_opLayerMenu
private

Definition at line 156 of file LayerBox.h.

◆ m_propertiesAction

KisAction* LayerBox::m_propertiesAction
private

Definition at line 168 of file LayerBox.h.

◆ m_removeAction

KisAction* LayerBox::m_removeAction
private

Definition at line 167 of file LayerBox.h.

◆ m_savedNodeBeforeEditSelectionMode

KisNodeWSP LayerBox::m_savedNodeBeforeEditSelectionMode
private

Definition at line 187 of file LayerBox.h.

◆ m_selectionActionsAdapter

QScopedPointer<KisSelectionActionsAdapter> LayerBox::m_selectionActionsAdapter
private

Definition at line 154 of file LayerBox.h.

◆ m_showGlobalSelectionMask

KisAction* LayerBox::m_showGlobalSelectionMask
private

Definition at line 171 of file LayerBox.h.

◆ m_thumbnailSizeCompressor

KisSignalCompressor LayerBox::m_thumbnailSizeCompressor
private

Definition at line 173 of file LayerBox.h.

◆ m_treeIndentationCompressor

KisSignalCompressor LayerBox::m_treeIndentationCompressor
private

Definition at line 174 of file LayerBox.h.

◆ m_wdgLayerBox

Ui_WdgLayerBox* LayerBox::m_wdgLayerBox
private

Definition at line 163 of file LayerBox.h.

◆ thumbnailSizeSlider

QSlider* LayerBox::thumbnailSizeSlider
private

Definition at line 179 of file LayerBox.h.


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