effect UIs ported to nodes

This commit is contained in:
itsmattkc
2019-04-08 23:47:05 +10:00
parent 3837d7c461
commit 81da3228bb
13 changed files with 192 additions and 120 deletions
-2
View File
@@ -190,7 +190,6 @@ SOURCES += \
nodes/medianode.cpp \ nodes/medianode.cpp \
nodes/node.cpp \ nodes/node.cpp \
ui/nodeui.cpp \ ui/nodeui.cpp \
ui/nodewidget.cpp \
panels/effectspanel.cpp panels/effectspanel.cpp
HEADERS += \ HEADERS += \
@@ -338,7 +337,6 @@ HEADERS += \
nodes/medianode.h \ nodes/medianode.h \
nodes/node.h \ nodes/node.h \
ui/nodeui.h \ ui/nodeui.h \
ui/nodewidget.h \
panels/effectspanel.h panels/effectspanel.h
FORMS += FORMS +=
+1 -1
View File
@@ -151,7 +151,7 @@ void EffectsPanel::deselect_all_effects(QWidget* sender) {
for (int i=0;i<open_effects_.size();i++) { for (int i=0;i<open_effects_.size();i++) {
if (open_effects_.at(i) != sender) { if (open_effects_.at(i) != sender) {
open_effects_.at(i)->header_click(false, false); open_effects_.at(i)->Deselect();
} }
} }
+24 -1
View File
@@ -30,14 +30,37 @@ void NodeEditor::Retranslate()
void NodeEditor::LoadEvent() void NodeEditor::LoadEvent()
{ {
nodes_.resize(open_effects_.size());
for (int i=0;i<open_effects_.size();i++) { for (int i=0;i<open_effects_.size();i++) {
scene_.addWidget(open_effects_.at(i)); EffectUI* effect_ui = open_effects_.at(i);
NodeUI* node_ui = new NodeUI();
effect_ui->SetNodeParent(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) void NodeEditor::Scroll(qreal x, qreal y)
{ {
NodeUI* node; NodeUI* node;
foreach (node, nodes_) { foreach (node, nodes_) {
node->moveBy(x, y); node->moveBy(x, y);
} }
+1
View File
@@ -16,6 +16,7 @@ public:
protected: protected:
virtual void LoadEvent() override; virtual void LoadEvent() override;
virtual void ClearEvent() override;
private: private:
QGraphicsScene scene_; QGraphicsScene scene_;
+73 -25
View File
@@ -29,13 +29,16 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QWidget> #include <QWidget>
#include <QPainter> #include <QPainter>
#include <QStyle>
#include <QApplication>
#include "ui/icons.h" #include "ui/icons.h"
#include "global/debug.h" #include "global/debug.h"
CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { CollapsibleWidget::CollapsibleWidget(QWidget* parent) :
selected = false; QWidget(parent),
contents(nullptr)
{
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
layout->setMargin(0); layout->setMargin(0);
layout->setSpacing(0); layout->setSpacing(0);
@@ -58,24 +61,13 @@ CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) {
title_bar_layout->addStretch(); title_bar_layout->addStretch();
layout->addWidget(title_bar); 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); set_button_icon(true);
contents = nullptr;
} }
void CollapsibleWidget::header_click(bool s, bool deselect) { void CollapsibleWidget::Selected() {
selected = s; emit deselect_others(this);
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);
} }
bool CollapsibleWidget::IsFocused() { bool CollapsibleWidget::IsFocused() {
@@ -96,7 +88,17 @@ void CollapsibleWidget::SetExpanded(bool s)
bool CollapsibleWidget::IsSelected() 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) { void CollapsibleWidget::set_button_icon(bool open) {
@@ -125,19 +127,65 @@ void CollapsibleWidget::on_visible_change() {
SetExpanded(!IsExpanded()); SetExpanded(!IsExpanded());
} }
CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) : QWidget(parent), selected(false) { CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) :
QWidget(parent),
selected_(false),
selectable_(true)
{
setContextMenuPolicy(Qt::CustomContextMenu); 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) { void CollapsibleWidgetHeader::mousePressEvent(QMouseEvent* event) {
if (selected) { if (selected_) {
if ((event->modifiers() & Qt::ShiftModifier)) { if (event->modifiers() & Qt::ShiftModifier) {
selected = false; SetSelected(false);
emit select(selected, false);
} }
} else { } else {
selected = true; SetSelected(true, !(event->modifiers() & Qt::ShiftModifier));
emit select(selected, !(event->modifiers() & Qt::ShiftModifier));
} }
} }
+16 -6
View File
@@ -34,12 +34,20 @@ class CollapsibleWidgetHeader : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
CollapsibleWidgetHeader(QWidget* parent = nullptr); CollapsibleWidgetHeader(QWidget* parent = nullptr);
bool selected;
bool IsSelected();
void SetSelected(bool s, bool deselect_others = false);
void SetSelectable(bool s);
protected: protected:
void mousePressEvent(QMouseEvent* event); virtual bool event(QEvent *event) override;
void paintEvent(QPaintEvent *event); virtual void mousePressEvent(QMouseEvent* event) override;
virtual void paintEvent(QPaintEvent *event) override;
signals: signals:
void select(bool, bool); void select();
private:
bool selected_;
bool selectable_;
}; };
class CollapsibleWidget : public QWidget class CollapsibleWidget : public QWidget
@@ -53,13 +61,15 @@ public:
bool IsFocused(); bool IsFocused();
bool IsExpanded(); bool IsExpanded();
void SetExpanded(bool s); void SetExpanded(bool s);
bool IsSelected(); bool IsSelected();
void Deselect();
void SetSelectable(bool s);
protected: protected:
QCheckBox* enabled_check; QCheckBox* enabled_check;
CollapsibleWidgetHeader* title_bar; CollapsibleWidgetHeader* title_bar;
QWidget* contents; QWidget* contents;
private: private:
bool selected;
QLabel* header; QLabel* header;
QVBoxLayout* layout; QVBoxLayout* layout;
QPushButton* collapse_button; QPushButton* collapse_button;
@@ -75,7 +85,7 @@ private slots:
void on_visible_change(); void on_visible_change();
public slots: public slots:
void header_click(bool s, bool deselect); void Selected();
}; };
#endif // COLLAPSIBLEWIDGET_H #endif // COLLAPSIBLEWIDGET_H
+29 -1
View File
@@ -30,7 +30,8 @@
#include "panels/panels.h" #include "panels/panels.h"
EffectUI::EffectUI(Effect* e) : EffectUI::EffectUI(Effect* e) :
effect_(e) effect_(e),
node_parent_(nullptr)
{ {
Q_ASSERT(e != nullptr); Q_ASSERT(e != nullptr);
@@ -89,6 +90,8 @@ EffectUI::EffectUI(Effect* e) :
ui->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); ui->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
SetContents(ui); SetContents(ui);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
SetExpanded(e->IsExpanded()); SetExpanded(e->IsExpanded());
connect(this, SIGNAL(visibleChanged(bool)), e, SLOT(SetExpanded(bool))); connect(this, SIGNAL(visibleChanged(bool)), e, SLOT(SetExpanded(bool)));
@@ -276,6 +279,31 @@ bool EffectUI::IsAttachedToClip(Clip *c)
return false; 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) QWidget *EffectUI::Widget(int row, int field)
{ {
return widgets_.at(row).at(field); return widgets_.at(row).at(field);
+12
View File
@@ -23,6 +23,7 @@
#include "collapsiblewidget.h" #include "collapsiblewidget.h"
#include "effects/effect.h" #include "effects/effect.h"
#include "ui/nodeui.h"
/** /**
* @brief The EffectUI class * @brief The EffectUI class
@@ -131,6 +132,12 @@ public:
*/ */
bool IsAttachedToClip(Clip* c); bool IsAttachedToClip(Clip* c);
void SetNodeParent(NodeUI* parent);
protected:
virtual void resizeEvent(QResizeEvent* event) override;
virtual bool event(QEvent* event) override;
signals: signals:
/** /**
* @brief Cut signal * @brief Cut signal
@@ -195,6 +202,11 @@ private:
*/ */
QVector<KeyframeNavigator*> keyframe_navigators_; QVector<KeyframeNavigator*> keyframe_navigators_;
/**
* @brief Internal reference to node parent
*/
NodeUI* node_parent_;
/** /**
* @brief Attach a KeyframeNavigator object to an EffectRow. * @brief Attach a KeyframeNavigator object to an EffectRow.
* *
+28 -12
View File
@@ -10,33 +10,55 @@
#include <QStyleOptionGraphicsItem> #include <QStyleOptionGraphicsItem>
#include <QPainter> #include <QPainter>
const int kRoundedRectRadius = 5;
NodeUI::NodeUI() : NodeUI::NodeUI() :
central_widget_(this) central_widget_(nullptr)
{ {
setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemIsMovable, true);
setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemIsSelectable, true);
} }
NodeUI::~NodeUI()
{
if (scene() != nullptr) {
scene()->removeItem(proxy_);
scene()->removeItem(this);
}
}
void NodeUI::AddToScene(QGraphicsScene *scene) void NodeUI::AddToScene(QGraphicsScene *scene)
{ {
scene->addItem(this); scene->addItem(this);
QGraphicsProxyWidget* proxy = scene->addWidget(&central_widget_); if (central_widget_ != nullptr) {
proxy->setPos(pos()); proxy_ = scene->addWidget(central_widget_);
proxy->setParentItem(this); proxy_->setPos(pos() + QPoint(kRoundedRectRadius, kRoundedRectRadius));
proxy_->setParentItem(this);
}
} }
void NodeUI::Resize(const QSize &s) void NodeUI::Resize(const QSize &s)
{ {
QRectF rectangle = rect(); QRectF rectangle = rect();
rectangle.setSize(s); rectangle.setSize(s + 2 * QSize(kRoundedRectRadius, kRoundedRectRadius));
path_ = QPainterPath();
path_.addRoundedRect(rectangle, kRoundedRectRadius, kRoundedRectRadius);
setRect(rectangle); setRect(rectangle);
} }
void NodeUI::SetWidget(QWidget *widget)
{
central_widget_ = widget;
}
void NodeUI::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void NodeUI::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
Q_UNUSED(widget)
QPalette palette = qApp->palette(); QPalette palette = qApp->palette();
if (option->state & QStyle::State_Selected) { 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->setPen(palette.base().color());
} }
painter->setBrush(palette.window()); painter->setBrush(palette.window());
painter->drawPath(path_);
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);
} }
+6 -4
View File
@@ -4,18 +4,20 @@
#include <QWidget> #include <QWidget>
#include <QGraphicsItem> #include <QGraphicsItem>
#include "ui/nodewidget.h"
class NodeUI : public QGraphicsRectItem { class NodeUI : public QGraphicsRectItem {
public: public:
NodeUI(); NodeUI();
virtual ~NodeUI() override;
void AddToScene(QGraphicsScene* scene); void AddToScene(QGraphicsScene* scene);
void Resize(const QSize& s); void Resize(const QSize& s);
void SetWidget(QWidget* widget);
protected: protected:
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override; virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
private: private:
NodeWidget central_widget_; QWidget* central_widget_;
QGraphicsProxyWidget* proxy_;
QPainterPath path_;
}; };
#endif // NODEUI_H #endif // NODEUI_H
+2 -2
View File
@@ -10,8 +10,8 @@ NodeView::NodeView(QGraphicsScene *scene, QWidget *parent) :
setMouseTracking(true); setMouseTracking(true);
setWindowTitle(tr("Node Editor")); setWindowTitle(tr("Node Editor"));
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
} }
void NodeView::mousePressEvent(QMouseEvent *event) void NodeView::mousePressEvent(QMouseEvent *event)
-46
View File
@@ -1,46 +0,0 @@
#include "nodewidget.h"
#include <QVBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QResizeEvent>
#include <QGraphicsScene>
#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);
}
-20
View File
@@ -1,20 +0,0 @@
#ifndef NODEWIDGET_H
#define NODEWIDGET_H
#include <QWidget>
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