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 }