diff --git a/libs/ui/kis_paintop_box.cc b/libs/ui/kis_paintop_box.cc --- a/libs/ui/kis_paintop_box.cc +++ b/libs/ui/kis_paintop_box.cc @@ -461,6 +461,8 @@ connect(m_presetsPopup , SIGNAL(eraserBrushOpacityToggled(bool)) , SLOT(slotEraserBrushOpacityToggled(bool))); connect(m_presetsChooserPopup, SIGNAL(resourceSelected(KoResource*)) , SLOT(resourceSelected(KoResource*))); + connect(m_presetsChooserPopup, SIGNAL(resourceClicked(KoResource*)) , SLOT(resourceSelected(KoResource*))); + connect(m_resourceProvider , SIGNAL(sigNodeChanged(const KisNodeSP)) , SLOT(slotNodeChanged(const KisNodeSP))); connect(m_cmbCompositeOp , SIGNAL(currentIndexChanged(int)) , SLOT(slotSetCompositeMode(int))); connect(m_eraseAction , SIGNAL(toggled(bool)) , SLOT(slotToggleEraseMode(bool))); @@ -769,7 +771,12 @@ updateCompositeOp(compositeOp); resourceSelected(preset.data()); } - m_presetsChooserPopup->canvasResourceChanged(preset.data(), preset); + + /** + * Update currently selected preset in both the popup widgets + */ + m_presetsChooserPopup->canvasResourceChanged(preset); + m_presetsPopup->currentPresetChanged(preset); if (key == KisCanvasResourceProvider::CurrentCompositeOp) { if (m_resourceProvider->currentCompositeOp() != m_currCompositeOpID) { diff --git a/libs/ui/widgets/kis_paintop_presets_chooser_popup.h b/libs/ui/widgets/kis_paintop_presets_chooser_popup.h --- a/libs/ui/widgets/kis_paintop_presets_chooser_popup.h +++ b/libs/ui/widgets/kis_paintop_presets_chooser_popup.h @@ -38,9 +38,10 @@ void showButtons(bool show); void updateViewSettings(); public Q_SLOTS: - void canvasResourceChanged( KoResource * resource, KisPaintOpPresetSP preset ); + void canvasResourceChanged(KisPaintOpPresetSP preset ); Q_SIGNALS: void resourceSelected( KoResource * resource); + void resourceClicked( KoResource * resource); private Q_SLOTS: void slotThumbnailMode(); diff --git a/libs/ui/widgets/kis_paintop_presets_chooser_popup.cpp b/libs/ui/widgets/kis_paintop_presets_chooser_popup.cpp --- a/libs/ui/widgets/kis_paintop_presets_chooser_popup.cpp +++ b/libs/ui/widgets/kis_paintop_presets_chooser_popup.cpp @@ -71,6 +71,8 @@ connect(m_d->uiWdgPaintOpPresets.wdgPresetChooser, SIGNAL(resourceSelected(KoResource*)), this, SIGNAL(resourceSelected(KoResource*))); + connect(m_d->uiWdgPaintOpPresets.wdgPresetChooser, SIGNAL(resourceClicked(KoResource*)), + this, SIGNAL(resourceClicked(KoResource*))); m_d->firstShown = true; @@ -108,16 +110,11 @@ m_d->uiWdgPaintOpPresets.wdgPresetChooser->showButtons(show); } -void KisPaintOpPresetsChooserPopup::canvasResourceChanged(KoResource* resource , KisPaintOpPresetSP preset2 ) +void KisPaintOpPresetsChooserPopup::canvasResourceChanged(KisPaintOpPresetSP preset) { - Q_UNUSED(preset2); - - if (resource) { + if (preset) { blockSignals(true); - KisPaintOpPresetResourceServer * rserver = KisResourceServerProvider::instance()->paintOpPresetServer(); - KisPaintOpPresetSP preset = rserver->resourceByName(resource->name()); - - m_d->uiWdgPaintOpPresets.wdgPresetChooser->itemChooser()->setCurrentResource(preset.data()); + m_d->uiWdgPaintOpPresets.wdgPresetChooser->setCurrentResource(preset.data()); blockSignals(false); } m_d->uiWdgPaintOpPresets.wdgPresetChooser->updateViewSettings(); diff --git a/libs/ui/widgets/kis_paintop_presets_popup.h b/libs/ui/widgets/kis_paintop_presets_popup.h --- a/libs/ui/widgets/kis_paintop_presets_popup.h +++ b/libs/ui/widgets/kis_paintop_presets_popup.h @@ -71,6 +71,8 @@ void updateViewSettings(); + void currentPresetChanged(KisPaintOpPresetSP preset); + protected: void contextMenuEvent(QContextMenuEvent *); void hideEvent(QHideEvent *); diff --git a/libs/ui/widgets/kis_paintop_presets_popup.cpp b/libs/ui/widgets/kis_paintop_presets_popup.cpp --- a/libs/ui/widgets/kis_paintop_presets_popup.cpp +++ b/libs/ui/widgets/kis_paintop_presets_popup.cpp @@ -331,6 +331,7 @@ void KisPaintOpPresetsPopup::resourceSelected(KoResource* resource) { + m_d->uiWdgPaintOpPresetSettings.presetWidget->smallPresetChooser->setCurrentResource(resource); m_d->uiWdgPaintOpPresetSettings.txtPreset->setText(resource->name()); slotWatchPresetNameLineEdit(); } @@ -405,6 +406,11 @@ m_d->uiWdgPaintOpPresetSettings.presetWidget->smallPresetChooser->updateViewSettings(); } +void KisPaintOpPresetsPopup::currentPresetChanged(KisPaintOpPresetSP preset) +{ + m_d->uiWdgPaintOpPresetSettings.presetWidget->smallPresetChooser->setCurrentResource(preset.data()); +} + void KisPaintOpPresetsPopup::updateThemedIcons() { m_d->uiWdgPaintOpPresetSettings.fillLayer->setIcon(KisIconUtils::loadIcon("document-new")); diff --git a/libs/ui/widgets/kis_preset_chooser.h b/libs/ui/widgets/kis_preset_chooser.h --- a/libs/ui/widgets/kis_preset_chooser.h +++ b/libs/ui/widgets/kis_preset_chooser.h @@ -53,16 +53,16 @@ void setViewMode(ViewMode mode); void showButtons(bool show); + void setCurrentResource(KoResource *resource); KoResource* currentResource(); /// Sets the visibility of tagging klineEdits void showTaggingBar(bool show); - KoResourceItemChooser *itemChooser(); - void setPresetFilter(const QString& paintOpId); Q_SIGNALS: - void resourceSelected(KoResource * resource); + void resourceSelected(KoResource *resource); + void resourceClicked(KoResource *resource); public Q_SLOTS: void updateViewSettings(); diff --git a/libs/ui/widgets/kis_preset_chooser.cpp b/libs/ui/widgets/kis_preset_chooser.cpp --- a/libs/ui/widgets/kis_preset_chooser.cpp +++ b/libs/ui/widgets/kis_preset_chooser.cpp @@ -169,6 +169,10 @@ emitRemovingResource(0); } + QString currentPaintOpId() const { + return m_paintopID; + } + private: QString m_paintopID; }; @@ -193,6 +197,8 @@ connect(m_chooser, SIGNAL(resourceSelected(KoResource*)), this, SIGNAL(resourceSelected(KoResource*))); + connect(m_chooser, SIGNAL(resourceClicked(KoResource*)), + this, SIGNAL(resourceClicked(KoResource*))); m_mode = THUMBNAIL; @@ -251,6 +257,29 @@ } } +void KisPresetChooser::setCurrentResource(KoResource *resource) +{ + /** + * HACK ALERT: here we use a direct call to an adapter to notify the view + * that the preset might have changed its dirty state. This state + * doesn't affect the filtering so the server's cache must not be + * invalidated! + * + * Ideally, we should call some method of KoResourceServer instead, + * but ut seems like a bit too much effort for such a small fix. + */ + + if (resource == currentResource()) { + KisPresetProxyAdapter *adapter = static_cast(m_adapter.data()); + KisPaintOpPreset *preset = dynamic_cast(resource); + if (preset) { + adapter->resourceChangedNoCacheInvalidation(preset); + } + } + + m_chooser->setCurrentResource(resource); +} + KoResource* KisPresetChooser::currentResource() { return m_chooser->currentResource(); @@ -268,8 +297,12 @@ void KisPresetChooser::setPresetFilter(const QString& paintOpId) { - static_cast(m_adapter.data())->setPresetFilter(paintOpId); - updateViewSettings(); + KisPresetProxyAdapter *adapter = static_cast(m_adapter.data()); + + if (adapter->currentPaintOpId() != paintOpId) { + adapter->setPresetFilter(paintOpId); + updateViewSettings(); + } } diff --git a/libs/widgets/KoResourceItemChooser.h b/libs/widgets/KoResourceItemChooser.h --- a/libs/widgets/KoResourceItemChooser.h +++ b/libs/widgets/KoResourceItemChooser.h @@ -113,12 +113,16 @@ Q_SIGNALS: /// Emitted when a resource was selected void resourceSelected(KoResource *resource); + /// Emitted when an *already selected* resource is clicked + /// again + void resourceClicked(KoResource *resource); void splitterMoved(); public Q_SLOTS: void slotButtonClicked(int button); private Q_SLOTS: void activated(const QModelIndex &index); + void clicked(const QModelIndex &index); void contextMenuRequested(const QPoint &pos); void baseLengthChanged(int length); diff --git a/libs/widgets/KoResourceItemChooser.cpp b/libs/widgets/KoResourceItemChooser.cpp --- a/libs/widgets/KoResourceItemChooser.cpp +++ b/libs/widgets/KoResourceItemChooser.cpp @@ -112,6 +112,7 @@ d->view->viewport()->installEventFilter(this); connect(d->view, SIGNAL(currentResourceChanged(QModelIndex)), this, SLOT(activated(QModelIndex))); + connect(d->view, SIGNAL(currentResourceClicked(QModelIndex)), this, SLOT(clicked(QModelIndex))); connect(d->view, SIGNAL(contextMenuRequested(QPoint)), this, SLOT(contextMenuRequested(QPoint))); connect(d->view, SIGNAL(sigSizeChanged()), this, SLOT(updateView())); @@ -303,11 +304,9 @@ } QModelIndex index = d->model->indexFromResource(resource); - if (!index.isValid()) - return; d->view->setCurrentIndex(index); - updatePreview(resource); + updatePreview(index.isValid() ? resource : 0); } void KoResourceItemChooser::slotBeforeResourcesLayoutReset(KoResource *activateAfterReset) @@ -370,6 +369,16 @@ } } +void KoResourceItemChooser::clicked(const QModelIndex &index) +{ + Q_UNUSED(index); + + KoResource *resource = currentResource(); + if (resource) { + emit resourceClicked(resource); + } +} + void KoResourceItemChooser::updateButtonState() { QAbstractButton *removeButton = d->buttonGroup->button(Button_Remove); @@ -386,7 +395,12 @@ void KoResourceItemChooser::updatePreview(KoResource *resource) { - if (!d->usePreview || !resource) return; + if (!d->usePreview) return; + + if (!resource) { + d->previewLabel->setPixmap(QPixmap()); + return; + } QImage image = resource->image(); diff --git a/libs/widgets/KoResourceItemView.h b/libs/widgets/KoResourceItemView.h --- a/libs/widgets/KoResourceItemView.h +++ b/libs/widgets/KoResourceItemView.h @@ -43,15 +43,22 @@ Q_SIGNALS: void currentResourceChanged(const QModelIndex &); + void currentResourceClicked(const QModelIndex &); + void contextMenuRequested(const QPoint &); protected: virtual void contextMenuEvent(QContextMenuEvent *event); void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + void mousePressEvent(QMouseEvent *event); + +private Q_SLOTS: + void slotItemClicked(const QModelIndex &index); + private: KoIconToolTip m_tip; - + QModelIndex m_beforeClickIndex; }; #endif // KORESOURCEITEMVIEW_H diff --git a/libs/widgets/KoResourceItemView.cpp b/libs/widgets/KoResourceItemView.cpp --- a/libs/widgets/KoResourceItemView.cpp +++ b/libs/widgets/KoResourceItemView.cpp @@ -27,6 +27,7 @@ KoResourceItemView::KoResourceItemView(QWidget *parent) : KoTableView(parent) { + connect(this, SIGNAL(clicked(QModelIndex)), SLOT(slotItemClicked(QModelIndex))); } bool KoResourceItemView::viewportEvent(QEvent *event) @@ -55,6 +56,21 @@ } } +void KoResourceItemView::mousePressEvent(QMouseEvent *event) +{ + m_beforeClickIndex = currentIndex(); + KoTableView::mousePressEvent(event); +} + +void KoResourceItemView::slotItemClicked(const QModelIndex &index) +{ + if (m_beforeClickIndex == index) { + emit currentResourceClicked(index); + } + + m_beforeClickIndex = QModelIndex(); +} + void KoResourceItemView::contextMenuEvent(QContextMenuEvent *event) { QTableView::contextMenuEvent(event); diff --git a/libs/widgets/KoResourceModel.cpp b/libs/widgets/KoResourceModel.cpp --- a/libs/widgets/KoResourceModel.cpp +++ b/libs/widgets/KoResourceModel.cpp @@ -166,9 +166,7 @@ void KoResourceModel::resourceRemoved(KoResource *resource) { Q_UNUSED(resource); - - KoResource *first = !m_resourceAdapter->resources().isEmpty() ? m_resourceAdapter->resources().first() : 0; - doSafeLayoutReset(first); + doSafeLayoutReset(0); } void KoResourceModel::resourceChanged(KoResource* resource) diff --git a/libs/widgets/KoResourceServerAdapter.h b/libs/widgets/KoResourceServerAdapter.h --- a/libs/widgets/KoResourceServerAdapter.h +++ b/libs/widgets/KoResourceServerAdapter.h @@ -214,6 +214,10 @@ emitResourceChanged(Policy::toResourcePointer(resource)); } + void resourceChangedNoCacheInvalidation(PointerType resource) { + emitResourceChanged(Policy::toResourcePointer(resource)); + } + void syncTaggedResourceView() { serverResourceCacheInvalid(true); m_resourceFilter.rebuildCurrentTagFilenames(); diff --git a/plugins/dockers/presetdocker/presetdocker_dock.cpp b/plugins/dockers/presetdocker/presetdocker_dock.cpp --- a/plugins/dockers/presetdocker/presetdocker_dock.cpp +++ b/plugins/dockers/presetdocker/presetdocker_dock.cpp @@ -58,6 +58,8 @@ connect(m_presetChooser, SIGNAL(resourceSelected(KoResource*)), m_canvas->viewManager()->paintOpBox(), SLOT(resourceSelected(KoResource*))); + connect(m_presetChooser, SIGNAL(resourceClicked(KoResource*)), + m_canvas->viewManager()->paintOpBox(), SLOT(resourceSelected(KoResource*))); connect(canvas->resourceManager(), SIGNAL(canvasResourceChanged(int,QVariant)), this, SLOT(canvasResourceChanged(int,QVariant))); } @@ -68,7 +70,7 @@ sender()->blockSignals(true); KisPaintOpPresetSP preset = m_canvas->resourceManager()->resource(KisCanvasResourceProvider::CurrentPaintOpPreset).value(); if(preset) - m_presetChooser->canvasResourceChanged(preset.data(), preset); + m_presetChooser->canvasResourceChanged(preset); sender()->blockSignals(false); m_presetChooser->updateViewSettings(); }