2021-03-18 Fred Gleason <fredg@paravelsystems.com>

* Fixed bugs with ensuring consistent position interlocks between
	markers in 'RDMarkerView'.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2021-03-18 18:50:22 -04:00
parent 5e5fa3c586
commit 39fb00801f
3 changed files with 75 additions and 40 deletions

View File

@ -21276,3 +21276,6 @@
2021-03-17 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in 'RDMarkerView' that could cause marker positions
to lose precision when sliding against a limit stop.
2021-03-18 Fred Gleason <fredg@paravelsystems.com>
* Fixed bugs with ensuring consistent position interlocks between
markers in 'RDMarkerView'.

View File

@ -37,6 +37,7 @@ RDMarkerHandle::RDMarkerHandle(RDMarkerHandle::PointerRole role,
{
setFlags(QGraphicsItem::ItemIsMovable);
d_marker_view=mkrview;
d_x_diff=0;
QPolygonF triangle;
@ -90,6 +91,7 @@ void RDMarkerHandle::mousePressEvent(QGraphicsSceneMouseEvent *e)
if(e->button()==Qt::LeftButton) {
e->accept();
d_x_diff=pos().x()-e->scenePos().x();
if(d_peers.size()==0) {
QGraphicsScene *s=scene();
QList<QGraphicsItem *> items=s->items();
@ -113,44 +115,38 @@ void RDMarkerHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
RDMarkerView *view=static_cast<RDMarkerView *>(d_marker_view);
//
// Check Limits
// Check Limit Stops
//
int corr=0;
int limit_ptr=0;
int x=pos().x()-LEFT_MARGIN;
int limit_ptr=-1;
int x=e->scenePos().x()+d_x_diff-LEFT_MARGIN;
if((d_minimum_pos>=0)&&(x<d_minimum_pos)) {
corr=d_minimum_pos-x;
d_x_diff=d_minimum_pos-e->scenePos().x()+LEFT_MARGIN;
x=d_minimum_pos;
limit_ptr=d_minimum_ptr;
}
else {
if((d_maximum_pos>=0)&&(x>d_maximum_pos)) {
corr=d_maximum_pos-x;
d_x_diff=d_maximum_pos-e->scenePos().x()+LEFT_MARGIN;
x=d_maximum_pos;
limit_ptr=d_maximum_ptr;
}
}
//
// Send Position
// Update Marker Graphic
//
if(corr==0) { // Generate new pointer value
int dx=e->pos().x()-e->lastPos().x()+corr;
for(int i=0;i<d_peers.size();i++) {
QGraphicsItem *peer=d_peers.at(i);
peer->setPos(peer->pos().x()+dx,peer->pos().y());
}
for(int i=0;i<d_peers.size();i++) {
QGraphicsItem *peer=d_peers.at(i);
peer->setPos(e->scenePos().x()+d_x_diff,peer->pos().y());
}
if(limit_ptr<0) { // Generate new pointer value
int64_t pframes=(int64_t)(1152*x*view->shrinkFactor());
view->updatePosition(d_role,(int)((int64_t)1000*pframes/
(int64_t)view->sampleRate()));
}
else { // We're against a limit stop, so use the pointer value of the stop
int x=LEFT_MARGIN+view->Frame(limit_ptr);
QGraphicsLineItem *line=static_cast<QGraphicsLineItem *>(d_peers.at(2));
line->setLine(line->line().x1()+x-d_peers.at(0)->pos().x(),
line->line().y1(),
line->line().x2()+x-d_peers.at(0)->pos().x(),
line->line().y2());
d_peers.at(0)->setPos(x,d_peers.at(0)->pos().y());
d_peers.at(1)->setPos(x,d_peers.at(1)->pos().y());
view->updatePosition(d_role,limit_ptr);
}
}
@ -424,21 +420,7 @@ void RDMarkerView::updatePosition(RDMarkerHandle::PointerRole role, int ptr)
emit pointerValueChanged(role,d_pointers[role]);
}
/*
void RDMarkerView::updatePosition(RDMarkerHandle::PointerRole role, int offset)
{
//
// Careful! Don't overflow 32 bits.
//
int64_t pframes=(int64_t)(1152*offset*d_shrink_factor);
d_pointers[role]=(int)((int64_t)1000*pframes/(int64_t)d_sample_rate);
d_has_unsaved_changes=true;
updateInterlocks();
emit pointerValueChanged(role,d_pointers[role]);
}
*/
void RDMarkerView::setAudioGain(int lvl)
{
@ -476,6 +458,8 @@ bool RDMarkerView::setCut(QString *err_msg,unsigned cartnum,int cutnum)
if(!d_wave_factory->setCut(err_msg,cartnum,cutnum)) {
return false;
}
d_audio_length=(int)((int64_t)d_wave_factory->energySize()*1152000/
((int64_t)d_sample_rate));
d_max_shrink_factor=1;
while(d_wave_factory->energySize()>=(d_width*d_max_shrink_factor)) {
d_max_shrink_factor=d_max_shrink_factor*2;
@ -522,6 +506,7 @@ void RDMarkerView::clear()
d_max_shrink_factor=1;
d_pad_size=0;
d_audio_gain=900;
d_audio_length=0;
d_has_unsaved_changes=false;
d_marker_menu_used=false;
}
@ -561,6 +546,7 @@ void RDMarkerView::addTalkData()
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::TalkStart,60);
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::TalkEnd,60);
InterlockMarkerPair(RDMarkerHandle::TalkStart);
emit pointerValueChanged(RDMarkerHandle::TalkStart,
d_pointers[RDMarkerHandle::TalkStart]);
@ -576,6 +562,7 @@ void RDMarkerView::addSegueData()
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::SegueStart,40);
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::SegueEnd,40);
InterlockMarkerPair(RDMarkerHandle::SegueStart);
emit pointerValueChanged(RDMarkerHandle::SegueStart,
d_pointers[RDMarkerHandle::SegueStart]);
@ -591,6 +578,7 @@ void RDMarkerView::addHookData()
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::HookStart,100);
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,100);
InterlockMarkerPair(RDMarkerHandle::HookStart);
emit pointerValueChanged(RDMarkerHandle::HookStart,
d_pointers[RDMarkerHandle::HookStart]);
@ -604,6 +592,7 @@ void RDMarkerView::addFadeupData()
d_pointers[RDMarkerHandle::FadeUp]=Msec(d_mouse_pos);
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,80);
InterlockMarkerPair(RDMarkerHandle::FadeUp);
emit pointerValueChanged(RDMarkerHandle::FadeUp,
d_pointers[RDMarkerHandle::FadeUp]);
@ -615,6 +604,7 @@ void RDMarkerView::addFadedownData()
d_pointers[RDMarkerHandle::FadeDown]=Msec(d_mouse_pos);
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,80);
InterlockMarkerPair(RDMarkerHandle::FadeUp);
emit pointerValueChanged(RDMarkerHandle::FadeDown,
d_pointers[RDMarkerHandle::FadeDown]);
@ -632,6 +622,42 @@ void RDMarkerView::deleteMarkerData()
void RDMarkerView::updateInterlocks()
{
/*
//
// Check for "swiped" markers and remove them
//
for(int i=2;i<(RDMarkerHandle::LastRole);i++) {
RDMarkerHandle::PointerRole role=(RDMarkerHandle::PointerRole)i;
if((d_pointers[i]>=0)&&
((d_pointers[i]<d_pointers[RDMarkerHandle::CutStart])||
(d_pointers[i]>d_pointers[RDMarkerHandle::CutEnd]))) {
RemoveMarker(role);
switch(role) {
case RDMarkerHandle::TalkStart:
case RDMarkerHandle::SegueStart:
case RDMarkerHandle::HookStart:
RemoveMarker((RDMarkerHandle::PointerRole)(i+1));
break;
case RDMarkerHandle::TalkEnd:
case RDMarkerHandle::SegueEnd:
case RDMarkerHandle::HookEnd:
RemoveMarker((RDMarkerHandle::PointerRole)(i-1));
break;
case RDMarkerHandle::CutStart:
case RDMarkerHandle::CutEnd:
case RDMarkerHandle::FadeUp:
case RDMarkerHandle::FadeDown:
case RDMarkerHandle::LastRole:
break;
}
}
}
*/
//
// Update the limit stops
//
for(int i=0;i<2;i++) {
d_handles[RDMarkerHandle::CutStart][i]->setMinimum(0,0);
d_handles[RDMarkerHandle::CutStart][i]->
@ -642,7 +668,7 @@ void RDMarkerView::updateInterlocks()
setMinimum(d_handles[RDMarkerHandle::CutStart][i]->pos().x()-LEFT_MARGIN,
d_pointers[RDMarkerHandle::CutStart]);
d_handles[RDMarkerHandle::CutEnd][i]->
setMaximum(d_right_margin-LEFT_MARGIN,Msec(d_wave_factory->energySize()));
setMaximum(d_right_margin-LEFT_MARGIN,d_audio_length);
}
InterlockMarkerPair(RDMarkerHandle::TalkStart);
InterlockMarkerPair(RDMarkerHandle::SegueStart);
@ -817,6 +843,8 @@ void RDMarkerView::WriteWave()
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::CutEnd,20);
d_view->setScene(d_scene);
updateInterlocks();
}
@ -827,10 +855,12 @@ void RDMarkerView::DrawMarker(RDMarkerHandle::PointerType type,
RDMarkerHandle *m_item=NULL;
if(d_pointers[role]>=0) {
l_item=d_scene->addLine(LEFT_MARGIN+Frame(d_pointers[role]),0,
LEFT_MARGIN+Frame(d_pointers[role]),d_height,
QPen(RDMarkerHandle::pointerRoleColor(role)));
l_item=new QGraphicsLineItem(0,0,0,d_height);
l_item->setPen(QPen(RDMarkerHandle::pointerRoleColor(role)));
l_item->setToolTip(RDMarkerHandle::pointerRoleTypeText(role));
d_scene->addItem(l_item);
l_item->setPos(LEFT_MARGIN+Frame(d_pointers[role]),0);
m_item=new RDMarkerHandle(role,type,this);
d_scene->addItem(m_item);
m_item->setPos(LEFT_MARGIN+Frame(d_pointers[role]),handle_pos-12);
@ -858,5 +888,6 @@ void RDMarkerView::RemoveMarker(RDMarkerHandle::PointerRole role)
for(int i=0;i<2;i++) {
d_handles[role][i]=NULL;
}
emit pointerValueChanged(role,-1);
}

View File

@ -64,6 +64,7 @@ class RDMarkerHandle : public QGraphicsPolygonItem
int d_minimum_ptr;
int d_maximum_pos;
int d_maximum_ptr;
int d_x_diff;
};
@ -84,7 +85,6 @@ class RDMarkerView : public QWidget
void processRightClick(RDMarkerHandle::PointerRole role,
const QPointF &pos);
void updatePosition(RDMarkerHandle::PointerRole role,int ptr);
// void updatePosition(RDMarkerHandle::PointerRole role,int offset);
public slots:
void setAudioGain(int lvl);
@ -132,6 +132,7 @@ class RDMarkerView : public QWidget
int d_audio_gain;
unsigned d_sample_rate;
unsigned d_channels;
int d_audio_length;
int d_mouse_pos;
int d_right_margin;
QStringList d_pointer_fields;