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 "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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user