bool SWINGTEXT_keypress(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, const Place *place, int key){ int subsubtrack = SWINGTEXT_subsubtrack(window, wtrack); if (subsubtrack==-1) return false; struct Blocks *block = wblock->block; struct Tracks *track = wtrack==NULL ? NULL : wtrack->track; QVector<Swing*> swings = Swings_get(wblock, track, realline); if (swings.size() == 0) { // NO ELEMENTS if (key == EVENT_DEL) return true; data_as_text_t dat = DAT_get_newvalue(subsubtrack, key, 1, LOGTYPE_HOLD, 1, 99, 1, 99, false, true, false); if (dat.is_valid==false) return false; ADD_UNDO(Swings_CurrPos(window)); AddSwing(block, track, *place, dat.value, dat.logtype); } else { // ONE ELEMENT (or more than one element) struct Swing *swing = swings.last(); if (key == EVENT_DEL) { ADD_UNDO(Swings_CurrPos(window)); RemoveSwing(block, track, swing); } else { data_as_text_t dat = DAT_get_overwrite(swing->weight, swing->logtype, subsubtrack, key, 1, 99, 1, 99, false, false); if (dat.is_valid==false) return false; if (dat.value==swing->weight && dat.logtype==swing->logtype) return true; // I.e. although the user didn't change anything, the key was valid so we still eat it (by returning true instead of false). ADD_UNDO(Swings_CurrPos(window)); AddSwing(block, track, swing->l.p, dat.value, dat.logtype); } } return true; }
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; }
bool CHANCETEXT_keypress(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, Place *place, int key){ int subsubtrack = CHANCETEXT_subsubtrack(window, wtrack); if (subsubtrack==-1) return false; const Trs &trs = TRS_get(wblock, wtrack, realline); ADD_UNDO(Notes_CurrPos(window)); if (trs.size() > 1) { // MORE THAN ONE ELEMENT if (key == EVENT_DEL){ for (const TrackRealline2 &tr2 : trs){ struct Notes *note = tr2.note; struct Pitches *pitch = tr2.pitch; if (pitch!=NULL) safe_int_write(&pitch->chance, 0x100); else if (note!=NULL) safe_int_write(¬e->chance, 0x100); } } else { Undo_CancelLastUndo(); } } else if (trs.size() == 0) { // NO ELEMENTS Undo_CancelLastUndo(); } else { // ONE ELEMENT const TrackRealline2 &tr2 = trs[0]; struct Notes *dasnote = tr2.note; struct Pitches *pitch = tr2.pitch; if (key == EVENT_DEL) { if (pitch!=NULL) safe_int_write(&pitch->chance, 0x100); else if (pitch!=NULL) safe_int_write(&dasnote->chance, 0x100); else return false; } else { int chance; if (pitch!=NULL) chance = pitch->chance; else if (dasnote!=NULL) chance = dasnote->chance; else return false; data_as_text_t dat = DAT_get_overwrite(chance, 0, subsubtrack, key, 0, 0xff, true, false); if (dat.is_valid==false) return false; //double new_note = floor(note) + ((double)dat.value / 100.0); printf("new_chance: %d\n",dat.value); if (pitch!=NULL) safe_int_write(&pitch->chance, dat.value); else safe_int_write(&dasnote->chance, dat.value); } } return true; }