Falkon Develop
Cross-platform Qt-based web browser
gm_settings.cpp
Go to the documentation of this file.
1/* ============================================================
2* GreaseMonkey plugin for Falkon
3* Copyright (C) 2012-2018 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "gm_settings.h"
19#include "ui_gm_settings.h"
21#include "../gm_manager.h"
22#include "../gm_script.h"
23#include "qztools.h"
24
25#include "mainapplication.h"
26
27#include <QDesktopServices>
28#include <QMessageBox>
29#include <QInputDialog>
30
31GM_Settings::GM_Settings(GM_Manager* manager, QWidget* parent)
32 : QDialog(parent)
33 , ui(new Ui::GM_Settings)
34 , m_manager(manager)
35{
36 setAttribute(Qt::WA_DeleteOnClose);
37 ui->setupUi(this);
38 ui->iconLabel->setPixmap(QIcon(QSL(":gm/data/icon.svg")).pixmap(32));
39
40 connect(ui->listWidget, &QListWidget::itemDoubleClicked,
41 this, &GM_Settings::showItemInfo);
42 connect(ui->listWidget, &GM_SettingsListWidget::updateItemRequested,
43 this, &GM_Settings::updateItem);
44 connect(ui->listWidget, &GM_SettingsListWidget::removeItemRequested,
45 this, &GM_Settings::removeItem);
46 connect(ui->openDirectory, &QAbstractButton::clicked,
47 this, &GM_Settings::openScriptsDirectory);
48 connect(ui->newScript, &QAbstractButton::clicked,
49 this, &GM_Settings::newScript);
50 connect(ui->link, &ClickableLabel::clicked,
51 this, &GM_Settings::openUserJs);
52 connect(manager, &GM_Manager::scriptsChanged,
53 this, &GM_Settings::loadScripts);
54
55 loadScripts();
56}
57
58void GM_Settings::openUserJs()
59{
60 mApp->addNewTab(QUrl(QSL("http://openuserjs.org")));
61 close();
62}
63
64void GM_Settings::showItemInfo(QListWidgetItem* item)
65{
66 GM_Script* script = getScript(item);
67 if (!script) {
68 return;
69 }
70
71 auto* dialog = new GM_SettingsScriptInfo(script, this);
72 dialog->open();
73}
74
75void GM_Settings::updateItem(QListWidgetItem* item)
76{
77 GM_Script *script = getScript(item);
78 if (!script) {
79 return;
80 }
81 script->updateScript();
82}
83
84void GM_Settings::removeItem(QListWidgetItem* item)
85{
86 GM_Script* script = getScript(item);
87 if (!script) {
88 return;
89 }
90
91 QMessageBox::StandardButton button = QMessageBox::question(this, tr("Remove script"),
92 tr("Are you sure you want to remove '%1'?").arg(script->name()),
93 QMessageBox::Yes | QMessageBox::No);
94
95 if (button == QMessageBox::Yes) {
96 m_manager->removeScript(script);
97 }
98}
99
100void GM_Settings::itemChanged(QListWidgetItem* item)
101{
102 GM_Script* script = getScript(item);
103 if (!script) {
104 return;
105 }
106
107 if (item->checkState() == Qt::Checked) {
108 m_manager->enableScript(script);
109 }
110 else {
111 m_manager->disableScript(script);
112 }
113}
114
115void GM_Settings::openScriptsDirectory()
116{
117 QDesktopServices::openUrl(QUrl::fromLocalFile(m_manager->scriptsDirectory()));
118}
119
120void GM_Settings::newScript()
121{
122 const QString name = QInputDialog::getText(this, tr("Add script"), tr("Choose name for script:"));
123 if (name.isEmpty())
124 return;
125
126 const QString script = QL1S("// ==UserScript== \n"
127 "// @name %1 \n"
128 "// @namespace kde.org \n"
129 "// @description Script description \n"
130 "// @include * \n"
131 "// @version 1.0.0 \n"
132 "// ==/UserScript==\n\n");
133
134 const QString fileName = QSL("%1/%2.user.js").arg(m_manager->scriptsDirectory(), QzTools::filterCharsFromFilename(name));
135
136 QFile file(QzTools::ensureUniqueFilename(fileName));
137 file.open(QFile::WriteOnly);
138 file.write(script.arg(name).toUtf8());
139 file.close();
140
141 auto *gmScript = new GM_Script(m_manager, file.fileName());
142 m_manager->addScript(gmScript);
143
144 auto* dialog = new GM_SettingsScriptInfo(gmScript, this);
145 dialog->open();
146}
147
148void GM_Settings::loadScripts()
149{
150 disconnect(ui->listWidget, &QListWidget::itemChanged,
151 this, &GM_Settings::itemChanged);
152
153 ui->listWidget->clear();
154
155 const auto allScripts = m_manager->allScripts();
156 for (GM_Script* script : allScripts) {
157 auto* item = new QListWidgetItem(ui->listWidget);
158 item->setText(script->name());
159 item->setIcon(script->icon());
160 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
161 item->setCheckState(script->isEnabled() ? Qt::Checked : Qt::Unchecked);
162 item->setData(Qt::UserRole + 10, QVariant::fromValue((void*)script));
163
164 connect(script, &GM_Script::updatingChanged, this, [this]() {
165 ui->listWidget->viewport()->update();
166 });
167
168 ui->listWidget->addItem(item);
169 }
170
171 ui->listWidget->sortItems();
172
173 bool itemMoved;
174 do {
175 itemMoved = false;
176 for (int i = 0; i < ui->listWidget->count(); ++i) {
177 QListWidgetItem* topItem = ui->listWidget->item(i);
178 QListWidgetItem* bottomItem = ui->listWidget->item(i + 1);
179 if (!topItem || !bottomItem) {
180 continue;
181 }
182
183 if (topItem->checkState() == Qt::Unchecked && bottomItem->checkState() == Qt::Checked) {
184 QListWidgetItem* item = ui->listWidget->takeItem(i + 1);
185 ui->listWidget->insertItem(i, item);
186 itemMoved = true;
187 }
188 }
189 }
190 while (itemMoved);
191
192 connect(ui->listWidget, &QListWidget::itemChanged, this, &GM_Settings::itemChanged);
193}
194
195GM_Script* GM_Settings::getScript(QListWidgetItem* item)
196{
197 if (!item) {
198 return nullptr;
199 }
200
201 GM_Script* script = static_cast<GM_Script*>(item->data(Qt::UserRole + 10).value<void*>());
202 return script;
203}
204
206{
207 delete ui;
208}
void clicked(QPoint)
void scriptsChanged()
bool removeScript(GM_Script *script, bool removeFile=true)
Definition: gm_manager.cpp:206
void enableScript(GM_Script *script)
Definition: gm_manager.cpp:170
QString scriptsDirectory() const
Definition: gm_manager.cpp:93
bool addScript(GM_Script *script)
Definition: gm_manager.cpp:190
QList< GM_Script * > allScripts() const
Definition: gm_manager.cpp:154
void disableScript(GM_Script *script)
Definition: gm_manager.cpp:179
void updateScript()
Definition: gm_script.cpp:157
QString name() const
Definition: gm_script.cpp:57
void updatingChanged(bool updating)
GM_Settings(GM_Manager *manager, QWidget *parent=nullptr)
Definition: gm_settings.cpp:31
void removeItemRequested(QListWidgetItem *item)
void updateItemRequested(QListWidgetItem *item)
static QString ensureUniqueFilename(const QString &name, const QString &appendFormat=QSL("(%1)"))
Definition: qztools.cpp:257
static QString filterCharsFromFilename(const QString &name)
Definition: qztools.cpp:309
#define mApp
i
Definition: i18n.py:23
#define QL1S(x)
Definition: qzcommon.h:44
#define QSL(x)
Definition: qzcommon.h:40