From 811b0807a5b4903fcdfbc617709bf857c30e81e9 Mon Sep 17 00:00:00 2001 From: Saif Addin Date: Mon, 26 Apr 2021 03:17:17 +0200 Subject: [PATCH] Minimized Windows+ Feature and bugfixes --- CHANGELOG.md | 9 +++++ lang/en.json | 5 ++- lang/es.json | 5 ++- module.json | 4 +- modules/component/controls.js | 6 +-- modules/feature/minimize.js | 72 +++++++++++++++++++++++++++++------ package.json | 2 +- styles/feature/minimize.css | 8 ++++ 8 files changed, 91 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0392219..baadf73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### 0.8.4 +* Enhancement: Minimize+ Setting "Right Click" on a minimized window gives them border color +* Enhancement: Minimize+ Setting Mouse over minimized windows gives them shadow color +* Compatibility: Search Anywhere "hand" now hidden in Organized Minimize mode when minimized +* Bugfix: Organized Minimize returns windows to their original position when restored/maximized +* Bugfix: Organized Minimize removed unwanted movement when moving windows along the axis +* Bugfix: Sub controls menu adjusted to avoid unwanted shaking animation + + ### 0.8.3 * Compatibility: Monks Scene Navigation thanks to a contribution from ironmonk88 * Bugfix: Disabled scene preview animation for better compatibility and less strange behaviour diff --git a/lang/en.json b/lang/en.json index 810187d..90f5bef 100644 --- a/lang/en.json +++ b/lang/en.json @@ -85,12 +85,15 @@ "MinimalUI.DynamicUIHint": "Auto hides UI elements after 60 seconds of chat inactivity when controlling tokens or changing scenes.", "MinimalUI.OrganizedMinimizeName": "MINIMAL UI Organized Minimize", - "MinimalUI.OrganizedMinimizeHint": "This option may help you organize those minimized windows by placing them either on a bottom line or top bar.", + "MinimalUI.OrganizedMinimizeHint": "Organize minimized windows by placing them either on a bottom line or top bar.", "MinimalUI.OrganizedMinimizeBottom": "Bottom", "MinimalUI.OrganizedMinimizeBottomBar": "Bottom with Bar", "MinimalUI.OrganizedMinimizeTop": "Top", "MinimalUI.OrganizedMinimizeTopBar": "Top with Bar", + "MinimalUI.EnrichedMinimizeName": "MINIMAL UI Organized Minimize+", + "MinimalUI.EnrichedMinimizeHint": "Pin minimized windows with Right Click and highlight on mouse over", + "MinimalUI.PinSidebar": "Pin Controls" } \ No newline at end of file diff --git a/lang/es.json b/lang/es.json index 643b941..b6c8e83 100644 --- a/lang/es.json +++ b/lang/es.json @@ -85,12 +85,15 @@ "MinimalUI.DynamicUIHint": "Oculta automáticamente los elementos de la UI tras 60 segundos de inactividad cuando se está controlando algún icono o navegando entre escenas", "MinimalUI.OrganizedMinimizeName": "Modo organizado MINIMAL", - "MinimalUI.OrganizedMinimizeHint": "Esta opción le ayudará a organizar las ventanas que minimice, al colocarlas o bien en una franja en la parte inferior o superior", + "MinimalUI.OrganizedMinimizeHint": "Organiza las ventanas que minimice, al colocarlas o bien en una franja en la parte inferior o superior", "MinimalUI.OrganizedMinimizeBottom": "Abajo", "MinimalUI.OrganizedMinimizeBottomBar": "Abajo con barra", "MinimalUI.OrganizedMinimizeTop": "Arriba", "MinimalUI.OrganizedMinimizeTopBar": "Arriba con barra", + "MinimalUI.EnrichedMinimizeName": "Modo organizado MINIMAL+", + "MinimalUI.EnrichedMinimizeHint": "Fijar ventanas minimizadas con click derecho y resaltar al pasar por encima", + "MinimalUI.PinSidebar": "Controles de chincheta" } \ No newline at end of file diff --git a/module.json b/module.json index d885eaf..8cb3517 100644 --- a/module.json +++ b/module.json @@ -3,7 +3,7 @@ "title": "Minimal UI", "author": "JeansenVaars#2857", "description": "Minimal UI allows customizing Foundry interface, by hiding, collapsing or resizing specific parts.", - "version": "0.8.3", + "version": "0.8.4", "minimumCoreVersion": "0.7.9", "compatibleCoreVersion": "0.7.9", "dependencies": [ @@ -26,5 +26,5 @@ ], "url": "https://github.com/saif-ellafi/foundryvtt-minimal-ui.git", "manifest": "https://github.com/saif-ellafi/foundryvtt-minimal-ui/releases/latest/download/module.json", - "download": "https://github.com/saif-ellafi/foundryvtt-minimal-ui/releases/latest/download/foundryvtt-minimal-ui_0.8.3.zip" + "download": "https://github.com/saif-ellafi/foundryvtt-minimal-ui/releases/latest/download/foundryvtt-minimal-ui_0.8.4.zip" } diff --git a/modules/component/controls.js b/modules/component/controls.js index 57f2624..b347b05 100644 --- a/modules/component/controls.js +++ b/modules/component/controls.js @@ -11,9 +11,9 @@ export default class MinimalUIControls { static cssControlsHiddenPositionSmall = '-62px'; static cssControlsHiddenPositionStandard = '-72px'; - static cssControlsSubMenuSmall = '55px'; - static cssControlsSubMenuStandard = '65px'; - static cssControlsSubMenuDndUi = '65px'; + static cssControlsSubMenuSmall = '48px'; + static cssControlsSubMenuStandard = '58px'; + static cssControlsSubMenuDndUi = '58px'; static cssControlsPaddingDefault = '7px'; static cssControlsPaddingSmall = '26px'; diff --git a/modules/feature/minimize.js b/modules/feature/minimize.js index 0198d55..bcd254a 100644 --- a/modules/feature/minimize.js +++ b/modules/feature/minimize.js @@ -18,6 +18,7 @@ export default class MinimalUIMinimize { .minimized { ${rule}: ${measure} !important; width: ${MinimalUIMinimize.cssMinimizedSize}px !important; + height: 1px !important; } `, stylesheet.cssRules.length ); @@ -50,13 +51,46 @@ export default class MinimalUIMinimize { static cleanupMinimizeBar(app, force) { const minimizedApps = $(".minimized"); const minimizedStash = Object.values(MinimalUIMinimize.minimizedStash); - const matchedStash = minimizedStash.find(a => a.appId === app?.appId); + const matchedStash = minimizedStash.find(a => a.app.appId === app?.appId); if ((force) || (minimizedApps.length === 0) || (minimizedApps.length === 1 && matchedStash)) { MinimalUIMinimize.minimizedStash = {}; $("#minimized-bar").hide(); } } + static enrichStyling(app) { + app.element.find(".close").text(''); + app.element.find(".close").append(``); + app.element.find(".window-draggable-handle").hide(); + if (game.settings.get('minimal-ui', 'enrichedMinimize') === 'enabled') { + const header = app.element.find(".window-header"); + header.on('contextmenu', function () { + if (header.hasClass('minimized-pinned')) + header.removeClass('minimized-pinned') + else + header.addClass('minimized-pinned') + }); + header.hover( + function () { + header.addClass('minimized-highlight') + }, + function () { + header.removeClass('minimized-highlight') + } + ) + } + } + + static unenrichStyling(app) { + app.element.find(".close").text(''); + app.element.find(".close").append(`Close`); + app.element.find(".window-draggable-handle").show(); + if (game.settings.get('minimal-ui', 'enrichedMinimize') === 'enabled') { + app.element.find(".window-header").removeClass('minimized-pinned'); + app.element.find(".window-header").off(); + } + } + static initSettings() { game.settings.register('minimal-ui', 'organizedMinimize', { name: game.i18n.localize("MinimalUI.OrganizedMinimizeName"), @@ -71,7 +105,22 @@ export default class MinimalUIMinimize { "topBar": game.i18n.localize("MinimalUI.OrganizedMinimizeTopBar"), "disabled": game.i18n.localize("MinimalUI.Disabled") }, - default: "disabled", + default: "topBar", + onChange: _ => { + window.location.reload() + } + }); + game.settings.register('minimal-ui', 'enrichedMinimize', { + name: game.i18n.localize("MinimalUI.EnrichedMinimizeName"), + hint: game.i18n.localize("MinimalUI.EnrichedMinimizeHint"), + scope: 'world', + config: true, + type: String, + choices: { + "enabled": game.i18n.localize("MinimalUI.Enabled"), + "disabled": game.i18n.localize("MinimalUI.Disabled") + }, + default: "enabled", onChange: _ => { window.location.reload() } @@ -100,24 +149,22 @@ export default class MinimalUIMinimize { const jumpGap = MinimalUIMinimize.cssMinimizedSize + 10; const boardSize = parseInt($("#board").css('width')); const maxGap = boardSize - sidebarGap; - console.log('MinimalUI: Application.prototype.minimize was called'); const targetHtml = $(`[data-appid='${this.appId}']`); targetHtml.hide(); let targetPos; for (let i = minGap; i < maxGap + jumpGap; i = i + jumpGap) { - if (MinimalUIMinimize.minimizedStash[i]?.appId === this.appId) { + if (MinimalUIMinimize.minimizedStash[i]?.app.appId === this.appId) { targetPos = i; - break; - } else if (!targetPos && !MinimalUIMinimize.minimizedStash[i]?.rendered) { - MinimalUIMinimize.minimizedStash[i] = this; + break + } else if (!targetPos && !MinimalUIMinimize.minimizedStash[i]?.app.rendered) { + MinimalUIMinimize.minimizedStash[i] = {app: this, oldLeft: this.position.left}; targetPos = i; break; } } this.setPosition({left: targetPos ?? this.position.left}); const result = wrapped(...args); - this.element.find(".close").text(''); - this.element.find(".close").append(``); + MinimalUIMinimize.enrichStyling(this); await new Promise(waitABit => setTimeout(waitABit, 200)); if (['bottomBar', 'topBar'].includes(minimizedSetting)) { $("#minimized-bar").show(); @@ -127,16 +174,17 @@ export default class MinimalUIMinimize { }, 'WRAPPER'); libWrapper.register('minimal-ui', 'Application.prototype.maximize', async function (wrapped, ...args) { - console.log('MinimalUI: Application.prototype.maximize was called'); let targetHtml = $(`[data-appid='${this.appId}']`); targetHtml.hide(); let result = wrapped(...args); await new Promise(waitABit => setTimeout(waitABit, 200)); const minimizedSetting = game.settings.get('minimal-ui', 'organizedMinimize'); + const minimizedStash = Object.values(MinimalUIMinimize.minimizedStash); + const matchedStash = minimizedStash.find(a => a.app.appId === this?.appId); + this.setPosition({left: matchedStash.oldLeft}); if (['bottomBar', 'topBar'].includes(minimizedSetting)) MinimalUIMinimize.cleanupMinimizeBar(this); - this.element.find(".close").text(''); - this.element.find(".close").append(`Close`); + MinimalUIMinimize.unenrichStyling(this); targetHtml.show(); return result; }, 'WRAPPER'); diff --git a/package.json b/package.json index 5602d08..aaa3795 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "foundryvtt-minimal-ui", - "version": "0.8.3", + "version": "0.8.4", "description": "Minimal UI allows customizing Foundry interface, by hiding, collapsing or resizing specific parts.", "main": "minimalui.js", "scripts": { diff --git a/styles/feature/minimize.css b/styles/feature/minimize.css index fb372d4..ad961a0 100644 --- a/styles/feature/minimize.css +++ b/styles/feature/minimize.css @@ -14,4 +14,12 @@ border-radius: 5px; left: var(--minileft); opacity: 90%; +} + +.minimized-highlight { + background: var(--shadowcolor); +} + +.minimized-pinned { + background: var(--bordercolor); } \ No newline at end of file