Beispiel #1
0
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;
}
Beispiel #2
0
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;
}