#include "slugrewriteconfigurewidget.h"
#include "slugrewriteengine.h"
#include "slugrewriteruledialog.h"
#include "slugrewritesettings.h"
#include <KLocalizedString>
#include <QCheckBox>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QPushButton>
#include <QTreeWidget>
#include <QVBoxLayout>
SlugRewriteConfigureWidget::SlugRewriteConfigureWidget(QWidget *parent)
: WebEngineViewer::NetworkPluginUrlInterceptorConfigureWidget(parent)
{
auto *mainLayout = new QVBoxLayout(this);
mainLayout->setContentsMargins({});
mEnabledCheckBox = new QCheckBox(i18nc("@option:check", "Enable URL slug rewriting"), this);
mainLayout->addWidget(mEnabledCheckBox);
auto *rulesLayout = new QHBoxLayout;
mRulesTree = new QTreeWidget(this);
mRulesTree->setHeaderLabels({i18nc("@title:column", "Match Prefix"), i18nc("@title:column", "Replace With")});
mRulesTree->setRootIsDecorated(false);
mRulesTree->header()->setStretchLastSection(true);
rulesLayout->addWidget(mRulesTree);
auto *buttonsLayout = new QVBoxLayout;
mAddButton = new QPushButton(i18nc("@action:button", "Add..."), this);
mEditButton = new QPushButton(i18nc("@action:button", "Edit..."), this);
mRemoveButton = new QPushButton(i18nc("@action:button", "Remove"), this);
buttonsLayout->addWidget(mAddButton);
buttonsLayout->addWidget(mEditButton);
buttonsLayout->addWidget(mRemoveButton);
buttonsLayout->addStretch();
rulesLayout->addLayout(buttonsLayout);
mainLayout->addLayout(rulesLayout);
connect(mAddButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotAdd);
connect(mEditButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotEdit);
connect(mRemoveButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotRemove);
connect(mRulesTree, &QTreeWidget::itemSelectionChanged, this, &SlugRewriteConfigureWidget::updateButtons);
connect(mEnabledCheckBox, &QCheckBox::toggled, this, [this]() {
Q_EMIT configureChanged();
});
updateButtons();
}
SlugRewriteConfigureWidget::~SlugRewriteConfigureWidget() = default;
void SlugRewriteConfigureWidget::loadSettings()
{
mEnabledCheckBox->setChecked(SlugRewriteSettings::self()->slugRewriteEnabled());
mRulesTree->clear();
const QStringList matchPrefixes = SlugRewriteSettings::self()->matchPrefixes();
const QStringList replacePrefixes = SlugRewriteSettings::self()->replacePrefixes();
const int count = qMin(matchPrefixes.size(), replacePrefixes.size());
for (int i = 0; i < count; ++i) {
auto *item = new QTreeWidgetItem(mRulesTree);
item->setText(0, matchPrefixes.at(i));
item->setText(1, replacePrefixes.at(i));
}
}
void SlugRewriteConfigureWidget::saveSettings()
{
SlugRewriteSettings::self()->setSlugRewriteEnabled(mEnabledCheckBox->isChecked());
QStringList matchPrefixes;
QStringList replacePrefixes;
for (int i = 0; i < mRulesTree->topLevelItemCount(); ++i) {
const auto *item = mRulesTree->topLevelItem(i);
matchPrefixes << item->text(0);
replacePrefixes << item->text(1);
}
SlugRewriteSettings::self()->setMatchPrefixes(matchPrefixes);
SlugRewriteSettings::self()->setReplacePrefixes(replacePrefixes);
SlugRewriteSettings::self()->save();
SlugRewriteEngine::self()->reloadRules();
}
void SlugRewriteConfigureWidget::resetSettings()
{
const bool bUseDefaults = SlugRewriteSettings::self()->useDefaults(true);
loadSettings();
SlugRewriteSettings::self()->useDefaults(bUseDefaults);
}
void SlugRewriteConfigureWidget::slotAdd()
{
SlugRewriteRuleDialog dlg(this);
if (dlg.exec() == QDialog::Accepted) {
auto *item = new QTreeWidgetItem(mRulesTree);
item->setText(0, dlg.matchPrefix());
item->setText(1, dlg.replacePrefix());
Q_EMIT configureChanged();
}
}
void SlugRewriteConfigureWidget::slotEdit()
{
auto *item = mRulesTree->currentItem();
if (!item) {
return;
}
SlugRewriteRuleDialog dlg(this);
dlg.setMatchPrefix(item->text(0));
dlg.setReplacePrefix(item->text(1));
if (dlg.exec() == QDialog::Accepted) {
item->setText(0, dlg.matchPrefix());
item->setText(1, dlg.replacePrefix());
Q_EMIT configureChanged();
}
}
void SlugRewriteConfigureWidget::slotRemove()
{
auto *item = mRulesTree->currentItem();
if (item) {
delete item;
Q_EMIT configureChanged();
}
}
void SlugRewriteConfigureWidget::updateButtons()
{
const bool hasSelection = mRulesTree->currentItem() != nullptr;
mEditButton->setEnabled(hasSelection);
mRemoveButton->setEnabled(hasSelection);
}
#include "moc_slugrewriteconfigurewidget.cpp"