Gum gum-tool-copy-paste
Reference guide for Gum's copy/paste system. Load this when working on CopyPasteLogic, ICopyPasteLogic, OnCopy, OnPaste, OnCut, PasteInstanceSaves, CopiedData, clipboard behavior, or multi-paste selection tracking.
install
source · Clone the upstream repo
git clone https://github.com/vchelaru/Gum
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/vchelaru/Gum "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/gum-tool-copy-paste" ~/.claude/skills/vchelaru-gum-gum-tool-copy-paste && rm -rf "$T"
manifest:
.claude/skills/gum-tool-copy-paste/SKILL.mdsource content
Gum Copy/Paste Reference
In-Memory, Not System Clipboard
Gum's copy/paste does not use the system clipboard. Copied data lives in
CopyPasteLogic.CopiedData (an in-memory instance). MonoGameGum/Clipboard/ClipboardImplementation.cs is a separate text-only clipboard used elsewhere in the app — not part of this system.
CopyType Dispatch
CopyType drives the entire operation:
— copies selected instances within an element, or a whole element if nothing is selectedInstanceOrElement
— copies the selected state within a state categoryState
Copy, cut, and paste each accept a
CopyType parameter and bail out early if it doesn't match what's stored.
TopOrRecursive
Paste offers two modes:
Recursive (instances + all descendants) vs Top (only top-level instances). The UI exposes both as separate "Paste" and "Paste Top Level Instance(s)" menu items.
Cut Is Immediate
Cut calls
StoreCopiedObject() (same as copy) then immediately deletes the source instances via IDeleteLogic.RemoveInstance(). The deletion happens at cut time, not deferred to paste. This means cutting and then not pasting still destroys the original.
Multi-Paste Selection Tracking
_hasChangedSelectionSinceCopy is the key flag for multi-paste behavior. It starts false after a copy and flips true when SelectionChangedMessage fires (unless the selection change was triggered by the paste itself — isSelectionCausedByPaste guards against that false-positive).
During paste, this flag drives parent assignment:
— re-use the parent fromfalse
(repeat-paste to same location)lastPasteOriginalToParentAssociation
— attach to current selection (user moved to a new target)true
Paste Creates New Instances, Does Not Clone
PasteInstanceSaves() creates fresh InstanceSave objects and assigns properties from the copied states. It does not simply clone the stored instances. Name uniqueness is enforced via StringFunctions.MakeStringUnique(), and an oldNewNameDictionary is built to remap parent references throughout the copied hierarchy.
Undo Integration
Only paste acquires an undo lock (
_undoManager.RequestLock()). The entire paste — all instances, state variable copies, parent assignments — records as a single undo action. Cut's deletion goes through IDeleteLogic.RemoveInstance() which handles its own undo internally.
State Paste Validation
Pasting a state runs
ValidateStatePaste() first. It checks that all variables in the copied state exist in the target category and are supported by the target element. Paste is silently blocked (or shows a dialog) if incompatible.
Plugin Hook
PluginManager.InstanceAdd() is called for each newly pasted instance, allowing plugins to react to paste-created instances the same way they react to manually added ones.
Animation Copy/Paste
AnimationCopyPasteManager.cs is a separate, independent copy/paste system for animations. It has its own CopiedData class, stores a single AnimationViewModel, and does not interact with CopyPasteLogic.
Entry Points
All copy/paste is triggered through:
— routesHotkeyManager
→Ctrl+C / Ctrl+X / Ctrl+VICopyPasteLogic.OnCopy / OnCut / OnPaste
— right-click context menu itemsElementTreeViewManager.RightClick
Do not call
CopyPasteLogic methods directly from outside these entry points.
Key Files
| File | Purpose |
|---|---|
| All copy/paste orchestration; nested class defined here |
| Interface |
| Thin wrappers that delegate to |
| Keyboard entry point |
| Context menu entry point |
| Separate animation copy/paste |
| Unit tests |