mirror of
https://github.com/esjeon/krohnkite.git
synced 2024-10-03 23:07:13 +03:00
clarify & distinguish windows, tile, and tileable
This commit is contained in:
parent
00f67a9b94
commit
7b89c28d3a
@ -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 */
|
||||
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user