Warning, file /libraries/baloo-widgets/src/tagwidget.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     SPDX-FileCopyrightText: 2006-2010 Sebastian Trueg <trueg@kde.org>
0003     SPDX-FileCopyrightText: 2011-2013 Vishesh Handa <me@vhanda.in>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "tagwidget.h"
0009 #include "kblocklayout.h"
0010 #include "kedittagsdialog_p.h"
0011 #include "tagcheckbox.h"
0012 #include "tagwidget_p.h"
0013 
0014 #include <KLocalizedString>
0015 
0016 #include <QLabel>
0017 #include <QPushButton>
0018 
0019 using namespace Baloo;
0020 
0021 void TagWidgetPrivate::init(TagWidget *parent)
0022 {
0023     q = parent;
0024     m_readOnly = false;
0025     m_showAllLinkLabel = nullptr;
0026     m_editTagsDialog = nullptr;
0027 
0028     auto mainLayout = new QGridLayout(q);
0029     mainLayout->setContentsMargins(0, 0, 0, 0);
0030     // TODO spacingHint should be declared. Old code  m_flowLayout = new KBlockLayout( 0, KDialog::spacingHint()*3 );
0031     m_flowLayout = new KBlockLayout(0);
0032     mainLayout->addLayout(m_flowLayout, 0, 0, 1, 2);
0033     mainLayout->setColumnStretch(0, 1);
0034 }
0035 
0036 void TagWidgetPrivate::rebuild()
0037 {
0038     buildTagHash(q->selectedTags());
0039 }
0040 
0041 void TagWidgetPrivate::buildTagHash(const QStringList &tags)
0042 {
0043     qDeleteAll(m_checkBoxHash);
0044     m_checkBoxHash.clear();
0045 
0046     for (const QString &tag : tags) {
0047         getTagCheckBox(tag);
0048     }
0049 
0050     delete m_showAllLinkLabel;
0051     m_showAllLinkLabel = nullptr;
0052 
0053     if (m_readOnly && !tags.isEmpty()) {
0054         return;
0055     }
0056 
0057     m_showAllLinkLabel = new QLabel(q);
0058     m_flowLayout->addWidget(m_showAllLinkLabel);
0059     if (m_readOnly) {
0060         m_showAllLinkLabel->setText(QStringLiteral("-"));
0061     } else {
0062         QFont f(q->font());
0063         f.setUnderline(true);
0064         m_showAllLinkLabel->setFont(f);
0065         m_showAllLinkLabel->setText(QLatin1String("<a href=\"add_tags\">") + (m_checkBoxHash.isEmpty() ? i18nc("@label", "Add...") : i18nc("@label", "Edit..."))
0066                                     + QLatin1String("</a>"));
0067         q->connect(m_showAllLinkLabel, SIGNAL(linkActivated(QString)), SLOT(slotShowAll()));
0068     }
0069 }
0070 
0071 TagCheckBox *TagWidgetPrivate::getTagCheckBox(const QString &tag)
0072 {
0073     QMap<QString, TagCheckBox *>::iterator it = m_checkBoxHash.find(tag);
0074     if (it == m_checkBoxHash.end()) {
0075         // kDebug() << "Creating checkbox for" << tag.genericLabel();
0076         auto checkBox = new TagCheckBox(tag, q);
0077         q->connect(checkBox, SIGNAL(tagClicked(QString)), SIGNAL(tagClicked(QString)));
0078         m_checkBoxHash.insert(tag, checkBox);
0079         m_flowLayout->addWidget(checkBox);
0080         return checkBox;
0081     } else {
0082         return it.value();
0083     }
0084 }
0085 
0086 void TagWidgetPrivate::selectTags(const QStringList &tags)
0087 {
0088     buildTagHash(tags);
0089 }
0090 
0091 TagWidget::TagWidget(QWidget *parent)
0092     : QWidget(parent)
0093     , d(new TagWidgetPrivate())
0094 {
0095     setForegroundRole(parent->foregroundRole());
0096     d->init(this);
0097 }
0098 
0099 TagWidget::~TagWidget() = default;
0100 
0101 QStringList TagWidget::selectedTags() const
0102 {
0103     QStringList tags;
0104     QMapIterator<QString, TagCheckBox *> it(d->m_checkBoxHash);
0105     while (it.hasNext()) {
0106         tags << it.next().key();
0107     }
0108     return tags;
0109 }
0110 
0111 Qt::Alignment TagWidget::alignment() const
0112 {
0113     return d->m_flowLayout->alignment();
0114 }
0115 
0116 bool TagWidget::readOnly() const
0117 {
0118     return d->m_readOnly;
0119 }
0120 
0121 void TagWidget::setSelectedTags(const QStringList &tags)
0122 {
0123     d->selectTags(tags);
0124 }
0125 
0126 void TagWidget::setAlignment(Qt::Alignment alignment)
0127 {
0128     d->m_flowLayout->setAlignment(alignment);
0129 }
0130 
0131 void TagWidget::setReadyOnly(bool readOnly)
0132 {
0133     d->m_readOnly = readOnly;
0134     d->rebuild();
0135 }
0136 
0137 void TagWidget::slotTagUpdateDone()
0138 {
0139     setEnabled(true);
0140 }
0141 
0142 void TagWidget::slotShowAll()
0143 {
0144     d->m_editTagsDialog = new KEditTagsDialog(selectedTags(), this);
0145     d->m_editTagsDialog->setWindowModality(Qt::ApplicationModal);
0146     connect(d->m_editTagsDialog, SIGNAL(finished(int)), this, SLOT(slotKEditTagDialogFinished(int)));
0147     d->m_editTagsDialog->open();
0148 }
0149 
0150 void TagWidget::slotKEditTagDialogFinished(int result)
0151 {
0152     if (result == QDialog::Accepted) {
0153         setSelectedTags(d->m_editTagsDialog->tags());
0154         Q_EMIT selectionChanged(selectedTags());
0155     }
0156 
0157     d->m_editTagsDialog->deleteLater();
0158     d->m_editTagsDialog = nullptr;
0159 }