[email protected] 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. /******************************************************************************/
  4. PanelEditor PanelEdit;
  5. /******************************************************************************/
  6. /******************************************************************************/
  7. void PanelEditor::Change::create(ptr user)
  8. {
  9. data=PanelEdit.edit;
  10. PanelEdit.undoVis();
  11. }
  12. void PanelEditor::Change::apply(ptr user)
  13. {
  14. PanelEdit.edit.undo(data);
  15. PanelEdit.setChanged();
  16. PanelEdit.toGui();
  17. PanelEdit.undoVis();
  18. }
  19. GuiObj* PanelEditor::GuiPanel::test(C GuiPC &gpc, C Vec2 &pos, GuiObj* &mouse_wheel){return null;}
  20. void PanelEditor::GuiPanel::draw(C GuiPC &gpc)
  21. {
  22. if(visible() && gpc.visible)
  23. {
  24. GuiPC gpc2=gpc;
  25. MAX(gpc2.clip.min.x, clip_x+parent()->screenPos().x);
  26. D.clip(gpc2.clip);
  27. Rect r=rect()+gpc.offset;
  28. if(PanelEdit.game)
  29. {
  30. PanelEdit.game->draw(r);
  31. if(PanelEdit.show_lines()){PanelEdit.game->drawLines(RED, r); r.draw(BLACK, false);}
  32. }
  33. }
  34. }
  35. void PanelEditor::undoVis() {SetUndo(undos, undo, redo);}
  36. void PanelEditor::PreChanged(C Property &prop) {PanelEdit.undos.set(&prop);}
  37. void PanelEditor::Changed(C Property &prop) {PanelEdit.setChanged();}
  38. void PanelEditor::ParamsCenterStretch(EditPanel &e, C Str &t) {e.center_stretch=TextBool(t); e.center_stretch_time.getUTC();}
  39. void PanelEditor::ParamsSideStretch(EditPanel &e, C Str &t) {e. side_stretch=TextBool(t); e. side_stretch_time.getUTC();}
  40. void PanelEditor::ParamsCenterColor(EditPanel &e, C Str &t) {e.center_color=TextVec4(t); e.center_color_time.getUTC();}
  41. void PanelEditor::ParamsBorderColor(EditPanel &e, C Str &t) {e.border_color=TextVec4(t); e.border_color_time.getUTC();}
  42. void PanelEditor::ParamsSideColor(EditPanel &e, C Str &t) {e. side_color=TextVec4(t); e. side_color_time.getUTC();}
  43. void PanelEditor::ParamsBlurColor(EditPanel &e, C Str &t) {e. blur_color=TextVec4(t); e. blur_color_time.getUTC();}
  44. void PanelEditor::ParamsShadowOpacity(EditPanel &e, C Str &t) {e.shadow_opacity=TextInt (t); e.shadow_opacity_time.getUTC();}
  45. void PanelEditor::ParamsShadowRadius(EditPanel &e, C Str &t) {e.shadow_radius =TextFlt (t); e. shadow_radius_time.getUTC();}
  46. void PanelEditor::ParamsShadowOffset(EditPanel &e, C Str &t) {e.shadow_offset =TextFlt (t); e. shadow_offset_time.getUTC();}
  47. void PanelEditor::ParamsShadowCenter(EditPanel &e, C Str &t) {e.center_shadow =TextBool(t); e. center_shadow_time.getUTC();}
  48. void PanelEditor::ParamsBorderSize(EditPanel &e, C Str &t) {e. border_size =TextFlt (t); e. border_size_time.getUTC();}
  49. void PanelEditor::ParamsCenterScale(EditPanel &e, C Str &t) {e. center_scale =TextFlt (t); e. center_scale_time.getUTC();}
  50. void PanelEditor::ParamsTopSize(EditPanel &e, C Str &t) {e. top_size =TextFlt (t); e. top_size_time.getUTC();}
  51. void PanelEditor::ParamsTopOffset(EditPanel &e, C Str &t) {e. top_offset=TextFlt (t); e. top_offset_time.getUTC();}
  52. void PanelEditor::ParamsBottomSize(EditPanel &e, C Str &t) {e. bottom_size =TextFlt (t); e. bottom_size_time.getUTC();}
  53. void PanelEditor::ParamsBottomOffset(EditPanel &e, C Str &t) {e. bottom_offset=TextFlt (t); e. bottom_offset_time.getUTC();}
  54. void PanelEditor::ParamsLeftRightSize(EditPanel &e, C Str &t) {e. left_right_size =TextFlt (t); e. left_right_size_time.getUTC();}
  55. void PanelEditor::ParamsLeftRightOffset(EditPanel &e, C Str &t) {e. left_right_offset=TextVec2(t); e. left_right_offset_time.getUTC();}
  56. void PanelEditor::ParamsTopCornerSize(EditPanel &e, C Str &t) {e. top_corner_size =TextFlt (t); e. top_corner_size_time.getUTC();}
  57. void PanelEditor::ParamsTopCornerOffset(EditPanel &e, C Str &t) {e. top_corner_offset=TextVec2(t); e. top_corner_offset_time.getUTC();}
  58. void PanelEditor::ParamsBottomCornerSize(EditPanel &e, C Str &t) {e.bottom_corner_size =TextFlt (t); e. bottom_corner_size_time.getUTC();}
  59. void PanelEditor::ParamsBottomCornerOffset(EditPanel &e, C Str &t) {e.bottom_corner_offset=TextVec2(t); e.bottom_corner_offset_time.getUTC();}
  60. Str PanelEditor::ParamsCenterImage(C EditPanel &e) {return Proj.elmFullName(e. center_image);}
  61. Str PanelEditor::ParamsBorderImage(C EditPanel &e) {return Proj.elmFullName(e. border_image);}
  62. Str PanelEditor::ParamsTopImage(C EditPanel &e) {return Proj.elmFullName(e. top_image);}
  63. Str PanelEditor::ParamsBottomImage(C EditPanel &e) {return Proj.elmFullName(e. bottom_image);}
  64. Str PanelEditor::ParamsLeftRightImage(C EditPanel &e) {return Proj.elmFullName(e. left_right_image);}
  65. Str PanelEditor::ParamsTopCornerImage(C EditPanel &e) {return Proj.elmFullName(e. top_corner_image);}
  66. Str PanelEditor::ParamsBottomCornerImage(C EditPanel &e) {return Proj.elmFullName(e.bottom_corner_image);}
  67. Str PanelEditor::ParamsPanelImage(C EditPanel &e) {return Proj.elmFullName(e. panel_image);}
  68. void PanelEditor::ParamsCenterImage(EditPanel &e, C Str &t) {e. center_image=Proj.findElmImageID(t ); e. center_image_time.getUTC();}
  69. void PanelEditor::ParamsBorderImage(EditPanel &e, C Str &t) {e. border_image=Proj.findElmImageID(t ); e. border_image_time.getUTC();}
  70. void PanelEditor::ParamsTopImage(EditPanel &e, C Str &t) {e. top_image=Proj.findElmImageID(t ); e. top_image_time.getUTC();}
  71. void PanelEditor::ParamsBottomImage(EditPanel &e, C Str &t) {e. bottom_image=Proj.findElmImageID(t ); e. bottom_image_time.getUTC();}
  72. void PanelEditor::ParamsLeftRightImage(EditPanel &e, C Str &t) {e. left_right_image=Proj.findElmImageID(t ); e. left_right_image_time.getUTC();}
  73. void PanelEditor::ParamsTopCornerImage(EditPanel &e, C Str &t) {e. top_corner_image=Proj.findElmImageID(t ); e. top_corner_image_time.getUTC();}
  74. void PanelEditor::ParamsBottomCornerImage(EditPanel &e, C Str &t) {e.bottom_corner_image=Proj.findElmImageID(t ); e.bottom_corner_image_time.getUTC();}
  75. void PanelEditor::ParamsPanelImage(EditPanel &e, C Str &t) {e. panel_image=Proj.findElmID (t, ELM_PANEL_IMAGE); e. panel_image_time.getUTC();}
  76. void PanelEditor::SetCornerSize(PanelEditor &editor)
  77. {
  78. if(editor.game)
  79. {
  80. if(editor.game->border_image && editor.game->top_corner_image)
  81. {
  82. editor.undos.set("corner");
  83. editor.edit.top_corner_size=Abs(editor.game->top_corner_image->h()*editor.game->border_size/editor.game->border_image->h());
  84. editor.edit.top_corner_size_time.getUTC(); editor.setChanged(); editor.toGui();
  85. }
  86. if(editor.game->border_image && editor.game->bottom_corner_image)
  87. {
  88. editor.undos.set("corner");
  89. editor.edit.bottom_corner_size=Abs(editor.game->bottom_corner_image->h()*editor.game->border_size/editor.game->border_image->h());
  90. editor.edit.bottom_corner_size_time.getUTC(); editor.setChanged(); editor.toGui();
  91. }
  92. }
  93. }
  94. void PanelEditor::SetTopSize(PanelEditor &editor)
  95. {
  96. if(editor.game && editor.game->border_image && editor.game->top_image)
  97. {
  98. editor.undos.set("top");
  99. editor.edit.top_size=Abs(editor.game->top_image->h()*editor.game->border_size/editor.game->border_image->h());
  100. editor.edit.top_size_time.getUTC(); editor.setChanged(); editor.toGui();
  101. }
  102. }
  103. void PanelEditor::SetBottomSize(PanelEditor &editor)
  104. {
  105. if(editor.game && editor.game->border_image && editor.game->bottom_image)
  106. {
  107. editor.undos.set("bottom");
  108. editor.edit.bottom_size=Abs(editor.game->bottom_image->h()*editor.game->border_size/editor.game->border_image->h());
  109. editor.edit.bottom_size_time.getUTC(); editor.setChanged(); editor.toGui();
  110. }
  111. }
  112. void PanelEditor::SetSideSize(PanelEditor &editor)
  113. {
  114. if(editor.game && editor.game->border_image && editor.game->left_right_image)
  115. {
  116. editor.undos.set("side");
  117. editor.edit.left_right_size=Abs(editor.game->left_right_image->h()*editor.game->border_size/editor.game->border_image->h());
  118. editor.edit.left_right_size_time.getUTC(); editor.setChanged(); editor.toGui();
  119. }
  120. }
  121. void PanelEditor::Undo(PanelEditor &editor) {editor.undos.undo();}
  122. void PanelEditor::Redo(PanelEditor &editor) {editor.undos.redo();}
  123. void PanelEditor::Locate(PanelEditor &editor) {Proj.elmLocate(editor.elm_id);}
  124. void PanelEditor::create()
  125. {
  126. add("Shadow Opacity" , MemberDesc(MEMBER(EditPanel, shadow_opacity)).setTextToDataFunc(ParamsShadowOpacity));
  127. add("Shadow Radius" , MemberDesc(MEMBER(EditPanel, shadow_radius )).setTextToDataFunc(ParamsShadowRadius)).mouseEditSpeed(0.05f).min(0);
  128. add("Shadow Offset" , MemberDesc(MEMBER(EditPanel, shadow_offset )).setTextToDataFunc(ParamsShadowOffset)).mouseEditSpeed(0.05f);
  129. add("Shadow At Center (Slower)", MemberDesc(MEMBER(EditPanel, center_shadow )).setTextToDataFunc(ParamsShadowCenter));
  130. add("Center Color" , MemberDesc(MEMBER(EditPanel, center_color )).setTextToDataFunc(ParamsCenterColor )).setColor().desc("Affects Center Image and Panel Image");
  131. add("Center Stretch", MemberDesc(MEMBER(EditPanel, center_stretch)).setTextToDataFunc(ParamsCenterStretch)).desc("If stretch center image to fit the whole rectangle");
  132. add("Center Scale" , MemberDesc(MEMBER(EditPanel, center_scale )).setTextToDataFunc(ParamsCenterScale )).mouseEditMode(PROP_MOUSE_EDIT_SCALAR).range(-64, 64);
  133. add("Center Image" , MemberDesc(DATA_STR ).setFunc (ParamsCenterImage, ParamsCenterImage)).elmType(ELM_IMAGE);
  134. add("Panel Image" , MemberDesc(DATA_STR ).setFunc (ParamsPanelImage , ParamsPanelImage )).elmType(ELM_PANEL_IMAGE);
  135. add("Border Color", MemberDesc(MEMBER(EditPanel, border_color)).setTextToDataFunc(ParamsBorderColor)).setColor().desc("Affects Border Image");
  136. add("Border Size" , MemberDesc(MEMBER(EditPanel, border_size )).setTextToDataFunc(ParamsBorderSize )).mouseEditSpeed(0.05f);
  137. add("Border Image", MemberDesc(DATA_STR ).setFunc (ParamsBorderImage, ParamsBorderImage )).elmType(ELM_IMAGE);
  138. add();
  139. add("Side Color" , MemberDesc(MEMBER(EditPanel, side_color)).setTextToDataFunc(ParamsSideColor )).setColor().desc("Affects Top Image, Bottom Image, Left/Right Image, Top Corner Image and Bottom Corner Image");
  140. add("Side Stretch" , MemberDesc(MEMBER(EditPanel, side_stretch)).setTextToDataFunc(ParamsSideStretch )).desc("If stretch side images to fit the whole side\nAffects Top Image, Bottom Image, Left/Right Image, Top Corner Image and Bottom Corner Image");
  141. add("Top Image" , MemberDesc(DATA_STR ).setFunc (ParamsTopImage , ParamsTopImage )).elmType(ELM_IMAGE);
  142. add("Top Size" , MemberDesc(MEMBER(EditPanel, top_size )).setTextToDataFunc(ParamsTopSize )).mouseEditSpeed(0.05f);
  143. add("Top Offset" , MemberDesc(MEMBER(EditPanel, top_offset)).setTextToDataFunc(ParamsTopOffset )).mouseEditSpeed(0.05f);
  144. add("Bottom Image" , MemberDesc(DATA_STR ).setFunc (ParamsBottomImage , ParamsBottomImage )).elmType(ELM_IMAGE);
  145. add("Bottom Size" , MemberDesc(MEMBER(EditPanel, bottom_size )).setTextToDataFunc(ParamsBottomSize )).mouseEditSpeed(0.05f);
  146. add("Bottom Offset" , MemberDesc(MEMBER(EditPanel, bottom_offset)).setTextToDataFunc(ParamsBottomOffset )).mouseEditSpeed(0.05f);
  147. add("Left/Right Image" , MemberDesc(DATA_STR ).setFunc (ParamsLeftRightImage , ParamsLeftRightImage )).elmType(ELM_IMAGE);
  148. add("Left/Right Size" , MemberDesc(MEMBER(EditPanel, left_right_size )).setTextToDataFunc(ParamsLeftRightSize )).mouseEditSpeed(0.05f);
  149. add("Left/Right Offset" , MemberDesc(MEMBER(EditPanel, left_right_offset)).setTextToDataFunc(ParamsLeftRightOffset )).mouseEditSpeed(0.05f);
  150. add("Top Corner Image" , MemberDesc(DATA_STR ).setFunc (ParamsTopCornerImage , ParamsTopCornerImage )).elmType(ELM_IMAGE);
  151. add("Top Corner Size" , MemberDesc(MEMBER(EditPanel, top_corner_size )).setTextToDataFunc(ParamsTopCornerSize )).mouseEditSpeed(0.05f);
  152. add("Top Corner Offset" , MemberDesc(MEMBER(EditPanel, top_corner_offset)).setTextToDataFunc(ParamsTopCornerOffset )).mouseEditSpeed(0.05f);
  153. add("Bottom Corner Image" , MemberDesc(DATA_STR ).setFunc (ParamsBottomCornerImage, ParamsBottomCornerImage)).elmType(ELM_IMAGE);
  154. add("Bottom Corner Size" , MemberDesc(MEMBER(EditPanel, bottom_corner_size )).setTextToDataFunc(ParamsBottomCornerSize )).mouseEditSpeed(0.05f);
  155. add("Bottom Corner Offset", MemberDesc(MEMBER(EditPanel, bottom_corner_offset)).setTextToDataFunc(ParamsBottomCornerOffset)).mouseEditSpeed(0.05f);
  156. add("Blur Color", MemberDesc(MEMBER(EditPanel, blur_color)).setTextToDataFunc(ParamsBlurColor)).setColor();
  157. autoData(&edit);
  158. Rect r=::PropWin::create("Panel Editor", Vec2(0.02f, -0.07f), 0.036f, 0.043f, PropElmNameWidth); button[2].func(HideProjAct, SCAST(GuiObj, T)).show(); flag|=WIN_RESIZABLE; ::PropWin::changed(Changed, PreChanged);
  159. T+=undo .create(Rect_LU(0.02f, -0.01f , 0.05f, 0.05f)).func(Undo, T).focusable(false).desc("Undo"); undo.image="Gui/Misc/undo.img";
  160. T+=redo .create(Rect_LU(undo .rect().ru(), 0.05f, 0.05f)).func(Redo, T).focusable(false).desc("Redo"); redo.image="Gui/Misc/redo.img";
  161. T+=locate .create(Rect_LU(redo .rect().ru()+Vec2(0.01f, 0), 0.14f, 0.05f), "Locate").func(Locate, T).focusable(false).desc("Locate this element in the Project");
  162. T+=show_lines.create(Rect_LU(locate.rect().ru()+Vec2(0.01f, 0), 0.22f, 0.05f), "Show Lines").focusable(false); show_lines.mode=BUTTON_TOGGLE;
  163. flt y=r.min.y-0.01f, h=0.045f;
  164. T+=set_corner_size.create(Rect_LU(0.02f, y, 0.69f, 0.043f), "Set Corner Size to match Border Pixel Ratio").func(SetCornerSize, T); y-=h;
  165. T+=set_top_size .create(Rect_LU(0.02f, y, 0.69f, 0.043f), "Set Top Size to match Border Pixel Ratio" ).func(SetTopSize , T); y-=h;
  166. T+=set_bottom_size.create(Rect_LU(0.02f, y, 0.69f, 0.043f), "Set Bottom Size to match Border Pixel Ratio").func(SetBottomSize, T); y-=h;
  167. T+=set_side_size .create(Rect_LU(0.02f, y, 0.69f, 0.043f), "Set Side Size to match Border Pixel Ratio" ).func(SetSideSize , T); y-=h;
  168. T+=gui_panel.create();
  169. Vec2 padd=defaultInnerPaddingSize(); rect(Rect_C(0, 0, Min(1.7f+padd.x, D.w()*2), Min(-y+padd.y+0.01f, D.h()*2)));
  170. }
  171. void PanelEditor::toGame() {if(game)edit.copyTo(*game, Proj);}
  172. void PanelEditor::toGui() {::PropWin::toGui(); toGame();}
  173. PanelEditor& PanelEditor::hide( ) {set(null); ::PropWin::hide(); return T;}
  174. Rect PanelEditor::sizeLimit( )C {Rect r=::EE::Window::sizeLimit(); r.min.set(1.0f, 0.5f); return r;}
  175. PanelEditor& PanelEditor::rect(C Rect &rect)
  176. {
  177. ::EE::Window::rect(rect);
  178. flt x=set_top_size.rect().max.x; if(props.elms())MAX(x, props[0].button.rect().max.x);
  179. Rect r(x, -clientHeight(), clientWidth(), 0); r.extend(-0.08f);
  180. r.setC(r.center(), Min(r.w(), 1.3f), Min(r.h(), 1.09f));
  181. gui_panel.clip_x=x;
  182. gui_panel.rect(r);
  183. return T;
  184. }
  185. void PanelEditor::flush()
  186. {
  187. if(elm && game && changed)
  188. {
  189. if(ElmPanel *data=elm->panelData()){data->newVer(); data->from(edit);} // modify just before saving/sending in case we've received data from server after edit
  190. Save( edit, Proj.editPath(*elm)); // edit
  191. Save(*game, Proj.gamePath(*elm)); Proj.savedGame(*elm); // game
  192. Server.setElmLong(elm->id);
  193. Proj.panelChanged(elm->id);
  194. }
  195. changed=false;
  196. }
  197. void PanelEditor::setChanged()
  198. {
  199. if(elm)
  200. {
  201. changed=true;
  202. if(ElmPanel *data=elm->panelData()){data->newVer(); data->from(edit);}
  203. toGame();
  204. }
  205. }
  206. void PanelEditor::set(Elm *elm)
  207. {
  208. if(elm && elm->type!=ELM_PANEL)elm=null;
  209. if(T.elm!=elm)
  210. {
  211. flush();
  212. undos.del(); undoVis();
  213. T.elm =elm;
  214. T.elm_id=(elm ? elm->id : UIDZero);
  215. if(elm){edit.load(Proj.editPath(*elm)); game=Proj.gamePath(elm_id);}else{edit.reset(); game.clear();}
  216. toGui();
  217. Proj.refresh(false, false);
  218. visible(T.elm!=null).moveToTop();
  219. }
  220. }
  221. void PanelEditor::activate(Elm *elm) {set(elm); if(T.elm)::EE::GuiObj::activate();}
  222. void PanelEditor::toggle(Elm *elm) {if(elm==T.elm)elm=null; set(elm);}
  223. void PanelEditor::elmChanged(C UID &elm_id)
  224. {
  225. if(elm && elm->id==elm_id)
  226. {
  227. undos.set(null, true);
  228. EditPanel temp; if(temp.load(Proj.editPath(*elm)))if(edit.sync(temp))toGui();
  229. }
  230. }
  231. void PanelEditor::erasing(C UID &elm_id) {if(elm && elm->id==elm_id)set(null);}
  232. void PanelEditor::drag(Memc<UID> &elms, GuiObj *obj, C Vec2 &screen_pos)
  233. {
  234. if(contains(obj) && elms.elms())
  235. {
  236. }
  237. }
  238. PanelEditor::PanelEditor() : elm_id(UIDZero), elm(null), changed(false), undos(true) {}
  239. PanelEditor::GuiPanel::GuiPanel() : clip_x(0) {}
  240. /******************************************************************************/