| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- #pragma once
- #include <stddef.h>
- typedef int ImNodesCol; // -> enum ImNodesCol_
- typedef int ImNodesStyleVar; // -> enum ImNodesStyleVar_
- typedef int ImNodesStyleFlags; // -> enum ImNodesStyleFlags_
- typedef int ImNodesPinShape; // -> enum ImNodesPinShape_
- typedef int ImNodesAttributeFlags; // -> enum ImNodesAttributeFlags_
- typedef int ImNodesMiniMapLocation; // -> enum ImNodesMiniMapLocation_
- enum ImNodesCol_
- {
- ImNodesCol_NodeBackground = 0,
- ImNodesCol_NodeBackgroundHovered,
- ImNodesCol_NodeBackgroundSelected,
- ImNodesCol_NodeOutline,
- ImNodesCol_TitleBar,
- ImNodesCol_TitleBarHovered,
- ImNodesCol_TitleBarSelected,
- ImNodesCol_Link,
- ImNodesCol_LinkHovered,
- ImNodesCol_LinkSelected,
- ImNodesCol_Pin,
- ImNodesCol_PinHovered,
- ImNodesCol_BoxSelector,
- ImNodesCol_BoxSelectorOutline,
- ImNodesCol_GridBackground,
- ImNodesCol_GridLine,
- ImNodesCol_MiniMapBackground,
- ImNodesCol_MiniMapBackgroundHovered,
- ImNodesCol_MiniMapOutline,
- ImNodesCol_MiniMapOutlineHovered,
- ImNodesCol_MiniMapNodeBackground,
- ImNodesCol_MiniMapNodeBackgroundHovered,
- ImNodesCol_MiniMapNodeBackgroundSelected,
- ImNodesCol_MiniMapNodeOutline,
- ImNodesCol_MiniMapLink,
- ImNodesCol_MiniMapLinkSelected,
- ImNodesCol_COUNT
- };
- enum ImNodesStyleVar_
- {
- ImNodesStyleVar_GridSpacing = 0,
- ImNodesStyleVar_NodeCornerRounding,
- ImNodesStyleVar_NodePaddingHorizontal,
- ImNodesStyleVar_NodePaddingVertical,
- ImNodesStyleVar_NodeBorderThickness,
- ImNodesStyleVar_LinkThickness,
- ImNodesStyleVar_LinkLineSegmentsPerLength,
- ImNodesStyleVar_LinkHoverDistance,
- ImNodesStyleVar_PinCircleRadius,
- ImNodesStyleVar_PinQuadSideLength,
- ImNodesStyleVar_PinTriangleSideLength,
- ImNodesStyleVar_PinLineThickness,
- ImNodesStyleVar_PinHoverRadius,
- ImNodesStyleVar_PinOffset
- };
- enum ImNodesStyleFlags_
- {
- ImNodesStyleFlags_None = 0,
- ImNodesStyleFlags_NodeOutline = 1 << 0,
- ImNodesStyleFlags_GridLines = 1 << 2
- };
- enum ImNodesPinShape_
- {
- ImNodesPinShape_Circle,
- ImNodesPinShape_CircleFilled,
- ImNodesPinShape_Triangle,
- ImNodesPinShape_TriangleFilled,
- ImNodesPinShape_Quad,
- ImNodesPinShape_QuadFilled
- };
- // This enum controls the way the attribute pins behave.
- enum ImNodesAttributeFlags_
- {
- ImNodesAttributeFlags_None = 0,
- // Allow detaching a link by left-clicking and dragging the link at a pin it is connected to.
- // NOTE: the user has to actually delete the link for this to work. A deleted link can be
- // detected by calling IsLinkDestroyed() after EndNodeEditor().
- ImNodesAttributeFlags_EnableLinkDetachWithDragClick = 1 << 0,
- // Visual snapping of an in progress link will trigger IsLink Created/Destroyed events. Allows
- // for previewing the creation of a link while dragging it across attributes. See here for demo:
- // https://github.com/Nelarius/imnodes/issues/41#issuecomment-647132113 NOTE: the user has to
- // actually delete the link for this to work. A deleted link can be detected by calling
- // IsLinkDestroyed() after EndNodeEditor().
- ImNodesAttributeFlags_EnableLinkCreationOnSnap = 1 << 1
- };
- struct ImNodesIO
- {
- struct EmulateThreeButtonMouse
- {
- EmulateThreeButtonMouse();
- // The keyboard modifier to use in combination with mouse left click to pan the editor view.
- // Set to NULL by default. To enable this feature, set the modifier to point to a boolean
- // indicating the state of a modifier. For example,
- //
- // ImNodes::GetIO().EmulateThreeButtonMouse.Modifier = &ImGui::GetIO().KeyAlt;
- const bool* Modifier;
- } EmulateThreeButtonMouse;
- struct LinkDetachWithModifierClick
- {
- LinkDetachWithModifierClick();
- // Pointer to a boolean value indicating when the desired modifier is pressed. Set to NULL
- // by default. To enable the feature, set the modifier to point to a boolean indicating the
- // state of a modifier. For example,
- //
- // ImNodes::GetIO().LinkDetachWithModifierClick.Modifier = &ImGui::GetIO().KeyCtrl;
- //
- // Left-clicking a link with this modifier pressed will detach that link. NOTE: the user has
- // to actually delete the link for this to work. A deleted link can be detected by calling
- // IsLinkDestroyed() after EndNodeEditor().
- const bool* Modifier;
- } LinkDetachWithModifierClick;
- // Holding alt mouse button pans the node area, by default middle mouse button will be used
- // Set based on ImGuiMouseButton values
- int AltMouseButton;
- ImNodesIO();
- };
- struct ImNodesStyle
- {
- float GridSpacing;
- float NodeCornerRounding;
- float NodePaddingHorizontal;
- float NodePaddingVertical;
- float NodeBorderThickness;
- float LinkThickness;
- float LinkLineSegmentsPerLength;
- float LinkHoverDistance;
- // The following variables control the look and behavior of the pins. The default size of each
- // pin shape is balanced to occupy approximately the same surface area on the screen.
- // The circle radius used when the pin shape is either ImNodesPinShape_Circle or
- // ImNodesPinShape_CircleFilled.
- float PinCircleRadius;
- // The quad side length used when the shape is either ImNodesPinShape_Quad or
- // ImNodesPinShape_QuadFilled.
- float PinQuadSideLength;
- // The equilateral triangle side length used when the pin shape is either
- // ImNodesPinShape_Triangle or ImNodesPinShape_TriangleFilled.
- float PinTriangleSideLength;
- // The thickness of the line used when the pin shape is not filled.
- float PinLineThickness;
- // The radius from the pin's center position inside of which it is detected as being hovered
- // over.
- float PinHoverRadius;
- // Offsets the pins' positions from the edge of the node to the outside of the node.
- float PinOffset;
- // By default, ImNodesStyleFlags_NodeOutline and ImNodesStyleFlags_Gridlines are enabled.
- ImNodesStyleFlags Flags;
- // Set these mid-frame using Push/PopColorStyle. You can index this color array with with a
- // ImNodesCol value.
- unsigned int Colors[ImNodesCol_COUNT];
- ImNodesStyle();
- };
- enum ImNodesMiniMapLocation_
- {
- ImNodesMiniMapLocation_BottomLeft,
- ImNodesMiniMapLocation_BottomRight,
- ImNodesMiniMapLocation_TopLeft,
- ImNodesMiniMapLocation_TopRight,
- };
- struct ImGuiContext;
- struct ImVec2;
- struct ImNodesContext;
- // An editor context corresponds to a set of nodes in a single workspace (created with a single
- // Begin/EndNodeEditor pair)
- //
- // By default, the library creates an editor context behind the scenes, so using any of the imnodes
- // functions doesn't require you to explicitly create a context.
- struct ImNodesEditorContext;
- // Callback type used to specify special behavior when hovering a node in the minimap
- typedef void (*ImNodesMiniMapNodeHoveringCallback)(int, void*);
- namespace ImNodes
- {
- // Call this function if you are compiling imnodes in to a dll, separate from ImGui. Calling this
- // function sets the GImGui global variable, which is not shared across dll boundaries.
- void SetImGuiContext(ImGuiContext* ctx);
- ImNodesContext* CreateContext();
- void DestroyContext(ImNodesContext* ctx = NULL); // NULL = destroy current context
- ImNodesContext* GetCurrentContext();
- void SetCurrentContext(ImNodesContext* ctx);
- ImNodesEditorContext* EditorContextCreate();
- void EditorContextFree(ImNodesEditorContext*);
- void EditorContextSet(ImNodesEditorContext*);
- ImVec2 EditorContextGetPanning();
- void EditorContextResetPanning(const ImVec2& pos);
- void EditorContextMoveToNode(const int node_id);
- ImNodesIO& GetIO();
- // Returns the global style struct. See the struct declaration for default values.
- ImNodesStyle& GetStyle();
- // Style presets matching the dear imgui styles of the same name.
- void StyleColorsDark(); // on by default
- void StyleColorsClassic();
- void StyleColorsLight();
- // The top-level function call. Call this before calling BeginNode/EndNode. Calling this function
- // will result the node editor grid workspace being rendered.
- void BeginNodeEditor();
- void EndNodeEditor();
- // Add a navigable minimap to the editor; call before EndNodeEditor after all
- // nodes and links have been specified
- void MiniMap(
- const float minimap_size_fraction = 0.2f,
- const ImNodesMiniMapLocation location = ImNodesMiniMapLocation_TopLeft,
- const ImNodesMiniMapNodeHoveringCallback node_hovering_callback = NULL,
- void* node_hovering_callback_data = NULL);
- // Use PushColorStyle and PopColorStyle to modify ImNodesStyle::Colors mid-frame.
- void PushColorStyle(ImNodesCol item, unsigned int color);
- void PopColorStyle();
- void PushStyleVar(ImNodesStyleVar style_item, float value);
- void PopStyleVar();
- // id can be any positive or negative integer, but INT_MIN is currently reserved for internal use.
- void BeginNode(int id);
- void EndNode();
- ImVec2 GetNodeDimensions(int id);
- // Place your node title bar content (such as the node title, using ImGui::Text) between the
- // following function calls. These functions have to be called before adding any attributes, or the
- // layout of the node will be incorrect.
- void BeginNodeTitleBar();
- void EndNodeTitleBar();
- // Attributes are ImGui UI elements embedded within the node. Attributes can have pin shapes
- // rendered next to them. Links are created between pins.
- //
- // The activity status of an attribute can be checked via the IsAttributeActive() and
- // IsAnyAttributeActive() function calls. This is one easy way of checking for any changes made to
- // an attribute's drag float UI, for instance.
- //
- // Each attribute id must be unique.
- // Create an input attribute block. The pin is rendered on left side.
- void BeginInputAttribute(int id, ImNodesPinShape shape = ImNodesPinShape_CircleFilled);
- void EndInputAttribute();
- // Create an output attribute block. The pin is rendered on the right side.
- void BeginOutputAttribute(int id, ImNodesPinShape shape = ImNodesPinShape_CircleFilled);
- void EndOutputAttribute();
- // Create a static attribute block. A static attribute has no pin, and therefore can't be linked to
- // anything. However, you can still use IsAttributeActive() and IsAnyAttributeActive() to check for
- // attribute activity.
- void BeginStaticAttribute(int id);
- void EndStaticAttribute();
- // Push a single AttributeFlags value. By default, only AttributeFlags_None is set.
- void PushAttributeFlag(ImNodesAttributeFlags flag);
- void PopAttributeFlag();
- // Render a link between attributes.
- // The attributes ids used here must match the ids used in Begin(Input|Output)Attribute function
- // calls. The order of start_attr and end_attr doesn't make a difference for rendering the link.
- void Link(int id, int start_attribute_id, int end_attribute_id);
- // Enable or disable the ability to click and drag a specific node.
- void SetNodeDraggable(int node_id, const bool draggable);
- // The node's position can be expressed in three coordinate systems:
- // * screen space coordinates, -- the origin is the upper left corner of the window.
- // * editor space coordinates -- the origin is the upper left corner of the node editor window
- // * grid space coordinates, -- the origin is the upper left corner of the node editor window,
- // translated by the current editor panning vector (see EditorContextGetPanning() and
- // EditorContextResetPanning())
- // Use the following functions to get and set the node's coordinates in these coordinate systems.
- void SetNodeScreenSpacePos(int node_id, const ImVec2& screen_space_pos);
- void SetNodeEditorSpacePos(int node_id, const ImVec2& editor_space_pos);
- void SetNodeGridSpacePos(int node_id, const ImVec2& grid_pos);
- ImVec2 GetNodeScreenSpacePos(const int node_id);
- ImVec2 GetNodeEditorSpacePos(const int node_id);
- ImVec2 GetNodeGridSpacePos(const int node_id);
- // Returns true if the current node editor canvas is being hovered over by the mouse, and is not
- // blocked by any other windows.
- bool IsEditorHovered();
- // The following functions return true if a UI element is being hovered over by the mouse cursor.
- // Assigns the id of the UI element being hovered over to the function argument. Use these functions
- // after EndNodeEditor() has been called.
- bool IsNodeHovered(int* node_id);
- bool IsLinkHovered(int* link_id);
- bool IsPinHovered(int* attribute_id);
- // Use The following two functions to query the number of selected nodes or links in the current
- // editor. Use after calling EndNodeEditor().
- int NumSelectedNodes();
- int NumSelectedLinks();
- // Get the selected node/link ids. The pointer argument should point to an integer array with at
- // least as many elements as the respective NumSelectedNodes/NumSelectedLinks function call
- // returned.
- void GetSelectedNodes(int* node_ids);
- void GetSelectedLinks(int* link_ids);
- // Clears the list of selected nodes/links. Useful if you want to delete a selected node or link.
- void ClearNodeSelection();
- void ClearLinkSelection();
- // Use the following functions to add or remove individual nodes or links from the current editors
- // selection. Note that all functions require the id to be an existing valid id for this editor.
- // Select-functions has the precondition that the object is currently considered unselected.
- // Clear-functions has the precondition that the object is currently considered selected.
- // Preconditions listed above can be checked via IsNodeSelected/IsLinkSelected if not already
- // known.
- void SelectNode(int node_id);
- void ClearNodeSelection(int node_id);
- bool IsNodeSelected(int node_id);
- void SelectLink(int link_id);
- void ClearLinkSelection(int link_id);
- bool IsLinkSelected(int link_id);
- // Was the previous attribute active? This will continuously return true while the left mouse button
- // is being pressed over the UI content of the attribute.
- bool IsAttributeActive();
- // Was any attribute active? If so, sets the active attribute id to the output function argument.
- bool IsAnyAttributeActive(int* attribute_id = NULL);
- // Use the following functions to query a change of state for an existing link, or new link. Call
- // these after EndNodeEditor().
- // Did the user start dragging a new link from a pin?
- bool IsLinkStarted(int* started_at_attribute_id);
- // Did the user drop the dragged link before attaching it to a pin?
- // There are two different kinds of situations to consider when handling this event:
- // 1) a link which is created at a pin and then dropped
- // 2) an existing link which is detached from a pin and then dropped
- // Use the including_detached_links flag to control whether this function triggers when the user
- // detaches a link and drops it.
- bool IsLinkDropped(int* started_at_attribute_id = NULL, bool including_detached_links = true);
- // Did the user finish creating a new link?
- bool IsLinkCreated(
- int* started_at_attribute_id,
- int* ended_at_attribute_id,
- bool* created_from_snap = NULL);
- bool IsLinkCreated(
- int* started_at_node_id,
- int* started_at_attribute_id,
- int* ended_at_node_id,
- int* ended_at_attribute_id,
- bool* created_from_snap = NULL);
- // Was an existing link detached from a pin by the user? The detached link's id is assigned to the
- // output argument link_id.
- bool IsLinkDestroyed(int* link_id);
- // Use the following functions to write the editor context's state to a string, or directly to a
- // file. The editor context is serialized in the INI file format.
- const char* SaveCurrentEditorStateToIniString(size_t* data_size = NULL);
- const char* SaveEditorStateToIniString(
- const ImNodesEditorContext* editor,
- size_t* data_size = NULL);
- void LoadCurrentEditorStateFromIniString(const char* data, size_t data_size);
- void LoadEditorStateFromIniString(ImNodesEditorContext* editor, const char* data, size_t data_size);
- void SaveCurrentEditorStateToIniFile(const char* file_name);
- void SaveEditorStateToIniFile(const ImNodesEditorContext* editor, const char* file_name);
- void LoadCurrentEditorStateFromIniFile(const char* file_name);
- void LoadEditorStateFromIniFile(ImNodesEditorContext* editor, const char* file_name);
- } // namespace ImNodes
|