SideFX Houdini customization package
git clone https://git.lucas.co/hou-control.git
netcursor: colour and scale settings, cursor picture painted on demand
The network cursor's box was one of 144 static PNGs, all the same gold, and
hou.NetworkImage can only brighten a picture, not tint it. hcnetcursorimage
now paints the outline into the session temp dir the first time a size and
colour are asked for, so hcnetcursor_color is a real setting. The static
asset set is removed; background images that still name it (hips saved with
the cursor showing) are matched on basename and dropped.
hcnetcursor_scale sizes the drawn box relative to the cells it covers,
about their centre; selection and movement keep using the whole cells.
The settings panel gets a Network Cursor group holding the enable switch
(relabelled from "hcnetcursor" to "Network Cursor"), the colour and the
scale. tools/check.py paints a picture to spec and checks the caching,
the stale-path filter and the schema.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
CLAUDE.md | 1 +
config/hcnetcursor_assets/hcnetcursor_10x1.png | Bin 1108 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x10.png | Bin 9794 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x11.png | Bin 10709 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x12.png | Bin 11671 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x2.png | Bin 2083 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x3.png | Bin 3058 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x4.png | Bin 4021 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x5.png | Bin 4984 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x6.png | Bin 5944 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x7.png | Bin 6907 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x8.png | Bin 7869 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_10x9.png | Bin 8832 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x1.png | Bin 1221 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x10.png | Bin 10879 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x11.png | Bin 11954 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x12.png | Bin 13029 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x2.png | Bin 2308 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x3.png | Bin 3396 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x4.png | Bin 4475 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x5.png | Bin 5547 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x6.png | Bin 6622 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x7.png | Bin 7697 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x8.png | Bin 8772 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_11x9.png | Bin 9847 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x1.png | Bin 1311 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x10.png | Bin 11763 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x11.png | Bin 12926 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x12.png | Bin 14088 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x2.png | Bin 2486 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x3.png | Bin 3661 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x4.png | Bin 4832 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x5.png | Bin 5989 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x6.png | Bin 7152 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x7.png | Bin 8314 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x8.png | Bin 9477 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_12x9.png | Bin 10601 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x1.png | Bin 307 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x10.png | Bin 2171 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x11.png | Bin 2380 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x12.png | Bin 2585 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x2.png | Bin 513 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x3.png | Bin 721 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x4.png | Bin 928 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x5.png | Bin 1136 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x6.png | Bin 1342 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x7.png | Bin 1551 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x8.png | Bin 1756 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_1x9.png | Bin 1965 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x1.png | Bin 409 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x10.png | Bin 3110 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x11.png | Bin 3407 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x12.png | Bin 3709 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x2.png | Bin 708 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x3.png | Bin 1009 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x4.png | Bin 1310 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x5.png | Bin 1608 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x6.png | Bin 1908 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x7.png | Bin 2209 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x8.png | Bin 2508 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_2x9.png | Bin 2808 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x1.png | Bin 508 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x10.png | Bin 4036 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x11.png | Bin 4428 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x12.png | Bin 4818 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x2.png | Bin 898 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x3.png | Bin 1293 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x4.png | Bin 1683 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x5.png | Bin 2076 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x6.png | Bin 2467 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x7.png | Bin 2860 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x8.png | Bin 3252 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_3x9.png | Bin 3644 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x1.png | Bin 591 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x10.png | Bin 4808 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x11.png | Bin 5277 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x12.png | Bin 5743 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x2.png | Bin 1063 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x3.png | Bin 1530 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x4.png | Bin 1998 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x5.png | Bin 2467 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x6.png | Bin 2935 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x7.png | Bin 3403 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x8.png | Bin 3871 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_4x9.png | Bin 4341 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x1.png | Bin 668 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x10.png | Bin 5597 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x11.png | Bin 6153 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x12.png | Bin 6697 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x2.png | Bin 1224 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x3.png | Bin 1766 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x4.png | Bin 2319 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x5.png | Bin 2859 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x6.png | Bin 3412 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x7.png | Bin 3949 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x8.png | Bin 4505 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_5x9.png | Bin 5048 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x1.png | Bin 823 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x10.png | Bin 7138 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x11.png | Bin 7838 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x12.png | Bin 8538 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x2.png | Bin 1533 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x3.png | Bin 2233 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x4.png | Bin 2933 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x5.png | Bin 3633 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x6.png | Bin 4333 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x7.png | Bin 5033 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x8.png | Bin 5733 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_6x9.png | Bin 6438 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x1.png | Bin 902 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x10.png | Bin 7895 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x11.png | Bin 8670 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x12.png | Bin 9445 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x2.png | Bin 1690 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x3.png | Bin 2466 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x4.png | Bin 3241 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x5.png | Bin 4016 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x6.png | Bin 4791 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x7.png | Bin 5566 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x8.png | Bin 6345 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_7x9.png | Bin 7120 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x1.png | Bin 983 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x10.png | Bin 8652 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x11.png | Bin 9502 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x12.png | Bin 10352 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x2.png | Bin 1845 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x3.png | Bin 2701 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x4.png | Bin 3551 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x5.png | Bin 4401 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x6.png | Bin 5251 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x7.png | Bin 6102 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x8.png | Bin 6952 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_8x9.png | Bin 7802 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x1.png | Bin 1060 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x10.png | Bin 9405 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x11.png | Bin 10330 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x12.png | Bin 11197 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x2.png | Bin 1997 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x3.png | Bin 2932 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x4.png | Bin 3857 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x5.png | Bin 4782 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x6.png | Bin 5705 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x7.png | Bin 6630 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x8.png | Bin 7555 -> 0 bytes
config/hcnetcursor_assets/hcnetcursor_9x9.png | Bin 8480 -> 0 bytes
python3.13libs/hc/hcnetcursorimage.py | 81 ++++++++++++++++++++++++
python3.13libs/hc/hcnetworkeditor.py | 53 ++++++----------
python3.13libs/hc/hcschema.py | 18 ++++--
python3.13libs/hc/hcsettings.py | 13 ++++
tools/check.py | 67 ++++++++++++++++++++
150 files changed, 196 insertions(+), 37 deletions(-)
diff --git a/CLAUDE.md b/CLAUDE.md
index 4837523..a059c14 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -46,6 +46,7 @@ Key hierarchy:
- **`hccommands.py`** — the `@command("Label")` decorator and the registry that reads it. A command's panel label lives on the method itself. `tabs=(...)` restricts a command to certain tab `.type()` strings, needed for the few commands defined on `HCTab` that only make sense on some tabs.
- **`HCMaps`** (`hcmaps.py`) — generated, not hand-written. `commands(session, pane, tab)` binds every `@command` reachable from those three objects, filtered by tab type. `HCSession.hcPanel()` calls it and hands the result to `SelectionDialog`.
- **`hcstate.py`** — all per-pane and per-network state, in one place with one key scheme. Wrappers are stateless (Houdini hands out fresh SWIG wrappers per callback and holding one is a crash), so anything persisting between events goes in a `Store` here. Two scopes: `hcstate.PANE` and `hcstate.NETWORK` (`(pane id, network path)`). Entries for closed panes are swept periodically — pane ids get reused.
+- **`hcnetcursorimage.py`** — paints the network cursor's picture (a `hou.NetworkImage` outline) on demand into `$HOUDINI_TEMP_DIR/hc_hcnetcursor/`, one file per cell size and colour. Houdini cannot tint a background image, which is why the `hcnetcursor_color` setting needs a painted file; this replaced 144 static PNGs in `config/hcnetcursor_assets`, a path old hips may still carry in their background image lists (`is_cursor_image` matches on basename so they are filtered out).
- **`hcschema.py`** — one `Setting` per configurable value: kind, default, label, range. `HCSettings.DEFAULTS` and every control in `HCSettingsPanel` are generated from it.
- **`HCWidgets`** (`hcwidgets.py`) — PySide6 widgets, notably `SelectionDialog` used for the HC Panel.
- **`HCSettingsPanel`** (`hcsettings.py`) — the settings form. It is a plain `QWidget`, not a dialog, because it is served as a Python Panel (see `python_panels/` below) and Houdini adopts it into a pane tab. Keep it a `QWidget`: a `QDialog` in a pane tab keeps dialog behaviour, and Houdini overwrites the `objectName` of a widget it adopts, so don't try to find it by object name.
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x1.png b/config/hcnetcursor_assets/hcnetcursor_10x1.png
deleted file mode 100644
index 80148d3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x10.png b/config/hcnetcursor_assets/hcnetcursor_10x10.png
deleted file mode 100644
index 03089ea..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x11.png b/config/hcnetcursor_assets/hcnetcursor_10x11.png
deleted file mode 100644
index 56e3407..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x12.png b/config/hcnetcursor_assets/hcnetcursor_10x12.png
deleted file mode 100644
index ad18510..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x2.png b/config/hcnetcursor_assets/hcnetcursor_10x2.png
deleted file mode 100644
index 85c257e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x3.png b/config/hcnetcursor_assets/hcnetcursor_10x3.png
deleted file mode 100644
index 0992444..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x4.png b/config/hcnetcursor_assets/hcnetcursor_10x4.png
deleted file mode 100644
index bfa9f1d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x5.png b/config/hcnetcursor_assets/hcnetcursor_10x5.png
deleted file mode 100644
index 75ab68c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x6.png b/config/hcnetcursor_assets/hcnetcursor_10x6.png
deleted file mode 100644
index 0a241da..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x7.png b/config/hcnetcursor_assets/hcnetcursor_10x7.png
deleted file mode 100644
index 14cf439..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x8.png b/config/hcnetcursor_assets/hcnetcursor_10x8.png
deleted file mode 100644
index ba0d06f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_10x9.png b/config/hcnetcursor_assets/hcnetcursor_10x9.png
deleted file mode 100644
index 7a506a8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_10x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x1.png b/config/hcnetcursor_assets/hcnetcursor_11x1.png
deleted file mode 100644
index 708ae0e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x10.png b/config/hcnetcursor_assets/hcnetcursor_11x10.png
deleted file mode 100644
index 28dee78..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x11.png b/config/hcnetcursor_assets/hcnetcursor_11x11.png
deleted file mode 100644
index d6ca30e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x12.png b/config/hcnetcursor_assets/hcnetcursor_11x12.png
deleted file mode 100644
index d437b06..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x2.png b/config/hcnetcursor_assets/hcnetcursor_11x2.png
deleted file mode 100644
index 38ecbeb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x3.png b/config/hcnetcursor_assets/hcnetcursor_11x3.png
deleted file mode 100644
index 0c729ea..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x4.png b/config/hcnetcursor_assets/hcnetcursor_11x4.png
deleted file mode 100644
index d15c2f4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x5.png b/config/hcnetcursor_assets/hcnetcursor_11x5.png
deleted file mode 100644
index 1bd2173..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x6.png b/config/hcnetcursor_assets/hcnetcursor_11x6.png
deleted file mode 100644
index 72d7bcf..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x7.png b/config/hcnetcursor_assets/hcnetcursor_11x7.png
deleted file mode 100644
index 523dd46..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x8.png b/config/hcnetcursor_assets/hcnetcursor_11x8.png
deleted file mode 100644
index 74c6b9a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_11x9.png b/config/hcnetcursor_assets/hcnetcursor_11x9.png
deleted file mode 100644
index 21ee4f9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_11x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x1.png b/config/hcnetcursor_assets/hcnetcursor_12x1.png
deleted file mode 100644
index f704803..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x10.png b/config/hcnetcursor_assets/hcnetcursor_12x10.png
deleted file mode 100644
index d632a89..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x11.png b/config/hcnetcursor_assets/hcnetcursor_12x11.png
deleted file mode 100644
index 5add66b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x12.png b/config/hcnetcursor_assets/hcnetcursor_12x12.png
deleted file mode 100644
index b29ce39..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x2.png b/config/hcnetcursor_assets/hcnetcursor_12x2.png
deleted file mode 100644
index 08868c4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x3.png b/config/hcnetcursor_assets/hcnetcursor_12x3.png
deleted file mode 100644
index 7bd9ddc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x4.png b/config/hcnetcursor_assets/hcnetcursor_12x4.png
deleted file mode 100644
index f678392..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x5.png b/config/hcnetcursor_assets/hcnetcursor_12x5.png
deleted file mode 100644
index 0b2d7d9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x6.png b/config/hcnetcursor_assets/hcnetcursor_12x6.png
deleted file mode 100644
index d621798..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x7.png b/config/hcnetcursor_assets/hcnetcursor_12x7.png
deleted file mode 100644
index 4bbcdb3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x8.png b/config/hcnetcursor_assets/hcnetcursor_12x8.png
deleted file mode 100644
index ca50fb9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_12x9.png b/config/hcnetcursor_assets/hcnetcursor_12x9.png
deleted file mode 100644
index 332138c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_12x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x1.png b/config/hcnetcursor_assets/hcnetcursor_1x1.png
deleted file mode 100644
index 6a90f95..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x10.png b/config/hcnetcursor_assets/hcnetcursor_1x10.png
deleted file mode 100644
index 96097dd..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x11.png b/config/hcnetcursor_assets/hcnetcursor_1x11.png
deleted file mode 100644
index bc7f7fb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x12.png b/config/hcnetcursor_assets/hcnetcursor_1x12.png
deleted file mode 100644
index be02c85..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x2.png b/config/hcnetcursor_assets/hcnetcursor_1x2.png
deleted file mode 100644
index 5c64bcc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x3.png b/config/hcnetcursor_assets/hcnetcursor_1x3.png
deleted file mode 100644
index 46e8f0b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x4.png b/config/hcnetcursor_assets/hcnetcursor_1x4.png
deleted file mode 100644
index 74ff20c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x5.png b/config/hcnetcursor_assets/hcnetcursor_1x5.png
deleted file mode 100644
index 43de33a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x6.png b/config/hcnetcursor_assets/hcnetcursor_1x6.png
deleted file mode 100644
index 827cf82..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x7.png b/config/hcnetcursor_assets/hcnetcursor_1x7.png
deleted file mode 100644
index 2358d12..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x8.png b/config/hcnetcursor_assets/hcnetcursor_1x8.png
deleted file mode 100644
index 57b4dfb..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_1x9.png b/config/hcnetcursor_assets/hcnetcursor_1x9.png
deleted file mode 100644
index dfbe00b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_1x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x1.png b/config/hcnetcursor_assets/hcnetcursor_2x1.png
deleted file mode 100644
index 85432ca..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x10.png b/config/hcnetcursor_assets/hcnetcursor_2x10.png
deleted file mode 100644
index 9cecd47..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x11.png b/config/hcnetcursor_assets/hcnetcursor_2x11.png
deleted file mode 100644
index 77b950d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x12.png b/config/hcnetcursor_assets/hcnetcursor_2x12.png
deleted file mode 100644
index 355a9a1..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x2.png b/config/hcnetcursor_assets/hcnetcursor_2x2.png
deleted file mode 100644
index 3f92ac5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x3.png b/config/hcnetcursor_assets/hcnetcursor_2x3.png
deleted file mode 100644
index bbd4cb5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x4.png b/config/hcnetcursor_assets/hcnetcursor_2x4.png
deleted file mode 100644
index c1f23f6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x5.png b/config/hcnetcursor_assets/hcnetcursor_2x5.png
deleted file mode 100644
index 15cc0c6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x6.png b/config/hcnetcursor_assets/hcnetcursor_2x6.png
deleted file mode 100644
index 2b366b0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x7.png b/config/hcnetcursor_assets/hcnetcursor_2x7.png
deleted file mode 100644
index 54e872b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x8.png b/config/hcnetcursor_assets/hcnetcursor_2x8.png
deleted file mode 100644
index dd03913..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_2x9.png b/config/hcnetcursor_assets/hcnetcursor_2x9.png
deleted file mode 100644
index 9a80c36..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_2x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x1.png b/config/hcnetcursor_assets/hcnetcursor_3x1.png
deleted file mode 100644
index e981767..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x10.png b/config/hcnetcursor_assets/hcnetcursor_3x10.png
deleted file mode 100644
index fca83a8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x11.png b/config/hcnetcursor_assets/hcnetcursor_3x11.png
deleted file mode 100644
index 8b1db3d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x12.png b/config/hcnetcursor_assets/hcnetcursor_3x12.png
deleted file mode 100644
index 071fd94..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x2.png b/config/hcnetcursor_assets/hcnetcursor_3x2.png
deleted file mode 100644
index a744007..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x3.png b/config/hcnetcursor_assets/hcnetcursor_3x3.png
deleted file mode 100644
index 592ec22..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x4.png b/config/hcnetcursor_assets/hcnetcursor_3x4.png
deleted file mode 100644
index 99f91b0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x5.png b/config/hcnetcursor_assets/hcnetcursor_3x5.png
deleted file mode 100644
index a737e81..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x6.png b/config/hcnetcursor_assets/hcnetcursor_3x6.png
deleted file mode 100644
index d9af65b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x7.png b/config/hcnetcursor_assets/hcnetcursor_3x7.png
deleted file mode 100644
index 7a9e27a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x8.png b/config/hcnetcursor_assets/hcnetcursor_3x8.png
deleted file mode 100644
index 6747c57..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_3x9.png b/config/hcnetcursor_assets/hcnetcursor_3x9.png
deleted file mode 100644
index 41a9582..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_3x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x1.png b/config/hcnetcursor_assets/hcnetcursor_4x1.png
deleted file mode 100644
index 3335b6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x10.png b/config/hcnetcursor_assets/hcnetcursor_4x10.png
deleted file mode 100644
index a98931d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x11.png b/config/hcnetcursor_assets/hcnetcursor_4x11.png
deleted file mode 100644
index 6a5bc79..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x12.png b/config/hcnetcursor_assets/hcnetcursor_4x12.png
deleted file mode 100644
index 0f3cf02..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x2.png b/config/hcnetcursor_assets/hcnetcursor_4x2.png
deleted file mode 100644
index f9b086f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x3.png b/config/hcnetcursor_assets/hcnetcursor_4x3.png
deleted file mode 100644
index 7d4723f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x4.png b/config/hcnetcursor_assets/hcnetcursor_4x4.png
deleted file mode 100644
index 8731417..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x5.png b/config/hcnetcursor_assets/hcnetcursor_4x5.png
deleted file mode 100644
index 61f923d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x6.png b/config/hcnetcursor_assets/hcnetcursor_4x6.png
deleted file mode 100644
index 2989737..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x7.png b/config/hcnetcursor_assets/hcnetcursor_4x7.png
deleted file mode 100644
index 022ef2e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x8.png b/config/hcnetcursor_assets/hcnetcursor_4x8.png
deleted file mode 100644
index 20585a6..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_4x9.png b/config/hcnetcursor_assets/hcnetcursor_4x9.png
deleted file mode 100644
index f6bd879..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_4x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x1.png b/config/hcnetcursor_assets/hcnetcursor_5x1.png
deleted file mode 100644
index f71014e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x10.png b/config/hcnetcursor_assets/hcnetcursor_5x10.png
deleted file mode 100644
index 0aa7910..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x11.png b/config/hcnetcursor_assets/hcnetcursor_5x11.png
deleted file mode 100644
index a2cbb3d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x12.png b/config/hcnetcursor_assets/hcnetcursor_5x12.png
deleted file mode 100644
index ddda85e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x2.png b/config/hcnetcursor_assets/hcnetcursor_5x2.png
deleted file mode 100644
index 7de2a1f..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x3.png b/config/hcnetcursor_assets/hcnetcursor_5x3.png
deleted file mode 100644
index 6308826..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x4.png b/config/hcnetcursor_assets/hcnetcursor_5x4.png
deleted file mode 100644
index 96b90f0..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x5.png b/config/hcnetcursor_assets/hcnetcursor_5x5.png
deleted file mode 100644
index dbffaa4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x6.png b/config/hcnetcursor_assets/hcnetcursor_5x6.png
deleted file mode 100644
index 04de009..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x7.png b/config/hcnetcursor_assets/hcnetcursor_5x7.png
deleted file mode 100644
index 3c0bbc2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x8.png b/config/hcnetcursor_assets/hcnetcursor_5x8.png
deleted file mode 100644
index f05354b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_5x9.png b/config/hcnetcursor_assets/hcnetcursor_5x9.png
deleted file mode 100644
index 44891b2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_5x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x1.png b/config/hcnetcursor_assets/hcnetcursor_6x1.png
deleted file mode 100644
index 85313ee..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x10.png b/config/hcnetcursor_assets/hcnetcursor_6x10.png
deleted file mode 100644
index 6f1790c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x11.png b/config/hcnetcursor_assets/hcnetcursor_6x11.png
deleted file mode 100644
index 38756c9..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x12.png b/config/hcnetcursor_assets/hcnetcursor_6x12.png
deleted file mode 100644
index 808905d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x2.png b/config/hcnetcursor_assets/hcnetcursor_6x2.png
deleted file mode 100644
index 1929584..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x3.png b/config/hcnetcursor_assets/hcnetcursor_6x3.png
deleted file mode 100644
index 5bea3c7..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x4.png b/config/hcnetcursor_assets/hcnetcursor_6x4.png
deleted file mode 100644
index 6cda597..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x5.png b/config/hcnetcursor_assets/hcnetcursor_6x5.png
deleted file mode 100644
index ec82922..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x6.png b/config/hcnetcursor_assets/hcnetcursor_6x6.png
deleted file mode 100644
index a88c7dd..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x7.png b/config/hcnetcursor_assets/hcnetcursor_6x7.png
deleted file mode 100644
index 85e5777..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x8.png b/config/hcnetcursor_assets/hcnetcursor_6x8.png
deleted file mode 100644
index a276f84..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_6x9.png b/config/hcnetcursor_assets/hcnetcursor_6x9.png
deleted file mode 100644
index b5594fe..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_6x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x1.png b/config/hcnetcursor_assets/hcnetcursor_7x1.png
deleted file mode 100644
index 2b45822..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x10.png b/config/hcnetcursor_assets/hcnetcursor_7x10.png
deleted file mode 100644
index d32ca6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x11.png b/config/hcnetcursor_assets/hcnetcursor_7x11.png
deleted file mode 100644
index f7a91d3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x12.png b/config/hcnetcursor_assets/hcnetcursor_7x12.png
deleted file mode 100644
index e5d1364..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x2.png b/config/hcnetcursor_assets/hcnetcursor_7x2.png
deleted file mode 100644
index 4467645..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x3.png b/config/hcnetcursor_assets/hcnetcursor_7x3.png
deleted file mode 100644
index 07fa672..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x4.png b/config/hcnetcursor_assets/hcnetcursor_7x4.png
deleted file mode 100644
index e531370..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x5.png b/config/hcnetcursor_assets/hcnetcursor_7x5.png
deleted file mode 100644
index b6c6c81..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x6.png b/config/hcnetcursor_assets/hcnetcursor_7x6.png
deleted file mode 100644
index faa1ff4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x7.png b/config/hcnetcursor_assets/hcnetcursor_7x7.png
deleted file mode 100644
index a8edcb5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x8.png b/config/hcnetcursor_assets/hcnetcursor_7x8.png
deleted file mode 100644
index 73fb9d4..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_7x9.png b/config/hcnetcursor_assets/hcnetcursor_7x9.png
deleted file mode 100644
index bcb3c1e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_7x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x1.png b/config/hcnetcursor_assets/hcnetcursor_8x1.png
deleted file mode 100644
index 1a9bd78..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x10.png b/config/hcnetcursor_assets/hcnetcursor_8x10.png
deleted file mode 100644
index f292faf..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x11.png b/config/hcnetcursor_assets/hcnetcursor_8x11.png
deleted file mode 100644
index 9f52977..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x12.png b/config/hcnetcursor_assets/hcnetcursor_8x12.png
deleted file mode 100644
index 5783df3..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x2.png b/config/hcnetcursor_assets/hcnetcursor_8x2.png
deleted file mode 100644
index 8983603..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x3.png b/config/hcnetcursor_assets/hcnetcursor_8x3.png
deleted file mode 100644
index 268d08c..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x4.png b/config/hcnetcursor_assets/hcnetcursor_8x4.png
deleted file mode 100644
index 20ce809..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x5.png b/config/hcnetcursor_assets/hcnetcursor_8x5.png
deleted file mode 100644
index 5816095..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x6.png b/config/hcnetcursor_assets/hcnetcursor_8x6.png
deleted file mode 100644
index 6b1184e..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x7.png b/config/hcnetcursor_assets/hcnetcursor_8x7.png
deleted file mode 100644
index 03eb669..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x8.png b/config/hcnetcursor_assets/hcnetcursor_8x8.png
deleted file mode 100644
index 2042f43..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_8x9.png b/config/hcnetcursor_assets/hcnetcursor_8x9.png
deleted file mode 100644
index 23cf7b8..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_8x9.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x1.png b/config/hcnetcursor_assets/hcnetcursor_9x1.png
deleted file mode 100644
index 92ce1e5..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x1.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x10.png b/config/hcnetcursor_assets/hcnetcursor_9x10.png
deleted file mode 100644
index 0825986..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x10.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x11.png b/config/hcnetcursor_assets/hcnetcursor_9x11.png
deleted file mode 100644
index 7f00afc..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x11.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x12.png b/config/hcnetcursor_assets/hcnetcursor_9x12.png
deleted file mode 100644
index f16bd0a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x12.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x2.png b/config/hcnetcursor_assets/hcnetcursor_9x2.png
deleted file mode 100644
index 3c0831a..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x2.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x3.png b/config/hcnetcursor_assets/hcnetcursor_9x3.png
deleted file mode 100644
index 0c5b766..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x3.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x4.png b/config/hcnetcursor_assets/hcnetcursor_9x4.png
deleted file mode 100644
index b765d6b..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x4.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x5.png b/config/hcnetcursor_assets/hcnetcursor_9x5.png
deleted file mode 100644
index a3e2537..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x5.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x6.png b/config/hcnetcursor_assets/hcnetcursor_9x6.png
deleted file mode 100644
index 0cb5cd2..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x6.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x7.png b/config/hcnetcursor_assets/hcnetcursor_9x7.png
deleted file mode 100644
index 4b89cd7..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x7.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x8.png b/config/hcnetcursor_assets/hcnetcursor_9x8.png
deleted file mode 100644
index 7d4b75d..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x8.png and /dev/null differ
diff --git a/config/hcnetcursor_assets/hcnetcursor_9x9.png b/config/hcnetcursor_assets/hcnetcursor_9x9.png
deleted file mode 100644
index 0462859..0000000
Binary files a/config/hcnetcursor_assets/hcnetcursor_9x9.png and /dev/null differ
diff --git a/python3.13libs/hc/hcnetcursorimage.py b/python3.13libs/hc/hcnetcursorimage.py
new file mode 100644
index 0000000..5419fef
--- /dev/null
+++ b/python3.13libs/hc/hcnetcursorimage.py
@@ -0,0 +1,81 @@
+"""The network cursor's picture, drawn on demand.
+
+The cursor is a hou.NetworkImage stretched over the cells it covers. Houdini
+can only brighten a background image, not tint it, so a configurable colour
+means a differently coloured file. This used to be 144 static PNGs in
+config/hcnetcursor_assets, one per cell size, all the same gold; now the
+picture is painted the first time a (cells, colour) pair is asked for and
+cached in the session's temp dir.
+
+The look is the old asset set's: CELL_PIXELS per grid cell, transparent
+inside, a BORDER-pixel outline. The outline is a fixed pixel width in the
+image, and the image is stretched over the rect, so on screen it stays the
+same fraction of a cell whatever the cursor's size.
+"""
+
+import os
+import tempfile
+
+import hou
+
+CELL_PIXELS = (200, 100) # image pixels per grid cell, x and y
+BORDER = 5 # outline width, in image pixels
+MAX_CELLS = 12 # the old asset set stopped here; larger cursors reuse it
+
+_generated = {}
+
+
+def cache_dir():
+ base = hou.getenv("HOUDINI_TEMP_DIR") or tempfile.gettempdir()
+ return os.path.join(base, "hc_hcnetcursor")
+
+
+def is_cursor_image(path):
+ """Whether a background image path is one of ours, from any session.
+
+ Matched on the basename only: a hip saved with the cursor showing keeps
+ the image in the network's background list, and the directory in that
+ path may be an old temp dir or the retired config/hcnetcursor_assets.
+ """
+ return os.path.basename(path).startswith("hcnetcursor_")
+
+
+def image_file(width_cells, height_cells, color_hex):
+ """Path of the cursor picture for this many cells in this colour."""
+ width_cells = max(1, min(int(width_cells), MAX_CELLS))
+ height_cells = max(1, min(int(height_cells), MAX_CELLS))
+ color_hex = color_hex.lstrip("#").lower()
+ path = os.path.join(cache_dir(),
+ f"hcnetcursor_{width_cells}x{height_cells}_{color_hex}.png")
+ # Asked on every network editor event; paint once per session.
+ if _generated.get(path) or os.path.exists(path):
+ _generated[path] = True
+ return path
+ paint(path, width_cells, height_cells, "#" + color_hex)
+ _generated[path] = True
+ return path
+
+
+def paint(path, width_cells, height_cells, color_hex):
+ from PySide6.QtCore import Qt
+ from PySide6.QtGui import QColor, QImage, QPainter, QPen
+
+ width = CELL_PIXELS[0] * width_cells
+ height = CELL_PIXELS[1] * height_cells
+ image = QImage(width, height, QImage.Format_ARGB32)
+ image.fill(Qt.transparent)
+ painter = QPainter(image)
+ pen = QPen(QColor(color_hex), BORDER)
+ pen.setJoinStyle(Qt.MiterJoin)
+ painter.setPen(pen)
+ painter.setBrush(Qt.NoBrush)
+ # A pen is centred on the path; inset by half so the outline sits fully
+ # inside the image, as the old assets did.
+ half = BORDER / 2.0
+ painter.drawRect(half, half, width - BORDER, height - BORDER)
+ painter.end()
+
+ os.makedirs(os.path.dirname(path), exist_ok=True)
+ if not image.save(path):
+ raise RuntimeError(f"could not write cursor image {path}")
+ return path
diff --git a/python3.13libs/hc/hcnetworkeditor.py b/python3.13libs/hc/hcnetworkeditor.py
index 4d367bd..ce11003 100644
--- a/python3.13libs/hc/hcnetworkeditor.py
+++ b/python3.13libs/hc/hcnetworkeditor.py
@@ -1,5 +1,5 @@
import hou, math, os, types
-from . import hcstate
+from . import hcnetcursorimage, hcstate
from .hcpathtab import HCPathTab
from .hcsettings import HCSettings
from .hccommands import command
@@ -12,8 +12,6 @@ _overlays = hcstate.Store("hcnetcursor_overlay", hcstate.NETWORK)
_grid_prefs = hcstate.Store("grid_pref_sync", hcstate.PANE)
# Per-pane: the snapping prefs last written (see _syncSnapPrefs).
_snap_prefs = hcstate.Store("snap_pref_sync", hcstate.PANE)
-# Not per-tab at all: hcnetcursor_NxN.png presence, resolved once per path.
-_cursor_asset_exists = {}
# The network editor's `gridmode` pref, labelled as Houdini's own Show Grid
# radio in NetworkViewMenu.xml labels it.
@@ -443,12 +441,6 @@ class HCNetworkEditor(HCPathTab):
def _hcnetcursorOverlayShapes(self):
return []
- def _hcnetcursorImagePath(self):
- hc_path = hou.getenv("HC_PATH")
- if not hc_path:
- hc_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
- return os.path.join(hc_path, "config", "hcnetcursor_assets")
-
def _hcnetcursorCellSize(self):
state = self._hcnetcursorState()
width_cells = 1 + abs(int(state.get("grow_x", 0)))
@@ -456,32 +448,27 @@ class HCNetworkEditor(HCPathTab):
return width_cells, height_cells
def _hcnetcursorImageFile(self):
- asset_dir = self._hcnetcursorImagePath()
width_cells, height_cells = self._hcnetcursorCellSize()
- width_cells = min(width_cells, 12)
- height_cells = min(height_cells, 12)
- candidate = os.path.join(
- asset_dir,
- f"hcnetcursor_{width_cells}x{height_cells}.png",
- )
- # Runs per UI event; the asset set does not change while Houdini is up.
- exists = _cursor_asset_exists.get(candidate)
- if exists is None:
- exists = os.path.exists(candidate)
- _cursor_asset_exists[candidate] = exists
- if exists:
- return candidate
-
- return os.path.join(asset_dir, "hcnetcursor_1x1.png")
+ return hcnetcursorimage.image_file(
+ width_cells, height_cells, HCSettings().hcnetcursorColorHex())
+
+ def _hcnetcursorDrawRect(self, rect):
+ """The rect the picture is stretched over: the cursor's cells, scaled
+ about their centre by the hcnetcursor_scale setting. Selection and
+ movement keep using the unscaled cells."""
+ scale = HCSettings().hcnetcursorScale()
+ if scale == 1.0:
+ return rect
+ center = rect.center()
+ size = rect.size()
+ half_w = size[0] * scale * 0.5
+ half_h = size[1] * scale * 0.5
+ return hou.BoundingRect(center[0] - half_w, center[1] - half_h,
+ center[0] + half_w, center[1] + half_h)
def _backgroundImagesWithoutHcnetcursor(self):
- asset_dir = self._hcnetcursorImagePath()
- images = []
- for image in self.hou_tab.backgroundImages():
- path = image.path()
- if not (path.startswith(asset_dir) and os.path.basename(path).startswith("hcnetcursor_")):
- images.append(image)
- return images
+ return [image for image in self.hou_tab.backgroundImages()
+ if not hcnetcursorimage.is_cursor_image(image.path())]
def _updateHcnetcursorBackground(self, rect, cursor_path):
images = self._backgroundImagesWithoutHcnetcursor()
@@ -530,7 +517,7 @@ class HCNetworkEditor(HCPathTab):
the work when the resulting picture would be identical.
"""
enabled = HCSettings().hcnetcursorEnabled()
- rect = self.hcnetcursorRect() if enabled else None
+ rect = self._hcnetcursorDrawRect(self.hcnetcursorRect()) if enabled else None
cursor_path = self._hcnetcursorImageFile() if enabled else None
signature = self._overlaySignature(rect, cursor_path)
diff --git a/python3.13libs/hc/hcschema.py b/python3.13libs/hc/hcschema.py
index 045d1ea..85bee79 100644
--- a/python3.13libs/hc/hcschema.py
+++ b/python3.13libs/hc/hcschema.py
@@ -136,14 +136,24 @@ SCHEMA = {
"node_color": Setting("color", "#607070", group="Nodes"),
"zoom_center": Setting("choice", "mouse_cursor", choices=ZOOM_CENTERS,
group="Navigation"),
+ "current_node_arrow_color": Setting(
+ "color", "#618f8f", label="Current Node Arrow Color", group="Navigation",
+ help="The off-screen current-node arrow drawn over the network editor.",
+ ),
"hcnetcursor": Setting(
- "bool", True, label="hcnetcursor", group="Navigation",
+ "bool", True, label="Network Cursor", group="Network Cursor",
help="The grid cursor in the network editor. Off also returns the "
"unmodified f key to Houdini's own frame-selection.",
),
- "current_node_arrow_color": Setting(
- "color", "#618f8f", label="Current Node Arrow Color", group="Navigation",
- help="The off-screen current-node arrow drawn over the network editor.",
+ "hcnetcursor_color": Setting(
+ "color", "#d8b34b", label="Cursor Color", group="Network Cursor",
+ help="The cursor's outline. The picture is painted on demand, so "
+ "a change shows on the next network editor event.",
+ ),
+ "hcnetcursor_scale": Setting(
+ "slider", 1.0, range=(0.25, 2.0), label="Cursor Scale", group="Network Cursor",
+ help="Size of the drawn box relative to the grid cells it covers. "
+ "Selection and movement always use the whole cells.",
),
"grid_snap": Setting(
"bool", True, label="Hard Grid Snap", group="Grid",
diff --git a/python3.13libs/hc/hcsettings.py b/python3.13libs/hc/hcsettings.py
index 5354730..a40a173 100644
--- a/python3.13libs/hc/hcsettings.py
+++ b/python3.13libs/hc/hcsettings.py
@@ -220,6 +220,19 @@ class HCSettings:
def hcnetcursorEnabled(self):
return bool(self.nodeGraph().get("hcnetcursor"))
+ def hcnetcursorColorHex(self):
+ return self.colorHex("node_graph", "hcnetcursor_color")
+
+ def hcnetcursorScale(self):
+ """Size of the drawn cursor box relative to the cells it covers."""
+ setting = hcschema.lookup(("node_graph", "hcnetcursor_scale"))
+ try:
+ scale = float(self.nodeGraph().get("hcnetcursor_scale", setting.default))
+ except (TypeError, ValueError):
+ scale = setting.default
+ low, high = setting.range
+ return min(max(scale, low), high)
+
def dropSwapEnabled(self):
"""Dropping a node on another node's cell swaps their positions."""
return bool(self.nodeGraph().get("drop_swap", True))
diff --git a/tools/check.py b/tools/check.py
index 7af4c1b..f278b97 100644
--- a/tools/check.py
+++ b/tools/check.py
@@ -1724,6 +1724,72 @@ def check_disable_switches():
check("accessors", accessors_read_the_file)
+def check_cursor_image():
+ """The network cursor picture is painted on demand, in the set colour."""
+ print("network cursor image")
+ import tempfile
+ from hc import hcnetcursorimage
+
+ def painted_to_spec():
+ from PySide6.QtGui import QImage
+ with tempfile.TemporaryDirectory() as tmp:
+ path = os.path.join(tmp, "hcnetcursor_3x2_a1b2c3.png")
+ hcnetcursorimage.paint(path, 3, 2, "#a1b2c3")
+ image = QImage(path)
+ assert (image.width(), image.height()) == (600, 200), \
+ f"{image.width()}x{image.height()}"
+ edge = image.pixelColor(2, 100)
+ assert edge.name() == "#a1b2c3" and edge.alpha() == 255, \
+ f"edge {edge.name()} a={edge.alpha()}"
+ inside = image.pixelColor(300, 100)
+ assert inside.alpha() == 0, f"centre alpha {inside.alpha()}"
+ just_in = image.pixelColor(hcnetcursorimage.BORDER, 100)
+ assert just_in.alpha() == 0, "outline wider than BORDER"
+ return "600x200, 5px outline, transparent inside"
+
+ check("painted to spec", painted_to_spec)
+
+ def cached_per_colour():
+ a = hcnetcursorimage.image_file(1, 1, "#d8b34b")
+ b = hcnetcursorimage.image_file(1, 1, "#D8B34B")
+ c = hcnetcursorimage.image_file(1, 1, "#000000")
+ assert a == b, "colour case made a second file"
+ assert a != c, "different colours share a file"
+ assert os.path.exists(a) and os.path.exists(c)
+ assert hcnetcursorimage.image_file(40, 1, "#d8b34b").endswith("_12x1_d8b34b.png"), \
+ "oversize cursor not clamped"
+ return os.path.dirname(a)
+
+ check("one file per size and colour", cached_per_colour)
+
+ def old_paths_recognised():
+ """Hips saved with the cursor showing still name the retired asset dir."""
+ assert hcnetcursorimage.is_cursor_image(
+ "/x/hou-control/config/hcnetcursor_assets/hcnetcursor_2x1.png")
+ assert hcnetcursorimage.is_cursor_image(
+ hcnetcursorimage.image_file(1, 1, "#d8b34b"))
+ assert not hcnetcursorimage.is_cursor_image("/x/backdrop.png")
+ assert not (ROOT / "config" / "hcnetcursor_assets").exists(), \
+ "static asset set is still checked in"
+ return "old and new paths both filtered out"
+
+ check("stale cursor images are filtered", old_paths_recognised)
+
+ def settings_declared():
+ for key in ("hcnetcursor", "hcnetcursor_color", "hcnetcursor_scale"):
+ setting = hcschema.lookup(("node_graph", key))
+ assert setting is not None, f"{key} missing"
+ assert setting.group == "Network Cursor", f"{key} in {setting.group!r}"
+ assert hcschema.lookup(("node_graph", "hcnetcursor")).label == "Network Cursor"
+ settings = HCSettings()
+ assert settings.hcnetcursorColorHex().startswith("#")
+ low, high = hcschema.lookup(("node_graph", "hcnetcursor_scale")).range
+ assert low <= settings.hcnetcursorScale() <= high
+ return f"colour {settings.hcnetcursorColorHex()}, scale {settings.hcnetcursorScale()}"
+
+ check("cursor settings", settings_declared)
+
+
def check_startup_script():
"""scripts/123.py reads hc_settings.json without importing hc.
@@ -1812,6 +1878,7 @@ def main():
check_node_colors()
check_current_node()
check_disable_switches()
+ check_cursor_image()
check_startup_script()
print(f"\n{passed} passed, {failed} failed")
return 1 if failed else 0