[search] Finish queued search on Return
If we had a pending search processing, finish it when the user activates the entry. This is a small conceptual change; the large diff is simply moving the search implementation (unedited otherwise) from an anonymous inline to a named function so it can be called sanely in _activate. https://bugzilla.gnome.org/show_bug.cgi?id=598111
This commit is contained in:
parent
39edf54aa9
commit
d1bdd6f11d
@ -641,51 +641,13 @@ Dash.prototype = {
|
|||||||
}
|
}
|
||||||
if (this._searchTimeoutId > 0)
|
if (this._searchTimeoutId > 0)
|
||||||
return;
|
return;
|
||||||
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, function() {
|
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, this._doSearch));
|
||||||
this._searchTimeoutId = 0;
|
|
||||||
let text = this._searchEntry.getText();
|
|
||||||
text = text.replace(/^\s+/g, "").replace(/\s+$/g, "");
|
|
||||||
|
|
||||||
let selectionSet = false;
|
|
||||||
|
|
||||||
for (var i = 0; i < this._searchSections.length; i++) {
|
|
||||||
let section = this._searchSections[i];
|
|
||||||
section.resultArea.display.setSearch(text);
|
|
||||||
let itemCount = section.resultArea.display.getMatchedItemsCount();
|
|
||||||
let itemCountText = itemCount + "";
|
|
||||||
section.header.countText.text = itemCountText;
|
|
||||||
|
|
||||||
if (this._searchResultsSingleShownSection == section.type) {
|
|
||||||
this._searchResultsSection.header.setCountText(itemCountText);
|
|
||||||
if (itemCount == 0) {
|
|
||||||
section.resultArea.actor.hide();
|
|
||||||
} else {
|
|
||||||
section.resultArea.actor.show();
|
|
||||||
}
|
|
||||||
} else if (this._searchResultsSingleShownSection == null) {
|
|
||||||
// Don't show the section if it has no results
|
|
||||||
if (itemCount == 0) {
|
|
||||||
section.header.actor.hide();
|
|
||||||
section.resultArea.actor.hide();
|
|
||||||
} else {
|
|
||||||
section.header.actor.show();
|
|
||||||
section.resultArea.actor.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Refresh the selection when a new search is applied.
|
|
||||||
section.resultArea.display.unsetSelected();
|
|
||||||
if (!selectionSet && section.resultArea.display.hasItems() &&
|
|
||||||
(this._searchResultsSingleShownSection == null || this._searchResultsSingleShownSection == section.type)) {
|
|
||||||
section.resultArea.display.selectFirstItem();
|
|
||||||
selectionSet = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
}));
|
}));
|
||||||
this._searchEntry.entry.connect('activate', Lang.bind(this, function (se) {
|
this._searchEntry.entry.connect('activate', Lang.bind(this, function (se) {
|
||||||
|
if (this._searchTimeoutId > 0) {
|
||||||
|
Mainloop.source_remove(this._searchTimeoutId);
|
||||||
|
this._doSearch();
|
||||||
|
}
|
||||||
// Only one of the displays will have an item selected, so it's ok to
|
// Only one of the displays will have an item selected, so it's ok to
|
||||||
// call activateSelected() on all of them.
|
// call activateSelected() on all of them.
|
||||||
for (var i = 0; i < this._searchSections.length; i++) {
|
for (var i = 0; i < this._searchSections.length; i++) {
|
||||||
@ -856,6 +818,50 @@ Dash.prototype = {
|
|||||||
this._searchResultsSection.actor.hide();
|
this._searchResultsSection.actor.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_doSearch: function () {
|
||||||
|
this._searchTimeoutId = 0;
|
||||||
|
let text = this._searchEntry.getText();
|
||||||
|
text = text.replace(/^\s+/g, "").replace(/\s+$/g, "");
|
||||||
|
|
||||||
|
let selectionSet = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < this._searchSections.length; i++) {
|
||||||
|
let section = this._searchSections[i];
|
||||||
|
section.resultArea.display.setSearch(text);
|
||||||
|
let itemCount = section.resultArea.display.getMatchedItemsCount();
|
||||||
|
let itemCountText = itemCount + "";
|
||||||
|
section.header.countText.text = itemCountText;
|
||||||
|
|
||||||
|
if (this._searchResultsSingleShownSection == section.type) {
|
||||||
|
this._searchResultsSection.header.setCountText(itemCountText);
|
||||||
|
if (itemCount == 0) {
|
||||||
|
section.resultArea.actor.hide();
|
||||||
|
} else {
|
||||||
|
section.resultArea.actor.show();
|
||||||
|
}
|
||||||
|
} else if (this._searchResultsSingleShownSection == null) {
|
||||||
|
// Don't show the section if it has no results
|
||||||
|
if (itemCount == 0) {
|
||||||
|
section.header.actor.hide();
|
||||||
|
section.resultArea.actor.hide();
|
||||||
|
} else {
|
||||||
|
section.header.actor.show();
|
||||||
|
section.resultArea.actor.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Refresh the selection when a new search is applied.
|
||||||
|
section.resultArea.display.unsetSelected();
|
||||||
|
if (!selectionSet && section.resultArea.display.hasItems() &&
|
||||||
|
(this._searchResultsSingleShownSection == null || this._searchResultsSingleShownSection == section.type)) {
|
||||||
|
section.resultArea.display.selectFirstItem();
|
||||||
|
selectionSet = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
global.stage.set_key_focus(this._searchEntry.entry);
|
global.stage.set_key_focus(this._searchEntry.entry);
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user