feat: Add persistent setting for Force Direct Capture mode to the magnify glass.

This commit is contained in:
AEmotionStudio
2026-01-04 23:48:43 -08:00
parent 716ab92227
commit 8faaa449c6
15 changed files with 88 additions and 14 deletions
+1 -1
View File
@@ -121,7 +121,7 @@ export class ConfigManager {
this.toggleGlassPreviewKey = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.GlassPreviewToggleHotkey"];
this.showCursorPreview = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ShowCursorPreview"];
this.forceDirectCaptureKey = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ForceDirectCaptureKey"];
this.forceDirectCapture = false; // Runtime flag, not persisted
this.forceDirectCapture = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ForceDirectCapture"]; // Initialize from default
// Alignment adjustment parameters - managed separately
this.offsetX = 0;
+16 -3
View File
@@ -156,9 +156,22 @@ export class EventHandler {
// Force Direct Capture Toggle Key
if (e.key.toLowerCase() === config.forceDirectCaptureKey &&
(!config.altRequired || e.altKey)) {
config.forceDirectCapture = !config.forceDirectCapture;
this.magnifyGlass.debugger.log(`Force Direct Capture: ${config.forceDirectCapture ? 'ON' : 'OFF'}`);
this.magnifyGlass.updateMagnifiedView();
// Toggle via settings to sync with UI
const currentVal = !!config.forceDirectCapture;
// @ts-ignore
const app = window.app || (window.scripts && window.scripts.app);
if (app && app.ui && app.ui.settings) {
app.ui.settings.setSettingValue('🔍MagnifyGlass.ForceDirectCapture', !currentVal);
// The setting onChange handler will update config.forceDirectCapture and view
} else {
// Fallback if app settings not available
config.forceDirectCapture = !currentVal;
if ((window as any).comfyUIMagnifyGlass) {
(window as any).comfyUIMagnifyGlass.updateMagnifiedView();
}
}
Logger.info(`Force Direct Capture toggled: ${!currentVal}`);
e.preventDefault();
}
+1
View File
@@ -37,6 +37,7 @@ export const DEFAULT_GLASS_SETTINGS: GlassSettings = {
"🔍MagnifyGlass.ToggleFollowCursorKey": "h",
"🔍MagnifyGlass.ShowCursorPreview": false,
"🔍MagnifyGlass.ForceDirectCaptureKey": "d",
"🔍MagnifyGlass.ForceDirectCapture": false,
};
/**
+21
View File
@@ -288,6 +288,25 @@ export function registerGlassSettings(magnifyGlass: any): void {
}
}
});
app.ui.settings.addSetting({
id: "🔍MagnifyGlass.ForceDirectCapture",
name: "⚡ Magnify Glass: Force Direct Capture",
type: "combo",
options: [{ value: true, text: "Yes" }, { value: false, text: "No" }],
defaultValue: settings["🔍MagnifyGlass.ForceDirectCapture"] ?? false,
tooltip: "Force usage of Direct Capture mode even at low zoom levels.",
onChange: (value: any) => {
if (magnifyGlass?.config) {
// Update runtime flag
magnifyGlass.config.forceDirectCapture = !!value;
if (magnifyGlass.state.active) {
magnifyGlass.updateMagnifiedView();
}
}
}
});
app.ui.settings.addSetting({
id: "🔍MagnifyGlass.Action.ResetPosition",
name: "🔄 Magnify Glass: Reset Position",
@@ -334,7 +353,9 @@ export function registerGlassSettings(magnifyGlass: any): void {
app.ui.settings.setSettingValue('🔍MagnifyGlass.ToggleFollowCursorKey', 'h');
app.ui.settings.setSettingValue('🔍MagnifyGlass.AltRequired', false);
app.ui.settings.setSettingValue('🔍MagnifyGlass.OffsetStep', 5);
app.ui.settings.setSettingValue('🔍MagnifyGlass.OffsetStep', 5);
app.ui.settings.setSettingValue('🔍MagnifyGlass.ShowCursorPreview', false);
app.ui.settings.setSettingValue('🔍MagnifyGlass.ForceDirectCapture', false);
// Panel Defaults
+6
View File
@@ -406,6 +406,12 @@ export function renderSettingsPanel(container: HTMLElement): void {
`When enabled, glass stays visible. Toggle with ${activationKey}`
));
glassSection.body.appendChild(createToggle('Force Direct Capture',
getSettingValue('🔍MagnifyGlass.ForceDirectCapture', false),
(checked) => setSettingValue('🔍MagnifyGlass.ForceDirectCapture', checked),
`Force Direct Capture mode (accurate, pixel-perfect). Hotkey: ${getSettingValue('🔍MagnifyGlass.ForceDirectCaptureKey', 'd').toUpperCase()}`
));
glassSection.body.appendChild(createToggle('Show Mini Cursor',
getSettingValue('🔍MagnifyGlass.ShowCursorPreview', false),
(checked) => setSettingValue('🔍MagnifyGlass.ShowCursorPreview', checked),
+1 -1
View File
@@ -85,7 +85,7 @@ class ConfigManager {
this.toggleGlassPreviewKey = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.GlassPreviewToggleHotkey"];
this.showCursorPreview = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ShowCursorPreview"];
this.forceDirectCaptureKey = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ForceDirectCaptureKey"];
this.forceDirectCapture = false;
this.forceDirectCapture = DEFAULT_GLASS_SETTINGS["🔍MagnifyGlass.ForceDirectCapture"];
this.offsetX = 0;
this.offsetY = 0;
}
File diff suppressed because one or more lines are too long
+11 -3
View File
@@ -118,9 +118,17 @@ class EventHandler {
this.magnifyGlass.updateMagnifiedView();
}
if (e.key.toLowerCase() === config.forceDirectCaptureKey && (!config.altRequired || e.altKey)) {
config.forceDirectCapture = !config.forceDirectCapture;
this.magnifyGlass.debugger.log(`Force Direct Capture: ${config.forceDirectCapture ? "ON" : "OFF"}`);
this.magnifyGlass.updateMagnifiedView();
const currentVal = !!config.forceDirectCapture;
const app = window.app || window.scripts && window.scripts.app;
if (app && app.ui && app.ui.settings) {
app.ui.settings.setSettingValue("🔍MagnifyGlass.ForceDirectCapture", !currentVal);
} else {
config.forceDirectCapture = !currentVal;
if (window.comfyUIMagnifyGlass) {
window.comfyUIMagnifyGlass.updateMagnifiedView();
}
}
Logger.info(`Force Direct Capture toggled: ${!currentVal}`);
e.preventDefault();
}
if (e.shiftKey && e.key.toLowerCase() === "p") {
File diff suppressed because one or more lines are too long
+2 -1
View File
@@ -15,7 +15,8 @@ const DEFAULT_GLASS_SETTINGS = {
"🔍MagnifyGlass.TextureFiltering": "Linear",
"🔍MagnifyGlass.AlwaysActiveMode": true,
"🔍MagnifyGlass.ToggleFollowCursorKey": "h",
"🔍MagnifyGlass.ShowCursorPreview": false
"🔍MagnifyGlass.ShowCursorPreview": false,
"🔍MagnifyGlass.ForceDirectCapture": false
};
const DEFAULT_PANEL_SETTINGS = {
"🔍MagnifyGlass.InfoPanelEnabled": true,
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"defaults.js","sources":["../../../src/shared/settings/defaults.ts"],"sourcesContent":["/**\n * ComfyUI MagnifyGlass - Default Settings Values\n * \n * Default values for all magnify glass and info panel settings.\n */\n\nimport {\n DEFAULT_GLASS_SIZE,\n DEFAULT_ZOOM_FACTOR,\n DEFAULT_BORDER_WIDTH,\n DEFAULT_BORDER_COLOR,\n DEFAULT_OFFSET_STEP,\n DEFAULT_PANEL_WIDTH,\n DEFAULT_PANEL_MAX_HEIGHT,\n DEFAULT_PANEL_OPACITY\n} from '../constants';\nimport type { GlassSettings, PanelSettings } from './types';\n\n/**\n * Default settings for the magnify glass component.\n */\nexport const DEFAULT_GLASS_SETTINGS: GlassSettings = {\n \"🔍MagnifyGlass.ZoomFactor\": DEFAULT_ZOOM_FACTOR,\n \"🔍MagnifyGlass.GlassSize\": DEFAULT_GLASS_SIZE,\n \"🔍MagnifyGlass.BorderColor\": DEFAULT_BORDER_COLOR,\n \"🔍MagnifyGlass.BorderWidth\": DEFAULT_BORDER_WIDTH,\n \"🔍MagnifyGlass.ActivationKey\": \"x\",\n \"🔍MagnifyGlass.AltRequired\": false,\n \"🔍MagnifyGlass.FollowCursor\": false,\n \"🔍MagnifyGlass.OffsetStep\": DEFAULT_OFFSET_STEP,\n \"🔍MagnifyGlass.GlassPosition\": \"Top-Right\",\n \"🔍MagnifyGlass.ResetKey\": \"o\",\n \"🔍MagnifyGlass.GlassShape\": \"Rounded Square\",\n \"🔍MagnifyGlass.BorderEnabled\": true,\n \"🔍MagnifyGlass.TextureFiltering\": \"Linear\",\n \"🔍MagnifyGlass.AlwaysActiveMode\": true,\n \"🔍MagnifyGlass.ToggleFollowCursorKey\": \"h\",\n \"🔍MagnifyGlass.ShowCursorPreview\": false,\n \"🔍MagnifyGlass.ForceDirectCaptureKey\": \"d\",\n};\n\n/**\n * Default settings for the info panel component.\n */\nexport const DEFAULT_PANEL_SETTINGS: PanelSettings = {\n \"🔍MagnifyGlass.InfoPanelEnabled\": true,\n \"🔍MagnifyGlass.InfoPanelPosition\": \"Bottom\",\n \"🔍MagnifyGlass.InfoPanelWidth\": DEFAULT_PANEL_WIDTH,\n \"🔍MagnifyGlass.InfoPanelOpacity\": DEFAULT_PANEL_OPACITY,\n \"🔍MagnifyGlass.InfoPanelMaxHeight\": DEFAULT_PANEL_MAX_HEIGHT,\n \"🔍MagnifyGlass.InfoPanelAnimations\": false,\n \"🔍MagnifyGlass.ShowInspectorTab\": false,\n \"🔍MagnifyGlass.ToggleHotkey\": \"i\",\n \"🔍MagnifyGlass.GlassPreviewToggleHotkey\": \"g\",\n \"🔍MagnifyGlass.PinPanelHotkey\": \"u\",\n \"🔍MagnifyGlass.ShowHoveringControls\": true,\n \"🔍MagnifyGlass.ControlsPosition\": \"left\",\n \"🔍MagnifyGlass.InfoPanelTextColor\": \"#6b7280\",\n \"🔍MagnifyGlass.InfoPanelAccentColor\": \"#3b82f6\",\n \"🔍MagnifyGlass.InfoPanelFontSize\": 14,\n \"🔍MagnifyGlass.InfoPanelFontFamily\": \"System Default\",\n \"🔍MagnifyGlass.InfoPanelPersist\": false,\n};\n"],"names":[],"mappings":";AAqBO,MAAM,yBAAwC;AAAA,EACjD,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,gCAAgC;AAAA,EAChC,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,gCAAgC;AAAA,EAChC,mCAAmC;AAAA,EACnC,mCAAmC;AAAA,EACnC,wCAAwC;AAAA,EACxC,oCAAoC;AAExC;AAKO,MAAM,yBAAwC;AAAA,EACjD,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,sCAAsC;AAAA,EACtC,mCAAmC;AAAA,EACnC,+BAA+B;AAAA,EAC/B,2CAA2C;AAAA,EAC3C,iCAAiC;AAAA,EACjC,uCAAuC;AAAA,EACvC,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,uCAAuC;AAAA,EACvC,oCAAoC;AAAA,EACpC,sCAAsC;AAAA,EACtC,mCAAmC;AACvC;"}
{"version":3,"file":"defaults.js","sources":["../../../src/shared/settings/defaults.ts"],"sourcesContent":["/**\n * ComfyUI MagnifyGlass - Default Settings Values\n * \n * Default values for all magnify glass and info panel settings.\n */\n\nimport {\n DEFAULT_GLASS_SIZE,\n DEFAULT_ZOOM_FACTOR,\n DEFAULT_BORDER_WIDTH,\n DEFAULT_BORDER_COLOR,\n DEFAULT_OFFSET_STEP,\n DEFAULT_PANEL_WIDTH,\n DEFAULT_PANEL_MAX_HEIGHT,\n DEFAULT_PANEL_OPACITY\n} from '../constants';\nimport type { GlassSettings, PanelSettings } from './types';\n\n/**\n * Default settings for the magnify glass component.\n */\nexport const DEFAULT_GLASS_SETTINGS: GlassSettings = {\n \"🔍MagnifyGlass.ZoomFactor\": DEFAULT_ZOOM_FACTOR,\n \"🔍MagnifyGlass.GlassSize\": DEFAULT_GLASS_SIZE,\n \"🔍MagnifyGlass.BorderColor\": DEFAULT_BORDER_COLOR,\n \"🔍MagnifyGlass.BorderWidth\": DEFAULT_BORDER_WIDTH,\n \"🔍MagnifyGlass.ActivationKey\": \"x\",\n \"🔍MagnifyGlass.AltRequired\": false,\n \"🔍MagnifyGlass.FollowCursor\": false,\n \"🔍MagnifyGlass.OffsetStep\": DEFAULT_OFFSET_STEP,\n \"🔍MagnifyGlass.GlassPosition\": \"Top-Right\",\n \"🔍MagnifyGlass.ResetKey\": \"o\",\n \"🔍MagnifyGlass.GlassShape\": \"Rounded Square\",\n \"🔍MagnifyGlass.BorderEnabled\": true,\n \"🔍MagnifyGlass.TextureFiltering\": \"Linear\",\n \"🔍MagnifyGlass.AlwaysActiveMode\": true,\n \"🔍MagnifyGlass.ToggleFollowCursorKey\": \"h\",\n \"🔍MagnifyGlass.ShowCursorPreview\": false,\n \"🔍MagnifyGlass.ForceDirectCaptureKey\": \"d\",\n \"🔍MagnifyGlass.ForceDirectCapture\": false,\n};\n\n/**\n * Default settings for the info panel component.\n */\nexport const DEFAULT_PANEL_SETTINGS: PanelSettings = {\n \"🔍MagnifyGlass.InfoPanelEnabled\": true,\n \"🔍MagnifyGlass.InfoPanelPosition\": \"Bottom\",\n \"🔍MagnifyGlass.InfoPanelWidth\": DEFAULT_PANEL_WIDTH,\n \"🔍MagnifyGlass.InfoPanelOpacity\": DEFAULT_PANEL_OPACITY,\n \"🔍MagnifyGlass.InfoPanelMaxHeight\": DEFAULT_PANEL_MAX_HEIGHT,\n \"🔍MagnifyGlass.InfoPanelAnimations\": false,\n \"🔍MagnifyGlass.ShowInspectorTab\": false,\n \"🔍MagnifyGlass.ToggleHotkey\": \"i\",\n \"🔍MagnifyGlass.GlassPreviewToggleHotkey\": \"g\",\n \"🔍MagnifyGlass.PinPanelHotkey\": \"u\",\n \"🔍MagnifyGlass.ShowHoveringControls\": true,\n \"🔍MagnifyGlass.ControlsPosition\": \"left\",\n \"🔍MagnifyGlass.InfoPanelTextColor\": \"#6b7280\",\n \"🔍MagnifyGlass.InfoPanelAccentColor\": \"#3b82f6\",\n \"🔍MagnifyGlass.InfoPanelFontSize\": 14,\n \"🔍MagnifyGlass.InfoPanelFontFamily\": \"System Default\",\n \"🔍MagnifyGlass.InfoPanelPersist\": false,\n};\n"],"names":[],"mappings":";AAqBO,MAAM,yBAAwC;AAAA,EACjD,6BAA6B;AAAA,EAC7B,4BAA4B;AAAA,EAC5B,8BAA8B;AAAA,EAC9B,8BAA8B;AAAA,EAC9B,gCAAgC;AAAA,EAChC,8BAA8B;AAAA,EAC9B,+BAA+B;AAAA,EAC/B,6BAA6B;AAAA,EAC7B,gCAAgC;AAAA,EAChC,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,gCAAgC;AAAA,EAChC,mCAAmC;AAAA,EACnC,mCAAmC;AAAA,EACnC,wCAAwC;AAAA,EACxC,oCAAoC;AAAA,EAEpC,qCAAqC;AACzC;AAKO,MAAM,yBAAwC;AAAA,EACjD,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,iCAAiC;AAAA,EACjC,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,sCAAsC;AAAA,EACtC,mCAAmC;AAAA,EACnC,+BAA+B;AAAA,EAC/B,2CAA2C;AAAA,EAC3C,iCAAiC;AAAA,EACjC,uCAAuC;AAAA,EACvC,mCAAmC;AAAA,EACnC,qCAAqC;AAAA,EACrC,uCAAuC;AAAA,EACvC,oCAAoC;AAAA,EACpC,sCAAsC;AAAA,EACtC,mCAAmC;AACvC;"}
+18
View File
@@ -252,6 +252,22 @@ function registerGlassSettings(magnifyGlass) {
}
}
});
app.ui.settings.addSetting({
id: "🔍MagnifyGlass.ForceDirectCapture",
name: "⚡ Magnify Glass: Force Direct Capture",
type: "combo",
options: [{ value: true, text: "Yes" }, { value: false, text: "No" }],
defaultValue: settings["🔍MagnifyGlass.ForceDirectCapture"],
tooltip: "Force usage of Direct Capture mode even at low zoom levels.",
onChange: (value) => {
if (magnifyGlass == null ? void 0 : magnifyGlass.config) {
magnifyGlass.config.forceDirectCapture = !!value;
if (magnifyGlass.state.active) {
magnifyGlass.updateMagnifiedView();
}
}
}
});
app.ui.settings.addSetting({
id: "🔍MagnifyGlass.Action.ResetPosition",
name: "🔄 Magnify Glass: Reset Position",
@@ -296,7 +312,9 @@ function registerGlassSettings(magnifyGlass) {
app.ui.settings.setSettingValue("🔍MagnifyGlass.ToggleFollowCursorKey", "h");
app.ui.settings.setSettingValue("🔍MagnifyGlass.AltRequired", false);
app.ui.settings.setSettingValue("🔍MagnifyGlass.OffsetStep", 5);
app.ui.settings.setSettingValue("🔍MagnifyGlass.OffsetStep", 5);
app.ui.settings.setSettingValue("🔍MagnifyGlass.ShowCursorPreview", false);
app.ui.settings.setSettingValue("🔍MagnifyGlass.ForceDirectCapture", false);
app.ui.settings.setSettingValue("🔍MagnifyGlass.InfoPanelEnabled", true);
app.ui.settings.setSettingValue("🔍MagnifyGlass.InfoPanelPosition", "Bottom");
app.ui.settings.setSettingValue("🔍MagnifyGlass.InfoPanelWidth", 300);
File diff suppressed because one or more lines are too long
+6
View File
@@ -256,6 +256,12 @@ function renderSettingsPanel(container) {
(checked) => setSettingValue("🔍MagnifyGlass.AlwaysActiveMode", checked),
`When enabled, glass stays visible. Toggle with ${activationKey}`
));
glassSection.body.appendChild(createToggle(
"Force Direct Capture",
getSettingValue("🔍MagnifyGlass.ForceDirectCapture", false),
(checked) => setSettingValue("🔍MagnifyGlass.ForceDirectCapture", checked),
`Force Direct Capture mode (accurate, pixel-perfect). Hotkey: ${getSettingValue("🔍MagnifyGlass.ForceDirectCaptureKey", "d").toUpperCase()}`
));
glassSection.body.appendChild(createToggle(
"Show Mini Cursor",
getSettingValue("🔍MagnifyGlass.ShowCursorPreview", false),
File diff suppressed because one or more lines are too long