From ae263bb4db3d3fd7edef9c1fde8866655e2a0a85 Mon Sep 17 00:00:00 2001 From: Carlos Soriano Date: Tue, 27 Aug 2013 21:23:13 +0200 Subject: [PATCH] iconGrid: Add minRows/minColumns properties When we adapt the grid to different display sizes, we don't want the number of displayed items to get too small. In the future we will scale down icons to make sure that the grid fits add least minRows x minColumns items, but for now we only take the properties into account when calculating the dynamic spacing. https://bugzilla.gnome.org/show_bug.cgi?id=706081 --- js/ui/appDisplay.js | 4 ++++ js/ui/iconGrid.js | 34 ++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 30d033cea..0dd388502 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -30,6 +30,8 @@ const Util = imports.misc.util; const MAX_APPLICATION_WORK_MILLIS = 75; const MENU_POPUP_TIMEOUT = 600; const MAX_COLUMNS = 6; +const MIN_COLUMNS = 4; +const MIN_ROWS = 4; const INACTIVE_GRID_OPACITY = 77; const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.15; @@ -63,6 +65,8 @@ const BaseAppView = new Lang.Class({ _init: function(params, gridParams) { gridParams = Params.parse(gridParams, { xAlign: St.Align.MIDDLE, columnLimit: MAX_COLUMNS, + minRows: MIN_ROWS, + minColumns: MIN_COLUMNS, fillParent: false }); params = Params.parse(params, { usePagination: false }); diff --git a/js/ui/iconGrid.js b/js/ui/iconGrid.js index 59c6360d0..fa04bf877 100644 --- a/js/ui/iconGrid.js +++ b/js/ui/iconGrid.js @@ -176,10 +176,14 @@ const IconGrid = new Lang.Class({ _init: function(params) { params = Params.parse(params, { rowLimit: null, columnLimit: null, + minRows: 1, + minColumns: 1, fillParent: false, xAlign: St.Align.MIDDLE }); this._rowLimit = params.rowLimit; this._colLimit = params.columnLimit; + this._minRows = params.minRows; + this._minColumns = params.minColumns; this._xAlign = params.xAlign; this._fillParent = params.fillParent; @@ -393,17 +397,27 @@ const IconGrid = new Lang.Class({ * This function must to be called before iconGrid allocation, * to know how much spacing can the grid has */ - updateSpacingForSize: function(availWidth) { - let spacing = this._spacing; + updateSpacingForSize: function(availWidth, availHeight) { + let maxEmptyVArea = availHeight - this._minRows * this._vItemSize; + let maxEmptyHArea = availWidth - this._minColumns * this._hItemSize; + let maxHSpacing, maxVSpacing; + if (this._minRows <= 1) + maxVSpacing = maxEmptyVArea; + else + maxVSpacing = Math.floor(maxEmptyVArea / (this._minRows - 1)); - if (this._colLimit) { - let itemWidth = this._hItemSize * this._colLimit; - let emptyArea = availWidth - itemWidth; - spacing = Math.max(spacing, emptyArea / (2 * this._colLimit)); - spacing = Math.round(spacing); - } - this.setSpacing(spacing); - }, + if (this._minColumns <= 1) + maxHSpacing = maxEmptyHArea; + else + maxHSpacing = Math.floor(maxEmptyHArea / (this._minColumns - 1)); + + let maxSpacing = Math.min(maxHSpacing, maxVSpacing); + // Limit spacing to the item size + maxSpacing = Math.min(maxSpacing, Math.min(this._vItemSize, this._hItemSize)); + // The minimum spacing, regardless of whether it satisfies the row/column minima, + // is the spacing we get from CSS. + this.setSpacing(Math.max(this._spacing, maxSpacing)); + } }); const PaginatedIconGrid = new Lang.Class({