diff --git a/cmUi.c b/cmUi.c index 7d2095c..dc05d81 100644 --- a/cmUi.c +++ b/cmUi.c @@ -36,23 +36,26 @@ typedef struct cmUiApp_str cmArrayH_t pnlArrH; // cmUiPanel_t[] } cmUiApp_t; +struct cmUiCtl_str; + typedef struct cmUiPanel_str { - cmUiApp_t* appPtr; // owner app. - unsigned flags; // See kXXXUiFl above - unsigned usrId; // app. supplied id - cmUiRect_t rect; // rect to position next control (only used if kUseRectUiFl is set) - cmUiRect_t prevRect; - int baseCol; - int baseRow; - int dfltW; - int dfltH; - int nextW; - int nextH; - int dfltHBorder; - int dfltVBorder; - int nextHBorder; - int nextVBorder; + cmUiApp_t* appPtr; // owner app. + struct cmUiCtl_str* ctl; // control recd assoc'd with this panel + unsigned flags; // See kXXXUiFl above + unsigned usrId; // app. supplied id + cmUiRect_t rect; // rect to position next control (only used if kUseRectUiFl is set) + cmUiRect_t prevRect; + int baseCol; + int baseRow; + int dfltW; + int dfltH; + int nextW; + int nextH; + int dfltHBorder; + int dfltVBorder; + int nextHBorder; + int nextVBorder; } cmUiPanel_t; @@ -63,7 +66,8 @@ typedef struct cmUiCtl_str unsigned usrId; // control instance id and index into cmUiApp_t.ctlArrH[]. unsigned panelId; // panel this ctl belongs to cmArrayH_t idArrH; // id's associated with each sub-element of this control (used by menu's, list's, etc...) - + cmUiDriverArg_t arg; // cached callback arg for this control + // current value of this control union { @@ -96,6 +100,7 @@ typedef struct cmUiDriverFunc_t cbFunc; // Client callback function void * cbArg; // cmArrayH_t appArrH; // cmUiApp_t[] + cmUiCtl_t dummy; // dummy recd used to create controls which will never be accessed after creation (like read-only labels) } cmUi_t; cmUiH_t cmUiNullHandle = cmSTATIC_NULL_HANDLE; @@ -107,25 +112,6 @@ cmUi_t* _cmUiHandleToPtr( cmUiH_t h ) return p; } -void _cmUiDriverArgInit( cmUiDriverArg_t* a, cmUi_t* p, cmUiDId_t dId, cmUiCId_t cId, unsigned panelId, unsigned usrId ) -{ - memset(a,0,sizeof(*a)); - a->cbArg = p->drvrArg; - a->dId = dId; - a->cId = cId; - a->appId = p->curAppId; - a->panelId = panelId; - a->usrId = usrId; - a->flags = 0; - a->x = -1; - a->y = -1; - a->w = -1; - a->h = -1; - a->ival = 0; - a->fval = 0; - a->sval = NULL; -} - //--------------------------------------------------------------- // int accessors @@ -222,6 +208,57 @@ void _cmUiSetStrAccessors( cmUiCtl_t* ctl ) ctl->setStr = _cmUiSetStrFromStr; } +//--------------------------------------------------------------- + + +cmUiRC_t _cmUiCallDriver( cmUi_t* p, cmUiDId_t dId, cmUiCtl_t* ctl ) +{ + cmUiRC_t rc = kOkUiRC; + if( p->drvr != NULL ) + { + ctl->arg.dId = dId; + + if((rc = p->drvr(p->drvrArg,&ctl->arg)) != kOkUiRC ) + rc = cmErrMsg(&p->err,kDrvrErrUiRC,"UI manager driver error."); + } + return rc; +} + +cmUiRC_t _cmUiSetDriverValue( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag ) +{ + unsigned orgFlags = ctl->arg.flags; + ctl->arg.flags |= flag; + cmUiRC_t rc = _cmUiCallDriver(p,kSetValDId,ctl); + ctl->arg.flags = orgFlags; + return rc; +} + +cmUiRC_t _cmUiSetDriverValueInt( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, int value ) +{ + ctl->arg.ival = value; + return _cmUiSetDriverValue(p,ctl,flag); +} + +cmUiRC_t _cmUiSetDriverValueDouble( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, double value ) +{ + ctl->arg.fval = value; + return _cmUiSetDriverValue(p,ctl,flag); +} + +cmUiRC_t _cmUiSetDriverValueStr( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, const cmChar_t* value ) +{ + ctl->arg.sval = value; + return _cmUiSetDriverValue(p,ctl,flag); +} + +cmUiRC_t _cmUiSetDriverValueIntAndStr( cmUi_t* p, cmUiCtl_t* ctl, unsigned flag, int ival, const cmChar_t* sval ) +{ + ctl->arg.ival = ival; + ctl->arg.sval = sval; + return _cmUiSetDriverValue(p,ctl,flag); +} + + //--------------------------------------------------------------- cmUiRC_t _cmUiFindApp( cmUi_t* p, unsigned appId, cmUiApp_t** appRef, bool errFl ) @@ -333,29 +370,13 @@ cmUiRC_t _cmUiFindPanel( cmUi_t* p, unsigned panelId, cmUiPanel_t** ppRef, bool return rc; } -cmUiRC_t _cmUiCallDriver( cmUi_t* p, cmUiDriverArg_t* a ) -{ - cmUiRC_t rc = kOkUiRC; - if( p->drvr != NULL ) - if((rc = p->drvr(a)) != kOkUiRC ) - rc = cmErrMsg(&p->err,kDrvrErrUiRC,"UI manager driver error."); - return rc; -} - -cmUiRC_t _cmUiDestroyDrvrCtl( cmUi_t* p, cmUiCId_t cId, unsigned panelId, unsigned usrId ) -{ - cmUiDriverArg_t a; - _cmUiDriverArgInit(&a, p, kDestroyCtlDId, cId, panelId, usrId ); - - - return _cmUiCallDriver(p,&a); -} +//--------------------------------------------------------------- cmUiRC_t _cmUiDestroyCtl( cmUi_t* p, cmUiCtl_t* ctl ) { cmUiRC_t rc = kOkUiRC; - rc =_cmUiDestroyDrvrCtl(p,ctl->cId,ctl->panelId,ctl->usrId); + rc = _cmUiCallDriver(p,kDestroyCtlDId,ctl); switch(ctl->cId) { @@ -370,6 +391,7 @@ cmUiRC_t _cmUiDestroyCtl( cmUi_t* p, cmUiCtl_t* ctl ) break; } + ctl->cId = kInvalidUiCId; ctl->usrId = cmInvalidId; ctl->panelId = cmInvalidId; cmArrayRelease(&ctl->idArrH); @@ -389,7 +411,7 @@ cmUiRC_t _cmUiDestroyPanel( cmUi_t* p, unsigned panelId ) cmUiApp_t* ap = pp->appPtr; // notify the driver to destroy the panel - if((rc = _cmUiDestroyDrvrCtl(p,kPanelUiCId,panelId,panelId)) != kOkUiRC ) + if((rc = _cmUiCallDriver(p,kDestroyCtlDId,pp->ctl)) != kOkUiRC ) return rc; cmUiCtl_t* ctl = NULL; @@ -472,6 +494,7 @@ cmUiRC_t _cmUiDestroyAllApps( cmUi_t* p ) return rc; } +//--------------------------------------------------------------- cmUiRC_t _cmUiGetCtlXYWH( cmUi_t* p, cmUiDriverArg_t* a, cmUiPanel_t* pp ) { @@ -545,7 +568,7 @@ cmUiRC_t _cmUiGetCtlXYWH( cmUi_t* p, cmUiDriverArg_t* a, cmUiPanel_t* pp ) } -cmUiRC_t _cmUiCreateCtl( cmUi_t* p, cmUiDriverArg_t* a, unsigned panelId, cmUiCId_t cId, unsigned usrId, const cmChar_t* label, unsigned flags, cmUiCtl_t** ctlRef ) +cmUiRC_t _cmUiCreateCtl( cmUi_t* p, unsigned panelId, cmUiCId_t cId, unsigned usrId, const cmChar_t* label, unsigned flags, cmUiCtl_t** ctlRef ) { cmUiRC_t rc; cmUiPanel_t* pp = NULL; @@ -554,9 +577,6 @@ cmUiRC_t _cmUiCreateCtl( cmUi_t* p, cmUiDriverArg_t* a, unsigned panelId, cmUiCI if( ctlRef != NULL ) *ctlRef = NULL; - // initialize the driver arg record - _cmUiDriverArgInit(a, p, kCreateCtlDId, cId, panelId, usrId ); - // locate the app if((rc = _cmUiFindApp(p,p->curAppId,&ap,true)) != kOkUiRC ) return rc; @@ -565,28 +585,50 @@ cmUiRC_t _cmUiCreateCtl( cmUi_t* p, cmUiDriverArg_t* a, unsigned panelId, cmUiCI if((rc = _cmUiFindPanel(p,panelId,&pp,true)) != kOkUiRC ) return rc; - // calc the control location - for non-panel controls or - // for panel controls using the custom 'next rect'. - if( cId != kPanelUiCId || cmIsFlag(pp->flags,kUseRectUiFl ) ) - if((rc = _cmUiGetCtlXYWH(p,a,pp)) != kOkUiRC ) + // get the new ctl record + cmUiCtl_t* ctl; + if( usrId == cmInvalidId ) + { + ctl = &p->dummy; + memset(ctl,0,sizeof(*ctl)); + } + else + { + if( cmArrayIsValid(ap->ctlArrH)==false || usrId >= cmArrayCount(ap->ctlArrH) ) + ctl = cmArrayClr(cmUiCtl_t,ap->ctlArrH,usrId); + else + { + ctl = cmArrayPtr(cmUiCtl_t,ap->ctlArrH,usrId); + + // if the ctl recd is already in use + if( ctl->cId != kInvalidUiCId ) + _cmUiDestroyCtl(p,ctl); + } + } + + // setup this controls cached callback arg record + cmUiDriverArgSetup(&ctl->arg,kInvalidDId,ap->appId,usrId,panelId,cId,flags,0,0,label,-1,-1,-1,-1); + + // calc the control location - for non-panel controls + if( cId != kPanelUiCId ) + if((rc = _cmUiGetCtlXYWH(p,&ctl->arg,pp)) != kOkUiRC ) return rc; - // get the new ctl record - cmUiCtl_t* ctl = cmArrayClr(cmUiCtl_t,ap->ctlArrH,usrId); // setup the new ctl record ctl->cId = cId; ctl->usrId = usrId; ctl->panelId = panelId; - cmArrayAlloc(p->ctx,&ctl->idArrH,sizeof(unsigned)); + + // display-only controls don't need an id array + if( usrId != cmInvalidId ) + cmArrayAlloc(p->ctx,&ctl->idArrH,sizeof(unsigned)); - a->sval = label; - a->flags = flags; if( ctlRef != NULL ) *ctlRef = ctl; - return _cmUiCallDriver(p,a); + return _cmUiCallDriver(p,kCreateCtlDId,ctl); } @@ -727,77 +769,76 @@ unsigned cmUiAppCount( cmUiH_t h ) -cmUiRC_t cmUiOnDriverEvent( cmUiH_t h, const cmUiDriverArg_t* arg ) +cmUiRC_t cmUiOnDriverEvent( cmUiH_t h, const cmUiDriverArg_t* arg ) { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(h); - cmUiDriverArg_t a = *arg; cmUiCtl_t* ctl; if((rc = cmUiSetAppId(h,arg->appId)) != kOkUiRC ) return rc; - a.cbArg = p->cbArg; - - if((rc = _cmUiFindCtl(p,a.usrId,&ctl,true)) != kOkUiRC ) + if((rc = _cmUiFindCtl(p,arg->usrId,&ctl,true)) != kOkUiRC ) goto errLabel; - switch( a.cId ) + switch( arg->cId ) { - case kInvalidUiCId: break; - case kPanelUiCId: break; - case kBtnUiCId: break; + case kInvalidUiCId: + break; + + case kPanelUiCId: + case kBtnUiCId: case kCheckUiCId: - ctl->u.ival = a.ival; + ctl->arg.ival = ctl->u.ival = cmUiDriverArgGetInt(arg); break; case kMenuBtnUiCId: case kListUiCId: { - ctl->u.ival = a.ival; - if(a.ival >= cmArrayCount(ctl->idArrH)) + unsigned eleIdx = cmUiDriverArgGetInt(arg); + + if(eleIdx >= cmArrayCount(ctl->idArrH)) { - rc = cmErrMsg(&p->err,kInvalidIdUiRC,"Invalid menu or list driver element id=%i element count:%i.",a.ival,cmArrayCount(ctl->idArrH)); + rc = cmErrMsg(&p->err,kInvalidIdUiRC,"Invalid menu or list driver element id=%i element count:%i.",eleIdx,cmArrayCount(ctl->idArrH)); goto errLabel; } - a.ival = cmArrayEle(unsigned,ctl->idArrH,a.ival); - //a.ival = ctl->id_arr[ a.ival ]; + // convert the selected items index to the associated client id value + ctl->arg.ival = ctl->u.ival = cmArrayEle(unsigned,ctl->idArrH,eleIdx); + } break; + case kLabelUiCId: - ctl->u.sval = cmMemResizeStr(ctl->u.sval,cmStringNullGuard(a.sval)); - break; - - case kTextUiCId: - ctl->u.sval = cmMemResizeStr(ctl->u.sval,cmStringNullGuard(a.sval)); + case kTextUiCId: + case kFilenameUiCId: + case kDirUiCId: + { + const cmChar_t* s; + if((s = cmUiDriverArgGetString(arg)) != NULL ) + ctl->arg.sval = ctl->u.sval = cmMemResizeStr(ctl->u.sval,s); + } break; case kSliderUiCId: case kNumberUiCId: - ctl->u.fval = a.fval; - a.cId = kNumberUiCId; // sliders callback the client as numbers + ctl->arg.fval = ctl->u.fval = cmUiDriverArgGetDouble(arg); break; case kProgressUiCId: - ctl->u.ival = a.ival; - break; - case kMeterUiCId: - ctl->u.fval = a.fval; + assert(0); // progress and meters are display only break; - case kFilenameUiCId: - ctl->u.sval = cmMemResizeStr(ctl->u.sval,cmStringNullGuard(a.sval)); + case kMaxUiCId: + assert(0); break; - case kDirUiCId: - ctl->u.sval = cmMemResizeStr(ctl->u.sval,cmStringNullGuard(a.sval)); - break; } - rc = p->cbFunc(&a); + ctl->arg.dId = kSetValDId; + rc = p->cbFunc(p->cbArg,&ctl->arg); errLabel: cmUiSetAppId(h,cmInvalidId); @@ -808,7 +849,6 @@ cmUiRC_t cmUiOnDriverEvent( cmUiH_t h, const cmUiDriverArg_t* arg ) cmUiRC_t cmUiCreatePanel( cmUiH_t uiH, unsigned newPanelId, const cmChar_t* label ) { cmUiRC_t rc; - cmUiDriverArg_t a; cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl = NULL; cmUiApp_t* ap = NULL; @@ -820,6 +860,7 @@ cmUiRC_t cmUiCreatePanel( cmUiH_t uiH, unsigned newPanelId, const cmChar_t* la assert( pp != NULL ); pp->appPtr = ap; + pp->ctl = NULL; pp->usrId = newPanelId; pp->baseCol = 2; pp->baseRow = 0; @@ -837,7 +878,7 @@ cmUiRC_t cmUiCreatePanel( cmUiH_t uiH, unsigned newPanelId, const cmChar_t* la pp->prevRect.h = -1; - if((rc = _cmUiCreateCtl(p, &a, newPanelId, kPanelUiCId, newPanelId, label, 0, NULL )) != kOkUiRC ) + if((rc = _cmUiCreateCtl(p, newPanelId, kPanelUiCId, newPanelId, label, 0, &pp->ctl )) != kOkUiRC ) { // TODO - destroy panel record here return rc; @@ -855,10 +896,9 @@ cmUiRC_t cmUiCreateBtn( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if((rc = _cmUiCreateCtl(p,&a,panelId,kBtnUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kBtnUiCId,id,label,flags,&c)) == kOkUiRC ) { _cmUiSetIntAccessors(c); } @@ -869,12 +909,14 @@ cmUiRC_t cmUiCreateCheck( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - a.ival = dflt; - if((rc = _cmUiCreateCtl(p,&a,panelId,kCheckUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kCheckUiCId,id,label,flags,&c)) == kOkUiRC ) + { _cmUiSetIntAccessors(c); + + rc = _cmUiSetDriverValueInt(p,c,kValUiFl,dflt); + } return rc; } @@ -882,10 +924,9 @@ cmUiRC_t cmUiCreateLabel( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if((rc = _cmUiCreateCtl(p,&a,panelId,kLabelUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kLabelUiCId,id,label,flags,&c)) == kOkUiRC ) _cmUiSetStrAccessors(c); return rc; } @@ -894,17 +935,13 @@ cmUiRC_t cmUiCreateText( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if(( rc = _cmUiCreateCtl(p,&a,panelId,kTextUiCId,id,label,flags,&c)) == kOkUiRC ) + if(( rc = _cmUiCreateCtl(p,panelId,kTextUiCId,id,label,flags,&c)) == kOkUiRC ) { _cmUiSetStrAccessors(c); - a.dId = kSetValDId; - a.flags = kValUiFl; - a.sval = text; - rc = _cmUiCallDriver(p,&a); + rc = _cmUiSetDriverValueStr(p,c,kValUiFl,text); } return rc; @@ -914,7 +951,6 @@ cmUiRC_t _cmUiCreateNumber( cmUiH_t uiH, unsigned panelId, unsigned id, const c { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCId_t cid = kNumberUiCId; cmUiCtl_t* c; cmUiPanel_t* pp; @@ -935,31 +971,22 @@ cmUiRC_t _cmUiCreateNumber( cmUiH_t uiH, unsigned panelId, unsigned id, const c cid = kSliderUiCId; } - if(( rc = _cmUiCreateCtl(p,&a,panelId,cid,id,label,flags,&c)) == kOkUiRC ) + if(( rc = _cmUiCreateCtl(p,panelId,cid,id,label,flags,&c)) == kOkUiRC ) { cmUiRC_t rc0; _cmUiSetDblAccessors(c); - a.dId = kSetValDId; - a.flags = kMinUiFl; - a.fval = min; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueDouble(p,c,kMinUiFl,min)) != kOkUiRC ) rc = rc0; - a.flags = kMaxUiFl; - a.fval = max; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueDouble(p,c,kMaxUiFl,max)) != kOkUiRC ) rc = rc0; - a.flags = kIncUiFl; - a.fval = incr; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueDouble(p,c,kIncUiFl,incr)) != kOkUiRC ) rc = rc0; - a.flags = kValUiFl; - a.fval = dflt; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueDouble(p,c,kValUiFl,dflt)) != kOkUiRC ) rc = rc0; } @@ -987,30 +1014,21 @@ cmUiRC_t cmUiCreateProgress(cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if(( rc = _cmUiCreateCtl(p,&a,panelId,kProgressUiCId,id,label,flags,&c)) == kOkUiRC ) + if(( rc = _cmUiCreateCtl(p,panelId,kProgressUiCId,id,label,flags,&c)) == kOkUiRC ) { cmUiRC_t rc0; _cmUiSetIntAccessors(c); - a.dId = kSetValDId; - - a.flags = kMinUiFl; - a.ival = min; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kMinUiFl,min)) != kOkUiRC ) rc = rc0; - a.flags = kMaxUiFl; - a.ival = max; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kMaxUiFl,max)) != kOkUiRC ) rc = rc0; - a.flags = kValUiFl; - a.ival = dflt; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kValUiFl,dflt)) != kOkUiRC ) rc = rc0; } @@ -1022,7 +1040,6 @@ cmUiRC_t _cmUiCreateMeter( cmUiH_t uiH, unsigned panelId, unsigned id, const c { cmUiRC_t rc; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; cmUiPanel_t* pp; @@ -1037,27 +1054,19 @@ cmUiRC_t _cmUiCreateMeter( cmUiH_t uiH, unsigned panelId, unsigned id, const c cmUiSetNextWH( uiH, panelId, cmUiH(uiH,panelId), cmUiW(uiH,panelId) ); } - if((rc = _cmUiCreateCtl(p,&a,panelId,kMeterUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kMeterUiCId,id,label,flags,&c)) == kOkUiRC ) { cmUiRC_t rc0; _cmUiSetIntAccessors(c); - a.dId = kSetValDId; - - a.flags = kMinUiFl; - a.ival = min; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kMinUiFl,min)) != kOkUiRC ) rc = rc0; - a.flags = kMaxUiFl; - a.ival = max; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kMaxUiFl,max)) != kOkUiRC ) rc = rc0; - a.flags = kValUiFl; - a.ival = dflt; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueInt(p,c,kValUiFl,dflt)) != kOkUiRC ) rc = rc0; } @@ -1079,10 +1088,9 @@ cmUiRC_t cmUiCreateFileBtn(cmUiH_t uiH, unsigned panelId, unsigned id, const cmC { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if(( rc = _cmUiCreateCtl(p,&a,panelId,kFilenameUiCId,id,label,flags,&c)) == kOkUiRC ) + if(( rc = _cmUiCreateCtl(p,panelId,kFilenameUiCId,id,label,flags,&c)) == kOkUiRC ) { cmUiRC_t rc0; @@ -1090,19 +1098,13 @@ cmUiRC_t cmUiCreateFileBtn(cmUiH_t uiH, unsigned panelId, unsigned id, const cmC if( dfltDir != NULL ) { - a.dId = kSetValDId; - a.flags = kValUiFl; - a.sval = dfltDir; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueStr(p,c,kValUiFl,dfltDir)) != kOkUiRC ) rc = rc0; } if( patStr != NULL ) { - a.dId = kSetValDId; - a.flags = kFnPatUiFl; - a.sval = patStr; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueStr(p,c,kValUiFl,patStr)) != kOkUiRC ) rc = rc0; } } @@ -1113,10 +1115,9 @@ cmUiRC_t cmUiCreateDirBtn( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if(( rc = _cmUiCreateCtl(p,&a,panelId,kDirUiCId,id,label,flags,&c)) == kOkUiRC ) + if(( rc = _cmUiCreateCtl(p,panelId,kDirUiCId,id,label,flags,&c)) == kOkUiRC ) { cmUiRC_t rc0; @@ -1124,10 +1125,7 @@ cmUiRC_t cmUiCreateDirBtn( cmUiH_t uiH, unsigned panelId, unsigned id, const cm if( dfltDir != NULL ) { - a.dId = kSetValDId; - a.flags = kValUiFl; - a.sval = dfltDir; - if((rc0 = _cmUiCallDriver(p,&a)) != kOkUiRC ) + if((rc0 = _cmUiSetDriverValueStr(p,c,kValUiFl,dfltDir)) != kOkUiRC ) rc = rc0; } } @@ -1138,10 +1136,9 @@ cmUiRC_t cmUiCreateMenuBtn( cmUiH_t uiH, unsigned panelId, unsigned id, const cm { cmUiRC_t rc; cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiDriverArg_t a; cmUiCtl_t* c; - if((rc = _cmUiCreateCtl(p,&a,panelId,kMenuBtnUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kMenuBtnUiCId,id,label,flags,&c)) == kOkUiRC ) _cmUiSetIntAccessors(c); return rc; } @@ -1173,7 +1170,6 @@ cmUiRC_t cmUiCreateList(cmUiH_t uiH, unsigned panelId, unsigned id, const cmChar { cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiRC_t rc; - cmUiDriverArg_t a; cmUiCtl_t* c; cmUiPanel_t* pp; @@ -1183,7 +1179,7 @@ cmUiRC_t cmUiCreateList(cmUiH_t uiH, unsigned panelId, unsigned id, const cmChar if( cmIsNotFlag(pp->flags,kNextWHUiFl) ) cmUiSetNextWH( uiH, panelId, cmUiNextW(uiH,panelId), cmUiH(uiH,panelId) * visibleRowCnt ); - if((rc = _cmUiCreateCtl(p,&a,panelId,kListUiCId,id,label,flags,&c)) == kOkUiRC ) + if((rc = _cmUiCreateCtl(p,panelId,kListUiCId,id,label,flags,&c)) == kOkUiRC ) _cmUiSetIntAccessors(c); return rc; @@ -1217,7 +1213,6 @@ cmUiRC_t cmUiAppendListEle( cmUiH_t uiH, unsigned panelId, unsigned id, const cmUiRC_t rc = kOkUiRC; cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl = NULL; - cmUiDriverArg_t a; if((rc = _cmUiFindCtl(p,id,&ctl,true)) != kOkUiRC ) return rc; @@ -1225,25 +1220,10 @@ cmUiRC_t cmUiAppendListEle( cmUiH_t uiH, unsigned panelId, unsigned id, const if( ctl->cId != kListUiCId && ctl->cId != kMenuBtnUiCId ) return cmErrMsg(&p->err,kInvalidCtlOpUiRC,"List elements may only be set on 'list' and 'menu button' controls."); - _cmUiDriverArgInit(&a, p, kSetValDId, ctl->cId, panelId, id ); - + if( cmArrayIsValid(ctl->idArrH) ) + cmArrayPush(ctl->idArrH,&eleId,1); - //if( ctl->id_arr == NULL || ctl->id_cnt == ctl->id_alloc ) - // ctl->id_arr = cmMemResizeZ(unsigned,ctl->id_arr,ctl->id_alloc+=10); - - //ctl->id_arr[ ctl->id_cnt++ ] = eleId; - - cmArrayPush(ctl->idArrH,&eleId,1); - - //a.dId = kSetValDId; - //a.cId = ctl->cId; - //a.panelId = panelId; - //a.usrId = id; - a.flags = kAppendUiFl; - a.sval = text; - a.ival = eleId; - - return _cmUiCallDriver(p,&a); + return _cmUiSetDriverValueIntAndStr(p,ctl,kAppendUiFl,eleId,text); } cmUiRC_t cmUiDestroyCtl( cmUiH_t uiH, unsigned id ) @@ -1319,6 +1299,31 @@ cmUiRC_t cmUiNextRect( cmUiH_t uiH, unsigned panelId, int x, int y, int w, in return rc; } +cmUiRC_t cmUiPrevRect( cmUiH_t uiH, unsigned panelId, int* xRef, int* yRef, int* wRef, int* hRef ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + + cmUiPanel_t* pp; + cmUiRC_t rc; + + if((rc = _cmUiFindPanel(p, panelId, &pp, true)) != kOkUiRC ) + return rc; + + if( xRef != NULL ) + *xRef = pp->prevRect.x; + + if( yRef != NULL ) + *yRef = pp->prevRect.y; + + if( wRef != NULL ) + *wRef = pp->prevRect.w; + + if( hRef != NULL ) + *hRef = pp->prevRect.h; + + return rc; +} + bool cmUiFillRows( cmUiH_t uiH, unsigned panelId ) { cmUi_t* p = _cmUiHandleToPtr(uiH); @@ -1345,20 +1350,6 @@ bool cmUiSetFillRows( cmUiH_t uiH, unsigned panelId, bool enableFl ) return retFl; } -int cmUiBaseCol( cmUiH_t uiH, unsigned panelId, int x ) -{ - cmUi_t* p = _cmUiHandleToPtr(uiH); - cmUiPanel_t* pp; - - if( _cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) - return -1; - - int bc = pp->baseCol; - pp->baseCol = x; - pp->flags = cmSetFlag(pp->flags,kPlaceBaseRowUiFl); - return bc; -} - void cmUiPlaceRight( cmUiH_t uiH, unsigned panelId ) { cmUi_t* p = _cmUiHandleToPtr(uiH); @@ -1383,7 +1374,49 @@ void cmUiPlaceBelow( cmUiH_t uiH, unsigned panelId ) pp->flags = cmSetFlag(pp->flags,kPlaceBelowUiFl); } -int cmUiBaseRow( cmUiH_t uiH, unsigned panelId, int y ) +void cmUiNewLine( cmUiH_t uiH, unsigned panelId ) +{ + cmUiSetBaseRow( uiH, panelId, cmUiPrevB(uiH,panelId) + cmUiNextVBorder(uiH,panelId) ); + cmUiSetBaseCol( uiH, panelId, cmUiBaseCol(uiH,panelId)); +} + +int cmUiBaseCol( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->baseCol; +} + +int cmUiSetBaseCol( cmUiH_t uiH, unsigned panelId, int x ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if( _cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + int bc = pp->baseCol; + pp->baseCol = x; + pp->flags = cmSetFlag(pp->flags,kPlaceBaseRowUiFl); + return bc; +} + +int cmUiBaseRow( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->baseRow; +} + +int cmUiSetBaseRow( cmUiH_t uiH, unsigned panelId, int y ) { cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiPanel_t* pp; @@ -1397,6 +1430,8 @@ int cmUiBaseRow( cmUiH_t uiH, unsigned panelId, int y ) return br; } + + int cmUiW( cmUiH_t uiH, unsigned panelId ) { cmUi_t* p = _cmUiHandleToPtr(uiH); @@ -1419,6 +1454,34 @@ int cmUiH( cmUiH_t uiH, unsigned panelId ) return pp->dfltH; } +int cmUiSetW( cmUiH_t uiH, unsigned panelId, int w ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + int rv = pp->dfltW; + pp->dfltW = w; + pp->nextW = w; + return rv; +} + +int cmUiSetH( cmUiH_t uiH, unsigned panelId, int h ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + int rv = pp->dfltH; + pp->dfltH = h; + pp->nextW = h; + return rv; +} + void cmUiSetWH( cmUiH_t uiH, unsigned panelId, int w, int h ) { cmUi_t* p = _cmUiHandleToPtr(uiH); @@ -1429,6 +1492,9 @@ void cmUiSetWH( cmUiH_t uiH, unsigned panelId, int w, int h ) pp->dfltW = w; pp->dfltH = h; + pp->nextW = w; + pp->nextH = h; + } int cmUiNextW( cmUiH_t uiH, unsigned panelId ) @@ -1453,6 +1519,12 @@ int cmUiNextH( cmUiH_t uiH, unsigned panelId ) return pp->nextH; } +void cmUiSetNextW( cmUiH_t uiH, unsigned panelId, int w ) +{ return cmUiSetNextWH( uiH, panelId, w, cmUiNextH(uiH,panelId)); } + +void cmUiSetNextH( cmUiH_t uiH, unsigned panelId, int h ) +{ return cmUiSetNextWH( uiH, panelId, cmUiNextW(uiH,panelId), h); } + void cmUiSetNextWH( cmUiH_t uiH, unsigned panelId, int w, int h ) { cmUi_t* p = _cmUiHandleToPtr(uiH); @@ -1562,25 +1634,83 @@ int cmUiSetNextVBorder( cmUiH_t uiH, unsigned panelId, int h ) return rv; } +int cmUiPrevL( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.x; +} + +int cmUiPrevT( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.y; +} + +int cmUiPrevR( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.x + pp->prevRect.w; +} + +int cmUiPrevB( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.y + pp->prevRect.h; +} +int cmUiPrevW( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.w; +} + +int cmUiPrevH( cmUiH_t uiH, unsigned panelId ) +{ + cmUi_t* p = _cmUiHandleToPtr(uiH); + cmUiPanel_t* pp; + + if(_cmUiFindPanel(p, panelId, &pp, true) != kOkUiRC ) + return -1; + + return pp->prevRect.h; +} + + cmUiRC_t cmUiSetInt( cmUiH_t uiH, unsigned id, int v ) { cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl; cmUiRC_t rc; - cmUiDriverArg_t a; if((rc = _cmUiFastFindCtl(p,id,&ctl,true)) != kOkUiRC ) return rc; - // TODO: cache the cmUiDriverArg_t for this control in the ctl_t - // object to avoid having to recreate the arg. recd on every call. - _cmUiDriverArgInit(&a, p, kSetValDId, ctl->cId, ctl->panelId, id ); - - a.ival = v; - a.flags |= kValUiFl; - - return _cmUiCallDriver(p,&a); + return _cmUiSetDriverValueInt(p,ctl,kValUiFl,v); } @@ -1589,17 +1719,11 @@ cmUiRC_t cmUiSetUInt( cmUiH_t uiH, unsigned id, unsigned v ) cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl; cmUiRC_t rc; - cmUiDriverArg_t a; if((rc = _cmUiFastFindCtl(p,id,&ctl,true)) != kOkUiRC ) return rc; - _cmUiDriverArgInit(&a, p, kSetValDId, ctl->cId, ctl->panelId, id ); - - a.ival = (int)v; - a.flags |= kValUiFl; - - return _cmUiCallDriver(p,&a); + return _cmUiSetDriverValueInt(p,ctl,kValUiFl,v); } cmUiRC_t cmUiSetDouble( cmUiH_t uiH, unsigned id, double v ) @@ -1607,17 +1731,11 @@ cmUiRC_t cmUiSetDouble( cmUiH_t uiH, unsigned id, double v ) cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl; cmUiRC_t rc; - cmUiDriverArg_t a; if((rc = _cmUiFastFindCtl(p,id,&ctl,true)) != kOkUiRC ) return rc; - _cmUiDriverArgInit(&a, p, kSetValDId, ctl->cId, ctl->panelId, id ); - - a.fval = v; - a.flags |= kValUiFl; - - return _cmUiCallDriver(p,&a); + return _cmUiSetDriverValueDouble(p,ctl,kValUiFl,v); } cmUiRC_t cmUiSetString( cmUiH_t uiH, unsigned id, const cmChar_t* v ) @@ -1625,17 +1743,11 @@ cmUiRC_t cmUiSetString( cmUiH_t uiH, unsigned id, const cmChar_t* v ) cmUi_t* p = _cmUiHandleToPtr(uiH); cmUiCtl_t* ctl; cmUiRC_t rc; - cmUiDriverArg_t a; if((rc = _cmUiFastFindCtl(p,id,&ctl,true)) != kOkUiRC ) return rc; - _cmUiDriverArgInit(&a, p, kSetValDId, ctl->cId, ctl->panelId, id ); - - a.sval = v; - a.flags |= kValUiFl; - - return _cmUiCallDriver(p,&a); + return _cmUiSetDriverValueStr(p,ctl,kValUiFl,v); } int cmUiInt( cmUiH_t uiH, unsigned id ) diff --git a/cmUi.h b/cmUi.h index 5a88ec2..487139f 100644 --- a/cmUi.h +++ b/cmUi.h @@ -251,15 +251,20 @@ extern "C" { // Note that 'place right' and 'place below' are mutually // exclusive. Enabling one disables the other. void cmUiPlaceRight( cmUiH_t uiH, unsigned panelId ); - void cmUiPlaceBelow( cmUiH_t uiH, unsigned panelId ); + void cmUiPlaceBelow( cmUiH_t uiH, unsigned panelId ); - // Set current base col and return previous value. Place the next + // Place the next control at the base column below the previous ctl. + void cmUiNewLine( cmUiH_t uiH, unsigned panelId ); + + // Set/Get current base col and return previous value. Place the next // control on the base row. - int cmUiBaseCol( cmUiH_t uiH, unsigned panelId, int x ); + int cmUiBaseCol( cmUiH_t uiH, unsigned panelId ); + int cmUiSetBaseCol( cmUiH_t uiH, unsigned panelId, int x ); - // Set current base row and return previous value. - int cmUiBaseRow( cmUiH_t uiH, unsigned panelId, int y ); + // Set/Get current base row and return previous value. + int cmUiBaseRow( cmUiH_t uiH, unsigned panelId ); + int cmUiSetBaseRow( cmUiH_t uiH, unsigned panelId, int y ); // Size: // 1) If a 'next rect' is set the control will be placed according @@ -272,14 +277,18 @@ extern "C" { // Get/Set the default control width and height. // Set returns previous value. - int cmUiW( cmUiH_t uiH, unsigned panelId ); - int cmUiH( cmUiH_t uiH, unsigned panelId ); + int cmUiW( cmUiH_t uiH, unsigned panelId ); + int cmUiH( cmUiH_t uiH, unsigned panelId ); + int cmUiSetW( cmUiH_t uiH, unsigned panelId, int w ); + int cmUiSetH( cmUiH_t uiH, unsigned panelId, int h ); void cmUiSetWH( cmUiH_t uiH, unsigned panelId, int w, int h ); // Get/Set the control width and height for only the next control. // Set returns previous value. - int cmUiNextW( cmUiH_t uiH, unsigned panelId ); - int cmUiNextH( cmUiH_t uiH, unsigned panelId ); + int cmUiNextW( cmUiH_t uiH, unsigned panelId ); + int cmUiNextH( cmUiH_t uiH, unsigned panelId ); + void cmUiSetNextW( cmUiH_t uiH, unsigned panelId, int w ); + void cmUiSetNextH( cmUiH_t uiH, unsigned panelId, int h ); void cmUiSetNextWH( cmUiH_t uiH, unsigned panelId, int w, int h ); // Get/Set the default inter-control borders @@ -301,6 +310,16 @@ extern "C" { // cmUiCreateXXX() call. Setting the 'next rect' overrides all // other layout directives. cmUiRC_t cmUiNextRect( cmUiH_t uiH, unsigned panelId, int x, int y, int w, int h ); + + // Get the location/size of the previously created control. + // All ref. args are optional. + cmUiRC_t cmUiPrevRect( cmUiH_t uiH, unsigned panelId, int* xRef, int* yRef, int* wRef, int* hRef ); + int cmUiPrevL( cmUiH_t uiH, unsigned panelId ); + int cmUiPrevT( cmUiH_t uiH, unsigned panelId ); + int cmUiPrevR( cmUiH_t uiH, unsigned panelId ); + int cmUiPrevB( cmUiH_t uiH, unsigned panelId ); + int cmUiPrevW( cmUiH_t uiH, unsigned panelId ); + int cmUiPrevH( cmUiH_t uiH, unsigned panelId ); //