curve/param/panels: leave curve panel open and have option for timebasedwidget to auto-set timebase

This commit is contained in:
itsmattkc
2020-06-23 05:22:58 +10:00
parent 2207a915a6
commit e681b87988
12 changed files with 81 additions and 89 deletions
-5
View File
@@ -49,11 +49,6 @@ void CurvePanel::SetInput(NodeInput *input)
Retranslate();
}
void CurvePanel::SetTimeTarget(Node *target)
{
static_cast<CurveWidget*>(GetTimeBasedWidget())->SetTimeTarget(target);
}
void CurvePanel::IncreaseTrackHeight()
{
CurveWidget* c = static_cast<CurveWidget*>(GetTimeBasedWidget());
-2
View File
@@ -39,8 +39,6 @@ public:
public slots:
void SetInput(NodeInput* input);
void SetTimeTarget(Node* target);
virtual void IncreaseTrackHeight() override;
virtual void DecreaseTrackHeight() override;
+35 -42
View File
@@ -30,8 +30,6 @@ ParamPanel::ParamPanel(QWidget* parent) :
NodeParamView* view = new NodeParamView();
connect(view, &NodeParamView::InputDoubleClicked, this, &ParamPanel::CreateCurvePanel);
connect(view, &NodeParamView::RequestSelectNode, this, &ParamPanel::RequestSelectNode);
connect(view, &NodeParamView::OpenedNode, this, &ParamPanel::OpeningNode);
connect(view, &NodeParamView::ClosedNode, this, &ParamPanel::ClosingNode);
connect(view, &NodeParamView::FoundGizmos, this, &ParamPanel::FoundGizmos);
SetTimeBasedWidget(view);
@@ -50,13 +48,7 @@ void ParamPanel::SetTimestamp(const int64_t &timestamp)
TimeBasedPanel::SetTimestamp(timestamp);
// Ensure all CurvePanels are updated with this time too
QHash<NodeInput*, CurvePanel*>::const_iterator i;
for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) {
if (i.value() && i.value() != sender()) {
i.value()->SetTimestamp(timestamp);
}
}
ParamViewTimeChanged(timestamp);
}
void ParamPanel::DeleteSelected()
@@ -97,50 +89,51 @@ void ParamPanel::CreateCurvePanel(NodeInput *input)
panel = Core::instance()->main_window()->AppendCurvePanel();
panel->SetInput(input);
panel->SetTimebase(view->timebase());
panel->ConnectViewerNode(view->GetConnectedNode());
panel->SetTimestamp(view->GetTimestamp());
panel->SetTimeTarget(view->GetTimeTarget());
connect(view, &NodeParamView::TimebaseChanged, panel, &CurvePanel::SetTimebase);
connect(view, &NodeParamView::TimeChanged, panel, &CurvePanel::SetTimestamp);
connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::SetTimestamp);
connect(panel, &CurvePanel::TimeChanged, view, &NodeParamView::TimeChanged);
connect(view, &NodeParamView::TimeChanged, this, &ParamPanel::ParamViewTimeChanged);
connect(panel, &CurvePanel::TimeChanged, this, &ParamPanel::CurvePanelTimeChanged);
connect(panel, &CurvePanel::CloseRequested, this, &ParamPanel::ClosingCurvePanel);
open_curve_panels_.insert(input, panel);
}
void ParamPanel::OpeningNode(Node *n)
{
QList<NodeInput*> inputs = n->GetInputsIncludingArrays();
foreach (NodeInput* i, inputs) {
if (open_curve_panels_.contains(i)) {
// We had a CurvePanel open for this input that was closed in ClosingNode(), re-open it
CreateCurvePanel(i);
}
}
}
void ParamPanel::ClosingNode(Node *n)
{
QList<NodeInput*> inputs = n->GetInputsIncludingArrays();
foreach (NodeInput* i, inputs) {
CurvePanel* panel = open_curve_panels_.value(i);
// Close the panel (this also destroys it), but keep a reference in the hash
if (panel) {
panel->close();
open_curve_panels_.insert(i, nullptr);
}
}
}
void ParamPanel::ClosingCurvePanel()
{
CurvePanel* panel = static_cast<CurvePanel*>(sender());
open_curve_panels_.remove(panel->GetInput());
}
void ParamPanel::ParamViewTimeChanged(const int64_t &time)
{
// Ensure all CurvePanels are updated with this time too
QHash<NodeInput*, CurvePanel*>::const_iterator i;
for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) {
// If connected viewers are the same, set the timestamp
if (i.value()->GetConnectedViewer() == GetConnectedViewer()) {
i.value()->SetTimestamp(time);
}
}
}
void ParamPanel::CurvePanelTimeChanged(const int64_t &time)
{
GetTimeBasedWidget()->SetTimestamp(time);
emit GetTimeBasedWidget()->TimeChanged(time);
CurvePanel* src = static_cast<CurvePanel*>(sender());
// Ensure all CurvePanels are updated with this time too
QHash<NodeInput*, CurvePanel*>::const_iterator i;
for (i=open_curve_panels_.begin(); i!=open_curve_panels_.end(); i++) {
// If connected viewers are the same and the panel isn't the source, set the timestamp
if (i.value() != src && i.value()->GetConnectedViewer() == src->GetConnectedViewer()) {
i.value()->SetTimestamp(time);
}
}
}
OLIVE_NAMESPACE_EXIT
+5 -4
View File
@@ -51,15 +51,16 @@ protected:
private slots:
void CreateCurvePanel(NodeInput* input);
void OpeningNode(Node* n);
void ClosingNode(Node* n);
void ClosingCurvePanel();
private:
QHash<NodeInput*, CurvePanel*> open_curve_panels_;
private slots:
void ParamViewTimeChanged(const int64_t& time);
void CurvePanelTimeChanged(const int64_t& time);
};
OLIVE_NAMESPACE_EXIT
+4 -7
View File
@@ -218,8 +218,6 @@ void CurveWidget::ScaleChangedEvent(const double &scale)
void CurveWidget::TimeTargetChangedEvent(Node *target)
{
ConnectViewerNode(nullptr);
key_control_->SetTimeTarget(target);
view_->SetTimeTarget(target);
@@ -227,12 +225,11 @@ void CurveWidget::TimeTargetChangedEvent(Node *target)
if (bridge_) {
bridge_->SetTimeTarget(target);
}
}
// FIXME: If a non-viewer node is ever set here, it will fail to update the length
ViewerOutput* viewer = dynamic_cast<ViewerOutput*>(target);
if (viewer) {
ConnectViewerNode(viewer);
}
void CurveWidget::ConnectedNodeChanged(ViewerOutput *n)
{
SetTimeTarget(n);
}
void CurveWidget::UpdateInputLabel()
+2
View File
@@ -59,6 +59,8 @@ protected:
virtual void TimeTargetChangedEvent(Node* target) override;
virtual void ConnectedNodeChanged(ViewerOutput* n) override;
private:
void UpdateInputLabel();
@@ -208,18 +208,6 @@ void NodeParamView::ConnectedNodeChanged(ViewerOutput *n)
}
}
void NodeParamView::ConnectNodeInternal(ViewerOutput *n)
{
SetTimebase(n->video_params().time_base());
}
void NodeParamView::DisconnectNodeInternal(ViewerOutput *n)
{
Q_UNUSED(n)
SetTimebase(rational());
}
const QList<Node *> &NodeParamView::nodes()
{
return nodes_;
-3
View File
@@ -64,9 +64,6 @@ protected:
virtual void ConnectedNodeChanged(ViewerOutput* n) override;
virtual void ConnectNodeInternal(ViewerOutput* n) override;
virtual void DisconnectNodeInternal(ViewerOutput* n) override;
private:
void UpdateItemTime(const int64_t &timestamp);
+24 -1
View File
@@ -36,7 +36,8 @@ TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_statu
viewer_node_(nullptr),
auto_max_scrollbar_(false),
points_(nullptr),
toggle_show_all_(false)
toggle_show_all_(false),
auto_set_timebase_(true)
{
ruler_ = new TimeRuler(ruler_text_visible, ruler_cache_status_visible, this);
connect(ruler_, &TimeRuler::TimeChanged, this, &TimeBasedWidget::SetTimeAndSignal);
@@ -79,6 +80,11 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
DisconnectNodeInternal(viewer_node_);
disconnect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll);
disconnect(viewer_node_, &ViewerOutput::TimebaseChanged, this, &TimeBasedWidget::SetTimebase);
if (auto_set_timebase_) {
SetTimebase(rational());
}
points_ = nullptr;
ruler()->ConnectTimelinePoints(nullptr);
@@ -95,6 +101,18 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
ruler()->ConnectTimelinePoints(points_);
}
if (auto_set_timebase_) {
if (!viewer_node_->video_params().time_base().isNull()) {
SetTimebase(viewer_node_->video_params().time_base());
} else if (viewer_node_->audio_params().sample_rate() > 0) {
SetTimebase(viewer_node_->audio_params().time_base());
} else {
SetTimebase(rational());
}
connect(viewer_node_, &ViewerOutput::TimebaseChanged, this, &TimeBasedWidget::SetTimebase);
}
ConnectNodeInternal(viewer_node_);
}
@@ -332,6 +350,11 @@ void TimeBasedWidget::CenterScrollOnPlayhead()
scrollbar_->setValue(qRound(TimeToScene(Timecode::timestamp_to_time(ruler_->GetTime(), timebase()))) - scrollbar_->width()/2);
}
void TimeBasedWidget::SetAutoSetTimebase(bool e)
{
auto_set_timebase_ = e;
}
void TimeBasedWidget::SetPoint(Timeline::MovementMode m, const rational& time)
{
if (!points_) {
+8
View File
@@ -127,6 +127,12 @@ protected slots:
*/
void CenterScrollOnPlayhead();
/**
* @brief By default, TimeBasedWidget will set the timebase to the viewer node's video timebase.
* Set this to false if you want to set your own timebase.
*/
void SetAutoSetTimebase(bool e);
signals:
void TimeChanged(const int64_t&);
@@ -170,6 +176,8 @@ private:
double toggle_show_all_old_scale_;
int toggle_show_all_old_scroll_;
bool auto_set_timebase_;
private slots:
void UpdateMaximumScroll();
+3 -1
View File
@@ -147,8 +147,10 @@ TimelineWidget::TimelineWidget(QWidget *parent) :
view_splitter->setSizes({INT_MAX, INT_MAX});
// FIXME: Magic number
SetMaximumScale(TimelineViewBase::kMaximumScale);
SetScale(90.0);
SetMaximumScale(TimelineViewBase::kMaximumScale);
SetAutoSetTimebase(false);
}
TimelineWidget::~TimelineWidget()
-12
View File
@@ -168,15 +168,6 @@ void ViewerWidget::TimeChangedEvent(const int64_t &i)
void ViewerWidget::ConnectNodeInternal(ViewerOutput *n)
{
if (!n->video_params().time_base().isNull()) {
SetTimebase(n->video_params().time_base());
} else if (n->audio_params().sample_rate() > 0) {
SetTimebase(n->audio_params().time_base());
} else {
SetTimebase(rational());
}
connect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase);
connect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot);
connect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot);
connect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters);
@@ -231,9 +222,6 @@ void ViewerWidget::DisconnectNodeInternal(ViewerOutput *n)
}
cache_wait_timer_.stop();
SetTimebase(rational());
disconnect(n, &ViewerOutput::TimebaseChanged, this, &ViewerWidget::SetTimebase);
disconnect(n, &ViewerOutput::SizeChanged, this, &ViewerWidget::SizeChangedSlot);
disconnect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot);
disconnect(n, &ViewerOutput::ParamsChanged, this, &ViewerWidget::UpdateRendererParameters);