diff options
| author | Robert Jonsson <spamatica@gmail.com> | 2011-02-14 21:16:56 +0000 | 
|---|---|---|
| committer | Robert Jonsson <spamatica@gmail.com> | 2011-02-14 21:16:56 +0000 | 
| commit | 1371ee8ba22423680d84623997f07b368a342164 (patch) | |
| tree | ac3c5ea55dc813b67478b305b602d14b4475c700 /muse2/muse | |
| parent | 7fa70010daf92f90bf47933e846c0ded239a98f7 (diff) | |
more graphical automation fixes
Diffstat (limited to 'muse2/muse')
| -rw-r--r-- | muse2/muse/arranger/pcanvas.cpp | 29 | ||||
| -rw-r--r-- | muse2/muse/arranger/tlist.cpp | 82 | ||||
| -rw-r--r-- | muse2/muse/arranger/tlist.h | 3 | ||||
| -rw-r--r-- | muse2/muse/audiotrack.cpp | 6 | ||||
| -rw-r--r-- | muse2/muse/ctrl.cpp | 15 | ||||
| -rw-r--r-- | muse2/muse/ctrl.h | 2 | 
6 files changed, 109 insertions, 28 deletions
| diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index 7ffe2b42..38941068 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -2959,8 +2959,8 @@ void PartCanvas::drawAutomation(QPainter& p, const QRect& r, AudioTrack *t)           prevVal = cvFirst.val;           // prepare prevVal -         if (cl->id() == AC_VOLUME ) { // use db scale for volume -           printf("volume cvval=%f\n", cvFirst.val); +         if (cl->valueType() == VAL_LOG ) { // use db scale for volume +           //printf("volume cvval=%f\n", cvFirst.val);             prevVal = dbToVal(cvFirst.val); // represent volume between 0 and 1             if (prevVal < 0) prevVal = 0.0;           } @@ -2973,12 +2973,13 @@ void PartCanvas::drawAutomation(QPainter& p, const QRect& r, AudioTrack *t)           // draw a square around the point           p.drawRect(mapx(tempomap.frame2tick(prevPosFrame))-1, (rr.bottom()-2)-prevVal*height-1, 3, 3); +         p.drawRect(mapx(tempomap.frame2tick(prevPosFrame))-2, (rr.bottom()-2)-prevVal*height-2, 5, 5);           for (; ic !=cl->end(); ++ic)           {              CtrlVal cv = ic->second;              double nextVal = cv.val; // was curVal -            if (cl->id() == AC_VOLUME ) { // use db scale for volume +            if (cl->valueType() == VAL_LOG ) { // use db scale for volume                nextVal = dbToVal(cv.val); // represent volume between 0 and 1                if (nextVal < 0) nextVal = 0.0;              } @@ -3005,7 +3006,8 @@ void PartCanvas::drawAutomation(QPainter& p, const QRect& r, AudioTrack *t)                  goto quitDrawing;              // draw a square around the point -            p.drawRect(mapx(tempomap.frame2tick(prevPosFrame))-1, (rr.bottom()-2)-prevVal*height-1, 3, 3); +            p.drawRect(mapx(tempomap.frame2tick(prevPosFrame))-2, (rr.bottom()-2)-prevVal*height-2, 5, 5); +            p.drawRect(mapx(tempomap.frame2tick(prevPosFrame))-1, (rr.bottom()-1)-prevVal*height-2, 3, 3);           }           //printf("outer draw %f\n", cvFirst.val );           p.drawLine(mapx(tempomap.frame2tick(prevPosFrame)), @@ -3036,7 +3038,7 @@ void PartCanvas::checkAutomation(Track * t, const QPoint &pointer, bool addNewCt      int circumference = 5;      if (t->isMidiTrack())        return; -    //printf("checkAutomation p.x()=%d p.y()=%d\n", mapx(pointer.x()), mapx(pointer.y())); +    //printf("checkAutomation p.x()=%d p.y()=%d\n", mapx(pointer.x()), mapy(pointer.y()));      int currX =  mapx(pointer.x());      int currY =  mapy(pointer.y()); @@ -3053,16 +3055,16 @@ void PartCanvas::checkAutomation(Track * t, const QPoint &pointer, bool addNewCt          int oldX=-1;          int oldY=-1; -        int ypixel; -        int xpixel; +        int ypixel=0; +        int xpixel=-1; -        // First check that there ARE automation, ic == cl->end means no automation +        // First check that there IS automation, ic == cl->end means no automation          if (ic != cl->end()) {            for (; ic !=cl->end(); ic++)            {               CtrlVal &cv = ic->second;               double y; -             if (cl->id() == AC_VOLUME ) { // use db scale for volume +             if (cl->valueType() == VAL_LOG ) { // use db scale for volume                  y = dbToVal(cv.val); // represent volume between 0 and 1                 if (y < 0) y = 0;               } @@ -3210,10 +3212,15 @@ void PartCanvas::processAutomationMovements(QMouseEvent *event)      if (nextFrame!=-1 && currFrame > nextFrame) currFrame=nextFrame-1;      automation.currentCtrl->frame = currFrame; -    int mouseY = automation.currentTrack->height() - (mapy(event->pos().y()) - automation.currentTrack->y())-2; +    int posy=mapy(event->pos().y()); +    int tracky = mapy(automation.currentTrack->y()); +    int trackHeight = automation.currentTrack->height(); +    //printf("posy=%d tracky=%d trackHeight=%d\n", posy,tracky,trackHeight); + +    int mouseY = trackHeight - (posy - tracky)-2;      double yfraction = ((double)mouseY)/automation.currentTrack->height(); -    if (automation.currentCtrlList->id() == AC_VOLUME ) { // use db scale for volume +    if (automation.currentCtrlList->valueType() == VAL_LOG  ) { // use db scale for volume         double cvval = valToDb(yfraction);         //printf("calc yfraction = %f v=%f ",yfraction,cvval); diff --git a/muse2/muse/arranger/tlist.cpp b/muse2/muse/arranger/tlist.cpp index 542e64c8..ab228e3b 100644 --- a/muse2/muse/arranger/tlist.cpp +++ b/muse2/muse/arranger/tlist.cpp @@ -20,6 +20,7 @@  #include <QResizeEvent>  #include <QScrollBar>  #include <QWheelEvent> +#include <QIcon>  #include "popupmenu.h"  #include "globals.h" @@ -52,6 +53,7 @@ extern QMenu* populateAddSynth(QWidget* parent);  static const int MIN_TRACKHEIGHT = 20;  static const int WHEEL_DELTA = 120; +QColor collist[] = { Qt::red, Qt::yellow, Qt::blue , Qt::black, Qt::white, Qt::green };  //---------------------------------------------------------  //   TList @@ -781,26 +783,90 @@ TrackList TList::getRecEnabledTracks()  }  //--------------------------------------------------------- -//   mousePressEvent +//   changeAutomation  //---------------------------------------------------------  void TList::changeAutomation(QAction* act)  { -  printf("changeAutomation!\n"); +  //printf("changeAutomation %d\n", act->data().toInt());    if (editAutomation->type() == Track::MIDI) {      printf("this is wrong, we can't edit automation for midi tracks from arranger yet!\n");      return;    } +  int colindex = act->data().toInt() & 0xff; +  int id = (act->data().toInt() & 0x00ffffff) / 256; +  if (colindex < 100) +      return; // this was meant for changeAutomationColor +              // one of these days I'll rewrite this so it's understandable +              // this is just to get it up and running... +    CtrlListList* cll = ((AudioTrack*)editAutomation)->controller();    for(CtrlListList::iterator icll =cll->begin();icll!=cll->end();++icll) {      CtrlList *cl = icll->second; -    if (act->data() == cl->id())  // got it, change state -        cl->setVisible(!cl->isVisible()); +    if (id == cl->id())  // got it, change state +        cl->setVisible(act->isChecked());    }    song->update(SC_TRACK_MODIFIED);  } +//--------------------------------------------------------- +//   changeAutomation +//--------------------------------------------------------- +void TList::changeAutomationColor(QAction* act) +{ +  if (editAutomation->type() == Track::MIDI) { +    printf("this is wrong, we can't edit automation for midi tracks from arranger yet!\n"); +    return; +  } +  int colindex = act->data().toInt() & 0xff; +  int id = (act->data().toInt() & 0x00ffffff) / 256; + +  if (colindex > 100) +      return; // this was meant for changeAutomation +              // one of these days I'll rewrite this so it's understandable +              // this is just to get it up and running... + +  //printf("change automation color %d %d\n", id, colindex); + +  CtrlListList* cll = ((AudioTrack*)editAutomation)->controller(); +  for(CtrlListList::iterator icll =cll->begin();icll!=cll->end();++icll) { +    CtrlList *cl = icll->second; +    if (cl->id() == id) // got it, change color +        cl->setColor(collist[colindex]); +  } +  song->update(SC_TRACK_MODIFIED); +} + +//--------------------------------------------------------- +//   colorMenu +//--------------------------------------------------------- +QMenu* TList::colorMenu(QColor c, int id) +{ +  QMenu * m = new QMenu(this); +  for (int i = 0; i< 6; i++) { +    QPixmap pix(10,10); +    QPainter p(&pix); +    p.fillRect(0,0,10,10,collist[i]); +    p.setPen(Qt::black); +    p.drawRect(0,0,10,10); +    QIcon icon(pix); +    QAction *act = m->addAction(icon,""); +    act->setCheckable(true); +    if (c == collist[i]) +        act->setChecked(true); +    int data = id * 256; // shift 8 bits +    data += i; // color in the bottom 8 bits +    act->setData(data); +  } +  connect(m, SIGNAL(triggered(QAction*)), SLOT(changeAutomationColor(QAction*))); +  return m; + +} + +//--------------------------------------------------------- +//   mousePressEvent +//---------------------------------------------------------  void TList::mousePressEvent(QMouseEvent* ev)        {        int x       = ev->x(); @@ -958,13 +1024,17 @@ void TList::mousePressEvent(QMouseEvent* ev)                      QAction* act = 0;                      for(CtrlListList::iterator icll =cll->begin();icll!=cll->end();++icll) {                        CtrlList *cl = icll->second; -                      printf("id = %d", cl->id()); +                      //printf("id = %d", cl->id());                        if (cl->dontShow())                          continue;                        act = p->addAction(cl->name());                        act->setCheckable(true);                        act->setChecked(cl->isVisible()); -                      act->setData(cl->id()); +                      int data = cl->id() * 256; // shift 8 bits +                      data += 150; // illegal color > 100 +                      act->setData(data); +                      QMenu *m = colorMenu(cl->color(), cl->id()); +                      act->setMenu(m);                      }                      connect(p, SIGNAL(triggered(QAction*)), SLOT(changeAutomation(QAction*)));                      //connect(p, SIGNAL(aboutToHide()), muse, SLOT(routingPopupMenuAboutToHide())); diff --git a/muse2/muse/arranger/tlist.h b/muse2/muse/arranger/tlist.h index 9ecd5d57..8bebef95 100644 --- a/muse2/muse/arranger/tlist.h +++ b/muse2/muse/arranger/tlist.h @@ -19,6 +19,7 @@ class QPaintEvent;  class QResizeEvent;  class QScrollBar;  class QWheelEvent; +class QMenu;  class ScrollScale;  class Track; @@ -84,11 +85,13 @@ class TList : public QWidget {        void classesPopupMenu(Track*, int x, int y);        TrackList getRecEnabledTracks();        void setHeaderToolTips(); +      QMenu* colorMenu(QColor c, int id);     private slots:        void returnPressed();        void songChanged(int flags);        void changeAutomation(QAction*); +      void changeAutomationColor(QAction*);     signals:        ///void selectionChanged(); diff --git a/muse2/muse/audiotrack.cpp b/muse2/muse/audiotrack.cpp index af066437..11404993 100644 --- a/muse2/muse/audiotrack.cpp +++ b/muse2/muse/audiotrack.cpp @@ -79,9 +79,9 @@ AudioTrack::AudioTrack(TrackType t)        _automationType = AUTO_OFF;        //setChannels(1);        setChannels(2); -      addController(new CtrlList(AC_VOLUME,"Volume",0.0,3.16 /* roughly 10 db */)); -      addController(new CtrlList(AC_PAN, "Pan", -1.0, 1.0)); -      addController(new CtrlList(AC_MUTE,"Mute",0.0,1.0, true /*dont show in arranger */)); +      addController(new CtrlList(AC_VOLUME,"Volume",0.0,3.16 /* roughly 10 db */, VAL_LOG)); +      addController(new CtrlList(AC_PAN, "Pan", -1.0, 1.0, VAL_LINEAR)); +      addController(new CtrlList(AC_MUTE,"Mute",0.0,1.0, VAL_LINEAR, true /*dont show in arranger */));        // Changed by Tim. p3.3.15        //outBuffers = new float*[MAX_CHANNELS]; diff --git a/muse2/muse/ctrl.cpp b/muse2/muse/ctrl.cpp index e5da5f2b..bb77e0c5 100644 --- a/muse2/muse/ctrl.cpp +++ b/muse2/muse/ctrl.cpp @@ -20,13 +20,13 @@  void CtrlList::initColor(int i)  { -  QColor collist[] = { Qt::red, Qt::yellow, Qt::blue , Qt::green, Qt::white, Qt::black }; +  QColor collist[] = { Qt::red, Qt::yellow, Qt::blue , Qt::black, Qt::white, Qt::green }; -  if (i < 5) -  _displayColor = collist[i%6]; +  if (i < 6) +    _displayColor = collist[i%6];    else -    _displayColor = Qt::gray; -    _visible = false; +    _displayColor = Qt::green; +  _visible = false;  } @@ -47,7 +47,7 @@ CtrlList::CtrlList(int id)  //---------------------------------------------------------  //   CtrlList  //--------------------------------------------------------- -CtrlList::CtrlList(int id, QString name, double min, double max, bool dontShow) +CtrlList::CtrlList(int id, QString name, double min, double max, CtrlValueType v, bool dontShow)  {        _id      = id;        _default = 0.0; @@ -56,6 +56,7 @@ CtrlList::CtrlList(int id, QString name, double min, double max, bool dontShow)        _name    = name;        _min     = min;        _max     = max; +      _valueType = v;        _dontShow = dontShow;        initColor(id);  } @@ -70,7 +71,7 @@ CtrlList::CtrlList()        _curVal  = 0.0;        _mode    = INTERPOLATE;        _dontShow = false; -      initColor(-1); +      initColor(0);        }  //--------------------------------------------------------- diff --git a/muse2/muse/ctrl.h b/muse2/muse/ctrl.h index 307a3783..4d864b9f 100644 --- a/muse2/muse/ctrl.h +++ b/muse2/muse/ctrl.h @@ -96,7 +96,7 @@ class CtrlList : public std::map<int, CtrlVal, std::less<int> > {     public:        CtrlList();        CtrlList(int id); -      CtrlList(int id, QString name, double min, double max, bool dontShow=false); +      CtrlList(int id, QString name, double min, double max, CtrlValueType v, bool dontShow=false);        Mode mode() const          { return _mode; }        void setMode(Mode m)       { _mode = m; } | 
