Skip to content

Commit

Permalink
feature: allow to change predefined filters order (#243)
Browse files Browse the repository at this point in the history
Internal storage for predefined is changed to list-like. That way
ordering can be user-defined and not related to filter names.
  • Loading branch information
variar committed Jun 8, 2021
1 parent f63ad53 commit 6ed90ee
Show file tree
Hide file tree
Showing 6 changed files with 104 additions and 39 deletions.
23 changes: 8 additions & 15 deletions src/ui/include/predefinedfilters.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,27 +40,20 @@
#ifndef PREDEFINEDFILTERS_H_
#define PREDEFINEDFILTERS_H_

#include <map>

#include <QHash>
#include <QList>
#include <QString>

#include "persistable.h"

#if QT_VERSION < QT_VERSION_CHECK( 5, 14, 0 )
namespace std {
template<> struct hash<QString> {
std::size_t operator()(const QString& s) const noexcept {
return (size_t) qHash(s);
}
};
}
#endif

// Represents collection of filters read from settings file.
class PredefinedFiltersCollection final : public Persistable<PredefinedFiltersCollection> {
public:
using Collection = std::map<QString, QString>;
struct PredefinedFilter {
QString name;
QString pattern;
};

using Collection = QList<PredefinedFilter>;

static const char* persistableName()
{
Expand All @@ -76,7 +69,7 @@ class PredefinedFiltersCollection final : public Persistable<PredefinedFiltersCo
void saveToStorage( const Collection& filters );

private:
static constexpr int PredefinedFiltersCollection_VERSION = 1;
static constexpr int PredefinedFiltersCollection_VERSION = 2;

Collection filters_;
};
Expand Down
12 changes: 8 additions & 4 deletions src/ui/include/predefinedfiltersdialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,12 @@ class PredefinedFiltersDialog : public QDialog, public Ui::PredefinedFiltersDial
PredefinedFiltersDialog( const QString& newFilter, QWidget* parent = nullptr );

private slots:
void addFilter() const;
void removeFilter() const;
void addFilter();
void removeFilter();

void moveFilterUp();
void moveFilterDown();

void exportFilters();
void importFilters();

Expand All @@ -65,8 +69,8 @@ class PredefinedFiltersDialog : public QDialog, public Ui::PredefinedFiltersDial
void optionsChanged();

private:
void addFilterFromSearchLine( const QString& newFilter ) const;
void populateFiltersTable() const;
void addFilterFromSearchLine( const QString& newFilter );
void populateFiltersTable();
void saveSettings();
void readFiltersTable();

Expand Down
35 changes: 35 additions & 0 deletions src/ui/include/predefinedfiltersdialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,41 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="upButton">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../app/klogg.qrc">
<normaloff>:/images/icons8-up-16.png</normaloff>:/images/icons8-up-16.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="downButton">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../../app/klogg.qrc">
<normaloff>:/images/icons8-down-arrow-16.png</normaloff>:/images/icons8-down-arrow-16.png</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item>
Expand Down
13 changes: 7 additions & 6 deletions src/ui/src/predefinedfilters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ void PredefinedFiltersCollection::retrieveFromStorage( QSettings& settings )
for ( int i = 0; i < size; ++i ) {
settings.setArrayIndex( i );

filters_.emplace( settings.value( "name" ).toString(),
settings.value( "filter" ).toString() );
filters_.push_back( { settings.value( "name" ).toString(),
settings.value( "filter" ).toString() } );
}
settings.endArray();
}
Expand All @@ -77,18 +77,19 @@ void PredefinedFiltersCollection::saveToStorage( QSettings& settings ) const

settings.beginWriteArray( "filters" );
int arrayIndex = 0;
for ( const auto& filter : filters_ ) {
for ( const auto& filter : qAsConst( filters_ ) ) {
settings.setArrayIndex( arrayIndex );
settings.setValue( "name", filter.first );
settings.setValue( "filter", filter.second );
settings.setValue( "name", filter.name );
settings.setValue( "filter", filter.pattern );

arrayIndex++;
}
settings.endArray();
settings.endGroup();
}

void PredefinedFiltersCollection::saveToStorage( const PredefinedFiltersCollection::Collection& filters )
void PredefinedFiltersCollection::saveToStorage(
const PredefinedFiltersCollection::Collection& filters )
{
filters_ = filters;
this->save();
Expand Down
4 changes: 2 additions & 2 deletions src/ui/src/predefinedfilterscombobox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,11 @@ void PredefinedFiltersComboBox::insertFilters(
auto row = model_->rowCount();

for ( const auto& filter : filters ) {
auto* item = new QStandardItem( filter.first );
auto* item = new QStandardItem( filter.name );

item->setFlags( Qt::ItemIsUserCheckable | Qt::ItemIsEnabled );
item->setData( Qt::Unchecked, Qt::CheckStateRole );
item->setData( filter.second, Qt::UserRole );
item->setData( filter.pattern, Qt::UserRole );

model_->insertRow( row, item );

Expand Down
56 changes: 44 additions & 12 deletions src/ui/src/predefinedfiltersdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@
#include <QFileDialog>
#include <QTimer>
#include <QToolButton>
#include <qabstractitemmodel.h>

#include "dispatch_to.h"
#include "iconloader.h"
#include "log.h"
#include "predefinedfilters.h"
#include "dispatch_to.h"

PredefinedFiltersDialog::PredefinedFiltersDialog( QWidget* parent )
: QDialog( parent )
Expand All @@ -60,6 +61,8 @@ PredefinedFiltersDialog::PredefinedFiltersDialog( QWidget* parent )
connect( addFilterButton, &QToolButton::clicked, this, &PredefinedFiltersDialog::addFilter );
connect( removeFilterButton, &QToolButton::clicked, this,
&PredefinedFiltersDialog::removeFilter );
connect( upButton, &QToolButton::clicked, this, &PredefinedFiltersDialog::moveFilterUp );
connect( downButton, &QToolButton::clicked, this, &PredefinedFiltersDialog::moveFilterDown );
connect( importFilterButton, &QToolButton::clicked, this,
&PredefinedFiltersDialog::importFilters );
connect( exportFilterButton, &QToolButton::clicked, this,
Expand All @@ -73,6 +76,8 @@ PredefinedFiltersDialog::PredefinedFiltersDialog( QWidget* parent )

addFilterButton->setIcon( iconLoader.load( "icons8-plus-16" ) );
removeFilterButton->setIcon( iconLoader.load( "icons8-minus-16" ) );
upButton->setIcon( iconLoader.load( "icons8-up-16" ) );
downButton->setIcon( iconLoader.load( "icons8-down-arrow-16" ) );
} );
}

Expand All @@ -84,7 +89,7 @@ PredefinedFiltersDialog::PredefinedFiltersDialog( const QString& newFilter, QWid
}
}

void PredefinedFiltersDialog::populateFiltersTable() const
void PredefinedFiltersDialog::populateFiltersTable()
{
filtersTableWidget->clear();

Expand All @@ -96,8 +101,8 @@ void PredefinedFiltersDialog::populateFiltersTable() const

int filterIndex = 0;
for ( const auto& filter : filters_ ) {
filtersTableWidget->setItem( filterIndex, 0, new QTableWidgetItem( filter.first ) );
filtersTableWidget->setItem( filterIndex, 1, new QTableWidgetItem( filter.second ) );
filtersTableWidget->setItem( filterIndex, 0, new QTableWidgetItem( filter.name ) );
filtersTableWidget->setItem( filterIndex, 1, new QTableWidgetItem( filter.pattern ) );

filterIndex++;
}
Expand All @@ -124,21 +129,21 @@ void PredefinedFiltersDialog::readFiltersTable()
continue;
}

const auto key = filtersTableWidget->item( i, 0 )->text();
const auto name = filtersTableWidget->item( i, 0 )->text();
const auto value = filtersTableWidget->item( i, 1 )->text();

if ( !key.isEmpty() && !value.isEmpty() ) {
filters_.emplace( key, value );
if ( !name.isEmpty() && !value.isEmpty() ) {
filters_.push_back( { name, value } );
}
}
}

void PredefinedFiltersDialog::addFilter() const
void PredefinedFiltersDialog::addFilter()
{
filtersTableWidget->setRowCount( filtersTableWidget->rowCount() + 1 );
}

void PredefinedFiltersDialog::addFilterFromSearchLine( const QString& newFilter ) const
void PredefinedFiltersDialog::addFilterFromSearchLine( const QString& newFilter )
{
addFilter();

Expand All @@ -151,11 +156,39 @@ void PredefinedFiltersDialog::addFilterFromSearchLine( const QString& newFilter
filtersTableWidget->editItem( filtersTableWidget->item( row, 0 ) );
}

void PredefinedFiltersDialog::removeFilter() const
void PredefinedFiltersDialog::removeFilter()
{
filtersTableWidget->removeRow( filtersTableWidget->currentRow() );
}

void PredefinedFiltersDialog::moveFilterUp()
{
const auto* currentItem = filtersTableWidget->currentItem();

if ( currentItem->row() > 0 ) {
filters_.move( currentItem->row(), currentItem->row() - 1 );

dispatchToMainThread( [ this, row = currentItem->row(), column = currentItem->column() ] {
populateFiltersTable();
filtersTableWidget->setCurrentItem( filtersTableWidget->item( row - 1, column ) );
} );
}
}

void PredefinedFiltersDialog::moveFilterDown()
{
const auto* currentItem = filtersTableWidget->currentItem();

if ( currentItem && currentItem->row() < filters_.size() - 1 ) {
filters_.move( currentItem->row(), currentItem->row() + 1 );

dispatchToMainThread( [ this, row = currentItem->row(), column = currentItem->column() ] {
populateFiltersTable();
filtersTableWidget->setCurrentItem( filtersTableWidget->item( row + 1, column ) );
} );
}
}

void PredefinedFiltersDialog::importFilters()
{
const auto file = QFileDialog::getOpenFileName( this, "Select file to import", "",
Expand Down Expand Up @@ -212,8 +245,7 @@ void PredefinedFiltersDialog::resolveStandardButton( QAbstractButton* button )
accept();
break;
default:
LOG_ERROR << "PredefinedFiltersDialog::resolveStandardButton unhandled role: "
<< role;
LOG_ERROR << "PredefinedFiltersDialog::resolveStandardButton unhandled role: " << role;
return;
}

Expand Down

0 comments on commit 6ed90ee

Please sign in to comment.