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({