File indexing completed on 2024-05-12 04:58:11
0001 /* ============================================================ 0002 * Falkon - Qt web browser 0003 * Copyright (C) 2010-2017 David Rosca <nowrep@gmail.com> 0004 * 0005 * This program is free software: you can redistribute it and/or modify 0006 * it under the terms of the GNU General Public License as published by 0007 * the Free Software Foundation, either version 3 of the License, or 0008 * (at your option) any later version. 0009 * 0010 * This program is distributed in the hope that it will be useful, 0011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0013 * GNU General Public License for more details. 0014 * 0015 * You should have received a copy of the GNU General Public License 0016 * along with this program. If not, see <http://www.gnu.org/licenses/>. 0017 * ============================================================ */ 0018 #include "searchenginesdialog.h" 0019 #include "ui_searchenginesdialog.h" 0020 #include "editsearchengine.h" 0021 #include "mainapplication.h" 0022 #include "removeitemfocusdelegate.h" 0023 0024 #include <QMessageBox> 0025 0026 SearchEnginesDialog::SearchEnginesDialog(QWidget* parent) 0027 : QDialog(parent) 0028 , ui(new Ui::SearchEnginesDialog) 0029 , m_manager(mApp->searchEnginesManager()) 0030 { 0031 setAttribute(Qt::WA_DeleteOnClose); 0032 0033 ui->setupUi(this); 0034 0035 connect(ui->add, &QAbstractButton::clicked, this, &SearchEnginesDialog::addEngine); 0036 connect(ui->remove, &QAbstractButton::clicked, this, &SearchEnginesDialog::removeEngine); 0037 connect(ui->edit, &QAbstractButton::clicked, this, &SearchEnginesDialog::editEngine); 0038 connect(ui->setAsDefault, &QAbstractButton::clicked, this, &SearchEnginesDialog::setDefaultEngine); 0039 connect(ui->defaults, &QAbstractButton::clicked, this, &SearchEnginesDialog::defaults); 0040 connect(ui->moveUp, &QAbstractButton::clicked, this, &SearchEnginesDialog::moveUp); 0041 connect(ui->moveDown, &QAbstractButton::clicked, this, &SearchEnginesDialog::moveDown); 0042 0043 connect(ui->treeWidget, &QTreeWidget::itemDoubleClicked, this, &SearchEnginesDialog::editEngine); 0044 0045 ui->treeWidget->setItemDelegate(new RemoveItemFocusDelegate(ui->treeWidget)); 0046 ui->treeWidget->sortByColumn(-1, Qt::AscendingOrder); 0047 reloadEngines(); 0048 } 0049 0050 void SearchEnginesDialog::addEngine() 0051 { 0052 EditSearchEngine dialog(tr("Add Search Engine"), this); 0053 dialog.hideIconLabels(); 0054 0055 if (dialog.exec() != QDialog::Accepted) { 0056 return; 0057 } 0058 0059 SearchEngine engine; 0060 engine.name = dialog.name(); 0061 engine.url = dialog.url(); 0062 engine.postData = dialog.postData().toUtf8(); 0063 engine.shortcut = dialog.shortcut(); 0064 engine.icon = SearchEnginesManager::iconForSearchEngine(QUrl::fromEncoded(dialog.url().toUtf8())); 0065 0066 if (engine.name.isEmpty() || engine.url.isEmpty()) { 0067 return; 0068 } 0069 0070 auto* item = new QTreeWidgetItem(); 0071 setEngine(item, engine); 0072 0073 changeItemToDefault(item, false); 0074 item->setIcon(0, engine.icon); 0075 item->setText(1, engine.shortcut); 0076 0077 ui->treeWidget->addTopLevelItem(item); 0078 } 0079 0080 void SearchEnginesDialog::removeEngine() 0081 { 0082 QTreeWidgetItem* item = ui->treeWidget->currentItem(); 0083 if (!item || ui->treeWidget->topLevelItemCount() == 1) { 0084 return; 0085 } 0086 0087 if (isDefaultEngine(item)) { 0088 SearchEngine en = getEngine(item); 0089 QMessageBox::warning(this, tr("Remove Engine"), 0090 tr("You can't remove the default search engine.<br>" 0091 "Set a different engine as default before removing %1.").arg(en.name)); 0092 } 0093 else { 0094 delete item; 0095 } 0096 } 0097 0098 void SearchEnginesDialog::editEngine() 0099 { 0100 QTreeWidgetItem* item = ui->treeWidget->currentItem(); 0101 if (!item) { 0102 return; 0103 } 0104 0105 SearchEngine engine = getEngine(item); 0106 0107 EditSearchEngine dialog(tr("Edit Search Engine"), this); 0108 0109 dialog.setName(engine.name); 0110 dialog.setUrl(engine.url); 0111 dialog.setPostData(QString::fromUtf8(engine.postData)); 0112 dialog.setShortcut(engine.shortcut); 0113 dialog.setIcon(engine.icon); 0114 0115 if (dialog.exec() != QDialog::Accepted) { 0116 return; 0117 } 0118 0119 engine.name = dialog.name(); 0120 engine.url = dialog.url(); 0121 engine.postData = dialog.postData().toUtf8(); 0122 engine.shortcut = dialog.shortcut(); 0123 engine.icon = dialog.icon(); 0124 0125 if (engine.name.isEmpty() || engine.url.isEmpty()) { 0126 return; 0127 } 0128 0129 setEngine(item, engine); 0130 0131 changeItemToDefault(item, isDefaultEngine(item)); 0132 item->setIcon(0, engine.icon); 0133 item->setText(1, engine.shortcut); 0134 } 0135 0136 void SearchEnginesDialog::setDefaultEngine() 0137 { 0138 QTreeWidgetItem* item = ui->treeWidget->currentItem(); 0139 if (!item) { 0140 return; 0141 } 0142 0143 for (int j = 0; j < ui->treeWidget->topLevelItemCount(); ++j) { 0144 QTreeWidgetItem* i = ui->treeWidget->topLevelItem(j); 0145 if (isDefaultEngine(i)) { 0146 if (i == item) { 0147 return; 0148 } 0149 changeItemToDefault(i, false); 0150 break; 0151 } 0152 } 0153 0154 changeItemToDefault(item, true); 0155 } 0156 0157 void SearchEnginesDialog::defaults() 0158 { 0159 m_manager->restoreDefaults(); 0160 reloadEngines(); 0161 } 0162 0163 bool SearchEnginesDialog::isDefaultEngine(QTreeWidgetItem* item) 0164 { 0165 return item->data(0, DefaultRole).toBool(); 0166 } 0167 0168 SearchEngine SearchEnginesDialog::getEngine(QTreeWidgetItem* item) 0169 { 0170 return item->data(0, EngineRole).value<SearchEngine>(); 0171 } 0172 0173 void SearchEnginesDialog::setEngine(QTreeWidgetItem* item, const SearchEngine &engine) 0174 { 0175 QVariant v; 0176 v.setValue(engine); 0177 item->setData(0, EngineRole, v); 0178 item->setText(0, engine.name); 0179 } 0180 0181 void SearchEnginesDialog::changeItemToDefault(QTreeWidgetItem* item, bool isDefault) 0182 { 0183 QFont font = item->font(0); 0184 font.setBold(isDefault); 0185 0186 item->setFont(0, font); 0187 item->setFont(1, font); 0188 item->setData(0, DefaultRole, isDefault); 0189 } 0190 0191 void SearchEnginesDialog::moveUp() 0192 { 0193 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem(); 0194 int index = ui->treeWidget->indexOfTopLevelItem(currentItem); 0195 0196 if (!currentItem || index == 0) { 0197 return; 0198 } 0199 0200 ui->treeWidget->takeTopLevelItem(index); 0201 ui->treeWidget->insertTopLevelItem(index - 1, currentItem); 0202 ui->treeWidget->setCurrentItem(currentItem); 0203 } 0204 0205 void SearchEnginesDialog::moveDown() 0206 { 0207 QTreeWidgetItem* currentItem = ui->treeWidget->currentItem(); 0208 int index = ui->treeWidget->indexOfTopLevelItem(currentItem); 0209 0210 if (!currentItem || !ui->treeWidget->itemBelow(currentItem)) { 0211 return; 0212 } 0213 0214 ui->treeWidget->takeTopLevelItem(index); 0215 ui->treeWidget->insertTopLevelItem(index + 1, currentItem); 0216 ui->treeWidget->setCurrentItem(currentItem); 0217 } 0218 0219 void SearchEnginesDialog::reloadEngines() 0220 { 0221 ui->treeWidget->clear(); 0222 const SearchEngine defaultEngine = mApp->searchEnginesManager()->defaultEngine(); 0223 0224 const auto engines = m_manager->allEngines(); 0225 for (const SearchEngine &en : engines) { 0226 auto* item = new QTreeWidgetItem(); 0227 setEngine(item, en); 0228 changeItemToDefault(item, en == defaultEngine); 0229 item->setIcon(0, en.icon); 0230 item->setText(1, en.shortcut); 0231 0232 ui->treeWidget->addTopLevelItem(item); 0233 } 0234 } 0235 0236 void SearchEnginesDialog::showEvent(QShowEvent *e) 0237 { 0238 QDialog::showEvent(e); 0239 resizeViewHeader(); 0240 } 0241 0242 void SearchEnginesDialog::resizeEvent(QResizeEvent *e) 0243 { 0244 QDialog::resizeEvent(e); 0245 resizeViewHeader(); 0246 } 0247 0248 void SearchEnginesDialog::resizeViewHeader() 0249 { 0250 const int headerWidth = ui->treeWidget->header()->width(); 0251 ui->treeWidget->header()->resizeSection(0, headerWidth - headerWidth / 4); 0252 } 0253 0254 void SearchEnginesDialog::accept() 0255 { 0256 if (ui->treeWidget->topLevelItemCount() < 1) { 0257 return; 0258 } 0259 0260 QVector<SearchEngine> allEngines; 0261 0262 for (int i = 0; i < ui->treeWidget->topLevelItemCount(); i++) { 0263 QTreeWidgetItem* item = ui->treeWidget->topLevelItem(i); 0264 if (!item) { 0265 continue; 0266 } 0267 0268 SearchEngine engine = getEngine(item); 0269 allEngines.append(engine); 0270 0271 if (isDefaultEngine(item)) { 0272 m_manager->setDefaultEngine(engine); 0273 } 0274 } 0275 0276 m_manager->setAllEngines(allEngines); 0277 0278 QDialog::accept(); 0279 } 0280 0281 SearchEnginesDialog::~SearchEnginesDialog() 0282 { 0283 delete ui; 0284 }