diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 5ad521971..44ffbcfc0 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -233,6 +233,18 @@ void ViewerOutput::Retranslate() } } +const QString &ViewerOutput::media_name() const +{ + return media_name_; +} + +void ViewerOutput::set_media_name(const QString &name) +{ + media_name_ = name; + + emit MediaNameChanged(media_name_); +} + const QVector& ViewerOutput::Tracks() const { return track_cache_; diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 810de739c..e158189f8 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -74,6 +74,9 @@ public: virtual void Retranslate() override; + const QString& media_name() const; + void set_media_name(const QString& name); + protected: virtual void DependentEdgeChanged(NodeInput* from) override; @@ -100,6 +103,8 @@ signals: void TrackHeightChanged(Timeline::TrackType type, int index, int height); + void MediaNameChanged(const QString& name); + private: QUuid uuid_; @@ -121,6 +126,8 @@ private: rational timeline_length_; + QString media_name_; + private slots: void UpdateTrackCache(); diff --git a/app/panel/footageviewer/footageviewer.cpp b/app/panel/footageviewer/footageviewer.cpp index 14db827fa..a6c165b7e 100644 --- a/app/panel/footageviewer/footageviewer.cpp +++ b/app/panel/footageviewer/footageviewer.cpp @@ -41,6 +41,12 @@ FootageViewerPanel::FootageViewerPanel(QWidget *parent) : void FootageViewerPanel::SetFootage(Footage *f) { static_cast(viewer_)->SetFootage(f); + + if (f) { + SetSubtitle(f->name()); + } else { + Retranslate(); + } } void FootageViewerPanel::changeEvent(QEvent *e) @@ -54,5 +60,8 @@ void FootageViewerPanel::changeEvent(QEvent *e) void FootageViewerPanel::Retranslate() { SetTitle(tr("Footage Viewer")); - SetSubtitle(tr("(none)")); + + if (!static_cast(viewer_)->GetFootage()) { + SetSubtitle(tr("(none)")); + } } diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index c3ff28665..efb973bf2 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -51,7 +51,17 @@ void TimelinePanel::SetTime(const int64_t ×tamp) void TimelinePanel::ConnectTimelineNode(ViewerOutput *node) { + if (timeline_widget_->GetConnectedNode()) { + disconnect(timeline_widget_->GetConnectedNode(), &ViewerOutput::MediaNameChanged, this, &TimelinePanel::SetSubtitle); + Retranslate(); + } + timeline_widget_->ConnectTimelineNode(node); + + if (node) { + connect(node, &ViewerOutput::MediaNameChanged, this, &TimelinePanel::SetSubtitle); + SetSubtitle(node->media_name()); + } } void TimelinePanel::DisconnectTimelineNode() @@ -140,5 +150,8 @@ void TimelinePanel::changeEvent(QEvent *e) void TimelinePanel::Retranslate() { SetTitle(tr("Timeline")); - SetSubtitle(tr("(none)")); + + if (!timeline_widget_->GetConnectedNode()) { + SetSubtitle(tr("(none)")); + } } diff --git a/app/panel/viewer/viewer.cpp b/app/panel/viewer/viewer.cpp index 7025eb6b6..c2fa38ed4 100644 --- a/app/panel/viewer/viewer.cpp +++ b/app/panel/viewer/viewer.cpp @@ -39,12 +39,17 @@ ViewerPanel::ViewerPanel(QWidget *parent) : void ViewerPanel::ConnectViewerNode(ViewerOutput *node) { - viewer_->ConnectViewerNode(node); -} + if (viewer_->GetConnectedViewer()) { + disconnect(viewer_->GetConnectedViewer(), &ViewerOutput::MediaNameChanged, this, &ViewerPanel::SetSubtitle); + Retranslate(); + } -void ViewerPanel::DisconnectViewerNode() -{ - viewer_->DisconnectViewerNode(); + viewer_->ConnectViewerNode(node); + + if (node) { + connect(node, &ViewerOutput::MediaNameChanged, this, &ViewerPanel::SetSubtitle); + SetSubtitle(node->media_name()); + } } rational ViewerPanel::GetTime() @@ -73,5 +78,8 @@ void ViewerPanel::changeEvent(QEvent *e) void ViewerPanel::Retranslate() { SetTitle(tr("Viewer")); - SetSubtitle(tr("(none)")); + + if (!viewer_->GetConnectedViewer()) { + SetSubtitle(tr("(none)")); + } } diff --git a/app/panel/viewer/viewer.h b/app/panel/viewer/viewer.h index ea128fe52..4ecccffde 100644 --- a/app/panel/viewer/viewer.h +++ b/app/panel/viewer/viewer.h @@ -35,8 +35,6 @@ public: void ConnectViewerNode(ViewerOutput* node); - void DisconnectViewerNode(); - rational GetTime(); ViewerOutput* GetConnectedViewer() const; diff --git a/app/project/item/item.cpp b/app/project/item/item.cpp index 985e7882c..33bbf3113 100644 --- a/app/project/item/item.cpp +++ b/app/project/item/item.cpp @@ -95,6 +95,8 @@ const QString &Item::name() const void Item::set_name(const QString &n) { name_ = n; + + NameChangedEvent(n); } const QString &Item::tooltip() const @@ -155,6 +157,10 @@ bool Item::ChildExistsWithName(const QString &name) return ChildExistsWithNameInternal(name, this); } +void Item::NameChangedEvent(const QString &name) +{ +} + bool Item::ChildExistsWithNameInternal(const QString &name, Item *folder) { // Loop through all children diff --git a/app/project/item/item.h b/app/project/item/item.h index 195daac88..c4e652d61 100644 --- a/app/project/item/item.h +++ b/app/project/item/item.h @@ -44,7 +44,7 @@ using ItemPtr = std::shared_ptr; * Project objects implement a parent-child hierarchy of Items that can be used throughout the Project. The Item class * itself is abstract and will need to be subclassed to be used in a Project. */ -class Item : public ThreadedObject +class Item { public: enum Type { @@ -101,6 +101,9 @@ public: bool ChildExistsWithName(const QString& name); +protected: + virtual void NameChangedEvent(const QString& name); + private: bool ChildExistsWithNameInternal(const QString& name, Item* folder); diff --git a/app/project/item/sequence/sequence.cpp b/app/project/item/sequence/sequence.cpp index 8bc8768a6..19ef6445e 100644 --- a/app/project/item/sequence/sequence.cpp +++ b/app/project/item/sequence/sequence.cpp @@ -250,5 +250,11 @@ void Sequence::set_default_parameters() Config::Current()["DefaultSequenceHeight"].toInt(), Config::Current()["DefaultSequenceFrameRate"].value())); set_audio_params(AudioParams(Config::Current()["DefaultSequenceAudioFrequency"].toInt(), - Config::Current()["DefaultSequenceAudioLayout"].toULongLong())); + Config::Current()["DefaultSequenceAudioLayout"].toULongLong())); +} + +void Sequence::NameChangedEvent(const QString &name) +{ + qDebug() << "Setting viewer output name to" << name; + viewer_output_->set_media_name(name); } diff --git a/app/project/item/sequence/sequence.h b/app/project/item/sequence/sequence.h index 551f2831a..33be50326 100644 --- a/app/project/item/sequence/sequence.h +++ b/app/project/item/sequence/sequence.h @@ -71,6 +71,9 @@ public: void set_default_parameters(); +protected: + virtual void NameChangedEvent(const QString& name) override; + private: ViewerOutput* viewer_output_; diff --git a/app/widget/panel/panel.h b/app/widget/panel/panel.h index 36cd13a35..ce2d6cc60 100644 --- a/app/widget/panel/panel.h +++ b/app/widget/panel/panel.h @@ -113,6 +113,14 @@ public: virtual void DecreaseTrackHeight(){} protected: + /** + * @brief paintEvent + * @param event + */ + void paintEvent(QPaintEvent *event) override; + + +protected slots: /** * @brief Set panel's title * @@ -141,11 +149,6 @@ protected: */ void SetSubtitle(const QString& t); - /** - * @brief paintEvent - * @param event - */ - void paintEvent(QPaintEvent *event) override; private: /** * @brief Internal function that sets the QDockWidget's window title whenever the title/subtitle change. diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index dfb827126..4dc0062d7 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -525,6 +525,11 @@ QList TimelineWidget::GetSelectedBlocks() return list; } +ViewerOutput *TimelineWidget::GetConnectedNode() const +{ + return timeline_node_; +} + void TimelineWidget::RippleEditTo(Timeline::MovementMode mode, bool insert_gaps) { rational playhead_time = Timecode::timestamp_to_time(playhead_, timebase()); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 722689c42..7f0a2b24b 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -63,6 +63,8 @@ public: QList GetSelectedBlocks(); + ViewerOutput* GetConnectedNode() const; + public slots: void SetTimebase(const rational& timebase); diff --git a/app/widget/viewer/footageviewer.cpp b/app/widget/viewer/footageviewer.cpp index 7cf3450bb..2e2e71b59 100644 --- a/app/widget/viewer/footageviewer.cpp +++ b/app/widget/viewer/footageviewer.cpp @@ -15,10 +15,15 @@ FootageViewerWidget::FootageViewerWidget(QWidget *parent) : NodeParam::ConnectEdge(video_node_->output(), viewer_node_->length_input()); } +Footage *FootageViewerWidget::GetFootage() const +{ + return footage_; +} + void FootageViewerWidget::SetFootage(Footage *footage) { if (footage_) { - DisconnectViewerNode(); + ConnectViewerNode(nullptr); } footage_ = footage; diff --git a/app/widget/viewer/footageviewer.h b/app/widget/viewer/footageviewer.h index 257ceabae..6a4168db0 100644 --- a/app/widget/viewer/footageviewer.h +++ b/app/widget/viewer/footageviewer.h @@ -12,6 +12,7 @@ class FootageViewerWidget : public ViewerWidget public: FootageViewerWidget(QWidget* parent = nullptr); + Footage* GetFootage() const; void SetFootage(Footage* footage); private: diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 9de60620a..14c1883a9 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -186,11 +186,6 @@ void ViewerWidget::ConnectViewerNode(ViewerOutput *node, ColorManager* color_man } } -void ViewerWidget::DisconnectViewerNode() -{ - ConnectViewerNode(nullptr); -} - ViewerOutput *ViewerWidget::GetConnectedViewer() const { return viewer_node_; diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 563740c47..208b8cce6 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -65,8 +65,6 @@ public: void ConnectViewerNode(ViewerOutput* node, ColorManager *color_manager = nullptr); - void DisconnectViewerNode(); - ViewerOutput* GetConnectedViewer() const; void SetColorMenuEnabled(bool enabled);