diff --git a/libs/resourcewidgets/KisResourceTaggingManager.cpp b/libs/resourcewidgets/KisResourceTaggingManager.cpp index 86b1f985c7..b4365844e2 100644 --- a/libs/resourcewidgets/KisResourceTaggingManager.cpp +++ b/libs/resourcewidgets/KisResourceTaggingManager.cpp @@ -1,456 +1,392 @@ /* * This file is part of the KDE project * Copyright (c) 2002 Patrick Julien * Copyright (c) 2007 Jan Hambrecht * Copyright (c) 2007 Sven Langkamp * Copyright (C) 2011 Srikanth Tiyyagura * Copyright (c) 2011 José Luis Vergara * Copyright (c) 2013 Sascha Suelzer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "KisResourceTaggingManager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "KisTagFilterWidget.h" #include "KisTagChooserWidget.h" #include "KisResourceItemChooserContextMenu.h" #include "kis_debug.h" #include "KisTag.h" class TaggedResourceSet { public: TaggedResourceSet() {} TaggedResourceSet(const QString& tagName, const QList& resources) : tagName(tagName) , resources(resources) {} QString tagName; QList resources; }; class KisResourceTaggingManager::Private { public: KisTagSP currentTag; KisTagChooserWidget *tagChooser; KisTagFilterWidget *tagFilter; QCompleter *tagCompleter; QPointer model; KisTagModel* tagModel; KisResourceModel* resourceSourceModel; }; KisResourceTaggingManager::KisResourceTaggingManager(QString resourceType, KisTagFilterResourceProxyModel *model, QWidget *parent) : QObject(parent) , d(new Private()) { d->model = model; d->tagModel = KisTagModelProvider::tagModel(resourceType); d->resourceSourceModel = KisResourceModelProvider::resourceModel(resourceType); d->tagChooser = new KisTagChooserWidget(d->tagModel, parent); d->tagFilter = new KisTagFilterWidget(d->tagModel, parent); connect(d->tagChooser, SIGNAL(tagChosen(KisTagSP)), this, SLOT(tagChooserIndexChanged(KisTagSP))); connect(d->tagChooser, SIGNAL(newTagRequested(KisTagSP)), this, SLOT(contextCreateNewTag(KisTagSP))); connect(d->tagChooser, SIGNAL(tagDeletionRequested(KisTagSP)), this, SLOT(removeTagFromComboBox(KisTagSP))); connect(d->tagChooser, SIGNAL(tagRenamingRequested(KisTagSP,KisTagSP)), this, SLOT(renameTag(KisTagSP,KisTagSP))); connect(d->tagChooser, SIGNAL(tagUndeletionRequested(KisTagSP)), this, SLOT(undeleteTag(KisTagSP))); connect(d->tagChooser, SIGNAL(tagUndeletionListPurgeRequested()), this, SLOT(purgeTagUndeleteList())); connect(d->tagFilter, SIGNAL(saveButtonClicked()), this, SLOT(tagSaveButtonPressed())); connect(d->tagFilter, SIGNAL(filterTextChanged(QString)), this, SLOT(tagSearchLineEditTextChanged(QString))); -// connect(d->model, SIGNAL(tagBoxEntryAdded(QString)), this, SLOT(syncTagBoxEntryAddition(QString))); -// connect(d->model, SIGNAL(tagBoxEntryRemoved(QString)), this, SLOT(syncTagBoxEntryRemoval(QString))); -// connect(d->model, SIGNAL(tagBoxEntryModified()), this, SLOT(syncTagBoxEntries())); - - // FIXME: fix tag completer - // d->tagCompleter = new QCompleter(this); - // d->tagSearchLineEdit->setCompleter(d->tagCompleter); - syncTagBoxEntries(); } KisResourceTaggingManager::~KisResourceTaggingManager() { delete d; } void KisResourceTaggingManager::showTaggingBar(bool show) { - ENTER_FUNCTION(); show ? d->tagFilter->show() : d->tagFilter->hide(); show ? d->tagChooser->show() : d->tagChooser->hide(); - -// blockSignals(!show); - -// QString tag("All"); -// if (show) { -// KConfigGroup group = KSharedConfig::openConfig()->group("SelectedTags"); -// tag = group.readEntry(d->model->serverType(), "All"); -// } -// int idx = d->tagChooser->findIndexOf(tag); -// if (idx < 0) idx = 0; -// d->tagChooser->setCurrentIndex(idx); } void KisResourceTaggingManager::purgeTagUndeleteList() { ENTER_FUNCTION(); //d->lastDeletedTag = TaggedResourceSet(); //d->tagChooser->setUndeletionCandidate(QString()); } void KisResourceTaggingManager::undeleteTag(const KisTagSP tagToUndelete) { ENTER_FUNCTION(); /* QString tagName = tagToUndelete; QStringList allTags = availableTags(); if (allTags.contains(tagName)) { bool ok; tagName = QInputDialog::getText( d->tagChooser, i18n("Unable to undelete tag"), i18n("The tag you are trying to undelete already exists in tag list.
Please enter a new, unique name for it.
"), QLineEdit::Normal, tagName, &ok); if (!ok || allTags.contains(tagName) || tagName.isEmpty()) { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Warning); msgBox.setText(i18n("Tag was not undeleted.")); msgBox.exec(); return; } } // QList serverResources = d->model->serverResources(); // Q_FOREACH(KoResourceSP resource, d->lastDeletedTag.resources) { // if (serverResources.contains(resource)) { // addResourceTag(resource, tagName); // } // } // d->model->tagCategoryAdded(tagName); d->tagChooser->setCurrentIndex(d->tagChooser->findIndexOf(tagName)); d->tagChooser->setUndeletionCandidate(QString()); // d->lastDeletedTag = TaggedResourceSet(); */ } -QStringList KisResourceTaggingManager::availableTags() const -{ - ENTER_FUNCTION(); - return QStringList(); - //return d->tagChooser->allTags(); -} - void KisResourceTaggingManager::addResourceTag(KoResourceSP resource, const KisTagSP tag) { d->tagModel->tagResource(tag, resource); } void KisResourceTaggingManager::syncTagBoxEntryAddition(const KisTagSP tag) { ENTER_FUNCTION(); //d->tagChooser->insertItem(tag); } void KisResourceTaggingManager::contextCreateNewTag(const KisTagSP tag) { fprintf(stderr, "void KisResourceTaggingManager::contextCreateNewTag(const KisTagSP tag)"); ENTER_FUNCTION(); /* if (!tag.isEmpty()) { // d->model->addTag(0, tag); // d->model->tagCategoryAdded(tag); d->tagChooser->setCurrentIndex(d->tagChooser->findIndexOf(tag)); updateTaggedResourceView(); } */ } void KisResourceTaggingManager::contextCreateNewTag(KoResourceSP resource , const KisTagSP tag) { // TODO: RESOURCES: this function should use QString, not KisTagSP fprintf(stderr, "void KisResourceTaggingManager::contextCreateNewTag(KoResourceSP resource , const KisTagSP tag)"); KisTagSP inserted = d->tagChooser->insertItem(tag); int previousIndex = d->tagChooser->currentIndex(); d->tagModel->tagResource(inserted, resource); d->tagChooser->setCurrentIndex(previousIndex); } void KisResourceTaggingManager::syncTagBoxEntryRemoval(const KisTagSP tag) { ENTER_FUNCTION(); //d->tagChooser->removeItem(tag); } void KisResourceTaggingManager::syncTagBoxEntries() { ENTER_FUNCTION(); /* QList tags = d->tagModel->allTags(); tags.sort(); Q_FOREACH (const KisTagSP &tag, tags) { //d->tagChooser->insertItem(tag); } */ } void KisResourceTaggingManager::contextAddTagToResource(KoResourceSP resource, const KisTagSP tag) { fprintf(stderr, "void KisResourceTaggingManager::contextAddTagToResource(KoResourceSP resource, const KisTagSP tag)"); ENTER_FUNCTION(); addResourceTag(resource, tag); updateTaggedResourceView(); } void KisResourceTaggingManager::contextRemoveTagFromResource(KoResourceSP resource, const KisTagSP tag) { fprintf(stderr, "void KisResourceTaggingManager::contextRemoveTagFromResource(KoResourceSP resource, const KisTagSP tag)"); ENTER_FUNCTION(); removeResourceTag(resource, tag); - // d->model->tagCategoryMembersChanged(); updateTaggedResourceView(); } void KisResourceTaggingManager::removeTagFromComboBox(const KisTagSP tag) { fprintf(stderr, "void KisResourceTaggingManager::removeTagFromComboBox(const KisTagSP tag)"); ENTER_FUNCTION(); // QList resources = d->model->currentlyVisibleResources(); // Q_FOREACH (KoResourceSP resource, resources) { // removeResourceTag(resource, tag); // } // d->model->tagCategoryRemoved(tag); // d->lastDeletedTag = TaggedResourceSet(tag, resources); // d->tagChooser->setUndeletionCandidate(tag); } void KisResourceTaggingManager::removeResourceTag(KoResourceSP resource, const KisTagSP tag) { ENTER_FUNCTION(); int previousIndex = d->tagChooser->currentIndex(); bool success = d->tagModel->untagResource(tag, resource); fprintf(stderr, "remove Resource tag: %d\n", success); d->tagChooser->setCurrentIndex(previousIndex); - - // QStringList tagsList = d->model->assignedTagsList(resource); - - // Q_FOREACH (const QString & oldName, tagsList) { - // if (!oldName.compare(tagName)) { - // d->model->deleteTag(resource, oldName); - // } - // } } void KisResourceTaggingManager::renameTag(const KisTagSP oldTag, const KisTagSP newName) { ENTER_FUNCTION(); //d->tagModel // if (!d->model->tagNamesList().contains(newName)) { // QList resources = d->model->currentlyVisibleResources(); // Q_FOREACH (KoResourceSP resource, resources) { // removeResourceTag(resource, oldName); // addResourceTag(resource, newName); // } // contextCreateNewTag(newName); // d->model->tagCategoryRemoved(oldName); // d->model->tagCategoryAdded(newName); // } } void KisResourceTaggingManager::updateTaggedResourceView() { ENTER_FUNCTION(); // d->model->setCurrentTag(d->currentTag); // d->model->updateServer(); // d->originalResources = d->model->currentlyVisibleResources(); emit updateView(); } void KisResourceTaggingManager::tagChooserIndexChanged(const KisTagSP tag) { ENTER_FUNCTION(); d->model->setTag(tag); d->currentTag = tag; /* if (!d->tagChooser->selectedTagIsReadOnly()) { d->currentTag = d->tagChooser->currentlySelectedTag(); d->tagFilter->allowSave(true); // d->model->enableResourceFiltering(true); } else { // d->model->enableResourceFiltering(false); d->tagFilter->allowSave(false); d->currentTag.clear(); } */ d->tagFilter->clear(); d->tagFilter->allowSave(tag->id() >= 0); // disallow save if the chosen tag has negative id (i.e. 'All' tag) updateTaggedResourceView(); } void KisResourceTaggingManager::tagSearchLineEditTextChanged(const QString& lineEditText) { fprintf(stderr, "void KisResourceTaggingManager::tagSearchLineEditTextChanged(const QString& lineEditText): %s \n", lineEditText.toStdString().c_str()); d->model->setSearchBoxText(lineEditText); ENTER_FUNCTION() << ppVar(lineEditText); - - // if (d->tagChooser->selectedTagIsReadOnly()) { - // d->model->enableResourceFiltering(!lineEditText.isEmpty()); - // } else { - // d->model->enableResourceFiltering(true); - // } - - // d->model->searchTextChanged(lineEditText); - // d->model->updateServer(); - - //FIXME: fix completer - // d->tagCompleter = new QCompleter(tagNamesList(lineEditText),this); - // d->tagSearchLineEdit->setCompleter(d->tagCompleter); - emit updateView(); } void KisResourceTaggingManager::tagSaveButtonPressed() { fprintf(stderr, "void KisResourceTaggingManager::tagSaveButtonPressed()\n"); int previousTagIndex = d->tagChooser->currentIndex(); KisTagSP tag = d->tagChooser->currentlySelectedTag(); // untag all previous resources int allResources = d->resourceSourceModel->rowCount(); for (int i = 0; i < allResources; i++) { QModelIndex index = d->resourceSourceModel->index(i, 0); KoResourceSP resource = d->resourceSourceModel->resourceForIndex(index); QVector tags = d->resourceSourceModel->tagsForResource(resource->resourceId()); QVector::iterator iter = std::find_if(tags.begin(), tags.end(), [tag](KisTagSP tagFromResource) { return tagFromResource->url() == tag->url(); }); if (iter != tags.end()) { d->tagModel->untagResource(tag, resource); } } // tag all resources that are here now int rows = d->model->rowCount(); for (int i = 0; i < rows; i++) { QModelIndex index = d->model->index(i, 0); KoResourceSP resource = d->model->resourceForIndex(index); if (!tag.isNull() && !resource.isNull()) { d->tagModel->tagResource(tag, resource); } } d->tagChooser->setCurrentIndex(previousTagIndex); ENTER_FUNCTION(); - // if (!d->tagChooser->selectedTagIsReadOnly()) { - // QList newResources = d->model->currentlyVisibleResources(); - // Q_FOREACH (KoResourceSP oldRes, d->originalResources) { - // if (!newResources.contains(oldRes)) - // removeResourceTag(oldRes, d->currentTag); - // } - // Q_FOREACH (KoResourceSP newRes, newResources) { - // if (!d->originalResources.contains(newRes)) - // addResourceTag(newRes, d->currentTag); - // } - // d->model->tagCategoryMembersChanged(); - // } updateTaggedResourceView(); } void KisResourceTaggingManager::contextMenuRequested(KoResourceSP resource, const QList resourceTags, const QPoint& pos) { ENTER_FUNCTION(); // No visible tag chooser usually means no intended tag interaction, // context menu makes no sense then either fprintf(stderr, "context menu requested!"); if (!resource || !d->tagChooser->isVisible()) return; KisResourceItemChooserContextMenu menu(resource, resourceTags, d->tagChooser->currentlySelectedTag(), d->tagChooser->allTags()); connect(&menu, SIGNAL(resourceTagAdditionRequested(KoResourceSP,const KisTagSP)), this, SLOT(contextAddTagToResource(KoResourceSP,const KisTagSP))); connect(&menu, SIGNAL(resourceTagRemovalRequested(KoResourceSP,const KisTagSP)), this, SLOT(contextRemoveTagFromResource(KoResourceSP,const KisTagSP))); connect(&menu, SIGNAL(resourceAssignmentToNewTagRequested(KoResourceSP,const KisTagSP)), this, SLOT(contextCreateNewTag(KoResourceSP,const KisTagSP))); menu.exec(pos); } void KisResourceTaggingManager::contextMenuRequested(KoResourceSP currentResource, QPoint pos) { ENTER_FUNCTION(); if (currentResource) { contextMenuRequested(currentResource, d->tagModel->tagsForResource(currentResource->resourceId()).toList(), pos); } } KisTagChooserWidget *KisResourceTaggingManager::tagChooserWidget() { - ENTER_FUNCTION(); return d->tagChooser; } KisTagFilterWidget *KisResourceTaggingManager::tagFilterWidget() { - ENTER_FUNCTION(); return d->tagFilter; } diff --git a/libs/resourcewidgets/KisResourceTaggingManager.h b/libs/resourcewidgets/KisResourceTaggingManager.h index ddf7a4e58e..a1ba537285 100644 --- a/libs/resourcewidgets/KisResourceTaggingManager.h +++ b/libs/resourcewidgets/KisResourceTaggingManager.h @@ -1,104 +1,103 @@ /* * This file is part of the KDE project * Copyright (c) 2002 Patrick Julien * Copyright (c) 2007 Jan Hambrecht * Copyright (c) 2007 Sven Langkamp * Copyright (C) 2011 Srikanth Tiyyagura * Copyright (c) 2011 José Luis Vergara * Copyright (c) 2013 Sascha Suelzer * Copyright (c) 2019 Boudewijn Rempt * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef KISRESOURCETAGGINGMANAGER_H #define KISRESOURCETAGGINGMANAGER_H #include #include #include #include #include #include class QWidget; class QStringList; class QString; class QPoint; class KisTagFilterWidget; class KisTagChooserWidget; class KisTagFilterResourceProxyModel; /** * @brief The KisResourceTaggingManager class is ... * * XXX: this needs to be documented! */ class KisResourceTaggingManager : public QObject { Q_OBJECT public: explicit KisResourceTaggingManager(QString resourceType, KisTagFilterResourceProxyModel *model, QWidget *parent); ~KisResourceTaggingManager() override; void showTaggingBar(bool show); - QStringList availableTags() const; void contextMenuRequested(KoResourceSP currentResource, QPoint pos); void allowTagModification( bool set ); bool allowTagModification(); KisTagFilterWidget *tagFilterWidget(); KisTagChooserWidget *tagChooserWidget(); Q_SIGNALS: void updateView(); private Q_SLOTS: void undeleteTag(const KisTagSP tagToUndelete); void purgeTagUndeleteList(); void contextCreateNewTag(KoResourceSP resource, const KisTagSP tag); void contextCreateNewTag(const KisTagSP tag); void syncTagBoxEntryRemoval(const KisTagSP tag); void syncTagBoxEntryAddition(const KisTagSP tag); void syncTagBoxEntries(); void tagSaveButtonPressed(); void contextRemoveTagFromResource(KoResourceSP resource, const KisTagSP tag); void contextAddTagToResource(KoResourceSP resource, const KisTagSP tag); void renameTag(const KisTagSP oldName, const KisTagSP newName); void tagChooserIndexChanged(const KisTagSP lineEditText); void tagSearchLineEditTextChanged(const QString &lineEditText); void removeTagFromComboBox(const KisTagSP tag); private: void contextMenuRequested(KoResourceSP resource, const QList resourceTags, const QPoint& pos); void enableContextMenu(bool enable); void removeResourceTag(KoResourceSP resource, const KisTagSP tagName); void addResourceTag(KoResourceSP resource, const KisTagSP tagName); void updateTaggedResourceView(); class Private; Private* const d; }; #endif // KORESOURCETAGGINGINTERFACE_H