Improved locator settings

* Added columns for name, prefix and default
* Made sortable
* Added filter input field
* Added inline editing of prefix and default state
* Changed "Limit to prefix" to "Include by default"
* Added some tool tips

Change-Id: I9ddfaf1bc9ff62e3fbe84c1b66bdd795aaa274fd
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com>
Reviewed-by: hjk <hjk@theqtcompany.com>
This commit is contained in:
Eike Ziller
2015-06-08 16:48:24 +02:00
parent 0046562391
commit ee488785bf
11 changed files with 318 additions and 82 deletions

View File

@@ -30,6 +30,7 @@
#include "directoryfilter.h" #include "directoryfilter.h"
#include <coreplugin/coreconstants.h>
#include <utils/filesearch.h> #include <utils/filesearch.h>
#include <QFileDialog> #include <QFileDialog>
@@ -95,7 +96,11 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
QDialog dialog(parent); QDialog dialog(parent);
m_dialog = &dialog; m_dialog = &dialog;
m_ui.setupUi(&dialog); m_ui.setupUi(&dialog);
dialog.setWindowTitle(tr("Filter Configuration")); dialog.setWindowTitle(ILocatorFilter::msgConfigureDialogTitle());
m_ui.prefixLabel->setText(ILocatorFilter::msgPrefixLabel());
m_ui.prefixLabel->setToolTip(ILocatorFilter::msgPrefixToolTip());
m_ui.defaultFlag->setText(ILocatorFilter::msgIncludeByDefault());
m_ui.defaultFlag->setText(ILocatorFilter::msgIncludeByDefaultToolTip());
connect(m_ui.addButton, &QPushButton::clicked, connect(m_ui.addButton, &QPushButton::clicked,
this, &DirectoryFilter::addDirectory, Qt::DirectConnection); this, &DirectoryFilter::addDirectory, Qt::DirectConnection);
connect(m_ui.editButton, &QPushButton::clicked, connect(m_ui.editButton, &QPushButton::clicked,
@@ -110,7 +115,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
m_ui.directoryList->addItems(m_directories); m_ui.directoryList->addItems(m_directories);
m_ui.fileTypeEdit->setText(m_filters.join(QLatin1Char(','))); m_ui.fileTypeEdit->setText(m_filters.join(QLatin1Char(',')));
m_ui.shortcutEdit->setText(shortcutString()); m_ui.shortcutEdit->setText(shortcutString());
m_ui.defaultFlag->setChecked(!isIncludedByDefault()); m_ui.defaultFlag->setChecked(isIncludedByDefault());
updateOptionButtons(); updateOptionButtons();
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
QMutexLocker locker(&m_lock); QMutexLocker locker(&m_lock);
@@ -130,7 +135,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
} }
m_filters = m_ui.fileTypeEdit->text().trimmed().split(QLatin1Char(',')); m_filters = m_ui.fileTypeEdit->text().trimmed().split(QLatin1Char(','));
setShortcutString(m_ui.shortcutEdit->text().trimmed()); setShortcutString(m_ui.shortcutEdit->text().trimmed());
setIncludedByDefault(!m_ui.defaultFlag->isChecked()); setIncludedByDefault(m_ui.defaultFlag->isChecked());
if (directoriesChanged || oldFilters != m_filters) if (directoriesChanged || oldFilters != m_filters)
needsRefresh = true; needsRefresh = true;
success = true; success = true;

View File

@@ -38,9 +38,9 @@
</widget> </widget>
</item> </item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_4"> <widget class="QLabel" name="prefixLabel">
<property name="text"> <property name="text">
<string>Prefix:</string> <string notr="true">Prefix:</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -67,7 +67,7 @@ To do this, you type this shortcut and a space in the Locator entry field, and t
<item row="3" column="2" colspan="2"> <item row="3" column="2" colspan="2">
<widget class="QCheckBox" name="defaultFlag"> <widget class="QCheckBox" name="defaultFlag">
<property name="text"> <property name="text">
<string>Limit to prefix</string> <string notr="true">Include by default</string>
</property> </property>
<property name="checked"> <property name="checked">
<bool>false</bool> <bool>false</bool>

View File

@@ -30,6 +30,7 @@
#include "filesystemfilter.h" #include "filesystemfilter.h"
#include "locatorwidget.h" #include "locatorwidget.h"
#include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/idocument.h> #include <coreplugin/idocument.h>
@@ -171,15 +172,19 @@ bool FileSystemFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
Ui::FileSystemFilterOptions ui; Ui::FileSystemFilterOptions ui;
QDialog dialog(parent); QDialog dialog(parent);
ui.setupUi(&dialog); ui.setupUi(&dialog);
dialog.setWindowTitle(ILocatorFilter::msgConfigureDialogTitle());
ui.prefixLabel->setText(ILocatorFilter::msgPrefixLabel());
ui.prefixLabel->setToolTip(ILocatorFilter::msgPrefixToolTip());
ui.includeByDefault->setText(msgIncludeByDefault());
ui.includeByDefault->setToolTip(msgIncludeByDefaultToolTip());
ui.hiddenFilesFlag->setChecked(m_includeHidden); ui.hiddenFilesFlag->setChecked(m_includeHidden);
ui.limitCheck->setChecked(!isIncludedByDefault()); ui.includeByDefault->setChecked(isIncludedByDefault());
ui.shortcutEdit->setText(shortcutString()); ui.shortcutEdit->setText(shortcutString());
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
m_includeHidden = ui.hiddenFilesFlag->isChecked(); m_includeHidden = ui.hiddenFilesFlag->isChecked();
setShortcutString(ui.shortcutEdit->text().trimmed()); setShortcutString(ui.shortcutEdit->text().trimmed());
setIncludedByDefault(!ui.limitCheck->isChecked()); setIncludedByDefault(ui.includeByDefault->isChecked());
return true; return true;
} }
return false; return false;

View File

@@ -11,13 +11,13 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Add Filter Configuration</string> <string notr="true">Filter Configuration</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label"> <widget class="QLabel" name="prefixLabel">
<property name="text"> <property name="text">
<string>Prefix:</string> <string notr="true">Prefix:</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>shortcutEdit</cstring> <cstring>shortcutEdit</cstring>
@@ -28,9 +28,9 @@
<widget class="QLineEdit" name="shortcutEdit"/> <widget class="QLineEdit" name="shortcutEdit"/>
</item> </item>
<item row="1" column="2"> <item row="1" column="2">
<widget class="QCheckBox" name="limitCheck"> <widget class="QCheckBox" name="includeByDefault">
<property name="text"> <property name="text">
<string>Limit to prefix</string> <string notr="true">Include by default</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@@ -30,8 +30,11 @@
#include "ilocatorfilter.h" #include "ilocatorfilter.h"
#include <coreplugin/coreconstants.h>
#include <QBoxLayout> #include <QBoxLayout>
#include <QCheckBox> #include <QCheckBox>
#include <QCoreApplication>
#include <QDialog> #include <QDialog>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QLabel> #include <QLabel>
@@ -92,17 +95,20 @@ bool ILocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
Q_UNUSED(needsRefresh) Q_UNUSED(needsRefresh)
QDialog dialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint); QDialog dialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
dialog.setWindowTitle(tr("Filter Configuration")); dialog.setWindowTitle(msgConfigureDialogTitle());
QVBoxLayout *vlayout = new QVBoxLayout(&dialog); QVBoxLayout *vlayout = new QVBoxLayout(&dialog);
QHBoxLayout *hlayout = new QHBoxLayout; QHBoxLayout *hlayout = new QHBoxLayout;
QLineEdit *shortcutEdit = new QLineEdit(shortcutString()); QLineEdit *shortcutEdit = new QLineEdit(shortcutString());
QCheckBox *limitCheck = new QCheckBox(tr("Limit to prefix")); QCheckBox *includeByDefault = new QCheckBox(msgIncludeByDefault());
limitCheck->setChecked(!isIncludedByDefault()); includeByDefault->setToolTip(msgIncludeByDefaultToolTip());
includeByDefault->setChecked(isIncludedByDefault());
hlayout->addWidget(new QLabel(tr("Prefix:"))); auto prefixLabel = new QLabel(msgPrefixLabel());
prefixLabel->setToolTip(msgPrefixToolTip());
hlayout->addWidget(prefixLabel);
hlayout->addWidget(shortcutEdit); hlayout->addWidget(shortcutEdit);
hlayout->addWidget(limitCheck); hlayout->addWidget(includeByDefault);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |
QDialogButtonBox::Cancel); QDialogButtonBox::Cancel);
@@ -115,7 +121,7 @@ bool ILocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
setShortcutString(shortcutEdit->text().trimmed()); setShortcutString(shortcutEdit->text().trimmed());
setIncludedByDefault(!limitCheck->isChecked()); setIncludedByDefault(includeByDefault->isChecked());
return true; return true;
} }
@@ -143,6 +149,31 @@ Qt::CaseSensitivity ILocatorFilter::caseSensitivity(const QString &str)
return str == str.toLower() ? Qt::CaseInsensitive : Qt::CaseSensitive; return str == str.toLower() ? Qt::CaseInsensitive : Qt::CaseSensitive;
} }
QString ILocatorFilter::msgConfigureDialogTitle()
{
return tr("Filter Configuration");
}
QString ILocatorFilter::msgPrefixLabel()
{
return tr("Prefix:");
}
QString ILocatorFilter::msgPrefixToolTip()
{
return tr("Type the prefix followed by a space and search term to restrict search to the filter.");
}
QString ILocatorFilter::msgIncludeByDefault()
{
return tr("Include by default");
}
QString ILocatorFilter::msgIncludeByDefaultToolTip()
{
return tr("Include the filter when not using a prefix for searches.");
}
bool ILocatorFilter::isConfigurable() const bool ILocatorFilter::isConfigurable() const
{ {
return m_isConfigurable; return m_isConfigurable;

View File

@@ -100,6 +100,7 @@ public:
/* String to type to use this filter exclusively. */ /* String to type to use this filter exclusively. */
QString shortcutString() const; QString shortcutString() const;
void setShortcutString(const QString &shortcut);
/* Called on the main thread before matchesFor is called in a separate thread. /* Called on the main thread before matchesFor is called in a separate thread.
Can be used to perform actions that need to be done in the main thread before actually Can be used to perform actions that need to be done in the main thread before actually
@@ -135,6 +136,7 @@ public:
/* Is this filter used also when the shortcutString is not used? */ /* Is this filter used also when the shortcutString is not used? */
bool isIncludedByDefault() const; bool isIncludedByDefault() const;
void setIncludedByDefault(bool includedByDefault);
/* Returns whether the filter should be hidden from configuration and menus. */ /* Returns whether the filter should be hidden from configuration and menus. */
bool isHidden() const; bool isHidden() const;
@@ -145,13 +147,17 @@ public:
static QString trimWildcards(const QString &str); static QString trimWildcards(const QString &str);
static Qt::CaseSensitivity caseSensitivity(const QString &str); static Qt::CaseSensitivity caseSensitivity(const QString &str);
static QString msgConfigureDialogTitle();
static QString msgPrefixLabel();
static QString msgPrefixToolTip();
static QString msgIncludeByDefault();
static QString msgIncludeByDefaultToolTip();
public slots: public slots:
/* Enable or disable the filter. */ /* Enable or disable the filter. */
void setEnabled(bool enabled); void setEnabled(bool enabled);
protected: protected:
void setShortcutString(const QString &shortcut);
void setIncludedByDefault(bool includedByDefault);
void setHidden(bool hidden); void setHidden(bool hidden);
void setId(Id id); void setId(Id id);
void setPriority(Priority priority); void setPriority(Priority priority);

View File

@@ -36,15 +36,133 @@
#include "directoryfilter.h" #include "directoryfilter.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <utils/categorysortfiltermodel.h>
#include <utils/headerviewstretcher.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/treemodel.h>
#include <QCoreApplication> #include <QCoreApplication>
Q_DECLARE_METATYPE(Core::ILocatorFilter*) using namespace Utils;
static const int SortRole = Qt::UserRole + 1;
namespace Core {
namespace Internal {
enum FilterItemColumn
{
FilterName = 0,
FilterPrefix,
FilterIncludedByDefault
};
class FilterItem : public TreeItem
{
public:
FilterItem(ILocatorFilter *filter);
QVariant data(int column, int role) const override;
Qt::ItemFlags flags(int column) const override;
bool setData(int column, const QVariant &data, int role) override;
ILocatorFilter *filter() const;
private:
ILocatorFilter *m_filter;
};
class CategoryItem : public TreeItem
{
public:
CategoryItem(const QString &name, int order);
QVariant data(int column, int role) const override;
private:
int m_order;
};
} // Internal
} // Core
using namespace Core; using namespace Core;
using namespace Core::Internal; using namespace Core::Internal;
FilterItem::FilterItem(ILocatorFilter *filter)
: m_filter(filter)
{
setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
QVariant FilterItem::data(int column, int role) const
{
switch (column) {
case FilterName:
if (role == Qt::DisplayRole || role == SortRole)
return m_filter->displayName();
break;
case FilterPrefix:
if (role == Qt::DisplayRole || role == SortRole || role == Qt::EditRole)
return m_filter->shortcutString();
break;
case FilterIncludedByDefault:
if (role == Qt::CheckStateRole || role == SortRole || role == Qt::EditRole)
return m_filter->isIncludedByDefault() ? Qt::Checked : Qt::Unchecked;
break;
default:
break;
}
return QVariant();
}
Qt::ItemFlags FilterItem::flags(int column) const
{
if (column == FilterPrefix) {
return TreeItem::flags(column) | Qt::ItemIsEditable;
} else if (column == FilterIncludedByDefault) {
return TreeItem::flags(column) | Qt::ItemIsEditable | Qt::ItemIsUserCheckable;
}
return TreeItem::flags(column);
}
bool FilterItem::setData(int column, const QVariant &data, int role)
{
switch (column) {
case FilterName:
break;
case FilterPrefix:
if (role == Qt::EditRole && data.canConvert<QString>()) {
m_filter->setShortcutString(data.toString());
return true;
}
break;
case FilterIncludedByDefault:
if (role == Qt::CheckStateRole && data.canConvert<bool>()) {
m_filter->setIncludedByDefault(data.toBool());
return true;
}
}
return false;
}
ILocatorFilter *FilterItem::filter() const
{
return m_filter;
}
CategoryItem::CategoryItem(const QString &name, int order)
: TreeItem(QStringList(name)),
m_order(order)
{
}
QVariant CategoryItem::data(int column, int role) const
{
if (role == SortRole)
return m_order;
return TreeItem::data(column, role);
}
LocatorSettingsPage::LocatorSettingsPage(Locator *plugin) LocatorSettingsPage::LocatorSettingsPage(Locator *plugin)
: m_plugin(plugin), m_widget(0) : m_plugin(plugin), m_widget(0)
{ {
@@ -58,25 +176,49 @@ LocatorSettingsPage::LocatorSettingsPage(Locator *plugin)
QWidget *LocatorSettingsPage::widget() QWidget *LocatorSettingsPage::widget()
{ {
if (!m_widget) { if (!m_widget) {
m_filters = m_plugin->filters();
m_customFilters = m_plugin->customFilters();
m_widget = new QWidget; m_widget = new QWidget;
m_ui.setupUi(m_widget); m_ui.setupUi(m_widget);
m_ui.refreshInterval->setToolTip(m_ui.refreshIntervalLabel->toolTip()); m_ui.refreshInterval->setToolTip(m_ui.refreshIntervalLabel->toolTip());
connect(m_ui.filterList, &QListWidget::currentItemChanged,
m_ui.filterEdit->setFiltering(true);
m_ui.filterList->setSelectionMode(QAbstractItemView::SingleSelection);
m_ui.filterList->setSelectionBehavior(QAbstractItemView::SelectRows);
m_ui.filterList->setSortingEnabled(true);
m_ui.filterList->setUniformRowHeights(true);
m_ui.filterList->setActivationMode(Utils::DoubleClickActivation);
m_model = new TreeModel(m_ui.filterList);
initializeModel();
m_proxyModel = new CategorySortFilterModel(m_ui.filterList);
m_proxyModel->setSourceModel(m_model);
m_proxyModel->setSortRole(SortRole);
m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
m_proxyModel->setFilterKeyColumn(-1/*all*/);
m_ui.filterList->setModel(m_proxyModel);
m_ui.filterList->expandAll();
new HeaderViewStretcher(m_ui.filterList->header(), FilterName);
m_ui.filterList->header()->setSortIndicator(FilterName, Qt::AscendingOrder);
connect(m_ui.filterEdit, &FancyLineEdit::filterChanged,
this, &LocatorSettingsPage::setFilter);
connect(m_ui.filterList->selectionModel(), &QItemSelectionModel::currentChanged,
this, &LocatorSettingsPage::updateButtonStates); this, &LocatorSettingsPage::updateButtonStates);
connect(m_ui.filterList, SIGNAL(itemActivated(QListWidgetItem*)), connect(m_ui.filterList, &Utils::TreeView::activated,
this, SLOT(configureFilter(QListWidgetItem*))); this, &LocatorSettingsPage::configureFilter);
connect(m_ui.editButton, SIGNAL(clicked()), connect(m_ui.editButton, &QPushButton::clicked,
this, SLOT(configureFilter())); this, [this]() { configureFilter(m_ui.filterList->currentIndex()); });
connect(m_ui.addButton, &QPushButton::clicked, connect(m_ui.addButton, &QPushButton::clicked,
this, &LocatorSettingsPage::addCustomFilter); this, &LocatorSettingsPage::addCustomFilter);
connect(m_ui.removeButton, &QPushButton::clicked, connect(m_ui.removeButton, &QPushButton::clicked,
this, &LocatorSettingsPage::removeCustomFilter); this, &LocatorSettingsPage::removeCustomFilter);
m_ui.refreshInterval->setValue(m_plugin->refreshInterval()); m_ui.refreshInterval->setValue(m_plugin->refreshInterval());
m_filters = m_plugin->filters();
m_customFilters = m_plugin->customFilters();
saveFilterStates(); saveFilterStates();
updateFilterList();
} }
return m_widget; return m_widget;
} }
@@ -121,6 +263,12 @@ void LocatorSettingsPage::requestRefresh()
m_plugin->refresh(m_refreshFilters); m_plugin->refresh(m_refreshFilters);
} }
void LocatorSettingsPage::setFilter(const QString &text)
{
m_proxyModel->setFilterFixedString(text);
m_ui.filterList->expandAll();
}
void LocatorSettingsPage::saveFilterStates() void LocatorSettingsPage::saveFilterStates()
{ {
m_filterStates.clear(); m_filterStates.clear();
@@ -134,49 +282,60 @@ void LocatorSettingsPage::restoreFilterStates()
filter->restoreState(m_filterStates.value(filter)); filter->restoreState(m_filterStates.value(filter));
} }
void LocatorSettingsPage::updateFilterList() void LocatorSettingsPage::initializeModel()
{ {
m_ui.filterList->clear(); m_model->setHeader(QStringList({ tr("Name"), tr("Prefix"), tr("Default") }));
foreach (ILocatorFilter *filter, m_filters) { m_model->setHeaderToolTip(QStringList({
if (filter->isHidden()) QString(),
continue; ILocatorFilter::msgPrefixToolTip(),
ILocatorFilter::msgIncludeByDefaultToolTip()
}));
m_model->clear();
QSet<ILocatorFilter *> customFilterSet = m_customFilters.toSet();
auto builtIn = new CategoryItem(tr("Built-in"), 0/*order*/);
foreach (ILocatorFilter *filter, m_filters)
if (!filter->isHidden() && !customFilterSet.contains(filter))
builtIn->appendChild(new FilterItem(filter));
m_customFilterRoot = new CategoryItem(tr("Custom"), 1/*order*/);
foreach (ILocatorFilter *customFilter, m_customFilters)
m_customFilterRoot->appendChild(new FilterItem(customFilter));
QString title; m_model->rootItem()->appendChild(builtIn);
if (filter->isIncludedByDefault()) m_model->rootItem()->appendChild(m_customFilterRoot);
title = filter->displayName();
else
title = tr("%1 (prefix: %2)").arg(filter->displayName()).arg(filter->shortcutString());
QListWidgetItem *item = new QListWidgetItem(title);
item->setData(Qt::UserRole, qVariantFromValue(filter));
m_ui.filterList->addItem(item);
}
if (m_ui.filterList->count() > 0)
m_ui.filterList->setCurrentRow(0);
} }
void LocatorSettingsPage::updateButtonStates() void LocatorSettingsPage::updateButtonStates()
{ {
QListWidgetItem *item = m_ui.filterList->currentItem(); const QModelIndex currentIndex = m_proxyModel->mapToSource(m_ui.filterList->currentIndex());
ILocatorFilter *filter = (item ? item->data(Qt::UserRole).value<ILocatorFilter *>() : 0); bool selected = currentIndex.isValid();
ILocatorFilter *filter = 0;
if (selected) {
auto item = dynamic_cast<FilterItem *>(m_model->itemForIndex(currentIndex));
if (item)
filter = item->filter();
}
m_ui.editButton->setEnabled(filter && filter->isConfigurable()); m_ui.editButton->setEnabled(filter && filter->isConfigurable());
m_ui.removeButton->setEnabled(filter && m_customFilters.contains(filter)); m_ui.removeButton->setEnabled(filter && m_customFilters.contains(filter));
} }
void LocatorSettingsPage::configureFilter(QListWidgetItem *item) void LocatorSettingsPage::configureFilter(const QModelIndex &proxyIndex)
{ {
if (!item) const QModelIndex index = m_proxyModel->mapToSource(proxyIndex);
item = m_ui.filterList->currentItem(); QTC_ASSERT(index.isValid(), return);
auto item = dynamic_cast<FilterItem *>(m_model->itemForIndex(index));
QTC_ASSERT(item, return); QTC_ASSERT(item, return);
ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>(); ILocatorFilter *filter = item->filter();
QTC_ASSERT(filter, return); QTC_ASSERT(filter->isConfigurable(), return);
bool includedByDefault = filter->isIncludedByDefault();
if (!filter->isConfigurable()) QString shortcutString = filter->shortcutString();
return;
bool needsRefresh = false; bool needsRefresh = false;
filter->openConfigDialog(m_widget, needsRefresh); filter->openConfigDialog(m_widget, needsRefresh);
if (needsRefresh && !m_refreshFilters.contains(filter)) if (needsRefresh && !m_refreshFilters.contains(filter))
m_refreshFilters.append(filter); m_refreshFilters.append(filter);
updateFilterList(); if (filter->isIncludedByDefault() != includedByDefault)
item->updateColumn(FilterIncludedByDefault);
if (filter->shortcutString() != shortcutString)
item->updateColumn(FilterPrefix);
} }
void LocatorSettingsPage::addCustomFilter() void LocatorSettingsPage::addCustomFilter()
@@ -189,16 +348,19 @@ void LocatorSettingsPage::addCustomFilter()
m_addedFilters.append(filter); m_addedFilters.append(filter);
m_customFilters.append(filter); m_customFilters.append(filter);
m_refreshFilters.append(filter); m_refreshFilters.append(filter);
updateFilterList(); m_customFilterRoot->appendChild(new FilterItem(filter));
} }
} }
void LocatorSettingsPage::removeCustomFilter() void LocatorSettingsPage::removeCustomFilter()
{ {
QListWidgetItem *item = m_ui.filterList->currentItem(); QModelIndex currentIndex = m_proxyModel->mapToSource(m_ui.filterList->currentIndex());
QTC_ASSERT(currentIndex.isValid(), return);
auto item = dynamic_cast<FilterItem *>(m_model->itemForIndex(currentIndex));
QTC_ASSERT(item, return); QTC_ASSERT(item, return);
ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>(); ILocatorFilter *filter = item->filter();
QTC_ASSERT(m_customFilters.contains(filter), return); QTC_ASSERT(m_customFilters.contains(filter), return);
delete m_model->takeItem(item);
m_filters.removeAll(filter); m_filters.removeAll(filter);
m_customFilters.removeAll(filter); m_customFilters.removeAll(filter);
m_refreshFilters.removeAll(filter); m_refreshFilters.removeAll(filter);
@@ -208,5 +370,4 @@ void LocatorSettingsPage::removeCustomFilter()
} else { } else {
m_removedFilters.append(filter); m_removedFilters.append(filter);
} }
updateFilterList();
} }

View File

@@ -40,8 +40,16 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QListWidgetItem; class QListWidgetItem;
class QSortFilterProxyModel;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils {
class TreeModel;
class TreeItem;
} // Utils
namespace Core { namespace Core {
class ILocatorFilter; class ILocatorFilter;
@@ -63,19 +71,23 @@ public:
private slots: private slots:
void updateButtonStates(); void updateButtonStates();
void configureFilter(QListWidgetItem *item = 0); void configureFilter(const QModelIndex &proxyIndex);
void addCustomFilter(); void addCustomFilter();
void removeCustomFilter(); void removeCustomFilter();
private: private:
void updateFilterList(); void initializeModel();
void saveFilterStates(); void saveFilterStates();
void restoreFilterStates(); void restoreFilterStates();
void requestRefresh(); void requestRefresh();
void setFilter(const QString &text);
Ui::LocatorSettingsWidget m_ui; Ui::LocatorSettingsWidget m_ui;
Locator *m_plugin; Locator *m_plugin;
QPointer<QWidget> m_widget; QPointer<QWidget> m_widget;
Utils::TreeModel *m_model;
QSortFilterProxyModel *m_proxyModel;
Utils::TreeItem *m_customFilterRoot;
QList<ILocatorFilter *> m_filters; QList<ILocatorFilter *> m_filters;
QList<ILocatorFilter *> m_addedFilters; QList<ILocatorFilter *> m_addedFilters;
QList<ILocatorFilter *> m_removedFilters; QList<ILocatorFilter *> m_removedFilters;

View File

@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>367</width> <width>411</width>
<height>242</height> <height>287</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -15,13 +15,12 @@
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QListWidget" name="filterList"> <widget class="Utils::FancyLineEdit" name="filterEdit"/>
<property name="font">
<font/>
</property>
</widget>
</item> </item>
<item row="0" column="1"> <item row="1" column="0">
<widget class="Utils::TreeView" name="filterList"/>
</item>
<item row="1" column="1">
<layout class="QVBoxLayout"> <layout class="QVBoxLayout">
<item> <item>
<widget class="QPushButton" name="addButton"> <widget class="QPushButton" name="addButton">
@@ -65,7 +64,7 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="0" colspan="2"> <item row="2" column="0" colspan="2">
<layout class="QHBoxLayout"> <layout class="QHBoxLayout">
<item> <item>
<widget class="QLabel" name="refreshIntervalLabel"> <widget class="QLabel" name="refreshIntervalLabel">
@@ -116,6 +115,18 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>Utils::TreeView</class>
<extends>QTreeView</extends>
<header location="global">utils/itemviews.h</header>
</customwidget>
<customwidget>
<class>Utils::FancyLineEdit</class>
<extends>QLineEdit</extends>
<header location="global">utils/fancylineedit.h</header>
</customwidget>
</customwidgets>
<resources/> <resources/>
<connections/> <connections/>
</ui> </ui>

View File

@@ -41,8 +41,13 @@ RemoteFilterOptions::RemoteFilterOptions(RemoteHelpFilter *filter, QWidget *pare
, m_filter(filter) , m_filter(filter)
{ {
m_ui.setupUi(this); m_ui.setupUi(this);
setWindowTitle(Core::ILocatorFilter::msgConfigureDialogTitle());
m_ui.prefixLabel->setText(Core::ILocatorFilter::msgPrefixLabel());
m_ui.prefixLabel->setToolTip(Core::ILocatorFilter::msgPrefixToolTip());
m_ui.includeByDefault->setText(Core::ILocatorFilter::msgIncludeByDefault());
m_ui.includeByDefault->setToolTip(Core::ILocatorFilter::msgIncludeByDefaultToolTip());
m_ui.shortcutEdit->setText(m_filter->shortcutString()); m_ui.shortcutEdit->setText(m_filter->shortcutString());
m_ui.limitCheck->setChecked(!m_filter->isIncludedByDefault()); m_ui.includeByDefault->setChecked(m_filter->isIncludedByDefault());
foreach (const QString &url, m_filter->remoteUrls()) { foreach (const QString &url, m_filter->remoteUrls()) {
QListWidgetItem *item = new QListWidgetItem(url); QListWidgetItem *item = new QListWidgetItem(url);
m_ui.listWidget->addItem(item); m_ui.listWidget->addItem(item);
@@ -162,7 +167,7 @@ bool RemoteHelpFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (optionsDialog.exec() == QDialog::Accepted) { if (optionsDialog.exec() == QDialog::Accepted) {
QMutexLocker lock(&m_mutex); Q_UNUSED(lock) QMutexLocker lock(&m_mutex); Q_UNUSED(lock)
m_remoteUrls.clear(); m_remoteUrls.clear();
setIncludedByDefault(!optionsDialog.m_ui.limitCheck->isChecked()); setIncludedByDefault(optionsDialog.m_ui.includeByDefault->isChecked());
setShortcutString(optionsDialog.m_ui.shortcutEdit->text().trimmed()); setShortcutString(optionsDialog.m_ui.shortcutEdit->text().trimmed());
for (int i = 0; i < optionsDialog.m_ui.listWidget->count(); ++i) for (int i = 0; i < optionsDialog.m_ui.listWidget->count(); ++i)
m_remoteUrls.append(optionsDialog.m_ui.listWidget->item(i)->text()); m_remoteUrls.append(optionsDialog.m_ui.listWidget->item(i)->text());

View File

@@ -6,18 +6,18 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>340</width> <width>342</width>
<height>179</height> <height>182</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Edit Filter Configuration</string> <string notr="true">Filter Configuration</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="prefixLabel">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred"> <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -25,7 +25,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Prefix:</string> <string notr="true">Prefix:</string>
</property> </property>
<property name="buddy"> <property name="buddy">
<cstring>shortcutEdit</cstring> <cstring>shortcutEdit</cstring>
@@ -43,7 +43,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QCheckBox" name="limitCheck"> <widget class="QCheckBox" name="includeByDefault">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred"> <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -51,7 +51,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Limit to prefix</string> <string notr="true">Include by default</string>
</property> </property>
</widget> </widget>
</item> </item>