static void AddFXNodeLineCurrPosInternal(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, struct FX *fx, const Place *place, float val){ Undo_FXs_CurrPos(window); struct FXs *fxs=ListFindElement1_r0(&wtrack->track->fxs->l,fx->num); if (fxs==NULL){ Place p2; int realline=FindRealLineFor(wblock,0,place); if(realline>=wblock->num_reallines-5){ PlaceSetLastPos(wblock->block,&p2); }else{ PlaceCopy(&p2,&wblock->reallines[wblock->curr_realline+3]->l.p); } AddNewTypeOfFxNodeLine(wblock, wtrack, fx, &p2, val); } AddFXNodeLine( window,wblock,wtrack, fx->num, val, place ); #if !USE_OPENGL UpdateFXNodeLines(window,wblock,wtrack); ClearTrack(window,wblock,wtrack,wblock->top_realline,wblock->bot_realline); UpdateWTrack(window,wblock,wtrack,wblock->top_realline,wblock->bot_realline); #endif }
bool FXTEXT_keypress(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, Place *place, int key){ struct FXs *fxs; int subsubtrack = FXTEXT_subsubtrack(window, wtrack, &fxs); if (subsubtrack==-1) return false; struct FX *fx = fxs->fx; //printf("FXmin: %d, fxmax: %d\n",fx->min, fx->max); const FXText_trss &fxtexts = FXTEXTS_get(wblock, wtrack, fxs); const FXText_trs &fxtext = fxtexts[realline]; // if (fxtext->num_elements == 0 && val==0) // return true; ADD_UNDO(FXs(window, wblock->block, wtrack->track, wblock->curr_realline)); if (fxtext.size() > 1){ // MORE THAN ONE ELEMENT if (key == EVENT_DEL){ for (auto vt : fxtext) { if (VECTOR_is_in_vector(&wtrack->track->fxs, fxs) && isInList3(&fxs->fxnodelines->l, &vt.fxnodeline->l)) // We might have removed all nodes already (see line below) DeleteFxNodeLine(window, wtrack, fxs, vt.fxnodeline); // In this line, two nodes are removed if there's only two left. } } else { Undo_CancelLastUndo(); } } else if (fxtext.size() == 0){ // NO ELEMENTS if (fx == NULL){ fprintf(stderr, "Can this happen?\n"); Undo_CancelLastUndo(); } else { data_as_text_t dat = DAT_get_newvalue(subsubtrack, key, round(scale_double(0x80, 0, 0x100, fx->min, fx->max)), fx->min, fx->max, true); if (dat.value > fx->max) dat.value = fx->max; if (dat.is_valid==false) return false; int pos = AddFXNodeLine(window, wblock, wtrack, fxs, dat.value, place); struct FXNodeLines *fxnodeline = (struct FXNodeLines*)ListFindElement1_num(&fxs->fxnodelines->l, pos); fxnodeline->logtype = dat.logtype; } } else { // ONE ELEMENT const FXText &vt = fxtext.at(0); struct FXNodeLines *fxnodeline = vt.fxnodeline; if (key == EVENT_DEL) { if (subsubtrack == 2) fxnodeline->logtype = LOGTYPE_LINEAR; else DeleteFxNodeLine(window, wtrack, fxs, fxnodeline); } else { data_as_text_t dat = DAT_get_overwrite(vt.value, vt.logtype, subsubtrack, key, fx->min, fx->max, true, true); printf("fx->min: %x, fx->max: %x, vt.value: %x, dat.value: %x\n",fx->min,fx->max,vt.value,dat.value); if (dat.is_valid==false) return false; fxnodeline->val = dat.value; fxnodeline->logtype = dat.logtype; } } return true; }