forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
@@ -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>
|
||||
|
@@ -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;
|
||||
|
@@ -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>
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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>
|
||||
|
@@ -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());
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user