You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
307 lines
11 KiB
307 lines
11 KiB
////////////////////////////////////////////////////////////////////////////// |
|
// breezeexceptionlistwidget.cpp |
|
// ------------------- |
|
// |
|
// SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr> |
|
// |
|
// SPDX-License-Identifier: MIT |
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
#include "breezeexceptionlistwidget.h" |
|
#include "breezeexceptiondialog.h" |
|
|
|
#include <KLocalizedString> |
|
|
|
#include <QIcon> |
|
#include <QMessageBox> |
|
#include <QPointer> |
|
#include <QRegularExpression> |
|
|
|
//__________________________________________________________ |
|
namespace Breeze |
|
{ |
|
//__________________________________________________________ |
|
ExceptionListWidget::ExceptionListWidget(QWidget *parent) |
|
: QWidget(parent) |
|
{ |
|
// ui |
|
m_ui.setupUi(this); |
|
|
|
// list |
|
m_ui.exceptionListView->setAllColumnsShowFocus(true); |
|
m_ui.exceptionListView->setRootIsDecorated(false); |
|
m_ui.exceptionListView->setSortingEnabled(false); |
|
m_ui.exceptionListView->setModel(&model()); |
|
m_ui.exceptionListView->sortByColumn(ExceptionModel::ColumnType, Qt::AscendingOrder); |
|
m_ui.exceptionListView->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Ignored)); |
|
|
|
m_ui.moveUpButton->setIcon(QIcon::fromTheme(QStringLiteral("arrow-up"))); |
|
m_ui.moveDownButton->setIcon(QIcon::fromTheme(QStringLiteral("arrow-down"))); |
|
m_ui.addButton->setIcon(QIcon::fromTheme(QStringLiteral("list-add"))); |
|
m_ui.removeButton->setIcon(QIcon::fromTheme(QStringLiteral("list-remove"))); |
|
m_ui.editButton->setIcon(QIcon::fromTheme(QStringLiteral("edit-rename"))); |
|
|
|
connect(m_ui.addButton, &QAbstractButton::clicked, this, &ExceptionListWidget::add); |
|
connect(m_ui.editButton, &QAbstractButton::clicked, this, &ExceptionListWidget::edit); |
|
connect(m_ui.removeButton, &QAbstractButton::clicked, this, &ExceptionListWidget::remove); |
|
connect(m_ui.moveUpButton, &QAbstractButton::clicked, this, &ExceptionListWidget::up); |
|
connect(m_ui.moveDownButton, &QAbstractButton::clicked, this, &ExceptionListWidget::down); |
|
|
|
connect(m_ui.exceptionListView, &QAbstractItemView::activated, this, &ExceptionListWidget::edit); |
|
connect(m_ui.exceptionListView, &QAbstractItemView::clicked, this, &ExceptionListWidget::toggle); |
|
connect(m_ui.exceptionListView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ExceptionListWidget::updateButtons); |
|
|
|
updateButtons(); |
|
resizeColumns(); |
|
} |
|
|
|
//__________________________________________________________ |
|
void ExceptionListWidget::setExceptions(const InternalSettingsList &exceptions) |
|
{ |
|
model().set(exceptions); |
|
resizeColumns(); |
|
setChanged(false); |
|
} |
|
|
|
//__________________________________________________________ |
|
InternalSettingsList ExceptionListWidget::exceptions() |
|
{ |
|
return model().get(); |
|
setChanged(false); |
|
} |
|
|
|
//__________________________________________________________ |
|
void ExceptionListWidget::updateButtons() |
|
{ |
|
bool hasSelection(!m_ui.exceptionListView->selectionModel()->selectedRows().empty()); |
|
m_ui.removeButton->setEnabled(hasSelection); |
|
m_ui.editButton->setEnabled(hasSelection); |
|
|
|
m_ui.moveUpButton->setEnabled(hasSelection && !m_ui.exceptionListView->selectionModel()->isRowSelected(0, QModelIndex())); |
|
m_ui.moveDownButton->setEnabled(hasSelection && !m_ui.exceptionListView->selectionModel()->isRowSelected(model().rowCount() - 1, QModelIndex())); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::add() |
|
{ |
|
QPointer<ExceptionDialog> dialog = new ExceptionDialog(this); |
|
dialog->setWindowTitle(i18n("New Exception - Breeze Settings")); |
|
InternalSettingsPtr exception(new InternalSettings()); |
|
|
|
exception->load(); |
|
|
|
dialog->setException(exception); |
|
|
|
// run dialog and check existence |
|
if (!dialog->exec()) { |
|
delete dialog; |
|
return; |
|
} |
|
|
|
dialog->save(); |
|
delete dialog; |
|
|
|
// check exceptions |
|
if (!checkException(exception)) |
|
return; |
|
|
|
// create new item |
|
model().add(exception); |
|
setChanged(true); |
|
|
|
// make sure item is selected |
|
QModelIndex index(model().index(exception)); |
|
if (index != m_ui.exceptionListView->selectionModel()->currentIndex()) { |
|
m_ui.exceptionListView->selectionModel()->select(index, QItemSelectionModel::Clear | QItemSelectionModel::Select | QItemSelectionModel::Rows); |
|
m_ui.exceptionListView->selectionModel()->setCurrentIndex(index, QItemSelectionModel::Current | QItemSelectionModel::Rows); |
|
} |
|
|
|
resizeColumns(); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::edit() |
|
{ |
|
// retrieve selection |
|
QModelIndex current(m_ui.exceptionListView->selectionModel()->currentIndex()); |
|
if (!model().contains(current)) |
|
return; |
|
|
|
InternalSettingsPtr exception(model().get(current)); |
|
|
|
// create dialog |
|
QPointer<ExceptionDialog> dialog(new ExceptionDialog(this)); |
|
dialog->setWindowTitle(i18n("Edit Exception - Breeze Settings")); |
|
dialog->setException(exception); |
|
|
|
// map dialog |
|
if (!dialog->exec()) { |
|
delete dialog; |
|
return; |
|
} |
|
|
|
// check modifications |
|
if (!dialog->isChanged()) |
|
return; |
|
|
|
// retrieve exception |
|
dialog->save(); |
|
delete dialog; |
|
|
|
// check new exception validity |
|
checkException(exception); |
|
resizeColumns(); |
|
|
|
setChanged(true); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::remove() |
|
{ |
|
// confirmation dialog |
|
{ |
|
QMessageBox messageBox(QMessageBox::Question, |
|
i18n("Question - Breeze Settings"), |
|
i18n("Remove selected exception?"), |
|
QMessageBox::Yes | QMessageBox::Cancel); |
|
messageBox.button(QMessageBox::Yes)->setText(i18n("Remove")); |
|
messageBox.setDefaultButton(QMessageBox::Cancel); |
|
if (messageBox.exec() == QMessageBox::Cancel) |
|
return; |
|
} |
|
|
|
// remove |
|
model().remove(model().get(m_ui.exceptionListView->selectionModel()->selectedRows())); |
|
resizeColumns(); |
|
updateButtons(); |
|
|
|
setChanged(true); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::toggle(const QModelIndex &index) |
|
{ |
|
if (!model().contains(index)) |
|
return; |
|
if (index.column() != ExceptionModel::ColumnEnabled) |
|
return; |
|
|
|
// get matching exception |
|
InternalSettingsPtr exception(model().get(index)); |
|
exception->setEnabled(!exception->enabled()); |
|
setChanged(true); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::up() |
|
{ |
|
InternalSettingsList selection(model().get(m_ui.exceptionListView->selectionModel()->selectedRows())); |
|
if (selection.empty()) { |
|
return; |
|
} |
|
|
|
// retrieve selected indexes in list and store in model |
|
QModelIndexList selectedIndices(m_ui.exceptionListView->selectionModel()->selectedRows()); |
|
InternalSettingsList selectedExceptions(model().get(selectedIndices)); |
|
|
|
InternalSettingsList currentException(model().get()); |
|
InternalSettingsList newExceptions; |
|
|
|
for (InternalSettingsList::const_iterator iter = currentException.constBegin(); iter != currentException.constEnd(); ++iter) { |
|
// check if new list is not empty, current index is selected and last index is not. |
|
// if yes, move. |
|
if (!(newExceptions.empty() || selectedIndices.indexOf(model().index(*iter)) == -1 |
|
|| selectedIndices.indexOf(model().index(newExceptions.back())) != -1)) { |
|
InternalSettingsPtr last(newExceptions.back()); |
|
newExceptions.removeLast(); |
|
newExceptions.append(*iter); |
|
newExceptions.append(last); |
|
} else |
|
newExceptions.append(*iter); |
|
} |
|
|
|
model().set(newExceptions); |
|
|
|
// restore selection |
|
m_ui.exceptionListView->selectionModel()->select(model().index(selectedExceptions.front()), |
|
QItemSelectionModel::Clear | QItemSelectionModel::Select | QItemSelectionModel::Rows); |
|
for (InternalSettingsList::const_iterator iter = selectedExceptions.constBegin(); iter != selectedExceptions.constEnd(); ++iter) { |
|
m_ui.exceptionListView->selectionModel()->select(model().index(*iter), QItemSelectionModel::Select | QItemSelectionModel::Rows); |
|
} |
|
|
|
setChanged(true); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::down() |
|
{ |
|
InternalSettingsList selection(model().get(m_ui.exceptionListView->selectionModel()->selectedRows())); |
|
if (selection.empty()) { |
|
return; |
|
} |
|
|
|
// retrieve selected indexes in list and store in model |
|
QModelIndexList selectedIndices(m_ui.exceptionListView->selectionModel()->selectedIndexes()); |
|
InternalSettingsList selectedExceptions(model().get(selectedIndices)); |
|
|
|
InternalSettingsList currentExceptions(model().get()); |
|
InternalSettingsList newExceptions; |
|
|
|
InternalSettingsListIterator iter(currentExceptions); |
|
iter.toBack(); |
|
while (iter.hasPrevious()) { |
|
InternalSettingsPtr current(iter.previous()); |
|
|
|
// check if new list is not empty, current index is selected and last index is not. |
|
// if yes, move. |
|
if (!(newExceptions.empty() || selectedIndices.indexOf(model().index(current)) == -1 |
|
|| selectedIndices.indexOf(model().index(newExceptions.front())) != -1)) { |
|
InternalSettingsPtr first(newExceptions.front()); |
|
newExceptions.removeFirst(); |
|
newExceptions.prepend(current); |
|
newExceptions.prepend(first); |
|
|
|
} else |
|
newExceptions.prepend(current); |
|
} |
|
|
|
model().set(newExceptions); |
|
|
|
// restore selection |
|
m_ui.exceptionListView->selectionModel()->select(model().index(selectedExceptions.front()), |
|
QItemSelectionModel::Clear | QItemSelectionModel::Select | QItemSelectionModel::Rows); |
|
for (InternalSettingsList::const_iterator iter = selectedExceptions.constBegin(); iter != selectedExceptions.constEnd(); ++iter) { |
|
m_ui.exceptionListView->selectionModel()->select(model().index(*iter), QItemSelectionModel::Select | QItemSelectionModel::Rows); |
|
} |
|
|
|
setChanged(true); |
|
} |
|
|
|
//_______________________________________________________ |
|
void ExceptionListWidget::resizeColumns() const |
|
{ |
|
m_ui.exceptionListView->resizeColumnToContents(ExceptionModel::ColumnEnabled); |
|
m_ui.exceptionListView->resizeColumnToContents(ExceptionModel::ColumnType); |
|
m_ui.exceptionListView->resizeColumnToContents(ExceptionModel::ColumnRegExp); |
|
} |
|
|
|
//_______________________________________________________ |
|
bool ExceptionListWidget::checkException(InternalSettingsPtr exception) |
|
{ |
|
while (exception->exceptionPattern().isEmpty() || !QRegularExpression(exception->exceptionPattern()).isValid()) { |
|
QMessageBox::warning(this, i18n("Warning - Breeze Settings"), i18n("Regular Expression syntax is incorrect")); |
|
QPointer<ExceptionDialog> dialog(new ExceptionDialog(this)); |
|
dialog->setException(exception); |
|
if (dialog->exec() == QDialog::Rejected) { |
|
delete dialog; |
|
return false; |
|
} |
|
|
|
dialog->save(); |
|
delete dialog; |
|
} |
|
|
|
return true; |
|
} |
|
|
|
}
|
|
|