mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-05-20 23:03:04 +02:00
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:
parent
5e5fa3c586
commit
39fb00801f
@ -21276,3 +21276,6 @@
|
|||||||
2021-03-17 Fred Gleason <fredg@paravelsystems.com>
|
2021-03-17 Fred Gleason <fredg@paravelsystems.com>
|
||||||
* Fixed a bug in 'RDMarkerView' that could cause marker positions
|
* Fixed a bug in 'RDMarkerView' that could cause marker positions
|
||||||
to lose precision when sliding against a limit stop.
|
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'.
|
||||||
|
@ -37,6 +37,7 @@ RDMarkerHandle::RDMarkerHandle(RDMarkerHandle::PointerRole role,
|
|||||||
{
|
{
|
||||||
setFlags(QGraphicsItem::ItemIsMovable);
|
setFlags(QGraphicsItem::ItemIsMovable);
|
||||||
d_marker_view=mkrview;
|
d_marker_view=mkrview;
|
||||||
|
d_x_diff=0;
|
||||||
|
|
||||||
QPolygonF triangle;
|
QPolygonF triangle;
|
||||||
|
|
||||||
@ -90,6 +91,7 @@ void RDMarkerHandle::mousePressEvent(QGraphicsSceneMouseEvent *e)
|
|||||||
|
|
||||||
if(e->button()==Qt::LeftButton) {
|
if(e->button()==Qt::LeftButton) {
|
||||||
e->accept();
|
e->accept();
|
||||||
|
d_x_diff=pos().x()-e->scenePos().x();
|
||||||
if(d_peers.size()==0) {
|
if(d_peers.size()==0) {
|
||||||
QGraphicsScene *s=scene();
|
QGraphicsScene *s=scene();
|
||||||
QList<QGraphicsItem *> items=s->items();
|
QList<QGraphicsItem *> items=s->items();
|
||||||
@ -113,44 +115,38 @@ void RDMarkerHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *e)
|
|||||||
RDMarkerView *view=static_cast<RDMarkerView *>(d_marker_view);
|
RDMarkerView *view=static_cast<RDMarkerView *>(d_marker_view);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check Limits
|
// Check Limit Stops
|
||||||
//
|
//
|
||||||
int corr=0;
|
int limit_ptr=-1;
|
||||||
int limit_ptr=0;
|
int x=e->scenePos().x()+d_x_diff-LEFT_MARGIN;
|
||||||
int x=pos().x()-LEFT_MARGIN;
|
|
||||||
if((d_minimum_pos>=0)&&(x<d_minimum_pos)) {
|
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;
|
limit_ptr=d_minimum_ptr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if((d_maximum_pos>=0)&&(x>d_maximum_pos)) {
|
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;
|
limit_ptr=d_maximum_ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Send Position
|
// Update Marker Graphic
|
||||||
//
|
//
|
||||||
if(corr==0) { // Generate new pointer value
|
for(int i=0;i<d_peers.size();i++) {
|
||||||
int dx=e->pos().x()-e->lastPos().x()+corr;
|
QGraphicsItem *peer=d_peers.at(i);
|
||||||
for(int i=0;i<d_peers.size();i++) {
|
peer->setPos(e->scenePos().x()+d_x_diff,peer->pos().y());
|
||||||
QGraphicsItem *peer=d_peers.at(i);
|
}
|
||||||
peer->setPos(peer->pos().x()+dx,peer->pos().y());
|
|
||||||
}
|
if(limit_ptr<0) { // Generate new pointer value
|
||||||
int64_t pframes=(int64_t)(1152*x*view->shrinkFactor());
|
int64_t pframes=(int64_t)(1152*x*view->shrinkFactor());
|
||||||
view->updatePosition(d_role,(int)((int64_t)1000*pframes/
|
view->updatePosition(d_role,(int)((int64_t)1000*pframes/
|
||||||
(int64_t)view->sampleRate()));
|
(int64_t)view->sampleRate()));
|
||||||
}
|
}
|
||||||
else { // We're against a limit stop, so use the pointer value of the stop
|
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);
|
view->updatePosition(d_role,limit_ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -424,21 +420,7 @@ void RDMarkerView::updatePosition(RDMarkerHandle::PointerRole role, int ptr)
|
|||||||
|
|
||||||
emit pointerValueChanged(role,d_pointers[role]);
|
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)
|
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)) {
|
if(!d_wave_factory->setCut(err_msg,cartnum,cutnum)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
d_audio_length=(int)((int64_t)d_wave_factory->energySize()*1152000/
|
||||||
|
((int64_t)d_sample_rate));
|
||||||
d_max_shrink_factor=1;
|
d_max_shrink_factor=1;
|
||||||
while(d_wave_factory->energySize()>=(d_width*d_max_shrink_factor)) {
|
while(d_wave_factory->energySize()>=(d_width*d_max_shrink_factor)) {
|
||||||
d_max_shrink_factor=d_max_shrink_factor*2;
|
d_max_shrink_factor=d_max_shrink_factor*2;
|
||||||
@ -522,6 +506,7 @@ void RDMarkerView::clear()
|
|||||||
d_max_shrink_factor=1;
|
d_max_shrink_factor=1;
|
||||||
d_pad_size=0;
|
d_pad_size=0;
|
||||||
d_audio_gain=900;
|
d_audio_gain=900;
|
||||||
|
d_audio_length=0;
|
||||||
d_has_unsaved_changes=false;
|
d_has_unsaved_changes=false;
|
||||||
d_marker_menu_used=false;
|
d_marker_menu_used=false;
|
||||||
}
|
}
|
||||||
@ -561,6 +546,7 @@ void RDMarkerView::addTalkData()
|
|||||||
|
|
||||||
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::TalkStart,60);
|
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::TalkStart,60);
|
||||||
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::TalkEnd,60);
|
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::TalkEnd,60);
|
||||||
|
InterlockMarkerPair(RDMarkerHandle::TalkStart);
|
||||||
|
|
||||||
emit pointerValueChanged(RDMarkerHandle::TalkStart,
|
emit pointerValueChanged(RDMarkerHandle::TalkStart,
|
||||||
d_pointers[RDMarkerHandle::TalkStart]);
|
d_pointers[RDMarkerHandle::TalkStart]);
|
||||||
@ -576,6 +562,7 @@ void RDMarkerView::addSegueData()
|
|||||||
|
|
||||||
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::SegueStart,40);
|
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::SegueStart,40);
|
||||||
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::SegueEnd,40);
|
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::SegueEnd,40);
|
||||||
|
InterlockMarkerPair(RDMarkerHandle::SegueStart);
|
||||||
|
|
||||||
emit pointerValueChanged(RDMarkerHandle::SegueStart,
|
emit pointerValueChanged(RDMarkerHandle::SegueStart,
|
||||||
d_pointers[RDMarkerHandle::SegueStart]);
|
d_pointers[RDMarkerHandle::SegueStart]);
|
||||||
@ -591,6 +578,7 @@ void RDMarkerView::addHookData()
|
|||||||
|
|
||||||
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::HookStart,100);
|
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::HookStart,100);
|
||||||
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,100);
|
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,100);
|
||||||
|
InterlockMarkerPair(RDMarkerHandle::HookStart);
|
||||||
|
|
||||||
emit pointerValueChanged(RDMarkerHandle::HookStart,
|
emit pointerValueChanged(RDMarkerHandle::HookStart,
|
||||||
d_pointers[RDMarkerHandle::HookStart]);
|
d_pointers[RDMarkerHandle::HookStart]);
|
||||||
@ -604,6 +592,7 @@ void RDMarkerView::addFadeupData()
|
|||||||
d_pointers[RDMarkerHandle::FadeUp]=Msec(d_mouse_pos);
|
d_pointers[RDMarkerHandle::FadeUp]=Msec(d_mouse_pos);
|
||||||
|
|
||||||
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,80);
|
DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,80);
|
||||||
|
InterlockMarkerPair(RDMarkerHandle::FadeUp);
|
||||||
|
|
||||||
emit pointerValueChanged(RDMarkerHandle::FadeUp,
|
emit pointerValueChanged(RDMarkerHandle::FadeUp,
|
||||||
d_pointers[RDMarkerHandle::FadeUp]);
|
d_pointers[RDMarkerHandle::FadeUp]);
|
||||||
@ -615,6 +604,7 @@ void RDMarkerView::addFadedownData()
|
|||||||
d_pointers[RDMarkerHandle::FadeDown]=Msec(d_mouse_pos);
|
d_pointers[RDMarkerHandle::FadeDown]=Msec(d_mouse_pos);
|
||||||
|
|
||||||
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,80);
|
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,80);
|
||||||
|
InterlockMarkerPair(RDMarkerHandle::FadeUp);
|
||||||
|
|
||||||
emit pointerValueChanged(RDMarkerHandle::FadeDown,
|
emit pointerValueChanged(RDMarkerHandle::FadeDown,
|
||||||
d_pointers[RDMarkerHandle::FadeDown]);
|
d_pointers[RDMarkerHandle::FadeDown]);
|
||||||
@ -632,6 +622,42 @@ void RDMarkerView::deleteMarkerData()
|
|||||||
|
|
||||||
void RDMarkerView::updateInterlocks()
|
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++) {
|
for(int i=0;i<2;i++) {
|
||||||
d_handles[RDMarkerHandle::CutStart][i]->setMinimum(0,0);
|
d_handles[RDMarkerHandle::CutStart][i]->setMinimum(0,0);
|
||||||
d_handles[RDMarkerHandle::CutStart][i]->
|
d_handles[RDMarkerHandle::CutStart][i]->
|
||||||
@ -642,7 +668,7 @@ void RDMarkerView::updateInterlocks()
|
|||||||
setMinimum(d_handles[RDMarkerHandle::CutStart][i]->pos().x()-LEFT_MARGIN,
|
setMinimum(d_handles[RDMarkerHandle::CutStart][i]->pos().x()-LEFT_MARGIN,
|
||||||
d_pointers[RDMarkerHandle::CutStart]);
|
d_pointers[RDMarkerHandle::CutStart]);
|
||||||
d_handles[RDMarkerHandle::CutEnd][i]->
|
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::TalkStart);
|
||||||
InterlockMarkerPair(RDMarkerHandle::SegueStart);
|
InterlockMarkerPair(RDMarkerHandle::SegueStart);
|
||||||
@ -817,6 +843,8 @@ void RDMarkerView::WriteWave()
|
|||||||
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::CutEnd,20);
|
DrawMarker(RDMarkerHandle::End,RDMarkerHandle::CutEnd,20);
|
||||||
|
|
||||||
d_view->setScene(d_scene);
|
d_view->setScene(d_scene);
|
||||||
|
|
||||||
|
updateInterlocks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -827,10 +855,12 @@ void RDMarkerView::DrawMarker(RDMarkerHandle::PointerType type,
|
|||||||
RDMarkerHandle *m_item=NULL;
|
RDMarkerHandle *m_item=NULL;
|
||||||
|
|
||||||
if(d_pointers[role]>=0) {
|
if(d_pointers[role]>=0) {
|
||||||
l_item=d_scene->addLine(LEFT_MARGIN+Frame(d_pointers[role]),0,
|
l_item=new QGraphicsLineItem(0,0,0,d_height);
|
||||||
LEFT_MARGIN+Frame(d_pointers[role]),d_height,
|
l_item->setPen(QPen(RDMarkerHandle::pointerRoleColor(role)));
|
||||||
QPen(RDMarkerHandle::pointerRoleColor(role)));
|
|
||||||
l_item->setToolTip(RDMarkerHandle::pointerRoleTypeText(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);
|
m_item=new RDMarkerHandle(role,type,this);
|
||||||
d_scene->addItem(m_item);
|
d_scene->addItem(m_item);
|
||||||
m_item->setPos(LEFT_MARGIN+Frame(d_pointers[role]),handle_pos-12);
|
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++) {
|
for(int i=0;i<2;i++) {
|
||||||
d_handles[role][i]=NULL;
|
d_handles[role][i]=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
emit pointerValueChanged(role,-1);
|
emit pointerValueChanged(role,-1);
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,7 @@ class RDMarkerHandle : public QGraphicsPolygonItem
|
|||||||
int d_minimum_ptr;
|
int d_minimum_ptr;
|
||||||
int d_maximum_pos;
|
int d_maximum_pos;
|
||||||
int d_maximum_ptr;
|
int d_maximum_ptr;
|
||||||
|
int d_x_diff;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -84,7 +85,6 @@ class RDMarkerView : public QWidget
|
|||||||
void processRightClick(RDMarkerHandle::PointerRole role,
|
void processRightClick(RDMarkerHandle::PointerRole role,
|
||||||
const QPointF &pos);
|
const QPointF &pos);
|
||||||
void updatePosition(RDMarkerHandle::PointerRole role,int ptr);
|
void updatePosition(RDMarkerHandle::PointerRole role,int ptr);
|
||||||
// void updatePosition(RDMarkerHandle::PointerRole role,int offset);
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setAudioGain(int lvl);
|
void setAudioGain(int lvl);
|
||||||
@ -132,6 +132,7 @@ class RDMarkerView : public QWidget
|
|||||||
int d_audio_gain;
|
int d_audio_gain;
|
||||||
unsigned d_sample_rate;
|
unsigned d_sample_rate;
|
||||||
unsigned d_channels;
|
unsigned d_channels;
|
||||||
|
int d_audio_length;
|
||||||
int d_mouse_pos;
|
int d_mouse_pos;
|
||||||
int d_right_margin;
|
int d_right_margin;
|
||||||
QStringList d_pointer_fields;
|
QStringList d_pointer_fields;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user