From a9a5731d8600c144c434fb6a04c438f0b3e8f750 Mon Sep 17 00:00:00 2001 From: sfb Date: Wed, 6 Apr 2011 15:45:47 -0500 Subject: [PATCH] Added: Initial UI work for Zone Painter conversion. --- .../src/plugins/CMakeLists.txt | 3 +- .../src/plugins/zone_painter/CMakeLists.txt | 45 ++++ .../zone_painter/images/color-fill.png | Bin 0 -> 7786 bytes .../images/color-picker-black.png | Bin 0 -> 5579 bytes .../plugins/zone_painter/images/colorize.png | Bin 0 -> 6760 bytes .../zone_painter/images/draw-brush.png | Bin 0 -> 3749 bytes .../plugins/zone_painter/images/go-down-7.png | Bin 0 -> 3979 bytes .../plugins/zone_painter/images/go-jump-4.png | Bin 0 -> 2676 bytes .../plugins/zone_painter/images/lock-6.png | Bin 0 -> 4324 bytes .../zone_painter/images/lock-silver.png | Bin 0 -> 4992 bytes .../zone_painter/painter_dock_widget.cpp | 16 ++ .../zone_painter/painter_dock_widget.h | 22 ++ .../zone_painter/painter_dock_widget.ui | 58 ++++++ .../src/plugins/zone_painter/qnel_widget.cpp | 197 ++++++++++++++++++ .../src/plugins/zone_painter/qnel_widget.h | 130 ++++++++++++ .../src/plugins/zone_painter/zone_painter.qrc | 12 ++ .../zone_painter/zone_painter_main_window.cpp | 61 ++++++ .../zone_painter/zone_painter_main_window.h | 36 ++++ .../zone_painter/zone_painter_main_window.ui | 110 ++++++++++ .../zone_painter/zone_painter_plugin.cpp | 123 +++++++++++ .../zone_painter/zone_painter_plugin.h | 105 ++++++++++ .../zone_painter_settings_page.cpp | 67 ++++++ .../zone_painter/zone_painter_settings_page.h | 58 ++++++ .../zone_painter_settings_page.ui | 92 ++++++++ 24 files changed, 1134 insertions(+), 1 deletion(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/color-fill.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/color-picker-black.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/colorize.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/draw-brush.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-down-7.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-jump-4.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/lock-6.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/lock-silver.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.ui diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt index 4ac0fff11..d5a792acd 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt @@ -3,4 +3,5 @@ ADD_SUBDIRECTORY(example) ADD_SUBDIRECTORY(ovqt_sheet_builder) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(disp_sheet_id) -ADD_SUBDIRECTORY(object_viewer) \ No newline at end of file +ADD_SUBDIRECTORY(object_viewer) +ADD_SUBDIRECTORY(zone_painter) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/CMakeLists.txt new file mode 100644 index 000000000..8b473854e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/CMakeLists.txt @@ -0,0 +1,45 @@ +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +FILE(GLOB SRC *.cpp *.h) + +SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) + +SET(OVQT_PLUG_ZONE_PAINTER_HDR zone_painter_plugin.h + qnel_widget.h + zone_painter_settings_page.h + zone_painter_main_window.h + painter_dock_widget.h) + +SET(OVQT_PLUG_ZONE_PAINTER_UIS zone_painter_settings_page.ui zone_painter_main_window.ui painter_dock_widget.ui) + +SET(OVQT_PLUG_ZONE_PAINTER_RCS zone_painter.qrc) + +SET(QT_USE_QTGUI TRUE) +SET(QT_USE_QTOPENGL TRUE) + +QT4_WRAP_CPP(OVQT_PLUG_ZONE_PAINTER_MOC_SRC ${OVQT_PLUG_ZONE_PAINTER_HDR}) +QT4_ADD_RESOURCES( OVQT_PLUG_ZONE_PAINTER_RC_SRCS ${OVQT_PLUG_ZONE_PAINTER_RCS}) +QT4_WRAP_UI(OVQT_PLUG_ZONE_PAINTER_UI_HDRS ${OVQT_PLUG_ZONE_PAINTER_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUG_ZONE_PAINTER_UIS} ${OVQT_PLUG_ZONE_PAINTER_RCS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUG_ZONE_PAINTER_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_ZONE_PAINTER_MOC_SRC} ${OVQT_PLUG_ZONE_PAINTER_RC_SRCS}) +SOURCE_GROUP("Zone Painter Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +ADD_LIBRARY(ovqt_plugin_zone_painter MODULE ${SRC} ${OVQT_PLUG_ZONE_PAINTER_MOC_SRC} ${OVQT_PLUG_ZONE_PAINTER_RC_SRCS} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_ZONE_PAINTER_UI_HDRS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_zone_painter ovqt_plugin_core nelmisc nel3d ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY}) + +NL_DEFAULT_PROPS(ovqt_plugin_zone_painter "NeL, Tools, 3D: Object Viewer Qt Plugin: Zone Painter") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_zone_painter) +NL_ADD_LIB_SUFFIX(ovqt_plugin_zone_painter) + +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_zone_painter LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/color-fill.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/color-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..b18b56e14fdd968105e425b39a82bc649ca79aa7 GIT binary patch literal 7786 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/colorize.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/colorize.png new file mode 100644 index 0000000000000000000000000000000000000000..f48e18299dc5649ffc260c0dd98c01b6c5359aba GIT binary patch literal 6760 zcmai(Wl&pf*S4wPE+s&4DDK6zKya7hZow@Smm&p%JEah4p%k}bMS>K!K!HMVhvH6) z=H9vsBe+KxoVQ+U+z}Z51*-v_;WgHi?sv~W8x^8`OV6k{_+cgCi_>P- zM7o|4uP>*AVVKw3k3`4*mXh#1)hH?@O3;x~MY+gW(DaXwR!z-H$KqCAy3Eo3krPAI z)2vwgg7T@F{UykeROj*aeaB;ibKX63cHcICN80OWl}Zy9e-psFx8*zp^-GD;nS-Jf zeY8RLXb;wC69Ib~4V)ulKj$pbQQWcdv(@nRC#4Uo9OaNH3vKG#m#4!bP`l1uS9WHT z(5+{+J}WMwKI5V68V7;Nh@^*VroW-nAA^t=<%83HPfkLY^Bah#|DHe zOD>};fu}JR`~52?f0IW8`chWcc#rMJ-|Vbjo8{6iUk{B=RA9DoY9X$iAq8Vu{RSU1 z_s$VP3TP)2;C?o|ZLzD>&*#IWrl?PRUVZwDAGKO5#zQ~9F%F=I;z_KWUYsLB6r#G2 zNem{xwmmz{9$=H3E;YVv^J>X56irkpCJ{brkFZ-k8Q-IoAT$D04WyL!*S#4#$|H^x z(7wWZn0B?^qXzFk3tI|Yp7xp6u<(3XaX}+^xTHm(y0R%Kcsq;uz8!8{pQ=INnI-Ce zm(zf@u_N>Pn39~jkaK$kh4a*(r4_ds z>GDQD?^y}Lhu+(EE@uC;cmT1Xi!KtByLh{byOTVjR6j|mk?CU(N&sCdPeEWjRjwIDM3ftNy%pks z4jvaxrPNtYc=gi>C~Tl^+d7pwC}iNW{JUvwg<`Se58;R@?}+eDL2NGWz{7X*0~V;1VQ~M`KDGP|L_HROElE z7q}lQ1)!XS3lhJ&OI{StqV$5gMq$VOeKb|L8>X2EIBoF?jv2HR#>l}tOseyw5V3Ad zTuZ*-W}7R-oREUF*}ww$c`<8q6)Li5Uz0H6fHy*$SE&(VE@=iDLk%=@kcZgP%IU9k zGC#{^rSrHGB)@xa^Ye6w1^)EClL_j&5P1+oD26}Z3K5s_Dk@!t(E}nzYJg>uM1-tQ z5mn=jFkuIGf?q1yc0{a1O3KaQPE{n$98qu`#B&gS*sf@2q=Q6h2KxlSS#>T}&pT9q_Zw z%b?^4kCE!9bgZ1+xtD8*&JE^_ZT<#B_zfa*H^iW|Clm_N2@Q(~Qv4cjZukN%J%es-PZqh~Oq& zOKCxEYHvXM9~T)KG$r@8@LG7e8k2-&$^8!xPFM@=j=*lxf=}xi(N?&mp*|jOg}0L(>}FY)=Yd9b~Pi4zh(eN*6)YojD>w5<$hRtchz{eT6{eu)$wLhkc0 zi15d;(JcxTr^cEEq|8h{g&SbIV0!Y%)`o1{GL%XZ>zJZnV(5rFH%e%Q9Yof|$%Kuh z0(PD#d4$o;Fh_=dz1W{0f1oPF@XDevQur-45|!Nt&{%qD2V(oI!}#TP)pO=zZs7vJ z`oVYf>^=r+xQ*rOX8$lqX;QEDPQHOfLf7Ho2Mq6sidBX`!IJB1PS-R$**M?#w+Wh6 z{qix*e0ob`ndv2`f`aM<#Zox=495!oHlCWEh&9*6*p1~9)2bP8@QR1|#Y1O^HCq1N zWLs>JXQ`y%U64fz%APn=YnC@p8PC$p!tQI!Xrig_1P#?%>CE>pBl;we#Nm2Vu=b3V zYXan+k65Lrm)!)y32MaHTC!#Kl5;7GdxZhR9>jk!l;zDfj+rSA78xo!3-EQ%m0iaf zDKT93gMCz)pq> z9|=3n9VhGx?+ga&)a3HwCx!~7^WJ}D@mSvj=k3(!#kcNrJ6PG#F^&9)-u--rcMt*wbkz*ScSv^U<>CZ&^B$`! zvPRpmKGKqCvH6y$a++cUTPkhur{DcqnwySF80igjxw%__Cdn~{ttmEOYOi(iFUR|Z zg(LC5eHFYbZeeT9w8+sXe?pHEB~N>LoX7K}L@=+{k2z>E904*gPzew$d;&8TB{UbpoFIut(eFlTy|Z(;0oKKLqAAM5_sa=u3>yFf`e{kkNS z1!bxV#?+Cn)|#plTAZpr{nS|5z**T~unUq>w?r_y;273E<+L89fz#HE5qPI(4~WOq zt2lqJ&m}>BH|fHze=|$t)_>Y>F^=3MFyMR$sUDlq!|-X6M^$%= zeHR6B8++#bAtW@m1TR*CH~UTJwV`Fm_V2fb>XpGqSw-wV1UqKsr zGnr|Dj=+Vc({=pW`{8EPPT0d=mx-{)_np&JnL7o80$AH;LD4(xEzF#^Ea09QZgF~m z@!jC$?<=fyW{sJda4##aUJORHZY&R;#Ix=?noU=nccvoJ_heN%;;*&u!Npn{d0!3v zxi|C-(?@o4a;1`tTeBrc@HR;hz_KaVXfA!~rRp9Q@@ymZJgXl>Q)TH;^11bKuluAP zv(8&G9 z>!Kc#&BHBi-gqy#i{{AXTcYSE{7pRjZ4xOHZG(PCuY|6u9Jg}%ogLo4$_@t$Io70choB*65{4;6k2W}*~cfpa=;oDI?8 z5w>3(101h)k0jf(0|!o0)wuNJmFi|l1~9%s&dj|$G3meOj18rjqqufOp<4F4Ber&#zb4r}V(ZV%U zr?xlBnxMMUFn|_OxVTz!ab%QW3%IXTL+{9sLp(lGpGl!6^0zgb>cc?jQB0sT+-YK1UYig^!m6`dJMchKthOf)Vt2ka1L8y z27Qu=7by1eW=sl^lZPxI>j((JVVQI-&WcuB$$Po#fu`<&$~xvc1}Jsm^DU>08Fu6K zCc9wYK+>K$uj1*W>AuCl4qukJjBg+(ebmIpqOn*d;Rhk?8Rpy$K(X*Pvc7+#w%n9kuVTXLS-7j1%6noEkDRHdYhE%3p;Thj9WwahKFD0r zS6vSgqCOZ!WH80|&suxkd53%KTw9B^O{eU6-g=U2~c;|K#))ju%ED6;GvApir7c zc40HfPW574z)@DrxCX13fjIr~A%g6gw}VB2*w;m^y*_I;14&t!8e}sLoeN};(Jf`?+*}Kuysi8HIdq$Iy-58G?K$)xU_`){#g{vPrsc>u$ zt&S_d@LT3&@jkQ2yee(%7ge6rwz?uBItfA;#Im;`SDE?;(-j(fjRY#|Sdtn%8+!Wq zu5B?_QVk`i!5YF7c2D2O4(?mlONEVea90};UQb$@MdhK;Y5y(){kO-%^{wAnbfMxhe&u z3z07svrbfFQhmHMaK|xbB7B+AS|n11#5FCeHnT)zz4mx=#@P86`8su9W%A5Nb+jCt zcLYy^Er~A@XH6yxNT>z0Ph_+ax82BhsLY^_hl9G~yX=Y$zHb|xgKt~RJnPvg%{e2! zL@(&GEC^m@mgt0bLFdW?HdpUZ*K2hMDY{l+K+r(8kr*85e^bcUA)L+|+o-LP`Qu1w4V`UD-@0aL%Ua4%V0icXeA%w+Kd$p#svk^jBwEz+&{`_O@LTnuLZ`XLT ztEt#z`DvE{`@_?%5&Tyyz+69x9RmgEn|zMAG;3CWmw`P&_}A+Ez=9aS^C*mbv5pUS zt3x@*(!QnFtho5w?wvI;m_GTiGAY5%hMTqS@W~X?&xcLKeX9y3pADI`X@X(oVledm zD5SGZE`wbPtu2U!&?uv1;(_W`T=+%sEsrtVW^5pFs3Jd~E{o-8>gfxUk^b zd82(IPfwOyxql%4PgH=^j%oL)eiKwBKY6;x=thcs9IF>Vj z+ks>zZqHr$==X=#QO5gs?>gy1bAp8_+h*O&n#73^*Gs)#IFCtTDAY8P;Pp;zTAvZ2 zi!8hBHBRxHz`?rQo<6Y{=;RV5Ev=oSPc5&5ez}mcP@f4phdTA8L$Y&`MjL5suMsDs zrqjz%B4w77mnTxEQtu6b?l~0lyy}i`ne?ifTh%hR*Vk2dx^lLD16cv1e&l=Z1ht2v zm#W7I%(lt~(fjH8k!B4y3CLWB6zNN#l8>D1=yS!V`qo4xFEoVXKmSED8v%6ChcCo@VmQEwXK_!{OPDL5R?jwC!O^|h!GQOZ3LM- ztt$Qk!Y^$QgjJ7-r&E|7zW4pSRL@$W@#nzi7mc}7%M1E#u`!p1Rlf%Xo}2wPamy8H z>D!s^2o$2bJz0ZV6+9tZ-Z^L#1?LWJy>$`d= zap)B4Bw1?GZ%pPjSdy#S7ymMls4)hJFnc|t2jmT;h~EeK*eW4KkS9+yfU8iZ=q+-5 z%R-aYInIHYxSpH@i{!0F(kh`OQ9)$y*SQ~B-NvNBKydrT6myoSdciTejJR(k6*Y^n zj|6{=roKD;GN=M|bdm?}T=t2FMQN_2Y_=@PQBchw27zlHw(X8g8q^RE@cl!>z0LB0K`e|~m9CV7Xm5Q$6yVKc6xFN>!fiEXIcsQh@I zZq(JH&hmF2^{~8th&tn5I3Q*HDC2Z512L_^F*G?D`s05(O9$1$T1u#C@%JgsJ0*Mk zsG|O=fPGk!e=0Zj7+V!hwuTawx1Gn7M3N>gLLUL}*B!(>sxnkxgnN`PwqGv4;-y1F z`$OmJ!#EF13Sd#0?|6IlE3!{c@lP{%;u;{dW|%^4(l3a{ar&I1;3!Zg12oZLLdVHh z?Zqm6a+^&3w_eMvm*zIxLKJ7pVO zoc08Z8csP&0VNDlAgJu3b-7f6<-Vc(KEo_icep$1xa|0ONBQE}Qg#xq1<|{lH&_|W zU}xvnUjl?8CROjZ_Vye_R29#!+j+>&9E+9LLtz9l%`7^%)gCaleeXK-m${Rl-xAnP zs%L&RYuqM!2TULh+KlW(Z7Tr?Mo*DH=SK+9zH|n>`yTeTxMJD&b^d|RMvUS9B-C5irCqnD8*bk@we;3)qv?G>uJ){5IUeF#g^Ui^xBT!%XS5pIqAoXXn*n zTXUj)x)K2@56#GQ?!l?{w}0an%-E!nP{j1~Vaqwh-QC)lyJ|-5bKRV42mO0ps2NYp z@%1V_!BqJ-0)3Rx0YZEW_J&Gkzqzzg_3T2f$Qwmk?JbWmj^>K?B&&DN zvGEX=Q*okP?{-u%-G;fHRUTi0;A)w|%{*|fCk2rgOBDn&D0$VYf7WLnv^$B!%iq}u zpf&OE89zU{LpwyL5G>htk-Qn*J*E|<4v}Xj$lm9L-plOg7H)Krtd_NV#M#<6SDCH; zu*r{)54bGX?OrkGabUqzeed1!VTAnL7&h{p<3y^#;J37n$$sqm2X_h`58s1H=OVE- zBvR%TUD#gC)bgJg@0mAkS74J}wdY-PZbYR|IWURV-q!08lrCl;C`@-1+^d(itctrI=HkRH5Ut~!G#@4tnDQkTM^u8!_-kH`1C;IUKvok9x6A6POKl+O z)#Klamp%$cKDOTW);{*!c8?8BfR9g%n_qyNPgI{@KwMBnT!4?8Peh!L?>D&m`oF+G zPVxUxj{yIpgP)t9U!PA@T!>GcpZ`BVk}k*Q{|C5v*f}`_{Owhc|UUemHbzT7;eqM?028#bq{Lire zV^7U9$gxL&{GW+>9&f#E?a}1D10X)uuJqd89?tf*KKmP+@sAGH|L3rLqpSYkSoXg5 h-qx;m9z2h^9y9(+@)oD2n?53FDhisQYB{Tj{{i3u7}Ed% literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/draw-brush.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/draw-brush.png new file mode 100644 index 0000000000000000000000000000000000000000..e214eb770b4cca50170bb6234ff3d25c3a246382 GIT binary patch literal 3749 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 SFOwJ`1+X-;y;5!Blki`KDfYbp literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-down-7.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-down-7.png new file mode 100644 index 0000000000000000000000000000000000000000..566be207dc564fecae79b05ef981a9902dbd9b62 GIT binary patch literal 3979 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 G5&r=Wh-O*< literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-jump-4.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/images/go-jump-4.png new file mode 100644 index 0000000000000000000000000000000000000000..d5aaa93bb48b6cf7791dd5aa2f0362885b3ac346 GIT binary patch literal 2676 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 NmYS~WC%EN{{{k*kVe|k1 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.cpp new file mode 100644 index 000000000..66315aaf7 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.cpp @@ -0,0 +1,16 @@ +#include "painter_dock_widget.h" +#include "ui_painter_dock_widget.h" + +#include "qnel_widget.h" + +PainterDockWidget::PainterDockWidget(QWidget *parent) : + QDockWidget(parent), + ui(new Ui::PainterDockWidget) +{ + ui->setupUi(this); +} + +PainterDockWidget::~PainterDockWidget() +{ + delete ui; +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.h new file mode 100644 index 000000000..27a777d75 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.h @@ -0,0 +1,22 @@ +#ifndef PAINTER_DOCK_WIDGET_H +#define PAINTER_DOCK_WIDGET_H + +#include + +namespace Ui { + class PainterDockWidget; +} + +class PainterDockWidget : public QDockWidget +{ + Q_OBJECT + +public: + explicit PainterDockWidget(QWidget *parent = 0); + ~PainterDockWidget(); + +private: + Ui::PainterDockWidget *ui; +}; + +#endif // PAINTER_DOCK_WIDGET_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.ui new file mode 100644 index 000000000..24c3d048a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/painter_dock_widget.ui @@ -0,0 +1,58 @@ + + + PainterDockWidget + + + + 0 + 0 + 304 + 510 + + + + + 300 + 80 + + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + Painter Modes + + + + + + 0 + 0 + 300 + 480 + + + + 0 + + + + Paint Tiles + + + + + Paint Colors + + + + + Paint Displacement + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.cpp new file mode 100644 index 000000000..9a67abb80 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.cpp @@ -0,0 +1,197 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "qnel_widget.h" + +// STL includes + +// Qt includes +#include +#include + +// NeL includes +#include +#include +#include +#include + +namespace NLQT +{ + +QNLWidget::QNLWidget(QWidget *parent) + : QNeLWidget(parent), + m_driver(NULL), + m_initialized(false), + m_interval(25) +{ + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); + + init(); +#ifdef Q_OS_LINUX + makeCurrent(); +#endif + m_mainTimer = new QTimer(this); + connect(m_mainTimer, SIGNAL(timeout()), this, SLOT(updateRender())); +} + +QNLWidget::~QNLWidget() +{ + release(); +} + +void QNLWidget::init() +{ + // create the driver + m_driver = NL3D::UDriver::createDriver(NULL, false, NULL); + nlassert(m_driver); + + // initialize the nel 3d viewport + m_driver->setDisplay((nlWindow)winId(), NL3D::UDriver::CMode(width(), height(), 32)); + + // set the cache size for the font manager(in bytes) + m_driver->setFontManagerMaxMemory(2097152); + + m_initialized = true; +} + +void QNLWidget::release() +{ + m_mainTimer->stop(); + delete m_mainTimer; + if (m_initialized) + { + m_driver->release(); + delete m_driver; + m_driver = NULL; + } +} + +void QNLWidget::setInterval(int msec) +{ + m_interval = msec; + m_mainTimer->setInterval(msec); +} + +void QNLWidget::setBackgroundColor(NLMISC::CRGBA backgroundColor) +{ + m_backgroundColor = backgroundColor; +} + +void QNLWidget::updateRender() +{ + if (isVisible()) + { + if (m_initialized) + m_driver->EventServer.pump(); + Q_EMIT updateData(); + + // Calc FPS + static sint64 lastTime = NLMISC::CTime::getPerformanceTime (); + sint64 newTime = NLMISC::CTime::getPerformanceTime (); + m_fps = float(1.0 / NLMISC::CTime::ticksToSecond (newTime-lastTime)); + lastTime = newTime; + + if (m_initialized && !m_driver->isLost()) + { + //_driver->activate(); + m_driver->clearBuffers(m_backgroundColor); + Q_EMIT updatePreRender(); + + Q_EMIT updatePostRender(); + // swap 3d buffers + m_driver->swapBuffers(); + } + } +} + +void QNLWidget::showEvent(QShowEvent *showEvent) +{ + QWidget::showEvent(showEvent); + m_driver->activate(); + m_mainTimer->start(m_interval); +} + +void QNLWidget::hideEvent(QHideEvent *hideEvent) +{ + m_mainTimer->stop(); + QWidget::hideEvent(hideEvent); +} + +#if defined(NL_OS_WINDOWS) + +typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + +bool QNLWidget::winEvent(MSG *message, long *result) +{ + if (m_driver && m_driver->isActive()) + { + NL3D::IDriver *driver = dynamic_cast(m_driver)->getDriver(); + if (driver) + { + winProc proc = (winProc)driver->getWindowProc(); + return proc(driver, message->hwnd, message->message, message->wParam, message->lParam); + } + } + + return false; +} + +#elif defined(NL_OS_MAC) + +typedef bool (*cocoaProc)(NL3D::IDriver *, const void *e); + +bool QNLWidget::macEvent(EventHandlerCallRef caller, EventRef event) +{ + if(caller) + nlerror("You are using QtCarbon! Only QtCocoa supported, please upgrade Qt"); + + if (m_driver && m_driver->isActive()) + { + NL3D::IDriver *driver = dynamic_cast(m_driver)->getDriver(); + if (driver) + { + cocoaProc proc = (cocoaProc)driver->getWindowProc(); + return proc(driver, event); + } + } + + return false; +} + +#elif defined(NL_OS_UNIX) + +typedef bool (*x11Proc)(NL3D::IDriver *drv, XEvent *e); + +bool QNLWidget::x11Event(XEvent *event) +{ + if (m_driver && m_driver->isActive()) + { + NL3D::IDriver *driver = dynamic_cast(m_driver)->getDriver(); + if (driver) + { + x11Proc proc = (x11Proc)driver->getWindowProc(); + return proc(driver, event); + } + } + + return false; +} +#endif + +} /* namespace NLQT */ + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.h new file mode 100644 index 000000000..a54e6bb8a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/qnel_widget.h @@ -0,0 +1,130 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef QNEL_WIDGET_H +#define QNEL_WIDGET_H + +// NeL includes +#include +#include +#include + +// Qt includes +#include +#include + +class QAction; + +/* TODO every platform should use QWidget */ +#if defined(NL_OS_WINDOWS) +typedef QWidget QNeLWidget; +#elif defined(NL_OS_MAC) +typedef QWidget QNeLWidget; +#elif defined(NL_OS_UNIX) +typedef QGLWidget QNeLWidget; +#endif // NL_OS_UNIX + +namespace NL3D +{ +class UDriver; +class UScene; +} + +namespace NLQT +{ + +/** +@class QNLWidget +@brief Responsible for interaction between Qt and NeL. +@details Automatically begins to update the render if the widget is visible +or suspends the updating of render if the widget is hidden. +*/ +class QNLWidget : public QNeLWidget +{ + Q_OBJECT + +public: + QNLWidget(QWidget *parent); + virtual ~QNLWidget(); + + /// Set the update interval renderer + void setInterval(int msec); + + /// Set the background color. + void setBackgroundColor(NLMISC::CRGBA backgroundColor); + + float fps() const + { + return m_fps; + } + + inline NLMISC::CRGBA backgroundColor() const + { + return m_backgroundColor; + } + + NL3D::UDriver *driver() const + { + return m_driver; + } + + virtual QPaintEngine* paintEngine() const + { + return NULL; + } +Q_SIGNALS: + void updateData(); + void updatePreRender(); + void updatePostRender(); + +private Q_SLOTS: + void updateRender(); + +protected: + virtual void showEvent(QShowEvent *showEvent); + virtual void hideEvent(QHideEvent *hideEvent); + +#if defined(NL_OS_WINDOWS) + virtual bool winEvent(MSG *message, long *result); +#elif defined(NL_OS_MAC) + virtual bool macEvent(EventHandlerCallRef caller, EventRef event); +#elif defined(NL_OS_UNIX) + virtual bool x11Event(XEvent *event); +#endif + +private: + void init(); + void release(); + + QNLWidget(const QNLWidget &); + QNLWidget &operator=(const QNLWidget &); + + NL3D::UDriver *m_driver; + NLMISC::CRGBA m_backgroundColor; + + QTimer *m_mainTimer; + + bool m_initialized; + int m_interval; + float m_fps; + +}; /* class QNLWidget */ + +} /* namespace NLQT */ + + +#endif // QNEL_WIDGET_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter.qrc new file mode 100644 index 000000000..55c890670 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter.qrc @@ -0,0 +1,12 @@ + + + images/color-picker-black.png + images/colorize.png + images/draw-brush.png + images/go-down-7.png + images/go-jump-4.png + images/lock-6.png + images/lock-silver.png + images/color-fill.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp new file mode 100644 index 000000000..c187e2ddc --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp @@ -0,0 +1,61 @@ +#include "zone_painter_main_window.h" +#include "ui_zone_painter_main_window.h" + +#include "qnel_widget.h" +#include "painter_dock_widget.h" + +ZonePainterMainWindow::ZonePainterMainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::ZonePainterMainWindow) +{ + ui->setupUi(this); + m_nelWidget = new NLQT::QNLWidget(this); + setCentralWidget(m_nelWidget); + + // Set up dock widget(s) and toolbar. + m_painterDockWidget = new PainterDockWidget(this); + addDockWidget(Qt::RightDockWidgetArea, m_painterDockWidget); + m_painterDockWidget->setVisible(true); + + // Insert tool modes + _toolModeMenu = new QMenu(tr("Tool Mode"), ui->painterToolBar); + _toolModeMenu->setIcon(QIcon(":/painterTools/images/draw-brush.png")); + ui->painterToolBar->addAction(_toolModeMenu->menuAction()); + //connect(_renderModeMenu->menuAction(), SIGNAL(triggered()), this, SLOT(setRenderMode())); + + //QSignalMapper *modeMapper = new QSignalMapper(this); + + _toolPaintModeAction = _toolModeMenu->addAction(tr("Paint Mode")); + _toolPaintModeAction->setIcon(QIcon(":/painterTools/images/draw-brush.png")); + _toolPaintModeAction->setStatusTip(tr("Set paint mode")); + //connect(_pointRenderModeAction, SIGNAL(triggered()), modeMapper, SLOT(map())); + //modeMapper->setMapping(_pointRenderModeAction, 0); + + _toolFillModeAction = _toolModeMenu->addAction(tr("Fill Mode")); + _toolFillModeAction->setStatusTip(tr("Set fill mode")); + _toolFillModeAction->setIcon(QIcon(":/painterTools/images/color-fill.png")); + //connect(_lineRenderModeAction, SIGNAL(triggered()), modeMapper, SLOT(map())); + //modeMapper->setMapping(_lineRenderModeAction, 1); + + _toolSelectModeAction = _toolModeMenu->addAction(tr("Select mode")); + _toolSelectModeAction->setIcon(QIcon(":/painterTools/images/go-jump-4.png")); + _toolSelectModeAction->setStatusTip(tr("Set select mode")); + //connect(_fillRenderModeAction, SIGNAL(triggered()), modeMapper, SLOT(map())); + //modeMapper->setMapping(_fillRenderModeAction, 2); + + _toolPickModeAction = _toolModeMenu->addAction(tr("Pick mode")); + _toolPickModeAction->setIcon(QIcon(":/painterTools/images/color-picker-black.png")); + _toolPickModeAction->setStatusTip(tr("Set color picking mode")); + //connect(_fillRenderModeAction, SIGNAL(triggered()), modeMapper, SLOT(map())); + //modeMapper->setMapping(_fillRenderModeAction, 2); + + //connect(modeMapper, SIGNAL(mapped(int)), this, SLOT(setRenderMode(int))); + +} + +ZonePainterMainWindow::~ZonePainterMainWindow() +{ + delete ui; + delete m_nelWidget; + delete m_painterDockWidget; +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h new file mode 100644 index 000000000..d4d1584ba --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h @@ -0,0 +1,36 @@ +#ifndef ZONE_PAINTER_MAIN_WINDOW_H +#define ZONE_PAINTER_MAIN_WINDOW_H + +#include + +namespace NLQT { + class QNLWidget; +} + +namespace Ui { + class ZonePainterMainWindow; +} + +class PainterDockWidget; + +class ZonePainterMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit ZonePainterMainWindow(QWidget *parent = 0); + ~ZonePainterMainWindow(); + +private: + Ui::ZonePainterMainWindow *ui; + NLQT::QNLWidget *m_nelWidget; + PainterDockWidget *m_painterDockWidget; + + QAction *_toolPaintModeAction; + QAction *_toolFillModeAction; + QAction *_toolSelectModeAction; + QAction *_toolPickModeAction; + QMenu *_toolModeMenu; +}; + +#endif // ZONE_PAINTER_MAIN_WINDOW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.ui new file mode 100644 index 000000000..56360a7a2 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.ui @@ -0,0 +1,110 @@ + + + ZonePainterMainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + 0 + 0 + 800 + 21 + + + + + + + toolBar + + + false + + + TopToolBarArea + + + false + + + + + + + + + toolBar_2 + + + LeftToolBarArea + + + false + + + + + + :/painterTools/images/colorize.png:/painterTools/images/colorize.png + + + Background + + + Background Color Dialog + + + + + + :/painterTools/images/go-down-7.png:/painterTools/images/go-down-7.png + + + ShowArrows + + + Show Landscape Orientation Arrows + + + + + Toggle Lighting + + + Toggle automatic lighting + + + + + true + + + + :/painterTools/images/lock-silver.png + :/painterTools/images/lock-6.png:/painterTools/images/lock-silver.png + + + Lock Borders + + + Lock Landscape Borders + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp new file mode 100644 index 000000000..7b8237ccb --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp @@ -0,0 +1,123 @@ +// Project includes +#include "zone_painter_plugin.h" +#include "zone_painter_settings_page.h" +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/imenu_manager.h" +#include "../../extension_system/iplugin_spec.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include +#include +#include +#include +#include +#include + +namespace Plugin +{ +ZonePainterPlugin::~ZonePainterPlugin() +{ + Q_FOREACH(QObject *obj, _autoReleaseObjects) + { + _plugMan->removeObject(obj); + } + qDeleteAll(_autoReleaseObjects); + _autoReleaseObjects.clear(); +} + +bool ZonePainterPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + _plugMan = pluginManager; + + addAutoReleasedObject(new CZonePainterSettingsPage(this)); + addAutoReleasedObject(new CZonePainterContext(this)); + //addAutoReleasedObject(new CCoreListener(this)); + return true; +} + +void ZonePainterPlugin::extensionsInitialized() +{ + Core::ICore *core = Core::ICore::instance(); + Core::IMenuManager *menuManager = core->menuManager(); + //menuManager = _plugMan->getObject(); + QAction *exampleAction1 = new QAction("Zone1", this); + QAction *exampleAction2 = new QAction("Zone2", this); + QAction *aboutQtAction = menuManager->action(Core::Constants::ABOUT_QT); + QMenu *helpMenu = menuManager->menu(Core::Constants::M_HELP); + helpMenu->insertAction(aboutQtAction, exampleAction1); + helpMenu->addSeparator(); + helpMenu->addAction(exampleAction2); + QMenu *zoneMenu = menuManager->menuBar()->addMenu("ZoneMenu"); + zoneMenu->insertAction(aboutQtAction, exampleAction1); + zoneMenu->addSeparator(); + zoneMenu->addAction(exampleAction2); +} + +void ZonePainterPlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + _LibContext = new NLMISC::CLibraryContext(*nelContext); +} + +QString ZonePainterPlugin::name() const +{ + return "ZonePainterPlugin"; +} + +QString ZonePainterPlugin::version() const +{ + return "0.2"; +} + +QString ZonePainterPlugin::vendor() const +{ + return "Ryzom Core"; +} + +QString ZonePainterPlugin::description() const +{ + return "Zone Painter Plugin"; +} + +QStringList ZonePainterPlugin::dependencies() const +{ + QStringList list; + list.append(Core::Constants::OVQT_CORE_PLUGIN); + //list.append("ObjectViewer"); + return list; +} + +void ZonePainterPlugin::addAutoReleasedObject(QObject *obj) +{ + _plugMan->addObject(obj); + _autoReleaseObjects.prepend(obj); +} + +QObject* ZonePainterPlugin::objectByName(const QString &name) const +{ + Q_FOREACH (QObject *qobj, _plugMan->allObjects()) + if (qobj->objectName() == name) + return qobj; + return 0; +} + +ExtensionSystem::IPluginSpec *ZonePainterPlugin::pluginByName(const QString &name) const +{ + Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins()) + if (spec->name() == name) + return spec; + return 0; +} + +} + +Q_EXPORT_PLUGIN(Plugin::ZonePainterPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h new file mode 100644 index 000000000..7cb6b9c43 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h @@ -0,0 +1,105 @@ +#ifndef ZONE_PAINTER_PLUGIN_H +#define ZONE_PAINTER_PLUGIN_H + +// Project includes +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" +#include "zone_painter_main_window.h" + +// NeL includes +#include "nel/misc/app_context.h" +#include +#include +#include + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace Plugin +{ + + class CZoneManager { + public: + NL3D::CZone zone; + + std::string getZoneInfo() { + NL3D::CZone zone; + zone.getNumPatchs(); + + return ""; + } + }; + +class ZonePainterPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + + virtual ~ZonePainterPlugin(); + + bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); + void extensionsInitialized(); + + void setNelContext(NLMISC::INelContext *nelContext); + + QString name() const; + QString version() const; + QString vendor() const; + QString description() const; + QStringList dependencies() const; + + void addAutoReleasedObject(QObject *obj); + + QObject *objectByName(const QString &name) const; + ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const; + + + +protected: + NLMISC::CLibraryContext *_LibContext; + +private: + ExtensionSystem::IPluginManager *_plugMan; + QList _autoReleaseObjects; +}; + +class CZonePainterContext: public Core::IContext +{ + Q_OBJECT +public: + CZonePainterContext(QObject *parent = 0): IContext(parent) {} + virtual ~CZonePainterContext() {} + + virtual QString id() const + { + return QLatin1String("ZonePainterContext"); + } + virtual QString trName() const + { + return tr("Zone Painter"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget() + { + return new ZonePainterMainWindow(); + } +}; + +} // namespace Plugin + +#endif // ZONE_PAINTER_PLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp new file mode 100644 index 000000000..69c4e7525 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp @@ -0,0 +1,67 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "zone_painter_settings_page.h" + +// Qt includes +#include + +// NeL includes + +// Project includes + +namespace Plugin +{ + +CZonePainterSettingsPage::CZonePainterSettingsPage(QObject *parent) + : IOptionsPage(parent), + _currentPage(NULL) +{ +} + +QString CZonePainterSettingsPage::id() const +{ + return QLatin1String("ZonePainterPage"); +} + +QString CZonePainterSettingsPage::trName() const +{ + return tr("Zone Painter page"); +} + +QString CZonePainterSettingsPage::category() const +{ + return QLatin1String("General"); +} + +QString CZonePainterSettingsPage::trCategory() const +{ + return tr("General"); +} + +QWidget *CZonePainterSettingsPage::createPage(QWidget *parent) +{ + _currentPage = new QWidget(parent); + _ui.setupUi(_currentPage); + return _currentPage; +} + +void CZonePainterSettingsPage::apply() +{ +} + +} /* namespace Plugin */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h new file mode 100644 index 000000000..8e4b3f3d6 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h @@ -0,0 +1,58 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +#ifndef ZONE_PAINTER_SETTINGS_PAGE_H +#define ZONE_PAINTER_SETTINGS_PAGE_H + +#include + +#include "../core/ioptions_page.h" + +#include "ui_zone_painter_settings_page.h" + +class QWidget; + +namespace Plugin +{ +/** +@class CZonePainterSettingsPage +*/ +class CZonePainterSettingsPage : public Core::IOptionsPage +{ + Q_OBJECT +public: + CZonePainterSettingsPage(QObject *parent = 0); + virtual ~CZonePainterSettingsPage() {} + + virtual QString id() const; + virtual QString trName() const; + virtual QString category() const; + virtual QString trCategory() const; + virtual QWidget *createPage(QWidget *parent); + + virtual void apply(); + virtual void finish() {} + +private: + QWidget *_currentPage; + Ui::CZonePainterSettingsPage _ui; +}; + +} // namespace Plugin + +#endif // EXAMPLE_SETTINGS_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.ui new file mode 100644 index 000000000..ccd302975 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.ui @@ -0,0 +1,92 @@ + + + CZonePainterSettingsPage + + + + 0 + 0 + 458 + 479 + + + + Form + + + + 0 + + + + + GroupBox + + + + + + PushButton + + + + + + + + + + PushButton + + + + + + + RadioButton + + + + + + + RadioButton + + + + + + + CheckBox + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + + + + +