effect UIs ported to nodes
This commit is contained in:
@@ -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 +=
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ public:
|
||||
|
||||
protected:
|
||||
virtual void LoadEvent() override;
|
||||
virtual void ClearEvent() override;
|
||||
|
||||
private:
|
||||
QGraphicsScene scene_;
|
||||
|
||||
+73
-25
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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(¢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_);
|
||||
}
|
||||
|
||||
+6
-4
@@ -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
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user