libcm is a C development framework with an emphasis on audio signal processing applications.
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149
  1. //| Copyright: (C) 2009-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #include "cmGlobal.h"
  4. #include "cmRpt.h"
  5. #include "cmErr.h"
  6. #include "cmCtx.h"
  7. #include "cmMem.h"
  8. #include "cmMallocDebug.h"
  9. #include "cmLinkedHeap.h"
  10. #include "cmArray.h"
  11. #include "cmJson.h"
  12. #include "cmRtSysMsg.h"
  13. #include "cmUiDrvr.h"
  14. #include "cmUi.h"
  15. #include "cmText.h"
  16. typedef struct
  17. {
  18. int x;
  19. int y;
  20. int w;
  21. int h;
  22. } cmUiRect_t;
  23. enum
  24. {
  25. kUseRectUiFl = 0x01,
  26. kPlaceRightUiFl = 0x02, // place only next control to right of prev control
  27. kPlaceBelowUiFl = 0x04, // place only next control to below prev control
  28. kPlaceBaseRowUiFl = 0x08, // place only next control at base row
  29. kNextWHUiFl = 0x10, // size next control according to nextW,nextH
  30. kFillRowsUiFl = 0x20, // current dflt fill direction
  31. };
  32. typedef struct cmUiApp_str
  33. {
  34. unsigned appId; // app id and index into cmUI_t.appArrH[].
  35. unsigned rtSubIdx; //
  36. bool activeFl; // true if this app recd is active and valid
  37. cmArrayH_t ctlArrH; // cmUiCtl_t[]
  38. cmArrayH_t pnlArrH; // cmUiPanel_t[]
  39. } cmUiApp_t;
  40. struct cmUiCtl_str;
  41. typedef struct cmUiPanel_str
  42. {
  43. cmUiApp_t* appPtr; // owner app.
  44. struct cmUiCtl_str* ctl; // control recd assoc'd with this panel
  45. unsigned flags; // See kXXXUiFl above
  46. unsigned usrId; // app. supplied id
  47. cmUiRect_t rect; // rect to position next control (only used if kUseRectUiFl is set)
  48. cmUiRect_t prevRect;
  49. int baseCol;
  50. int baseRow;
  51. int dfltW;
  52. int dfltH;
  53. int nextW;
  54. int nextH;
  55. int dfltHBorder;
  56. int dfltVBorder;
  57. int nextHBorder;
  58. int nextVBorder;
  59. } cmUiPanel_t;
  60. typedef struct
  61. {
  62. unsigned id;
  63. cmChar_t* label;
  64. } cmUiListEle_t;
  65. typedef struct cmUiCtl_str
  66. {
  67. cmUiCId_t cId; // control type and used to decode the value union below.
  68. unsigned usrId; // control instance id and index into cmUiApp_t.ctlArrH[].
  69. unsigned panelId; // panel this ctl belongs to
  70. cmArrayH_t idArrH; // id's associated with each sub-element of this control (used by menu's, list's, etc...)
  71. cmUiDriverArg_t arg; // cached callback arg for this control
  72. // current value of this control
  73. union
  74. {
  75. int ival;
  76. double fval;
  77. cmChar_t* sval;
  78. cmUiPanel_t* pnl;
  79. } u;
  80. int (*getInt)( struct cmUiCtl_str* c );
  81. double (*getDbl)( struct cmUiCtl_str* c );
  82. const cmChar_t* (*getStr)( struct cmUiCtl_str* c );
  83. void (*setInt)( struct cmUiCtl_str* c, int v );
  84. void (*setDbl)( struct cmUiCtl_str* c, double v );
  85. void (*setStr)( struct cmUiCtl_str* c, const cmChar_t* s );
  86. } cmUiCtl_t;
  87. typedef struct
  88. {
  89. cmErr_t err; //
  90. cmCtx_t* ctx; // Global context.
  91. cmUiDriverFunc_t drvr; // Driver callback function
  92. void* drvrArg; // Driver callback function arg.
  93. int panelW; // Panel width.
  94. int panelH; // Panel height
  95. cmUiDriverFunc_t cbFunc; // Client callback function
  96. void* cbArg; //
  97. cmArrayH_t appArrH; // cmUiApp_t[]
  98. cmUiCtl_t dummy; // dummy recd used to create controls which will never be accessed after creation (like read-only labels)
  99. } cmUi_t;
  100. cmUiH_t cmUiNullHandle = cmSTATIC_NULL_HANDLE;
  101. cmUi_t* _cmUiHandleToPtr( cmUiH_t h )
  102. {
  103. cmUi_t* p = (cmUi_t*)h.h;
  104. assert(p != NULL );
  105. return p;
  106. }
  107. //---------------------------------------------------------------
  108. // int accessors
  109. int _cmUiGetIntFromInt( cmUiCtl_t* ctl )
  110. { return ctl->u.ival; }
  111. double _cmUiGetDblFromInt( cmUiCtl_t* ctl )
  112. { return ctl->u.ival; }
  113. const cmChar_t* _cmUiGetStrFromInt( cmUiCtl_t* ctl )
  114. { assert(0); return ""; }
  115. void _cmUiSetIntFromInt( cmUiCtl_t* ctl, int v )
  116. { ctl->u.ival = v; }
  117. void _cmUiSetIntFromDbl( cmUiCtl_t* ctl, double v )
  118. { ctl->u.ival = round(v); }
  119. void _cmUiSetIntFromStr( cmUiCtl_t* ctl, const cmChar_t* v )
  120. { assert(0); }
  121. void _cmUiSetIntAccessors( cmUiCtl_t* ctl )
  122. {
  123. ctl->getInt = _cmUiGetIntFromInt;
  124. ctl->getDbl = _cmUiGetDblFromInt;
  125. ctl->getStr = _cmUiGetStrFromInt;
  126. ctl->setInt = _cmUiSetIntFromInt;
  127. ctl->setDbl = _cmUiSetIntFromDbl;
  128. ctl->setStr = _cmUiSetIntFromStr;
  129. }
  130. //---------------------------------------------------------------
  131. // double accessors
  132. int _cmUiGetIntFromDbl( cmUiCtl_t* ctl )
  133. { return round(ctl->u.fval); }
  134. double _cmUiGetDblFromDbl( cmUiCtl_t* ctl )
  135. { return ctl->u.fval; }
  136. const cmChar_t* _cmUiGetStrFromDbl( cmUiCtl_t* ctl )
  137. { assert(0); return ""; }
  138. void _cmUiSetDblFromInt( cmUiCtl_t* ctl, int v )
  139. { ctl->u.fval = v; }
  140. void _cmUiSetDblFromDbl( cmUiCtl_t* ctl, double v )
  141. { ctl->u.fval = v; }
  142. void _cmUiSetDblFromStr( cmUiCtl_t* ctl, const cmChar_t* v )
  143. { assert(0); }
  144. void _cmUiSetDblAccessors( cmUiCtl_t* ctl )
  145. {
  146. ctl->getInt = _cmUiGetIntFromDbl;
  147. ctl->getDbl = _cmUiGetDblFromDbl;
  148. ctl->getStr = _cmUiGetStrFromDbl;
  149. ctl->setInt = _cmUiSetDblFromInt;
  150. ctl->setDbl = _cmUiSetDblFromDbl;
  151. ctl->setStr = _cmUiSetDblFromStr;
  152. }
  153. //---------------------------------------------------------------
  154. // string accessors
  155. int _cmUiGetIntFromStr( cmUiCtl_t* ctl )
  156. { assert(0); return -1; }
  157. double _cmUiGetDblFromStr( cmUiCtl_t* ctl )
  158. { assert(0); return -1; }
  159. const cmChar_t* _cmUiGetStrFromStr( cmUiCtl_t* ctl )
  160. { return ctl->u.sval; }
  161. void _cmUiSetStrFromInt( cmUiCtl_t* ctl, int v )
  162. { assert(0); }
  163. void _cmUiSetStrFromDbl( cmUiCtl_t* ctl, double v )
  164. { assert(0); }
  165. void _cmUiSetStrFromStr( cmUiCtl_t* ctl, const cmChar_t* v )
  166. { ctl->u.sval = cmMemResizeStr(ctl->u.sval, v==NULL ? "" : v); }
  167. void _cmUiSetStrAccessors( cmUiCtl_t* ctl )
  168. {
  169. ctl->getInt = _cmUiGetIntFromStr;
  170. ctl->getDbl = _cmUiGetDblFromStr;
  171. ctl->getStr = _cmUiGetStrFromStr;
  172. ctl->setInt = _cmUiSetStrFromInt;
  173. ctl->setDbl = _cmUiSetStrFromDbl;
  174. ctl->setStr = _cmUiSetStrFromStr;
  175. }
  176. //---------------------------------------------------------------
  177. cmUiRC_t _cmUiCallDriver( cmUi_t* p, cmUiDId_t dId, cmUiCtl_t* ctl, unsigned flags )
  178. {
  179. cmUiRC_t rc = kOkUiRC;
  180. if( p->drvr != NULL )
  181. {
  182. unsigned orgFlags = ctl->arg.flags;
  183. ctl->arg.dId = dId;
  184. ctl->arg.flags |= flags;
  185. ctl->arg.hdr.selId = kUiDrvrSelRtId;
  186. rc = p->drvr(p->drvrArg,&ctl->arg);
  187. ctl->arg.flags = orgFlags;
  188. if( rc != kOkUiRC )
  189. rc = cmErrMsg(&p->err,kDrvrErrUiRC,"UI manager driver error.");
  190. }
  191. return rc;
  192. }
  193. cmUiRC_t _cmUiSetDriverValueInt( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, int value )
  194. {
  195. ctl->setInt(ctl,value);
  196. ctl->arg.ival = value;
  197. return _cmUiCallDriver(p, kSetValDId, ctl, flag | kIvalUiFl);
  198. }
  199. cmUiRC_t _cmUiSetDriverValueDouble( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, double value )
  200. {
  201. ctl->setDbl(ctl,value);
  202. ctl->arg.fval = value;
  203. return _cmUiCallDriver(p, kSetValDId, ctl, flag | kFvalUiFl);
  204. }
  205. cmUiRC_t _cmUiSetDriverValueStr( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, const cmChar_t* value )
  206. {
  207. ctl->setStr(ctl,value);
  208. ctl->arg.sval = value;
  209. return _cmUiCallDriver(p, kSetValDId, ctl, flag | kSvalUiFl);
  210. }
  211. cmUiRC_t _cmUiSetDriverValueIntAndStr( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, int ival, const cmChar_t* sval )
  212. {
  213. ctl->arg.ival = ival;
  214. ctl->arg.sval = sval;
  215. return _cmUiCallDriver(p, kSetValDId, ctl, flag | kIvalUiFl|kSvalUiFl);
  216. }
  217. //---------------------------------------------------------------
  218. cmUiRC_t _cmUiFindApp( cmUi_t* p, unsigned appId, cmUiApp_t** appRef, bool errFl )
  219. {
  220. cmUiRC_t rc = kOkUiRC;
  221. cmUiApp_t* ap = NULL;
  222. // verify that the appId is a valid index
  223. if( appId < cmArrayCount(p->appArrH) )
  224. ap = cmArrayPtr(cmUiApp_t,p->appArrH,appId);
  225. // if the app record was not already allocated
  226. if( ap != NULL && ap->activeFl == false )
  227. ap = NULL;
  228. // report errors
  229. if( ap == NULL )
  230. {
  231. rc = kAppNotFoundUiRC;
  232. if( errFl )
  233. cmErrMsg(&p->err,rc,"App %i not found.", appId );
  234. }
  235. *appRef = ap;
  236. return rc;
  237. }
  238. cmUiRC_t _cmUiFindCtl( cmUi_t* p, unsigned appId, unsigned usrId, cmUiCtl_t** ctlRef, bool errFl )
  239. {
  240. cmUiRC_t rc = kOkUiRC;
  241. cmUiApp_t* ap = NULL;
  242. cmUiCtl_t* ctl = NULL;
  243. // find the app this ctl belongs to
  244. if(( rc =_cmUiFindApp(p,appId,&ap,errFl)) != kOkUiRC )
  245. goto errLabel;
  246. // verify that the usrId is a valid index
  247. if( usrId < cmArrayCount(ap->ctlArrH) )
  248. ctl = cmArrayPtr(cmUiCtl_t,ap->ctlArrH,usrId);
  249. // verify that the usrId of the recd matches the requested usr id
  250. if( ctl!=NULL && ctl->usrId != usrId )
  251. ctl = NULL;
  252. // report errors
  253. if( ctl==NULL )
  254. {
  255. rc = kCtlNotFoundUiRC;
  256. if( errFl )
  257. cmErrMsg(&p->err,rc,"Control %i not found.",usrId);
  258. }
  259. errLabel:
  260. *ctlRef = ctl;
  261. return rc;
  262. }
  263. cmUiRC_t _cmUiFastFindCtl( cmUi_t* p, unsigned appId, unsigned usrId, cmUiCtl_t** ctlRef, bool errFl )
  264. {
  265. assert( appId < cmArrayCount(p->appArrH) );
  266. cmUiApp_t* ap = cmArrayPtr(cmUiApp_t,p->appArrH,appId);
  267. assert( ap->activeFl && usrId < cmArrayCount(ap->ctlArrH) );
  268. *ctlRef = cmArrayPtr(cmUiCtl_t,ap->ctlArrH,usrId);
  269. assert( (*ctlRef)->usrId == usrId && (*ctlRef)->arg.appId == ap->appId );
  270. return kOkUiRC;
  271. }
  272. cmUiRC_t _cmUiFindPanel( cmUi_t* p, unsigned appId, unsigned panelId, cmUiPanel_t** ppRef, bool errFl )
  273. {
  274. cmUiRC_t rc = kOkUiRC;
  275. cmUiApp_t* ap = NULL;
  276. unsigned i,n;
  277. *ppRef = NULL;
  278. // find the app this ctl belongs to
  279. if(( rc =_cmUiFindApp(p,appId,&ap,errFl)) != kOkUiRC )
  280. goto errLabel;
  281. n = cmArrayCount(ap->pnlArrH);
  282. for(i=0; i<n; ++i)
  283. if( (*ppRef = cmArrayPtr(cmUiPanel_t,ap->pnlArrH,i))->usrId == panelId )
  284. break;
  285. errLabel:
  286. if(*ppRef == NULL)
  287. {
  288. rc = kPanelNotFoundUiRC;
  289. if( errFl )
  290. cmErrMsg(&p->err,rc,"Panel %i was not found.",panelId);
  291. }
  292. return rc;
  293. }
  294. //---------------------------------------------------------------
  295. void _cmUiReleaseListEles( cmUiCtl_t* ctl )
  296. {
  297. if( cmArrayIsValid(ctl->idArrH) )
  298. {
  299. unsigned n = cmArrayCount(ctl->idArrH);
  300. unsigned i;
  301. for(i=0; i<n; ++i)
  302. cmMemFree( cmArrayPtr(cmUiListEle_t,ctl->idArrH,i)->label );
  303. }
  304. }
  305. cmUiRC_t _cmUiDestroyCtl( cmUi_t* p, cmUiCtl_t* ctl, bool drvrFl )
  306. {
  307. cmUiRC_t rc = kOkUiRC;
  308. if( drvrFl )
  309. rc = _cmUiCallDriver(p,kDestroyCtlDId,ctl,0);
  310. switch(ctl->cId)
  311. {
  312. case kLabelUiCId:
  313. case kStringUiCId:
  314. case kConsoleUiCId:
  315. case kFilenameUiCId:
  316. case kDirUiCId:
  317. cmMemFree(ctl->u.sval);
  318. break;
  319. default:
  320. break;
  321. }
  322. ctl->cId = kInvalidUiCId;
  323. ctl->usrId = cmInvalidId;
  324. ctl->panelId = cmInvalidId;
  325. _cmUiReleaseListEles(ctl);
  326. cmArrayRelease(&ctl->idArrH);
  327. return rc;
  328. }
  329. cmUiRC_t _cmUiDestroyPanel( cmUi_t* p, unsigned appId, unsigned panelId )
  330. {
  331. cmUiRC_t rc = kOkUiRC;
  332. cmUiPanel_t* pp = NULL;
  333. // get the panel recd ptr
  334. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  335. return rc;
  336. cmUiApp_t* ap = pp->appPtr;
  337. // notify the driver to destroy the panel
  338. if((rc = _cmUiCallDriver(p,kDestroyCtlDId,pp->ctl,0)) != kOkUiRC )
  339. return rc;
  340. cmUiCtl_t* ctl = NULL;
  341. unsigned i = 0;
  342. unsigned n = cmArrayCount(ap->ctlArrH);
  343. cmUiRC_t rc0;
  344. // Destroy all controls that belong to this panel.
  345. // Notice that _cmUiDestroyCtl() does not need to call the driver
  346. // because destroying the drivers panel has implicitely also
  347. // destroyed all the contols assigned to it.
  348. for(i=0; i<n; ++i)
  349. if( _cmUiFindCtl(p,appId,i,&ctl,false) == kOkUiRC && ctl != NULL && ctl->panelId == panelId)
  350. if((rc0 = _cmUiDestroyCtl(p,ctl,false)) != kOkUiRC )
  351. rc = rc0;
  352. // release the panel record
  353. pp->appPtr = NULL;
  354. pp->usrId = cmInvalidId;
  355. return rc;
  356. }
  357. cmUiRC_t _cmUiDestroyApp( cmUi_t* p, unsigned appId, bool errFl )
  358. {
  359. cmUiRC_t rc = kOkUiRC;
  360. cmUiRC_t rc0;
  361. cmUiApp_t* ap;
  362. // find the app to destroy
  363. if( _cmUiFindApp(p,appId,&ap,false) != kOkUiRC )
  364. {
  365. if( errFl )
  366. rc = cmErrMsg(&p->err,kAppNotFoundUiRC,"The app %i was not found for destruction.",appId);
  367. goto errLabel;
  368. }
  369. assert( ap != NULL );
  370. // destroy all panels owned by this app
  371. unsigned i;
  372. unsigned n = cmArrayCount(ap->pnlArrH);
  373. for(i=0; i<n; ++i)
  374. {
  375. cmUiPanel_t* pp = cmArrayPtr(cmUiPanel_t,ap->pnlArrH,i);
  376. if( pp->usrId != cmInvalidId )
  377. if((rc0 = _cmUiDestroyPanel(p,appId,pp->usrId)) != kOkUiRC )
  378. rc = rc0;
  379. }
  380. ap->appId = -1;
  381. ap->activeFl = false;
  382. cmArrayRelease(&ap->ctlArrH);
  383. cmArrayRelease(&ap->pnlArrH);
  384. errLabel:
  385. //p->curAppId = orgAppId;
  386. return rc;
  387. }
  388. cmUiRC_t _cmUiDestroyAllApps( cmUi_t* p )
  389. {
  390. cmUiRC_t rc = kOkUiRC;
  391. unsigned n = cmArrayCount(p->appArrH);
  392. unsigned i;
  393. for(i=0; i<n; ++i)
  394. {
  395. cmUiRC_t rc0;
  396. if((rc0 = _cmUiDestroyApp(p,i,false)) != kOkUiRC )
  397. rc = rc0;
  398. }
  399. cmArrayClear(p->appArrH,false);
  400. return rc;
  401. }
  402. //---------------------------------------------------------------
  403. cmUiRC_t _cmUiGetCtlXYWH( cmUi_t* p, cmUiDriverArg_t* a, cmUiPanel_t* pp )
  404. {
  405. if( cmIsFlag(pp->flags,kUseRectUiFl ) )
  406. {
  407. pp->flags = cmClrFlag(pp->flags,kUseRectUiFl);
  408. a->x = pp->rect.x;
  409. a->y = pp->rect.y;
  410. a->w = pp->rect.w;
  411. a->h = pp->rect.h;
  412. return kOkUiRC;
  413. }
  414. if( pp->prevRect.x == -1 )
  415. pp->prevRect.x = pp->baseCol;
  416. if( pp->prevRect.y == -1 )
  417. pp->prevRect.y = pp->baseRow;
  418. if( pp->prevRect.w == -1 )
  419. pp->prevRect.w = 0;
  420. if( pp->prevRect.h == -1 )
  421. pp->prevRect.h = 0;
  422. // Get direction flag. Fill across rows? or down columns?
  423. bool fillRowFl = cmIsFlag(pp->flags,kFillRowsUiFl);
  424. // the 'place to right' flag overrides the directon flag for just this instance
  425. if( cmIsFlag(pp->flags,kPlaceRightUiFl ) )
  426. fillRowFl = true;
  427. // the 'place under' flag overides the direction flag for just this instance
  428. if( cmIsFlag(pp->flags,kPlaceBelowUiFl ) )
  429. fillRowFl = false;
  430. // set x coord - if filling acros rows ...
  431. if( fillRowFl )
  432. a->x = pp->prevRect.x + pp->prevRect.w + pp->nextHBorder;
  433. else
  434. a->x = pp->baseCol; // ... or down columns
  435. // if a new column was set then move to the base row
  436. if( cmIsFlag(pp->flags,kPlaceBaseRowUiFl) )
  437. a->y = pp->baseRow;
  438. else
  439. {
  440. // set y coord - if filling acros rows ...
  441. if( fillRowFl )
  442. a->y = pp->prevRect.y;
  443. else
  444. a->y = pp->prevRect.y + pp->prevRect.h + pp->nextVBorder; // ... or down columns
  445. }
  446. a->w = pp->nextW;
  447. a->h = pp->nextH;
  448. pp->prevRect.x = a->x;
  449. pp->prevRect.y = a->y;
  450. pp->prevRect.w = a->w;
  451. pp->prevRect.h = a->h;
  452. pp->nextW = pp->dfltW;
  453. pp->nextH = pp->dfltH;
  454. pp->nextHBorder = pp->dfltHBorder;
  455. pp->nextVBorder = pp->dfltVBorder;
  456. pp->flags = cmClrFlag(pp->flags,kNextWHUiFl | kPlaceRightUiFl | kPlaceBelowUiFl | kPlaceBaseRowUiFl );
  457. return kOkUiRC;
  458. }
  459. cmUiRC_t _cmUiCreateCtl( cmUi_t* p, unsigned appId, unsigned panelId, cmUiCId_t cId, unsigned usrId, const cmChar_t* label, unsigned flags, cmUiCtl_t** ctlRef )
  460. {
  461. cmUiRC_t rc;
  462. cmUiPanel_t* pp = NULL;
  463. cmUiApp_t* ap = NULL;
  464. if( ctlRef != NULL )
  465. *ctlRef = NULL;
  466. // locate the app
  467. if((rc = _cmUiFindApp(p,appId,&ap,true)) != kOkUiRC )
  468. return rc;
  469. // locate the panel the control belongs to
  470. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  471. return rc;
  472. // get the new ctl record
  473. cmUiCtl_t* ctl;
  474. if( usrId == cmInvalidId )
  475. {
  476. ctl = &p->dummy;
  477. memset(ctl,0,sizeof(*ctl));
  478. }
  479. else
  480. {
  481. if( cmArrayIsValid(ap->ctlArrH) == false || usrId >= cmArrayCount(ap->ctlArrH) )
  482. ctl = cmArrayClr(cmUiCtl_t,ap->ctlArrH,usrId);
  483. else
  484. {
  485. ctl = cmArrayPtr(cmUiCtl_t,ap->ctlArrH,usrId);
  486. // if the ctl recd is already in use
  487. if( ctl->cId != kInvalidUiCId )
  488. _cmUiDestroyCtl(p,ctl,true);
  489. }
  490. }
  491. // setup this controls cached callback arg record
  492. cmUiDriverArgSetup(&ctl->arg,ap->rtSubIdx,cmInvalidId,kInvalidDId,ap->appId,usrId,panelId,cId,flags,0,0,label,-1,-1,-1,-1);
  493. // calc the control location - for non-panel controls
  494. if( cId != kPanelUiCId )
  495. if((rc = _cmUiGetCtlXYWH(p,&ctl->arg,pp)) != kOkUiRC )
  496. return rc;
  497. // setup the new ctl record
  498. ctl->cId = cId;
  499. ctl->usrId = usrId;
  500. ctl->panelId = panelId;
  501. // display-only controls don't need an id array
  502. if( usrId != cmInvalidId )
  503. cmArrayAlloc(p->ctx,&ctl->idArrH,sizeof(cmUiListEle_t));
  504. if( ctlRef != NULL )
  505. *ctlRef = ctl;
  506. return _cmUiCallDriver(p,kCreateCtlDId,ctl,0);
  507. }
  508. cmUiRC_t cmUiAlloc(
  509. cmCtx_t* ctx,
  510. cmUiH_t* uiHPtr,
  511. cmUiDriverFunc_t drvrFunc,
  512. void* drvrArg,
  513. cmUiDriverFunc_t cbFunc,
  514. void * cbArg)
  515. {
  516. cmUiRC_t rc;
  517. if((rc = cmUiFree(uiHPtr)) != kOkUiRC )
  518. return rc;
  519. cmUi_t* p = cmMemAllocZ(cmUi_t,1);
  520. cmErrSetup(&p->err,&ctx->rpt,"cmUi");
  521. p->ctx = ctx;
  522. p->drvr = drvrFunc;
  523. p->drvrArg = drvrArg;
  524. p->cbFunc = cbFunc;
  525. p->cbArg = cbArg;
  526. p->panelW = 1000;
  527. p->panelH = 500;
  528. cmArrayAlloc(p->ctx,&p->appArrH,sizeof(cmUiApp_t));
  529. uiHPtr->h = p;
  530. return rc;
  531. }
  532. cmUiRC_t cmUiFree( cmUiH_t* hp )
  533. {
  534. cmUiRC_t rc = kOkUiRC;
  535. if( hp == NULL || cmUiIsValid(*hp) == false )
  536. return kOkUiRC;
  537. cmUi_t* p = _cmUiHandleToPtr(*hp);
  538. if((rc = _cmUiDestroyAllApps(p)) != kOkUiRC )
  539. return rc;
  540. cmArrayRelease(&p->appArrH);
  541. cmMemFree(p);
  542. hp->h = NULL;
  543. return rc;
  544. }
  545. bool cmUiIsValid( cmUiH_t h )
  546. { return h.h != NULL; }
  547. void cmUiSetDriver( cmUiH_t h, cmUiDriverFunc_t drvrFunc, void* drvrArg )
  548. {
  549. cmUi_t* p = _cmUiHandleToPtr(h);
  550. p->drvr = drvrFunc;
  551. p->drvrArg = drvrArg;
  552. }
  553. cmUiRC_t cmUiCreateApp( cmUiH_t h, unsigned appId, unsigned rtSubIdx )
  554. {
  555. cmUiRC_t rc = kOkUiRC;
  556. if( cmUiIsValid(h) == false)
  557. return rc;
  558. cmUi_t* p = _cmUiHandleToPtr(h);
  559. cmUiApp_t* ap = NULL;
  560. // verify that the requested app does not exist
  561. if( _cmUiFindApp(p,appId, &ap, false ) == kOkUiRC )
  562. return cmErrMsg(&p->err,kInvalidIdUiRC,"The id (%i) of the new application is already in use.",appId);
  563. ap = cmArrayClr(cmUiApp_t,p->appArrH,appId);
  564. ap->appId = appId;
  565. ap->rtSubIdx = rtSubIdx;
  566. ap->activeFl = true;
  567. cmArrayAlloc(p->ctx,&ap->ctlArrH,sizeof(cmUiCtl_t));
  568. cmArrayAlloc(p->ctx,&ap->pnlArrH,sizeof(cmUiPanel_t));
  569. return rc;
  570. }
  571. bool cmUiAppIsActive( cmUiH_t uiH, unsigned appId )
  572. {
  573. cmUi_t* p = _cmUiHandleToPtr(uiH);
  574. cmUiApp_t* ap = NULL;
  575. return _cmUiFindApp(p,appId, &ap, false ) == kOkUiRC;
  576. }
  577. cmUiRC_t cmUiDestroyApp( cmUiH_t h, unsigned appId )
  578. {
  579. if( cmUiIsValid(h)==false)
  580. return kOkUiRC;
  581. cmUi_t* p = _cmUiHandleToPtr(h);
  582. return _cmUiDestroyApp(p,appId,true);
  583. }
  584. cmUiRC_t cmUiDestroyAllApps( cmUiH_t h )
  585. {
  586. if( cmUiIsValid(h)==false)
  587. return kOkUiRC;
  588. cmUi_t* p = _cmUiHandleToPtr(h);
  589. return _cmUiDestroyAllApps(p);
  590. }
  591. unsigned cmUiAppIdToAsSubIndex( cmUiH_t uiH, unsigned appId )
  592. {
  593. cmUi_t* p = _cmUiHandleToPtr(uiH);
  594. cmUiApp_t* ap = NULL;
  595. if( _cmUiFindApp(p,appId, &ap, true ) != kOkUiRC )
  596. return cmInvalidIdx;
  597. return ap->rtSubIdx;
  598. }
  599. unsigned cmUiAppCount( cmUiH_t h )
  600. {
  601. if( cmUiIsValid(h)==false)
  602. return 0;
  603. cmUi_t* p = _cmUiHandleToPtr(h);
  604. return cmArrayCount(p->appArrH);
  605. }
  606. cmUiRC_t _cmUiCallClient( cmUi_t* p, cmUiDId_t dId, cmUiCtl_t* ctl, unsigned flags )
  607. {
  608. unsigned orgFlags = ctl->arg.flags;
  609. ctl->arg.hdr.selId = kUiSelRtId,
  610. ctl->arg.flags |= flags;
  611. ctl->arg.dId = dId;
  612. cmUiRC_t rc = p->cbFunc(p->cbArg,&ctl->arg);
  613. ctl->arg.dId = kInvalidDId;
  614. ctl->arg.flags = orgFlags;
  615. ctl->arg.hdr.selId = cmInvalidId;
  616. return rc;
  617. }
  618. cmUiRC_t cmUiOnDriverEvent( cmUiH_t h, const cmUiDriverArg_t* arg )
  619. {
  620. cmUiRC_t rc = kOkUiRC;
  621. cmUi_t* p = _cmUiHandleToPtr(h);
  622. cmUiCtl_t* ctl;
  623. //unsigned orgAppId = cmUiAppId(h);
  624. //if((rc = cmUiSetAppId(h,arg->appId)) != kOkUiRC )
  625. // return rc;
  626. if((rc = _cmUiFindCtl(p,arg->appId,arg->usrId,&ctl,true)) != kOkUiRC )
  627. goto errLabel;
  628. switch( arg->dId )
  629. {
  630. case kEnableDId:
  631. ctl->arg.ival = arg->ival;
  632. return _cmUiCallClient(p,kEnableDId,ctl,arg->flags);
  633. case kSetValDId:
  634. break;
  635. default:
  636. assert(0);
  637. break;
  638. }
  639. switch( arg->cId )
  640. {
  641. case kInvalidUiCId:
  642. break;
  643. case kPanelUiCId:
  644. case kBtnUiCId:
  645. case kCheckUiCId:
  646. ctl->arg.ival = ctl->u.ival = cmUiDriverArgGetInt(arg);
  647. break;
  648. case kMenuBtnUiCId:
  649. case kListUiCId:
  650. {
  651. if( cmIsFlag(arg->flags,kValUiFl ) )
  652. {
  653. unsigned eleIdx = cmUiDriverArgGetInt(arg);
  654. if(eleIdx >= cmArrayCount(ctl->idArrH))
  655. {
  656. rc = cmErrMsg(&p->err,kInvalidIdUiRC,"Invalid menu or list driver element id=%i element count:%i.",eleIdx,cmArrayCount(ctl->idArrH));
  657. goto errLabel;
  658. }
  659. // convert the selected items index to the associated client id value
  660. unsigned eleId = cmArrayPtr(cmUiListEle_t,ctl->idArrH,eleIdx)->id;
  661. ctl->setInt(ctl,eleId);
  662. ctl->arg.ival = eleId;
  663. }
  664. }
  665. break;
  666. case kConsoleUiCId:
  667. {
  668. const cmChar_t* s;
  669. if((s = cmUiDriverArgGetString(arg)) != NULL )
  670. ctl->arg.sval = ctl->u.sval = cmTextAppendSS(ctl->u.sval, s );
  671. }
  672. break;
  673. case kLabelUiCId:
  674. case kStringUiCId:
  675. case kFilenameUiCId:
  676. case kDirUiCId:
  677. {
  678. const cmChar_t* s;
  679. if((s = cmUiDriverArgGetString(arg)) != NULL )
  680. ctl->arg.sval = ctl->u.sval = cmMemResizeStr(ctl->u.sval,s);
  681. }
  682. break;
  683. case kSliderUiCId:
  684. case kNumberUiCId:
  685. ctl->arg.fval = ctl->u.fval = cmUiDriverArgGetDouble(arg);
  686. break;
  687. case kProgressUiCId:
  688. case kMeterUiCId:
  689. ctl->arg.ival = ctl->u.ival = cmUiDriverArgGetInt(arg);
  690. break;
  691. case kMaxUiCId:
  692. assert(0);
  693. break;
  694. }
  695. // reflect the event to the client
  696. if( cmIsNotFlag(arg->flags, kNoReflectUiFl ) )
  697. {
  698. rc = _cmUiCallClient(p,kSetValDId,ctl,0);
  699. }
  700. errLabel:
  701. //cmUiSetAppId(h,orgAppId);
  702. return rc;
  703. }
  704. void _cmUiPanelSetDefaultValues( cmUiPanel_t* pp)
  705. {
  706. pp->baseCol = 2;
  707. pp->baseRow = 2;
  708. pp->dfltW = 150;
  709. pp->dfltH = 25;
  710. pp->nextW = pp->dfltW;
  711. pp->nextH = pp->dfltH;
  712. pp->dfltHBorder= 2;
  713. pp->dfltVBorder= 2;
  714. pp->nextHBorder= pp->dfltHBorder;
  715. pp->nextVBorder= pp->dfltVBorder;
  716. pp->prevRect.x = -1;
  717. pp->prevRect.y = -1;
  718. pp->prevRect.w = -1;
  719. pp->prevRect.h = -1;
  720. }
  721. cmUiRC_t cmUiCreatePanel( cmUiH_t uiH, unsigned appId, unsigned newPanelId, const cmChar_t* label, unsigned flags )
  722. {
  723. cmUiRC_t rc;
  724. cmUi_t* p = _cmUiHandleToPtr(uiH);
  725. cmUiCtl_t* ctl = NULL;
  726. cmUiApp_t* ap = NULL;
  727. if(( rc = _cmUiFindApp(p,appId,&ap,true)) != kOkUiRC )
  728. return rc;
  729. cmUiPanel_t* pp = cmArrayPush(ap->pnlArrH,NULL,1);
  730. assert( pp != NULL );
  731. pp->appPtr = ap;
  732. pp->ctl = NULL;
  733. pp->usrId = newPanelId;
  734. _cmUiPanelSetDefaultValues(pp);
  735. if((rc = _cmUiCreateCtl(p, appId, newPanelId, kPanelUiCId, newPanelId, label, flags, &pp->ctl )) != kOkUiRC )
  736. {
  737. // TODO - destroy panel record here
  738. return rc;
  739. }
  740. _cmUiFindCtl(p,appId,newPanelId,&ctl,true);
  741. assert(ctl!=NULL);
  742. ctl->u.pnl = pp;
  743. return rc;
  744. }
  745. cmUiRC_t cmUiCreateBtn( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags )
  746. {
  747. cmUiRC_t rc;
  748. cmUi_t* p = _cmUiHandleToPtr(uiH);
  749. cmUiCtl_t* c;
  750. if((rc = _cmUiCreateCtl(p,appId,panelId,kBtnUiCId,id,label,flags,&c)) == kOkUiRC )
  751. {
  752. _cmUiSetIntAccessors(c);
  753. }
  754. return rc;
  755. }
  756. cmUiRC_t cmUiCreateCheck( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, bool dflt )
  757. {
  758. cmUiRC_t rc;
  759. cmUi_t* p = _cmUiHandleToPtr(uiH);
  760. cmUiCtl_t* c;
  761. if((rc = _cmUiCreateCtl(p,appId,panelId,kCheckUiCId,id,label,flags,&c)) == kOkUiRC )
  762. {
  763. _cmUiSetIntAccessors(c);
  764. rc = _cmUiSetDriverValueInt(p,c,kValUiFl | kNoReflectUiFl,dflt);
  765. }
  766. return rc;
  767. }
  768. cmUiRC_t cmUiCreateLabel( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags )
  769. {
  770. cmUiRC_t rc;
  771. cmUi_t* p = _cmUiHandleToPtr(uiH);
  772. cmUiCtl_t* c;
  773. if((rc = _cmUiCreateCtl(p,appId,panelId,kLabelUiCId,id,label,flags,&c)) == kOkUiRC )
  774. _cmUiSetStrAccessors(c);
  775. return rc;
  776. }
  777. cmUiRC_t cmUiCreateString( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* text )
  778. {
  779. cmUiRC_t rc = kOkUiRC;
  780. cmUi_t* p = _cmUiHandleToPtr(uiH);
  781. cmUiCtl_t* c;
  782. if(( rc = _cmUiCreateCtl(p,appId,panelId,kStringUiCId,id,label,flags,&c)) == kOkUiRC )
  783. {
  784. _cmUiSetStrAccessors(c);
  785. rc = _cmUiSetDriverValueStr(p,c,kValUiFl | kNoReflectUiFl,text);
  786. }
  787. return rc;
  788. }
  789. cmUiRC_t cmUiCreateConsole( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* text )
  790. {
  791. cmUiRC_t rc = kOkUiRC;
  792. cmUi_t* p = _cmUiHandleToPtr(uiH);
  793. cmUiCtl_t* c;
  794. if(( rc = _cmUiCreateCtl(p,appId,panelId,kConsoleUiCId,id,label,flags,&c)) == kOkUiRC )
  795. {
  796. _cmUiSetStrAccessors(c);
  797. rc = _cmUiSetDriverValueStr(p,c,kValUiFl | kNoReflectUiFl,text);
  798. }
  799. return rc;
  800. }
  801. cmUiRC_t _cmUiCreateNumber( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, double min, double max, double incr, double dflt )
  802. {
  803. cmUiRC_t rc = kOkUiRC;
  804. cmUi_t* p = _cmUiHandleToPtr(uiH);
  805. cmUiCId_t cid = kNumberUiCId;
  806. cmUiCtl_t* c;
  807. cmUiPanel_t* pp;
  808. if( cmIsFlag(flags,kVertUiFl|kHorzUiFl) )
  809. {
  810. if( cmIsFlag(flags,kVertUiFl) )
  811. {
  812. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  813. return rc;
  814. // if the size of the control was not excplicitly set
  815. // then swap width and height
  816. if( cmIsNotFlag(pp->flags,kNextWHUiFl) && cmIsNotFlag(pp->flags,kUseRectUiFl) )
  817. cmUiSetNextWH( uiH, appId, panelId, cmUiH(uiH,appId,panelId), cmUiW(uiH,appId,panelId) );
  818. }
  819. cid = kSliderUiCId;
  820. }
  821. if(( rc = _cmUiCreateCtl(p,appId,panelId,cid,id,label,flags,&c)) == kOkUiRC )
  822. {
  823. cmUiRC_t rc0;
  824. _cmUiSetDblAccessors(c);
  825. if((rc0 = _cmUiSetDriverValueDouble(p,c,kMinUiFl | kNoReflectUiFl,min)) != kOkUiRC )
  826. rc = rc0;
  827. if((rc0 = _cmUiSetDriverValueDouble(p,c,kMaxUiFl | kNoReflectUiFl,max)) != kOkUiRC )
  828. rc = rc0;
  829. if((rc0 = _cmUiSetDriverValueDouble(p,c,kIncUiFl | kNoReflectUiFl,incr)) != kOkUiRC )
  830. rc = rc0;
  831. if((rc0 = _cmUiSetDriverValueDouble(p,c,kValUiFl | kNoReflectUiFl,dflt)) != kOkUiRC )
  832. rc = rc0;
  833. }
  834. return rc;
  835. }
  836. cmUiRC_t cmUiCreateNumber( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, double min, double max, double incr, double dflt )
  837. {
  838. return _cmUiCreateNumber(uiH,appId,panelId,id,label,flags,min,max,incr,dflt);
  839. }
  840. cmUiRC_t cmUiCreateHSlider( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, double min, double max, double incr, double dflt )
  841. {
  842. return _cmUiCreateNumber(uiH,appId,panelId,id,label,flags | kHorzUiFl, min,max,incr,dflt);
  843. }
  844. cmUiRC_t cmUiCreateVSlider( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, double min, double max, double incr, double dflt )
  845. {
  846. return _cmUiCreateNumber(uiH,appId,panelId,id,label,flags | kVertUiFl, min,max,incr,dflt);
  847. }
  848. cmUiRC_t cmUiCreateProgress(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, int min, int max, int dflt )
  849. {
  850. cmUiRC_t rc = kOkUiRC;
  851. cmUi_t* p = _cmUiHandleToPtr(uiH);
  852. cmUiCtl_t* c;
  853. if(( rc = _cmUiCreateCtl(p,appId,panelId,kProgressUiCId,id,label,flags,&c)) == kOkUiRC )
  854. {
  855. cmUiRC_t rc0;
  856. _cmUiSetIntAccessors(c);
  857. if((rc0 = _cmUiSetDriverValueInt(p,c,kMinUiFl | kNoReflectUiFl,min)) != kOkUiRC )
  858. rc = rc0;
  859. if((rc0 = _cmUiSetDriverValueInt(p,c,kMaxUiFl | kNoReflectUiFl,max)) != kOkUiRC )
  860. rc = rc0;
  861. if((rc0 = _cmUiSetDriverValueInt(p,c,kValUiFl | kNoReflectUiFl,dflt)) != kOkUiRC )
  862. rc = rc0;
  863. }
  864. return rc;
  865. }
  866. cmUiRC_t _cmUiCreateMeter( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, int min, int max, int dflt)
  867. {
  868. cmUiRC_t rc;
  869. cmUi_t* p = _cmUiHandleToPtr(uiH);
  870. cmUiCtl_t* c;
  871. cmUiPanel_t* pp;
  872. if( cmIsFlag(flags,kVertUiFl) )
  873. {
  874. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  875. return rc;
  876. // if the size of the control has not been explicitely set
  877. // then swap height and width for vertical meters.
  878. if( cmIsNotFlag(pp->flags,kNextWHUiFl) && cmIsNotFlag(pp->flags,kUseRectUiFl) )
  879. cmUiSetNextWH( uiH, appId, panelId, cmUiH(uiH,appId,panelId), cmUiW(uiH,appId,panelId) );
  880. }
  881. if((rc = _cmUiCreateCtl(p,appId,panelId,kMeterUiCId,id,label,flags,&c)) == kOkUiRC )
  882. {
  883. cmUiRC_t rc0;
  884. _cmUiSetIntAccessors(c);
  885. if((rc0 = _cmUiSetDriverValueInt(p,c,kMinUiFl | kNoReflectUiFl,min)) != kOkUiRC )
  886. rc = rc0;
  887. if((rc0 = _cmUiSetDriverValueInt(p,c,kMaxUiFl | kNoReflectUiFl,max)) != kOkUiRC )
  888. rc = rc0;
  889. if((rc0 = _cmUiSetDriverValueInt(p,c,kValUiFl | kNoReflectUiFl,dflt)) != kOkUiRC )
  890. rc = rc0;
  891. }
  892. return rc;
  893. }
  894. cmUiRC_t cmUiCreateHMeter( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, int min, int max, int dflt )
  895. {
  896. return _cmUiCreateMeter(uiH,appId,panelId,id,label,flags | kHorzUiFl,min,max,dflt);
  897. }
  898. cmUiRC_t cmUiCreateVMeter( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, int min, int max, int dflt )
  899. {
  900. return _cmUiCreateMeter(uiH,appId,panelId,id,label,flags | kVertUiFl,min,max,dflt);
  901. }
  902. cmUiRC_t cmUiCreateFileBtn(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* dfltDir, const cmChar_t* patStr )
  903. {
  904. cmUiRC_t rc = kOkUiRC;
  905. cmUi_t* p = _cmUiHandleToPtr(uiH);
  906. cmUiCtl_t* c;
  907. if(( rc = _cmUiCreateCtl(p,appId,panelId,kFilenameUiCId,id,label,flags,&c)) == kOkUiRC )
  908. {
  909. cmUiRC_t rc0;
  910. _cmUiSetStrAccessors(c);
  911. if( dfltDir != NULL )
  912. {
  913. if((rc0 = _cmUiSetDriverValueStr(p,c,kFnDirUiFl | kNoReflectUiFl,dfltDir)) != kOkUiRC )
  914. rc = rc0;
  915. }
  916. if( patStr != NULL )
  917. {
  918. if((rc0 = _cmUiSetDriverValueStr(p,c,kFnPatUiFl | kNoReflectUiFl,patStr)) != kOkUiRC )
  919. rc = rc0;
  920. }
  921. }
  922. return rc;
  923. }
  924. cmUiRC_t cmUiCreateDirBtn( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* dfltDir )
  925. {
  926. cmUiRC_t rc = kOkUiRC;
  927. cmUi_t* p = _cmUiHandleToPtr(uiH);
  928. cmUiCtl_t* c;
  929. if(( rc = _cmUiCreateCtl(p,appId,panelId,kDirUiCId,id,label,flags,&c)) == kOkUiRC )
  930. {
  931. cmUiRC_t rc0;
  932. _cmUiSetStrAccessors(c);
  933. if( dfltDir != NULL )
  934. {
  935. if((rc0 = _cmUiSetDriverValueStr(p,c,kValUiFl | kNoReflectUiFl,dfltDir)) != kOkUiRC )
  936. rc = rc0;
  937. }
  938. }
  939. return rc;
  940. }
  941. cmUiRC_t cmUiCreateMenuBtn( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags )
  942. {
  943. cmUiRC_t rc;
  944. cmUi_t* p = _cmUiHandleToPtr(uiH);
  945. cmUiCtl_t* c;
  946. if((rc = _cmUiCreateCtl(p,appId,panelId,kMenuBtnUiCId,id,label,flags,&c)) == kOkUiRC )
  947. _cmUiSetIntAccessors(c);
  948. return rc;
  949. }
  950. cmUiRC_t cmUiCreateMenuBtnV(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* label0, unsigned id0, va_list vl )
  951. {
  952. cmUiRC_t rc = kOkUiRC;
  953. // TODO:
  954. return rc;
  955. }
  956. cmUiRC_t cmUiCreateMenuBtnA(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, const cmChar_t* label0, unsigned id0, ... )
  957. {
  958. va_list vl;
  959. va_start(vl,id0);
  960. cmUiRC_t rc = cmUiCreateMenuBtnV(uiH,appId,panelId,id,label,flags,label0,id0,vl);
  961. va_end(vl);
  962. return rc;
  963. }
  964. cmUiRC_t cmUiCreateMenuBtnJson(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* lavel, unsigned flags, const cmJsonNode_t* root, const cmChar_t* memberLabel )
  965. {
  966. cmUiRC_t rc = kOkUiRC;
  967. // TODO:
  968. return rc;
  969. }
  970. cmUiRC_t cmUiCreateList(cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, unsigned visibleRowCnt )
  971. {
  972. cmUi_t* p = _cmUiHandleToPtr(uiH);
  973. cmUiRC_t rc;
  974. cmUiCtl_t* c;
  975. cmUiPanel_t* pp;
  976. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  977. return rc;
  978. if( cmIsNotFlag(pp->flags,kNextWHUiFl) )
  979. cmUiSetNextWH( uiH, appId, panelId, cmUiNextW(uiH,appId,panelId), cmUiH(uiH,appId,panelId) * visibleRowCnt );
  980. if((rc = _cmUiCreateCtl(p,appId,panelId,kListUiCId,id,label,flags,&c)) == kOkUiRC )
  981. _cmUiSetIntAccessors(c);
  982. return rc;
  983. }
  984. cmUiRC_t cmUiCreateListV( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, unsigned visibleRowCnt, const cmChar_t* label0, unsigned id0, va_list vl )
  985. {
  986. cmUiRC_t rc = kOkUiRC;
  987. // TODO:
  988. return rc;
  989. }
  990. cmUiRC_t cmUiCreateListA( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, unsigned visibleRowCnt, const cmChar_t* label0, unsigned id0, ... )
  991. {
  992. va_list vl;
  993. va_start(vl,id0);
  994. cmUiRC_t rc = cmUiCreateListV(uiH,appId,panelId,id,label,flags,visibleRowCnt,label0,id0,vl);
  995. va_end(vl);
  996. return rc;
  997. }
  998. cmUiRC_t cmUiCreateListJson( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* label, unsigned flags, unsigned visibleRowCnt, const cmJsonNode_t* root, const cmChar_t* memberLabel )
  999. {
  1000. cmUiRC_t rc = kOkUiRC;
  1001. // TODO:
  1002. return rc;
  1003. }
  1004. cmUiRC_t cmUiAppendListEle( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, const cmChar_t* text, unsigned eleId )
  1005. {
  1006. cmUiRC_t rc = kOkUiRC;
  1007. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1008. cmUiCtl_t* ctl = NULL;
  1009. if((rc = _cmUiFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1010. return rc;
  1011. if( ctl->cId != kListUiCId && ctl->cId != kMenuBtnUiCId )
  1012. return cmErrMsg(&p->err,kInvalidCtlOpUiRC,"List elements may only be set on 'list' and 'menu button' controls.");
  1013. // set the local value
  1014. cmUiListEle_t ele;
  1015. ele.id = eleId;
  1016. ele.label = cmMemAllocStr(text);
  1017. cmArrayPush(ctl->idArrH,&ele,1);
  1018. return _cmUiSetDriverValueIntAndStr(p,ctl,kAppendUiFl,eleId,text);
  1019. }
  1020. cmUiRC_t cmUiClearList( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id )
  1021. {
  1022. cmUiRC_t rc = kOkUiRC;
  1023. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1024. cmUiCtl_t* ctl = NULL;
  1025. if((rc = _cmUiFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1026. return rc;
  1027. // verify that this is a list or menu btn
  1028. if( ctl->cId != kListUiCId && ctl->cId != kMenuBtnUiCId )
  1029. return cmErrMsg(&p->err,kInvalidCtlOpUiRC,"List elements may only be cleared on 'list' and 'menu button' controls.");
  1030. // call the driver
  1031. if((rc = _cmUiSetDriverValueInt(p, ctl, kClearUiFl, 0 )) != kOkUiRC )
  1032. return rc;
  1033. // clear the ctl's id array
  1034. if( cmArrayIsValid(ctl->idArrH) )
  1035. {
  1036. _cmUiReleaseListEles(ctl);
  1037. cmArrayClear(ctl->idArrH,false);
  1038. }
  1039. return rc;
  1040. }
  1041. cmUiRC_t cmUiEnableCtl( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id, bool enableFl )
  1042. {
  1043. cmUiRC_t rc = kOkUiRC;
  1044. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1045. cmUiCtl_t* ctl = NULL;
  1046. if((rc = _cmUiFindCtl(p,appId,id,&ctl,true)) == kOkUiRC )
  1047. {
  1048. ctl->arg.ival = enableFl ? 1 : 0;
  1049. rc = _cmUiCallDriver(p, kEnableDId, ctl, kIvalUiFl );
  1050. }
  1051. return rc;
  1052. }
  1053. cmUiRC_t cmUiEnableAllExceptV( cmUiH_t uiH, unsigned appId, unsigned panelId, bool enableFl, va_list vl )
  1054. {
  1055. va_list vl0;
  1056. cmUiRC_t rc = kOkUiRC;
  1057. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1058. unsigned n = 0;
  1059. cmUiApp_t* ap = NULL;
  1060. unsigned i,j;
  1061. // get a count of exception id's
  1062. va_copy(vl0,vl);
  1063. while( va_arg(vl0,unsigned) != cmInvalidId )
  1064. ++n;
  1065. va_end(vl0);
  1066. if( n == 0 )
  1067. return rc;
  1068. // alloc array to hold exception id's
  1069. unsigned id[n];
  1070. // store the exception id's
  1071. for(i=0; i<n; ++i)
  1072. id[i] = va_arg(vl,unsigned);
  1073. // locate the current app recd
  1074. if((rc = _cmUiFindApp(p,appId,&ap,true)) != kOkUiRC )
  1075. return rc;
  1076. // get a count of ctl's assigned to panel
  1077. unsigned ctlN = cmArrayCount(ap->ctlArrH);
  1078. // for each control
  1079. for(i=0; i<ctlN; ++i)
  1080. {
  1081. // get the control recd
  1082. cmUiCtl_t* ctl;
  1083. if((ctl = cmArrayPtr(cmUiCtl_t,ap->ctlArrH,i))!=NULL && ctl->panelId == panelId && ctl->usrId != panelId )
  1084. {
  1085. bool exceptFl = false;
  1086. // check if this control is in the except list
  1087. for(j=0; j<n; ++j)
  1088. if( id[j] == i )
  1089. {
  1090. exceptFl = true;
  1091. break;
  1092. }
  1093. // if the ctl is not in the except list then enable/disable it.
  1094. if( !exceptFl )
  1095. {
  1096. ctl->arg.ival = enableFl ? 1 : 0;
  1097. cmUiRC_t rc0;
  1098. if((rc0 = _cmUiCallDriver(p, kEnableDId, ctl, kIvalUiFl )) != kOkUiRC )
  1099. rc = rc0;
  1100. }
  1101. }
  1102. }
  1103. return rc;
  1104. }
  1105. cmUiRC_t cmUiEnableAllExcept( cmUiH_t uiH, unsigned appId, unsigned panelId, bool enableFl, ... )
  1106. {
  1107. va_list vl;
  1108. va_start(vl,enableFl);
  1109. cmUiRC_t rc = cmUiEnableAllExceptV(uiH,appId,panelId,enableFl,vl);
  1110. va_end(vl);
  1111. return rc;
  1112. }
  1113. cmUiRC_t cmUiDestroyCtl( cmUiH_t uiH, unsigned appId, unsigned id )
  1114. {
  1115. cmUiRC_t rc = kOkUiRC;
  1116. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1117. cmUiCtl_t* ctl = NULL;
  1118. if((rc = _cmUiFindCtl(p,appId,id,&ctl,true)) == kOkUiRC )
  1119. {
  1120. if( ctl->cId == kPanelUiCId )
  1121. _cmUiDestroyPanel(p,appId,ctl->usrId);
  1122. else
  1123. rc = _cmUiDestroyCtl(p,ctl,true);
  1124. }
  1125. return rc;
  1126. }
  1127. bool cmUiCtlExists( cmUiH_t uiH, unsigned appId, unsigned panelId, unsigned id )
  1128. {
  1129. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1130. if( panelId == id )
  1131. {
  1132. cmUiPanel_t* pp=NULL;
  1133. return _cmUiFindPanel(p, appId,panelId, &pp, false ) == kOkUiRC;
  1134. }
  1135. cmUiCtl_t* ctl=NULL;
  1136. return _cmUiFindCtl(p,appId,id,&ctl,false) == kOkUiRC;
  1137. }
  1138. cmUiRC_t cmUiClearPanel( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1139. {
  1140. cmUiRC_t rc = kOkUiRC;
  1141. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1142. cmUiPanel_t* pp = NULL;
  1143. // get the panel recd ptr
  1144. if((rc = _cmUiFindPanel(p,appId,panelId,&pp,true)) != kOkUiRC )
  1145. return rc;
  1146. cmUiApp_t* ap = pp->appPtr;
  1147. cmUiCtl_t* ctl = NULL;
  1148. unsigned i = 0;
  1149. unsigned n = cmArrayCount(ap->ctlArrH);
  1150. cmUiRC_t rc0;
  1151. // Destroy all controls that belong to this panel.
  1152. for(i=0; i<n; ++i)
  1153. if( _cmUiFindCtl(p,appId,i,&ctl,false) == kOkUiRC && ctl != NULL && ctl->panelId == panelId && ctl->usrId != panelId)
  1154. if((rc0 = _cmUiDestroyCtl(p,ctl,true)) != kOkUiRC )
  1155. rc = rc0;
  1156. // restore the layout variables to their default values.
  1157. _cmUiPanelSetDefaultValues(pp);
  1158. return rc;
  1159. }
  1160. cmUiRC_t cmUiSelectPanel( cmUiH_t uiH, const cmChar_t* label )
  1161. {
  1162. cmUiRC_t rc = kOkUiRC;
  1163. //cmUi_t* p = _cmUiHandleToPtr(uiH);
  1164. return rc;
  1165. }
  1166. cmUiRC_t cmUiNextRect( cmUiH_t uiH, unsigned appId, unsigned panelId, int x, int y, int w, int h )
  1167. {
  1168. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1169. cmUiPanel_t* pp;
  1170. cmUiRC_t rc;
  1171. if((rc = _cmUiFindPanel(p, appId, panelId, &pp, true)) != kOkUiRC )
  1172. return rc;
  1173. pp->rect.x = x;
  1174. pp->rect.y = y;
  1175. pp->rect.w = w;
  1176. pp->rect.h = h;
  1177. pp->flags = cmSetFlag(pp->flags,kUseRectUiFl);
  1178. return rc;
  1179. }
  1180. cmUiRC_t cmUiPrevRect( cmUiH_t uiH, unsigned appId, unsigned panelId, int* xRef, int* yRef, int* wRef, int* hRef )
  1181. {
  1182. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1183. cmUiPanel_t* pp;
  1184. cmUiRC_t rc;
  1185. if((rc = _cmUiFindPanel(p, appId, panelId, &pp, true)) != kOkUiRC )
  1186. return rc;
  1187. if( xRef != NULL )
  1188. *xRef = pp->prevRect.x;
  1189. if( yRef != NULL )
  1190. *yRef = pp->prevRect.y;
  1191. if( wRef != NULL )
  1192. *wRef = pp->prevRect.w;
  1193. if( hRef != NULL )
  1194. *hRef = pp->prevRect.h;
  1195. return rc;
  1196. }
  1197. bool cmUiFillRows( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1198. {
  1199. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1200. cmUiPanel_t* pp;
  1201. if( _cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1202. return false;
  1203. return cmIsFlag(pp->flags,kFillRowsUiFl);
  1204. }
  1205. bool cmUiSetFillRows( cmUiH_t uiH, unsigned appId, unsigned panelId, bool enableFl )
  1206. {
  1207. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1208. cmUiPanel_t* pp;
  1209. if( _cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1210. return false;
  1211. bool retFl = cmIsFlag(pp->flags,kFillRowsUiFl);
  1212. pp->flags = cmEnaFlag(pp->flags,kFillRowsUiFl,enableFl);
  1213. return retFl;
  1214. }
  1215. void cmUiPlaceRight( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1216. {
  1217. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1218. cmUiPanel_t* pp;
  1219. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1220. return;
  1221. pp->flags = cmClrFlag(pp->flags,kPlaceBelowUiFl);
  1222. pp->flags = cmSetFlag(pp->flags,kPlaceRightUiFl);
  1223. }
  1224. void cmUiPlaceBelow( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1225. {
  1226. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1227. cmUiPanel_t* pp;
  1228. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1229. return;
  1230. pp->flags = cmClrFlag(pp->flags,kPlaceRightUiFl);
  1231. pp->flags = cmSetFlag(pp->flags,kPlaceBelowUiFl);
  1232. }
  1233. void cmUiNewLine( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1234. {
  1235. cmUiSetBaseRow( uiH, appId, panelId, cmUiPrevB(uiH,appId,panelId) + cmUiNextVBorder(uiH,appId,panelId) );
  1236. cmUiSetBaseCol( uiH, appId, panelId, cmUiBaseCol(uiH,appId,panelId));
  1237. }
  1238. int cmUiBaseCol( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1239. {
  1240. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1241. cmUiPanel_t* pp;
  1242. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1243. return -1;
  1244. return pp->baseCol;
  1245. }
  1246. int cmUiSetBaseCol( cmUiH_t uiH, unsigned appId, unsigned panelId, int x )
  1247. {
  1248. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1249. cmUiPanel_t* pp;
  1250. if( _cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1251. return -1;
  1252. int bc = pp->baseCol;
  1253. pp->baseCol = x;
  1254. pp->flags = cmSetFlag(pp->flags,kPlaceBaseRowUiFl);
  1255. return bc;
  1256. }
  1257. int cmUiBaseRow( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1258. {
  1259. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1260. cmUiPanel_t* pp;
  1261. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1262. return -1;
  1263. return pp->baseRow;
  1264. }
  1265. int cmUiSetBaseRow( cmUiH_t uiH, unsigned appId, unsigned panelId, int y )
  1266. {
  1267. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1268. cmUiPanel_t* pp;
  1269. cmUiRC_t rc;
  1270. if((rc = _cmUiFindPanel(p, appId, panelId, &pp, true)) != kOkUiRC )
  1271. return -1;
  1272. int br = pp->baseRow;
  1273. pp->baseRow = y;
  1274. return br;
  1275. }
  1276. int cmUiW( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1277. {
  1278. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1279. cmUiPanel_t* pp;
  1280. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1281. return -1;
  1282. return pp->dfltW;
  1283. }
  1284. int cmUiH( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1285. {
  1286. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1287. cmUiPanel_t* pp;
  1288. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1289. return -1;
  1290. return pp->dfltH;
  1291. }
  1292. int cmUiSetW( cmUiH_t uiH, unsigned appId, unsigned panelId, int w )
  1293. {
  1294. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1295. cmUiPanel_t* pp;
  1296. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1297. return -1;
  1298. int rv = pp->dfltW;
  1299. pp->dfltW = w;
  1300. pp->nextW = w;
  1301. return rv;
  1302. }
  1303. int cmUiSetH( cmUiH_t uiH, unsigned appId, unsigned panelId, int h )
  1304. {
  1305. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1306. cmUiPanel_t* pp;
  1307. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1308. return -1;
  1309. int rv = pp->dfltH;
  1310. pp->dfltH = h;
  1311. pp->nextW = h;
  1312. return rv;
  1313. }
  1314. void cmUiSetWH( cmUiH_t uiH, unsigned appId, unsigned panelId, int w, int h )
  1315. {
  1316. cmUiSetW( uiH, appId, panelId, w );
  1317. cmUiSetH( uiH, appId, panelId, h );
  1318. }
  1319. int cmUiNextW( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1320. {
  1321. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1322. cmUiPanel_t* pp;
  1323. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1324. return -1;
  1325. return pp->nextW;
  1326. }
  1327. int cmUiNextH( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1328. {
  1329. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1330. cmUiPanel_t* pp;
  1331. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1332. return -1;
  1333. return pp->nextH;
  1334. }
  1335. void cmUiSetNextW( cmUiH_t uiH, unsigned appId, unsigned panelId, int w )
  1336. {
  1337. return cmUiSetNextWH( uiH, appId, panelId, w, cmUiNextH(uiH,appId,panelId));
  1338. }
  1339. void cmUiSetNextH( cmUiH_t uiH, unsigned appId, unsigned panelId, int h )
  1340. {
  1341. return cmUiSetNextWH( uiH, appId, panelId, cmUiNextW(uiH,appId,panelId), h);
  1342. }
  1343. void cmUiSetNextWH( cmUiH_t uiH, unsigned appId, unsigned panelId, int w, int h )
  1344. {
  1345. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1346. cmUiPanel_t* pp;
  1347. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1348. return;
  1349. pp->nextW = w;
  1350. pp->nextH = h;
  1351. pp->flags = cmSetFlag(pp->flags,kNextWHUiFl);
  1352. }
  1353. int cmUiHBorder( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1354. {
  1355. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1356. cmUiPanel_t* pp;
  1357. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1358. return -1;
  1359. return pp->dfltHBorder;
  1360. }
  1361. int cmUiVBorder( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1362. {
  1363. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1364. cmUiPanel_t* pp;
  1365. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1366. return -1;
  1367. return pp->dfltVBorder;
  1368. }
  1369. int cmUiSetHBorder( cmUiH_t uiH, unsigned appId, unsigned panelId, int w )
  1370. {
  1371. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1372. cmUiPanel_t* pp;
  1373. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1374. return -1;
  1375. int rv = pp->dfltHBorder;
  1376. pp->dfltHBorder = w;
  1377. return rv;
  1378. }
  1379. int cmUiSetVBorder( cmUiH_t uiH, unsigned appId, unsigned panelId, int h )
  1380. {
  1381. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1382. cmUiPanel_t* pp;
  1383. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1384. return -1;
  1385. int rv = pp->dfltVBorder;
  1386. pp->dfltVBorder = h;
  1387. return rv;
  1388. }
  1389. int cmUiNextHBorder( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1390. {
  1391. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1392. cmUiPanel_t* pp;
  1393. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1394. return -1;
  1395. return pp->nextHBorder;
  1396. }
  1397. int cmUiNextVBorder( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1398. {
  1399. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1400. cmUiPanel_t* pp;
  1401. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1402. return -1;
  1403. return pp->nextVBorder;
  1404. }
  1405. int cmUiSetNextHBorder( cmUiH_t uiH, unsigned appId, unsigned panelId, int w )
  1406. {
  1407. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1408. cmUiPanel_t* pp;
  1409. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1410. return -1;
  1411. int rv = pp->nextHBorder;
  1412. pp->nextHBorder = w;
  1413. return rv;
  1414. }
  1415. int cmUiSetNextVBorder( cmUiH_t uiH, unsigned appId, unsigned panelId, int h )
  1416. {
  1417. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1418. cmUiPanel_t* pp;
  1419. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1420. return -1;
  1421. int rv = pp->nextVBorder;
  1422. pp->nextVBorder = h;
  1423. return rv;
  1424. }
  1425. int cmUiPrevL( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1426. {
  1427. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1428. cmUiPanel_t* pp;
  1429. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1430. return -1;
  1431. return pp->prevRect.x;
  1432. }
  1433. int cmUiPrevT( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1434. {
  1435. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1436. cmUiPanel_t* pp;
  1437. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1438. return -1;
  1439. return pp->prevRect.y;
  1440. }
  1441. int cmUiPrevR( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1442. {
  1443. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1444. cmUiPanel_t* pp;
  1445. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1446. return -1;
  1447. return pp->prevRect.x + pp->prevRect.w;
  1448. }
  1449. int cmUiPrevB( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1450. {
  1451. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1452. cmUiPanel_t* pp;
  1453. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1454. return -1;
  1455. return pp->prevRect.y + pp->prevRect.h;
  1456. }
  1457. int cmUiPrevW( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1458. {
  1459. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1460. cmUiPanel_t* pp;
  1461. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1462. return -1;
  1463. return pp->prevRect.w;
  1464. }
  1465. int cmUiPrevH( cmUiH_t uiH, unsigned appId, unsigned panelId )
  1466. {
  1467. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1468. cmUiPanel_t* pp;
  1469. if(_cmUiFindPanel(p, appId, panelId, &pp, true) != kOkUiRC )
  1470. return -1;
  1471. return pp->prevRect.h;
  1472. }
  1473. cmUiRC_t cmUiSetInt( cmUiH_t uiH, unsigned appId, unsigned id, int v )
  1474. {
  1475. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1476. cmUiCtl_t* ctl;
  1477. cmUiRC_t rc;
  1478. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1479. return rc;
  1480. return _cmUiSetDriverValueInt(p,ctl,kValUiFl,v);
  1481. }
  1482. cmUiRC_t cmUiSetUInt( cmUiH_t uiH, unsigned appId, unsigned id, unsigned v )
  1483. {
  1484. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1485. cmUiCtl_t* ctl;
  1486. cmUiRC_t rc;
  1487. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1488. return rc;
  1489. return _cmUiSetDriverValueInt(p,ctl,kValUiFl,v);
  1490. }
  1491. cmUiRC_t cmUiSetDouble( cmUiH_t uiH, unsigned appId, unsigned id, double v )
  1492. {
  1493. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1494. cmUiCtl_t* ctl;
  1495. cmUiRC_t rc;
  1496. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1497. return rc;
  1498. return _cmUiSetDriverValueDouble(p,ctl,kValUiFl,v);
  1499. }
  1500. cmUiRC_t cmUiSetString( cmUiH_t uiH, unsigned appId, unsigned id, const cmChar_t* v )
  1501. {
  1502. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1503. cmUiCtl_t* ctl;
  1504. cmUiRC_t rc;
  1505. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1506. return rc;
  1507. return _cmUiSetDriverValueStr(p,ctl,kValUiFl,v);
  1508. }
  1509. cmUiRC_t cmUiSetVPrintf( cmUiH_t uiH, unsigned appId, unsigned id, const cmChar_t* fmt, va_list vl )
  1510. {
  1511. va_list vl1;
  1512. va_copy(vl1,vl);
  1513. unsigned n = vsnprintf(NULL,0,fmt,vl1);
  1514. va_end(vl1);
  1515. unsigned sbufN = 2047;
  1516. cmChar_t sbuf[ sbufN+1 ];
  1517. cmChar_t* b;
  1518. unsigned bn;
  1519. cmChar_t* abuf = NULL;
  1520. if( n >= sbufN )
  1521. {
  1522. bn = n + 1;
  1523. abuf = cmMemAlloc(cmChar_t,bn);
  1524. b = abuf;
  1525. }
  1526. else
  1527. {
  1528. bn = sbufN;
  1529. b = sbuf;
  1530. }
  1531. vsnprintf(b,bn,fmt,vl);
  1532. cmUiRC_t rc = cmUiSetString(uiH,appId,id,b);
  1533. cmMemFree(abuf);
  1534. return rc;
  1535. }
  1536. cmUiRC_t cmUiSetPrintf( cmUiH_t uiH, unsigned appId, unsigned id, const cmChar_t* fmt, ... )
  1537. {
  1538. va_list vl;
  1539. va_start(vl,fmt);
  1540. cmUiRC_t rc = cmUiSetVPrintf(uiH,appId,id,fmt,vl);
  1541. va_end(vl);
  1542. return rc;
  1543. }
  1544. int cmUiInt(cmUiH_t uiH, unsigned appId, unsigned id )
  1545. {
  1546. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1547. cmUiCtl_t* ctl;
  1548. cmUiRC_t rc;
  1549. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1550. return 0;
  1551. return ctl->getInt(ctl);
  1552. }
  1553. unsigned cmUiUInt( cmUiH_t uiH, unsigned appId, unsigned id )
  1554. {
  1555. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1556. cmUiCtl_t* ctl;
  1557. cmUiRC_t rc;
  1558. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1559. return 0;
  1560. return ctl->getInt(ctl);
  1561. }
  1562. double cmUiDouble( cmUiH_t uiH, unsigned appId, unsigned id )
  1563. {
  1564. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1565. cmUiCtl_t* ctl;
  1566. cmUiRC_t rc;
  1567. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1568. return 0;
  1569. return ctl->getDbl(ctl);
  1570. }
  1571. const cmChar_t* cmUiString( cmUiH_t uiH, unsigned appId, unsigned id )
  1572. {
  1573. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1574. cmUiCtl_t* ctl;
  1575. cmUiRC_t rc;
  1576. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1577. return 0;
  1578. return ctl->getStr(ctl);
  1579. }
  1580. unsigned cmUiListEleCount( cmUiH_t uiH, unsigned appId, unsigned id )
  1581. {
  1582. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1583. cmUiCtl_t* ctl;
  1584. cmUiRC_t rc;
  1585. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1586. return 0;
  1587. return cmArrayCount( ctl->idArrH );
  1588. }
  1589. unsigned cmUiListEleId( cmUiH_t uiH, unsigned appId, unsigned id, unsigned index )
  1590. {
  1591. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1592. cmUiCtl_t* ctl;
  1593. cmUiRC_t rc;
  1594. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1595. return 0;
  1596. if( !cmArrayIsValid( ctl->idArrH ) || index >= cmArrayCount( ctl->idArrH) )
  1597. return cmInvalidId;
  1598. return cmArrayPtr(cmUiListEle_t, ctl->idArrH, index )->id;
  1599. }
  1600. const cmChar_t* cmUiListEleLabel( cmUiH_t uiH, unsigned appId, unsigned id, unsigned index )
  1601. {
  1602. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1603. cmUiCtl_t* ctl;
  1604. cmUiRC_t rc;
  1605. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1606. return 0;
  1607. if( !cmArrayIsValid( ctl->idArrH ) || index >= cmArrayCount( ctl->idArrH) )
  1608. return NULL;
  1609. return cmArrayPtr(cmUiListEle_t, ctl->idArrH, index )->label;
  1610. }
  1611. unsigned cmUiListEleLabelToIndex( cmUiH_t uiH, unsigned appId, unsigned id, const cmChar_t* label )
  1612. {
  1613. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1614. cmUiCtl_t* ctl;
  1615. cmUiRC_t rc;
  1616. unsigned i,n;
  1617. if( label == NULL )
  1618. return cmInvalidIdx;
  1619. if((rc = _cmUiFastFindCtl(p,appId,id,&ctl,true)) != kOkUiRC )
  1620. return cmInvalidIdx;
  1621. if( cmArrayIsValid( ctl->idArrH )==false || (n = cmArrayCount( ctl->idArrH))==0 )
  1622. return cmInvalidIdx;
  1623. for(i=0; i<n; ++i)
  1624. if( cmTextCmp(cmArrayPtr(cmUiListEle_t, ctl->idArrH, i )->label,label) == 0 )
  1625. return i;
  1626. return cmInvalidIdx;
  1627. }
  1628. cmUiRC_t cmUiLastRC( cmUiH_t uiH )
  1629. {
  1630. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1631. return cmErrLastRC(&p->err);
  1632. }
  1633. cmUiRC_t cmUiSetRC( cmUiH_t uiH, cmUiRC_t rc )
  1634. {
  1635. cmUi_t* p = _cmUiHandleToPtr(uiH);
  1636. return cmErrSetRC(&p->err, rc);
  1637. }