Falkon Develop
Cross-platform Qt-based web browser
searchenginesdialog.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2017 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 "searchenginesdialog.h"
19#include "ui_searchenginesdialog.h"
20#include "editsearchengine.h"
21#include "mainapplication.h"
23
24#include <QMessageBox>
25
27 : QDialog(parent)
28 , ui(new Ui::SearchEnginesDialog)
29 , m_manager(mApp->searchEnginesManager())
30{
31 setAttribute(Qt::WA_DeleteOnClose);
32
33 ui->setupUi(this);
34
35 connect(ui->add, &QAbstractButton::clicked, this, &SearchEnginesDialog::addEngine);
36 connect(ui->remove, &QAbstractButton::clicked, this, &SearchEnginesDialog::removeEngine);
37 connect(ui->edit, &QAbstractButton::clicked, this, &SearchEnginesDialog::editEngine);
38 connect(ui->setAsDefault, &QAbstractButton::clicked, this, &SearchEnginesDialog::setDefaultEngine);
39 connect(ui->defaults, &QAbstractButton::clicked, this, &SearchEnginesDialog::defaults);
40 connect(ui->moveUp, &QAbstractButton::clicked, this, &SearchEnginesDialog::moveUp);
41 connect(ui->moveDown, &QAbstractButton::clicked, this, &SearchEnginesDialog::moveDown);
42
43 connect(ui->treeWidget, &QTreeWidget::itemDoubleClicked, this, &SearchEnginesDialog::editEngine);
44
45 ui->treeWidget->setItemDelegate(new RemoveItemFocusDelegate(ui->treeWidget));
46 ui->treeWidget->sortByColumn(-1, Qt::AscendingOrder);
47 reloadEngines();
48}
49
50void SearchEnginesDialog::addEngine()
51{
52 EditSearchEngine dialog(tr("Add Search Engine"), this);
53 dialog.hideIconLabels();
54
55 if (dialog.exec() != QDialog::Accepted) {
56 return;
57 }
58
59 SearchEngine engine;
60 engine.name = dialog.name();
61 engine.url = dialog.url();
62 engine.postData = dialog.postData().toUtf8();
63 engine.shortcut = dialog.shortcut();
64 engine.icon = SearchEnginesManager::iconForSearchEngine(QUrl::fromEncoded(dialog.url().toUtf8()));
65
66 if (engine.name.isEmpty() || engine.url.isEmpty()) {
67 return;
68 }
69
70 auto* item = new QTreeWidgetItem();
71 setEngine(item, engine);
72
73 changeItemToDefault(item, false);
74 item->setIcon(0, engine.icon);
75 item->setText(1, engine.shortcut);
76
77 ui->treeWidget->addTopLevelItem(item);
78}
79
80void SearchEnginesDialog::removeEngine()
81{
82 QTreeWidgetItem* item = ui->treeWidget->currentItem();
83 if (!item || ui->treeWidget->topLevelItemCount() == 1) {
84 return;
85 }
86
87 if (isDefaultEngine(item)) {
88 SearchEngine en = getEngine(item);
89 QMessageBox::warning(this, tr("Remove Engine"),
90 tr("You can't remove the default search engine.<br>"
91 "Set a different engine as default before removing %1.").arg(en.name));
92 }
93 else {
94 delete item;
95 }
96}
97
98void SearchEnginesDialog::editEngine()
99{
100 QTreeWidgetItem* item = ui->treeWidget->currentItem();
101 if (!item) {
102 return;
103 }
104
105 SearchEngine engine = getEngine(item);
106
107 EditSearchEngine dialog(tr("Edit Search Engine"), this);
108
109 dialog.setName(engine.name);
110 dialog.setUrl(engine.url);
111 dialog.setPostData(QString::fromUtf8(engine.postData));
112 dialog.setShortcut(engine.shortcut);
113 dialog.setIcon(engine.icon);
114
115 if (dialog.exec() != QDialog::Accepted) {
116 return;
117 }
118
119 engine.name = dialog.name();
120 engine.url = dialog.url();
121 engine.postData = dialog.postData().toUtf8();
122 engine.shortcut = dialog.shortcut();
123 engine.icon = dialog.icon();
124
125 if (engine.name.isEmpty() || engine.url.isEmpty()) {
126 return;
127 }
128
129 setEngine(item, engine);
130
131 changeItemToDefault(item, isDefaultEngine(item));
132 item->setIcon(0, engine.icon);
133 item->setText(1, engine.shortcut);
134}
135
136void SearchEnginesDialog::setDefaultEngine()
137{
138 QTreeWidgetItem* item = ui->treeWidget->currentItem();
139 if (!item) {
140 return;
141 }
142
143 for (int j = 0; j < ui->treeWidget->topLevelItemCount(); ++j) {
144 QTreeWidgetItem* i = ui->treeWidget->topLevelItem(j);
145 if (isDefaultEngine(i)) {
146 if (i == item) {
147 return;
148 }
149 changeItemToDefault(i, false);
150 break;
151 }
152 }
153
154 changeItemToDefault(item, true);
155}
156
157void SearchEnginesDialog::defaults()
158{
159 m_manager->restoreDefaults();
160 reloadEngines();
161}
162
163bool SearchEnginesDialog::isDefaultEngine(QTreeWidgetItem* item)
164{
165 return item->data(0, DefaultRole).toBool();
166}
167
168SearchEngine SearchEnginesDialog::getEngine(QTreeWidgetItem* item)
169{
170 return item->data(0, EngineRole).value<SearchEngine>();
171}
172
173void SearchEnginesDialog::setEngine(QTreeWidgetItem* item, const SearchEngine &engine)
174{
175 QVariant v;
176 v.setValue(engine);
177 item->setData(0, EngineRole, v);
178 item->setText(0, engine.name);
179}
180
181void SearchEnginesDialog::changeItemToDefault(QTreeWidgetItem* item, bool isDefault)
182{
183 QFont font = item->font(0);
184 font.setBold(isDefault);
185
186 item->setFont(0, font);
187 item->setFont(1, font);
188 item->setData(0, DefaultRole, isDefault);
189}
190
191void SearchEnginesDialog::moveUp()
192{
193 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
194 int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
195
196 if (!currentItem || index == 0) {
197 return;
198 }
199
200 ui->treeWidget->takeTopLevelItem(index);
201 ui->treeWidget->insertTopLevelItem(index - 1, currentItem);
202 ui->treeWidget->setCurrentItem(currentItem);
203}
204
205void SearchEnginesDialog::moveDown()
206{
207 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem();
208 int index = ui->treeWidget->indexOfTopLevelItem(currentItem);
209
210 if (!currentItem || !ui->treeWidget->itemBelow(currentItem)) {
211 return;
212 }
213
214 ui->treeWidget->takeTopLevelItem(index);
215 ui->treeWidget->insertTopLevelItem(index + 1, currentItem);
216 ui->treeWidget->setCurrentItem(currentItem);
217}
218
219void SearchEnginesDialog::reloadEngines()
220{
221 ui->treeWidget->clear();
222 const SearchEngine defaultEngine = mApp->searchEnginesManager()->defaultEngine();
223
224 const auto engines = m_manager->allEngines();
225 for (const SearchEngine &en : engines) {
226 auto* item = new QTreeWidgetItem();
227 setEngine(item, en);
228 changeItemToDefault(item, en == defaultEngine);
229 item->setIcon(0, en.icon);
230 item->setText(1, en.shortcut);
231
232 ui->treeWidget->addTopLevelItem(item);
233 }
234}
235
236void SearchEnginesDialog::showEvent(QShowEvent *e)
237{
238 QDialog::showEvent(e);
239 resizeViewHeader();
240}
241
242void SearchEnginesDialog::resizeEvent(QResizeEvent *e)
243{
244 QDialog::resizeEvent(e);
245 resizeViewHeader();
246}
247
248void SearchEnginesDialog::resizeViewHeader()
249{
250 const int headerWidth = ui->treeWidget->header()->width();
251 ui->treeWidget->header()->resizeSection(0, headerWidth - headerWidth / 4);
252}
253
255{
256 if (ui->treeWidget->topLevelItemCount() < 1) {
257 return;
258 }
259
260 QVector<SearchEngine> allEngines;
261
262 for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) {
263 QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i);
264 if (!item) {
265 continue;
266 }
267
268 SearchEngine engine = getEngine(item);
269 allEngines.append(engine);
270
271 if (isDefaultEngine(item)) {
272 m_manager->setDefaultEngine(engine);
273 }
274 }
275
276 m_manager->setAllEngines(allEngines);
277
278 QDialog::accept();
279}
280
282{
283 delete ui;
284}
SearchEnginesDialog(QWidget *parent=nullptr)
QVector< Engine > allEngines()
static QIcon iconForSearchEngine(const QUrl &url)
void setDefaultEngine(const Engine &engine)
void setAllEngines(const QVector< Engine > &engines)
#define mApp
i
Definition: i18n.py:23