From a1e3fd4ecfa0b28f66cb03ddd2de9861585895f3 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sat, 25 Mar 2017 17:28:57 +0000 Subject: [PATCH] change node children from unique to shared ptr, rename Canvas2D to StrokePreview, add panel toolbar with icon buttons to toggle --- android/build-run.bat | 1 + android/src/main/cpp/main.cpp | 41 ++++++++------ data/layout.xml | 48 +++++++++++------ data/ui/brushes.png | Bin 0 -> 16184 bytes data/ui/brushes.svg | 12 +++++ data/ui/layers.png | Bin 0 -> 1978 bytes data/ui/layers.svg | 1 + data/ui/palette.png | Bin 0 -> 1704 bytes data/ui/palette.svg | 1 + data/ui/stroke.png | Bin 0 -> 1932 bytes data/ui/stroke.svg | 1 + engine/app.cpp | 97 ++++++++++++++++++++++++++++++++-- engine/app.h | 10 ++-- engine/layout.cpp | 26 +++++++-- engine/layout.h | 43 ++++++++------- 15 files changed, 216 insertions(+), 65 deletions(-) create mode 100644 data/ui/brushes.png create mode 100644 data/ui/brushes.svg create mode 100644 data/ui/layers.png create mode 100644 data/ui/layers.svg create mode 100644 data/ui/palette.png create mode 100644 data/ui/palette.svg create mode 100644 data/ui/stroke.png create mode 100644 data/ui/stroke.svg diff --git a/android/build-run.bat b/android/build-run.bat index 87c7a75..9036f94 100644 --- a/android/build-run.bat +++ b/android/build-run.bat @@ -1,3 +1,4 @@ +xcopy /I /D /Y /S /E ..\data src\main\assets\data call gradlew installDebug call adb shell am start -n com.omigamedev/android.app.NativeActivity pause \ No newline at end of file diff --git a/android/src/main/cpp/main.cpp b/android/src/main/cpp/main.cpp index ad3c109..50a6049 100755 --- a/android/src/main/cpp/main.cpp +++ b/android/src/main/cpp/main.cpp @@ -116,7 +116,7 @@ static int engine_init_display(struct engine* engine) { surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); const EGLint attribs_test[] = { - EGL_CONTEXT_CLIENT_VERSION, 3, + EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE }; @@ -199,26 +199,34 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) struct engine* engine = (struct engine*)app->userData; float x = AMotionEvent_getX(event, 0); float y = AMotionEvent_getY(event, 0); + LOG("event source: %d", AInputEvent_getSource(event)); MouseEvent e; int32_t eventType = AInputEvent_getType(event); switch (eventType) { case AINPUT_EVENT_TYPE_MOTION: - switch (AInputEvent_getSource(event)) { - case AINPUT_SOURCE_TOUCHSCREEN: - int action = AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; - switch (action) { - case AMOTION_EVENT_ACTION_DOWN: - App::I.mouse_down(0, x, y); - return 1; - case AMOTION_EVENT_ACTION_UP: - App::I.mouse_up(0, x, y); - return 1; - case AMOTION_EVENT_ACTION_MOVE: - App::I.mouse_move(x, y); - return 1; - } +// switch (AInputEvent_getSource(event)) { +// case AINPUT_SOURCE_STYLUS: +// case AINPUT_SOURCE_TOUCHSCREEN: + { + int action = AKeyEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; + switch (action) { + case AMOTION_EVENT_ACTION_DOWN: + App::I.mouse_down(0, x, y); + return 1; + case AMOTION_EVENT_ACTION_UP: + App::I.mouse_up(0, x, y); + return 1; + case AMOTION_EVENT_ACTION_HOVER_MOVE: // pen move before touching + case AMOTION_EVENT_ACTION_MOVE: + App::I.mouse_move(x, y); + return 1; + default: + LOG("motion action: %d", action); break; - } // end switch + } + } +// break; +// } // end switch break; case AINPUT_EVENT_TYPE_KEY: // handle key input... @@ -260,6 +268,7 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { engine->accelerometerSensor, (1000L/60)*1000); } + engine->animating = 1; break; case APP_CMD_LOST_FOCUS: // When our app loses focus, we stop monitoring the accelerometer. diff --git a/data/layout.xml b/data/layout.xml index b8b1ffa..752776f 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -310,13 +310,13 @@ - + - + - + @@ -344,38 +344,52 @@ - + - + + + + + - --> + + + + + + + + + + - + - + - + - + - + @@ -385,7 +399,7 @@ - + diff --git a/data/ui/brushes.png b/data/ui/brushes.png new file mode 100644 index 0000000000000000000000000000000000000000..08d30b8de5d65263f452b64a2a6c8a0700f93069 GIT binary patch literal 16184 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 literal 0 HcmV?d00001 diff --git a/data/ui/brushes.svg b/data/ui/brushes.svg new file mode 100644 index 0000000..e5342ff --- /dev/null +++ b/data/ui/brushes.svg @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/data/ui/layers.png b/data/ui/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..97d2760330d7ea565d299ca60977af1b81b9c158 GIT binary patch literal 1978 zcmZ`)dpy$%8~T zRT7fd$UPCci)wD6n@g#4-ktN``^Wpo^L(G%_j#Uwp3jqUknFCiq@x4?fGUxI_mX1B zKLUeD_2^>2loTLz@Bjz^)!E8Fg5;$>DwyDP000t903bOP0KQ8@$#Vd}!2-ZSAOPU< z06;S;|H&Z-X+oB|-yIJC6~7x=NfOHKZ8YU=&x zjd6aS%RQA~bnsVfo7}2oM;7IF28EjC14pFei;?d<%?>{6_Z4KPl@|Q8+6c+XdW^)SN+-|P*<4_PeXm(t)s_?kXN|&u=mRxOn-|V1I zgX>9s=SwjK2F*2ptG8RK`-_imX-5P_zU6(*nRblTF>VpK$usnwC%4@?%oE2qR67ZB z-{h!^ADC#Ny7S$D`PRUSJuvTUglgM;d|!hf#Tf_xy4!kkeS3&J(ak?KZ)l&~*R7wS zLQUQ|hh(e`KC`S5!Z7ZP_C%00+7Yy;o2USzy6LT{6~lR>x}3-D@4o_5h>u(tjJS)goeToY`? zEV}g9cOiXfc5%IMzNXd`tT(G`BUC>Y{9duc{Ry7*L9+mKf29+Y~eCmjV2sdSs|4Jr7W!4)$BNetUr1i-lU^n~~WpjOd8F#{`VMU@b zM@ZO&JcN5y2Q0qBaz+ha6UouyRXCNil zRNf-n5tr2tHim4BA;g@V-B+C2MVq&^2ASR;>e=zs<=u*c;e7oqvX-;2@OfZb(;Q6u zdpGEvbgqi`;jGG|QH2!fHhO3NfPYE8Z=yp`9vktzqEl_nzWtFNE!$d9sqeG4{0{Q+ z2IjRSI$56v^PY`+y>L3J@WNxa%t2cal|62UM)lHEVQ~b(Qt0^z&S%jXSyVC58%~#bk@+rhmukfc*0df|6fFH0o-yG z*<;#$-6xOdeoI+6a50@VX{@!ugIt_9yhnKg@>QQz>Oj-Ic=Y#PW5q?U5s}1A%?$`CET3oIgPaonHJHp?SqRCR|}s;ezS86j#erc(~AhwOG`UXx&`cxzk#MCS#Fw)z(QsWaxKlmrilg+0hXNoZvO0 zXur4awDC<;V55?sBwxbf2N}b>>2YN>xLMJw*o77Uxe-AkwQWSroT(*Z>)bppV?TqV zSFmTHwhtlRqXF@Or_2{L^k=a?>j?dZa%TikxN&cX9)BM7X0ps8SL=P(<)3oV7?>Y! zXA=nFYW#b7O0sxtV+|P%%i_PYIE@;YGZUy@YKp(lAvbejnTo!lplDI<7FU4!q4UAgAwmR+k4o&7)kWssD-Q8IF_Zs6n%d4}~* z<%)^nHwM{X?WKRmnC \ No newline at end of file diff --git a/data/ui/palette.png b/data/ui/palette.png new file mode 100644 index 0000000000000000000000000000000000000000..621559e95650878e36c1a1b69c1966b3d188f277 GIT binary patch literal 1704 zcmZvcX;{+f7Qp`qZkQUT<`z<#S8Wh*hXgf{K*lw9VFDEkMP(32$#DrCa~acg$_;Z; zYBJMuU$Sg+om?h!3|dCLg<6`LU7u{6u*=;0;Xd;`_rrOA=e+OpJLi0Q3;cbLYeP+- z003xHDWpIpWBv*ai1K{4%9vLIa>~=k698IEv_7#^l{F%o66gZ}XRH7qI~M?UlvmlW z0U!kp04q!Yz*PdkexA55z)ks}5=A>s0)QLE7WT?YlSc_pRx;v0!L#VeP$udEs*jiY zKf%U22OW;x48IEis$?q3GbruZT21_Evta$v&ozRXp|{ok-n2~+*~dJNMt9V0ZZ>Fb zg%(01ylGwvL_H$YCSO;gh$-agHRpRl4iE2GBV}?TtmyQ2R$cKHA=Y6tVH%drHK)rG z-fs`amDN_&rpK<={(fa5%Y7|Fj2*ylU#@LWbtcn|ZI5(49$mbUOUG_AJMqu78)cQw~p7ER%k zR^RX*8?dW4+PZ=e<4>1gK0`?5#fb|-FM3{Dl8r|fe`2^%Q%g-_t|cETtU79R#ESBL zk}W+hRV=lUq3YV(!Vp?Les88~&pXsW5b^-4B2eInpX!vQ*|L=vLSAxnbERTCz1i7q z@z3WjR%WT{I#I0K^KWlyy3deDpHBXZe7!8$Wn2^)(JVF;30$W(s@EzkmqT+@dM^zg z+rux@?)t;Vcalsj6Svb%Ar#{QgXmJZP|LfJ*q-rN{z-j*mAY_bAKA{fmK!V5?7AKA zY$B`49zMkf4DZ!P{Tm4vVMAE-!Wd+wMTx2 z>yi(;$>-jkZS91aPM+--K^qW}ZXGH|NzSUK9L-UDlAu=3t@sgfi4>#NVsE1RqsqDI zQfb+PgF{;9vz~oP+R+{*UKFqO4cRKT(oKDh&!02L7bw=jztL7(104VW9;EG`!?kt- z0}F&%VD|Bi2iKP$B8+BVxpXH6ld22zFaOn5D2}3@u8*2D zJ+M!~XIDrF*rw1hZCm=s3Hy6uFu}vp9j?8)b|JSut7K8(*!S%hNb2wf!NwESH{G4$ zcc7P737eYlyW^8auEZd>L5CXsMqc<__n7Mau)F>!WCJY6j{D#N$vf^``mnG8Dv@?} zk6uZr(cMeU;0LgX7dk^W`9IUk7opET9{=|0$v{S(*(2HjGyP}UMprT8*MND1?b>gu z1?|#lp6)B*t4nRffaN!wCOZwI<)afz#*_S1I9Z(310Sk-DD$=Zfh}BwV{FsI#?L7v4%GoJeP>?$Yxo&M_Z9+t zws_1rD2_yA_%3c;+`%4Vl>X_o~L{!8NVQz*h}`HQAXIR0XXmS(5`G@&h=rF;v-Yd@)rj(B38DPP*kG^ zTJ2oVNj6z**u|q&RjxS(d>9`X&QS%0?tH}rb7$}NQTN`?`<;MrPEWtwVT3^RP;K3HPi7q#ned^XnyMv>|N4O^&u0l6#Dg=nq(WDg6x!UQoa0UH<1 zXDb2NqcJW>v;)%KDG1|;b8x^pp^u=^I5awC@B6R+CL|=qaAJl3N5K47sK+sz z3CZ7_!bP!?*~k<=2Z-fx**FvmMZ}?kliB=aR8j(qk0P;?;{{1PR3ba|Bs=jGCy|X( i?!`i-a8NuJmn{&m?UY>#Ru*fOO#!NxFRA4iQ}l18I^jY9 literal 0 HcmV?d00001 diff --git a/data/ui/palette.svg b/data/ui/palette.svg new file mode 100644 index 0000000..3ea82d1 --- /dev/null +++ b/data/ui/palette.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/ui/stroke.png b/data/ui/stroke.png new file mode 100644 index 0000000000000000000000000000000000000000..8f40a676079c06f24b41c256bfa3c63e9b53422c GIT binary patch literal 1932 zcmZ`)eLT|(7ynt9_l*eSGB24Do6YMG)5g4Bgiy+6Kf7Z?dxXmt&iU_T`}w*nD> zAP|15(Cn5pqyfRZfCxXWtZI3*>kLs|9-ebV&Ror+B~XrBzjgeZ_%*%$7ZZak}9FZ^jDd!NmudCnQrIJ>+ zx~POSgo2q$x%y;J^;x6qoo8*lD!vnlSTHNa?D1EaVUbz#nr4Mjt|iJ~zQtK{j!<@O zoyTAmellp~2pl90 zOU8hRwyR_OXP}h$MBX4F!~e{Ix}utIvZ_r_l!h#mc6Eq}Wp%#Yi#x|{koUrr*VK2v z$&N13l|`9%Qe{=y*QWd?uumqDuFjj*0?xuqI(*q5VJ+BM*rLNJhcf*3NH|Wf*Wv`0 z*8ej^Prtx$A&8(~c5KVOZl_igRuJ25+aFq1{;CL7d&%|rza6!c;maHt5{L;e z?VZ#bGOGOf7fqXCBRO4m#hccd-5R9r3{tI9ko=l@@Q07I^WN*HefvYw9l;~Lj#dU% z%@rh-E8_jk-j$H_My(0sAse^%Ss(kDSDLZ2YSrh`u0|>v4p5I;54m)Pwh`?oZs&M! z*m$zIIK&BkeFwtAZYduT15;iSDz!$9`(1#utuy3evIr3H*j>o>{=kI6jiD0L^#w$_}TWuDXHQnDax8Oul8Y{VDb z6xa?@pEpylTGq6&nl^6=FvD1zlDSvoOE{S^8MlmqB+g=lj;8iM{O&5>KS_WmbrwWd zxlV-UIkrC9%cCkyUqW>}h?v_3+r~%j6q%=>4DY4nwSxJEm!-u|rkajEXm_iD@zzYz zK`ITob)9l!D$J#WeNXS10?4dqD}5pFh@rMk3lcJE0 zKiWr@-L}ZrA)sdU#To9~JC9s4H2)Ou2cOUyw)nl_klk?Ohiu3i!0)Bmbsha~&uHmdsNXB8 zR7NAxHP!6SDe{`~bg{PQ8LFP2%EP1}2PduDrL#}3)bc5Vx7^e-j-%qIOnI_xFCLs@ z{iZYH6kz(0H~3?}TcAh%Tizd)h^?N!vtbtfH+RHK=Q*h9PmVpm&U7g$UWxf-8k<2t z{8S+AVYLr!slA)>%kq!2ER!Uge>Y)}FK7Gr5^j=`B@tphEs@HiVh&e9Bn z!DBEx1`e|SBVfhR7*QAhzu?dFMxVf=gE%0Y zgN|cS*k~fiiQ&e@qhrB@b6_l;5euRvcTvzh2AacV$Hjmak|9wzUXx@d;6d^wwz@`K F{tE{6JP`l@ literal 0 HcmV?d00001 diff --git a/data/ui/stroke.svg b/data/ui/stroke.svg new file mode 100644 index 0000000..ad584c1 --- /dev/null +++ b/data/ui/stroke.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/engine/app.cpp b/engine/app.cpp index 6d32ed3..834c1c9 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -184,7 +184,7 @@ void App::initLayout() NodeBorder::static_init(); NodeImage::static_init(); NodeIcon::static_init(); - NodeCanvas2D::static_init(); + NodeStrokePreview::static_init(); layout.on_loaded = [&] { LOG("initializing layout updating after load"); @@ -192,10 +192,36 @@ void App::initLayout() LOG("initializing layout components"); sidebar = layout[main_id]->find("sidebar"); - brushes = layout[main_id]->find("panel-brush"); - layers = layout[main_id]->find("panel-layer"); - color = layout[main_id]->find("panel-color"); - stroke = layout[main_id]->find("panel-stroke"); + panels = layout[main_id]->find("panels"); + + //brushes = layout[main_id]->find("panel-brush"); + //layers = layout[main_id]->find("panel-layer"); + //color = layout[main_id]->find("panel-color"); + //stroke = layout[main_id]->find("panel-stroke"); + + brushes = std::make_shared(); + brushes->m_manager = &layout; + brushes->init(); + brushes->create(); + brushes->loaded(); + + layers = std::make_shared(); + layers->m_manager = &layout; + layers->init(); + layers->create(); + layers->loaded(); + + color = std::make_shared(); + color->m_manager = &layout; + color->init(); + color->create(); + color->loaded(); + + stroke = std::make_shared(); + stroke->m_manager = &layout; + stroke->init(); + stroke->create(); + stroke->loaded(); brushes->on_brush_changed = [this](Node* target, int index) { auto tid = brushes->get_texture_id(index); @@ -217,6 +243,67 @@ void App::initLayout() on_stroke_change(); }; + if (auto* button = layout[main_id]->find("btn-stroke")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != stroke.get()) + { + panels->add_child(std::static_pointer_cast(stroke)); + current_panel = stroke.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-brush")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != brushes.get()) + { + panels->add_child(std::static_pointer_cast(brushes)); + current_panel = brushes.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-color")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != color.get()) + { + panels->add_child(std::static_pointer_cast(color)); + current_panel = color.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-layer")) + { + button->on_click = [this](Node*) { + panels->remove_all_children(); + if (current_panel != layers.get()) + { + panels->add_child(std::static_pointer_cast(layers)); + current_panel = layers.get(); + } + else + { + current_panel = nullptr; + } + }; + } + if (auto* button = layout[main_id]->find("btn-close")) { button->on_click = [](Node*) { exit(0); }; diff --git a/engine/app.h b/engine/app.h index 12e2cba..edb0956 100644 --- a/engine/app.h +++ b/engine/app.h @@ -20,10 +20,12 @@ public: NodePopupMenu* menu_edit = nullptr; NodePopupMenu* menu_layers = nullptr; NodeBorder* sidebar = nullptr; - NodePanelBrush* brushes; - NodePanelLayer* layers; - NodePanelColor* color; - NodePanelStroke* stroke; + std::shared_ptr brushes; + std::shared_ptr layers; + std::shared_ptr color; + std::shared_ptr stroke; + Node* current_panel = nullptr; + Node* panels; std::function on_brush_select; std::function on_color_change; std::function on_stroke_change; diff --git a/engine/layout.cpp b/engine/layout.cpp index 2e99d89..5ba5236 100644 --- a/engine/layout.cpp +++ b/engine/layout.cpp @@ -9,7 +9,7 @@ Plane NodeBorder::m_plane; Plane NodeImage::m_plane; Sampler NodeImage::m_sampler; std::map NodeIcon::m_icons; -ui::Shader NodeCanvas2D::m_shader; +ui::Shader NodeStrokePreview::m_shader; kEventResult Node::on_event(Event* e) { @@ -112,9 +112,23 @@ void Node::add_child(Node* n, int index) YGNodeInsertChild(y_node, n->y_node, index); } +void Node::add_child(std::shared_ptr n) +{ + m_children.push_back(n); + n->parent = this; + n->m_manager = m_manager; + YGNodeInsertChild(y_node, n->y_node, YGNodeGetChildCount(y_node)); +} +void Node::add_child(std::shared_ptr n, int index) +{ + m_children.push_back(n); + n->parent = this; + n->m_manager = m_manager; + YGNodeInsertChild(y_node, n->y_node, index); +} void Node::remove_child(Node* n) { - auto i = std::find_if(m_children.begin(), m_children.end(), [=](std::unique_ptr& ptr) { return ptr.get() == n; }); + auto i = std::find_if(m_children.begin(), m_children.end(), [=](auto& ptr) { return ptr.get() == n; }); if (i != m_children.end()) { YGNodeRemoveChild(y_node, n->y_node); @@ -122,6 +136,12 @@ void Node::remove_child(Node* n) } } +void Node::remove_all_children() +{ + for (auto& n : m_children) + YGNodeRemoveChild(y_node, n->y_node); + m_children.clear(); +} void Node::move_child(Node* n, int index) { YGNodeRemoveChild(y_node, n->y_node); @@ -443,7 +463,7 @@ void Node::load_internal(const tinyxml2::XMLElement* x_node) CASE(kWidget::PanelColor, NodePanelColor); CASE(kWidget::PanelStroke, NodePanelStroke); CASE(kWidget::ColorQuad, NodeColorQuad); - CASE(kWidget::Canvas2D, NodeCanvas2D); + CASE(kWidget::Canvas2D, NodeStrokePreview); #undef CASE case kWidget::Ref: { diff --git a/engine/layout.h b/engine/layout.h index dafc616..435c587 100644 --- a/engine/layout.h +++ b/engine/layout.h @@ -155,7 +155,7 @@ public: class LayoutManager* m_manager; uint16_t m_nodeID; std::string m_nodeID_s; - std::vector> m_children; + std::vector> m_children; Node* current_mouse_capture = nullptr; Node* current_key_capture = nullptr; bool m_mouse_captured = false; @@ -301,7 +301,10 @@ public: const Node* init_template(const char* id); void add_child(Node* n); void add_child(Node* n, int index); + void add_child(std::shared_ptr n); + void add_child(std::shared_ptr n, int index); void remove_child(Node* n); + void remove_all_children(); void move_child(Node* n, int index); void move_child_offset(Node* n, int offset); int get_child_index(Node* n); @@ -732,10 +735,10 @@ public: case kEventType::KeyDown: switch (ke->m_key) { - case VK_BACK: - m_string.erase(m_string.end() - 1); - m_text->set_text(m_string.c_str()); - break; +// case VK_BACK: +// m_string.erase(m_string.end() - 1); +// m_text->set_text(m_string.c_str()); +// break; default: break; } @@ -1655,7 +1658,7 @@ public: } }; -class NodeCanvas2D : public NodeBorder +class NodeStrokePreview : public NodeBorder { RTT m_rtt; Sampler m_sampler; @@ -1696,7 +1699,7 @@ public: "}"; m_shader.create(shader_v, shader_f); } - virtual Node* clone_instantiate() const override { return new NodeCanvas2D(); } + virtual Node* clone_instantiate() const override { return new NodeStrokePreview(); } virtual void clone_copy(Node* dest) const override { NodeBorder::clone_copy(dest); @@ -1707,7 +1710,7 @@ public: } virtual void clone_finalize(Node* dest) const override { - NodeCanvas2D* n = (NodeCanvas2D*)dest; + NodeStrokePreview* n = (NodeStrokePreview*)dest; n->init_controls(); } void init_controls() @@ -1798,7 +1801,7 @@ public: class NodePanelStroke : public Node { public: - NodeCanvas2D* m_canvas; + NodeStrokePreview* m_canvas; NodeSliderH* m_tip_size; NodeSliderH* m_tip_spacing; NodeSliderH* m_tip_flow; @@ -1821,26 +1824,26 @@ public: } void init_controls() { - m_canvas = find("canvas"); + m_canvas = find("canvas"); - init_slider(m_tip_size, "tip-size", &NodeCanvas2D::m_tip_size); - init_slider(m_tip_spacing, "tip-spacing", &NodeCanvas2D::m_tip_spacing); - init_slider(m_tip_flow, "tip-flow", &NodeCanvas2D::m_tip_flow); - init_slider(m_tip_angle, "tip-angle", &NodeCanvas2D::m_tip_angle); - init_slider(m_jitter_scale, "jitter-scale", &NodeCanvas2D::m_jitter_scale); - init_slider(m_jitter_angle, "jitter-angle", &NodeCanvas2D::m_jitter_angle); - init_slider(m_jitter_spread, "jitter-spread", &NodeCanvas2D::m_jitter_spread); - init_slider(m_jitter_flow, "jitter-flow", &NodeCanvas2D::m_jitter_flow); + init_slider(m_tip_size, "tip-size", &NodeStrokePreview::m_tip_size); + init_slider(m_tip_spacing, "tip-spacing", &NodeStrokePreview::m_tip_spacing); + init_slider(m_tip_flow, "tip-flow", &NodeStrokePreview::m_tip_flow); + init_slider(m_tip_angle, "tip-angle", &NodeStrokePreview::m_tip_angle); + init_slider(m_jitter_scale, "jitter-scale", &NodeStrokePreview::m_jitter_scale); + init_slider(m_jitter_angle, "jitter-angle", &NodeStrokePreview::m_jitter_angle); + init_slider(m_jitter_spread, "jitter-spread", &NodeStrokePreview::m_jitter_spread); + init_slider(m_jitter_flow, "jitter-flow", &NodeStrokePreview::m_jitter_flow); //m_canvas->draw_stroke(); } - void init_slider(NodeSliderH*& slider, const char* id, float NodeCanvas2D::* prop) + void init_slider(NodeSliderH*& slider, const char* id, float NodeStrokePreview::* prop) { slider = find(id); slider->on_value_changed = std::bind(&NodePanelStroke::handle_slide, this, prop, std::placeholders::_1, std::placeholders::_2); m_canvas->*prop = slider->m_value.x; } - void handle_slide(float NodeCanvas2D::* prop, Node* target, float value) + void handle_slide(float NodeStrokePreview::* prop, Node* target, float value) { m_canvas->*prop = value; m_canvas->draw_stroke();