cwList.h/cpp, cwUiTest.cpp : Added cwCreateList() and use of log in cwUiTest.

This commit is contained in:
kevin 2021-11-01 10:11:27 -04:00
parent e6bfa98878
commit 421625d62b
3 changed files with 146 additions and 37 deletions

104
cwUi.cpp
View File

@ -34,6 +34,9 @@ namespace cw
unsigned uuId; // UI unique id - automatically generated and unique among all elements that are part of this ui_t object. unsigned uuId; // UI unique id - automatically generated and unique among all elements that are part of this ui_t object.
unsigned appId; // application assigned id - application assigned id unsigned appId; // application assigned id - application assigned id
char* eleName; // javascript id char* eleName; // javascript id
object_t* attr;
} ele_t; } ele_t;
typedef struct ui_str typedef struct ui_str
@ -50,7 +53,7 @@ namespace cw
char* buf; // buf[bufN] output message formatting buffer char* buf; // buf[bufN] output message formatting buffer
unsigned bufN; // unsigned bufN; //
unsigned* sessA; unsigned* sessA; // sessA[ sessN ] array of wsSessId's
unsigned sessN; unsigned sessN;
unsigned sessAllocN; unsigned sessAllocN;
@ -253,8 +256,9 @@ namespace cw
} }
// Create the base element record. The attributes mut be filled in by the calling function.
ele_t* _createEle( ui_t* p, ele_t* parent, unsigned appId, const char* eleName ) // Note that if 'appId' is kInvalidId then this function will attempt to lookup the appId in p->appIdMap[].
ele_t* _createBaseEle( ui_t* p, ele_t* parent, unsigned appId, const char* eleName, const char* eleTypeStr=nullptr, const char* eleClass=nullptr, const char* eleTitle=nullptr )
{ {
ele_t* e = mem::allocZ<ele_t>(); ele_t* e = mem::allocZ<ele_t>();
@ -270,6 +274,17 @@ namespace cw
e->uuId = p->eleN; e->uuId = p->eleN;
e->appId = appId; e->appId = appId;
e->eleName = eleName==nullptr ? nullptr : mem::duplStr(eleName); e->eleName = eleName==nullptr ? nullptr : mem::duplStr(eleName);
e->attr = newObjectDict();
if( eleTypeStr != nullptr )
e->attr->insertPair("type",eleTypeStr);
if( eleClass != nullptr )
e->attr->insertPair("class",eleClass);
if( eleTitle != nullptr )
e->attr->insertPair("title",eleTitle);
if( p->eleN == p->eleAllocN ) if( p->eleN == p->eleAllocN )
{ {
@ -306,6 +321,7 @@ namespace cw
return e; return e;
} }
ele_t* _findOrCreateEle( ui_t* p, ele_t* parentEle, const char* eleName, unsigned appId=kInvalidId ) ele_t* _findOrCreateEle( ui_t* p, ele_t* parentEle, const char* eleName, unsigned appId=kInvalidId )
{ {
ele_t* ele = nullptr; ele_t* ele = nullptr;
@ -323,7 +339,7 @@ namespace cw
} }
if(ele == nullptr ) if(ele == nullptr )
ele = _createEle(p, parentEle, appId, eleName ); ele = _createBaseEle(p, parentEle, appId, eleName );
return ele; return ele;
} }
@ -362,6 +378,48 @@ namespace cw
return format_attributes(buf,n,i,std::forward<ARGS>(args)...); return format_attributes(buf,n,i,std::forward<ARGS>(args)...);
} }
// terminating condition for format_attributes()
void create_attributes( ele_t* e )
{ }
template<typename T, typename... ARGS>
void create_attributes(ele_t* e, const char* label, T value, ARGS&&... args)
{
e->attr->insertPair(label,value);
create_attributes(e,std::forward<ARGS>(args)...);
}
template< typename... ARGS>
rc_t _createOneEle1( ui_t* p, unsigned& uuIdRef, const char* eleTypeStr, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, ARGS&&... args )
{
rc_t rc = kOkRC;
ele_t* newEle = nullptr;
ele_t* parentEle = nullptr;
uuIdRef = kInvalidId;
if( parentUuId == kInvalidId )
parentUuId = kRootUuId;
// get the parent element
if(( parentEle = _uuIdToEle(p, parentUuId )) == nullptr )
return cwLogError( kInvalidArgRC, "Unable to locate the parent element (id:%i).", parentUuId );
// create the base element
newEle = _createBaseEle(p, parentEle, appId, eleName, eleTypeStr, clas, title );
// create the attributes
create_attributes(newEle, std::forward<ARGS>(args)...);
uuIdRef = newEle->uuId;
return rc;
}
template< typename... ARGS> template< typename... ARGS>
rc_t _createOneEle( ui_t* p, unsigned& uuIdRef, const char* eleTypeStr, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, ARGS&&... args ) rc_t _createOneEle( ui_t* p, unsigned& uuIdRef, const char* eleTypeStr, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, ARGS&&... args )
{ {
@ -408,7 +466,6 @@ namespace cw
return rc; return rc;
} }
rc_t _createElementsFromChildList( ui_t* p, const object_t* po, unsigned wsSessId, ele_t* parentEle ); rc_t _createElementsFromChildList( ui_t* p, const object_t* po, unsigned wsSessId, ele_t* parentEle );
// //
@ -798,7 +855,7 @@ cw::rc_t cw::ui::create(
p->uiRsrc = uiRsrc == nullptr ? nullptr : uiRsrc->duplicate(); p->uiRsrc = uiRsrc == nullptr ? nullptr : uiRsrc->duplicate();
// create the root element // create the root element
if((ele = _createEle(p, nullptr, kRootAppId, "uiDivId" )) == nullptr || ele->uuId != kRootUuId ) if((ele = _createBaseEle(p, nullptr, kRootAppId, "uiDivId" )) == nullptr || ele->uuId != kRootUuId )
{ {
cwLogError(kOpFailRC,"The UI root element creation failed."); cwLogError(kOpFailRC,"The UI root element creation failed.");
goto errLabel; goto errLabel;
@ -1018,6 +1075,8 @@ cw::rc_t cw::ui::createFromObject( handle_t h, const object_t* o, unsigned wsS
ui_t* p = _handleToPtr(h); ui_t* p = _handleToPtr(h);
rc_t rc = kOkRC; rc_t rc = kOkRC;
//ele_t* parentEle = nullptr;
if( eleName != nullptr ) if( eleName != nullptr )
if((o = o->find(eleName)) == nullptr ) if((o = o->find(eleName)) == nullptr )
{ {
@ -1025,6 +1084,15 @@ cw::rc_t cw::ui::createFromObject( handle_t h, const object_t* o, unsigned wsS
goto errLabel; goto errLabel;
} }
//if((parentEle = _uuIdToEle(p, parentUuId)) == nullptr )
//{
// rc = cwLogError(kInvalidIdRC,"Unable to locate the parent element.");
// goto errLabel;
// }
//if((rc = _createElementsFromChildList( p, o, wsSessId, parentEle )) != kOkRC )
// goto errLabel;
if((rc = _createFromObj( p, o, wsSessId, parentUuId )) != kOkRC ) if((rc = _createFromObj( p, o, wsSessId, parentUuId )) != kOkRC )
goto errLabel; goto errLabel;
@ -1131,6 +1199,10 @@ cw::rc_t cw::ui::createProg( handle_t h, unsigned& uuIdRef, unsigned wsSessId,
cw::rc_t cw::ui::createLog( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title ) cw::rc_t cw::ui::createLog( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title )
{ return _createOneEle( _handleToPtr(h), uuIdRef, "log", wsSessId, parentUuId, eleName, appId, clas, title); } { return _createOneEle( _handleToPtr(h), uuIdRef, "log", wsSessId, parentUuId, eleName, appId, clas, title); }
cw::rc_t cw::ui::createList( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title )
{ return _createOneEle( _handleToPtr(h), uuIdRef, "list", wsSessId, parentUuId, eleName, appId, clas, title); }
cw::rc_t cw::ui::setNumbRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value ) cw::rc_t cw::ui::setNumbRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
@ -1264,6 +1336,25 @@ cw::rc_t cw::ui::sendValueString( handle_t h, unsigned wsSessId, unsigned uuId,
return _sendValue<const char*>(p,wsSessId,uuId,"\"%s\"",value,strlen(value)+10); return _sendValue<const char*>(p,wsSessId,uuId,"\"%s\"",value,strlen(value)+10);
} }
void cw::ui::report( handle_t h )
{
ui_t* p = _handleToPtr(h);
for(unsigned i=0; i<p->eleN; ++i)
{
const ele_t* e = p->eleA[i];
unsigned parUuId = e->parent==NULL ? kInvalidId : e->parent->uuId;
unsigned parAppId = e->parent==NULL ? kInvalidId : e->parent->appId;
const char* parEleName = e->parent==NULL || e->parent->eleName == NULL ? "" : e->parent->eleName;
printf("uu:%5i app:%5i %20s : parent uu:%5i app:%5i %20s\n", e->uuId, e->appId, e->eleName == NULL ? "" : e->eleName, parUuId, parAppId, parEleName );
}
}
namespace cw namespace cw
{ {
namespace ui namespace ui
@ -1514,7 +1605,6 @@ cw::ui::handle_t cw::ui::ws::uiHandle( handle_t h )
namespace cw namespace cw
{ {
namespace ui namespace ui

15
cwUi.h
View File

@ -32,11 +32,16 @@ namespace cw
rc_t destroy( handle_t& h ); rc_t destroy( handle_t& h );
unsigned sessionIdCount(handle_t h); unsigned sessionIdCount(handle_t h); // Count of connected remote UI's
const unsigned* sessionIdArray(handle_t h); const unsigned* sessionIdArray(handle_t h); // Array of 'sessionIdCount()' remote UI id's
// A new remote UI was connected
rc_t onConnect( handle_t h, unsigned wsSessId ); rc_t onConnect( handle_t h, unsigned wsSessId );
// A UI was disconnected
rc_t onDisconnect( handle_t h, unsigned wsSessId ); rc_t onDisconnect( handle_t h, unsigned wsSessId );
// Receive a msg from a remote UI
rc_t onReceive( handle_t h, unsigned wsSessId, const void* msg, unsigned byteN ); rc_t onReceive( handle_t h, unsigned wsSessId, const void* msg, unsigned byteN );
unsigned findElementAppId( handle_t h, unsigned parentUuId, const char* eleName ); unsigned findElementAppId( handle_t h, unsigned parentUuId, const char* eleName );
@ -102,6 +107,7 @@ namespace cw
rc_t createProg( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, double minValue, double maxValue ); rc_t createProg( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, double minValue, double maxValue );
rc_t createProg( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, double minValue, double maxValue, double value ); rc_t createProg( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title, double minValue, double maxValue, double value );
rc_t createLog( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title ); rc_t createLog( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title );
rc_t createList( handle_t h, unsigned& uuIdRef, unsigned wsSessId, unsigned parentUuId, const char* eleName, unsigned appId, const char* clas, const char* title );
rc_t setNumbRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value ); rc_t setNumbRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double stepValue, unsigned decPl, double value );
rc_t setProgRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double value ); rc_t setProgRange( handle_t h, unsigned wsSessId, unsigned uuId, double minValue, double maxValue, double value );
@ -119,6 +125,8 @@ namespace cw
rc_t sendValueDouble( handle_t h, unsigned wsSessId, unsigned uuId, double value ); rc_t sendValueDouble( handle_t h, unsigned wsSessId, unsigned uuId, double value );
rc_t sendValueString( handle_t h, unsigned wsSessId, unsigned uuId, const char* value ); rc_t sendValueString( handle_t h, unsigned wsSessId, unsigned uuId, const char* value );
void report( handle_t h );
namespace ws namespace ws
@ -177,9 +185,6 @@ namespace cw
websock::handle_t websockHandle( handle_t h ); websock::handle_t websockHandle( handle_t h );
ui::handle_t uiHandle( handle_t h ); ui::handle_t uiHandle( handle_t h );
} }
namespace srv namespace srv

View File

@ -36,6 +36,8 @@ namespace cw
unsigned myPanelUuId; unsigned myPanelUuId;
unsigned logUuId; unsigned logUuId;
const object_t* listEleCfg;
} ui_test_t; } ui_test_t;
// Application Id's for UI elements // Application Id's for UI elements
@ -43,7 +45,6 @@ namespace cw
{ {
// Programatically created UI elements // Programatically created UI elements
kDivId, kDivId,
kBtnId,
kCheckId, kCheckId,
kSelectId, kSelectId,
kOption0Id, kOption0Id,
@ -57,6 +58,7 @@ namespace cw
kLogId, kLogId,
// Resource Based elements // Resource Based elements
kQuitBtnId,
kPanelDivId, kPanelDivId,
kPanelBtn1Id, kPanelBtn1Id,
kPanelCheck1Id, kPanelCheck1Id,
@ -66,7 +68,8 @@ namespace cw
kSelId, kSelId,
kOpt1Id, kOpt1Id,
kOpt2Id, kOpt2Id,
kOpt3Id kOpt3Id,
kListId
}; };
rc_t _uiTestCreateUi( ui_test_t* p, unsigned wsSessId ) rc_t _uiTestCreateUi( ui_test_t* p, unsigned wsSessId )
@ -83,9 +86,6 @@ namespace cw
if((rc = createDiv( uiH, p->myPanelUuId, wsSessId, kInvalidId, "myDivId", kDivId, "divClass", "My Panel" )) != kOkRC ) if((rc = createDiv( uiH, p->myPanelUuId, wsSessId, kInvalidId, "myDivId", kDivId, "divClass", "My Panel" )) != kOkRC )
goto errLabel; goto errLabel;
if((rc = createButton( uiH, uuid, wsSessId, p->myPanelUuId, "myBtnId", kBtnId, "btnClass", "Quit" )) != kOkRC )
goto errLabel;
if((rc = createCheck( uiH, uuid, wsSessId, p->myPanelUuId, "myCheckId", kCheckId, "checkClass", "Check Me", true )) != kOkRC ) if((rc = createCheck( uiH, uuid, wsSessId, p->myPanelUuId, "myCheckId", kCheckId, "checkClass", "Check Me", true )) != kOkRC )
goto errLabel; goto errLabel;
@ -117,9 +117,6 @@ namespace cw
if((rc = createLog( uiH, p->logUuId, wsSessId, p->myPanelUuId, "myLogId", kLogId, "logClass", "My Log (click toggles auto-scroll)" )) != kOkRC ) if((rc = createLog( uiH, p->logUuId, wsSessId, p->myPanelUuId, "myLogId", kLogId, "logClass", "My Log (click toggles auto-scroll)" )) != kOkRC )
goto errLabel; goto errLabel;
//if((rc = createFromFile( uiH, p->uiCfgFn, wsSessId )) != kOkRC )
// goto errLabel;
errLabel: errLabel:
return rc; return rc;
} }
@ -140,26 +137,36 @@ namespace cw
} }
rc_t _insert_log_line( ui_test_t* p, unsigned wsSessId, const char* text ) rc_t _insert_list_ele( ui_test_t* p, unsigned wsSessId )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
if( p->listEleCfg != nullptr )
{
handle_t uiH = srv::uiHandle(p->wsUiSrvH); handle_t uiH = srv::uiHandle(p->wsUiSrvH);
unsigned listUuId = findElementUuId( uiH, kListId );
//rc = ui::sendValueString( uiH, wsSessId, p->logUuId, text ); printf("list uuid:%i\n",listUuId);
rc = ui::setLogLine( uiH, wsSessId, p->logUuId, text );
rc = createFromObject( uiH, p->listEleCfg, wsSessId, listUuId );
}
return rc; return rc;
} }
rc_t _insert_log_line( ui_test_t* p, unsigned wsSessId, const char* text )
{
return ui::setLogLine( srv::uiHandle(p->wsUiSrvH), wsSessId, p->logUuId, text );
}
rc_t _handleUiValueMsg( ui_test_t* p, unsigned wsSessId, unsigned parentAppId, unsigned uuId, unsigned appId, const value_t* v ) rc_t _handleUiValueMsg( ui_test_t* p, unsigned wsSessId, unsigned parentAppId, unsigned uuId, unsigned appId, const value_t* v )
{ {
rc_t rc = kOkRC; rc_t rc = kOkRC;
switch( appId ) switch( appId )
{ {
case kBtnId: case kQuitBtnId:
p->quitFl.store(true); p->quitFl.store(true);
break; break;
@ -205,6 +212,8 @@ namespace cw
case kPanelCheck1Id: case kPanelCheck1Id:
printf("check 1: %i\n",v->u.b); printf("check 1: %i\n",v->u.b);
p->appCheck1Fl = v->u.b; p->appCheck1Fl = v->u.b;
ui::report( srv::uiHandle(p->wsUiSrvH) );
break; break;
case kPanelBtn2Id: case kPanelBtn2Id:
@ -215,6 +224,7 @@ namespace cw
case kPanelCheck2Id: case kPanelCheck2Id:
printf("check 1: %i\n",v->u.b); printf("check 1: %i\n",v->u.b);
p->appCheck1Fl = v->u.b; p->appCheck1Fl = v->u.b;
_insert_list_ele( p, wsSessId );
break; break;
case kPanelFloaterId: case kPanelFloaterId:
@ -298,7 +308,7 @@ namespace cw
break; break;
case kInitOpId: case kInitOpId:
_uiTestCreateUi(p,wsSessId); //_uiTestCreateUi(p,wsSessId);
break; break;
case kValueOpId: case kValueOpId:
@ -328,6 +338,7 @@ cw::rc_t cw::ui::test( const object_t* cfg )
// Application Id's for the resource based UI elements. // Application Id's for the resource based UI elements.
appIdMap_t mapA[] = appIdMap_t mapA[] =
{ {
{ kRootAppId, kQuitBtnId, "myQuitBtnId" },
{ kRootAppId, kPanelDivId, "panelDivId" }, { kRootAppId, kPanelDivId, "panelDivId" },
{ kPanelDivId, kPanelBtn1Id, "myBtn1Id" }, { kPanelDivId, kPanelBtn1Id, "myBtn1Id" },
{ kPanelDivId, kPanelCheck1Id, "myCheck1Id" }, { kPanelDivId, kPanelCheck1Id, "myCheck1Id" },
@ -338,6 +349,8 @@ cw::rc_t cw::ui::test( const object_t* cfg )
{ kSelId, kOpt1Id, "myOpt1" }, { kSelId, kOpt1Id, "myOpt1" },
{ kSelId, kOpt2Id, "myOpt2" }, { kSelId, kOpt2Id, "myOpt2" },
{ kSelId, kOpt3Id, "myOpt3" }, { kSelId, kOpt3Id, "myOpt3" },
{ kPanelDivId, kListId, "myListId" }
}; };
unsigned mapN = sizeof(mapA)/sizeof(mapA[0]); unsigned mapN = sizeof(mapA)/sizeof(mapA[0]);
@ -355,8 +368,6 @@ cw::rc_t cw::ui::test( const object_t* cfg )
goto errLabel; goto errLabel;
} }
app->quitFl.store(false); app->quitFl.store(false);
// Initial values for the test applications // Initial values for the test applications
@ -371,6 +382,9 @@ cw::rc_t cw::ui::test( const object_t* cfg )
app->appNumb = 1.23; app->appNumb = 1.23;
app->appSelId = kOpt3Id; app->appSelId = kOpt3Id;
if((rc = cfg->getv( "listEle", app->listEleCfg )) != kOkRC )
rc = cwLogError( rc, "The list element cfg. was not found.");
//app->uiCfgFn = "/home/kevin/src/cwtest/src/libcw/html/uiTest/ui.cfg"; //app->uiCfgFn = "/home/kevin/src/cwtest/src/libcw/html/uiTest/ui.cfg";