Commit 597e610e authored by Nicolas Fella's avatar Nicolas Fella

Add FileItemActionPlugin for tag manipulation

Summary:
Make it possible to add/remove tags from the context menu. It shows all known tags. Triggering an action adds/removes the appropriate tag. It also allows to create a new
tag.

{F6424042}

Test Plan: Add tag to a file. Tag appears in context menu of all files. Add it to another file. Remove it again. Create new tag from context menu.

Reviewers: #baloo, broulik, ngraham, #dolphin, #vdg

Reviewed By: #baloo, ngraham, #dolphin, #vdg

Tags: #baloo

Differential Revision: https://phabricator.kde.org/D16872
parent bb77e9f4
add_definitions(-DTRANSLATION_DOMAIN=\"baloowidgets5\")
add_subdirectory(filepropertiesplugin)
add_subdirectory(tagsfileitemactionplugin)
set(widgets_SRCS
kblocklayout.cpp
......
include_directories(${CMAKE_SOURCE_DIR})
set(tagsfileitemaction_debug_SRCS tagsfileitemaction.cpp)
kcoreaddons_add_plugin(tagsfileitemaction
SOURCES ${tagsfileitemaction_debug_SRCS}
JSON tagsfileitemaction.json
INSTALL_NAMESPACE "kf5/kfileitemaction")
target_link_libraries(tagsfileitemaction
KF5BalooWidgets
KF5::KIOWidgets
KF5::I18n
KF5::FileMetaData
)
#!/usr/bin/env bash
$XGETTEXT `find . -name '*.cpp'` -o $podir/baloowidgets5.pot
/*
* Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "tagsfileitemaction.h"
#include <QList>
#include <QAction>
#include <QWidget>
#include <QVariantList>
#include <QUrl>
#include <QIcon>
#include <QMenu>
#include <QInputDialog>
#include <KPluginFactory>
#include <KPluginLoader>
#include <KLocalizedString>
K_PLUGIN_FACTORY_WITH_JSON(TagsFileItemActionFactory, "tagsfileitemaction.json", registerPlugin<TagsFileItemAction>();)
TagsFileItemAction::TagsFileItemAction(QObject* parent, const QVariantList&)
: KAbstractFileItemActionPlugin(parent)
, m_tagsLister()
{
m_menu = new QMenu(i18n("Assign Tags"));
m_menu->setIcon(QIcon::fromTheme(QStringLiteral("tag")));
connect(&m_tagsLister, &KCoreDirLister::itemsAdded, this, [this](const QUrl&, const KFileItemList& items) {
for (const KFileItem &item: items) {
const QString name = item.name();
QAction* action = m_menu->addAction(QIcon::fromTheme(QStringLiteral("tag")), name);
action->setCheckable(true);
action->setChecked(m_metaData->tags().contains(name));
connect(action, &QAction::triggered, this, [this, action] {
if (action->isChecked()) {
QStringList newTags = m_metaData->tags();
// HACK the first character of QAction::text is '&'
newTags.append(action->text().remove(0,1));
m_metaData->setTags(newTags);
} else {
QStringList newTags = m_metaData->tags();
// HACK the first character of QAction::text is '&'
newTags.removeAll(action->text().remove(0,1));
m_metaData->setTags(newTags);
}
});
}
});
QAction* newAction = new QAction(i18n("Create New..."));
newAction->setIcon(QIcon::fromTheme(QStringLiteral("tag")));
connect(newAction, &QAction::triggered, this, [this] {
QString newTag = QInputDialog::getText(m_menu, i18n("New tag"), i18n("New tag:"), QLineEdit::Normal);
QStringList tags = m_metaData->tags();
tags.append(newTag);
m_metaData->setTags(tags);
});
m_menu->addAction(newAction);
m_menu->addSeparator();
m_tagsLister.openUrl(QUrl("tags:/"), KCoreDirLister::OpenUrlFlag::Reload);
}
TagsFileItemAction::~TagsFileItemAction()
{
delete m_metaData;
}
QList<QAction*> TagsFileItemAction::actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget)
{
Q_UNUSED(parentWidget);
if (fileItemInfos.urlList().size() > 1) {
return {};
}
m_metaData = new KFileMetaData::UserMetaData(fileItemInfos.urlList()[0].toLocalFile());
return {m_menu->menuAction()};
}
#include "tagsfileitemaction.moc"
/*
* Copyright (C) 2018 Nicolas Fella <nicolas.fella@gmx.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) version 3, or any
* later version accepted by the membership of KDE e.V. (or its
* successor approved by the membership of KDE e.V.), which shall
* act as a proxy defined in Section 6 of version 3 of the license.
*
* 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef TAGSFILEITEMACTION_H
#define TAGSFILEITEMACTION_H
#include <KFileItemListProperties>
#include <KAbstractFileItemActionPlugin>
#include <KCoreDirLister>
#include <KFileMetaData/UserMetaData>
class QAction;
class KFileItemListProperties;
class QWidget;
class TagsFileItemAction : public KAbstractFileItemActionPlugin
{
Q_OBJECT
public:
TagsFileItemAction(QObject* parent, const QVariantList& args);
virtual ~TagsFileItemAction();
QList<QAction*> actions(const KFileItemListProperties& fileItemInfos, QWidget* parentWidget) override;
private:
KFileMetaData::UserMetaData* m_metaData;
KCoreDirLister m_tagsLister;
QMenu* m_menu;
};
#endif // TAGSFILEITEMACTION_H
{
"KPlugin": {
"Authors": [
{
"Name": "Nicolas Fella"
}
],
"Category": "Utilities",
"Description": "Change file tags",
"Icon": "tag",
"License": "GPL",
"MimeTypes": [
"application/octet-stream",
"inode/directory"
],
"Name": "Tags",
"ServiceTypes": [
"KFileItemAction/Plugin"
]
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment