cawUi.h/cpp,cawUiDecl.h : Initial commit.
This commit is contained in:
parent
646004c02f
commit
be3eddfbfa
@ -65,7 +65,7 @@ include src/libcw/Makefile.am
|
|||||||
#lib_LTLIBRARIES += libcw.la
|
#lib_LTLIBRARIES += libcw.la
|
||||||
#include_HEADERS += $(libcwHDR)
|
#include_HEADERS += $(libcwHDR)
|
||||||
|
|
||||||
src_caw_caw_SOURCES = $(libcwHDR) $(libcwSRC) src/caw/main.cpp
|
src_caw_caw_SOURCES = $(libcwHDR) $(libcwSRC) src/caw/main.cpp src/caw/cawUi.cpp
|
||||||
|
|
||||||
# 1) autoconfig manual recommends setting direct referenes to non-3rd party libraries rather than using -L and -l
|
# 1) autoconfig manual recommends setting direct referenes to non-3rd party libraries rather than using -L and -l
|
||||||
# 2) -ldl is required for dlopen(),dlclose() ...
|
# 2) -ldl is required for dlopen(),dlclose() ...
|
||||||
|
362
src/caw/cawUi.cpp
Normal file
362
src/caw/cawUi.cpp
Normal file
@ -0,0 +1,362 @@
|
|||||||
|
#include "cwCommon.h"
|
||||||
|
#include "cwLog.h"
|
||||||
|
#include "cwCommonImpl.h"
|
||||||
|
#include "cwTest.h"
|
||||||
|
#include "cwMem.h"
|
||||||
|
#include "cwText.h"
|
||||||
|
#include "cwObject.h"
|
||||||
|
#include "cwFileSys.h"
|
||||||
|
#include "cwIo.h"
|
||||||
|
|
||||||
|
#include "cwVectOps.h"
|
||||||
|
#include "cwMtx.h"
|
||||||
|
#include "cwDspTypes.h" // real_t, sample_t
|
||||||
|
#include "cwTime.h"
|
||||||
|
#include "cwMidiDecls.h"
|
||||||
|
|
||||||
|
#include "cwFlowDecl.h"
|
||||||
|
#include "cwFlowTypes.h"
|
||||||
|
#include "cwFlow.h"
|
||||||
|
#include "cwIoFlowCtl.h"
|
||||||
|
|
||||||
|
#include "cawUiDecl.h"
|
||||||
|
#include "cawUi.h"
|
||||||
|
|
||||||
|
using namespace cw;
|
||||||
|
|
||||||
|
namespace caw {
|
||||||
|
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct ui_var_str
|
||||||
|
{
|
||||||
|
|
||||||
|
} ui_var_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct ui_str
|
||||||
|
{
|
||||||
|
io::handle_t ioH;
|
||||||
|
io_flow_ctl::handle_t ioFlowH;
|
||||||
|
const flow::ui_net_t* ui_net;
|
||||||
|
|
||||||
|
|
||||||
|
} ui_t;
|
||||||
|
|
||||||
|
|
||||||
|
ui_t* _handleToPtr( handle_t h )
|
||||||
|
{ return handleToPtr<handle_t,ui_t>(h); }
|
||||||
|
|
||||||
|
rc_t _destroy( ui_t* p )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
mem::release(p);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _create_bool_widgets( ui_t* p, unsigned widgetListUuId, const flow::ui_var_t* ui_var, unsigned& uuid_ref )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
if((rc = uiCreateCheck(p->ioH, uuid_ref, widgetListUuId, nullptr, kCheckWidgetId, kInvalidId, nullptr, ui_var->label )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Check box widget create failed on '%s'.",cwStringNullGuard(ui_var->label));
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _create_number_widget( ui_t* p, unsigned widgetListUuId, const flow::ui_var_t* ui_var, unsigned appId, unsigned value_type_flag, unsigned& uuid_ref, double min_val, double max_val, double step, unsigned dec_pl )
|
||||||
|
{
|
||||||
|
rc_t rc;
|
||||||
|
|
||||||
|
if((rc = uiCreateNumb( p->ioH, uuid_ref, widgetListUuId, nullptr, appId, kInvalidId, nullptr, ui_var->label, min_val, max_val, step, dec_pl )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Integer widget create failed on '%s'.",cwStringNullGuard(ui_var->label));
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _create_string_widgets( ui_t* p, unsigned widgetListUuId, const flow::ui_var_t* ui_var, unsigned& uuid_ref )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
if((rc = uiCreateStr( p->ioH, uuid_ref, widgetListUuId, nullptr, kStringWidgetId, kInvalidId, nullptr, ui_var->label )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"String widget create failed on '%s'.",cwStringNullGuard(ui_var->label));
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rc_t _create_var_ui( ui_t* p, unsigned parentListUuId, const flow::ui_var_t* ui_var, unsigned var_idx )
|
||||||
|
{
|
||||||
|
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
unsigned widgetListUuId = kInvalidId;
|
||||||
|
unsigned varUuId = kInvalidId;
|
||||||
|
unsigned value_type_flag = 0;
|
||||||
|
unsigned widget_uuId = kInvalidId;
|
||||||
|
|
||||||
|
// insert the var panel
|
||||||
|
if((rc = uiCreateFromRsrc( p->ioH, "var", parentListUuId, var_idx )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if this is a blank panel
|
||||||
|
if( ui_var == nullptr )
|
||||||
|
goto errLabel;
|
||||||
|
|
||||||
|
value_type_flag = ui_var->value_tid & flow::kTypeMask;
|
||||||
|
|
||||||
|
varUuId = uiFindElementUuId( p->ioH, parentListUuId, kVarPanelId, var_idx );
|
||||||
|
widgetListUuId = uiFindElementUuId( p->ioH, varUuId, kWidgetListId, kInvalidId );
|
||||||
|
|
||||||
|
//printf("%i %i %i\n",var_idx, varUuId,widgetListUuId);
|
||||||
|
|
||||||
|
switch( value_type_flag )
|
||||||
|
{
|
||||||
|
case flow::kBoolTFl:
|
||||||
|
rc = _create_bool_widgets(p,widgetListUuId,ui_var,widget_uuId);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case flow::kIntTFl:
|
||||||
|
{
|
||||||
|
int min_val = std::numeric_limits<int>::min();
|
||||||
|
int max_val = std::numeric_limits<int>::max();
|
||||||
|
rc = _create_number_widget(p,widgetListUuId,ui_var, kIntWidgetId, flow::kIntTFl, widget_uuId, min_val, max_val, 1, 1 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case flow::kUIntTFl:
|
||||||
|
{
|
||||||
|
unsigned min_val = 0;
|
||||||
|
unsigned max_val = std::numeric_limits<unsigned>::max();
|
||||||
|
rc = _create_number_widget(p,widgetListUuId,ui_var, kUIntWidgetId, flow::kUIntTFl, widget_uuId, min_val, max_val, 1, 1 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case flow::kFloatTFl:
|
||||||
|
{
|
||||||
|
float min_val = std::numeric_limits<float>::min();
|
||||||
|
float max_val = std::numeric_limits<float>::max();
|
||||||
|
rc = _create_number_widget(p,widgetListUuId,ui_var, kFloatWidgetId, flow::kFloatTFl, widget_uuId, min_val, max_val, 0.1, 2 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case flow::kDoubleTFl:
|
||||||
|
{
|
||||||
|
double min_val = std::numeric_limits<float>::min();
|
||||||
|
double max_val = std::numeric_limits<float>::max();
|
||||||
|
rc = _create_number_widget(p,widgetListUuId,ui_var, kDoubleWidgetId, flow::kDoubleTFl, widget_uuId, min_val, max_val, 0.1, 2 );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case flow::kStringTFl:
|
||||||
|
rc = _create_string_widgets(p,widgetListUuId,ui_var,widget_uuId);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
const char* type_label;
|
||||||
|
if((type_label = flow::value_type_flag_to_label(value_type_flag)) != nullptr )
|
||||||
|
cwLogWarning("No UI widgets for type:%s",type_label);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cwLogError(kInvalidArgRC,"The value type flag: 0x%x is not known. No UI widget was created.",value_type_flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
goto errLabel;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( widget_uuId != kInvalidId )
|
||||||
|
uiSetBlob(p->ioH,widget_uuId, &ui_var, sizeof(&ui_var));
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
if(rc != kOkRC )
|
||||||
|
rc = cwLogError(rc,"Processor UI creation failed on %s:%i.",cwStringNullGuard(ui_var->label),ui_var->label_sfx_id);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns 0 if all var's on on ch_idx == kInvalidId
|
||||||
|
// otherwise returns channel count (1=mono,2=stereo, ...)
|
||||||
|
unsigned _calc_max_chan_count( const flow::ui_proc_t* ui_proc )
|
||||||
|
{
|
||||||
|
unsigned n = 0;
|
||||||
|
for(unsigned i=0; i<ui_proc->varN; ++i)
|
||||||
|
if( ui_proc->varA[i].ch_cnt != kInvalidCnt && ui_proc->varA[i].ch_cnt > n )
|
||||||
|
n = ui_proc->varA[i].ch_cnt;
|
||||||
|
|
||||||
|
return n==0 ? 1 : n;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _create_proc_ui( ui_t* p, unsigned parentListUuId, const flow::ui_proc_t* ui_proc, unsigned proc_idx )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
unsigned procPanelUuId = kInvalidId;
|
||||||
|
unsigned chanListUuId = kInvalidId;
|
||||||
|
unsigned chN = _calc_max_chan_count(ui_proc);
|
||||||
|
|
||||||
|
if((rc = uiCreateFromRsrc( p->ioH, "proc", parentListUuId, proc_idx )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
procPanelUuId = uiFindElementUuId( p->ioH, parentListUuId, kProcPanelId, proc_idx );
|
||||||
|
chanListUuId = uiFindElementUuId( p->ioH, procPanelUuId, kChanListId, kInvalidId );
|
||||||
|
|
||||||
|
//printf("proc_idx: %i %i %i : chN:%i\n",proc_idx, parentListUuId, procPanelUuId,chN);
|
||||||
|
|
||||||
|
uiSendValue( p->ioH, uiFindElementUuId(p->ioH, procPanelUuId, kProcInstLabelId, kInvalidId), ui_proc->label );
|
||||||
|
uiSendValue( p->ioH, uiFindElementUuId(p->ioH, procPanelUuId, kProcInstSfxId, kInvalidId), ui_proc->label_sfx_id );
|
||||||
|
|
||||||
|
|
||||||
|
// for each channel
|
||||||
|
for(unsigned ui_ch_idx=0; ui_ch_idx<chN; ++ui_ch_idx)
|
||||||
|
{
|
||||||
|
unsigned chanPanelUuId = kInvalidId;
|
||||||
|
unsigned varListUuId = kInvalidIdx;
|
||||||
|
|
||||||
|
// create a chan. panel
|
||||||
|
if((rc = uiCreateFromRsrc( p->ioH, "chan", chanListUuId, ui_ch_idx )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
chanPanelUuId = uiFindElementUuId(p->ioH, chanListUuId, kChanPanelId, ui_ch_idx);
|
||||||
|
varListUuId = uiFindElementUuId(p->ioH, chanPanelUuId, kVarListId, kInvalidIdx );
|
||||||
|
|
||||||
|
for(unsigned j=0; j<ui_proc->varN; ++j)
|
||||||
|
{
|
||||||
|
const flow::ui_var_t* ui_var = ui_proc->varA + j;
|
||||||
|
|
||||||
|
|
||||||
|
// if this variable has no channelized duplicates and this is the 'any' ch. var
|
||||||
|
if( ui_var->ch_idx == flow::kAnyChIdx && ui_var->ch_cnt==flow::kAnyChIdx && ui_ch_idx==0 )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if this is a channelized variable and ui_ch_idx is the var's channel
|
||||||
|
if( ui_var->ch_idx != flow::kAnyChIdx && ui_var->ch_idx == ui_ch_idx )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//printf("proc_idx:%i %s : %i %i\n",proc_idx,ui_var->label,ui_var->ch_idx,ui_var->ch_cnt);
|
||||||
|
ui_var = nullptr; // insert a blank var panel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if((rc = _create_var_ui(p, varListUuId, ui_var, j)) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
if(rc != kOkRC )
|
||||||
|
rc = cwLogError(rc,"Processor UI creation failed on %s:%i.",cwStringNullGuard(ui_proc->label),ui_proc->label_sfx_id);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
rc_t _create_net_ui( ui_t* p, unsigned parentUuId, const flow::ui_net_t* ui_net )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
|
unsigned netPanelUuId = kInvalidId;
|
||||||
|
unsigned procListUuId = kInvalidId;
|
||||||
|
|
||||||
|
if((rc = uiCreateFromRsrc( p->ioH, "network", parentUuId, ui_net->poly_idx )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
netPanelUuId = uiFindElementUuId( p->ioH, parentUuId, kNetPanelId, ui_net->poly_idx );
|
||||||
|
procListUuId = uiFindElementUuId( p->ioH, netPanelUuId, "procListId" );
|
||||||
|
|
||||||
|
//printf("net:%i %i plist:%i\n",parentUuId, netPanelUuId,procListUuId);
|
||||||
|
|
||||||
|
for(unsigned i=0; i<ui_net->procN; ++i)
|
||||||
|
{
|
||||||
|
if((rc = _create_proc_ui( p, procListUuId, ui_net->procA+i, i )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
|
||||||
|
if(rc != kOkRC )
|
||||||
|
rc = cwLogError(rc,"Network UI creation failed.");
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cw::rc_t caw::ui::create( handle_t& hRef,
|
||||||
|
io::handle_t ioH,
|
||||||
|
io_flow_ctl::handle_t ioFlowH,
|
||||||
|
const flow::ui_net_t* ui_net)
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
if((rc = destroy(hRef)) != kOkRC )
|
||||||
|
return rc;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
ui_t* p = mem::allocZ<ui_t>();
|
||||||
|
p->ioH = ioH;
|
||||||
|
p->ioFlowH = ioFlowH;
|
||||||
|
p->ui_net = ui_net;
|
||||||
|
|
||||||
|
unsigned netPanelUuId = io::uiFindElementUuId( ioH, kRootNetPanelId );
|
||||||
|
|
||||||
|
if((rc = _create_net_ui( p, netPanelUuId, ui_net )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"UI create failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
cw::rc_t caw::ui::destroy( handle_t& hRef )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
ui_t* p = nullptr;
|
||||||
|
|
||||||
|
if(!hRef.isValid())
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
p = _handleToPtr(hRef);
|
||||||
|
|
||||||
|
if((rc = _destroy(p)) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"UI destroy failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
hRef.clear();
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
20
src/caw/cawUi.h
Normal file
20
src/caw/cawUi.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#ifndef cawUi_h
|
||||||
|
#define cawUi_h
|
||||||
|
|
||||||
|
|
||||||
|
namespace caw
|
||||||
|
{
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
typedef cw::handle<struct ui_str> handle_t;
|
||||||
|
|
||||||
|
cw::rc_t create( handle_t& hRef,
|
||||||
|
cw::io::handle_t ioH,
|
||||||
|
cw::io_flow_ctl::handle_t ioFlowH,
|
||||||
|
const cw::flow::ui_net_t* ui_net);
|
||||||
|
|
||||||
|
cw::rc_t destroy( handle_t& hRef );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
51
src/caw/cawUiDecl.h
Normal file
51
src/caw/cawUiDecl.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
namespace caw {
|
||||||
|
namespace ui {
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kPanelDivId,
|
||||||
|
kQuitBtnId,
|
||||||
|
kIoReportBtnId,
|
||||||
|
kNetPrintBtnId,
|
||||||
|
kReportBtnId,
|
||||||
|
kLatencyBtnId,
|
||||||
|
|
||||||
|
kPgmSelId,
|
||||||
|
kPgmPresetSelId,
|
||||||
|
kPgmLoadBtnId,
|
||||||
|
kRunCheckId,
|
||||||
|
|
||||||
|
kRootNetPanelId,
|
||||||
|
|
||||||
|
kNetPanelId,
|
||||||
|
kProcListId,
|
||||||
|
|
||||||
|
kProcPanelId,
|
||||||
|
kProcInstLabelId,
|
||||||
|
kProcInstSfxId,
|
||||||
|
kChanListId,
|
||||||
|
|
||||||
|
kChanPanelId,
|
||||||
|
kVarListId,
|
||||||
|
|
||||||
|
kVarPanelId,
|
||||||
|
kWidgetListId,
|
||||||
|
|
||||||
|
kCheckWidgetId,
|
||||||
|
kIntWidgetId,
|
||||||
|
kUIntWidgetId,
|
||||||
|
kFloatWidgetId,
|
||||||
|
kDoubleWidgetId,
|
||||||
|
kStringWidgetId,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
kPgmBaseSelId,
|
||||||
|
kPgmMaxSelId = kPgmBaseSelId + 1000,
|
||||||
|
kPgmPresetBaseSelId,
|
||||||
|
kPgmPresetMaxSelId = kPgmPresetBaseSelId + 1000
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user