diff --git a/src/Actions.ts b/src/Actions.ts index 1c81743..718ba69 100644 --- a/src/Actions.ts +++ b/src/Actions.ts @@ -176,6 +176,12 @@ namespace Actions { }); }, + columnsWidthEqualize: () => { + world.do((clientManager, desktopManager) => { + desktopManager.getCurrentDesktop().equalizeVisibleColumnsWidths(); + }); + }, + gridScrollLeft: () => { gridScroll(world, -config.manualScrollStep); }, diff --git a/src/keyBindings/definition.ts b/src/keyBindings/definition.ts index 70711be..ac323d1 100644 --- a/src/keyBindings/definition.ts +++ b/src/keyBindings/definition.ts @@ -125,6 +125,12 @@ const keyBindings: KeyBinding[] = [ "defaultKeySequence": "Meta+Ctrl+-", "action": "columnWidthDecrease", }, + { + "name": "columns-width-equalize", + "description": "Equalize widths of visible columns", + "defaultKeySequence": "Meta+Ctrl+X", + "action": "columnsWidthEqualize", + }, { "name": "grid-scroll-focused", "description": "Center focused window", diff --git a/src/layout/Desktop.ts b/src/layout/Desktop.ts index acbffbb..2642c79 100644 --- a/src/layout/Desktop.ts +++ b/src/layout/Desktop.ts @@ -145,6 +145,20 @@ class Desktop { this.setScroll(this.scrollX, false); } + public equalizeVisibleColumnsWidths() { + const scrollPos = this.getCurrentScrollPos(); + const visibleColumns = Array.from(this.grid.getVisibleColumns(scrollPos, true)); + + let remainingWidth = this.tilingArea.width - (visibleColumns.length-1) * this.grid.config.gapsInnerHorizontal; + let remainingColumns = visibleColumns.length; + for (const column of visibleColumns) { + const columnWidth = Math.round(remainingWidth / remainingColumns); + column.setWidth(columnWidth, true); + remainingWidth -= columnWidth; + remainingColumns--; + } + } + public arrange() { // TODO (optimization): only arrange visible windows this.updateArea(); diff --git a/src/layout/Grid.ts b/src/layout/Grid.ts index b04635f..011558f 100644 --- a/src/layout/Grid.ts +++ b/src/layout/Grid.ts @@ -113,6 +113,14 @@ class Grid { return last; } + public *getVisibleColumns(scrollPos: Desktop.ScrollPos, fullyVisible: boolean) { + for (const column of this.columns.iterator()) { + if (column.isVisible(scrollPos, fullyVisible)) { + yield column; + } + } + } + public getVisibleColumnsWidth(scrollPos: Desktop.ScrollPos, fullyVisible: boolean) { let width = 0; let nVisible = 0;