diff options
author | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-06-08 16:48:24 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@theqtcompany.com> | 2015-06-12 09:49:58 +0000 |
commit | ee488785bf2843d38092d083b509782e77a8ce22 (patch) | |
tree | 0db23daf13f709d0ec1052c8e4a16449d32cb539 | |
parent | 0046562391fac5c2b22b4d46beee5a9261200041 (diff) | |
download | qt-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.cpp | 11 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/directoryfilter.ui | 6 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/filesystemfilter.cpp | 11 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/filesystemfilter.ui | 10 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/ilocatorfilter.cpp | 43 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/ilocatorfilter.h | 10 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/locatorsettingspage.cpp | 241 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/locatorsettingspage.h | 16 | ||||
-rw-r--r-- | src/plugins/coreplugin/locator/locatorsettingspage.ui | 29 | ||||
-rw-r--r-- | src/plugins/help/remotehelpfilter.cpp | 9 | ||||
-rw-r--r-- | src/plugins/help/remotehelpfilter.ui | 14 |
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> |