Added calls to _set/clear_status(). Fixed memory leaks. Implemented kCorruptOpId() handling.
Added calls to update GUI from system log. Fixed fragment select logic. Added more button enable/disable logic and number range configuration. Added calls to set extra interactive variables in _apply_preset().
This commit is contained in:
parent
33e1945ab4
commit
09da65113f
@ -59,6 +59,8 @@ namespace cw
|
|||||||
|
|
||||||
kStatusId,
|
kStatusId,
|
||||||
|
|
||||||
|
kLogId,
|
||||||
|
|
||||||
kFragListId,
|
kFragListId,
|
||||||
kFragPanelId,
|
kFragPanelId,
|
||||||
kFragBegLocId,
|
kFragBegLocId,
|
||||||
@ -113,6 +115,7 @@ namespace cw
|
|||||||
{ kPanelDivId, kInsertBtnId, "insertBtnId" },
|
{ kPanelDivId, kInsertBtnId, "insertBtnId" },
|
||||||
{ kPanelDivId, kDeleteBtnId, "deleteBtnId" },
|
{ kPanelDivId, kDeleteBtnId, "deleteBtnId" },
|
||||||
{ kPanelDivId, kStatusId, "statusId" },
|
{ kPanelDivId, kStatusId, "statusId" },
|
||||||
|
{ kPanelDivId, kLogId, "logId" },
|
||||||
|
|
||||||
{ kPanelDivId, kFragListId, "fragListId" },
|
{ kPanelDivId, kFragListId, "fragListId" },
|
||||||
{ kFragListId, kFragPanelId, "fragPanelId" },
|
{ kFragListId, kFragPanelId, "fragPanelId" },
|
||||||
@ -165,6 +168,9 @@ namespace cw
|
|||||||
|
|
||||||
unsigned insertLoc; // last valid insert location id received from the GUI
|
unsigned insertLoc; // last valid insert location id received from the GUI
|
||||||
|
|
||||||
|
unsigned minLoc;
|
||||||
|
unsigned maxLoc;
|
||||||
|
|
||||||
unsigned beg_play_loc;
|
unsigned beg_play_loc;
|
||||||
unsigned end_play_loc;
|
unsigned end_play_loc;
|
||||||
|
|
||||||
@ -222,9 +228,10 @@ namespace cw
|
|||||||
const int sN = 128;
|
const int sN = 128;
|
||||||
char s[sN];
|
char s[sN];
|
||||||
vsnprintf(s,sN,fmt,vl);
|
vsnprintf(s,sN,fmt,vl);
|
||||||
|
|
||||||
uiSendValue( app->ioH, uiFindElementUuId(app->ioH,kStatusId), s );
|
uiSendValue( app->ioH, uiFindElementUuId(app->ioH,kStatusId), s );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _set_status( app_t* app, const char* fmt, ... )
|
void _set_status( app_t* app, const char* fmt, ... )
|
||||||
{
|
{
|
||||||
va_list vl;
|
va_list vl;
|
||||||
@ -233,10 +240,27 @@ namespace cw
|
|||||||
va_end(vl);
|
va_end(vl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _clear_status( app_t* app )
|
||||||
|
{
|
||||||
|
_set_status(app,"Ok");
|
||||||
|
}
|
||||||
|
|
||||||
|
void _log_output_func( void* arg, unsigned level, const char* text )
|
||||||
|
{
|
||||||
|
app_t* app = (app_t*)arg;
|
||||||
|
unsigned logUuId = uiFindElementUuId( app->ioH, kLogId);
|
||||||
|
|
||||||
|
uiSetLogLine( app->ioH, logUuId, text );
|
||||||
|
log::defaultOutput(nullptr,level,text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rc_t _free( app_t& app )
|
rc_t _free( app_t& app )
|
||||||
{
|
{
|
||||||
preset_sel::destroy(app.psH);
|
preset_sel::destroy(app.psH);
|
||||||
io_flow::destroy(app.ioFlowH);
|
io_flow::destroy(app.ioFlowH);
|
||||||
|
midi_record_play::destroy(app.mrpH);
|
||||||
|
score::destroy( app.scoreH );
|
||||||
mem::release(app.locMap);
|
mem::release(app.locMap);
|
||||||
return kOkRC;
|
return kOkRC;
|
||||||
}
|
}
|
||||||
@ -265,9 +289,9 @@ namespace cw
|
|||||||
{
|
{
|
||||||
io_flow::apply_preset( app->ioFlowH, flow_cross::kNextDestId, preset_label );
|
io_flow::apply_preset( app->ioFlowH, flow_cross::kNextDestId, preset_label );
|
||||||
|
|
||||||
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "wd_bal", "in", flow::kAnyChIdx, frag->wetDryGain );
|
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "wd_bal", "in", flow::kAnyChIdx, (dsp::real_t)frag->wetDryGain );
|
||||||
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "split_wet", "gain", flow::kAnyChIdx, frag->igain );
|
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "split_wet", "gain", flow::kAnyChIdx, (dsp::real_t)frag->igain );
|
||||||
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "cmp", "ogain", flow::kAnyChIdx, frag->ogain );
|
io_flow::set_variable_value( app->ioFlowH, flow_cross::kNextDestId, "cmp", "ogain", flow::kAnyChIdx, (dsp::real_t)frag->ogain );
|
||||||
|
|
||||||
io_flow::begin_cross_fade( app->ioFlowH, frag->fadeOutMs );
|
io_flow::begin_cross_fade( app->ioFlowH, frag->fadeOutMs );
|
||||||
}
|
}
|
||||||
@ -519,17 +543,58 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _frag_uuid_to_blob( app_t* app, unsigned uuId, ui_blob_t*& blobRef )
|
||||||
|
{
|
||||||
|
unsigned blobByteN = 0;
|
||||||
|
|
||||||
|
if(( blobRef = (ui_blob_t*)io::uiGetBlob( app->ioH, uuId, blobByteN )) == nullptr || blobByteN != sizeof(ui_blob_t) )
|
||||||
|
return cwLogError(kInvalidStateRC,"A fragment UI blob was missing or corrupt for GUI uuid:%i.",uuId);
|
||||||
|
|
||||||
|
return kOkRC;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _enable_global_play_btn( app_t* app, bool enableFl )
|
||||||
|
{
|
||||||
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStartBtnId ), enableFl );
|
||||||
|
//io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStopBtnId ), enableFl );
|
||||||
|
}
|
||||||
|
|
||||||
|
void _enable_frag_play_btn( app_t* app, ui_blob_t* blob, unsigned, const char* ){}
|
||||||
|
void _enable_frag_play_btn( app_t* app, ui_blob_t* blob, const char*, unsigned ){}
|
||||||
|
void _enable_frag_play_btn( app_t* app, ui_blob_t* blob, unsigned begPlayLoc, unsigned endPlayLoc )
|
||||||
|
{
|
||||||
|
bool enableFl = begPlayLoc < endPlayLoc;
|
||||||
|
unsigned fragUuId = kInvalidId;
|
||||||
|
unsigned fragPlayBtnUuId = kInvalidId;
|
||||||
|
|
||||||
|
if((fragUuId = frag_to_gui_id( app->psH, blob->fragId )) != kInvalidId )
|
||||||
|
if((fragPlayBtnUuId = uiFindElementUuId( app->ioH, fragUuId, kFragPlayBtnId, blob->presetId )) != kInvalidId )
|
||||||
|
{
|
||||||
|
uiSetEnable( app->ioH, fragPlayBtnUuId, enableFl );
|
||||||
|
if( enableFl )
|
||||||
|
_clear_status(app);
|
||||||
|
else
|
||||||
|
_set_status(app,"Invalid fragment play range.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void _disable_frag_play_btn( app_t* app, unsigned fragBegEndUuId )
|
||||||
|
{
|
||||||
|
ui_blob_t* blob = nullptr;
|
||||||
|
if(_frag_uuid_to_blob(app, fragBegEndUuId, blob) == kOkRC )
|
||||||
|
_enable_frag_play_btn( app, blob, 1, (unsigned)0 );
|
||||||
|
}
|
||||||
|
|
||||||
// Called when a UI value is changed in a fragment panel (e.g. gain, fadeMs, ...)
|
// Called when a UI value is changed in a fragment panel (e.g. gain, fadeMs, ...)
|
||||||
template< typename T>
|
template< typename T>
|
||||||
rc_t _on_ui_frag_value( app_t* app, unsigned uuId, const T& value )
|
rc_t _on_ui_frag_value( app_t* app, unsigned uuId, const T& value )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
unsigned blobByteN = 0;
|
|
||||||
ui_blob_t* blob = nullptr;
|
ui_blob_t* blob = nullptr;
|
||||||
|
|
||||||
|
if((rc = _frag_uuid_to_blob(app, uuId, blob)) != kOkRC )
|
||||||
if(( blob = (ui_blob_t*)io::uiGetBlob( app->ioH, uuId, blobByteN )) == nullptr || blobByteN != sizeof(ui_blob_t) )
|
goto errLabel;
|
||||||
return cwLogError(kInvalidStateRC,"A fragment UI blob was missing or corrupt.");
|
|
||||||
|
|
||||||
rc = preset_sel::set_value( app->psH, blob->fragId, blob->varId, blob->presetId, value );
|
rc = preset_sel::set_value( app->psH, blob->fragId, blob->varId, blob->presetId, value );
|
||||||
|
|
||||||
@ -552,8 +617,25 @@ namespace cw
|
|||||||
case preset_sel::kPlayBtnVarId:
|
case preset_sel::kPlayBtnVarId:
|
||||||
_do_play_fragment( app, blob->fragId );
|
_do_play_fragment( app, blob->fragId );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case preset_sel::kBegPlayLocVarId:
|
||||||
|
{
|
||||||
|
unsigned endPlayLoc;
|
||||||
|
get_value( app->psH, blob->fragId, preset_sel::kEndPlayLocVarId, blob->presetId, endPlayLoc );
|
||||||
|
_enable_frag_play_btn( app, blob, value, endPlayLoc );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case preset_sel::kEndPlayLocVarId:
|
||||||
|
{
|
||||||
|
unsigned begPlayLoc;
|
||||||
|
get_value( app->psH, blob->fragId, preset_sel::kBegPlayLocVarId, blob->presetId, begPlayLoc );
|
||||||
|
_enable_frag_play_btn( app, blob, begPlayLoc, value );
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -613,7 +695,7 @@ namespace cw
|
|||||||
unsigned fragEndLocUuId = kInvalidId;
|
unsigned fragEndLocUuId = kInvalidId;
|
||||||
unsigned fragPresetRowUuId = kInvalidId;
|
unsigned fragPresetRowUuId = kInvalidId;
|
||||||
unsigned presetN = preset_sel::preset_count( app->psH );
|
unsigned presetN = preset_sel::preset_count( app->psH );
|
||||||
|
unsigned fragBegLoc = 0;
|
||||||
|
|
||||||
// create the UI object
|
// create the UI object
|
||||||
if((rc = io::uiCreateFromObject( app->ioH, app->frag_panel_cfg, fragListUuId, fragChanId )) != kOkRC )
|
if((rc = io::uiCreateFromObject( app->ioH, app->frag_panel_cfg, fragListUuId, fragChanId )) != kOkRC )
|
||||||
@ -639,6 +721,11 @@ namespace cw
|
|||||||
// Set the fragment panel order
|
// Set the fragment panel order
|
||||||
io::uiSetOrderKey( app->ioH, fragPanelUuId, endLoc );
|
io::uiSetOrderKey( app->ioH, fragPanelUuId, endLoc );
|
||||||
|
|
||||||
|
// Set the fragment beg/end play range
|
||||||
|
get_value( app->psH, fragId, preset_sel::kBegPlayLocVarId, kInvalidId, fragBegLoc );
|
||||||
|
uiSetNumbRange( app->ioH, io::uiFindElementUuId(app->ioH, fragPanelUuId, kFragBegPlayLocId, fragChanId), app->minLoc, app->maxLoc, 1, 0, fragBegLoc );
|
||||||
|
uiSetNumbRange( app->ioH, io::uiFindElementUuId(app->ioH, fragPanelUuId, kFragEndPlayLocId, fragChanId), app->minLoc, app->maxLoc, 1, 0, endLoc );
|
||||||
|
|
||||||
|
|
||||||
// Attach blobs to the UI to allow convenient access back to the prese_sel data record
|
// Attach blobs to the UI to allow convenient access back to the prese_sel data record
|
||||||
_frag_set_ui_blob(app, io::uiFindElementUuId(app->ioH, fragPanelUuId, kFragInGainId, fragChanId), fragId, preset_sel::kInGainVarId, kInvalidId );
|
_frag_set_ui_blob(app, io::uiFindElementUuId(app->ioH, fragPanelUuId, kFragInGainId, fragChanId), fragId, preset_sel::kInGainVarId, kInvalidId );
|
||||||
@ -656,6 +743,7 @@ namespace cw
|
|||||||
if((rc = _create_frag_preset_ctl(app, fragId, fragPresetRowUuId, presetN, preset_idx )) != kOkRC )
|
if((rc = _create_frag_preset_ctl(app, fragId, fragPresetRowUuId, presetN, preset_idx )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
|
// set the uuid associated with this fragment
|
||||||
preset_sel::set_value( app->psH, fragId, preset_sel::kGuiUuIdVarId, kInvalidId, fragPanelUuId );
|
preset_sel::set_value( app->psH, fragId, preset_sel::kGuiUuIdVarId, kInvalidId, fragPanelUuId );
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
@ -703,12 +791,6 @@ namespace cw
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the fragment id
|
|
||||||
// TODO:
|
|
||||||
// BUG BUG BUG: there is nothing to prevent the new fragment id from conflicting with the existing fragment id's
|
|
||||||
// The correct way to handle this is to reset all the fragment id's in a single operation after the UI is created
|
|
||||||
//preset_sel::set_value(app->psH, f->fragId, preset_sel::kFragIdVarId, kInvalidId, fragId );
|
|
||||||
|
|
||||||
_update_frag_ui(app, fragId );
|
_update_frag_ui(app, fragId );
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -744,6 +826,11 @@ namespace cw
|
|||||||
errLabel:
|
errLabel:
|
||||||
mem::release(fn);
|
mem::release(fn);
|
||||||
|
|
||||||
|
if( rc == kOkRC )
|
||||||
|
_clear_status(app);
|
||||||
|
else
|
||||||
|
_set_status(app,"Save failed.");
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -755,7 +842,12 @@ namespace cw
|
|||||||
unsigned midiEventN = 0;
|
unsigned midiEventN = 0;
|
||||||
midi_record_play::midi_msg_t* m = nullptr;
|
midi_record_play::midi_msg_t* m = nullptr;
|
||||||
|
|
||||||
printf("Loading\n");
|
// if the score is already loaded
|
||||||
|
if( app->scoreH.isValid() )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
cwLogInfo("Loading");
|
||||||
|
_set_status(app,"Loading...");
|
||||||
|
|
||||||
// create the score
|
// create the score
|
||||||
if((rc = score::create( app->scoreH, app->scoreFn )) != kOkRC )
|
if((rc = score::create( app->scoreH, app->scoreFn )) != kOkRC )
|
||||||
@ -777,6 +869,8 @@ namespace cw
|
|||||||
mem::free(app->locMap);
|
mem::free(app->locMap);
|
||||||
app->locMap = mem::allocZ<loc_map_t>( midiEventN );
|
app->locMap = mem::allocZ<loc_map_t>( midiEventN );
|
||||||
app->locMapN = midiEventN;
|
app->locMapN = midiEventN;
|
||||||
|
app->minLoc = midiEventN;
|
||||||
|
app->maxLoc = 0;
|
||||||
|
|
||||||
// allocate the the player msg array
|
// allocate the the player msg array
|
||||||
m = mem::allocZ<midi_record_play::midi_msg_t>( midiEventN );
|
m = mem::allocZ<midi_record_play::midi_msg_t>( midiEventN );
|
||||||
@ -795,6 +889,9 @@ namespace cw
|
|||||||
app->locMap[i].loc = e->loc;
|
app->locMap[i].loc = e->loc;
|
||||||
app->locMap[i].timestamp = m[i].timestamp;
|
app->locMap[i].timestamp = m[i].timestamp;
|
||||||
|
|
||||||
|
app->minLoc = std::min(app->minLoc,e->loc);
|
||||||
|
app->maxLoc = std::max(app->maxLoc,e->loc);
|
||||||
|
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -808,12 +905,19 @@ namespace cw
|
|||||||
mem::free(m);
|
mem::free(m);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set the range of the global play location controls
|
||||||
|
io::uiSetNumbRange( app->ioH, io::uiFindElementUuId(app->ioH, kBegPlayLocNumbId), app->minLoc, app->maxLoc, 1, 0, app->minLoc );
|
||||||
|
io::uiSetNumbRange( app->ioH, io::uiFindElementUuId(app->ioH, kEndPlayLocNumbId), app->minLoc, app->maxLoc, 1, 0, app->maxLoc );
|
||||||
|
|
||||||
|
|
||||||
// enable the 'End Loc' number box since the score is loaded
|
// enable the 'End Loc' number box since the score is loaded
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kInsertLocId ), true );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kInsertLocId ), true );
|
||||||
|
|
||||||
// update the current event and event count
|
// update the current event and event count
|
||||||
_update_event_ui(app);
|
_update_event_ui(app);
|
||||||
|
|
||||||
|
|
||||||
// enable the start/stop buttons
|
// enable the start/stop buttons
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStartBtnId ), true );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStartBtnId ), true );
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStopBtnId ), true );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStopBtnId ), true );
|
||||||
@ -825,12 +929,20 @@ namespace cw
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kLoadBtnId ), false );
|
||||||
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kSaveBtnId ), true );
|
||||||
|
|
||||||
cwLogInfo("'%s' loaded.",app->scoreFn);
|
cwLogInfo("'%s' loaded.",app->scoreFn);
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
|
|
||||||
_update_event_ui( app );
|
_update_event_ui( app );
|
||||||
|
|
||||||
|
if( rc != kOkRC )
|
||||||
|
_set_status(app,"Load failed.");
|
||||||
|
else
|
||||||
|
_set_status(app,"%i MIDI events loaded.",midiEventN);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -873,13 +985,11 @@ namespace cw
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Called when the global play locations change
|
||||||
rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc)
|
rc_t _on_ui_play_loc(app_t* app, unsigned appId, unsigned loc)
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
// TODO: test value of loc and set border to red if it is not valid
|
|
||||||
// otherwise clear border
|
|
||||||
|
|
||||||
switch( appId )
|
switch( appId )
|
||||||
{
|
{
|
||||||
case kBegPlayLocNumbId:
|
case kBegPlayLocNumbId:
|
||||||
@ -891,6 +1001,16 @@ namespace cw
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool enableFl = app->beg_play_loc < app->end_play_loc;
|
||||||
|
|
||||||
|
_enable_global_play_btn(app, enableFl );
|
||||||
|
|
||||||
|
if(enableFl)
|
||||||
|
_clear_status(app);
|
||||||
|
else
|
||||||
|
_set_status(app,"Invalid play location range.");
|
||||||
|
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -905,14 +1025,12 @@ namespace cw
|
|||||||
if( enableFl )
|
if( enableFl )
|
||||||
{
|
{
|
||||||
app->insertLoc = insertLoc;
|
app->insertLoc = insertLoc;
|
||||||
// TODO: Clear GUI error indicator
|
_clear_status(app);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app->insertLoc = kInvalidId;
|
app->insertLoc = kInvalidId;
|
||||||
cwLogWarning("Location '%i' is not valid.",insertLoc);
|
_set_status(app,"Location '%i' is not valid.",insertLoc);
|
||||||
// TODO: Set GUI error indicator
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -923,6 +1041,7 @@ namespace cw
|
|||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
unsigned fragId = kInvalidId;
|
unsigned fragId = kInvalidId;
|
||||||
loc_map_t* loc_ts = nullptr;
|
loc_map_t* loc_ts = nullptr;
|
||||||
|
const preset_sel::frag_t* f = nullptr;;
|
||||||
|
|
||||||
// verify that frag panel resource object is initiailized
|
// verify that frag panel resource object is initiailized
|
||||||
if( app->frag_panel_cfg == nullptr)
|
if( app->frag_panel_cfg == nullptr)
|
||||||
@ -970,6 +1089,11 @@ namespace cw
|
|||||||
// update the fragment UI
|
// update the fragment UI
|
||||||
_update_frag_ui(app, fragId );
|
_update_frag_ui(app, fragId );
|
||||||
|
|
||||||
|
if((f = get_fragment(app->psH,fragId)) != nullptr && f->link != nullptr )
|
||||||
|
_update_frag_ui(app, f->link->fragId );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@ -979,6 +1103,7 @@ namespace cw
|
|||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
unsigned fragId = kInvalidId;
|
unsigned fragId = kInvalidId;
|
||||||
|
unsigned uuId = kInvalidId;
|
||||||
|
|
||||||
// get the fragment id (uuid) of the selected fragment
|
// get the fragment id (uuid) of the selected fragment
|
||||||
if((fragId = preset_sel::ui_select_fragment_id(app->psH)) == kInvalidId )
|
if((fragId = preset_sel::ui_select_fragment_id(app->psH)) == kInvalidId )
|
||||||
@ -987,12 +1112,19 @@ namespace cw
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// locate the uuid assocated with the specified fragid
|
||||||
|
if((uuId = preset_sel::frag_to_gui_id(app->psH,fragId)) == kInvalidId )
|
||||||
|
{
|
||||||
|
rc = cwLogError(kInvalidIdRC,"The uuId associated with the fragment id %i could not be found.",fragId);
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
// delete the fragment data record
|
// delete the fragment data record
|
||||||
if((rc = preset_sel::delete_fragment(app->psH,fragId)) != kOkRC )
|
if((rc = preset_sel::delete_fragment(app->psH,fragId)) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
// delete the fragment UI element
|
// delete the fragment UI element
|
||||||
if((rc = io::uiDestroyElement( app->ioH, fragId )) != kOkRC )
|
if((rc = io::uiDestroyElement( app->ioH, uuId )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
@ -1012,17 +1144,17 @@ namespace cw
|
|||||||
// disable start and stop buttons until a score is loaded
|
// disable start and stop buttons until a score is loaded
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStartBtnId ), false );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStartBtnId ), false );
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStopBtnId ), false );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kStopBtnId ), false );
|
||||||
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kSaveBtnId ), false );
|
||||||
|
|
||||||
const preset_sel::frag_t* f = preset_sel::get_fragment_base( app->psH );
|
const preset_sel::frag_t* f = preset_sel::get_fragment_base( app->psH );
|
||||||
for(; f!=nullptr; f=f->link)
|
for(; f!=nullptr; f=f->link)
|
||||||
_update_frag_ui( app, f->fragId );
|
_update_frag_ui( app, f->fragId );
|
||||||
|
|
||||||
_do_load(app);
|
//_do_load(app);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rc_t _onUiValue(app_t* app, const io::ui_msg_t& m )
|
rc_t _onUiValue(app_t* app, const io::ui_msg_t& m )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
@ -1039,8 +1171,8 @@ namespace cw
|
|||||||
|
|
||||||
case kReportBtnId:
|
case kReportBtnId:
|
||||||
//preset_sel::report( app->psH );
|
//preset_sel::report( app->psH );
|
||||||
io_flow::apply_preset( app->ioFlowH, 2000.0, app->tmp==0 ? "a" : "b");
|
//io_flow::apply_preset( app->ioFlowH, 2000.0, app->tmp==0 ? "a" : "b");
|
||||||
app->tmp = !app->tmp;
|
//app->tmp = !app->tmp;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kSaveBtnId:
|
case kSaveBtnId:
|
||||||
@ -1129,22 +1261,51 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _onUiCorrupt( app_t* app, const io::ui_msg_t& m )
|
||||||
|
{
|
||||||
|
switch( m.appId )
|
||||||
|
{
|
||||||
|
case kBegPlayLocNumbId:
|
||||||
|
case kEndPlayLocNumbId:
|
||||||
|
_enable_global_play_btn(app,false);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kInsertLocId:
|
||||||
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kInsertBtnId ), false );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kFragBegPlayLocId:
|
||||||
|
case kFragEndPlayLocId:
|
||||||
|
_disable_frag_play_btn(app, m.uuId );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return kOkRC;
|
||||||
|
}
|
||||||
|
|
||||||
rc_t _onUiClick( app_t* app, const io::ui_msg_t& m )
|
rc_t _onUiClick( app_t* app, const io::ui_msg_t& m )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
// get the last selected fragment
|
// get the last selected fragment
|
||||||
unsigned uuId = preset_sel::ui_select_fragment_id(app->psH);
|
unsigned prevFragId = preset_sel::ui_select_fragment_id(app->psH);
|
||||||
|
unsigned prevUuId = preset_sel::frag_to_gui_id(app->psH,prevFragId,false);
|
||||||
|
|
||||||
// is the last selected fragment the same as the clicked fragment
|
// is the last selected fragment the same as the clicked fragment
|
||||||
bool reclickFl = uuId == m.uuId;
|
bool reclickFl = prevUuId == m.uuId;
|
||||||
|
|
||||||
// if a different fragment was clicked then deselect the last fragment in the UI
|
// if a different fragment was clicked then deselect the last fragment in the UI
|
||||||
if( !reclickFl && uuId != kInvalidId )
|
if( !reclickFl )
|
||||||
uiSetSelect( app->ioH, uuId, false );
|
{
|
||||||
|
if(prevUuId != kInvalidId )
|
||||||
|
uiSetSelect( app->ioH, prevUuId, false );
|
||||||
|
|
||||||
// select or deselect the clicked fragment
|
// select or deselect the clicked fragment
|
||||||
uiSetSelect( app->ioH, m.uuId, !reclickFl );
|
uiSetSelect( app->ioH, m.uuId, !reclickFl );
|
||||||
|
}
|
||||||
|
|
||||||
// Note: calls to uiSetSelect() produce callbacks to _onUiSelect().
|
// Note: calls to uiSetSelect() produce callbacks to _onUiSelect().
|
||||||
|
|
||||||
@ -1154,15 +1315,22 @@ namespace cw
|
|||||||
rc_t _onUiSelect( app_t* app, const io::ui_msg_t& m )
|
rc_t _onUiSelect( app_t* app, const io::ui_msg_t& m )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
bool selectFl = m.value->u.b; // True/False if the fragment is being selected/deselected
|
bool selectFl = m.value->u.b; // True/False if the fragment is being selected/deselected
|
||||||
|
unsigned fragId = kInvalidId;
|
||||||
|
|
||||||
|
if((fragId = preset_sel::gui_to_frag_id(app->psH,m.uuId)) == kInvalidId )
|
||||||
|
{
|
||||||
|
rc = cwLogError(kInvalidIdRC,"The fragment assoicated with the UuId %i could not be found.",m.uuId);
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
// track the currently selected fragment.
|
// track the currently selected fragment.
|
||||||
preset_sel::ui_select_fragment( app->psH, m.uuId, selectFl );
|
preset_sel::ui_select_fragment( app->psH, fragId, selectFl );
|
||||||
|
|
||||||
// enable/disable the delete fragment button
|
// enable/disable the delete fragment button
|
||||||
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kDeleteBtnId ), selectFl );
|
io::uiSetEnable( app->ioH, io::uiFindElementUuId( app->ioH, kDeleteBtnId ), selectFl );
|
||||||
|
|
||||||
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1194,6 +1362,10 @@ namespace cw
|
|||||||
_onUiValue( app, m );
|
_onUiValue( app, m );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ui::kCorruptOpId:
|
||||||
|
_onUiCorrupt( app, m );
|
||||||
|
break;
|
||||||
|
|
||||||
case ui::kClickOpId:
|
case ui::kClickOpId:
|
||||||
_onUiClick( app, m );
|
_onUiClick( app, m );
|
||||||
break;
|
break;
|
||||||
@ -1296,6 +1468,8 @@ cw::rc_t cw::preset_sel_app::main( const object_t* cfg, const object_t* flow_pro
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log::setOutputCb( log::globalHandle(),_log_output_func,&app);
|
||||||
|
|
||||||
// create the preset selection state object
|
// create the preset selection state object
|
||||||
if((rc = create(app.psH, app.presets_cfg )) != kOkRC )
|
if((rc = create(app.psH, app.presets_cfg )) != kOkRC )
|
||||||
{
|
{
|
||||||
|
@ -19,24 +19,27 @@
|
|||||||
row: {
|
row: {
|
||||||
button:{ name: startBtnId, title:"Start" },
|
button:{ name: startBtnId, title:"Start" },
|
||||||
button:{ name: stopBtnId, title:"Stop" },
|
button:{ name: stopBtnId, title:"Stop" },
|
||||||
number:{ name: begLocNumbId, title:"Loc", min:0, max:100000, step:1, decpl:0 },
|
number:{ name: begLocNumbId, title:"Loc:", min:0, max:100000, step:1, decpl:0 },
|
||||||
number:{ name: endLocNumbId, title:"End", min:0, max:100000, step:1, decpl:0 },
|
number:{ name: endLocNumbId, title:"End:", min:0, max:100000, step:1, decpl:0 },
|
||||||
},
|
},
|
||||||
|
|
||||||
row: {
|
row: {
|
||||||
check:{ name: midiThruCheckId, title:"MIDI Thru" },
|
check:{ name: midiThruCheckId, title:"MIDI Thru" },
|
||||||
numb_disp: { name: curMidiEvtCntId, title:"Current" },
|
numb_disp: { name: curMidiEvtCntId, title:"Current:" },
|
||||||
numb_disp: { name: totalMidiEvtCntId, title:"Total" },
|
numb_disp: { name: totalMidiEvtCntId, title:"Total:" },
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
row: {
|
row: {
|
||||||
number:{ name: insertLocId, title:"End Loc", min:0, max:100000, step:1, decpl:0 },
|
number:{ name: insertLocId, title:"End Loc:", min:0, max:100000, step:1, decpl:0 },
|
||||||
button:{ name: insertBtnId, title:"Insert", enable: false },
|
button:{ name: insertBtnId, title:"Insert", enable: false },
|
||||||
button:{ name: deleteBtnId, title:"Delete", enable: false },
|
button:{ name: deleteBtnId, title:"Delete", enable: false },
|
||||||
str_disp:{ name: statusId, title:"Status", value: "" },
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
row: {
|
||||||
|
str_disp:{ name: statusId, title:"Status:", value: "" },
|
||||||
|
}
|
||||||
|
|
||||||
row: {
|
row: {
|
||||||
list:{ name: fragListId, addClassName: fragList },
|
list:{ name: fragListId, addClassName: fragList },
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user