From 5e9682f1d201eff4c9ac06f70fa1e68be9d5c628 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Tue, 16 Mar 2021 18:53:54 -0400 Subject: [PATCH] 2021-03-16 Fred Gleason * Implemented basic marker limit interlocking in 'RDMarkerView'. Signed-off-by: Fred Gleason --- ChangeLog | 2 + lib/librd_cs.ts | 24 ++++ lib/librd_de.ts | 24 ++++ lib/librd_es.ts | 24 ++++ lib/librd_fr.ts | 24 ++++ lib/librd_nb.ts | 24 ++++ lib/librd_nn.ts | 24 ++++ lib/librd_pt_BR.ts | 24 ++++ lib/rdmarkerview.cpp | 330 ++++++++++++++++++++++++++++++++++++++++--- lib/rdmarkerview.h | 31 +++- 10 files changed, 510 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index ae8cb73c..4d8a9e0b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21271,3 +21271,5 @@ * Added a 'RDMarkerReadout' class. 2021-03-15 Fred Gleason * Implemented saving marker positions in 'RDMarkerDialog'. +2021-03-16 Fred Gleason + * Implemented basic marker limit interlocking in 'RDMarkerView'. diff --git a/lib/librd_cs.ts b/lib/librd_cs.ts index addbb8f6..7c99878c 100644 --- a/lib/librd_cs.ts +++ b/lib/librd_cs.ts @@ -3611,6 +3611,30 @@ Out Fade Down Zeslabit + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_de.ts b/lib/librd_de.ts index 2345c0ec..5350f2cc 100644 --- a/lib/librd_de.ts +++ b/lib/librd_de.ts @@ -3600,6 +3600,30 @@ Out Fade Down Ausfaden + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_es.ts b/lib/librd_es.ts index 5a56cc4d..0c2d00d3 100644 --- a/lib/librd_es.ts +++ b/lib/librd_es.ts @@ -3587,6 +3587,30 @@ Todo Fade Down Fade de salida + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_fr.ts b/lib/librd_fr.ts index 170e1ccd..d5970cda 100644 --- a/lib/librd_fr.ts +++ b/lib/librd_fr.ts @@ -2997,6 +2997,30 @@ Out No such cart/cut! + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_nb.ts b/lib/librd_nb.ts index 663839c4..dff9bc7a 100644 --- a/lib/librd_nb.ts +++ b/lib/librd_nb.ts @@ -3550,6 +3550,30 @@ ut Fade Down Ton ut + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_nn.ts b/lib/librd_nn.ts index 663839c4..dff9bc7a 100644 --- a/lib/librd_nn.ts +++ b/lib/librd_nn.ts @@ -3550,6 +3550,30 @@ ut Fade Down Ton ut + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/librd_pt_BR.ts b/lib/librd_pt_BR.ts index 6d180e9e..84bd600d 100644 --- a/lib/librd_pt_BR.ts +++ b/lib/librd_pt_BR.ts @@ -3590,6 +3590,30 @@ Mínimo Fade Down Fade Down + + Add Talk Markers + + + + Add Segue Markers + + + + Add Hook Markers + + + + Add Fade Up Marker + + + + Add Fade Down Marker + + + + Delete Marker + + RDMatrixListModel diff --git a/lib/rdmarkerview.cpp b/lib/rdmarkerview.cpp index 85c41250..374e949f 100644 --- a/lib/rdmarkerview.cpp +++ b/lib/rdmarkerview.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -104,6 +105,8 @@ void RDMarkerHandle::setRange(int min,int max) void RDMarkerHandle::mousePressEvent(QGraphicsSceneMouseEvent *e) { + RDMarkerView *view=static_cast(d_marker_view); + if(e->button()==Qt::LeftButton) { e->accept(); if(d_peers.size()==0) { @@ -116,6 +119,11 @@ void RDMarkerHandle::mousePressEvent(QGraphicsSceneMouseEvent *e) } } } + + if(e->button()==Qt::RightButton) { + e->ignore(); + view->processRightClick(d_role,e->screenPos()); + } } @@ -128,9 +136,16 @@ void RDMarkerHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *e) // int corr=0; int x=pos().x()-LEFT_MARGIN; - if(x=0)&&(x=0)&&(x>d_maximum)) { + corr=d_maximum-x; + } + } + // printf("x: %d d_minimum: %d corr: %d lastPos: %d\n",x,d_minimum,corr, + // e->lastPos().x()); // // Update the Marker Graphics @@ -140,29 +155,17 @@ void RDMarkerHandle::mouseMoveEvent(QGraphicsSceneMouseEvent *e) QGraphicsItem *peer=d_peers.at(i); peer->setPos(peer->pos().x()+dx,peer->pos().y()); } - /* - qreal dx=e->pos().rx()-e->lastPos().rx(); - for(int i=0;isetPos(peer->pos().rx()+dx,peer->pos().ry()); - } - */ + // // Send Position // - view->updatePosition(d_role,x-corr); - // view->updatePosition(d_role,pos().x()-LEFT_MARGIN); + view->updatePosition(d_role,x+corr); } void RDMarkerHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) { - RDMarkerView *view=static_cast(d_marker_view); - - // - // Send Position - // - // view->updatePosition(d_role,pos().x()-LEFT_MARGIN); + // RDMarkerView *view=static_cast(d_marker_view); } @@ -305,6 +308,7 @@ RDMarkerView::RDMarkerView(int width,int height,QWidget *parent) d_height=height; d_scene=NULL; d_sample_rate=rda->system()->sampleRate(); + d_right_margin=0; clear(); d_view=new QGraphicsView(this); @@ -321,6 +325,25 @@ RDMarkerView::RDMarkerView(int width,int height,QWidget *parent) d_pointer_fields.push_back("HOOK_END_POINT"); d_pointer_fields.push_back("FADEUP_POINT"); d_pointer_fields.push_back("FADEDOWN_POINT"); + + // + // The Main Mouse Menu + // + d_main_menu=new QMenu(this); + connect(d_main_menu,SIGNAL(aboutToShow()),this,SLOT(updateMenuData())); + d_delete_marker_action=d_main_menu-> + addAction(tr("Delete Marker"),this,SLOT(deleteMarkerData())); + d_main_menu->addSeparator(); + d_add_talk_action=d_main_menu-> + addAction(tr("Add Talk Markers"),this,SLOT(addTalkData())); + d_add_segue_action=d_main_menu-> + addAction(tr("Add Segue Markers"),this,SLOT(addSegueData())); + d_add_hook_action=d_main_menu-> + addAction(tr("Add Hook Markers"),this,SLOT(addHookData())); + d_add_fadeup_action=d_main_menu-> + addAction(tr("Add Fade Up Marker"),this,SLOT(addFadeupData())); + d_add_fadedown_action=d_main_menu-> + addAction(tr("Add Fade Down Marker"),this,SLOT(addFadedownData())); } @@ -331,6 +354,7 @@ RDMarkerView::~RDMarkerView() } delete d_wave_factory; delete d_view; + delete d_main_menu; } @@ -370,6 +394,28 @@ bool RDMarkerView::hasUnsavedChanges() const } +void RDMarkerView::processRightClick(RDMarkerHandle::PointerRole role, + const QPointF &pos) +{ + d_deleting_roles.push_back(role); + if((role==RDMarkerHandle::SegueStart)|| + (role==RDMarkerHandle::TalkStart)|| + (role==RDMarkerHandle::HookStart)) { + d_deleting_roles.push_back((RDMarkerHandle::PointerRole)(role+1)); + } + if((role==RDMarkerHandle::SegueEnd)|| + (role==RDMarkerHandle::TalkEnd)|| + (role==RDMarkerHandle::HookEnd)) { + d_deleting_roles.push_back((RDMarkerHandle::PointerRole)(role-1)); + } + d_marker_menu_used=true; + d_main_menu->setGeometry(pos.x(),pos.y(), + d_main_menu->sizeHint().width(), + d_main_menu->sizeHint().height()); + d_main_menu->exec(); +} + + void RDMarkerView::updatePosition(RDMarkerHandle::PointerRole role, int offset) { // @@ -413,6 +459,7 @@ bool RDMarkerView::setCut(QString *err_msg,unsigned cartnum,int cutnum) { d_cart_number=cartnum; d_cut_number=cutnum; + d_right_margin=LEFT_MARGIN; // Default value if(!LoadCutData()) { *err_msg=tr("No such cart/cut!"); return false; @@ -458,12 +505,119 @@ void RDMarkerView::clear() } for(int i=0;i=d_pointers[RDMarkerHandle::CutStart])&& + (Msec(d_mouse_pos)setEnabled(can_delete); + d_add_fadedown_action-> + setEnabled(can_add&&(d_pointers[RDMarkerHandle::FadeDown]<0)); + d_add_fadeup_action-> + setEnabled(can_add&&(d_pointers[RDMarkerHandle::FadeUp]<0)); + d_add_hook_action-> + setEnabled(can_add&&(d_pointers[RDMarkerHandle::HookStart]<0)); + d_add_segue_action-> + setEnabled(can_add&&(d_pointers[RDMarkerHandle::SegueStart]<0)); + d_add_talk_action-> + setEnabled(can_add&&(d_pointers[RDMarkerHandle::TalkStart]<0)); +} + + +void RDMarkerView::addTalkData() +{ + d_pointers[RDMarkerHandle::TalkStart]=Msec(d_mouse_pos); + d_pointers[RDMarkerHandle::TalkEnd]=Msec(d_mouse_pos); + + DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::TalkStart,60); + DrawMarker(RDMarkerHandle::End,RDMarkerHandle::TalkEnd,60); + + emit pointerValueChanged(RDMarkerHandle::TalkStart, + d_pointers[RDMarkerHandle::TalkStart]); + emit pointerValueChanged(RDMarkerHandle::TalkEnd, + d_pointers[RDMarkerHandle::TalkEnd]); +} + + +void RDMarkerView::addSegueData() +{ + d_pointers[RDMarkerHandle::SegueStart]=Msec(d_mouse_pos); + d_pointers[RDMarkerHandle::SegueEnd]=Msec(d_mouse_pos); + + DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::SegueStart,40); + DrawMarker(RDMarkerHandle::End,RDMarkerHandle::SegueEnd,40); + + emit pointerValueChanged(RDMarkerHandle::SegueStart, + d_pointers[RDMarkerHandle::SegueStart]); + emit pointerValueChanged(RDMarkerHandle::SegueEnd, + d_pointers[RDMarkerHandle::SegueEnd]); +} + + +void RDMarkerView::addHookData() +{ + d_pointers[RDMarkerHandle::HookStart]=Msec(d_mouse_pos); + d_pointers[RDMarkerHandle::HookEnd]=Msec(d_mouse_pos); + + DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::HookStart,100); + DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,100); + + emit pointerValueChanged(RDMarkerHandle::HookStart, + d_pointers[RDMarkerHandle::HookStart]); + emit pointerValueChanged(RDMarkerHandle::HookEnd, + d_pointers[RDMarkerHandle::HookEnd]); +} + + +void RDMarkerView::addFadeupData() +{ + d_pointers[RDMarkerHandle::FadeUp]=Msec(d_mouse_pos); + + DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,80); + + emit pointerValueChanged(RDMarkerHandle::FadeUp, + d_pointers[RDMarkerHandle::FadeUp]); +} + + +void RDMarkerView::addFadedownData() +{ + d_pointers[RDMarkerHandle::FadeDown]=Msec(d_mouse_pos); + + DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,80); + + emit pointerValueChanged(RDMarkerHandle::FadeDown, + d_pointers[RDMarkerHandle::FadeDown]); +} + + +void RDMarkerView::deleteMarkerData() +{ + for(int i=0;i setMinimum(d_handles[RDMarkerHandle::CutStart][i]->pos().x()-LEFT_MARGIN); - // d_handles[RDMarkerHandle::CutStart][i]-> - // setMaximum(); + d_handles[RDMarkerHandle::CutEnd][i]-> + setMaximum(d_right_margin-LEFT_MARGIN); + + /* + if(d_handles[RDMarkerHandle::TalkStart][i]!=NULL) { + d_handles[RDMarkerHandle::TalkStart][i]-> + setMinimum(d_handles[RDMarkerHandle::CutStart][i]-> + pos().x()-LEFT_MARGIN); + d_handles[RDMarkerHandle::TalkStart][i]-> + setMaximum(d_handles[RDMarkerHandle::TalkEnd][i]-> + pos().x()-LEFT_MARGIN); + + d_handles[RDMarkerHandle::TalkEnd][i]-> + setMinimum(d_handles[RDMarkerHandle::TalkStart][i]-> + pos().x()-LEFT_MARGIN); + d_handles[RDMarkerHandle::TalkEnd][i]-> + setMaximum(d_handles[RDMarkerHandle::CutEnd][i]-> + pos().x()-LEFT_MARGIN); + } + */ + } + InterlockMarkerPair(RDMarkerHandle::TalkStart); + InterlockMarkerPair(RDMarkerHandle::SegueStart); + InterlockMarkerPair(RDMarkerHandle::HookStart); + InterlockMarkerPair(RDMarkerHandle::FadeUp); + + // printf("d_right_margin: %d\n",d_right_margin); +} + + +void RDMarkerView::InterlockMarkerPair(RDMarkerHandle::PointerRole start_marker) +{ + for(int i=0;i<2;i++) { + if(d_handles[start_marker][i]!=NULL) { + d_handles[start_marker][i]-> + setMinimum(d_handles[RDMarkerHandle::CutStart][i]-> + pos().x()-LEFT_MARGIN); + if(d_handles[start_marker+1][i]==NULL) { + d_handles[start_marker][i]-> + setMaximum(d_handles[RDMarkerHandle::CutEnd][i]-> + pos().x()-LEFT_MARGIN); + } + else { + d_handles[start_marker][i]-> + setMaximum(d_handles[start_marker+1][i]-> + pos().x()-LEFT_MARGIN); + } + } + + if(d_handles[start_marker+1][i]!=NULL) { + if(d_handles[start_marker][i]==NULL) { + d_handles[start_marker+1][i]-> + setMinimum(d_handles[RDMarkerHandle::CutStart][i]-> + pos().x()-LEFT_MARGIN); + } + else { + d_handles[start_marker+1][i]-> + setMinimum(d_handles[start_marker][i]-> + pos().x()-LEFT_MARGIN); + } + d_handles[start_marker+1][i]-> + setMaximum(d_handles[RDMarkerHandle::CutEnd][i]-> + pos().x()-LEFT_MARGIN); + } } } + + void RDMarkerView::resizeEvent(QResizeEvent *e) { d_view->setGeometry(0,0,size().width(),size().height()); } +void RDMarkerView::mousePressEvent(QMouseEvent *e) +{ + if((e->x()<=LEFT_MARGIN)||(e->x()>d_right_margin)) { + QWidget::mousePressEvent(e); + return; + } + d_mouse_pos=e->x()-LEFT_MARGIN; + switch(e->button()) { + /* + case Qt::LeftButton: + left_button_pressed=true; + if(edit_cue_point!=RDEditAudio::Play) { + ignore_pause=true; + PositionCursor(cursor); + ignore_pause=false; + } + else { + ignore_pause=true; + rda->cae()->positionPlay(edit_handle,GetTime(cursor)); + ignore_pause=false; + } + break; + + case Qt::MidButton: + center_button_pressed=true; + ignore_pause=true; + rda->cae()->positionPlay(edit_handle,GetTime(cursor)); + ignore_pause=false; + break; + */ + case Qt::RightButton: + if(d_marker_menu_used) { + d_marker_menu_used=false; + return; + } + d_main_menu->setGeometry(e->globalX(),e->globalY(), + d_main_menu->sizeHint().width(), + d_main_menu->sizeHint().height()); + d_main_menu->exec(); + break; + + default: + break; + } +} + + int RDMarkerView::Frame(int msec) const { return (int)((int64_t)msec*(int64_t)d_sample_rate/(d_shrink_factor*1152000)); } +int RDMarkerView::Msec(int frame) const +{ + return (int)((int64_t)frame*d_shrink_factor*1152000/(int64_t)d_sample_rate); +} + + bool RDMarkerView::LoadCutData() { QString sql; @@ -536,12 +807,13 @@ void RDMarkerView::WriteWave() d_scene->addRect(0,0,LEFT_MARGIN,d_height-20,QPen(Qt::gray),QBrush(Qt::gray)); d_scene->addPixmap(wavemap)->setPos(LEFT_MARGIN,0); d_scene->addRect(LEFT_MARGIN+wavemap.width(),0,d_pad_size,d_height-20,QPen(Qt::gray),QBrush(Qt::gray)); + d_right_margin=LEFT_MARGIN+wavemap.width(); // // Markers // - DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeUp,100); - DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeDown,100); + DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::FadeUp,100); + DrawMarker(RDMarkerHandle::End,RDMarkerHandle::FadeDown,100); DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::HookStart,80); DrawMarker(RDMarkerHandle::End,RDMarkerHandle::HookEnd,80); DrawMarker(RDMarkerHandle::Start,RDMarkerHandle::TalkStart,60); @@ -577,3 +849,21 @@ void RDMarkerView::DrawMarker(RDMarkerHandle::PointerType type, d_handles[role][1]=m_item; } } + + +void RDMarkerView::RemoveMarker(RDMarkerHandle::PointerRole role) +{ + d_pointers[role]=-1; + QList items=d_scene->items(); + for(int i=items.size()-1;i>=0;i--) { + QGraphicsItem *item=items.at(i); + if(item->toolTip().contains(RDMarkerHandle::pointerRoleText(role))) { + d_scene->removeItem(item); + delete item; + } + } + for(int i=0;i<2;i++) { + d_handles[role][i]=NULL; + } + emit pointerValueChanged(role,-1); +} diff --git a/lib/rdmarkerview.h b/lib/rdmarkerview.h index 6d673ea5..022a14cd 100644 --- a/lib/rdmarkerview.h +++ b/lib/rdmarkerview.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -79,7 +80,10 @@ class RDMarkerView : public QWidget int shrinkFactor() const; int pointerValue(RDMarkerHandle::PointerRole role); bool hasUnsavedChanges() const; - void updatePosition(RDMarkerHandle::PointerRole role, int offset); + + void processRightClick(RDMarkerHandle::PointerRole role, + const QPointF &pos); + void updatePosition(RDMarkerHandle::PointerRole role,int offset); public slots: void setAudioGain(int lvl); @@ -92,16 +96,29 @@ class RDMarkerView : public QWidget signals: void pointerValueChanged(RDMarkerHandle::PointerRole role,int msec); + private slots: + void updateMenuData(); + void addTalkData(); + void addSegueData(); + void addHookData(); + void addFadeupData(); + void addFadedownData(); + void deleteMarkerData(); + protected: virtual void updateInterlocks(); void resizeEvent(QResizeEvent *e); + void mousePressEvent(QMouseEvent *e); private: int Frame(int msec) const; + int Msec(int frame) const; + void InterlockMarkerPair(RDMarkerHandle::PointerRole start_marker); bool LoadCutData(); void WriteWave(); void DrawMarker(RDMarkerHandle::PointerType type, RDMarkerHandle::PointerRole role,int handle_pos); + void RemoveMarker(RDMarkerHandle::PointerRole role); QGraphicsView *d_view; QGraphicsScene *d_scene; unsigned d_cart_number; @@ -114,11 +131,23 @@ class RDMarkerView : public QWidget int d_audio_gain; unsigned d_sample_rate; unsigned d_channels; + int d_mouse_pos; + int d_right_margin; QStringList d_pointer_fields; RDWaveFactory *d_wave_factory; bool d_has_unsaved_changes; int d_pointers[RDMarkerHandle::LastRole]; RDMarkerHandle *d_handles[RDMarkerHandle::LastRole][2]; + int d_audio_end; + QMenu *d_main_menu; + QAction *d_add_fadedown_action; + QAction *d_add_fadeup_action; + QAction *d_add_hook_action; + QAction *d_add_segue_action; + QAction *d_add_talk_action; + QList d_deleting_roles; + QAction *d_delete_marker_action; + bool d_marker_menu_used; };