kde-extraapps/kdeplasma-addons/applets/paste/list.cpp
2015-09-02 08:54:43 +03:00

147 lines
4.7 KiB
C++

/*
* Copyright 2008 Petri Damsten <damu@iki.fi>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "list.h"
#include "sendkeys.h"
#include "configdata.h"
#include "pastemacroexpander.h"
#include <QTimer>
#include <QStandardItemModel>
#include <QApplication>
#include <QClipboard>
#include <KWindowSystem>
#include <KDebug>
#include <KGlobalSettings>
#include <KIconLoader>
#include <KIcon>
#include <Plasma/Delegate>
#include <Plasma/Theme>
ListForm::ListForm(QWidget *parent)
: QWidget(parent), m_hide(false), cfg(0)
{
setupUi(this);
setAttribute(Qt::WA_NoSystemBackground);
icon->setPixmap(KIcon("edit-paste").pixmap(KIconLoader::SizeSmall,
KIconLoader::SizeSmall));
Plasma::Delegate *delegate = new Plasma::Delegate;
delegate->setRoleMapping(Plasma::Delegate::SubTitleRole, SubTitleRole);
delegate->setRoleMapping(Plasma::Delegate::SubTitleMandatoryRole, SubTitleMandatoryRole);
treeView->setItemDelegate(delegate);
m_listModel = new QStandardItemModel(this);
treeView->setModel(m_listModel);
treeView->setFocusPolicy(Qt::NoFocus);
if (KGlobalSettings::singleClick()) {
connect(treeView, SIGNAL(clicked(QModelIndex)),
this, SLOT(clicked(QModelIndex)));
} else {
connect(treeView, SIGNAL(doubleClicked(QModelIndex)),
this, SLOT(clicked(QModelIndex)));
}
connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(themeChanged()));
themeChanged();
}
ListForm::~ListForm()
{
}
void ListForm::setData(const ConfigData &data)
{
m_listModel->clear();
foreach (const QString &txt, data.snippets.keys()) {
QStandardItem *item = new QStandardItem();
QString tmp = data.snippets[txt][ConfigData::Text];
item->setData(txt, Qt::DisplayRole);
item->setData(false, SubTitleMandatoryRole);
item->setData(tmp.replace('\n', ' '), SubTitleRole);
item->setData(data.snippets[txt][ConfigData::Text], DataRole);
item->setData(KIcon(data.snippets[txt][ConfigData::Icon]), Qt::DecorationRole);
m_listModel->insertRow(0, item);
}
if (data.autoPaste) {
label->setText(i18n("Text &snippets (Click to paste text):"));
} else {
label->setText(i18n("Text &snippets (Click to copy text to clipboard):"));
}
cfg = &data;
}
void ListForm::clicked(const QModelIndex &index)
{
QList<WId> windows = KWindowSystem::stackingOrder();
KWindowInfo info;
static const QStringList classes =
QStringList() << "Plasma" << "Plasma-desktop" << "Plasmoidviewer";
// Don't paste to plasma windows
for (int i = windows.count() - 1; i >= 0; --i) {
info = KWindowSystem::windowInfo(windows[i], 0, NET::WM2WindowClass);
//kDebug() << info.windowClassClass();
if (classes.contains(info.windowClassClass())) {
if (i > 0) {
continue;
}
return;
}
break;
}
QString txt = m_listModel->data(index, DataRole).toString();
PasteMacroExpander::instance().expandMacros(txt);
//kDebug() << txt;
QApplication::clipboard()->setText(txt);
emit textCopied();
if (m_hide) {
hide();
}
if (cfg->autoPaste) {
// Macro expander might change windows focus so activate windows after that
KWindowSystem::activateWindow(info.win());
if (cfg->specialApps.contains(info.windowClassClass())) {
m_pasteKey = cfg->specialApps[info.windowClassClass()];
} else {
m_pasteKey = cfg->pasteKey;
}
QTimer::singleShot(200, this, SLOT(paste()));
}
treeView->selectionModel()->clear();
}
void ListForm::paste()
{
SendKeys::self() << m_pasteKey;
}
void ListForm::themeChanged()
{
label->setStyleSheet(QString("QLabel{color:%1;}")
.arg(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor).name()));
setStyleSheet(QString(".ListForm{background-color:%1;}")
.arg(Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor).name()));
}
void ListForm::setHideAfterClick(bool hide)
{
m_hide = hide;
}
#include "moc_list.cpp"