summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@theqtcompany.com>2015-06-08 16:48:24 +0200
committerEike Ziller <eike.ziller@theqtcompany.com>2015-06-12 09:49:58 +0000
commitee488785bf2843d38092d083b509782e77a8ce22 (patch)
tree0db23daf13f709d0ec1052c8e4a16449d32cb539
parent0046562391fac5c2b22b4d46beee5a9261200041 (diff)
downloadqt-creator-ee488785bf2843d38092d083b509782e77a8ce22.tar.gz
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>
-rw-r--r--src/plugins/coreplugin/locator/directoryfilter.cpp11
-rw-r--r--src/plugins/coreplugin/locator/directoryfilter.ui6
-rw-r--r--src/plugins/coreplugin/locator/filesystemfilter.cpp11
-rw-r--r--src/plugins/coreplugin/locator/filesystemfilter.ui10
-rw-r--r--src/plugins/coreplugin/locator/ilocatorfilter.cpp43
-rw-r--r--src/plugins/coreplugin/locator/ilocatorfilter.h10
-rw-r--r--src/plugins/coreplugin/locator/locatorsettingspage.cpp241
-rw-r--r--src/plugins/coreplugin/locator/locatorsettingspage.h16
-rw-r--r--src/plugins/coreplugin/locator/locatorsettingspage.ui29
-rw-r--r--src/plugins/help/remotehelpfilter.cpp9
-rw-r--r--src/plugins/help/remotehelpfilter.ui14
11 files changed, 318 insertions, 82 deletions
diff --git a/src/plugins/coreplugin/locator/directoryfilter.cpp b/src/plugins/coreplugin/locator/directoryfilter.cpp
index a9b2accfdd..bce79a6389 100644
--- a/src/plugins/coreplugin/locator/directoryfilter.cpp
+++ b/src/plugins/coreplugin/locator/directoryfilter.cpp
@@ -30,6 +30,7 @@
#include "directoryfilter.h"
+#include <coreplugin/coreconstants.h>
#include <utils/filesearch.h>
#include <QFileDialog>
@@ -95,7 +96,11 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
QDialog dialog(parent);
m_dialog = &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,
this, &DirectoryFilter::addDirectory, Qt::DirectConnection);
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.fileTypeEdit->setText(m_filters.join(QLatin1Char(',')));
m_ui.shortcutEdit->setText(shortcutString());
- m_ui.defaultFlag->setChecked(!isIncludedByDefault());
+ m_ui.defaultFlag->setChecked(isIncludedByDefault());
updateOptionButtons();
if (dialog.exec() == QDialog::Accepted) {
QMutexLocker locker(&m_lock);
@@ -130,7 +135,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
}
m_filters = m_ui.fileTypeEdit->text().trimmed().split(QLatin1Char(','));
setShortcutString(m_ui.shortcutEdit->text().trimmed());
- setIncludedByDefault(!m_ui.defaultFlag->isChecked());
+ setIncludedByDefault(m_ui.defaultFlag->isChecked());
if (directoriesChanged || oldFilters != m_filters)
needsRefresh = true;
success = true;
diff --git a/src/plugins/coreplugin/locator/directoryfilter.ui b/src/plugins/coreplugin/locator/directoryfilter.ui
index 65973d0f16..496cf3c30d 100644
--- a/src/plugins/coreplugin/locator/directoryfilter.ui
+++ b/src/plugins/coreplugin/locator/directoryfilter.ui
@@ -38,9 +38,9 @@
</widget>
</item>
<item row="3" column="0">
- <widget class="QLabel" name="label_4">
+ <widget class="QLabel" name="prefixLabel">
<property name="text">
- <string>Prefix:</string>
+ <string notr="true">Prefix:</string>
</property>
</widget>
</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">
<widget class="QCheckBox" name="defaultFlag">
<property name="text">
- <string>Limit to prefix</string>
+ <string notr="true">Include by default</string>
</property>
<property name="checked">
<bool>false</bool>
diff --git a/src/plugins/coreplugin/locator/filesystemfilter.cpp b/src/plugins/coreplugin/locator/filesystemfilter.cpp
index 51c79beaf2..22144f51a1 100644
--- a/src/plugins/coreplugin/locator/filesystemfilter.cpp
+++ b/src/plugins/coreplugin/locator/filesystemfilter.cpp
@@ -30,6 +30,7 @@
#include "filesystemfilter.h"
#include "locatorwidget.h"
+#include <coreplugin/coreconstants.h>
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/idocument.h>
@@ -171,15 +172,19 @@ bool FileSystemFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
Ui::FileSystemFilterOptions ui;
QDialog dialog(parent);
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.limitCheck->setChecked(!isIncludedByDefault());
+ ui.includeByDefault->setChecked(isIncludedByDefault());
ui.shortcutEdit->setText(shortcutString());
if (dialog.exec() == QDialog::Accepted) {
m_includeHidden = ui.hiddenFilesFlag->isChecked();
setShortcutString(ui.shortcutEdit->text().trimmed());
- setIncludedByDefault(!ui.limitCheck->isChecked());
+ setIncludedByDefault(ui.includeByDefault->isChecked());
return true;
}
return false;
diff --git a/src/plugins/coreplugin/locator/filesystemfilter.ui b/src/plugins/coreplugin/locator/filesystemfilter.ui
index b6a8944c70..d58f79d943 100644
--- a/src/plugins/coreplugin/locator/filesystemfilter.ui
+++ b/src/plugins/coreplugin/locator/filesystemfilter.ui
@@ -11,13 +11,13 @@
</rect>
</property>
<property name="windowTitle">
- <string>Add Filter Configuration</string>
+ <string notr="true">Filter Configuration</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
- <widget class="QLabel" name="label">
+ <widget class="QLabel" name="prefixLabel">
<property name="text">
- <string>Prefix:</string>
+ <string notr="true">Prefix:</string>
</property>
<property name="buddy">
<cstring>shortcutEdit</cstring>
@@ -28,9 +28,9 @@
<widget class="QLineEdit" name="shortcutEdit"/>
</item>
<item row="1" column="2">
- <widget class="QCheckBox" name="limitCheck">
+ <widget class="QCheckBox" name="includeByDefault">
<property name="text">
- <string>Limit to prefix</string>
+ <string notr="true">Include by default</string>
</property>
</widget>
</item>
diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.cpp b/src/plugins/coreplugin/locator/ilocatorfilter.cpp
index ae93a8afb9..9ba022bb8a 100644
--- a/src/plugins/coreplugin/locator/ilocatorfilter.cpp
+++ b/src/plugins/coreplugin/locator/ilocatorfilter.cpp
@@ -30,8 +30,11 @@
#include "ilocatorfilter.h"
+#include <coreplugin/coreconstants.h>
+
#include <QBoxLayout>
#include <QCheckBox>
+#include <QCoreApplication>
#include <QDialog>
#include <QDialogButtonBox>
#include <QLabel>
@@ -92,17 +95,20 @@ bool ILocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
Q_UNUSED(needsRefresh)
QDialog dialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint);
- dialog.setWindowTitle(tr("Filter Configuration"));
+ dialog.setWindowTitle(msgConfigureDialogTitle());
QVBoxLayout *vlayout = new QVBoxLayout(&dialog);
QHBoxLayout *hlayout = new QHBoxLayout;
QLineEdit *shortcutEdit = new QLineEdit(shortcutString());
- QCheckBox *limitCheck = new QCheckBox(tr("Limit to prefix"));
- limitCheck->setChecked(!isIncludedByDefault());
+ QCheckBox *includeByDefault = new QCheckBox(msgIncludeByDefault());
+ 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(limitCheck);
+ hlayout->addWidget(includeByDefault);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok |
QDialogButtonBox::Cancel);
@@ -115,7 +121,7 @@ bool ILocatorFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (dialog.exec() == QDialog::Accepted) {
setShortcutString(shortcutEdit->text().trimmed());
- setIncludedByDefault(!limitCheck->isChecked());
+ setIncludedByDefault(includeByDefault->isChecked());
return true;
}
@@ -143,6 +149,31 @@ Qt::CaseSensitivity ILocatorFilter::caseSensitivity(const QString &str)
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
{
return m_isConfigurable;
diff --git a/src/plugins/coreplugin/locator/ilocatorfilter.h b/src/plugins/coreplugin/locator/ilocatorfilter.h
index 4919715ed0..d049db3ac0 100644
--- a/src/plugins/coreplugin/locator/ilocatorfilter.h
+++ b/src/plugins/coreplugin/locator/ilocatorfilter.h
@@ -100,6 +100,7 @@ public:
/* String to type to use this filter exclusively. */
QString shortcutString() const;
+ void setShortcutString(const QString &shortcut);
/* 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
@@ -135,6 +136,7 @@ public:
/* Is this filter used also when the shortcutString is not used? */
bool isIncludedByDefault() const;
+ void setIncludedByDefault(bool includedByDefault);
/* Returns whether the filter should be hidden from configuration and menus. */
bool isHidden() const;
@@ -145,13 +147,17 @@ public:
static QString trimWildcards(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:
/* Enable or disable the filter. */
void setEnabled(bool enabled);
protected:
- void setShortcutString(const QString &shortcut);
- void setIncludedByDefault(bool includedByDefault);
void setHidden(bool hidden);
void setId(Id id);
void setPriority(Priority priority);
diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.cpp b/src/plugins/coreplugin/locator/locatorsettingspage.cpp
index 7e09f700dc..ce43568cdc 100644
--- a/src/plugins/coreplugin/locator/locatorsettingspage.cpp
+++ b/src/plugins/coreplugin/locator/locatorsettingspage.cpp
@@ -36,15 +36,133 @@
#include "directoryfilter.h"
#include <coreplugin/coreconstants.h>
+#include <utils/categorysortfiltermodel.h>
+#include <utils/headerviewstretcher.h>
#include <utils/qtcassert.h>
+#include <utils/treemodel.h>
#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::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)
: m_plugin(plugin), m_widget(0)
{
@@ -58,25 +176,49 @@ LocatorSettingsPage::LocatorSettingsPage(Locator *plugin)
QWidget *LocatorSettingsPage::widget()
{
if (!m_widget) {
+ m_filters = m_plugin->filters();
+ m_customFilters = m_plugin->customFilters();
+
m_widget = new QWidget;
m_ui.setupUi(m_widget);
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);
- connect(m_ui.filterList, SIGNAL(itemActivated(QListWidgetItem*)),
- this, SLOT(configureFilter(QListWidgetItem*)));
- connect(m_ui.editButton, SIGNAL(clicked()),
- this, SLOT(configureFilter()));
+ connect(m_ui.filterList, &Utils::TreeView::activated,
+ this, &LocatorSettingsPage::configureFilter);
+ connect(m_ui.editButton, &QPushButton::clicked,
+ this, [this]() { configureFilter(m_ui.filterList->currentIndex()); });
connect(m_ui.addButton, &QPushButton::clicked,
this, &LocatorSettingsPage::addCustomFilter);
connect(m_ui.removeButton, &QPushButton::clicked,
this, &LocatorSettingsPage::removeCustomFilter);
m_ui.refreshInterval->setValue(m_plugin->refreshInterval());
- m_filters = m_plugin->filters();
- m_customFilters = m_plugin->customFilters();
saveFilterStates();
- updateFilterList();
}
return m_widget;
}
@@ -121,6 +263,12 @@ void LocatorSettingsPage::requestRefresh()
m_plugin->refresh(m_refreshFilters);
}
+void LocatorSettingsPage::setFilter(const QString &text)
+{
+ m_proxyModel->setFilterFixedString(text);
+ m_ui.filterList->expandAll();
+}
+
void LocatorSettingsPage::saveFilterStates()
{
m_filterStates.clear();
@@ -134,49 +282,60 @@ void LocatorSettingsPage::restoreFilterStates()
filter->restoreState(m_filterStates.value(filter));
}
-void LocatorSettingsPage::updateFilterList()
+void LocatorSettingsPage::initializeModel()
{
- m_ui.filterList->clear();
- foreach (ILocatorFilter *filter, m_filters) {
- if (filter->isHidden())
- continue;
+ m_model->setHeader(QStringList({ tr("Name"), tr("Prefix"), tr("Default") }));
+ m_model->setHeaderToolTip(QStringList({
+ QString(),
+ 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;
- if (filter->isIncludedByDefault())
- 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);
+ m_model->rootItem()->appendChild(builtIn);
+ m_model->rootItem()->appendChild(m_customFilterRoot);
}
void LocatorSettingsPage::updateButtonStates()
{
- QListWidgetItem *item = m_ui.filterList->currentItem();
- ILocatorFilter *filter = (item ? item->data(Qt::UserRole).value<ILocatorFilter *>() : 0);
+ const QModelIndex currentIndex = m_proxyModel->mapToSource(m_ui.filterList->currentIndex());
+ 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.removeButton->setEnabled(filter && m_customFilters.contains(filter));
}
-void LocatorSettingsPage::configureFilter(QListWidgetItem *item)
+void LocatorSettingsPage::configureFilter(const QModelIndex &proxyIndex)
{
- if (!item)
- item = m_ui.filterList->currentItem();
+ const QModelIndex index = m_proxyModel->mapToSource(proxyIndex);
+ QTC_ASSERT(index.isValid(), return);
+ auto item = dynamic_cast<FilterItem *>(m_model->itemForIndex(index));
QTC_ASSERT(item, return);
- ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>();
- QTC_ASSERT(filter, return);
-
- if (!filter->isConfigurable())
- return;
+ ILocatorFilter *filter = item->filter();
+ QTC_ASSERT(filter->isConfigurable(), return);
+ bool includedByDefault = filter->isIncludedByDefault();
+ QString shortcutString = filter->shortcutString();
bool needsRefresh = false;
filter->openConfigDialog(m_widget, needsRefresh);
if (needsRefresh && !m_refreshFilters.contains(filter))
m_refreshFilters.append(filter);
- updateFilterList();
+ if (filter->isIncludedByDefault() != includedByDefault)
+ item->updateColumn(FilterIncludedByDefault);
+ if (filter->shortcutString() != shortcutString)
+ item->updateColumn(FilterPrefix);
}
void LocatorSettingsPage::addCustomFilter()
@@ -189,16 +348,19 @@ void LocatorSettingsPage::addCustomFilter()
m_addedFilters.append(filter);
m_customFilters.append(filter);
m_refreshFilters.append(filter);
- updateFilterList();
+ m_customFilterRoot->appendChild(new FilterItem(filter));
}
}
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);
- ILocatorFilter *filter = item->data(Qt::UserRole).value<ILocatorFilter *>();
+ ILocatorFilter *filter = item->filter();
QTC_ASSERT(m_customFilters.contains(filter), return);
+ delete m_model->takeItem(item);
m_filters.removeAll(filter);
m_customFilters.removeAll(filter);
m_refreshFilters.removeAll(filter);
@@ -208,5 +370,4 @@ void LocatorSettingsPage::removeCustomFilter()
} else {
m_removedFilters.append(filter);
}
- updateFilterList();
}
diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.h b/src/plugins/coreplugin/locator/locatorsettingspage.h
index fa3a5fdb41..5502e24967 100644
--- a/src/plugins/coreplugin/locator/locatorsettingspage.h
+++ b/src/plugins/coreplugin/locator/locatorsettingspage.h
@@ -40,8 +40,16 @@
QT_BEGIN_NAMESPACE
class QListWidgetItem;
+class QSortFilterProxyModel;
QT_END_NAMESPACE
+namespace Utils {
+
+class TreeModel;
+class TreeItem;
+
+} // Utils
+
namespace Core {
class ILocatorFilter;
@@ -63,19 +71,23 @@ public:
private slots:
void updateButtonStates();
- void configureFilter(QListWidgetItem *item = 0);
+ void configureFilter(const QModelIndex &proxyIndex);
void addCustomFilter();
void removeCustomFilter();
private:
- void updateFilterList();
+ void initializeModel();
void saveFilterStates();
void restoreFilterStates();
void requestRefresh();
+ void setFilter(const QString &text);
Ui::LocatorSettingsWidget m_ui;
Locator *m_plugin;
QPointer<QWidget> m_widget;
+ Utils::TreeModel *m_model;
+ QSortFilterProxyModel *m_proxyModel;
+ Utils::TreeItem *m_customFilterRoot;
QList<ILocatorFilter *> m_filters;
QList<ILocatorFilter *> m_addedFilters;
QList<ILocatorFilter *> m_removedFilters;
diff --git a/src/plugins/coreplugin/locator/locatorsettingspage.ui b/src/plugins/coreplugin/locator/locatorsettingspage.ui
index e8590f61da..b5fbd3d6c4 100644
--- a/src/plugins/coreplugin/locator/locatorsettingspage.ui
+++ b/src/plugins/coreplugin/locator/locatorsettingspage.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>367</width>
- <height>242</height>
+ <width>411</width>
+ <height>287</height>
</rect>
</property>
<property name="windowTitle">
@@ -15,13 +15,12 @@
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
- <widget class="QListWidget" name="filterList">
- <property name="font">
- <font/>
- </property>
- </widget>
+ <widget class="Utils::FancyLineEdit" name="filterEdit"/>
</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">
<item>
<widget class="QPushButton" name="addButton">
@@ -65,7 +64,7 @@
</item>
</layout>
</item>
- <item row="1" column="0" colspan="2">
+ <item row="2" column="0" colspan="2">
<layout class="QHBoxLayout">
<item>
<widget class="QLabel" name="refreshIntervalLabel">
@@ -116,6 +115,18 @@
</item>
</layout>
</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/>
<connections/>
</ui>
diff --git a/src/plugins/help/remotehelpfilter.cpp b/src/plugins/help/remotehelpfilter.cpp
index c6b64119a7..a9ab238c8a 100644
--- a/src/plugins/help/remotehelpfilter.cpp
+++ b/src/plugins/help/remotehelpfilter.cpp
@@ -41,8 +41,13 @@ RemoteFilterOptions::RemoteFilterOptions(RemoteHelpFilter *filter, QWidget *pare
, m_filter(filter)
{
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.limitCheck->setChecked(!m_filter->isIncludedByDefault());
+ m_ui.includeByDefault->setChecked(m_filter->isIncludedByDefault());
foreach (const QString &url, m_filter->remoteUrls()) {
QListWidgetItem *item = new QListWidgetItem(url);
m_ui.listWidget->addItem(item);
@@ -162,7 +167,7 @@ bool RemoteHelpFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (optionsDialog.exec() == QDialog::Accepted) {
QMutexLocker lock(&m_mutex); Q_UNUSED(lock)
m_remoteUrls.clear();
- setIncludedByDefault(!optionsDialog.m_ui.limitCheck->isChecked());
+ setIncludedByDefault(optionsDialog.m_ui.includeByDefault->isChecked());
setShortcutString(optionsDialog.m_ui.shortcutEdit->text().trimmed());
for (int i = 0; i < optionsDialog.m_ui.listWidget->count(); ++i)
m_remoteUrls.append(optionsDialog.m_ui.listWidget->item(i)->text());
diff --git a/src/plugins/help/remotehelpfilter.ui b/src/plugins/help/remotehelpfilter.ui
index 6d8011ff2c..55f1f4de38 100644
--- a/src/plugins/help/remotehelpfilter.ui
+++ b/src/plugins/help/remotehelpfilter.ui
@@ -6,18 +6,18 @@
<rect>
<x>0</x>
<y>0</y>
- <width>340</width>
- <height>179</height>
+ <width>342</width>
+ <height>182</height>
</rect>
</property>
<property name="windowTitle">
- <string>Edit Filter Configuration</string>
+ <string notr="true">Filter Configuration</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="QLabel" name="label">
+ <widget class="QLabel" name="prefixLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -25,7 +25,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>Prefix:</string>
+ <string notr="true">Prefix:</string>
</property>
<property name="buddy">
<cstring>shortcutEdit</cstring>
@@ -43,7 +43,7 @@
</widget>
</item>
<item>
- <widget class="QCheckBox" name="limitCheck">
+ <widget class="QCheckBox" name="includeByDefault">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -51,7 +51,7 @@
</sizepolicy>
</property>
<property name="text">
- <string>Limit to prefix</string>
+ <string notr="true">Include by default</string>
</property>
</widget>
</item>