ui: improvements proposed by Julian Mautner

* automatically expand active class
* increase arrow size
* return child nodes in autocompletions
* always return filters in autocompletions
This commit is contained in:
Eberhard Graether
2015-01-12 23:47:57 +01:00
parent 8242454104
commit 7596c699d6
13 changed files with 103 additions and 55 deletions
+7 -12
View File
@@ -474,11 +474,8 @@ std::vector<SearchMatch> Storage::getAutocompletionMatches(
tokenResults = m_tokenIndex.runFuzzySearch(word);
}
if (word.size())
{
SearchResults filterResults = m_filterIndex.runFuzzySearch(word);
tokenResults.insert(filterResults.begin(), filterResults.end());
}
SearchResults filterResults = m_filterIndex.runFuzzySearch(word);
tokenResults.insert(filterResults.begin(), filterResults.end());
std::vector<SearchMatch> matches = SearchIndex::getMatches(tokenResults, word);
SearchMatch::log(matches, word);
@@ -904,7 +901,6 @@ bool Storage::getSubQuerySearchResults(
SearchResults* results
) const {
std::string q = query;
bool returnChilds = false;
if (QueryOperator::getOperatorType(q.back()) == QueryOperator::OPERATOR_SUB)
{
@@ -913,7 +909,6 @@ bool Storage::getSubQuerySearchResults(
else if (QueryOperator::getOperatorType(q.back()) == QueryOperator::OPERATOR_HAS)
{
q.pop_back();
returnChilds = true;
}
else if (QueryOperator::getOperatorType(q.back()) != QueryOperator::OPERATOR_NONE)
{
@@ -946,19 +941,19 @@ bool Storage::getSubQuerySearchResults(
{
if (word.size())
{
SearchResults res = node->runFuzzySearch(word, returnChilds);
SearchResults res = node->runFuzzySearch(word);
results->insert(res.begin(), res.end());
}
else if (returnChilds)
else if (searchNodes.size() == 1)
{
for (const std::shared_ptr<SearchNode>& child : node->getChildren())
{
results->insert(SearchResult(0, child.get(), child.get()));
child->addResultsRecursive(*results, 0, child.get());
}
}
else if (searchNodes.size() > 1)
else
{
results->insert(SearchResult(0, node, node));
node->addResultsRecursive(*results, 0, node);
}
}
@@ -18,10 +18,11 @@ GraphFilterConductor::~GraphFilterConductor()
{
}
void GraphFilterConductor::filter(const QueryTree* tree, const FilterableGraph* in, FilterableGraph* out) const
void GraphFilterConductor::filter(const QueryTree* tree, const FilterableGraph* in, FilterableGraph* out)
{
if (tree->isValid())
{
m_inGraph = in;
filterRecursively(tree->getRoot().get(), in, out);
}
}
@@ -38,7 +39,7 @@ void GraphFilterConductor::filterRecursively(const QueryNode* node, const Filter
}
else if (node->isToken())
{
filterTokenNode(dynamic_cast<const QueryToken*>(node), in, out);
filterTokenNode(dynamic_cast<const QueryToken*>(node), out);
}
}
@@ -172,7 +173,7 @@ void GraphFilterConductor::filterCommandNode(const QueryCommand* node, const Fil
}
}
void GraphFilterConductor::filterTokenNode(const QueryToken* node, const FilterableGraph* in, FilterableGraph* out) const
void GraphFilterConductor::filterTokenNode(const QueryToken* node, FilterableGraph* out) const
{
GraphFilterToken(node->getTokenName(), node->getTokenIds()).apply(in, out);
GraphFilterToken(node->getTokenName(), node->getTokenIds()).apply(m_inGraph, out);
}
@@ -14,13 +14,15 @@ public:
GraphFilterConductor();
~GraphFilterConductor();
void filter(const QueryTree* tree, const FilterableGraph* in, FilterableGraph* out) const;
void filter(const QueryTree* tree, const FilterableGraph* in, FilterableGraph* out);
private:
void filterRecursively(const QueryNode* node, const FilterableGraph* in, FilterableGraph* out) const;
void filterOperatorNode(const QueryOperator* node, const FilterableGraph* in, FilterableGraph* out) const;
void filterCommandNode(const QueryCommand* node, const FilterableGraph* in, FilterableGraph* out) const;
void filterTokenNode(const QueryToken* node, const FilterableGraph* in, FilterableGraph* out) const;
void filterTokenNode(const QueryToken* node, FilterableGraph* out) const;
const FilterableGraph* m_inGraph;
};
#endif // GRAPH_FILTER_CONDUCTOR_H
+1 -1
View File
@@ -73,7 +73,7 @@ SearchNode* SearchIndex::getNode(const std::string& fullName) const
SearchResults SearchIndex::runFuzzySearch(const std::string& query) const
{
return m_root.runFuzzySearch(query, true);
return m_root.runFuzzySearch(query);
}
std::vector<SearchMatch> SearchIndex::runFuzzySearchAndGetMatches(const std::string& query) const
+15 -19
View File
@@ -89,30 +89,16 @@ const std::set<std::shared_ptr<SearchNode>>& SearchNode::getChildren() const
return m_nodes;
}
SearchResults SearchNode::runFuzzySearch(const std::string& query, bool recursive) const
SearchResults SearchNode::runFuzzySearch(const std::string& query) const
{
SearchResults result;
if (recursive)
for (std::shared_ptr<SearchNode> n: m_nodes)
{
for (std::shared_ptr<SearchNode> n: m_nodes)
FuzzyMap m = n->fuzzyMatchRecursive(query, 0, 0, 0);
for (const std::pair<size_t, const SearchNode*>& p : m)
{
FuzzyMap m = n->fuzzyMatchRecursive(query, 0, 0, 0);
for (const std::pair<size_t, const SearchNode*>& p : m)
{
result.insert(SearchResult(p.first, p.second, this));
}
}
}
else
{
std::pair<size_t, size_t> p = fuzzyMatch(query, 0, 0);
size_t pos = p.first;
size_t weight = p.second;
if (pos == query.size())
{
result.insert(SearchResult(weight, this, this));
addResultsRecursive(result, p.first, p.second);
}
}
@@ -121,6 +107,16 @@ SearchResults SearchNode::runFuzzySearch(const std::string& query, bool recursiv
return result;
}
void SearchNode::addResultsRecursive(SearchResults& result, size_t weight, const SearchNode* node) const
{
result.insert(SearchResult(weight, node, this));
for (std::shared_ptr<SearchNode> n: node->m_nodes)
{
addResultsRecursive(result, weight, n.get());
}
}
std::shared_ptr<SearchNode> SearchNode::addNodeRecursive(
std::deque<Id>* nameIds, const Dictionary& dictionary
){
+3 -1
View File
@@ -36,12 +36,14 @@ public:
const std::set<std::shared_ptr<SearchNode>>& getChildren() const;
SearchResults runFuzzySearch(const std::string& query, bool recursive) const;
SearchResults runFuzzySearch(const std::string& query) const;
void addResultsRecursive(SearchResults& result, size_t weight, const SearchNode* node) const;
private:
typedef std::multimap<size_t, const SearchNode*> FuzzyMap;
typedef FuzzyMap::const_iterator FuzzyMapIterator;
// Accessed by SearchIndex
std::shared_ptr<SearchNode> addNodeRecursive(std::deque<Id>* nameIds, const Dictionary& dictionary);
std::shared_ptr<SearchNode> getNodeRecursive(std::deque<Id>* nameIds) const;