From 384bb4eb5d8664f3d433df069e4d1e2c930fa162 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 27 Jun 2018 20:19:15 -0700 Subject: [PATCH] added #69 (nice) --- mainwindow.cpp | 4 ++- olive.pro.user | 2 +- panels/effectcontrols.cpp | 64 +++++++++++++++++++++++++++++++++++++-- panels/effectcontrols.h | 4 +++ panels/timeline.cpp | 21 ++++++------- ui/collapsiblewidget.cpp | 61 +++++++++++++++++++++++++++++++------ ui/collapsiblewidget.h | 21 ++++++++++++- ui/labelslider.cpp | 21 ++++++++----- ui/viewerwidget.cpp | 5 +++ 9 files changed, 169 insertions(+), 34 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 36125a83a..6a300cdd7 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -141,7 +141,9 @@ void MainWindow::on_actionDelete_triggered() { if (panel_timeline->focused()) { panel_timeline->delete_selection(false); - } + } else if (panel_effect_controls->is_focused()) { + panel_effect_controls->delete_clips(); + } } void MainWindow::on_actionSelect_All_triggered() diff --git a/olive.pro.user b/olive.pro.user index fa03ad249..672010027 100644 --- a/olive.pro.user +++ b/olive.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index c46bb2001..c211d2fd9 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -67,16 +67,39 @@ void EffectControls::clear_effects() { QVBoxLayout* video_layout = static_cast(ui->video_effect_area->layout()); QVBoxLayout* audio_layout = static_cast(ui->audio_effect_area->layout()); QLayoutItem* item; - while ((item = video_layout->takeAt(0))) {item->widget()->setParent(NULL);} - while ((item = audio_layout->takeAt(0))) {item->widget()->setParent(NULL);} + while ((item = video_layout->takeAt(0))) { + item->widget()->setParent(NULL); + disconnect(static_cast(item->widget()), SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); + } + while ((item = audio_layout->takeAt(0))) { + item->widget()->setParent(NULL); + disconnect(static_cast(item->widget()), SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); + } ui->vcontainer->setVisible(false); ui->acontainer->setVisible(false); } +void EffectControls::deselect_all_effects(QWidget* sender) { + QVector delete_effects; + for (int i=0;ieffects.size();j++) { + if (c->effects.at(j)->container != sender) { + c->effects.at(j)->container->header_click(false, false); + } + } + } +} + void EffectControls::load_effects() { // load in new clips for (int i=0;itrack < 0) { + ui->vcontainer->setVisible(true); + } else { + ui->acontainer->setVisible(true); + } for (int j=0;jeffects.size();j++) { CollapsibleWidget* container = c->effects.at(j)->container; if (c->track < 0) { @@ -86,12 +109,34 @@ void EffectControls::load_effects() { static_cast(ui->audio_effect_area->layout())->addWidget(container); ui->acontainer->setVisible(true); } + connect(container, SIGNAL(deselect_others(QWidget*)), this, SLOT(deselect_all_effects(QWidget*))); + } + } +} + +void EffectControls::delete_clips() { + // load in new clips + QVector delete_effects; + for (int i=0;ieffects.size();j++) { + Effect* effect = c->effects.at(j); + if (effect->container->selected) { + c->effects.removeAt(j); + delete_effects.append(effect); + } + } + } + if (delete_effects.size() > 0) { + reload_clips(); + for (int i=0;ihasFocus()) return true; + for (int i=0;ieffects.size();j++) { + if (c->effects.at(j)->container->is_focused()) { + return true; + } + } + } + return false; +} diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 80bb1b5e4..b3dee68dd 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -20,6 +20,8 @@ public: // void set_clip(Clip* c); void set_clips(QVector& clips); void clear_effects(); + void delete_clips(); + bool is_focused(); private slots: void menu_select(QAction* q); @@ -28,6 +30,8 @@ private slots: void on_add_audio_effect_button_clicked(); + void deselect_all_effects(QWidget*); + private: Ui::EffectControls *ui; QVector selected_clips; diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 0886835b0..91652fc04 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -66,19 +66,18 @@ void Timeline::next_frame() { } void Timeline::previous_cut() { - bool seek_enabled = false; - long p_cut = 0; - for (int i=0;iclip_count();i++) { - Clip* c = sequence->get_clip(i); - if (c->timeline_out > p_cut && c->timeline_out < playhead) { - p_cut = c->timeline_out; - seek_enabled = true; - } else if (c->timeline_in > p_cut && c->timeline_in < playhead) { - p_cut = c->timeline_in; - seek_enabled = true; + if (playhead > 0) { + long p_cut = 0; + for (int i=0;iclip_count();i++) { + Clip* c = sequence->get_clip(i); + if (c->timeline_out > p_cut && c->timeline_out < playhead) { + p_cut = c->timeline_out; + } else if (c->timeline_in > p_cut && c->timeline_in < playhead) { + p_cut = c->timeline_in; + } } + seek(p_cut); } - if (seek_enabled) seek(p_cut); } void Timeline::next_cut() { diff --git a/ui/collapsiblewidget.cpp b/ui/collapsiblewidget.cpp index a4b57de5a..51546d4d1 100644 --- a/ui/collapsiblewidget.cpp +++ b/ui/collapsiblewidget.cpp @@ -7,25 +7,34 @@ #include #include #include +#include +#include + +CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { + selected = false; -CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) -{ layout = new QVBoxLayout(this); layout->setMargin(0); - title_bar = new QHBoxLayout(); - title_bar->setMargin(0); + title_bar = new CollapsibleWidgetHeader(); + title_bar->setFocusPolicy(Qt::ClickFocus); + title_bar->setAutoFillBackground(true); + QHBoxLayout* title_bar_layout = new QHBoxLayout(); + title_bar->setLayout(title_bar_layout); + title_bar_layout->setMargin(0); enabled_check = new QCheckBox(); enabled_check->setChecked(true); header = new QLabel(); collapse_button = new QPushButton("-"); collapse_button->setMaximumWidth(25); setText(""); - title_bar->addWidget(collapse_button); - title_bar->addWidget(enabled_check); - title_bar->addWidget(header); - title_bar->addStretch(); - layout->addLayout(title_bar); + title_bar_layout->addWidget(collapse_button); + title_bar_layout->addWidget(enabled_check); + title_bar_layout->addWidget(header); + title_bar_layout->addStretch(); + layout->addWidget(title_bar); + + connect(title_bar, SIGNAL(select(bool, bool)), this, SLOT(header_click(bool, bool))); line = new QFrame(); line->setFrameShape(QFrame::HLine); @@ -35,6 +44,24 @@ CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) contents = NULL; } +void CollapsibleWidget::header_click(bool s, bool deselect) { + selected = s; + title_bar->selected = s; + if (s) { + QPalette p = 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::is_focused() { + if (hasFocus()) return true; + return title_bar->hasFocus(); +} + void CollapsibleWidget::setContents(QWidget* c) { bool existing = (contents != NULL); contents = c; @@ -57,3 +84,19 @@ void CollapsibleWidget::on_visible_change() { contents->setVisible(!contents->isVisible()); collapse_button->setText(contents->isVisible() ? "-" : "+"); } + +CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) : QWidget(parent) { + selected = false; +} + +void CollapsibleWidgetHeader::mousePressEvent(QMouseEvent* event) { + if (selected) { + if ((event->modifiers() & Qt::ShiftModifier)) { + selected = false; + emit select(selected, false); + } + } else { + selected = true; + emit select(selected, !(event->modifiers() & Qt::ShiftModifier)); + } +} diff --git a/ui/collapsiblewidget.h b/ui/collapsiblewidget.h index 58aa4a02d..a201ff789 100644 --- a/ui/collapsiblewidget.h +++ b/ui/collapsiblewidget.h @@ -9,6 +9,17 @@ class QVBoxLayout; class QPushButton; class QFrame; +class CollapsibleWidgetHeader : public QWidget { + Q_OBJECT +public: + CollapsibleWidgetHeader(QWidget* parent = 0); + bool selected = false; +protected: + void mousePressEvent(QMouseEvent* event); +signals: + void select(bool, bool); +}; + class CollapsibleWidget : public QWidget { Q_OBJECT @@ -16,19 +27,27 @@ public: CollapsibleWidget(QWidget* parent = 0); void setContents(QWidget* c); void setText(const QString &); + bool is_focused(); QCheckBox* enabled_check; + bool selected; private: QLabel* header; - QHBoxLayout* title_bar; + CollapsibleWidgetHeader* title_bar; QVBoxLayout* layout; QPushButton* collapse_button; QWidget* contents; QFrame* line; +signals: + void deselect_others(QWidget*); + private slots: void on_enabled_change(bool b); void on_visible_change(); + +public slots: + void header_click(bool s, bool deselect); }; #endif // COLLAPSIBLEWIDGET_H diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index 61bd3ef7a..a2ee1c53a 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -1,6 +1,7 @@ #include "labelslider.h" #include +#include #include LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) @@ -15,15 +16,17 @@ LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) } void LabelSlider::set_value(float v) { - if (min_enabled && v < min_value) { - internal_value = min_value; - } else if (max_enabled && v > max_value) { - internal_value = max_value; - } else { - internal_value = v; + if (v != internal_value) { + if (min_enabled && v < min_value) { + internal_value = min_value; + } else if (max_enabled && v > max_value) { + internal_value = max_value; + } else { + internal_value = v; + } + setText(QString::number(v)); + emit valueChanged(); } - setText(QString::number(v)); - emit valueChanged(); } float LabelSlider::value() { @@ -70,6 +73,8 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent *ev) { drag_start = false; if (drag_proc) { drag_proc = false; + } else { + set_value(QInputDialog::getDouble(this, "Set Value", "New value:", internal_value)); } } } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 2a7b4c000..3d19c1077 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -10,6 +10,7 @@ #include "io/media.h" #include +#include extern "C" { #include @@ -138,6 +139,10 @@ void ViewerWidget::paintGL() } } + /*QPainter p(this); + p.drawText({0, 0, 200, 200}, "text!"); + p.end();*/ + cc_lock.unlock(); if (texture_failed) {