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/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 +=
+1 -1
View File
@@ -151,7 +151,7 @@ void EffectsPanel::deselect_all_effects(QWidget* sender) {
for (int i=0;i<open_effects_.size();i++) {
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()
{
nodes_.resize(open_effects_.size());
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)
{
NodeUI* node;
foreach (node, nodes_) {
node->moveBy(x, y);
}
+1
View File
@@ -16,6 +16,7 @@ public:
protected:
virtual void LoadEvent() override;
virtual void ClearEvent() override;
private:
QGraphicsScene scene_;
+73 -25
View File
@@ -29,13 +29,16 @@
#include <QMouseEvent>
#include <QWidget>
#include <QPainter>
#include <QStyle>
#include <QApplication>
#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));
}
}
+16 -6
View File
@@ -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
+29 -1
View File
@@ -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);
+12
View File
@@ -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<KeyframeNavigator*> keyframe_navigators_;
/**
* @brief Internal reference to node parent
*/
NodeUI* node_parent_;
/**
* @brief Attach a KeyframeNavigator object to an EffectRow.
*
+28 -12
View File
@@ -10,33 +10,55 @@
#include <QStyleOptionGraphicsItem>
#include <QPainter>
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(&central_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_);
}
+6 -4
View File
@@ -4,18 +4,20 @@
#include <QWidget>
#include <QGraphicsItem>
#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
+2 -2
View File
@@ -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)
-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