/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2012 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ struct InterfaceElement = [ IE_element : VUIelement, IE_floatstr : VUIFloat, IE_selectstr : VUISelect, IE_checkstr : VUIelement, IE_sliderstr : VUISlider, IE_tablestr : VUITable, IE_parentstr : InterfaceElement, IE_font : VUIfont, IE_sName : S, IE_iDepth : I, IE_sSuffix : S, //Common parameters IE_iType : I, IE_tPosSize : [F F F F F F], IE_tAnchors : [I I I I I I], IE_tInitPosSize : [F F F F F F], IE_tInitAnchors : [I I I I I I], IE_bShowOnStart : I, //Theme parameters IE_bUseTheme : I, IE_lThemeValues : [S r1], //Frame parameters IE_iScrollMode : I, //Text parameters IE_sText : S, IE_sFontName : S, IE_iFontSize : I, IE_iFontColor : I, IE_iFontFlags : I, IE_iHAlign : I, IE_iVAlign : I, IE_bMultiline : I, IE_bPassword : I, //Button parameters IE_iPreset : I, IE_iStates : I, //Number parameters IE_fValue : F, IE_fMin : F, IE_fMax : F, IE_fInterval : F, IE_iNbDec : I, //Select parameters IE_lSelectValues : [S r1], IE_iSelectDefPos : I, //Checkbox parameters IE_bCheckInit : I, //Picture parameters IE_sPath : S, IE_iResizeFlag : I, IE_iNbFrames : I, IE_iNbFps : I, //Slider parameters IE_iDirection : I, IE_iCursorSize : I, IE_iTextPos : I, IE_bIgnoreClick : I, //Table parameters IE_iNbRow : I, IE_iNbCol : I, IE_iMarginX : I, IE_iMarginY : I, IE_iCellColor : I, IE_iBorder : I, IE_iBorderColor : I, IE_data : tab tab S, IE_colWidths : tab I, IE_iRowIndex : I, IE_iColIndex : I, IE_lChildren : [InterfaceElement r1] ]mkInterfaceElement;; struct CInterfacePlugit = [ CIP_inst : PInstance, CIP_posstr : InterfacePos, CIP_contstr : VUIcontainer, CIP_bBgColor : I, CIP_iBgColor : I, CIP_sBgPath : S, CIP_iBgResizeFlag : I, CIP_bAdvanced : I, CIP_iFadeSpeed : I, CIP_lElements : [InterfaceElement r1] ]mkCInterfacePlugit;; fun cleanElements(l)= if (l == nil) then nil else let l -> [elt next] in ( VUIdelFont elt.IE_font; cleanElements elt.IE_lChildren; cleanElements next; 0; );; fun deleteOb(inst, obstr)= VUIdestroyContainer obstr.CIP_contstr; cleanElements obstr.CIP_lElements; 0;; fun cbDialogVisibility(contstr, state, obstr)= if (!state) then nil else ( if (obstr.CIP_posstr.IP_iMode != 3) then nil else let obstr.CIP_posstr.IP_posvrstr -> posvrstr in VUIrefreshVrContainerPosition c3dXsession obstr.CIP_contstr posvrstr.IPVR_tSize posvrstr.IPVR_fScale posvrstr.IPVR_iZorder; ); SendPluginEvent obstr.CIP_inst if (state) then "Shown" else "Hidden" nil nil; 0;; fun cbHide(inst, from, action, param, reply, obstr)= VUIshowContainerExt obstr.CIP_contstr 0 mkfun3 @cbDialogVisibility obstr; 0;; fun cbShow(inst, from, action, param, reply, obstr)= VUIshowContainerExt obstr.CIP_contstr 1 mkfun3 @cbDialogVisibility obstr; 0;; fun getElementByName(obstr, elementslist, name)= let nil -> found in ( while (found == nil && elementslist != nil) do let hd elementslist -> element in ( if (strcmpi element.IE_sName name) == 0 then set found = element else set found = getElementByName obstr element.IE_lChildren name; set elementslist = tl elementslist; ); found; );; fun getElementstr(element)= if (element.IE_iType == 4) then // Number element.IE_floatstr.VUIF_element else if (element.IE_iType == 5) then // Select element.IE_selectstr.VUIS_element else if (element.IE_iType == 8) then // Slider element.IE_sliderstr.VUISL_element else if (element.IE_iType == 9) then // Table element.IE_tablestr.VUITB_element else element.IE_element;; fun getHalign(mode)= if (mode == 1) then iVUITEXT_HALIGNCENTER else if (mode == 2) then iVUITEXT_HALIGNRIGHT else iVUITEXT_HALIGNLEFT;; fun getValign(mode)= if (mode == 1) then iVUITEXT_VALIGNCENTER else if (mode == 2) then iVUITEXT_VALIGNBOTTOM else iVUITEXT_VALIGNTOP;; fun getAxisPosSizeAlign (coords, anchors)= let coords -> [pos length pos2] in let anchors -> [a1 a2 a3] in ( if (!a1 && a2 && !a3) then // --- <-> --- [pos 100.0 [0 1 0 (ftoi (-. pos -. pos2))] 0] else if (a1 && !a2 && !a3) then // <-> --- --- [pos2 length [0 0 0 0] 2] else if (!a1 && a2 && a3) then // --- <-> <-> [pos length [0 1 0 (ftoi (-.((length *. pos) /. 100.0)))] 0] else if (a1 && a2 && !a3) then // <-> <-> --- [pos2 length [0 1 0 (ftoi (-.((length *. pos2) /. 100.0)))] 2] else if (a1 && !a2 && a3) then // <-> --- <-> [pos length [1 0 (ftoi (-.((pos *. length) /. 100.0))) 0] 0] else if (a1 && a2 && a3) then // <-> <-> <-> [pos length [1 1 0 0] 0] else // --- --- <-> && --- --- --- [pos length [0 0 0 0] 0]; );; fun getPosSizeAlign (element)= let element.IE_tPosSize -> [xpos width xpos2 ypos height ypos2] in let element.IE_tAnchors -> [l w r t h b] in let getAxisPosSizeAlign [xpos width xpos2] [l w r] -> [ix iw [px pw ox ow] ha] in let getAxisPosSizeAlign [ypos height ypos2] [t h b] -> [iy ih [py ph oy oh] va] in [[ix iy] [iw ih] [px py pw ph ox oy ow oh] [ha va]];; /* ********************************************************************************************* / Interface callbacks / ********************************************************************************************* */ // Table specifics fun cbTableElementModified(tablestr, cellstr, x, y, content, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " modified") (strcatnSep (itoa y)::(itoa x)::content::nil " ") nil; 0;; fun getTableParam(param)= let strextr param -> lp in let hd lp -> pp in let if ((atoi (hd pp)) == nil) then 0 else (atoi (hd pp)) -> row in let if ((atoi (hd tl pp)) == nil) then 0 else (atoi (hd tl pp)) -> col in let strbuildn (tl tl pp)::(tl lp) -> p in [row col p];; fun getTableIndexParam(param)= let strextr param -> lp in let hd lp -> pp in let if ((atoi (hd pp)) == nil) then 0 else (atoi (hd pp)) -> index in let strbuildn (tl pp)::(tl lp) -> p in [index p];; fun cbSetTableElementCellContent(inst, from, action, param, reply, element)= let getTableParam param -> [row col text] in let if text == nil then "" else text -> text in ( VUIsetTableCellText element.IE_tablestr col row text; ); 0;; fun cbGetTableElementCellContent(inst, from, action, param, reply, element)= let getTableParam param -> [row col _] in let VUIgetTableCellText element.IE_tablestr col row -> text in SendPluginEvent inst (strcat element.IE_sName " cell content") (strcatn (itoa row)::" "::(itoa col)::" "::text::nil) nil; 0;; fun cbSetTableElementNextRow(inst, from, action, param, reply, element)= let if (param == nil) || (!strcmp param "") then let "" -> str in ( let 0 -> t in while (t < element.IE_iNbCol) do ( set str = strcat str ";"; set t = t + 1; ); str ) else param -> param in let readCSVdataToTabRow param nil element.IE_iRowIndex element.IE_data element.IE_iNbRow element.IE_iNbCol -> data in VUIsetTable element.IE_tablestr data; set element.IE_iRowIndex = element.IE_iRowIndex + 1; 0;; fun cbSetTableElementRow(inst, from, action, param, reply, element)= if (param == nil) || (!strcmp param "") then nil else ( let getTableIndexParam param -> [index param] in let readCSVdataToTabRow param nil index element.IE_data element.IE_iNbRow element.IE_iNbCol -> data in VUIsetTable element.IE_tablestr data; ); 0;; fun cbSetTableElementNextColumn(inst, from, action, param, reply, element)= let if (param == nil) || (!strcmp param "") then let "" -> str in ( let 0 -> t in while (t < element.IE_iNbRow) do ( set str = strcat str ";\n"; set t = t + 1; ); str ) else param -> param in let readCSVdataToTabColumn param nil element.IE_iColIndex element.IE_data element.IE_iNbRow element.IE_iNbCol -> data in VUIsetTable element.IE_tablestr data; set element.IE_iColIndex = element.IE_iColIndex + 1; 0;; fun cbSetTableElementColumn(inst, from, action, param, reply, element)= if (param == nil) || (!strcmp param "") then nil else ( let getTableIndexParam param -> [index param] in let readCSVdataToTabColumn param nil index element.IE_data element.IE_iNbRow element.IE_iNbCol -> data in VUIsetTable element.IE_tablestr data; ); 0;; fun cbSetTableElementTable(inst, from, action, param, reply, element)= let readCSVdataToTabSized param nil element.IE_iNbRow element.IE_iNbCol -> data in VUIsetTable element.IE_tablestr data; 0;; fun cbGetTableElementTable(inst, from, action, param, reply, element)= SendPluginEvent inst (strcat element.IE_sName " table") (formatCSV nil nil (readCSVTabToData (VUIgetTable element.IE_tablestr) element.IE_iNbRow element.IE_iNbCol)) nil; 0;; // Slider specifics fun cbSliderElementModified(sliderstr, value, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " modified") (floatToString value) nil; 0;; fun cbSetSliderElementValue(inst, from, action, param, reply, element)= if (param == nil) then nil else VUIsetSliderValue element.IE_sliderstr (atof param); 0;; fun cbSetSliderElementMinValue(inst, from, action, param, reply, element)= if (param == nil) then nil else VUIsetSliderMinValue element.IE_sliderstr (atof param); 0;; fun cbSetSliderElementMaxValue(inst, from, action, param, reply, element)= if (param == nil) then nil else VUIsetSliderMaxValue element.IE_sliderstr (atof param); 0;; fun cbGetSliderElementValue(inst, from, action, param, reply, element)= let VUIgetSliderValue element.IE_sliderstr -> value in SendPluginEvent inst (strcat element.IE_sName " value") (floatToString value) nil; 0;; // Picture specifics fun cbSetPictureElementPath(inst, from, action, param, reply, element)= if (param == nil) || (strcmpi param "") == 0 then VUIsetElementResource element.IE_element nil nil nil nil nil nil nil nil nil else ( let if (element.IE_iResizeFlag == 0) then VUI_ResStreched else if (element.IE_iResizeFlag == 1) then VUI_ResSplited else VUI_ResKeepRatio -> resizeflag in let _checkpack param -> file in if (file == nil) then nil else VUIsetElementResource element.IE_element nil nil nil file resizeflag 0 1 element.IE_iNbFrames element.IE_iNbFps; ); 0;; // Checkbox specifics fun cbGetCheckboxElementState(inst, from, action, param, reply, element)= let element.IE_checkstr.VUIE_iCheckState -> state in SendPluginEvent inst (strcat element.IE_sName " state") (itoa state) nil; 0;; fun cbSetCheckboxElementState(inst, from, action, param, reply, element)= if (param == nil) || (strcmpi param "") == 0 then nil else let if (atoi param) <= 0 then 0 else 1 -> state in ( VUIsetElementCheckState element.IE_checkstr state; ); 0;; fun cbCheckboxElementClick(elstr, state, p)= let p -> [obstr element] in if state then SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " checked") nil nil else SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " unchecked") nil nil; 0;; // Select specifics fun cbGetSelectElementPosition(inst, from, action, param, reply, element)= let element.IE_selectstr.VUIS_sValue -> value in let element.IE_selectstr.VUIS_lValues -> lvalues in let 1 -> i in ( while (strcmp (hd lvalues) value) != 0 do ( set lvalues = tl lvalues; set i = i + 1; ); SendPluginEvent inst (strcat element.IE_sName " position") (itoa i) nil; ); 0;; fun cbGetSelectElementValue(inst, from, action, param, reply, element)= let element.IE_selectstr.VUIS_sValue -> value in SendPluginEvent inst (strcat element.IE_sName " value") value nil; 0;; // Float specifics fun cbFloatElementModified(floatstr, value, state, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " modified") (floatToString value) nil; 0;; fun cbSetFloatElementValue(inst, from, action, param, reply, element)= if (param == nil) then nil else VUIsetFloatValue element.IE_floatstr (atof param); 0;; fun cbGetFloatElementValue(inst, from, action, param, reply, element)= let VUIgetFloatValue element.IE_floatstr -> value in SendPluginEvent inst (strcat element.IE_sName " value") (floatToString value) nil; 0;; // Text input specifics fun cbGetTextInputElementContent(inst, from, action, param, reply, element)= let VUIgetElementText element.IE_element -> content in SendPluginEvent inst (strcat element.IE_sName " content") content nil; 0;; fun cbTextInputElementValidated(eltstr, val, state, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " validated") val nil; 0;; // Button specifics fun triggerElementsOutput(obstr, elementslist)= while (elementslist != nil) do let hd elementslist -> element in ( if (element.IE_iType == 2) then // Text Input cbGetTextInputElementContent obstr.CIP_inst nil nil nil nil element else if (element.IE_iType == 4) then // Number cbGetFloatElementValue obstr.CIP_inst nil nil nil nil element else if (element.IE_iType == 5) then // Select ( cbGetSelectElementValue obstr.CIP_inst nil nil nil nil element; cbGetSelectElementPosition obstr.CIP_inst nil nil nil nil element; ) else if (element.IE_iType == 6) then // Checkbox cbGetCheckboxElementState obstr.CIP_inst nil nil nil nil element else if (element.IE_iType == 8) then // Slider cbGetSliderElementValue obstr.CIP_inst nil nil nil nil element else nil; triggerElementsOutput obstr element.IE_lChildren; set elementslist = tl elementslist; ); 0;; fun cbButtonElementClick(elstr, id, x, y, btn, p)= let p -> [obstr element] in ( if (element.IE_iPreset == 1) then triggerElementsOutput obstr obstr.CIP_lElements else nil; SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " clicked") nil nil; ); 0;; fun cbSetButtonElementPath(inst, from, action, param, reply, element)= if (param == nil) || (strcmpi param "") == 0 then let if element.IE_bUseTheme then VUIsplitThemeRef (hd element.IE_lThemeValues) else ["common" "button"] -> [defname eltname] in let VUIgetThemeDef (getThemeFromInstance inst) defname -> defstr in ( VUIsetElementTheme element.IE_element defstr eltname; //VUIsetElementResource element.IE_element nil nil nil nil nil nil nil nil nil 0; ) else ( let if (element.IE_iResizeFlag == 0) then VUI_ResStreched else if (element.IE_iResizeFlag == 1) then VUI_ResSplited else VUI_ResKeepRatio -> resizeflag in let _checkpack param -> file in if (file == nil) then nil else VUIsetElementResource element.IE_element nil nil nil file resizeflag element.IE_iStates 1 element.IE_iNbFrames element.IE_iNbFps; 0; ); 0;; // Generics fun cbSetElementCoords(inst, from, action, param, reply, element)= addLogMessage "cbSetElementCoords"; if (param == nil || (strcmp param "") == 0) then nil else ( let hd (strextr param) -> plist in let element.IE_tPosSize -> [xpos width xpos2 ypos height ypos2] in let element.IE_tAnchors -> [l w r t h b] in let [(nth_list plist 4) (nth_list plist 5) (nth_list plist 6) (nth_list plist 7) (nth_list plist 8) (nth_list plist 9)] -> [pl pw pr pt ph pb] in let if (pl == nil) || (!strcmp "_" pl) then l else atoi pl -> l in let if (pw == nil) || (!strcmp "_" pw) then w else atoi pw -> w in let if (pr == nil) || (!strcmp "_" pr) then r else atoi pr -> r in let if (pt == nil) || (!strcmp "_" pt) then t else atoi pt -> t in let if (ph == nil) || (!strcmp "_" ph) then h else atoi ph -> h in let if (pb == nil) || (!strcmp "_" pb) then b else atoi pb -> b in let [(nth_list plist 0) (nth_list plist 1) (nth_list plist 2) (nth_list plist 3)] -> [px1 px2 py1 py2] in let [nil nil nil nil nil nil] -> possize in ( if (l && !r) then let if (px1 == nil) || (!strcmp "_" px1) then xpos2 else atof px1 -> xpos2 in mutate possize <- [_ _ xpos2 _ _ _] else let if (px1 == nil) || (!strcmp "_" px1) then xpos else atof px1 -> xpos in mutate possize <- [xpos _ _ _ _ _]; if (!l && w && !r) then let if (px2 == nil) || (!strcmp "_" px2) then xpos2 else atof px2 -> xpos2 in mutate possize <- [_ _ xpos2 _ _ _] else let if (px2 == nil) || (!strcmp "_" px2) then width else atof px2 -> width in mutate possize <- [_ width _ _ _ _]; if (t && !b) then let if (py1 == nil) || (!strcmp "_" py1) then ypos2 else atof py1 -> ypos2 in mutate possize <- [_ _ _ _ _ ypos2] else let if (py1 == nil) || (!strcmp "_" py1) then ypos else atof py1 -> ypos in mutate possize <- [_ _ _ ypos _ _]; if (!t && h && !b) then let if (py2 == nil) || (!strcmp "_" py2) then ypos2 else atof py2 -> ypos2 in mutate possize <- [_ _ _ _ _ ypos2] else let if (py2 == nil) || (!strcmp "_" py2) then height else atof py2 -> height in mutate possize <- [_ _ _ _ height _]; let possize -> [x w x2 y h y2] in addLogMessage strcatnSep "x:"::(ftoa x)::"w:"::(ftoa w)::"x2:"::(ftoa x2)::"y:"::(ftoa y)::"h:"::(ftoa h)::"y2:"::(ftoa y2)::nil " "; addLogMessage strcatnSep "l:"::(itoa l)::"w:"::(itoa w)::"r:"::(itoa r)::"t:"::(itoa t)::"h:"::(itoa h)::"b:"::(itoa b)::nil " "; set element.IE_tPosSize = possize; set element.IE_tAnchors = [l w r t h b]; ); let getElementstr element -> elementstr in let getPosSizeAlign element -> [pos size [px py pw ph ox oy ow oh] align] in ( VUIsetElementPos elementstr pos align [px py ox oy]; VUIsetElementSize elementstr size [pw ph ow oh]; ); ); 0;; fun cbSetElementText(inst, from, action, param, reply, element)= VUIsetElementTextContent element.IE_element if ((!strcmpi param " ") || (!strcmpi param "nil")) then "" else param; 0;; fun cbShowElement(inst, from, action, param, reply, element)= let getElementstr element -> elementstr in VUIshowElement elementstr 1; 0;; fun cbHideElement(inst, from, action, param, reply, element)= let getElementstr element -> elementstr in VUIshowElement elementstr 0; 0;; fun cbEnableElement(inst, from, action, param, reply, element)= VUIsetElementState element.IE_element 1; 0;; fun cbDisableElement(inst, from, action, param, reply, element)= VUIsetElementState element.IE_element 0; 0;; fun resetElement(element)= // reset position set element.IE_tPosSize = element.IE_tInitPosSize; set element.IE_tAnchors = element.IE_tInitAnchors; let getElementstr element -> elementstr in let getPosSizeAlign element -> [pos size [px py pw ph ox oy ow oh] align] in ( VUIsetElementPos elementstr pos align [px py ox oy]; VUIsetElementSize elementstr size [pw ph ow oh]; ); // reset element specifics if (element.IE_iType == 4 || element.IE_iType == 5 || element.IE_iType == 7) then nil else VUIsetElementTextContent element.IE_element element.IE_sText; if element.IE_iType == 3 then // Button ( cbSetButtonElementPath nil nil nil (if element.IE_bUseTheme then nil else element.IE_sPath) nil element; 0; ) else if element.IE_iType == 4 then // Number ( VUIsetFloatValue element.IE_floatstr element.IE_fValue; 0; ) else if element.IE_iType == 5 then // Select ( VUIsetSelectElementByPos element.IE_selectstr (element.IE_iSelectDefPos - 1); 0; ) else if element.IE_iType == 6 then // Checkbox ( VUIsetElementCheckState element.IE_checkstr element.IE_bCheckInit; 0; ) else if element.IE_iType == 7 then // Picture ( cbSetPictureElementPath nil nil nil element.IE_sPath nil element; 0; ) else if element.IE_iType == 8 then // Slider ( VUIsetSliderValue element.IE_sliderstr element.IE_fValue; 0; ) else if element.IE_iType == 9 then // Table ( VUIsetTable element.IE_tablestr element.IE_data; set element.IE_iRowIndex = 0; set element.IE_iColIndex = 0; 0; ) else nil; // reset visible state if (element.IE_bShowOnStart) then cbShowElement nil nil nil nil nil element else cbHideElement nil nil nil nil nil element; 0;; fun resetElementsList(obstr, elementslist)= while (elementslist != nil) do let hd elementslist -> element in ( resetElement element; resetElementsList obstr element.IE_lChildren; set elementslist = tl elementslist; ); 0;; fun cbReset(inst, from, action, param, reply, obstr)= resetElementsList obstr obstr.CIP_lElements; 0;; fun cbResetElement(inst, from, action, param, reply, obstr)= let strtrim param -> param in if (param == nil) || ((strcmpi param "") == 0) then nil else ( let getElementByName obstr obstr.CIP_lElements param -> element in if (element == nil) then nil else resetElement element; ); 0;; fun cbElementClick(eltstr, id, x, y, btn, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " click down") (strcatnSep (itoa x)::(itoa y)::nil " ") nil; 0;; fun cbElementUnClick(eltstr, id, x, y, btn, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " click up") (strcatnSep (itoa x)::(itoa y)::nil " ") nil; 0;; fun cbElementMouseIn(eltstr, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " mouse in") nil nil; 0;; fun cbElementMouseOut(eltstr, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " mouse out") nil nil; 0;; /* ********************************************************************************************* / Interface creation / ********************************************************************************************* */ fun createTableElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let (getHalign element.IE_iHAlign) | (getValign element.IE_iVAlign) -> alignflags in let [element.IE_iMarginX element.IE_iMarginY] -> margins in let [element.IE_iNbCol element.IE_iNbRow] -> tablesize in ( if element.IE_bUseTheme then ( set element.IE_tablestr = VUIcreateTableExt obstr.CIP_contstr parent pos size ratiosize align margins tablesize element.IE_colWidths nil alignflags (hd element.IE_lThemeValues); 0; ) else ( set element.IE_tablestr = VUIcreateTable obstr.CIP_contstr parent pos size ratiosize align margins tablesize element.IE_colWidths element.IE_font alignflags; VUIsetTableResource element.IE_tablestr element.IE_iCellColor element.IE_iBorder element.IE_iBorderColor nil nil; ); set element.IE_element = element.IE_tablestr.VUITB_element; VUIsetTable element.IE_tablestr element.IE_data; VUIsetTableCbChange element.IE_tablestr mkfun6 @cbTableElementModified [obstr element]; VUIsetElementIgnoreInput element.IE_element 1; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" cell content"::nil) mkfun6 @cbSetTableElementCellContent element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" cell content"::nil) mkfun6 @cbGetTableElementCellContent element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" next row"::nil) mkfun6 @cbSetTableElementNextRow element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" row"::nil) mkfun6 @cbSetTableElementRow element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" next column"::nil) mkfun6 @cbSetTableElementNextColumn element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" column"::nil) mkfun6 @cbSetTableElementColumn element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" table"::nil) mkfun6 @cbSetTableElementTable element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" table"::nil) mkfun6 @cbGetTableElementTable element; ); 0;; fun createSliderElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in ( set element.IE_sliderstr = VUIcreateSliderExt obstr.CIP_contstr parent pos size ratiosize align element.IE_fMin element.IE_fMax element.IE_fInterval element.IE_iNbDec element.IE_fValue element.IE_iDirection element.IE_iCursorSize element.IE_iTextPos (hd element.IE_lThemeValues); set element.IE_element = element.IE_sliderstr.VUISL_element; if element.IE_bIgnoreClick == 0 then nil else VUIsetElementIgnoreInput element.IE_sliderstr.VUISL_slider 1; VUIsetSliderCbChange element.IE_sliderstr mkfun3 @cbSliderElementModified [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" min value"::nil) mkfun6 @cbSetSliderElementMinValue element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" max value"::nil) mkfun6 @cbSetSliderElementMaxValue element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" value"::nil) mkfun6 @cbSetSliderElementValue element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" value"::nil) mkfun6 @cbGetSliderElementValue element; ); 0;; fun createPictureElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let _checkpack element.IE_sPath -> file in let if (element.IE_iResizeFlag == 0) then VUI_ResStreched else if (element.IE_iResizeFlag == 1) then VUI_ResSplited else VUI_ResKeepRatio -> resizeflag in ( set element.IE_element = VUIcreateFrame obstr.CIP_contstr parent pos size ratiosize align; if (file == nil) then nil else VUIsetElementResource element.IE_element nil nil nil file resizeflag 0 1 element.IE_iNbFrames element.IE_iNbFps; VUIsetElementIgnoreInput element.IE_element 1; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" path"::nil) mkfun6 @cbSetPictureElementPath element; ); 0;; fun createCheckboxElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let VUIsplitThemeRef (hd element.IE_lThemeValues) -> [defname eltname] in let VUIgetThemeDef (getThemeFromInstance obstr.CIP_inst) defname -> defstr in let VUIgetThemeFont defstr eltname -> bfontstr in let if (element.IE_sText == nil) || (!strcmp element.IE_sText "") then size else [24.0 24.0] -> checksize in ( set element.IE_element = VUIcreateFrame obstr.CIP_contstr parent pos size ratiosize align; set element.IE_checkstr = VUIcreateButton obstr.CIP_contstr element.IE_element [0.0 0.0] checksize [0 0 0 0 0 0 0 0] [0 1]; VUIsetElementTheme element.IE_checkstr defstr eltname; VUIsetElementCheckState element.IE_checkstr element.IE_bCheckInit; VUIsetElementCbCheck element.IE_checkstr mkfun3 @cbCheckboxElementClick [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" state"::nil) mkfun6 @cbSetCheckboxElementState element; VUIsetElementText element.IE_element bfontstr element.IE_sText [30 0] [0 0] [0 0] iVUITEXT_HALIGNLEFT|iVUITEXT_VALIGNCENTER VUI_TextStatic 0; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" text"::nil) mkfun6 @cbSetElementText element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" state"::nil) mkfun6 @cbGetCheckboxElementState element; ); 0;; fun cbSelectElement(selectstr, value, p)= let p -> [obstr element] in SendPluginEvent obstr.CIP_inst (strcat element.IE_sName " selected") value nil; 0;; fun createSelectElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in ( set element.IE_selectstr = VUIcreateSelectExt obstr.CIP_contstr parent pos size ratiosize align element.IE_lSelectValues [0 0] [0 0] (hd element.IE_lThemeValues); set element.IE_element = element.IE_selectstr.VUIS_element; VUIsetSelectElementByPos element.IE_selectstr (element.IE_iSelectDefPos - 1); VUIsetSelectCbSelect element.IE_selectstr mkfun3 @cbSelectElement [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" value"::nil) mkfun6 @cbGetSelectElementValue element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" position"::nil) mkfun6 @cbGetSelectElementPosition element; ); 0;; fun createNumberElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in ( set element.IE_floatstr = VUIcreateFloatExt obstr.CIP_contstr parent pos size ratiosize align [0 0] element.IE_fMin element.IE_fMax element.IE_fInterval element.IE_iNbDec element.IE_fValue (hd element.IE_lThemeValues); set element.IE_element = element.IE_floatstr.VUIF_element; VUIsetFloatCbChange element.IE_floatstr mkfun4 @cbFloatElementModified [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" value"::nil) mkfun6 @cbSetFloatElementValue element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" value"::nil) mkfun6 @cbGetFloatElementValue element; ); 0;; fun createButtonElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let _checkpack element.IE_sPath -> file in let if (element.IE_iResizeFlag == 0) then VUI_ResStreched else if (element.IE_iResizeFlag == 1) then VUI_ResSplited else VUI_ResKeepRatio -> resizeflag in ( if element.IE_bUseTheme then ( set element.IE_element = VUIcreateButtonExt obstr.CIP_contstr parent pos size ratiosize align (hd element.IE_lThemeValues); let VUIsplitThemeRef (hd element.IE_lThemeValues) -> [defname eltname] in let VUIgetThemeDef (getThemeFromInstance obstr.CIP_inst) defname -> defstr in let VUIgetThemeFont defstr eltname -> bfontstr in VUIsetElementText element.IE_element bfontstr element.IE_sText [0 0] [0 0] [2 2] iVUITEXT_HALIGNCENTER|iVUITEXT_VALIGNCENTER VUI_TextStatic 0; ) else ( set element.IE_element = VUIcreateButton obstr.CIP_contstr parent pos size ratiosize align; if (file == nil) then nil else VUIsetElementResource element.IE_element nil nil nil file resizeflag element.IE_iStates 1 element.IE_iNbFrames element.IE_iNbFps; let VUIgetThemeDef (getThemeFromInstance obstr.CIP_inst) "common" -> defstr in let if (!strcmp element.IE_sFontName "") then VUIgetThemeFont defstr "button" else VUIcreateFontInterface element.IE_font -> bfontstr in VUIsetElementText element.IE_element bfontstr element.IE_sText [0 0] [0 0] [2 2] iVUITEXT_HALIGNCENTER|iVUITEXT_VALIGNCENTER VUI_TextStatic 0; ); VUIsetElementCbFullClick element.IE_element mkfun6 @cbButtonElementClick [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" text"::nil) mkfun6 @cbSetElementText element; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" picture path"::nil) mkfun6 @cbSetButtonElementPath element; PluginRegisterAction obstr.CIP_inst (strcat "Enable " element.IE_sName) mkfun6 @cbEnableElement element; PluginRegisterAction obstr.CIP_inst (strcat "Disable " element.IE_sName) mkfun6 @cbDisableElement element; ); 0;; fun createTextInputElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let (getHalign element.IE_iHAlign) | (getValign element.IE_iVAlign) -> alignflags in ( set element.IE_element = VUIcreateEditTextExt obstr.CIP_contstr parent pos size ratiosize align nil [5 0] element.IE_sText element.IE_bMultiline (hd element.IE_lThemeValues); VUIsetElementTextPasswordState element.IE_element element.IE_bPassword; VUIsetElementCbValidate element.IE_element mkfun4 @cbTextInputElementValidated [obstr element]; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" content"::nil) mkfun6 @cbSetElementText element; PluginRegisterAction obstr.CIP_inst (strcatn "Get "::element.IE_sName::" content"::nil) mkfun6 @cbGetTextInputElementContent element; PluginRegisterAction obstr.CIP_inst (strcat "Enable " element.IE_sName) mkfun6 @cbEnableElement element; PluginRegisterAction obstr.CIP_inst (strcat "Disable " element.IE_sName) mkfun6 @cbDisableElement element; ); 0;; fun createTextElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in let (getHalign element.IE_iHAlign) | (getValign element.IE_iVAlign) -> alignflags in ( set element.IE_element = VUIcreateFrame obstr.CIP_contstr parent pos size ratiosize align; let if element.IE_bUseTheme then let VUIsplitThemeRef (hd element.IE_lThemeValues) -> [defname eltname] in let VUIgetThemeDef (getThemeFromInstance obstr.CIP_inst) defname -> defstr in VUIgetThemeFont defstr eltname else VUIcreateFontInterface element.IE_font -> bfontstr in VUIsetElementText element.IE_element bfontstr element.IE_sText [0 0] [0 0] [0 0] alignflags VUI_TextStatic element.IE_bMultiline; VUIsetElementIgnoreInput element.IE_element 1; PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" text"::nil) mkfun6 @cbSetElementText element; ); 0;; fun createFrameElement(obstr, element, parent)= let getPosSizeAlign element -> [pos size ratiosize align] in ( set element.IE_element = VUIcreateFrame obstr.CIP_contstr parent pos size ratiosize align; if (!element.IE_bUseTheme) then nil else let VUIsplitThemeRef (hd element.IE_lThemeValues) -> [defname eltname] in let VUIgetThemeDef (getThemeFromInstance obstr.CIP_inst) defname -> defstr in VUIsetElementTheme element.IE_element defstr eltname; if (!element.IE_iScrollMode) then nil else VUIsetElementScroll element.IE_element element.IE_iScrollMode; VUIsetElementIgnoreInput element.IE_element !element.IE_iScrollMode; ); 0;; fun createElements(inst, obstr, elementslist, parent)= if (elementslist == nil) then nil else ( let sizelist elementslist -> size in let 0 -> i in while (i < size) do ( let nth_list elementslist i -> element in ( if element.IE_iType == 0 then // Frame createFrameElement obstr element parent else if element.IE_iType == 1 then // Text createTextElement obstr element parent else if element.IE_iType == 2 then // TextInput createTextInputElement obstr element parent else if element.IE_iType == 3 then // Button createButtonElement obstr element parent else if element.IE_iType == 4 then // Number createNumberElement obstr element parent else if element.IE_iType == 5 then // Select createSelectElement obstr element parent else if element.IE_iType == 6 then // Checkbox createCheckboxElement obstr element parent else if element.IE_iType == 7 then // Picture createPictureElement obstr element parent else if element.IE_iType == 8 then // Slider createSliderElement obstr element parent else if element.IE_iType == 9 then // Table createTableElement obstr element parent else nil; // Generic actions PluginRegisterAction obstr.CIP_inst (strcat "Show " element.IE_sName) mkfun6 @cbShowElement element; PluginRegisterAction obstr.CIP_inst (strcat "Hide " element.IE_sName) mkfun6 @cbHideElement element; if (!obstr.CIP_bAdvanced) then nil else ( PluginRegisterAction obstr.CIP_inst (strcatn "Set "::element.IE_sName::" coordinates"::nil) mkfun6 @cbSetElementCoords element; ); if (!obstr.CIP_bAdvanced) then nil else ( VUIsetElementIgnoreInput element.IE_element 0; VUIsetElementCbClick element.IE_element mkfun6 @cbElementClick [obstr element]; VUIsetElementCbUnClick element.IE_element mkfun6 @cbElementUnClick [obstr element]; VUIsetElementCbMouseIn element.IE_element mkfun2 @cbElementMouseIn [obstr element]; VUIsetElementCbMouseOut element.IE_element mkfun2 @cbElementMouseOut [obstr element]; ); if (element.IE_bShowOnStart) then nil else cbHideElement inst nil nil nil nil element; createElements inst obstr element.IE_lChildren element.IE_element; ); set i = i + 1; ); ); 0;; fun createInterface(inst, obstr)= set obstr.CIP_contstr = crInterfacePosContainer inst obstr.CIP_posstr c3dXsession; if obstr.CIP_bBgColor then VUIsetContainerBackground obstr.CIP_contstr obstr.CIP_iBgColor nil nil nil nil nil nil nil else if (obstr.CIP_sBgPath != nil) && (strcmpi obstr.CIP_sBgPath "") != 0 then VUIsetContainerBackground obstr.CIP_contstr nil nil nil (_checkpack obstr.CIP_sBgPath) obstr.CIP_iBgResizeFlag nil nil nil else nil; VUIsetContainerFadeSpeed obstr.CIP_contstr obstr.CIP_iFadeSpeed; createElements inst obstr obstr.CIP_lElements nil; 0;; fun cbVrChange(inst, viewstr, state, obstr)= if (!obstr.CIP_contstr.VUICNT_bVisible || (obstr.CIP_posstr.IP_iMode != 3)) then nil else let obstr.CIP_posstr.IP_posvrstr -> posvrstr in VUIrefreshVrContainerPosition c3dXsession obstr.CIP_contstr posvrstr.IPVR_tSize posvrstr.IPVR_fScale posvrstr.IPVR_iZorder; 0;; fun cbCameraTeleport(inst, viewstr, camera, obstr)= if (!obstr.CIP_contstr.VUICNT_bVisible || (obstr.CIP_posstr.IP_iMode != 3)) then nil else let obstr.CIP_posstr.IP_posvrstr -> posvrstr in VUIrefreshVrContainerPosition c3dXsession obstr.CIP_contstr posvrstr.IPVR_tSize posvrstr.IPVR_fScale posvrstr.IPVR_iZorder; 0;; /* ********************************************************************************************* / PlugIt Loading and Initialization / ********************************************************************************************* */ fun getWidthsTab(nbcol, colwidths)= let mktab nbcol 0 -> widthstab in let strToListSep colwidths ";" -> wlist in let 0 -> i in ( while (i < nbcol && wlist != nil) do ( set widthstab.(i) = atoi (nth_list wlist i); set i = i + 1; ); widthstab; );; fun getTypeThemeSubsetList(type)= if (type == 0) then // Frame "common/background"::nil else if (type == 1) then // Text "common/label"::nil else if (type == 2) then // Text Input "common/editText"::nil else if (type == 3) then // Button "common/button"::nil else if (type == 4) then // Number "float"::nil else if (type == 5) then // Select "select"::nil else if (type == 6) then // Checkbox "common/check"::nil else if (type == 8) then // Slider "slider"::nil else if (type == 9) then // Table "common/tableCell"::nil else nil;; fun loadInterfaceElement(inst, element, lchildren, suffix)= let atoi (getPluginInstanceParam inst strcat "type" suffix) -> type in let if type == nil then 0 else type -> type in let atof (getPluginInstanceParam inst strcat "xpos" suffix) -> xpos in let if xpos == nil then 0.0 else xpos -> xpos in let atof (getPluginInstanceParam inst strcat "width" suffix) -> width in let if width == nil then 100.0 else width -> width in let atof (getPluginInstanceParam inst strcat "xpos2" suffix) -> xpos2 in let if xpos2 == nil then nil else xpos2 -> xpos2 in let atof (getPluginInstanceParam inst strcat "ypos" suffix) -> ypos in let if ypos == nil then 0.0 else ypos -> ypos in let atof (getPluginInstanceParam inst strcat "height" suffix) -> height in let if height == nil then 100.0 else height -> height in let atof (getPluginInstanceParam inst strcat "ypos2" suffix) -> ypos2 in let if ypos2 == nil then nil else ypos2 -> ypos2 in let atoi (getPluginInstanceParam inst strcat "anchorleft" suffix) -> l in let if l == nil then 0 else l -> l in let atoi (getPluginInstanceParam inst strcat "anchorwidth" suffix) -> w in let if w == nil then 0 else w -> w in let atoi (getPluginInstanceParam inst strcat "anchorright" suffix) -> r in let if r == nil then 1 else r -> r in let atoi (getPluginInstanceParam inst strcat "anchortop" suffix) -> t in let if t == nil then 0 else t -> t in let atoi (getPluginInstanceParam inst strcat "anchorheight" suffix) -> h in let if h == nil then 0 else h -> h in let atoi (getPluginInstanceParam inst strcat "anchorbottom" suffix) -> b in let if b == nil then 1 else b -> b in let atoi (getPluginInstanceParam inst strcat "showonstart" suffix) -> showonstart in let if showonstart == nil then 1 else showonstart -> showonstart in let atoi (getPluginInstanceParam inst strcat "usetheme" suffix) -> usetheme in let if usetheme == nil then 0 else usetheme -> usetheme in let loadThemeEltSelectorValuesSuffix inst (getTypeThemeSubsetList type) suffix -> lthemevalues in let atoi (getPluginInstanceParam inst strcat "scroll" suffix) -> scroll in let if scroll == nil then 0 else scroll -> scroll in let getPluginInstanceParam inst strcat "text" suffix -> text in let if text == nil then "" else text -> text in let getPluginInstanceParam inst strcat "fontname" suffix -> fontname in let if fontname == nil then "Sans" else fontname -> fontname in let atoi (getPluginInstanceParam inst strcat "fontsize" suffix) -> fontsize in let if fontsize == nil then 10 else fontsize -> fontsize in let atoi (getPluginInstanceParam inst strcat "fontcolor" suffix) -> fontcolor in let if fontcolor == nil then 0x000000 else fontcolor -> fontcolor in let atoi (getPluginInstanceParam inst strcat "fontflags" suffix) -> fontflags in let if fontflags == nil then 0 else fontflags -> fontflags in let atoi (getPluginInstanceParam inst strcat "halign" suffix) -> halign in let if halign == nil then 0 else halign -> halign in let atoi (getPluginInstanceParam inst strcat "valign" suffix) -> valign in let if valign == nil then 0 else valign -> valign in let atoi (getPluginInstanceParam inst strcat "multiline" suffix) -> multiline in let if multiline == nil then 0 else multiline -> multiline in let atoi (getPluginInstanceParam inst strcat "password" suffix) -> password in let if password == nil then 0 else password -> password in let atoi (getPluginInstanceParam inst strcat "preset" suffix) -> preset in let if preset == nil then 0 else preset -> preset in let atoi (getPluginInstanceParam inst strcat "states" suffix) -> states in let if states == nil then 0 else states -> states in let atof (getPluginInstanceParam inst strcat "value" suffix) -> value in let if value == nil then 0.0 else value -> value in let atof (getPluginInstanceParam inst strcat "minval" suffix) -> minval in let if minval == nil then 0.0 else minval -> minval in let atof (getPluginInstanceParam inst strcat "maxval" suffix) -> maxval in let if maxval == nil then 10000.0 else maxval -> maxval in let atof (getPluginInstanceParam inst strcat "interval" suffix) -> interval in let if interval == nil then 1.0 else interval -> interval in let atoi (getPluginInstanceParam inst strcat "nbdec" suffix) -> nbdec in let if nbdec == nil then 1 else nbdec -> nbdec in let getPluginInstanceParam inst strcat "selectvalues" suffix -> selvalstring in let if selvalstring == nil then nil else strToListSep selvalstring ";;" -> selectvalues in let atoi (getPluginInstanceParam inst strcat "defpos" suffix) -> defpos in let if defpos == nil then 1 else defpos -> defpos in let atoi (getPluginInstanceParam inst strcat "checkinit" suffix) -> checkinit in let if checkinit == nil then 0 else checkinit -> checkinit in let getPluginInstanceParam inst strcat "path" suffix -> path in let if path == nil then "" else path -> path in let atoi (getPluginInstanceParam inst strcat "resizeflag" suffix) -> resizeflag in let if resizeflag == nil then 0 else resizeflag -> resizeflag in let atoi (getPluginInstanceParam inst strcat "nbframes" suffix) -> nbframes in let if nbframes == nil then 1 else nbframes -> nbframes in let atoi (getPluginInstanceParam inst strcat "nbfps" suffix) -> nbfps in let if nbfps == nil then 0 else nbfps -> nbfps in let atoi (getPluginInstanceParam inst strcat "direction" suffix) -> direction in let if direction == nil then 0 else direction -> direction in let atoi (getPluginInstanceParam inst strcat "cursorwidth" suffix) -> cursorwidth in let if cursorwidth == nil then 20 else cursorwidth -> cursorwidth in let atoi (getPluginInstanceParam inst strcat "textpos" suffix) -> textpos in let if textpos == nil then 0 else textpos -> textpos in let atoi (getPluginInstanceParam inst strcat "ignoreclick" suffix) -> ignoreclick in let if ignoreclick == nil then 0 else ignoreclick -> ignoreclick in let atoi (getPluginInstanceParam inst strcat "nbrow" suffix) -> nbrow in let if (nbrow == nil) then 3 else nbrow -> nbrow in let atoi (getPluginInstanceParam inst strcat "nbcol" suffix) -> nbcol in let if (nbcol == nil) then 4 else nbcol -> nbcol in let atoi (getPluginInstanceParam inst strcat "xmargin" suffix) -> xmargin in let if (xmargin == nil) then 5 else xmargin -> xmargin in let atoi (getPluginInstanceParam inst strcat "ymargin" suffix) -> ymargin in let if (ymargin == nil) then 5 else ymargin -> ymargin in let atoi (getPluginInstanceParam inst strcat "cellcolor" suffix) -> cellcolor in let if cellcolor == nil then 0xffffffff else cellcolor -> cellcolor in let atoi (getPluginInstanceParam inst strcat "border" suffix) -> border in let if (border == nil) then 1 else border -> border in let atoi (getPluginInstanceParam inst strcat "bordercolor" suffix) -> bordercolor in let if bordercolor == nil then 0x000000ff else bordercolor -> bordercolor in let (getPluginInstanceParam inst strcat "colwidths" suffix) -> colwidths in let if colwidths == nil then nil else colwidths -> colwidths in let (getPluginInstanceParam inst strcat "data" suffix) -> data in let if data == nil then nil else data -> data in let if (usetheme || ((type != 1) && (type != 3) && (type != 9))) then nil else VUIcreateFont fontname fontsize (if (!fontflags) then 0 else iVUITEXT_BOLD) fontcolor 1 -> font in ( set element.IE_font = font; set element.IE_iType = type; set element.IE_tPosSize = [xpos width xpos2 ypos height ypos2]; set element.IE_tAnchors = [l w r t h b]; set element.IE_tInitPosSize = [xpos width xpos2 ypos height ypos2]; set element.IE_tInitAnchors = [l w r t h b]; set element.IE_bShowOnStart = showonstart; set element.IE_bUseTheme = usetheme; set element.IE_lThemeValues = lthemevalues; set element.IE_iScrollMode = scroll; set element.IE_sText = text; set element.IE_sFontName = fontname; set element.IE_iFontSize = fontsize; set element.IE_iFontColor = fontcolor; set element.IE_iFontFlags = fontflags; set element.IE_iHAlign = halign; set element.IE_iVAlign = valign; set element.IE_bMultiline = multiline; set element.IE_bPassword = password; set element.IE_iPreset = preset; set element.IE_iStates = states; set element.IE_fValue = value; set element.IE_fMin = minval; set element.IE_fMax = maxval; set element.IE_fInterval = interval; set element.IE_iNbDec = nbdec; set element.IE_lSelectValues = selectvalues; set element.IE_iSelectDefPos = defpos; set element.IE_bCheckInit = checkinit; set element.IE_sPath = path; set element.IE_iResizeFlag = resizeflag; set element.IE_iNbFrames = nbframes; set element.IE_iNbFps = nbfps; set element.IE_iDirection = direction; set element.IE_iCursorSize = cursorwidth; set element.IE_iTextPos = textpos; set element.IE_bIgnoreClick = ignoreclick; set element.IE_iNbRow = nbrow; set element.IE_iNbCol = nbcol; set element.IE_iMarginX = xmargin; set element.IE_iMarginY = ymargin; set element.IE_iCellColor = cellcolor; set element.IE_iBorder = border; set element.IE_iBorderColor = bordercolor; set element.IE_data = readCSVdataToTabSized data nil nbrow nbcol; set element.IE_colWidths = getWidthsTab nbcol colwidths; set element.IE_lChildren = lchildren; ); 0;; fun loadElementsList(inst, parent, depth, suffix)= let if suffix == nil then "" else suffix -> suffix in let if depth == nil then 0 else depth -> depth in let nil -> lelements in let 0 -> i in let 0 -> end in ( while end != 1 do ( let (strcatn suffix::"_"::(itoa i)::nil) -> newsuffix in let getPluginInstanceParam inst strcat "item" newsuffix -> name in ( if name != nil then let mkInterfaceElement [nil nil nil nil nil nil parent nil name depth newsuffix nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil 0 0 nil] -> newElement in let loadElementsList inst newElement (depth + 1) newsuffix -> lchildren in ( loadInterfaceElement inst newElement lchildren newsuffix; set lelements = newElement::lelements; set i = i + 1; ) else set end = 1; ); ); revertlist lelements; );; fun newOb(inst)= let loadInterfacePos inst c3dXsession -> posstr in let loadElementsList inst nil nil nil -> lelements in let atoi (getPluginInstanceParam inst "isbcolor") -> isbcolor in let if (isbcolor == nil) then 0 else isbcolor -> isbcolor in let atoi (getPluginInstanceParam inst "bcolor") -> bcolor in let if (bcolor == nil) then 0x000000ff else bcolor -> bcolor in let getPluginInstanceParam inst "bgpath" -> bgpath in let if (bgpath == nil) then "" else bgpath -> bgpath in let atoi getPluginInstanceParam inst "bgresizeflag" -> bgresizeflag in let if (bgresizeflag == nil) then 0 else bgresizeflag -> bgresizeflag in let if (bgresizeflag == 0) then VUI_ResStreched else if (bgresizeflag == 1) then VUI_ResSplited else VUI_ResKeepRatio -> bgresizeflag in let atoi (getPluginInstanceParam inst "advanced") -> advanced in let if (advanced == nil) then 0 else advanced -> advanced in let atoi (getPluginInstanceParam inst "fadespeed") -> fadespeed in let if (fadespeed == nil) then 0 else fadespeed -> fadespeed in let atoi (getPluginInstanceParam inst "show") -> show in let if (show == nil) then 1 else show -> show in let mkCInterfacePlugit [inst posstr nil isbcolor bcolor bgpath bgresizeflag advanced fadespeed lelements] -> obstr in ( createInterface inst obstr; if !show then nil else cbShow inst nil nil nil nil obstr; PluginRegisterAction inst "Show" mkfun6 @cbShow obstr; PluginRegisterAction inst "Hide" mkfun6 @cbHide obstr; PluginRegisterAction inst "Reset" mkfun6 @cbReset obstr; PluginRegisterAction inst "Reset element" mkfun6 @cbResetElement obstr; setPluginInstanceCbVrModeChanged inst mkfun4 @cbVrChange obstr; setPluginInstanceCbCameraTeleport inst mkfun4 @cbCameraTeleport obstr; setPluginInstanceCbDel inst mkfun2 @deleteOb obstr; ); 0;; fun IniPlug(file)= VUIsetEnable c3dXsession 1; PlugRegister @newOb nil; setPluginEditor @dynamicedit; 0;;