forked from qt-creator/qt-creator
Find: Reduce indirections and bookkeeping
Get rid of the separate filter -> action map, some utility functions, and action user data by utilizing lambda captures. Change-Id: I1eb8969440fdfedfee96a9f9e046c1436d02d64f Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -75,9 +75,7 @@ class FindPrivate : public QObject
|
|||||||
Q_DECLARE_TR_FUNCTIONS(Core::Find)
|
Q_DECLARE_TR_FUNCTIONS(Core::Find)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void filterChanged(IFindFilter *changedFilter);
|
bool isAnyFilterEnabled() const;
|
||||||
void displayNameChanged(IFindFilter *changedFilter);
|
|
||||||
void openFindFilter(QAction *action);
|
|
||||||
void writeSettings();
|
void writeSettings();
|
||||||
void setFindFlag(Core::FindFlag flag, bool enabled);
|
void setFindFlag(Core::FindFlag flag, bool enabled);
|
||||||
void updateCompletion(const QString &text, QStringList &completions, QStringListModel *model);
|
void updateCompletion(const QString &text, QStringList &completions, QStringListModel *model);
|
||||||
@@ -85,8 +83,6 @@ public:
|
|||||||
void setupFilterMenuItems();
|
void setupFilterMenuItems();
|
||||||
void readSettings();
|
void readSettings();
|
||||||
|
|
||||||
QHash<IFindFilter *, QAction *> m_filterActions;
|
|
||||||
|
|
||||||
Internal::CurrentDocumentFind *m_currentDocumentFind = 0;
|
Internal::CurrentDocumentFind *m_currentDocumentFind = 0;
|
||||||
Internal::FindToolBar *m_findToolBar = 0;
|
Internal::FindToolBar *m_findToolBar = 0;
|
||||||
Internal::FindToolWindow *m_findDialog = 0;
|
Internal::FindToolWindow *m_findDialog = 0;
|
||||||
@@ -154,36 +150,9 @@ void Find::aboutToShutdown()
|
|||||||
d->m_currentDocumentFind->removeConnections();
|
d->m_currentDocumentFind->removeConnections();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindPrivate::filterChanged(IFindFilter *changedFilter)
|
bool FindPrivate::isAnyFilterEnabled() const
|
||||||
{
|
{
|
||||||
QAction *action = d->m_filterActions.value(changedFilter);
|
return Utils::anyOf(m_findDialog->findFilters(), &IFindFilter::isEnabled);
|
||||||
QTC_ASSERT(changedFilter, return);
|
|
||||||
QTC_ASSERT(action, return);
|
|
||||||
action->setEnabled(changedFilter->isEnabled());
|
|
||||||
bool haveEnabledFilters = false;
|
|
||||||
foreach (const IFindFilter *filter, d->m_filterActions.keys()) {
|
|
||||||
if (filter->isEnabled()) {
|
|
||||||
haveEnabledFilters = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d->m_openFindDialog->setEnabled(haveEnabledFilters);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FindPrivate::displayNameChanged(IFindFilter *changedFilter)
|
|
||||||
{
|
|
||||||
QAction *action = d->m_filterActions.value(changedFilter);
|
|
||||||
QTC_ASSERT(changedFilter, return);
|
|
||||||
QTC_ASSERT(action, return);
|
|
||||||
action->setText(QLatin1String(" ") + changedFilter->displayName());
|
|
||||||
d->m_findDialog->updateFindFilterNames();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FindPrivate::openFindFilter(QAction *action)
|
|
||||||
{
|
|
||||||
QTC_ASSERT(action, return);
|
|
||||||
IFindFilter *filter = action->data().value<IFindFilter *>();
|
|
||||||
Find::openFindDialog(filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Find::openFindDialog(IFindFilter *filter)
|
void Find::openFindDialog(IFindFilter *filter)
|
||||||
@@ -221,7 +190,12 @@ void FindPrivate::setupMenu()
|
|||||||
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F")));
|
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F")));
|
||||||
mfindadvanced->addAction(cmd);
|
mfindadvanced->addAction(cmd);
|
||||||
connect(m_openFindDialog, &QAction::triggered,
|
connect(m_openFindDialog, &QAction::triggered,
|
||||||
this, [this] { openFindFilter(m_openFindDialog); });
|
this, [this] { Find::openFindDialog(nullptr); });
|
||||||
|
}
|
||||||
|
|
||||||
|
static QString filterActionName(const IFindFilter *filter)
|
||||||
|
{
|
||||||
|
return QLatin1String(" ") + filter->displayName();
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindPrivate::setupFilterMenuItems()
|
void FindPrivate::setupFilterMenuItems()
|
||||||
@@ -230,26 +204,28 @@ void FindPrivate::setupFilterMenuItems()
|
|||||||
Command *cmd;
|
Command *cmd;
|
||||||
|
|
||||||
ActionContainer *mfindadvanced = ActionManager::actionContainer(Constants::M_FIND_ADVANCED);
|
ActionContainer *mfindadvanced = ActionManager::actionContainer(Constants::M_FIND_ADVANCED);
|
||||||
d->m_filterActions.clear();
|
|
||||||
bool haveEnabledFilters = false;
|
bool haveEnabledFilters = false;
|
||||||
const Id base("FindFilter.");
|
const Id base("FindFilter.");
|
||||||
QList<IFindFilter *> sortedFilters = findInterfaces;
|
QList<IFindFilter *> sortedFilters = findInterfaces;
|
||||||
Utils::sort(sortedFilters, &IFindFilter::displayName);
|
Utils::sort(sortedFilters, &IFindFilter::displayName);
|
||||||
foreach (IFindFilter *filter, sortedFilters) {
|
foreach (IFindFilter *filter, sortedFilters) {
|
||||||
QAction *action = new QAction(QLatin1String(" ") + filter->displayName(), this);
|
QAction *action = new QAction(filterActionName(filter), this);
|
||||||
bool isEnabled = filter->isEnabled();
|
bool isEnabled = filter->isEnabled();
|
||||||
if (isEnabled)
|
if (isEnabled)
|
||||||
haveEnabledFilters = true;
|
haveEnabledFilters = true;
|
||||||
action->setEnabled(isEnabled);
|
action->setEnabled(isEnabled);
|
||||||
action->setData(qVariantFromValue(filter));
|
|
||||||
cmd = ActionManager::registerAction(action, base.withSuffix(filter->id()));
|
cmd = ActionManager::registerAction(action, base.withSuffix(filter->id()));
|
||||||
cmd->setDefaultKeySequence(filter->defaultShortcut());
|
cmd->setDefaultKeySequence(filter->defaultShortcut());
|
||||||
cmd->setAttribute(Command::CA_UpdateText);
|
cmd->setAttribute(Command::CA_UpdateText);
|
||||||
mfindadvanced->addAction(cmd);
|
mfindadvanced->addAction(cmd);
|
||||||
d->m_filterActions.insert(filter, action);
|
connect(action, &QAction::triggered,
|
||||||
connect(action, &QAction::triggered, this, [action] { d->openFindFilter(action); });
|
this, [filter, action] { Find::openFindDialog(filter); });
|
||||||
connect(filter, &IFindFilter::enabledChanged, this, [filter] { d->filterChanged(filter); });
|
connect(filter, &IFindFilter::enabledChanged, this, [filter, action] {
|
||||||
connect(filter, &IFindFilter::displayNameChanged, this, [filter] { d->displayNameChanged(filter); });
|
action->setEnabled(filter->isEnabled());
|
||||||
|
d->m_openFindDialog->setEnabled(d->isAnyFilterEnabled());
|
||||||
|
});
|
||||||
|
connect(filter, &IFindFilter::displayNameChanged,
|
||||||
|
this, [filter, action] { action->setText(filterActionName(filter)); });
|
||||||
}
|
}
|
||||||
d->m_findDialog->setFindFilters(sortedFilters);
|
d->m_findDialog->setFindFilters(sortedFilters);
|
||||||
d->m_openFindDialog->setEnabled(haveEnabledFilters);
|
d->m_openFindDialog->setEnabled(haveEnabledFilters);
|
||||||
|
@@ -144,25 +144,32 @@ void FindToolWindow::setFindFilters(const QList<IFindFilter *> &filters)
|
|||||||
{
|
{
|
||||||
qDeleteAll(m_configWidgets);
|
qDeleteAll(m_configWidgets);
|
||||||
m_configWidgets.clear();
|
m_configWidgets.clear();
|
||||||
|
foreach (IFindFilter *filter, m_filters)
|
||||||
|
filter->disconnect(this);
|
||||||
m_filters = filters;
|
m_filters = filters;
|
||||||
m_ui.filterList->clear();
|
m_ui.filterList->clear();
|
||||||
QStringList names;
|
QStringList names;
|
||||||
foreach (IFindFilter *filter, filters) {
|
foreach (IFindFilter *filter, filters) {
|
||||||
names << filter->displayName();
|
names << filter->displayName();
|
||||||
m_configWidgets.append(filter->createConfigWidget());
|
m_configWidgets.append(filter->createConfigWidget());
|
||||||
|
connect(filter, &IFindFilter::displayNameChanged,
|
||||||
|
this, [this, filter]() { updateFindFilterName(filter); });
|
||||||
}
|
}
|
||||||
m_ui.filterList->addItems(names);
|
m_ui.filterList->addItems(names);
|
||||||
if (m_filters.size() > 0)
|
if (m_filters.size() > 0)
|
||||||
setCurrentFilter(0);
|
setCurrentFilter(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindToolWindow::updateFindFilterNames()
|
QList<IFindFilter *> FindToolWindow::findFilters() const
|
||||||
{
|
{
|
||||||
int currentIndex = m_ui.filterList->currentIndex();
|
return m_filters;
|
||||||
m_ui.filterList->clear();
|
}
|
||||||
QStringList names = Utils::transform(m_filters, &IFindFilter::displayName);
|
|
||||||
m_ui.filterList->addItems(names);
|
void FindToolWindow::updateFindFilterName(IFindFilter *filter)
|
||||||
m_ui.filterList->setCurrentIndex(currentIndex);
|
{
|
||||||
|
int index = m_filters.indexOf(filter);
|
||||||
|
if (QTC_GUARD(index >= 0))
|
||||||
|
m_ui.filterList->setItemText(index, filter->displayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FindToolWindow::setFindText(const QString &text)
|
void FindToolWindow::setFindText(const QString &text)
|
||||||
|
@@ -47,12 +47,12 @@ public:
|
|||||||
static FindToolWindow *instance();
|
static FindToolWindow *instance();
|
||||||
|
|
||||||
void setFindFilters(const QList<IFindFilter *> &filters);
|
void setFindFilters(const QList<IFindFilter *> &filters);
|
||||||
|
QList<IFindFilter *> findFilters() const;
|
||||||
|
|
||||||
void setFindText(const QString &text);
|
void setFindText(const QString &text);
|
||||||
void setCurrentFilter(IFindFilter *filter);
|
void setCurrentFilter(IFindFilter *filter);
|
||||||
void readSettings();
|
void readSettings();
|
||||||
void writeSettings();
|
void writeSettings();
|
||||||
void updateFindFilterNames();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool event(QEvent *event);
|
bool event(QEvent *event);
|
||||||
@@ -64,6 +64,7 @@ private:
|
|||||||
void setCurrentFilter(int index);
|
void setCurrentFilter(int index);
|
||||||
void updateButtonStates();
|
void updateButtonStates();
|
||||||
void updateFindFlags();
|
void updateFindFlags();
|
||||||
|
void updateFindFilterName(IFindFilter *filter);
|
||||||
|
|
||||||
void acceptAndGetParameters(QString *term, IFindFilter **filter);
|
void acceptAndGetParameters(QString *term, IFindFilter **filter);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user