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:
Eike Ziller
2016-11-18 10:43:05 +01:00
parent 224fda31df
commit 62a842e447
3 changed files with 33 additions and 49 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);