clarify & distinguish windows, tile, and tileable

This commit is contained in:
Eon S. Jeon 2019-12-26 17:07:53 +09:00
parent 00f67a9b94
commit 7b89c28d3a
10 changed files with 77 additions and 57 deletions

View File

@ -120,7 +120,7 @@ interface ILayout {
/* methods */
adjust?(area: Rect, tiles: Window[], basis: Window): void;
apply(ctx: EngineContext, tiles: Window[], area: Rect): void;
apply(ctx: EngineContext, tileables: Window[], area: Rect): void;
toString(): string;
/* overriding */

View File

@ -41,7 +41,7 @@ class TilingEngine {
fullArea.width - (CONFIG.screenGapLeft + CONFIG.screenGapRight),
fullArea.height - (CONFIG.screenGapTop + CONFIG.screenGapBottom),
);
const tiles = this.windows.visibleTiles(srf);
const tiles = this.windows.getVisibleTiles(srf);
layout.adjust(area, tiles, basis);
}
}
@ -65,27 +65,20 @@ class TilingEngine {
tilingArea = workingArea.gap(CONFIG.screenGapLeft, CONFIG.screenGapRight,
CONFIG.screenGapTop, CONFIG.screenGapBottom);
const visibles = this.windows.visibles(srf);
const visibles = this.windows.getVisibleWindows(srf);
debugObj(() => ["arrangeScreen", {
layout, srf,
visibles: visibles.length,
}]);
/* reset all properties of windows */
visibles.forEach((window) => {
if (window.state === WindowState.FreeTile)
window.state = WindowState.Tile;
if (window.state === WindowState.Tile)
window.noBorder = CONFIG.noTileBorder;
});
const tiles = this.windows.visibleTiles(srf);
if (CONFIG.maximizeSoleTile && tiles.length === 1) {
tiles[0].noBorder = true;
tiles[0].geometry = workingArea;
} else if (tiles.length > 0)
layout.apply(new EngineContext(ctx, this), tiles, tilingArea);
// TODO: use WindowStore#getVisibleTileables
const tileables = this.windows.getVisibleTileables(srf);
if (CONFIG.maximizeSoleTile && tileables.length === 1) {
tileables[0].state = WindowState.Tile;
tileables[0].noBorder = true;
tileables[0].geometry = workingArea;
} else if (tileables.length > 0)
layout.apply(new EngineContext(ctx, this), tileables, tilingArea);
visibles.forEach((window) => window.commit());
debugObj(() => ["arrangeScreen/finished", { srf }]);
@ -116,7 +109,7 @@ class TilingEngine {
const srf = (window) ? window.surface : ctx.currentSurface;
const visibles = this.windows.visibles(srf);
const visibles = this.windows.getVisibleWindows(srf);
if (visibles.length === 0) /* nothing to focus */
return;
@ -138,7 +131,7 @@ class TilingEngine {
return;
const srf = window.surface;
const visibles = this.windows.visibles(srf);
const visibles = this.windows.getVisibleWindows(srf);
if (visibles.length < 2)
return;
@ -156,19 +149,19 @@ class TilingEngine {
}
public floatAll(srf: ISurface) {
const tiles = this.windows.visibles(srf);
const numFloats = tiles.reduce<number>((count, window) => {
const windows = this.windows.getVisibleWindows(srf);
const numFloats = windows.reduce<number>((count, window) => {
return (window.state === WindowState.Float) ? count + 1 : count;
}, 0);
if (numFloats < tiles.length / 2)
tiles.forEach((window) => {
if (numFloats < windows.length / 2)
windows.forEach((window) => {
/* TODO: do not use arbitrary constants */
window.floatGeometry = window.actualGeometry.gap(4, 4, 4, 4);
window.state = WindowState.Float;
});
else
tiles.forEach((window) => {
windows.forEach((window) => {
window.state = WindowState.Tile;
});
}

View File

@ -70,19 +70,23 @@ class WindowStore {
//#region Querying Windows
public visibles(srf: ISurface): Window[] {
/** Returns all visible windows on the given surface. */
public getVisibleWindows(srf: ISurface): Window[] {
return this.list.filter((win) => win.visible(srf));
}
public visibleTiles(srf: ISurface): Window[] {
/** Return all visible "Tile" windows on the given surface. */
public getVisibleTiles(srf: ISurface): Window[] {
return this.list.filter((win) =>
win.state === WindowState.Tile && win.visible(srf));
}
public visibleTileables(srf: ISurface): Window[] {
return this.list.filter((win) =>
(win.state === WindowState.Tile || win.state === WindowState.FreeTile)
&& win.visible(srf));
/**
* Return all visible "tileable" windows on the given surface
* @see Window#tileable
*/
public getVisibleTileables(srf: ISurface): Window[] {
return this.list.filter((win) => win.tileable && win.visible(srf));
}
//#endregion

View File

@ -125,9 +125,13 @@ class ColumnLayout implements ILayout {
}
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
this.tileCache = {};
/* Tile all tileables */
tileables.forEach((tileable) => tileable.state = WindowState.Tile);
const tiles = tileables;
/** the total number of tiles in all columns */
const numColumnTiles = this.columnMasters.reduce((sum, numMaster) => sum + numMaster, 0);

View File

@ -31,9 +31,9 @@ class FloatingLayout implements ILayout {
return this._enabled;
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
tiles.forEach((tile: Window) =>
tile.state = WindowState.FreeTile);
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
tileables.forEach((tileable: Window) =>
tileable.state = WindowState.FreeTile);
}
public toString(): string {

View File

@ -23,7 +23,11 @@ class MonocleLayout implements ILayout {
return CONFIG.enableMonocleLayout;
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
/* Tile all tileables */
tileables.forEach((tileable) => tileable.state = WindowState.Tile);
const tiles = tileables;
if (CONFIG.monocleMaximize)
tiles.forEach((window) => window.noBorder = true);

View File

@ -73,9 +73,15 @@ class QuarterLayout implements ILayout {
this.rhsplit = clip(this.rhsplit, 1 - QuarterLayout.MAX_PROPORTION, QuarterLayout.MAX_PROPORTION);
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
if (tiles.length === 1) {
tiles[0].geometry = area;
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
for (let i = 0; i < 4 && i < tileables.length; i++)
tileables[i].state = WindowState.Tile;
if (tileables.length > 4)
tileables.slice(4).forEach((tile) => tile.state = WindowState.FreeTile);
if (tileables.length === 1) {
tileables[0].geometry = area;
return;
}
@ -85,34 +91,31 @@ class QuarterLayout implements ILayout {
const leftWidth = Math.floor(area.width * this.vsplit);
const rightWidth = area.width - leftWidth;
const rightX = area.x + leftWidth;
if (tiles.length === 2) {
tiles[0].geometry = new Rect(area.x, area.y, leftWidth , area.height).gap(0, gap1, 0, 0);
tiles[1].geometry = new Rect(rightX, area.y, rightWidth, area.height).gap(gap2, 0, 0, 0);
if (tileables.length === 2) {
tileables[0].geometry = new Rect(area.x, area.y, leftWidth , area.height).gap(0, gap1, 0, 0);
tileables[1].geometry = new Rect(rightX, area.y, rightWidth, area.height).gap(gap2, 0, 0, 0);
return;
}
const rightTopHeight = Math.floor(area.height * this.rhsplit);
const rightBottomHeight = area.height - rightTopHeight;
const rightBottomY = area.y + rightTopHeight;
if (tiles.length === 3) {
tiles[0].geometry = new Rect(area.x, area.y , leftWidth , area.height ).gap(0, gap1, 0, 0);
tiles[1].geometry = new Rect(rightX, area.y , rightWidth, rightTopHeight ).gap(gap2, 0, 0, gap1);
tiles[2].geometry = new Rect(rightX, rightBottomY, rightWidth, rightBottomHeight).gap(gap2, 0, gap2, 0);
if (tileables.length === 3) {
tileables[0].geometry = new Rect(area.x, area.y , leftWidth , area.height ).gap(0, gap1, 0, 0);
tileables[1].geometry = new Rect(rightX, area.y , rightWidth, rightTopHeight ).gap(gap2, 0, 0, gap1);
tileables[2].geometry = new Rect(rightX, rightBottomY, rightWidth, rightBottomHeight).gap(gap2, 0, gap2, 0);
return;
}
const leftTopHeight = Math.floor(area.height * this.lhsplit);
const leftBottomHeight = area.height - leftTopHeight;
const leftBottomY = area.y + leftTopHeight;
if (tiles.length >= 4) {
tiles[0].geometry = new Rect(area.x, area.y , leftWidth , leftTopHeight ).gap(0, gap1, 0, gap1);
tiles[1].geometry = new Rect(rightX, area.y , rightWidth, rightTopHeight ).gap(gap2, 0, 0, gap1);
tiles[2].geometry = new Rect(rightX, rightBottomY, rightWidth, rightBottomHeight).gap(gap2, 0, gap2, 0);
tiles[3].geometry = new Rect(area.x, leftBottomY , leftWidth , leftBottomHeight ).gap(0, gap2, gap2, 0);
if (tileables.length >= 4) {
tileables[0].geometry = new Rect(area.x, area.y , leftWidth , leftTopHeight ).gap(0, gap1, 0, gap1);
tileables[1].geometry = new Rect(rightX, area.y , rightWidth, rightTopHeight ).gap(gap2, 0, 0, gap1);
tileables[2].geometry = new Rect(rightX, rightBottomY, rightWidth, rightBottomHeight).gap(gap2, 0, gap2, 0);
tileables[3].geometry = new Rect(area.x, leftBottomY , leftWidth , leftBottomHeight ).gap(0, gap2, gap2, 0);
}
if (tiles.length > 4)
tiles.slice(4).forEach((tile) => tile.state = WindowState.FreeTile);
}
public toString(): string {

View File

@ -29,7 +29,11 @@ class SpreadLayout implements ILayout {
this.space = 0.07;
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
/* Tile all tileables */
tileables.forEach((tileable) => tileable.state = WindowState.Tile);
const tiles = tileables;
let numTiles = tiles.length;
const spaceWidth = Math.floor(area.width * this.space);
let cardWidth = area.width - (spaceWidth * (numTiles - 1));

View File

@ -29,7 +29,11 @@ class StairLayout implements ILayout {
this.space = 24;
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
/* Tile all tileables */
tileables.forEach((tileable) => tileable.state = WindowState.Tile);
const tiles = tileables;
const len = tiles.length;
const space = this.space;

View File

@ -73,10 +73,14 @@ class TileLayout implements ILayout {
this.masterRatio = clip(this.masterRatio, TileLayout.MIN_MASTER_RATIO, TileLayout.MAX_MASTER_RATIO);
}
public apply(ctx: EngineContext, tiles: Window[], area: Rect): void {
public apply(ctx: EngineContext, tileables: Window[], area: Rect): void {
const gap = CONFIG.tileLayoutGap;
/* TODO: clean up cache / check invalidated(unmanage) entries */
/* Tile all tileables */
tileables.forEach((tileable) => tileable.state = WindowState.Tile);
const tiles = tileables;
if (tiles.length <= this.numMaster) /* only master */
stackTilesWithWeight(tiles, area, this.weights, gap);
else if (this.numMaster === 0) /* only stack */