improved effects signalling

This commit is contained in:
itsmattkc
2018-08-15 08:52:34 +10:00
parent aa1096d86a
commit e19eb0f54c
22 changed files with 176 additions and 93 deletions
-301
View File
@@ -1,301 +0,0 @@
#include "effect.h"
#include "panels/panels.h"
#include "panels/viewer.h"
#include "ui/viewerwidget.h"
#include "ui/collapsiblewidget.h"
#include "effects/effects.h"
#include "panels/project.h"
#include "project/undo.h"
#include "ui/labelslider.h"
#include "ui/colorbutton.h"
#include "ui/comboboxex.h"
#include "ui/fontcombobox.h"
#include <QCheckBox>
#include <QGridLayout>
#include <QTextEdit>
Effect::Effect(Clip* c, int t, int i) : parent_clip(c), type(t), id(i) {
container = new CollapsibleWidget();
if (type == EFFECT_TYPE_VIDEO) {
container->setText(video_effect_names[i]);
} else if (type == EFFECT_TYPE_AUDIO) {
container->setText(audio_effect_names[i]);
}
connect(container->enabled_check, SIGNAL(clicked(bool)), this, SLOT(checkbox_command()));
connect(container->enabled_check, SIGNAL(clicked(bool)), this, SLOT(field_changed()));
ui = new QWidget();
ui_layout = new QGridLayout();
ui->setLayout(ui_layout);
container->setContents(ui);
}
Effect::~Effect() {
for (int i=0;i<rows.size();i++) {
delete rows.at(i);
}
}
EffectRow* Effect::add_row(const QString& name) {
EffectRow* row = new EffectRow(this, ui_layout, name, rows.size());
rows.append(row);
return row;
}
EffectRow* Effect::row(int i) {
return rows.at(i);
}
void Effect::refresh() {}
void Effect::field_changed() {
panel_viewer->viewer_widget->update();
}
void Effect::checkbox_command() {
CheckboxCommand* c = new CheckboxCommand(static_cast<QCheckBox*>(sender()));
undo_stack.push(c);
}
bool Effect::is_enabled() {
return container->enabled_check->isChecked();
}
void Effect::load(QXmlStreamReader* stream) {
for (int i=0;i<rows.size();i++) {
EffectRow* row = rows.at(i);
while (!stream->atEnd()) {
stream->readNext();
if (stream->name() == "row" && stream->isStartElement()) {
for (int j=0;j<row->fieldCount();j++) {
EffectField* field = row->field(j);
while (!stream->atEnd()) {
stream->readNext();
if (stream->name() == "field" && stream->isStartElement()) {
stream->readNext();
switch (field->type) {
case EFFECT_FIELD_DOUBLE:
field->set_double_value(stream->text().toDouble());
break;
case EFFECT_FIELD_COLOR:
field->set_color_value(QColor(stream->text().toString()));
break;
case EFFECT_FIELD_STRING:
field->set_string_value(stream->text().toString());
break;
case EFFECT_FIELD_BOOL:
field->set_bool_value(stream->text() == "1");
break;
case EFFECT_FIELD_COMBO:
field->set_combo_string(stream->text().toString());
break;
case EFFECT_FIELD_FONT:
field->set_combo_string(stream->text().toString());
break;
}
break;
}
}
}
break;
}
}
}
}
void Effect::save(QXmlStreamWriter* stream) {
for (int i=0;i<rows.size();i++) {
EffectRow* row = rows.at(i);
stream->writeStartElement("row");
for (int j=0;j<row->fieldCount();j++) {
EffectField* field = row->field(j);
switch (field->type) {
case EFFECT_FIELD_DOUBLE:
stream->writeTextElement("field", QString::number(field->get_double_value()));
break;
case EFFECT_FIELD_COLOR:
stream->writeTextElement("field", field->get_color_value().name());
break;
case EFFECT_FIELD_STRING:
stream->writeTextElement("field", field->get_string_value());
break;
case EFFECT_FIELD_BOOL:
stream->writeTextElement("field", QString::number(field->get_bool_value()));
break;
case EFFECT_FIELD_COMBO:
stream->writeTextElement("field", field->get_combo_string());
break;
case EFFECT_FIELD_FONT:
stream->writeTextElement("field", field->get_font_name());
break;
}
}
stream->writeEndElement(); // row
}
}
Effect* Effect::copy(Clip*) {return NULL;}
void Effect::process_gl(int*, int*) {}
void Effect::post_gl() {}
void Effect::process_audio(uint8_t*, int) {}
/* Effect Row Definitions */
EffectRow::EffectRow(Effect *parent, QGridLayout *uilayout, const QString &n, int row) : parent_effect(parent), ui(uilayout), name(n), ui_row(row) {
ui->addWidget(new QLabel(name), row, 0);
}
EffectField* EffectRow::add_field(int type) {
EffectField* field = new EffectField(parent_effect, type);
fields.append(field);
QWidget* element = field->get_ui_element();
ui->addWidget(element, ui_row, fields.size());
return field;
}
EffectRow::~EffectRow() {
for (int i=0;i<fields.size();i++) {
delete fields.at(i);
}
}
EffectField* EffectRow::field(int i) {
return fields.at(i);
}
int EffectRow::fieldCount() {
return fields.size();
}
/* Effect Field Definitions */
EffectField::EffectField(Effect *parent, int t) : type(t) {
switch (t) {
case EFFECT_FIELD_DOUBLE:
{
LabelSlider* ls = new LabelSlider();
ui_element = ls;
QObject::connect(ls, SIGNAL(valueChanged()), parent, SLOT(field_changed()));
}
break;
case EFFECT_FIELD_COLOR:
{
ui_element = new ColorButton();
}
break;
case EFFECT_FIELD_STRING:
{
QTextEdit* edit = new QTextEdit();
edit->setUndoRedoEnabled(true);
ui_element = edit;
}
break;
case EFFECT_FIELD_BOOL:
{
QCheckBox* cb = new QCheckBox();
ui_element = cb;
QObject::connect(cb, SIGNAL(toggled(bool)), parent, SLOT(field_changed()));
QObject::connect(cb, SIGNAL(clicked(bool)), parent, SLOT(checkbox_command()));
}
break;
case EFFECT_FIELD_COMBO:
{
ui_element = new ComboBoxEx();
}
break;
case EFFECT_FIELD_FONT:
{
ui_element = new FontCombobox();
}
break;
}
}
QWidget* EffectField::get_ui_element() {
return ui_element;
}
void EffectField::set_enabled(bool e) {
switch (type) {
case EFFECT_FIELD_DOUBLE: static_cast<LabelSlider*>(ui_element)->setEnabled(e); break;
case EFFECT_FIELD_COLOR: static_cast<ColorButton*>(ui_element)->setEnabled(e); break;
case EFFECT_FIELD_STRING: static_cast<QTextEdit*>(ui_element)->setEnabled(e); break;
case EFFECT_FIELD_BOOL: static_cast<QCheckBox*>(ui_element)->setEnabled(e); break;
case EFFECT_FIELD_COMBO: static_cast<ComboBoxEx*>(ui_element)->setEnabled(e); break;
case EFFECT_FIELD_FONT: static_cast<FontCombobox*>(ui_element)->setEnabled(e); break;
}
}
double EffectField::get_double_value() {
return static_cast<LabelSlider*>(ui_element)->value();
}
void EffectField::set_double_value(double v) {
static_cast<LabelSlider*>(ui_element)->set_value(v);
}
void EffectField::set_double_default_value(double v) {
static_cast<LabelSlider*>(ui_element)->set_default_value(v);
}
void EffectField::set_double_minimum_value(double v) {
static_cast<LabelSlider*>(ui_element)->set_minimum_value(v);
}
void EffectField::set_double_maximum_value(double v) {
static_cast<LabelSlider*>(ui_element)->set_maximum_value(v);
}
void EffectField::add_combo_item(const QString& name, const QVariant& data) {
static_cast<QComboBox*>(ui_element)->addItem(name, data);
}
int EffectField::get_combo_index() {
return static_cast<QComboBox*>(ui_element)->currentIndex();
}
const QVariant EffectField::get_combo_data() {
return static_cast<QComboBox*>(ui_element)->currentData();
}
const QString EffectField::get_combo_string() {
return static_cast<QComboBox*>(ui_element)->currentText();
}
void EffectField::set_combo_index(int index) {
static_cast<QComboBox*>(ui_element)->setCurrentIndex(index);
}
void EffectField::set_combo_string(const QString& s) {
static_cast<QComboBox*>(ui_element)->setCurrentText(s);
}
bool EffectField::get_bool_value() {
return static_cast<QCheckBox*>(ui_element)->isChecked();
}
void EffectField::set_bool_value(bool b) {
return static_cast<QCheckBox*>(ui_element)->setChecked(b);
}
const QString EffectField::get_string_value() {
return static_cast<QTextEdit*>(ui_element)->toPlainText();
}
void EffectField::set_string_value(const QString& s) {
static_cast<QTextEdit*>(ui_element)->setText(s);
}
const QString EffectField::get_font_name() {
return static_cast<FontCombobox*>(ui_element)->currentText();
}
QColor EffectField::get_color_value() {
return static_cast<ColorButton*>(ui_element)->get_color();
}
void EffectField::set_color_value(QColor color) {
static_cast<ColorButton*>(ui_element)->set_color(color);
}
-116
View File
@@ -1,116 +0,0 @@
#ifndef EFFECT_H
#define EFFECT_H
#include <QObject>
#include <QString>
#include <QVector>
class QWidget;
class CollapsibleWidget;
class QGridLayout;
struct Clip;
class QXmlStreamReader;
class QXmlStreamWriter;
class Effect;
#define EFFECT_TYPE_INVALID 0
#define EFFECT_TYPE_VIDEO 1
#define EFFECT_TYPE_AUDIO 2
#define EFFECT_FIELD_DOUBLE 0
#define EFFECT_FIELD_COLOR 1
#define EFFECT_FIELD_STRING 2
#define EFFECT_FIELD_BOOL 3
#define EFFECT_FIELD_COMBO 4
#define EFFECT_FIELD_FONT 5
class EffectField : QObject {
Q_OBJECT
public:
EffectField(Effect* parent, int t);
int type;
double get_double_value();
void set_double_value(double v);
void set_double_default_value(double v);
void set_double_minimum_value(double v);
void set_double_maximum_value(double v);
const QString get_string_value();
void set_string_value(const QString &s);
void add_combo_item(const QString& name, const QVariant &data);
int get_combo_index();
const QVariant get_combo_data();
const QString get_combo_string();
void set_combo_index(int index);
void set_combo_string(const QString& s);
bool get_bool_value();
void set_bool_value(bool b);
const QString get_font_name();
QColor get_color_value();
void set_color_value(QColor color);
QWidget* get_ui_element();
void set_enabled(bool e);
private:
QWidget* ui_element;
};
class EffectRow {
public:
EffectRow(Effect* parent, QGridLayout* uilayout, const QString& n, int row);
~EffectRow();
EffectField* add_field(int type);
EffectField* field(int i);
int fieldCount();
void set_keyframe(int field, long time);
void move_keyframe(int field, long from, long to);
void delete_keyframe(int field, long time);
private:
Effect* parent_effect;
QGridLayout* ui;
QString name;
int ui_row;
QVector<EffectField*> fields;
};
class Effect : public QObject {
Q_OBJECT
public:
Effect(Clip* c, int t, int i);
~Effect();
Clip* parent_clip;
int type;
int id;
QString name;
CollapsibleWidget* container;
EffectRow* add_row(const QString &name);
EffectRow* row(int i);
bool is_enabled();
virtual void refresh();
virtual Effect* copy(Clip* c);
void load(QXmlStreamReader* stream);
void save(QXmlStreamWriter* stream);
virtual void process_gl(int* anchor_x, int* anchor_y);
virtual void post_gl();
virtual void process_audio(quint8* samples, int nb_bytes);
public slots:
void field_changed();
void checkbox_command();
private:
QVector<EffectRow*> rows;
QGridLayout* ui_layout;
QWidget* ui;
};
#endif // EFFECT_H
+2 -2
View File
@@ -789,14 +789,14 @@ void MediaRename::redo() {
ValueChangeCommand::ValueChangeCommand() : done(true), old_project_changed(project_changed) {}
void ValueChangeCommand::undo() {
source->set_value(old_val);
source->set_value(old_val, false);
done = false;
project_changed = old_project_changed;
}
void ValueChangeCommand::redo() {
if (!done) {
source->set_value(new_val);
source->set_value(new_val, false);
}
project_changed = true;
}