/******************************************************************************/ /******************************************************************************/ class ParamEditor : Region { class RenameWindow : ClosableWindow { Param data; UID id; TextLine dest; ParamEditor &pe; RenameWindow(ParamEditor &pe); void create(); void rename(C Str &src, PARAM_TYPE type, C UID &id); static bool Rename(ParamEditor &pe, EditObject &obj, C RenameWindow &rename); virtual void update(C GuiPC &gpc)override; }; class ParamWindow : ClosableWindow { static const flt elm_h; enum MODE { CUR, BASE, BASE_OVR, }; class EditParamEx : EditParam { bool cur, base, base_ovr; C GuiEditParam *gui; EditParamEx& create(C EditParam &src, MODE mode); public: EditParamEx(); }; class Param { class GuiColor : GuiCustom { byte alpha; virtual void update(C GuiPC &gpc)override; virtual void draw(C GuiPC &gpc)override; public: GuiColor(); }; bool cur, base, base_ovr, valid_type, valid_value, multi_obj , // if belongs to multiple objects multi_cur , // if has different 'cur ' on different objects multi_base, // if has different 'base' on different objects multi_val ; // if has different values on different objects int priority; UID id; ::Param src; CheckBox ovr; Button remove, clear; ComboBox type; TextLine name; CheckBox val_checkbox; TextLine val_textline; ComboBox val_combobox; GuiColor val_color; Button val_adjust; ColorPicker cp; ParamEditor *pe; EditObject *owner; // this is used only for memory address comparison bool min_use , max_use ; dbl min_value , max_value; flt mouse_edit_speed, custom_mouse_edit_speed; Vec2 mouse_edit_value; C GuiEditParam *gui; PROP_MOUSE_EDIT_MODE mouse_edit_mode; static void ChangedOvr (Param ¶m); // if(override parameter) {copy from base to cur} else {remove parameter} static void RemoveParam (Param ¶m); static void ClearValue (Param ¶m); static void ChangedType (Param ¶m); static void ChangedName (Param ¶m); static void ChangedCheck(Param ¶m); static void ChangedCombo(Param ¶m); static void ChangedColor(Param ¶m); static void ChangedText (Param ¶m); static void MouseEdit(Param ¶m); bool forceEnum()C; int enumValue()C; bool contains(C GuiObj*obj)C; void setSkin(); void toGui(); Param& moveToTop(); Param& setRect(int i, flt list_w); void desc(C Str &desc); dbl clamp(dbl value); void set(C Vec2 &value); Param& create(ParamEditor &pe, EditObject &owner, EditParamEx &src); // !! do not store pointer to 'src' because it might be temporary !! void enumChanged(); public: Param(); }; class SubObj { static void RemoveSubObj(SubObj &sub_obj); UID id; Button remove, obj; ParamEditor *pe; SubObj& setRect(int i, flt list_w); SubObj& create(ParamEditor &pe, EditObject::SubObj &src, int i, flt list_w); public: SubObj(); }; bool is_class; Panel panel; Text type, name, value; Button new_par; Region region; Memx params; Memx sub_objs; TextBlack ts; ParamEditor &pe; ParamWindow(ParamEditor &pe); static void NewParam(ParamEditor &pe); static int CompareParam(C Param &p0, C Param&p1); ParamWindow& create(C Rect &rect, bool is_class); virtual Rect sizeLimit()C override; flt listWidth(); C Rect& rect()C; virtual ParamWindow& rect(C Rect &rect)override; virtual void update(C GuiPC &gpc)override; virtual ParamWindow& hide()override; Param* findParam(GuiObj *go); void addParams(EditObject &obj); void addSubObjs(EditObject &obj); void setSkin(); void toGui(); }; class Change : Edit::_Undo::Change { EditObject data; virtual void create(ptr user)override; virtual void apply(ptr user)override; }; class MeshVariation { Str name; uint id; C Str& originalName()C; // if valid 'id' then return 'name', if invalid then it means it was created from default variation which has no name void set(C Str &name, uint id); public: MeshVariation(); }; Button multi, undo, redo; Text t_class, t_path, t_mesh_var, t_editor_type, t_const; ComboBox v_class, v_path, v_mesh_var, v_editor_type; CheckBox o_class, o_const, v_const, o_path, o_mesh_var; Button b_class; TextLine t_obj; ParamWindow param_window; RenameWindow rename_window; TextBlack ts_black; TextWhite ts_white; bool world; EditObject temp_p, *p; bool changed; Memc mesh_variations; Edit::Undo undos; void undoVis(); static NameDesc path_mode[] ; ASSERT(OBJ_PATH_CREATE==0 && OBJ_PATH_IGNORE==1 && OBJ_PATH_BLOCK==2); static NameDesc etype_mode[] ; ASSERT(EDIT_OBJ_MESH==0 && EDIT_OBJ_LIGHT_POINT==1 && EDIT_OBJ_LIGHT_CONE==2 && EDIT_OBJ_PARTICLES==3 && EDIT_OBJ_NUM==4); template void multiFunc(bool Func(ParamEditor &pe, EditObject &obj, C TYPE &user), C TYPE &user ); void multiFunc(bool Func(ParamEditor &pe, EditObject &obj, cptr user), cptr user=null); static bool ChangedOConst(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedOConst(ParamEditor &pe); static bool ChangedConst(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedConst(ParamEditor &pe); static void ChangedOClass(ParamEditor &pe); // Access is merged with Type/Class class AccessType { OBJ_ACCESS access; UID type; public: AccessType(); }; static bool ChangedClass(ParamEditor &pe, EditObject &obj, C AccessType &at); static void ChangedClass(ParamEditor &pe); // Access is merged with Type/Class static void ChangedEditorType(ParamEditor &pe); static bool ChangedOPath(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedOPath(ParamEditor &pe); static bool ChangedPath(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedPath(ParamEditor &pe); static bool ChangedOMeshVariation(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedOMeshVariation(ParamEditor &pe); static bool ChangedMeshVariation(ParamEditor &pe, EditObject &obj, cptr user=null); static void ChangedMeshVariation(ParamEditor &pe); static void ToBase(ParamEditor &pe); static void ChangedMulti(ParamEditor &edit); // refresh parameter list because their names will display differently when 'multi' mode is enabled static void Undo (ParamEditor &edit); static void Redo (ParamEditor &edit); ParamWindow::Param* findParam(GuiObj *go); void setUndo(cptr change_type=null, bool force_create=false); void setChanged(bool refresh_gui=true); void toGuiMeshVariation(uint mesh_variation_id); void toGui(bool params=true); void setSkin(); void create(GuiObj &parent, bool is_class=false, bool world=false); void enumChanged(); void meshVariationChanged(); void objChanged(C UID *obj_id=null); virtual ParamEditor& move(C Vec2 &delta)override; virtual void paramWindowHidden(); void newSubObj(C UID &elm_obj_id); void removeSubObj(ParamWindow::SubObj &sub_obj); static bool NewParam(ParamEditor &pe, EditObject &obj, cptr user=null); void newParam(); static bool NewParam(ParamEditor &pe, EditObject &obj, C Param ¶m); void newParam(ParamWindow::Param &src, bool refresh_gui=true); // override 'src' parameter (this is done only if the object has a base containing that parameter) static bool RemoveParam(ParamEditor &pe, EditObject &obj, C Param &src); void removeParam(ParamWindow::Param &src); static bool ClearValue(ParamEditor &pe, EditObject &obj, C Param &src); void clearValue(ParamWindow::Param &src); static bool SetType(ParamEditor &pe, EditObject &obj, C ParamWindow::Param &src); void setType(ParamWindow::Param &src); static bool SetName(ParamEditor &pe, EditObject &obj, C ParamWindow::Param &src); void setName(ParamWindow::Param &src); static bool SetBool(ParamEditor &pe, EditObject &obj, C ParamWindow::Param &src); void setBool(ParamWindow::Param &src); static bool SetEnum(ParamEditor &pe, EditObject &obj, C ParamWindow::Param &src); void setEnum(ParamWindow::Param &src); static bool SetColor(ParamEditor &pe, EditObject &obj, C ParamWindow::Param &src); void setColor(ParamWindow::Param &src); // don't refresh gui because it will delete color pickers class ParamIDs : Param { Memc ids; }; static bool SetText(ParamEditor &pe, EditObject &obj, C ParamIDs &src); void setText(ParamWindow::Param &src); // don't refresh gui because it will lose textline keyboard focus and cursor/selection static bool SetBase(ParamEditor &pe, EditObject &obj, C EditObjectPtr &base); void setBase(C EditObjectPtr &base); static bool SetID(ParamEditor &pe, EditObject &obj, C ParamIDs &src); static bool IncludeID(ParamEditor &pe, EditObject &obj, C ParamIDs &src); void drag(Memc &elms, GuiObj* &obj, C Vec2 &screen_pos); public: ParamEditor(); }; /******************************************************************************/ /******************************************************************************/ /******************************************************************************/