File indexing completed on 2024-05-12 15:59:57

0001 /*
0002   *   This file is part of the KDE project
0003   *   SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
0004   *   SPDX-FileCopyrightText: 2007 Jan Hambrecht <jaham@gmx.net>
0005   *   SPDX-FileCopyrightText: 2007 Sven Langkamp <sven.langkamp@gmail.com>
0006   *   SPDX-FileCopyrightText: 2011 Srikanth Tiyyagura <srikanth.tulasiram@gmail.com>
0007   *   SPDX-FileCopyrightText: 2011 José Luis Vergara <pentalis@gmail.com>
0008   *   SPDX-FileCopyrightText: 2013 Sascha Suelzer <s.suelzer@gmail.com>
0009   *   SPDX-FileCopyrightText: 2020 Agata Cacko <cacko.azh@gmail.com>
0010   *   SPDX-License-Identifier: LGPL-2.0-or-later
0011  */
0012 
0013 #include "KisResourceTaggingManager.h"
0014 
0015 #include <QInputDialog>
0016 #include <QMessageBox>
0017 #include <QPointer>
0018 #include <QStringList>
0019 
0020 #include <klocalizedstring.h>
0021 #include <ksharedconfig.h>
0022 #include <kconfiggroup.h>
0023 
0024 #include <KoResource.h>
0025 
0026 #include <KisResourceModel.h>
0027 #include <KisTagFilterResourceProxyModel.h>
0028 #include <KisTagModel.h>
0029 
0030 #include "KisTagFilterWidget.h"
0031 #include "KisTagChooserWidget.h"
0032 #include "KisResourceItemChooserContextMenu.h"
0033 #include "kis_debug.h"
0034 #include "KisTag.h"
0035 
0036 class KisResourceTaggingManager::Private
0037 {
0038 public:
0039     /// \brief tagChooser tag chooser widget (tags combobox + tag tool button with the popup)
0040     KisTagChooserWidget *tagChooser;
0041 
0042     /// \brief tagFilter resources filter widget (resources filter box + "filter by tag" checkbox)
0043     KisTagFilterWidget *tagFilter;
0044 
0045     /// \brief model main data model for resources in the item chooser that the Tagging Manager is taking care of
0046     QPointer<KisTagFilterResourceProxyModel> model;
0047 
0048     /// \brief tagModel main tag model for tags in the tags combobox
0049     KisTagModel *tagModel;
0050 
0051     QString resourceType;
0052 
0053 };
0054 
0055 
0056 
0057 
0058 
0059 KisResourceTaggingManager::KisResourceTaggingManager(QString resourceType, KisTagFilterResourceProxyModel *model, QWidget *parent)
0060 
0061     : QObject(parent)
0062     , d(new Private())
0063 {
0064     d->model = model;
0065     d->resourceType = resourceType;
0066     d->tagModel = new KisTagModel(resourceType);
0067     d->tagChooser = new KisTagChooserWidget(d->tagModel, resourceType, parent);
0068     d->tagFilter = new KisTagFilterWidget(d->tagModel, parent);
0069 
0070     d->model->setFilterInCurrentTag(d->tagFilter->isFilterByTagChecked());
0071 
0072     connect(d->tagChooser, SIGNAL(sigTagChosen(KisTagSP)), this, SLOT(tagChooserIndexChanged(KisTagSP)));
0073 
0074     connect(d->tagFilter, SIGNAL(filterByTagChanged(bool)), this, SLOT(slotFilterByTagChanged(bool)));
0075     connect(d->tagFilter, SIGNAL(filterTextChanged(QString)), this, SLOT(tagSearchLineEditTextChanged(QString)));
0076 
0077     connect(d->tagChooser, SIGNAL(sigTagChosen(KisTagSP)), d->tagFilter, SLOT(clear()));
0078 }
0079 
0080 KisResourceTaggingManager::~KisResourceTaggingManager()
0081 {
0082     delete d->tagModel;
0083     delete d;
0084 }
0085 
0086 void KisResourceTaggingManager::showTaggingBar(bool show)
0087 {
0088     show ? d->tagFilter->show() : d->tagFilter->hide();
0089     show ? d->tagChooser->show() : d->tagChooser->hide();
0090 
0091     KConfigGroup group =  KSharedConfig::openConfig()->group("SelectedTags");
0092     QString tag = group.readEntry<QString>(d->resourceType, "All");
0093     d->tagChooser->setCurrentItem(tag);
0094 }
0095 
0096 void KisResourceTaggingManager::tagChooserIndexChanged(const KisTagSP tag)
0097 {
0098     d->model->setTagFilter(tag);
0099 }
0100 
0101 void KisResourceTaggingManager::tagSearchLineEditTextChanged(const QString& lineEditText)
0102 {
0103     d->model->setSearchText(lineEditText);
0104 }
0105 
0106 void KisResourceTaggingManager::slotFilterByTagChanged(const bool filterByTag)
0107 {
0108     d->model->setFilterInCurrentTag(filterByTag);
0109 }
0110 
0111 void KisResourceTaggingManager::contextMenuRequested(KoResourceSP resource, QPoint pos)
0112 {
0113     // No visible tag chooser usually means no intended tag interaction,
0114     // context menu makes no sense then either
0115     if (!resource || !d->tagChooser->isVisible())
0116         return;
0117 
0118     KisResourceItemChooserContextMenu menu(resource, d->tagChooser->currentlySelectedTag(), d->tagChooser);
0119     menu.exec(pos);
0120 
0121 }
0122 
0123 KisTagChooserWidget *KisResourceTaggingManager::tagChooserWidget()
0124 {
0125     return d->tagChooser;
0126 }
0127 
0128 KisTagFilterWidget *KisResourceTaggingManager::tagFilterWidget()
0129 {
0130     return d->tagFilter;
0131 }
0132