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 }