Point the .desktop Icon= at the installed PNG's absolute path instead of
a theme name, and rebuild KDE's menu cache (kbuildsycoca) after install.
Plasma otherwise showed the menu entry iconless until the cache refreshed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- viewer/mbq_viewer.sh: builds a venv in ~/.local/share/mbq-viewer on
first run (rebuilt when requirements.txt changes) and runs the viewer
from the repo checkout. --install adds an mbq-viewer command and an
app-menu entry; --uninstall removes them. Clears PYTHONPATH and
QT_PLUGIN_PATH so a Flame/DCC shell can't leak its PySide in.
- requirements: PySide6-Essentials instead of pyside6 (venv 685 MB ->
288 MB); the viewer only uses Core/Gui/Widgets/OpenGLWidgets.
- Fix window icon when run from source (assets/ moved to repo root).
- Set app name / desktop file name so Linux taskbars match the window
to mbq-viewer.desktop.
- .gitattributes: keep *.sh LF so Windows edits can't break bash.
- README: Linux install option, per-OS chooser, file map entries.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ComfyUI-Manager clones the whole repo into custom_nodes/comfyui-mbqwedge/ and
needs __init__.py directly at that root. Move the node package (__init__.py,
mbq_wedge.py, js/) up to repo root, and the viewer (mbq_viewer.py,
mbq_functions.py, mbq_parser.py) into viewer/. Swap the two requirements.txt
files accordingly (node needs none, viewer needs pyside6/send2trash) and fold
the node's README content into the root README, which remains the single
source of truth for both.
Fixed-factor wheel zoom (1.15x per tick) almost never lands exactly on 1.0
when crossing it, so 100% was only reachable via the R key. Detect the
crossing and use whatever factor lands exactly on 1.0 for that one step.
Add a level-of-detail swap in ImageCanvas so zooming out past 50% uses a
software-resampled downscale instead of relying on Qt's bilinear minification,
which aliases badly on high-frequency content like ComfyUI workspace
screenshots. Accounts for devicePixelRatio so HiDPI displays don't get a
second blur pass from the GPU re-upscaling an already-downsampled pixmap.
Also fixes Copy Image to always copy the full-res original rather than
whatever's currently rendered at the active zoom level.
The Comfy Registry manifest description still described the original
numeric-only wedge, undermining discoverability of the sampler/scheduler
sweep nodes added since.
Bring MBQ Wedge Sampler to filter parity with Scheduler; add a client-side
sanity check so only one MBQ wedge node can drive a sweep at a time, with a
safe single-job fallback when multiple are connected. Add filmstrip
multi-select (Shift/Ctrl-click) with batched delete and batched undo. Fix
wedge value display being stamped onto the wrong node, and the numeric
wedge's OUTPUT_IS_LIST still multiplying renders during the fallback path.
Refresh docs and bump version to 1.1.0.
- README: replace blog-intro with direct description; clarify MBQ Viewer
works on any ComfyUI PNG, not just MBQ Wedge outputs
- README: add Windows installer as Option A, portable exe as Option B,
source as Option C; include git clone step for source install
- mbq_viewer.py: bump version to 1.0.0
- .gitignore: add installer/ and *.iss
Folder renamed to match the install destination directly — users can now
copy/symlink as-is with no renaming step. README install instruction and
file map updated; ComfyUI-MBQWedge/README.md self-reference updated.
No code changes — __init__.py uses __file__-relative imports throughout.
Also remove stale assets/icon_candidate.png (replaced by mbq_icon.ico + emby_q.png).
mbq_functions.py:
- ImageFolder now populates subdirs list for filmstrip folder icons
mbq_viewer.py:
- Replace circular filmstrip with horizontal QScrollArea (_FILMSTRIP_MAX=500)
- Folders shown in full at left; images linear, capped at 500
- populate_filmstrip stores _thumb_labels for O(1) nav updates
- _scroll_to_current / _center_on_label: centred scroll with natural edge clamping
- Navigate up button; current path label; Up/Prev/Next button rename
- _show_empty_folder: canvas shows folder icon when dir has no images
- Overlay corner updates immediately on menu select (_set_wedge_corner)
- QShortcut WindowShortcut for ← → — works regardless of button focus
- filmstrip_scroll NoFocus policy prevents scroll area consuming arrows
- App icon loaded from assets/mbq_icon.ico at launch
assets: add mbq_icon.ico and emby_q.png; remove icon_candidate.png
pyproject.toml: set Icon, add 'parameter wedge' tag
MBQViewerLogicMixin was only ever used by one class. All navigation,
metadata display, and filmstrip methods now live directly in
MBQViewerApp(QMainWindow). mbq_logic.py removed.
- mbq_wedge.js: drop increment=1.0 patch in patchWedge so each PNG
retains the real sweep increment value for display
- mbq_browser/logic/functions/parser: remove dead scale_factor,
design_canvas/thumb constants, cache_size, initialize_scale,
update_scale_factor, preload_workflows, WorkflowCache.preload_batch/stats,
ImageFolder chunks placeholder, read_prompt_chunk
- Rename group boxes: "Image View"→"Image", "Metadata"→"Workflow"
- Button labels: ◀ Previous / Next ▶ arrow hints
- mbq_wedge.js: rebuild start/stop/increment as native INT or FLOAT widgets
using ComfyWidgets factory on connection change — fixes arrows and slider
feel for INT mode; 0.05 step on increment widget gives 2-decimal precision
- mbq_wedge.js: remove connection-checking from queue intercept; JS just
sweeps and embeds current — cleaner, less fragile against ComfyUI updates
- mbq_parser.py: get_wedge_data detects active connection by checking prompt
JSON wiring (parameter_name matches downstream input); disconnected or
preview-only wedge nodes return None, keeping the viewer display clean
- mbq_functions.py: fix overlay never appearing — show() before reposition()
so the label is visible when its position is calculated
- mbq_logic.py: MBQWedge at tier 1 when active sweep, tier 3 when inactive
- Remove leftover debug print statements
- Ctrl+Q quit / Ctrl+O open with menu shortcut display
- F key: Fit Lock bulb (teal) — auto-fits every image on switch;
mutually exclusive with Zoom Lock; R clears both
- Filmstrip drag-out: drag a thumbnail to Explorer or ComfyUI
(press records position, release jumps, move>8px initiates QDrag)
- Empty-canvas hint label on launch: "Drop an image here · Ctrl+O"
- Copy Summary / Copy Workflow button rename (was Copy Metadata)
- About dialog rewritten: OpenGL, MBQWedge, full shortcut list
- README.md: full project docs covering browser, MBQWedge node,
install, shortcuts, file map
- mbq_functions: wedge overlay is now a viewport QLabel — stays fixed in
corner regardless of zoom or pan (was a scene item, zoomed out of frame)
- mbq_logic / mbq_parser: integer-aware value formatting (steps: 4 not 4.00);
PNG chunk scanner refactored to single pass for prompt + workflow keys
- mbq_browser: Copy Prompt JSON button copies the workflow chunk (LiteGraph
format ComfyUI loads natively); wedge bulb uses muted blue (#4499cc)
- mbq_wedge.js: seed control respected across sweep jobs — afterQueued fired
+ graph re-serialized between jobs so randomize/increment/decrement work;
_current widget displays typed (int vs float); INT mode snaps display via
options.precision
MBQWedge's JS extension now intercepts api.queuePrompt and expands a
single sweep submission into N separate single-value jobs. Each job has
start=stop=V and current=V patched into MBQWedge's inputs, so every PNG
carries the exact swept value in its embedded prompt chunk — no folder-
position inference needed. Mirrors ComfyUI's own seed-randomization pattern.
Other changes:
- Renamed step_size → increment, reordered inputs to start/stop/increment
- Added _current RO display widget (shows first iteration value live)
- Fixed JS import (api from /scripts/api.js, not app.js)
- Fixed return value from intercepted queuePrompt (node_errors crash)
- mbq_parser: reads embedded current field; returns increment key
- mbq_logic: _infer_wedge_value fallback for legacy images; filmstrip wrap fix
- mbq_browser: QActionGroup import fix; overlay opacity 50%
- Add live 'will produce → N iterations' read-only label widget (italic, custom draw)
- Switch numeric widget precision between 0 (int) and 2 (float) based on which output is connected
- Auto-disconnect the other output socket when INT or FLOAT is newly wired (mutual exclusivity)
- Re-entrancy guards (_mbqUpdating, _mbqDisconnecting) prevent callback loops
- Remove batch_size concept; drop decimals widget from README and examples
- Document that all iterations must complete before output appears
Replace relative import with sys.path insert so ComfyUI can load the
node despite the hyphenated folder name. Add JS extension that hooks
onConnectOutput to auto-populate parameter_name with the target slot's
name when a connection is made.
Single node with INT + FLOAT output sockets; ComfyUI greys out the
wrong socket type when dragging a link. Sweep uses Decimal arithmetic
for clean float values. MBQ reads parameter_name from the prompt
chunk and overlays the current swept value on the canvas. Wedge bulb
now driven by parsed wedge data. Help URL wired to the actual repo.
- Menu bar: File (Open Image, Open Path, Exit), Edit (Copy Image,
Copy Workflow), View (Lock Zoom Z, Reset Zoom R, Freeze Scroll S),
About (About MBQ, Help placeholder)
- Status bulbs: Wedge, Zoom, Scroll, UnComfy — in button row
- Zoom: wheel-to-zoom anchored at cursor, left-drag pan, middle-click
reset (6px forgiveness), R key reset; default load at 100% not fit
- Scroll freeze: preserves metadata scroll position as fraction across
image switches; flicker suppressed with setUpdatesEnabled
- Plumbing panel stays open across image switches
- Filmstrip replaced QScrollArea with plain QFrame (no vertical drift)
- Zoom % readout in metadata panel, rounded to nearest 5%
- Arrow glyph on plumbing toggle enlarged via HTML span