Пример #1
0
void WaveView::setPos(int idx, unsigned val, bool adjustScrollbar)
      {
      val = MusEGlobal::tempomap.tick2frame(val);
      if (pos[idx] == val)
            return;
      int opos = mapx(pos[idx]);
      int npos = mapx(val);

      if (adjustScrollbar && idx == 0) {
            switch (MusEGlobal::song->follow()) {
                  case  MusECore::Song::NO:
                        break;
                  case MusECore::Song::JUMP:
                        if (npos >= width()) {
                              int ppos =  val - xorg - rmapxDev(width()/4);
                              if (ppos < 0)
                                    ppos = 0;
                              emit followEvent(ppos);
                              opos = mapx(pos[idx]);
                              npos = mapx(val);
                              }
                        else if (npos < 0) {
                              int ppos =  val - xorg - rmapxDev(width()*3/4);
                              if (ppos < 0)
                                    ppos = 0;
                              emit followEvent(ppos);
                              opos = mapx(pos[idx]);
                              npos = mapx(val);
                              }
                        break;
	    case MusECore::Song::CONTINUOUS:
                        if (npos > (width()*5)/8) {
                              int ppos =  pos[idx] - xorg - rmapxDev(width()*5/8);
                              if (ppos < 0)
                                    ppos = 0;
                              emit followEvent(ppos);
                              opos = mapx(pos[idx]);
                              npos = mapx(val);
                              }
                        else if (npos < (width()*3)/8) {
                              int ppos =  pos[idx] - xorg - rmapxDev(width()*3/8);
                              if (ppos < 0)
                                    ppos = 0;
                              emit followEvent(ppos);
                              opos = mapx(pos[idx]);
                              npos = mapx(val);
                              }
                        break;
                  }
            }

      int x;
      int w = 1;
      if (opos > npos) {
            w += opos - npos;
            x = npos;
            }
      else {
            w += npos - opos;
            x = opos;
            }
      pos[idx] = val;
      //redraw(QRect(x, 0, w, height()));
      redraw(QRect(x-1, 0, w+2, height()));    // p4.0.28 From Canvas::draw (is otherwise identical). Fix for corruption.
      }
Пример #2
0
void Canvas::setPos(int idx, unsigned val, bool adjustScrollbar)
{
	//if (pos[idx] == val) // Seems to be some refresh problems here, pos[idx] might be val but the gui not updated.
	//    return;          // skipping this return forces update even if values match. Matching values only seem
	// to occur when initializing
	int opos = mapx(_pos[idx]);
	int npos = mapx(val);

	if (adjustScrollbar && idx == 0)
	{
		switch (song->follow())
		{
		case Song::NO:
			break;
		case Song::JUMP:
			if (npos >= width())
			{
				int ppos = val - xorg - rmapxDev(width() / 8);
				if (ppos < 0)
					ppos = 0;
				emit followEvent(ppos);
				opos = mapx(_pos[idx]);
				npos = mapx(val);
			}
			else if (npos < 0)
			{
				int ppos = val - xorg - rmapxDev(width()*3 / 4);
				if (ppos < 0)
					ppos = 0;
				emit followEvent(ppos);
				opos = mapx(_pos[idx]);
				npos = mapx(val);
			}
			break;
			case Song::CONTINUOUS:
			if (npos > (width() / 2))
			{
				int ppos = _pos[idx] - xorg - rmapxDev(width() / 2);
				if (ppos < 0)
					ppos = 0;
				emit followEvent(ppos);
				opos = mapx(_pos[idx]);
				npos = mapx(val);
			}
			else if (npos < (width() / 2))
			{
				int ppos = _pos[idx] - xorg - rmapxDev(width() / 2);
				if (ppos < 0)
					ppos = 0;
				emit followEvent(ppos);
				opos = mapx(_pos[idx]);
				npos = mapx(val);
			}
			break;
		}
	}

	int x;
	int w = 1;
	if (opos > npos)
	{
		w += opos - npos;
		x = npos;
	}
	else
	{
		w += npos - opos;
		x = opos;
	}
	_pos[idx] = val;
	//redraw(QRect(x - 1, 0, w + 2, height()));
	update();
}