From f8ac3f4e40c19ab4de17cd73c413fc225537ebaf Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 27 Dec 2021 20:30:00 -0800 Subject: [PATCH] refactor node gizmo release --- app/node/distort/crop/cropdistortnode.cpp | 4 +- app/node/distort/crop/cropdistortnode.h | 2 +- .../transform/transformdistortnode.cpp | 4 +- .../distort/transform/transformdistortnode.h | 2 +- app/node/generator/shape/shapenodebase.cpp | 4 +- app/node/generator/shape/shapenodebase.h | 2 +- app/node/node.cpp | 2 +- app/node/node.h | 2 +- app/panel/panelmanager.cpp | 41 +++++++++++--- app/panel/panelmanager.h | 56 ++++--------------- app/widget/viewer/viewerdisplay.cpp | 4 +- app/window/mainwindow/mainwindow.cpp | 26 ++++----- 12 files changed, 68 insertions(+), 81 deletions(-) diff --git a/app/node/distort/crop/cropdistortnode.cpp b/app/node/distort/crop/cropdistortnode.cpp index 5018a8f5a..009e05310 100644 --- a/app/node/distort/crop/cropdistortnode.cpp +++ b/app/node/distort/crop/cropdistortnode.cpp @@ -233,13 +233,11 @@ void CropDistortNode::GizmoMove(const QPointF &p, const rational &time, const Qt } } -void CropDistortNode::GizmoRelease() +void CropDistortNode::GizmoRelease(MultiUndoCommand *command) { - MultiUndoCommand *command = new MultiUndoCommand(); for (NodeInputDragger& i : gizmo_dragger_) { i.End(command); } - Core::instance()->undo_stack()->push(command); gizmo_dragger_.clear(); gizmo_start_.clear(); diff --git a/app/node/distort/crop/cropdistortnode.h b/app/node/distort/crop/cropdistortnode.h index a20998a7d..24f2c0b50 100644 --- a/app/node/distort/crop/cropdistortnode.h +++ b/app/node/distort/crop/cropdistortnode.h @@ -76,7 +76,7 @@ public: virtual bool GizmoPress(const NodeValueRow& row, const NodeGlobals &globals, const QPointF &p) override; virtual void GizmoMove(const QPointF &p, const rational &time, const Qt::KeyboardModifiers &modifiers) override; - virtual void GizmoRelease() override; + virtual void GizmoRelease(MultiUndoCommand *command) override; static const QString kTextureInput; static const QString kLeftInput; diff --git a/app/node/distort/transform/transformdistortnode.cpp b/app/node/distort/transform/transformdistortnode.cpp index df6266a7a..483b9f001 100644 --- a/app/node/distort/transform/transformdistortnode.cpp +++ b/app/node/distort/transform/transformdistortnode.cpp @@ -301,13 +301,11 @@ void TransformDistortNode::GizmoMove(const QPointF &p, const rational &time, con } } -void TransformDistortNode::GizmoRelease() +void TransformDistortNode::GizmoRelease(MultiUndoCommand *command) { - MultiUndoCommand *command = new MultiUndoCommand(); for (NodeInputDragger& i : gizmo_dragger_) { i.End(command); } - Core::instance()->undo_stack()->push(command); gizmo_dragger_.clear(); gizmo_start_.clear(); diff --git a/app/node/distort/transform/transformdistortnode.h b/app/node/distort/transform/transformdistortnode.h index 17bf541a0..6bfe5e2f3 100644 --- a/app/node/distort/transform/transformdistortnode.h +++ b/app/node/distort/transform/transformdistortnode.h @@ -78,7 +78,7 @@ public: virtual bool GizmoPress(const NodeValueRow &row, const NodeGlobals &globals, const QPointF &p) override; virtual void GizmoMove(const QPointF &p, const rational &time, const Qt::KeyboardModifiers &modifiers) override; - virtual void GizmoRelease() override; + virtual void GizmoRelease(MultiUndoCommand *command) override; enum AutoScaleType { kAutoScaleNone, diff --git a/app/node/generator/shape/shapenodebase.cpp b/app/node/generator/shape/shapenodebase.cpp index 8211bb180..d5c03b0ac 100644 --- a/app/node/generator/shape/shapenodebase.cpp +++ b/app/node/generator/shape/shapenodebase.cpp @@ -297,13 +297,11 @@ void ShapeNodeBase::GizmoMove(const QPointF &p, const rational &time, const Qt:: } } -void ShapeNodeBase::GizmoRelease() +void ShapeNodeBase::GizmoRelease(MultiUndoCommand *command) { - MultiUndoCommand *command = new MultiUndoCommand(); for (NodeInputDragger& i : gizmo_dragger_) { i.End(command); } - Core::instance()->undo_stack()->push(command); gizmo_dragger_.clear(); } diff --git a/app/node/generator/shape/shapenodebase.h b/app/node/generator/shape/shapenodebase.h index 819d4cb94..7337d5b6c 100644 --- a/app/node/generator/shape/shapenodebase.h +++ b/app/node/generator/shape/shapenodebase.h @@ -49,7 +49,7 @@ public: virtual bool GizmoPress(const NodeValueRow& row, const NodeGlobals &globals, const QPointF &p) override; virtual void GizmoMove(const QPointF &p, const rational &time, const Qt::KeyboardModifiers &modifiers) override; - virtual void GizmoRelease() override; + virtual void GizmoRelease(MultiUndoCommand *command) override; private: static QVector2D GenerateGizmoAnchor(const QVector2D &pos, const QVector2D &size, int drag, QVector2D *pt); diff --git a/app/node/node.cpp b/app/node/node.cpp index e76ece9e5..90ee197f9 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -1504,7 +1504,7 @@ void Node::GizmoMove(const QPointF &, const rational&, const Qt::KeyboardModifie { } -void Node::GizmoRelease() +void Node::GizmoRelease(MultiUndoCommand *) { } diff --git a/app/node/node.h b/app/node/node.h index 299e9b5ae..45516fbb8 100644 --- a/app/node/node.h +++ b/app/node/node.h @@ -855,7 +855,7 @@ public: virtual bool GizmoPress(const NodeValueRow& row, const NodeGlobals &globals, const QPointF& p); virtual void GizmoMove(const QPointF& p, const rational &time, const Qt::KeyboardModifiers &modifiers); - virtual void GizmoRelease(); + virtual void GizmoRelease(MultiUndoCommand *command); const QString& GetLabel() const; void SetLabel(const QString& s); diff --git a/app/panel/panelmanager.cpp b/app/panel/panelmanager.cpp index 779c2be35..e3959bfbf 100644 --- a/app/panel/panelmanager.cpp +++ b/app/panel/panelmanager.cpp @@ -95,6 +95,40 @@ PanelManager *PanelManager::instance() return instance_; } +void PanelManager::RegisterPanel(PanelWidget *panel) +{ + // Add panel to the bottom of the focus history + focus_history_.append(panel); + + panel->SetMovementLocked(locked_); + + // Get panel parent (it's assumed it has one) + QWidget *parent = panel->parentWidget(); + + // Sane default for panel size + panel->resize(parent->size() / 3); + + // We're about to center the panel relative to the parent (usually the main window), but for some + // reason this requires the panel to be shown first. + panel->show(); + + // Center the panel relative to the parent + QPoint parent_center = panel->mapFromGlobal(parent->mapToGlobal(parent->rect().center())); + QPoint panel_center = panel->rect().center(); + panel->move(parent_center - panel_center); + + if (focus_history_.size() == 1) { + // This is the first panel, focus it + panel->SetBorderVisible(true); + emit FocusedPanelChanged(panel); + } +} + +void PanelManager::UnregisterPanel(PanelWidget *panel) +{ + focus_history_.removeOne(panel); +} + void PanelManager::FocusChanged(QWidget *old, QWidget *now) { Q_UNUSED(old) @@ -151,11 +185,4 @@ void PanelManager::SetPanelsLocked(bool locked) locked_ = locked; } -void PanelManager::PanelDestroyed() -{ - PanelWidget* panel = static_cast(sender()); - - focus_history_.removeOne(panel); -} - } diff --git a/app/panel/panelmanager.h b/app/panel/panelmanager.h index 50dfefce6..a71a312a3 100644 --- a/app/panel/panelmanager.h +++ b/app/panel/panelmanager.h @@ -84,12 +84,6 @@ public: */ T* MostRecentlyFocused(); - template - /** - * @brief Create a panel - */ - T* CreatePanel(QWidget* parent); - /** * @brief Get whether panels are currently prevented from moving */ @@ -118,6 +112,16 @@ public: */ QList GetPanelsOfType(); + /** + * @brief Panel should call this upon construction so it can be kept track of + */ + void RegisterPanel(PanelWidget *panel); + + /** + * @brief Panel should call this upon destruction so no invalid pointers will be kept for it + */ + void UnregisterPanel(PanelWidget *panel); + public slots: /** * @brief Connect this to a QApplication's SIGNAL(focusChanged()) @@ -153,48 +157,8 @@ private: */ static PanelManager* instance_; -private slots: - /** - * @brief Processing if a panel gets deleted - */ - void PanelDestroyed(); - }; -template -T *PanelManager::CreatePanel(QWidget *parent) -{ - T* panel = new T(parent); - - // Add panel to the bottom of the focus history - focus_history_.append(panel); - - panel->SetMovementLocked(locked_); - - // Sane default for panel size - panel->resize(parent->size() / 3); - - // We're about to center the panel relative to the parent (usually the main window), but for some - // reason this requires the panel to be shown first. - panel->show(); - - // Center the panel relative to the parent - QPoint parent_center = panel->mapFromGlobal(parent->mapToGlobal(parent->rect().center())); - QPoint panel_center = panel->rect().center(); - panel->move(parent_center - panel_center); - - // Connect destroy signal so we can remove it from focus history - connect(panel, &PanelWidget::destroyed, this, &PanelManager::PanelDestroyed, Qt::DirectConnection); - - if (focus_history_.size() == 1) { - // This is the first panel, focus it - panel->SetBorderVisible(true); - emit FocusedPanelChanged(panel); - } - - return panel; -} - template T* PanelManager::MostRecentlyFocused() { diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 3e21bf120..4c9b21654 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -271,7 +271,9 @@ void ViewerDisplayWidget::mouseReleaseEvent(QMouseEvent *event) } else if (gizmo_click_) { // Handle gizmo - gizmos_->GizmoRelease(); + MultiUndoCommand *command = new MultiUndoCommand(); + gizmos_->GizmoRelease(command); + undo_stack()->pushIfHasChildren(command); gizmo_click_ = false; } else { diff --git a/app/window/mainwindow/mainwindow.cpp b/app/window/mainwindow/mainwindow.cpp index 61eb7ef92..6b4fd9883 100644 --- a/app/window/mainwindow/mainwindow.cpp +++ b/app/window/mainwindow/mainwindow.cpp @@ -78,17 +78,17 @@ MainWindow::MainWindow(QWidget *parent) : setStatusBar(status_bar); // Create standard panels - node_panel_ = PanelManager::instance()->CreatePanel(this); - footage_viewer_panel_ = PanelManager::instance()->CreatePanel(this); - param_panel_ = PanelManager::instance()->CreatePanel(this); - curve_panel_ = PanelManager::instance()->CreatePanel(this); - sequence_viewer_panel_ = PanelManager::instance()->CreatePanel(this); - pixel_sampler_panel_ = PanelManager::instance()->CreatePanel(this); + node_panel_ = new NodePanel(undo_stack_, this); + footage_viewer_panel_ = new FootageViewerPanel(undo_stack_, this); + param_panel_ = new ParamPanel(undo_stack_, this); + curve_panel_ = new CurvePanel(undo_stack_, this); + sequence_viewer_panel_ = new SequenceViewerPanel(undo_stack_, this); + pixel_sampler_panel_ = new PixelSamplerPanel(undo_stack_, this); AppendProjectPanel(); - tool_panel_ = PanelManager::instance()->CreatePanel(this); - task_man_panel_ = PanelManager::instance()->CreatePanel(this); + tool_panel_ = new ToolPanel(undo_stack_, this); + task_man_panel_ = new TaskManagerPanel(undo_stack_, this); AppendTimelinePanel(); - audio_monitor_panel_ = PanelManager::instance()->CreatePanel(this); + audio_monitor_panel_ = new AudioMonitorPanel(undo_stack_, this); // Make node-related connections connect(node_panel_, &NodePanel::NodesSelected, param_panel_, &ParamPanel::SelectNodes); @@ -218,7 +218,7 @@ bool MainWindow::IsSequenceOpen(Sequence *sequence) const void MainWindow::FolderOpen(Project* p, Folder *i, bool floating) { - ProjectPanel* panel = PanelManager::instance()->CreatePanel(this); + ProjectPanel* panel = new ProjectPanel(undo_stack_, this); panel->set_project(p); panel->set_root(i); @@ -256,7 +256,7 @@ void MainWindow::OpenNodeInViewer(ViewerOutput *node) viewer_panels_.value(node)->raise(); } else { // Create a viewer for this node - ViewerPanel* viewer = PanelManager::instance()->CreatePanel(this); + ViewerPanel* viewer = new ViewerPanel(undo_stack_, this); viewer->SetSignalInsteadOfClose(true); viewer->setFloating(true); @@ -816,7 +816,7 @@ void MainWindow::showEvent(QShowEvent *e) template T *MainWindow::AppendPanelInternal(QList& list) { - T* panel = PanelManager::instance()->CreatePanel(this); + T* panel = new T(undo_stack_, this); if (!list.isEmpty()) { tabifyDockWidget(list.last(), panel); @@ -837,7 +837,7 @@ T *MainWindow::AppendPanelInternal(QList& list) template T *MainWindow::AppendFloatingPanelInternal(QList &list) { - T* panel = PanelManager::instance()->CreatePanel(this); + T* panel = new T(undo_stack_, this); panel->setFloating(true); panel->show();