Q-W2 review follow-ups: anon-namespace TU-private panel helpers, fix stale bank_panel.cpp comments, correct shim-transitivity claim
Wraps ~50 file-local helpers across all eight panel TUs in namespace{} (dissolves the menuAppend default-arg ODR trap); zero behavior change, 60/60 green.
This commit is contained in:
@@ -87,6 +87,8 @@ std::vector<const Bank*> namedBanks() {
|
|||||||
// unsaved project the empty-close discard in persistBankOp ensures no stale state
|
// unsaved project the empty-close discard in persistBankOp ensures no stale state
|
||||||
// survives (matches the capture/B3 quiet-persist idiom).
|
// survives (matches the capture/B3 quiet-persist idiom).
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// REAPER's stock single-line input (comma-safe via the \x1f return separator, as B3).
|
// REAPER's stock single-line input (comma-safe via the \x1f return separator, as B3).
|
||||||
bool promptText(const char* title, const char* caption, const std::string& initial,
|
bool promptText(const char* title, const char* caption, const std::string& initial,
|
||||||
std::string& out) {
|
std::string& out) {
|
||||||
@@ -111,6 +113,8 @@ std::string mintBankId() {
|
|||||||
return std::string(buf);
|
return std::string(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
void doCreateBank() {
|
void doCreateBank() {
|
||||||
if (!book()) return;
|
if (!book()) return;
|
||||||
std::string name;
|
std::string name;
|
||||||
@@ -127,6 +131,8 @@ void doCreateBank() {
|
|||||||
invalidatePanel();
|
invalidatePanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
void doRenameBank(const std::string& bankId) {
|
void doRenameBank(const std::string& bankId) {
|
||||||
if (!book()) return;
|
if (!book()) return;
|
||||||
const Bank* bk = book()->bank(bankId);
|
const Bank* bk = book()->bank(bankId);
|
||||||
@@ -198,6 +204,8 @@ void doActivateBank(const std::string& bankId) {
|
|||||||
invalidatePanel();
|
invalidatePanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Move or copy `sampleIds` from `srcBankId` to `destBankId` (index-only). Both pass
|
// Move or copy `sampleIds` from `srcBankId` to `destBankId` (index-only). Both pass
|
||||||
// ids straight to the model op (no BankModel& cached across the loop's mutations).
|
// ids straight to the model op (no BankModel& cached across the loop's mutations).
|
||||||
//
|
//
|
||||||
@@ -312,6 +320,8 @@ std::vector<std::string> resolveDragPathsForOs() {
|
|||||||
// Menu command ids are LOCAL to the popup (not REAPER action ids) — TPM_RETURNCMD
|
// Menu command ids are LOCAL to the popup (not REAPER action ids) — TPM_RETURNCMD
|
||||||
// hands the chosen id straight back, so no hookcommand routing is involved.
|
// hands the chosen id straight back, so no hookcommand routing is involved.
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// Appends a string item (id) to `menu` at its end. Portable over Win32/SWELL: both
|
// Appends a string item (id) to `menu` at its end. Portable over Win32/SWELL: both
|
||||||
// accept InsertMenu(menu, pos, MF_BYPOSITION|MF_STRING, id, text) with a negative
|
// accept InsertMenu(menu, pos, MF_BYPOSITION|MF_STRING, id, text) with a negative
|
||||||
// position appending. Win32 and SWELL both treat pos < 0 as an append.
|
// position appending. Win32 and SWELL both treat pos < 0 as an append.
|
||||||
@@ -337,6 +347,8 @@ enum : unsigned int {
|
|||||||
kMenuCopyBase = 2000, // copy-to-bank: kMenuCopyBase + destination index
|
kMenuCopyBase = 2000, // copy-to-bank: kMenuCopyBase + destination index
|
||||||
};
|
};
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Shows the right-click context menu for a named-bank TAB: activate / rename / delete
|
// Shows the right-click context menu for a named-bank TAB: activate / rename / delete
|
||||||
// / evacuate that bank, plus a create entry. Drives the id-keyed ops.
|
// / evacuate that bank, plus a create entry. Drives the id-keyed ops.
|
||||||
void showTabMenu(int screenX, int screenY, const std::string& bankId) {
|
void showTabMenu(int screenX, int screenY, const std::string& bankId) {
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ namespace reasampler::panel {
|
|||||||
|
|
||||||
constexpr int kDragThreshold = 5; // px the pointer must move to begin a drag
|
constexpr int kDragThreshold = 5; // px the pointer must move to begin a drag
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// Resolves the drop target under client (x, y) during a drag, updating dropKind /
|
// Resolves the drop target under client (x, y) during a drag, updating dropKind /
|
||||||
// dropBankId. A drop onto the pool region -> the pool; onto a named tab -> that bank;
|
// dropBankId. A drop onto the pool region -> the pool; onto a named tab -> that bank;
|
||||||
// anywhere else -> none.
|
// anywhere else -> none.
|
||||||
@@ -234,6 +236,8 @@ void updateHover(int x, int y) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Applies the tooltip hover-delay: if a tooltip-bearing element has been hovered past
|
// Applies the tooltip hover-delay: if a tooltip-bearing element has been hovered past
|
||||||
// kTooltipDelayMs and the tooltip is not yet shown, latch it and repaint once. Driven from the
|
// kTooltipDelayMs and the tooltip is not yet shown, latch it and repaint once. Driven from the
|
||||||
// OnTimer poll (bankPanelRefresh) so the tooltip appears after a rest with no dedicated timer;
|
// OnTimer poll (bankPanelRefresh) so the tooltip appears after a rest with no dedicated timer;
|
||||||
@@ -365,6 +369,8 @@ void onMouseMove(int x, int y) {
|
|||||||
// batched undo point + saves). A no-op reorder (already at the target, model returns false)
|
// batched undo point + saves). A no-op reorder (already at the target, model returns false)
|
||||||
// opens no undo point. Selection reasons over slot order, so it is cleared after — the
|
// opens no undo point. Selection reasons over slot order, so it is cleared after — the
|
||||||
// fingerprint pass rebuilds it against the new order.
|
// fingerprint pass rebuilds it against the new order.
|
||||||
|
namespace {
|
||||||
|
|
||||||
void doReorderDrop(const std::string& id, const std::string& bankId, int targetSlot) {
|
void doReorderDrop(const std::string& id, const std::string& bankId, int targetSlot) {
|
||||||
if (!book() || id.empty() || bankId.empty() || targetSlot < 0) return;
|
if (!book() || id.empty() || bankId.empty() || targetSlot < 0) return;
|
||||||
if (!book()->reorderSample(id, bankId, targetSlot)) return; // rejected/no-op: no undo point
|
if (!book()->reorderSample(id, bankId, targetSlot)) return; // rejected/no-op: no undo point
|
||||||
@@ -386,6 +392,8 @@ void doReplaceDrop(const std::string& newId, const std::string& oldId,
|
|||||||
invalidatePanel();
|
invalidatePanel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Clears all drag-state fields to their resting values. Called from every exit path
|
// Clears all drag-state fields to their resting values. Called from every exit path
|
||||||
// (button-up, WM_CAPTURECHANGED, WM_DESTROY, closePanel) so the set of cleared fields
|
// (button-up, WM_CAPTURECHANGED, WM_DESTROY, closePanel) so the set of cleared fields
|
||||||
// stays consistent across all four sites.
|
// stays consistent across all four sites.
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ TailSetting currentTail() {
|
|||||||
return g_panel.session ? g_panel.session->tail() : TailSetting{};
|
return g_panel.session ? g_panel.session->tail() : TailSetting{};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// Commits the current tail setting to ext state and marks the active project dirty
|
// Commits the current tail setting to ext state and marks the active project dirty
|
||||||
// so the change travels inside the .rpp on Ctrl+S. saveToActiveProject() is the only
|
// so the change travels inside the .rpp on Ctrl+S. saveToActiveProject() is the only
|
||||||
// path that calls SetProjExtState for the tail key — calling it here closes the gap
|
// path that calls SetProjExtState for the tail key — calling it here closes the gap
|
||||||
@@ -96,7 +98,7 @@ bool handleToolbarClick(int x, int y, const ActionBarRect& bar,
|
|||||||
|
|
||||||
// True iff `tr` has I_FREEMODE==2 (fixed lanes enabled). The SDK value is verified
|
// True iff `tr` has I_FREEMODE==2 (fixed lanes enabled). The SDK value is verified
|
||||||
// in view.cpp (kFreeModeFixedLanes=2); reproduced here as a local constant so
|
// in view.cpp (kFreeModeFixedLanes=2); reproduced here as a local constant so
|
||||||
// bank_panel.cpp stays self-contained without pulling in view.cpp's private namespace.
|
// panel_input.cpp stays self-contained without pulling in view.cpp's private namespace.
|
||||||
constexpr int kFreeModeFixedLanes = 2;
|
constexpr int kFreeModeFixedLanes = 2;
|
||||||
|
|
||||||
bool isFixedLaneTrack(MediaTrack* tr) {
|
bool isFixedLaneTrack(MediaTrack* tr) {
|
||||||
@@ -104,7 +106,7 @@ bool isFixedLaneTrack(MediaTrack* tr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Item GUID + fixed-lane name reads come from the shared item_read seam (item_read.h):
|
// Item GUID + fixed-lane name reads come from the shared item_read seam (item_read.h):
|
||||||
// itemGuid(it) and itemLaneName(tr, it). bank_panel.cpp no longer carries its own copies.
|
// itemGuid(it) and itemLaneName(tr, it). panel_input.cpp no longer carries its own copies.
|
||||||
|
|
||||||
// Enumerates the live project's track + item GUIDs. Fills `allGuids` (the full live set,
|
// Enumerates the live project's track + item GUIDs. Fills `allGuids` (the full live set,
|
||||||
// baseline input) and, for each item, records whether it sits on a manual lane so a
|
// baseline input) and, for each item, records whether it sits on a manual lane so a
|
||||||
@@ -319,6 +321,8 @@ bool handlePoolChromeClick(int x, int y, const RECT& region) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Applies a left-click at (x, y): route to top toolbar / footer (toggle / Tail / Prune) /
|
// Applies a left-click at (x, y): route to top toolbar / footer (toggle / Tail / Prune) /
|
||||||
// bottom toolbar / region chrome / grid selection, and arm a potential drag when the click
|
// bottom toolbar / region chrome / grid selection, and arm a potential drag when the click
|
||||||
// lands on a selected cell. L4 order mirrors the three-zone layout top-to-bottom.
|
// lands on a selected cell. L4 order mirrors the three-zone layout top-to-bottom.
|
||||||
@@ -500,6 +504,8 @@ bool handleWheel(int x, int y, int delta) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
bool isOurWindow(HWND hwnd) {
|
bool isOurWindow(HWND hwnd) {
|
||||||
for (HWND w = hwnd; w; w = GetParent(w))
|
for (HWND w = hwnd; w; w = GetParent(w))
|
||||||
if (w == g_panel.hwnd) return true;
|
if (w == g_panel.hwnd) return true;
|
||||||
@@ -557,6 +563,8 @@ int translateAccel(MSG* msg, accelerator_register_t* /*ctx*/) {
|
|||||||
accelerator_register_t g_accel{translateAccel, true, nullptr};
|
accelerator_register_t g_accel{translateAccel, true, nullptr};
|
||||||
bool g_accelRegistered = false;
|
bool g_accelRegistered = false;
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
void registerAccel() {
|
void registerAccel() {
|
||||||
if (g_accelRegistered || !g_rec) return;
|
if (g_accelRegistered || !g_rec) return;
|
||||||
g_rec->Register("accelerator", &g_accel);
|
g_rec->Register("accelerator", &g_accel);
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ int modeCount() {
|
|||||||
// buttons tile into the band MINUS the menu reserve (topToolbarActionRect), so they never run
|
// buttons tile into the band MINUS the menu reserve (topToolbarActionRect), so they never run
|
||||||
// under the menu button (L5 refinement 1).
|
// under the menu button (L5 refinement 1).
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
ActionBarRect topToolbarRect(int w) {
|
ActionBarRect topToolbarRect(int w) {
|
||||||
ActionBarRect s;
|
ActionBarRect s;
|
||||||
s.x = 0;
|
s.x = 0;
|
||||||
@@ -67,6 +69,8 @@ MenuBarRect topMenuBarRect(int w) {
|
|||||||
// The More button's rect (right-anchored in the top band). Empty when the band is too narrow
|
// The More button's rect (right-anchored in the top band). Empty when the band is too narrow
|
||||||
// to place it clear of its left inset — the three variants stay reachable via their bindable
|
// to place it clear of its left inset — the three variants stay reachable via their bindable
|
||||||
// commands (graceful suppression).
|
// commands (graceful suppression).
|
||||||
|
} // namespace
|
||||||
|
|
||||||
MenuButtonRect topMenuButtonRect(int w) {
|
MenuButtonRect topMenuButtonRect(int w) {
|
||||||
return computeMenuButton(topMenuBarRect(w), kMenuBtnSpec);
|
return computeMenuButton(topMenuBarRect(w), kMenuBtnSpec);
|
||||||
}
|
}
|
||||||
@@ -200,6 +204,8 @@ std::vector<ActionBarRow> overflowMenuRows() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// The active mode id the opposite-mode gate + footer toggle both read (ONE source of truth for
|
// The active mode id the opposite-mode gate + footer toggle both read (ONE source of truth for
|
||||||
// "which mode is active"). Empty when no session (every button then falls to fail-open live).
|
// "which mode is active"). Empty when no session (every button then falls to fail-open live).
|
||||||
std::string activeModeIdOrEmpty() {
|
std::string activeModeIdOrEmpty() {
|
||||||
@@ -207,6 +213,8 @@ std::string activeModeIdOrEmpty() {
|
|||||||
return g_panel.session->view().activeModeId();
|
return g_panel.session->view().activeModeId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// The BOTTOM toolbar inventory (L5 refinement 3): FOUR Item/Track x Arrange/Design tag buttons
|
// The BOTTOM toolbar inventory (L5 refinement 3): FOUR Item/Track x Arrange/Design tag buttons
|
||||||
// then a set-apart Show Both. The suffixes are the ACTUAL registered command-id strings from
|
// then a set-apart Show Both. The suffixes are the ACTUAL registered command-id strings from
|
||||||
// actions.cpp (VIEW_MOVE_ITEMS_ARRANGE / VIEW_MOVE_ITEMS_DESIGN for the item moves;
|
// actions.cpp (VIEW_MOVE_ITEMS_ARRANGE / VIEW_MOVE_ITEMS_DESIGN for the item moves;
|
||||||
@@ -290,6 +298,8 @@ int resolveBarCommandId(const ActionBarRow& row) {
|
|||||||
return NamedCommandLookup(named.c_str());
|
return NamedCommandLookup(named.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// The current key binding string for a command in the MAIN section, or "" (unbound / not
|
// The current key binding string for a command in the MAIN section, or "" (unbound / not
|
||||||
// registered). Queried via kbd_getTextFromCmd (SectionFromUniqueID(0)).
|
// registered). Queried via kbd_getTextFromCmd (SectionFromUniqueID(0)).
|
||||||
std::string barBindingText(int cmd) {
|
std::string barBindingText(int cmd) {
|
||||||
@@ -300,6 +310,8 @@ std::string barBindingText(int cmd) {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// The flat action index under (x, y) in `bar` for the given row set, or -1 (miss). Pure hit-test.
|
// The flat action index under (x, y) in `bar` for the given row set, or -1 (miss). Pure hit-test.
|
||||||
int toolbarHit(int x, int y, const ActionBarRect& bar, const std::vector<ActionBarRow>& rows) {
|
int toolbarHit(int x, int y, const ActionBarRect& bar, const std::vector<ActionBarRow>& rows) {
|
||||||
if (bar.height <= 0) return -1;
|
if (bar.height <= 0) return -1;
|
||||||
|
|||||||
@@ -23,6 +23,8 @@
|
|||||||
|
|
||||||
namespace reasampler::panel {
|
namespace reasampler::panel {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// --- Drawing: thumbnails (via the kit's shared drawWaveform since FA3) ---------
|
// --- Drawing: thumbnails (via the kit's shared drawWaveform since FA3) ---------
|
||||||
|
|
||||||
// Draws the L7 decorative metadata overlay on a card: bars.beats.subdivisions bottom-LEFT
|
// Draws the L7 decorative metadata overlay on a card: bars.beats.subdivisions bottom-LEFT
|
||||||
@@ -506,6 +508,8 @@ std::string activeBankName() {
|
|||||||
return bk ? bk->displayName : std::string(kPoolBankName);
|
return bk ? bk->displayName : std::string(kPoolBankName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// --- Full paint ---------------------------------------------------------------
|
// --- Full paint ---------------------------------------------------------------
|
||||||
|
|
||||||
void paintPanel(HWND hwnd, HDC hdc) {
|
void paintPanel(HWND hwnd, HDC hdc) {
|
||||||
|
|||||||
@@ -14,10 +14,12 @@
|
|||||||
// plain free function — direct call-through, no interface, no virtual dispatch
|
// plain free function — direct call-through, no interface, no virtual dispatch
|
||||||
// (T4-28: the audition path and the per-mouse-move path must stay direct calls).
|
// (T4-28: the audition path and the per-mouse-move path must stay direct calls).
|
||||||
// * Explicit using-declarations pulling the pure modules' symbols into
|
// * Explicit using-declarations pulling the pure modules' symbols into
|
||||||
// reasampler::panel from their REAL namespace homes (Q-W1 sub-namespaces) — the
|
// reasampler::panel from their REAL namespace homes (Q-W1 sub-namespaces) — this
|
||||||
// panel TUs do NOT include the interim core/namespaces.h shim (Q-W2 retires it
|
// header itself does not directly include the interim core/namespaces.h shim
|
||||||
// for this module; some still-unsplit shell headers carry it transitively until
|
// (Q-W2 retires that direct dependency for this module). Six of the eight panel
|
||||||
// their own waves, but nothing here depends on it).
|
// TUs still pull the shim in TRANSITIVELY via actions.h/persist.h/ingest.h/
|
||||||
|
// draw_kit.h/view.h; only panel_thumbnails.cpp and panel_audition.cpp are
|
||||||
|
// shim-free end to end. Nothing HERE depends on it either way.
|
||||||
//
|
//
|
||||||
// REFERENCE-INVALIDATION GUARDRAIL (CONTEXT.md §Multi-bank): a bank-structural
|
// REFERENCE-INVALIDATION GUARDRAIL (CONTEXT.md §Multi-bank): a bank-structural
|
||||||
// mutation (create/delete/evacuate/activate/move) can reallocate the book's vector,
|
// mutation (create/delete/evacuate/activate/move) can reallocate the book's vector,
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
namespace reasampler::panel {
|
namespace reasampler::panel {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
constexpr int kMaxThumbnailFrames = 1 << 20; // ~1M frames (~22s @ 48k)
|
constexpr int kMaxThumbnailFrames = 1 << 20; // ~1M frames (~22s @ 48k)
|
||||||
|
|
||||||
// --- Thumbnail computation (M5; `width` is a BIN count since FA3 oversampling) --
|
// --- Thumbnail computation (M5; `width` is a BIN count since FA3 oversampling) --
|
||||||
@@ -78,6 +80,8 @@ Envelope computeThumbnail(const std::string& absPath, int width) {
|
|||||||
static_cast<std::size_t>(binCount));
|
static_cast<std::size_t>(binCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
const Envelope& thumbnailFor(const Sample& sample, int width,
|
const Envelope& thumbnailFor(const Sample& sample, int width,
|
||||||
const std::string& projectDir) {
|
const std::string& projectDir) {
|
||||||
ThumbnailKey key{sample.id, width, g_panel.generation};
|
ThumbnailKey key{sample.id, width, g_panel.generation};
|
||||||
@@ -96,6 +100,8 @@ const Envelope& thumbnailFor(const Sample& sample, int width,
|
|||||||
|
|
||||||
// --- Bank-change detection ----------------------------------------------------
|
// --- Bank-change detection ----------------------------------------------------
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// A fingerprint of the WHOLE BOOK: for each bank, its id + display name + active flag
|
// A fingerprint of the WHOLE BOOK: for each bank, its id + display name + active flag
|
||||||
// + per-sample id/path. Catches every mutation the panel must redraw for: capture,
|
// + per-sample id/path. Catches every mutation the panel must redraw for: capture,
|
||||||
// project load, and B4's own create/rename/delete/move/activate.
|
// project load, and B4's own create/rename/delete/move/activate.
|
||||||
@@ -119,6 +125,8 @@ std::string bookFingerprint() {
|
|||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Reconciles shownBankId against the live named banks: keep it if it still names a
|
// Reconciles shownBankId against the live named banks: keep it if it still names a
|
||||||
// named bank; otherwise fall to the first named bank (or empty when none). Keeps the
|
// named bank; otherwise fall to the first named bank (or empty when none). Keeps the
|
||||||
// banks region always showing a valid tab. Never touches the ACTIVE bank.
|
// banks region always showing a valid tab. Never touches the ACTIVE bank.
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ PanelState g_panel;
|
|||||||
|
|
||||||
// --- Dialog proc + docking ----------------------------------------------------
|
// --- Dialog proc + docking ----------------------------------------------------
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
// Decodes a WM_DROPFILES HDROP into the dropped file paths (absolute, OS-native) and hands
|
// Decodes a WM_DROPFILES HDROP into the dropped file paths (absolute, OS-native) and hands
|
||||||
// them to the S8 ingest path. Multi-file drop: ingestDroppedFiles imports all into the active
|
// them to the S8 ingest path. Multi-file drop: ingestDroppedFiles imports all into the active
|
||||||
// bank (bank-fill only — no assignment to any live instance). Always DragFinish's the HDROP
|
// bank (bank-fill only — no assignment to any live instance). Always DragFinish's the HDROP
|
||||||
@@ -193,6 +195,8 @@ void closePanel() {
|
|||||||
g_panel.open = false;
|
g_panel.open = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
} // namespace reasampler::panel
|
} // namespace reasampler::panel
|
||||||
|
|
||||||
// --- Public API (the lifecycle seam — panel_window.h) --------------------------
|
// --- Public API (the lifecycle seam — panel_window.h) --------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user