{"id":13405,"date":"2026-04-13T06:33:26","date_gmt":"2026-04-13T04:33:26","guid":{"rendered":"https:\/\/store.algosyntax.com\/?post_type=documentation&#038;p=13405"},"modified":"2026-04-13T07:01:09","modified_gmt":"2026-04-13T05:01:09","slug":"enhanced-ui-core-overview","status":"publish","type":"documentation","link":"https:\/\/store.algosyntax.com\/documentation\/enhanced-ui-core-overview\/","title":{"rendered":"Enhanced UI Core Overview"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"13405\" class=\"elementor elementor-13405\" data-elementor-post-type=\"documentation\">\n\t\t\t\t<div class=\"elementor-element elementor-element-347a463 e-flex e-con-boxed e-con e-parent\" data-id=\"347a463\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e1a2d7d elementor-widget elementor-widget-heading\" data-id=\"e1a2d7d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Enhanced UI Core Overview<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aaedaf8 elementor-widget elementor-widget-text-editor\" data-id=\"aaedaf8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h2 data-section-id=\"1sipi8n\" data-start=\"174\" data-end=\"193\">What this covers<\/h2><ol data-start=\"195\" data-end=\"396\"><li data-section-id=\"e9tjoe\" data-start=\"195\" data-end=\"227\">What Enhanced UI is solving<\/li><li data-section-id=\"yj6i8n\" data-start=\"228\" data-end=\"257\">The core building blocks<\/li><li data-section-id=\"1n1j238\" data-start=\"258\" data-end=\"303\">How interaction flows through the system<\/li><li data-section-id=\"1gfe1l6\" data-start=\"304\" data-end=\"340\">The geometry model (conceptual)<\/li><li data-section-id=\"bbnqza\" data-start=\"341\" data-end=\"365\">How rendering works<\/li><li data-section-id=\"13qrcus\" data-start=\"366\" data-end=\"396\">How you extend the system<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-603508f elementor-widget elementor-widget-button\" data-id=\"603508f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/store.algosyntax.com\/marketplace\/unreal-engine\/enhanced-ui\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Download Enhanced UI<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c24b2ba e-flex e-con-boxed e-con e-parent\" data-id=\"c24b2ba\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-df86562 elementor-widget elementor-widget-heading\" data-id=\"df86562\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">What Enhanced UI Solves<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dfae294 elementor-widget elementor-widget-text-editor\" data-id=\"dfae294\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"430\" data-end=\"525\">Enhanced UI provides a <strong data-start=\"453\" data-end=\"496\">structured way to build interactive UIs<\/strong> in Unreal where widgets can:<\/p><ul data-start=\"527\" data-end=\"594\"><li data-section-id=\"1j3zu0p\" data-start=\"527\" data-end=\"533\">Move<\/li><li data-section-id=\"724are\" data-start=\"534\" data-end=\"542\">Resize<\/li><li data-section-id=\"s8ghz9\" data-start=\"543\" data-end=\"566\">Respond to user input<\/li><li data-section-id=\"1xwnyxl\" data-start=\"567\" data-end=\"594\">Represent underlying data<\/li><\/ul><p data-start=\"596\" data-end=\"625\">The key problem it solves is:<\/p><blockquote data-start=\"627\" data-end=\"737\"><p data-start=\"629\" data-end=\"737\">How to separate <em data-start=\"645\" data-end=\"662\">input detection<\/em>, <em data-start=\"664\" data-end=\"674\">behavior<\/em>, and <em data-start=\"680\" data-end=\"694\">layout state<\/em> so complex UI systems remain maintainable.<\/p><\/blockquote>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-30ef122 e-flex e-con-boxed e-con e-parent\" data-id=\"30ef122\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ddabdb9 elementor-widget elementor-widget-heading\" data-id=\"ddabdb9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Core Building Blocks<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6fc7eb2 elementor-widget elementor-widget-text-editor\" data-id=\"6fc7eb2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"768\" data-end=\"800\">There are three core components:<\/p><h3 data-section-id=\"1l9dcac\" data-start=\"802\" data-end=\"839\"><span role=\"text\">1. SmartWidget (<code data-start=\"822\" data-end=\"838\">UAxSmartWidget<\/code>)<\/span><\/h3><ul data-start=\"841\" data-end=\"994\"><li data-section-id=\"13kogha\" data-start=\"841\" data-end=\"888\">Detects user interaction (click, hover, drag)<\/li><li data-section-id=\"35vgq8\" data-start=\"889\" data-end=\"955\">Identifies <em data-start=\"902\" data-end=\"909\">where<\/em> interaction happened (edges, corners, center)<\/li><li data-section-id=\"1yjnei3\" data-start=\"956\" data-end=\"994\">Sends that information to its parent<\/li><\/ul><p data-start=\"996\" data-end=\"1017\">Important constraint:<\/p><blockquote data-start=\"1019\" data-end=\"1067\"><p data-start=\"1021\" data-end=\"1067\">SmartWidgets do not move or resize themselves.<\/p><\/blockquote><p data-start=\"1069\" data-end=\"1143\">They are purely <strong data-start=\"1085\" data-end=\"1104\">input<br \/><br \/><\/strong><\/p><h3 data-section-id=\"15z6dh9\" data-start=\"1308\" data-end=\"1333\">Where to look in code<\/h3><ul data-start=\"1335\" data-end=\"1564\"><li data-section-id=\"amfype\" data-start=\"1335\" data-end=\"1417\">Entry point for input:<ul data-start=\"1362\" data-end=\"1417\"><li data-section-id=\"1dnokek\" data-start=\"1362\" data-end=\"1391\"><code data-start=\"1364\" data-end=\"1391\">NativeOnMouseButtonDown()<\/code><\/li><li data-section-id=\"15tvq7t\" data-start=\"1394\" data-end=\"1417\"><code data-start=\"1396\" data-end=\"1417\">NativeOnMouseMove()<\/code><\/li><\/ul><\/li><li data-section-id=\"ws3m0a\" data-start=\"1418\" data-end=\"1471\">Handle detection:<ul data-start=\"1440\" data-end=\"1471\"><li data-section-id=\"1n18rn6\" data-start=\"1440\" data-end=\"1471\"><code data-start=\"1442\" data-end=\"1471\">DetectHandleForMouseEvent()<\/code><\/li><\/ul><\/li><li data-section-id=\"45q441\" data-start=\"1472\" data-end=\"1564\">Event forwarding:<ul data-start=\"1494\" data-end=\"1564\"><li data-section-id=\"deif5g\" data-start=\"1494\" data-end=\"1527\"><code data-start=\"1496\" data-end=\"1527\">BroadcastMouseDownForHandle()<\/code><\/li><li data-section-id=\"hkigo0\" data-start=\"1530\" data-end=\"1564\"><code data-start=\"1532\" data-end=\"1564\">BroadcastMouseHoverForHandle()<\/code><\/li><\/ul><\/li><\/ul><p data-start=\"1069\" data-end=\"1143\"><strong data-start=\"1085\" data-end=\"1104\">reporters<\/strong>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8203950 elementor-widget elementor-widget-text-editor\" data-id=\"8203950\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 data-section-id=\"15mmnq9\" data-start=\"1150\" data-end=\"1192\"><span role=\"text\">2. SmartCanvas (<code data-start=\"1170\" data-end=\"1191\">UAxSmartCanvasPanel<\/code>)<\/span><\/h3><ul data-start=\"1194\" data-end=\"1324\"><li data-section-id=\"1ahf7dv\" data-start=\"1194\" data-end=\"1247\">Owns all behavior (movement, resizing, constraints)<\/li><li data-section-id=\"jhty85\" data-start=\"1248\" data-end=\"1295\">Receives interaction events from SmartWidgets<\/li><li data-section-id=\"iwzbkg\" data-start=\"1296\" data-end=\"1324\">Decides what should happen<\/li><\/ul><p data-start=\"1326\" data-end=\"1347\">Examples of behavior:<\/p><ul data-start=\"1349\" data-end=\"1441\"><li data-section-id=\"1jdlhdh\" data-start=\"1349\" data-end=\"1362\">Move widget<\/li><li data-section-id=\"qeu6om\" data-start=\"1363\" data-end=\"1378\">Resize widget<\/li><li data-section-id=\"kda6zj\" data-start=\"1379\" data-end=\"1400\">Clamp within bounds<\/li><li data-section-id=\"lf2mex\" data-start=\"1401\" data-end=\"1441\">Apply constraints (in derived classes)<\/li><\/ul><h3 data-section-id=\"15z6dh9\" data-start=\"1863\" data-end=\"1888\">Where to look in code<\/h3><ul data-start=\"1890\" data-end=\"2094\"><li data-section-id=\"mjnu5d\" data-start=\"1890\" data-end=\"1981\">Event entry from child:<ul data-start=\"1918\" data-end=\"1981\"><li data-section-id=\"fe7d4z\" data-start=\"1918\" data-end=\"1949\"><code data-start=\"1920\" data-end=\"1949\">HandleSmartChildMouseDown()<\/code><\/li><li data-section-id=\"ulrnas\" data-start=\"1952\" data-end=\"1981\"><code data-start=\"1954\" data-end=\"1981\">HandleSmartChildMouseUp()<\/code><\/li><\/ul><\/li><li data-section-id=\"1fvksqp\" data-start=\"1982\" data-end=\"2031\">Core interaction logic:<ul data-start=\"2010\" data-end=\"2031\"><li data-section-id=\"5n1ulv\" data-start=\"2010\" data-end=\"2031\"><code data-start=\"2012\" data-end=\"2031\">HandleMouseMove()<\/code><\/li><\/ul><\/li><li data-section-id=\"14u1mzk\" data-start=\"2032\" data-end=\"2094\">Geometry application:<ul data-start=\"2058\" data-end=\"2094\"><li data-section-id=\"wiwukd\" data-start=\"2058\" data-end=\"2094\"><code data-start=\"2060\" data-end=\"2094\">UpdateSmartChildWidgetGeometry()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e42d72e elementor-widget elementor-widget-text-editor\" data-id=\"e42d72e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 data-section-id=\"vrvgti\" data-start=\"1544\" data-end=\"1582\"><span role=\"text\">3. Slate Canvas (<code data-start=\"1565\" data-end=\"1581\">SAxSmartCanvas<\/code>)<\/span><\/h3><ul data-start=\"1584\" data-end=\"1687\"><li data-section-id=\"1k93ws3\" data-start=\"1584\" data-end=\"1632\">Handles rendering and low-level input bridging<\/li><li data-section-id=\"1aj39lj\" data-start=\"1633\" data-end=\"1687\">Calls into SmartCanvas during paint and input events<\/li><\/ul><p data-start=\"1689\" data-end=\"1747\">This layer exists to connect UMG logic to Slate rendering.<br \/><br \/><\/p><h3 data-section-id=\"15z6dh9\" data-start=\"2349\" data-end=\"2374\">Where to look in code<\/h3><ul data-start=\"2376\" data-end=\"2498\"><li data-section-id=\"rqciui\" data-start=\"2376\" data-end=\"2432\">Paint entry:<ul data-start=\"2393\" data-end=\"2432\"><li data-section-id=\"1kryrz5\" data-start=\"2393\" data-end=\"2432\"><code data-start=\"2395\" data-end=\"2406\">OnPaint()<\/code> \u2192 calls <code data-start=\"2415\" data-end=\"2432\">HandleOnPaint()<\/code><\/li><\/ul><\/li><li data-section-id=\"1ud5azu\" data-start=\"2433\" data-end=\"2498\">Input forwarding:<ul data-start=\"2455\" data-end=\"2498\"><li data-section-id=\"1wgryp9\" data-start=\"2455\" data-end=\"2478\"><code data-start=\"2457\" data-end=\"2478\">OnMouseButtonDown()<\/code><\/li><li data-section-id=\"8162qg\" data-start=\"2481\" data-end=\"2498\"><code data-start=\"2483\" data-end=\"2498\">OnMouseMove()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3cd9928 e-flex e-con-boxed e-con e-parent\" data-id=\"3cd9928\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-82c31f4 elementor-widget elementor-widget-heading\" data-id=\"82c31f4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Interaction Flow (Conceptual)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-606671b elementor-widget elementor-widget-text-editor\" data-id=\"606671b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"1826\" data-end=\"1859\">The system follows a strict flow:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bd1ed25 elementor-widget elementor-widget-code-highlight\" data-id=\"bd1ed25\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-cpp line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-cpp\">\n\t\t\t\t\t<xmp>User interacts with Widget\r\n        \u2193\r\nSmartWidget detects interaction zone\r\n        \u2193\r\nPayload is created (what + where)\r\n        \u2193\r\nSmartCanvas receives it\r\n        \u2193\r\nSmartCanvas decides behavior\r\n        \u2193\r\nGeometry is updated\r\n        \u2193\r\nUI updates during paint<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5c3502 elementor-widget elementor-widget-text-editor\" data-id=\"d5c3502\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"2125\" data-end=\"2194\">This separation is what allows complex systems to remain predictable.<br \/><br \/><\/p><h3 data-section-id=\"sq6eil\" data-start=\"2811\" data-end=\"2842\">Where to trace this in code<\/h3><ol data-start=\"2844\" data-end=\"3139\"><li data-section-id=\"wgf64f\" data-start=\"2844\" data-end=\"2909\">Input starts:<ul data-start=\"2864\" data-end=\"2909\"><li data-section-id=\"1fh52z9\" data-start=\"2864\" data-end=\"2909\"><code data-start=\"2866\" data-end=\"2909\">UAxSmartWidget::NativeOnMouseButtonDown()<\/code><\/li><\/ul><\/li><li data-section-id=\"ojawem\" data-start=\"2911\" data-end=\"2959\">Payload created:<ul data-start=\"2934\" data-end=\"2959\"><li data-section-id=\"7ycbik\" data-start=\"2934\" data-end=\"2959\"><code data-start=\"2936\" data-end=\"2959\">FAxSmartWidgetPayload<\/code><\/li><\/ul><\/li><li data-section-id=\"1m3kxr2\" data-start=\"2961\" data-end=\"3009\">Forwarded:<ul data-start=\"2978\" data-end=\"3009\"><li data-section-id=\"tbpp55\" data-start=\"2978\" data-end=\"3009\"><code data-start=\"2980\" data-end=\"3009\">MouseDownEvent.Execute(...)<\/code><\/li><\/ul><\/li><li data-section-id=\"hs8ppp\" data-start=\"3011\" data-end=\"3079\">Received:<ul data-start=\"3027\" data-end=\"3079\"><li data-section-id=\"y5cinc\" data-start=\"3027\" data-end=\"3079\"><code data-start=\"3029\" data-end=\"3079\">UAxSmartCanvasPanel::HandleSmartChildMouseDown()<\/code><\/li><\/ul><\/li><li data-section-id=\"m8rvww\" data-start=\"3081\" data-end=\"3139\">Movement:<ul data-start=\"3097\" data-end=\"3139\"><li data-section-id=\"1vg8e6w\" data-start=\"3097\" data-end=\"3139\"><code data-start=\"3099\" data-end=\"3139\">UAxSmartCanvasPanel::HandleMouseMove()<\/code><\/li><\/ul><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5319175 e-flex e-con-boxed e-con e-parent\" data-id=\"5319175\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b591919 elementor-widget elementor-widget-heading\" data-id=\"b591919\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Geometry Model (Conceptual)<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-801f80a elementor-widget elementor-widget-text-editor\" data-id=\"801f80a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"2232\" data-end=\"2313\">Each widget has a <strong data-start=\"2250\" data-end=\"2267\">SmartGeometry<\/strong> object.<\/p><p data-start=\"2315\" data-end=\"2329\">It represents:<\/p><ul data-start=\"2331\" data-end=\"2362\"><li data-section-id=\"1w17frl\" data-start=\"2331\" data-end=\"2341\">Position<\/li><li data-section-id=\"1j4dcvh\" data-start=\"2342\" data-end=\"2348\">Size<\/li><li data-section-id=\"1ozauce\" data-start=\"2349\" data-end=\"2362\">Constraints<\/li><\/ul><p data-start=\"2364\" data-end=\"2384\">There are two modes:<\/p><h3 data-section-id=\"lavrb8\" data-start=\"2386\" data-end=\"2405\">Normalized Mode<\/h3><ul data-start=\"2406\" data-end=\"2491\"><li data-section-id=\"cq7n80\" data-start=\"2406\" data-end=\"2430\">Values between 0 and 1<\/li><li data-section-id=\"1izyt58\" data-start=\"2431\" data-end=\"2470\">Automatically stays inside the canvas<\/li><li data-section-id=\"1er4bvh\" data-start=\"2471\" data-end=\"2491\">Scales with parent<\/li><\/ul><h3 data-section-id=\"i6rhm5\" data-start=\"2493\" data-end=\"2507\">Pixel Mode<\/h3><ul data-start=\"2508\" data-end=\"2584\"><li data-section-id=\"d8z3hj\" data-start=\"2508\" data-end=\"2525\">Absolute values<\/li><li data-section-id=\"rwo0ma\" data-start=\"2526\" data-end=\"2552\">No automatic constraints<\/li><li data-section-id=\"1v4unba\" data-start=\"2553\" data-end=\"2584\">Used for editor-style layouts<br \/><br \/><\/li><\/ul><h3 data-section-id=\"15z6dh9\" data-start=\"3483\" data-end=\"3508\">Where to look in code<\/h3><ul data-start=\"3510\" data-end=\"3693\"><li data-section-id=\"1gymv1n\" data-start=\"3510\" data-end=\"3553\">Struct definition:<ul data-start=\"3533\" data-end=\"3553\"><li data-section-id=\"prwu2c\" data-start=\"3533\" data-end=\"3553\"><code data-start=\"3535\" data-end=\"3553\">FAxSmartGeometry<\/code><\/li><\/ul><\/li><li data-section-id=\"fc3j0v\" data-start=\"3554\" data-end=\"3693\">Mutation functions:<ul data-start=\"3578\" data-end=\"3693\"><li data-section-id=\"1f3t9as\" data-start=\"3578\" data-end=\"3605\"><code data-start=\"3580\" data-end=\"3605\">SetStartAndUpdateSize()<\/code><\/li><li data-section-id=\"1ace23w\" data-start=\"3608\" data-end=\"3634\"><code data-start=\"3610\" data-end=\"3634\">SetStopAndUpdateSize()<\/code><\/li><li data-section-id=\"1m6wlft\" data-start=\"3637\" data-end=\"3664\"><code data-start=\"3639\" data-end=\"3664\">SetStartAndUpdateStop()<\/code><\/li><li data-section-id=\"1x9hgss\" data-start=\"3667\" data-end=\"3693\"><code data-start=\"3669\" data-end=\"3693\">SetSizeAndUpdateStop()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-63e5e63 e-flex e-con-boxed e-con e-parent\" data-id=\"63e5e63\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-02363f2 elementor-widget elementor-widget-heading\" data-id=\"02363f2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Rendering Model<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0a70691 elementor-widget elementor-widget-text-editor\" data-id=\"0a70691\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"2688\" data-end=\"2719\">Rendering is <strong data-start=\"2701\" data-end=\"2718\">not immediate<\/strong>.<\/p><p data-start=\"2721\" data-end=\"2729\">Instead:<\/p><ol data-start=\"2731\" data-end=\"2886\"><li data-section-id=\"1l6j5p9\" data-start=\"2731\" data-end=\"2774\">Interaction updates geometry (data only)<\/li><li data-section-id=\"1jm6i0p\" data-start=\"2775\" data-end=\"2886\">During the paint phase:<br \/><ul data-start=\"2805\" data-end=\"2886\"><li data-section-id=\"1vbvefy\" data-start=\"2805\" data-end=\"2848\">Geometry is converted into real UI layout<\/li><li data-section-id=\"5hqu4z\" data-start=\"2852\" data-end=\"2886\">Widgets are positioned and sized<\/li><\/ul><\/li><\/ol><h3 data-section-id=\"15z6dh9\" data-start=\"4007\" data-end=\"4032\">Where to look in code<\/h3><ul data-start=\"4034\" data-end=\"4186\"><li data-section-id=\"18fz8u2\" data-start=\"4034\" data-end=\"4080\">Paint entry:<ul data-start=\"4051\" data-end=\"4080\"><li data-section-id=\"14powoh\" data-start=\"4051\" data-end=\"4080\"><code data-start=\"4053\" data-end=\"4080\">SAxSmartCanvas::OnPaint()<\/code><\/li><\/ul><\/li><li data-section-id=\"bypoxw\" data-start=\"4081\" data-end=\"4186\">Geometry application:<ul data-start=\"4107\" data-end=\"4186\"><li data-section-id=\"1qyozqj\" data-start=\"4107\" data-end=\"4147\"><code data-start=\"4109\" data-end=\"4147\">UAxSmartCanvasPanel::HandleOnPaint()<\/code><\/li><li data-section-id=\"wiwukd\" data-start=\"4150\" data-end=\"4186\"><code data-start=\"4152\" data-end=\"4186\">UpdateSmartChildWidgetGeometry()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-5ea3311 e-flex e-con-boxed e-con e-parent\" data-id=\"5ea3311\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a988918 elementor-widget elementor-widget-heading\" data-id=\"a988918\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Data Model<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52a26c1 elementor-widget elementor-widget-text-editor\" data-id=\"52a26c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"4251\" data-end=\"4287\">Widgets can represent external data.<\/p><p data-start=\"4289\" data-end=\"4297\">Example:<\/p><ul data-start=\"4298\" data-end=\"4356\"><li data-section-id=\"10bwnyr\" data-start=\"4298\" data-end=\"4356\">A SmartWidget can represent a MIDI note, clip, or window<\/li><\/ul><p data-start=\"4358\" data-end=\"4379\">The system maintains:<\/p><div class=\"relative w-full mt-4 mb-1\"><div class=\"\"><div class=\"relative\"><div class=\"h-full min-h-0 min-w-0\"><div class=\"h-full min-h-0 min-w-0\"><div class=\"border border-token-border-light border-radius-3xl corner-superellipse\/1.1 rounded-3xl\"><div class=\"h-full w-full border-radius-3xl bg-token-bg-elevated-secondary corner-superellipse\/1.1 overflow-clip rounded-3xl lxnfua_clipPathFallback\"><div class=\"pointer-events-none absolute end-1.5 top-1 z-2 md:end-2 md:top-1\">\u00a0<\/div><div class=\"relative\"><div class=\"w-full overflow-x-hidden overflow-y-auto pe-11 pt-3\"><div class=\"relative z-0 flex max-w-full\"><div id=\"code-block-viewer\" class=\"q9tKkq_viewer cm-editor z-10 light:cm-light dark:cm-light flex h-full w-full flex-col items-stretch \u037ck \u037cy\" dir=\"ltr\"><div class=\"cm-scroller\"><div class=\"cm-content q9tKkq_readonly\">Data Object \u2192 SmartWidget<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"\"><div class=\"\">\u00a0<\/div><\/div><\/div><\/div><\/div><p data-start=\"4416\" data-end=\"4428\">This allows:<\/p><ul data-start=\"4430\" data-end=\"4492\"><li data-section-id=\"1lz35oq\" data-start=\"4430\" data-end=\"4445\">Fast lookup<\/li><li data-section-id=\"qyva7n\" data-start=\"4446\" data-end=\"4467\">Efficient updates<\/li><li data-section-id=\"xj9dhd\" data-start=\"4468\" data-end=\"4492\">No duplicate widgets<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1e963f2 elementor-widget elementor-widget-text-editor\" data-id=\"1e963f2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 data-section-id=\"15z6dh9\" data-start=\"4499\" data-end=\"4524\">Where to look in code<\/h3><ul data-start=\"4526\" data-end=\"4658\"><li data-section-id=\"towovo\" data-start=\"4526\" data-end=\"4570\">Mapping:<ul data-start=\"4539\" data-end=\"4570\"><li data-section-id=\"ymbfc5\" data-start=\"4539\" data-end=\"4570\"><code data-start=\"4541\" data-end=\"4570\">ObjectToSmartChildWidgetMap<\/code><\/li><\/ul><\/li><li data-section-id=\"nav827\" data-start=\"4571\" data-end=\"4608\">Access point:<ul data-start=\"4589\" data-end=\"4608\"><li data-section-id=\"jlcdqy\" data-start=\"4589\" data-end=\"4608\"><code data-start=\"4591\" data-end=\"4608\">GetDataObject()<\/code><\/li><\/ul><\/li><li data-section-id=\"5z46dv\" data-start=\"4609\" data-end=\"4658\">Registration:<ul data-start=\"4627\" data-end=\"4658\"><li data-section-id=\"17598pr\" data-start=\"4627\" data-end=\"4658\"><code data-start=\"4629\" data-end=\"4658\">AddAndRegisterSmartWidget()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cd3fcf6 e-flex e-con-boxed e-con e-parent\" data-id=\"cd3fcf6\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-732ef62 elementor-widget elementor-widget-heading\" data-id=\"732ef62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Extensibility Model<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cad34bc elementor-widget elementor-widget-text-editor\" data-id=\"cad34bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h2 data-section-id=\"1htzlzw\" data-start=\"4732\" data-end=\"4748\">Base Behavior<\/h2><p data-start=\"4750\" data-end=\"4771\">SmartCanvas provides:<\/p><ul data-start=\"4773\" data-end=\"4825\"><li data-section-id=\"gforof\" data-start=\"4773\" data-end=\"4790\">Free movement<\/li><li data-section-id=\"1nsafy7\" data-start=\"4791\" data-end=\"4803\">Resizing<\/li><li data-section-id=\"1kfo0zo\" data-start=\"4804\" data-end=\"4825\">Basic constraints<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2d5769c elementor-widget elementor-widget-text-editor\" data-id=\"2d5769c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h2 data-section-id=\"csrtn4\" data-start=\"4832\" data-end=\"4850\">Derived Classes<\/h2><p data-start=\"4852\" data-end=\"4911\">Derived classes <strong data-start=\"4868\" data-end=\"4887\">refine behavior<\/strong>, not replace structure.<\/p><p data-start=\"4913\" data-end=\"4922\">Examples:<\/p><ul data-start=\"4924\" data-end=\"5039\"><li data-section-id=\"s5ub5k\" data-start=\"4924\" data-end=\"4964\">Piano roll \u2192 snapping + quantization<\/li><li data-section-id=\"202l0m\" data-start=\"4965\" data-end=\"5000\">Timeline \u2192 axis-locked movement<\/li><li data-section-id=\"szaz3i\" data-start=\"5001\" data-end=\"5039\">Window system \u2192 free drag + resize<\/li><\/ul><blockquote data-start=\"5041\" data-end=\"5109\"><p data-start=\"5043\" data-end=\"5109\">Base allows everything<br data-start=\"5065\" data-end=\"5068\" \/>Derived classes restrict or reinterpret<\/p><\/blockquote>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-231324e elementor-widget elementor-widget-text-editor\" data-id=\"231324e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 data-section-id=\"15z6dh9\" data-start=\"5116\" data-end=\"5141\">Where to look in code<\/h3><ul data-start=\"5143\" data-end=\"5339\"><li data-section-id=\"hpxq95\" data-start=\"5143\" data-end=\"5219\">Override points:<ul data-start=\"5164\" data-end=\"5219\"><li data-section-id=\"5n1ulv\" data-start=\"5164\" data-end=\"5185\"><code data-start=\"5166\" data-end=\"5185\">HandleMouseMove()<\/code><\/li><li data-section-id=\"fe7d4z\" data-start=\"5188\" data-end=\"5219\"><code data-start=\"5190\" data-end=\"5219\">HandleSmartChildMouseDown()<\/code><\/li><\/ul><\/li><li data-section-id=\"1ikcbjc\" data-start=\"5221\" data-end=\"5339\">Example pattern:<ul data-start=\"5242\" data-end=\"5339\"><li data-section-id=\"4v843h\" data-start=\"5242\" data-end=\"5306\">Call <code data-start=\"5249\" data-end=\"5275\">Super::HandleMouseMove()<\/code> and react to geometry change<\/li><li data-section-id=\"17hb9fr\" data-start=\"5309\" data-end=\"5339\">OR fully override behavior<\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c5e2a8e e-flex e-con-boxed e-con e-parent\" data-id=\"c5e2a8e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bd12113 elementor-widget elementor-widget-heading\" data-id=\"bd12113\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Z-Order \/ Interaction Layering<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-df4d743 elementor-widget elementor-widget-text-editor\" data-id=\"df4d743\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"5380\" data-end=\"5445\">The system supports bringing widgets to front during interaction.<\/p><h3 data-section-id=\"15z6dh9\" data-start=\"5447\" data-end=\"5472\">Where to look in code<\/h3><ul data-start=\"5474\" data-end=\"5579\"><li data-section-id=\"phiy03\" data-start=\"5474\" data-end=\"5522\">Function:<ul data-start=\"5488\" data-end=\"5522\"><li data-section-id=\"885t6k\" data-start=\"5488\" data-end=\"5522\"><code data-start=\"5490\" data-end=\"5522\">BringSmartChildWidgetToFront()<\/code><\/li><\/ul><\/li><li data-section-id=\"khak7n\" data-start=\"5523\" data-end=\"5579\">Recommended trigger:<ul data-start=\"5548\" data-end=\"5579\"><li data-section-id=\"fe7d4z\" data-start=\"5548\" data-end=\"5579\"><code data-start=\"5550\" data-end=\"5579\">HandleSmartChildMouseDown()<\/code><\/li><\/ul><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"featured_media":0,"template":"elementor_header_footer","categories":[132,129],"tags":[136],"class_list":["post-13405","documentation","type-documentation","status-publish","hentry","category-enhanced-ui","category-unreal-engine","tag-userinterface","entry"],"acf":[],"_links":{"self":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/documentation\/13405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/documentation"}],"about":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/types\/documentation"}],"version-history":[{"count":2,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/documentation\/13405\/revisions"}],"predecessor-version":[{"id":13421,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/documentation\/13405\/revisions\/13421"}],"wp:attachment":[{"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/media?parent=13405"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/categories?post=13405"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/store.algosyntax.com\/asx-rest\/wp\/v2\/tags?post=13405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}