diff --git a/olive.pro b/olive.pro index 107c4e3d8..1238fe7a6 100644 --- a/olive.pro +++ b/olive.pro @@ -190,7 +190,6 @@ SOURCES += \ nodes/medianode.cpp \ nodes/node.cpp \ ui/nodeui.cpp \ - ui/nodewidget.cpp \ panels/effectspanel.cpp HEADERS += \ @@ -338,7 +337,6 @@ HEADERS += \ nodes/medianode.h \ nodes/node.h \ ui/nodeui.h \ - ui/nodewidget.h \ panels/effectspanel.h FORMS += diff --git a/panels/effectspanel.cpp b/panels/effectspanel.cpp index a901deb83..cd99fc6d9 100644 --- a/panels/effectspanel.cpp +++ b/panels/effectspanel.cpp @@ -151,7 +151,7 @@ void EffectsPanel::deselect_all_effects(QWidget* sender) { for (int i=0;iheader_click(false, false); + open_effects_.at(i)->Deselect(); } } diff --git a/panels/nodeeditor.cpp b/panels/nodeeditor.cpp index 3ea682bea..facf925e4 100644 --- a/panels/nodeeditor.cpp +++ b/panels/nodeeditor.cpp @@ -30,14 +30,37 @@ void NodeEditor::Retranslate() void NodeEditor::LoadEvent() { + nodes_.resize(open_effects_.size()); for (int i=0;iSetNodeParent(node_ui); + effect_ui->SetSelectable(false); + + node_ui->SetWidget(effect_ui); + node_ui->AddToScene(&scene_); + + nodes_[i] = node_ui; } } +void NodeEditor::ClearEvent() +{ + NodeUI* node; + + foreach (node, nodes_) { + delete node; + } + + nodes_.clear(); +} + void NodeEditor::Scroll(qreal x, qreal y) { NodeUI* node; + foreach (node, nodes_) { node->moveBy(x, y); } diff --git a/panels/nodeeditor.h b/panels/nodeeditor.h index b395fbc0b..2da7260e2 100644 --- a/panels/nodeeditor.h +++ b/panels/nodeeditor.h @@ -16,6 +16,7 @@ public: protected: virtual void LoadEvent() override; + virtual void ClearEvent() override; private: QGraphicsScene scene_; diff --git a/ui/collapsiblewidget.cpp b/ui/collapsiblewidget.cpp index 4132078b4..d8136ce91 100644 --- a/ui/collapsiblewidget.cpp +++ b/ui/collapsiblewidget.cpp @@ -29,13 +29,16 @@ #include #include #include +#include +#include #include "ui/icons.h" #include "global/debug.h" -CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { - selected = false; - +CollapsibleWidget::CollapsibleWidget(QWidget* parent) : + QWidget(parent), + contents(nullptr) +{ layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); @@ -58,24 +61,13 @@ CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { title_bar_layout->addStretch(); layout->addWidget(title_bar); - connect(title_bar, SIGNAL(select(bool, bool)), this, SLOT(header_click(bool, bool))); + connect(title_bar, SIGNAL(select()), this, SLOT(Selected())); set_button_icon(true); - - contents = nullptr; } -void CollapsibleWidget::header_click(bool s, bool deselect) { - selected = s; - title_bar->selected = s; - if (s) { - QPalette p = title_bar->palette(); - p.setColor(QPalette::Background, QColor(255, 255, 255, 64)); - title_bar->setPalette(p); - } else { - title_bar->setPalette(palette()); - } - if (deselect) emit deselect_others(this); +void CollapsibleWidget::Selected() { + emit deselect_others(this); } bool CollapsibleWidget::IsFocused() { @@ -96,7 +88,17 @@ void CollapsibleWidget::SetExpanded(bool s) bool CollapsibleWidget::IsSelected() { - return selected; + return title_bar->IsSelected(); +} + +void CollapsibleWidget::Deselect() +{ + title_bar->SetSelected(false); +} + +void CollapsibleWidget::SetSelectable(bool s) +{ + title_bar->SetSelectable(s); } void CollapsibleWidget::set_button_icon(bool open) { @@ -125,19 +127,65 @@ void CollapsibleWidget::on_visible_change() { SetExpanded(!IsExpanded()); } -CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) : QWidget(parent), selected(false) { +CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) : + QWidget(parent), + selected_(false), + selectable_(true) +{ setContextMenuPolicy(Qt::CustomContextMenu); } +bool CollapsibleWidgetHeader::IsSelected() +{ + return selected_; +} + +void CollapsibleWidgetHeader::SetSelected(bool s, bool deselect_others) +{ + selected_ = s; + + if (s) { + QPalette p = palette(); + p.setColor(QPalette::Background, QColor(255, 255, 255, 64)); + setPalette(p); + } else { + setPalette(qApp->palette()); + } + + if (deselect_others) { + emit select(); + } +} + +void CollapsibleWidgetHeader::SetSelectable(bool s) +{ + selectable_ = s; + + if (!selectable_ && selected_) { + SetSelected(false); + } +} + +bool CollapsibleWidgetHeader::event(QEvent *event) +{ + if (!selectable_ + && (event->type() == QEvent::MouseButtonPress + || event->type() == QEvent::MouseButtonRelease + || event->type() == QEvent::MouseMove + || event->type() == QEvent::MouseButtonDblClick) + && QApplication::sendEvent(parent(), event)) { + return true; + } + return QWidget::event(event); +} + void CollapsibleWidgetHeader::mousePressEvent(QMouseEvent* event) { - if (selected) { - if ((event->modifiers() & Qt::ShiftModifier)) { - selected = false; - emit select(selected, false); + if (selected_) { + if (event->modifiers() & Qt::ShiftModifier) { + SetSelected(false); } } else { - selected = true; - emit select(selected, !(event->modifiers() & Qt::ShiftModifier)); + SetSelected(true, !(event->modifiers() & Qt::ShiftModifier)); } } diff --git a/ui/collapsiblewidget.h b/ui/collapsiblewidget.h index 3ef0657ad..eca9536d1 100644 --- a/ui/collapsiblewidget.h +++ b/ui/collapsiblewidget.h @@ -34,12 +34,20 @@ class CollapsibleWidgetHeader : public QWidget { Q_OBJECT public: CollapsibleWidgetHeader(QWidget* parent = nullptr); - bool selected; + + bool IsSelected(); + void SetSelected(bool s, bool deselect_others = false); + + void SetSelectable(bool s); protected: - void mousePressEvent(QMouseEvent* event); - void paintEvent(QPaintEvent *event); + virtual bool event(QEvent *event) override; + virtual void mousePressEvent(QMouseEvent* event) override; + virtual void paintEvent(QPaintEvent *event) override; signals: - void select(bool, bool); + void select(); +private: + bool selected_; + bool selectable_; }; class CollapsibleWidget : public QWidget @@ -53,13 +61,15 @@ public: bool IsFocused(); bool IsExpanded(); void SetExpanded(bool s); + bool IsSelected(); + void Deselect(); + void SetSelectable(bool s); protected: QCheckBox* enabled_check; CollapsibleWidgetHeader* title_bar; QWidget* contents; private: - bool selected; QLabel* header; QVBoxLayout* layout; QPushButton* collapse_button; @@ -75,7 +85,7 @@ private slots: void on_visible_change(); public slots: - void header_click(bool s, bool deselect); + void Selected(); }; #endif // COLLAPSIBLEWIDGET_H diff --git a/ui/effectui.cpp b/ui/effectui.cpp index 676defaea..d86658584 100644 --- a/ui/effectui.cpp +++ b/ui/effectui.cpp @@ -30,7 +30,8 @@ #include "panels/panels.h" EffectUI::EffectUI(Effect* e) : - effect_(e) + effect_(e), + node_parent_(nullptr) { Q_ASSERT(e != nullptr); @@ -89,6 +90,8 @@ EffectUI::EffectUI(Effect* e) : ui->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); SetContents(ui); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); + SetExpanded(e->IsExpanded()); connect(this, SIGNAL(visibleChanged(bool)), e, SLOT(SetExpanded(bool))); @@ -276,6 +279,31 @@ bool EffectUI::IsAttachedToClip(Clip *c) return false; } +void EffectUI::SetNodeParent(NodeUI *parent) +{ + node_parent_ = parent; +} + +void EffectUI::resizeEvent(QResizeEvent *event) +{ + if (node_parent_ != nullptr) { + node_parent_->Resize(event->size()); + } +} + +bool EffectUI::event(QEvent *event) +{ + if (node_parent_ != nullptr + && (event->type() == QEvent::MouseButtonPress + || event->type() == QEvent::MouseButtonRelease + || event->type() == QEvent::MouseMove + || event->type() == QEvent::MouseButtonDblClick) + && node_parent_->scene()->sendEvent(node_parent_, event)) { + return true; + } + return CollapsibleWidget::event(event); +} + QWidget *EffectUI::Widget(int row, int field) { return widgets_.at(row).at(field); diff --git a/ui/effectui.h b/ui/effectui.h index a1871061b..86627e96e 100644 --- a/ui/effectui.h +++ b/ui/effectui.h @@ -23,6 +23,7 @@ #include "collapsiblewidget.h" #include "effects/effect.h" +#include "ui/nodeui.h" /** * @brief The EffectUI class @@ -131,6 +132,12 @@ public: */ bool IsAttachedToClip(Clip* c); + void SetNodeParent(NodeUI* parent); + +protected: + virtual void resizeEvent(QResizeEvent* event) override; + virtual bool event(QEvent* event) override; + signals: /** * @brief Cut signal @@ -195,6 +202,11 @@ private: */ QVector keyframe_navigators_; + /** + * @brief Internal reference to node parent + */ + NodeUI* node_parent_; + /** * @brief Attach a KeyframeNavigator object to an EffectRow. * diff --git a/ui/nodeui.cpp b/ui/nodeui.cpp index 10af09f0d..718365c46 100644 --- a/ui/nodeui.cpp +++ b/ui/nodeui.cpp @@ -10,33 +10,55 @@ #include #include +const int kRoundedRectRadius = 5; + NodeUI::NodeUI() : - central_widget_(this) + central_widget_(nullptr) { setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsSelectable, true); } +NodeUI::~NodeUI() +{ + if (scene() != nullptr) { + scene()->removeItem(proxy_); + scene()->removeItem(this); + } +} + void NodeUI::AddToScene(QGraphicsScene *scene) { scene->addItem(this); - QGraphicsProxyWidget* proxy = scene->addWidget(¢ral_widget_); - proxy->setPos(pos()); - proxy->setParentItem(this); + if (central_widget_ != nullptr) { + proxy_ = scene->addWidget(central_widget_); + proxy_->setPos(pos() + QPoint(kRoundedRectRadius, kRoundedRectRadius)); + proxy_->setParentItem(this); + } } void NodeUI::Resize(const QSize &s) { QRectF rectangle = rect(); - rectangle.setSize(s); + rectangle.setSize(s + 2 * QSize(kRoundedRectRadius, kRoundedRectRadius)); + + path_ = QPainterPath(); + path_.addRoundedRect(rectangle, kRoundedRectRadius, kRoundedRectRadius); setRect(rectangle); } +void NodeUI::SetWidget(QWidget *widget) +{ + central_widget_ = widget; +} + void NodeUI::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { + Q_UNUSED(widget) + QPalette palette = qApp->palette(); if (option->state & QStyle::State_Selected) { @@ -45,11 +67,5 @@ void NodeUI::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QW painter->setPen(palette.base().color()); } painter->setBrush(palette.window()); - - QRectF r = rect(); - r.setX(r.x() - 1); - r.setY(r.y() - 1); - r.setRight(r.right() + 1); - r.setBottom(r.bottom() + 1); - painter->drawRect(r); + painter->drawPath(path_); } diff --git a/ui/nodeui.h b/ui/nodeui.h index 47e410125..1bde2f392 100644 --- a/ui/nodeui.h +++ b/ui/nodeui.h @@ -4,18 +4,20 @@ #include #include -#include "ui/nodewidget.h" - class NodeUI : public QGraphicsRectItem { public: NodeUI(); + virtual ~NodeUI() override; + void AddToScene(QGraphicsScene* scene); void Resize(const QSize& s); + void SetWidget(QWidget* widget); protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; - private: - NodeWidget central_widget_; + QWidget* central_widget_; + QGraphicsProxyWidget* proxy_; + QPainterPath path_; }; #endif // NODEUI_H diff --git a/ui/nodeview.cpp b/ui/nodeview.cpp index db20fb80a..d4b780ce0 100644 --- a/ui/nodeview.cpp +++ b/ui/nodeview.cpp @@ -10,8 +10,8 @@ NodeView::NodeView(QGraphicsScene *scene, QWidget *parent) : setMouseTracking(true); setWindowTitle(tr("Node Editor")); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); } void NodeView::mousePressEvent(QMouseEvent *event) diff --git a/ui/nodewidget.cpp b/ui/nodewidget.cpp deleted file mode 100644 index 6a4c3fa07..000000000 --- a/ui/nodewidget.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "nodewidget.h" - -#include -#include -#include -#include -#include -#include - -#include "ui/nodeui.h" - -NodeWidget::NodeWidget(NodeUI *parent) : - parent_(parent) -{ - QVBoxLayout* layout = new QVBoxLayout(this); - - QLabel* title = new QLabel("Node"); - layout->addWidget(title); - - QGridLayout* grid_layout = new QGridLayout(); - - grid_layout->addWidget(new QLabel("Option 1"), 0, 0); - grid_layout->addWidget(new QLineEdit("Value 1"), 0, 1); - - grid_layout->addWidget(new QLabel("Option 2"), 1, 0); - grid_layout->addWidget(new QLineEdit("Value 2"), 1, 1); - - layout->addLayout(grid_layout); -} - -void NodeWidget::resizeEvent(QResizeEvent *event) -{ - parent_->Resize(event->size()); -} - -bool NodeWidget::event(QEvent *event) -{ - if ((event->type() == QEvent::MouseButtonPress - || event->type() == QEvent::MouseButtonRelease - || event->type() == QEvent::MouseMove - || event->type() == QEvent::MouseButtonDblClick) - && parent_->scene()->sendEvent(parent_, event)) { - return true; - } - return QWidget::event(event); -} diff --git a/ui/nodewidget.h b/ui/nodewidget.h deleted file mode 100644 index 16271563f..000000000 --- a/ui/nodewidget.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef NODEWIDGET_H -#define NODEWIDGET_H - -#include - -class NodeUI; - -class NodeWidget : public QWidget -{ - Q_OBJECT -public: - NodeWidget(NodeUI *parent); -protected: - virtual void resizeEvent(QResizeEvent *event) override; - virtual bool event(QEvent *event) override; -private: - NodeUI* parent_; -}; - -#endif // NODEWIDGET_H