[gnome-shell] search: Fix calculation of max number of displayed results for grid



commit 1a27ff6130e03e64d9e426ece72a12e4e2a80f50
Author: Jonas Dreßler <verdre v0yd nl>
Date:   Sun Nov 25 00:57:00 2018 +0100

    search: Fix calculation of max number of displayed results for grid
    
    The calculation of how many results can be shown in GridSearchResults is
    broken: The width of the parent container (resultsView.actor) we're
    using as the maximum width right now is the width of the scrollView of
    SearchResults (which always expands to the whole screen size). This
    width will only be correct if the scrollView (ie. the whole screen) is
    smaller than the max width of searchResultsContent, which only is the
    case for screens smaller than 1000px.
    
    To fix the calculation, use the width of our own actor and don't get it
    using clutter_actor_get_width(), but using the last allocation of the
    actor. This way we don't get the preferred width if the actor is not
    allocated at this point (it's hidden by _ensureProviderDisplay() when
    starting a new search).
    
    Then, when the allocation of the actor changes, rebuild the grid search
    results by calling updateSearch() with the old arguments to ensure the
    number of visible results is correct. The fact that we're only listening
    for allocation changes here is the reason why we never want to use the
    preferred width of the actor inside _getMaxDisplayedResults(): While
    the actor is hidden clutter_actor_get_width() would return the preferred
    width, which we'd then use the as the maximum width. But if the actor
    had a correct allocation before, no notify::allocation signal will be
    emitted when the actor is shown again because the allocation is still
    the same, and we'll end up using the preferred width as maximium width
    forever.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/110

 js/ui/search.js | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)
---
diff --git a/js/ui/search.js b/js/ui/search.js
index 6d6c09a64..a1b5a5df4 100644
--- a/js/ui/search.js
+++ b/js/ui/search.js
@@ -329,12 +329,6 @@ Signals.addSignalMethods(ListSearchResults.prototype);
 var GridSearchResults = class extends SearchResultsBase {
     constructor(provider, resultsView) {
         super(provider, resultsView);
-        // We need to use the parent container to know how much results we can show.
-        // None of the actors in this class can be used for that, since the main actor
-        // goes hidden when no results are displayed, and then it lost its allocation.
-        // Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore
-        // it doesn't show any result although we have some.
-        this._parentContainer = resultsView.actor;
 
         this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
                                              xAlign: St.Align.START });
@@ -345,10 +339,23 @@ var GridSearchResults = class extends SearchResultsBase {
         this._resultDisplayBin.set_child(this._bin);
     }
 
+    updateSearch(...args) {
+        if (this._notifyAllocationId)
+            this.actor.disconnect(this._notifyAllocationId);
+
+        // Make sure the maximum number of results calculated by
+        // _getMaxDisplayedResults() is updated after width changes.
+        this._notifyAllocationId = this.actor.connect('notify::allocation', () => {
+            super.updateSearch(...args);
+        });
+
+        super.updateSearch(...args);
+    }
+
     _getMaxDisplayedResults() {
-        let parentThemeNode = this._parentContainer.get_theme_node();
-        let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
-        return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
+        let allocation = this.actor.allocation;
+        let nCols = this._grid.columnsForWidth(allocation.x2 - allocation.x1);
+        return nCols * this._grid.getRowLimit();
     }
 
     _clearResultDisplay() {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]