From 5b4d80edadf21ca218204da0335b0dd903d1f307 Mon Sep 17 00:00:00 2001 From: oc1024 Date: Wed, 23 Jan 2019 08:25:18 -0300 Subject: [PATCH 001/202] Added luma key effect --- effects/lumakey.frag | 21 +++++++++++++++++++++ effects/lumakey.xml | 10 ++++++++++ 2 files changed, 31 insertions(+) create mode 100644 effects/lumakey.frag create mode 100644 effects/lumakey.xml diff --git a/effects/lumakey.frag b/effects/lumakey.frag new file mode 100644 index 000000000..3e7b0d266 --- /dev/null +++ b/effects/lumakey.frag @@ -0,0 +1,21 @@ +/* Luma key simple program +Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team) +Feel free to modify and use at will */ + +uniform sampler2D tex; +varying vec2 vTexCoord; + +uniform float loc; +uniform float hic; + +void main(void) { + vec4 texture_color = texture2D(tex,vTexCoord); + + float luma = max(max(texture_color.r,texture_color.g), texture_color.b) + min(min(texture_color.r,texture_color.g), texture_color.b); + + luma /= 2.0; + + texture_color.a = (luma >= loc && luma <= hic) ? luma : 0.0; + + gl_FragColor = texture_color; +} \ No newline at end of file diff --git a/effects/lumakey.xml b/effects/lumakey.xml new file mode 100644 index 000000000..03b933877 --- /dev/null +++ b/effects/lumakey.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 728a3fee949b54cc5086936c598752631a9a4f02 Mon Sep 17 00:00:00 2001 From: oc1024 Date: Wed, 23 Jan 2019 11:53:25 -0300 Subject: [PATCH 002/202] upper limit is now full alpha --- effects/lumakey.frag | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/effects/lumakey.frag b/effects/lumakey.frag index 3e7b0d266..3ded5dac5 100644 --- a/effects/lumakey.frag +++ b/effects/lumakey.frag @@ -15,7 +15,13 @@ void main(void) { luma /= 2.0; - texture_color.a = (luma >= loc && luma <= hic) ? luma : 0.0; + if (luma > hic) { + texture_color.a = 1.0; + } else if (luma < loc) { + texture_color.a = 0.0; + } else { + texture_color.a = luma; + } gl_FragColor = texture_color; -} \ No newline at end of file +} From ac12a734869b0d72fd79d22896c0e69ac916e2d7 Mon Sep 17 00:00:00 2001 From: oc1024 Date: Wed, 23 Jan 2019 23:26:05 -0200 Subject: [PATCH 003/202] Color Selection filter --- effects/colorsel.frag | 89 +++++++++++++++++++++++++++++++++++++++++++ effects/colorsel.xml | 21 ++++++++++ 2 files changed, 110 insertions(+) create mode 100644 effects/colorsel.frag create mode 100644 effects/colorsel.xml diff --git a/effects/colorsel.frag b/effects/colorsel.frag new file mode 100644 index 000000000..801c96b73 --- /dev/null +++ b/effects/colorsel.frag @@ -0,0 +1,89 @@ +/* Filter by color characteristic simple program +Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team) +RGB to HSV based on MattKC's toonify source code +Feel free to modify and use at will */ +#version 150 + +uniform sampler2D tex; +varying vec2 vTexCoord; + +uniform float loc; +uniform float hic; +uniform int compo; + +float rgb2luma(vec3 c) { + return (max(max(c.r,c.g), c.b) + min(min(c.r,c.g), c.b))/2.0; +} + +vec3 rgb2hsv(vec3 c) +{ + float r = c.r; + float b = c.b; + float g = c.g; + float minv, maxv, delta; + vec3 res; + + minv = min(min(r, g), b); + maxv = max(max(r, g), b); + res.z = maxv; // v + + delta = maxv - minv; + + if( maxv != 0.0 ) + res.y = delta / maxv; // s + else { + // r = g = b = 0 // s = 0, v is undefined + res.y = 0.0; + res.x = -1.0; + return res; + } + + if( r == maxv ) + res.x = ( g - b ) / delta; // between yellow & magenta + else if( g == maxv ) + res.x = 2.0 + ( b - r ) / delta; // between cyan & yellow + else + res.x = 4.0 + ( r - g ) / delta; // between magenta & cyan + + res.x = res.x * 60.0; // degrees + if( res.x < 0.0 ) + res.x = res.x + 360.0; + + return res; +} + +bool isNotIncreasingSequence(float a, float b, float c) { + return (c < b || a > b); +} + +void main(void) { + vec4 tc = texture2D(tex,vTexCoord); + vec3 color = tc.rgb; + float toCheck = 0.0; + + switch(compo) { + case 0 : + toCheck = rgb2luma(color); + break; + case 4 : + toCheck = color.r; + break; + case 5 : + toCheck = color.g; + break; + case 6 : + toCheck = color.b; + break; + case 1 : + toCheck = rgb2hsv(color).z; + break; + case 2 : + toCheck = rgb2hsv(color).x/360.0; + break; + case 3 : + toCheck = rgb2hsv(color).y; + break; + } + tc.a = isNotIncreasingSequence(loc, toCheck, hic) ? 0.0 : tc.a; + gl_FragColor = tc; +} diff --git a/effects/colorsel.xml b/effects/colorsel.xml new file mode 100644 index 000000000..2a486afd2 --- /dev/null +++ b/effects/colorsel.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + From 535838dd11f3b593ccd9291d03dddb07a3bb0ef9 Mon Sep 17 00:00:00 2001 From: Pablo Gil Date: Thu, 24 Jan 2019 08:37:52 +0100 Subject: [PATCH 004/202] add a name or ID to Qwidgets in order to allow styling with stylesheet --- panels/project.cpp | 210 ++++++++++++++--------- panels/timeline.cpp | 402 +++++++++++++++++++++++--------------------- 2 files changed, 343 insertions(+), 269 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index faf05daf6..f2ae8343d 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -25,6 +25,7 @@ #include "ui/sourcetable.h" #include "ui/sourceiconview.h" #include "project/sourcescommon.h" +#include "project/projectfilter.h" #include "debug.h" #include @@ -37,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -72,52 +72,79 @@ Project::Project(QWidget *parent) : sources_common = new SourcesCommon(this); - sorter = new QSortFilterProxyModel(this); + sorter = new ProjectFilter(this); sorter->setSourceModel(&project_model); // optional toolbar toolbar_widget = new QWidget(); toolbar_widget->setVisible(config.show_project_toolbar); + toolbar_widget->setObjectName("project_toolbar"); QHBoxLayout* toolbar = new QHBoxLayout(); toolbar->setMargin(0); toolbar->setSpacing(0); toolbar_widget->setLayout(toolbar); - QPushButton* toolbar_new = new QPushButton("New"); - toolbar_new->setIcon(QIcon(":/icons/tri-down.png")); - toolbar_new->setIconSize(QSize(8, 8)); + QPushButton* toolbar_new = new QPushButton(toolbar_widget); + QIcon icon1; + icon1.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); + icon1.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_new->setIcon(icon1); toolbar_new->setToolTip("New"); connect(toolbar_new, SIGNAL(clicked(bool)), this, SLOT(make_new_menu())); toolbar->addWidget(toolbar_new); - QPushButton* toolbar_open = new QPushButton("Open"); + QPushButton* toolbar_open = new QPushButton(toolbar_widget); + QIcon icon2; + icon2.addFile(QStringLiteral(":/icons/open.png"), QSize(), QIcon::Normal, QIcon::On); + icon2.addFile(QStringLiteral(":/icons/open-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_open->setIcon(icon2); toolbar_open->setToolTip("Open Project"); connect(toolbar_open, SIGNAL(clicked(bool)), mainWindow, SLOT(open_project())); toolbar->addWidget(toolbar_open); - QPushButton* toolbar_save = new QPushButton("Save"); + QPushButton* toolbar_save = new QPushButton(toolbar_widget); + QIcon icon3; + icon3.addFile(QStringLiteral(":/icons/save.png"), QSize(), QIcon::Normal, QIcon::On); + icon3.addFile(QStringLiteral(":/icons/save-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_save->setIcon(icon3); toolbar_save->setToolTip("Save Project"); connect(toolbar_save, SIGNAL(clicked(bool)), mainWindow, SLOT(save_project())); toolbar->addWidget(toolbar_save); - QPushButton* toolbar_undo = new QPushButton("Undo"); + QPushButton* toolbar_undo = new QPushButton(toolbar_widget); + QIcon icon4; + icon4.addFile(QStringLiteral(":/icons/undo.png"), QSize(), QIcon::Normal, QIcon::On); + icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_undo->setIcon(icon4); toolbar_undo->setToolTip("Undo"); connect(toolbar_undo, SIGNAL(clicked(bool)), mainWindow, SLOT(undo())); toolbar->addWidget(toolbar_undo); - QPushButton* toolbar_redo = new QPushButton("Redo"); + QPushButton* toolbar_redo = new QPushButton(toolbar_widget); + QIcon icon5; + icon5.addFile(QStringLiteral(":/icons/redo.png"), QSize(), QIcon::Normal, QIcon::On); + icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_redo->setIcon(icon5); toolbar_redo->setToolTip("Redo"); connect(toolbar_redo, SIGNAL(clicked(bool)), mainWindow, SLOT(redo())); toolbar->addWidget(toolbar_redo); toolbar->addStretch(); - QPushButton* toolbar_tree_view = new QPushButton("Tree View"); - toolbar_tree_view->setToolTip("Tree View"); - connect(toolbar_tree_view, SIGNAL(clicked(bool)), this, SLOT(set_tree_view())); - toolbar->addWidget(toolbar_tree_view); + QPushButton* toolbar_tree_view = new QPushButton(toolbar_widget); + QIcon icon6; + icon6.addFile(QStringLiteral(":/icons/treeview.png"), QSize(), QIcon::Normal, QIcon::On); + icon6.addFile(QStringLiteral(":/icons/treeview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_tree_view->setIcon(icon6); + toolbar_tree_view->setToolTip("Tree View"); + connect(toolbar_tree_view, SIGNAL(clicked(bool)), this, SLOT(set_tree_view())); + toolbar->addWidget(toolbar_tree_view); - QPushButton* toolbar_icon_view = new QPushButton("Icon View"); + QPushButton* toolbar_icon_view = new QPushButton(toolbar_widget); + QIcon icon7; + icon7.addFile(QStringLiteral(":/icons/iconview.png"), QSize(), QIcon::Normal, QIcon::On); + icon7.addFile(QStringLiteral(":/icons/iconview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_icon_view->setIcon(icon7); toolbar_icon_view->setToolTip("Icon View"); connect(toolbar_icon_view, SIGNAL(clicked(bool)), this, SLOT(set_icon_view())); toolbar->addWidget(toolbar_icon_view); @@ -177,7 +204,7 @@ Project::Project(QWidget *parent) : connect(icon_view, SIGNAL(changed_root()), this, SLOT(set_up_dir_enabled())); //retranslateUi(Project); - setWindowTitle(QApplication::translate("Project", "Project", nullptr)); + setWindowTitle(tr("Project")); update_view_type(); } @@ -187,7 +214,7 @@ Project::~Project() { } QString Project::get_next_sequence_name(QString start) { - if (start.isEmpty()) start = "Sequence"; + if (start.isEmpty()) start = tr("Sequence"); int n = 1; bool found = true; @@ -236,7 +263,7 @@ Sequence* create_sequence_from_media(QVector& media_list) { const FootageStream& ms = m->video_tracks.at(j); s->width = ms.video_width; s->height = ms.video_height; - if (ms.video_frame_rate != 0) { + if (!qFuzzyCompare(ms.video_frame_rate, 0.0)) { s->frame_rate = ms.video_frame_rate * m->speed; if (ms.video_interlacing != VIDEO_PROGRESSIVE) s->frame_rate *= 2; @@ -247,13 +274,10 @@ Sequence* create_sequence_from_media(QVector& media_list) { } } } - if (!got_audio_values) { - for (int j=0;jaudio_tracks.size();j++) { - const FootageStream& ms = m->audio_tracks.at(j); - s->audio_frequency = ms.audio_frequency; - got_audio_values = true; - break; - } + if (!got_audio_values && m->audio_tracks.size() > 0) { + const FootageStream& ms = m->audio_tracks.at(0); + s->audio_frequency = ms.audio_frequency; + got_audio_values = true; } } } @@ -283,7 +307,6 @@ void Project::duplicate_selected() { bool duped = false; ComboAction* ca = new ComboAction(); for (int j=0;jget_type() == MEDIA_TYPE_SEQUENCE) { new_sequence(ca, i->to_sequence()->copy(), false, item_to_media(items.at(j).parent())); @@ -302,14 +325,18 @@ void Project::replace_selected_file() { if (selected_items.size() == 1) { Media* item = item_to_media(selected_items.at(0)); if (item->get_type() == MEDIA_TYPE_FOOTAGE) { - replace_media(item, 0); + replace_media(item, nullptr); } } } void Project::replace_media(Media* item, QString filename) { if (filename.isEmpty()) { - filename = QFileDialog::getOpenFileName(this, "Replace '" + item->get_name() + "'", "", "All Files (*)"); + filename = QFileDialog::getOpenFileName( + this, + tr("Replace '%1'").arg(item->get_name()), + "", + tr("All Files") + " (*)"); } if (!filename.isEmpty()) { ReplaceMediaCommand* rmc = new ReplaceMediaCommand(item, filename); @@ -318,14 +345,20 @@ void Project::replace_media(Media* item, QString filename) { } void Project::replace_clip_media() { - if (sequence == NULL) { - QMessageBox::critical(this, "No active sequence", "No sequence is active, please open the sequence you want to replace clips from.", QMessageBox::Ok); + if (sequence == nullptr) { + QMessageBox::critical(this, + tr("No active sequence"), + tr("No sequence is active, please open the sequence you want to replace clips from."), + QMessageBox::Ok); } else { QModelIndexList selected_items = get_current_selected(); if (selected_items.size() == 1) { Media* item = item_to_media(selected_items.at(0)); if (item->get_type() == MEDIA_TYPE_SEQUENCE && sequence == item->to_sequence()) { - QMessageBox::critical(this, "Active sequence selected", "You cannot insert a sequence into itself, so no clips of this media would be in this sequence.", QMessageBox::Ok); + QMessageBox::critical(this, + tr("Active sequence selected"), + tr("You cannot insert a sequence into itself, so no clips of this media would be in this sequence."), + QMessageBox::Ok); } else { ReplaceClipMediaDialog dialog(this, item); dialog.exec(); @@ -354,7 +387,11 @@ void Project::open_properties() { default: { // fall back to renaming - QString new_name = QInputDialog::getText(this, "Rename '" + item->get_name() + "'", "Enter new name:", QLineEdit::Normal, item->get_name()); + QString new_name = QInputDialog::getText(this, + tr("Rename '%1'").arg(item->get_name()), + tr("Enter new name:"), + QLineEdit::Normal, + item->get_name()); if (!new_name.isEmpty()) { MediaRename* mr = new MediaRename(item, new_name); undo_stack.push(mr); @@ -365,15 +402,19 @@ void Project::open_properties() { } Media* Project::new_sequence(ComboAction *ca, Sequence *s, bool open, Media* parent) { - if (parent == NULL) parent = project_model.get_root(); + if (parent == nullptr) parent = project_model.get_root(); Media* item = new Media(parent); item->set_sequence(s); - if (ca != NULL) { + if (ca != nullptr) { ca->append(new NewSequenceCommand(item, parent)); if (open) ca->append(new ChangeSequenceAction(s)); } else { - project_model.appendChild(NULL, item); + if (parent == project_model.get_root()) { + project_model.appendChild(parent, item); + } else { + parent->appendChild(item); + } if (open) set_sequence(s); } return item; @@ -394,8 +435,9 @@ bool Project::is_focused() { } Media* Project::new_folder(QString name) { - Media* item = new Media(0); + Media* item = new Media(nullptr); item->set_folder(); + item->set_name(name); return item; } @@ -462,15 +504,15 @@ void Project::delete_selected_media() { Sequence* s = sequence_items.at(j)->to_sequence(); for (int k=0;kclips.size();k++) { Clip* c = s->clips.at(k); - if (c != NULL && c->media == item) { + if (c != nullptr && c->media == item) { if (!confirm_delete) { // we found a reference, so we know we'll need to ask if the user wants to delete it QMessageBox confirm(this); - confirm.setWindowTitle("Delete media in use?"); - confirm.setText("The media '" + media->name + "' is currently used in '" + s->name + "'. Deleting it will remove all instances in the sequence. Are you sure you want to do this?"); + confirm.setWindowTitle(tr("Delete media in use?")); + confirm.setText(tr("The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this?").arg(media->name, s->name)); QAbstractButton* yes_button = confirm.addButton(QMessageBox::Yes); - QAbstractButton* skip_button = NULL; - if (items.size() > 1) skip_button = confirm.addButton("Skip", QMessageBox::NoRole); + QAbstractButton* skip_button = nullptr; + if (items.size() > 1) skip_button = confirm.addButton(tr("Skip"), QMessageBox::NoRole); QAbstractButton* abort_button = confirm.addButton(QMessageBox::Cancel); confirm.exec(); if (confirm.clickedButton() == yes_button) { @@ -480,7 +522,7 @@ void Project::delete_selected_media() { } else if (confirm.clickedButton() == skip_button) { // remove media item and any folders containing it from the remove list Media* parent = item; - while (parent != NULL) { + while (parent != nullptr) { parents.append(parent); // re-add item's siblings @@ -527,7 +569,7 @@ void Project::delete_selected_media() { // remove if (remove) { panel_effect_controls->clear_effects(true); - if (sequence != NULL) sequence->selections.clear(); + if (sequence != nullptr) sequence->selections.clear(); // remove media and parents for (int m=0;mto_sequence(); if (s == sequence) { - ca->append(new ChangeSequenceAction(NULL)); + ca->append(new ChangeSequenceAction(nullptr)); } if (s == panel_footage_viewer->seq) { - panel_footage_viewer->set_media(NULL); + panel_footage_viewer->set_media(nullptr); } } else if (items.at(i)->get_type() == MEDIA_TYPE_FOOTAGE) { - if (panel_footage_viewer->seq != NULL) { + if (panel_footage_viewer->seq != nullptr) { for (int j=0;jseq->clips.size();j++) { Clip* c = panel_footage_viewer->seq->clips.at(j); - if (c != NULL) { - if (c->media == items.at(i)->to_object()) { - panel_footage_viewer->set_media(NULL); - } + if (c != nullptr && c->media == items.at(i)) { + panel_footage_viewer->set_media(nullptr); break; } } @@ -601,8 +641,8 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla if (!recursive) last_imported_media.clear(); - bool create_undo_action = (!recursive && replace == NULL); - ComboAction* ca; + bool create_undo_action = (!recursive && replace == nullptr); + ComboAction* ca = nullptr; if (create_undo_action) ca = new ComboAction(); for (int i=0;iappend(new AddMediaCommand(folder, parent)); @@ -695,7 +735,11 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla } if (!found) { image_sequence_urls.append(new_filename); - if (QMessageBox::question(this, "Image sequence detected", "The file '" + file + "' appears to be part of an image sequence. Would you like to import it as such?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { + if (QMessageBox::question(this, + tr("Image sequence detected"), + tr("The file '%1' appears to be part of an image sequence. Would you like to import it as such?").arg(file), + QMessageBox::Yes | QMessageBox::No, + QMessageBox::Yes) == QMessageBox::Yes) { file = new_filename; image_sequence_importassequence.append(true); } else { @@ -709,7 +753,7 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla Media* item; Footage* m; - if (replace != NULL) { + if (replace != nullptr) { item = replace; m = replace->to_footage(); m->reset(); @@ -724,16 +768,14 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla item->set_footage(m); - // generate waveform/thumbnail in another thread - start_preview_generator(item, replace != NULL); - last_imported_media.append(item); - if (replace == NULL) { + if (replace == nullptr) { if (create_undo_action) { ca->append(new AddMediaCommand(item, parent)); } else { - project_model.appendChild(parent, item); + parent->appendChild(item); +// project_model.appendChild(parent, item); } } @@ -744,6 +786,11 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla if (create_undo_action) { if (imported) { undo_stack.push(ca); + + for (int i=0;iget_type() == MEDIA_TYPE_FOLDER) return m; } - return NULL; + return nullptr; } bool Project::reveal_media(Media *media, QModelIndex parent) { @@ -795,25 +842,28 @@ bool Project::reveal_media(Media *media, QModelIndex parent) { } void Project::import_dialog() { - QFileDialog fd(this, "Import media...", "", "All Files (*)"); + QFileDialog fd(this, tr("Import media..."), "", tr("All Files") + " (*)"); fd.setFileMode(QFileDialog::ExistingFiles); if (fd.exec()) { QStringList files = fd.selectedFiles(); - process_file_list(files, false, NULL, get_selected_folder()); + process_file_list(files, false, nullptr, get_selected_folder()); } } void Project::delete_clips_using_selected_media() { - if (sequence == NULL) { - QMessageBox::critical(this, "No active sequence", "No sequence is active, please open the sequence you want to delete clips from.", QMessageBox::Ok); + if (sequence == nullptr) { + QMessageBox::critical(this, + tr("No active sequence"), + tr("No sequence is active, please open the sequence you want to delete clips from."), + QMessageBox::Ok); } else { ComboAction* ca = new ComboAction(); bool deleted = false; QModelIndexList items = get_current_selected(); for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { for (int j=0;jmedia == m) { @@ -844,7 +894,7 @@ void Project::clear() { QVector sequences = list_all_project_sequences(); for (int i=0;ito_sequence(); - sequences.at(i)->set_sequence(NULL); + sequences.at(i)->set_sequence(nullptr); } // delete everything else @@ -853,8 +903,8 @@ void Project::clear() { void Project::new_project() { // clear existing project - set_sequence(NULL); - panel_footage_viewer->set_media(NULL); + set_sequence(nullptr); + panel_footage_viewer->set_media(nullptr); clear(); mainWindow->setWindowModified(false); } @@ -867,7 +917,6 @@ void Project::load_project(bool autorecovery) { } void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, const QModelIndex& parent) { - bool root = (!parent.parent().isValid()); for (int i=0;itemp_id; + int folder = m->parentItem()->temp_id; if (type == MEDIA_TYPE_FOOTAGE) { Footage* f = m->to_footage(); f->save_id = media_id; @@ -945,12 +994,13 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("open", "1"); } stream.writeAttribute("workarea", QString::number(s->using_workarea)); + stream.writeAttribute("workareaEnabled", QString::number(s->enable_workarea)); stream.writeAttribute("workareaIn", QString::number(s->workarea_in)); stream.writeAttribute("workareaOut", QString::number(s->workarea_out)); for (int j=0;jtransitions.size();j++) { Transition* t = s->transitions.at(j); - if (t != NULL) { + if (t != nullptr) { stream.writeStartElement("transition"); stream.writeAttribute("id", QString::number(j)); stream.writeAttribute("length", QString::number(t->get_true_length())); @@ -961,7 +1011,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, for (int j=0;jclips.size();j++) { Clip* c = s->clips.at(j); - if (c != NULL) { + if (c != nullptr) { stream.writeStartElement("clip"); // clip stream.writeAttribute("id", QString::number(j)); stream.writeAttribute("enabled", QString::number(c->enabled)); @@ -982,7 +1032,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("maintainpitch", QString::number(c->maintain_audio_pitch)); stream.writeAttribute("reverse", QString::number(c->reverse)); - if (c->media != NULL) { + if (c->media != nullptr) { stream.writeAttribute("type", QString::number(c->media->get_type())); switch (c->media->get_type()) { case MEDIA_TYPE_FOOTAGE: @@ -1037,7 +1087,7 @@ void Project::save_project(bool autorecovery) { QFile file(autorecovery ? autorecovery_filename : project_url); if (!file.open(QIODevice::WriteOnly/* | QIODevice::Text*/)) { - dout << "[ERROR] Could not open file"; + qCritical() << "Could not open file"; return; } @@ -1117,7 +1167,7 @@ void Project::save_recent_projects() { } f.close(); } else { - dout << "[WARNING] Could not save recent projects"; + qWarning() << "Could not save recent projects"; } } @@ -1179,7 +1229,7 @@ void Project::list_all_sequences_worker(QVector* list, Media* parent) { QVector Project::list_all_project_sequences() { QVector list; - list_all_sequences_worker(&list, NULL); + list_all_sequences_worker(&list, nullptr); return list; } @@ -1193,7 +1243,7 @@ QModelIndexList Project::get_current_selected() { #define THROBBER_LIMIT 20 #define THROBBER_SIZE 50 -MediaThrobber::MediaThrobber(Media *i) : pixmap(":/icons/throbber.png"), animation(0), item(i), animator(NULL) {} +MediaThrobber::MediaThrobber(Media *i) : pixmap(":/icons/throbber.png"), animation(0), item(i), animator(nullptr) {} void MediaThrobber::start() { // set up throbber @@ -1213,7 +1263,7 @@ void MediaThrobber::animation_update() { } void MediaThrobber::stop(int icon_type, bool replace) { - if (animator != NULL) { + if (animator != nullptr) { animator->stop(); delete animator; } @@ -1231,7 +1281,7 @@ void MediaThrobber::stop(int icon_type, bool replace) { Sequence* s = sequences.at(i)->to_sequence(); for (int j=0;jclips.size();j++) { Clip* c = s->clips.at(j); - if (c != NULL) { + if (c != nullptr) { c->refresh(); } } @@ -1241,6 +1291,6 @@ void MediaThrobber::stop(int icon_type, bool replace) { update_ui(replace); panel_project->tree_view->viewport()->update(); - item->throbber = NULL; + item->throbber = nullptr; deleteLater(); } diff --git a/panels/timeline.cpp b/panels/timeline.cpp index b450f7e61..023e8978e 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -21,6 +21,7 @@ #include "ui/timelineheader.h" #include "ui/resizablescrollbar.h" #include "ui/audiomonitor.h" +#include "ui/flowlayout.h" #include "mainwindow.h" #include "debug.h" @@ -39,10 +40,6 @@ #include #include -long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate) { - return qRound(((double)framenumber/source_frame_rate)*target_frame_rate); -} - Timeline::Timeline(QWidget *parent) : QDockWidget(parent), cursor_frame(0), @@ -71,14 +68,13 @@ Timeline::Timeline(QWidget *parent) : transition_tool_post_clip(-1), hand_moving(false), block_repaints(false), - last_frame(0), scroll(0) { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); setup_ui(); - default_track_height = (QGuiApplication::primaryScreen()->logicalDotsPerInch() / 96) * TRACK_DEFAULT_HEIGHT; + default_track_height = qRound((QGuiApplication::primaryScreen()->logicalDotsPerInch() / 96) * TRACK_DEFAULT_HEIGHT); headers->viewer = panel_sequence_viewer; @@ -112,7 +108,7 @@ void Timeline::previous_cut() { long p_cut = 0; for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { if (c->timeline_out > p_cut && c->timeline_out < sequence->playhead) { p_cut = c->timeline_out; } else if (c->timeline_in > p_cut && c->timeline_in < sequence->playhead) { @@ -129,7 +125,7 @@ void Timeline::next_cut() { long n_cut = LONG_MAX; for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { if (c->timeline_in < n_cut && c->timeline_in > sequence->playhead) { n_cut = c->timeline_in; seek_enabled = true; @@ -150,7 +146,7 @@ void Timeline::toggle_show_all() { showing_all = !showing_all; if (showing_all) { old_zoom = zoom; - set_zoom_value((double) (timeline_area->width() - 200) / (double) sequence->getEndFrame()); + set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); } else { set_zoom_value(old_zoom); } @@ -164,17 +160,15 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector bool can_import = true; Media* medium = media_list.at(i); - Footage* m = NULL; - Sequence* s = NULL; - void* media = NULL; - long sequence_length; + Footage* m = nullptr; + Sequence* s = nullptr; + long sequence_length = 0; long default_clip_in = 0; long default_clip_out = 0; switch (medium->get_type()) { case MEDIA_TYPE_FOOTAGE: m = medium->to_footage(); - media = m; can_import = m->ready; if (m->using_inout) { double source_fr = 30; @@ -186,8 +180,7 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector case MEDIA_TYPE_SEQUENCE: s = medium->to_sequence(); sequence_length = s->getEndFrame(); - if (seq != NULL) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, seq->frame_rate); - media = s; + if (seq != nullptr) sequence_length = refactor_frame_number(sequence_length, s->frame_rate, seq->frame_rate); can_import = (s != seq && sequence_length != 0); if (s->using_workarea) { default_clip_in = refactor_frame_number(s->workarea_in, s->frame_rate, seq->frame_rate); @@ -205,7 +198,7 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector g.old_clip_in = g.clip_in = default_clip_in; g.media = medium; g.in = entry_point; - g.transition = NULL; + g.transition = nullptr; switch (medium->get_type()) { case MEDIA_TYPE_FOOTAGE: @@ -240,7 +233,7 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector case MEDIA_TYPE_SEQUENCE: g.out = entry_point + sequence_length - default_clip_in; - if (s->using_workarea) { + if (s->using_workarea && s->enable_workarea) { g.out -= (sequence_length - default_clip_out); } @@ -354,13 +347,13 @@ void Timeline::add_transition() { for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL && is_clip_selected(c, true)) { - if (c->get_opening_transition() == NULL) { - ca->append(new AddTransitionCommand(c, NULL, NULL, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); + if (c != nullptr && is_clip_selected(c, true)) { + if (c->get_opening_transition() == nullptr) { + ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); adding = true; } - if (c->get_closing_transition() == NULL) { - ca->append(new AddTransitionCommand(c, NULL, NULL, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); + if (c->get_closing_transition() == nullptr) { + ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); adding = true; } } @@ -388,7 +381,7 @@ int Timeline::calculate_track_height(int track, int value) { } void Timeline::update_sequence() { - bool null_sequence = (sequence == NULL); + bool null_sequence = (sequence == nullptr); for (int i=0;isetEnabled(!null_sequence); @@ -400,10 +393,11 @@ void Timeline::update_sequence() { addButton->setEnabled(!null_sequence); headers->setEnabled(!null_sequence); + QString title = tr("Timeline: "); if (null_sequence) { - setWindowTitle("Timeline: "); + setWindowTitle(title + tr("")); } else { - setWindowTitle("Timeline: " + sequence->name); + setWindowTitle(title + sequence->name); update_ui(false); } } @@ -413,14 +407,14 @@ int Timeline::get_snap_range() { } bool Timeline::focused() { - return (sequence != NULL && (headers->hasFocus() || video_area->hasFocus() || audio_area->hasFocus())); + return (sequence != nullptr && (headers->hasFocus() || video_area->hasFocus() || audio_area->hasFocus())); } void Timeline::repaint_timeline() { if (!block_repaints) { bool draw = true; - if (sequence != NULL + if (sequence != nullptr && !horizontalScrollBar->isSliderDown() && !horizontalScrollBar->is_resizing() && panel_sequence_viewer->playing @@ -446,24 +440,19 @@ void Timeline::repaint_timeline() { video_area->update(); audio_area->update(); - if (sequence != NULL) { + if (sequence != nullptr) { set_sb_max(); - - if (last_frame != sequence->playhead) { - audio_monitor->update(); - last_frame = sequence->playhead; - } } } } } void Timeline::select_all() { - if (sequence != NULL) { + if (sequence != nullptr) { sequence->selections.clear(); for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { Selection s; s.in = c->timeline_in; s.out = c->timeline_out; @@ -479,12 +468,42 @@ void Timeline::scroll_to_frame(long frame) { scroll_to_frame_internal(horizontalScrollBar, frame, zoom, timeline_area->width()); } -void Timeline::resizeEvent(QResizeEvent *event) { - if (sequence != NULL) set_sb_max(); +void Timeline::select_from_playhead() { + sequence->selections.clear(); + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != nullptr + && c->timeline_in <= sequence->playhead + && c->timeline_out > sequence->playhead) { + Selection s; + s.in = c->timeline_in; + s.out = c->timeline_out; + s.track = c->track; + sequence->selections.append(s); + } + } +} + +void Timeline::resizeEvent(QResizeEvent *) { + // adjust maximum scrollbar + if (sequence != nullptr) set_sb_max(); + + + // resize tool button widget to its contents + QList tool_button_children = tool_button_widget->findChildren(); + int total_client_height = 0; + int horizontal_spacing = static_cast(tool_button_widget->layout())->horizontalSpacing(); + int vertical_spacing = static_cast(tool_button_widget->layout())->verticalSpacing(); + for (int i=0;iheight() + vertical_spacing; + } + int comp_height = tool_button_widget->height(); + int cols = qCeil(double(total_client_height)/double(comp_height)); + tool_button_widget->setFixedWidth((tool_button_children.at(0)->width())*cols + horizontal_spacing*(cols-1) + 1); } void Timeline::delete_in_out(bool ripple) { - if (sequence != NULL && sequence->using_workarea) { + if (sequence != nullptr && sequence->using_workarea) { QVector areas; int video_tracks = 0, audio_tracks = 0; sequence->getTrackLimits(&video_tracks, &audio_tracks); @@ -529,7 +548,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele bool can_ripple = true; for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL && c->timeline_in < ripple_point && c->timeline_out > ripple_point) { + if (c != nullptr && c->timeline_in < ripple_point && c->timeline_out > ripple_point) { // conflict detected, but this clip may be getting deleted so let's check bool deleted = false; for (int j=0;j& selections, bool ripple_dele if (!deleted) { for (int j=0;jclips.size();j++) { Clip* cc = sequence->clips.at(j); - if (cc != NULL + if (cc != nullptr && cc->track == c->track && cc->timeline_in > c->timeline_out && cc->timeline_in < c->timeline_out + ripple_length) { @@ -561,8 +580,6 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } } - selections.clear(); - undo_stack.push(ca); update_ui(true); @@ -609,7 +626,7 @@ void Timeline::zoom_out() { set_zoom(false); } -bool Timeline::is_clip_selected(Clip* clip, bool containing) { +bool is_clip_selected(Clip* clip, bool containing) { for (int i=0;isequence->selections.size();i++) { const Selection& s = clip->sequence->selections.at(i); if (clip->track == s.track && ((clip->timeline_in >= s.in && clip->timeline_out <= s.out && containing) || @@ -624,14 +641,22 @@ void Timeline::snapping_clicked(bool checked) { snapping = checked; } -Clip* Timeline::split_clip(ComboAction* ca, int p, long frame) { - return split_clip(ca, p, frame, frame); +Clip* Timeline::split_clip(ComboAction* ca, bool transitions, int p, long frame) { + return split_clip(ca, transitions, p, frame, frame); } -Clip* Timeline::split_clip(ComboAction* ca, int p, long frame, long post_in) { +Clip* Timeline::split_clip(ComboAction* ca, bool transitions, int p, long frame, long post_in) { Clip* pre = sequence->clips.at(p); - if (pre != NULL && pre->timeline_in < frame && pre->timeline_out > frame) { // guard against attempts to split at in/out points - Clip* post = pre->copy(sequence); + if (pre != nullptr && pre->timeline_in < frame && pre->timeline_out > frame) { // guard against attempts to split at in/out points + bool splitting_closing_dual_transition = false; + + if (transitions + && pre->get_closing_transition() != nullptr + && pre->get_closing_transition()->secondary_clip != nullptr) { + splitting_closing_dual_transition = true; + } + + Clip* post = pre->copy(sequence, transitions && !splitting_closing_dual_transition); long new_clip_length = frame - pre->timeline_in; @@ -640,12 +665,12 @@ Clip* Timeline::split_clip(ComboAction* ca, int p, long frame, long post_in) { move_clip(ca, pre, pre->timeline_in, frame, pre->clip_in, pre->track); - if (pre->get_opening_transition() != NULL) { - /*if (frame < pre->timeline_in + pre->get_opening_transition()->length && pre->get_opening_transition()->secondary_clip != NULL) { + if (pre->get_opening_transition() != nullptr) { +// if (frame < pre->timeline_in + pre->get_opening_transition()->length && pre->get_opening_transition()->secondary_clip != nullptr) { // separate shared transition - ca->append(new SetPointer((void**) &pre->get_opening_transition()->secondary_clip, NULL)); - pre->get_opening_transition()->secondary_clip->closing_transition = pre->get_opening_transition()->copy(pre->get_opening_transition()->secondary_clip, NULL); - }*/ +// ca->append(new SetPointer((void**) &pre->get_opening_transition()->secondary_clip, nullptr)); +// pre->get_opening_transition()->secondary_clip->closing_transition = pre->get_opening_transition()->copy(pre->get_opening_transition()->secondary_clip, nullptr); +// } if (pre->get_opening_transition()->get_true_length() > new_clip_length) { ca->append(new ModifyTransitionCommand(pre, TA_OPENING_TRANSITION, new_clip_length)); @@ -653,14 +678,30 @@ Clip* Timeline::split_clip(ComboAction* ca, int p, long frame, long post_in) { post->sequence->hard_delete_transition(post, TA_OPENING_TRANSITION); } - if (pre->get_closing_transition() != NULL) { - ca->append(new DeleteTransitionCommand(pre->sequence, pre->closing_transition)); - if (pre->get_closing_transition()->secondary_clip == NULL) post->get_closing_transition()->set_length(qMin((long) post->get_closing_transition()->get_true_length(), post->getLength())); + if (pre->get_closing_transition() != nullptr) { + if (splitting_closing_dual_transition) { + // just move closing transition to post clip + + // WORKAROUND + ca->append(new DeleteTransitionCommand(pre->sequence, pre->closing_transition)); + } else { + ca->append(new DeleteTransitionCommand(pre->sequence, pre->closing_transition)); + + if (post->get_closing_transition() != nullptr) { + if (pre->get_closing_transition()->secondary_clip == nullptr) { + post->get_closing_transition()->set_length(qMin(long(post->get_closing_transition()->get_true_length()), post->getLength())); + } + + if (post->get_closing_transition()->get_length() > post->getLength()) { + post->get_closing_transition()->set_length(post->getLength()); + } + } + } } return post; } - return NULL; + return nullptr; } bool Timeline::has_clip_been_split(int c) { @@ -681,14 +722,14 @@ bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool split_cache.append(clip); Clip* c = sequence->clips.at(clip); - if (c != NULL) { + if (c != nullptr) { QVector pre_clips; QVector post_clips; - Clip* post = split_clip(ca, clip, frame); + Clip* post = split_clip(ca, true, clip, frame); // if alt is not down, split clips links too - if (post == NULL) { + if (post == nullptr) { return false; } else { post_clips.append(post); @@ -704,8 +745,8 @@ bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool Clip* link = sequence->clips.at(l); if ((original_clip_is_selected && is_clip_selected(link, true)) || !original_clip_is_selected) { split_cache.append(l); - Clip* s = split_clip(ca, l, frame); - if (s != NULL) { + Clip* s = split_clip(ca, true, l, frame); + if (s != nullptr) { pre_clips.append(l); post_clips.append(s); } @@ -754,20 +795,21 @@ void Timeline::clean_up_selections(QVector& areas) { bool selection_contains_transition(const Selection& s, Clip* c, int type) { if (type == TA_OPENING_TRANSITION) { - return c->get_opening_transition() != NULL + return c->get_opening_transition() != nullptr && s.out == c->timeline_in + c->get_opening_transition()->get_true_length() - && ((c->get_opening_transition()->secondary_clip == NULL && s.in == c->timeline_in) - || (c->get_opening_transition()->secondary_clip != NULL && s.in == c->timeline_in - c->get_opening_transition()->get_true_length())); + && ((c->get_opening_transition()->secondary_clip == nullptr && s.in == c->timeline_in) + || (c->get_opening_transition()->secondary_clip != nullptr && s.in == c->timeline_in - c->get_opening_transition()->get_true_length())); } else { - return c->get_closing_transition() != NULL + return c->get_closing_transition() != nullptr && s.in == c->timeline_out - c->get_closing_transition()->get_true_length() - && ((c->get_closing_transition()->secondary_clip == NULL && s.out == c->timeline_out) - || (c->get_closing_transition()->secondary_clip != NULL && s.out == c->timeline_out + c->get_closing_transition()->get_true_length())); + && ((c->get_closing_transition()->secondary_clip == nullptr && s.out == c->timeline_out) + || (c->get_closing_transition()->secondary_clip != nullptr && s.out == c->timeline_out + c->get_closing_transition()->get_true_length())); } } void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas) { clean_up_selections(areas); + panel_effect_controls->clear_effects(true); QVector pre_clips; QVector post_clips; @@ -776,7 +818,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area const Selection& s = areas.at(i); for (int j=0;jclips.size();j++) { Clip* c = sequence->clips.at(j); - if (c != NULL && c->track == s.track && !c->undeletable) { + if (c != nullptr && c->track == s.track && !c->undeletable) { if (selection_contains_transition(s, c, TA_OPENING_TRANSITION)) { // delete opening transition ca->append(new DeleteTransitionCommand(c->sequence, c->opening_transition)); @@ -790,7 +832,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area // middle of clip is within deletion area // duplicate clip - Clip* post = split_clip(ca, j, s.in, s.out); + Clip* post = split_clip(ca, true, j, s.in, s.out); pre_clips.append(j); post_clips.append(post); @@ -798,7 +840,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area // only out point is in deletion area move_clip(ca, c, c->timeline_in, s.in, c->clip_in, c->track); - if (c->get_closing_transition() != NULL) { + if (c->get_closing_transition() != nullptr) { if (s.in < c->timeline_out - c->get_closing_transition()->get_true_length()) { ca->append(new DeleteTransitionCommand(c->sequence, c->closing_transition)); } else { @@ -809,7 +851,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area // only in point is in deletion area move_clip(ca, c, s.out, c->timeline_out, c->clip_in + (s.out - c->timeline_in), c->track); - if (c->get_opening_transition() != NULL) { + if (c->get_opening_transition() != nullptr) { if (s.out > c->timeline_in + c->get_opening_transition()->get_true_length()) { ca->append(new DeleteTransitionCommand(c->sequence, c->opening_transition)); } else { @@ -820,6 +862,14 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area } } } + + // deselect selected clip areas + QVector area_copy = areas; + for (int i=0;iappend(new AddClipCommand(sequence, post_clips)); } @@ -832,7 +882,7 @@ void Timeline::copy(bool del) { for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { for (int j=0;jselections.size();j++) { const Selection& s = sequence->selections.at(j); if (s.track == c->track && !((c->timeline_in <= s.in && c->timeline_out <= s.in) || (c->timeline_in >= s.out && c->timeline_out >= s.out))) { @@ -842,7 +892,7 @@ void Timeline::copy(bool del) { clipboard_type = CLIPBOARD_TYPE_CLIP; } - Clip* copied_clip = c->copy(NULL); + Clip* copied_clip = c->copy(nullptr); // copy linked IDs (we correct these later in paste()) copied_clip->linked = c->linked; @@ -890,7 +940,9 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& n for (int j=0;jlinked.size();j++) { for (int k=0;klinked.at(j) == old_clips.at(k)) { - new_clips.at(i)->linked.append(k); + if (new_clips.at(i) != nullptr) { + new_clips.at(i)->linked.append(k); + } } } } @@ -977,7 +1029,7 @@ void Timeline::paste(bool insert) { for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL && is_clip_selected(c, true)) { + if (c != nullptr && is_clip_selected(c, true)) { for (int j=0;j(clipboard.at(j)); if ((c->track < 0) == (e->meta->subtype == EFFECT_TYPE_VIDEO)) { @@ -994,15 +1046,15 @@ void Timeline::paste(bool insert) { } if (found >= 0 && ask_conflict) { QMessageBox box(this); - box.setWindowTitle("Effect already exists"); - box.setText("Clip '" + c->name + "' already contains a '" + e->meta->name + "' effect. Would you like to replace it with the pasted one or add it as a separate effect?"); + box.setWindowTitle(tr("Effect already exists")); + box.setText(tr("Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect?").arg(c->name, e->meta->name)); box.setIcon(QMessageBox::Icon::Question); - box.addButton("Add", QMessageBox::YesRole); - QPushButton* replace_button = box.addButton("Replace", QMessageBox::NoRole); - QPushButton* skip_button = box.addButton("Skip", QMessageBox::RejectRole); + box.addButton(tr("Add"), QMessageBox::YesRole); + QPushButton* replace_button = box.addButton(tr("Replace"), QMessageBox::NoRole); + QPushButton* skip_button = box.addButton(tr("Skip"), QMessageBox::RejectRole); - QCheckBox* future_box = new QCheckBox("Do this for all conflicts found"); + QCheckBox* future_box = new QCheckBox(tr("Do this for all conflicts found")); box.setCheckBox(future_box); box.exec(); @@ -1023,10 +1075,10 @@ void Timeline::paste(bool insert) { delcom->fx.append(found); ca->append(delcom); - ca->append(new AddEffectCommand(c, e->copy(c), NULL, found)); + ca->append(new AddEffectCommand(c, e->copy(c), nullptr, found)); push = true; } else { - ca->append(new AddEffectCommand(c, e->copy(c), NULL)); + ca->append(new AddEffectCommand(c, e->copy(c), nullptr)); push = true; } } @@ -1045,7 +1097,7 @@ void Timeline::paste(bool insert) { } void Timeline::ripple_to_in_point(bool in, bool ripple) { - if (sequence != NULL) { + if (sequence != nullptr) { if (sequence->clips.size() > 0) { // get track count int track_min = INT_MAX; @@ -1060,7 +1112,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // find closest in point to playhead for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { track_min = qMin(track_min, c->track); track_max = qMax(track_max, c->track); @@ -1164,54 +1216,16 @@ bool Timeline::split_selection(ComboAction* ca) { // find clips within selection and split for (int j=0;jclips.size();j++) { Clip* clip = sequence->clips.at(j); - if (clip != NULL) { + if (clip != nullptr) { for (int i=0;iselections.size();i++) { const Selection& s = sequence->selections.at(i); if (s.track == clip->track) { - if (clip->timeline_in < s.in && clip->timeline_out > s.out) { - Clip* split_A = clip->copy(sequence); - split_A->clip_in += (s.in - clip->timeline_in); - split_A->timeline_in = s.in; - split_A->timeline_out = s.out; - pre_splits.append(j); - post_splits.append(split_A); - - Clip* split_B = clip->copy(sequence); - split_B->clip_in += (s.out - clip->timeline_in); - split_B->timeline_in = s.out; - secondary_post_splits.append(split_B); - - if (clip->get_opening_transition() != NULL) { - split_B->sequence->hard_delete_transition(split_B, TA_OPENING_TRANSITION); - split_A->sequence->hard_delete_transition(split_A, TA_OPENING_TRANSITION); - } - - if (clip->get_closing_transition() != NULL) { - ca->append(new DeleteTransitionCommand(clip->sequence, clip->closing_transition)); - - split_A->sequence->hard_delete_transition(split_A, TA_CLOSING_TRANSITION); - } - - move_clip(ca, clip, clip->timeline_in, s.in, clip->clip_in, clip->track); - split = true; - } else { - Clip* post_a = split_clip(ca, j, s.in); - Clip* post_b = split_clip(ca, j, s.out); - if (post_a != NULL) { - pre_splits.append(j); - post_splits.append(post_a); - split = true; - } - if (post_b != NULL) { - if (post_a != NULL) { - pre_splits.append(j); - post_splits.append(post_b); - } else { - secondary_post_splits.append(post_b); - } - split = true; - } - } + Clip* post_b = split_clip(ca, true, j, s.out); + Clip* post_a = split_clip(ca, post_b == nullptr, j, s.in); + pre_splits.append(j); + post_splits.append(post_a); + secondary_post_splits.append(post_b); + split = true; } } } @@ -1221,6 +1235,10 @@ bool Timeline::split_selection(ComboAction* ca) { // relink after splitting relink_clips_using_ids(pre_splits, post_splits); relink_clips_using_ids(pre_splits, secondary_post_splits); + + post_splits.removeAll(nullptr); + secondary_post_splits.removeAll(nullptr); + ca->append(new AddClipCommand(sequence, post_splits)); ca->append(new AddClipCommand(sequence, secondary_post_splits)); @@ -1233,7 +1251,7 @@ bool Timeline::split_all_clips_at_point(ComboAction* ca, long point) { bool split = false; for (int j=0;jclips.size();j++) { Clip* c = sequence->clips.at(j); - if (c != NULL) { + if (c != nullptr) { // always relinks if (split_clip_and_relink(ca, j, point, true)) { split = true; @@ -1254,9 +1272,9 @@ void Timeline::split_at_playhead() { QVector post_clips; for (int j=0;jclips.size();j++) { Clip* clip = sequence->clips.at(j); - if (clip != NULL && is_clip_selected(clip, true)) { - Clip* s = split_clip(ca, j, sequence->playhead); - if (s != NULL) { + if (clip != nullptr && is_clip_selected(clip, true)) { + Clip* s = split_clip(ca, true, j, sequence->playhead); + if (s != nullptr) { pre_clips.append(j); post_clips.append(s); split_selected = true; @@ -1352,15 +1370,15 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo // snap to clip/transition for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL) { + if (c != nullptr) { if (snap_to_point(c->timeline_in, l)) { return true; } else if (snap_to_point(c->timeline_out, l)) { return true; - } else if (c->get_opening_transition() != NULL + } else if (c->get_opening_transition() != nullptr && snap_to_point(c->timeline_in + c->get_opening_transition()->get_true_length(), l)) { return true; - } else if (c->get_closing_transition() != NULL + } else if (c->get_closing_transition() != nullptr && snap_to_point(c->timeline_out - c->get_closing_transition()->get_true_length(), l)) { return true; } @@ -1376,8 +1394,8 @@ void Timeline::set_marker() { if (!add_marker) { QInputDialog d(this); - d.setWindowTitle("Set Marker"); - d.setLabelText("Set marker name:"); + d.setWindowTitle(tr("Set Marker")); + d.setLabelText(tr("Set marker name:")); d.setInputMode(QInputDialog::TextInput); add_marker = (d.exec() == QDialog::Accepted); marker_name = d.textValue(); @@ -1394,7 +1412,7 @@ void Timeline::toggle_links() { command->s = sequence; for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); - if (c != NULL && is_clip_selected(c, true)) { + if (c != nullptr && is_clip_selected(c, true)) { if (!command->clips.contains(i)) command->clips.append(i); if (c->linked.size() > 0) { @@ -1442,7 +1460,7 @@ void Timeline::deselect() { } long getFrameFromScreenPoint(double zoom, int x) { - long f = qCeil((float) x / zoom); + long f = qCeil(double(x) / zoom); if (f < 0) { return 0; } @@ -1450,7 +1468,7 @@ long getFrameFromScreenPoint(double zoom, int x) { } int getScreenPointFromFrame(double zoom, long frame) { - return (int) qFloor(frame*zoom); + return qFloor(double(frame)*zoom); } long Timeline::getTimelineFrameFromScreenPoint(int x) { @@ -1465,29 +1483,29 @@ void Timeline::add_btn_click() { QMenu add_menu(this); QAction* titleMenuItem = new QAction(&add_menu); - titleMenuItem->setText("Title..."); + titleMenuItem->setText(tr("Title...")); titleMenuItem->setData(ADD_OBJ_TITLE); add_menu.addAction(titleMenuItem); QAction* solidMenuItem = new QAction(&add_menu); - solidMenuItem->setText("Solid Color..."); + solidMenuItem->setText(tr("Solid Color...")); solidMenuItem->setData(ADD_OBJ_SOLID); add_menu.addAction(solidMenuItem); QAction* barsMenuItem = new QAction(&add_menu); - barsMenuItem->setText("Bars..."); + barsMenuItem->setText(tr("Bars...")); barsMenuItem->setData(ADD_OBJ_BARS); add_menu.addAction(barsMenuItem); add_menu.addSeparator(); QAction* toneMenuItem = new QAction(&add_menu); - toneMenuItem->setText("Tone..."); + toneMenuItem->setText(tr("Tone...")); toneMenuItem->setData(ADD_OBJ_TONE); add_menu.addAction(toneMenuItem); QAction* noiseMenuItem = new QAction(&add_menu); - noiseMenuItem->setText("Noise..."); + noiseMenuItem->setText(tr("Noise...")); noiseMenuItem->setData(ADD_OBJ_NOISE); add_menu.addAction(noiseMenuItem); @@ -1509,11 +1527,16 @@ void Timeline::setScroll(int s) { void Timeline::record_btn_click() { if (project_url.isEmpty()) { - QMessageBox::critical(this, "Unsaved Project", "You must save this project before you can record audio in it.", QMessageBox::Ok); + QMessageBox::critical(this, + tr("Unsaved Project"), + tr("You must save this project before you can record audio in it."), + QMessageBox::Ok); } else { creating = true; creating_object = ADD_OBJ_AUDIO; - mainWindow->statusBar()->showMessage("Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe)", 10000); + mainWindow->statusBar()->showMessage( + tr("Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe)"), + 10000); } } @@ -1579,151 +1602,151 @@ void Timeline::setup_ui() { horizontalLayout->setSpacing(0); horizontalLayout->setContentsMargins(0, 0, 0, 0); - QWidget* tool_buttons = new QWidget(dockWidgetContents); - tool_buttons->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); + tool_button_widget = new QWidget(dockWidgetContents); + tool_button_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + tool_button_widget->setObjectName("timeline_toolbar"); - QVBoxLayout* tool_buttons_layout = new QVBoxLayout(tool_buttons); + FlowLayout* tool_buttons_layout = new FlowLayout(tool_button_widget); +// tool_buttons_layout->setSizeConstraint(QLayout::SetNoConstraint); tool_buttons_layout->setSpacing(4); tool_buttons_layout->setContentsMargins(0, 0, 0, 0); - toolArrowButton = new QPushButton(tool_buttons); + toolArrowButton = new QPushButton(tool_button_widget); QIcon arrow_icon; arrow_icon.addFile(QStringLiteral(":/icons/arrow.png"), QSize(), QIcon::Normal, QIcon::Off); arrow_icon.addFile(QStringLiteral(":/icons/arrow-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); toolArrowButton->setIcon(arrow_icon); toolArrowButton->setCheckable(true); - toolArrowButton->setToolTip("Pointer Tool (V)"); + toolArrowButton->setToolTip(tr("Pointer Tool") + " (V)"); toolArrowButton->setProperty("tool", TIMELINE_TOOL_POINTER); connect(toolArrowButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolArrowButton); - toolEditButton = new QPushButton(tool_buttons); + toolEditButton = new QPushButton(tool_button_widget); QIcon icon1; icon1.addFile(QStringLiteral(":/icons/beam.png"), QSize(), QIcon::Normal, QIcon::Off); icon1.addFile(QStringLiteral(":/icons/beam-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); toolEditButton->setIcon(icon1); toolEditButton->setCheckable(true); - toolEditButton->setToolTip("Edit Tool (X)"); + toolEditButton->setToolTip(tr("Edit Tool") + " (X)"); toolEditButton->setProperty("tool", TIMELINE_TOOL_EDIT); connect(toolEditButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolEditButton); - toolRippleButton = new QPushButton(tool_buttons); + toolRippleButton = new QPushButton(tool_button_widget); QIcon icon2; icon2.addFile(QStringLiteral(":/icons/ripple.png"), QSize(), QIcon::Normal, QIcon::Off); icon2.addFile(QStringLiteral(":/icons/ripple-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); toolRippleButton->setIcon(icon2); toolRippleButton->setCheckable(true); - toolRippleButton->setToolTip("Ripple Tool (B)"); + toolRippleButton->setToolTip(tr("Ripple Tool") + " (B)"); toolRippleButton->setProperty("tool", TIMELINE_TOOL_RIPPLE); connect(toolRippleButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolRippleButton); - toolRazorButton = new QPushButton(tool_buttons); + toolRazorButton = new QPushButton(tool_button_widget); QIcon icon4; icon4.addFile(QStringLiteral(":/icons/razor.png"), QSize(), QIcon::Normal, QIcon::Off); icon4.addFile(QStringLiteral(":/icons/razor-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); toolRazorButton->setIcon(icon4); toolRazorButton->setCheckable(true); - toolRazorButton->setToolTip("Razor Tool (C)"); + toolRazorButton->setToolTip(tr("Razor Tool") + " (C)"); toolRazorButton->setProperty("tool", TIMELINE_TOOL_RAZOR); connect(toolRazorButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolRazorButton); - toolSlipButton = new QPushButton(tool_buttons); + toolSlipButton = new QPushButton(tool_button_widget); QIcon icon5; icon5.addFile(QStringLiteral(":/icons/slip.png"), QSize(), QIcon::Normal, QIcon::On); icon5.addFile(QStringLiteral(":/icons/slip-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolSlipButton->setIcon(icon5); toolSlipButton->setCheckable(true); - toolSlipButton->setToolTip("Slip Tool (Y)"); + toolSlipButton->setToolTip(tr("Slip Tool") + " (Y)"); toolSlipButton->setProperty("tool", TIMELINE_TOOL_SLIP); connect(toolSlipButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolSlipButton); - toolSlideButton = new QPushButton(tool_buttons); + toolSlideButton = new QPushButton(tool_button_widget); QIcon icon6; icon6.addFile(QStringLiteral(":/icons/slide.png"), QSize(), QIcon::Normal, QIcon::On); icon6.addFile(QStringLiteral(":/icons/slide-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolSlideButton->setIcon(icon6); toolSlideButton->setCheckable(true); - toolSlideButton->setToolTip("Slide Tool (U)"); + toolSlideButton->setToolTip(tr("Slide Tool") + " (U)"); toolSlideButton->setProperty("tool", TIMELINE_TOOL_SLIDE); connect(toolSlideButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolSlideButton); - toolHandButton = new QPushButton(tool_buttons); + toolHandButton = new QPushButton(tool_button_widget); QIcon icon7; icon7.addFile(QStringLiteral(":/icons/hand.png"), QSize(), QIcon::Normal, QIcon::On); icon7.addFile(QStringLiteral(":/icons/hand-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolHandButton->setIcon(icon7); toolHandButton->setCheckable(true); - toolHandButton->setToolTip("Hand Tool (H)"); + toolHandButton->setToolTip(tr("Hand Tool") + " (H)"); toolHandButton->setProperty("tool", TIMELINE_TOOL_HAND); connect(toolHandButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolHandButton); - toolTransitionButton = new QPushButton(tool_buttons); + toolTransitionButton = new QPushButton(tool_button_widget); QIcon icon8; icon8.addFile(QStringLiteral(":/icons/transition-tool.png"), QSize(), QIcon::Normal, QIcon::On); icon8.addFile(QStringLiteral(":/icons/transition-tool-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolTransitionButton->setIcon(icon8); toolTransitionButton->setCheckable(true); - toolTransitionButton->setToolTip("Transition Tool (T)"); + toolTransitionButton->setToolTip(tr("Transition Tool") + " (T)"); connect(toolTransitionButton, SIGNAL(clicked(bool)), this, SLOT(transition_tool_click())); tool_buttons_layout->addWidget(toolTransitionButton); - snappingButton = new QPushButton(tool_buttons); + snappingButton = new QPushButton(tool_button_widget); QIcon icon9; icon9.addFile(QStringLiteral(":/icons/magnet.png"), QSize(), QIcon::Normal, QIcon::On); icon9.addFile(QStringLiteral(":/icons/magnet-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); snappingButton->setIcon(icon9); snappingButton->setCheckable(true); snappingButton->setChecked(true); - snappingButton->setToolTip("Snapping (S)"); + snappingButton->setToolTip(tr("Snapping") + " (S)"); connect(snappingButton, SIGNAL(toggled(bool)), this, SLOT(snapping_clicked(bool))); tool_buttons_layout->addWidget(snappingButton); - zoomInButton = new QPushButton(tool_buttons); + zoomInButton = new QPushButton(tool_button_widget); QIcon icon10; icon10.addFile(QStringLiteral(":/icons/zoomin.png"), QSize(), QIcon::Normal, QIcon::On); icon10.addFile(QStringLiteral(":/icons/zoomin-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); zoomInButton->setIcon(icon10); - zoomInButton->setToolTip("Zoom In (=)"); + zoomInButton->setToolTip(tr("Zoom In") + " (=)"); connect(zoomInButton, SIGNAL(clicked(bool)), this, SLOT(zoom_in())); tool_buttons_layout->addWidget(zoomInButton); - zoomOutButton = new QPushButton(tool_buttons); + zoomOutButton = new QPushButton(tool_button_widget); QIcon icon11; icon11.addFile(QStringLiteral(":/icons/zoomout.png"), QSize(), QIcon::Normal, QIcon::On); icon11.addFile(QStringLiteral(":/icons/zoomout-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); zoomOutButton->setIcon(icon11); - zoomOutButton->setToolTip("Zoom Out (-)"); + zoomOutButton->setToolTip(tr("Zoom Out") + " (-)"); connect(zoomOutButton, SIGNAL(clicked(bool)), this, SLOT(zoom_out())); tool_buttons_layout->addWidget(zoomOutButton); - recordButton = new QPushButton(tool_buttons); + recordButton = new QPushButton(tool_button_widget); QIcon icon12; icon12.addFile(QStringLiteral(":/icons/record.png"), QSize(), QIcon::Normal, QIcon::On); icon12.addFile(QStringLiteral(":/icons/record-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); recordButton->setIcon(icon12); - recordButton->setToolTip("Record audio"); + recordButton->setToolTip(tr("Record audio")); connect(recordButton, SIGNAL(clicked(bool)), this, SLOT(record_btn_click())); tool_buttons_layout->addWidget(recordButton); - addButton = new QPushButton(tool_buttons); + addButton = new QPushButton(tool_button_widget); QIcon icon13; icon13.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); icon13.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); addButton->setIcon(icon13); - addButton->setToolTip("Add title, solid, bars, etc."); + addButton->setToolTip(tr("Add title, solid, bars, etc.")); connect(addButton, SIGNAL(clicked()), this, SLOT(add_btn_click())); tool_buttons_layout->addWidget(addButton); - tool_buttons_layout->addStretch(); - - horizontalLayout->addWidget(tool_buttons); + horizontalLayout->addWidget(tool_button_widget); timeline_area = new QWidget(dockWidgetContents); QSizePolicy sizePolicy2(QSizePolicy::Minimum, QSizePolicy::Minimum); @@ -1743,6 +1766,7 @@ void Timeline::setup_ui() { editAreaLayout->setSpacing(0); editAreaLayout->setContentsMargins(0, 0, 0, 0); QSplitter* splitter = new QSplitter(editAreas); + splitter->setChildrenCollapsible(false); splitter->setOrientation(Qt::Vertical); QWidget* videoContainer = new QWidget(splitter); QHBoxLayout* videoContainerLayout = new QHBoxLayout(videoContainer); @@ -1806,16 +1830,16 @@ void move_clip(ComboAction* ca, Clip *c, long iin, long iout, long iclip_in, int ca->append(new MoveClipAction(c, iin, iout, iclip_in, itrack, relative)); if (verify_transitions) { - if (c->get_opening_transition() != NULL && c->get_opening_transition()->secondary_clip != NULL && c->get_opening_transition()->secondary_clip->timeline_out != iin) { + if (c->get_opening_transition() != nullptr && c->get_opening_transition()->secondary_clip != nullptr && c->get_opening_transition()->secondary_clip->timeline_out != iin) { // separate transition - ca->append(new SetPointer((void**) &c->get_opening_transition()->secondary_clip, NULL)); - ca->append(new AddTransitionCommand(c->get_opening_transition()->secondary_clip, NULL, c->get_opening_transition(), NULL, TA_CLOSING_TRANSITION, 0)); + ca->append(new SetPointer(reinterpret_cast(&c->get_opening_transition()->secondary_clip), nullptr)); + ca->append(new AddTransitionCommand(c->get_opening_transition()->secondary_clip, nullptr, c->get_opening_transition(), nullptr, TA_CLOSING_TRANSITION, 0)); } - if (c->get_closing_transition() != NULL && c->get_closing_transition()->secondary_clip != NULL && c->get_closing_transition()->parent_clip->timeline_in != iout) { + if (c->get_closing_transition() != nullptr && c->get_closing_transition()->secondary_clip != nullptr && c->get_closing_transition()->parent_clip->timeline_in != iout) { // separate transition - ca->append(new SetPointer((void**) &c->get_closing_transition()->secondary_clip, NULL)); - ca->append(new AddTransitionCommand(c, NULL, c->get_closing_transition(), NULL, TA_CLOSING_TRANSITION, 0)); + ca->append(new SetPointer(reinterpret_cast(&c->get_closing_transition()->secondary_clip), nullptr)); + ca->append(new AddTransitionCommand(c, nullptr, c->get_closing_transition(), nullptr, TA_CLOSING_TRANSITION, 0)); } } } From 4cabe1571b7202da64c344c2f06936c5316b0d47 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 25 Jan 2019 13:50:00 +1100 Subject: [PATCH 005/202] removed old blending functions --- ui/renderfunctions.cpp | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index bbab2bd2b..2546392cd 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -28,9 +28,6 @@ extern "C" { #include } -//#define GL_DEFAULT_BLEND glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE) -#define GL_DEFAULT_BLEND glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE) - GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { glPushMatrix(); glLoadIdentity(); @@ -43,15 +40,6 @@ GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint text if (clear) glClear(GL_COLOR_BUFFER_BIT); - // get current blend mode - GLint src_rgb, src_alpha, dst_rgb, dst_alpha; - glGetIntegerv(GL_BLEND_SRC_RGB, &src_rgb); - glGetIntegerv(GL_BLEND_SRC_ALPHA, &src_alpha); - glGetIntegerv(GL_BLEND_DST_RGB, &dst_rgb); - glGetIntegerv(GL_BLEND_DST_ALPHA, &dst_alpha); - - ctx->functions()->GL_DEFAULT_BLEND; - glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); glTexCoord2f(0, 0); // top left @@ -65,14 +53,8 @@ GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint text glEnd(); glBindTexture(GL_TEXTURE_2D, 0); -// fbo->release(); ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - // restore previous blendFunc - ctx->functions()->glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha); - - //if (default_fbo != nullptr) default_fbo->bind(); - glPopMatrix(); return fbo->texture(); } @@ -139,7 +121,6 @@ GLuint compose_sequence(Viewer* viewer, if (video && nests.last()->fbo != nullptr) { nests.last()->fbo[0]->bind(); glClear(GL_COLOR_BUFFER_BIT); -// nests.last()->fbo[0]->release(); ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); } } @@ -153,7 +134,6 @@ GLuint compose_sequence(Viewer* viewer, // if clip starts within one second and/or hasn't finished yet if (c != nullptr) { -// if (!(!nests.isEmpty() && !same_sign(c->track, nests.last()->track))) { if ((c->track < 0) == video) { bool clip_is_active = false; @@ -220,7 +200,6 @@ GLuint compose_sequence(Viewer* viewer, texture_failed = true; } else { if (c->track < 0) { - ctx->functions()->GL_DEFAULT_BLEND; glColor4f(1.0, 1.0, 1.0, 1.0); GLuint textureID = 0; @@ -262,15 +241,6 @@ GLuint compose_sequence(Viewer* viewer, ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); } - // clear fbos - /*c->fbo[0]->bind(); - glClear(GL_COLOR_BUFFER_BIT); - c->fbo[0]->release(); - c->fbo[1]->bind(); - glClear(GL_COLOR_BUFFER_BIT); - c->fbo[1]->release();*/ - - bool fbo_switcher = false; glViewport(0, 0, video_width, video_height); @@ -280,7 +250,6 @@ GLuint compose_sequence(Viewer* viewer, if (c->media == nullptr) { c->fbo[fbo_switcher]->bind(); glClear(GL_COLOR_BUFFER_BIT); -// c->fbo[fbo_switcher]->release(); ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); composite_texture = c->fbo[fbo_switcher]->texture(); } else { @@ -428,14 +397,6 @@ GLuint compose_sequence(Viewer* viewer, } glPopMatrix(); - - /*GLfloat motion_blur_frac = (GLfloat) motion_blur_prog / (GLfloat) motion_blur_lim; - if (motion_blur_prog == 0) { - glAccum(GL_LOAD, motion_blur_frac); - } else { - glAccum(GL_ACCUM, motion_blur_frac); - } - motion_blur_prog++;*/ } } else { if (render_audio || (config.enable_audio_scrubbing && audio_scrub && seq->playhead > c->timeline_in)) { From 9c57219ba9ab8e5365e062ed5263555dd8bdb962 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 25 Jan 2019 16:46:39 +1100 Subject: [PATCH 006/202] making it work --- effects/blending.frag | 29 ++++++++++++++ effects/internal/transformeffect.cpp | 59 ++++++++++++++++++---------- project/effect.h | 35 ++++++++++++++++- ui/renderfunctions.cpp | 5 +++ 4 files changed, 107 insertions(+), 21 deletions(-) create mode 100644 effects/blending.frag diff --git a/effects/blending.frag b/effects/blending.frag new file mode 100644 index 000000000..132135c06 --- /dev/null +++ b/effects/blending.frag @@ -0,0 +1,29 @@ +const int BLEND_MODE_ADD = 0; +const int BLEND_MODE_AVERAGE = 1; +const int BLEND_MODE_COLORBURN = 2; +const int BLEND_MODE_COLORDODGE = 3; +const int BLEND_MODE_DARKEN = 4; +const int BLEND_MODE_DIFFERENCE = 5; +const int BLEND_MODE_EXCLUSION = 6; +const int BLEND_MODE_GLOW = 7; +const int BLEND_MODE_HARDLIGHT = 8; +const int BLEND_MODE_HARDMIX = 9; +const int BLEND_MODE_LIGHTEN = 10; +const int BLEND_MODE_LINEARBURN = 11; +const int BLEND_MODE_LINEARDODGE = 12; +const int BLEND_MODE_LINEARLIGHT = 13; +const int BLEND_MODE_MULTIPLY = 14; +const int BLEND_MODE_NEGATION = 15; +const int BLEND_MODE_NORMAL = 16; +const int BLEND_MODE_OVERLAY = 17; +const int BLEND_MODE_PHOENIX = 18; +const int BLEND_MODE_PINLIGHT = 19; +const int BLEND_MODE_REFLECT = 20; +const int BLEND_MODE_SCREEN = 21; +const int BLEND_MODE_SOFTLIGHT = 22; +const int BLEND_MODE_SUBSTRACT = 23; +const int BLEND_MODE_SUBTRACT = 24; +const int BLEND_MODE_VIVIDLIGHT = 25; + +void main(void) { +} \ No newline at end of file diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index b313e9298..8f22d0970 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -23,19 +23,14 @@ #include "panels/viewer.h" #include "ui/viewerwidget.h" -#define BLEND_MODE_NORMAL 0 -#define BLEND_MODE_SCREEN 1 -#define BLEND_MODE_MULTIPLY 2 -#define BLEND_MODE_OVERLAY 3 - TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) { enable_coords = true; - EffectRow* position_row = add_row(tr("Position")); + EffectRow* position_row = add_row(tr("Position")); position_x = position_row->add_field(EFFECT_FIELD_DOUBLE, "posx"); // position X position_y = position_row->add_field(EFFECT_FIELD_DOUBLE, "posy"); // position Y - EffectRow* scale_row = add_row(tr("Scale")); + EffectRow* scale_row = add_row(tr("Scale")); scale_x = scale_row->add_field(EFFECT_FIELD_DOUBLE, "scalex"); // scale X (and Y is uniform scale is selected) scale_x->set_double_minimum_value(0); scale_x->set_double_maximum_value(3000); @@ -43,27 +38,49 @@ TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) scale_y->set_double_minimum_value(0); scale_y->set_double_maximum_value(3000); - EffectRow* uniform_scale_row = add_row(tr("Uniform Scale")); + EffectRow* uniform_scale_row = add_row(tr("Uniform Scale")); uniform_scale_field = uniform_scale_row->add_field(EFFECT_FIELD_BOOL, "uniformscale"); // uniform scale option - EffectRow* rotation_row = add_row(tr("Rotation")); + EffectRow* rotation_row = add_row(tr("Rotation")); rotation = rotation_row->add_field(EFFECT_FIELD_DOUBLE, "rotation"); - EffectRow* anchor_point_row = add_row(tr("Anchor Point")); + EffectRow* anchor_point_row = add_row(tr("Anchor Point")); anchor_x_box = anchor_point_row->add_field(EFFECT_FIELD_DOUBLE, "anchorx"); // anchor point X anchor_y_box = anchor_point_row->add_field(EFFECT_FIELD_DOUBLE, "anchory"); // anchor point Y - EffectRow* opacity_row = add_row(tr("Opacity")); + EffectRow* opacity_row = add_row(tr("Opacity")); opacity = opacity_row->add_field(EFFECT_FIELD_DOUBLE, "opacity"); // opacity opacity->set_double_minimum_value(0); opacity->set_double_maximum_value(100); - EffectRow* blend_mode_row = add_row(tr("Blend Mode")); + EffectRow* blend_mode_row = add_row(tr("Blend Mode")); blend_mode_box = blend_mode_row->add_field(EFFECT_FIELD_COMBO, "blendmode"); // blend mode - blend_mode_box->add_combo_item(tr("Normal"), BLEND_MODE_NORMAL); - blend_mode_box->add_combo_item(tr("Overlay"), BLEND_MODE_OVERLAY); - blend_mode_box->add_combo_item(tr("Screen"), BLEND_MODE_SCREEN); - blend_mode_box->add_combo_item(tr("Multiply"), BLEND_MODE_MULTIPLY); + blend_mode_box->add_combo_item(tr("Normal"), BLEND_MODE_NORMAL); + blend_mode_box->add_combo_item(tr("Darken"), BLEND_MODE_DARKEN); + blend_mode_box->add_combo_item(tr("Multiply"), BLEND_MODE_MULTIPLY); + blend_mode_box->add_combo_item(tr("Color Burn"), BLEND_MODE_COLORBURN); + blend_mode_box->add_combo_item(tr("Linear Burn"), BLEND_MODE_LINEARBURN); + blend_mode_box->add_combo_item(tr("Lighten"), BLEND_MODE_LIGHTEN); + blend_mode_box->add_combo_item(tr("Screen"), BLEND_MODE_SCREEN); + blend_mode_box->add_combo_item(tr("Color Dodge"), BLEND_MODE_COLORDODGE); + blend_mode_box->add_combo_item(tr("Linear Dodge"), BLEND_MODE_LINEARDODGE); + blend_mode_box->add_combo_item(tr("Overlay"), BLEND_MODE_OVERLAY); + blend_mode_box->add_combo_item(tr("Soft Light"), BLEND_MODE_SOFTLIGHT); + blend_mode_box->add_combo_item(tr("Hard Light"), BLEND_MODE_HARDLIGHT); + blend_mode_box->add_combo_item(tr("Vivid Light"), BLEND_MODE_VIVIDLIGHT); + blend_mode_box->add_combo_item(tr("Linear Light"), BLEND_MODE_LINEARLIGHT); + blend_mode_box->add_combo_item(tr("Pin Light"), BLEND_MODE_PINLIGHT); + blend_mode_box->add_combo_item(tr("Hard Mix"), BLEND_MODE_HARDMIX); + blend_mode_box->add_combo_item(tr("Difference"), BLEND_MODE_DIFFERENCE); + blend_mode_box->add_combo_item(tr("Exclusion"), BLEND_MODE_EXCLUSION); + blend_mode_box->add_combo_item(tr("Reflect"), BLEND_MODE_REFLECT); + blend_mode_box->add_combo_item(tr("Subtract"), BLEND_MODE_SUBTRACT); + blend_mode_box->add_combo_item(tr("Substract"), BLEND_MODE_SUBSTRACT); + blend_mode_box->add_combo_item(tr("Add"), BLEND_MODE_ADD); + blend_mode_box->add_combo_item(tr("Average"), BLEND_MODE_AVERAGE); + blend_mode_box->add_combo_item(tr("Glow"), BLEND_MODE_GLOW); + blend_mode_box->add_combo_item(tr("Negation"), BLEND_MODE_NEGATION); + blend_mode_box->add_combo_item(tr("Phoenix"), BLEND_MODE_PHOENIX); // set up gizmos top_left_gizmo = add_gizmo(GIZMO_TYPE_DOT); @@ -211,7 +228,8 @@ void TransformEffect::process_coords(double timecode, GLTextureCoords& coords, i glScalef(sx, sy, 1); // blend mode - switch (blend_mode_box->get_combo_data(timecode).toInt()) { + coords.blendmode = blend_mode_box->get_combo_data(timecode).toInt(); + /*switch (blend_mode_box->get_combo_data(timecode).toInt()) { case BLEND_MODE_NORMAL: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; @@ -226,12 +244,13 @@ void TransformEffect::process_coords(double timecode, GLTextureCoords& coords, i break; default: qCritical() << "Invalid blend mode. This is a bug - please contact developers"; - } + }*/ // opacity - float color[4]; + coords.opacity *= opacity->get_double_value(timecode)*0.01; + /*float color[4]; glGetFloatv(GL_CURRENT_COLOR, color); - glColor4f(1.0, 1.0, 1.0, color[3]*(opacity->get_double_value(timecode)*0.01)); + glColor4f(1.0, 1.0, 1.0, color[3]*(opacity->get_double_value(timecode)*0.01));*/ } void TransformEffect::gizmo_draw(double, GLTextureCoords& coords) { diff --git a/project/effect.h b/project/effect.h index 6779501c4..f571a56df 100644 --- a/project/effect.h +++ b/project/effect.h @@ -74,6 +74,36 @@ enum EffectInternal { EFFECT_INTERNAL_COUNT }; +enum EffectBlendMode { + BLEND_MODE_ADD, + BLEND_MODE_AVERAGE, + BLEND_MODE_COLORBURN, + BLEND_MODE_COLORDODGE, + BLEND_MODE_DARKEN, + BLEND_MODE_DIFFERENCE, + BLEND_MODE_EXCLUSION, + BLEND_MODE_GLOW, + BLEND_MODE_HARDLIGHT, + BLEND_MODE_HARDMIX, + BLEND_MODE_LIGHTEN, + BLEND_MODE_LINEARBURN, + BLEND_MODE_LINEARDODGE, + BLEND_MODE_LINEARLIGHT, + BLEND_MODE_MULTIPLY, + BLEND_MODE_NEGATION, + BLEND_MODE_NORMAL, + BLEND_MODE_OVERLAY, + BLEND_MODE_PHOENIX, + BLEND_MODE_PINLIGHT, + BLEND_MODE_REFLECT, + BLEND_MODE_SCREEN, + BLEND_MODE_SOFTLIGHT, + BLEND_MODE_SUBSTRACT, + BLEND_MODE_SUBTRACT, + BLEND_MODE_VIVIDLIGHT, + BLEND_MODE_COUNT +}; + struct GLTextureCoords { int grid_size; @@ -102,6 +132,9 @@ struct GLTextureCoords { float textureBottomLeftX; float textureBottomLeftY; float textureBottomLeftQ; + + int blendmode; + double opacity; }; qint16 mix_audio_sample(qint16 a, qint16 b); @@ -159,7 +192,7 @@ public: const char* ffmpeg_filter; - virtual void process_image(double timecode, uint8_t* input, uint8_t* output, int size); + virtual void process_image(double timecode, uint8_t* input, uint8_t* output, int size); virtual void process_shader(double timecode, GLTextureCoords&); virtual void process_coords(double timecode, GLTextureCoords& coords, int data); virtual GLuint process_superimpose(double timecode); diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index 2546392cd..aab4b4c49 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -335,6 +335,9 @@ GLuint compose_sequence(Viewer* viewer, glBegin(GL_QUADS); + QOpenGLShaderProgram program; + program.bind(); + if (coords.grid_size <= 1) { float z = 0.0f; @@ -379,6 +382,8 @@ GLuint compose_sequence(Viewer* viewer, } } + program.release(); + glEnd(); glBindTexture(GL_TEXTURE_2D, 0); // unbind texture From e6df7de6bcb752a27c75226a56c6828d9a01f87e Mon Sep 17 00:00:00 2001 From: oc1024 Date: Fri, 25 Jan 2019 09:13:24 -0200 Subject: [PATCH 007/202] 0-100 thresholds + invert checkboxes Removes the need for piping the effect between Invert effects, which makes a unnecessary performance hit. --- effects/colorsel.frag | 17 +++++++++-------- effects/colorsel.xml | 7 +++++-- effects/lumakey.frag | 11 ++++++----- effects/lumakey.xml | 9 ++++++--- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/effects/colorsel.frag b/effects/colorsel.frag index 801c96b73..05ddff90d 100644 --- a/effects/colorsel.frag +++ b/effects/colorsel.frag @@ -10,6 +10,7 @@ varying vec2 vTexCoord; uniform float loc; uniform float hic; uniform int compo; +uniform bool invert; float rgb2luma(vec3 c) { return (max(max(c.r,c.g), c.b) + min(min(c.r,c.g), c.b))/2.0; @@ -63,27 +64,27 @@ void main(void) { switch(compo) { case 0 : - toCheck = rgb2luma(color); + toCheck = rgb2luma(color)*100.0; break; case 4 : - toCheck = color.r; + toCheck = color.r*100.0; break; case 5 : - toCheck = color.g; + toCheck = color.g*100.0; break; case 6 : - toCheck = color.b; + toCheck = color.b*100.0; break; case 1 : - toCheck = rgb2hsv(color).z; + toCheck = rgb2hsv(color).z*100.0; break; case 2 : - toCheck = rgb2hsv(color).x/360.0; + toCheck = rgb2hsv(color).x/3.6; break; case 3 : - toCheck = rgb2hsv(color).y; + toCheck = rgb2hsv(color).y*100.0; break; } - tc.a = isNotIncreasingSequence(loc, toCheck, hic) ? 0.0 : tc.a; + tc.a = isNotIncreasingSequence(loc, toCheck, hic) ? (invert ? tc.a : 0.0) : (invert ? 0.0 : tc.a); gl_FragColor = tc; } diff --git a/effects/colorsel.xml b/effects/colorsel.xml index 2a486afd2..00a4c865a 100644 --- a/effects/colorsel.xml +++ b/effects/colorsel.xml @@ -12,10 +12,13 @@ - + - + + + + diff --git a/effects/lumakey.frag b/effects/lumakey.frag index 3ded5dac5..d8092c4cb 100644 --- a/effects/lumakey.frag +++ b/effects/lumakey.frag @@ -7,6 +7,7 @@ varying vec2 vTexCoord; uniform float loc; uniform float hic; +uniform bool invert; void main(void) { vec4 texture_color = texture2D(tex,vTexCoord); @@ -15,12 +16,12 @@ void main(void) { luma /= 2.0; - if (luma > hic) { - texture_color.a = 1.0; - } else if (luma < loc) { - texture_color.a = 0.0; + if (luma > hic/100.0) { + texture_color.a = (invert ? 0.0 : 1.0); + } else if (luma < loc/100.0) { + texture_color.a = (invert ? 1.0 : 0.0); } else { - texture_color.a = luma; + texture_color.a = (invert ? 1.0-luma : luma); } gl_FragColor = texture_color; diff --git a/effects/lumakey.xml b/effects/lumakey.xml index 03b933877..0c3175c2e 100644 --- a/effects/lumakey.xml +++ b/effects/lumakey.xml @@ -1,10 +1,13 @@ - + - + + + + - \ No newline at end of file + From b0e1eb2ea4ec2e3253bef426e8a862fe9a01021c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 26 Jan 2019 11:47:46 +1100 Subject: [PATCH 008/202] preparing for extra textures and fbos --- effects/blending.frag | 8 +++ project/effect.h | 2 +- ui/renderfunctions.cpp | 141 +++++++++++++++++++++-------------------- ui/renderfunctions.h | 30 ++++++--- ui/renderthread.cpp | 40 ++++++++++-- ui/renderthread.h | 6 +- 6 files changed, 139 insertions(+), 88 deletions(-) diff --git a/effects/blending.frag b/effects/blending.frag index 132135c06..b418137b5 100644 --- a/effects/blending.frag +++ b/effects/blending.frag @@ -1,3 +1,5 @@ +#version 110 + const int BLEND_MODE_ADD = 0; const int BLEND_MODE_AVERAGE = 1; const int BLEND_MODE_COLORBURN = 2; @@ -25,5 +27,11 @@ const int BLEND_MODE_SUBSTRACT = 23; const int BLEND_MODE_SUBTRACT = 24; const int BLEND_MODE_VIVIDLIGHT = 25; +uniform sampler2D background; +uniform sampler2D texture; +varying vec2 vTexCoord; + void main(void) { + gl_FragColor = texture2D(background, vTexCoord); + // gl_FragColor = texture2D(texture, vTexCoord)*2.0; } \ No newline at end of file diff --git a/project/effect.h b/project/effect.h index f571a56df..dd681dc98 100644 --- a/project/effect.h +++ b/project/effect.h @@ -134,7 +134,7 @@ struct GLTextureCoords { float textureBottomLeftQ; int blendmode; - double opacity; + float opacity; }; qint16 mix_audio_sample(qint16 a, qint16 b); diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index aab4b4c49..c480a6f69 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -93,35 +93,26 @@ void process_effect(QOpenGLContext* ctx, } } -GLuint compose_sequence(Viewer* viewer, - QOpenGLContext* ctx, - Sequence* seq, - QVector& nests, - bool video, - bool render_audio, - Effect** gizmos, - bool& texture_failed, - bool rendering, - int playback_speed) { +GLuint compose_sequence(ComposeSequenceParams ¶ms) { GLint current_fbo = 0; - if (video) { + if (params.video) { glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); } - Sequence* s = seq; + Sequence* s = params.seq; long playhead = s->playhead; - if (!nests.isEmpty()) { - for (int i=0;imedia->to_sequence(); - playhead += nests.at(i)->clip_in - nests.at(i)->get_timeline_in_with_transition(); - playhead = refactor_frame_number(playhead, nests.at(i)->sequence->frame_rate, s->frame_rate); + if (!params.nests.isEmpty()) { + for (int i=0;imedia->to_sequence(); + playhead += params.nests.at(i)->clip_in - params.nests.at(i)->get_timeline_in_with_transition(); + playhead = refactor_frame_number(playhead, params.nests.at(i)->sequence->frame_rate, s->frame_rate); } - if (video && nests.last()->fbo != nullptr) { - nests.last()->fbo[0]->bind(); + if (params.video && params.nests.last()->fbo != nullptr) { + params.nests.last()->fbo[0]->bind(); glClear(GL_COLOR_BUFFER_BIT); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); } } @@ -134,7 +125,7 @@ GLuint compose_sequence(Viewer* viewer, // if clip starts within one second and/or hasn't finished yet if (c != nullptr) { - if ((c->track < 0) == video) { + if ((c->track < 0) == params.video) { bool clip_is_active = false; if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { @@ -146,7 +137,7 @@ GLuint compose_sequence(Viewer* viewer, // if thread is already working, we don't want to touch this, // but we also don't want to hang the UI thread if (!c->open) { - open_clip(c, !rendering); + open_clip(c, !params.rendering); } clip_is_active = true; if (c->track >= 0) audio_track_count++; @@ -155,12 +146,12 @@ GLuint compose_sequence(Viewer* viewer, } } else { //qWarning() << "Media '" + m->name + "' was not ready, retrying..."; - texture_failed = true; + params.texture_failed = true; } } } else { if (is_clip_active(c, playhead)) { - if (!c->open) open_clip(c, !rendering); + if (!c->open) open_clip(c, !params.rendering); clip_is_active = true; } else if (c->finished_opening) { close_clip(c, false); @@ -186,7 +177,7 @@ GLuint compose_sequence(Viewer* viewer, int half_width = s->width/2; int half_height = s->height/2; - if (video) { + if (params.video) { glPushMatrix(); glLoadIdentity(); glOrtho(-half_width, half_width, -half_height, half_height, -1, 10); @@ -197,7 +188,7 @@ GLuint compose_sequence(Viewer* viewer, if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { qWarning() << "Tried to display clip" << i << "but it's closed"; - texture_failed = true; + params.texture_failed = true; } else { if (c->track < 0) { glColor4f(1.0, 1.0, 1.0, 1.0); @@ -218,7 +209,7 @@ GLuint compose_sequence(Viewer* viewer, c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); } - get_clip_frame(c, qMax(playhead, c->timeline_in), texture_failed); + get_clip_frame(c, qMax(playhead, c->timeline_in), params.texture_failed); textureID = c->texture->textureId(); break; case MEDIA_TYPE_SEQUENCE: @@ -229,7 +220,7 @@ GLuint compose_sequence(Viewer* viewer, if (textureID == 0 && c->media != nullptr) { qWarning() << "Texture hasn't been created yet"; - texture_failed = true; + params.texture_failed = true; } else if (playhead >= c->get_timeline_in_with_transition()) { glPushMatrix(); @@ -238,7 +229,7 @@ GLuint compose_sequence(Viewer* viewer, c->fbo = new QOpenGLFramebufferObject* [2]; c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); } bool fbo_switcher = false; @@ -250,18 +241,18 @@ GLuint compose_sequence(Viewer* viewer, if (c->media == nullptr) { c->fbo[fbo_switcher]->bind(); glClear(GL_COLOR_BUFFER_BIT); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); composite_texture = c->fbo[fbo_switcher]->texture(); } else { // for nested sequences if (c->media->get_type()== MEDIA_TYPE_SEQUENCE) { - nests.append(c); - textureID = compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, false); - nests.removeLast(); + params.nests.append(c); + textureID = compose_sequence(params); + params.nests.removeLast(); fbo_switcher = true; } - composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], textureID, true); + composite_texture = draw_clip(params.ctx, c->fbo[fbo_switcher], textureID, true); } fbo_switcher = !fbo_switcher; @@ -294,7 +285,7 @@ GLuint compose_sequence(Viewer* viewer, for (int j=0;jeffects.size();j++) { Effect* e = c->effects.at(j); - process_effect(ctx, c, e, timecode, coords, composite_texture, fbo_switcher, texture_failed, TA_NO_TRANSITION); + process_effect(params.ctx, c, e, timecode, coords, composite_texture, fbo_switcher, params.texture_failed, TA_NO_TRANSITION); if (e->are_gizmos_enabled()) { if (first_gizmo_effect == nullptr) first_gizmo_effect = e; @@ -303,28 +294,28 @@ GLuint compose_sequence(Viewer* viewer, } if (selected_effect != nullptr) { - (*gizmos) = selected_effect; + (*params.gizmos) = selected_effect; } else if (is_clip_selected(c, true)) { - (*gizmos) = first_gizmo_effect; + (*params.gizmos) = first_gizmo_effect; } if (c->get_opening_transition() != nullptr) { int transition_progress = playhead - c->get_timeline_in_with_transition(); if (transition_progress < c->get_opening_transition()->get_length()) { - process_effect(ctx, c, c->get_opening_transition(), (double)transition_progress/(double)c->get_opening_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_OPENING_TRANSITION); + process_effect(params.ctx, c, c->get_opening_transition(), (double)transition_progress/(double)c->get_opening_transition()->get_length(), coords, composite_texture, fbo_switcher, params.texture_failed, TA_OPENING_TRANSITION); } } if (c->get_closing_transition() != nullptr) { int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->get_closing_transition()->get_length()); if (transition_progress >= 0 && transition_progress < c->get_closing_transition()->get_length()) { - process_effect(ctx, c, c->get_closing_transition(), (double)transition_progress/(double)c->get_closing_transition()->get_length(), coords, composite_texture, fbo_switcher, texture_failed, TA_CLOSING_TRANSITION); + process_effect(params.ctx, c, c->get_closing_transition(), (double)transition_progress/(double)c->get_closing_transition()->get_length(), coords, composite_texture, fbo_switcher, params.texture_failed, TA_CLOSING_TRANSITION); } } // EFFECT CODE END - if (!nests.isEmpty()) { - nests.last()->fbo[0]->bind(); + if (!params.nests.isEmpty()) { + params.nests.last()->fbo[0]->bind(); } glViewport(0, 0, s->width, s->height); @@ -333,10 +324,16 @@ GLuint compose_sequence(Viewer* viewer, glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glBegin(GL_QUADS); + // get current color attachment from framebuffer + GLint texture_id; + params.ctx->functions()->glGetFramebufferAttachmentParameteriv(GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &texture_id); - QOpenGLShaderProgram program; - program.bind(); + params.blend_mode_program->bind(); + params.blend_mode_program->setUniformValue("blend_mode", coords.blendmode); + params.blend_mode_program->setUniformValue("opacity", coords.opacity); +// blend_mode_program->setUniformValue("background", texture_id); + + glBegin(GL_QUADS); if (coords.grid_size <= 1) { float z = 0.0f; @@ -382,44 +379,44 @@ GLuint compose_sequence(Viewer* viewer, } } - program.release(); - glEnd(); + params.blend_mode_program->release(); + glBindTexture(GL_TEXTURE_2D, 0); // unbind texture // prepare gizmos - if ((*gizmos) != nullptr - && nests.isEmpty() - && ((*gizmos) == first_gizmo_effect - || (*gizmos) == selected_effect)) { - (*gizmos)->gizmo_draw(timecode, coords); // set correct gizmo coords - (*gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords + if ((*params.gizmos) != nullptr + && params.nests.isEmpty() + && ((*params.gizmos) == first_gizmo_effect + || (*params.gizmos) == selected_effect)) { + (*params.gizmos)->gizmo_draw(timecode, coords); // set correct gizmo coords + (*params.gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords } - if (!nests.isEmpty()) { - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + if (!params.nests.isEmpty()) { + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); } glPopMatrix(); } } else { - if (render_audio || (config.enable_audio_scrubbing && audio_scrub && seq->playhead > c->timeline_in)) { + if (params.render_audio || (config.enable_audio_scrubbing && audio_scrub && params.seq->playhead > c->timeline_in)) { if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { - nests.append(c); - compose_sequence(viewer, ctx, seq, nests, video, render_audio, gizmos, texture_failed, rendering, playback_speed); - nests.removeLast(); + params.nests.append(c); + compose_sequence(params); + params.nests.removeLast(); } else { if (c->lock.tryLock()) { // clip is not caching, start caching audio - cache_clip(c, playhead, c->audio_reset, !render_audio, nests, playback_speed); + cache_clip(c, playhead, c->audio_reset, !params.render_audio, params.nests, params.playback_speed); c->lock.unlock(); } } } // visually update all the keyframe values - if (c->sequence == seq) { // only if you can currently see them + if (c->sequence == params.seq) { // only if you can currently see them double ts = (playhead - c->get_timeline_in_with_transition() + c->get_clip_in_with_transition())/s->frame_rate; for (int i=0;ieffects.size();i++) { Effect* e = c->effects.at(i); @@ -435,24 +432,32 @@ GLuint compose_sequence(Viewer* viewer, } } - if (audio_track_count == 0 && viewer != nullptr) { - viewer->play_wake(); + if (audio_track_count == 0 && params.viewer != nullptr) { + params.viewer->play_wake(); } - if (video) { + if (params.video) { glPopMatrix(); } - if (!nests.isEmpty() && nests.last()->fbo != nullptr) { + if (!params.nests.isEmpty() && params.nests.last()->fbo != nullptr) { // returns nested clip's texture - return nests.last()->fbo[0]->texture(); + return params.nests.last()->fbo[0]->texture(); } return 0; } void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio, int playback_speed) { - QVector nests; - bool texture_failed; - compose_sequence(viewer, nullptr, seq, nests, false, render_audio, nullptr, texture_failed, audio_rendering, playback_speed); + ComposeSequenceParams params; + params.viewer = viewer; + params.ctx = nullptr; + params.seq = seq; + params.video = false; + params.render_audio = render_audio; + params.gizmos = nullptr; + params.rendering = audio_rendering; + params.playback_speed = playback_speed; + params.blend_mode_program = nullptr; + compose_sequence(params); } diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 6523a16ba..52698d3f8 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -6,19 +6,29 @@ class Effect; class Viewer; +class QOpenGLShaderProgram; struct Sequence; struct Clip; -GLuint compose_sequence(Viewer* viewer, - QOpenGLContext* ctx, - Sequence* seq, - QVector& nests, - bool video, - bool render_audio, - Effect **gizmos, - bool &texture_failed, - bool rendering, - int playback_speed); +struct ComposeSequenceParams { + Viewer* viewer; + QOpenGLContext* ctx; + Sequence* seq; + QVector nests; + bool video; + bool render_audio; + Effect** gizmos; + bool texture_failed; + bool rendering; + int playback_speed; + QOpenGLShaderProgram* blend_mode_program; + GLuint backend_buffer1; + GLuint backend_attachment1; + GLuint backend_buffer2; + GLuint backend_attachment2; +}; + +GLuint compose_sequence(ComposeSequenceParams ¶ms); void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio, int playback_speed); diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index a4ee4da23..601f40c69 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -15,6 +15,7 @@ RenderThread::RenderThread() : gizmos(nullptr), share_ctx(nullptr), ctx(nullptr), + blend_mode_program(nullptr), seq(nullptr), tex_width(-1), tex_height(-1), @@ -73,6 +74,14 @@ void RenderThread::run() { glBindTexture(GL_TEXTURE_2D, 0); } + if (blend_mode_program == nullptr) { + delete_shader_program(); + blend_mode_program = new QOpenGLShaderProgram(); + blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "C:/msys64/home/Matt/olive/effects/common.vert"); + blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "C:/msys64/home/Matt/olive/effects/blending.frag"); + blend_mode_program->link(); + } + // draw paint(); @@ -96,8 +105,6 @@ void RenderThread::run() { void RenderThread::paint() { glLoadIdentity(); - texture_failed = false; - glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); @@ -109,8 +116,21 @@ void RenderThread::paint() { glEnable(GL_DEPTH); gizmos = nullptr; - QVector nests; - compose_sequence(nullptr, ctx, seq, nests, true, false, &gizmos, texture_failed, false, temp_reverse); + + ComposeSequenceParams params; + params.viewer = nullptr; + params.ctx = ctx; + params.seq = seq; + params.video = true; + params.texture_failed = false; + params.render_audio = false; + params.gizmos = &gizmos; + params.rendering = false; + params.playback_speed = 1; + params.blend_mode_program = blend_mode_program; + compose_sequence(params); + + texture_failed = params.texture_failed; if (!save_fn.isEmpty()) { if (texture_failed) { @@ -138,14 +158,12 @@ void RenderThread::paint() { glDisable(GL_TEXTURE_2D); } -void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int idivider, bool itemp_reverse) { +void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int idivider) { seq = s; // stall any dependent actions texture_failed = true; - temp_reverse = itemp_reverse; - if (share != nullptr && (ctx == nullptr || ctx->shareContext() != share_ctx)) { share_ctx = share; delete_ctx(); @@ -191,8 +209,16 @@ void RenderThread::delete_fbo() { frameBuffer = 0; } +void RenderThread::delete_shader_program() { + if (blend_mode_program != nullptr) { + delete blend_mode_program; + } + blend_mode_program = nullptr; +} + void RenderThread::delete_ctx() { if (ctx != nullptr) { + delete_shader_program(); delete_texture(); delete_fbo(); ctx->doneCurrent(); diff --git a/ui/renderthread.h b/ui/renderthread.h index 54eecd646..a73813888 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -7,6 +7,7 @@ #include #include #include +#include struct Sequence; class Effect; @@ -22,7 +23,7 @@ public: GLuint texColorBuffer; Effect* gizmos; void paint(); - void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int idivider = 0, bool itemp_reverse = false); + void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int idivider = 0); bool did_texture_fail(); void cancel(); @@ -35,11 +36,13 @@ private: // cleanup functions void delete_texture(); void delete_fbo(); + void delete_shader_program(); QWaitCondition waitCond; QOffscreenSurface surface; QOpenGLContext* share_ctx; QOpenGLContext* ctx; + QOpenGLShaderProgram* blend_mode_program; Sequence* seq; int divider; int tex_width; @@ -47,7 +50,6 @@ private: bool queued; bool texture_failed; bool running; - bool temp_reverse; QString save_fn; GLvoid *pixel_buffer; }; From 97a28ab54a63b7e8918fc52410bcee1a411ea763 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 26 Jan 2019 21:49:18 +1100 Subject: [PATCH 009/202] support for premultipled alpha --- dialogs/mediapropertiesdialog.cpp | 76 +++++--- dialogs/mediapropertiesdialog.h | 2 + effects/internal/transformeffect.cpp | 35 +--- io/loadthread.cpp | 2 + panels/project.cpp | 67 +++---- panels/viewer.h | 2 +- playback/cacher.cpp | 21 +- project/effect.cpp | 4 +- project/footage.cpp | 10 +- project/footage.h | 1 + project/undo.cpp | 12 +- project/undo.h | 6 + ui/renderfunctions.cpp | 280 ++++++++++++++++----------- ui/renderfunctions.h | 1 + ui/renderthread.cpp | 111 +++++++---- ui/renderthread.h | 12 +- ui/viewerwidget.cpp | 4 +- 17 files changed, 392 insertions(+), 254 deletions(-) diff --git a/dialogs/mediapropertiesdialog.cpp b/dialogs/mediapropertiesdialog.cpp index 188187f3f..bacc74cea 100644 --- a/dialogs/mediapropertiesdialog.cpp +++ b/dialogs/mediapropertiesdialog.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "project/footage.h" @@ -19,7 +20,7 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : QDialog(parent), item(i) { - setWindowTitle(tr("\"%1\" Properties").arg(i->get_name())); + setWindowTitle(tr("\"%1\" Properties").arg(i->get_name())); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); QGridLayout* grid = new QGridLayout(); @@ -29,21 +30,21 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : Footage* f = item->to_footage(); - grid->addWidget(new QLabel(tr("Tracks:")), row, 0, 1, 2); + grid->addWidget(new QLabel(tr("Tracks:")), row, 0, 1, 2); row++; track_list = new QListWidget(); for (int i=0;ivideo_tracks.size();i++) { const FootageStream& fs = f->video_tracks.at(i); - QListWidgetItem* item = new QListWidgetItem( - tr("Video %1: %2x%3 %4FPS").arg( - QString::number(fs.file_index), - QString::number(fs.video_width), - QString::number(fs.video_height), - QString::number(fs.video_frame_rate) - ) - ); + QListWidgetItem* item = new QListWidgetItem( + tr("Video %1: %2x%3 %4FPS").arg( + QString::number(fs.file_index), + QString::number(fs.video_width), + QString::number(fs.video_height), + QString::number(fs.video_frame_rate) + ) + ); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(fs.enabled ? Qt::Checked : Qt::Unchecked); item->setData(Qt::UserRole+1, fs.file_index); @@ -51,13 +52,13 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : } for (int i=0;iaudio_tracks.size();i++) { const FootageStream& fs = f->audio_tracks.at(i); - QListWidgetItem* item = new QListWidgetItem( - tr("Audio %1: %2Hz %3 channels").arg( - QString::number(fs.file_index), - QString::number(fs.audio_frequency), - QString::number(fs.audio_channels) - ) - ); + QListWidgetItem* item = new QListWidgetItem( + tr("Audio %1: %2Hz %3 channels").arg( + QString::number(fs.file_index), + QString::number(fs.audio_frequency), + QString::number(fs.audio_channels) + ) + ); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(fs.enabled ? Qt::Checked : Qt::Unchecked); item->setData(Qt::UserRole+1, fs.file_index); @@ -69,7 +70,7 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : if (f->video_tracks.size() > 0) { // frame conforming if (!f->video_tracks.at(0).infinite_length) { - grid->addWidget(new QLabel(tr("Conform to Frame Rate:")), row, 0); + grid->addWidget(new QLabel(tr("Conform to Frame Rate:")), row, 0); conform_fr = new QDoubleSpinBox(); conform_fr->setMinimum(0.01); conform_fr->setValue(f->video_tracks.at(0).video_frame_rate * f->speed); @@ -78,30 +79,37 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : row++; + // premultiplied alpha mode + premultiply_alpha_setting = new QCheckBox(tr("Alpha is Premultiplied")); + premultiply_alpha_setting->setChecked(f->alpha_is_premultiplied); + grid->addWidget(premultiply_alpha_setting, row, 0); + + row++; + // deinterlacing mode - interlacing_box = new QComboBox(); - interlacing_box->addItem( - tr("Auto (%1)").arg( - get_interlacing_name(f->video_tracks.at(0).video_auto_interlacing) - ) - ); + interlacing_box = new QComboBox(); + interlacing_box->addItem( + tr("Auto (%1)").arg( + get_interlacing_name(f->video_tracks.at(0).video_auto_interlacing) + ) + ); interlacing_box->addItem(get_interlacing_name(VIDEO_PROGRESSIVE)); interlacing_box->addItem(get_interlacing_name(VIDEO_TOP_FIELD_FIRST)); interlacing_box->addItem(get_interlacing_name(VIDEO_BOTTOM_FIELD_FIRST)); - interlacing_box->setCurrentIndex( - (f->video_tracks.at(0).video_auto_interlacing == f->video_tracks.at(0).video_interlacing) - ? 0 - : f->video_tracks.at(0).video_interlacing + 1); + interlacing_box->setCurrentIndex( + (f->video_tracks.at(0).video_auto_interlacing == f->video_tracks.at(0).video_interlacing) + ? 0 + : f->video_tracks.at(0).video_interlacing + 1); - grid->addWidget(new QLabel(tr("Interlacing:")), row, 0); + grid->addWidget(new QLabel(tr("Interlacing:")), row, 0); grid->addWidget(interlacing_box, row, 1); row++; } name_box = new QLineEdit(item->get_name()); - grid->addWidget(new QLabel(tr("Name:")), row, 0); + grid->addWidget(new QLabel(tr("Name:")), row, 0); grid->addWidget(name_box, row, 1); row++; @@ -160,6 +168,9 @@ void MediaPropertiesDialog::accept() { refresh_clips = true; } } + + // set premultiplied alpha + f->alpha_is_premultiplied = premultiply_alpha_setting->isChecked(); } // set name @@ -168,7 +179,10 @@ void MediaPropertiesDialog::accept() { ca->append(mr); ca->appendPost(new CloseAllClipsCommand()); ca->appendPost(new UpdateFootageTooltip(item)); - if (refresh_clips) ca->appendPost(new RefreshClips(item)); + if (refresh_clips) { + ca->appendPost(new RefreshClips(item)); + } + ca->appendPost(new UpdateViewer()); undo_stack.push(ca); diff --git a/dialogs/mediapropertiesdialog.h b/dialogs/mediapropertiesdialog.h index b5699dff7..fe58fa9e2 100644 --- a/dialogs/mediapropertiesdialog.h +++ b/dialogs/mediapropertiesdialog.h @@ -9,6 +9,7 @@ class QLineEdit; class Media; class QListWidget; class QDoubleSpinBox; +class QCheckBox; class MediaPropertiesDialog : public QDialog { Q_OBJECT @@ -20,6 +21,7 @@ private: Media* item; QListWidget* track_list; QDoubleSpinBox* conform_fr; + QCheckBox* premultiply_alpha_setting; private slots: void accept(); }; diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index 8f22d0970..6bbcf1cfe 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -205,11 +205,11 @@ void TransformEffect::toggle_uniform_scale(bool enabled) { void TransformEffect::process_coords(double timecode, GLTextureCoords& coords, int) { // position - glTranslatef(position_x->get_double_value(timecode)-(parent_clip->sequence->width/2), position_y->get_double_value(timecode)-(parent_clip->sequence->height/2), 0); + glTranslated(position_x->get_double_value(timecode)-(parent_clip->sequence->width/2), position_y->get_double_value(timecode)-(parent_clip->sequence->height/2), 0); // anchor point - int anchor_x_offset = (anchor_x_box->get_double_value(timecode)); - int anchor_y_offset = (anchor_y_box->get_double_value(timecode)); + int anchor_x_offset = qRound(anchor_x_box->get_double_value(timecode)); + int anchor_y_offset = qRound(anchor_y_box->get_double_value(timecode)); coords.vertexTopLeftX -= anchor_x_offset; coords.vertexTopRightX -= anchor_x_offset; coords.vertexBottomLeftX -= anchor_x_offset; @@ -220,37 +220,18 @@ void TransformEffect::process_coords(double timecode, GLTextureCoords& coords, i coords.vertexBottomRightY -= anchor_y_offset; // rotation - glRotatef(rotation->get_double_value(timecode), 0, 0, 1); + glRotated(rotation->get_double_value(timecode), 0, 0, 1); // scale - float sx = scale_x->get_double_value(timecode)*0.01; - float sy = (uniform_scale_field->get_bool_value(timecode)) ? sx : scale_y->get_double_value(timecode)*0.01; - glScalef(sx, sy, 1); + double sx = scale_x->get_double_value(timecode)*0.01; + double sy = (uniform_scale_field->get_bool_value(timecode)) ? sx : scale_y->get_double_value(timecode)*0.01; + glScaled(sx, sy, 1); // blend mode coords.blendmode = blend_mode_box->get_combo_data(timecode).toInt(); - /*switch (blend_mode_box->get_combo_data(timecode).toInt()) { - case BLEND_MODE_NORMAL: - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - break; - case BLEND_MODE_OVERLAY: - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - break; - case BLEND_MODE_SCREEN: - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR); - break; - case BLEND_MODE_MULTIPLY: - glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); - break; - default: - qCritical() << "Invalid blend mode. This is a bug - please contact developers"; - }*/ // opacity - coords.opacity *= opacity->get_double_value(timecode)*0.01; - /*float color[4]; - glGetFloatv(GL_CURRENT_COLOR, color); - glColor4f(1.0, 1.0, 1.0, color[3]*(opacity->get_double_value(timecode)*0.01));*/ + coords.opacity *= float(opacity->get_double_value(timecode)*0.01); } void TransformEffect::gizmo_draw(double, GLTextureCoords& coords) { diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 2da9aaf27..adfc3a510 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -248,6 +248,8 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { m->out = attr.value().toLong(); } else if (attr.name() == "speed") { m->speed = attr.value().toDouble(); + } else if (attr.name() == "alphapremul") { + m->alpha_is_premultiplied = (attr.value() == "1"); } } diff --git a/panels/project.cpp b/panels/project.cpp index fb6deffb8..fac48f0c1 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -83,67 +83,67 @@ Project::Project(QWidget *parent) : toolbar->setSpacing(0); toolbar_widget->setLayout(toolbar); - QPushButton* toolbar_new = new QPushButton(toolbar_widget); - QIcon icon1; - icon1.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); - icon1.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_new->setIcon(icon1); + QPushButton* toolbar_new = new QPushButton(toolbar_widget); + QIcon icon1; + icon1.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); + icon1.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_new->setIcon(icon1); toolbar_new->setToolTip("New"); connect(toolbar_new, SIGNAL(clicked(bool)), this, SLOT(make_new_menu())); toolbar->addWidget(toolbar_new); QPushButton* toolbar_open = new QPushButton(toolbar_widget); - QIcon icon2; - icon2.addFile(QStringLiteral(":/icons/open.png"), QSize(), QIcon::Normal, QIcon::On); - icon2.addFile(QStringLiteral(":/icons/open-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_open->setIcon(icon2); + QIcon icon2; + icon2.addFile(QStringLiteral(":/icons/open.png"), QSize(), QIcon::Normal, QIcon::On); + icon2.addFile(QStringLiteral(":/icons/open-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_open->setIcon(icon2); toolbar_open->setToolTip("Open Project"); connect(toolbar_open, SIGNAL(clicked(bool)), mainWindow, SLOT(open_project())); toolbar->addWidget(toolbar_open); QPushButton* toolbar_save = new QPushButton(toolbar_widget); - QIcon icon3; - icon3.addFile(QStringLiteral(":/icons/save.png"), QSize(), QIcon::Normal, QIcon::On); - icon3.addFile(QStringLiteral(":/icons/save-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_save->setIcon(icon3); + QIcon icon3; + icon3.addFile(QStringLiteral(":/icons/save.png"), QSize(), QIcon::Normal, QIcon::On); + icon3.addFile(QStringLiteral(":/icons/save-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_save->setIcon(icon3); toolbar_save->setToolTip("Save Project"); connect(toolbar_save, SIGNAL(clicked(bool)), mainWindow, SLOT(save_project())); toolbar->addWidget(toolbar_save); QPushButton* toolbar_undo = new QPushButton(toolbar_widget); - QIcon icon4; - icon4.addFile(QStringLiteral(":/icons/undo.png"), QSize(), QIcon::Normal, QIcon::On); - icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_undo->setIcon(icon4); + QIcon icon4; + icon4.addFile(QStringLiteral(":/icons/undo.png"), QSize(), QIcon::Normal, QIcon::On); + icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_undo->setIcon(icon4); toolbar_undo->setToolTip("Undo"); connect(toolbar_undo, SIGNAL(clicked(bool)), mainWindow, SLOT(undo())); toolbar->addWidget(toolbar_undo); QPushButton* toolbar_redo = new QPushButton(toolbar_widget); - QIcon icon5; - icon5.addFile(QStringLiteral(":/icons/redo.png"), QSize(), QIcon::Normal, QIcon::On); - icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_redo->setIcon(icon5); + QIcon icon5; + icon5.addFile(QStringLiteral(":/icons/redo.png"), QSize(), QIcon::Normal, QIcon::On); + icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_redo->setIcon(icon5); toolbar_redo->setToolTip("Redo"); connect(toolbar_redo, SIGNAL(clicked(bool)), mainWindow, SLOT(redo())); toolbar->addWidget(toolbar_redo); toolbar->addStretch(); - QPushButton* toolbar_tree_view = new QPushButton(toolbar_widget); - QIcon icon6; - icon6.addFile(QStringLiteral(":/icons/treeview.png"), QSize(), QIcon::Normal, QIcon::On); - icon6.addFile(QStringLiteral(":/icons/treeview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_tree_view->setIcon(icon6); - toolbar_tree_view->setToolTip("Tree View"); - connect(toolbar_tree_view, SIGNAL(clicked(bool)), this, SLOT(set_tree_view())); - toolbar->addWidget(toolbar_tree_view); + QPushButton* toolbar_tree_view = new QPushButton(toolbar_widget); + QIcon icon6; + icon6.addFile(QStringLiteral(":/icons/treeview.png"), QSize(), QIcon::Normal, QIcon::On); + icon6.addFile(QStringLiteral(":/icons/treeview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_tree_view->setIcon(icon6); + toolbar_tree_view->setToolTip("Tree View"); + connect(toolbar_tree_view, SIGNAL(clicked(bool)), this, SLOT(set_tree_view())); + toolbar->addWidget(toolbar_tree_view); QPushButton* toolbar_icon_view = new QPushButton(toolbar_widget); - QIcon icon7; - icon7.addFile(QStringLiteral(":/icons/iconview.png"), QSize(), QIcon::Normal, QIcon::On); - icon7.addFile(QStringLiteral(":/icons/iconview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); - toolbar_icon_view->setIcon(icon7); + QIcon icon7; + icon7.addFile(QStringLiteral(":/icons/iconview.png"), QSize(), QIcon::Normal, QIcon::On); + icon7.addFile(QStringLiteral(":/icons/iconview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); + toolbar_icon_view->setIcon(icon7); toolbar_icon_view->setToolTip("Icon View"); connect(toolbar_icon_view, SIGNAL(clicked(bool)), this, SLOT(set_icon_view())); toolbar->addWidget(toolbar_icon_view); @@ -953,6 +953,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("in", QString::number(f->in)); stream.writeAttribute("out", QString::number(f->out)); stream.writeAttribute("speed", QString::number(f->speed)); + stream.writeAttribute("alphapremul", QString::number(f->alpha_is_premultiplied)); for (int j=0;jvideo_tracks.size();j++) { const FootageStream& ms = f->video_tracks.at(j); stream.writeStartElement("video"); diff --git a/panels/viewer.h b/panels/viewer.h index 7181d426d..db95d90ac 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -37,7 +37,6 @@ public: void update_playhead_timecode(long p); void update_end_timecode(); void update_header_zoom(); - void update_viewer(); void clear_in(); void clear_out(); void clear_inout_point(); @@ -88,6 +87,7 @@ public slots: void go_to_out(); void go_to_end(); void close_media(); + void update_viewer(); private slots: void update_playhead(); diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 7d7f294ca..7e096fe92 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -766,16 +766,26 @@ void open_clip_worker(Clip* clip) { AVFilterContext* last_filter = clip->buffersrc_ctx; + char filter_args[100]; + if (ms->video_interlacing != VIDEO_PROGRESSIVE) { AVFilterContext* yadif_filter; - char yadif_args[100]; - snprintf(yadif_args, sizeof(yadif_args), "mode=3:parity=%d", ((ms->video_interlacing == VIDEO_TOP_FIELD_FIRST) ? 0 : 1)); // there's a CUDA version if we start using nvdec/nvenc - avfilter_graph_create_filter(&yadif_filter, avfilter_get_by_name("yadif"), "yadif", yadif_args, nullptr, clip->filter_graph); + snprintf(filter_args, sizeof(filter_args), "mode=3:parity=%d", ((ms->video_interlacing == VIDEO_TOP_FIELD_FIRST) ? 0 : 1)); // there's a CUDA version if we start using nvdec/nvenc + avfilter_graph_create_filter(&yadif_filter, avfilter_get_by_name("yadif"), "yadif", filter_args, nullptr, clip->filter_graph); avfilter_link(last_filter, 0, yadif_filter, 0); last_filter = yadif_filter; } + if (!clip->media->to_footage()->alpha_is_premultiplied) { + AVFilterContext* premultiply_filter; + snprintf(filter_args, sizeof(filter_args), "inplace=1"); + avfilter_graph_create_filter(&premultiply_filter, avfilter_get_by_name("premultiply"), "premultiply", filter_args, nullptr, clip->filter_graph); + + avfilter_link(last_filter, 0, premultiply_filter, 0); + last_filter = premultiply_filter; + } + /* stabilization code */ /*bool stabilize = false; if (stabilize) { @@ -799,11 +809,10 @@ void open_clip_worker(Clip* clip) { clip->pix_fmt = avcodec_find_best_pix_fmt_of_list(valid_pix_fmts, static_cast(clip->stream->codecpar->format), 1, nullptr); const char* chosen_format = av_get_pix_fmt_name(static_cast(clip->pix_fmt)); - char format_args[100]; - snprintf(format_args, sizeof(format_args), "pix_fmts=%s", chosen_format); + snprintf(filter_args, sizeof(filter_args), "pix_fmts=%s", chosen_format); AVFilterContext* format_conv; - avfilter_graph_create_filter(&format_conv, avfilter_get_by_name("format"), "fmt", format_args, nullptr, clip->filter_graph); + avfilter_graph_create_filter(&format_conv, avfilter_get_by_name("format"), "fmt", filter_args, nullptr, clip->filter_graph); avfilter_link(last_filter, 0, format_conv, 0); avfilter_link(format_conv, 0, clip->buffersink_ctx, 0); diff --git a/project/effect.cpp b/project/effect.cpp index 650935174..f535b4ff4 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -29,9 +29,7 @@ #include "effects/internal/paneffect.h" #include "effects/internal/shakeeffect.h" #include "effects/internal/cornerpineffect.h" -#ifndef NOVST #include "effects/internal/vsthost.h" -#endif #include "effects/internal/fillleftrighteffect.h" #include "effects/internal/frei0reffect.h" @@ -754,7 +752,7 @@ GLuint Effect::process_superimpose(double timecode) { int height = parent_clip->getHeight(); if (width != img.width() || height != img.height()) { - img = QImage(width, height, QImage::Format_RGBA8888); + img = QImage(width, height, QImage::Format_RGBA8888_Premultiplied); recreate_texture = true; } diff --git a/project/footage.cpp b/project/footage.cpp index 2f3651017..c9dbd83f6 100644 --- a/project/footage.cpp +++ b/project/footage.cpp @@ -11,7 +11,15 @@ extern "C" { #include "project/clip.h" -Footage::Footage() : ready(false), preview_gen(nullptr), invalid(false), in(0), out(0), speed(1.0) { +Footage::Footage() : + ready(false), + preview_gen(nullptr), + invalid(false), + in(0), + out(0), + speed(1.0), + alpha_is_premultiplied(false) +{ ready_lock.lock(); } diff --git a/project/footage.h b/project/footage.h index d6408857b..4c12e7edc 100644 --- a/project/footage.h +++ b/project/footage.h @@ -52,6 +52,7 @@ struct Footage { bool ready; bool invalid; double speed; + bool alpha_is_premultiplied; PreviewGenerator* preview_gen; QMutex ready_lock; diff --git a/project/undo.cpp b/project/undo.cpp index d16b481c4..2fbf5218b 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -787,7 +787,7 @@ void SetAutoscaleAction::undo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } - panel_sequence_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->frame_update(); mainWindow->setWindowModified(old_project_changed); } @@ -795,7 +795,7 @@ void SetAutoscaleAction::redo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } - panel_sequence_viewer->viewer_widget->update(); + panel_sequence_viewer->viewer_widget->frame_update(); mainWindow->setWindowModified(true); } @@ -1272,3 +1272,11 @@ void RefreshClips::redo() { } } } + +void UpdateViewer::undo() { + redo(); +} + +void UpdateViewer::redo() { + panel_sequence_viewer->viewer_widget->frame_update(); +} diff --git a/project/undo.h b/project/undo.h index c4fbf7619..9f94ee3a4 100644 --- a/project/undo.h +++ b/project/undo.h @@ -644,4 +644,10 @@ private: Media* media; }; +class UpdateViewer : public QUndoCommand { +public: + void undo(); + void redo(); +}; + #endif // UNDO_H diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index c480a6f69..bf1266948 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -28,17 +28,16 @@ extern "C" { #include } -GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { +GLuint draw_clip(QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { glPushMatrix(); glLoadIdentity(); glOrtho(0, 1, 0, 1, -1, 1); - GLint current_fbo = 0; - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - fbo->bind(); - if (clear) glClear(GL_COLOR_BUFFER_BIT); + if (clear) { + glClear(GL_COLOR_BUFFER_BIT); + } glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); @@ -53,14 +52,11 @@ GLuint draw_clip(QOpenGLContext* ctx, QOpenGLFramebufferObject* fbo, GLuint text glEnd(); glBindTexture(GL_TEXTURE_2D, 0); - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - glPopMatrix(); return fbo->texture(); } -void process_effect(QOpenGLContext* ctx, - Clip* c, +void process_effect(Clip* c, Effect* e, double timecode, GLTextureCoords& coords, @@ -72,11 +68,12 @@ void process_effect(QOpenGLContext* ctx, if (e->enable_coords) { e->process_coords(timecode, coords, data); } - if ((e->enable_shader && shaders_are_enabled) || e->enable_superimpose) { + bool can_process_shaders = (e->enable_shader && shaders_are_enabled); + if (can_process_shaders || e->enable_superimpose) { e->startEffect(); - if ((e->enable_shader && shaders_are_enabled) && e->is_glsl_linked()) { + if (can_process_shaders && e->is_glsl_linked()) { e->process_shader(timecode, coords); - composite_texture = draw_clip(ctx, c->fbo[fbo_switcher], composite_texture, true); + composite_texture = draw_clip(c->fbo[fbo_switcher], composite_texture, true); fbo_switcher = !fbo_switcher; } if (e->enable_superimpose) { @@ -85,7 +82,18 @@ void process_effect(QOpenGLContext* ctx, qWarning() << "Superimpose texture was nullptr, retrying..."; texture_failed = true; } else { - composite_texture = draw_clip(ctx, c->fbo[!fbo_switcher], superimpose_texture, false); + if (composite_texture == 0) { + // if there is no previous texture, just return the superimposes texture + composite_texture = superimpose_texture; + } else { + // if the source texture is not already a framebuffer texture, + // we'll need to make it one before drawing a superimpose effect on it + if (composite_texture != c->fbo[0]->texture() && composite_texture != c->fbo[1]->texture()) { + draw_clip(c->fbo[!fbo_switcher], composite_texture, true); + } + + composite_texture = draw_clip(c->fbo[!fbo_switcher], superimpose_texture, false); + } } } e->endEffect(); @@ -94,10 +102,7 @@ void process_effect(QOpenGLContext* ctx, } GLuint compose_sequence(ComposeSequenceParams ¶ms) { - GLint current_fbo = 0; - if (params.video) { - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo); - } + GLuint final_fbo = params.main_buffer; Sequence* s = params.seq; long playhead = s->playhead; @@ -112,7 +117,7 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { if (params.video && params.nests.last()->fbo != nullptr) { params.nests.last()->fbo[0]->bind(); glClear(GL_COLOR_BUFFER_BIT); - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); + final_fbo = params.nests.last()->fbo[0]->handle(); } } @@ -120,36 +125,58 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { QVector current_clips; + // loop through clips, find currently active, and sort by track for (int i=0;iclips.size();i++) { + Clip* c = s->clips.at(i); - // if clip starts within one second and/or hasn't finished yet if (c != nullptr) { + + // if clip is video and we're processing video if ((c->track < 0) == params.video) { + bool clip_is_active = false; + // is the clip a "footage" clip? if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { Footage* m = c->media->to_footage(); + + // does the clip have a valid media source? if (!m->invalid && !(c->track >= 0 && !is_audio_device_set())) { + + // is the media process and ready? if (m->ready) { const FootageStream* ms = m->get_stream_from_file_index(c->track < 0, c->media_stream); + + // does the media have a valid media stream source and is it active? if (ms != nullptr && is_clip_active(c, playhead)) { - // if thread is already working, we don't want to touch this, - // but we also don't want to hang the UI thread + + // open if not open if (!c->open) { open_clip(c, !params.rendering); } + clip_is_active = true; + + // increment audio track count if (c->track >= 0) audio_track_count++; + } else if (c->finished_opening) { + + // close the clip if it isn't active anymore close_clip(c, false); + } } else { - //qWarning() << "Media '" + m->name + "' was not ready, retrying..."; + + // media wasn't ready, schedule a redraw params.texture_failed = true; + } } } else { + // if the clip is a nested sequence or null clip, just open it + if (is_clip_active(c, playhead)) { if (!c->open) open_clip(c, !params.rendering); clip_is_active = true; @@ -157,15 +184,26 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { close_clip(c, false); } } + + // if the clip is active, added it to "current_clips", sorted by track if (clip_is_active) { bool added = false; - for (int j=0;jtrack < c->track) { - current_clips.insert(j, c); - added = true; - break; + + // track sorting is only necessary for video clips + // audio clips are mixed equally, so we skip sorting for those + if (params.video) { + + // insertion sort by track + for (int j=0;jtrack < c->track) { + current_clips.insert(j, c); + added = true; + break; + } } + } + if (!added) { current_clips.append(c); } @@ -174,90 +212,98 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { } } - int half_width = s->width/2; - int half_height = s->height/2; - if (params.video) { + // set default coordinates based on the sequence, with 0 in the direct center glPushMatrix(); glLoadIdentity(); + + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + + int half_width = s->width/2; + int half_height = s->height/2; glOrtho(-half_width, half_width, -half_height, half_height, -1, 10); } + // loop through current clips for (int i=0;imedia != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->finished_opening) { qWarning() << "Tried to display clip" << i << "but it's closed"; params.texture_failed = true; } else { + // if clip is a video clip if (c->track < 0) { + // reset OpenGL to full color glColor4f(1.0, 1.0, 1.0, 1.0); + // textureID variable contains texture to be drawn on screen at the end GLuint textureID = 0; + + // store video source dimensions int video_width = c->getWidth(); int video_height = c->getHeight(); - if (c->media != nullptr) { - switch (c->media->get_type()) { - case MEDIA_TYPE_FOOTAGE: - // set up opengl texture - if (c->texture == nullptr) { - c->texture = new QOpenGLTexture(QOpenGLTexture::Target2D); - c->texture->setSize(c->stream->codecpar->width, c->stream->codecpar->height); - c->texture->setFormat(get_gl_tex_fmt_from_av(c->pix_fmt)); - c->texture->setMipLevels(c->texture->maximumMipLevels()); - c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); - c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); - } - get_clip_frame(c, qMax(playhead, c->timeline_in), params.texture_failed); - textureID = c->texture->textureId(); - break; - case MEDIA_TYPE_SEQUENCE: - textureID = -1; - break; + // if media is footage + if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { + + if (c->texture == nullptr) { + // opengl texture doesn't exist yet, create it + + c->texture = new QOpenGLTexture(QOpenGLTexture::Target2D); + c->texture->setSize(c->stream->codecpar->width, c->stream->codecpar->height); + c->texture->setFormat(get_gl_tex_fmt_from_av(c->pix_fmt)); + c->texture->setMipLevels(c->texture->maximumMipLevels()); + c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); + c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); + } + + // retrieve video frame from cache and store it in c->texture + get_clip_frame(c, qMax(playhead, c->timeline_in), params.texture_failed); + + // retrieve ID from c->texture + textureID = c->texture->textureId(); + + if (textureID == 0) { + qWarning() << "Failed to create texture"; + return 0; } } - if (textureID == 0 && c->media != nullptr) { - qWarning() << "Texture hasn't been created yet"; - params.texture_failed = true; - } else if (playhead >= c->get_timeline_in_with_transition()) { + // prepare framebuffers for backend drawing operations + if (c->fbo == nullptr) { + c->fbo = new QOpenGLFramebufferObject* [2]; + c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); + c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); + } + + // if clip should actually be shown on screen in this frame + if (playhead >= c->get_timeline_in_with_transition()) { glPushMatrix(); - // start preparing cache - if (c->fbo == nullptr) { - c->fbo = new QOpenGLFramebufferObject* [2]; - c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); - c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - } - + // simple bool for switching between the two framebuffers bool fbo_switcher = false; glViewport(0, 0, video_width, video_height); - GLuint composite_texture; + if (c->media != nullptr && c->media->get_type()== MEDIA_TYPE_SEQUENCE) { + // for a nested sequence, run this function again on that sequence and retrieve the texture - if (c->media == nullptr) { - c->fbo[fbo_switcher]->bind(); - glClear(GL_COLOR_BUFFER_BIT); - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - composite_texture = c->fbo[fbo_switcher]->texture(); - } else { - // for nested sequences - if (c->media->get_type()== MEDIA_TYPE_SEQUENCE) { - params.nests.append(c); - textureID = compose_sequence(params); - params.nests.removeLast(); - fbo_switcher = true; - } + // add nested sequence to nest list + params.nests.append(c); - composite_texture = draw_clip(params.ctx, c->fbo[fbo_switcher], textureID, true); + // compose sequence + textureID = compose_sequence(params); + + // remove sequence from nest list + params.nests.removeLast(); + + // compose_sequence() would have written to this clip's fbo[0], so we switch to fbo[1] + fbo_switcher = true; } - fbo_switcher = !fbo_switcher; - - // set up default coords + // set up default coordinates for drawing the clip GLTextureCoords coords; coords.grid_size = 1; coords.vertexTopLeftX = coords.vertexBottomLeftX = -video_width/2; @@ -268,8 +314,10 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { coords.textureTopLeftY = coords.textureTopRightY = coords.textureTopLeftX = coords.textureBottomLeftX = 0.0; coords.textureBottomLeftY = coords.textureBottomRightY = coords.textureTopRightX = coords.textureBottomRightX = 1.0; coords.textureTopLeftQ = coords.textureTopRightQ = coords.textureTopLeftQ = coords.textureBottomLeftQ = 1; + coords.blendmode = BLEND_MODE_NORMAL; + coords.opacity = 1.0; - // set up autoscale + // if auto-scale is enabled, auto-scale the clip if (c->autoscale && (video_width != s->width && video_height != s->height)) { float width_multiplier = float(s->width) / float(video_width); float height_multiplier = float(s->height) / float(video_height); @@ -277,85 +325,94 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { glScalef(scale_multiplier, scale_multiplier, 1); } - // EFFECT CODE START + // == EFFECT CODE START == + + // get current sequence time in seconds (used for effects) double timecode = get_timecode(c, playhead); + // set up variables for gizmos later Effect* first_gizmo_effect = nullptr; Effect* selected_effect = nullptr; + // run through all of the clip's effects for (int j=0;jeffects.size();j++) { Effect* e = c->effects.at(j); - process_effect(params.ctx, c, e, timecode, coords, composite_texture, fbo_switcher, params.texture_failed, TA_NO_TRANSITION); + process_effect(c, e, timecode, coords, textureID, fbo_switcher, params.texture_failed, TA_NO_TRANSITION); + // retrieve gizmo data from effect if (e->are_gizmos_enabled()) { if (first_gizmo_effect == nullptr) first_gizmo_effect = e; if (e->container->selected) selected_effect = e; } } + // using gizmo data, set definitive gizmo if (selected_effect != nullptr) { (*params.gizmos) = selected_effect; } else if (is_clip_selected(c, true)) { (*params.gizmos) = first_gizmo_effect; } + // if the clip has an opening transition, process that now if (c->get_opening_transition() != nullptr) { int transition_progress = playhead - c->get_timeline_in_with_transition(); if (transition_progress < c->get_opening_transition()->get_length()) { - process_effect(params.ctx, c, c->get_opening_transition(), (double)transition_progress/(double)c->get_opening_transition()->get_length(), coords, composite_texture, fbo_switcher, params.texture_failed, TA_OPENING_TRANSITION); + process_effect(c, c->get_opening_transition(), double(transition_progress)/double(c->get_opening_transition()->get_length()), coords, textureID, fbo_switcher, params.texture_failed, TA_OPENING_TRANSITION); } } + // if the clip has a closing transition, process that now if (c->get_closing_transition() != nullptr) { int transition_progress = playhead - (c->get_timeline_out_with_transition() - c->get_closing_transition()->get_length()); if (transition_progress >= 0 && transition_progress < c->get_closing_transition()->get_length()) { - process_effect(params.ctx, c, c->get_closing_transition(), (double)transition_progress/(double)c->get_closing_transition()->get_length(), coords, composite_texture, fbo_switcher, params.texture_failed, TA_CLOSING_TRANSITION); + process_effect(c, c->get_closing_transition(), double(transition_progress)/double(c->get_closing_transition()->get_length()), coords, textureID, fbo_switcher, params.texture_failed, TA_CLOSING_TRANSITION); } } - // EFFECT CODE END - if (!params.nests.isEmpty()) { - params.nests.last()->fbo[0]->bind(); - } + // == EFFECT CODE END == + + // == START FINAL DRAW ON SEQUENCE BUFFER == + + // bind framebuffer + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); + + // set viewport to sequence size glViewport(0, 0, s->width, s->height); - glBindTexture(GL_TEXTURE_2D, composite_texture); + // bind final texture + glBindTexture(GL_TEXTURE_2D, textureID); + // set texture filter to bilinear glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // get current color attachment from framebuffer - GLint texture_id; - params.ctx->functions()->glGetFramebufferAttachmentParameteriv(GL_TEXTURE_2D, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &texture_id); - + // bind and configure blending mode shader params.blend_mode_program->bind(); params.blend_mode_program->setUniformValue("blend_mode", coords.blendmode); params.blend_mode_program->setUniformValue("opacity", coords.opacity); -// blend_mode_program->setUniformValue("background", texture_id); + // draw clip on screen glBegin(GL_QUADS); if (coords.grid_size <= 1) { - float z = 0.0f; - glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left - glVertex3f(coords.vertexTopLeftX, coords.vertexTopLeftY, z); // top left + glVertex2f(coords.vertexTopLeftX, coords.vertexTopLeftY); // top left glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right - glVertex3f(coords.vertexTopRightX, coords.vertexTopRightY, z); // top right + glVertex2f(coords.vertexTopRightX, coords.vertexTopRightY); // top right glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right - glVertex3f(coords.vertexBottomRightX, coords.vertexBottomRightY, z); // bottom right + glVertex2f(coords.vertexBottomRightX, coords.vertexBottomRightY); // bottom right glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left - glVertex3f(coords.vertexBottomLeftX, coords.vertexBottomLeftY, z); // bottom left + glVertex2f(coords.vertexBottomLeftX, coords.vertexBottomLeftY); // bottom left } else { float rows = coords.grid_size; float cols = coords.grid_size; - for (float k=0;krelease(); - glBindTexture(GL_TEXTURE_2D, 0); // unbind texture + // unbind texture + glBindTexture(GL_TEXTURE_2D, 0); + + // unbind framebuffer + params.ctx->functions()->glBindFramebuffer(GL_TEXTURE_2D, 0); + + // == END FINAL DRAW ON SEQUENCE BUFFER == // prepare gizmos if ((*params.gizmos) != nullptr @@ -394,10 +458,6 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { (*params.gizmos)->gizmo_world_to_screen(); // convert gizmo coords to screen coords } - if (!params.nests.isEmpty()) { - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo); - } - glPopMatrix(); } } else { diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 52698d3f8..3d452f100 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -22,6 +22,7 @@ struct ComposeSequenceParams { bool rendering; int playback_speed; QOpenGLShaderProgram* blend_mode_program; + GLuint main_buffer; GLuint backend_buffer1; GLuint backend_attachment1; GLuint backend_buffer2; diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index 601f40c69..d7f2b4f72 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -10,8 +10,8 @@ #include "project/sequence.h" RenderThread::RenderThread() : - frameBuffer(0), - texColorBuffer(0), + front_buffer(0), + front_texture(0), gizmos(nullptr), share_ctx(nullptr), ctx(nullptr), @@ -42,39 +42,70 @@ void RenderThread::run() { } queued = false; - if (share_ctx != nullptr) { if (ctx != nullptr) { ctx->makeCurrent(&surface); // gen fbo - if (frameBuffer == 0) { + if (front_buffer == 0) { + // delete any existing framebuffers delete_fbo(); - ctx->functions()->glGenFramebuffers(1, &frameBuffer); + + // create framebuffers + ctx->functions()->glGenFramebuffers(1, &front_buffer); + ctx->functions()->glGenFramebuffers(1, &back_buffer_1); + ctx->functions()->glGenFramebuffers(1, &back_buffer_2); } - // bind - ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer); // gen texture - if (texColorBuffer == 0 || tex_width != seq->width || tex_height != seq->height) { - delete_texture(); - glGenTextures(1, &texColorBuffer); - glBindTexture(GL_TEXTURE_2D, texColorBuffer); - glTexImage2D( - GL_TEXTURE_2D, 0, GL_RGB, seq->width, seq->height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr - ); + if (front_texture == 0 || tex_width != seq->width || tex_height != seq->height) { + // cache texture size tex_width = seq->width; tex_height = seq->height; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - ctx->functions()->glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texColorBuffer, 0 - ); - glBindTexture(GL_TEXTURE_2D, 0); + + // delete any existing textures + delete_texture(); + + // create texture + glGenTextures(1, &front_texture); + glGenTextures(1, &back_buffer_1); + glGenTextures(1, &back_buffer_2); + + GLuint fbos[3] = {front_buffer, back_buffer_1, back_buffer_2}; + GLuint textures[3] = {front_buffer, back_buffer_1, back_buffer_2}; + + for (int i=0;i<3;i++) { + // bind framebuffer for attaching + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbos[i]); + + // bind texture + glBindTexture(GL_TEXTURE_2D, textures[i]); + + // allocate storage for texture + glTexImage2D( + GL_TEXTURE_2D, 0, GL_RGB, seq->width, seq->height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr + ); + + // set texture filtering to bilinear + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // attach texture to framebuffer + ctx->functions()->glFramebufferTexture2D( + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[i], 0 + ); + + // release texture + glBindTexture(GL_TEXTURE_2D, 0); + + // release framebuffer + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + } } if (blend_mode_program == nullptr) { + // create shader program to make blending modes work delete_shader_program(); blend_mode_program = new QOpenGLShaderProgram(); blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "C:/msys64/home/Matt/olive/effects/common.vert"); @@ -82,15 +113,17 @@ void RenderThread::run() { blend_mode_program->link(); } - // draw + // bind framebuffer for drawing + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, front_buffer); + + // draw frame paint(); // flush changes -// glFlush(); - glFinish(); + ctx->functions()->glFinish(); // release - ctx->functions()->glBindFramebuffer(GL_FRAMEBUFFER, 0); + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); emit ready(); } @@ -128,6 +161,11 @@ void RenderThread::paint() { params.rendering = false; params.playback_speed = 1; params.blend_mode_program = blend_mode_program; + params.backend_buffer1 = back_buffer_1; + params.backend_buffer2 = back_buffer_2; + params.backend_attachment1 = back_texture_1; + params.backend_attachment2 = back_texture_2; + params.main_buffer = front_buffer; compose_sequence(params); texture_failed = params.texture_failed; @@ -137,7 +175,7 @@ void RenderThread::paint() { // texture failed, try again queued = true; } else { - ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer); + ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); QImage img(tex_width, tex_height, QImage::Format_RGBA8888); glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); img.save(save_fn); @@ -147,7 +185,7 @@ void RenderThread::paint() { } if (pixel_buffer != nullptr) { - ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffer); + ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, pixel_buffer); ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); pixel_buffer = nullptr; @@ -193,20 +231,23 @@ void RenderThread::cancel() { } void RenderThread::delete_texture() { - if (texColorBuffer > 0) { - ctx->functions()->glFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0 - ); - glDeleteTextures(1, &texColorBuffer); + if (front_texture > 0) { + GLuint tex[3] = {front_texture, back_texture_1, back_texture_2}; + glDeleteTextures(3, tex); } - texColorBuffer = 0; + front_texture = 0; + back_texture_1 = 0; + back_texture_2 = 0; } void RenderThread::delete_fbo() { - if (frameBuffer > 0) { - ctx->functions()->glDeleteFramebuffers(1, &frameBuffer); + if (front_buffer > 0) { + GLuint fbos[3] = {front_buffer, back_buffer_1, back_buffer_2}; + ctx->functions()->glDeleteFramebuffers(3, fbos); } - frameBuffer = 0; + front_buffer = 0; + back_buffer_1 = 0; + back_buffer_2 = 0; } void RenderThread::delete_shader_program() { diff --git a/ui/renderthread.h b/ui/renderthread.h index a73813888..6ec304d31 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -1,4 +1,4 @@ -#ifndef RENDERTHREAD_H +#ifndef RENDERTHREAD_H #define RENDERTHREAD_H #include @@ -19,8 +19,8 @@ public: ~RenderThread(); void run(); QMutex mutex; - GLuint frameBuffer; - GLuint texColorBuffer; + GLuint front_buffer; + GLuint front_texture; Effect* gizmos; void paint(); void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int idivider = 0); @@ -43,6 +43,12 @@ private: QOpenGLContext* share_ctx; QOpenGLContext* ctx; QOpenGLShaderProgram* blend_mode_program; + + GLuint back_buffer_1; + GLuint back_buffer_2; + GLuint back_texture_1; + GLuint back_texture_2; + Sequence* seq; int divider; int tex_width; diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 196968d58..648199df2 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -562,7 +562,7 @@ void ViewerWidget::paintGL() { // draw texture from render thread - glBindTexture(GL_TEXTURE_2D, renderer->texColorBuffer); + glBindTexture(GL_TEXTURE_2D, renderer->front_texture); glBegin(GL_QUADS); @@ -592,7 +592,7 @@ void ViewerWidget::paintGL() { glDisable(GL_TEXTURE_2D); if (window != nullptr && window->isVisible()) { - window->set_texture(renderer->texColorBuffer, double(viewer->seq->width)/double(viewer->seq->height), &renderer->mutex); + window->set_texture(renderer->front_texture, double(viewer->seq->width)/double(viewer->seq->height), &renderer->mutex); } renderer->mutex.unlock(); From 7a436ef51ff24b9725419dd61709e093cbbfbb23 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 26 Jan 2019 23:34:58 +1100 Subject: [PATCH 010/202] further progress on better blending --- effects/chromakey.frag | 6 +- effects/{ => internal}/blending.frag | 4 +- effects/internal/common.vert | 8 ++ effects/{ => internal}/cornerpin.frag | 0 effects/{ => internal}/cornerpin.vert | 0 effects/internal/cornerpineffect.cpp | 10 +- effects/{ => internal}/dropshadow.frag | 5 +- effects/internal/internalshaders.qrc | 10 ++ effects/internal/premultiply.frag | 10 ++ effects/internal/texteffect.cpp | 131 +++++++++--------- olive.pro | 3 +- playback/cacher.cpp | 11 +- playback/playback.cpp | 10 +- project/effect.cpp | 40 +++--- project/effectloaders.cpp | 4 +- project/footage.h | 8 +- ui/renderfunctions.cpp | 184 ++++++++++++++----------- ui/renderfunctions.h | 1 + ui/renderthread.cpp | 14 +- ui/renderthread.h | 1 + 20 files changed, 271 insertions(+), 189 deletions(-) rename effects/{ => internal}/blending.frag (88%) create mode 100644 effects/internal/common.vert rename effects/{ => internal}/cornerpin.frag (100%) rename effects/{ => internal}/cornerpin.vert (100%) rename effects/{ => internal}/dropshadow.frag (95%) create mode 100644 effects/internal/internalshaders.qrc create mode 100644 effects/internal/premultiply.frag diff --git a/effects/chromakey.frag b/effects/chromakey.frag index a94b03f79..4f57d8b1e 100644 --- a/effects/chromakey.frag +++ b/effects/chromakey.frag @@ -47,11 +47,15 @@ void main(void) { float mask = colorclose(cb, cr, cb_key, cr_key, (tola/100.0), (tolb/100.0)); if (mode == 0) { // composite - float submask = 1.0-mask; + //float submask = 1.0-mask; + float submask = 0.0; texture_color.r = max(texture_color.r - submask*key_color.r, 0.0) + submask; texture_color.g = max(texture_color.g - submask*key_color.g, 0.0) + submask; texture_color.b = max(texture_color.b - submask*key_color.b, 0.0) + submask; texture_color.a *= mask; + + // premultiply + texture_color.rgb *= texture_color.a; } else if (mode == 1) { // alpha texture_color.rgb = vec3(mask); } else if (mode == 2) { // original diff --git a/effects/blending.frag b/effects/internal/blending.frag similarity index 88% rename from effects/blending.frag rename to effects/internal/blending.frag index b418137b5..3507705c5 100644 --- a/effects/blending.frag +++ b/effects/internal/blending.frag @@ -32,6 +32,6 @@ uniform sampler2D texture; varying vec2 vTexCoord; void main(void) { - gl_FragColor = texture2D(background, vTexCoord); - // gl_FragColor = texture2D(texture, vTexCoord)*2.0; + // gl_FragColor = texture2D(background, vTexCoord); + gl_FragColor = texture2D(texture, vTexCoord); } \ No newline at end of file diff --git a/effects/internal/common.vert b/effects/internal/common.vert new file mode 100644 index 000000000..2d088fa2f --- /dev/null +++ b/effects/internal/common.vert @@ -0,0 +1,8 @@ +#version 110 + +varying vec2 vTexCoord; + +void main() { + vTexCoord = gl_MultiTexCoord0.xy; + gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; +} \ No newline at end of file diff --git a/effects/cornerpin.frag b/effects/internal/cornerpin.frag similarity index 100% rename from effects/cornerpin.frag rename to effects/internal/cornerpin.frag diff --git a/effects/cornerpin.vert b/effects/internal/cornerpin.vert similarity index 100% rename from effects/cornerpin.vert rename to effects/internal/cornerpin.vert diff --git a/effects/internal/cornerpineffect.cpp b/effects/internal/cornerpineffect.cpp index c48526601..11730619e 100644 --- a/effects/internal/cornerpineffect.cpp +++ b/effects/internal/cornerpineffect.cpp @@ -8,23 +8,23 @@ CornerPinEffect::CornerPinEffect(Clip *c, const EffectMeta *em) : Effect(c, em) enable_coords = true; enable_shader = true; - EffectRow* top_left = add_row(tr("Top Left")); + EffectRow* top_left = add_row(tr("Top Left")); top_left_x = top_left->add_field(EFFECT_FIELD_DOUBLE, "topleftx"); top_left_y = top_left->add_field(EFFECT_FIELD_DOUBLE, "toplefty"); - EffectRow* top_right = add_row(tr("Top Right")); + EffectRow* top_right = add_row(tr("Top Right")); top_right_x = top_right->add_field(EFFECT_FIELD_DOUBLE, "toprightx"); top_right_y = top_right->add_field(EFFECT_FIELD_DOUBLE, "toprighty"); - EffectRow* bottom_left = add_row(tr("Bottom Left")); + EffectRow* bottom_left = add_row(tr("Bottom Left")); bottom_left_x = bottom_left->add_field(EFFECT_FIELD_DOUBLE, "bottomleftx"); bottom_left_y = bottom_left->add_field(EFFECT_FIELD_DOUBLE, "bottomlefty"); - EffectRow* bottom_right = add_row(tr("Bottom Right")); + EffectRow* bottom_right = add_row(tr("Bottom Right")); bottom_right_x = bottom_right->add_field(EFFECT_FIELD_DOUBLE, "bottomrightx"); bottom_right_y = bottom_right->add_field(EFFECT_FIELD_DOUBLE, "bottomrighty"); - perspective = add_row(tr("Perspective"))->add_field(EFFECT_FIELD_BOOL, "perspective"); + perspective = add_row(tr("Perspective"))->add_field(EFFECT_FIELD_BOOL, "perspective"); perspective->set_bool_value(true); top_left_gizmo = add_gizmo(GIZMO_TYPE_DOT); diff --git a/effects/dropshadow.frag b/effects/internal/dropshadow.frag similarity index 95% rename from effects/dropshadow.frag rename to effects/internal/dropshadow.frag index 1bed6e491..402c4c547 100644 --- a/effects/dropshadow.frag +++ b/effects/internal/dropshadow.frag @@ -13,6 +13,7 @@ uniform float shadowdistance; varying vec2 vTexCoord; void main(void) { + /* vec4 master_px = texture2D(image, vTexCoord); if (shadow == 1) { vec2 shadow_dist = vec2(shadowdistance)/resolution; @@ -39,5 +40,7 @@ void main(void) { gl_FragColor = composition; } else { gl_FragColor = master_px; - } + } + */ + gl_FragColor = texture2D(image, vTexCoord); } \ No newline at end of file diff --git a/effects/internal/internalshaders.qrc b/effects/internal/internalshaders.qrc new file mode 100644 index 000000000..39b1a3aee --- /dev/null +++ b/effects/internal/internalshaders.qrc @@ -0,0 +1,10 @@ + + + blending.frag + common.vert + cornerpin.frag + cornerpin.vert + premultiply.frag + dropshadow.frag + + diff --git a/effects/internal/premultiply.frag b/effects/internal/premultiply.frag new file mode 100644 index 000000000..bc16e5cb4 --- /dev/null +++ b/effects/internal/premultiply.frag @@ -0,0 +1,10 @@ +#version 110 + +uniform sampler2D tex; +varying vec2 vTexCoord; + +void main(void) { + vec4 c = texture2D(tex, vTexCoord); + c.rgb *= c.a; + gl_FragColor = c; +} \ No newline at end of file diff --git a/effects/internal/texteffect.cpp b/effects/internal/texteffect.cpp index afdbf2607..7f4c36940 100644 --- a/effects/internal/texteffect.cpp +++ b/effects/internal/texteffect.cpp @@ -94,67 +94,67 @@ TextEffect::TextEffect(Clip *c, const EffectMeta* em) : } void blurred2(QImage& result, const QRect& rect, int radius, bool alphaOnly = false) { - int tab[] = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 }; - int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius-1]; + int tab[] = { 14, 10, 8, 6, 5, 5, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2 }; + int alpha = (radius < 1) ? 16 : (radius > 17) ? 1 : tab[radius-1]; - int r1 = rect.top(); - int r2 = rect.bottom(); - int c1 = rect.left(); - int c2 = rect.right(); + int r1 = rect.top(); + int r2 = rect.bottom(); + int c1 = rect.left(); + int c2 = rect.right(); - int bpl = result.bytesPerLine(); - int rgba[4]; - unsigned char* p; + int bpl = result.bytesPerLine(); + int rgba[4]; + unsigned char* p; - int i1 = 0; - int i2 = 3; + int i1 = 0; + int i2 = 3; - if (alphaOnly) - i1 = i2 = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3); + if (alphaOnly) + i1 = i2 = (QSysInfo::ByteOrder == QSysInfo::BigEndian ? 0 : 3); - for (int col = c1; col <= c2; col++) { - p = result.scanLine(r1) + col * 4; - for (int i = i1; i <= i2; i++) - rgba[i] = p[i] << 4; + for (int col = c1; col <= c2; col++) { + p = result.scanLine(r1) + col * 4; + for (int i = i1; i <= i2; i++) + rgba[i] = p[i] << 4; - p += bpl; - for (int j = r1; j < r2; j++, p += bpl) - for (int i = i1; i <= i2; i++) - p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; - } + p += bpl; + for (int j = r1; j < r2; j++, p += bpl) + for (int i = i1; i <= i2; i++) + p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; + } - for (int row = r1; row <= r2; row++) { - p = result.scanLine(row) + c1 * 4; - for (int i = i1; i <= i2; i++) - rgba[i] = p[i] << 4; + for (int row = r1; row <= r2; row++) { + p = result.scanLine(row) + c1 * 4; + for (int i = i1; i <= i2; i++) + rgba[i] = p[i] << 4; - p += 4; - for (int j = c1; j < c2; j++, p += 4) - for (int i = i1; i <= i2; i++) - p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; - } + p += 4; + for (int j = c1; j < c2; j++, p += 4) + for (int i = i1; i <= i2; i++) + p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; + } - for (int col = c1; col <= c2; col++) { - p = result.scanLine(r2) + col * 4; - for (int i = i1; i <= i2; i++) - rgba[i] = p[i] << 4; + for (int col = c1; col <= c2; col++) { + p = result.scanLine(r2) + col * 4; + for (int i = i1; i <= i2; i++) + rgba[i] = p[i] << 4; - p -= bpl; - for (int j = r1; j < r2; j++, p -= bpl) - for (int i = i1; i <= i2; i++) - p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; - } + p -= bpl; + for (int j = r1; j < r2; j++, p -= bpl) + for (int i = i1; i <= i2; i++) + p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; + } - for (int row = r1; row <= r2; row++) { - p = result.scanLine(row) + c2 * 4; - for (int i = i1; i <= i2; i++) - rgba[i] = p[i] << 4; + for (int row = r1; row <= r2; row++) { + p = result.scanLine(row) + c2 * 4; + for (int i = i1; i <= i2; i++) + rgba[i] = p[i] << 4; - p -= 4; - for (int j = c1; j < c2; j++, p -= 4) - for (int i = i1; i <= i2; i++) - p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; - } + p -= 4; + for (int j = c1; j < c2; j++, p -= 4) + for (int i = i1; i <= i2; i++) + p[i] = (rgba[i] += ((p[i] << 4) - rgba[i]) * alpha / 16) >> 4; + } } void TextEffect::redraw(double timecode) { @@ -254,25 +254,25 @@ void TextEffect::redraw(double timecode) { path.addText(text_x, text_y, font, lines.at(i)); } - // draw software shadow - if (!enable_shader && shadow_bool->get_bool_value(timecode)) { - p.setPen(Qt::NoPen); - int shadow_offset = shadow_distance->get_double_value(timecode); + // draw software shadow + if (shadow_bool->get_bool_value(timecode)) { + p.setPen(Qt::NoPen); + int shadow_offset = shadow_distance->get_double_value(timecode); - QPainterPath shadow_path(path); - shadow_path.translate(shadow_offset, shadow_offset); + QPainterPath shadow_path(path); + shadow_path.translate(shadow_offset, shadow_offset); - QColor col = shadow_color->get_color_value(timecode); - col.setAlpha(0); - img.fill(col); + QColor col = shadow_color->get_color_value(timecode); + col.setAlpha(0); + img.fill(col); - col.setAlphaF(shadow_opacity->get_double_value(timecode)*0.01); - p.setBrush(col); - p.drawPath(shadow_path); + col.setAlphaF(shadow_opacity->get_double_value(timecode)*0.01); + p.setBrush(col); + p.drawPath(shadow_path); - int blurSoftness = shadow_softness->get_double_value(timecode); - if (blurSoftness > 0) blurred2(img, img.rect(), blurSoftness, false); - } + int blurSoftness = shadow_softness->get_double_value(timecode); + if (blurSoftness > 0) blurred2(img, img.rect(), blurSoftness, false); + } // draw outline int outline_width_val = outline_width->get_double_value(timecode); @@ -288,10 +288,11 @@ void TextEffect::redraw(double timecode) { p.setPen(Qt::NoPen); p.setBrush(set_color_button->get_color_value(timecode)); p.drawPath(path); + + p.end(); } void TextEffect::shadow_enable(bool e) { - enable_shader = (e && !config.use_software_fallback); close(); shadow_color->set_enabled(e); diff --git a/olive.pro b/olive.pro index 344dcc27e..115c65575 100644 --- a/olive.pro +++ b/olive.pro @@ -256,7 +256,8 @@ unix:!mac { } RESOURCES += \ - icons/icons.qrc + icons/icons.qrc \ + effects/internal/internalshaders.qrc unix:!mac:isEmpty(PREFIX) { PREFIX = /usr/local diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 7e096fe92..ae08fbb69 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -777,6 +777,8 @@ void open_clip_worker(Clip* clip) { last_filter = yadif_filter; } + // ffmpeg premultiplier + /* if (!clip->media->to_footage()->alpha_is_premultiplied) { AVFilterContext* premultiply_filter; snprintf(filter_args, sizeof(filter_args), "inplace=1"); @@ -785,6 +787,7 @@ void open_clip_worker(Clip* clip) { avfilter_link(last_filter, 0, premultiply_filter, 0); last_filter = premultiply_filter; } + */ /* stabilization code */ /*bool stabilize = false; @@ -801,13 +804,7 @@ void open_clip_worker(Clip* clip) { } }*/ - enum AVPixelFormat valid_pix_fmts[] = { -// AV_PIX_FMT_RGB24, - AV_PIX_FMT_RGBA, - AV_PIX_FMT_NONE - }; - - clip->pix_fmt = avcodec_find_best_pix_fmt_of_list(valid_pix_fmts, static_cast(clip->stream->codecpar->format), 1, nullptr); + clip->pix_fmt = AV_PIX_FMT_RGBA; const char* chosen_format = av_get_pix_fmt_name(static_cast(clip->pix_fmt)); snprintf(filter_args, sizeof(filter_args), "pix_fmts=%s", chosen_format); diff --git a/playback/playback.cpp b/playback/playback.cpp index 9eb56fcfc..1d6289ce8 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -370,9 +370,15 @@ int retrieve_next_frame(Clip* c, AVFrame* f) { } bool is_clip_active(Clip* c, long playhead) { + // these buffers allow clips to be opened and prepared well before they're displayed + // as well as closed a little after they're not needed anymore + int open_buffer = qCeil(c->sequence->frame_rate*2); + int close_buffer = qCeil(c->sequence->frame_rate); + + return c->enabled - && c->get_timeline_in_with_transition() < playhead + ceil(c->sequence->frame_rate*2) - && c->get_timeline_out_with_transition() > playhead + && c->get_timeline_in_with_transition() < playhead + open_buffer + && c->get_timeline_out_with_transition() > playhead - close_buffer && playhead - c->get_timeline_in_with_transition() + c->get_clip_in_with_transition() < c->getMaximumLength(); } diff --git a/project/effect.cpp b/project/effect.cpp index f535b4ff4..b47fa5c6b 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -660,10 +660,6 @@ void Effect::open() { } else { isOpen = true; } - - if (enable_superimpose) { - texture = new QOpenGLTexture(QOpenGLTexture::Target2D); - } } void Effect::close() { @@ -747,30 +743,40 @@ void Effect::process_shader(double timecode, GLTextureCoords&) { void Effect::process_coords(double, GLTextureCoords&, int) {} GLuint Effect::process_superimpose(double timecode) { - bool recreate_texture = false; + bool dimensions_changed = false; + bool redrew_image = false; + int width = parent_clip->getWidth(); int height = parent_clip->getHeight(); if (width != img.width() || height != img.height()) { img = QImage(width, height, QImage::Format_RGBA8888_Premultiplied); - recreate_texture = true; + dimensions_changed = true; } - if (valueHasChanged(timecode) || recreate_texture || enable_always_update) { + if (valueHasChanged(timecode) || dimensions_changed || enable_always_update) { redraw(timecode); + redrew_image = true; } - if (texture != nullptr) { - if (recreate_texture || texture->width() != img.width() || texture->height() != img.height()) { - delete_texture(); - texture = new QOpenGLTexture(QOpenGLTexture::Target2D); - texture->setData(img); - } else { - texture->setData(0, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, img.constBits()); - } - return texture->textureId(); + if (texture == nullptr || texture->width() != img.width() || texture->height() != img.height()) { + delete_texture(); + + texture = new QOpenGLTexture(QOpenGLTexture::Target2D); + texture->setSize(img.width(), img.height()); + texture->setFormat(QOpenGLTexture::RGBA8_UNorm); + texture->setMipLevels(texture->maximumMipLevels()); + texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); + texture->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); + + redrew_image = true; } - return 0; + + if (redrew_image) { + texture->setData(0, QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, img.constBits()); + } + + return texture->textureId(); } void Effect::process_audio(double, double, quint8*, int, int) {} diff --git a/project/effectloaders.cpp b/project/effectloaders.cpp index 716145695..e9cee3c69 100644 --- a/project/effectloaders.cpp +++ b/project/effectloaders.cpp @@ -22,7 +22,9 @@ void load_internal_effects() { EffectMeta em; - // internal effects + // load internal effects + em.path = ":/internalshaders"; + em.type = EFFECT_TYPE_EFFECT; em.subtype = EFFECT_TYPE_AUDIO; diff --git a/project/footage.h b/project/footage.h index 4c12e7edc..56ae6cace 100644 --- a/project/footage.h +++ b/project/footage.h @@ -9,9 +9,11 @@ #include #include -#define VIDEO_PROGRESSIVE 0 -#define VIDEO_TOP_FIELD_FIRST 1 -#define VIDEO_BOTTOM_FIELD_FIRST 2 +enum VideoInterlacingMode { + VIDEO_PROGRESSIVE, + VIDEO_TOP_FIELD_FIRST, + VIDEO_BOTTOM_FIELD_FIRST +}; struct Sequence; struct Clip; diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index bf1266948..d0697056a 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -78,22 +78,26 @@ void process_effect(Clip* c, } if (e->enable_superimpose) { GLuint superimpose_texture = e->process_superimpose(timecode); + qDebug() << "superimpose texture was:" << superimpose_texture; + qDebug() << "composite texture was:" << composite_texture; + if (superimpose_texture == 0) { qWarning() << "Superimpose texture was nullptr, retrying..."; texture_failed = true; + } else if (composite_texture == 0) { + // if there is no previous texture, just return the superimposes texture + // UNLESS this is a shader-extended superimpose effect in which case, + // we'll need to draw it below + qDebug() << "returning superimpose directly"; + composite_texture = superimpose_texture; } else { - if (composite_texture == 0) { - // if there is no previous texture, just return the superimposes texture - composite_texture = superimpose_texture; - } else { - // if the source texture is not already a framebuffer texture, - // we'll need to make it one before drawing a superimpose effect on it - if (composite_texture != c->fbo[0]->texture() && composite_texture != c->fbo[1]->texture()) { - draw_clip(c->fbo[!fbo_switcher], composite_texture, true); - } - - composite_texture = draw_clip(c->fbo[!fbo_switcher], superimpose_texture, false); + // if the source texture is not already a framebuffer texture, + // we'll need to make it one before drawing a superimpose effect on it + if (composite_texture != c->fbo[0]->texture() && composite_texture != c->fbo[1]->texture()) { + draw_clip(c->fbo[!fbo_switcher], composite_texture, true); } + + composite_texture = draw_clip(c->fbo[!fbo_switcher], superimpose_texture, false); } } e->endEffect(); @@ -279,7 +283,8 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { } // if clip should actually be shown on screen in this frame - if (playhead >= c->get_timeline_in_with_transition()) { + if (playhead >= c->get_timeline_in_with_transition() + && playhead < c->get_timeline_out_with_transition()) { glPushMatrix(); // simple bool for switching between the two framebuffers @@ -287,20 +292,31 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { glViewport(0, 0, video_width, video_height); - if (c->media != nullptr && c->media->get_type()== MEDIA_TYPE_SEQUENCE) { - // for a nested sequence, run this function again on that sequence and retrieve the texture + if (c->media != nullptr) { + if (c->media->get_type() == MEDIA_TYPE_SEQUENCE) { + // for a nested sequence, run this function again on that sequence and retrieve the texture - // add nested sequence to nest list - params.nests.append(c); + // add nested sequence to nest list + params.nests.append(c); - // compose sequence - textureID = compose_sequence(params); + // compose sequence + textureID = compose_sequence(params); - // remove sequence from nest list - params.nests.removeLast(); + // remove sequence from nest list + params.nests.removeLast(); - // compose_sequence() would have written to this clip's fbo[0], so we switch to fbo[1] - fbo_switcher = true; + // compose_sequence() would have written to this clip's fbo[0], so we switch to fbo[1] + fbo_switcher = true; + } else if (c->media->get_type() == MEDIA_TYPE_FOOTAGE && !c->media->to_footage()->alpha_is_premultiplied) { + // alpha is not premultiplied, we'll need to premultiply it for the rest of the pipeline + params.premultiply_program->bind(); + + textureID = draw_clip(c->fbo[0], textureID, true); + + params.premultiply_program->release(); + + fbo_switcher = true; + } } // set up default coordinates for drawing the clip @@ -345,6 +361,7 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { if (e->container->selected) selected_effect = e; } } + qDebug() << "texture ID:" << textureID; // using gizmo data, set definitive gizmo if (selected_effect != nullptr) { @@ -373,80 +390,83 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // == START FINAL DRAW ON SEQUENCE BUFFER == - // bind framebuffer - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); + if (textureID > 0) { + // bind framebuffer + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); - // set viewport to sequence size - glViewport(0, 0, s->width, s->height); + // set viewport to sequence size + glViewport(0, 0, s->width, s->height); - // bind final texture - glBindTexture(GL_TEXTURE_2D, textureID); + // bind final texture + glBindTexture(GL_TEXTURE_2D, textureID); - // set texture filter to bilinear - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + // set texture filter to bilinear + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - // bind and configure blending mode shader - params.blend_mode_program->bind(); - params.blend_mode_program->setUniformValue("blend_mode", coords.blendmode); - params.blend_mode_program->setUniformValue("opacity", coords.opacity); + // bind and configure blending mode shader + params.blend_mode_program->bind(); + params.blend_mode_program->setUniformValue("blend_mode", coords.blendmode); + params.blend_mode_program->setUniformValue("opacity", coords.opacity); - // draw clip on screen - glBegin(GL_QUADS); + // draw clip on screen + glBegin(GL_QUADS); - if (coords.grid_size <= 1) { - glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left - glVertex2f(coords.vertexTopLeftX, coords.vertexTopLeftY); // top left - glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right - glVertex2f(coords.vertexTopRightX, coords.vertexTopRightY); // top right - glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right - glVertex2f(coords.vertexBottomRightX, coords.vertexBottomRightY); // bottom right - glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left - glVertex2f(coords.vertexBottomLeftX, coords.vertexBottomLeftY); // bottom left - } else { - float rows = coords.grid_size; - float cols = coords.grid_size; + if (coords.grid_size <= 1) { + glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left + glVertex2f(coords.vertexTopLeftX, coords.vertexTopLeftY); // top left + glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right + glVertex2f(coords.vertexTopRightX, coords.vertexTopRightY); // top right + glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right + glVertex2f(coords.vertexBottomRightX, coords.vertexBottomRightY); // bottom right + glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left + glVertex2f(coords.vertexBottomLeftX, coords.vertexBottomLeftY); // bottom left + } else { + float rows = coords.grid_size; + float cols = coords.grid_size; - for (int k=0;krelease(); + + // unbind texture + glBindTexture(GL_TEXTURE_2D, 0); + + // unbind framebuffer + params.ctx->functions()->glBindFramebuffer(GL_TEXTURE_2D, 0); + } - glEnd(); - - // release blend mode shader - params.blend_mode_program->release(); - - // unbind texture - glBindTexture(GL_TEXTURE_2D, 0); - - // unbind framebuffer - params.ctx->functions()->glBindFramebuffer(GL_TEXTURE_2D, 0); - // == END FINAL DRAW ON SEQUENCE BUFFER == // prepare gizmos diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 3d452f100..852c2a2fe 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -22,6 +22,7 @@ struct ComposeSequenceParams { bool rendering; int playback_speed; QOpenGLShaderProgram* blend_mode_program; + QOpenGLShaderProgram* premultiply_program; GLuint main_buffer; GLuint backend_buffer1; GLuint backend_attachment1; diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index d7f2b4f72..37face307 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -16,6 +16,7 @@ RenderThread::RenderThread() : share_ctx(nullptr), ctx(nullptr), blend_mode_program(nullptr), + premultiply_program(nullptr), seq(nullptr), tex_width(-1), tex_height(-1), @@ -107,10 +108,16 @@ void RenderThread::run() { if (blend_mode_program == nullptr) { // create shader program to make blending modes work delete_shader_program(); + blend_mode_program = new QOpenGLShaderProgram(); - blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Vertex, "C:/msys64/home/Matt/olive/effects/common.vert"); - blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Fragment, "C:/msys64/home/Matt/olive/effects/blending.frag"); + blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/internalshaders/common.vert"); + blend_mode_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/internalshaders/blending.frag"); blend_mode_program->link(); + + premultiply_program = new QOpenGLShaderProgram(); + premultiply_program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/internalshaders/common.vert"); + premultiply_program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/internalshaders/premultiply.frag"); + premultiply_program->link(); } // bind framebuffer for drawing @@ -161,6 +168,7 @@ void RenderThread::paint() { params.rendering = false; params.playback_speed = 1; params.blend_mode_program = blend_mode_program; + params.premultiply_program = premultiply_program; params.backend_buffer1 = back_buffer_1; params.backend_buffer2 = back_buffer_2; params.backend_attachment1 = back_texture_1; @@ -253,8 +261,10 @@ void RenderThread::delete_fbo() { void RenderThread::delete_shader_program() { if (blend_mode_program != nullptr) { delete blend_mode_program; + delete premultiply_program; } blend_mode_program = nullptr; + premultiply_program = nullptr; } void RenderThread::delete_ctx() { diff --git a/ui/renderthread.h b/ui/renderthread.h index 6ec304d31..201839dce 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -43,6 +43,7 @@ private: QOpenGLContext* share_ctx; QOpenGLContext* ctx; QOpenGLShaderProgram* blend_mode_program; + QOpenGLShaderProgram* premultiply_program; GLuint back_buffer_1; GLuint back_buffer_2; From a4eb3df21af07cbbfba475577b27e6f7dcd11843 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 27 Jan 2019 10:43:29 +1100 Subject: [PATCH 011/202] fixed timeline issues --- panels/timeline.cpp | 30 +++++++++++++++++------------- panels/timeline.h | 2 +- project/undo.cpp | 18 +++++++++++------- ui/timelinewidget.cpp | 22 ++++++++++++++++------ 4 files changed, 45 insertions(+), 27 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 84a9663c6..08d06edb5 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -515,7 +515,7 @@ void Timeline::delete_in_out(bool ripple) { areas.append(s); } ComboAction* ca = new ComboAction(); - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out); ca->append(new SetTimelineInOutCommand(sequence, false, 0, 0)); undo_stack.push(ca); @@ -529,7 +529,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele ComboAction* ca = new ComboAction(); - delete_areas_and_relink(ca, selections); + delete_areas_and_relink(ca, selections, true); if (ripple_delete) { long ripple_point = selections.at(0).in; @@ -807,7 +807,7 @@ bool selection_contains_transition(const Selection& s, Clip* c, int type) { } } -void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas) { +void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& areas, bool deselect_areas) { clean_up_selections(areas); panel_effect_controls->clear_effects(true); @@ -864,10 +864,12 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area } // deselect selected clip areas - QVector area_copy = areas; - for (int i=0;i area_copy = areas; + for (int i=0;iplayhead); ripple_clips(ca, sequence, paste_start, paste_end - paste_start); } else { - delete_areas_and_relink(ca, delete_areas); + delete_areas_and_relink(ca, delete_areas, false); } // correct linked clips @@ -1160,7 +1162,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { } // trim and move clips around the in point - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, in_point, -1); } else { @@ -1185,7 +1187,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { } // trim and move clips around the in point - delete_areas_and_relink(ca, areas); + delete_areas_and_relink(ca, areas, true); if (ripple) ripple_clips(ca, sequence, s.in, s.in - s.out); } } @@ -1225,6 +1227,11 @@ bool Timeline::split_selection(ComboAction* ca) { pre_splits.append(j); post_splits.append(post_a); secondary_post_splits.append(post_b); + + if (post_a != nullptr) { + post_a->timeline_out = qMin(post_a->timeline_out, s.out); + } + split = true; } } @@ -1236,9 +1243,6 @@ bool Timeline::split_selection(ComboAction* ca) { relink_clips_using_ids(pre_splits, post_splits); relink_clips_using_ids(pre_splits, secondary_post_splits); - post_splits.removeAll(nullptr); - secondary_post_splits.removeAll(nullptr); - ca->append(new AddClipCommand(sequence, post_splits)); ca->append(new AddClipCommand(sequence, secondary_post_splits)); diff --git a/panels/timeline.h b/panels/timeline.h index 3e1248fcc..3cce9a136 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -85,7 +85,7 @@ public: bool split_clip_and_relink(ComboAction* ca, int clip, long frame, bool relink); void clean_up_selections(QVector& areas); void deselect_area(long in, long out, int track); - void delete_areas_and_relink(ComboAction *ca, QVector& areas); + void delete_areas_and_relink(ComboAction *ca, QVector& areas, bool deselect_areas); void relink_clips_using_ids(QVector& old_clips, QVector& new_clips); void update_sequence(); void increase_track_height(); diff --git a/project/undo.cpp b/project/undo.cpp index d16b481c4..89f3458b2 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -513,14 +513,18 @@ void AddClipCommand::redo() { int linkOffset = seq->clips.size(); for (int i=0;icopy(seq); - copy->linked.resize(original->linked.size()); - for (int j=0;jlinked.size();j++) { - copy->linked[j] = original->linked.at(j) + linkOffset; + if (original != nullptr) { + Clip* copy = original->copy(seq); + copy->linked.resize(original->linked.size()); + for (int j=0;jlinked.size();j++) { + copy->linked[j] = original->linked.at(j) + linkOffset; + } + if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, nullptr); + if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, nullptr); + seq->clips.append(copy); + } else { + seq->clips.append(nullptr); } - if (original->opening_transition > -1) copy->opening_transition = original->get_opening_transition()->copy(copy, nullptr); - if (original->closing_transition > -1) copy->closing_transition = original->get_closing_transition()->copy(copy, nullptr); - seq->clips.append(copy); } } mainWindow->setWindowModified(true); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a989fa8f6..bacc19133 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -425,7 +425,7 @@ void delete_area_under_ghosts(ComboAction* ca) { sel.track = g.track; delete_areas.append(sel); } - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); } void insert_clips(ComboAction* ca) { @@ -825,7 +825,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { s.track = c->track; QVector areas; areas.append(s); - panel_timeline->delete_areas_and_relink(ca, areas); + panel_timeline->delete_areas_and_relink(ca, areas, false); } QVector add; @@ -880,7 +880,17 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } } else if (panel_timeline->moving_proc) { - if (panel_timeline->ghosts.size() > 0) { + bool process_moving = false; + + for (int i=0;ighosts.size();i++) { + const Ghost& g = panel_timeline->ghosts.at(i); + if (g.in != g.old_in || g.out != g.old_out || g.clip_in != g.old_clip_in) { + process_moving = true; + break; + } + } + + if (process_moving) { const Ghost& first_ghost = panel_timeline->ghosts.at(0); // if we were RIPPLING, move all the clips @@ -949,7 +959,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } } if (new_clips.size() > 0) { - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); // relink duplicated clips panel_timeline->relink_clips_using_ids(old_clips, new_clips); @@ -979,7 +989,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { s.track = g.track; delete_areas.append(s); } - panel_timeline->delete_areas_and_relink(ca, delete_areas); + panel_timeline->delete_areas_and_relink(ca, delete_areas, false); for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); sequence->clips.at(g.clip)->undeletable = false; @@ -1112,7 +1122,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { move_pre = true; } - panel_timeline->delete_areas_and_relink(ca, areas); + panel_timeline->delete_areas_and_relink(ca, areas, false); if (move_post) move_clip(ca, post, qMin(transition_start, post->timeline_in), post->timeline_out, post->clip_in - (post->timeline_in - transition_start), post->track); if (move_pre) move_clip(ca, pre, pre->timeline_in, qMax(transition_end, pre->timeline_out), pre->clip_in, pre->track); From d1ff0264246744d4308c117c3f2d593f9fe186a1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 02:31:12 +1100 Subject: [PATCH 012/202] added full blending pipeline --- effects/internal/blending.frag | 209 ++++++++++++++++++++++++++- effects/internal/transformeffect.cpp | 6 +- effects/test.frag | 10 ++ effects/test.xml | 7 + project/effect.cpp | 2 +- project/sourcescommon.cpp | 36 ++--- ui/renderfunctions.cpp | 191 ++++++++++++++---------- ui/renderfunctions.h | 1 + ui/renderthread.cpp | 9 +- ui/timelinewidget.cpp | 6 +- 10 files changed, 373 insertions(+), 104 deletions(-) create mode 100644 effects/test.frag create mode 100644 effects/test.xml diff --git a/effects/internal/blending.frag b/effects/internal/blending.frag index 3507705c5..ab6171b73 100644 --- a/effects/internal/blending.frag +++ b/effects/internal/blending.frag @@ -28,10 +28,213 @@ const int BLEND_MODE_SUBTRACT = 24; const int BLEND_MODE_VIVIDLIGHT = 25; uniform sampler2D background; -uniform sampler2D texture; +uniform sampler2D foreground; + +uniform int blendmode; +uniform float opacity; + varying vec2 vTexCoord; +// float blending functions +float blend_color_burn(float base, float blend) { + return (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0); +} + +float blend_color_dodge(float base, float blend) { + return (blend==1.0)?blend:min(base/(1.0-blend),1.0); +} + +float blend_vivid_light(float base, float blend) { + return (blend<0.5)?blend_color_burn(base,(2.0*blend)):blend_color_dodge(base,(2.0*(blend-0.5))); +} + +vec3 blend_vivid_light(vec3 base, vec3 blend) { + return vec3(blend_vivid_light(base.r,blend.r),blend_vivid_light(base.g,blend.g),blend_vivid_light(base.b,blend.b)); +} + +float blend_hard_mix(float base, float blend) { + return (blend_vivid_light(base,blend)<0.5)?0.0:1.0; +} + +float blend_lighten(float base, float blend) { + return max(blend,base); +} + +float blend_overlay(float base, float blend) { + return base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend)); +} + +vec3 blend_overlay(vec3 base, vec3 blend) { + return vec3(blend_overlay(base.r,blend.r),blend_overlay(base.g,blend.g),blend_overlay(base.b,blend.b)); +} + +float blend_darken(float base, float blend) { + return min(blend, base); +} + +float blend_linear_burn(float base, float blend) { + return max(base+blend-1.0,0.0); +} + +vec3 blend_linear_burn(vec3 base, vec3 blend) { + return max(base+blend-vec3(1.0),vec3(0.0)); +} + +float blend_linear_dodge(float base, float blend) { + return min(base+blend,1.0); +} + +vec3 blend_linear_dodge(vec3 base, vec3 blend) { + return min(base+blend,vec3(1.0)); +} + +float blend_linear_light(float base, float blend) { + return blend<0.5?blend_linear_burn(base,(2.0*blend)):blend_linear_dodge(base,(2.0*(blend-0.5))); +} + +float blend_pin_light(float base, float blend) { + return (blend<0.5)?blend_darken(base,(2.0*blend)):blend_lighten(base,(2.0*(blend-0.5))); +} + +float blend_reflect(float base, float blend) { + return (blend==1.0)?blend:min(base*base/(1.0-blend),1.0); +} + +vec3 blend_reflect(vec3 base, vec3 blend) { + return vec3(blend_reflect(base.r,blend.r),blend_reflect(base.g,blend.g),blend_reflect(base.b,blend.b)); +} + +float blend_screen(float base, float blend) { + return 1.0-((1.0-base)*(1.0-blend)); +} + +float blend_substract(float base, float blend) { + return max(base+blend-1.0,0.0); +} + +float blend_soft_light(float base, float blend) { + return (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend)); +} + +// adapted from https://github.com/jamieowen/glsl-blend +// RGB blending function, alpha is handled below +vec3 blend(vec3 base, vec3 blend) { + switch (blendmode) { + + case BLEND_MODE_AVERAGE: + return (base+blend)/2.0; + + case BLEND_MODE_COLORBURN: + return vec3(blend_color_burn(base.r, blend.r), blend_color_burn(base.g, blend.g), blend_color_burn(base.b, blend.b)); + + case BLEND_MODE_COLORDODGE: + return vec3(blend_color_dodge(base.r, blend.r), blend_color_dodge(base.g, blend.g), blend_color_dodge(base.b, blend.b)); + + case BLEND_MODE_DARKEN: + return vec3(blend_darken(base.r, blend.r), blend_darken(base.g, blend.g), blend_darken(base.b, blend.b)); + + case BLEND_MODE_DIFFERENCE: + return abs(base-blend); + + case BLEND_MODE_EXCLUSION: + return base+blend-2.0*base*blend; + + case BLEND_MODE_GLOW: + return blend_reflect(blend, base); + + case BLEND_MODE_HARDLIGHT: + return blend_overlay(blend,base); + + case BLEND_MODE_HARDMIX: + return vec3(blend_hard_mix(base.r,blend.r),blend_hard_mix(base.g,blend.g),blend_hard_mix(base.b,blend.b)); + + case BLEND_MODE_LIGHTEN: + return vec3(blend_lighten(base.r,blend.r),blend_lighten(base.g,blend.g),blend_lighten(base.b,blend.b)); + + case BLEND_MODE_LINEARBURN: + case BLEND_MODE_SUBTRACT: + return blend_linear_burn(base, blend); + + case BLEND_MODE_ADD: + case BLEND_MODE_LINEARDODGE: + return blend_linear_dodge(base, blend); + + case BLEND_MODE_LINEARLIGHT: + return vec3(blend_linear_light(base.r,blend.r),blend_linear_light(base.g,blend.g),blend_linear_light(base.b,blend.b)); + + case BLEND_MODE_MULTIPLY: + return (base * blend); + + case BLEND_MODE_NEGATION: + return vec3(1.0)-abs(vec3(1.0)-base-blend); + + case BLEND_MODE_OVERLAY: + return blend_overlay(base, blend); + + case BLEND_MODE_PHOENIX: + return min(base,blend)-max(base,blend)+vec3(1.0); + + case BLEND_MODE_PINLIGHT: + return vec3(blend_pin_light(base.r,blend.r),blend_pin_light(base.g,blend.g),blend_pin_light(base.b,blend.b)); + + case BLEND_MODE_REFLECT: + return blend_reflect(base, blend); + + case BLEND_MODE_SCREEN: + return vec3(blend_screen(base.r,blend.r),blend_screen(base.g,blend.g),blend_screen(base.b,blend.b)); + + case BLEND_MODE_SUBSTRACT: + return max(base+blend-vec3(1.0),vec3(0.0)); + + case BLEND_MODE_SOFTLIGHT: + return vec3(blend_soft_light(base.r,blend.r),blend_soft_light(base.g,blend.g),blend_soft_light(base.b,blend.b)); + + case BLEND_MODE_VIVIDLIGHT: + return vec3(blend_vivid_light(base.r,blend.r),blend_vivid_light(base.g,blend.g),blend_vivid_light(base.b,blend.b)); + + case BLEND_MODE_NORMAL: + default: + return blend; + + } +} + void main(void) { - // gl_FragColor = texture2D(background, vTexCoord); - gl_FragColor = texture2D(texture, vTexCoord); + vec4 bg_color = texture2D(background, vTexCoord); + vec4 fg_color = texture2D(foreground, vTexCoord); + + // blend textures together + vec3 composite = blend(bg_color.rgb, fg_color.rgb); + + // add foreground and background alpha's together + vec4 full_composite = vec4(composite, bg_color.a + fg_color.a); + + // restore background texture based on foreground's alpha + bool restore_bg = true; + + // some blend modes don't need this + switch (blendmode) { + case BLEND_MODE_SCREEN: + case BLEND_MODE_LIGHTEN: + case BLEND_MODE_COLORDODGE: + case BLEND_MODE_LINEARDODGE: + case BLEND_MODE_ADD: + // case BLEND_MODE_OVERLAY: + case BLEND_MODE_SOFTLIGHT: + case BLEND_MODE_DIFFERENCE: + case BLEND_MODE_AVERAGE: + case BLEND_MODE_NEGATION: + case BLEND_MODE_PHOENIX: + restore_bg = false; + } + + if (restore_bg) { + full_composite += vec4(bg_color.rgb*(1.0-fg_color.a), 0.0); + } + + // mix via opacity + full_composite = mix(bg_color, full_composite, opacity); + + // output to color + gl_FragColor = full_composite; } \ No newline at end of file diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index 6bbcf1cfe..a095b3f5a 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -63,7 +63,7 @@ TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) blend_mode_box->add_combo_item(tr("Lighten"), BLEND_MODE_LIGHTEN); blend_mode_box->add_combo_item(tr("Screen"), BLEND_MODE_SCREEN); blend_mode_box->add_combo_item(tr("Color Dodge"), BLEND_MODE_COLORDODGE); - blend_mode_box->add_combo_item(tr("Linear Dodge"), BLEND_MODE_LINEARDODGE); + blend_mode_box->add_combo_item(tr("Linear Dodge (Add)"), BLEND_MODE_LINEARDODGE); blend_mode_box->add_combo_item(tr("Overlay"), BLEND_MODE_OVERLAY); blend_mode_box->add_combo_item(tr("Soft Light"), BLEND_MODE_SOFTLIGHT); blend_mode_box->add_combo_item(tr("Hard Light"), BLEND_MODE_HARDLIGHT); @@ -74,9 +74,9 @@ TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) blend_mode_box->add_combo_item(tr("Difference"), BLEND_MODE_DIFFERENCE); blend_mode_box->add_combo_item(tr("Exclusion"), BLEND_MODE_EXCLUSION); blend_mode_box->add_combo_item(tr("Reflect"), BLEND_MODE_REFLECT); - blend_mode_box->add_combo_item(tr("Subtract"), BLEND_MODE_SUBTRACT); +// blend_mode_box->add_combo_item(tr("Subtract"), BLEND_MODE_SUBTRACT); blend_mode_box->add_combo_item(tr("Substract"), BLEND_MODE_SUBSTRACT); - blend_mode_box->add_combo_item(tr("Add"), BLEND_MODE_ADD); +// blend_mode_box->add_combo_item(tr("Add"), BLEND_MODE_ADD); blend_mode_box->add_combo_item(tr("Average"), BLEND_MODE_AVERAGE); blend_mode_box->add_combo_item(tr("Glow"), BLEND_MODE_GLOW); blend_mode_box->add_combo_item(tr("Negation"), BLEND_MODE_NEGATION); diff --git a/effects/test.frag b/effects/test.frag new file mode 100644 index 000000000..bc16e5cb4 --- /dev/null +++ b/effects/test.frag @@ -0,0 +1,10 @@ +#version 110 + +uniform sampler2D tex; +varying vec2 vTexCoord; + +void main(void) { + vec4 c = texture2D(tex, vTexCoord); + c.rgb *= c.a; + gl_FragColor = c; +} \ No newline at end of file diff --git a/effects/test.xml b/effects/test.xml new file mode 100644 index 000000000..87d1bd6a2 --- /dev/null +++ b/effects/test.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/project/effect.cpp b/project/effect.cpp index b47fa5c6b..2beee31f7 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -500,7 +500,7 @@ void Effect::load(QXmlStreamReader& stream) { for (int l=0;lfieldCount();l++) { if (row->field(l)->id == attr.value()) { field_number = l; - qInfo() << "Found field by ID"; +// qInfo() << "Found field by ID"; break; } } diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 31734b339..bb557381a 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -56,6 +56,24 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it QMenu* new_menu = menu.addMenu(tr("New")); mainWindow->make_new_menu(new_menu); + QMenu* view_menu = menu.addMenu(tr("View")); + + QAction* tree_view_action = view_menu->addAction(tr("Tree View")); + connect(tree_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_tree_view())); + + QAction* icon_view_action = view_menu->addAction(tr("Icon View")); + connect(icon_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_icon_view())); + + QAction* toolbar_action = view_menu->addAction(tr("Show Toolbar")); + toolbar_action->setCheckable(true); + toolbar_action->setChecked(project_parent->toolbar_widget->isVisible()); + connect(toolbar_action, SIGNAL(triggered(bool)), project_parent->toolbar_widget, SLOT(setVisible(bool))); + + QAction* show_sequences = view_menu->addAction(tr("Show Sequences")); + show_sequences->setCheckable(true); + show_sequences->setChecked(panel_project->sorter->get_show_sequences()); + connect(show_sequences, SIGNAL(triggered(bool)), panel_project->sorter, SLOT(set_show_sequences(bool))); + if (items.size() > 0) { Media* m = project_parent->item_to_media(items.at(0)); @@ -120,24 +138,6 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it } } - menu.addSeparator(); - - QAction* tree_view_action = menu.addAction(tr("Tree View")); - connect(tree_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_tree_view())); - - QAction* icon_view_action = menu.addAction(tr("Icon View")); - connect(icon_view_action, SIGNAL(triggered(bool)), project_parent, SLOT(set_icon_view())); - - QAction* toolbar_action = menu.addAction(tr("Show Toolbar")); - toolbar_action->setCheckable(true); - toolbar_action->setChecked(project_parent->toolbar_widget->isVisible()); - connect(toolbar_action, SIGNAL(triggered(bool)), project_parent->toolbar_widget, SLOT(setVisible(bool))); - - QAction* show_sequences = menu.addAction(tr("Show Sequences")); - show_sequences->setCheckable(true); - show_sequences->setChecked(panel_project->sorter->get_show_sequences()); - connect(show_sequences, SIGNAL(triggered(bool)), panel_project->sorter, SLOT(set_show_sequences(bool))); - menu.exec(QCursor::pos()); } diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index d0697056a..261eb2602 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -28,18 +28,11 @@ extern "C" { #include } -GLuint draw_clip(QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { +void full_blit() { glPushMatrix(); glLoadIdentity(); glOrtho(0, 1, 0, 1, -1, 1); - fbo->bind(); - - if (clear) { - glClear(GL_COLOR_BUFFER_BIT); - } - - glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); glTexCoord2f(0, 0); // top left glVertex2f(0, 0); // top left @@ -50,9 +43,41 @@ GLuint draw_clip(QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { glTexCoord2f(0, 1); // bottom left glVertex2f(0, 1); // bottom left glEnd(); - glBindTexture(GL_TEXTURE_2D, 0); glPopMatrix(); +} + +void draw_clip(QOpenGLContext* ctx, GLuint fbo, GLuint texture, bool clear) { + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo); + + if (clear) { + glClear(GL_COLOR_BUFFER_BIT); + } + + glBindTexture(GL_TEXTURE_2D, texture); + + full_blit(); + + glBindTexture(GL_TEXTURE_2D, 0); + + ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); +} + +GLuint draw_clip(QOpenGLFramebufferObject* fbo, GLuint texture, bool clear) { + fbo->bind(); + + if (clear) { + glClear(GL_COLOR_BUFFER_BIT); + } + + glBindTexture(GL_TEXTURE_2D, texture); + + full_blit(); + + glBindTexture(GL_TEXTURE_2D, 0); + + fbo->release(); + return fbo->texture(); } @@ -78,8 +103,6 @@ void process_effect(Clip* c, } if (e->enable_superimpose) { GLuint superimpose_texture = e->process_superimpose(timecode); - qDebug() << "superimpose texture was:" << superimpose_texture; - qDebug() << "composite texture was:" << composite_texture; if (superimpose_texture == 0) { qWarning() << "Superimpose texture was nullptr, retrying..."; @@ -88,7 +111,6 @@ void process_effect(Clip* c, // if there is no previous texture, just return the superimposes texture // UNLESS this is a shader-extended superimpose effect in which case, // we'll need to draw it below - qDebug() << "returning superimpose directly"; composite_texture = superimpose_texture; } else { // if the source texture is not already a framebuffer texture, @@ -361,7 +383,6 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { if (e->container->selected) selected_effect = e; } } - qDebug() << "texture ID:" << textureID; // using gizmo data, set definitive gizmo if (selected_effect != nullptr) { @@ -388,87 +409,111 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // == EFFECT CODE END == - // == START FINAL DRAW ON SEQUENCE BUFFER == - if (textureID > 0) { - // bind framebuffer - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); - // set viewport to sequence size - glViewport(0, 0, s->width, s->height); + params.ctx->functions()->glViewport(0, 0, s->width, s->height); - // bind final texture + + + // == START RENDER CLIP IN CONTEXT OF SEQUENCE == + + + + // render a backbuffer + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, params.backend_buffer1); + + glClearColor(0.0, 0.0, 0.0, 0.0); + glClear(GL_COLOR_BUFFER_BIT); + + // bind final clip texture glBindTexture(GL_TEXTURE_2D, textureID); // set texture filter to bilinear - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + params.ctx->functions()->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + params.ctx->functions()->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // draw clip on screen according to gl coordinates + glBegin(GL_QUADS); + + glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left + glVertex2f(coords.vertexTopLeftX, coords.vertexTopLeftY); // top left + glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right + glVertex2f(coords.vertexTopRightX, coords.vertexTopRightY); // top right + glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right + glVertex2f(coords.vertexBottomRightX, coords.vertexBottomRightY); // bottom right + glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left + glVertex2f(coords.vertexBottomLeftX, coords.vertexBottomLeftY); // bottom left + + glEnd(); + + // release final clip texture + glBindTexture(GL_TEXTURE_2D, 0); + + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + + + // == END RENDER CLIP IN CONTEXT OF SEQUENCE == + + + + // + // + // PROCESS POST-SHADERS + // + // + + + + // copy front buffer to back buffer + draw_clip(params.ctx, params.backend_buffer2, params.main_attachment, true); + + + + // == START FINAL DRAW ON SEQUENCE BUFFER == + + + + // bind front buffer as draw buffer + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); + + // load background texture into texture unit 0 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, params.backend_attachment2); + + // load foreground texture into texture unit 1 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 1); // Texture unit 1 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, params.backend_attachment1); // bind and configure blending mode shader params.blend_mode_program->bind(); - params.blend_mode_program->setUniformValue("blend_mode", coords.blendmode); + params.blend_mode_program->setUniformValue("blendmode", coords.blendmode); params.blend_mode_program->setUniformValue("opacity", coords.opacity); + params.blend_mode_program->setUniformValue("background", 0); + params.blend_mode_program->setUniformValue("foreground", 1); - // draw clip on screen - glBegin(GL_QUADS); + glClear(GL_COLOR_BUFFER_BIT); - if (coords.grid_size <= 1) { - glTexCoord2f(coords.textureTopLeftX, coords.textureTopLeftY); // top left - glVertex2f(coords.vertexTopLeftX, coords.vertexTopLeftY); // top left - glTexCoord2f(coords.textureTopRightX, coords.textureTopRightY); // top right - glVertex2f(coords.vertexTopRightX, coords.vertexTopRightY); // top right - glTexCoord2f(coords.textureBottomRightX, coords.textureBottomRightY); // bottom right - glVertex2f(coords.vertexBottomRightX, coords.vertexBottomRightY); // bottom right - glTexCoord2f(coords.textureBottomLeftX, coords.textureBottomLeftY); // bottom left - glVertex2f(coords.vertexBottomLeftX, coords.vertexBottomLeftY); // bottom left - } else { - float rows = coords.grid_size; - float cols = coords.grid_size; - - for (int k=0;krelease(); - // unbind texture - glBindTexture(GL_TEXTURE_2D, 0); + // unbind texture from texture unit 1 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + + // unbind texture from texture unit 0 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); // unbind framebuffer - params.ctx->functions()->glBindFramebuffer(GL_TEXTURE_2D, 0); + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + + + // == END FINAL DRAW ON SEQUENCE BUFFER == } - // == END FINAL DRAW ON SEQUENCE BUFFER == - // prepare gizmos if ((*params.gizmos) != nullptr && params.nests.isEmpty() diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 852c2a2fe..0830d6cb4 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -24,6 +24,7 @@ struct ComposeSequenceParams { QOpenGLShaderProgram* blend_mode_program; QOpenGLShaderProgram* premultiply_program; GLuint main_buffer; + GLuint main_attachment; GLuint backend_buffer1; GLuint backend_attachment1; GLuint backend_buffer2; diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index 37face307..a8ef4fee5 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -70,11 +70,11 @@ void RenderThread::run() { // create texture glGenTextures(1, &front_texture); - glGenTextures(1, &back_buffer_1); - glGenTextures(1, &back_buffer_2); + glGenTextures(1, &back_texture_1); + glGenTextures(1, &back_texture_2); GLuint fbos[3] = {front_buffer, back_buffer_1, back_buffer_2}; - GLuint textures[3] = {front_buffer, back_buffer_1, back_buffer_2}; + GLuint textures[3] = {front_texture, back_texture_1, back_texture_2}; for (int i=0;i<3;i++) { // bind framebuffer for attaching @@ -85,7 +85,7 @@ void RenderThread::run() { // allocate storage for texture glTexImage2D( - GL_TEXTURE_2D, 0, GL_RGB, seq->width, seq->height, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr + GL_TEXTURE_2D, 0, GL_RGBA, seq->width, seq->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr ); // set texture filtering to bilinear @@ -174,6 +174,7 @@ void RenderThread::paint() { params.backend_attachment1 = back_texture_1; params.backend_attachment2 = back_texture_2; params.main_buffer = front_buffer; + params.main_attachment = front_texture; compose_sequence(params); texture_failed = params.texture_failed; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index bacc19133..0d6bb4a2a 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -869,7 +869,6 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { // default audio effects (after custom effects) c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_VOLUME, EFFECT_TYPE_EFFECT))); c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_PAN, EFFECT_TYPE_EFFECT))); - //c->media_type = MEDIA_TYPE_TONE; } push_undo = true; @@ -884,7 +883,10 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); - if (g.in != g.old_in || g.out != g.old_out || g.clip_in != g.old_clip_in) { + if (g.in != g.old_in + || g.out != g.old_out + || g.clip_in != g.old_clip_in + || g.track != g.old_track) { process_moving = true; break; } From deb875eedefffe098e556a15a1ffa37ab79252b4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 02:31:32 +1100 Subject: [PATCH 013/202] removed redundant files --- effects/test.frag | 10 ---------- effects/test.xml | 7 ------- 2 files changed, 17 deletions(-) delete mode 100644 effects/test.frag delete mode 100644 effects/test.xml diff --git a/effects/test.frag b/effects/test.frag deleted file mode 100644 index bc16e5cb4..000000000 --- a/effects/test.frag +++ /dev/null @@ -1,10 +0,0 @@ -#version 110 - -uniform sampler2D tex; -varying vec2 vTexCoord; - -void main(void) { - vec4 c = texture2D(tex, vTexCoord); - c.rgb *= c.a; - gl_FragColor = c; -} \ No newline at end of file diff --git a/effects/test.xml b/effects/test.xml deleted file mode 100644 index 87d1bd6a2..000000000 --- a/effects/test.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file From edf7fa9ef9638296b0950f6a534b8c12529a7b53 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 02:33:53 +1100 Subject: [PATCH 014/202] fixed clip movement issue --- ui/timelinewidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index bacc19133..3417bb342 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -884,7 +884,10 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); - if (g.in != g.old_in || g.out != g.old_out || g.clip_in != g.old_clip_in) { + if (g.in != g.old_in + || g.out != g.old_out + || g.clip_in != g.old_clip_in + || g.track != g.old_track) { process_moving = true; break; } From bcc772e95734ec95312794d6259ff6574e24c743 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 15:04:48 +1100 Subject: [PATCH 015/202] blending seems mostly complete --- effects/internal/blending.frag | 32 ++++++++++++++--------------- panels/viewer.cpp | 5 ++++- panels/viewer.h | 1 + ui/renderfunctions.cpp | 37 +++++++++++++++++++++++++++------- 4 files changed, 50 insertions(+), 25 deletions(-) diff --git a/effects/internal/blending.frag b/effects/internal/blending.frag index ab6171b73..21cdbe8a9 100644 --- a/effects/internal/blending.frag +++ b/effects/internal/blending.frag @@ -35,6 +35,9 @@ uniform float opacity; varying vec2 vTexCoord; +// adapted from https://github.com/jamieowen/glsl-blend +// and http://www.deepskycolors.com/archivo/2010/04/21/formulas-for-Photoshop-blending-modes.html + // float blending functions float blend_color_burn(float base, float blend) { return (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0); @@ -116,7 +119,6 @@ float blend_soft_light(float base, float blend) { return (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend)); } -// adapted from https://github.com/jamieowen/glsl-blend // RGB blending function, alpha is handled below vec3 blend(vec3 base, vec3 blend) { switch (blendmode) { @@ -207,33 +209,29 @@ void main(void) { vec3 composite = blend(bg_color.rgb, fg_color.rgb); // add foreground and background alpha's together - vec4 full_composite = vec4(composite, bg_color.a + fg_color.a); + float alpha_opac = fg_color.a*opacity; - // restore background texture based on foreground's alpha - bool restore_bg = true; - - // some blend modes don't need this switch (blendmode) { - case BLEND_MODE_SCREEN: + case BLEND_MODE_OVERLAY: case BLEND_MODE_LIGHTEN: + case BLEND_MODE_SCREEN: case BLEND_MODE_COLORDODGE: case BLEND_MODE_LINEARDODGE: case BLEND_MODE_ADD: - // case BLEND_MODE_OVERLAY: case BLEND_MODE_SOFTLIGHT: - case BLEND_MODE_DIFFERENCE: - case BLEND_MODE_AVERAGE: case BLEND_MODE_NEGATION: - case BLEND_MODE_PHOENIX: - restore_bg = false; + case BLEND_MODE_AVERAGE: + case BLEND_MODE_REFLECT: + case BLEND_MODE_EXCLUSION: + case BLEND_MODE_DIFFERENCE: + composite *= alpha_opac; + break; } - if (restore_bg) { - full_composite += vec4(bg_color.rgb*(1.0-fg_color.a), 0.0); - } + vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a); + // vec4 full_composite = vec4(mix(bg_color.rgb, composite, alpha_opac), bg_color.a + alpha_opac); - // mix via opacity - full_composite = mix(bg_color, full_composite, opacity); + // full_composite = mix(bg_color, full_composite, alpha_opac); // output to color gl_FragColor = full_composite; diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 42f05b7a7..35d92bfac 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -263,7 +263,10 @@ void Viewer::seek(long p) { } } reset_all_audio(); - audio_scrub = true; + if (last_playhead != seq->playhead) { + audio_scrub = true; + } + last_playhead = seq->playhead; update_parents(update_fx); } diff --git a/panels/viewer.h b/panels/viewer.h index db95d90ac..002caea1a 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -105,6 +105,7 @@ private: QString panel_name; double minimum_zoom; bool playing_in_to_out; + long last_playhead; void set_zoom_value(double d); void set_sb_max(); void set_playback_speed(int s); diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index 261eb2602..9180385d4 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -299,9 +299,14 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // prepare framebuffers for backend drawing operations if (c->fbo == nullptr) { - c->fbo = new QOpenGLFramebufferObject* [2]; - c->fbo[0] = new QOpenGLFramebufferObject(video_width, video_height); - c->fbo[1] = new QOpenGLFramebufferObject(video_width, video_height); + // create 3 fbos for nested sequences, 2 for most clips + int fbo_count = (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) ? 3 : 2; + + c->fbo = new QOpenGLFramebufferObject* [fbo_count]; + + for (int j=0;jfbo[j] = new QOpenGLFramebufferObject(video_width, video_height); + } } // if clip should actually be shown on screen in this frame @@ -419,8 +424,22 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { + // use clip textures for nested sequences, otherwise use main frame buffers + GLuint back_buffer_1; + GLuint backend_tex_1; + GLuint backend_tex_2; + if (params.nests.size() > 0) { + back_buffer_1 = params.nests.last()->fbo[1]->handle(); + backend_tex_1 = params.nests.last()->fbo[1]->texture(); + backend_tex_2 = params.nests.last()->fbo[2]->texture(); + } else { + back_buffer_1 = params.backend_buffer1; + backend_tex_1 = params.backend_attachment1; + backend_tex_2 = params.backend_attachment2; + } + // render a backbuffer - params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, params.backend_buffer1); + params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, back_buffer_1); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -466,7 +485,11 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // copy front buffer to back buffer - draw_clip(params.ctx, params.backend_buffer2, params.main_attachment, true); + if (params.nests.size() > 0) { + draw_clip(params.ctx, params.nests.last()->fbo[2]->handle(), params.nests.last()->fbo[0]->texture(), true); + } else { + draw_clip(params.ctx, params.backend_buffer2, params.main_attachment, true); + } @@ -479,11 +502,11 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // load background texture into texture unit 0 params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, params.backend_attachment2); + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_2); // load foreground texture into texture unit 1 params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 1); // Texture unit 1 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, params.backend_attachment1); + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_1); // bind and configure blending mode shader params.blend_mode_program->bind(); From c6da0b5912f13c92de5299dc966716e543cd20a3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 16:47:45 +1100 Subject: [PATCH 016/202] added ripple delete empty to hover focus --- mainwindow.cpp | 10 +++++++++- panels/timeline.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ panels/timeline.h | 9 ++++++++- ui/timelinewidget.cpp | 43 ++++--------------------------------------- ui/timelinewidget.h | 8 ++------ 5 files changed, 64 insertions(+), 47 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 34368b9e1..881ec2cef 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -436,7 +436,15 @@ void MainWindow::export_dialog() { } void MainWindow::ripple_delete() { - if (sequence != nullptr) panel_timeline->delete_selection(sequence->selections, true); + if (sequence != nullptr) { + if (sequence->selections.size() > 0) { + panel_timeline->delete_selection(sequence->selections, true); + } else if (config.hover_focus && get_focused_panel() == panel_timeline) { + if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { + panel_timeline->ripple_delete_empty_space(); + } + } + } } void MainWindow::editMenu_About_To_Be_Shown() { diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 08d06edb5..1f9481410 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -484,6 +484,47 @@ void Timeline::select_from_playhead() { } } +bool Timeline::can_ripple_empty_space(long frame, int track) { + bool can_ripple_delete = true; + bool at_end_of_sequence = true; + rc_ripple_min = 0; + rc_ripple_max = LONG_MAX; + + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != nullptr) { + if (c->timeline_in > frame || c->timeline_out > frame) { + at_end_of_sequence = false; + } + if (c->track == track) { + if (c->timeline_in <= frame && c->timeline_out >= frame) { + can_ripple_delete = false; + break; + } else if (c->timeline_out < frame) { + rc_ripple_min = qMax(rc_ripple_min, c->timeline_out); + } else if (c->timeline_in > frame) { + rc_ripple_max = qMin(rc_ripple_max, c->timeline_in); + } + } + } + } + + return (can_ripple_delete && !at_end_of_sequence); +} + +void Timeline::ripple_delete_empty_space() { + QVector sels; + + Selection s; + s.in = rc_ripple_min; + s.out = rc_ripple_max; + s.track = panel_timeline->cursor_track; + + sels.append(s); + + panel_timeline->delete_selection(sels, true); +} + void Timeline::resizeEvent(QResizeEvent *) { // adjust maximum scrollbar if (sequence != nullptr) set_sb_max(); diff --git a/panels/timeline.h b/panels/timeline.h index 3cce9a136..94cf94657 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -72,7 +72,7 @@ class Timeline : public QDockWidget { Q_OBJECT public: - explicit Timeline(QWidget *parent = 0); + explicit Timeline(QWidget *parent = nullptr); ~Timeline(); bool focused(); @@ -204,6 +204,8 @@ public: void scroll_to_frame(long frame); void select_from_playhead(); + bool can_ripple_empty_space(long frame, int track); + void resizeEvent(QResizeEvent *event); public slots: void paste(bool insert = false); @@ -212,6 +214,7 @@ public slots: void deselect(); void toggle_links(); void split_at_playhead(); + void ripple_delete_empty_space(); private slots: void zoom_in(); @@ -238,6 +241,10 @@ private: int default_track_height; + // ripple delete empty space variables + long rc_ripple_min; + long rc_ripple_max; + QWidget* timeline_area; TimelineWidget* video_area; TimelineWidget* audio_area; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 3417bb342..b215fbc88 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -66,19 +66,6 @@ TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent) { connect(&tooltip_timer, SIGNAL(timeout()), this, SLOT(tooltip_timer_timeout())); } -void TimelineWidget::right_click_ripple() { - QVector sels; - - Selection s; - s.in = rc_ripple_min; - s.out = rc_ripple_max; - s.track = panel_timeline->cursor_track; - - sels.append(s); - - panel_timeline->delete_selection(sels, true); -} - void TimelineWidget::show_context_menu(const QPoint& pos) { if (sequence != nullptr) { // hack because sometimes right clicking doesn't trigger mouse release event @@ -114,36 +101,14 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { if (selected_clips.isEmpty()) { // no clips are selected + + // determine if we can perform a ripple empty space panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()); panel_timeline->cursor_track = getTrackFromScreenPoint(pos.y()); - bool can_ripple_delete = true; - bool at_end_of_sequence = true; - rc_ripple_min = 0; - rc_ripple_max = LONG_MAX; - - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); - if (c != nullptr) { - if (c->timeline_in > panel_timeline->cursor_frame || c->timeline_out > panel_timeline->cursor_frame) { - at_end_of_sequence = false; - } - if (c->track == panel_timeline->cursor_track) { - if (c->timeline_in <= panel_timeline->cursor_frame && c->timeline_out >= panel_timeline->cursor_frame) { - can_ripple_delete = false; - break; - } else if (c->timeline_out < panel_timeline->cursor_frame) { - rc_ripple_min = qMax(rc_ripple_min, c->timeline_out); - } else if (c->timeline_in > panel_timeline->cursor_frame) { - rc_ripple_max = qMin(rc_ripple_max, c->timeline_in); - } - } - } - } - - if (can_ripple_delete && !at_end_of_sequence) { + if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { QAction* ripple_delete_action = menu.addAction("R&ipple Delete"); - connect(ripple_delete_action, SIGNAL(triggered(bool)), this, SLOT(right_click_ripple())); + connect(ripple_delete_action, SIGNAL(triggered(bool)), panel_timeline, SLOT(ripple_delete_empty_space())); } QAction* seq_settings = menu.addAction("Sequence Settings"); diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index b8339a1b6..863e03cda 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -63,13 +63,10 @@ private: QVector pre_clips; QVector post_clips; - Sequence* self_created_sequence; - - // used for "right click ripple" - long rc_ripple_min; - long rc_ripple_max; Media* rc_reveal_media; + Sequence* self_created_sequence; + QTimer tooltip_timer; int tooltip_clip; @@ -83,7 +80,6 @@ public slots: private slots: void reveal_media(); - void right_click_ripple(); void show_context_menu(const QPoint& pos); void toggle_autoscale(); void tooltip_timer_timeout(); From be854d14d6288b516ebaceac8fffd7eb429fa752 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 17:25:36 +1100 Subject: [PATCH 017/202] added configurable centered timecodes --- dialogs/preferencesdialog.cpp | 36 +++++++++++++++++++---------------- dialogs/preferencesdialog.h | 2 +- io/config.cpp | 7 ++++++- io/config.h | 1 + mainwindow.h | 11 ++++++----- ui/timelineheader.cpp | 23 ++++++++++++++++++++-- 6 files changed, 55 insertions(+), 25 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index da1ee09c2..4415db6ab 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -120,7 +120,7 @@ void PreferencesDialog::save() { return; } - bool needs_restart = false; + // save settings from UI to backend config.css_path = custom_css_fn->text(); mainWindow->load_css_from_file(config.css_path); @@ -133,24 +133,28 @@ void PreferencesDialog::save() { config.previous_queue_size = previous_queue_spinbox->value(); config.previous_queue_type = previous_queue_type->currentIndex(); - if (config.effect_textbox_lines != effect_textbox_lines_field->value()) { - needs_restart = true; - } + // the following settings may require a restart of Olive to take effect: + + bool needs_restart = false; + + if (config.effect_textbox_lines != effect_textbox_lines_field->value()) { + needs_restart = true; + } config.effect_textbox_lines = effect_textbox_lines_field->value(); - if (config.use_software_fallback != use_software_fallbacks_checkbox->isChecked()) { - needs_restart = true; - } - config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); + if (config.use_software_fallback != use_software_fallbacks_checkbox->isChecked()) { + needs_restart = true; + } + config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); // save keyboard shortcuts for (int i=0;iset_action_shortcut(); } - if (needs_restart) { - QMessageBox::information(this, tr("Warning"), tr("Some changed settings will require restarting Olive to take effect")); - } + if (needs_restart) { + QMessageBox::information(this, tr("Warning"), tr("Some changed settings will require restarting Olive to take effect")); + } accept(); } @@ -319,11 +323,11 @@ void PreferencesDialog::setup_ui() { effect_textbox_lines_field->setValue(config.effect_textbox_lines); general_layout->addWidget(effect_textbox_lines_field, 3, 1, 1, 2); - // General -> Use Software Fallbacks When Possible - use_software_fallbacks_checkbox = new QCheckBox(general_tab); - use_software_fallbacks_checkbox->setText(tr("Use Software Fallbacks When Possible")); - use_software_fallbacks_checkbox->setChecked(config.use_software_fallback); - general_layout->addWidget(use_software_fallbacks_checkbox, 4, 0, 1, 1); + // General -> Use Software Fallbacks When Possible + use_software_fallbacks_checkbox = new QCheckBox(general_tab); + use_software_fallbacks_checkbox->setText(tr("Use Software Fallbacks When Possible")); + use_software_fallbacks_checkbox->setChecked(config.use_software_fallback); + general_layout->addWidget(use_software_fallbacks_checkbox, 4, 0, 1, 1); tabWidget->addTab(general_tab, tr("General")); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index e9a4e059f..9e3ad21fc 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -61,7 +61,7 @@ private: QDoubleSpinBox* previous_queue_spinbox; QComboBox* previous_queue_type; QSpinBox* effect_textbox_lines_field; - QCheckBox* use_software_fallbacks_checkbox; + QCheckBox* use_software_fallbacks_checkbox; QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/io/config.cpp b/io/config.cpp index 97e1bf88c..912fe86e9 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -47,7 +47,8 @@ Config::Config() loop(true), seek_also_selects(false), effect_textbox_lines(3), - use_software_fallback(false) + use_software_fallback(false), + center_timeline_timecodes(true) {} void Config::load(QString path) { @@ -169,6 +170,9 @@ void Config::load(QString path) { } else if (stream.name() == "UseSoftwareFallback") { stream.readNext(); use_software_fallback = (stream.text() == "1"); + } else if (stream.name() == "CenterTimelineTimecodes") { + stream.readNext(); + center_timeline_timecodes = (stream.text() == "1"); } } } @@ -230,6 +234,7 @@ void Config::save(QString path) { stream.writeTextElement("CSSPath", css_path); stream.writeTextElement("EffectTextboxLines", QString::number(effect_textbox_lines)); stream.writeTextElement("UseSoftwareFallback", QString::number(use_software_fallback)); + stream.writeTextElement("CenterTimelineTimecodes", QString::number(center_timeline_timecodes)); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index 67b728b21..84bd848df 100644 --- a/io/config.h +++ b/io/config.h @@ -63,6 +63,7 @@ struct Config { QString css_path; int effect_textbox_lines; bool use_software_fallback; + bool center_timeline_timecodes; void load(QString path); void save(QString path); diff --git a/mainwindow.h b/mainwindow.h index 9bff5dd22..4652b2c24 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -39,6 +39,8 @@ public slots: void nest(); void toggle_full_screen(); + void toggle_bool_action(); + protected: void closeEvent(QCloseEvent *); void paintEvent(QPaintEvent *event); @@ -126,7 +128,6 @@ private slots: void edit_to_in_point(); void edit_to_out_point(); void paste_insert(); - void toggle_bool_action(); void set_autoscroll(); void menu_click_button(); void toggle_panel_visibility(); @@ -142,6 +143,10 @@ private: bool can_close_project(); void setup_menus(); + void set_bool_action_checked(QAction* a); + void set_int_action_checked(QAction* a, const int& i); + void set_button_action_checked(QAction* a); + // menu bar menus QMenu* window_menu; @@ -196,10 +201,6 @@ private: QAction* undo_action; QAction* redo_action; - void set_bool_action_checked(QAction* a); - void set_int_action_checked(QAction* a, const int& i); - void set_button_action_checked(QAction* a); - bool enable_launch_with_project; QString appName; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 3b4858e6a..5746028e4 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -22,6 +22,9 @@ #define SUBLINE_MIN_PADDING 50 // TODO play with this #define MARKER_SIZE 4 +// used only if center_timeline_timecodes is FALSE +#define TEXT_PADDING_FROM_LINE 4 + bool center_scroll_to_playhead(QScrollBar* bar, double zoom, long playhead) { // returns true is the scroll was changed, false if not int target_scroll = qMin(bar->maximum(), qMax(0, getScreenPointFromFrame(zoom, playhead)-(bar->width()>>1))); @@ -351,7 +354,16 @@ void TimelineHeader::paintEvent(QPaintEvent*) { timecode = frame_to_timecode(frame + in_visible, config.timecode_view, viewer->seq->frame_rate); fullTextWidth = fm.width(timecode); textWidth = fullTextWidth>>1; - text_x = lineX-textWidth; + + text_x = lineX; + + // centers the text to that point on the timeline, LEFT aligns it if not + if (config.center_timeline_timecodes) { + text_x -= textWidth; + } else { + text_x += TEXT_PADDING_FROM_LINE; + } + lastTextBoundary = lineX+textWidth; if (lastTextBoundary >= 0) { draw_text = true; @@ -366,7 +378,7 @@ void TimelineHeader::paintEvent(QPaintEvent*) { // draw line markers p.setPen(Qt::gray); - p.drawLine(lineX, yoff, lineX, height()); + p.drawLine(lineX, (!config.center_timeline_timecodes && draw_text) ? 0 : yoff, lineX, height()); // draw sub-line markers for (int j=1;jmake_inout_menu(&menu); + menu.addSeparator(); + + QAction* center_timecodes = menu.addAction(tr("Center Timecodes"), mainWindow, SLOT(toggle_bool_action())); + center_timecodes->setCheckable(true); + center_timecodes->setChecked(config.center_timeline_timecodes); + center_timecodes->setData(reinterpret_cast(&config.center_timeline_timecodes)); + menu.exec(mapToGlobal(pos)); } From 7ed15552ad6a7cb3d5afa2a78b15ee777bf9947d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 17:34:32 +1100 Subject: [PATCH 018/202] minor changes --- panels/viewer.cpp | 4 +--- ui/viewerwidget.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 35d92bfac..741ff166c 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -263,9 +263,7 @@ void Viewer::seek(long p) { } } reset_all_audio(); - if (last_playhead != seq->playhead) { - audio_scrub = true; - } + audio_scrub = true; last_playhead = seq->playhead; update_parents(update_fx); } diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index a4909ac5f..098a1201c 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -25,7 +25,7 @@ class ViewerWidget : public QOpenGLWidget, QOpenGLFunctions { Q_OBJECT public: - ViewerWidget(QWidget *parent = 0); + ViewerWidget(QWidget *parent = nullptr); ~ViewerWidget(); void delete_function(); From 09033e9cdf11cb9edbaceec2b53af546e47191df Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 23:18:35 +1100 Subject: [PATCH 019/202] prevent bezier handles crossing sides --- ui/graphview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/graphview.cpp b/ui/graphview.cpp index 7b1783714..c91a1d0c0 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -524,9 +524,9 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { } EffectKeyframe& key = row->field(handle_field)->keyframes[handle_index]; - key.pre_handle_x = new_pre_handle_x; + key.pre_handle_x = qMin(0.0, new_pre_handle_x); key.pre_handle_y = new_pre_handle_y; - key.post_handle_x = new_post_handle_x; + key.post_handle_x = qMax(0.0, new_post_handle_x); key.post_handle_y = new_post_handle_y; moved_keys = true; From e7034c5077f11ecf5e112801263f7979a184401a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 28 Jan 2019 23:28:47 +1100 Subject: [PATCH 020/202] made crop premultiply compliant --- effects/crop.frag | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/effects/crop.frag b/effects/crop.frag index 7dcf1b939..7fed98944 100644 --- a/effects/crop.frag +++ b/effects/crop.frag @@ -25,12 +25,10 @@ void main(void) { if (bottom > 0.0) alpha = alpha * clamp((((1.0-vTexCoord.y)+(0.5/f))-(bottom*0.01))*f, 0.0, 1.0); // bottom } - - gl_FragColor = vec4( - textureColor.r, - textureColor.g, - textureColor.b, + textureColor.r*alpha, + textureColor.g*alpha, + textureColor.b*alpha, alpha ); } \ No newline at end of file From 34484a4a7069477ae46c31e8b4f7fdd5295bcbd0 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 00:06:42 +1100 Subject: [PATCH 021/202] only recreate appimage on 32-bit --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0c9dcdffa..8cf625872 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,8 +5,8 @@ dist: trusty matrix: include: - - env: ARCH=x86_64 APPIMGTOOL=appimagetool-x86_64.AppImage - - env: ARCH=i386 APPIMGTOOL=appimagetool-i686.AppImage + - env: ARCH=x86_64 + - env: ARCH=i386 before_install: - sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y @@ -26,13 +26,10 @@ script: - mkdir -p appdir/usr/bin/ ; cp olive-editor appdir/usr/bin/ # FIXME; "make install" should do this - wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" - chmod a+x linuxdeployqt-continuous-x86_64.AppImage - - wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/$APPIMGTOOL" - - chmod a+x $APPIMGTOOL - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage - - rm Olive*.AppImage - - ./$APPIMGTOOL 'appdir' -n -g + - if [ "$ARCH" == "i386" ]; then rm Olive*.AppImage; wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage"; chmod a+x $APPIMGTOOL; ./$APPIMGTOOL 'appdir' -n -g; fi after_success: - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq From c92e721f6cc501cff5b9dd787c08a4ebcd1a7edf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 00:17:29 +1100 Subject: [PATCH 022/202] fixed broken command in 32-bit travis.yml build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8cf625872..244dc4f57 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,7 +29,7 @@ script: - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage - - if [ "$ARCH" == "i386" ]; then rm Olive*.AppImage; wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage"; chmod a+x $APPIMGTOOL; ./$APPIMGTOOL 'appdir' -n -g; fi + - if [ "$ARCH" == "i386" ]; then rm Olive*.AppImage; wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage"; chmod a+x appimagetool-i686.AppImage; ./appimagetool-i686.AppImage 'appdir' -n -g; fi after_success: - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq From d14da79b5efe45b74895d66f76b1bc62e512a2dd Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 01:52:55 +1100 Subject: [PATCH 023/202] made blend modes glsl es compliant --- effects/internal/blending.frag | 103 ++++++++++++--------------------- 1 file changed, 36 insertions(+), 67 deletions(-) diff --git a/effects/internal/blending.frag b/effects/internal/blending.frag index 21cdbe8a9..9a3a0883a 100644 --- a/effects/internal/blending.frag +++ b/effects/internal/blending.frag @@ -121,83 +121,54 @@ float blend_soft_light(float base, float blend) { // RGB blending function, alpha is handled below vec3 blend(vec3 base, vec3 blend) { - switch (blendmode) { - - case BLEND_MODE_AVERAGE: + if (blendmode == BLEND_MODE_AVERAGE) { return (base+blend)/2.0; - - case BLEND_MODE_COLORBURN: + } else if (blendmode == BLEND_MODE_COLORBURN) { return vec3(blend_color_burn(base.r, blend.r), blend_color_burn(base.g, blend.g), blend_color_burn(base.b, blend.b)); - - case BLEND_MODE_COLORDODGE: + } else if (blendmode == BLEND_MODE_COLORDODGE) { return vec3(blend_color_dodge(base.r, blend.r), blend_color_dodge(base.g, blend.g), blend_color_dodge(base.b, blend.b)); - - case BLEND_MODE_DARKEN: + } else if (blendmode == BLEND_MODE_DARKEN) { return vec3(blend_darken(base.r, blend.r), blend_darken(base.g, blend.g), blend_darken(base.b, blend.b)); - - case BLEND_MODE_DIFFERENCE: + } else if (blendmode == BLEND_MODE_DIFFERENCE) { return abs(base-blend); - - case BLEND_MODE_EXCLUSION: + } else if (blendmode == BLEND_MODE_EXCLUSION) { return base+blend-2.0*base*blend; - - case BLEND_MODE_GLOW: + } else if (blendmode == BLEND_MODE_GLOW) { return blend_reflect(blend, base); - - case BLEND_MODE_HARDLIGHT: + } else if (blendmode == BLEND_MODE_HARDLIGHT) { return blend_overlay(blend,base); - - case BLEND_MODE_HARDMIX: + } else if (blendmode == BLEND_MODE_HARDMIX) { return vec3(blend_hard_mix(base.r,blend.r),blend_hard_mix(base.g,blend.g),blend_hard_mix(base.b,blend.b)); - - case BLEND_MODE_LIGHTEN: + } else if (blendmode == BLEND_MODE_LIGHTEN) { return vec3(blend_lighten(base.r,blend.r),blend_lighten(base.g,blend.g),blend_lighten(base.b,blend.b)); - - case BLEND_MODE_LINEARBURN: - case BLEND_MODE_SUBTRACT: + } else if (blendmode == BLEND_MODE_LINEARBURN || blendmode == BLEND_MODE_SUBTRACT) { return blend_linear_burn(base, blend); - - case BLEND_MODE_ADD: - case BLEND_MODE_LINEARDODGE: + } else if (blendmode == BLEND_MODE_LINEARDODGE || blendmode == BLEND_MODE_ADD) { return blend_linear_dodge(base, blend); - - case BLEND_MODE_LINEARLIGHT: + } else if (blendmode == BLEND_MODE_LINEARLIGHT) { return vec3(blend_linear_light(base.r,blend.r),blend_linear_light(base.g,blend.g),blend_linear_light(base.b,blend.b)); - - case BLEND_MODE_MULTIPLY: + } else if (blendmode == BLEND_MODE_MULTIPLY) { return (base * blend); - - case BLEND_MODE_NEGATION: + } else if (blendmode == BLEND_MODE_NEGATION) { return vec3(1.0)-abs(vec3(1.0)-base-blend); - - case BLEND_MODE_OVERLAY: + } else if (blendmode == BLEND_MODE_OVERLAY) { return blend_overlay(base, blend); - - case BLEND_MODE_PHOENIX: + } else if (blendmode == BLEND_MODE_PHOENIX) { return min(base,blend)-max(base,blend)+vec3(1.0); - - case BLEND_MODE_PINLIGHT: + } else if (blendmode == BLEND_MODE_PINLIGHT) { return vec3(blend_pin_light(base.r,blend.r),blend_pin_light(base.g,blend.g),blend_pin_light(base.b,blend.b)); - - case BLEND_MODE_REFLECT: + } else if (blendmode == BLEND_MODE_REFLECT) { return blend_reflect(base, blend); - - case BLEND_MODE_SCREEN: + } else if (blendmode == BLEND_MODE_SCREEN) { return vec3(blend_screen(base.r,blend.r),blend_screen(base.g,blend.g),blend_screen(base.b,blend.b)); - - case BLEND_MODE_SUBSTRACT: + } else if (blendmode == BLEND_MODE_SUBSTRACT) { return max(base+blend-vec3(1.0),vec3(0.0)); - - case BLEND_MODE_SOFTLIGHT: + } else if (blendmode == BLEND_MODE_SOFTLIGHT) { return vec3(blend_soft_light(base.r,blend.r),blend_soft_light(base.g,blend.g),blend_soft_light(base.b,blend.b)); - - case BLEND_MODE_VIVIDLIGHT: + } else if (blendmode == BLEND_MODE_VIVIDLIGHT) { return vec3(blend_vivid_light(base.r,blend.r),blend_vivid_light(base.g,blend.g),blend_vivid_light(base.b,blend.b)); - - case BLEND_MODE_NORMAL: - default: + } else { return blend; - } } @@ -211,21 +182,19 @@ void main(void) { // add foreground and background alpha's together float alpha_opac = fg_color.a*opacity; - switch (blendmode) { - case BLEND_MODE_OVERLAY: - case BLEND_MODE_LIGHTEN: - case BLEND_MODE_SCREEN: - case BLEND_MODE_COLORDODGE: - case BLEND_MODE_LINEARDODGE: - case BLEND_MODE_ADD: - case BLEND_MODE_SOFTLIGHT: - case BLEND_MODE_NEGATION: - case BLEND_MODE_AVERAGE: - case BLEND_MODE_REFLECT: - case BLEND_MODE_EXCLUSION: - case BLEND_MODE_DIFFERENCE: + if (blendmode == BLEND_MODE_OVERLAY + || blendmode == BLEND_MODE_LIGHTEN + || blendmode == BLEND_MODE_SCREEN + || blendmode == BLEND_MODE_COLORDODGE + || blendmode == BLEND_MODE_LINEARDODGE + || blendmode == BLEND_MODE_ADD + || blendmode == BLEND_MODE_SOFTLIGHT + || blendmode == BLEND_MODE_NEGATION + || blendmode == BLEND_MODE_AVERAGE + || blendmode == BLEND_MODE_REFLECT + || blendmode == BLEND_MODE_EXCLUSION + || blendmode == BLEND_MODE_DIFFERENCE) { composite *= alpha_opac; - break; } vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a); From 4d49de937ca2a631e23defa03ab75420e31bea9a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 11:39:35 +1100 Subject: [PATCH 024/202] preserve vst data through saves even if vst is missing --- effects/internal/vsthost.cpp | 26 ++++++++++++++------------ effects/internal/vsthost.h | 2 ++ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index bdd007ecd..481341b15 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -281,9 +281,9 @@ void VSTHost::process_audio(double, double, quint8* samples, int nb_bytes, int) void VSTHost::custom_load(QXmlStreamReader &stream) { if (stream.name() == "plugindata") { stream.readNext(); - QByteArray b = QByteArray::fromBase64(stream.text().toUtf8()); + data_cache = QByteArray::fromBase64(stream.text().toUtf8()); if (plugin != nullptr) { - dispatcher(plugin, effSetChunk, 0, int32_t(b.size()), static_cast(b.data()), 0); + dispatcher(plugin, effSetChunk, 0, int32_t(data_cache.size()), static_cast(data_cache.data()), 0); } } } @@ -293,25 +293,27 @@ void VSTHost::save(QXmlStreamWriter &stream) { if (plugin != nullptr) { char* p = nullptr; int32_t length = int32_t(dispatcher(plugin, effGetChunk, 0, 0, &p, 0)); - QByteArray b(p, length); - stream.writeTextElement("plugindata", b.toBase64()); + data_cache = QByteArray(p, length); + } + if (data_cache.size() > 0) { + stream.writeTextElement("plugindata", data_cache.toBase64()); } } void VSTHost::show_interface(bool show) { - dialog->setVisible(show); + dialog->setVisible(show); - if (show) { + if (show) { #if defined(_WIN32) - dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); + dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); #elif defined(__APPLE__) - dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); + dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); #elif defined(__linux__) - dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); + dispatcher(plugin, effEditOpen, 0, 0, reinterpret_cast(dialog->windowHandle()->winId()), 0); #endif - } else { - dispatcher(plugin, effEditClose, 0, 0, nullptr, 0); - } + } else { + dispatcher(plugin, effEditClose, 0, 0, nullptr, 0); + } } void VSTHost::uncheck_show_button() { diff --git a/effects/internal/vsthost.h b/effects/internal/vsthost.h index 25c4a2169..9fe6c0faf 100644 --- a/effects/internal/vsthost.h +++ b/effects/internal/vsthost.h @@ -45,6 +45,8 @@ private: float** outputs; QDialog* dialog; QPushButton* show_interface_btn; + QByteArray data_cache; + #if defined(__APPLE__) CFBundleRef bundle; #else From 4edf0a8fbd5db1516938473213ba5462d0f34893 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 15:22:16 +1100 Subject: [PATCH 025/202] for viewer zooming, scale texture instead of surface #332 --- panels/timeline.cpp | 2 - ui/viewercontainer.cpp | 148 ++++++++++++++++++++++++++++------------- ui/viewercontainer.h | 36 +++++----- ui/viewerwidget.cpp | 40 ++++++++--- ui/viewerwidget.h | 4 ++ 5 files changed, 154 insertions(+), 76 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index be8239734..7626318e2 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1825,7 +1825,6 @@ void Timeline::setup_ui() { videoScrollbar = new QScrollBar(videoContainer); videoScrollbar->setMaximum(0); videoScrollbar->setSingleStep(20); - videoScrollbar->setPageStep(1826); videoScrollbar->setOrientation(Qt::Vertical); videoContainerLayout->addWidget(videoScrollbar); @@ -1856,7 +1855,6 @@ void Timeline::setup_ui() { horizontalScrollBar = new ResizableScrollBar(timeline_area); horizontalScrollBar->setMaximum(0); horizontalScrollBar->setSingleStep(20); - horizontalScrollBar->setPageStep(1826); horizontalScrollBar->setOrientation(Qt::Horizontal); timeline_area_layout->addWidget(horizontalScrollBar); diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index 145cd49fc..8801db35e 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "viewerwidget.h" #include "panels/viewer.h" @@ -12,42 +13,52 @@ // enforces aspect ratio ViewerContainer::ViewerContainer(QWidget *parent) : - QScrollArea(parent), + QWidget(parent), fit(true), child(nullptr) { - setFrameShadow(QFrame::Plain); - setFrameShape(QFrame::NoFrame); + horizontal_scrollbar = new QScrollBar(Qt::Horizontal, this); + vertical_scrollbar = new QScrollBar(Qt::Vertical, this); - area = new QWidget(this); - area->move(0, 0); - setWidget(area); + horizontal_scrollbar->setSingleStep(20); + vertical_scrollbar->setSingleStep(20); - child = new ViewerWidget(area); + child = new ViewerWidget(this); child->container = this; + + connect(horizontal_scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scroll_changed())); + connect(vertical_scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scroll_changed())); } ViewerContainer::~ViewerContainer() { delete child; - delete area; + + delete horizontal_scrollbar; + delete vertical_scrollbar; } void ViewerContainer::dragScrollPress(const QPoint &p) { drag_start_x = p.x(); drag_start_y = p.y(); - horiz_start = horizontalScrollBar()->value(); - vert_start = verticalScrollBar()->value(); + + horiz_start = horizontal_scrollbar->value(); + vert_start = vertical_scrollbar->value(); } void ViewerContainer::dragScrollMove(const QPoint &p) { - int true_x = p.x() + (horiz_start - horizontalScrollBar()->value()); - int true_y = p.y() + (vert_start - verticalScrollBar()->value()); + int this_x = p.x(); + int this_y = p.y(); - horizontalScrollBar()->setValue(horizontalScrollBar()->value() + (drag_start_x - true_x)); - verticalScrollBar()->setValue(verticalScrollBar()->value() + (drag_start_y - true_y)); + horizontal_scrollbar->setValue(horiz_start + (drag_start_x-this_x)); + vertical_scrollbar->setValue(vert_start + (drag_start_y-this_y)); +} - drag_start_x = true_x; - drag_start_y = true_y; +void ViewerContainer::parseWheelEvent(QWheelEvent *event) { + if (event->modifiers() & Qt::AltModifier) { + QApplication::sendEvent(horizontal_scrollbar, event); + } else { + QApplication::sendEvent(vertical_scrollbar, event); + } } void ViewerContainer::adjust() { @@ -55,46 +66,87 @@ void ViewerContainer::adjust() { if (child->waveform) { child->move(0, 0); child->resize(size()); - } else if (fit) { - double aspect_ratio = double(viewer->seq->width)/double(viewer->seq->height); - - int widget_x = 0; - int widget_y = 0; - int widget_width = width(); - int widget_height = height(); - double widget_ar = double(widget_width) / double(widget_height); - - bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; - - if (widget_is_wider_than_sequence) { - widget_width = widget_height * aspect_ratio; - widget_x = (width() / 2) - (widget_width / 2); - } else { - widget_height = widget_width / aspect_ratio; - widget_y = (height() / 2) - (widget_height / 2); - } - - child->move(widget_x, widget_y); - child->resize(widget_width, widget_height); - - zoom = double(widget_width) / double(viewer->seq->width); } else { - int zoomed_width = double(viewer->seq->width)*zoom; - int zoomed_height = double(viewer->seq->height)*zoom; - int zoomed_x = 0; - int zoomed_y = 0; + horizontal_scrollbar->setVisible(false); + vertical_scrollbar->setVisible(false); - if (zoomed_width < width()) zoomed_x = (width()>>1)-(zoomed_width>>1); - if (zoomed_height < height()) zoomed_y = (height()>>1)-(zoomed_height>>1); + int zoomed_width = qRound(double(viewer->seq->width)*zoom); + int zoomed_height = qRound(double(viewer->seq->height)*zoom); - child->move(zoomed_x, zoomed_y); - child->resize(zoomed_width, zoomed_height); + if (fit || zoomed_width > width() || zoomed_height > height()) { + // if the zoom size is greater than or equal to the available area, only use the available area + + double aspect_ratio = double(viewer->seq->width)/double(viewer->seq->height); + + int widget_x = 0; + int widget_y = 0; + int widget_width = width(); + int widget_height = height(); + + if (!fit) { + widget_width -= vertical_scrollbar->width(); + widget_height -= horizontal_scrollbar->height(); + } + + double widget_ar = double(widget_width) / double(widget_height); + + bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; + + if (widget_is_wider_than_sequence) { + widget_width = widget_height * aspect_ratio; + widget_x = (width() / 2) - (widget_width / 2); + } else { + widget_height = widget_width / aspect_ratio; + widget_y = (height() / 2) - (widget_height / 2); + } + + child->move(widget_x, widget_y); + child->resize(widget_width, widget_height); + + if (fit) { + zoom = double(widget_width) / double(viewer->seq->width); + } else if (zoomed_width > width() || zoomed_height > height()) { + horizontal_scrollbar->setVisible(true); + vertical_scrollbar->setVisible(true); + + horizontal_scrollbar->setMaximum(zoomed_width - width()); + vertical_scrollbar->setMaximum(zoomed_height - height()); + + horizontal_scrollbar->setValue(horizontal_scrollbar->maximum()/2); + vertical_scrollbar->setValue(vertical_scrollbar->maximum()/2); + } + } else { + // if the zoom size is smaller than the available area, scale the surface down + + int zoomed_x = 0; + int zoomed_y = 0; + + if (zoomed_width < width()) zoomed_x = (width()>>1)-(zoomed_width>>1); + if (zoomed_height < height()) zoomed_y = (height()>>1)-(zoomed_height>>1); + + child->move(zoomed_x, zoomed_y); + child->resize(zoomed_width, zoomed_height); + } } } - area->resize(qMax(width(), child->width()), qMax(height(), child->height())); } void ViewerContainer::resizeEvent(QResizeEvent *event) { + horizontal_scrollbar->move(0, height()-horizontal_scrollbar->height()); + horizontal_scrollbar->setFixedWidth(width()-vertical_scrollbar->width()); + horizontal_scrollbar->setPageStep(width()); + + vertical_scrollbar->move(width() - vertical_scrollbar->width(), 0); + vertical_scrollbar->setFixedHeight(height()-horizontal_scrollbar->height()); + vertical_scrollbar->setPageStep(height()); + event->accept(); adjust(); } + +void ViewerContainer::scroll_changed() { + child->set_scroll( + double(horizontal_scrollbar->value())/double(horizontal_scrollbar->maximum()), + double(vertical_scrollbar->value())/double(vertical_scrollbar->maximum()) + ); +} diff --git a/ui/viewercontainer.h b/ui/viewercontainer.h index 921e2b9aa..e9e54937d 100644 --- a/ui/viewercontainer.h +++ b/ui/viewercontainer.h @@ -1,25 +1,27 @@ #ifndef VIEWERCONTAINER_H #define VIEWERCONTAINER_H -#include +#include class Viewer; class ViewerWidget; +class QScrollBar; -class ViewerContainer : public QScrollArea +class ViewerContainer : public QWidget { Q_OBJECT public: - explicit ViewerContainer(QWidget *parent = 0); - ~ViewerContainer(); + explicit ViewerContainer(QWidget *parent = 0); + ~ViewerContainer(); - bool fit; - double zoom; + bool fit; + double zoom; - void dragScrollPress(const QPoint&); - void dragScrollMove(const QPoint&); + void dragScrollPress(const QPoint&); + void dragScrollMove(const QPoint&); + void parseWheelEvent(QWheelEvent* event); - Viewer* viewer; - ViewerWidget* child; + Viewer* viewer; + ViewerWidget* child; void adjust(); protected: @@ -29,12 +31,16 @@ signals: public slots: +private slots: + void scroll_changed(); + private: - QWidget* area; - int drag_start_x; - int drag_start_y; - int horiz_start; - int vert_start; + int drag_start_x; + int drag_start_y; + int horiz_start; + int vert_start; + QScrollBar* horizontal_scrollbar; + QScrollBar* vertical_scrollbar; }; #endif // VIEWERCONTAINER_H diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 648199df2..ea2322836 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -56,7 +56,9 @@ ViewerWidget::ViewerWidget(QWidget *parent) : dragging(false), gizmos(nullptr), selected_gizmo(nullptr), - window(nullptr) + window(nullptr), + x_scroll(0), + y_scroll(0) { setMouseTracking(true); setFocusPolicy(Qt::ClickFocus); @@ -238,6 +240,12 @@ RenderThread *ViewerWidget::get_renderer() { return renderer; } +void ViewerWidget::set_scroll(double x, double y) { + x_scroll = x; + y_scroll = y; + update(); +} + //void ViewerWidget::resizeGL(int w, int h) //{ //} @@ -384,6 +392,10 @@ void ViewerWidget::mouseReleaseEvent(QMouseEvent *event) { dragging = false; } +void ViewerWidget::wheelEvent(QWheelEvent *event) { + container->parseWheelEvent(event); +} + void ViewerWidget::close_window() { if (window != nullptr) window->hide(); } @@ -547,7 +559,6 @@ void ViewerWidget::paintGL() { makeCurrent(); // clear to solid black - glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); @@ -558,7 +569,7 @@ void ViewerWidget::paintGL() { // set screen coords to widget size glLoadIdentity(); - glOrtho(0, 1, 0, 1, -1, 1); + glOrtho(-1, 1, -1, 1, -1, 1); // draw texture from render thread @@ -566,14 +577,21 @@ void ViewerWidget::paintGL() { glBegin(GL_QUADS); - glVertex2f(0, 0); - glTexCoord2f(0, 0); - glVertex2f(0, 1); - glTexCoord2f(1, 0); - glVertex2f(1, 1); - glTexCoord2f(1, 1); - glVertex2f(1, 0); - glTexCoord2f(0, 1); + double zoom_factor = container->zoom/(double(width())/double(viewer->seq->width)); + double zoom_size = (zoom_factor*2.0) - 2.0; + double zoom_left = -zoom_size*x_scroll - 1.0; + double zoom_right = zoom_size*(1.0-x_scroll) + 1.0; + double zoom_bottom = -zoom_size*(1.0-y_scroll) - 1.0; + double zoom_top = zoom_size*(y_scroll) + 1.0; + + glVertex2d(zoom_left, zoom_bottom); + glTexCoord2d(0, 0); + glVertex2d(zoom_left, zoom_top); + glTexCoord2d(1, 0); + glVertex2d(zoom_right, zoom_top); + glTexCoord2d(1, 1); + glVertex2d(zoom_right, zoom_bottom); + glTexCoord2d(0, 1); glEnd(); diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index 098a1201c..e6f0526c8 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -44,12 +44,14 @@ public: void frame_update(); RenderThread* get_renderer(); + void set_scroll(double x, double y); public slots: void set_waveform_scroll(int s); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); + void wheelEvent(QWheelEvent* event); private: void draw_waveform_func(); void draw_title_safe_area(); @@ -66,6 +68,8 @@ private: EffectGizmo* selected_gizmo; RenderThread* renderer; ViewerWindow* window; + double x_scroll; + double y_scroll; private slots: void context_destroy(); void retry(); From 998a6dfd3e882a7507abc9861b66fe794c95ceca Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 29 Jan 2019 15:31:32 +1100 Subject: [PATCH 026/202] added automatic translation files --- olive.pro | 6 + ts/olive_de.ts | 2992 ++++++++++++++++++++++++++++++++++++++++++++++++ ts/olive_es.ts | 2992 ++++++++++++++++++++++++++++++++++++++++++++++++ ts/olive_fr.ts | 2992 ++++++++++++++++++++++++++++++++++++++++++++++++ ts/olive_it.ts | 2992 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 11974 insertions(+) create mode 100644 ts/olive_de.ts create mode 100644 ts/olive_es.ts create mode 100644 ts/olive_fr.ts create mode 100644 ts/olive_it.ts diff --git a/olive.pro b/olive.pro index 115c65575..126c43d5f 100644 --- a/olive.pro +++ b/olive.pro @@ -238,6 +238,12 @@ HEADERS += \ FORMS += +TRANSLATIONS += \ + ts/olive_de.ts \ + ts/olive_es.ts \ + ts/olive_fr.ts \ + ts/olive_it.ts + win32 { RC_FILE = packaging/windows/resources.rc LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 diff --git a/ts/olive_de.ts b/ts/olive_de.ts new file mode 100644 index 000000000..27d00e038 --- /dev/null +++ b/ts/olive_de.ts @@ -0,0 +1,2992 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + + + + + Audio + + + Audio + + + + + Recording + + + + + AudioNoiseEffect + + + Amount + + + + + Mix + + + + + ChannelLayoutName + + + Invalid + + + + + Mono + + + + + Stereo + + + + + CollapsibleWidget + + + <untitled> + + + + + ColorButton + + + Set Color + + + + + CornerPinEffect + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Perspective + + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Enable/Disable In/Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Decrease Speed + + + + + Pause + + + + + Increase Speed + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 fields (%2 frames) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 channels + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + + + + + Sample Rate: + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + + + + + Stereo + + + + + Effect Textbox Lines: + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Disable Multithreading on Images + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Set Marker + + + + + Set marker name: + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + Link/Unlink + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + + + + + Mix + + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length: + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/ts/olive_es.ts b/ts/olive_es.ts new file mode 100644 index 000000000..27d00e038 --- /dev/null +++ b/ts/olive_es.ts @@ -0,0 +1,2992 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + + + + + Audio + + + Audio + + + + + Recording + + + + + AudioNoiseEffect + + + Amount + + + + + Mix + + + + + ChannelLayoutName + + + Invalid + + + + + Mono + + + + + Stereo + + + + + CollapsibleWidget + + + <untitled> + + + + + ColorButton + + + Set Color + + + + + CornerPinEffect + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Perspective + + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Enable/Disable In/Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Decrease Speed + + + + + Pause + + + + + Increase Speed + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 fields (%2 frames) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 channels + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + + + + + Sample Rate: + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + + + + + Stereo + + + + + Effect Textbox Lines: + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Disable Multithreading on Images + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Set Marker + + + + + Set marker name: + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + Link/Unlink + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + + + + + Mix + + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length: + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts new file mode 100644 index 000000000..27d00e038 --- /dev/null +++ b/ts/olive_fr.ts @@ -0,0 +1,2992 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + + + + + Audio + + + Audio + + + + + Recording + + + + + AudioNoiseEffect + + + Amount + + + + + Mix + + + + + ChannelLayoutName + + + Invalid + + + + + Mono + + + + + Stereo + + + + + CollapsibleWidget + + + <untitled> + + + + + ColorButton + + + Set Color + + + + + CornerPinEffect + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Perspective + + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Enable/Disable In/Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Decrease Speed + + + + + Pause + + + + + Increase Speed + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 fields (%2 frames) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 channels + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + + + + + Sample Rate: + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + + + + + Stereo + + + + + Effect Textbox Lines: + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Disable Multithreading on Images + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Set Marker + + + + + Set marker name: + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + Link/Unlink + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + + + + + Mix + + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length: + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/ts/olive_it.ts b/ts/olive_it.ts new file mode 100644 index 000000000..27d00e038 --- /dev/null +++ b/ts/olive_it.ts @@ -0,0 +1,2992 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + + + + + Audio + + + Audio + + + + + Recording + + + + + AudioNoiseEffect + + + Amount + + + + + Mix + + + + + ChannelLayoutName + + + Invalid + + + + + Mono + + + + + Stereo + + + + + CollapsibleWidget + + + <untitled> + + + + + ColorButton + + + Set Color + + + + + CornerPinEffect + + + Top Left + + + + + Top Right + + + + + Bottom Left + + + + + Bottom Right + + + + + Perspective + + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Enable/Disable In/Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Decrease Speed + + + + + Pause + + + + + Increase Speed + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 fields (%2 frames) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 channels + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + + + + + Sample Rate: + + + + + PanEffect + + + Pan + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + + + + + Stereo + + + + + Effect Textbox Lines: + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Disable Multithreading on Images + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Set Marker + + + + + Set marker name: + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + Link/Unlink + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + + + + + Mix + + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length: + + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + From cd28ea1b1d0988c812184633af81720e19cbdbc2 Mon Sep 17 00:00:00 2001 From: naj59 Date: Tue, 29 Jan 2019 15:11:29 +0100 Subject: [PATCH 027/202] fixed translation files --- ts/olive_es.ts | 2 +- ts/olive_fr.ts | 2 +- ts/olive_it.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ts/olive_es.ts b/ts/olive_es.ts index 27d00e038..ad2126531 100644 --- a/ts/olive_es.ts +++ b/ts/olive_es.ts @@ -1,6 +1,6 @@ - + AboutDialog diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts index 27d00e038..f0440adf2 100644 --- a/ts/olive_fr.ts +++ b/ts/olive_fr.ts @@ -1,6 +1,6 @@ - + AboutDialog diff --git a/ts/olive_it.ts b/ts/olive_it.ts index 27d00e038..da1d9e8bb 100644 --- a/ts/olive_it.ts +++ b/ts/olive_it.ts @@ -1,6 +1,6 @@ - + AboutDialog From 8f9a3f37e3cadd636d2d628e1e4c255e6cb8a940 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 11:19:30 +1100 Subject: [PATCH 028/202] optimized blurs --- effects/boxblur.frag | 32 +++++++++++++++------------ effects/boxblur.xml | 2 +- effects/gaussianblur.frag | 46 ++++++++++++++++++++++----------------- effects/gaussianblur.xml | 9 +++----- project/effect.cpp | 16 ++++++++++++-- project/effect.h | 3 ++- ui/renderfunctions.cpp | 8 ++++--- 7 files changed, 69 insertions(+), 47 deletions(-) diff --git a/effects/boxblur.frag b/effects/boxblur.frag index 626cc1f7e..3da0380bc 100644 --- a/effects/boxblur.frag +++ b/effects/boxblur.frag @@ -6,24 +6,28 @@ uniform float radius; uniform vec2 resolution; uniform bool horiz_blur; uniform bool vert_blur; +uniform int iteration; + +varying vec2 vTexCoord; void main(void) { float rad = ceil(radius); - float x_rad = (horiz_blur) ? rad : 0.5; - float y_rad = (vert_blur) ? rad : 0.5; - vec2 texCoord = gl_FragCoord.xy/resolution; - if (radius == 0.0 || (!horiz_blur && !vert_blur)) { - gl_FragColor = texture2D(image, texCoord); - } else { - float divider = 1.0; - if (horiz_blur) divider /= rad; - if (vert_blur) divider /= rad; - vec4 color = vec4(0.0); - for (float x=-x_rad+0.5;x<=x_rad;x+=2.0) { - for (float y=-y_rad+0.5;y<=y_rad;y+=2.0) { - color += texture2D(image, (vec2(gl_FragCoord.x+x, gl_FragCoord.y+y))/resolution)*(divider); - } + + float divider = 1.0 / rad; + vec4 color = vec4(0.0); + bool radius_is_zero = (rad == 0.0); + + if (iteration == 0 && horiz_blur && !radius_is_zero) { + for (float x=-rad+0.5;x<=rad;x+=2.0) { + color += texture2D(image, (vec2(gl_FragCoord.x+x, gl_FragCoord.y))/resolution)*(divider); } gl_FragColor = color; + } else if (iteration == 1 && vert_blur && !radius_is_zero) { + for (float x=-rad+0.5;x<=rad;x+=2.0) { + color += texture2D(image, (vec2(gl_FragCoord.x, gl_FragCoord.y+x))/resolution)*(divider); + } + gl_FragColor = color; + } else { + gl_FragColor = texture2D(image, vTexCoord); } } \ No newline at end of file diff --git a/effects/boxblur.xml b/effects/boxblur.xml index 1dd4cb45e..a6c0cb491 100644 --- a/effects/boxblur.xml +++ b/effects/boxblur.xml @@ -9,5 +9,5 @@ - + \ No newline at end of file diff --git a/effects/gaussianblur.frag b/effects/gaussianblur.frag index b5dd4e8c9..80aaedb18 100644 --- a/effects/gaussianblur.frag +++ b/effects/gaussianblur.frag @@ -4,13 +4,14 @@ uniform sampler2D image; -uniform float radius; +// uniform float radius; uniform float sigma; uniform vec2 resolution; uniform bool horiz_blur; uniform bool vert_blur; +uniform int iteration; -uniform bool opt; +varying vec2 vTexCoord; float gaussian(float x, float sigma) { return (1.0/(sigma*sqrt(2.0*M_PI)))*exp(-0.5*pow(x/sigma, 2.0)); @@ -21,28 +22,33 @@ float gaussian2(float x, float y, float sigma) { } void main(void) { - if (radius == 0.0 || sigma == 0.0 || (!horiz_blur && !vert_blur)) { - gl_FragColor = texture2D(image, gl_FragCoord.xy/resolution); - } else { - float rad = ceil(radius); - float x_rad = horiz_blur ? rad : 0.5; - float y_rad = vert_blur ? rad : 0.5; + float rad = ceil(sigma); - float sum = 0.0; + float sum = 0.0; - for (float x=-x_rad+0.5;x<=x_rad;x+=2.0) { - for (float y=-y_rad+0.5;y<=y_rad;y+=2.0) { - sum += gaussian2(x, y, sigma); - } + vec4 color = vec4(0.0); + + bool radius_is_zero = (rad == 0.0); + + if (!radius_is_zero) { + for (float x=-rad+0.5;x<=rad;x+=2.0) { + sum += gaussian2(x, 0.0, sigma); } + } - vec4 color = vec4(0.0); - for (float x=-x_rad+0.5;x<=x_rad;x+=2.0) { - for (float y=-y_rad+0.5;y<=y_rad;y+=2.0) { - float weight = (gaussian2(x, y, sigma)/sum); - color += texture2D(image, (vec2(gl_FragCoord.x+x, gl_FragCoord.y+y))/resolution)*(weight); - } + if (iteration == 0 && horiz_blur && !radius_is_zero) { + for (float x=-rad+0.5;x<=rad;x+=2.0) { + float weight = (gaussian2(x, 0.0, sigma)/sum); + color += texture2D(image, (vec2(gl_FragCoord.x+x, gl_FragCoord.y))/resolution)*(weight); } gl_FragColor = color; - } + } else if (iteration == 1 && vert_blur && !radius_is_zero) { + for (float x=-rad+0.5;x<=rad;x+=2.0) { + float weight = (gaussian2(0.0, x, sigma)/sum); + color += texture2D(image, (vec2(gl_FragCoord.x, gl_FragCoord.y+x))/resolution)*(weight); + } + gl_FragColor = color; + } else { + gl_FragColor = texture2D(image, vTexCoord); + } } \ No newline at end of file diff --git a/effects/gaussianblur.xml b/effects/gaussianblur.xml index 76a6bc82a..d0d669f6d 100644 --- a/effects/gaussianblur.xml +++ b/effects/gaussianblur.xml @@ -1,8 +1,8 @@ - + @@ -12,8 +12,5 @@ - - + \ No newline at end of file diff --git a/project/effect.cpp b/project/effect.cpp index 2beee31f7..7bb583bb4 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -102,7 +102,8 @@ Effect::Effect(Clip* c, const EffectMeta *em) : texture(nullptr), enable_always_update(false), isOpen(false), - bound(false) + bound(false), + iterations(1) { // set up base UI container = new CollapsibleWidget(); @@ -276,6 +277,8 @@ Effect::Effect(Clip* c, const EffectMeta *em) : vertPath = attr.value().toString(); } else if (attr.name() == "frag") { fragPath = attr.value().toString(); + } else if (attr.name() == "iterations") { + setIterations(attr.value().toInt()); } } }/* else if (reader.name() == "superimpose" && reader.isStartElement()) { @@ -695,6 +698,14 @@ void Effect::endEffect() { bound = false; } +int Effect::getIterations() { + return iterations; +} + +void Effect::setIterations(int i) { + iterations = i; +} + void Effect::process_image(double, uint8_t *, uint8_t *, int){} Effect* Effect::copy(Clip* c) { @@ -704,9 +715,10 @@ Effect* Effect::copy(Clip* c) { return copy; } -void Effect::process_shader(double timecode, GLTextureCoords&) { +void Effect::process_shader(double timecode, GLTextureCoords&, int iteration) { glslProgram->setUniformValue("resolution", parent_clip->getWidth(), parent_clip->getHeight()); glslProgram->setUniformValue("time", GLfloat(timecode)); + glslProgram->setUniformValue("iteration", iteration); for (int i=0;ienable_superimpose) { e->startEffect(); if (can_process_shaders && e->is_glsl_linked()) { - e->process_shader(timecode, coords); - composite_texture = draw_clip(c->fbo[fbo_switcher], composite_texture, true); - fbo_switcher = !fbo_switcher; + for (int i=0;igetIterations();i++) { + e->process_shader(timecode, coords, i); + composite_texture = draw_clip(c->fbo[fbo_switcher], composite_texture, true); + fbo_switcher = !fbo_switcher; + } } if (e->enable_superimpose) { GLuint superimpose_texture = e->process_superimpose(timecode); From 3d2ec7aee3a0457b1abb81d49dadadda9334193c Mon Sep 17 00:00:00 2001 From: oc1024 Date: Wed, 30 Jan 2019 00:30:38 -0200 Subject: [PATCH 029/202] Premultiply alpha + GLSL1.1 Support for Olive's new blend-mode infrastructure. Plus, `switch (compo) {` has been replaced with `if {} else if {}` in Color Finder so it runs on OpenGL 2.0 hardware. --- effects/colorsel.frag | 35 ++++++++++++++--------------------- effects/lumakey.frag | 1 + 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/effects/colorsel.frag b/effects/colorsel.frag index 05ddff90d..903e4a0f8 100644 --- a/effects/colorsel.frag +++ b/effects/colorsel.frag @@ -2,7 +2,7 @@ Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team) RGB to HSV based on MattKC's toonify source code Feel free to modify and use at will */ -#version 150 +#version 110 uniform sampler2D tex; varying vec2 vTexCoord; @@ -58,33 +58,26 @@ bool isNotIncreasingSequence(float a, float b, float c) { } void main(void) { - vec4 tc = texture2D(tex,vTexCoord); - vec3 color = tc.rgb; + vec4 texture_color = texture2D(tex,vTexCoord); + vec3 color = texture_color.rgb; float toCheck = 0.0; - switch(compo) { - case 0 : + if (compo == 0) { toCheck = rgb2luma(color)*100.0; - break; - case 4 : + } else if (compo == 4) { toCheck = color.r*100.0; - break; - case 5 : + } else if (compo == 5) { toCheck = color.g*100.0; - break; - case 6 : + } else if (compo == 6) { toCheck = color.b*100.0; - break; - case 1 : + } else if (compo == 1) { toCheck = rgb2hsv(color).z*100.0; - break; - case 2 : + } else if (compo == 2) { toCheck = rgb2hsv(color).x/3.6; - break; - case 3 : + } else if (compo == 3) { toCheck = rgb2hsv(color).y*100.0; - break; - } - tc.a = isNotIncreasingSequence(loc, toCheck, hic) ? (invert ? tc.a : 0.0) : (invert ? 0.0 : tc.a); - gl_FragColor = tc; + } + texture_color.a = isNotIncreasingSequence(loc, toCheck, hic) ? (invert ? texture_color.a : 0.0) : (invert ? 0.0 : texture_color.a); + texture_color.rgb *= texture_color.a; + gl_FragColor = texture_color; } diff --git a/effects/lumakey.frag b/effects/lumakey.frag index d8092c4cb..16dfdfa08 100644 --- a/effects/lumakey.frag +++ b/effects/lumakey.frag @@ -24,5 +24,6 @@ void main(void) { texture_color.a = (invert ? 1.0-luma : luma); } + texture_color.rgb *= texture_color.a; gl_FragColor = texture_color; } From fac921383348e997f2e163358484a5f68da7af7f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 13:44:23 +1100 Subject: [PATCH 030/202] added proxy dialog --- dialogs/proxydialog.cpp | 74 +++++++++++++++++++++++++++++++++++++++ dialogs/proxydialog.h | 30 ++++++++++++++++ olive.pro | 6 ++-- project/sourcescommon.cpp | 13 +++++++ project/sourcescommon.h | 37 ++++++++++---------- 5 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 dialogs/proxydialog.cpp create mode 100644 dialogs/proxydialog.h diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp new file mode 100644 index 000000000..bf3233a8b --- /dev/null +++ b/dialogs/proxydialog.cpp @@ -0,0 +1,74 @@ +#include "proxydialog.h" + +#include +#include +#include +#include +#include + +ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : QDialog(parent) { + // set dialog title + setWindowTitle(tr("Create Proxy")); + + // set proxy folder name to "Proxy", depending on the user's language + proxy_folder_name = tr("Proxy"); + + // set up dialog's layout + QGridLayout* layout = new QGridLayout(this); + + // set the video dimensions of the proxy + layout->addWidget(new QLabel(tr("Dimensions:"), this), 0, 0); + + QComboBox* size_combobox = new QComboBox(this); + size_combobox->addItem(tr("Same Size as Source"), 1.0); + size_combobox->addItem(tr("Half Resolution (1/2)"), 0.5); + size_combobox->addItem(tr("Quarter Resolution (1/4)"), 0.25); + size_combobox->addItem(tr("Eighth Resolution (1/8)"), 0.125); + size_combobox->addItem(tr("Sixteenth Resolution (1/16)"), 0.0625); + layout->addWidget(size_combobox, 0, 1); + + // set the desired format of the proxy to create + layout->addWidget(new QLabel(tr("Format:"), this), 1, 0); + + QComboBox* format_combobox = new QComboBox(this); + format_combobox->addItem(tr("ProRes HQ")); + format_combobox->addItem(tr("ProRes SQ")); + format_combobox->addItem(tr("ProRes LT")); + format_combobox->addItem(tr("DNxHD")); + format_combobox->addItem(tr("H.264")); + layout->addWidget(format_combobox, 1, 1); + + // set the location to place the proxies + layout->addWidget(new QLabel(tr("Location:"), this), 2, 0); + + location_combobox = new QComboBox(this); + location_combobox->addItem(tr("Same as Source (in \"%1\" folder)").arg(proxy_folder_name)); + location_combobox->addItem(""); + connect(location_combobox, SIGNAL(currentIndexChanged(int)), this, SLOT(location_changed(int))); + layout->addWidget(location_combobox, 2, 1); + + // location_changed will set the default "location" items + location_changed(0); + + // set up dialog buttons + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + buttons->setCenterButtons(true); + layout->addWidget(buttons, 3, 0, 1, 2); + connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); +} + +void ProxyDialog::location_changed(int i) { + custom_location.clear(); + if (i == 1) { + QString s = QFileDialog::getExistingDirectory(this); + if (s.isEmpty()) { + location_combobox->setCurrentIndex(0); + } else { + location_combobox->setItemText(1, s); + custom_location = s; + } + } else { + location_combobox->setItemText(1, tr("Custom Location")); + } +} diff --git a/dialogs/proxydialog.h b/dialogs/proxydialog.h new file mode 100644 index 000000000..fa994d1e1 --- /dev/null +++ b/dialogs/proxydialog.h @@ -0,0 +1,30 @@ +#ifndef PROXYDIALOG_H +#define PROXYDIALOG_H + +#include +#include +#include + +struct Footage; + +class ProxyDialog : public QDialog { + Q_OBJECT +public: + ProxyDialog(QWidget* parent, const QVector& footage); +private: + // user's dimensions + QComboBox* size_combobox; + + // allows users to set the location to store proxies + QComboBox* location_combobox; + + // stores the custom location to store proxies if the user sets a custom location + QString custom_location; + + // stores the subdirectory to be made next to the source in the user's language + QString proxy_folder_name; +private slots: + void location_changed(int i); +}; + +#endif // PROXYDIALOG_H diff --git a/olive.pro b/olive.pro index 126c43d5f..423b5dfac 100644 --- a/olive.pro +++ b/olive.pro @@ -133,7 +133,8 @@ SOURCES += \ project/effectloaders.cpp \ io/crossplatformlib.cpp \ effects/internal/vsthost.cpp \ - ui/flowlayout.cpp + ui/flowlayout.cpp \ + dialogs/proxydialog.cpp HEADERS += \ mainwindow.h \ @@ -234,7 +235,8 @@ HEADERS += \ project/effectloaders.h \ io/crossplatformlib.h \ effects/internal/vsthost.h \ - ui/flowlayout.h + ui/flowlayout.h \ + dialogs/proxydialog.h FORMS += diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index bb557381a..18462b889 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -9,6 +9,7 @@ #include "panels/viewer.h" #include "project/projectfilter.h" #include "io/config.h" +#include "dialogs/proxydialog.h" #include "mainwindow.h" #include @@ -126,6 +127,11 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it if (all_footage) { QAction* delete_footage_from_sequences = menu.addAction(tr("Delete All Clips Using This Media")); QObject::connect(delete_footage_from_sequences, SIGNAL(triggered(bool)), project_parent, SLOT(delete_clips_using_selected_media())); + + QMenu* proxies = menu.addMenu(tr("Proxy")); + proxies->addAction(tr("Create Proxy"), this, SLOT(open_create_proxy_dialog())); +// proxies->addAction(tr("Modify Proxy")); +// proxies->addAction(tr("Restore Original")); } // delete media @@ -293,3 +299,10 @@ void SourcesCommon::item_renamed(Media* item) { editing_item = nullptr; } } + +void SourcesCommon::open_create_proxy_dialog() { + QVector selected_footage; + + ProxyDialog pd(mainWindow, selected_footage); + pd.exec(); +} diff --git a/project/sourcescommon.h b/project/sourcescommon.h index 4522efdfa..aa740f1d9 100644 --- a/project/sourcescommon.h +++ b/project/sourcescommon.h @@ -11,29 +11,30 @@ class QAbstractItemView; class QDropEvent; class SourcesCommon : public QObject { - Q_OBJECT + Q_OBJECT public: - SourcesCommon(Project *parent); - QAbstractItemView* view; - void show_context_menu(QWidget* parent, const QModelIndexList &items); + SourcesCommon(Project *parent); + QAbstractItemView* view; + void show_context_menu(QWidget* parent, const QModelIndexList &items); - void mousePressEvent(QMouseEvent* e); - void mouseDoubleClickEvent(QMouseEvent* e, const QModelIndexList& selected_items); - void dropEvent(QWidget *parent, QDropEvent* e, const QModelIndex& drop_item, const QModelIndexList &items); + void mousePressEvent(QMouseEvent* e); + void mouseDoubleClickEvent(QMouseEvent* e, const QModelIndexList& selected_items); + void dropEvent(QWidget *parent, QDropEvent* e, const QModelIndex& drop_item, const QModelIndexList &items); - void item_click(Media* m, const QModelIndex &index); + void item_click(Media* m, const QModelIndex &index); private slots: - void create_seq_from_selected(); - void reveal_in_browser(); - void rename_interval(); - void item_renamed(Media *item); + void create_seq_from_selected(); + void reveal_in_browser(); + void rename_interval(); + void item_renamed(Media *item); + void open_create_proxy_dialog(); private: - Media* editing_item; - QModelIndex editing_index; - QModelIndexList selected_items; - Project* project_parent; - void stop_rename_timer(); - QTimer rename_timer; + Media* editing_item; + QModelIndex editing_index; + QModelIndexList selected_items; + Project* project_parent; + void stop_rename_timer(); + QTimer rename_timer; }; #endif // SOURCESCOMMON_H From 373875c72b8601a9008e27ef66f0cdd51b298ef2 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 14:03:23 +1100 Subject: [PATCH 031/202] ensuring UI items are parented --- dialogs/aboutdialog.cpp | 24 ++++++++++++------------ dialogs/actionsearch.cpp | 14 +++++++++----- dialogs/actionsearch.h | 8 ++++++-- dialogs/debugdialog.cpp | 4 ++-- dialogs/demonotice.cpp | 32 ++++++++++++++++---------------- dialogs/exportdialog.cpp | 10 +++++----- io/exportthread.cpp | 5 ++++- io/exportthread.h | 2 +- io/previewgenerator.h | 28 +++++++++++++++------------- 9 files changed, 70 insertions(+), 57 deletions(-) diff --git a/dialogs/aboutdialog.cpp b/dialogs/aboutdialog.cpp index 653f0b859..a62caee6a 100644 --- a/dialogs/aboutdialog.cpp +++ b/dialogs/aboutdialog.cpp @@ -10,21 +10,21 @@ AboutDialog::AboutDialog(QWidget *parent) : setWindowTitle("About Olive"); setMaximumWidth(360); - QVBoxLayout* layout = new QVBoxLayout(); + QVBoxLayout* layout = new QVBoxLayout(this); layout->setSpacing(20); setLayout(layout); - QLabel* label = - new QLabel("" - "

" - "

" - "" - "https://www.olivevideoeditor.org/" - "

" - + tr("Olive is a non-linear video editor. This software is free and protected by the GNU GPL.") - + "

" - + tr("Olive Team is obliged to inform users that Olive source code is available for download from its website.") - + "

"); + QLabel* label = + new QLabel("" + "

" + "

" + "" + "https://www.olivevideoeditor.org/" + "

" + + tr("Olive is a non-linear video editor. This software is free and protected by the GNU GPL.") + + "

" + + tr("Olive Team is obliged to inform users that Olive source code is available for download from its website.") + + "

", this); label->setAlignment(Qt::AlignCenter); label->setWordWrap(true); layout->addWidget(label); diff --git a/dialogs/actionsearch.cpp b/dialogs/actionsearch.cpp index b33624bc2..355a111e3 100644 --- a/dialogs/actionsearch.cpp +++ b/dialogs/actionsearch.cpp @@ -17,20 +17,20 @@ ActionSearch::ActionSearch(QWidget *parent) : setWindowFlags(Qt::Popup); - QVBoxLayout* layout = new QVBoxLayout(); + QVBoxLayout* layout = new QVBoxLayout(this); - ActionSearchEntry* entry_field = new ActionSearchEntry(); + ActionSearchEntry* entry_field = new ActionSearchEntry(this); QFont entry_field_font = entry_field->font(); entry_field_font.setPointSize(qRound(entry_field_font.pointSize()*1.2)); entry_field->setFont(entry_field_font); - entry_field->setPlaceholderText(tr("Search for action...")); + entry_field->setPlaceholderText(tr("Search for action...")); connect(entry_field, SIGNAL(textChanged(const QString&)), this, SLOT(search_update(const QString &))); connect(entry_field, SIGNAL(returnPressed()), this, SLOT(perform_action())); connect(entry_field, SIGNAL(moveSelectionUp()), this, SLOT(move_selection_up())); connect(entry_field, SIGNAL(moveSelectionDown()), this, SLOT(move_selection_down())); layout->addWidget(entry_field); - list_widget = new ActionSearchList(); + list_widget = new ActionSearchList(this); QFont list_widget_font = list_widget->font(); list_widget_font.setPointSize(qRound(list_widget_font.pointSize()*1.2)); list_widget->setFont(list_widget_font); @@ -65,7 +65,7 @@ void ActionSearch::search_update(const QString &s, const QString &p, QMenu *pare } else { QString comp = a->text().replace("&", ""); if (comp.contains(s, Qt::CaseInsensitive)) { - QListWidgetItem* item = new QListWidgetItem(comp + "\n(" + menu_text + ")"); + QListWidgetItem* item = new QListWidgetItem(QString("%1\n(%2)").arg(comp, menu_text), list_widget); item->setData(Qt::UserRole+1, reinterpret_cast(a)); list_widget->addItem(item); } @@ -107,6 +107,8 @@ void ActionSearch::move_selection_down() { } } +ActionSearchEntry::ActionSearchEntry(QWidget *parent) : QLineEdit(parent) {} + void ActionSearchEntry::keyPressEvent(QKeyEvent * event) { switch (event->key()) { case Qt::Key_Up: @@ -120,6 +122,8 @@ void ActionSearchEntry::keyPressEvent(QKeyEvent * event) { } } +ActionSearchList::ActionSearchList(QWidget *parent) : QListWidget(parent) {} + void ActionSearchList::mouseDoubleClickEvent(QMouseEvent *) { emit dbl_click(); } diff --git a/dialogs/actionsearch.h b/dialogs/actionsearch.h index 4147f8900..3a30f7c60 100644 --- a/dialogs/actionsearch.h +++ b/dialogs/actionsearch.h @@ -10,6 +10,8 @@ class QMenu; class ActionSearchList : public QListWidget { Q_OBJECT +public: + ActionSearchList(QWidget* parent); protected: void mouseDoubleClickEvent(QMouseEvent *event); signals: @@ -20,9 +22,9 @@ class ActionSearch : public QDialog { Q_OBJECT public: - ActionSearch(QWidget* parent = 0); + ActionSearch(QWidget* parent = nullptr); private slots: - void search_update(const QString& s, const QString &p = 0, QMenu *parent = nullptr); + void search_update(const QString& s, const QString &p = nullptr, QMenu *parent = nullptr); void perform_action(); void move_selection_up(); void move_selection_down(); @@ -32,6 +34,8 @@ private: class ActionSearchEntry : public QLineEdit { Q_OBJECT +public: + ActionSearchEntry(QWidget* parent); protected: void keyPressEvent(QKeyEvent * event); signals: diff --git a/dialogs/debugdialog.cpp b/dialogs/debugdialog.cpp index cb8559062..daba96b91 100644 --- a/dialogs/debugdialog.cpp +++ b/dialogs/debugdialog.cpp @@ -11,10 +11,10 @@ DebugDialog* debug_dialog = nullptr; DebugDialog::DebugDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Debug Log")); - QVBoxLayout* layout = new QVBoxLayout(); + QVBoxLayout* layout = new QVBoxLayout(this); setLayout(layout); - textEdit = new QTextEdit(); + textEdit = new QTextEdit(this); textEdit->setWordWrapMode(QTextOption::NoWrap); layout->addWidget(textEdit); } diff --git a/dialogs/demonotice.cpp b/dialogs/demonotice.cpp index b47bb9fc1..adfda7792 100644 --- a/dialogs/demonotice.cpp +++ b/dialogs/demonotice.cpp @@ -7,31 +7,31 @@ DemoNotice::DemoNotice(QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Welcome to Olive!")); + setWindowTitle(tr("Welcome to Olive!")); setMaximumWidth(600); - QVBoxLayout* vlayout = new QVBoxLayout(); + QVBoxLayout* vlayout = new QVBoxLayout(this); setLayout(vlayout); - QHBoxLayout* layout = new QHBoxLayout(); + QHBoxLayout* layout = new QHBoxLayout(this); layout->setMargin(10); layout->setSpacing(20); - QLabel* icon = new QLabel("" - "

" - ""); + QLabel* icon = new QLabel("" + "

" + "", this); layout->addWidget(icon); - QLabel* text = new QLabel("

" - "" - + tr("Welcome to Olive!") - + "

" - + tr("Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed.") - + "

" - + tr("This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1").arg("www.olivevideoeditor.org") - + "

" - + tr("Thank you for trying Olive and we hope you enjoy it!") - + "

"); + QLabel* text = new QLabel("

" + "" + + tr("Welcome to Olive!") + + "

" + + tr("Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed.") + + "

" + + tr("This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1").arg("www.olivevideoeditor.org") + + "

" + + tr("Thank you for trying Olive and we hope you enjoy it!") + + "

", this); text->setWordWrap(true); layout->addWidget(text); diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 5ed83c0fd..3bad14add 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -498,7 +498,7 @@ void ExportDialog::export_action() { } } - et = new ExportThread(); + et = new ExportThread(this); connect(et, SIGNAL(finished()), et, SLOT(deleteLater())); connect(et, SIGNAL(finished()), this, SLOT(render_thread_finished())); @@ -599,9 +599,9 @@ void ExportDialog::comp_type_changed(int) { void ExportDialog::setup_ui() { QVBoxLayout* verticalLayout = new QVBoxLayout(this); - QHBoxLayout* format_layout = new QHBoxLayout(); + QHBoxLayout* format_layout = new QHBoxLayout(this); - format_layout->addWidget(new QLabel(tr("Format:"))); + format_layout->addWidget(new QLabel(tr("Format:"), this)); formatCombobox = new QComboBox(this); @@ -609,9 +609,9 @@ void ExportDialog::setup_ui() { verticalLayout->addLayout(format_layout); - QHBoxLayout* range_layout = new QHBoxLayout(); + QHBoxLayout* range_layout = new QHBoxLayout(this); - range_layout->addWidget(new QLabel(tr("Range:"))); + range_layout->addWidget(new QLabel(tr("Range:"), this)); rangeCombobox = new QComboBox(this); rangeCombobox->addItem(tr("Entire Sequence")); diff --git a/io/exportthread.cpp b/io/exportthread.cpp index a16a27ec7..f5eff945a 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -27,7 +27,10 @@ extern "C" { #include #include -ExportThread::ExportThread() : continueEncode(true) { +ExportThread::ExportThread(QObject *parent) : + QThread(parent), + continueEncode(true) +{ surface.create(); fmt_ctx = nullptr; diff --git a/io/exportthread.h b/io/exportthread.h index b06ddc2c2..ae37ed292 100644 --- a/io/exportthread.h +++ b/io/exportthread.h @@ -28,7 +28,7 @@ extern "C" { class ExportThread : public QThread { Q_OBJECT public: - ExportThread(); + ExportThread(QObject* parent = nullptr); void run(); // export parameters diff --git a/io/previewgenerator.h b/io/previewgenerator.h index 3065bb072..76327c40d 100644 --- a/io/previewgenerator.h +++ b/io/previewgenerator.h @@ -4,10 +4,12 @@ #include #include -#define ICON_TYPE_VIDEO 0 -#define ICON_TYPE_AUDIO 1 -#define ICON_TYPE_IMAGE 2 -#define ICON_TYPE_ERROR 3 +enum IconType { + ICON_TYPE_VIDEO, + ICON_TYPE_AUDIO, + ICON_TYPE_IMAGE, + ICON_TYPE_ERROR +}; struct Footage; struct FootageStream; @@ -16,28 +18,28 @@ class Media; class PreviewGenerator : public QThread { - Q_OBJECT + Q_OBJECT public: PreviewGenerator(Media*, Footage*, bool); - void run(); + void run(); void cancel(); signals: void set_icon(int, bool); private: - void parse_media(); + void parse_media(); bool retrieve_preview(const QString &hash); - void generate_waveform(); + void generate_waveform(); void finalize_media(); - AVFormatContext* fmt_ctx; - Media* media; - Footage* footage; + AVFormatContext* fmt_ctx; + Media* media; + Footage* footage; bool retrieve_duration; bool contains_still_image; bool replace; bool cancelled; QString data_path; - QString get_thumbnail_path(const QString &hash, const FootageStream &ms); - QString get_waveform_path(const QString& hash, const FootageStream &ms); + QString get_thumbnail_path(const QString &hash, const FootageStream &ms); + QString get_waveform_path(const QString& hash, const FootageStream &ms); }; #endif // PREVIEWGENERATOR_H From e77d72f436d05dd3dcd64068463e98cb72151345 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 14:11:45 +1100 Subject: [PATCH 032/202] fixed corner pin regression --- effects/internal/cornerpineffect.cpp | 2 +- effects/internal/cornerpineffect.h | 34 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/effects/internal/cornerpineffect.cpp b/effects/internal/cornerpineffect.cpp index 11730619e..d23525e2c 100644 --- a/effects/internal/cornerpineffect.cpp +++ b/effects/internal/cornerpineffect.cpp @@ -61,7 +61,7 @@ void CornerPinEffect::process_coords(double timecode, GLTextureCoords &coords, i coords.vertexBottomRightY += bottom_right_y->get_double_value(timecode); } -void CornerPinEffect::process_shader(double timecode, GLTextureCoords &coords) { +void CornerPinEffect::process_shader(double timecode, GLTextureCoords &coords, int iterations) { glslProgram->setUniformValue("p0", (GLfloat) coords.vertexBottomLeftX, (GLfloat) coords.vertexBottomLeftY); glslProgram->setUniformValue("p1", (GLfloat) coords.vertexBottomRightX, (GLfloat) coords.vertexBottomRightY); glslProgram->setUniformValue("p2", (GLfloat) coords.vertexTopLeftX, (GLfloat) coords.vertexTopLeftY); diff --git a/effects/internal/cornerpineffect.h b/effects/internal/cornerpineffect.h index 2a98e009e..882a19c5c 100644 --- a/effects/internal/cornerpineffect.h +++ b/effects/internal/cornerpineffect.h @@ -4,27 +4,27 @@ #include "project/effect.h" class CornerPinEffect : public Effect { - Q_OBJECT + Q_OBJECT public: - CornerPinEffect(Clip* c, const EffectMeta* em); - void process_coords(double timecode, GLTextureCoords& coords, int data); - void process_shader(double timecode, GLTextureCoords& coords); - void gizmo_draw(double timecode, GLTextureCoords& coords); + CornerPinEffect(Clip* c, const EffectMeta* em); + void process_coords(double timecode, GLTextureCoords& coords, int data); + void process_shader(double timecode, GLTextureCoords& coords, int iterations); + void gizmo_draw(double timecode, GLTextureCoords& coords); private: - EffectField* top_left_x; - EffectField* top_left_y; - EffectField* top_right_x; - EffectField* top_right_y; - EffectField* bottom_left_x; - EffectField* bottom_left_y; - EffectField* bottom_right_x; - EffectField* bottom_right_y; + EffectField* top_left_x; + EffectField* top_left_y; + EffectField* top_right_x; + EffectField* top_right_y; + EffectField* bottom_left_x; + EffectField* bottom_left_y; + EffectField* bottom_right_x; + EffectField* bottom_right_y; EffectField* perspective; - EffectGizmo* top_left_gizmo; - EffectGizmo* top_right_gizmo; - EffectGizmo* bottom_left_gizmo; - EffectGizmo* bottom_right_gizmo; + EffectGizmo* top_left_gizmo; + EffectGizmo* top_right_gizmo; + EffectGizmo* bottom_left_gizmo; + EffectGizmo* bottom_right_gizmo; }; #endif // CORNERPINEFFECT_H From 6f3a826da78956118c9fd5626cb136735174a079 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 17:36:54 +1100 Subject: [PATCH 033/202] ensured parenting of qwidgets --- dialogs/aboutdialog.cpp | 1 - dialogs/actionsearch.cpp | 2 - dialogs/debugdialog.cpp | 1 - dialogs/demonotice.cpp | 1 - dialogs/exportdialog.cpp | 20 ++--- dialogs/loaddialog.cpp | 13 ++- dialogs/mediapropertiesdialog.cpp | 29 +++--- dialogs/newsequencedialog.cpp | 19 ++-- dialogs/preferencesdialog.cpp | 48 +++++----- dialogs/replaceclipmediadialog.cpp | 66 +++++++------- dialogs/speeddialog.cpp | 27 +++--- dialogs/stabilizerdialog.cpp | 127 ++++++++++++++------------- dialogs/texteditdialog.cpp | 9 +- effects/internal/cornerpineffect.cpp | 10 +-- effects/internal/voideffect.cpp | 4 +- effects/internal/vsthost.cpp | 3 + mainwindow.cpp | 9 +- panels/effectcontrols.cpp | 27 +++--- panels/grapheditor.cpp | 53 ++++++----- panels/project.cpp | 16 ++-- panels/timeline.cpp | 84 +++++++++--------- panels/viewer.cpp | 3 +- playback/playback.cpp | 10 ++- project/effect.cpp | 7 +- project/effectfield.cpp | 2 + project/effectfield.h | 4 +- project/effectrow.cpp | 13 +-- project/effectrow.h | 1 + project/media.cpp | 2 +- ui/collapsiblewidget.cpp | 67 +++++++------- ui/embeddedfilechooser.cpp | 9 +- ui/keyframenavigator.cpp | 20 ++--- 32 files changed, 350 insertions(+), 357 deletions(-) diff --git a/dialogs/aboutdialog.cpp b/dialogs/aboutdialog.cpp index a62caee6a..3f595143c 100644 --- a/dialogs/aboutdialog.cpp +++ b/dialogs/aboutdialog.cpp @@ -12,7 +12,6 @@ AboutDialog::AboutDialog(QWidget *parent) : QVBoxLayout* layout = new QVBoxLayout(this); layout->setSpacing(20); - setLayout(layout); QLabel* label = new QLabel("" diff --git a/dialogs/actionsearch.cpp b/dialogs/actionsearch.cpp index 355a111e3..13c7f3c3b 100644 --- a/dialogs/actionsearch.cpp +++ b/dialogs/actionsearch.cpp @@ -37,8 +37,6 @@ ActionSearch::ActionSearch(QWidget *parent) : layout->addWidget(list_widget); connect(list_widget, SIGNAL(dbl_click()), this, SLOT(perform_action())); - setLayout(layout); - entry_field->setFocus(); } diff --git a/dialogs/debugdialog.cpp b/dialogs/debugdialog.cpp index daba96b91..6d2718bec 100644 --- a/dialogs/debugdialog.cpp +++ b/dialogs/debugdialog.cpp @@ -12,7 +12,6 @@ DebugDialog::DebugDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Debug Log")); QVBoxLayout* layout = new QVBoxLayout(this); - setLayout(layout); textEdit = new QTextEdit(this); textEdit->setWordWrapMode(QTextOption::NoWrap); diff --git a/dialogs/demonotice.cpp b/dialogs/demonotice.cpp index adfda7792..9f3055426 100644 --- a/dialogs/demonotice.cpp +++ b/dialogs/demonotice.cpp @@ -11,7 +11,6 @@ DemoNotice::DemoNotice(QWidget *parent) : setMaximumWidth(600); QVBoxLayout* vlayout = new QVBoxLayout(this); - setLayout(vlayout); QHBoxLayout* layout = new QHBoxLayout(this); layout->setMargin(10); diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 3bad14add..98c4089b2 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -628,27 +628,27 @@ void ExportDialog::setup_ui() { QGridLayout* videoGridLayout = new QGridLayout(videoGroupbox); - videoGridLayout->addWidget(new QLabel(tr("Codec:")), 0, 0, 1, 1); + videoGridLayout->addWidget(new QLabel(tr("Codec:"), this), 0, 0, 1, 1); vcodecCombobox = new QComboBox(videoGroupbox); videoGridLayout->addWidget(vcodecCombobox, 0, 1, 1, 1); - videoGridLayout->addWidget(new QLabel(tr("Width:")), 1, 0, 1, 1); + videoGridLayout->addWidget(new QLabel(tr("Width:"), this), 1, 0, 1, 1); widthSpinbox = new QSpinBox(videoGroupbox); widthSpinbox->setMaximum(16777216); videoGridLayout->addWidget(widthSpinbox, 1, 1, 1, 1); - videoGridLayout->addWidget(new QLabel(tr("Height:")), 2, 0, 1, 1); + videoGridLayout->addWidget(new QLabel(tr("Height:"), this), 2, 0, 1, 1); heightSpinbox = new QSpinBox(videoGroupbox); heightSpinbox->setMaximum(16777216); videoGridLayout->addWidget(heightSpinbox, 2, 1, 1, 1); - videoGridLayout->addWidget(new QLabel(tr("Frame Rate:")), 3, 0, 1, 1); + videoGridLayout->addWidget(new QLabel(tr("Frame Rate:"), this), 3, 0, 1, 1); framerateSpinbox = new QDoubleSpinBox(videoGroupbox); framerateSpinbox->setMaximum(60); framerateSpinbox->setValue(0); videoGridLayout->addWidget(framerateSpinbox, 3, 1, 1, 1); - videoGridLayout->addWidget(new QLabel(tr("Compression Type:")), 4, 0, 1, 1); + videoGridLayout->addWidget(new QLabel(tr("Compression Type:"), this), 4, 0, 1, 1); compressionTypeCombobox = new QComboBox(videoGroupbox); videoGridLayout->addWidget(compressionTypeCombobox, 4, 1, 1, 1); @@ -667,17 +667,17 @@ void ExportDialog::setup_ui() { QGridLayout* audioGridLayout = new QGridLayout(audioGroupbox); - audioGridLayout->addWidget(new QLabel(tr("Codec:")), 0, 0, 1, 1); + audioGridLayout->addWidget(new QLabel(tr("Codec:"), this), 0, 0, 1, 1); acodecCombobox = new QComboBox(audioGroupbox); audioGridLayout->addWidget(acodecCombobox, 0, 1, 1, 1); - audioGridLayout->addWidget(new QLabel(tr("Sampling Rate:")), 1, 0, 1, 1); + audioGridLayout->addWidget(new QLabel(tr("Sampling Rate:"), this), 1, 0, 1, 1); samplingRateSpinbox = new QSpinBox(audioGroupbox); samplingRateSpinbox->setMaximum(96000); samplingRateSpinbox->setValue(0); audioGridLayout->addWidget(samplingRateSpinbox, 1, 1, 1, 1); - audioGridLayout->addWidget(new QLabel(tr("Bitrate (Kbps/CBR):")), 3, 0, 1, 1); + audioGridLayout->addWidget(new QLabel(tr("Bitrate (Kbps/CBR):"), this), 3, 0, 1, 1); audiobitrateSpinbox = new QSpinBox(audioGroupbox); audiobitrateSpinbox->setMaximum(320); audiobitrateSpinbox->setValue(256); @@ -685,7 +685,7 @@ void ExportDialog::setup_ui() { verticalLayout->addWidget(audioGroupbox); - QHBoxLayout* progressLayout = new QHBoxLayout(); + QHBoxLayout* progressLayout = new QHBoxLayout(this); progressBar = new QProgressBar(this); progressBar->setFormat("%p% (ETA: 0:00:00)"); progressBar->setEnabled(false); @@ -701,7 +701,7 @@ void ExportDialog::setup_ui() { verticalLayout->addLayout(progressLayout); - QHBoxLayout* buttonLayout = new QHBoxLayout(); + QHBoxLayout* buttonLayout = new QHBoxLayout(this); buttonLayout->addStretch(); export_button = new QPushButton(this); diff --git a/dialogs/loaddialog.cpp b/dialogs/loaddialog.cpp index a0ac2a434..4c666cd82 100644 --- a/dialogs/loaddialog.cpp +++ b/dialogs/loaddialog.cpp @@ -14,22 +14,21 @@ #include "mainwindow.h" LoadDialog::LoadDialog(QWidget *parent, bool autorecovery) : QDialog(parent) { - setWindowTitle(tr("Loading...")); + setWindowTitle(tr("Loading...")); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - QVBoxLayout* layout = new QVBoxLayout(); - setLayout(layout); + QVBoxLayout* layout = new QVBoxLayout(this); - layout->addWidget(new QLabel(tr("Loading '%1'...").arg(project_url.mid(project_url.lastIndexOf('/')+1)))); + layout->addWidget(new QLabel(tr("Loading '%1'...").arg(project_url.mid(project_url.lastIndexOf('/')+1)), this)); - bar = new QProgressBar(); + bar = new QProgressBar(this); bar->setValue(0); layout->addWidget(bar); - cancel_button = new QPushButton(tr("Cancel")); + cancel_button = new QPushButton(tr("Cancel"), this); connect(cancel_button, SIGNAL(clicked(bool)), this, SLOT(cancel())); - hboxLayout = new QHBoxLayout(); + hboxLayout = new QHBoxLayout(this); hboxLayout->addStretch(); hboxLayout->addWidget(cancel_button); hboxLayout->addStretch(); diff --git a/dialogs/mediapropertiesdialog.cpp b/dialogs/mediapropertiesdialog.cpp index bacc74cea..a2cf5fc67 100644 --- a/dialogs/mediapropertiesdialog.cpp +++ b/dialogs/mediapropertiesdialog.cpp @@ -23,17 +23,16 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : setWindowTitle(tr("\"%1\" Properties").arg(i->get_name())); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - QGridLayout* grid = new QGridLayout(); - setLayout(grid); + QGridLayout* grid = new QGridLayout(this); int row = 0; Footage* f = item->to_footage(); - grid->addWidget(new QLabel(tr("Tracks:")), row, 0, 1, 2); + grid->addWidget(new QLabel(tr("Tracks:"), this), row, 0, 1, 2); row++; - track_list = new QListWidget(); + track_list = new QListWidget(this); for (int i=0;ivideo_tracks.size();i++) { const FootageStream& fs = f->video_tracks.at(i); @@ -43,7 +42,8 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : QString::number(fs.video_width), QString::number(fs.video_height), QString::number(fs.video_frame_rate) - ) + ), + track_list ); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(fs.enabled ? Qt::Checked : Qt::Unchecked); @@ -57,7 +57,8 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : QString::number(fs.file_index), QString::number(fs.audio_frequency), QString::number(fs.audio_channels) - ) + ), + track_list ); item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(fs.enabled ? Qt::Checked : Qt::Unchecked); @@ -70,8 +71,8 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : if (f->video_tracks.size() > 0) { // frame conforming if (!f->video_tracks.at(0).infinite_length) { - grid->addWidget(new QLabel(tr("Conform to Frame Rate:")), row, 0); - conform_fr = new QDoubleSpinBox(); + grid->addWidget(new QLabel(tr("Conform to Frame Rate:"), this), row, 0); + conform_fr = new QDoubleSpinBox(this); conform_fr->setMinimum(0.01); conform_fr->setValue(f->video_tracks.at(0).video_frame_rate * f->speed); grid->addWidget(conform_fr, row, 1); @@ -80,14 +81,14 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : row++; // premultiplied alpha mode - premultiply_alpha_setting = new QCheckBox(tr("Alpha is Premultiplied")); + premultiply_alpha_setting = new QCheckBox(tr("Alpha is Premultiplied"), this); premultiply_alpha_setting->setChecked(f->alpha_is_premultiplied); grid->addWidget(premultiply_alpha_setting, row, 0); row++; // deinterlacing mode - interlacing_box = new QComboBox(); + interlacing_box = new QComboBox(this); interlacing_box->addItem( tr("Auto (%1)").arg( get_interlacing_name(f->video_tracks.at(0).video_auto_interlacing) @@ -102,18 +103,18 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : ? 0 : f->video_tracks.at(0).video_interlacing + 1); - grid->addWidget(new QLabel(tr("Interlacing:")), row, 0); + grid->addWidget(new QLabel(tr("Interlacing:"), this), row, 0); grid->addWidget(interlacing_box, row, 1); row++; } - name_box = new QLineEdit(item->get_name()); - grid->addWidget(new QLabel(tr("Name:")), row, 0); + name_box = new QLineEdit(item->get_name(), this); + grid->addWidget(new QLabel(tr("Name:"), this), row, 0); grid->addWidget(name_box, row, 1); row++; - QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); buttons->setCenterButtons(true); grid->addWidget(buttons, row, 0, 1, 2); diff --git a/dialogs/newsequencedialog.cpp b/dialogs/newsequencedialog.cpp index 567f12a24..9eaf35367 100644 --- a/dialogs/newsequencedialog.cpp +++ b/dialogs/newsequencedialog.cpp @@ -103,8 +103,7 @@ void NewSequenceDialog::create() { accept(); } -void NewSequenceDialog::preset_changed(int index) -{ +void NewSequenceDialog::preset_changed(int index) { switch (index) { case 0: // FILM 4K width_numeric->setValue(4096); @@ -157,7 +156,7 @@ void NewSequenceDialog::setup_ui() { QHBoxLayout* preset_layout = new QHBoxLayout(widget); preset_layout->setContentsMargins(0, 0, 0, 0); - preset_layout->addWidget(new QLabel(tr("Preset:"))); + preset_layout->addWidget(new QLabel(tr("Preset:"), this)); preset_combobox = new QComboBox(widget); @@ -183,19 +182,19 @@ void NewSequenceDialog::setup_ui() { QGridLayout* videoLayout = new QGridLayout(videoGroupBox); - videoLayout->addWidget(new QLabel(tr("Width:")), 0, 0, 1, 1); + videoLayout->addWidget(new QLabel(tr("Width:"), this), 0, 0, 1, 1); width_numeric = new QSpinBox(videoGroupBox); width_numeric->setMaximum(9999); width_numeric->setValue(1920); videoLayout->addWidget(width_numeric, 0, 2, 1, 2); - videoLayout->addWidget(new QLabel(tr("Height:")), 1, 0, 1, 2); + videoLayout->addWidget(new QLabel(tr("Height:"), this), 1, 0, 1, 2); height_numeric = new QSpinBox(videoGroupBox); height_numeric->setMaximum(9999); height_numeric->setValue(1080); videoLayout->addWidget(height_numeric, 1, 2, 1, 2); - videoLayout->addWidget(new QLabel(tr("Frame Rate:")), 2, 0, 1, 1); + videoLayout->addWidget(new QLabel(tr("Frame Rate:"), this), 2, 0, 1, 1); frame_rate_combobox = new QComboBox(videoGroupBox); frame_rate_combobox->addItem("10 FPS", 10.0); frame_rate_combobox->addItem("12.5 FPS", 12.5); @@ -211,12 +210,12 @@ void NewSequenceDialog::setup_ui() { frame_rate_combobox->setCurrentIndex(6); videoLayout->addWidget(frame_rate_combobox, 2, 2, 1, 2); - videoLayout->addWidget(new QLabel(tr("Pixel Aspect Ratio:")), 4, 0, 1, 1); + videoLayout->addWidget(new QLabel(tr("Pixel Aspect Ratio:"), this), 4, 0, 1, 1); par_combobox = new QComboBox(videoGroupBox); par_combobox->addItem(tr("Square Pixels (1.0)")); videoLayout->addWidget(par_combobox, 4, 2, 1, 2); - videoLayout->addWidget(new QLabel(tr("Interlacing:")), 6, 0, 1, 1); + videoLayout->addWidget(new QLabel(tr("Interlacing:"), this), 6, 0, 1, 1); interlacing_combobox = new QComboBox(videoGroupBox); interlacing_combobox->addItem(tr("None (Progressive)")); // interlacing_combobox->addItem("Upper Field First"); @@ -230,7 +229,7 @@ void NewSequenceDialog::setup_ui() { QGridLayout* audioLayout = new QGridLayout(audioGroupBox); - audioLayout->addWidget(new QLabel(tr("Sample Rate: ")), 0, 0, 1, 1); + audioLayout->addWidget(new QLabel(tr("Sample Rate: "), this), 0, 0, 1, 1); audio_frequency_combobox = new QComboBox(audioGroupBox); audio_frequency_combobox->addItem("22050 Hz", 22050); @@ -250,7 +249,7 @@ void NewSequenceDialog::setup_ui() { QHBoxLayout* nameLayout = new QHBoxLayout(nameWidget); nameLayout->setContentsMargins(0, 0, 0, 0); - nameLayout->addWidget(new QLabel("Name:")); + nameLayout->addWidget(new QLabel(tr("Name:"), this)); sequence_name_edit = new QLineEdit(nameWidget); diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 4415db6ab..37b54958a 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -71,7 +71,7 @@ void PreferencesDialog::setup_kbd_shortcut_worker(QMenu* menu, QTreeWidgetItem* QAction* a = actions.at(i); if (!a->isSeparator() && a->property("keyignore").isNull()) { - QTreeWidgetItem* item = new QTreeWidgetItem(); + QTreeWidgetItem* item = new QTreeWidgetItem(parent); item->setText(0, a->text().replace("&", "")); parent->addChild(item); @@ -93,7 +93,7 @@ void PreferencesDialog::setup_kbd_shortcuts(QMenuBar* menubar) { for (int i=0;imenu(); - QTreeWidgetItem* item = new QTreeWidgetItem(); + QTreeWidgetItem* item = new QTreeWidgetItem(keyboard_tree); item->setText(0, menu->title().replace("&", "")); keyboard_tree->addTopLevelItem(item); @@ -286,11 +286,11 @@ void PreferencesDialog::setup_ui() { QTabWidget* tabWidget = new QTabWidget(this); // General - QTabWidget* general_tab = new QTabWidget(); + QTabWidget* general_tab = new QTabWidget(this); QGridLayout* general_layout = new QGridLayout(general_tab); // General -> Custom CSS - general_layout->addWidget(new QLabel(tr("Custom CSS:")), 0, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), 0, 0, 1, 1); custom_css_fn = new QLineEdit(general_tab); custom_css_fn->setText(config.css_path); @@ -301,14 +301,14 @@ void PreferencesDialog::setup_ui() { general_layout->addWidget(custom_css_browse, 0, 2, 1, 1); // General -> Image Sequence Formats - general_layout->addWidget(new QLabel(tr("Image sequence formats:")), 1, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), 1, 0, 1, 1); imgSeqFormatEdit = new QLineEdit(general_tab); general_layout->addWidget(imgSeqFormatEdit, 1, 1, 1, 2); // General -> Audio Recording - general_layout->addWidget(new QLabel(tr("Audio Recording:")), 2, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), 2, 0, 1, 1); recordingComboBox = new QComboBox(general_tab); recordingComboBox->addItem(tr("Mono")); @@ -316,7 +316,7 @@ void PreferencesDialog::setup_ui() { general_layout->addWidget(recordingComboBox, 2, 1, 1, 2); // General -> Effect Textbox Lines - general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:")), 3, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), 3, 0, 1, 1); effect_textbox_lines_field = new QSpinBox(general_tab); effect_textbox_lines_field->setMinimum(1); @@ -332,15 +332,15 @@ void PreferencesDialog::setup_ui() { tabWidget->addTab(general_tab, tr("General")); // Behavior - QWidget* behavior_tab = new QWidget(); + QWidget* behavior_tab = new QWidget(this); tabWidget->addTab(behavior_tab, tr("Behavior")); // Playback - QWidget* playback_tab = new QWidget(); + QWidget* playback_tab = new QWidget(this); QVBoxLayout* playback_tab_layout = new QVBoxLayout(playback_tab); // Playback -> Disable Multithreading on Images - disable_img_multithread = new QCheckBox(tr("Disable Multithreading on Images")); + disable_img_multithread = new QCheckBox(tr("Disable Multithreading on Images"), playback_tab); disable_img_multithread->setChecked(config.disable_multithreading_for_images); playback_tab_layout->addWidget(disable_img_multithread); @@ -360,20 +360,20 @@ void PreferencesDialog::setup_ui() { QGroupBox* memory_usage_group = new QGroupBox(playback_tab); memory_usage_group->setTitle(tr("Memory Usage")); QGridLayout* memory_usage_layout = new QGridLayout(memory_usage_group); - memory_usage_layout->addWidget(new QLabel(tr("Upcoming Frame Queue:")), 0, 0); - upcoming_queue_spinbox = new QDoubleSpinBox(); + memory_usage_layout->addWidget(new QLabel(tr("Upcoming Frame Queue:"), playback_tab), 0, 0); + upcoming_queue_spinbox = new QDoubleSpinBox(playback_tab); upcoming_queue_spinbox->setValue(config.upcoming_queue_size); memory_usage_layout->addWidget(upcoming_queue_spinbox, 0, 1); - upcoming_queue_type = new QComboBox(); + upcoming_queue_type = new QComboBox(playback_tab); upcoming_queue_type->addItem(tr("frames")); upcoming_queue_type->addItem(tr("seconds")); upcoming_queue_type->setCurrentIndex(config.upcoming_queue_type); memory_usage_layout->addWidget(upcoming_queue_type, 0, 2); - memory_usage_layout->addWidget(new QLabel(tr("Previous Frame Queue:")), 1, 0); - previous_queue_spinbox = new QDoubleSpinBox(); + memory_usage_layout->addWidget(new QLabel(tr("Previous Frame Queue:"), playback_tab), 1, 0); + previous_queue_spinbox = new QDoubleSpinBox(playback_tab); previous_queue_spinbox->setValue(config.previous_queue_size); memory_usage_layout->addWidget(previous_queue_spinbox, 1, 1); - previous_queue_type = new QComboBox(); + previous_queue_type = new QComboBox(playback_tab); previous_queue_type->addItem(tr("frames")); previous_queue_type->addItem(tr("seconds")); previous_queue_type->setCurrentIndex(config.previous_queue_type); @@ -382,39 +382,39 @@ void PreferencesDialog::setup_ui() { tabWidget->addTab(playback_tab, tr("Playback")); - QWidget* shortcut_tab = new QWidget(); + QWidget* shortcut_tab = new QWidget(this); QVBoxLayout* shortcut_layout = new QVBoxLayout(shortcut_tab); - QLineEdit* key_search_line = new QLineEdit(); + QLineEdit* key_search_line = new QLineEdit(shortcut_tab); key_search_line->setPlaceholderText(tr("Search for action or shortcut")); connect(key_search_line, SIGNAL(textChanged(const QString &)), this, SLOT(refine_shortcut_list(const QString &))); shortcut_layout->addWidget(key_search_line); - keyboard_tree = new QTreeWidget(); + keyboard_tree = new QTreeWidget(shortcut_tab); QTreeWidgetItem* tree_header = keyboard_tree->headerItem(); tree_header->setText(0, tr("Action")); tree_header->setText(1, tr("Shortcut")); shortcut_layout->addWidget(keyboard_tree); - QHBoxLayout* reset_shortcut_layout = new QHBoxLayout(); + QHBoxLayout* reset_shortcut_layout = new QHBoxLayout(shortcut_tab); - QPushButton* import_shortcut_button = new QPushButton(tr("Import")); + QPushButton* import_shortcut_button = new QPushButton(tr("Import"), shortcut_tab); reset_shortcut_layout->addWidget(import_shortcut_button); connect(import_shortcut_button, SIGNAL(clicked(bool)), this, SLOT(load_shortcut_file())); - QPushButton* export_shortcut_button = new QPushButton(tr("Export")); + QPushButton* export_shortcut_button = new QPushButton(tr("Export"), shortcut_tab); reset_shortcut_layout->addWidget(export_shortcut_button); connect(export_shortcut_button, SIGNAL(clicked(bool)), this, SLOT(save_shortcut_file())); reset_shortcut_layout->addStretch(); - QPushButton* reset_selected_shortcut_button = new QPushButton(tr("Reset Selected")); + QPushButton* reset_selected_shortcut_button = new QPushButton(tr("Reset Selected"), shortcut_tab); reset_shortcut_layout->addWidget(reset_selected_shortcut_button); connect(reset_selected_shortcut_button, SIGNAL(clicked(bool)), this, SLOT(reset_default_shortcut())); - QPushButton* reset_all_shortcut_button = new QPushButton(tr("Reset All")); + QPushButton* reset_all_shortcut_button = new QPushButton(tr("Reset All"), shortcut_tab); reset_shortcut_layout->addWidget(reset_all_shortcut_button); connect(reset_all_shortcut_button, SIGNAL(clicked(bool)), this, SLOT(reset_all_shortcuts())); diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index c677232f4..41a337610 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -23,31 +23,31 @@ ReplaceClipMediaDialog::ReplaceClipMediaDialog(QWidget *parent, Media *old_media QDialog(parent), media(old_media) { - setWindowTitle(tr("Replace clips using \"%1\"").arg(old_media->get_name())); + setWindowTitle(tr("Replace clips using \"%1\"").arg(old_media->get_name())); resize(300, 400); - QVBoxLayout* layout = new QVBoxLayout(); + QVBoxLayout* layout = new QVBoxLayout(this); - layout->addWidget(new QLabel(tr("Select which media you want to replace this media's clips with:"))); + layout->addWidget(new QLabel(tr("Select which media you want to replace this media's clips with:"), this)); - tree = new QTreeView(); + tree = new QTreeView(this); layout->addWidget(tree); - use_same_media_in_points = new QCheckBox(tr("Keep the same media in-points")); + use_same_media_in_points = new QCheckBox(tr("Keep the same media in-points"), this); use_same_media_in_points->setChecked(true); layout->addWidget(use_same_media_in_points); - QHBoxLayout* buttons = new QHBoxLayout(); + QHBoxLayout* buttons = new QHBoxLayout(this); buttons->addStretch(); - QPushButton* replace_button = new QPushButton(tr("Replace")); + QPushButton* replace_button = new QPushButton(tr("Replace"), this); connect(replace_button, SIGNAL(clicked(bool)), this, SLOT(replace())); buttons->addWidget(replace_button); - QPushButton* cancel_button = new QPushButton(tr("Cancel")); + QPushButton* cancel_button = new QPushButton(tr("Cancel"), this); connect(cancel_button, SIGNAL(clicked(bool)), this, SLOT(close())); buttons->addWidget(cancel_button); @@ -55,44 +55,42 @@ ReplaceClipMediaDialog::ReplaceClipMediaDialog(QWidget *parent, Media *old_media layout->addLayout(buttons); - setLayout(layout); - tree->setModel(&project_model); } void ReplaceClipMediaDialog::replace() { QModelIndexList selected_items = tree->selectionModel()->selectedRows(); if (selected_items.size() != 1) { - QMessageBox::critical( - this, - tr("No media selected"), - tr("Please select a media to replace with or click 'Cancel'."), - QMessageBox::Ok - ); + QMessageBox::critical( + this, + tr("No media selected"), + tr("Please select a media to replace with or click 'Cancel'."), + QMessageBox::Ok + ); } else { Media* new_item = static_cast(selected_items.at(0).internalPointer()); if (media == new_item) { - QMessageBox::critical( - this, - tr("Same media selected"), - tr("You selected the same media that you're replacing. Please select a different one or click 'Cancel'."), - QMessageBox::Ok - ); + QMessageBox::critical( + this, + tr("Same media selected"), + tr("You selected the same media that you're replacing. Please select a different one or click 'Cancel'."), + QMessageBox::Ok + ); } else if (new_item->get_type() == MEDIA_TYPE_FOLDER) { - QMessageBox::critical( - this, - tr("Folder selected"), - tr("You cannot replace footage with a folder."), - QMessageBox::Ok - ); + QMessageBox::critical( + this, + tr("Folder selected"), + tr("You cannot replace footage with a folder."), + QMessageBox::Ok + ); } else { if (new_item->get_type() == MEDIA_TYPE_SEQUENCE && sequence == new_item->to_sequence()) { - QMessageBox::critical( - this, - tr("Active sequence selected"), - tr("You cannot insert a sequence into itself."), - QMessageBox::Ok - ); + QMessageBox::critical( + this, + tr("Active sequence selected"), + tr("You cannot insert a sequence into itself."), + QMessageBox::Ok + ); } else { ReplaceClipMediaCommand* rcmc = new ReplaceClipMediaCommand( media, diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index b63419347..d03f6c3e9 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -19,43 +19,42 @@ #include "project/media.h" SpeedDialog::SpeedDialog(QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Speed/Duration")); + setWindowTitle(tr("Speed/Duration")); - QVBoxLayout* main_layout = new QVBoxLayout(); - setLayout(main_layout); + QVBoxLayout* main_layout = new QVBoxLayout(this); - QGridLayout* grid = new QGridLayout(); + QGridLayout* grid = new QGridLayout(this); grid->setSpacing(6); - grid->addWidget(new QLabel(tr("Speed:")), 0, 0); - percent = new LabelSlider(); + grid->addWidget(new QLabel(tr("Speed:"), this), 0, 0); + percent = new LabelSlider(this); percent->decimal_places = 2; percent->set_display_type(LABELSLIDER_PERCENT); percent->set_default_value(1); grid->addWidget(percent, 0, 1); - grid->addWidget(new QLabel(tr("Frame Rate:")), 1, 0); - frame_rate = new LabelSlider(); + grid->addWidget(new QLabel(tr("Frame Rate:"), this), 1, 0); + frame_rate = new LabelSlider(this); frame_rate->decimal_places = 3; grid->addWidget(frame_rate, 1, 1); - grid->addWidget(new QLabel(tr("Duration:")), 2, 0); - duration = new LabelSlider(); + grid->addWidget(new QLabel(tr("Duration:"), this), 2, 0); + duration = new LabelSlider(this); duration->set_display_type(LABELSLIDER_FRAMENUMBER); duration->set_frame_rate(sequence->frame_rate); grid->addWidget(duration, 2, 1); main_layout->addLayout(grid); - reverse = new QCheckBox(tr("Reverse")); - maintain_pitch = new QCheckBox(tr("Maintain Audio Pitch")); - ripple = new QCheckBox(tr("Ripple Changes")); + reverse = new QCheckBox(tr("Reverse"), this); + maintain_pitch = new QCheckBox(tr("Maintain Audio Pitch"), this); + ripple = new QCheckBox(tr("Ripple Changes"), this); main_layout->addWidget(reverse); main_layout->addWidget(maintain_pitch); main_layout->addWidget(ripple); - QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + QDialogButtonBox* buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); buttonBox->setCenterButtons(true); main_layout->addWidget(buttonBox); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); diff --git a/dialogs/stabilizerdialog.cpp b/dialogs/stabilizerdialog.cpp index 5e0738d80..0330fd81b 100644 --- a/dialogs/stabilizerdialog.cpp +++ b/dialogs/stabilizerdialog.cpp @@ -8,96 +8,97 @@ #include "ui/labelslider.h" +// NOTE: this is never used in Olive, hasn't been maintained, and needs to be written + StabilizerDialog::StabilizerDialog(QWidget *parent) : QDialog(parent) { - setWindowTitle("Stabilizer"); + setWindowTitle("Stabilizer"); - layout = new QVBoxLayout(this); - setLayout(layout); + layout = new QVBoxLayout(this); - enable_stab = new QCheckBox(this); - enable_stab->setText("Enable Stabilizer"); - layout->addWidget(enable_stab); + enable_stab = new QCheckBox(this); + enable_stab->setText("Enable Stabilizer"); + layout->addWidget(enable_stab); - analysis = new QGroupBox("Analysis", this); - layout->addWidget(analysis); + analysis = new QGroupBox("Analysis", this); + layout->addWidget(analysis); - analysis_layout = new QGridLayout(analysis); - analysis->setLayout(analysis_layout); + analysis_layout = new QGridLayout(analysis); + analysis->setLayout(analysis_layout); - analysis_layout->addWidget(new QLabel("Shakiness:"), 0, 0); + analysis_layout->addWidget(new QLabel("Shakiness:", this), 0, 0); - shakiness_slider = new LabelSlider(); - shakiness_slider->set_minimum_value(1); - shakiness_slider->set_default_value(5); - shakiness_slider->set_maximum_value(10); - analysis_layout->addWidget(shakiness_slider, 0, 1); + shakiness_slider = new LabelSlider(this); + shakiness_slider->set_minimum_value(1); + shakiness_slider->set_default_value(5); + shakiness_slider->set_maximum_value(10); + analysis_layout->addWidget(shakiness_slider, 0, 1); - analysis_layout->addWidget(new QLabel("Accuracy:"), 1, 0); + analysis_layout->addWidget(new QLabel("Accuracy:", this), 1, 0); - accuracy_slider = new LabelSlider(); - accuracy_slider->set_minimum_value(1); - accuracy_slider->set_default_value(15); - accuracy_slider->set_maximum_value(15); - analysis_layout->addWidget(accuracy_slider, 1, 1); + accuracy_slider = new LabelSlider(this); + accuracy_slider->set_minimum_value(1); + accuracy_slider->set_default_value(15); + accuracy_slider->set_maximum_value(15); + analysis_layout->addWidget(accuracy_slider, 1, 1); - analysis_layout->addWidget(new QLabel("Step Size:"), 2, 0); + analysis_layout->addWidget(new QLabel("Step Size:", this), 2, 0); - stepsize_slider = new LabelSlider(); - stepsize_slider->set_minimum_value(1); - stepsize_slider->set_default_value(6); - analysis_layout->addWidget(stepsize_slider, 2, 1); + stepsize_slider = new LabelSlider(this); + stepsize_slider->set_minimum_value(1); + stepsize_slider->set_default_value(6); + analysis_layout->addWidget(stepsize_slider, 2, 1); - analysis_layout->addWidget(new QLabel("Minimum Contrast:"), 3, 0); + analysis_layout->addWidget(new QLabel("Minimum Contrast:", this), 3, 0); - mincontrast_slider = new LabelSlider(); - mincontrast_slider->set_minimum_value(0); - mincontrast_slider->set_default_value(0.3); - mincontrast_slider->set_maximum_value(1); - analysis_layout->addWidget(mincontrast_slider, 3, 1); + mincontrast_slider = new LabelSlider(this); + mincontrast_slider->set_minimum_value(0); + mincontrast_slider->set_default_value(0.3); + mincontrast_slider->set_maximum_value(1); + analysis_layout->addWidget(mincontrast_slider, 3, 1); - /*analysis_layout->addWidget(new QLabel("Tripod Mode:"), 4, 0); + /*analysis_layout->addWidget(new QLabel("Tripod Mode:"), 4, 0); - tripod_mode_box = new QCheckBox(); - analysis_layout->addWidget(tripod_mode_box, 4, 1);*/ + tripod_mode_box = new QCheckBox(); + analysis_layout->addWidget(tripod_mode_box, 4, 1);*/ - stabilization = new QGroupBox("Stabilization", this); - layout->addWidget(stabilization); + stabilization = new QGroupBox("Stabilization", this); + layout->addWidget(stabilization); - stabilization_layout = new QGridLayout(); - stabilization->setLayout(stabilization_layout); + stabilization_layout = new QGridLayout(this); + stabilization->setLayout(stabilization_layout); - stabilization_layout->addWidget(new QLabel("Smoothing:"), 0, 0); + stabilization_layout->addWidget(new QLabel("Smoothing:", this), 0, 0); - smoothing_slider = new LabelSlider(); - smoothing_slider->set_minimum_value(0); - smoothing_slider->set_default_value(10); - stabilization_layout->addWidget(smoothing_slider, 0, 1); + smoothing_slider = new LabelSlider(); + smoothing_slider->set_minimum_value(0); + smoothing_slider->set_default_value(10); + stabilization_layout->addWidget(smoothing_slider, 0, 1); - stabilization_layout->addWidget(new QLabel("Gaussian Motion:"), 1, 0); + stabilization_layout->addWidget(new QLabel("Gaussian Motion:"), 1, 0); - gaussian_motion = new QCheckBox(); - gaussian_motion->setChecked(true); - stabilization_layout->addWidget(gaussian_motion, 1, 1); + gaussian_motion = new QCheckBox(); + gaussian_motion->setChecked(true); + stabilization_layout->addWidget(gaussian_motion, 1, 1); - stabilization_layout->addWidget(new QLabel("Maximum Movement:"), 2, 0); - stabilization_layout->addWidget(new QLabel("Maximum Rotation:"), 3, 0); - stabilization_layout->addWidget(new QLabel("Crop:"), 4, 0); - stabilization_layout->addWidget(new QLabel("Zoom Behavior:"), 5, 0); - stabilization_layout->addWidget(new QLabel("Zoom Speed:"), 6, 0); - stabilization_layout->addWidget(new QLabel("Interpolation Quality:"), 7, 0); + stabilization_layout->addWidget(new QLabel("Maximum Movement:"), 2, 0); + stabilization_layout->addWidget(new QLabel("Maximum Rotation:"), 3, 0); + stabilization_layout->addWidget(new QLabel("Crop:"), 4, 0); + stabilization_layout->addWidget(new QLabel("Zoom Behavior:"), 5, 0); + stabilization_layout->addWidget(new QLabel("Zoom Speed:"), 6, 0); + stabilization_layout->addWidget(new QLabel("Interpolation Quality:"), 7, 0); - buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); - layout->addWidget(buttons); + buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); + layout->addWidget(buttons); - connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); - connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); + connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); - connect(enable_stab, SIGNAL(toggled(bool)), this, SLOT(set_all_enabled(bool))); + connect(enable_stab, SIGNAL(toggled(bool)), this, SLOT(set_all_enabled(bool))); - set_all_enabled(false); + set_all_enabled(false); } void StabilizerDialog::set_all_enabled(bool e) { - analysis->setEnabled(e); - stabilization->setEnabled(e); + analysis->setEnabled(e); + stabilization->setEnabled(e); } diff --git a/dialogs/texteditdialog.cpp b/dialogs/texteditdialog.cpp index 51337a637..1c71999df 100644 --- a/dialogs/texteditdialog.cpp +++ b/dialogs/texteditdialog.cpp @@ -7,16 +7,15 @@ TextEditDialog::TextEditDialog(QWidget *parent, const QString &s) : QDialog(parent) { - setWindowTitle(tr("Edit Text")); + setWindowTitle(tr("Edit Text")); - QVBoxLayout* layout = new QVBoxLayout(); - setLayout(layout); + QVBoxLayout* layout = new QVBoxLayout(this); - textEdit = new QPlainTextEdit(); + textEdit = new QPlainTextEdit(this); textEdit->setPlainText(s); layout->addWidget(textEdit); - QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); layout->addWidget(buttons); connect(buttons, SIGNAL(accepted()), this, SLOT(save())); connect(buttons, SIGNAL(rejected()), this, SLOT(cancel())); diff --git a/effects/internal/cornerpineffect.cpp b/effects/internal/cornerpineffect.cpp index d23525e2c..883dcbdb8 100644 --- a/effects/internal/cornerpineffect.cpp +++ b/effects/internal/cornerpineffect.cpp @@ -61,11 +61,11 @@ void CornerPinEffect::process_coords(double timecode, GLTextureCoords &coords, i coords.vertexBottomRightY += bottom_right_y->get_double_value(timecode); } -void CornerPinEffect::process_shader(double timecode, GLTextureCoords &coords, int iterations) { - glslProgram->setUniformValue("p0", (GLfloat) coords.vertexBottomLeftX, (GLfloat) coords.vertexBottomLeftY); - glslProgram->setUniformValue("p1", (GLfloat) coords.vertexBottomRightX, (GLfloat) coords.vertexBottomRightY); - glslProgram->setUniformValue("p2", (GLfloat) coords.vertexTopLeftX, (GLfloat) coords.vertexTopLeftY); - glslProgram->setUniformValue("p3", (GLfloat) coords.vertexTopRightX, (GLfloat) coords.vertexTopRightY); +void CornerPinEffect::process_shader(double timecode, GLTextureCoords &coords, int) { + glslProgram->setUniformValue("p0", GLfloat(coords.vertexBottomLeftX), GLfloat(coords.vertexBottomLeftY)); + glslProgram->setUniformValue("p1", GLfloat(coords.vertexBottomRightX), GLfloat(coords.vertexBottomRightY)); + glslProgram->setUniformValue("p2", GLfloat(coords.vertexTopLeftX), GLfloat(coords.vertexTopLeftY)); + glslProgram->setUniformValue("p3", GLfloat(coords.vertexTopRightX), GLfloat(coords.vertexTopRightY)); glslProgram->setUniformValue("perspective", perspective->get_bool_value(timecode)); } diff --git a/effects/internal/voideffect.cpp b/effects/internal/voideffect.cpp index e27d08844..70762cff2 100644 --- a/effects/internal/voideffect.cpp +++ b/effects/internal/voideffect.cpp @@ -11,11 +11,11 @@ VoidEffect::VoidEffect(Clip *c, const QString& n) : Effect(c, nullptr) { name = n; QString display_name; if (n.isEmpty()) { - display_name = tr("(unknown)"); + display_name = tr("(unknown)"); } else { display_name = n; } - EffectRow* row = add_row(tr("Missing Effect"), false, false); + EffectRow* row = add_row(tr("Missing Effect"), false, false); row->add_widget(new QLabel(display_name)); container->setText(display_name); } diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index 481341b15..71a54a92e 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -240,6 +240,9 @@ VSTHost::~VSTHost() { delete [] inputs; freePlugin(); + + delete show_interface_btn; + delete dialog; } void VSTHost::process_audio(double, double, quint8* samples, int nb_bytes, int) { diff --git a/mainwindow.cpp b/mainwindow.cpp index 881ec2cef..042c52f7a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -558,6 +558,7 @@ bool MainWindow::can_close_project() { ); m->setWindowModality(Qt::WindowModal); int r = m->exec(); + delete m; if (r == QMessageBox::Yes) { return save_project(); } else if (r == QMessageBox::Cancel) { @@ -581,7 +582,7 @@ void MainWindow::setup_menus() { file_menu->addAction(tr("&Open Project"), this, SLOT(open_project()), QKeySequence("Ctrl+O"))->setProperty("id", "openproj"); - clear_open_recent_action = new QAction(tr("Clear Recent List")); + clear_open_recent_action = new QAction(tr("Clear Recent List"), menuBar); clear_open_recent_action->setProperty("id", "clearopenrecent"); connect(clear_open_recent_action, SIGNAL(triggered()), panel_project, SLOT(clear_recent_projects())); @@ -1037,12 +1038,8 @@ void MainWindow::paintEvent(QPaintEvent *event) { #ifndef QT_DEBUG DemoNotice* d = new DemoNotice(this); d->open(); + connect(d, SIGNAL(finished()), d, SLOT(deleteLater())); #endif - /*if (windowState() != Qt::WindowFullScreen) { - // workaround for setting to maximized - on some systems, setting - // to maximized doesn't work until after the paintEvent - setWindowState(Qt::WindowMaximized); - }*/ demoNoticeShown = true; } diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 8dd574166..935ecd63f 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -172,8 +172,7 @@ void EffectControls::show_effect_menu(int type, int subtype) { const EffectMeta& em = effects.at(i); if (em.type == type && em.subtype == subtype) { - QAction* action = new QAction(&effects_menu); - action->setText(em.name); + QAction* action = effects_menu.addAction(em.name); action->setData(reinterpret_cast(&em)); if (!em.tooltip.isEmpty()) { action->setToolTip(em.tooltip); @@ -193,9 +192,8 @@ void EffectControls::show_effect_menu(int type, int subtype) { } } if (!found) { - parent = new QMenu(&effects_menu); + parent = effects_menu.addMenu(em.category); parent->setToolTipsVisible(true); - parent->setTitle(em.category); bool found = false; for (int i=0;isetSpacing(0); @@ -293,7 +291,7 @@ void EffectControls::setup_ui() { scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scrollArea->setWidgetResizable(true); - QWidget* scrollAreaWidgetContents = new QWidget(); + QWidget* scrollAreaWidgetContents = new QWidget(scrollArea); QHBoxLayout* scrollAreaLayout = new QHBoxLayout(scrollAreaWidgetContents); scrollAreaLayout->setSpacing(0); @@ -308,7 +306,7 @@ void EffectControls::setup_ui() { effects_area_layout->setMargin(0); vcontainer = new QWidget(effects_area); - QVBoxLayout* vcontainerLayout = new QVBoxLayout(vcontainer); + QVBoxLayout* vcontainerLayout = new QVBoxLayout(); vcontainerLayout->setSpacing(0); vcontainerLayout->setMargin(0); @@ -320,7 +318,7 @@ void EffectControls::setup_ui() { veHeaderLayout->setSpacing(0); veHeaderLayout->setMargin(0); - QPushButton* btnAddVideoEffect = new QPushButton(veHeader); + QPushButton* btnAddVideoEffect = new QPushButton(); btnAddVideoEffect->setIcon(QIcon(":/icons/add-effect.png")); btnAddVideoEffect->setToolTip(tr("Add Video Effect")); veHeaderLayout->addWidget(btnAddVideoEffect); @@ -328,7 +326,7 @@ void EffectControls::setup_ui() { veHeaderLayout->addStretch(); - QLabel* lblVideoEffects = new QLabel(veHeader); + QLabel* lblVideoEffects = new QLabel(); QFont font; font.setPointSize(9); lblVideoEffects->setFont(font); @@ -338,16 +336,15 @@ void EffectControls::setup_ui() { veHeaderLayout->addStretch(); - QPushButton* btnAddVideoTransition = new QPushButton(veHeader); + QPushButton* btnAddVideoTransition = new QPushButton(); btnAddVideoTransition->setIcon(QIcon(":/icons/add-transition.png")); btnAddVideoTransition->setToolTip(tr("Add Video Transition")); connect(btnAddVideoTransition, SIGNAL(clicked(bool)), this, SLOT(video_transition_click())); - veHeaderLayout->addWidget(btnAddVideoTransition); vcontainerLayout->addWidget(veHeader); - video_effect_area = new QWidget(vcontainer); + video_effect_area = new QWidget(); QVBoxLayout* veAreaLayout = new QVBoxLayout(video_effect_area); veAreaLayout->setSpacing(0); veAreaLayout->setMargin(0); @@ -368,7 +365,7 @@ void EffectControls::setup_ui() { aeHeaderLayout->setSpacing(0); aeHeaderLayout->setMargin(0); - QPushButton* btnAddAudioEffect = new QPushButton(aeHeader); + QPushButton* btnAddAudioEffect = new QPushButton(); btnAddAudioEffect->setIcon(QIcon(":/icons/add-effect.png")); btnAddAudioEffect->setToolTip(tr("Add Audio Effect")); connect(btnAddAudioEffect, SIGNAL(clicked(bool)), this, SLOT(audio_effect_click())); @@ -376,7 +373,7 @@ void EffectControls::setup_ui() { aeHeaderLayout->addStretch(); - QLabel* lblAudioEffects = new QLabel(aeHeader); + QLabel* lblAudioEffects = new QLabel(); lblAudioEffects->setFont(font); lblAudioEffects->setAlignment(Qt::AlignCenter); lblAudioEffects->setText(tr("AUDIO EFFECTS")); @@ -384,7 +381,7 @@ void EffectControls::setup_ui() { aeHeaderLayout->addStretch(); - QPushButton* btnAddAudioTransition = new QPushButton(aeHeader); + QPushButton* btnAddAudioTransition = new QPushButton(); btnAddAudioTransition->setIcon(QIcon(":/icons/add-transition.png")); btnAddAudioTransition->setToolTip(tr("Add Audio Transition")); connect(btnAddAudioTransition, SIGNAL(clicked(bool)), this, SLOT(audio_transition_click())); diff --git a/panels/grapheditor.cpp b/panels/grapheditor.cpp index faaf91235..cb4bda3c2 100644 --- a/panels/grapheditor.cpp +++ b/panels/grapheditor.cpp @@ -23,48 +23,47 @@ GraphEditor::GraphEditor(QWidget* parent) : QDockWidget(parent), row(nullptr) { setWindowTitle(tr("Graph Editor")); resize(720, 480); - QWidget* main_widget = new QWidget(); + QWidget* main_widget = new QWidget(this); setWidget(main_widget); - QVBoxLayout* layout = new QVBoxLayout(); - main_widget->setLayout(layout); + QVBoxLayout* layout = new QVBoxLayout(main_widget); - QWidget* tool_widget = new QWidget(); + QWidget* tool_widget = new QWidget(this); tool_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - QHBoxLayout* tools = new QHBoxLayout(); + QHBoxLayout* tools = new QHBoxLayout(this); tool_widget->setLayout(tools); - QWidget* left_tool_widget = new QWidget(); - QHBoxLayout* left_tool_layout = new QHBoxLayout(); + QWidget* left_tool_widget = new QWidget(this); + QHBoxLayout* left_tool_layout = new QHBoxLayout(this); left_tool_layout->setSpacing(0); left_tool_layout->setMargin(0); left_tool_widget->setLayout(left_tool_layout); tools->addWidget(left_tool_widget); - QWidget* center_tool_widget = new QWidget(); - QHBoxLayout* center_tool_layout = new QHBoxLayout(); + QWidget* center_tool_widget = new QWidget(this); + QHBoxLayout* center_tool_layout = new QHBoxLayout(this); center_tool_layout->setSpacing(0); center_tool_layout->setMargin(0); center_tool_widget->setLayout(center_tool_layout); tools->addWidget(center_tool_widget); - QWidget* right_tool_widget = new QWidget(); - QHBoxLayout* right_tool_layout = new QHBoxLayout(); + QWidget* right_tool_widget = new QWidget(this); + QHBoxLayout* right_tool_layout = new QHBoxLayout(this); right_tool_layout->setSpacing(0); right_tool_layout->setMargin(0); right_tool_widget->setLayout(right_tool_layout); tools->addWidget(right_tool_widget); - keyframe_nav = new KeyframeNavigator(0, false); + keyframe_nav = new KeyframeNavigator(this, false); keyframe_nav->enable_keyframes(true); keyframe_nav->enable_keyframe_toggle(false); left_tool_layout->addWidget(keyframe_nav); left_tool_layout->addStretch(); - linear_button = new QPushButton(tr("Linear")); + linear_button = new QPushButton(tr("Linear"), this); linear_button->setProperty("type", EFFECT_KEYFRAME_LINEAR); linear_button->setCheckable(true); - bezier_button = new QPushButton(tr("Bezier")); + bezier_button = new QPushButton(tr("Bezier"), this); bezier_button->setProperty("type", EFFECT_KEYFRAME_BEZIER); bezier_button->setCheckable(true); - hold_button = new QPushButton(tr("Hold")); + hold_button = new QPushButton(tr("Hold"), this); hold_button->setProperty("type", EFFECT_KEYFRAME_HOLD); hold_button->setCheckable(true); @@ -75,36 +74,36 @@ GraphEditor::GraphEditor(QWidget* parent) : QDockWidget(parent), row(nullptr) { layout->addWidget(tool_widget); - QWidget* central_widget = new QWidget(); - QVBoxLayout* central_layout = new QVBoxLayout(); + QWidget* central_widget = new QWidget(this); + QVBoxLayout* central_layout = new QVBoxLayout(this); central_widget->setLayout(central_layout); central_layout->setSpacing(0); central_layout->setMargin(0); - header = new TimelineHeader(); + header = new TimelineHeader(this); header->viewer = panel_sequence_viewer; central_layout->addWidget(header); - view = new GraphView(); + view = new GraphView(this); central_layout->addWidget(view); layout->addWidget(central_widget); - QWidget* value_widget = new QWidget(); + QWidget* value_widget = new QWidget(this); value_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - QHBoxLayout* values = new QHBoxLayout(); + QHBoxLayout* values = new QHBoxLayout(this); value_widget->setLayout(values); values->addStretch(); - QWidget* central_value_widget = new QWidget(); - value_layout = new QHBoxLayout(); + QWidget* central_value_widget = new QWidget(this); + value_layout = new QHBoxLayout(this); value_layout->setMargin(0); - value_layout->addWidget(new QLabel("")); // a spacer so the layout doesn't jump + value_layout->addWidget(new QLabel("", this)); // a spacer so the layout doesn't jump central_value_widget->setLayout(value_layout); values->addWidget(central_value_widget); values->addStretch(); layout->addWidget(value_widget); - current_row_desc = new QLabel(); + current_row_desc = new QLabel(this); current_row_desc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); current_row_desc->setAlignment(Qt::AlignCenter); layout->addWidget(current_row_desc); @@ -158,7 +157,7 @@ void GraphEditor::set_row(EffectRow *r) { for (int i=0;ifieldCount();i++) { EffectField* field = r->field(i); if (field->type == EFFECT_FIELD_DOUBLE) { - QPushButton* slider_button = new QPushButton(); + QPushButton* slider_button = new QPushButton(this); slider_button->setCheckable(true); slider_button->setChecked(field->is_enabled()); slider_button->setIcon(QIcon(":/icons/record.png")); @@ -168,7 +167,7 @@ void GraphEditor::set_row(EffectRow *r) { slider_proxy_buttons.append(slider_button); value_layout->addWidget(slider_button); - LabelSlider* slider = new LabelSlider(); + LabelSlider* slider = new LabelSlider(this); slider->set_color(get_curve_color(i, r->fieldCount()).name()); connect(slider, SIGNAL(valueChanged()), this, SLOT(passthrough_slider_value())); slider_proxies.append(slider); diff --git a/panels/project.cpp b/panels/project.cpp index 5ae0a8432..71a57c9e0 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -63,7 +63,7 @@ Project::Project(QWidget *parent) : { setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - QWidget* dockWidgetContents = new QWidget(); + QWidget* dockWidgetContents = new QWidget(this); QVBoxLayout* verticalLayout = new QVBoxLayout(dockWidgetContents); verticalLayout->setContentsMargins(0, 0, 0, 0); verticalLayout->setSpacing(0); @@ -76,10 +76,10 @@ Project::Project(QWidget *parent) : sorter->setSourceModel(&project_model); // optional toolbar - toolbar_widget = new QWidget(); + toolbar_widget = new QWidget(this); toolbar_widget->setVisible(config.show_project_toolbar); toolbar_widget->setObjectName("project_toolbar"); - QHBoxLayout* toolbar = new QHBoxLayout(); + QHBoxLayout* toolbar = new QHBoxLayout(toolbar_widget); toolbar->setMargin(0); toolbar->setSpacing(0); toolbar_widget->setLayout(toolbar); @@ -157,14 +157,14 @@ Project::Project(QWidget *parent) : verticalLayout->addWidget(tree_view); // icon view - icon_view_container = new QWidget(); + icon_view_container = new QWidget(dockWidgetContents); - QVBoxLayout* icon_view_container_layout = new QVBoxLayout(); + QVBoxLayout* icon_view_container_layout = new QVBoxLayout(icon_view_container); icon_view_container_layout->setMargin(0); icon_view_container_layout->setSpacing(0); icon_view_container->setLayout(icon_view_container_layout); - QHBoxLayout* icon_view_controls = new QHBoxLayout(); + QHBoxLayout* icon_view_controls = new QHBoxLayout(icon_view_container); icon_view_controls->setMargin(0); icon_view_controls->setSpacing(0); @@ -172,14 +172,14 @@ Project::Project(QWidget *parent) : directory_up_button.addFile(":/icons/dirup.png", QSize(), QIcon::Normal); directory_up_button.addFile(":/icons/dirup-disabled.png", QSize(), QIcon::Disabled); - directory_up = new QPushButton(); + directory_up = new QPushButton(icon_view_container); directory_up->setIcon(directory_up_button); directory_up->setEnabled(false); icon_view_controls->addWidget(directory_up); icon_view_controls->addStretch(); - QSlider* icon_size_slider = new QSlider(Qt::Horizontal); + QSlider* icon_size_slider = new QSlider(Qt::Horizontal, icon_view_container); icon_size_slider->setMinimum(16); icon_size_slider->setMaximum(120); icon_view_controls->addWidget(icon_size_slider); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 7626318e2..b7cfe2b5f 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -540,7 +540,7 @@ void Timeline::resizeEvent(QResizeEvent *) { } int comp_height = tool_button_widget->height(); int cols = qCeil(double(total_client_height)/double(comp_height)); - tool_button_widget->setFixedWidth((tool_button_children.at(0)->width())*cols + horizontal_spacing*(cols-1) + 1); + tool_button_widget->setFixedWidth((tool_button_children.at(0)->sizeHint().width())*cols + horizontal_spacing*(cols-1) + 1); } void Timeline::delete_in_out(bool ripple) { @@ -1097,7 +1097,7 @@ void Timeline::paste(bool insert) { QPushButton* replace_button = box.addButton(tr("Replace"), QMessageBox::NoRole); QPushButton* skip_button = box.addButton(tr("Skip"), QMessageBox::RejectRole); - QCheckBox* future_box = new QCheckBox(tr("Do this for all conflicts found")); + QCheckBox* future_box = new QCheckBox(tr("Do this for all conflicts found"), &box); box.setCheckBox(future_box); box.exec(); @@ -1645,18 +1645,19 @@ void Timeline::setup_ui() { QHBoxLayout* horizontalLayout = new QHBoxLayout(dockWidgetContents); horizontalLayout->setSpacing(0); - horizontalLayout->setContentsMargins(0, 0, 0, 0); + horizontalLayout->setMargin(0); - tool_button_widget = new QWidget(dockWidgetContents); - tool_button_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setWidget(dockWidgetContents); + + tool_button_widget = new QWidget(); tool_button_widget->setObjectName("timeline_toolbar"); + tool_button_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); FlowLayout* tool_buttons_layout = new FlowLayout(tool_button_widget); -// tool_buttons_layout->setSizeConstraint(QLayout::SetNoConstraint); tool_buttons_layout->setSpacing(4); - tool_buttons_layout->setContentsMargins(0, 0, 0, 0); + tool_buttons_layout->setMargin(0); - toolArrowButton = new QPushButton(tool_button_widget); + toolArrowButton = new QPushButton(); QIcon arrow_icon; arrow_icon.addFile(QStringLiteral(":/icons/arrow.png"), QSize(), QIcon::Normal, QIcon::Off); arrow_icon.addFile(QStringLiteral(":/icons/arrow-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -1667,7 +1668,7 @@ void Timeline::setup_ui() { connect(toolArrowButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolArrowButton); - toolEditButton = new QPushButton(tool_button_widget); + toolEditButton = new QPushButton(); QIcon icon1; icon1.addFile(QStringLiteral(":/icons/beam.png"), QSize(), QIcon::Normal, QIcon::Off); icon1.addFile(QStringLiteral(":/icons/beam-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -1678,7 +1679,7 @@ void Timeline::setup_ui() { connect(toolEditButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolEditButton); - toolRippleButton = new QPushButton(tool_button_widget); + toolRippleButton = new QPushButton(); QIcon icon2; icon2.addFile(QStringLiteral(":/icons/ripple.png"), QSize(), QIcon::Normal, QIcon::Off); icon2.addFile(QStringLiteral(":/icons/ripple-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -1689,7 +1690,7 @@ void Timeline::setup_ui() { connect(toolRippleButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolRippleButton); - toolRazorButton = new QPushButton(tool_button_widget); + toolRazorButton = new QPushButton(); QIcon icon4; icon4.addFile(QStringLiteral(":/icons/razor.png"), QSize(), QIcon::Normal, QIcon::Off); icon4.addFile(QStringLiteral(":/icons/razor-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -1700,7 +1701,7 @@ void Timeline::setup_ui() { connect(toolRazorButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolRazorButton); - toolSlipButton = new QPushButton(tool_button_widget); + toolSlipButton = new QPushButton(); QIcon icon5; icon5.addFile(QStringLiteral(":/icons/slip.png"), QSize(), QIcon::Normal, QIcon::On); icon5.addFile(QStringLiteral(":/icons/slip-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1711,7 +1712,7 @@ void Timeline::setup_ui() { connect(toolSlipButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolSlipButton); - toolSlideButton = new QPushButton(tool_button_widget); + toolSlideButton = new QPushButton(); QIcon icon6; icon6.addFile(QStringLiteral(":/icons/slide.png"), QSize(), QIcon::Normal, QIcon::On); icon6.addFile(QStringLiteral(":/icons/slide-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1722,7 +1723,7 @@ void Timeline::setup_ui() { connect(toolSlideButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolSlideButton); - toolHandButton = new QPushButton(tool_button_widget); + toolHandButton = new QPushButton(); QIcon icon7; icon7.addFile(QStringLiteral(":/icons/hand.png"), QSize(), QIcon::Normal, QIcon::On); icon7.addFile(QStringLiteral(":/icons/hand-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1733,7 +1734,7 @@ void Timeline::setup_ui() { connect(toolHandButton, SIGNAL(clicked(bool)), this, SLOT(set_tool())); tool_buttons_layout->addWidget(toolHandButton); - toolTransitionButton = new QPushButton(tool_button_widget); + toolTransitionButton = new QPushButton(); QIcon icon8; icon8.addFile(QStringLiteral(":/icons/transition-tool.png"), QSize(), QIcon::Normal, QIcon::On); icon8.addFile(QStringLiteral(":/icons/transition-tool-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1743,7 +1744,7 @@ void Timeline::setup_ui() { connect(toolTransitionButton, SIGNAL(clicked(bool)), this, SLOT(transition_tool_click())); tool_buttons_layout->addWidget(toolTransitionButton); - snappingButton = new QPushButton(tool_button_widget); + snappingButton = new QPushButton(); QIcon icon9; icon9.addFile(QStringLiteral(":/icons/magnet.png"), QSize(), QIcon::Normal, QIcon::On); icon9.addFile(QStringLiteral(":/icons/magnet-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1754,7 +1755,7 @@ void Timeline::setup_ui() { connect(snappingButton, SIGNAL(toggled(bool)), this, SLOT(snapping_clicked(bool))); tool_buttons_layout->addWidget(snappingButton); - zoomInButton = new QPushButton(tool_button_widget); + zoomInButton = new QPushButton(); QIcon icon10; icon10.addFile(QStringLiteral(":/icons/zoomin.png"), QSize(), QIcon::Normal, QIcon::On); icon10.addFile(QStringLiteral(":/icons/zoomin-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1763,7 +1764,7 @@ void Timeline::setup_ui() { connect(zoomInButton, SIGNAL(clicked(bool)), this, SLOT(zoom_in())); tool_buttons_layout->addWidget(zoomInButton); - zoomOutButton = new QPushButton(tool_button_widget); + zoomOutButton = new QPushButton(); QIcon icon11; icon11.addFile(QStringLiteral(":/icons/zoomout.png"), QSize(), QIcon::Normal, QIcon::On); icon11.addFile(QStringLiteral(":/icons/zoomout-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1772,17 +1773,16 @@ void Timeline::setup_ui() { connect(zoomOutButton, SIGNAL(clicked(bool)), this, SLOT(zoom_out())); tool_buttons_layout->addWidget(zoomOutButton); - recordButton = new QPushButton(tool_button_widget); + recordButton = new QPushButton(); QIcon icon12; icon12.addFile(QStringLiteral(":/icons/record.png"), QSize(), QIcon::Normal, QIcon::On); icon12.addFile(QStringLiteral(":/icons/record-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); recordButton->setIcon(icon12); recordButton->setToolTip(tr("Record audio")); connect(recordButton, SIGNAL(clicked(bool)), this, SLOT(record_btn_click())); - tool_buttons_layout->addWidget(recordButton); - addButton = new QPushButton(tool_button_widget); + addButton = new QPushButton(); QIcon icon13; icon13.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); icon13.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -1793,54 +1793,58 @@ void Timeline::setup_ui() { horizontalLayout->addWidget(tool_button_widget); - timeline_area = new QWidget(dockWidgetContents); - QSizePolicy sizePolicy2(QSizePolicy::Minimum, QSizePolicy::Minimum); - sizePolicy2.setHorizontalStretch(1); - sizePolicy2.setVerticalStretch(0); - sizePolicy2.setHeightForWidth(timeline_area->sizePolicy().hasHeightForWidth()); - timeline_area->setSizePolicy(sizePolicy2); + timeline_area = new QWidget(); + QSizePolicy timeline_area_policy(QSizePolicy::Minimum, QSizePolicy::Minimum); + timeline_area_policy.setHorizontalStretch(1); + timeline_area_policy.setVerticalStretch(0); + timeline_area_policy.setHeightForWidth(timeline_area->sizePolicy().hasHeightForWidth()); + timeline_area->setSizePolicy(timeline_area_policy); + QVBoxLayout* timeline_area_layout = new QVBoxLayout(timeline_area); timeline_area_layout->setSpacing(0); timeline_area_layout->setContentsMargins(0, 0, 0, 0); - headers = new TimelineHeader(timeline_area); + headers = new TimelineHeader(); timeline_area_layout->addWidget(headers); - editAreas = new QWidget(timeline_area); + editAreas = new QWidget(); QHBoxLayout* editAreaLayout = new QHBoxLayout(editAreas); editAreaLayout->setSpacing(0); editAreaLayout->setContentsMargins(0, 0, 0, 0); - QSplitter* splitter = new QSplitter(editAreas); + + QSplitter* splitter = new QSplitter(); splitter->setChildrenCollapsible(false); splitter->setOrientation(Qt::Vertical); - QWidget* videoContainer = new QWidget(splitter); + + QWidget* videoContainer = new QWidget(); + QHBoxLayout* videoContainerLayout = new QHBoxLayout(videoContainer); videoContainerLayout->setSpacing(0); videoContainerLayout->setContentsMargins(0, 0, 0, 0); - video_area = new TimelineWidget(videoContainer); - video_area->setFocusPolicy(Qt::ClickFocus); + video_area = new TimelineWidget(); + video_area->setFocusPolicy(Qt::ClickFocus); videoContainerLayout->addWidget(video_area); - videoScrollbar = new QScrollBar(videoContainer); + videoScrollbar = new QScrollBar(); videoScrollbar->setMaximum(0); videoScrollbar->setSingleStep(20); videoScrollbar->setOrientation(Qt::Vertical); - videoContainerLayout->addWidget(videoScrollbar); splitter->addWidget(videoContainer); - QWidget* audioContainer = new QWidget(splitter); + QWidget* audioContainer = new QWidget(); QHBoxLayout* audioContainerLayout = new QHBoxLayout(audioContainer); audioContainerLayout->setSpacing(0); audioContainerLayout->setContentsMargins(0, 0, 0, 0); - audio_area = new TimelineWidget(audioContainer); + + audio_area = new TimelineWidget(); audio_area->setFocusPolicy(Qt::ClickFocus); audioContainerLayout->addWidget(audio_area); - audioScrollbar = new QScrollBar(audioContainer); + audioScrollbar = new QScrollBar(); audioScrollbar->setMaximum(0); audioScrollbar->setOrientation(Qt::Vertical); @@ -1852,7 +1856,7 @@ void Timeline::setup_ui() { timeline_area_layout->addWidget(editAreas); - horizontalScrollBar = new ResizableScrollBar(timeline_area); + horizontalScrollBar = new ResizableScrollBar(); horizontalScrollBar->setMaximum(0); horizontalScrollBar->setSingleStep(20); horizontalScrollBar->setOrientation(Qt::Horizontal); @@ -1861,7 +1865,7 @@ void Timeline::setup_ui() { horizontalLayout->addWidget(timeline_area); - audio_monitor = new AudioMonitor(dockWidgetContents); + audio_monitor = new AudioMonitor(); audio_monitor->setMinimumSize(QSize(50, 0)); horizontalLayout->addWidget(audio_monitor); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 741ff166c..c2e99c8e8 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -481,6 +481,7 @@ int Viewer::get_playback_speed() { void Viewer::resizeEvent(QResizeEvent *) { if (seq != nullptr) { set_sb_max(); + viewer_widget->update(); } } @@ -586,7 +587,7 @@ long Viewer::get_seq_out() { } void Viewer::setup_ui() { - QWidget* contents = new QWidget(); + QWidget* contents = new QWidget(this); QVBoxLayout* layout = new QVBoxLayout(contents); layout->setSpacing(0); diff --git a/playback/playback.cpp b/playback/playback.cpp index 1d6289ce8..744723c4e 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -79,9 +79,15 @@ void close_clip(Clip* clip, bool wait) { } if (clip->fbo != nullptr) { - delete clip->fbo[0]; - delete clip->fbo[1]; + // delete 3 fbos for nested sequences, 2 for most clips + int fbo_count = (clip->media != nullptr && clip->media->get_type() == MEDIA_TYPE_SEQUENCE) ? 3 : 2; + + for (int j=0;jfbo[j]; + } + delete [] clip->fbo; + clip->fbo = nullptr; } diff --git a/project/effect.cpp b/project/effect.cpp index 7bb583bb4..81d686053 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -108,10 +108,9 @@ Effect::Effect(Clip* c, const EffectMeta *em) : // set up base UI container = new CollapsibleWidget(); connect(container->enabled_check, SIGNAL(clicked(bool)), this, SLOT(field_changed())); - ui = new QWidget(); - ui_layout = new QGridLayout(); + ui = new QWidget(container); + ui_layout = new QGridLayout(ui); ui_layout->setSpacing(4); - ui->setLayout(ui_layout); container->setContents(ui); connect(container->title_bar, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(show_context_menu(const QPoint&))); @@ -314,7 +313,7 @@ Effect::~Effect() { close(); } - //delete container; + delete container; for (int i=0;iaddWidget(w, ui_row, column_count); column_count++; } -EffectRow::~EffectRow() { - for (int i=0;iplayhead-parent_effect->parent_clip->timeline_in+parent_effect->parent_clip->clip_in; diff --git a/project/effectrow.h b/project/effectrow.h index 8ad91be23..1d71a07a4 100644 --- a/project/effectrow.h +++ b/project/effectrow.h @@ -45,6 +45,7 @@ private: QString name; int ui_row; QVector fields; + QVector widgets; KeyframeNavigator* keyframe_nav; diff --git a/project/media.cpp b/project/media.cpp index c27f068b8..083da219d 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -53,7 +53,7 @@ Media::~Media() { case MEDIA_TYPE_SEQUENCE: if (object != nullptr) delete to_sequence(); break; } if (throbber != nullptr) delete throbber; - qDeleteAll(children); +// qDeleteAll(children); } Footage *Media::to_footage() { diff --git a/ui/collapsiblewidget.cpp b/ui/collapsiblewidget.cpp index 324f8627d..2b17ce57b 100644 --- a/ui/collapsiblewidget.cpp +++ b/ui/collapsiblewidget.cpp @@ -15,62 +15,61 @@ #include "debug.h" CollapsibleWidget::CollapsibleWidget(QWidget* parent) : QWidget(parent) { - selected = false; + selected = false; layout = new QVBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); - title_bar = new CollapsibleWidgetHeader(); + title_bar = new CollapsibleWidgetHeader(this); title_bar->setFocusPolicy(Qt::ClickFocus); title_bar->setAutoFillBackground(true); - title_bar_layout = new QHBoxLayout(); + title_bar_layout = new QHBoxLayout(title_bar); title_bar_layout->setMargin(5); - title_bar->setLayout(title_bar_layout); - enabled_check = new CheckboxEx(); + enabled_check = new CheckboxEx(title_bar); enabled_check->setChecked(true); - header = new QLabel(); - collapse_button = new QPushButton(); - collapse_button->setIconSize(collapse_button->iconSize()*0.5); - collapse_button->setStyleSheet("QPushButton { border: none; }"); - setText(tr("")); - 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); + header = new QLabel(title_bar); + collapse_button = new QPushButton(title_bar); + collapse_button->setIconSize(collapse_button->iconSize()*0.5); + collapse_button->setStyleSheet("QPushButton { border: none; }"); + setText(tr("")); + 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))); - set_button_icon(true); + set_button_icon(true); contents = nullptr; } void CollapsibleWidget::header_click(bool s, bool deselect) { - selected = s; - title_bar->selected = s; - if (s) { + selected = s; + title_bar->selected = s; + if (s) { QPalette p = title_bar->palette(); - p.setColor(QPalette::Background, QColor(255, 255, 255, 64)); + p.setColor(QPalette::Background, QColor(255, 255, 255, 64)); title_bar->setPalette(p); } else { title_bar->setPalette(palette()); } - if (deselect) emit deselect_others(this); + if (deselect) emit deselect_others(this); } bool CollapsibleWidget::is_focused() { - if (hasFocus()) return true; - return title_bar->hasFocus(); + if (hasFocus()) return true; + return title_bar->hasFocus(); } bool CollapsibleWidget::is_expanded() { - return contents->isVisible(); + return contents->isVisible(); } void CollapsibleWidget::set_button_icon(bool open) { - collapse_button->setIcon(open ? QIcon(":/icons/tri-down.png") : QIcon(":/icons/tri-right.png")); + collapse_button->setIcon(open ? QIcon(":/icons/tri-down.png") : QIcon(":/icons/tri-right.png")); } void CollapsibleWidget::setContents(QWidget* c) { @@ -93,7 +92,7 @@ void CollapsibleWidget::on_enabled_change(bool b) { void CollapsibleWidget::on_visible_change() { contents->setVisible(!contents->isVisible()); - set_button_icon(contents->isVisible()); + set_button_icon(contents->isVisible()); emit visibleChanged(); } @@ -102,14 +101,14 @@ CollapsibleWidgetHeader::CollapsibleWidgetHeader(QWidget* parent) : QWidget(pare } 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)); + 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/embeddedfilechooser.cpp b/ui/embeddedfilechooser.cpp index 140149a25..2de15500f 100644 --- a/ui/embeddedfilechooser.cpp +++ b/ui/embeddedfilechooser.cpp @@ -7,13 +7,12 @@ #include EmbeddedFileChooser::EmbeddedFileChooser(QWidget* parent) : QWidget(parent) { - QHBoxLayout* layout = new QHBoxLayout(); + QHBoxLayout* layout = new QHBoxLayout(this); layout->setMargin(0); - setLayout(layout); - file_label = new QLabel(); + file_label = new QLabel(this); update_label(); layout->addWidget(file_label); - QPushButton* browse_button = new QPushButton("..."); + QPushButton* browse_button = new QPushButton("...", this); browse_button->setFixedWidth(25); layout->addWidget(browse_button); connect(browse_button, SIGNAL(clicked(bool)), this, SLOT(browse())); @@ -35,7 +34,7 @@ void EmbeddedFileChooser::setFilename(const QString &s) { } void EmbeddedFileChooser::update_label() { - QString l = "" + tr("File:") + " "; + QString l = "" + tr("File:") + " "; if (filename.isEmpty()) { l += "(none)"; } else { diff --git a/ui/keyframenavigator.cpp b/ui/keyframenavigator.cpp index baa87fc12..c6c726cf1 100644 --- a/ui/keyframenavigator.cpp +++ b/ui/keyframenavigator.cpp @@ -6,7 +6,7 @@ #include KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget(parent) { - key_controls = new QHBoxLayout(); + key_controls = new QHBoxLayout(this); key_controls->setSpacing(0); key_controls->setMargin(0); @@ -14,9 +14,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget key_controls->addStretch(); } - setLayout(key_controls); - - left_key_nav = new QPushButton(); + left_key_nav = new QPushButton(this); left_key_nav->setIcon(QIcon(":/icons/tri-left.png")); left_key_nav->setIconSize(left_key_nav->iconSize()*0.5); left_key_nav->setVisible(false); @@ -24,7 +22,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget connect(left_key_nav, SIGNAL(clicked(bool)), this, SIGNAL(goto_previous_key())); connect(left_key_nav, SIGNAL(clicked(bool)), this, SIGNAL(clicked())); - key_addremove = new QPushButton(); + key_addremove = new QPushButton(this); key_addremove->setIcon(QIcon(":/icons/diamond.png")); key_addremove->setIconSize(key_addremove->iconSize()*0.5); key_addremove->setVisible(false); @@ -32,7 +30,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget connect(key_addremove, SIGNAL(clicked(bool)), this, SIGNAL(toggle_key())); connect(key_addremove, SIGNAL(clicked(bool)), this, SIGNAL(clicked())); - right_key_nav = new QPushButton(); + right_key_nav = new QPushButton(this); right_key_nav->setIcon(QIcon(":/icons/tri-right.png")); right_key_nav->setIconSize(right_key_nav->iconSize()*0.5); right_key_nav->setVisible(false); @@ -40,7 +38,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget connect(right_key_nav, SIGNAL(clicked(bool)), this, SIGNAL(goto_next_key())); connect(right_key_nav, SIGNAL(clicked(bool)), this, SIGNAL(clicked())); - keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), ""); + keyframe_enable = new QPushButton(QIcon(":/icons/clock.png"), "", this); keyframe_enable->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed); keyframe_enable->setIconSize(keyframe_enable->iconSize()*0.75); keyframe_enable->setCheckable(true); @@ -51,13 +49,7 @@ KeyframeNavigator::KeyframeNavigator(QWidget *parent, bool addLeftPad) : QWidget key_controls->addWidget(keyframe_enable); } -KeyframeNavigator::~KeyframeNavigator() { - delete keyframe_enable; - delete right_key_nav; - delete key_addremove; - delete left_key_nav; - delete key_controls; -} +KeyframeNavigator::~KeyframeNavigator() {} void KeyframeNavigator::enable_keyframes(bool b) { keyframe_enable->setChecked(b); From c19a2dad7d56872f1b335e1fee88fee6ec32c231 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 21:36:07 +1100 Subject: [PATCH 034/202] code cleanups and fixed gif export #360 --- dialogs/exportdialog.cpp | 11 +++++------ io/exportthread.cpp | 39 ++++++++++++++++++++++++--------------- io/previewgenerator.cpp | 15 ++++++++------- olive.pro | 4 ++++ panels/effectcontrols.cpp | 37 ++++++++++++++++++++----------------- panels/panels.cpp | 1 + project/footage.cpp | 1 + ui/viewercontainer.cpp | 10 ++++------ 8 files changed, 67 insertions(+), 51 deletions(-) diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 98c4089b2..ec7a0ab7f 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -599,17 +599,16 @@ void ExportDialog::comp_type_changed(int) { void ExportDialog::setup_ui() { QVBoxLayout* verticalLayout = new QVBoxLayout(this); - QHBoxLayout* format_layout = new QHBoxLayout(this); + QHBoxLayout* format_layout = new QHBoxLayout(); format_layout->addWidget(new QLabel(tr("Format:"), this)); - formatCombobox = new QComboBox(this); - + formatCombobox = new QComboBox(); format_layout->addWidget(formatCombobox); verticalLayout->addLayout(format_layout); - QHBoxLayout* range_layout = new QHBoxLayout(this); + QHBoxLayout* range_layout = new QHBoxLayout(); range_layout->addWidget(new QLabel(tr("Range:"), this)); @@ -685,7 +684,7 @@ void ExportDialog::setup_ui() { verticalLayout->addWidget(audioGroupbox); - QHBoxLayout* progressLayout = new QHBoxLayout(this); + QHBoxLayout* progressLayout = new QHBoxLayout(); progressBar = new QProgressBar(this); progressBar->setFormat("%p% (ETA: 0:00:00)"); progressBar->setEnabled(false); @@ -701,7 +700,7 @@ void ExportDialog::setup_ui() { verticalLayout->addLayout(progressLayout); - QHBoxLayout* buttonLayout = new QHBoxLayout(this); + QHBoxLayout* buttonLayout = new QHBoxLayout(); buttonLayout->addStretch(); export_button = new QPushButton(this); diff --git a/io/exportthread.cpp b/io/exportthread.cpp index f5eff945a..ad96a4a0b 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -38,7 +38,6 @@ ExportThread::ExportThread(QObject *parent) : vcodec = nullptr; vcodec_ctx = nullptr; video_frame = nullptr; - sws_frame = nullptr; sws_ctx = nullptr; audio_stream = nullptr; acodec = nullptr; @@ -125,18 +124,17 @@ bool ExportThread::setupVideo() { vcodec_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; } - if (vcodec_ctx->codec_id == AV_CODEC_ID_H264) { - /*char buffer[50]; - itoa(vcodec_ctx, buffer, 10);*/ - - //av_opt_set(vcodec_ctx->priv_data, "preset", "fast", AV_OPT_SEARCH_CHILDREN); - //av_opt_set(vcodec_ctx->priv_data, "x264opts", "opencl", AV_OPT_SEARCH_CHILDREN); - + switch (vcodec_ctx->codec_id) { + case AV_CODEC_ID_H264: switch (video_compression_type) { case COMPRESSION_TYPE_CFR: av_opt_set(vcodec_ctx->priv_data, "crf", QString::number(static_cast(video_bitrate)).toUtf8(), AV_OPT_SEARCH_CHILDREN); break; } + break; + case AV_CODEC_ID_GIF: + av_opt_set(vcodec_ctx->priv_data, "image", "1", AV_OPT_SEARCH_CHILDREN); + break; } AVDictionary* opts = nullptr; @@ -180,12 +178,6 @@ bool ExportThread::setupVideo() { nullptr ); - sws_frame = av_frame_alloc(); - sws_frame->format = vcodec_ctx->pix_fmt; - sws_frame->width = video_width; - sws_frame->height = video_height; - av_frame_get_buffer(sws_frame, 0); - return true; } @@ -369,12 +361,30 @@ void ExportThread::run() { // encode last frame while rendering next frame double timecode_secs = (double) (sequence->playhead-start_frame) / sequence->frame_rate; if (video_enabled) { + // create sws_frame for converting pixel format + + // + // - I'm not sure why, but we have to alloc/free sws_frame every frame, or it breaks GIF exporting. + // - (i.e. GIFs get stuck on the first frame) + // - The same problem/solution can be seen here: https://stackoverflow.com/a/38997739 + // - Perhaps this is the intended way to use swscale, but it seems inefficient. + // - Anyway, here we are. + // + + sws_frame = av_frame_alloc(); + sws_frame->format = vcodec_ctx->pix_fmt; + sws_frame->width = video_width; + sws_frame->height = video_height; + av_frame_get_buffer(sws_frame, 0); + // change pixel format sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); sws_frame->pts = qRound(timecode_secs/av_q2d(video_stream->time_base)); // send to encoder if (!encode(fmt_ctx, vcodec_ctx, sws_frame, &video_pkt, video_stream, false)) continueEncode = false; + + av_frame_free(&sws_frame); } if (audio_enabled) { // do we need to encode more audio samples? @@ -481,7 +491,6 @@ void ExportThread::run() { if (sws_ctx != nullptr) { sws_freeContext(sws_ctx); - av_frame_free(&sws_frame); } if (swr_ctx != nullptr) { swr_free(&swr_ctx); diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index e815a2873..ca2fd3bbe 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -19,6 +19,7 @@ #include #define WAVEFORM_RESOLUTION 64 +#define THUMBNAIL_RESOLUTION 120 extern "C" { #include @@ -30,7 +31,7 @@ extern "C" { QSemaphore sem(5); // only 5 preview generators can run at one time PreviewGenerator::PreviewGenerator(Media* i, Footage* m, bool r) : - QThread(0), + QThread(nullptr), fmt_ctx(nullptr), media(i), footage(m), @@ -50,7 +51,7 @@ PreviewGenerator::PreviewGenerator(Media* i, Footage* m, bool r) : void PreviewGenerator::parse_media() { // detect video/audio streams in file - for (int i=0;i<(int)fmt_ctx->nb_streams;i++) { + for (int i=0;inb_streams);i++) { // Find the decoder for the video stream if (avcodec_find_decoder(fmt_ctx->streams[i]->codecpar->codec_id) == nullptr) { qCritical() << "Unsupported codec in stream" << i << "of file" << footage->name; @@ -106,7 +107,7 @@ void PreviewGenerator::parse_media() { append = true; } else if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { ms.audio_channels = fmt_ctx->streams[i]->codecpar->channels; - ms.audio_layout = fmt_ctx->streams[i]->codecpar->channel_layout; + ms.audio_layout = int(fmt_ctx->streams[i]->codecpar->channel_layout); ms.audio_frequency = fmt_ctx->streams[i]->codecpar->sample_rate; append = true; @@ -277,9 +278,9 @@ void PreviewGenerator::generate_waveform() { if (s != nullptr) { if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (!s->preview_done) { - int dstH = 120; - int dstW = dstH * ((float)temp_frame->width/(float)temp_frame->height); - uint8_t* data = new uint8_t[dstW*dstH*4]; + int dstH = THUMBNAIL_RESOLUTION; + int dstW = qRound(dstH * (float(temp_frame->width)/float(temp_frame->height))); + uint8_t* data = new uint8_t[size_t(dstW*dstH*4)]; sws_ctx = sws_getContext( temp_frame->width, @@ -414,7 +415,7 @@ void PreviewGenerator::generate_waveform() { maximum_stream = i; } } - footage->length = (double) media_lengths[maximum_stream] / av_q2d(fmt_ctx->streams[maximum_stream]->avg_frame_rate) * AV_TIME_BASE; // TODO redo with PTS + footage->length = double(media_lengths[maximum_stream]) / av_q2d(fmt_ctx->streams[maximum_stream]->avg_frame_rate) * AV_TIME_BASE; // TODO redo with PTS finalize_media(); } delete [] media_lengths; diff --git a/olive.pro b/olive.pro index 423b5dfac..334fafcb9 100644 --- a/olive.pro +++ b/olive.pro @@ -35,6 +35,10 @@ system("which git") { CONFIG += c++11 +CONFIG(debug, debug|release) { + CONFIG += console +} + SOURCES += \ main.cpp \ mainwindow.cpp \ diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 935ecd63f..88b13e5bf 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -279,11 +279,11 @@ void EffectControls::setup_ui() { hlayout->setSpacing(0); hlayout->setMargin(0); - QSplitter* splitter = new QSplitter(contents); + QSplitter* splitter = new QSplitter(); splitter->setOrientation(Qt::Horizontal); splitter->setChildrenCollapsible(false); - scrollArea = new QScrollArea(splitter); + scrollArea = new QScrollArea(); scrollArea->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->setFrameShadow(QFrame::Plain); @@ -291,13 +291,13 @@ void EffectControls::setup_ui() { scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scrollArea->setWidgetResizable(true); - QWidget* scrollAreaWidgetContents = new QWidget(scrollArea); + QWidget* scrollAreaWidgetContents = new QWidget(); QHBoxLayout* scrollAreaLayout = new QHBoxLayout(scrollAreaWidgetContents); scrollAreaLayout->setSpacing(0); scrollAreaLayout->setMargin(0); - effects_area = new EffectsArea(scrollAreaWidgetContents); + effects_area = new EffectsArea(); effects_area->setContextMenuPolicy(Qt::CustomContextMenu); connect(effects_area, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(effects_area_context_menu())); @@ -305,12 +305,12 @@ void EffectControls::setup_ui() { effects_area_layout->setSpacing(0); effects_area_layout->setMargin(0); - vcontainer = new QWidget(effects_area); - QVBoxLayout* vcontainerLayout = new QVBoxLayout(); + vcontainer = new QWidget(); + QVBoxLayout* vcontainerLayout = new QVBoxLayout(vcontainer); vcontainerLayout->setSpacing(0); vcontainerLayout->setMargin(0); - QWidget* veHeader = new QWidget(vcontainer); + QWidget* veHeader = new QWidget(); veHeader->setObjectName(QStringLiteral("veHeader")); veHeader->setStyleSheet(QLatin1String("#veHeader { background: rgba(0, 0, 0, 0.25); }")); @@ -353,11 +353,11 @@ void EffectControls::setup_ui() { effects_area_layout->addWidget(vcontainer); - acontainer = new QWidget(effects_area); + acontainer = new QWidget(); QVBoxLayout* acontainerLayout = new QVBoxLayout(acontainer); acontainerLayout->setSpacing(0); acontainerLayout->setMargin(0); - QWidget* aeHeader = new QWidget(acontainer); + QWidget* aeHeader = new QWidget(); aeHeader->setObjectName(QStringLiteral("aeHeader")); aeHeader->setStyleSheet(QLatin1String("#aeHeader { background: rgba(0, 0, 0, 0.25); }")); @@ -389,7 +389,7 @@ void EffectControls::setup_ui() { acontainerLayout->addWidget(aeHeader); - audio_effect_area = new QWidget(acontainer); + audio_effect_area = new QWidget(); QVBoxLayout* aeAreaLayout = new QVBoxLayout(audio_effect_area); aeAreaLayout->setSpacing(0); aeAreaLayout->setMargin(0); @@ -398,7 +398,7 @@ void EffectControls::setup_ui() { effects_area_layout->addWidget(acontainer); - lblMultipleClipsSelected = new QLabel(effects_area); + lblMultipleClipsSelected = new QLabel(); lblMultipleClipsSelected->setAlignment(Qt::AlignCenter); lblMultipleClipsSelected->setText(tr("(Multiple clips selected)")); effects_area_layout->addWidget(lblMultipleClipsSelected); @@ -409,30 +409,33 @@ void EffectControls::setup_ui() { scrollArea->setWidget(scrollAreaWidgetContents); splitter->addWidget(scrollArea); - QWidget* keyframeArea = new QWidget(splitter); + + QWidget* keyframeArea = new QWidget(); + QSizePolicy keyframe_sp; keyframe_sp.setHorizontalPolicy(QSizePolicy::Minimum); keyframe_sp.setVerticalPolicy(QSizePolicy::Preferred); keyframe_sp.setHorizontalStretch(1); keyframeArea->setSizePolicy(keyframe_sp); + QVBoxLayout* keyframeAreaLayout = new QVBoxLayout(keyframeArea); keyframeAreaLayout->setSpacing(0); keyframeAreaLayout->setMargin(0); - headers = new TimelineHeader(keyframeArea); + headers = new TimelineHeader(); keyframeAreaLayout->addWidget(headers); - QWidget* keyframeCenterWidget = new QWidget(keyframeArea); + QWidget* keyframeCenterWidget = new QWidget(); QHBoxLayout* keyframeCenterLayout = new QHBoxLayout(keyframeCenterWidget); keyframeCenterLayout->setSpacing(0); keyframeCenterLayout->setMargin(0); - keyframeView = new KeyframeView(keyframeCenterWidget); + keyframeView = new KeyframeView(); keyframeCenterLayout->addWidget(keyframeView); - verticalScrollBar = new QScrollBar(keyframeCenterWidget); + verticalScrollBar = new QScrollBar(); verticalScrollBar->setOrientation(Qt::Vertical); keyframeCenterLayout->addWidget(verticalScrollBar); @@ -440,7 +443,7 @@ void EffectControls::setup_ui() { keyframeAreaLayout->addWidget(keyframeCenterWidget); - horizontalScrollBar = new ResizableScrollBar(keyframeArea); + horizontalScrollBar = new ResizableScrollBar(); horizontalScrollBar->setOrientation(Qt::Horizontal); keyframeAreaLayout->addWidget(horizontalScrollBar); diff --git a/panels/panels.cpp b/panels/panels.cpp index bb51363b5..98a61dcd2 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -100,6 +100,7 @@ void update_effect_controls() { if (panel_effect_controls->multiple != multiple || !same) { panel_effect_controls->multiple = multiple; + panel_effect_controls->set_clips(selected_clips, mode); } } diff --git a/project/footage.cpp b/project/footage.cpp index c9dbd83f6..c5cdc94e9 100644 --- a/project/footage.cpp +++ b/project/footage.cpp @@ -69,5 +69,6 @@ void FootageStream::make_square_thumb() { int sqx = (diff < 0) ? -diff : 0; int sqy = (diff > 0) ? diff : 0; p.drawImage(sqx, sqy, video_preview); + p.end(); video_preview_square = QIcon(pixmap); } diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index 8801db35e..dc02bd520 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -20,6 +20,9 @@ ViewerContainer::ViewerContainer(QWidget *parent) : horizontal_scrollbar = new QScrollBar(Qt::Horizontal, this); vertical_scrollbar = new QScrollBar(Qt::Vertical, this); + horizontal_scrollbar->setVisible(false); + vertical_scrollbar->setVisible(false); + horizontal_scrollbar->setSingleStep(20); vertical_scrollbar->setSingleStep(20); @@ -30,12 +33,7 @@ ViewerContainer::ViewerContainer(QWidget *parent) : connect(vertical_scrollbar, SIGNAL(valueChanged(int)), this, SLOT(scroll_changed())); } -ViewerContainer::~ViewerContainer() { - delete child; - - delete horizontal_scrollbar; - delete vertical_scrollbar; -} +ViewerContainer::~ViewerContainer() {} void ViewerContainer::dragScrollPress(const QPoint &p) { drag_start_x = p.x(); From 861a5e2ce5c9df919b1f33e0241420cfa33f9023 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 22:51:43 +1100 Subject: [PATCH 035/202] added audio device settings to preferences --- dialogs/newsequencedialog.cpp | 9 +--- dialogs/preferencesdialog.cpp | 77 +++++++++++++++++++++++++++++++++-- dialogs/preferencesdialog.h | 3 ++ io/config.cpp | 8 ++++ io/config.h | 2 + io/exportthread.cpp | 13 +++--- playback/audio.cpp | 59 +++++++++++++++++++++------ playback/audio.h | 3 ++ 8 files changed, 143 insertions(+), 31 deletions(-) diff --git a/dialogs/newsequencedialog.cpp b/dialogs/newsequencedialog.cpp index 9eaf35367..b80fde74f 100644 --- a/dialogs/newsequencedialog.cpp +++ b/dialogs/newsequencedialog.cpp @@ -8,6 +8,7 @@ #include "panels/timeline.h" #include "playback/playback.h" #include "project/media.h" +#include "playback/audio.h" #include #include @@ -232,13 +233,7 @@ void NewSequenceDialog::setup_ui() { audioLayout->addWidget(new QLabel(tr("Sample Rate: "), this), 0, 0, 1, 1); audio_frequency_combobox = new QComboBox(audioGroupBox); - audio_frequency_combobox->addItem("22050 Hz", 22050); - audio_frequency_combobox->addItem("24000 Hz", 24000); - audio_frequency_combobox->addItem("32000 Hz", 32000); - audio_frequency_combobox->addItem("44100 Hz", 44100); - audio_frequency_combobox->addItem("48000 Hz", 48000); - audio_frequency_combobox->addItem("88200 Hz", 88200); - audio_frequency_combobox->addItem("96000 Hz", 96000); + combobox_audio_sample_rates(audio_frequency_combobox); audio_frequency_combobox->setCurrentIndex(4); audioLayout->addWidget(audio_frequency_combobox, 0, 1, 1, 1); diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 37b54958a..85150b666 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -1,6 +1,7 @@ #include "preferencesdialog.h" #include "io/config.h" +#include "playback/audio.h" #include "mainwindow.h" #include @@ -22,6 +23,7 @@ #include #include #include +#include #include "debug.h" @@ -133,6 +135,14 @@ void PreferencesDialog::save() { config.previous_queue_size = previous_queue_spinbox->value(); config.previous_queue_type = previous_queue_type->currentIndex(); + // audio preferences + bool reset_audio_required = (config.preferred_audio_output != audio_output_devices->currentData().toString() + || config.preferred_audio_input != audio_input_devices->currentData().toString()); + config.preferred_audio_output = audio_output_devices->currentData().toString(); + config.preferred_audio_input = audio_input_devices->currentData().toString(); + qDebug() << "selected audio input" << audio_input_devices->currentData().toString(); + config.audio_rate = audio_sample_rate->currentData().toInt(); + // the following settings may require a restart of Olive to take effect: bool needs_restart = false; @@ -152,6 +162,10 @@ void PreferencesDialog::save() { key_shortcut_fields.at(i)->set_action_shortcut(); } + if (reset_audio_required) { + init_audio(); + } + if (needs_restart) { QMessageBox::information(this, tr("Warning"), tr("Some changed settings will require restarting Olive to take effect")); } @@ -286,7 +300,7 @@ void PreferencesDialog::setup_ui() { QTabWidget* tabWidget = new QTabWidget(this); // General - QTabWidget* general_tab = new QTabWidget(this); + QWidget* general_tab = new QWidget(this); QGridLayout* general_layout = new QGridLayout(general_tab); // General -> Custom CSS @@ -382,6 +396,65 @@ void PreferencesDialog::setup_ui() { tabWidget->addTab(playback_tab, tr("Playback")); + // Audio + QWidget* audio_tab = new QWidget(this); + + QGridLayout* audio_tab_layout = new QGridLayout(audio_tab); + + audio_tab_layout->addWidget(new QLabel(tr("Output Device:")), 0, 0); + + audio_output_devices = new QComboBox(); + audio_output_devices->addItem(tr("Default"), ""); + + // list all available audio output devices + QList devs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); + bool found_preferred_device = false; + for (int i=0;iaddItem(devs.at(i).deviceName(), devs.at(i).deviceName()); + if (!found_preferred_device + && devs.at(i).deviceName() == config.preferred_audio_output) { + audio_output_devices->setCurrentIndex(audio_output_devices->count()-1); + found_preferred_device = true; + } + } + + audio_tab_layout->addWidget(audio_output_devices, 0, 1); + + audio_tab_layout->addWidget(new QLabel(tr("Input Device:")), 1, 0); + + audio_input_devices = new QComboBox(); + audio_input_devices->addItem(tr("Default"), ""); + + // list all available audio input devices + devs = QAudioDeviceInfo::availableDevices(QAudio::AudioInput); + found_preferred_device = false; + for (int i=0;iaddItem(devs.at(i).deviceName(), devs.at(i).deviceName()); + if (!found_preferred_device + && devs.at(i).deviceName() == config.preferred_audio_input) { + audio_input_devices->setCurrentIndex(audio_input_devices->count()-1); + found_preferred_device = true; + } + } + + audio_tab_layout->addWidget(audio_input_devices, 1, 1); + + audio_tab_layout->addWidget(new QLabel(tr("Sample Rate:")), 2, 0); + + audio_sample_rate = new QComboBox(); + combobox_audio_sample_rates(audio_sample_rate); + for (int i=0;icount();i++) { + if (audio_sample_rate->itemData(i).toInt() == config.audio_rate) { + audio_sample_rate->setCurrentIndex(i); + break; + } + } + + audio_tab_layout->addWidget(audio_sample_rate, 2, 1); + + tabWidget->addTab(audio_tab, tr("Audio")); + + // Shortcuts QWidget* shortcut_tab = new QWidget(this); QVBoxLayout* shortcut_layout = new QVBoxLayout(shortcut_tab); @@ -432,6 +505,4 @@ void PreferencesDialog::setup_ui() { connect(buttonBox, SIGNAL(accepted()), this, SLOT(save())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - - tabWidget->setCurrentIndex(2); } diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index 9e3ad21fc..2e8243fda 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -62,6 +62,9 @@ private: QComboBox* previous_queue_type; QSpinBox* effect_textbox_lines_field; QCheckBox* use_software_fallbacks_checkbox; + QComboBox* audio_output_devices; + QComboBox* audio_input_devices; + QComboBox* audio_sample_rate; QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/io/config.cpp b/io/config.cpp index 912fe86e9..2a3122557 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -173,6 +173,12 @@ void Config::load(QString path) { } else if (stream.name() == "CenterTimelineTimecodes") { stream.readNext(); center_timeline_timecodes = (stream.text() == "1"); + } else if (stream.name() == "PreferredAudioOutput") { + stream.readNext(); + preferred_audio_output = stream.text().toString(); + } else if (stream.name() == "PreferredAudioInput") { + stream.readNext(); + preferred_audio_input = stream.text().toString(); } } } @@ -235,6 +241,8 @@ void Config::save(QString path) { stream.writeTextElement("EffectTextboxLines", QString::number(effect_textbox_lines)); stream.writeTextElement("UseSoftwareFallback", QString::number(use_software_fallback)); stream.writeTextElement("CenterTimelineTimecodes", QString::number(center_timeline_timecodes)); + stream.writeTextElement("PreferredAudioOutput", preferred_audio_output); + stream.writeTextElement("PreferredAudioInput", preferred_audio_input); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index 84bd848df..5e8c61f27 100644 --- a/io/config.h +++ b/io/config.h @@ -64,6 +64,8 @@ struct Config { int effect_textbox_lines; bool use_software_fallback; bool center_timeline_timecodes; + QString preferred_audio_output; + QString preferred_audio_input; void load(QString path); void save(QString path); diff --git a/io/exportthread.cpp b/io/exportthread.cpp index ad96a4a0b..79136b2f5 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -132,9 +132,6 @@ bool ExportThread::setupVideo() { break; } break; - case AV_CODEC_ID_GIF: - av_opt_set(vcodec_ctx->priv_data, "image", "1", AV_OPT_SEARCH_CHILDREN); - break; } AVDictionary* opts = nullptr; @@ -377,18 +374,20 @@ void ExportThread::run() { sws_frame->height = video_height; av_frame_get_buffer(sws_frame, 0); - // change pixel format + // convert pixel format to format expected by the encoder sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); sws_frame->pts = qRound(timecode_secs/av_q2d(video_stream->time_base)); - // send to encoder + // send converted frame to encoder if (!encode(fmt_ctx, vcodec_ctx, sws_frame, &video_pkt, video_stream, false)) continueEncode = false; av_frame_free(&sws_frame); } if (audio_enabled) { + // do we need to encode more audio samples? while (continueEncode && file_audio_samples <= (timecode_secs*audio_sampling_rate)) { + // copy samples from audio buffer to AVFrame int adjusted_read = audio_ibuffer_read%audio_ibuffer_size; int copylen = qMin(aframe_bytes, audio_ibuffer_size-adjusted_read); @@ -415,15 +414,13 @@ void ExportThread::run() { } } - // encoding stats + // generating encoding statistics (time it took to encode this frame/estimated remaining time) frame_time = (QDateTime::currentMSecsSinceEpoch()-start_time); total_time += frame_time; remaining_frames = (end_frame-sequence->playhead); avg_time = (total_time/frame_count); eta = (remaining_frames*avg_time); -// qInfo() << "Encoded frame" << sequence->playhead << "- took" << frame_time << "ms (avg:" << avg_time << "ms, remaining:" << remaining_frames << ", ETA:" << eta << ")"; - emit progress_changed(qRound((double(sequence->playhead-start_frame) / double(end_frame-start_frame)) * 100.0), eta); sequence->playhead++; frame_count++; diff --git a/playback/audio.cpp b/playback/audio.cpp index b5abc9faf..44402a6f6 100644 --- a/playback/audio.cpp +++ b/playback/audio.cpp @@ -17,6 +17,7 @@ #include #include #include +#include extern "C" { #include @@ -43,6 +44,35 @@ bool is_audio_device_set() { return audio_device_set; } +QAudioDeviceInfo get_audio_device(QAudio::Mode mode) { + QList devs = QAudioDeviceInfo::availableDevices(mode); + + // try to retrieve preferred device from config + QString preferred_device = (mode == QAudio::AudioOutput) ? config.preferred_audio_output : config.preferred_audio_input; + if (!preferred_device.isEmpty()) { + for (int i=0;i 0) { + return devs.at(0); + } + + // couldn't find any audio devices, return null device + return QAudioDeviceInfo(); +} + void init_audio() { stop_audio(); @@ -54,18 +84,9 @@ void init_audio() { audio_format.setByteOrder(QAudioFormat::LittleEndian); audio_format.setSampleType(QAudioFormat::SignedInt); - QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice()); - QList devs = QAudioDeviceInfo::availableDevices(QAudio::AudioOutput); - qInfo() << "Found the following audio devices:"; - for (int i=0;i 0) { - qWarning() << "Default audio returned nullptr, attempting to use first device found..."; - info = devs.at(0); - } - qInfo() << "Using audio device" << info.deviceName(); + QAudioDeviceInfo info = get_audio_device(QAudio::AudioOutput); + // see if desired format can be used by the device, use nearest if not if (!info.isFormatSupported(audio_format)) { qWarning() << "Audio format is not supported by backend, using nearest"; audio_format = info.nearestFormat(audio_format); @@ -311,13 +332,15 @@ bool start_recording() { if (config.recording_mode != audio_format.channelCount()) { audio_format.setChannelCount(config.recording_mode); } - QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice(); + + QAudioDeviceInfo info = get_audio_device(QAudio::AudioInput); + if (!info.isFormatSupported(audio_format)) { qWarning() << "Default format not supported, using nearest"; audio_format = info.nearestFormat(audio_format); } write_wave_header(output_recording, audio_format); - audio_input = new QAudioInput(audio_format); + audio_input = new QAudioInput(info, audio_format); audio_input->start(&output_recording); recording = true; @@ -341,3 +364,13 @@ void stop_recording() { QString get_recorded_audio_filename() { return output_recording.fileName(); } + +void combobox_audio_sample_rates(QComboBox *combobox) { + combobox->addItem("22050 Hz", 22050); + combobox->addItem("24000 Hz", 24000); + combobox->addItem("32000 Hz", 32000); + combobox->addItem("44100 Hz", 44100); + combobox->addItem("48000 Hz", 48000); + combobox->addItem("88200 Hz", 88200); + combobox->addItem("96000 Hz", 96000); +} diff --git a/playback/audio.h b/playback/audio.h index 8ca487fa2..fdb7ee3eb 100644 --- a/playback/audio.h +++ b/playback/audio.h @@ -11,6 +11,7 @@ class QIODevice; class QAudioOutput; +class QComboBox; struct Sequence; @@ -59,4 +60,6 @@ bool start_recording(); void stop_recording(); QString get_recorded_audio_filename(); +void combobox_audio_sample_rates(QComboBox* combobox); + #endif // AUDIO_H From 883b2b9c7c108af7813f5cd25d036bc1352163e9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 23:18:02 +1100 Subject: [PATCH 036/202] fixed some UI issues --- panels/grapheditor.cpp | 59 +++++++++++++++++++----------------------- panels/project.cpp | 34 ++++++++++++------------ ui/viewercontainer.cpp | 4 +-- 3 files changed, 45 insertions(+), 52 deletions(-) diff --git a/panels/grapheditor.cpp b/panels/grapheditor.cpp index cb4bda3c2..370576465 100644 --- a/panels/grapheditor.cpp +++ b/panels/grapheditor.cpp @@ -24,46 +24,42 @@ GraphEditor::GraphEditor(QWidget* parent) : QDockWidget(parent), row(nullptr) { resize(720, 480); QWidget* main_widget = new QWidget(this); - setWidget(main_widget); QVBoxLayout* layout = new QVBoxLayout(main_widget); + setWidget(main_widget); - QWidget* tool_widget = new QWidget(this); + QWidget* tool_widget = new QWidget(); tool_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - QHBoxLayout* tools = new QHBoxLayout(this); - tool_widget->setLayout(tools); + QHBoxLayout* tools = new QHBoxLayout(tool_widget); - QWidget* left_tool_widget = new QWidget(this); - QHBoxLayout* left_tool_layout = new QHBoxLayout(this); + QWidget* left_tool_widget = new QWidget(); + QHBoxLayout* left_tool_layout = new QHBoxLayout(left_tool_widget); left_tool_layout->setSpacing(0); left_tool_layout->setMargin(0); - left_tool_widget->setLayout(left_tool_layout); tools->addWidget(left_tool_widget); - QWidget* center_tool_widget = new QWidget(this); - QHBoxLayout* center_tool_layout = new QHBoxLayout(this); + QWidget* center_tool_widget = new QWidget(); + QHBoxLayout* center_tool_layout = new QHBoxLayout(center_tool_widget); center_tool_layout->setSpacing(0); center_tool_layout->setMargin(0); - center_tool_widget->setLayout(center_tool_layout); tools->addWidget(center_tool_widget); - QWidget* right_tool_widget = new QWidget(this); - QHBoxLayout* right_tool_layout = new QHBoxLayout(this); + QWidget* right_tool_widget = new QWidget(); + QHBoxLayout* right_tool_layout = new QHBoxLayout(right_tool_widget); right_tool_layout->setSpacing(0); right_tool_layout->setMargin(0); - right_tool_widget->setLayout(right_tool_layout); tools->addWidget(right_tool_widget); - keyframe_nav = new KeyframeNavigator(this, false); + keyframe_nav = new KeyframeNavigator(nullptr, false); keyframe_nav->enable_keyframes(true); keyframe_nav->enable_keyframe_toggle(false); left_tool_layout->addWidget(keyframe_nav); left_tool_layout->addStretch(); - linear_button = new QPushButton(tr("Linear"), this); + linear_button = new QPushButton(tr("Linear")); linear_button->setProperty("type", EFFECT_KEYFRAME_LINEAR); linear_button->setCheckable(true); - bezier_button = new QPushButton(tr("Bezier"), this); + bezier_button = new QPushButton(tr("Bezier")); bezier_button->setProperty("type", EFFECT_KEYFRAME_BEZIER); bezier_button->setCheckable(true); - hold_button = new QPushButton(tr("Hold"), this); + hold_button = new QPushButton(tr("Hold")); hold_button->setProperty("type", EFFECT_KEYFRAME_HOLD); hold_button->setCheckable(true); @@ -74,36 +70,33 @@ GraphEditor::GraphEditor(QWidget* parent) : QDockWidget(parent), row(nullptr) { layout->addWidget(tool_widget); - QWidget* central_widget = new QWidget(this); - QVBoxLayout* central_layout = new QVBoxLayout(this); - central_widget->setLayout(central_layout); + QWidget* central_widget = new QWidget(); + QVBoxLayout* central_layout = new QVBoxLayout(central_widget); central_layout->setSpacing(0); central_layout->setMargin(0); - header = new TimelineHeader(this); + header = new TimelineHeader(); header->viewer = panel_sequence_viewer; central_layout->addWidget(header); - view = new GraphView(this); + view = new GraphView(); central_layout->addWidget(view); layout->addWidget(central_widget); - QWidget* value_widget = new QWidget(this); + QWidget* value_widget = new QWidget(); value_widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); - QHBoxLayout* values = new QHBoxLayout(this); - value_widget->setLayout(values); + QHBoxLayout* values = new QHBoxLayout(value_widget); values->addStretch(); - QWidget* central_value_widget = new QWidget(this); - value_layout = new QHBoxLayout(this); + QWidget* central_value_widget = new QWidget(); + value_layout = new QHBoxLayout(central_value_widget); value_layout->setMargin(0); - value_layout->addWidget(new QLabel("", this)); // a spacer so the layout doesn't jump - central_value_widget->setLayout(value_layout); + value_layout->addWidget(new QLabel("")); // a spacer so the layout doesn't jump values->addWidget(central_value_widget); values->addStretch(); layout->addWidget(value_widget); - current_row_desc = new QLabel(this); + current_row_desc = new QLabel(); current_row_desc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum); current_row_desc->setAlignment(Qt::AlignCenter); layout->addWidget(current_row_desc); @@ -157,7 +150,7 @@ void GraphEditor::set_row(EffectRow *r) { for (int i=0;ifieldCount();i++) { EffectField* field = r->field(i); if (field->type == EFFECT_FIELD_DOUBLE) { - QPushButton* slider_button = new QPushButton(this); + QPushButton* slider_button = new QPushButton(); slider_button->setCheckable(true); slider_button->setChecked(field->is_enabled()); slider_button->setIcon(QIcon(":/icons/record.png")); @@ -167,7 +160,7 @@ void GraphEditor::set_row(EffectRow *r) { slider_proxy_buttons.append(slider_button); value_layout->addWidget(slider_button); - LabelSlider* slider = new LabelSlider(this); + LabelSlider* slider = new LabelSlider(); slider->set_color(get_curve_color(i, r->fieldCount()).name()); connect(slider, SIGNAL(valueChanged()), this, SLOT(passthrough_slider_value())); slider_proxies.append(slider); @@ -190,7 +183,7 @@ void GraphEditor::set_row(EffectRow *r) { connect(keyframe_nav, SIGNAL(goto_next_key()), row, SLOT(goto_next_key())); } else { row = nullptr; - current_row_desc->setText(0); + current_row_desc->setText(nullptr); } view->set_row(row); update_panel(); diff --git a/panels/project.cpp b/panels/project.cpp index 71a57c9e0..4ec6ae81a 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -64,8 +64,9 @@ Project::Project(QWidget *parent) : setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); QWidget* dockWidgetContents = new QWidget(this); + QVBoxLayout* verticalLayout = new QVBoxLayout(dockWidgetContents); - verticalLayout->setContentsMargins(0, 0, 0, 0); + verticalLayout->setMargin(0); verticalLayout->setSpacing(0); setWidget(dockWidgetContents); @@ -76,15 +77,15 @@ Project::Project(QWidget *parent) : sorter->setSourceModel(&project_model); // optional toolbar - toolbar_widget = new QWidget(this); + toolbar_widget = new QWidget(); toolbar_widget->setVisible(config.show_project_toolbar); toolbar_widget->setObjectName("project_toolbar"); + QHBoxLayout* toolbar = new QHBoxLayout(toolbar_widget); toolbar->setMargin(0); toolbar->setSpacing(0); - toolbar_widget->setLayout(toolbar); - QPushButton* toolbar_new = new QPushButton(toolbar_widget); + QPushButton* toolbar_new = new QPushButton(); QIcon icon1; icon1.addFile(QStringLiteral(":/icons/add-button.png"), QSize(), QIcon::Normal, QIcon::On); icon1.addFile(QStringLiteral(":/icons/add-button-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -93,7 +94,7 @@ Project::Project(QWidget *parent) : connect(toolbar_new, SIGNAL(clicked(bool)), this, SLOT(make_new_menu())); toolbar->addWidget(toolbar_new); - QPushButton* toolbar_open = new QPushButton(toolbar_widget); + QPushButton* toolbar_open = new QPushButton(); QIcon icon2; icon2.addFile(QStringLiteral(":/icons/open.png"), QSize(), QIcon::Normal, QIcon::On); icon2.addFile(QStringLiteral(":/icons/open-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -102,7 +103,7 @@ Project::Project(QWidget *parent) : connect(toolbar_open, SIGNAL(clicked(bool)), mainWindow, SLOT(open_project())); toolbar->addWidget(toolbar_open); - QPushButton* toolbar_save = new QPushButton(toolbar_widget); + QPushButton* toolbar_save = new QPushButton(); QIcon icon3; icon3.addFile(QStringLiteral(":/icons/save.png"), QSize(), QIcon::Normal, QIcon::On); icon3.addFile(QStringLiteral(":/icons/save-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -111,7 +112,7 @@ Project::Project(QWidget *parent) : connect(toolbar_save, SIGNAL(clicked(bool)), mainWindow, SLOT(save_project())); toolbar->addWidget(toolbar_save); - QPushButton* toolbar_undo = new QPushButton(toolbar_widget); + QPushButton* toolbar_undo = new QPushButton(); QIcon icon4; icon4.addFile(QStringLiteral(":/icons/undo.png"), QSize(), QIcon::Normal, QIcon::On); icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -120,7 +121,7 @@ Project::Project(QWidget *parent) : connect(toolbar_undo, SIGNAL(clicked(bool)), mainWindow, SLOT(undo())); toolbar->addWidget(toolbar_undo); - QPushButton* toolbar_redo = new QPushButton(toolbar_widget); + QPushButton* toolbar_redo = new QPushButton(); QIcon icon5; icon5.addFile(QStringLiteral(":/icons/redo.png"), QSize(), QIcon::Normal, QIcon::On); icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -130,7 +131,7 @@ Project::Project(QWidget *parent) : toolbar->addWidget(toolbar_redo); toolbar->addStretch(); - QPushButton* toolbar_tree_view = new QPushButton(toolbar_widget); + QPushButton* toolbar_tree_view = new QPushButton(); QIcon icon6; icon6.addFile(QStringLiteral(":/icons/treeview.png"), QSize(), QIcon::Normal, QIcon::On); icon6.addFile(QStringLiteral(":/icons/treeview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -139,7 +140,7 @@ Project::Project(QWidget *parent) : connect(toolbar_tree_view, SIGNAL(clicked(bool)), this, SLOT(set_tree_view())); toolbar->addWidget(toolbar_tree_view); - QPushButton* toolbar_icon_view = new QPushButton(toolbar_widget); + QPushButton* toolbar_icon_view = new QPushButton(); QIcon icon7; icon7.addFile(QStringLiteral(":/icons/iconview.png"), QSize(), QIcon::Normal, QIcon::On); icon7.addFile(QStringLiteral(":/icons/iconview-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); @@ -151,20 +152,19 @@ Project::Project(QWidget *parent) : verticalLayout->addWidget(toolbar_widget); // tree view - tree_view = new SourceTable(dockWidgetContents); + tree_view = new SourceTable(); tree_view->project_parent = this; tree_view->setModel(sorter); verticalLayout->addWidget(tree_view); // icon view - icon_view_container = new QWidget(dockWidgetContents); + icon_view_container = new QWidget(); QVBoxLayout* icon_view_container_layout = new QVBoxLayout(icon_view_container); icon_view_container_layout->setMargin(0); icon_view_container_layout->setSpacing(0); - icon_view_container->setLayout(icon_view_container_layout); - QHBoxLayout* icon_view_controls = new QHBoxLayout(icon_view_container); + QHBoxLayout* icon_view_controls = new QHBoxLayout(); icon_view_controls->setMargin(0); icon_view_controls->setSpacing(0); @@ -172,14 +172,14 @@ Project::Project(QWidget *parent) : directory_up_button.addFile(":/icons/dirup.png", QSize(), QIcon::Normal); directory_up_button.addFile(":/icons/dirup-disabled.png", QSize(), QIcon::Disabled); - directory_up = new QPushButton(icon_view_container); + directory_up = new QPushButton(); directory_up->setIcon(directory_up_button); directory_up->setEnabled(false); icon_view_controls->addWidget(directory_up); icon_view_controls->addStretch(); - QSlider* icon_size_slider = new QSlider(Qt::Horizontal, icon_view_container); + QSlider* icon_size_slider = new QSlider(Qt::Horizontal); icon_size_slider->setMinimum(16); icon_size_slider->setMaximum(120); icon_view_controls->addWidget(icon_size_slider); @@ -187,7 +187,7 @@ Project::Project(QWidget *parent) : icon_view_container_layout->addLayout(icon_view_controls); - icon_view = new SourceIconView(dockWidgetContents); + icon_view = new SourceIconView(); icon_view->project_parent = this; icon_view->setModel(sorter); icon_view->setIconSize(QSize(100, 100)); diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index dc02bd520..d6e3f0dcd 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -131,11 +131,11 @@ void ViewerContainer::adjust() { void ViewerContainer::resizeEvent(QResizeEvent *event) { horizontal_scrollbar->move(0, height()-horizontal_scrollbar->height()); - horizontal_scrollbar->setFixedWidth(width()-vertical_scrollbar->width()); + horizontal_scrollbar->setFixedWidth(qMax(0, width()-vertical_scrollbar->width())); horizontal_scrollbar->setPageStep(width()); vertical_scrollbar->move(width() - vertical_scrollbar->width(), 0); - vertical_scrollbar->setFixedHeight(height()-horizontal_scrollbar->height()); + vertical_scrollbar->setFixedHeight(qMax(0, height()-horizontal_scrollbar->height())); vertical_scrollbar->setPageStep(height()); event->accept(); From 1212405046f63205f133063f3795f349d6a596c4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 30 Jan 2019 23:18:23 +1100 Subject: [PATCH 037/202] added no blending modes mode --- main.cpp | 5 ++++ ui/renderfunctions.cpp | 66 +++++++++++++++++++++++++----------------- ui/renderfunctions.h | 2 ++ 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/main.cpp b/main.cpp index d11e9886d..1b9f4670f 100644 --- a/main.cpp +++ b/main.cpp @@ -2,7 +2,10 @@ #include #include "debug.h" + +// importing classes for certain command line args #include "project/effect.h" +#include "ui/renderfunctions.h" extern "C" { #include @@ -40,6 +43,8 @@ int main(int argc, char *argv[]) { shaders_are_enabled = false; } else if (!strcmp(argv[i], "--no-debug")) { use_internal_logger = false; + } else if (!strcmp(argv[i], "--disable-blend-modes")) { + disable_blending = true; } else { printf("[ERROR] Unknown argument '%s'\n", argv[1]); return 1; diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index cead4ea51..0e0dfa8d4 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -24,6 +24,8 @@ #include "panels/timeline.h" #include "panels/viewer.h" +bool disable_blending = false; + extern "C" { #include } @@ -486,11 +488,13 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { - // copy front buffer to back buffer - if (params.nests.size() > 0) { - draw_clip(params.ctx, params.nests.last()->fbo[2]->handle(), params.nests.last()->fbo[0]->texture(), true); - } else { - draw_clip(params.ctx, params.backend_buffer2, params.main_attachment, true); + // copy front buffer to back buffer (only if we're using blending modes - which we usually will be) + if (!disable_blending) { + if (params.nests.size() > 0) { + draw_clip(params.ctx, params.nests.last()->fbo[2]->handle(), params.nests.last()->fbo[0]->texture(), true); + } else { + draw_clip(params.ctx, params.backend_buffer2, params.main_attachment, true); + } } @@ -502,34 +506,44 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // bind front buffer as draw buffer params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); - // load background texture into texture unit 0 - params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_2); + if (disable_blending) { + // some GPUs don't like the blending shader, so we provide a pure GL fallback here - // load foreground texture into texture unit 1 - params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 1); // Texture unit 1 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_1); + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_1); - // bind and configure blending mode shader - params.blend_mode_program->bind(); - params.blend_mode_program->setUniformValue("blendmode", coords.blendmode); - params.blend_mode_program->setUniformValue("opacity", coords.opacity); - params.blend_mode_program->setUniformValue("background", 0); - params.blend_mode_program->setUniformValue("foreground", 1); + full_blit(); - glClear(GL_COLOR_BUFFER_BIT); + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + } else { + // load background texture into texture unit 0 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_2); - full_blit(); + // load foreground texture into texture unit 1 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 1); // Texture unit 1 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_1); - // release blend mode shader - params.blend_mode_program->release(); + // bind and configure blending mode shader + params.blend_mode_program->bind(); + params.blend_mode_program->setUniformValue("blendmode", coords.blendmode); + params.blend_mode_program->setUniformValue("opacity", coords.opacity); + params.blend_mode_program->setUniformValue("background", 0); + params.blend_mode_program->setUniformValue("foreground", 1); - // unbind texture from texture unit 1 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + glClear(GL_COLOR_BUFFER_BIT); - // unbind texture from texture unit 0 - params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + full_blit(); + + // release blend mode shader + params.blend_mode_program->release(); + + // unbind texture from texture unit 1 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + + // unbind texture from texture unit 0 + params.ctx->functions()->glActiveTexture(GL_TEXTURE0 + 0); // Texture unit 0 + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); + } // unbind framebuffer params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 0830d6cb4..1fe238db8 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -10,6 +10,8 @@ class QOpenGLShaderProgram; struct Sequence; struct Clip; +extern bool disable_blending; + struct ComposeSequenceParams { Viewer* viewer; QOpenGLContext* ctx; From 37685f24c71f449e59c6aa5678040a24d50b6991 Mon Sep 17 00:00:00 2001 From: naj59 Date: Wed, 30 Jan 2019 15:57:53 +0100 Subject: [PATCH 038/202] added initial german translation --- .../org.olivevideoeditor.Olive.appdata.xml | 2 + ts/olive_de.ts | 1064 +++++++++-------- 2 files changed, 576 insertions(+), 490 deletions(-) diff --git a/packaging/linux/org.olivevideoeditor.Olive.appdata.xml b/packaging/linux/org.olivevideoeditor.Olive.appdata.xml index bcb54e5a6..94012137b 100644 --- a/packaging/linux/org.olivevideoeditor.Olive.appdata.xml +++ b/packaging/linux/org.olivevideoeditor.Olive.appdata.xml @@ -6,12 +6,14 @@ GPL-3.0 Olive Team Non-linear video editor + Nicht-lineares Videoschnittprogramm Editor de vídeo não-linear Editor de video no lineal Нелинейный видеоредактор Нелінійний відеоредактор Нелінійний відеоредактор

Olive is a free non-linear video editor aiming to provide a fully-featured alternative to high-end professional video editing software.

+ Olive ist ein freies nicht-lineares Videoschnittprogramm, welches eine vollwertige Alternative zu High-End Videoschnittprogrammen darstellen soll.

Olive é um editor de vídeo não-linear com o objetivo de fornecer uma alternativa completa para softwares profissionais de edição de vídeo.

Olive es un editor de video no lineal libre que apunta a brindar una alternativa completa al software de edición de video profesional.

Olive — свободный нелинейный видеоредактор, задуманный как полноценная замена закрытым коммерческим продуктам.

diff --git a/ts/olive_de.ts b/ts/olive_de.ts index 27d00e038..56c7282e9 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -6,12 +6,12 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und geschützt durch die GNU GPL. Olive Team is obliged to inform users that Olive source code is available for download from its website. - + Das Olive Team is verpflichtet dazu, die Nutzer darüber zu informieren, das der Quellcode von der Webseite heruntergeladen werden kann.
@@ -19,7 +19,7 @@ Search for action... - + Suchen nach Aktion... @@ -27,12 +27,13 @@ Audio - + Same as in english + Audio Recording - + Aufnahme @@ -40,12 +41,13 @@ Amount - + Menge Mix - + Same as in english? + Mix @@ -53,17 +55,19 @@ Invalid - + ungültig Mono - + Same as in english + Mono Stereo - + Same as in english + Stereo @@ -71,7 +75,7 @@ <untitled> - + <unbenannt> @@ -79,7 +83,7 @@ Set Color - + Farbe übernehmen @@ -87,27 +91,27 @@ Top Left - + Oben Links Top Right - + Oben Rechts Bottom Left - + Unten Links Bottom Right - + Unten Rechts Perspective - + Perspektive @@ -115,7 +119,8 @@ Debug Log - + Could be also different but is understandable in german + Debug-Log @@ -124,22 +129,22 @@ Welcome to Olive! - + Willkommen zu Olive!
Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Wenn Sie für diese Software bezahlt haben, wurden Sie betrogen. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Diese Software ist aktuell in einer ALPHA, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen.Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 Thank you for trying Olive and we hope you enjoy it! - + Danke das Sie Olive ausprobieren! Wir hoffen es gefällt Ihnen!
@@ -147,37 +152,38 @@ Invalid effect - + Ungültiger Effekt No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + The last sentence does not make real sense in german. I changed it to "a reinstallation is recommended" + Kein Kandidat für Effekt '%1'. Dieser Effekt ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. Cu&t - + &Ausschneiden &Copy - + &Kopieren Move &Up - + Nach &oben Move &Down - + Nach &unten D&elete - + L&öschen @@ -185,47 +191,47 @@ Effects: - + Effekte: &Paste - + &Einfügen Add Video Effect - + Video-Effekt hinzufügen VIDEO EFFECTS - + VIDEO-EFFEKTE Add Video Transition - + Video-Übergang hinzufügen Add Audio Effect - + Audio-Effekt hinzufügen AUDIO EFFECTS - + AUDIO-EFFEKTE Add Audio Transition - + Audio-Übergang hinzufügen (Multiple clips selected) - + (mehrere Clips ausgewählt) @@ -233,12 +239,12 @@ Disable Keyframes - + Keyframes deaktivieren Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? @@ -246,7 +252,7 @@ File: - + Datei: @@ -254,72 +260,73 @@ Export "%1" - + Exportieren von "%1" Export Failed - + Exportieren fehlgeschlagen Export failed - %1 - + Exportieren fehlgeschlagen - %1 Invalid dimensions - + Ungültige Dimensionen Export width and height must both be even numbers/divisible by 2. - + Breite und Höhe müssen Zahlen sein die durch 2 teilbar sind. Invalid codec - + Ungültiger Codec Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Ausgabe-Parameter für den ausgewählten Codec konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. Invalid format - + Ungültiges Format Couldn't determine output format. This is a bug, please contact the developers. - + Ausgabe-Format konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. Export Media - + In german it would be not good to add media to the title + Exportieren Quality-based (Constant Rate Factor) - + Qualität (Constant Rate Factor) Constant Bitrate - + Konstante Bitrate Bitrate (Mbps): - + Bitrate (Mbps): Quality (CRF): - + Qualität (CRF): @@ -329,73 +336,82 @@ 17-18 = visually lossless (compressed, but unnoticeable) 23 = high quality 51 = lowest quality possible - + Qualitätsfaktor: + +0 = verlustfrei (lossless) +17-18 = optisch verlustfrei (komprimiert, aber nicht bemerkbar) +23 = höchste Qualität +51 = kleinstmöglichste Qualität Target File Size (MB): - + Ziel-Dateigröße (MB): Format: - + Same as in english + Format: Range: - + Bereich: Entire Sequence - + Komplette Sequenz In to Out - + In to Out Video - + Same as in english + Video Codec: - + Same as in english + Codec: Width: - + Breite: Height: - + Höhe: Frame Rate: - + Bildrate: Compression Type: - + Komprimierungsverfahren: Sampling Rate: - + Abtastrate: Bitrate (Kbps/CBR): - + Same as in english + Bitrate (Kbps/CBR): @@ -403,22 +419,22 @@ failed to send frame to encoder (%1) - + Fehler beim Senden des Frames zum Encoder (%1) failed to receive packet from encoder (%1) - + Fehler beim empfangen des Pakets vom Encoder (%1) could not video encoder for %1 - + Video-Encoder für %1 konnte nicht gefunden werden. could not allocate video stream - + Videostream konnte nicht zugewiesen werden @@ -428,22 +444,22 @@ could not open output video encoder (%1) - + Video-Encoder konnte nicht geöffnet werden (%1) could not copy video encoder parameters to output stream (%1) - + Video-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) could not audio encoder for %1 - + Audio-Encoder für %1 konnte nicht gefunden werden. could not allocate audio stream - + Audiostream konnte nicht zugewiesen werden @@ -453,17 +469,17 @@ could not open output audio encoder (%1) - + Audio-Encoder konnte nicht geöffnet werden (%1) could not copy audio encoder parameters to output stream (%1) - + Audio-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) could not allocate audio buffer (%1) - + Audio-Buffer konnte nicht zugewiesen werden (%1) @@ -473,17 +489,17 @@ could not open output file (%1) - + Ausgabe konnte nicht geöffnet werden (%1) could not write output file header (%1) - + Ausgabe-Datei-Header konnte nicht geschrieben werden (%1) could not write output file trailer (%1) - + Ausgabe-Datei-Trailer konnte nicht geschrieben werden (%1) @@ -491,7 +507,7 @@ Type - + Typ @@ -509,22 +525,22 @@ Failed to load Frei0r plugin "%1": %2 - + Frei0r plugin konnte nicht geladen werden (%1:%2) NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + HINWEIS: Sie können keine 32-bit Frei0r Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + HINWEIS: Sie können keine 64-bit Frei0r Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. Error loading Frei0r plugin - + Fehler beim Laden des Frei0r Plugins @@ -532,22 +548,26 @@ Graph Editor - + Same as in english + Graph Editor Linear - + Same as in english + Linear Bezier - + Same as in english + Bezier Hold - + Does this make sense? + Halten @@ -555,17 +575,17 @@ Zoom to Selection - + In Auswahl zoomen Zoom to Show All - + Zommen um alles anzuzeigen Reset View - + Ansicht zurücksetzen @@ -573,22 +593,22 @@ None (Progressive) - + Keine (Progressive) Top Field First - + Oberes Feld zuerst Bottom Field First - + Unteres Feld zuerst Invalid - + Ungültig @@ -596,7 +616,7 @@ Enable Keyframes - + Keyframes aktivieren @@ -604,17 +624,20 @@ Linear - + Same as in english + Linear Bezier - + Same as in english + Bezier Hold - + Does this make sense? + Halten @@ -623,13 +646,13 @@ Set Value - + Wert setzen
New value: - + Neuer Wert:
@@ -637,17 +660,17 @@ Loading... - + Lädt... Loading '%1'... - + Lädt '%1'... Cancel - + Abbrechen @@ -655,22 +678,22 @@ Version Mismatch - + Unterschiedliche Version This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatible. Wollen Sie es trotzdem versuchen zu laden? Invalid Clip Link - + Ungültiger Clip Link This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es weiterhin versuchen? @@ -680,17 +703,18 @@ User aborted loading - + Nutzer hat Ladevorgang abgebrochen XML Parsing Error - + Does not make sense to translate this + XML Parsing Error Couldn't load '%1'. %2 - + '%1' konnte nicht geladen werden. (%2) @@ -700,7 +724,7 @@ Error loading project: %1 - + Fehler beim Laden des Projektes: %1 @@ -708,27 +732,27 @@ Auto-recovery - + Auto-Wiederherstellung Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + Olive wurde nicht richtig geschlossen und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? &Project - + &Projekt &Sequence - + &Sequenz &Folder - + &Ordner @@ -763,107 +787,107 @@ No active sequence - + Keine aktive Sequenz Please open the sequence you wish to export. - + Bitte öffnen Sie die Sequenz die Sie exportieren möchten. Save Project As... - + Projekt speichern als... Unsaved Project - + Ungespeichertes Projekt This project has changed since it was last saved. Would you like to save it before closing? - + Wollen Sie die Änderungen speichern? &File - + &Datei &New - + &Neu &Open Project - + Projekt &öffnen Clear Recent List - + 'Zuletzt geöffnet' leeren Open Recent - + Zuletzt geöffnet &Save Project - + &Projekt speichern Save Project &As - + Projekt speichern &als... &Import... - + &Importieren... &Export... - + &Exportieren E&xit - + B&eenden &Edit - + &Bearbeiten &Undo - + &Rückgängig Redo - + Wiederholen Cu&t - + &Ausschneiden Cop&y - + &Kopieren &Paste - + &Einfügen @@ -873,32 +897,33 @@ Duplicate - + Duplizieren Delete - + Löschen Ripple Delete - + In Premiere's translations its also called "Ripple Delete" + Ripple Delete Split - + Teilen Select &All - + Alles &auswählen Deselect All - + Auswahl aufheben @@ -908,17 +933,17 @@ Link/Unlink - + Verbinden/Trennen Enable/Disable - + Einblenden/Ausblenden Nest - + Schachteln @@ -953,32 +978,32 @@ Set/Edit Marker - + Marker setzen/bearbeiten &View - + &Ansicht Zoom In - + Einzoomen Zoom Out - + Auszoomen Increase Track Height - + Spurhöhe erhöhen Decrease Track Height - + Spurhöhe verringern @@ -988,17 +1013,17 @@ Track Lines - + Spurlinien Rectified Waveforms - + Nachgebesserte Waveforms Frames - + Bilder/Frames @@ -1013,7 +1038,7 @@ Milliseconds - + Millisekunden @@ -1023,52 +1048,55 @@ Off - + Aus Default - + Does not make sense to translate + Default 4:3 - + 4:3 16:9 - + 16:9 Custom - + Benutzerdefiniert Full Screen - + Vollbild &Playback - + Should we translate this? Playback is also known + &Wiedergabe Go to Start - + Gehe zum Start Previous Frame - + Vorheriger Frame Play/Pause - + Does not make sense to translate + Play/Pause @@ -1078,22 +1106,22 @@ Next Frame - + Nächster Frame Go to End - + Gehe zum Ende Go to Previous Cut - + Gehe zu vorherigem Schnitt Go to Next Cut - + Gehe zum nächsten Schnitt @@ -1108,32 +1136,33 @@ Decrease Speed - + Geschwindigkeit verringern Pause - + Same as in english + Pause Increase Speed - + Geschwindigkeit erhöhen Loop - + Schleife &Window - + &Fenster Project - + Projekt @@ -1143,52 +1172,58 @@ Timeline - + Same as in english + Timeline Graph Editor - + Same as in english + Graph Editor Media Viewer - + Does this make sense to translate? + Media Viewer Sequence Viewer - + Does this make sense to translate? + Sequence Viewer Reset to Default Layout - + Zum Standard-Layout zurücksetzen &Tools - + &Werkzeuge Pointer Tool - + Does this make sense? + Zeiger Edit Tool - + Bearbeitungs-Werkzeug Ripple Tool - + Same as 'Ripple Delete' + Ripple-Werkzeug Razor Tool - + Schneide-Werkzeug @@ -1203,17 +1238,17 @@ Hand Tool - + Hand-Werkzeug Transition Tool - + Übergangs-Werkzeug Enable Snapping - + Snapping aktivieren @@ -1248,12 +1283,12 @@ Enable Drag Files to Timeline - + Dateien auf Timeline ziehen aktivieren Auto-Scale By Default - + Skaliere automatisch @@ -1263,12 +1298,13 @@ Audio Scrubbing - + Same as in english + Audio Scrubbing Enable Drop on Media to Replace - + Auf Medien zum Ersetzen ziehen aktivieren @@ -1278,87 +1314,88 @@ Ask For Name When Setting Marker - + Nach Namen fragen wenn Marker gesetzt wird No Auto-Scroll - + Kein Auto-Scroll Page Auto-Scroll - + Seiten Auto-Scroll Smooth Auto-Scroll - + Weiches Auto-Scroll Preferences - + Einstellungen Clear Undo - + Rückgängig-Historie leeren &Help - + &Hilfe A&ction Search - + &Aktionensuche Debug Log - + Same as in english + Debug Log &About... - + &Über... <untitled> - + <unbenannt> Open Project... - + Projekt öffnen... Missing recent project - + Zuletzt geöffnetes Projekt existiert nicht The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie aus der Liste entfernen? Invalid aspect ratio - + Ungültiges Seitenverhältnis The aspect ratio '%1' is invalid. Please try again. - + Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. Enter custom aspect ratio - + Benutzerdefiniertes Seitenverhältnis eingeben @@ -1368,7 +1405,7 @@ Nested Sequence - + Geschachtelte Sequenz @@ -1376,47 +1413,48 @@ New Folder - + Neuer Ordner: Name: - + Name: Filename: - + Dateiname: Video Dimensions: - + Video-Dimensionen: Frame Rate: - + Bildrate: %1 fields (%2 frames) - + %1 Felder (%2 frames) Interlacing: - + Same as in english + Interlacing: Audio Frequency: - + Audiofrequenz: Audio Channels: - + Audiokanäle: @@ -1425,22 +1463,27 @@ Video Dimensions: %2x%3 Frame Rate: %4 Audio Frequency: %5 Audio Layout: %6 - + Name: %1 +Dimensionen: %2x%3 +Bildrate: %4 +Audiofrequenz: %5 +Audio Layout: %6 Name - + Name Duration - + Dauer Rate - + Same as in english, differently spoken, but same meaning + Rate @@ -1448,47 +1491,51 @@ Audio Layout: %6 "%1" Properties - + "%1" Eigenschaften Tracks: - + Spuren: Video %1: %2x%3 %4FPS - + Same as in english + Video %1: %2x%3 %4FPS Audio %1: %2Hz %3 channels - + Audio %1: %2Hz %3 Kanäle Conform to Frame Rate: - + Entspricht Bildrate: Alpha is Premultiplied - + Alpha ist vormultipliziert Auto (%1) - + Same? + Auto (%1) Interlacing: - + Same as in english + Interlacing: Name: - + Same as in english + Name: @@ -1496,122 +1543,126 @@ Audio Layout: %6 Editing "%1" - + Bearbeitung von "%1" New Sequence - + Neue Sequenz Preset: - + Could be also preset + Vorgabe: Film 4K - + Film 4K TV 4K (Ultra HD/2160p) - + TV 4K (Ultra HD/2160p) 1080p - + 1080p 720p - + 720p 480p - + 480p 360p - + 360p 240p - + 240p 144p - + 144p NTSC (480i) - + NTSC (480i) PAL (576i) - + PAL (576i) Custom - + Benutzerdefiniert Video - + Same as in english + Video Width: - + Breite: Height: - + Höhe: Frame Rate: - + Bildrate: Pixel Aspect Ratio: - + Pixel-Seitenverhältnis: Square Pixels (1.0) - + Quadratische Pixel (1.0) Interlacing: - + Same as in english + Interlacing: None (Progressive) - + Keine (Progressive) Audio - + Same as in english + Audio Sample Rate: - + Abtastrate: @@ -1619,7 +1670,7 @@ Audio Layout: %6 Pan - + Schwenken @@ -1627,133 +1678,135 @@ Audio Layout: %6 Preferences - + Einstellungen Invalid CSS File - + Ungültige CSS Datei CSS file '%1' does not exist. - + CSS Datei '%1' existiert nicht. Warning - + Achtung Some changed settings will require restarting Olive to take effect - + Einige Änderungen erfordern einen Neustart von Olive um angwendet zu werden Confirm Reset All Shortcuts - + Bestätige Zurücksetzen aller Shortcuts Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Sind Sie sicher das Sie alle Tastatur-Shortcuts zurücksetzen wollen? Import Keyboard Shortcuts - + Tastatur-Shortcuts importieren Error saving shortcuts - + Fehler beim Speichern der Shortcuts Failed to open file for reading - + Fehler beim öffnen der Datei Export Keyboard Shortcuts - + Tastatur-Shortcuts exportieren Export Shortcuts - + Shortcuts exportieren Shortcuts exported successfully - + Shortcuts wurden erfolgreich exportiert Failed to open file for writing - + Fehler beim Schreiben der Datei Browse for CSS file - + Nach CSS Datei suchen Custom CSS: - + Benutzerdefiniertes CSS: Browse - + Durchsuchen Image sequence formats: - + Bilddateiformate: Audio Recording: - + Audioaufnahmen: Mono - + Same as in english + Mono Stereo - + Same as in english + Stereo Effect Textbox Lines: - + Effekt Textbox-Linien: Use Software Fallbacks When Possible - + Absicherung durch Software-Defaults General - + Allgemein Behavior - + Verhalten Disable Multithreading on Images - + Multithreading auf Bildern deaktiviern @@ -1775,74 +1828,75 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Memory Usage - + Speicherauslastung Upcoming Frame Queue: - + Anstehende Frame-Warteschlange: frames - + Could also use 'Bilder' + frames seconds - + Sekunden Previous Frame Queue: - + Vorherige Frame-Warteschleife: Playback - + Wiedergabe Search for action or shortcut - + Suchen nach Eintrag oder Shortcut Action - + Eintrag Shortcut - + Shortcut Import - + Importieren Export - + Exportieren Reset Selected - + Setze ausgewählte zurück Reset All - + Alle zurücksetzen Keyboard - + Tastatur @@ -1850,12 +1904,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Could not open file - %1 - + Konnte Datei nicht öffnen - %1 Could not find stream information - %1 - + Konnte Stream-Informationen nicht finden - %1 @@ -1863,39 +1917,39 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + Projekt Sequence - + Sequenz Replace '%1' - + Ersetze '%1' All Files - + Alle Dateien No active sequence - + Keine aktive Sequenz No sequence is active, please open the sequence you want to replace clips from. - + Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips ersetzen möchten. Active sequence selected - + Aktive Sequenz ausgewählt @@ -1905,47 +1959,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Rename '%1' - + '%1' umbenennen Enter new name: - + Neuen Namen eingeben: Delete media in use? - + Benutzte Datei löschen? The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Die Datei '%1' wird aktuell in '%2' benutzt. Wenn Sie sie löschen, werden alle Instanzen in der Sequenz entfernt. Sind Sie sicher? Skip - + Überspringen Image sequence detected - + Bildsequenz erkannt The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? Import media... - + Medien importieren... No sequence is active, please open the sequence you want to delete clips from. - + Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. @@ -1953,7 +2007,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Replace clips using "%1" - + Ersetze Clips using "%1" @@ -1968,52 +2022,52 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Replace - + Ersetzen Cancel - + Abbrechen No media selected - + Keine Medien ausgewählt Please select a media to replace with or click 'Cancel'. - + Bitten wählen Sie Medien zum ersetzen aus oder klicken Sie auf 'Abbrechen'. Same media selected - + Identische Medien ausgewählt You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Sie haben die gleichen Medien ausgewählt, die Sie ersetzen möchten. Bitte wählen Sie andere Medien oder klicken Sie auf 'Abbrechen'. Folder selected - + Ordner ausgewählt You cannot replace footage with a folder. - + Sie können Footage nicht mit einem Ordner austauschen. Active sequence selected - + Aktive Sequenz ausgewählt You cannot insert a sequence into itself. - + Sie können keine Sequenz in die selbe einsetzen. @@ -2021,7 +2075,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff %1 (copy) - + %1 (kopieren) @@ -2029,17 +2083,18 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Intensity - + Intentsität Rotation - + Sames as in english, but differently spoken + Rotation Frequency - + Frequenz @@ -2047,12 +2102,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Type - + Typ Solid Color - + AE and Premiere handle this in the same way + Solid @@ -2067,12 +2123,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Opacity - + Deckkraft Color - + Farbe @@ -2085,97 +2141,99 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Import... - + Importieren... New - + Neu View - + Ansicht Tree View - + A translation would be not recommended due to misunderstanding + Tree View Icon View - + A translation would be not recommended due to misunderstanding + Icon View Show Toolbar - + Toolbar anzeigen Show Sequences - + Sequenzen anzeigen Replace/Relink Media - + Medien ersetzen/neu verbinden Reveal in Explorer - + Im Explorer anzeigen Reveal in Finder - + Im Finder anzeigen Reveal in File Manager - + Im File Manager anzeigen Replace Clips Using This Media - + Ersetze Clips die diese Medien benutzen Create Sequence With This Media - + Sequenz mit diesen Medien erstellen Duplicate - + Duplizieren Delete All Clips Using This Media - + Alle Clips die diese Medien enthalten löschen Delete - + Löschen Properties... - + Eigenschaften... Replace Media - + Medien ersetzen You dropped a file onto '%1'. Would you like to replace it with the dropped file? - + Sie haben eine Datei auf '%1' gezogen.Möchten Sie diese ersetzen? @@ -2183,37 +2241,38 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Speed/Duration - + Geschwindigkeit/Dauer Speed: - + Geschwindigkeit: Frame Rate: - + Bildrate: Duration: - + Dauer: Reverse + Translation needed? Maintain Audio Pitch - + Audio Pitch behandeln Ripple Changes - + Ripple-Änderungen @@ -2221,7 +2280,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Edit Text - + Text bearbeiten @@ -2229,113 +2288,114 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Text - + Same as in english + Text Font - + Schriftart Size - + Größe Color - + Farbe Alignment - + Ausrichtung Left - + Links Center - + Mitte Right - + Rechts Justify - + Ausrichten Top - + Oben Bottom - + Unten Word Wrap - + Zeilenumbruch Outline - + Umriss Outline Color - + Umrissfarbe Outline Width - + Umrissbreite Shadow - + Schatten Shadow Color - + Schattenfarbe Shadow Distance - + Schattenentfernung Shadow Softness - + Schattensoftness Shadow Opacity - + Schattendeckkraft Sample Text - + Beispieltext &Edit Text - + &Text bearbeiten @@ -2343,37 +2403,38 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timecode - + Makes no sense to translate + Timecode Sequence - + Sequenz Media - + Medien Scale - + Skalierung Color - + Farbe Background Color - + Hintergrundfarbe Background Opacity - + Hintergrunddeckkraft @@ -2383,7 +2444,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Prepend - + Voranstellen @@ -2391,62 +2452,63 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline: - + Makes no sense to translate + Timeline: <none> - + <keine> Effect already exists - + Effekt existiert bereits Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Der Clip '%1' enthält bereits den Effekt '%2'. Möchten Sie diesen ersetzen oder ihn als separaten Effekt hinzufügen? Add - + Hinzufügen Replace - + Ersetzen Skip - + Überspringen Do this for all conflicts found - + Auf alle gefundenen Konflikte anwenden Set Marker - + Marker setzen Set marker name: - + Marker-Name setzen: Title... - + Titel... Solid Color... - + Solid... @@ -2466,17 +2528,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Unsaved Project - + Ungespeichertes Projekt You must save this project before you can record audio in it. - + Sie müssen dieses Projekt speichern before Sie Audio aufnehmen können. Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Klicken Sie auf die Timeline wo Sie mit der Aufnahme beginnen möchten (ziehen um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) @@ -2486,17 +2548,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Edit Tool - + Bearbeitungs-Werkzeug Ripple Tool - + Ripple-Werkzeug Razor Tool - + Schneide-Werkzeug @@ -2511,32 +2573,33 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Hand Tool - + Hand-Werkzeug Transition Tool - + Übergangs-Werkzeug Snapping - + Same as in english + Snapping Zoom In - + Einzommen Zoom Out - + Auszoomen Record audio - + Audio aufnehmen @@ -2549,7 +2612,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Center Timecodes - + Timecodes zentrieren @@ -2557,7 +2620,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Link/Unlink - + Verbinden/Trennen @@ -2565,42 +2628,45 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Start: %2 End: %3 Duration: %4 - + %1 +Start: %2 +Ende: %3 +Dauer: %4 Rename '%1' - + '%1' umbenennen Rename multiple clips - + Mehrere Clips umbenennen Enter a new name for this clip: - + Geben Sie einen neuen Namen für den Clip ein: Error - + Fehler Couldn't locate media wrapper for sequence. - + Konnte den Medienwrapper für diese Sequenz nicht finden Title - + Titel Solid Color - + Solid @@ -2620,7 +2686,7 @@ Duration: %4 Duration: - + Dauer: @@ -2628,22 +2694,23 @@ Duration: %4 Type - + Typ Frequency - + Frequenz Amount - + Menge Mix - + Same as in english + Mix @@ -2651,72 +2718,79 @@ Duration: %4 Position - + Same as in english, differently spoken + Position Scale - + Skalierung Uniform Scale - + Einheitliche Skalierung Rotation - + Same as in english, differently spoken + Rotation Anchor Point - + Ankerpunkt Opacity - + Deckkraft Blend Mode - + Would not make sense to translate? + Blend Mode Normal - + Same as in english, differently spoken + Normal Darken - + Verdunkeln Multiply - + Vervielfachen Color Burn - + Makes no sense to translate + Color Burn Linear Burn - + Makes no sense to translate + Linear Burn Lighten - + Aufhellen Screen - + Makes no sense to translate + Screen @@ -2731,7 +2805,8 @@ Duration: %4 Overlay - + Makes no sense to translate + Overlay @@ -2766,42 +2841,45 @@ Duration: %4 Difference - + Could also be 'Unterschied' + Differenz Exclusion - + Ausgrenzung Reflect - + Spiegeln Substract - + Substrakt Average - + Durschnittlich Glow - + Makes no sense to translate + Glow Negation - + Negierung Phoenix - + Same as in english + Phoenix @@ -2809,7 +2887,7 @@ Duration: %4 Length: - + Länge: @@ -2818,57 +2896,60 @@ Duration: %4 Error loading VST plugin - + Fehler beim laden des VST Plugins Failed to create VST reference - + Fehler beim Herstellen einer VST Referenz Failed to load VST plugin "%1": %2 - + Fehler beim laden des VST Plugins "%1":%2 NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + HINWEIS: Sie können keine 32-bit VST Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + HINWEIS: Sie können keine 64-bit VST Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. VST Error - + VST Fehler Plugin's magic number is invalid - + Die Magic Number des Plugins ist ungültig Plugin - + Same as in english + Plugin Interface - + Makes no sense to translate + Interface Show - + Anzeigen VST Plugin - + Same as in english + VST Plugin @@ -2876,17 +2957,17 @@ Duration: %4 Sequence Viewer - + Sequenz-Viewer Media Viewer - + Medien-Viewer (none) - + (keine) @@ -2894,57 +2975,60 @@ Duration: %4 Save Frame as Image... - + Frame als Bild speichern... Show Fullscreen - + Vollbildschirm Disable - + Ausblenden Screen %1: %2x%3 - + Screen %1:%2x%3 Zoom - + Same as in english + Zoom Fit - + Makes no sense to translate + Fit Custom - + Benutzerdefiniert Close Media - + Medien schließen Save Frame - + Frame speichern Viewer Zoom - + Makes no sense to translate + Viewer Zoom Set Custom Zoom Value: - + Benutzerdefinierten Zoomwert angeben @@ -2952,7 +3036,7 @@ Duration: %4 Exit Fullscreen - + Vollbildschirm verlassen @@ -2960,12 +3044,12 @@ Duration: %4 (unknown) - + (unbekannt) Missing Effect - + Effekt fehlt @@ -2973,7 +3057,7 @@ Duration: %4 Volume - + Lautstärke @@ -2981,12 +3065,12 @@ Duration: %4 Invalid transition - + Ungültiger Übergang No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - + Kein Kandidat für Übergang '%1'. Dieser Übergang ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen.
From 3b38d1875ff5aeccc44eeef928c1d5eb4988005f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 31 Jan 2019 03:12:25 +1100 Subject: [PATCH 039/202] added temporary workaround for opacity issues --- effects/internal/blending.frag | 2 +- effects/internal/crossdissolvetransition.cpp | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/effects/internal/blending.frag b/effects/internal/blending.frag index 9a3a0883a..b211aa801 100644 --- a/effects/internal/blending.frag +++ b/effects/internal/blending.frag @@ -200,7 +200,7 @@ void main(void) { vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a); // vec4 full_composite = vec4(mix(bg_color.rgb, composite, alpha_opac), bg_color.a + alpha_opac); - // full_composite = mix(bg_color, full_composite, alpha_opac); + full_composite = mix(bg_color, full_composite, alpha_opac); // output to color gl_FragColor = full_composite; diff --git a/effects/internal/crossdissolvetransition.cpp b/effects/internal/crossdissolvetransition.cpp index f792b379a..8cc93fe16 100644 --- a/effects/internal/crossdissolvetransition.cpp +++ b/effects/internal/crossdissolvetransition.cpp @@ -8,11 +8,9 @@ CrossDissolveTransition::CrossDissolveTransition(Clip* c, Clip* s, const EffectM // add_row("Smooth")->add_field(EFFECT_FIELD_BOOL, "smooth"); } -void CrossDissolveTransition::process_coords(double progress, GLTextureCoords&, int data) { +void CrossDissolveTransition::process_coords(double progress, GLTextureCoords& coords, int data) { if (!(data == TA_CLOSING_TRANSITION && secondary_clip != nullptr)) { - float color[4]; - glGetFloatv(GL_CURRENT_COLOR, color); if (data == TA_CLOSING_TRANSITION) progress = 1.0 - progress; - glColor4f(1.0, 1.0, 1.0, color[3]*progress); + coords.opacity *= progress; } } From c69952d2ca79e48fdbbffa1390231d28d43555ee Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 31 Jan 2019 03:16:11 +1100 Subject: [PATCH 040/202] fixed effect menu regression #382 --- panels/effectcontrols.cpp | 110 +++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 88b13e5bf..89536bcfd 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -160,68 +160,70 @@ void EffectControls::cut() { } void EffectControls::show_effect_menu(int type, int subtype) { - effect_menu_type = type; - effect_menu_subtype = subtype; + effect_menu_type = type; + effect_menu_subtype = subtype; - effects_loaded.lock(); + effects_loaded.lock(); - QMenu effects_menu(this); - effects_menu.setToolTipsVisible(true); + QMenu effects_menu(this); + effects_menu.setToolTipsVisible(true); - for (int i=0;isetData(reinterpret_cast(&em)); - if (!em.tooltip.isEmpty()) { - action->setToolTip(em.tooltip); - } + if (em.type == type && em.subtype == subtype) { + QAction* action = new QAction(&effects_menu); + action->setText(em.name); + action->setData(reinterpret_cast(&em)); + if (!em.tooltip.isEmpty()) { + action->setToolTip(em.tooltip); + } - QMenu* parent = &effects_menu; - if (!em.category.isEmpty()) { - bool found = false; - for (int j=0;jmenu() != nullptr) { - if (action->menu()->title() == em.category) { - parent = action->menu(); - found = true; - break; - } - } - } - if (!found) { - parent = effects_menu.addMenu(em.category); - parent->setToolTipsVisible(true); + QMenu* parent = &effects_menu; + if (!em.category.isEmpty()) { + bool found = false; + for (int j=0;jmenu() != nullptr) { + if (action->menu()->title() == em.category) { + parent = action->menu(); + found = true; + break; + } + } + } + if (!found) { + parent = new QMenu(&effects_menu); + parent->setToolTipsVisible(true); + parent->setTitle(em.category); - bool found = false; - for (int i=0;itext() > em.category) { - effects_menu.insertMenu(comp_action, parent); - found = true; - break; - } - } - if (!found) effects_menu.addMenu(parent); - } - } + bool found = false; + for (int i=0;itext() > em.category) { + effects_menu.insertMenu(comp_action, parent); + found = true; + break; + } + } + if (!found) effects_menu.addMenu(parent); + } + } - bool found = false; - for (int i=0;iactions().size();i++) { - QAction* comp_action = parent->actions().at(i); - if (comp_action->text() > action->text()) { - parent->insertAction(comp_action, action); - found = true; - break; - } - } - if (!found) parent->addAction(action); - } - } + bool found = false; + for (int i=0;iactions().size();i++) { + QAction* comp_action = parent->actions().at(i); + if (comp_action->text() > action->text()) { + parent->insertAction(comp_action, action); + found = true; + break; + } + } + if (!found) parent->addAction(action); + } + } - effects_loaded.unlock(); + effects_loaded.unlock(); connect(&effects_menu, SIGNAL(triggered(QAction*)), this, SLOT(menu_select(QAction*))); effects_menu.exec(QCursor::pos()); From 701948d86531e003b591bfb2067b4098344aa682 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 31 Jan 2019 03:21:27 +1100 Subject: [PATCH 041/202] updated cli help #381 --- main.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 1b9f4670f..13a767cf7 100644 --- a/main.cpp +++ b/main.cpp @@ -35,7 +35,16 @@ int main(int argc, char *argv[]) { printf("%s\n", appName.toUtf8().constData()); return 0; } else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { - printf("Usage: %s [options] [filename]\n\n[filename] is the file to open on startup.\n\nOptions:\n\t-v, --version\tShow version information\n\t-h, --help\tShow this help\n\t-f, --fullscreen\tStart in full screen mode\n\n", argv[0]); + printf("Usage: %s [options] [filename]\n\n" + "[filename] is the file to open on startup.\n\n" + "Options:\n" + "\t-v, --version\t\tShow version information\n" + "\t-h, --help\t\tShow this help\n" + "\t-f, --fullscreen\tStart in full screen mode\n" + "\t--disable-shaders\tDisable OpenGL shaders (for debugging)\n" + "\t--no-debug\t\tDisable internal debug log and output directly to console\n" + "\t--disable-blend-modes\tDisable shader-based blending for older GPUs\n" + "\n", argv[0]); return 0; } else if (!strcmp(argv[i], "--fullscreen") || !strcmp(argv[i], "-f")) { launch_fullscreen = true; From 676a795d6eae1f01eb34234abed209b01b7251a6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 31 Jan 2019 03:30:26 +1100 Subject: [PATCH 042/202] more accurate opacity fix --- effects/internal/blending.frag | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/effects/internal/blending.frag b/effects/internal/blending.frag index b211aa801..c8d14d593 100644 --- a/effects/internal/blending.frag +++ b/effects/internal/blending.frag @@ -180,7 +180,7 @@ void main(void) { vec3 composite = blend(bg_color.rgb, fg_color.rgb); // add foreground and background alpha's together - float alpha_opac = fg_color.a*opacity; + // float alpha_opac = fg_color.a*opacity; if (blendmode == BLEND_MODE_OVERLAY || blendmode == BLEND_MODE_LIGHTEN @@ -194,13 +194,13 @@ void main(void) { || blendmode == BLEND_MODE_REFLECT || blendmode == BLEND_MODE_EXCLUSION || blendmode == BLEND_MODE_DIFFERENCE) { - composite *= alpha_opac; + composite *= fg_color.a; } - vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-alpha_opac), bg_color.a + fg_color.a); + vec4 full_composite = vec4(composite + bg_color.rgb*(1.0-fg_color.a), bg_color.a + fg_color.a); // vec4 full_composite = vec4(mix(bg_color.rgb, composite, alpha_opac), bg_color.a + alpha_opac); - full_composite = mix(bg_color, full_composite, alpha_opac); + full_composite = mix(bg_color, full_composite, opacity); // output to color gl_FragColor = full_composite; From c779ec43e7fdc2acf0df3efc13149d3f3206d9ed Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 31 Jan 2019 23:01:28 +1100 Subject: [PATCH 043/202] backend transcoding done for proxies --- dialogs/demonotice.cpp | 2 +- dialogs/proxydialog.cpp | 62 ++++++- dialogs/proxydialog.h | 14 +- io/exportthread.cpp | 4 +- io/path.cpp | 9 + io/path.h | 3 + io/previewgenerator.cpp | 25 +-- io/proxygenerator.cpp | 340 ++++++++++++++++++++++++++++++++++++++ io/proxygenerator.h | 35 ++++ mainwindow.cpp | 12 +- olive.pro | 6 +- project/sourcescommon.cpp | 10 +- project/sourcescommon.h | 6 + 13 files changed, 493 insertions(+), 35 deletions(-) create mode 100644 io/proxygenerator.cpp create mode 100644 io/proxygenerator.h diff --git a/dialogs/demonotice.cpp b/dialogs/demonotice.cpp index 9f3055426..7dc0e609e 100644 --- a/dialogs/demonotice.cpp +++ b/dialogs/demonotice.cpp @@ -12,7 +12,7 @@ DemoNotice::DemoNotice(QWidget *parent) : QVBoxLayout* vlayout = new QVBoxLayout(this); - QHBoxLayout* layout = new QHBoxLayout(this); + QHBoxLayout* layout = new QHBoxLayout(); layout->setMargin(10); layout->setSpacing(20); diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index bf3233a8b..1592ad904 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -5,8 +5,17 @@ #include #include #include +#include -ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : QDialog(parent) { +#include + +#include "io/proxygenerator.h" +#include "project/footage.h" + +ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : + QDialog(parent), + selected_footage(footage) +{ // set dialog title setWindowTitle(tr("Create Proxy")); @@ -19,7 +28,7 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : Q // set the video dimensions of the proxy layout->addWidget(new QLabel(tr("Dimensions:"), this), 0, 0); - QComboBox* size_combobox = new QComboBox(this); + size_combobox = new QComboBox(this); size_combobox->addItem(tr("Same Size as Source"), 1.0); size_combobox->addItem(tr("Half Resolution (1/2)"), 0.5); size_combobox->addItem(tr("Quarter Resolution (1/4)"), 0.25); @@ -30,7 +39,7 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : Q // set the desired format of the proxy to create layout->addWidget(new QLabel(tr("Format:"), this), 1, 0); - QComboBox* format_combobox = new QComboBox(this); + format_combobox = new QComboBox(this); format_combobox->addItem(tr("ProRes HQ")); format_combobox->addItem(tr("ProRes SQ")); format_combobox->addItem(tr("ProRes LT")); @@ -58,6 +67,53 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : Q connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); } +void ProxyDialog::accept() { + QVector info_list; + + for (int i=0;icurrentData().toDouble(); + + QString base_footage_fn = QFileInfo(selected_footage.at(i)->url).fileName(); + + // determine path from input + if (custom_location.isEmpty()) { + // use same as source (proxy subfolder) + + // generate full path from footage path and proxy_folder_name's translated "Proxy" + info.path = QDir(QFileInfo(selected_footage.at(i)->url).dir().filePath(proxy_folder_name)).filePath(base_footage_fn); + } else { + // use existing location + info.path = QDir(custom_location).filePath(base_footage_fn); + } + + // if the proposed proxy file already exists + if (QFileInfo::exists(info.path) && QMessageBox::warning(this, + tr("Proxy file exists"), + tr("The file \"%1\" already exists. Do you wish to replace it?").arg(info.path), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { + // return to dialog without closing or starting any proxy generation + return; + } + + // send to proxy generator thread + info_list.append(info); + } + + // all proxy info checks out, queue it with the proxy generator + for (int i=0;i& footage); +public slots: + // called if user clicks "OK" on the dialog + virtual void accept() override; private: - // user's dimensions + // user's desired dimensions QComboBox* size_combobox; + // user's desired proxy format + QComboBox* format_combobox; + // allows users to set the location to store proxies QComboBox* location_combobox; // stores the custom location to store proxies if the user sets a custom location QString custom_location; - // stores the subdirectory to be made next to the source in the user's language + // stores the subdirectory to be made next to the source (dependent on the user's language) QString proxy_folder_name; + + // list of footage to make proxies for + QVector selected_footage; private slots: + // triggered when the user changes the index in the location combobox void location_changed(int i); }; diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 79136b2f5..1f94a1b47 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -83,7 +83,7 @@ bool ExportThread::setupVideo() { if (!video_enabled) return true; // find video encoder - vcodec = avcodec_find_encoder((enum AVCodecID) video_codec); + vcodec = avcodec_find_encoder(static_cast(video_codec)); if (!vcodec) { qCritical() << "Could not find video encoder"; ed->export_error = tr("could not video encoder for %1").arg(QString::number(video_codec)); @@ -109,7 +109,7 @@ bool ExportThread::setupVideo() { } // setup context - vcodec_ctx->codec_id = static_cast(video_codec); + vcodec_ctx->codec_id = static_cast(video_codec); vcodec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; vcodec_ctx->width = video_width; vcodec_ctx->height = video_height; diff --git a/io/path.cpp b/io/path.cpp index 79248904d..c3a24f84a 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -3,6 +3,9 @@ #include #include #include +#include +#include + #include "debug.h" QString real_app_dir; @@ -41,3 +44,9 @@ QList get_effects_paths() { if (!env_path.isEmpty()) effects_paths.append(env_path); return effects_paths; } + +QString get_file_hash(const QString& filename) { + QFileInfo file_info(filename); + QString cache_file = filename.mid(filename.lastIndexOf('/')+1) + QString::number(file_info.size()) + QString::number(file_info.lastModified().toMSecsSinceEpoch()); + return QCryptographicHash::hash(cache_file.toUtf8(), QCryptographicHash::Md5).toHex(); +} diff --git a/io/path.h b/io/path.h index 2e2f6d841..2a721c0fd 100644 --- a/io/path.h +++ b/io/path.h @@ -8,4 +8,7 @@ QString get_data_path(); QString get_config_path(); QList get_effects_paths(); +// generate hash algorithm used to uniquely identify files +QString get_file_hash(const QString& filename); + #endif // PATH_H diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index ca2fd3bbe..892367bf5 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -13,10 +13,8 @@ #include #include #include -#include #include #include -#include #define WAVEFORM_RESOLUTION 64 #define THUMBNAIL_RESOLUTION 120 @@ -68,13 +66,7 @@ void PreviewGenerator::parse_media() { && fmt_ctx->streams[i]->codecpar->width > 0 && fmt_ctx->streams[i]->codecpar->height > 0) { - /*dout << "avg_frame_rate was:" << fmt_ctx->streams[i]->avg_frame_rate.num << "/" << fmt_ctx->streams[i]->avg_frame_rate.den; - dout << "r_frame_rate was:" << fmt_ctx->streams[i]->r_frame_rate.num << "/" << fmt_ctx->streams[i]->r_frame_rate.den; - dout << "codec_frame_rate was:" << fmt_ctx->streams[i]->codec->framerate.num << "/" << fmt_ctx->streams[i]->codec->framerate.den; - dout << "nb_frames was:" << fmt_ctx->streams[i]->nb_frames; - dout << "duration was:" << fmt_ctx->streams[i]->duration << "OR fmt_ctx's duration is:" << fmt_ctx->duration;*/ - - // heuristic to determine if video is a still image + // heuristic to determine if video is a still image (if it is, we treat it differently in the playback/render process) if (fmt_ctx->streams[i]->avg_frame_rate.den == 0 && fmt_ctx->streams[i]->codecpar->codec_id != AV_CODEC_ID_DNXHD) { // silly hack but this is the only scenario i've seen this if (footage->url.contains('%')) { @@ -85,16 +77,10 @@ void PreviewGenerator::parse_media() { contains_still_image = true; ms.video_frame_rate = 0; } + } else { // using ffmpeg's built-in heuristic ms.video_frame_rate = av_q2d(av_guess_frame_rate(fmt_ctx, fmt_ctx->streams[i], nullptr)); - - // old heuristic - /*if (fmt_ctx->streams[i]->r_frame_rate.den == 0) { - ms.video_frame_rate = av_q2d(fmt_ctx->streams[i]->avg_frame_rate); - } else { - ms.video_frame_rate = av_q2d(fmt_ctx->streams[i]->r_frame_rate); - }*/ } ms.video_width = fmt_ctx->streams[i]->codecpar->width; @@ -241,7 +227,9 @@ void PreviewGenerator::generate_waveform() { } } + // TODO may be unnecessary - doesn't av_read_frame allocate a packet itself? AVPacket* packet = av_packet_alloc(); + bool done = true; bool end_of_file = false; @@ -458,10 +446,7 @@ void PreviewGenerator::run() { parse_media(); // see if we already have data for this - QFileInfo file_info(footage->url); - QString cache_file = footage->url.mid(footage->url.lastIndexOf('/')+1) + QString::number(file_info.size()) + QString::number(file_info.lastModified().toMSecsSinceEpoch()); - //dout << "using hash" << cache_file; - QString hash = QCryptographicHash::hash(cache_file.toUtf8(), QCryptographicHash::Md5).toHex(); + QString hash = get_file_hash(footage->url); if (retrieve_preview(hash)) { sem.acquire(); diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp new file mode 100644 index 000000000..ca42efdd9 --- /dev/null +++ b/io/proxygenerator.cpp @@ -0,0 +1,340 @@ +#include "proxygenerator.h" + +#include "project/footage.h" +#include "io/path.h" + +#include +#include +#include + +#include + +extern "C" { + #include + #include + #include +} + +enum AVCodecID temp_enc_codec = AV_CODEC_ID_PRORES; + +ProxyGenerator::ProxyGenerator() : cancelled(false) {} + +void transcode(const ProxyInfo& info) { + // open input file + AVFormatContext* input_fmt_ctx = nullptr; + avformat_open_input(&input_fmt_ctx, info.footage->url.toUtf8(), nullptr, nullptr); + + // open output file + AVFormatContext* output_fmt_ctx = nullptr; + avformat_alloc_output_context2(&output_fmt_ctx, nullptr, nullptr, info.path.toUtf8()); + + // open output file writing handle + avio_open(&output_fmt_ctx->pb, info.path.toUtf8(), AVIO_FLAG_WRITE); + + // get stream info from input file + avformat_find_stream_info(input_fmt_ctx, nullptr); + + // create array of input decoders + QVector input_streams; + input_streams.resize(input_fmt_ctx->nb_streams); + input_streams.fill(nullptr); + + // create array of output encoders + QVector output_streams; + output_streams.resize(input_fmt_ctx->nb_streams); + output_streams.fill(nullptr); + + // create array of swscale contexts for pixel format conversion + QVector sws_contexts; + sws_contexts.resize(input_fmt_ctx->nb_streams); + sws_contexts.fill(nullptr); + + // loop through file to find compatible video streams + for (int i=0;inb_streams);i++) { + AVStream* in_stream = input_fmt_ctx->streams[i]; + + // create new stream in output + AVStream* out_stream = avformat_new_stream(output_fmt_ctx, nullptr); + out_stream->id = in_stream->id; + + // find decoder for this codec + AVCodec* dec_codec = avcodec_find_decoder(in_stream->codecpar->codec_id); + + // find encoder for chosen proxy type + AVCodec* enc_codec = avcodec_find_encoder(temp_enc_codec); + + // we only transcode video streams, others we just passthrough + if (in_stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && dec_codec != nullptr) { + + // allocate decoding context for this stream + AVCodecContext* dec_ctx = avcodec_alloc_context3(dec_codec); + + // copy parameters from stream to decoding context + avcodec_parameters_to_context(dec_ctx, in_stream->codecpar); + + // open decoder + avcodec_open2(dec_ctx, dec_codec, nullptr); + + // store decoding context in array + input_streams[i] = dec_ctx; + + // retrieve more information about this stream + av_dump_format(input_fmt_ctx, i, info.footage->url.toUtf8(), 0); + + // allocate encoding context for this stream + AVCodecContext* enc_ctx = avcodec_alloc_context3(enc_codec); + + // copy properties from decoding context to encoding context + enc_ctx->codec_id = temp_enc_codec; + enc_ctx->codec_type = AVMEDIA_TYPE_VIDEO; + enc_ctx->width = qFloor(dec_ctx->width*info.size_multiplier); + enc_ctx->height = qFloor(dec_ctx->height*info.size_multiplier); + enc_ctx->sample_aspect_ratio = dec_ctx->sample_aspect_ratio; + enc_ctx->pix_fmt = enc_codec->pix_fmts[0]; + enc_ctx->framerate = dec_ctx->framerate; + enc_ctx->time_base = in_stream->time_base; + + out_stream->time_base = in_stream->time_base; + + // if format uses global headers, add flag to enc_ctx + if (output_fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { + enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; + } + + // set encoder options (mostly just multithreading) + AVDictionary* opts = nullptr; + av_dict_set(&opts, "threads", "auto", 0); + + // open encoder + avcodec_open2(enc_ctx, enc_codec, &opts); + + // copy parameters from encoding context to stream + avcodec_parameters_from_context(out_stream->codecpar, enc_ctx); + + // store encoding context in array + output_streams[i] = enc_ctx; + + // create swscontext for this stream + SwsContext* sws_ctx = sws_getContext( + in_stream->codecpar->width, + in_stream->codecpar->height, + static_cast(in_stream->codecpar->format), + enc_ctx->width, + enc_ctx->height, + enc_ctx->pix_fmt, + 0, + nullptr, + nullptr, + nullptr + ); + + sws_contexts[i] = sws_ctx; + } else { + avcodec_parameters_copy(out_stream->codecpar, in_stream->codecpar); + } + } + + // write video header + avformat_write_header(output_fmt_ctx, nullptr); + + // packet that av_read_frame will dump file packets into + AVPacket packet; + av_init_packet(&packet); + + // frame that decoder will decode into + AVFrame* dec_frame = av_frame_alloc(); + + // main transcoding loop + while (true) { + + // cache stream index + int stream_index = packet.stream_index; + + // retrieve frame from decoder (this will clear the last frame so we don't have to do that) + int read_ret = -1; + int recfr_ret = -1; + do { + // read from input file + read_ret = av_read_frame(input_fmt_ctx, &packet); + + // handle errors + if (read_ret < 0) { + + // AVERROR_EOF means we've simply reached the end of the file, otherwise this is an error + if (read_ret != AVERROR_EOF) { + qWarning() << "Proxy generation for file" << info.footage->url << "ended prematurely"; + } + + // either way, we shall abort reading + break; + } + + stream_index = packet.stream_index; + + // determine whether this frame is from a stream we're transcoding + if (input_streams.at(stream_index) == nullptr) { + // if we didn't allocate a decoder for this earlier, we just pass it through + + av_packet_rescale_ts(&packet, input_fmt_ctx->streams[stream_index]->time_base, output_fmt_ctx->streams[stream_index]->time_base); + + // write packet to output + av_interleaved_write_frame(output_fmt_ctx, &packet); + + } else { + // we're going to transcode this packet. + + // send packet to decoder + avcodec_send_packet(input_streams.at(stream_index), &packet); + + } + + // free packet allocated by av_read_frame + av_packet_unref(&packet); + } while ((recfr_ret = avcodec_receive_frame(input_streams.at(packet.stream_index), dec_frame)) == AVERROR(EAGAIN)); + + // error/eof handling - cancel while loop + if (read_ret < 0) { + break; + } + + // + // SWSCALE IF NECESSARY + // + + // free packet as we're about to use it for encoding + av_packet_unref(&packet); + + av_rescale_q(dec_frame->pts, input_fmt_ctx->streams[stream_index]->time_base, output_fmt_ctx->streams[stream_index]->time_base); + + bool convert_pix_fmt = (output_streams.at(stream_index)->pix_fmt != input_streams.at(stream_index)->pix_fmt); + + AVFrame* enc_frame = dec_frame; + + if (convert_pix_fmt) { + // create sws frame for pixel format conversion + enc_frame = av_frame_alloc(); + enc_frame->width = output_streams.at(stream_index)->width; + enc_frame->height = output_streams.at(stream_index)->height; + enc_frame->format = output_streams.at(stream_index)->pix_fmt; + av_frame_get_buffer(enc_frame, 0); + + // convert pixel format to format expected by the encoder + sws_scale(sws_contexts.at(stream_index), dec_frame->data, dec_frame->linesize, 0, dec_frame->height, enc_frame->data, enc_frame->linesize); + + // set same pts as dec_frame + enc_frame->pts = dec_frame->pts; + } + + // send frame to encoder + avcodec_send_frame(output_streams.at(stream_index), enc_frame); + + if (convert_pix_fmt) { + // free sws frame since we made one before + av_frame_free(&enc_frame); + } + + int recret; + while ((recret = avcodec_receive_packet(output_streams.at(stream_index), &packet)) >= 0) { + + packet.stream_index = stream_index; + + av_interleaved_write_frame(output_fmt_ctx, &packet); + + av_packet_unref(&packet); + } + + } + + // free dec_frame + av_frame_free(&dec_frame); + + // write video trailer + av_write_trailer(output_fmt_ctx); + + // free stream contexts + for (int i=0;inb_streams);i++) { + if (input_streams[i] != nullptr) { + // free swscale contexts + sws_freeContext(sws_contexts[i]); + + // free input decoding context + avcodec_close(input_streams[i]); + avcodec_free_context(&input_streams[i]); + + // free output encoding context + avcodec_close(output_streams[i]); + avcodec_free_context(&output_streams[i]); + } + } + + // close output file handle + avio_closep(&output_fmt_ctx->pb); + + // close output file + avformat_free_context(output_fmt_ctx); + + // close input file + avformat_close_input(&input_fmt_ctx); + + qInfo() << "Finished creating proxy for" << info.footage->url; +} + +// main proxy generating loop +void ProxyGenerator::run() { + // mutex used for thread safe signalling + mutex.lock(); + + while (!cancelled) { + // wait for queue() to be called + waitCond.wait(&mutex); + + // quit thread if cancel() was called + if (cancelled) break; + + // loop through queue until the queue is empty + while (proxy_queue.size() > 0) { + + // grab proxy info + const ProxyInfo& info = proxy_queue.first(); + + // create directory for info + QFileInfo(info.path).dir().mkpath("."); + + // transcode proxy + transcode(info); + + // we're finished with this proxy, remove it + proxy_queue.removeFirst(); + + // quit loop if cancel() was called + if (cancelled) break; + + } + } + + mutex.unlock(); +} + +// called to add footage to generate proxies for +void ProxyGenerator::queue(const ProxyInfo &info) { + // add proxy info to queue + proxy_queue.append(info); + + // wake proxy thread loop if sleeping + waitCond.wakeAll(); +} + +// to be called from another thread to terminate the proxy generator thread and free it +void ProxyGenerator::cancel() { + // signal to thread to cancel + cancelled = true; + + // if signal is sleeping, wake it to cancel correctly + waitCond.wakeAll(); + + // wait for thread to finish + wait(); +} + +// proxy generator is a global omnipotent entity +ProxyGenerator proxy_generator; diff --git a/io/proxygenerator.h b/io/proxygenerator.h new file mode 100644 index 000000000..667887a20 --- /dev/null +++ b/io/proxygenerator.h @@ -0,0 +1,35 @@ +#ifndef PROXYGENERATOR_H +#define PROXYGENERATOR_H + +#include +#include +#include +#include + +struct Footage; + +struct ProxyInfo { + Footage* footage; + double size_multiplier; + int codec_type; + QString path; +}; + +class ProxyGenerator : public QThread +{ +public: + ProxyGenerator(); + void run(); + void queue(const ProxyInfo& info); + void cancel(); +private: + QVector proxy_queue; + QWaitCondition waitCond; + QMutex mutex; + bool cancelled; +}; + +// proxy generator is a global omnipotent entity +extern ProxyGenerator proxy_generator; + +#endif // PROXYGENERATOR_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 042c52f7a..bd9db29d3 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,6 +2,7 @@ #include "io/config.h" #include "io/path.h" +#include "io/proxygenerator.h" #include "project/footage.h" #include "project/sequence.h" @@ -211,6 +212,7 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : statusBar->showMessage("Welcome to " + appName); setStatusBar(statusBar); + // populate menu bars setup_menus(); if (!data_dir.isEmpty()) { @@ -227,9 +229,14 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : autorecovery_timer.start(); } + // set up panel layout setup_layout(false); + // set up output audio device init_audio(); + + // start omnipotent proxy generator process + proxy_generator.start(); } MainWindow::~MainWindow() { @@ -988,6 +995,9 @@ void MainWindow::updateTitle(const QString& url) { void MainWindow::closeEvent(QCloseEvent *e) { if (can_close_project()) { + // stop proxy generator thread + proxy_generator.cancel(); + panel_effect_controls->clear_effects(true); set_sequence(nullptr); @@ -1037,8 +1047,8 @@ void MainWindow::paintEvent(QPaintEvent *event) { if (!demoNoticeShown) { #ifndef QT_DEBUG DemoNotice* d = new DemoNotice(this); + connect(d, SIGNAL(finished(int)), d, SLOT(deleteLater())); d->open(); - connect(d, SIGNAL(finished()), d, SLOT(deleteLater())); #endif demoNoticeShown = true; diff --git a/olive.pro b/olive.pro index 334fafcb9..ca8c48050 100644 --- a/olive.pro +++ b/olive.pro @@ -138,7 +138,8 @@ SOURCES += \ io/crossplatformlib.cpp \ effects/internal/vsthost.cpp \ ui/flowlayout.cpp \ - dialogs/proxydialog.cpp + dialogs/proxydialog.cpp \ + io/proxygenerator.cpp HEADERS += \ mainwindow.h \ @@ -240,7 +241,8 @@ HEADERS += \ io/crossplatformlib.h \ effects/internal/vsthost.h \ ui/flowlayout.h \ - dialogs/proxydialog.h + dialogs/proxydialog.h \ + io/proxygenerator.h FORMS += diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 18462b889..957eb5b7a 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -103,11 +103,14 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it // duplicate item bool all_sequences = true; bool all_footage = true; + cached_selected_footage.clear(); for (int i=0;iget_type() != MEDIA_TYPE_SEQUENCE) { all_sequences = false; } - if (m->get_type() != MEDIA_TYPE_FOOTAGE) { + if (m->get_type() == MEDIA_TYPE_FOOTAGE) { + cached_selected_footage.append(m->to_footage()); + } else { all_footage = false; } } @@ -301,8 +304,7 @@ void SourcesCommon::item_renamed(Media* item) { } void SourcesCommon::open_create_proxy_dialog() { - QVector selected_footage; - - ProxyDialog pd(mainWindow, selected_footage); + // open the proxy dialog and send it a list of currently selected footage + ProxyDialog pd(mainWindow, cached_selected_footage); pd.exec(); } diff --git a/project/sourcescommon.h b/project/sourcescommon.h index aa740f1d9..3c15e5ae2 100644 --- a/project/sourcescommon.h +++ b/project/sourcescommon.h @@ -3,6 +3,7 @@ #include #include +#include class Project; class QMouseEvent; @@ -10,6 +11,8 @@ class Media; class QAbstractItemView; class QDropEvent; +struct Footage; + class SourcesCommon : public QObject { Q_OBJECT public: @@ -35,6 +38,9 @@ private: Project* project_parent; void stop_rename_timer(); QTimer rename_timer; + + // we cache the selected footage items for open_create_proxy_dialog() + QVector cached_selected_footage; }; #endif // SOURCESCOMMON_H From 7a22065162b2625dd8f365a2738ef44f81bc3308 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 01:17:22 +1100 Subject: [PATCH 044/202] most proxy behavior is complete --- dialogs/proxydialog.cpp | 3 ++ io/config.h | 2 +- io/loadthread.cpp | 4 ++ io/proxygenerator.cpp | 65 +++++++++++++++++++++---- io/proxygenerator.h | 15 ++++++ panels/project.cpp | 4 ++ playback/cacher.cpp | 14 +++++- playback/playback.cpp | 50 +++++++++++++++++-- project/footage.cpp | 3 +- project/footage.h | 4 ++ project/sourcescommon.cpp | 100 +++++++++++++++++++++++++++++++++++--- project/sourcescommon.h | 3 ++ ui/renderthread.cpp | 1 - 13 files changed, 245 insertions(+), 23 deletions(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index 1592ad904..5d7b47469 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -108,6 +108,9 @@ void ProxyDialog::accept() { // all proxy info checks out, queue it with the proxy generator for (int i=0;iproxy = true; + info_list.at(i).footage->proxy_path.clear(); + proxy_generator.queue(info_list.at(i)); } diff --git a/io/config.h b/io/config.h index 5e8c61f27..c01ee0ee3 100644 --- a/io/config.h +++ b/io/config.h @@ -3,7 +3,7 @@ #include -#define SAVE_VERSION 190120 // YYMMDD +#define SAVE_VERSION 190201 // YYMMDD #define MIN_SAVE_VERSION 190104 // lowest compatible project version #define TIMECODE_DROP 0 diff --git a/io/loadthread.cpp b/io/loadthread.cpp index adfc3a510..068ed901a 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -250,6 +250,10 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { m->speed = attr.value().toDouble(); } else if (attr.name() == "alphapremul") { m->alpha_is_premultiplied = (attr.value() == "1"); + } else if (attr.name() == "proxy") { + m->proxy = (attr.value() == "1"); + } else if (attr.name() == "proxypath") { + m->proxy_path = attr.value().toString(); } } diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp index ca42efdd9..9f54b56a5 100644 --- a/io/proxygenerator.cpp +++ b/io/proxygenerator.cpp @@ -2,10 +2,12 @@ #include "project/footage.h" #include "io/path.h" +#include "mainwindow.h" #include #include #include +#include #include @@ -19,7 +21,10 @@ enum AVCodecID temp_enc_codec = AV_CODEC_ID_PRORES; ProxyGenerator::ProxyGenerator() : cancelled(false) {} -void transcode(const ProxyInfo& info) { +void ProxyGenerator::transcode(const ProxyInfo& info) { + // set progress to 0 + current_progress = 0.0; + // open input file AVFormatContext* input_fmt_ctx = nullptr; avformat_open_input(&input_fmt_ctx, info.footage->url.toUtf8(), nullptr, nullptr); @@ -145,7 +150,7 @@ void transcode(const ProxyInfo& info) { AVFrame* dec_frame = av_frame_alloc(); // main transcoding loop - while (true) { + while (!skip) { // cache stream index int stream_index = packet.stream_index; @@ -186,28 +191,30 @@ void transcode(const ProxyInfo& info) { // send packet to decoder avcodec_send_packet(input_streams.at(stream_index), &packet); + // use timestamp and stream duration to create a rough estimation of the progress through this file + current_progress = qCeil((double(packet.pts)/double(input_fmt_ctx->streams[packet.stream_index]->duration))*100); + } // free packet allocated by av_read_frame av_packet_unref(&packet); - } while ((recfr_ret = avcodec_receive_frame(input_streams.at(packet.stream_index), dec_frame)) == AVERROR(EAGAIN)); + } while ((recfr_ret = avcodec_receive_frame(input_streams.at(packet.stream_index), dec_frame)) == AVERROR(EAGAIN) && !skip); // error/eof handling - cancel while loop - if (read_ret < 0) { + if (read_ret < 0 || skip) { break; } - // - // SWSCALE IF NECESSARY - // - // free packet as we're about to use it for encoding av_packet_unref(&packet); + // rescale input frame timestamp to output timestamp av_rescale_q(dec_frame->pts, input_fmt_ctx->streams[stream_index]->time_base, output_fmt_ctx->streams[stream_index]->time_base); + // determine if the pix_fmt is different, so if we need to convert bool convert_pix_fmt = (output_streams.at(stream_index)->pix_fmt != input_streams.at(stream_index)->pix_fmt); + // create reference to the frame to be sent to the encoder AVFrame* enc_frame = dec_frame; if (convert_pix_fmt) { @@ -233,14 +240,21 @@ void transcode(const ProxyInfo& info) { av_frame_free(&enc_frame); } + // return value for packet receiving int recret; - while ((recret = avcodec_receive_packet(output_streams.at(stream_index), &packet)) >= 0) { + // loop through receiving packets + while ((recret = avcodec_receive_packet(output_streams.at(stream_index), &packet)) >= 0 && !skip) { + + // set packet stream index to current stream index packet.stream_index = stream_index; + // write frame to file av_interleaved_write_frame(output_fmt_ctx, &packet); + // unref old packet av_packet_unref(&packet); + } } @@ -276,7 +290,13 @@ void transcode(const ProxyInfo& info) { // close input file avformat_close_input(&input_fmt_ctx); + // set footage to use newly generated proxy + info.footage->proxy = true; + info.footage->proxy_path = info.path; + qInfo() << "Finished creating proxy for" << info.footage->url; + mainWindow->statusBar()->showMessage(tr("Finished generating proxy for \"%1\"").arg(info.footage->url)); + } // main proxy generating loop @@ -300,6 +320,9 @@ void ProxyGenerator::run() { // create directory for info QFileInfo(info.path).dir().mkpath("."); + // set skip to false + skip = false; + // transcode proxy transcode(info); @@ -317,6 +340,22 @@ void ProxyGenerator::run() { // called to add footage to generate proxies for void ProxyGenerator::queue(const ProxyInfo &info) { + // remove any queued proxies with the same footage + if (!proxy_queue.isEmpty() + && proxy_queue.first().footage == info.footage) { + // if the thread is currently processing a proxy with the same footage, abort it + skip = true; + } + + // scan through the rest of the queue for another proxy with the same footage (start with 1 since we already processed first()) + for (int i=1;i proxy_queue; + + // threading objects QWaitCondition waitCond; QMutex mutex; + + // set to true if you want to permanently close ProxyGenerator bool cancelled; + + // set to true if you want to abort the footage currently being processed + bool skip; + + // stores progress in percent of proxy currently being processed + double current_progress; + + // function that performs the actual transcode + void transcode(const ProxyInfo& info); }; // proxy generator is a global omnipotent entity diff --git a/panels/project.cpp b/panels/project.cpp index 4ec6ae81a..0c543e1da 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -954,6 +954,10 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("out", QString::number(f->out)); stream.writeAttribute("speed", QString::number(f->speed)); stream.writeAttribute("alphapremul", QString::number(f->alpha_is_premultiplied)); + + stream.writeAttribute("proxy", QString::number(f->proxy)); + stream.writeAttribute("proxypath", f->proxy_path); + for (int j=0;jvideo_tracks.size();j++) { const FootageStream& ms = f->video_tracks.at(j); stream.writeStartElement("video"); diff --git a/playback/cacher.cpp b/playback/cacher.cpp index ae08fbb69..0f29b290b 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -673,7 +673,19 @@ void open_clip_worker(Clip* clip) { } else if (clip->media->get_type() == MEDIA_TYPE_FOOTAGE) { // opens file resource for FFmpeg and prepares Clip struct for playback Footage* m = clip->media->to_footage(); - QByteArray ba = m->url.toUtf8(); + + // byte array for retriving raw bytes from QString URL + QByteArray ba; + + // do we have a proxy? + if (m->proxy + && !m->proxy_path.isEmpty() + && QFileInfo::exists(m->proxy_path)) { + ba = m->proxy_path.toUtf8(); + } else { + ba = m->url.toUtf8(); + } + const char* filename = ba.constData(); const FootageStream* ms = m->get_stream_from_file_index(clip->track < 0, clip->media_stream); diff --git a/playback/playback.cpp b/playback/playback.cpp index 744723c4e..ce0f1d2d6 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -13,6 +13,7 @@ #include "project/media.h" #include "io/config.h" #include "io/avtogl.h" +#include "io/proxygenerator.h" #include "debug.h" extern "C" { @@ -28,6 +29,8 @@ extern "C" { #include #include #include +#include +#include #ifdef QT_DEBUG //#define GCF_DEBUG @@ -272,14 +275,55 @@ void get_clip_frame(Clip* c, long playhead, bool& texture_failed) { uint8_t* data_buffer_1 = target_frame->data[0]; uint8_t* data_buffer_2 = nullptr; - size_t frame_size; + size_t frame_size = size_t(target_frame->linesize[0])*size_t(target_frame->height); + + // if proxy is currently being generated, show an on-screen message of its progress + if (c->media->to_footage()->proxy + && c->media->to_footage()->proxy_path.isEmpty()) { + // create buffers to draw on + data_buffer_1 = new uint8_t[frame_size]; + data_buffer_2 = new uint8_t[frame_size]; + + memcpy(data_buffer_1, target_frame->data[0], frame_size); + + // wrap data in a QImage for painting + QImage img(data_buffer_1, target_frame->width, target_frame->height, QImage::Format_RGBA8888); + + // create QPainter process + QPainter p(&img); + + // set font color to white + p.setPen(Qt::white); + + // set font size relative to frame size (divided by 12) + QFont overlay_font = p.font(); + overlay_font.setPixelSize(target_frame->height/12); + p.setFont(overlay_font); + + // generate overlay text + QString proxy_overlay_text = QCoreApplication::translate("Playback", "Generating Proxy: %1%").arg(proxy_generator.get_proxy_progress(c->media->to_footage())); + + int text_height = p.fontMetrics().descent() + p.fontMetrics().height(); + + // draw semi-transparent black background + p.fillRect(QRect(0, + target_frame->height-text_height, + p.fontMetrics().width(proxy_overlay_text), + text_height), + QColor(0, 0, 0, 128) + ); + + + // draw text + p.drawText(0, + target_frame->height-p.fontMetrics().descent(), + proxy_overlay_text); + } for (int i=0;ieffects.size();i++) { Effect* e = c->effects.at(i); if (e->enable_image && e->is_enabled()) { if (data_buffer_1 == target_frame->data[0]) { - frame_size = size_t(target_frame->linesize[0])*size_t(target_frame->height); - data_buffer_1 = new uint8_t[frame_size]; data_buffer_2 = new uint8_t[frame_size]; diff --git a/project/footage.cpp b/project/footage.cpp index c5cdc94e9..82ecc5915 100644 --- a/project/footage.cpp +++ b/project/footage.cpp @@ -18,7 +18,8 @@ Footage::Footage() : in(0), out(0), speed(1.0), - alpha_is_premultiplied(false) + alpha_is_premultiplied(false), + proxy(false) { ready_lock.lock(); } diff --git a/project/footage.h b/project/footage.h index 56ae6cace..6e5219078 100644 --- a/project/footage.h +++ b/project/footage.h @@ -56,6 +56,10 @@ struct Footage { double speed; bool alpha_is_premultiplied; + // proxy config + bool proxy; + QString proxy_path; + PreviewGenerator* preview_gen; QMutex ready_lock; diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 957eb5b7a..b856fbcd1 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -3,13 +3,17 @@ #include "panels/panels.h" #include "project/media.h" #include "project/undo.h" +#include "playback/playback.h" #include "panels/timeline.h" #include "panels/project.h" #include "project/footage.h" #include "panels/viewer.h" #include "project/projectfilter.h" +#include "project/sequence.h" #include "io/config.h" #include "dialogs/proxydialog.h" +#include "ui/viewerwidget.h" +#include "io/proxygenerator.h" #include "mainwindow.h" #include @@ -19,6 +23,8 @@ #include #include +#include + SourcesCommon::SourcesCommon(Project* parent) : editing_item(nullptr), project_parent(parent) @@ -76,11 +82,11 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it connect(show_sequences, SIGNAL(triggered(bool)), panel_project->sorter, SLOT(set_show_sequences(bool))); if (items.size() > 0) { - Media* m = project_parent->item_to_media(items.at(0)); - if (items.size() == 1) { + Media* first_media = project_parent->item_to_media(items.at(0)); + // replace footage - int type = m->get_type(); + int type = first_media->get_type(); if (type == MEDIA_TYPE_FOOTAGE) { QAction* replace_action = menu.addAction(tr("Replace/Relink Media")); QObject::connect(replace_action, SIGNAL(triggered(bool)), project_parent, SLOT(replace_selected_file())); @@ -100,11 +106,13 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it } } - // duplicate item + // analyze selected footage types bool all_sequences = true; bool all_footage = true; + cached_selected_footage.clear(); for (int i=0;iitem_to_media(items.at(i)); if (m->get_type() != MEDIA_TYPE_SEQUENCE) { all_sequences = false; } @@ -132,9 +140,52 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it QObject::connect(delete_footage_from_sequences, SIGNAL(triggered(bool)), project_parent, SLOT(delete_clips_using_selected_media())); QMenu* proxies = menu.addMenu(tr("Proxy")); - proxies->addAction(tr("Create Proxy"), this, SLOT(open_create_proxy_dialog())); -// proxies->addAction(tr("Modify Proxy")); -// proxies->addAction(tr("Restore Original")); + + // special case if one footage item is selected and its proxy is currently being generated + if (cached_selected_footage.size() == 1 + && cached_selected_footage.at(0)->proxy + && cached_selected_footage.at(0)->proxy_path.isEmpty()) { + QAction* action = proxies->addAction(tr("Generating proxy: %1% complete").arg(proxy_generator.get_proxy_progress(cached_selected_footage.at(0)))); + action->setEnabled(false); + } else { + // determine whether any selected footage has or doesn't have proxies + bool footage_without_proxies_exists = false; + bool footage_with_proxies_exists = false; + + for (int i=0;iproxy) { + footage_with_proxies_exists = true; + } else { + footage_without_proxies_exists = true; + } + } + + // if footage was selected WITHOUT proxies + if (footage_without_proxies_exists) { + QString create_proxy_text; + + if (footage_with_proxies_exists) { + // some of the footage already has proxies, so we use a different string + create_proxy_text = tr("Create/Modify Proxy"); + } else { + // none of the footage has proxies + create_proxy_text = tr("Create Proxy"); + } + + proxies->addAction(create_proxy_text, this, SLOT(open_create_proxy_dialog())); + } + + // if footage was selected WITH proxies + if (footage_with_proxies_exists) { + + if (!footage_without_proxies_exists) { + // if all the footage has proxies, we didn't make a "Create/Modify" above, so we create one here (but only "modify") + proxies->addAction(tr("Modify Proxy"), this, SLOT(open_create_proxy_dialog())); + } + + proxies->addAction(tr("Restore Original"), this, SLOT(clear_proxies_from_selected())); + } + } } // delete media @@ -308,3 +359,38 @@ void SourcesCommon::open_create_proxy_dialog() { ProxyDialog pd(mainWindow, cached_selected_footage); pd.exec(); } + +void SourcesCommon::clear_proxies_from_selected() { + QList delete_list; + + for (int i=0;iproxy && !f->proxy_path.isEmpty()) { + if (QFileInfo::exists(f->proxy_path)) { + if (QMessageBox::question(mainWindow, + tr("Delete proxy"), + tr("Would you like to delete the proxy file \"%1\" as well?").arg(f->proxy_path), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + delete_list.append(f->proxy_path); + } + } + } + + f->proxy = false; + f->proxy_path.clear(); + } + + if (sequence != nullptr) { + // close all clips so we can delete any proxies requested to be deleted + closeActiveClips(sequence); + + // delete proxies requested to be deleted + for (int i=0;iviewer_widget->frame_update(); + } +} diff --git a/project/sourcescommon.h b/project/sourcescommon.h index 3c15e5ae2..1eb816129 100644 --- a/project/sourcescommon.h +++ b/project/sourcescommon.h @@ -30,7 +30,10 @@ private slots: void reveal_in_browser(); void rename_interval(); void item_renamed(Media *item); + + // proxy functions void open_create_proxy_dialog(); + void clear_proxies_from_selected(); private: Media* editing_item; QModelIndex editing_index; diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index a8ef4fee5..b85a3d349 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -58,7 +58,6 @@ void RenderThread::run() { ctx->functions()->glGenFramebuffers(1, &back_buffer_2); } - // gen texture if (front_texture == 0 || tex_width != seq->width || tex_height != seq->height) { // cache texture size From 0513749b9d606d085d0752c192788d9e68f796f1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 02:03:05 +1100 Subject: [PATCH 045/202] added maximize panel and full screen viewer menu items --- mainwindow.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++--- mainwindow.h | 7 ++++++- panels/panels.cpp | 4 ++-- panels/panels.h | 2 +- ui/viewerwidget.cpp | 22 ++++++++++++------- ui/viewerwidget.h | 1 + 6 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 042c52f7a..582a8049d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -736,6 +736,8 @@ void MainWindow::setup_menus() { full_screen->setProperty("id", "fullscreen"); full_screen->setCheckable(true); + view_menu->addAction(tr("Full Screen Viewer"), this, SLOT(full_screen_viewer()))->setProperty("id", "fullscreenviewer"); + // INITIALIZE PLAYBACK MENU QMenu* playback_menu = menuBar->addMenu(tr("&Playback")); @@ -799,7 +801,11 @@ void MainWindow::setup_menus() { window_sequenceviewer_action->setCheckable(true); window_sequenceviewer_action->setData(reinterpret_cast(panel_sequence_viewer)); - window_menu->addSeparator(); + window_menu->addSeparator(); + + window_menu->addAction(tr("Maximize Panel"), this, SLOT(maximize_panel()), QKeySequence("`"))->setProperty("id", "maximizepanel"); + + window_menu->addSeparator(); window_menu->addAction(tr("Reset to Default Layout"), this, SLOT(reset_layout()))->setProperty("id", "resetdefaultlayout"); @@ -1185,7 +1191,34 @@ void MainWindow::next_cut() { QDockWidget* focused_panel = get_focused_panel(); if (sequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { panel_timeline->next_cut(); - } + } +} + +void MainWindow::maximize_panel() { + // toggles between normal state and a state of one panel being maximized + if (temp_panel_state.isEmpty()) { + // get currently hovered panel + QDockWidget* focused_panel = get_focused_panel(true); + + // if the mouse is in fact hovering over a panel + if (focused_panel != nullptr) { + // store the current state of panels + temp_panel_state = saveState(); + + // remove all dock widgets (kind of painful having to do each individually) + if (focused_panel != panel_project) removeDockWidget(panel_project); + if (focused_panel != panel_effect_controls) removeDockWidget(panel_effect_controls); + if (focused_panel != panel_timeline) removeDockWidget(panel_timeline); + if (focused_panel != panel_sequence_viewer) removeDockWidget(panel_sequence_viewer); + if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); + } + } else { + // we must be maximized, restore previous state + restoreState(temp_panel_state); + + // clear temp panel state for next maximize call + temp_panel_state.clear(); + } } void MainWindow::preferences() @@ -1200,7 +1233,15 @@ void MainWindow::zoom_in_tracks() { } void MainWindow::zoom_out_tracks() { - panel_timeline->decrease_track_height(); + panel_timeline->decrease_track_height(); +} + +void MainWindow::full_screen_viewer() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->viewer_widget->set_fullscreen(); + } else { + panel_sequence_viewer->viewer_widget->set_fullscreen(); + } } void MainWindow::windowMenu_About_To_Be_Shown() { @@ -1585,6 +1626,10 @@ void MainWindow::toggle_panel_visibility() { QAction* action = static_cast(sender()); QDockWidget* w = reinterpret_cast(action->data().value()); w->setVisible(!w->isVisible()); + + // layout has changed, we're no longer in maximized panel mode, + // so we clear this byte array + temp_panel_state.clear(); } void MainWindow::set_timecode_view() { diff --git a/mainwindow.h b/mainwindow.h index 4652b2c24..b00bf28c9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -78,14 +78,16 @@ private slots: void prev_cut(); void next_cut(); + void maximize_panel(); void reset_layout(); void preferences(); void zoom_in_tracks(); - void zoom_out_tracks(); + void full_screen_viewer(); + void fileMenu_About_To_Be_Shown(); void fileMenu_About_To_Hide(); void editMenu_About_To_Be_Shown(); @@ -204,6 +206,9 @@ private: bool enable_launch_with_project; QString appName; + + // used to store the panel state when one panel is maximized + QByteArray temp_panel_state; }; extern MainWindow* mainWindow; diff --git a/panels/panels.cpp b/panels/panels.cpp index 98a61dcd2..b460647c9 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -115,9 +115,9 @@ void update_ui(bool modified) { panel_graph_editor->update_panel(); } -QDockWidget *get_focused_panel() { +QDockWidget *get_focused_panel(bool force_hover) { QDockWidget* w = nullptr; - if (config.hover_focus) { + if (config.hover_focus || force_hover) { if (panel_project->underMouse()) { w = panel_project; } else if (panel_effect_controls->underMouse()) { diff --git a/panels/panels.h b/panels/panels.h index 2434d1daa..0e934513e 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -19,7 +19,7 @@ extern Timeline* panel_timeline; extern GraphEditor* panel_graph_editor; void update_ui(bool modified); -QDockWidget* get_focused_panel(); +QDockWidget* get_focused_panel(bool force_hover = false); void alloc_panels(QWidget *parent); void free_panels(); void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index ea2322836..f6031f4ea 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -93,7 +93,20 @@ void ViewerWidget::set_waveform_scroll(int s) { if (waveform) { waveform_scroll = s; update(); - } + } +} + +void ViewerWidget::set_fullscreen(int screen) { + if (screen >= 0 && screen < QGuiApplication::screens().size()) { + QScreen* selected_screen = QGuiApplication::screens().at(screen); + window->showFullScreen(); + window->setGeometry(selected_screen->geometry()); + + // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown + QTimer::singleShot(100, window, SLOT(update())); + } else { + qCritical() << "Failed to find requested screen" << screen << "to set fullscreen to"; + } } void ViewerWidget::show_context_menu() { @@ -170,12 +183,7 @@ void ViewerWidget::fullscreen_menu_action(QAction *action) { if (action->data().isNull()) { window->hide(); } else { - QScreen* selected_screen = QGuiApplication::screens().at(action->data().toInt()); - window->showFullScreen(); - window->setGeometry(selected_screen->geometry()); - - // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown - QTimer::singleShot(100, window, SLOT(update())); + set_fullscreen(action->data().toInt()); } } } diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index e6f0526c8..ce09c790a 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -47,6 +47,7 @@ public: void set_scroll(double x, double y); public slots: void set_waveform_scroll(int s); + void set_fullscreen(int screen = 0); protected: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); From db92e5231fbec55ba4af7a3a394619aad3e6b1c2 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 02:53:54 +1100 Subject: [PATCH 046/202] most clip marker work completed #333 --- io/config.h | 2 +- io/loadthread.cpp | 18 ++++++++++++++++-- panels/project.cpp | 17 +++++++++++++---- panels/timeline.cpp | 33 ++++++++++++++++++++++++++++++--- project/clip.h | 5 +++++ project/marker.cpp | 17 +++++++++++++++++ project/marker.h | 5 +++++ project/undo.cpp | 28 +++++++++++++++++++--------- project/undo.h | 5 +++-- ui/timelineheader.cpp | 40 +++++++++++----------------------------- ui/timelinewidget.cpp | 29 +++++++++++++++++++++++++++++ 11 files changed, 149 insertions(+), 50 deletions(-) diff --git a/io/config.h b/io/config.h index 5e8c61f27..c01ee0ee3 100644 --- a/io/config.h +++ b/io/config.h @@ -3,7 +3,7 @@ #include -#define SAVE_VERSION 190120 // YYMMDD +#define SAVE_VERSION 190201 // YYMMDD #define MIN_SAVE_VERSION 190104 // lowest compatible project version #define TIMECODE_DROP 0 diff --git a/io/loadthread.cpp b/io/loadthread.cpp index adfc3a510..ae4bcca35 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -427,10 +427,24 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { } } if (cancelled) return false; - } else if (stream.isStartElement() && (stream.name() == "effect" || stream.name() == "opening" || stream.name() == "closing")) { + } else if (stream.isStartElement() + && (stream.name() == "effect" + || stream.name() == "opening" + || stream.name() == "closing")) { // "opening" and "closing" are backwards compatibility code load_effect(stream, c); - } + } else if (stream.name() == "marker" && stream.isStartElement()) { + Marker m; + for (int j=0;jmarkers.append(m); + } } } if (cancelled) return false; diff --git a/panels/project.cpp b/panels/project.cpp index 4ec6ae81a..1bf591aee 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -915,6 +915,13 @@ void Project::load_project(bool autorecovery) { ld.exec(); } +void save_marker(QXmlStreamWriter& stream, const Marker& m) { + stream.writeStartElement("marker"); + stream.writeAttribute("frame", QString::number(m.frame)); + stream.writeAttribute("name", m.name); + stream.writeEndElement(); +} + void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, const QModelIndex& parent) { for (int i=0;imarkers.size();k++) { + save_marker(stream, c->markers.at(k)); + } + stream.writeStartElement("linked"); // linked for (int k=0;klinked.size();k++) { stream.writeStartElement("link"); // link @@ -1063,10 +1075,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } } for (int j=0;jmarkers.size();j++) { - stream.writeStartElement("marker"); - stream.writeAttribute("frame", QString::number(s->markers.at(j).frame)); - stream.writeAttribute("name", s->markers.at(j).name); - stream.writeEndElement(); + save_marker(stream, s->markers.at(j)); } stream.writeEndElement(); } diff --git a/panels/timeline.cpp b/panels/timeline.cpp index b7cfe2b5f..a9860f5e9 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1426,7 +1426,14 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo } else if (c->get_closing_transition() != nullptr && snap_to_point(c->timeline_out - c->get_closing_transition()->get_true_length(), l)) { return true; - } + } else { + // try to snap to clip markers + for (int j=0;jmarkers.size();j++) { + if (snap_to_point(c->markers.at(j).frame + c->timeline_in - c->clip_in, l)) { + return true; + } + } + } } } } @@ -1446,9 +1453,29 @@ void Timeline::set_marker() { marker_name = d.textValue(); } - if (add_marker) { - undo_stack.push(new AddMarkerAction(sequence, sequence->playhead, marker_name)); + ComboAction* ca = new ComboAction(); + + // see if any clips are selected, and if so add a marker to them + bool clip_mode = false; + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != nullptr + && is_clip_selected(c, true)) { + ca->append(new AddMarkerAction(false, + c, + sequence->playhead - c->timeline_in + c->clip_in, + marker_name)); + clip_mode = true; + } + } + + // if no clips are selected, we're adding a marker to the sequence + if (!clip_mode) { + ca->append(new AddMarkerAction(true, sequence, sequence->playhead, marker_name)); + } + + undo_stack.push(ca); } } diff --git a/project/clip.h b/project/clip.h index a2f284d80..488045cd1 100644 --- a/project/clip.h +++ b/project/clip.h @@ -5,6 +5,8 @@ #include #include +#include "marker.h" + #define SKIP_TYPE_DISCARD 0 #define SKIP_TYPE_SEEK 1 @@ -73,6 +75,9 @@ struct Clip bool maintain_audio_pitch; bool autoscale; + // markers + QVector markers; + // other variables (should be deep copied/duplicated in copy()) QList effects; QVector linked; diff --git a/project/marker.cpp b/project/marker.cpp index 1b5311b31..b92cdc961 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -1 +1,18 @@ #include "marker.h" + +void draw_marker(QPainter &p, int x, int y, int bottom, bool selected, bool flipped) { + const QPoint points[5] = { + QPoint(x, bottom), + QPoint(x + MARKER_SIZE, bottom - MARKER_SIZE), + QPoint(x + MARKER_SIZE, y), + QPoint(x - MARKER_SIZE, y), + QPoint(x - MARKER_SIZE, bottom - MARKER_SIZE) + }; + p.setPen(Qt::black); + if (selected) { + p.setBrush(QColor(208, 255, 208)); + } else { + p.setBrush(QColor(128, 224, 128)); + } + p.drawPolygon(points, 5); +} diff --git a/project/marker.h b/project/marker.h index a58f85e48..8d1ef87b8 100644 --- a/project/marker.h +++ b/project/marker.h @@ -1,11 +1,16 @@ #ifndef MARKER_H #define MARKER_H +#define MARKER_SIZE 4 + #include +#include struct Marker { long frame; QString name; }; +void draw_marker(QPainter& p, int x, int y, int bottom, bool selected, bool flipped); + #endif // MARKER_H diff --git a/project/undo.cpp b/project/undo.cpp index 47b797c34..ce577f855 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -803,18 +803,23 @@ void SetAutoscaleAction::redo() { mainWindow->setWindowModified(true); } -AddMarkerAction::AddMarkerAction(Sequence* s, long t, QString n) : - seq(s), +AddMarkerAction::AddMarkerAction(bool is_sequence, void* s, long t, QString n) : + is_sequence_internal(is_sequence), + target(s), time(t), name(n), old_project_changed(mainWindow->isWindowModified()) {} void AddMarkerAction::undo() { + QVector& markers = is_sequence_internal ? + static_cast(target)->markers : + static_cast(target)->markers; + if (index == -1) { - seq->markers.removeLast(); + markers.removeLast(); } else { - seq->markers[index].name = old_name; + markers[index].name = old_name; } mainWindow->setWindowModified(old_project_changed); @@ -822,8 +827,13 @@ void AddMarkerAction::undo() { void AddMarkerAction::redo() { index = -1; - for (int i=0;imarkers.size();i++) { - if (seq->markers.at(i).frame == time) { + + QVector& markers = is_sequence_internal ? + static_cast(target)->markers : + static_cast(target)->markers; + + for (int i=0;imarkers.append(m); + markers.append(m); } else { - old_name = seq->markers.at(index).name; - seq->markers[index].name = name; + old_name = markers.at(index).name; + markers[index].name = name; } mainWindow->setWindowModified(true); diff --git a/project/undo.h b/project/undo.h index 9f94ee3a4..a2420fbdb 100644 --- a/project/undo.h +++ b/project/undo.h @@ -384,11 +384,12 @@ private: class AddMarkerAction : public QUndoCommand { public: - AddMarkerAction(Sequence* s, long t, QString n); + AddMarkerAction(bool is_sequence, void* s, long t, QString n); void undo(); void redo(); private: - Sequence* seq; + bool is_sequence_internal; + void* target; long time; QString name; QString old_name; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 5746028e4..e37f16374 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -20,7 +20,6 @@ #define PLAYHEAD_SIZE 6 #define LINE_MIN_PADDING 50 #define SUBLINE_MIN_PADDING 50 // TODO play with this -#define MARKER_SIZE 4 // used only if center_timeline_timecodes is FALSE #define TEXT_PADDING_FROM_LINE 4 @@ -406,35 +405,18 @@ void TimelineHeader::paintEvent(QPaintEvent*) { // draw markers for (int i=0;iseq->markers.size();i++) { const Marker& m = viewer->seq->markers.at(i); + int marker_x = getHeaderScreenPointFromFrame(m.frame); - const QPoint points[5] = { - QPoint(marker_x, height()-1), - QPoint(marker_x + MARKER_SIZE, height() - MARKER_SIZE - 1), - QPoint(marker_x + MARKER_SIZE, yoff), - QPoint(marker_x - MARKER_SIZE, yoff), - QPoint(marker_x - MARKER_SIZE, height() - MARKER_SIZE - 1) - }; - /*const QPoint points[5] = { - QPoint(marker_x, height()-1), - QPoint(marker_x + MARKER_SIZE, height() - MARKER_SIZE - 1), - QPoint(marker_x + MARKER_SIZE, yoff), - QPoint(marker_x - MARKER_SIZE, yoff), - QPoint(marker_x - MARKER_SIZE, height() - MARKER_SIZE - 1) - };*/ - p.setPen(Qt::black); - bool selected = false; - for (int j=0;jghosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); + + // snap ghost's in point if (panel_timeline->trim_target == -1 || g.trim_in) { fm = g.old_in + frame_diff; if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { @@ -1251,6 +1253,8 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { break; } } + + // snap ghost's out point if (panel_timeline->trim_target == -1 || !g.trim_in) { fm = g.old_out + frame_diff; if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { @@ -1258,6 +1262,19 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { break; } } + + // if the ghost is attached to a clip, snap its markers too + if (panel_timeline->trim_target == -1 && g.clip >= 0) { + Clip* c = sequence->clips.at(g.clip); + for (int j=0;jmarkers.size();j++) { + long marker_real_time = c->markers.at(j).frame + c->timeline_in - c->clip_in; + fm = marker_real_time + frame_diff; + if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { + frame_diff = fm - marker_real_time; + break; + } + } + } } } @@ -2394,6 +2411,18 @@ void TimelineWidget::paintEvent(QPaintEvent*) { } } + // draw clip markers + for (int j=0;jmarkers.size();j++) { + const Marker& m = clip->markers.at(j); + + // convert marker time (in clip time) to sequence time + long marker_time = m.frame + clip->timeline_in - clip->clip_in; + int marker_x = panel_timeline->getTimelineScreenPointFromFrame(marker_time); + if (marker_x > clip_rect.x() && marker_x < clip_rect.right()) { + draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false, false); + } + } + // draw clip transitions draw_transition(p, clip, clip_rect, text_rect, TA_OPENING_TRANSITION); draw_transition(p, clip, clip_rect, text_rect, TA_CLOSING_TRANSITION); From 0399c36dfd6511f9748811e1200a9db7483a8ddb Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 10:05:22 +1100 Subject: [PATCH 047/202] added search to project toolbar --- panels/project.cpp | 6 +++++- project/projectfilter.cpp | 41 +++++++++++++++++++++++++++++++++++---- project/projectfilter.h | 20 ++++++++++++++++++- project/undo.cpp | 1 + 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index 1bf591aee..80c49ede9 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -130,7 +130,11 @@ Project::Project(QWidget *parent) : connect(toolbar_redo, SIGNAL(clicked(bool)), mainWindow, SLOT(redo())); toolbar->addWidget(toolbar_redo); - toolbar->addStretch(); + QLineEdit* toolbar_search = new QLineEdit(); + toolbar_search->setPlaceholderText(tr("Search media, markers, etc.")); + connect(toolbar_search, SIGNAL(textChanged(QString)), sorter, SLOT(update_search_filter(const QString&))); + toolbar->addWidget(toolbar_search); + QPushButton* toolbar_tree_view = new QPushButton(); QIcon icon6; icon6.addFile(QStringLiteral(":/icons/treeview.png"), QSize(), QIcon::Normal, QIcon::On); diff --git a/project/projectfilter.cpp b/project/projectfilter.cpp index 798174c6e..807ad0bbc 100644 --- a/project/projectfilter.cpp +++ b/project/projectfilter.cpp @@ -1,6 +1,7 @@ #include "projectfilter.h" #include "project/media.h" +#include "project/sequence.h" #include @@ -15,17 +16,49 @@ bool ProjectFilter::get_show_sequences() { void ProjectFilter::set_show_sequences(bool b) { show_sequences = b; - invalidateFilter(); + invalidateFilter(); +} + +void ProjectFilter::update_search_filter(const QString &s) { + search_filter = s; + invalidateFilter(); } bool ProjectFilter::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { + // retrieve media object from index + QModelIndex index = sourceModel()->index(source_row, 0, source_parent); + Media* media = static_cast(index.internalPointer()); + + // hide sequences if show_sequences is false if (!show_sequences) { - // hide sequences if show_sequences is false - QModelIndex index = sourceModel()->index(source_row, 0, source_parent); - Media* media = static_cast(index.internalPointer()); if (media != nullptr && media->get_type() == MEDIA_TYPE_SEQUENCE) { return false; } } + + // filter by search filter string + if (!search_filter.isEmpty()) { + // search markers if media is a sequene + bool marker_contains_search = false; + + if (media->get_type() == MEDIA_TYPE_SEQUENCE) { + Sequence* s = media->to_sequence(); + for (int i=0;imarkers.size();i++) { + qDebug() << "marker name:" << s->markers.at(i).name; + if (s->markers.at(i).name.contains(search_filter, Qt::CaseInsensitive)) { + marker_contains_search = true; + break; + } + } + } + + // hide any rows that don't contain the search string (unless it's a folder) + if (!marker_contains_search + && media->get_type() != MEDIA_TYPE_FOLDER + && !media->get_name().contains(search_filter, Qt::CaseInsensitive)) { + return false; + } + } + return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); } diff --git a/project/projectfilter.h b/project/projectfilter.h index 6b14bb680..848acbffd 100644 --- a/project/projectfilter.h +++ b/project/projectfilter.h @@ -7,13 +7,31 @@ class ProjectFilter : public QSortFilterProxyModel { Q_OBJECT public: ProjectFilter(QObject *parent = nullptr); + + // are sequences visible bool get_show_sequences(); + public slots: + + // set whether sequences are visible void set_show_sequences(bool b); + + // update search filter + void update_search_filter(const QString& s); + protected: - bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + + // function that filters whether rows are displayed or not + virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + private: + + // internal variable for whether to show sequences bool show_sequences; + + // search filter variable + QString search_filter; + }; #endif // PROJECTFILTER_H diff --git a/project/undo.cpp b/project/undo.cpp index ce577f855..b4fb804a8 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -842,6 +842,7 @@ void AddMarkerAction::redo() { if (index == -1) { Marker m; m.frame = time; + m.name = name; markers.append(m); } else { old_name = markers.at(index).name; From 5d4b564ba11436770acb40707cbe29ff2dc717ec Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 10:07:42 +1100 Subject: [PATCH 048/202] removed unnecessary debug out --- project/projectfilter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/project/projectfilter.cpp b/project/projectfilter.cpp index 807ad0bbc..8b084b141 100644 --- a/project/projectfilter.cpp +++ b/project/projectfilter.cpp @@ -44,7 +44,6 @@ bool ProjectFilter::filterAcceptsRow(int source_row, const QModelIndex &source_p if (media->get_type() == MEDIA_TYPE_SEQUENCE) { Sequence* s = media->to_sequence(); for (int i=0;imarkers.size();i++) { - qDebug() << "marker name:" << s->markers.at(i).name; if (s->markers.at(i).name.contains(search_filter, Qt::CaseInsensitive)) { marker_contains_search = true; break; From 4478a386af988d715920abd6548b9a5b67d2430a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 11:02:05 +1100 Subject: [PATCH 049/202] preference for changing language --- dialogs/preferencesdialog.cpp | 71 ++++++++++++++++++++++++++++------- dialogs/preferencesdialog.h | 1 + io/config.cpp | 8 +++- io/config.h | 1 + mainwindow.cpp | 11 +++++- 5 files changed, 75 insertions(+), 17 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 85150b666..936d66bda 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "debug.h" @@ -139,8 +140,7 @@ void PreferencesDialog::save() { bool reset_audio_required = (config.preferred_audio_output != audio_output_devices->currentData().toString() || config.preferred_audio_input != audio_input_devices->currentData().toString()); config.preferred_audio_output = audio_output_devices->currentData().toString(); - config.preferred_audio_input = audio_input_devices->currentData().toString(); - qDebug() << "selected audio input" << audio_input_devices->currentData().toString(); + config.preferred_audio_input = audio_input_devices->currentData().toString(); config.audio_rate = audio_sample_rate->currentData().toInt(); // the following settings may require a restart of Olive to take effect: @@ -149,13 +149,18 @@ void PreferencesDialog::save() { if (config.effect_textbox_lines != effect_textbox_lines_field->value()) { needs_restart = true; + config.effect_textbox_lines = effect_textbox_lines_field->value(); } - config.effect_textbox_lines = effect_textbox_lines_field->value(); if (config.use_software_fallback != use_software_fallbacks_checkbox->isChecked()) { needs_restart = true; + config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); } - config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); + + if (config.language_file != language_combobox->currentData().toString()) { + needs_restart = true; + config.language_file = language_combobox->currentData().toString(); + } // save keyboard shortcuts for (int i=0;i Language + general_layout->addWidget(new QLabel(tr("Language:")), row, 0, 1, 1); + + language_combobox = new QComboBox(); + + // add default language (en-US) + language_combobox->addItem(QLocale::languageToString(QLocale("en-US").language())); + + // add languages from file + QDir translation_dir(QApplication::applicationDirPath().append("/ts")); + QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot); + for (int i=0;iaddItem(QLocale::languageToString(QLocale(locale_str).language()), locale_full_path); + + if (config.language_file == locale_full_path) { + language_combobox->setCurrentIndex(language_combobox->count() - 1); + } + } + + general_layout->addWidget(language_combobox, row, 1, 1, 2); + + row++; + // General -> Custom CSS - general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), 0, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0, 1, 1); custom_css_fn = new QLineEdit(general_tab); custom_css_fn->setText(config.css_path); - general_layout->addWidget(custom_css_fn, 0, 1, 1, 1); + general_layout->addWidget(custom_css_fn, row, 1, 1, 1); QPushButton* custom_css_browse = new QPushButton(tr("Browse"), general_tab); connect(custom_css_browse, SIGNAL(clicked(bool)), this, SLOT(browse_css_file())); - general_layout->addWidget(custom_css_browse, 0, 2, 1, 1); + general_layout->addWidget(custom_css_browse, row, 2, 1, 1); + + row++; // General -> Image Sequence Formats - general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), 1, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), row, 0, 1, 1); imgSeqFormatEdit = new QLineEdit(general_tab); - general_layout->addWidget(imgSeqFormatEdit, 1, 1, 1, 2); + general_layout->addWidget(imgSeqFormatEdit, row, 1, 1, 2); + + row++; // General -> Audio Recording - general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), 2, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), row, 0, 1, 1); recordingComboBox = new QComboBox(general_tab); recordingComboBox->addItem(tr("Mono")); recordingComboBox->addItem(tr("Stereo")); - general_layout->addWidget(recordingComboBox, 2, 1, 1, 2); + general_layout->addWidget(recordingComboBox, row, 1, 1, 2); + + row++; // General -> Effect Textbox Lines - general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), 3, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), row, 0, 1, 1); effect_textbox_lines_field = new QSpinBox(general_tab); effect_textbox_lines_field->setMinimum(1); effect_textbox_lines_field->setValue(config.effect_textbox_lines); - general_layout->addWidget(effect_textbox_lines_field, 3, 1, 1, 2); + general_layout->addWidget(effect_textbox_lines_field, row, 1, 1, 2); + + row++; // General -> Use Software Fallbacks When Possible use_software_fallbacks_checkbox = new QCheckBox(general_tab); use_software_fallbacks_checkbox->setText(tr("Use Software Fallbacks When Possible")); use_software_fallbacks_checkbox->setChecked(config.use_software_fallback); - general_layout->addWidget(use_software_fallbacks_checkbox, 4, 0, 1, 1); + general_layout->addWidget(use_software_fallbacks_checkbox, row, 0, 1, 1); tabWidget->addTab(general_tab, tr("General")); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index 2e8243fda..4679ce0da 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -65,6 +65,7 @@ private: QComboBox* audio_output_devices; QComboBox* audio_input_devices; QComboBox* audio_sample_rate; + QComboBox* language_combobox; QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/io/config.cpp b/io/config.cpp index 2a3122557..4e0f83a5a 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -179,7 +179,10 @@ void Config::load(QString path) { } else if (stream.name() == "PreferredAudioInput") { stream.readNext(); preferred_audio_input = stream.text().toString(); - } + } else if (stream.name() == "LanguageFile") { + stream.readNext(); + language_file = stream.text().toString(); + } } } if (stream.hasError()) { @@ -242,7 +245,8 @@ void Config::save(QString path) { stream.writeTextElement("UseSoftwareFallback", QString::number(use_software_fallback)); stream.writeTextElement("CenterTimelineTimecodes", QString::number(center_timeline_timecodes)); stream.writeTextElement("PreferredAudioOutput", preferred_audio_output); - stream.writeTextElement("PreferredAudioInput", preferred_audio_input); + stream.writeTextElement("PreferredAudioInput", preferred_audio_input); + stream.writeTextElement("LanguageFile", language_file); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index c01ee0ee3..90d83b32c 100644 --- a/io/config.h +++ b/io/config.h @@ -66,6 +66,7 @@ struct Config { bool center_timeline_timecodes; QString preferred_audio_output; QString preferred_audio_input; + QString language_file; void load(QString path); void save(QString path); diff --git a/mainwindow.cpp b/mainwindow.cpp index 582a8049d..394a09ed5 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -50,6 +50,7 @@ #include #include #include +#include MainWindow* mainWindow; @@ -205,10 +206,18 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : } } + // load preferred language from file + if (!config.language_file.isEmpty() + && QFileInfo::exists(config.language_file)) { + QTranslator* translator = new QTranslator(this); + translator->load(config.language_file); + QApplication::installTranslator(translator); + } + alloc_panels(this); QStatusBar* statusBar = new QStatusBar(this); - statusBar->showMessage("Welcome to " + appName); + statusBar->showMessage(tr("Welcome to %1").arg(appName)); setStatusBar(statusBar); setup_menus(); From 6a3c22bcd461a9f8816bb2709b5750243dcb39f7 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 11:22:18 +1100 Subject: [PATCH 050/202] use native language names --- dialogs/preferencesdialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 936d66bda..a29e4f0eb 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -327,7 +327,7 @@ void PreferencesDialog::setup_ui() { QFileInfo locale_file(translation_files.at(i)); QString locale_file_basename = locale_file.baseName(); QString locale_str = locale_file_basename.mid(locale_file_basename.lastIndexOf('_')+1); - language_combobox->addItem(QLocale::languageToString(QLocale(locale_str).language()), locale_full_path); + language_combobox->addItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); if (config.language_file == locale_full_path) { language_combobox->setCurrentIndex(language_combobox->count() - 1); From a34b4463028e3002f445243cfd8415c74e244a7e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 16:06:42 +1100 Subject: [PATCH 051/202] updated snap for 16.04 --- snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index cf7350087..a31bf2697 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -23,6 +23,7 @@ apps: - pulseaudio - home - removable-media + - unity7 parts: olive: From 2da663d0570a7696bf4fc798e5aac0b560f875a4 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 18:39:26 +1100 Subject: [PATCH 052/202] added settings for waveform/thumbnail resolution --- dialogs/preferencesdialog.cpp | 170 +++++++++++++++++++++++++--------- dialogs/preferencesdialog.h | 4 +- io/config.cpp | 24 +++-- io/config.h | 4 +- io/previewgenerator.cpp | 7 +- 5 files changed, 152 insertions(+), 57 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index a29e4f0eb..2e5e8ef81 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -1,6 +1,7 @@ #include "preferencesdialog.h" #include "io/config.h" +#include "io/path.h" #include "playback/audio.h" #include "mainwindow.h" @@ -140,7 +141,7 @@ void PreferencesDialog::save() { bool reset_audio_required = (config.preferred_audio_output != audio_output_devices->currentData().toString() || config.preferred_audio_input != audio_input_devices->currentData().toString()); config.preferred_audio_output = audio_output_devices->currentData().toString(); - config.preferred_audio_input = audio_input_devices->currentData().toString(); + config.preferred_audio_input = audio_input_devices->currentData().toString(); config.audio_rate = audio_sample_rate->currentData().toInt(); // the following settings may require a restart of Olive to take effect: @@ -149,18 +150,81 @@ void PreferencesDialog::save() { if (config.effect_textbox_lines != effect_textbox_lines_field->value()) { needs_restart = true; - config.effect_textbox_lines = effect_textbox_lines_field->value(); + config.effect_textbox_lines = effect_textbox_lines_field->value(); } if (config.use_software_fallback != use_software_fallbacks_checkbox->isChecked()) { needs_restart = true; - config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); + config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); } - if (config.language_file != language_combobox->currentData().toString()) { - needs_restart = true; - config.language_file = language_combobox->currentData().toString(); - } + if (config.language_file != language_combobox->currentData().toString()) { + needs_restart = true; + config.language_file = language_combobox->currentData().toString(); + } + + if (config.thumbnail_resolution != thumbnail_res_spinbox->value() + || config.waveform_resolution != waveform_res_spinbox->value()) { + // we're changing the size of thumbnails and waveforms, so let's delete them and regenerate them next start + + needs_restart = true; + + // delete nothing + char delete_match = 0; + + if (config.thumbnail_resolution != thumbnail_res_spinbox->value()) { + // delete existing thumbnails + config.thumbnail_resolution = thumbnail_res_spinbox->value(); + + // delete only thumbnails + delete_match = 't'; + } + + if (config.waveform_resolution != waveform_res_spinbox->value()) { + // delete existing waveforms + config.waveform_resolution = waveform_res_spinbox->value(); + + // if we're already deleting thumbnails + if (delete_match == 't') { + // delete all + delete_match = 1; + } else { + // just delete waveforms + delete_match = 'w'; + } + } + + if (delete_match != 0) { + QDir preview_path(get_data_path() + "/previews"); + + if (delete_match == 1) { + // indiscriminately delete everything + preview_path.removeRecursively(); + } else { + QStringList preview_file_list = preview_path.entryList(QDir::Files | QDir::NoDotAndDotDot); + for (int i=0;i= 0 + && preview_file_str.at(identifier_char_index) >= 48 + && preview_file_str.at(identifier_char_index) <= 57) { + identifier_char_index--; + } + + // thumbnails will have a 't' towards the end of the filenames, waveforms will have a 'w' + // if they match the type of preview we're deleting, remove them + if (preview_file_str.at(identifier_char_index) == delete_match) { + QFile::remove(preview_path.filePath(preview_file_str)); + } + } + } + } + } // save keyboard shortcuts for (int i=0;i Language - general_layout->addWidget(new QLabel(tr("Language:")), row, 0, 1, 1); + // General -> Language + general_layout->addWidget(new QLabel(tr("Language:")), row, 0, 1, 1); - language_combobox = new QComboBox(); + language_combobox = new QComboBox(); - // add default language (en-US) - language_combobox->addItem(QLocale::languageToString(QLocale("en-US").language())); + // add default language (en-US) + language_combobox->addItem(QLocale::languageToString(QLocale("en-US").language())); - // add languages from file - QDir translation_dir(QApplication::applicationDirPath().append("/ts")); - QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot); - for (int i=0;iaddItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); + // add languages from file + QDir translation_dir(QApplication::applicationDirPath().append("/ts")); + QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot); + for (int i=0;iaddItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); - if (config.language_file == locale_full_path) { - language_combobox->setCurrentIndex(language_combobox->count() - 1); - } - } + if (config.language_file == locale_full_path) { + language_combobox->setCurrentIndex(language_combobox->count() - 1); + } + } - general_layout->addWidget(language_combobox, row, 1, 1, 2); + general_layout->addWidget(language_combobox, row, 1, 1, 3); - row++; + row++; // General -> Custom CSS - general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0, 1, 1); custom_css_fn = new QLineEdit(general_tab); custom_css_fn->setText(config.css_path); - general_layout->addWidget(custom_css_fn, row, 1, 1, 1); + general_layout->addWidget(custom_css_fn, row, 1, 1, 2); QPushButton* custom_css_browse = new QPushButton(tr("Browse"), general_tab); connect(custom_css_browse, SIGNAL(clicked(bool)), this, SLOT(browse_css_file())); - general_layout->addWidget(custom_css_browse, row, 2, 1, 1); + general_layout->addWidget(custom_css_browse, row, 3, 1, 1); - row++; + row++; // General -> Image Sequence Formats - general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), row, 0, 1, 1); imgSeqFormatEdit = new QLineEdit(general_tab); - general_layout->addWidget(imgSeqFormatEdit, row, 1, 1, 2); + general_layout->addWidget(imgSeqFormatEdit, row, 1, 1, 3); - row++; + row++; // General -> Audio Recording - general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), row, 0, 1, 1); recordingComboBox = new QComboBox(general_tab); recordingComboBox->addItem(tr("Mono")); recordingComboBox->addItem(tr("Stereo")); - general_layout->addWidget(recordingComboBox, row, 1, 1, 2); + general_layout->addWidget(recordingComboBox, row, 1, 1, 3); - row++; + row++; // General -> Effect Textbox Lines - general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), row, 0, 1, 1); effect_textbox_lines_field = new QSpinBox(general_tab); effect_textbox_lines_field->setMinimum(1); effect_textbox_lines_field->setValue(config.effect_textbox_lines); - general_layout->addWidget(effect_textbox_lines_field, row, 1, 1, 2); + general_layout->addWidget(effect_textbox_lines_field, row, 1, 1, 3); - row++; + row++; + + // General -> Thumbnail and Waveform Resolution + general_layout->addWidget(new QLabel(tr("Thumbnail Resolution:"), this), row, 0, 1, 1); + + thumbnail_res_spinbox = new QSpinBox(this); + thumbnail_res_spinbox->setMinimum(1); + thumbnail_res_spinbox->setMaximum(INT_MAX); + thumbnail_res_spinbox->setValue(config.thumbnail_resolution); + general_layout->addWidget(thumbnail_res_spinbox, row, 1, 1, 1); + + general_layout->addWidget(new QLabel(tr("Waveform Resolution:"), this), row, 2, 1, 1); + + waveform_res_spinbox = new QSpinBox(this); + waveform_res_spinbox->setMinimum(1); + waveform_res_spinbox->setMaximum(INT_MAX); + waveform_res_spinbox->setValue(config.waveform_resolution); + general_layout->addWidget(waveform_res_spinbox, row, 3, 1, 1); + + + row++; // General -> Use Software Fallbacks When Possible use_software_fallbacks_checkbox = new QCheckBox(general_tab); use_software_fallbacks_checkbox->setText(tr("Use Software Fallbacks When Possible")); use_software_fallbacks_checkbox->setChecked(config.use_software_fallback); - general_layout->addWidget(use_software_fallbacks_checkbox, row, 0, 1, 1); + general_layout->addWidget(use_software_fallbacks_checkbox, row, 0, 1, 4); tabWidget->addTab(general_tab, tr("General")); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index 4679ce0da..f086c1c40 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -65,7 +65,9 @@ private: QComboBox* audio_output_devices; QComboBox* audio_input_devices; QComboBox* audio_sample_rate; - QComboBox* language_combobox; + QComboBox* language_combobox; + QSpinBox* thumbnail_res_spinbox; + QSpinBox* waveform_res_spinbox; QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/io/config.cpp b/io/config.cpp index 4e0f83a5a..a3f356794 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -48,7 +48,9 @@ Config::Config() seek_also_selects(false), effect_textbox_lines(3), use_software_fallback(false), - center_timeline_timecodes(true) + center_timeline_timecodes(true), + waveform_resolution(64), + thumbnail_resolution(120) {} void Config::load(QString path) { @@ -179,10 +181,16 @@ void Config::load(QString path) { } else if (stream.name() == "PreferredAudioInput") { stream.readNext(); preferred_audio_input = stream.text().toString(); - } else if (stream.name() == "LanguageFile") { - stream.readNext(); - language_file = stream.text().toString(); - } + } else if (stream.name() == "LanguageFile") { + stream.readNext(); + language_file = stream.text().toString(); + } else if (stream.name() == "ThumbnailResolution") { + stream.readNext(); + thumbnail_resolution = stream.text().toInt(); + } else if (stream.name() == "WaveformResolution") { + stream.readNext(); + waveform_resolution = stream.text().toInt(); + } } } if (stream.hasError()) { @@ -245,8 +253,10 @@ void Config::save(QString path) { stream.writeTextElement("UseSoftwareFallback", QString::number(use_software_fallback)); stream.writeTextElement("CenterTimelineTimecodes", QString::number(center_timeline_timecodes)); stream.writeTextElement("PreferredAudioOutput", preferred_audio_output); - stream.writeTextElement("PreferredAudioInput", preferred_audio_input); - stream.writeTextElement("LanguageFile", language_file); + stream.writeTextElement("PreferredAudioInput", preferred_audio_input); + stream.writeTextElement("LanguageFile", language_file); + stream.writeTextElement("ThumbnailResolution", QString::number(thumbnail_resolution)); + stream.writeTextElement("WaveformResolution", QString::number(waveform_resolution)); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index 90d83b32c..ec6d2af89 100644 --- a/io/config.h +++ b/io/config.h @@ -66,7 +66,9 @@ struct Config { bool center_timeline_timecodes; QString preferred_audio_output; QString preferred_audio_input; - QString language_file; + QString language_file; + int waveform_resolution; + int thumbnail_resolution; void load(QString path); void save(QString path); diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index ca2fd3bbe..e1da9262b 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -18,9 +18,6 @@ #include #include -#define WAVEFORM_RESOLUTION 64 -#define THUMBNAIL_RESOLUTION 120 - extern "C" { #include #include @@ -278,7 +275,7 @@ void PreviewGenerator::generate_waveform() { if (s != nullptr) { if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (!s->preview_done) { - int dstH = THUMBNAIL_RESOLUTION; + int dstH = config.thumbnail_resolution; int dstW = qRound(dstH * (float(temp_frame->width)/float(temp_frame->height))); uint8_t* data = new uint8_t[size_t(dstW*dstH*4)]; @@ -317,7 +314,7 @@ void PreviewGenerator::generate_waveform() { } media_lengths[packet->stream_index]++; } else if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { - int interval = qFloor((temp_frame->sample_rate/WAVEFORM_RESOLUTION)/4)*4; + int interval = qFloor((temp_frame->sample_rate/config.waveform_resolution)/4)*4; AVFrame* swr_frame = av_frame_alloc(); swr_frame->channel_layout = temp_frame->channel_layout; From 3b276fea40268c608d2d9a19542279a75ad218bb Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 18:50:34 +1100 Subject: [PATCH 053/202] improved waveform drawing for higher density waveforms --- ui/timelinewidget.cpp | 79 ++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 596fb9b3a..bf0ee5e55 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1245,7 +1245,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); - // snap ghost's in point + // snap ghost's in point if (panel_timeline->trim_target == -1 || g.trim_in) { fm = g.old_in + frame_diff; if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { @@ -1254,7 +1254,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { } } - // snap ghost's out point + // snap ghost's out point if (panel_timeline->trim_target == -1 || !g.trim_in) { fm = g.old_out + frame_diff; if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { @@ -1263,18 +1263,18 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { } } - // if the ghost is attached to a clip, snap its markers too - if (panel_timeline->trim_target == -1 && g.clip >= 0) { - Clip* c = sequence->clips.at(g.clip); - for (int j=0;jmarkers.size();j++) { - long marker_real_time = c->markers.at(j).frame + c->timeline_in - c->clip_in; - fm = marker_real_time + frame_diff; - if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { - frame_diff = fm - marker_real_time; - break; - } - } - } + // if the ghost is attached to a clip, snap its markers too + if (panel_timeline->trim_target == -1 && g.clip >= 0) { + Clip* c = sequence->clips.at(g.clip); + for (int j=0;jmarkers.size();j++) { + long marker_real_time = c->markers.at(j).frame + c->timeline_in - c->clip_in; + fm = marker_real_time + frame_diff; + if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { + frame_diff = fm - marker_real_time; + break; + } + } + } } } @@ -2164,8 +2164,11 @@ void draw_waveform(Clip* clip, const FootageStream* ms, long media_length, QPain int divider = ms->audio_channels*2; int channel_height = clip_rect.height()/ms->audio_channels; + int last_waveform_index = -1; + for (int i=waveform_start;iclip_in + ((double) i/zoom))/media_length) * ms->audio_preview.size())/divider)*divider; + if (last_waveform_index < 0) last_waveform_index = waveform_index; if (clip->reverse) { waveform_index = ms->audio_preview.size() - waveform_index - (ms->audio_channels * 2); @@ -2173,21 +2176,35 @@ void draw_waveform(Clip* clip, const FootageStream* ms, long media_length, QPain for (int j=0;jaudio_channels;j++) { int mid = (config.rectified_waveforms) ? clip_rect.top()+channel_height*(j+1) : clip_rect.top()+channel_height*j+(channel_height/2); - int offset = waveform_index+(j*2); - if ((offset + 1) < ms->audio_preview.size()) { - qint8 min = (double)ms->audio_preview.at(offset) / 128.0 * (channel_height/2); - qint8 max = (double)ms->audio_preview.at(offset+1) / 128.0 * (channel_height/2); + int offset_range_start = last_waveform_index+(j*2); + int offset_range_end = waveform_index+(j*2); + qint8 min = qint8(qRound(double(ms->audio_preview.at(offset_range_start)) / 128.0 * (channel_height/2))); + qint8 max = qint8(qRound(double(ms->audio_preview.at(offset_range_start+1)) / 128.0 * (channel_height/2))); + + if ((offset_range_end + 1) < ms->audio_preview.size()) { + + // for waveform drawings, we get the maximum below 0 and maximum above 0 for this waveform range + for (int k=offset_range_start+2;k<=offset_range_end;k+=2) { + min = qMin(min, qint8(qRound(double(ms->audio_preview.at(k)) / 128.0 * (channel_height/2)))); + max = qMax(max, qint8(qRound(double(ms->audio_preview.at(k+1)) / 128.0 * (channel_height/2)))); + } + + // draw waveforms if (config.rectified_waveforms) { + + // rectified waveforms start from the bottom and draw upwards p->drawLine(clip_rect.left()+i, mid, clip_rect.left()+i, mid - (max - min)); } else { + + // non-rectified waveforms start from the center and draw outwards p->drawLine(clip_rect.left()+i, mid+min, clip_rect.left()+i, mid+max); + } - }/* else { - qWarning() << "Tried to reach" << offset + 1 << ", limit:" << ms->audio_preview.size(); - }*/ + } } + last_waveform_index = waveform_index; } } @@ -2411,17 +2428,17 @@ void TimelineWidget::paintEvent(QPaintEvent*) { } } - // draw clip markers - for (int j=0;jmarkers.size();j++) { - const Marker& m = clip->markers.at(j); + // draw clip markers + for (int j=0;jmarkers.size();j++) { + const Marker& m = clip->markers.at(j); - // convert marker time (in clip time) to sequence time - long marker_time = m.frame + clip->timeline_in - clip->clip_in; - int marker_x = panel_timeline->getTimelineScreenPointFromFrame(marker_time); - if (marker_x > clip_rect.x() && marker_x < clip_rect.right()) { - draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false, false); - } - } + // convert marker time (in clip time) to sequence time + long marker_time = m.frame + clip->timeline_in - clip->clip_in; + int marker_x = panel_timeline->getTimelineScreenPointFromFrame(marker_time); + if (marker_x > clip_rect.x() && marker_x < clip_rect.right()) { + draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false, false); + } + } // draw clip transitions draw_transition(p, clip, clip_rect, text_rect, TA_OPENING_TRANSITION); From 9861174c6335694c7b008a02da5e6480ec464457 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 19:53:52 +1100 Subject: [PATCH 054/202] temporarily removed unusable proxy codec options --- dialogs/proxydialog.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index 5d7b47469..f190109d8 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -41,10 +41,10 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : format_combobox = new QComboBox(this); format_combobox->addItem(tr("ProRes HQ")); - format_combobox->addItem(tr("ProRes SQ")); - format_combobox->addItem(tr("ProRes LT")); - format_combobox->addItem(tr("DNxHD")); - format_combobox->addItem(tr("H.264")); +// format_combobox->addItem(tr("ProRes SQ")); +// format_combobox->addItem(tr("ProRes LT")); +// format_combobox->addItem(tr("DNxHD")); +// format_combobox->addItem(tr("H.264")); layout->addWidget(format_combobox, 1, 1); // set the location to place the proxies From 61d58d0f40e48c91c0bb3b70a1bc85e39a88c76f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 1 Feb 2019 20:48:43 +1100 Subject: [PATCH 055/202] added clear button to project search field --- panels/project.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index 80c49ede9..1de84dec2 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -130,10 +130,11 @@ Project::Project(QWidget *parent) : connect(toolbar_redo, SIGNAL(clicked(bool)), mainWindow, SLOT(redo())); toolbar->addWidget(toolbar_redo); - QLineEdit* toolbar_search = new QLineEdit(); - toolbar_search->setPlaceholderText(tr("Search media, markers, etc.")); - connect(toolbar_search, SIGNAL(textChanged(QString)), sorter, SLOT(update_search_filter(const QString&))); - toolbar->addWidget(toolbar_search); + QLineEdit* toolbar_search = new QLineEdit(); + toolbar_search->setClearButtonEnabled(true); + toolbar_search->setPlaceholderText(tr("Search media, markers, etc.")); + connect(toolbar_search, SIGNAL(textChanged(QString)), sorter, SLOT(update_search_filter(const QString&))); + toolbar->addWidget(toolbar_search); QPushButton* toolbar_tree_view = new QPushButton(); QIcon icon6; @@ -920,10 +921,10 @@ void Project::load_project(bool autorecovery) { } void save_marker(QXmlStreamWriter& stream, const Marker& m) { - stream.writeStartElement("marker"); - stream.writeAttribute("frame", QString::number(m.frame)); - stream.writeAttribute("name", m.name); - stream.writeEndElement(); + stream.writeStartElement("marker"); + stream.writeAttribute("frame", QString::number(m.frame)); + stream.writeAttribute("name", m.name); + stream.writeEndElement(); } void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, const QModelIndex& parent) { @@ -1056,10 +1057,10 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } } - // save markers - for (int k=0;kmarkers.size();k++) { - save_marker(stream, c->markers.at(k)); - } + // save markers + for (int k=0;kmarkers.size();k++) { + save_marker(stream, c->markers.at(k)); + } stream.writeStartElement("linked"); // linked for (int k=0;klinked.size();k++) { @@ -1079,7 +1080,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } } for (int j=0;jmarkers.size();j++) { - save_marker(stream, s->markers.at(j)); + save_marker(stream, s->markers.at(j)); } stream.writeEndElement(); } From fea6b191a8738c92adf644c399d020f420527312 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 00:54:09 +1100 Subject: [PATCH 056/202] cli arg to load external translation file --- main.cpp | 11 +++++++++++ mainwindow.cpp | 13 ++++++++++--- mainwindow.h | 3 +++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/main.cpp b/main.cpp index 13a767cf7..48188e2a6 100644 --- a/main.cpp +++ b/main.cpp @@ -44,6 +44,7 @@ int main(int argc, char *argv[]) { "\t--disable-shaders\tDisable OpenGL shaders (for debugging)\n" "\t--no-debug\t\tDisable internal debug log and output directly to console\n" "\t--disable-blend-modes\tDisable shader-based blending for older GPUs\n" + "\t--translation \tSet an external language file to use\n" "\n", argv[0]); return 0; } else if (!strcmp(argv[i], "--fullscreen") || !strcmp(argv[i], "-f")) { @@ -54,6 +55,16 @@ int main(int argc, char *argv[]) { use_internal_logger = false; } else if (!strcmp(argv[i], "--disable-blend-modes")) { disable_blending = true; + } else if (!strcmp(argv[i], "--translation")) { + if (i + 1 < argc && argv[i + 1][0] != '-') { + // load translation file + external_translation_file = argv[i + 1]; + + i++; + } else { + printf("[ERROR] No translation file specified\n"); + return 1; + } } else { printf("[ERROR] Unknown argument '%s'\n", argv[1]); return 1; diff --git a/mainwindow.cpp b/mainwindow.cpp index 394a09ed5..2ca0470be 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -57,6 +57,9 @@ MainWindow* mainWindow; #define DEFAULT_CSS "QPushButton::checked { background: rgb(25, 25, 25); }" #define OLIVE_FILE_FILTER "Olive Project (*.ove)" +// load external translation file +QString external_translation_file; + QTimer autorecovery_timer; QString config_fn; bool demoNoticeShown = false; @@ -207,10 +210,14 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : } // load preferred language from file - if (!config.language_file.isEmpty() - && QFileInfo::exists(config.language_file)) { + QString language_file = external_translation_file.isEmpty() ? + config.language_file : + external_translation_file; + + if (!language_file.isEmpty() + && QFileInfo::exists(language_file)) { QTranslator* translator = new QTranslator(this); - translator->load(config.language_file); + translator->load(language_file); QApplication::installTranslator(translator); } diff --git a/mainwindow.h b/mainwindow.h index b00bf28c9..4ef98ebae 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -213,4 +213,7 @@ private: extern MainWindow* mainWindow; +// load external translation file +extern QString external_translation_file; + #endif // MAINWINDOW_H From f0d2772a91ca65061d57bd9365a8703cf95eace8 Mon Sep 17 00:00:00 2001 From: alexmitchell Date: Sat, 2 Feb 2019 04:25:15 +1030 Subject: [PATCH 057/202] Repaint timeline after adding marker & tell user if they are adding a marker to clip or sequence --- panels/timeline.cpp | 56 ++++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index a9860f5e9..d6241668e 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1441,42 +1441,46 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo } void Timeline::set_marker() { - bool add_marker = !config.set_name_with_marker; - QString marker_name; + bool add_marker = !config.set_name_with_marker; + QString marker_name; - if (!add_marker) { - QInputDialog d(this); - d.setWindowTitle(tr("Set Marker")); - d.setLabelText(tr("Set marker name:")); - d.setInputMode(QInputDialog::TextInput); - add_marker = (d.exec() == QDialog::Accepted); - marker_name = d.textValue(); - } + std::vector clips_selected; + bool clip_mode = false; - if (add_marker) { - ComboAction* ca = new ComboAction(); - - // see if any clips are selected, and if so add a marker to them - bool clip_mode = false; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); - if (c != nullptr - && is_clip_selected(c, true)) { - ca->append(new AddMarkerAction(false, - c, - sequence->playhead - c->timeline_in + c->clip_in, - marker_name)); - clip_mode = true; - } + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != nullptr && is_clip_selected(c, true)) { + clips_selected.push_back(c); + clip_mode=true; } + } + ComboAction* ca = new ComboAction(); + + if (!add_marker) { + QInputDialog d(this); + d.setWindowTitle(tr("Set Marker")); + d.setLabelText(clip_mode? tr("Set clip marker name:"): tr("Set sequence marker name:")); + d.setInputMode(QInputDialog::TextInput); + add_marker = (d.exec() == QDialog::Accepted); + marker_name = d.textValue(); + } + + if (add_marker) { + foreach (Clip* c, clips_selected){ + ca->append(new AddMarkerAction(false, + c, + sequence->playhead - c->timeline_in + c->clip_in, + marker_name)); + } // if no clips are selected, we're adding a marker to the sequence if (!clip_mode) { ca->append(new AddMarkerAction(true, sequence, sequence->playhead, marker_name)); } undo_stack.push(ca); - } + repaint_timeline(); + } } void Timeline::toggle_links() { From 2849e552abaf39ea818097a00ebd2cff1b9a3722 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 10:59:10 +1100 Subject: [PATCH 058/202] prevent reverse playback going below zero --- panels/viewer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/panels/viewer.cpp b/panels/viewer.cpp index c2e99c8e8..47b1a26da 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -768,12 +768,14 @@ void Viewer::update_playhead() { void Viewer::timer_update() { previous_playhead = seq->playhead; - seq->playhead = qRound(playhead_start + ((QDateTime::currentMSecsSinceEpoch()-start_msecs) * 0.001 * seq->frame_rate * playback_speed)); + seq->playhead = qMax(0, qRound(playhead_start + ((QDateTime::currentMSecsSinceEpoch()-start_msecs) * 0.001 * seq->frame_rate * playback_speed))); if (config.seek_also_selects) panel_timeline->select_from_playhead(); update_parents(config.seek_also_selects); if (playing) { - if (recording) { + if (playback_speed < 0 && seq->playhead == 0) { + pause(); + } else if (recording) { if (recording_start != recording_end && seq->playhead >= recording_end) { pause(); } From f84a25fe95db52d5a6bb4ea401ade0112373f626 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 11:56:41 +1100 Subject: [PATCH 059/202] fixed #398 --- effects/internal/paneffect.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/effects/internal/paneffect.cpp b/effects/internal/paneffect.cpp index e50d29612..e76649601 100644 --- a/effects/internal/paneffect.cpp +++ b/effects/internal/paneffect.cpp @@ -9,7 +9,7 @@ #include "ui/collapsiblewidget.h" PanEffect::PanEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { - EffectRow* pan_row = add_row(tr("Pan")); + EffectRow* pan_row = add_row(tr("Pan")); pan_val = pan_row->add_field(EFFECT_FIELD_DOUBLE, "pan"); pan_val->set_double_minimum_value(-100); pan_val->set_double_maximum_value(100); @@ -21,21 +21,23 @@ PanEffect::PanEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { void PanEffect::process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int) { double interval = (timecode_end - timecode_start)/nb_bytes; for (int i=0;iget_double_value(timecode_start+(interval*i), true)*0.01); - qint16 left_sample = (qint16) (((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); - qint16 right_sample = (qint16) (((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); + double pan_field_val = pan_val->get_double_value(timecode_start+(interval*i), true); + double pval = log_volume(qAbs(pan_field_val)*0.01); - if (pval < 0) { + qint16 left_sample = qint16(((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); + qint16 right_sample = qint16(((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); + + if (pan_field_val < 0) { // affect right channel - right_sample *= (1-std::abs(pval)); + right_sample *= (1.0-pval); } else { // affect left channel - left_sample *= (1-pval); + left_sample *= (1.0-pval); } - samples[i+3] = (quint8) (right_sample >> 8); - samples[i+2] = (quint8) right_sample; - samples[i+1] = (quint8) (left_sample >> 8); - samples[i] = (quint8) left_sample; + samples[i+3] = quint8(right_sample >> 8); + samples[i+2] = quint8(right_sample); + samples[i+1] = quint8(left_sample >> 8); + samples[i] = quint8(left_sample); } } From b557979fb8bd45ab49a410096252ca8bd4b21d75 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 12:19:20 +1100 Subject: [PATCH 060/202] fixed #403 --- mainwindow.cpp | 97 ++++++++++++++++++++---------------------- panels/viewer.cpp | 36 ++++++++-------- ui/viewercontainer.cpp | 9 ++-- ui/viewercontainer.h | 3 ++ 4 files changed, 72 insertions(+), 73 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 2ca0470be..060447494 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -80,11 +80,6 @@ void MainWindow::setup_layout(bool reset) { addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); panel_graph_editor->setFloating(true); -// workaround for strange Qt dock bug (see https://bugreports.qt.io/browse/QTBUG-65592) -#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) - resizeDocks({panel_project}, {40}, Qt::Horizontal); -#endif - // load panels from file if (!reset) { QFile panel_config(get_config_path() + "/layout"); @@ -209,22 +204,22 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : } } - // load preferred language from file - QString language_file = external_translation_file.isEmpty() ? - config.language_file : - external_translation_file; + // load preferred language from file + QString language_file = external_translation_file.isEmpty() ? + config.language_file : + external_translation_file; - if (!language_file.isEmpty() - && QFileInfo::exists(language_file)) { - QTranslator* translator = new QTranslator(this); - translator->load(language_file); - QApplication::installTranslator(translator); - } + if (!language_file.isEmpty() + && QFileInfo::exists(language_file)) { + QTranslator* translator = new QTranslator(this); + translator->load(language_file); + QApplication::installTranslator(translator); + } alloc_panels(this); QStatusBar* statusBar = new QStatusBar(this); - statusBar->showMessage(tr("Welcome to %1").arg(appName)); + statusBar->showMessage(tr("Welcome to %1").arg(appName)); setStatusBar(statusBar); setup_menus(); @@ -752,7 +747,7 @@ void MainWindow::setup_menus() { full_screen->setProperty("id", "fullscreen"); full_screen->setCheckable(true); - view_menu->addAction(tr("Full Screen Viewer"), this, SLOT(full_screen_viewer()))->setProperty("id", "fullscreenviewer"); + view_menu->addAction(tr("Full Screen Viewer"), this, SLOT(full_screen_viewer()))->setProperty("id", "fullscreenviewer"); // INITIALIZE PLAYBACK MENU @@ -817,11 +812,11 @@ void MainWindow::setup_menus() { window_sequenceviewer_action->setCheckable(true); window_sequenceviewer_action->setData(reinterpret_cast(panel_sequence_viewer)); - window_menu->addSeparator(); + window_menu->addSeparator(); - window_menu->addAction(tr("Maximize Panel"), this, SLOT(maximize_panel()), QKeySequence("`"))->setProperty("id", "maximizepanel"); + window_menu->addAction(tr("Maximize Panel"), this, SLOT(maximize_panel()), QKeySequence("`"))->setProperty("id", "maximizepanel"); - window_menu->addSeparator(); + window_menu->addSeparator(); window_menu->addAction(tr("Reset to Default Layout"), this, SLOT(reset_layout()))->setProperty("id", "resetdefaultlayout"); @@ -1207,34 +1202,34 @@ void MainWindow::next_cut() { QDockWidget* focused_panel = get_focused_panel(); if (sequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { panel_timeline->next_cut(); - } + } } void MainWindow::maximize_panel() { - // toggles between normal state and a state of one panel being maximized - if (temp_panel_state.isEmpty()) { - // get currently hovered panel - QDockWidget* focused_panel = get_focused_panel(true); + // toggles between normal state and a state of one panel being maximized + if (temp_panel_state.isEmpty()) { + // get currently hovered panel + QDockWidget* focused_panel = get_focused_panel(true); - // if the mouse is in fact hovering over a panel - if (focused_panel != nullptr) { - // store the current state of panels - temp_panel_state = saveState(); + // if the mouse is in fact hovering over a panel + if (focused_panel != nullptr) { + // store the current state of panels + temp_panel_state = saveState(); - // remove all dock widgets (kind of painful having to do each individually) - if (focused_panel != panel_project) removeDockWidget(panel_project); - if (focused_panel != panel_effect_controls) removeDockWidget(panel_effect_controls); - if (focused_panel != panel_timeline) removeDockWidget(panel_timeline); - if (focused_panel != panel_sequence_viewer) removeDockWidget(panel_sequence_viewer); - if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); - } - } else { - // we must be maximized, restore previous state - restoreState(temp_panel_state); + // remove all dock widgets (kind of painful having to do each individually) + if (focused_panel != panel_project) removeDockWidget(panel_project); + if (focused_panel != panel_effect_controls) removeDockWidget(panel_effect_controls); + if (focused_panel != panel_timeline) removeDockWidget(panel_timeline); + if (focused_panel != panel_sequence_viewer) removeDockWidget(panel_sequence_viewer); + if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); + } + } else { + // we must be maximized, restore previous state + restoreState(temp_panel_state); - // clear temp panel state for next maximize call - temp_panel_state.clear(); - } + // clear temp panel state for next maximize call + temp_panel_state.clear(); + } } void MainWindow::preferences() @@ -1249,15 +1244,15 @@ void MainWindow::zoom_in_tracks() { } void MainWindow::zoom_out_tracks() { - panel_timeline->decrease_track_height(); + panel_timeline->decrease_track_height(); } void MainWindow::full_screen_viewer() { - if (get_focused_panel() == panel_footage_viewer) { - panel_footage_viewer->viewer_widget->set_fullscreen(); - } else { - panel_sequence_viewer->viewer_widget->set_fullscreen(); - } + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->viewer_widget->set_fullscreen(); + } else { + panel_sequence_viewer->viewer_widget->set_fullscreen(); + } } void MainWindow::windowMenu_About_To_Be_Shown() { @@ -1643,9 +1638,9 @@ void MainWindow::toggle_panel_visibility() { QDockWidget* w = reinterpret_cast(action->data().value()); w->setVisible(!w->isVisible()); - // layout has changed, we're no longer in maximized panel mode, - // so we clear this byte array - temp_panel_state.clear(); + // layout has changed, we're no longer in maximized panel mode, + // so we clear this byte array + temp_panel_state.clear(); } void MainWindow::set_timecode_view() { diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 47b1a26da..999bb882c 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -587,44 +587,46 @@ long Viewer::get_seq_out() { } void Viewer::setup_ui() { - QWidget* contents = new QWidget(this); + QWidget* contents = new QWidget(); QVBoxLayout* layout = new QVBoxLayout(contents); layout->setSpacing(0); layout->setMargin(0); - viewer_container = new ViewerContainer(contents); + setWidget(contents); + + viewer_container = new ViewerContainer(); viewer_container->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); layout->addWidget(viewer_container); - headers = new TimelineHeader(contents); + headers = new TimelineHeader(); layout->addWidget(headers); - horizontal_bar = new ResizableScrollBar(contents); + horizontal_bar = new ResizableScrollBar(); horizontal_bar->setSingleStep(20); horizontal_bar->setOrientation(Qt::Horizontal); layout->addWidget(horizontal_bar); - QWidget* lower_controls = new QWidget(contents); + QWidget* lower_controls = new QWidget(); QHBoxLayout* lower_control_layout = new QHBoxLayout(lower_controls); lower_control_layout->setMargin(0); // current time code - QWidget* current_timecode_container = new QWidget(lower_controls); + QWidget* current_timecode_container = new QWidget(); QHBoxLayout* current_timecode_container_layout = new QHBoxLayout(current_timecode_container); current_timecode_container_layout->setSpacing(0); current_timecode_container_layout->setMargin(0); - current_timecode_slider = new LabelSlider(current_timecode_container); + current_timecode_slider = new LabelSlider(); lower_control_layout->addWidget(current_timecode_container); - QWidget* playback_controls = new QWidget(lower_controls); + QWidget* playback_controls = new QWidget(); QHBoxLayout* playback_control_layout = new QHBoxLayout(playback_controls); playback_control_layout->setSpacing(0); playback_control_layout->setMargin(0); - go_to_start_button = new QPushButton(playback_controls); + go_to_start_button = new QPushButton(); QIcon goToStartIcon; goToStartIcon.addFile(QStringLiteral(":/icons/prev.png"), QSize(), QIcon::Normal, QIcon::Off); goToStartIcon.addFile(QStringLiteral(":/icons/prev-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -632,7 +634,7 @@ void Viewer::setup_ui() { connect(go_to_start_button, SIGNAL(clicked(bool)), this, SLOT(go_to_in())); playback_control_layout->addWidget(go_to_start_button); - prev_frame_button = new QPushButton(playback_controls); + prev_frame_button = new QPushButton(); QIcon rewindIcon; rewindIcon.addFile(QStringLiteral(":/icons/rew.png"), QSize(), QIcon::Normal, QIcon::Off); rewindIcon.addFile(QStringLiteral(":/icons/rew-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -640,14 +642,14 @@ void Viewer::setup_ui() { connect(prev_frame_button, SIGNAL(clicked(bool)), this, SLOT(previous_frame())); playback_control_layout->addWidget(prev_frame_button); - play_button = new QPushButton(playback_controls); + play_button = new QPushButton(); playIcon.addFile(QStringLiteral(":/icons/play.png"), QSize(), QIcon::Normal, QIcon::On); playIcon.addFile(QStringLiteral(":/icons/play-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); play_button->setIcon(playIcon); connect(play_button, SIGNAL(clicked(bool)), this, SLOT(toggle_play())); playback_control_layout->addWidget(play_button); - next_frame_button = new QPushButton(playback_controls); + next_frame_button = new QPushButton(); QIcon ffIcon; ffIcon.addFile(QStringLiteral(":/icons/ff.png"), QSize(), QIcon::Normal, QIcon::On); ffIcon.addFile(QStringLiteral(":/icons/ff-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -655,7 +657,7 @@ void Viewer::setup_ui() { connect(next_frame_button, SIGNAL(clicked(bool)), this, SLOT(next_frame())); playback_control_layout->addWidget(next_frame_button); - go_to_end_frame = new QPushButton(playback_controls); + go_to_end_frame = new QPushButton(); QIcon nextIcon; nextIcon.addFile(QStringLiteral(":/icons/next.png"), QSize(), QIcon::Normal, QIcon::Off); nextIcon.addFile(QStringLiteral(":/icons/next-disabled.png"), QSize(), QIcon::Disabled, QIcon::Off); @@ -665,21 +667,19 @@ void Viewer::setup_ui() { lower_control_layout->addWidget(playback_controls); - QWidget* end_timecode_container = new QWidget(lower_controls); + QWidget* end_timecode_container = new QWidget(); QHBoxLayout* end_timecode_layout = new QHBoxLayout(end_timecode_container); end_timecode_layout->setSpacing(0); end_timecode_layout->setMargin(0); - end_timecode = new QLabel(end_timecode_container); - end_timecode->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); + end_timecode = new QLabel(); + end_timecode->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter); end_timecode_layout->addWidget(end_timecode); lower_control_layout->addWidget(end_timecode_container); layout->addWidget(lower_controls); - - setWidget(contents); } void Viewer::set_media(Media* m) { diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index d6e3f0dcd..2a30dafbc 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -20,9 +20,6 @@ ViewerContainer::ViewerContainer(QWidget *parent) : horizontal_scrollbar = new QScrollBar(Qt::Horizontal, this); vertical_scrollbar = new QScrollBar(Qt::Vertical, this); - horizontal_scrollbar->setVisible(false); - vertical_scrollbar->setVisible(false); - horizontal_scrollbar->setSingleStep(20); vertical_scrollbar->setSingleStep(20); @@ -112,6 +109,8 @@ void ViewerContainer::adjust() { horizontal_scrollbar->setValue(horizontal_scrollbar->maximum()/2); vertical_scrollbar->setValue(vertical_scrollbar->maximum()/2); + + adjust_scrollbars(); } } else { // if the zoom size is smaller than the available area, scale the surface down @@ -129,7 +128,7 @@ void ViewerContainer::adjust() { } } -void ViewerContainer::resizeEvent(QResizeEvent *event) { +void ViewerContainer::adjust_scrollbars() { horizontal_scrollbar->move(0, height()-horizontal_scrollbar->height()); horizontal_scrollbar->setFixedWidth(qMax(0, width()-vertical_scrollbar->width())); horizontal_scrollbar->setPageStep(width()); @@ -137,7 +136,9 @@ void ViewerContainer::resizeEvent(QResizeEvent *event) { vertical_scrollbar->move(width() - vertical_scrollbar->width(), 0); vertical_scrollbar->setFixedHeight(qMax(0, height()-horizontal_scrollbar->height())); vertical_scrollbar->setPageStep(height()); +} +void ViewerContainer::resizeEvent(QResizeEvent *event) { event->accept(); adjust(); } diff --git a/ui/viewercontainer.h b/ui/viewercontainer.h index e9e54937d..00dfc8fdd 100644 --- a/ui/viewercontainer.h +++ b/ui/viewercontainer.h @@ -24,6 +24,9 @@ public: ViewerWidget* child; void adjust(); + // manually moves scrollbars into the correct position + void adjust_scrollbars(); + protected: void resizeEvent(QResizeEvent *event); From 064d1f229ee2384554a19f14bef4f8de75cb5567 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 12:31:42 +1100 Subject: [PATCH 061/202] reimplemented opacity without blending modes --- io/config.cpp | 6 +++++ io/config.h | 10 ++++++++ main.cpp | 48 +++++++++++++++++++-------------------- mainwindow.cpp | 7 ++---- mainwindow.h | 11 ++++----- project/effect.cpp | 6 ++--- project/effect.h | 2 -- project/effectloaders.cpp | 3 ++- ui/renderfunctions.cpp | 12 ++++++---- ui/renderfunctions.h | 2 -- ui/viewercontainer.cpp | 3 +++ 11 files changed, 60 insertions(+), 50 deletions(-) diff --git a/io/config.cpp b/io/config.cpp index a3f356794..b12e8d010 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -10,6 +10,7 @@ #include "debug.h" Config config; +RuntimeConfig runtime_config; Config::Config() : saved_layout(false), @@ -262,3 +263,8 @@ void Config::save(QString path) { stream.writeEndDocument(); // doc f.close(); } + +RuntimeConfig::RuntimeConfig() : + shaders_are_enabled(true), + disable_blending(false) +{} diff --git a/io/config.h b/io/config.h index ec6d2af89..9c9bf9b7b 100644 --- a/io/config.h +++ b/io/config.h @@ -26,6 +26,7 @@ struct Config { Config(); + bool saved_layout; bool show_track_lines; bool scroll_zooms; @@ -74,6 +75,15 @@ struct Config { void save(QString path); }; +struct RuntimeConfig { + RuntimeConfig(); + + bool shaders_are_enabled; + bool disable_blending; + QString external_translation_file; +}; + extern Config config; +extern RuntimeConfig runtime_config; #endif // CONFIG_H diff --git a/main.cpp b/main.cpp index 48188e2a6..434a62113 100644 --- a/main.cpp +++ b/main.cpp @@ -3,9 +3,7 @@ #include "debug.h" -// importing classes for certain command line args -#include "project/effect.h" -#include "ui/renderfunctions.h" +#include "io/config.h" extern "C" { #include @@ -35,36 +33,36 @@ int main(int argc, char *argv[]) { printf("%s\n", appName.toUtf8().constData()); return 0; } else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { - printf("Usage: %s [options] [filename]\n\n" - "[filename] is the file to open on startup.\n\n" - "Options:\n" - "\t-v, --version\t\tShow version information\n" - "\t-h, --help\t\tShow this help\n" - "\t-f, --fullscreen\tStart in full screen mode\n" - "\t--disable-shaders\tDisable OpenGL shaders (for debugging)\n" - "\t--no-debug\t\tDisable internal debug log and output directly to console\n" - "\t--disable-blend-modes\tDisable shader-based blending for older GPUs\n" - "\t--translation \tSet an external language file to use\n" - "\n", argv[0]); + printf("Usage: %s [options] [filename]\n\n" + "[filename] is the file to open on startup.\n\n" + "Options:\n" + "\t-v, --version\t\tShow version information\n" + "\t-h, --help\t\tShow this help\n" + "\t-f, --fullscreen\tStart in full screen mode\n" + "\t--disable-shaders\tDisable OpenGL shaders (for debugging)\n" + "\t--no-debug\t\tDisable internal debug log and output directly to console\n" + "\t--disable-blend-modes\tDisable shader-based blending for older GPUs\n" + "\t--translation \tSet an external language file to use\n" + "\n", argv[0]); return 0; } else if (!strcmp(argv[i], "--fullscreen") || !strcmp(argv[i], "-f")) { launch_fullscreen = true; } else if (!strcmp(argv[i], "--disable-shaders")) { - shaders_are_enabled = false; + runtime_config.shaders_are_enabled = false; } else if (!strcmp(argv[i], "--no-debug")) { use_internal_logger = false; } else if (!strcmp(argv[i], "--disable-blend-modes")) { - disable_blending = true; - } else if (!strcmp(argv[i], "--translation")) { - if (i + 1 < argc && argv[i + 1][0] != '-') { - // load translation file - external_translation_file = argv[i + 1]; + runtime_config.disable_blending = true; + } else if (!strcmp(argv[i], "--translation")) { + if (i + 1 < argc && argv[i + 1][0] != '-') { + // load translation file + runtime_config.external_translation_file = argv[i + 1]; - i++; - } else { - printf("[ERROR] No translation file specified\n"); - return 1; - } + i++; + } else { + printf("[ERROR] No translation file specified\n"); + return 1; + } } else { printf("[ERROR] Unknown argument '%s'\n", argv[1]); return 1; diff --git a/mainwindow.cpp b/mainwindow.cpp index 060447494..5f756fd4c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -57,9 +57,6 @@ MainWindow* mainWindow; #define DEFAULT_CSS "QPushButton::checked { background: rgb(25, 25, 25); }" #define OLIVE_FILE_FILTER "Olive Project (*.ove)" -// load external translation file -QString external_translation_file; - QTimer autorecovery_timer; QString config_fn; bool demoNoticeShown = false; @@ -205,9 +202,9 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : } // load preferred language from file - QString language_file = external_translation_file.isEmpty() ? + QString language_file = runtime_config.external_translation_file.isEmpty() ? config.language_file : - external_translation_file; + runtime_config.external_translation_file; if (!language_file.isEmpty() && QFileInfo::exists(language_file)) { diff --git a/mainwindow.h b/mainwindow.h index 4ef98ebae..f74655704 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -78,7 +78,7 @@ private slots: void prev_cut(); void next_cut(); - void maximize_panel(); + void maximize_panel(); void reset_layout(); void preferences(); @@ -86,7 +86,7 @@ private slots: void zoom_in_tracks(); void zoom_out_tracks(); - void full_screen_viewer(); + void full_screen_viewer(); void fileMenu_About_To_Be_Shown(); void fileMenu_About_To_Hide(); @@ -207,13 +207,10 @@ private: QString appName; - // used to store the panel state when one panel is maximized - QByteArray temp_panel_state; + // used to store the panel state when one panel is maximized + QByteArray temp_panel_state; }; extern MainWindow* mainWindow; -// load external translation file -extern QString external_translation_file; - #endif // MAINWINDOW_H diff --git a/project/effect.cpp b/project/effect.cpp index 81d686053..59d8b2206 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -17,6 +17,7 @@ #include "mainwindow.h" #include "io/math.h" #include "io/clipboard.h" +#include "io/config.h" #include "transition.h" #include "effects/internal/transformeffect.h" @@ -45,7 +46,6 @@ #include #include -bool shaders_are_enabled = true; QVector effects; Effect* create_effect(Clip* c, const EffectMeta* em) { @@ -627,7 +627,7 @@ void Effect::open() { qWarning() << "Tried to open an effect that was already open"; close(); } - if (shaders_are_enabled && enable_shader) { + if (runtime_config.shaders_are_enabled && enable_shader) { if (QOpenGLContext::currentContext() == nullptr) { qWarning() << "No current context to create a shader program for - will retry next repaint"; } else { @@ -685,7 +685,7 @@ void Effect::startEffect() { open(); qWarning() << "Tried to start a closed effect - opening"; } - if (shaders_are_enabled + if (runtime_config.shaders_are_enabled && enable_shader && glslProgram->isLinked()) { bound = glslProgram->bind(); diff --git a/project/effect.h b/project/effect.h index 22a8213bd..fc045bda9 100644 --- a/project/effect.h +++ b/project/effect.h @@ -34,8 +34,6 @@ struct EffectMeta { int type; int subtype; }; - -extern bool shaders_are_enabled; extern QVector effects; double log_volume(double linear); diff --git a/project/effectloaders.cpp b/project/effectloaders.cpp index e9cee3c69..f5822a0f9 100644 --- a/project/effectloaders.cpp +++ b/project/effectloaders.cpp @@ -6,6 +6,7 @@ #include "panels/panels.h" #include "panels/effectcontrols.h" #include "io/crossplatformlib.h" +#include "io/config.h" #include #include @@ -18,7 +19,7 @@ typedef void (*f0rGetPluginInfo)(f0r_plugin_info_t* info); #endif void load_internal_effects() { - if (!shaders_are_enabled) qWarning() << "Shaders are disabled, some effects may be nonfunctional"; + if (!runtime_config.shaders_are_enabled) qWarning() << "Shaders are disabled, some effects may be nonfunctional"; EffectMeta em; diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index 0e0dfa8d4..aad5d9bbd 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -24,8 +24,6 @@ #include "panels/timeline.h" #include "panels/viewer.h" -bool disable_blending = false; - extern "C" { #include } @@ -95,7 +93,7 @@ void process_effect(Clip* c, if (e->enable_coords) { e->process_coords(timecode, coords, data); } - bool can_process_shaders = (e->enable_shader && shaders_are_enabled); + bool can_process_shaders = (e->enable_shader && runtime_config.shaders_are_enabled); if (can_process_shaders || e->enable_superimpose) { e->startEffect(); if (can_process_shaders && e->is_glsl_linked()) { @@ -489,7 +487,7 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // copy front buffer to back buffer (only if we're using blending modes - which we usually will be) - if (!disable_blending) { + if (!runtime_config.disable_blending) { if (params.nests.size() > 0) { draw_clip(params.ctx, params.nests.last()->fbo[2]->handle(), params.nests.last()->fbo[0]->texture(), true); } else { @@ -506,13 +504,17 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // bind front buffer as draw buffer params.ctx->functions()->glBindFramebuffer(GL_DRAW_FRAMEBUFFER, final_fbo); - if (disable_blending) { + if (runtime_config.disable_blending) { // some GPUs don't like the blending shader, so we provide a pure GL fallback here params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, backend_tex_1); + glColor4f(coords.opacity, coords.opacity, coords.opacity, coords.opacity); + full_blit(); +// glColor4f(1.0, 1.0, 1.0, 1.0); + params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); } else { // load background texture into texture unit 0 diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 1fe238db8..0830d6cb4 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -10,8 +10,6 @@ class QOpenGLShaderProgram; struct Sequence; struct Clip; -extern bool disable_blending; - struct ComposeSequenceParams { Viewer* viewer; QOpenGLContext* ctx; diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index 2a30dafbc..5ae31db03 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -20,6 +20,9 @@ ViewerContainer::ViewerContainer(QWidget *parent) : horizontal_scrollbar = new QScrollBar(Qt::Horizontal, this); vertical_scrollbar = new QScrollBar(Qt::Vertical, this); + horizontal_scrollbar->setVisible(false); + vertical_scrollbar->setVisible(false); + horizontal_scrollbar->setSingleStep(20); vertical_scrollbar->setSingleStep(20); From ce99c8fef0437fef6091dcd66182e79cc3d9fa54 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 12:39:54 +1100 Subject: [PATCH 062/202] fixed #394 --- panels/timeline.cpp | 98 ++++++++++++++++++++++++------------------ ui/renderfunctions.cpp | 2 - 2 files changed, 56 insertions(+), 44 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index d6241668e..1e7b80225 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1426,14 +1426,14 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo } else if (c->get_closing_transition() != nullptr && snap_to_point(c->timeline_out - c->get_closing_transition()->get_true_length(), l)) { return true; - } else { - // try to snap to clip markers - for (int j=0;jmarkers.size();j++) { - if (snap_to_point(c->markers.at(j).frame + c->timeline_in - c->clip_in, l)) { - return true; - } - } - } + } else { + // try to snap to clip markers + for (int j=0;jmarkers.size();j++) { + if (snap_to_point(c->markers.at(j).frame + c->timeline_in - c->clip_in, l)) { + return true; + } + } + } } } } @@ -1441,46 +1441,60 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo } void Timeline::set_marker() { - bool add_marker = !config.set_name_with_marker; - QString marker_name; + // add_marker is used to determine whether we're adding a marker, depending on whether the user input a marker name + // however if (config.set_name_with_marker) is true, we don't need a marker name so we just add + bool add_marker = !config.set_name_with_marker; - std::vector clips_selected; - bool clip_mode = false; + // determine if any clips are selected, and if so add markers to clips rather than the sequence + QVector clips_selected; + bool clip_mode = false; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); - if (c != nullptr && is_clip_selected(c, true)) { - clips_selected.push_back(c); - clip_mode=true; - } - } + for (int i=0;iclips.size();i++) { + Clip* c = sequence->clips.at(i); + if (c != nullptr + && is_clip_selected(c, true) + && sequence->playhead >= c->timeline_in + && sequence->playhead <= c->timeline_out) { + clips_selected.append(c); + clip_mode = true; + } + } - ComboAction* ca = new ComboAction(); + QString marker_name; - if (!add_marker) { - QInputDialog d(this); - d.setWindowTitle(tr("Set Marker")); - d.setLabelText(clip_mode? tr("Set clip marker name:"): tr("Set sequence marker name:")); - d.setInputMode(QInputDialog::TextInput); - add_marker = (d.exec() == QDialog::Accepted); - marker_name = d.textValue(); - } + // if (config.set_name_with_marker) is false (set above), ask for a marker name + if (!add_marker) { + QInputDialog d(this); + d.setWindowTitle(tr("Set Marker")); + d.setLabelText(clip_mode? tr("Set clip marker name:"): tr("Set sequence marker name:")); + d.setInputMode(QInputDialog::TextInput); + add_marker = (d.exec() == QDialog::Accepted); + marker_name = d.textValue(); + } - if (add_marker) { - foreach (Clip* c, clips_selected){ - ca->append(new AddMarkerAction(false, - c, - sequence->playhead - c->timeline_in + c->clip_in, - marker_name)); - } - // if no clips are selected, we're adding a marker to the sequence - if (!clip_mode) { - ca->append(new AddMarkerAction(true, sequence, sequence->playhead, marker_name)); - } + // if we've decided to add a marker + if (add_marker) { + ComboAction* ca = new ComboAction(); - undo_stack.push(ca); - repaint_timeline(); - } + // add an action for each clip + foreach (Clip* c, clips_selected) { + ca->append(new AddMarkerAction(false, + c, + sequence->playhead - c->timeline_in + c->clip_in, + marker_name)); + } + + // if no clips are selected, we're adding a marker to the sequence + if (!clip_mode) { + ca->append(new AddMarkerAction(true, sequence, sequence->playhead, marker_name)); + } + + // push action + undo_stack.push(ca); + + // redraw timeline + repaint_timeline(); + } } void Timeline::toggle_links() { diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index aad5d9bbd..bb8cd863b 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -513,8 +513,6 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { full_blit(); -// glColor4f(1.0, 1.0, 1.0, 1.0); - params.ctx->functions()->glBindTexture(GL_TEXTURE_2D, 0); } else { // load background texture into texture unit 0 From e80fb93ad0557293233a47cdcdb04f3579172297 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 12:47:12 +1100 Subject: [PATCH 063/202] fixed #395 --- playback/playback.cpp | 6 ++---- project/media.cpp | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/playback/playback.cpp b/playback/playback.cpp index 744723c4e..f6757612b 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -69,10 +69,8 @@ void close_clip(Clip* clip, bool wait) { clip->finished_opening = false; // destroy opengl texture in main thread - if (clip->texture != nullptr) { - delete clip->texture; - clip->texture = nullptr; - } + delete clip->texture; + clip->texture = nullptr; for (int i=0;ieffects.size();i++) { if (clip->effects.at(i)->is_open()) clip->effects.at(i)->close(); diff --git a/project/media.cpp b/project/media.cpp index 083da219d..92141ef7e 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -52,8 +52,7 @@ Media::~Media() { case MEDIA_TYPE_FOOTAGE: delete to_footage(); break; case MEDIA_TYPE_SEQUENCE: if (object != nullptr) delete to_sequence(); break; } - if (throbber != nullptr) delete throbber; -// qDeleteAll(children); + delete throbber; } Footage *Media::to_footage() { From f5ae3d88b1419b227c78353faa5e6c4df1ad5154 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 13:03:43 +1100 Subject: [PATCH 064/202] restricted labelsliders to left mouse button --- ui/labelslider.cpp | 132 +++++++++++++++++++++++---------------------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index d83b2b9f7..faef270bd 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -12,17 +12,17 @@ LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) { frame_rate = 30; decimal_places = 1; - drag_start = false; + drag_start = false; drag_proc = false; - min_enabled = false; - max_enabled = false; + min_enabled = false; + max_enabled = false; set_color(); - setCursor(Qt::SizeHorCursor); - internal_value = -1; - set = false; - display_type = LABELSLIDER_NORMAL; + setCursor(Qt::SizeHorCursor); + internal_value = -1; + set = false; + display_type = LABELSLIDER_NORMAL; - set_default_value(0); + set_default_value(0); } void LabelSlider::set_frame_rate(double d) { @@ -35,23 +35,23 @@ void LabelSlider::set_display_type(int type) { } void LabelSlider::set_value(double v, bool userSet) { - set = true; - 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; - } + set = true; + 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(valueToString(internal_value)); - if (userSet) emit valueChanged(); - } + if (userSet) emit valueChanged(); + } } bool LabelSlider::is_set() { - return set; + return set; } bool LabelSlider::is_dragging() { @@ -71,7 +71,7 @@ QString LabelSlider::valueToString(double v) { } double LabelSlider::getPreviousValue() { - return previous_value; + return previous_value; } void LabelSlider::set_previous_value() { @@ -84,11 +84,11 @@ void LabelSlider::set_color(QString c) { } double LabelSlider::value() { - return internal_value; + return internal_value; } void LabelSlider::set_default_value(double v) { - default_value = v; + default_value = v; if (!set) { set_value(v, false); set = false; @@ -96,83 +96,85 @@ void LabelSlider::set_default_value(double v) { } void LabelSlider::set_minimum_value(double v) { - min_value = v; - min_enabled = true; + min_value = v; + min_enabled = true; } void LabelSlider::set_maximum_value(double v) { - max_value = v; - max_enabled = true; + max_value = v; + max_enabled = true; } void LabelSlider::mousePressEvent(QMouseEvent *ev) { - drag_start_value = internal_value; - if (ev->modifiers() & Qt::AltModifier) { - if (internal_value != default_value && !qIsNaN(default_value)) { - set_previous_value(); - set_value(default_value, true); - } - } else { - if (qIsNaN(internal_value)) internal_value = 0; + if (ev->buttons() & Qt::LeftButton) { + drag_start_value = internal_value; + if (ev->modifiers() & Qt::AltModifier) { + if (internal_value != default_value && !qIsNaN(default_value)) { + set_previous_value(); + set_value(default_value, true); + } + } else { + if (qIsNaN(internal_value)) internal_value = 0; - qApp->setOverrideCursor(Qt::BlankCursor); - drag_start = true; - drag_start_x = cursor().pos().x(); - drag_start_y = cursor().pos().y(); - } - emit clicked(); + qApp->setOverrideCursor(Qt::BlankCursor); + drag_start = true; + drag_start_x = cursor().pos().x(); + drag_start_y = cursor().pos().y(); + } + emit clicked(); + } } void LabelSlider::mouseMoveEvent(QMouseEvent* event) { - if (drag_start) { + if (drag_start) { drag_proc = true; - double diff = (cursor().pos().x()-drag_start_x) + (drag_start_y-cursor().pos().y()); - if (event->modifiers() & Qt::ControlModifier) diff *= 0.01; - if (display_type == LABELSLIDER_PERCENT) diff *= 0.01; - set_value(internal_value + diff, true); - cursor().setPos(drag_start_x, drag_start_y); - } + double diff = (cursor().pos().x()-drag_start_x) + (drag_start_y-cursor().pos().y()); + if (event->modifiers() & Qt::ControlModifier) diff *= 0.01; + if (display_type == LABELSLIDER_PERCENT) diff *= 0.01; + set_value(internal_value + diff, true); + cursor().setPos(drag_start_x, drag_start_y); + } } void LabelSlider::mouseReleaseEvent(QMouseEvent*) { - if (drag_start) { - qApp->restoreOverrideCursor(); - drag_start = false; - if (drag_proc) { + if (drag_start) { + qApp->restoreOverrideCursor(); + drag_start = false; + if (drag_proc) { drag_proc = false; previous_value = drag_start_value; - emit valueChanged(); + emit valueChanged(); } else { double d = internal_value; if (display_type == LABELSLIDER_FRAMENUMBER) { QString s = QInputDialog::getText( this, - tr("Set Value"), - tr("New value:"), + tr("Set Value"), + tr("New value:"), QLineEdit::Normal, valueToString(internal_value) ); - if (s.isEmpty()) return; + if (s.isEmpty()) return; d = timecode_to_frame(s, config.timecode_view, frame_rate); // string to frame number } else { - bool ok; + bool ok; d = QInputDialog::getDouble( this, - tr("Set Value"), - tr("New value:"), + tr("Set Value"), + tr("New value:"), (display_type == LABELSLIDER_PERCENT) ? internal_value * 100 : internal_value, (min_enabled) ? min_value : INT_MIN, (max_enabled) ? max_value : INT_MAX, - decimal_places, - &ok + decimal_places, + &ok ); - if (!ok) return; - if (display_type == LABELSLIDER_PERCENT) d *= 0.01; + if (!ok) return; + if (display_type == LABELSLIDER_PERCENT) d *= 0.01; } if (d != internal_value) { - set_previous_value(); + set_previous_value(); set_value(d, true); } } - } + } } From 3b9f2bb4ca0876ef67a46ab4557946540d5a854a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 14:37:27 +1100 Subject: [PATCH 065/202] fixed #390 --- effects/internal/voideffect.cpp | 10 ++++++++++ effects/internal/voideffect.h | 11 +++++++---- mainwindow.h | 4 ++-- panels/viewer.cpp | 1 + project/clip.cpp | 2 +- project/effect.h | 2 +- ui/timelinewidget.cpp | 1 + ui/viewerwindow.cpp | 8 ++++++++ ui/viewerwindow.h | 8 ++++---- 9 files changed, 35 insertions(+), 12 deletions(-) diff --git a/effects/internal/voideffect.cpp b/effects/internal/voideffect.cpp index 70762cff2..867c08bc5 100644 --- a/effects/internal/voideffect.cpp +++ b/effects/internal/voideffect.cpp @@ -18,6 +18,16 @@ VoidEffect::VoidEffect(Clip *c, const QString& n) : Effect(c, nullptr) { EffectRow* row = add_row(tr("Missing Effect"), false, false); row->add_widget(new QLabel(display_name)); container->setText(display_name); + + void_meta.type = EFFECT_TYPE_EFFECT; + meta = &void_meta; +} + +Effect *VoidEffect::copy(Clip *c) { + Effect* copy = new VoidEffect(c, name); + copy->set_enabled(is_enabled()); + copy_field_keyframes(copy); + return copy; } void VoidEffect::load(QXmlStreamReader &stream) { diff --git a/effects/internal/voideffect.h b/effects/internal/voideffect.h index 340030998..0376b6a73 100644 --- a/effects/internal/voideffect.h +++ b/effects/internal/voideffect.h @@ -11,11 +11,14 @@ class VoidEffect : public Effect { public: - VoidEffect(Clip* c, const QString& n); - void load(QXmlStreamReader &stream) override; - void save(QXmlStreamWriter &stream) override; + VoidEffect(Clip* c, const QString& n); + + virtual Effect* copy(Clip* c) override; + virtual void load(QXmlStreamReader &stream) override; + virtual void save(QXmlStreamWriter &stream) override; private: - QByteArray bytes; + QByteArray bytes; + EffectMeta void_meta; }; #endif // VOIDEFFECT_H diff --git a/mainwindow.h b/mainwindow.h index f74655704..bd83a9436 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -42,8 +42,8 @@ public slots: void toggle_bool_action(); protected: - void closeEvent(QCloseEvent *); - void paintEvent(QPaintEvent *event); + virtual void closeEvent(QCloseEvent *) override; + virtual void paintEvent(QPaintEvent *event) override; private slots: void clear_undo_stack(); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 999bb882c..6b014db3b 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -618,6 +618,7 @@ void Viewer::setup_ui() { current_timecode_container_layout->setSpacing(0); current_timecode_container_layout->setMargin(0); current_timecode_slider = new LabelSlider(); + current_timecode_container_layout->addWidget(current_timecode_slider); lower_control_layout->addWidget(current_timecode_container); QWidget* playback_controls = new QWidget(); diff --git a/project/clip.cpp b/project/clip.cpp index 57041333d..e76e162cd 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -227,7 +227,7 @@ double Clip::getMediaFrameRate() { } void Clip::recalculateMaxLength() { - if (sequence != nullptr) { + if (this->sequence != nullptr) { double fr = this->sequence->frame_rate; fr /= speed; diff --git a/project/effect.h b/project/effect.h index fc045bda9..6db358d8e 100644 --- a/project/effect.h +++ b/project/effect.h @@ -165,7 +165,7 @@ public: virtual void refresh(); - Effect* copy(Clip* c); + virtual Effect* copy(Clip* c); void copy_field_keyframes(Effect *e); virtual void load(QXmlStreamReader& stream); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index bf0ee5e55..a3e848631 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1187,6 +1187,7 @@ void TimelineWidget::init_ghosts() { } // used for trim ops + c->recalculateMaxLength(); g.media_length = c->getMaximumLength(); } for (int i=0;iselections.size();i++) { diff --git a/ui/viewerwindow.cpp b/ui/viewerwindow.cpp index d988a86ed..ca4b47c41 100644 --- a/ui/viewerwindow.cpp +++ b/ui/viewerwindow.cpp @@ -3,6 +3,12 @@ #include #include #include +#include +#include + +#include + +#include "mainwindow.h" ViewerWindow::ViewerWindow(QOpenGLContext *share) : QOpenGLWindow(share), @@ -12,6 +18,8 @@ ViewerWindow::ViewerWindow(QOpenGLContext *share) : { fullscreen_msg_timer.setInterval(2000); connect(&fullscreen_msg_timer, SIGNAL(timeout()), this, SLOT(fullscreen_msg_timeout())); + + installEventFilter(mainWindow); } void ViewerWindow::set_texture(GLuint t, double iar, QMutex* imutex) { diff --git a/ui/viewerwindow.h b/ui/viewerwindow.h index cdd099d07..573687736 100644 --- a/ui/viewerwindow.h +++ b/ui/viewerwindow.h @@ -12,11 +12,11 @@ public: ViewerWindow(QOpenGLContext* share); void set_texture(GLuint t, double iar, QMutex *imutex); protected: - void keyPressEvent(QKeyEvent*); - void mousePressEvent(QMouseEvent*); - void mouseMoveEvent(QMouseEvent*); + virtual void keyPressEvent(QKeyEvent*) override; + virtual void mousePressEvent(QMouseEvent*) override; + virtual void mouseMoveEvent(QMouseEvent*) override; private: - void paintGL(); + virtual void paintGL() override; GLuint texture; double ar; QMutex* mutex; From d39d57c1ff3ebddc6e3840ae3ada3a033366e8a5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 14:54:26 +1100 Subject: [PATCH 066/202] change modified status on proxy change --- dialogs/proxydialog.cpp | 2 ++ project/sourcescommon.cpp | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index f190109d8..fd4407027 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -114,6 +114,8 @@ void ProxyDialog::accept() { proxy_generator.queue(info_list.at(i)); } + mainWindow->setWindowModified(true); + QDialog::accept(); } diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index b856fbcd1..0c7f55fcd 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -384,13 +384,17 @@ void SourcesCommon::clear_proxies_from_selected() { if (sequence != nullptr) { // close all clips so we can delete any proxies requested to be deleted closeActiveClips(sequence); + } - // delete proxies requested to be deleted - for (int i=0;iviewer_widget->frame_update(); } + + mainWindow->setWindowModified(true); } From e6db5795a4af3f105c838ced19dd85ec69119ecf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 22:43:21 +1100 Subject: [PATCH 067/202] added missing include --- dialogs/proxydialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index fd4407027..79d4ce142 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -11,6 +11,7 @@ #include "io/proxygenerator.h" #include "project/footage.h" +#include "mainwindow.h" ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : QDialog(parent), From 3f952b4d6d968e6a96e0b48b28460b94b3a583b2 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 23:16:03 +1100 Subject: [PATCH 068/202] added #391 --- dialogs/speeddialog.h | 2 +- io/loadthread.cpp | 2 +- io/loadthread.h | 2 +- panels/effectcontrols.h | 2 +- panels/project.cpp | 4 ++-- panels/project.h | 2 +- panels/timeline.cpp | 24 ++++++++++++++++++------ panels/timeline.h | 2 +- playback/cacher.h | 2 +- playback/playback.h | 2 +- project/clip.cpp | 9 ++++++++- project/clip.h | 8 +++++--- project/effect.h | 2 +- project/footage.h | 2 +- project/sequence.h | 2 +- project/undo.cpp | 4 ++-- project/undo.h | 2 +- ui/keyframeview.h | 2 +- ui/renderfunctions.h | 2 +- ui/timelinewidget.cpp | 9 +++++---- ui/timelinewidget.h | 2 +- ui/viewerwidget.h | 2 +- 22 files changed, 56 insertions(+), 34 deletions(-) diff --git a/dialogs/speeddialog.h b/dialogs/speeddialog.h index 54f903ba3..966232780 100644 --- a/dialogs/speeddialog.h +++ b/dialogs/speeddialog.h @@ -3,7 +3,7 @@ #include -struct Clip; +class Clip; class LabelSlider; class QCheckBox; diff --git a/io/loadthread.cpp b/io/loadthread.cpp index bc771d7b1..39df0c6c6 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -447,7 +447,7 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { m.name = attr.value().toString(); } } - c->markers.append(m); + c->get_markers().append(m); } } } diff --git a/io/loadthread.h b/io/loadthread.h index 3aba462ce..573f27d2b 100644 --- a/io/loadthread.h +++ b/io/loadthread.h @@ -10,7 +10,7 @@ class Media; struct Footage; -struct Clip; +class Clip; struct Sequence; class LoadDialog; struct TransitionData; diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 034d9572e..042b664b2 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -5,7 +5,7 @@ #include #include -struct Clip; +class Clip; class QMenu; class Effect; class TimelineHeader; diff --git a/panels/project.cpp b/panels/project.cpp index cb7e804a4..c71b1ab5a 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -1062,8 +1062,8 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } // save markers - for (int k=0;kmarkers.size();k++) { - save_marker(stream, c->markers.at(k)); + for (int k=0;kget_markers().size();k++) { + save_marker(stream, c->get_markers().at(k)); } stream.writeStartElement("linked"); // linked diff --git a/panels/project.h b/panels/project.h index 0653d7c48..4f2c37aef 100644 --- a/panels/project.h +++ b/panels/project.h @@ -10,7 +10,7 @@ struct Footage; struct Sequence; -struct Clip; +class Clip; class Timeline; class Viewer; class SourceTable; diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 1e7b80225..f195bac02 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1428,8 +1428,8 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo return true; } else { // try to snap to clip markers - for (int j=0;jmarkers.size();j++) { - if (snap_to_point(c->markers.at(j).frame + c->timeline_in - c->clip_in, l)) { + for (int j=0;jget_markers().size();j++) { + if (snap_to_point(c->get_markers().at(j).frame + c->timeline_in - c->clip_in, l)) { return true; } } @@ -1452,14 +1452,26 @@ void Timeline::set_marker() { for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); if (c != nullptr - && is_clip_selected(c, true) - && sequence->playhead >= c->timeline_in - && sequence->playhead <= c->timeline_out) { - clips_selected.append(c); + && is_clip_selected(c, true)) { + + // only add markers if the playhead is inside the clip + if (sequence->playhead >= c->timeline_in + && sequence->playhead <= c->timeline_out) { + clips_selected.append(c); + } + + // we are definitely adding markers to clips though clip_mode = true; + } } + // if we've selected clips but none of the clips are within the playhead, + // nothing to do here + if (clip_mode && clips_selected.size() == 0) { + return; + } + QString marker_name; // if (config.set_name_with_marker) is false (set above), ask for a marker name diff --git a/panels/timeline.h b/panels/timeline.h index 94cf94657..3dbf51eb2 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -31,7 +31,7 @@ class AudioMonitor; class QScrollBar; struct EffectMeta; struct Sequence; -struct Clip; +class Clip; struct Footage; struct FootageStream; diff --git a/playback/cacher.h b/playback/cacher.h index e06939c72..8b1043da1 100644 --- a/playback/cacher.h +++ b/playback/cacher.h @@ -4,7 +4,7 @@ #include #include -struct Clip; +class Clip; class Cacher : public QThread { diff --git a/playback/playback.h b/playback/playback.h index 2758e9ead..591978419 100644 --- a/playback/playback.h +++ b/playback/playback.h @@ -4,7 +4,7 @@ #include #include -struct Clip; +class Clip; struct ClipCache; struct Sequence; struct AVFrame; diff --git a/project/clip.cpp b/project/clip.cpp index e76e162cd..5516f124d 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -147,7 +147,14 @@ void Clip::queue_remove_earliest() { } } av_frame_free(&queue[earliest_frame]); - queue.removeAt(earliest_frame); + queue.removeAt(earliest_frame); +} + +QVector &Clip::get_markers() { + if (media != nullptr && media->get_type() == MEDIA_TYPE_SEQUENCE) { + return media->to_sequence()->markers; + } + return markers; } Transition* Clip::get_opening_transition() { diff --git a/project/clip.h b/project/clip.h index 488045cd1..82d385437 100644 --- a/project/clip.h +++ b/project/clip.h @@ -33,8 +33,8 @@ struct AVFilterContext; struct AVDictionary; class QOpenGLTexture; -struct Clip -{ +class Clip { +public: Clip(Sequence* s); ~Clip(); Clip* copy(Sequence* s, bool duplicate_transitions = true); @@ -76,7 +76,7 @@ struct Clip bool autoscale; // markers - QVector markers; + QVector& get_markers(); // other variables (should be deep copied/duplicated in copy()) QList effects; @@ -136,6 +136,8 @@ struct Clip bool audio_reset; bool audio_just_reset; long audio_target_frame; +private: + QVector markers; }; #endif // CLIP_H diff --git a/project/effect.h b/project/effect.h index 6db358d8e..665cdcedf 100644 --- a/project/effect.h +++ b/project/effect.h @@ -17,7 +17,7 @@ class QGridLayout; class QPushButton; class QMouseEvent; -struct Clip; +class Clip; class QXmlStreamReader; class QXmlStreamWriter; class Effect; diff --git a/project/footage.h b/project/footage.h index 6e5219078..749c3bf86 100644 --- a/project/footage.h +++ b/project/footage.h @@ -16,7 +16,7 @@ enum VideoInterlacingMode { }; struct Sequence; -struct Clip; +class Clip; class PreviewGenerator; class MediaThrobber; diff --git a/project/sequence.h b/project/sequence.h index d3e02504f..e3afc6d36 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -6,7 +6,7 @@ #include "project/marker.h" #include "project/selection.h" -struct Clip; +class Clip; class Transition; class Media; diff --git a/project/undo.cpp b/project/undo.cpp index b4fb804a8..a1473e860 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -814,7 +814,7 @@ AddMarkerAction::AddMarkerAction(bool is_sequence, void* s, long t, QString n) : void AddMarkerAction::undo() { QVector& markers = is_sequence_internal ? static_cast(target)->markers : - static_cast(target)->markers; + static_cast(target)->get_markers(); if (index == -1) { markers.removeLast(); @@ -830,7 +830,7 @@ void AddMarkerAction::redo() { QVector& markers = is_sequence_internal ? static_cast(target)->markers : - static_cast(target)->markers; + static_cast(target)->get_markers(); for (int i=0;i #include -struct Clip; +class Clip; class Effect; class EffectRow; class EffectField; diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 0830d6cb4..176ebd563 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -8,7 +8,7 @@ class Effect; class Viewer; class QOpenGLShaderProgram; struct Sequence; -struct Clip; +class Clip; struct ComposeSequenceParams { Viewer* viewer; diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a3e848631..a3d512125 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1267,8 +1267,8 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { // if the ghost is attached to a clip, snap its markers too if (panel_timeline->trim_target == -1 && g.clip >= 0) { Clip* c = sequence->clips.at(g.clip); - for (int j=0;jmarkers.size();j++) { - long marker_real_time = c->markers.at(j).frame + c->timeline_in - c->clip_in; + for (int j=0;jget_markers().size();j++) { + long marker_real_time = c->get_markers().at(j).frame + c->timeline_in - c->clip_in; fm = marker_real_time + frame_diff; if (panel_timeline->snap_to_timeline(&fm, true, true, true)) { frame_diff = fm - marker_real_time; @@ -2430,8 +2430,8 @@ void TimelineWidget::paintEvent(QPaintEvent*) { } // draw clip markers - for (int j=0;jmarkers.size();j++) { - const Marker& m = clip->markers.at(j); + for (int j=0;jget_markers().size();j++) { + const Marker& m = clip->get_markers().at(j); // convert marker time (in clip time) to sequence time long marker_time = m.frame + clip->timeline_in - clip->clip_in; @@ -2440,6 +2440,7 @@ void TimelineWidget::paintEvent(QPaintEvent*) { draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false, false); } } + p.setBrush(Qt::NoBrush); // draw clip transitions draw_transition(p, clip, clip_rect, text_rect, TA_OPENING_TRANSITION); diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index 863e03cda..4c94a9087 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -12,7 +12,7 @@ #define TRACK_HEIGHT_INCREMENT 10 struct Sequence; -struct Clip; +class Clip; struct FootageStream; class Timeline; class TimelineAction; diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index ce09c790a..90327019f 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -11,7 +11,7 @@ #include class Viewer; -struct Clip; +class Clip; struct FootageStream; class QOpenGLFramebufferObject; class Effect; From f8dec6871bc54cc6d93e8b531433766225020c20 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 23:20:15 +1100 Subject: [PATCH 069/202] skip redundant saving --- panels/project.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index c71b1ab5a..620efb4f3 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -1061,11 +1061,15 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } } - // save markers - for (int k=0;kget_markers().size();k++) { - save_marker(stream, c->get_markers().at(k)); - } + // save markers + // unnecessary for nested sequences since sequences have their own marker saving + if (c->media == nullptr || c->media->get_type() != MEDIA_TYPE_SEQUENCE) { + for (int k=0;kget_markers().size();k++) { + save_marker(stream, c->get_markers().at(k)); + } + } + // save clip links stream.writeStartElement("linked"); // linked for (int k=0;klinked.size();k++) { stream.writeStartElement("link"); // link From 2878706b6922ba4db2a3c7092a4cb8fe5a6500ba Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 2 Feb 2019 23:26:33 +1100 Subject: [PATCH 070/202] fixed potential crash when creating a proxy --- io/proxygenerator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp index 9f54b56a5..ea0497306 100644 --- a/io/proxygenerator.cpp +++ b/io/proxygenerator.cpp @@ -295,8 +295,10 @@ void ProxyGenerator::transcode(const ProxyInfo& info) { info.footage->proxy_path = info.path; qInfo() << "Finished creating proxy for" << info.footage->url; - mainWindow->statusBar()->showMessage(tr("Finished generating proxy for \"%1\"").arg(info.footage->url)); - + QMetaObject::invokeMethod(mainWindow->statusBar(), + "showMessage", + Qt::QueuedConnection, + Q_ARG(QString, tr("Finished generating proxy for \"%1\"").arg(info.footage->url))); } // main proxy generating loop From 6b8c2dbd8607ac8b5191c1de5d2df5ed2916ae3e Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Sat, 2 Feb 2019 15:26:56 +0300 Subject: [PATCH 071/202] Initial Russian translation --- olive.pro | 3 +- ts/olive_ru.ts | 3201 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 3203 insertions(+), 1 deletion(-) create mode 100644 ts/olive_ru.ts diff --git a/olive.pro b/olive.pro index ca8c48050..7e4384ea6 100644 --- a/olive.pro +++ b/olive.pro @@ -250,7 +250,8 @@ TRANSLATIONS += \ ts/olive_de.ts \ ts/olive_es.ts \ ts/olive_fr.ts \ - ts/olive_it.ts + ts/olive_it.ts \ + ts/olive_ru.ts win32 { RC_FILE = packaging/windows/resources.rc diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts new file mode 100644 index 000000000..f06f35dcc --- /dev/null +++ b/ts/olive_ru.ts @@ -0,0 +1,3201 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Исходный код Olive доступен для скачивания на сайте программы. + + + + ActionSearch + + + Search for action... + Найти действие… + + + + Audio + + + Audio + Звук + + + + Recording + Запись + + + + AudioNoiseEffect + + + Amount + Количество + + + + Mix + Смешивание + + + + ChannelLayoutName + + + Invalid + Некорректный + + + + Mono + Моно + + + + Stereo + Стерео + + + + CollapsibleWidget + + + <untitled> + + + + + ColorButton + + + Set Color + Установить цвет + + + + CornerPinEffect + + + Top Left + Вверху слева + + + + Top Right + Вверху справа + + + + Bottom Left + Внизу слева + + + + Bottom Right + Внизу справа + + + + Perspective + Перспектива + + + + DebugDialog + + + Debug Log + Журнал отладки + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + Некорректный эффект + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + В&ырезать + + + + &Copy + &Скопировать + + + + Move &Up + &Поднять + + + + Move &Down + &Опустить + + + + D&elete + &Удалить + + + + EffectControls + + + Effects: + Эффекты: + + + + &Paste + &Вставить + + + + Add Video Effect + Добавить видеоэффект + + + + VIDEO EFFECTS + ВИДЕОЭФФЕКТЫ + + + + Add Video Transition + Добавить видеопереход + + + + Add Audio Effect + Добавить аудиоэффект + + + + AUDIO EFFECTS + АУДИОЭФФЕКТЫ + + + + Add Audio Transition + Добавить аудиопереход + + + + (Multiple clips selected) + (Выделено больше одного клипа) + + + + EffectRow + + + Disable Keyframes + Отключить ключевые кадры + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Отключение приведёт к удалению всех текущих ключевых кадров. Вы уверены? + + + + EmbeddedFileChooser + + + File: + Файл: + + + + ExportDialog + + + Export "%1" + Экспортировать "%1" + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + Постоянная скорость потока + + + + Bitrate (Mbps): + Скорость потока (Мбит/с): + + + + Quality (CRF): + Качество (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + Конечный размер файла (Мб): + + + + Format: + Формат: + + + + Range: + Диапазон: + + + + Entire Sequence + Вся последовательность + + + + In to Out + От входа от выхода + + + + Video + Видео + + + + + Codec: + Кодек: + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Frame Rate: + Частота кадров: + + + + Compression Type: + Тип сжатия: + + + + Sampling Rate: + Частота дискретизации: + + + + Bitrate (Kbps/CBR): + Скорость потока (Кбит/с / CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + Редактор графов + + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + Константа + + + + GraphView + + + Zoom to Selection + Масштабировать в выделение + + + + Zoom to Show All + Масштабировать и показать всё + + + + Reset View + Сбросить масштаб + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + + + + + KeyframeNavigator + + + Enable Keyframes + Включить ключевые кадры + + + + KeyframeView + + + Linear + Линейный + + + + Bezier + Безье + + + + Hold + + + + + LabelSlider + + + + Set Value + Установить значение + + + + + New value: + Новое значение: + + + + LoadDialog + + + Loading... + Загрузка… + + + + Loading '%1'... + Загружается '%1'... + + + + Cancel + Отмена + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Welcome to %1 + + + + + Auto-recovery + Автовосстановление + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Enable/Disable In/Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + &Файл + + + + &New + &Создать + + + + &Open Project + &Открыть проект + + + + Clear Recent List + Очистить список + + + + Open Recent + Открыть недавний + + + + &Save Project + Со&хранить проект + + + + Save Project &As + Сохранить проект &как + + + + &Import... + &Импортировать… + + + + &Export... + &Экспортировать…. + + + + E&xit + В&ыход + + + + &Edit + &Правка + + + + &Undo + &Отменить + + + + Redo + Вернуть + + + + Cu&t + В&ырезать + + + + Cop&y + С&копировать + + + + &Paste + &Вставить + + + + Paste Insert + + + + + Duplicate + Сделать &копию + + + + Delete + Удалить + + + + Ripple Delete + Удалить со сдвигом + + + + Split + Разделить + + + + Select &All + Выд&елить всё + + + + Deselect All + Снять выделение + + + + Add Default Transition + Добавить переход по умолчанию + + + + Link/Unlink + + + + + Enable/Disable + Включить/Отключить + + + + Nest + + + + + Ripple to In Point + Сдвиг до точки входа + + + + Ripple to Out Point + Сдвиг до точки выхода + + + + Edit to In Point + Правка до точки входа + + + + Edit to Out Point + Правка до точки выхода + + + + Delete In/Out Point + Удалить точку входа/выхода + + + + Ripple Delete In/Out Point + Удалить со сдвигом точку входа/выхода + + + + Set/Edit Marker + Установить/Изменить маркер + + + + &View + &Вид + + + + Zoom In + Приблизить + + + + Zoom Out + Отдалить + + + + Increase Track Height + Увеличить высоту дорожки + + + + Decrease Track Height + Уменьшить высоту дорожки + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + По умолчанию + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + Вос&произведение + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Decrease Speed + + + + + Pause + Пауза + + + + Increase Speed + Увеличить скорость + + + + Loop + Петля + + + + &Window + &Окно + + + + Project + Проект + + + + Effect Controls + Управление эффектами + + + + Timeline + Таймлайн + + + + Graph Editor + Редактор графов + + + + Media Viewer + Монитор проекта + + + + Sequence Viewer + Монитор исходников + + + + Maximize Panel + Развернуть панель + + + + Reset to Default Layout + Вернуть исходный вид панелей + + + + &Tools + &Инструменты + + + + Pointer Tool + Указатель + + + + Edit Tool + Выделение + + + + Ripple Tool + Монтаж со сдвигом + + + + Razor Tool + Подрезка + + + + Slip Tool + Прокрутка с совмещением + + + + Slide Tool + Прокрутка + + + + Hand Tool + Навигация + + + + Transition Tool + Переход + + + + Enable Snapping + Включить прилипание + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + Параметры + + + + Clear Undo + + + + + &Help + &Справка + + + + A&ction Search + &Найти команду + + + + Debug Log + Журнал отладки + + + + &About... + &О программе… + + + + <untitled> + + + + + Open Project... + Открыть проект… + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + Вложенная последовательность + + + + Media + + + New Folder + Новая папка + + + + Name: + Название: + + + + Filename: + Имя файла: + + + + Video Dimensions: + Размер кадров: + + + + Frame Rate: + Частота кадров: + + + + %1 fields (%2 frames) + + + + + Interlacing: + + + + + Audio Frequency: + Частота звука: + + + + Audio Channels: + Звуковых каналов: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Название: %1 +Размер кадров: %2x%3 +Частота кадров: %4 +Частота звука: %5 +Звуковые каналы: %6 + + + + Name + Название + + + + Duration + Длительность + + + + Rate + Частота + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 channels + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + Правка "%1" + + + + New Sequence + Новая последовательность + + + + Preset: + Предстановка: + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + Ширина: + + + + Height: + Высота: + + + + Frame Rate: + Частота кадров: + + + + Pixel Aspect Ratio: + Соотношение сторон пикселя: + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + Звук + + + + Sample Rate: + Частота дискретизации: + + + + Name: + Название: + + + + PanEffect + + + Pan + Панорама + + + + Playback + + + Generating Proxy: %1% + Создаётся прокси: %1% + + + + PreferencesDialog + + + Preferences + Параметры + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + Предупреждение + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Language: + Язык: + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + Запись звука: + + + + Mono + Моно + + + + Stereo + Стерео + + + + Effect Textbox Lines: + + + + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + + Use Software Fallbacks When Possible + + + + + General + Общие + + + + Behavior + Поведение + + + + Disable Multithreading on Images + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + Воспроизведение + + + + Output Device: + Устройство выхода: + + + + + Default + По умолчанию + + + + Input Device: + Устройство входа: + + + + Sample Rate: + Частота дискретизации: + + + + Audio + Звук + + + + Search for action or shortcut + Искать действие или комбинацию клавиш + + + + Action + Действие + + + + Shortcut + Комбинация + + + + Import + Импортировать + + + + Export + Экспортировать + + + + Reset Selected + Сбросить выбранное + + + + Reset All + Сбросить все + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Search media, markers, etc. + + + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ProxyDialog + + + Create Proxy + Создать прокси + + + + Proxy + Прокси + + + + Dimensions: + Размер: + + + + Same Size as Source + В размере оригинала + + + + Half Resolution (1/2) + Половина оригинала (1/2) + + + + Quarter Resolution (1/4) + Четверть оригинала (1/4) + + + + Eighth Resolution (1/8) + Восьмая оригинала (1/8) + + + + Sixteenth Resolution (1/16) + Шестнадцатая оригинала (1/16) + + + + Format: + Формат: + + + + ProRes HQ + ProRes HQ + + + + Location: + Размещение: + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + Прокси-файл уже существует + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + Другое размещение + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + Интенсивность + + + + Rotation + Вращение + + + + Frequency + Частота + + + + SolidEffect + + + Type + Тип + + + + Solid Color + Сплошная заливка + + + + SMPTE Bars + + + + + Checkerboard + Шахматная доска + + + + Opacity + Непрозрачность + + + + Color + Цвет + + + + Checkerboard Size + Размер клеток + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + + + + SpeedDialog + + + Speed/Duration + Скорость/длительность + + + + Speed: + Скорость: + + + + Frame Rate: + Частота кадров: + + + + Duration: + Длительность: + + + + Reverse + Реверс + + + + Maintain Audio Pitch + Сохранять высоту тона + + + + Ripple Changes + Изменять со сдвигом + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + Текст + + + + Font + Шрифт + + + + Size + Кегль + + + + Color + Цвет + + + + Alignment + Выравнивание + + + + Left + Слева + + + + + Center + По центру + + + + Right + Справа + + + + Justify + По ширине + + + + Top + Сверху + + + + Bottom + Снизу + + + + Word Wrap + Перенос строки + + + + Outline + Обводка + + + + Outline Color + Цвет обводки + + + + Outline Width + Толщина обводки + + + + Shadow + Тень + + + + Shadow Color + Цвет тени + + + + Shadow Distance + Длина тени + + + + Shadow Softness + Мягкость тени + + + + Shadow Opacity + Непрозрачность тени + + + + Sample Text + Образец текста + + + + &Edit Text + &Изменить текст + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + Link/Unlink + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + + + + + Mix + + + + + TransformEffect + + + Position + Позиция + + + + Scale + Масштаб + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + Непрозрачность + + + + Blend Mode + Режим смешивания + + + + Normal + Обычный + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + Экран + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + Мягкий свет + + + + Hard Light + Жёсткий свет + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + Разница + + + + Exclusion + Исключение + + + + Reflect + Отражение + + + + Substract + Вычитание + + + + Average + Среднее + + + + Glow + Свечение + + + + Negation + + + + + Phoenix + Феникс + + + + Transition + + + Length: + Длительность: + + + + VSTHost + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + From c64fa72f35d939a3ba1e30f93761ba87b7322761 Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Sat, 2 Feb 2019 16:58:54 +0300 Subject: [PATCH 072/202] Updated Russian translation --- ts/olive_ru.ts | 424 ++++++++++++++++++++++++------------------------- 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index f06f35dcc..e2d2ad2e1 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -279,7 +279,7 @@ Invalid codec - + Некорректный кодек @@ -289,7 +289,7 @@ Invalid format - + Некорректный формат @@ -299,12 +299,12 @@ Export Media - + Экспортировать проект Quality-based (Constant Rate Factor) - + Качество (Constant Rate Factor) @@ -491,7 +491,7 @@ Type - + Тип @@ -708,7 +708,7 @@ Welcome to %1 - + Приветствуем в %1 @@ -718,77 +718,77 @@ Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? &Project - + &Проект &Sequence - + П&оследовательность &Folder - + П&апка Set In Point - + Установить точку входа Set Out Point - + Установить точку выхода Enable/Disable In/Out Point - + Переключить точку входа/выхода Reset In Point - + Сбросить точку входа Reset Out Point - + Сбросить точку выхода Clear In/Out Point - + Очистить точку входа/выхода No active sequence - + Нет активных последовательностей Please open the sequence you wish to export. - + Откройте последовательность, которую хотите экспортировать Save Project As... - + Сохранить проект как… Unsaved Project - + Несохранённый проект This project has changed since it was last saved. Would you like to save it before closing? - + Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? @@ -878,7 +878,7 @@ Duplicate - Сделать &копию + Сделать копию @@ -913,7 +913,7 @@ Link/Unlink - + Связать/Убрать связь @@ -988,47 +988,47 @@ Toggle Show All - + Показывать весь проект Track Lines - + Линии дорожек Rectified Waveforms - + Волновая форма от низа Frames - + Кадры Drop Frame - + С пропуском кадров Non-Drop Frame - + Без пропуска кадров Milliseconds - + Миллисекунды Title/Action Safe Area - + Безопасная область Off - + Выкл. @@ -1048,17 +1048,17 @@ Custom - + Другая Full Screen - + Полноэкранный режим Full Screen Viewer - + Монитор в полноэкранном режиме @@ -1068,32 +1068,32 @@ Go to Start - + К началу Previous Frame - + К предыдущему кадру Play/Pause - + Воспроизведение/Пауза Play In to Out - + Проиграть от входа до выхода Next Frame - + К следующему кадру Go to End - + В конец @@ -1108,17 +1108,17 @@ Go to In Point - + К точке входа Go to Out Point - + К точке выхода Decrease Speed - + Уменьшить скорость @@ -1168,7 +1168,7 @@ Sequence Viewer - Монитор исходников + Монитор последовательностей @@ -1258,7 +1258,7 @@ Scroll Wheel Zooms - + Колесо мыши масштабирует таймлайн @@ -1288,27 +1288,27 @@ Enable Hover Focus - + Включить фокус наводкой Ask For Name When Setting Marker - + Спрашивать имя маркера при добавлении No Auto-Scroll - + Без автопрокрутки Page Auto-Scroll - + Прокручивать перелистыванием Smooth Auto-Scroll - + Прокручивать плавно @@ -1318,7 +1318,7 @@ Clear Undo - + Очистить историю изменений @@ -1343,7 +1343,7 @@ <untitled> - + <без названия> @@ -1530,62 +1530,62 @@ Audio Layout: %6 Film 4K - + Кино 4К TV 4K (Ultra HD/2160p) - + TV 4K (Ultra HD/2160p) 1080p - + 1080p 720p - + 720p 480p - + 480p 360p - + 360p 240p - + 240p 144p - + 144p NTSC (480i) - + NTSC (480i) PAL (576i) - + PAL (576i) Custom - + Другое Video - + Видео @@ -1610,17 +1610,17 @@ Audio Layout: %6 Square Pixels (1.0) - + Квадратные пиксели (1.0) Interlacing: - + Чересстрочность: None (Progressive) - + Нет (прогрессивно) @@ -1694,7 +1694,7 @@ Audio Layout: %6 Import Keyboard Shortcuts - + Импортировать клавиатурные комбинации @@ -1715,7 +1715,7 @@ Audio Layout: %6 Export Shortcuts - + Экспортировать клавиатурные комбинации @@ -1740,17 +1740,17 @@ Audio Layout: %6 Custom CSS: - + Свой CSS: Browse - + Просмотр Image sequence formats: - + Форматы изображений: @@ -1775,12 +1775,12 @@ Audio Layout: %6 Thumbnail Resolution: - + Разрешение миниатюр: Waveform Resolution: - + Разрешение волновой формы: @@ -1936,34 +1936,34 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Search media, markers, etc. - + Искать файлы, маркеры и т.д. Project - + Проект Sequence - + Последовательность Replace '%1' - + Заменить '%1' All Files - + Все файлы No active sequence - + Нет активных последовательностей @@ -1983,17 +1983,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Rename '%1' - + Переименовать '%1' Enter new name: - + Введите новое название: Delete media in use? - + Удалить используемые в проекте файлы? @@ -2003,7 +2003,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Skip - + Пропустить @@ -2018,7 +2018,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Import media... - + Импортировать медиафайлы… @@ -2086,7 +2086,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Same as Source (in "%1" folder) - + Как в исходнике (в папке «%1») @@ -2096,7 +2096,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff The file "%1" already exists. Do you wish to replace it? - + Файл «%1» уже существует. Заменить его? @@ -2109,7 +2109,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Finished generating proxy for "%1" - + Завершено создание прокси для "%1" @@ -2117,67 +2117,67 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Replace clips using "%1" - + Заменить клипы данными "%1" Select which media you want to replace this media's clips with: - + Выберите файлы, которые хотите заменить клипы с этими файлами: Keep the same media in-points - + Сохранить существующие точки входа Replace - + Заменить Cancel - + Отмена No media selected - + Файлы не выбраны Please select a media to replace with or click 'Cancel'. - + Выборите файлы для замены или нажмите кнопку «Отмена». Same media selected - + Выбраны те же самые файлы You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Вы выбрали те же файлы, которые хотите заменить. Выберите что-то другое или нажмите кнопку «Отмена». Folder selected - + Папка выбрана You cannot replace footage with a folder. - + Вы не можете заменить видеосъёмку папкой. Active sequence selected - + Выбрана активная последовательность You cannot insert a sequence into itself. - + Вы не можете вставить последовательность в саму себя. @@ -2185,7 +2185,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff %1 (copy) - + %1 (копия) @@ -2221,7 +2221,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SMPTE Bars - + Таблица SMPTE @@ -2249,122 +2249,122 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Import... - + Импортировать… New - + Создать View - + Вид Tree View - + В виде таблицы Icon View - + В виде миниатюр Show Toolbar - + Показывать панель Show Sequences - + Показывать последовательности Replace/Relink Media - + Заменить/пересвязать файлы Reveal in Explorer - + Открыть в Проводнике Reveal in Finder - + Открыть в Finder Reveal in File Manager - + Открыть в файловом менеджере Replace Clips Using This Media - + Заменить клипы с этими файлами Create Sequence With This Media - + Создать последовательность с этими файлами Duplicate - + Создать копию Delete All Clips Using This Media - + Удалить все клипы с этим файлом Proxy - + Прокси Generating proxy: %1% complete - + Создание прокси: завершено на %1% Create/Modify Proxy - + Создать/Изменить прокси Create Proxy - + Создать прокси Modify Proxy - + Изменить прокси Restore Original - + Восстановить оригинал Delete - + Удалить Properties... - + Свойства… Replace Media - + Заменить файлы @@ -2374,7 +2374,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Delete proxy - + Удалить прокси @@ -2547,47 +2547,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timecode - + Тайм-код Sequence - + Последовательность Media - + Файл Scale - + Масштаб Color - + Цвет Background Color - + Цвет фона Background Opacity - + Непрозрачность фона Offset - + Смещение Prepend - + Префикс @@ -2595,17 +2595,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline: - + Таймлайн: <none> - + <нет> Effect already exists - + Эффект уже добавлен @@ -2615,27 +2615,27 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Add - + Добавить Replace - + Заменить Skip - + Пропустить Do this for all conflicts found - + Применить для всех конфликтов Set Marker - + Установить маркер @@ -2650,32 +2650,32 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Title... - + Титры… Solid Color... - + Цветная заливка… Bars... - + Испытательная таблица… Tone... - + Звуковой сигнал… Noise... - + Шум… Unsaved Project - + Несохранённый проект @@ -2690,67 +2690,67 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Pointer Tool - + Указатель Edit Tool - + Выделение Ripple Tool - + Монтаж со сдвигом Razor Tool - + Подрезка Slip Tool - + Прокрутка с совмещением Slide Tool - + Прокрутка Hand Tool - + Навигация Transition Tool - + Переход Snapping - + Прилипание Zoom In - + Приблизить Zoom Out - + Отдалить Record audio - + Записать звук Add title, solid, bars, etc. - + Добавить титры, заливку цветом, испытательную таблицу и т.д. @@ -2804,32 +2804,32 @@ Duration: %4 Title - + Титры Solid Color - + Цветная заливка Bars - + Испытательная таблица Tone - + Звуковой сигнал Noise - + Шум Duration: - + Длительность: @@ -2837,22 +2837,22 @@ Duration: %4 Type - + Тип Frequency - + Частота Amount - + Количество Mix - + Смешать @@ -2870,17 +2870,17 @@ Duration: %4 Uniform Scale - + Сохранять пропорции Rotation - + Вращение Anchor Point - + Точка привязки @@ -2900,27 +2900,27 @@ Duration: %4 Darken - + Замена темным Multiply - + Умножение Color Burn - + Затемнение основы Linear Burn - + Линейное затемнение Lighten - + Замена светлым @@ -2930,47 +2930,47 @@ Duration: %4 Color Dodge - + Осветление основы Linear Dodge (Add) - + Линейное осветление (Добавить) Overlay - + Перекрытие Soft Light - Мягкий свет + Рассеянный свет Hard Light - Жёсткий свет + Направленный свет Vivid Light - + Яркий свет Linear Light - + Линейный свет Pin Light - + Точечный свет Hard Mix - + Жесткое смешение @@ -3005,7 +3005,7 @@ Duration: %4 Negation - + Отрицание @@ -3085,17 +3085,17 @@ Duration: %4 Sequence Viewer - + Монитор последовательностей Media Viewer - + Монитор проекта (none) - + (нет) @@ -3103,57 +3103,57 @@ Duration: %4 Save Frame as Image... - + Сохранить кадр как изображение… Show Fullscreen - + Выйти из полноэкранного режима Disable - + Отключить Screen %1: %2x%3 - + Экран %1: %2×%3 Zoom - + Масштаб Fit - + Уместить Custom - + Другой Close Media - + Закрыть файл Save Frame - + Сохранить кадр Viewer Zoom - + Масштаб просмотра Set Custom Zoom Value: - + Другое значение масштаба: @@ -3161,7 +3161,7 @@ Duration: %4 Exit Fullscreen - + Выйти из полноэкранного режима @@ -3169,12 +3169,12 @@ Duration: %4 (unknown) - + (неизвестно) Missing Effect - + Отсутствующий эффект @@ -3182,7 +3182,7 @@ Duration: %4 Volume - + Громкость @@ -3190,7 +3190,7 @@ Duration: %4 Invalid transition - + Некорректный переход From 2ba093640170181479189fff181e2c5670be1a80 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 01:26:03 +1100 Subject: [PATCH 073/202] fixed #405 --- io/proxygenerator.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp index ea0497306..d09e58e63 100644 --- a/io/proxygenerator.cpp +++ b/io/proxygenerator.cpp @@ -211,8 +211,10 @@ void ProxyGenerator::transcode(const ProxyInfo& info) { // rescale input frame timestamp to output timestamp av_rescale_q(dec_frame->pts, input_fmt_ctx->streams[stream_index]->time_base, output_fmt_ctx->streams[stream_index]->time_base); - // determine if the pix_fmt is different, so if we need to convert - bool convert_pix_fmt = (output_streams.at(stream_index)->pix_fmt != input_streams.at(stream_index)->pix_fmt); + // determine if the pix_fmt, width, and/or height is different, so if we need to convert + bool convert_pix_fmt = (output_streams.at(stream_index)->pix_fmt != input_streams.at(stream_index)->pix_fmt + || output_streams.at(stream_index)->width != input_streams.at(stream_index)->width + || output_streams.at(stream_index)->height != input_streams.at(stream_index)->height); // create reference to the frame to be sent to the encoder AVFrame* enc_frame = dec_frame; From 5f89e6dca93ffbcb0119ffde49369cff024005a6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 01:31:59 +1100 Subject: [PATCH 074/202] change proxy container --- dialogs/proxydialog.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index 79d4ce142..5e646abd7 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -81,7 +81,10 @@ void ProxyDialog::accept() { info.codec_type = 0; info.size_multiplier = size_combobox->currentData().toDouble(); - QString base_footage_fn = QFileInfo(selected_footage.at(i)->url).fileName(); + QString base_footage_fn = QFileInfo(selected_footage.at(i)->url).baseName(); + + // TEMPORARILY hardcoded proxy format + base_footage_fn.append(".mov"); // determine path from input if (custom_location.isEmpty()) { From 134677d77a5533c84a414dd41b6ba470ac098f5a Mon Sep 17 00:00:00 2001 From: alexmitchell Date: Sun, 3 Feb 2019 03:53:33 +1030 Subject: [PATCH 075/202] Simple fix for timecode text dropping too low within background rectangle. Unsure as to why this issue didn't happen at first commit. --- effects/internal/timecodeeffect.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index 7e8299b76..52a1d65c7 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "ui/labelslider.h" #include "ui/collapsiblewidget.h" @@ -93,13 +94,13 @@ void TimecodeEffect::redraw(double timecode) { text_x = offset_x + (width/2) - (text_width/2); text_y = offset_y + height - height/10; - rect_y = text_y + fm.descent()/2 - text_height; + rect_y = text_y + fm.descent() - text_height; path.addText(text_x, text_y, font, display_timecode); p.setPen(Qt::NoPen); p.setBrush(background_color); - p.drawRect(QRect(text_x-fm.descent()/2, rect_y, text_width+fm.descent(), text_height)); + p.drawRect(QRect(text_x-fm.descent(), rect_y, text_width+fm.descent()*2, text_height)); p.setBrush(color_val->get_color_value(timecode)); p.drawPath(path); } From 83c7df53f96730292aa952d0e4f3e5ff0f034c5c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 08:43:47 +1100 Subject: [PATCH 076/202] fixed #411 --- panels/timeline.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index f195bac02..3c12eff7a 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -143,6 +143,9 @@ void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const Q } void Timeline::toggle_show_all() { + if (sequence != nullptr) { + + } showing_all = !showing_all; if (showing_all) { old_zoom = zoom; From 46ed364fca93c1ba167cd39d44ba3a448149fa7a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 08:47:35 +1100 Subject: [PATCH 077/202] actually fixed #411 --- panels/timeline.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 3c12eff7a..d7f83b489 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -144,15 +144,14 @@ void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const Q void Timeline::toggle_show_all() { if (sequence != nullptr) { - - } - showing_all = !showing_all; - if (showing_all) { - old_zoom = zoom; - set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); - } else { - set_zoom_value(old_zoom); - } + showing_all = !showing_all; + if (showing_all) { + old_zoom = zoom; + set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); + } else { + set_zoom_value(old_zoom); + } + } } void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector& media_list) { From f5e1ece2d35c7c9cfdfb3c816f8e61dfdd591294 Mon Sep 17 00:00:00 2001 From: Bob Walter Date: Sun, 3 Feb 2019 02:22:46 +0100 Subject: [PATCH 078/202] Update olive_de.ts - grammar mistakes corrected - unfinished translations completed - new translations added --- ts/olive_de.ts | 261 ++++++++++++++++++++++++------------------------- 1 file changed, 129 insertions(+), 132 deletions(-) diff --git a/ts/olive_de.ts b/ts/olive_de.ts index 56c7282e9..1169c278f 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -6,12 +6,12 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und geschützt durch die GNU GPL. + Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und durch die GNU GPL geschützt. Olive Team is obliged to inform users that Olive source code is available for download from its website. - Das Olive Team is verpflichtet dazu, die Nutzer darüber zu informieren, das der Quellcode von der Webseite heruntergeladen werden kann. + Das Olive Team ist dazu verpflichtet, die Nutzer darüber zu informieren, dass der Quellcode von der Webseite heruntergeladen werden kann. @@ -19,7 +19,7 @@ Search for action... - Suchen nach Aktion... + Nach Aktion suchen... @@ -41,7 +41,8 @@ Amount - Menge + In this case the intensity is meant + Stärke @@ -129,22 +130,22 @@ Welcome to Olive! - Willkommen zu Olive! + Willkommen in Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Wenn Sie für diese Software bezahlt haben, wurden Sie betrogen. + Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Sofern Sie für diese Software bezahlt haben, wurden Sie betrogen. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - Diese Software ist aktuell in einer ALPHA, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen.Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 + Diese Software ist aktuell in einem ALPHA-Stadium, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen. Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 Thank you for trying Olive and we hope you enjoy it! - Danke das Sie Olive ausprobieren! Wir hoffen es gefällt Ihnen! + Danke das Sie Olive ausprobieren, wir hoffen es gefällt Ihnen! @@ -244,7 +245,7 @@ Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? + Ein Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? @@ -280,7 +281,7 @@ Export width and height must both be even numbers/divisible by 2. - Breite und Höhe müssen Zahlen sein die durch 2 teilbar sind. + Breite und Höhe müssen Zahlen sein, die durch 2 teilbar sind. @@ -341,7 +342,7 @@ 0 = verlustfrei (lossless) 17-18 = optisch verlustfrei (komprimiert, aber nicht bemerkbar) 23 = höchste Qualität -51 = kleinstmöglichste Qualität +51 = kleinstmögliche Qualität @@ -395,7 +396,7 @@ Frame Rate: - Bildrate: + Bildfrequenz: @@ -424,12 +425,12 @@ failed to receive packet from encoder (%1) - Fehler beim empfangen des Pakets vom Encoder (%1) + Fehler beim Empfangen des Pakets vom Encoder (%1) could not video encoder for %1 - Video-Encoder für %1 konnte nicht gefunden werden. + Video-Encoder für %1 konnte nicht gefunden werden @@ -454,7 +455,7 @@ could not audio encoder for %1 - Audio-Encoder für %1 konnte nicht gefunden werden. + Audio-Encoder für %1 konnte nicht gefunden werden @@ -464,7 +465,7 @@ could not allocate audio encoding context - + Audio-Encoding-Kontext konnte nicht zugewiesen werden @@ -484,7 +485,7 @@ could not create output format context - + Ausgabe-Format-Kontext konnte nicht erstellt werden @@ -512,12 +513,12 @@ Fill Left with Right - + Linke Seite mit Rechter füllen Fill Right with Left - + Rechte Seite mit Linker füllen @@ -548,8 +549,7 @@ Graph Editor - Same as in english - Graph Editor + Grafischer Editor @@ -566,7 +566,7 @@ Hold - Does this make sense? + Does this make sense? (is a handle button meant?) Halten @@ -575,12 +575,12 @@ Zoom to Selection - In Auswahl zoomen + In die Auswahl zoomen Zoom to Show All - Zommen um alles anzuzeigen + Zommen, um alles anzuzeigen @@ -646,7 +646,7 @@ Set Value - Wert setzen + Wert ändern @@ -678,12 +678,12 @@ Version Mismatch - Unterschiedliche Version + Unterschiedliche Versionen This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatible. Wollen Sie es trotzdem versuchen zu laden? + Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatibel. Wollen Sie trotzdem versuchen, es zu laden? @@ -693,17 +693,18 @@ This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es weiterhin versuchen? + Sounds better in German but has same sense + Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es dennoch versuchen? %1 - Line: %2 Col: %3 - + %1 - Zeile: %2 Spalte: %3 User aborted loading - Nutzer hat Ladevorgang abgebrochen + Ladevorgang durch Nutzer abgebrochen @@ -719,7 +720,7 @@ Project Load Error - + Projektladefehler @@ -737,7 +738,7 @@ Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - Olive wurde nicht richtig geschlossen und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? + Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? @@ -757,32 +758,33 @@ Set In Point - + Also for following translations: Not sure if sense is matched + Anfangspunkt festlegen Set Out Point - + Endpunkt festlegen Enable/Disable In/Out Point - + Anfangs-/Endpunkt aktivieren/deaktiviern Reset In Point - + Anfangspunkt zurücksetzen Reset Out Point - + Endpunkt zurücksetzen Clear In/Out Point - + Anfangs-/Endpunkt löschen @@ -792,7 +794,7 @@ Please open the sequence you wish to export. - Bitte öffnen Sie die Sequenz die Sie exportieren möchten. + Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. @@ -807,7 +809,7 @@ This project has changed since it was last saved. Would you like to save it before closing? - Wollen Sie die Änderungen speichern? + Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? @@ -832,7 +834,7 @@ Open Recent - Zuletzt geöffnet + Zuletzt Verwendete öffnen @@ -928,7 +930,7 @@ Add Default Transition - + Standardübergang einfügen @@ -988,12 +990,12 @@ Zoom In - Einzoomen + Hereinzoomen Zoom Out - Auszoomen + Herauszoomen @@ -1028,12 +1030,14 @@ Drop Frame - + Same word used in German + Drop Frame Non-Drop Frame - + Same word used in German + Non-Drop Frame @@ -1043,7 +1047,7 @@ Title/Action Safe Area - + Sicherer Titelbereich @@ -1053,8 +1057,7 @@ Default - Does not make sense to translate - Default + Standard @@ -1085,7 +1088,7 @@ Go to Start - Gehe zum Start + Zum Start gehen @@ -1101,7 +1104,7 @@ Play In to Out - + Von Anfang bis Ende wiedergeben @@ -1111,27 +1114,27 @@ Go to End - Gehe zum Ende + Zum Ende springen Go to Previous Cut - Gehe zu vorherigem Schnitt + Zum vorherigen Schnitt springen Go to Next Cut - Gehe zum nächsten Schnitt + Zum nächsten Schnitt springen Go to In Point - + Zum Anfangspunkt springen Go to Out Point - + Zum Endpunkt springen @@ -1167,7 +1170,7 @@ Effect Controls - + Effektsteuerung @@ -1178,8 +1181,7 @@ Graph Editor - Same as in english - Graph Editor + Grafischer Editor @@ -1278,7 +1280,8 @@ Scroll Wheel Zooms - + Could be better + Scrollrad zoomt @@ -1314,7 +1317,7 @@ Ask For Name When Setting Marker - Nach Namen fragen wenn Marker gesetzt wird + Nach Namen fragen, wenn Marker gesetzt wird @@ -1355,7 +1358,7 @@ Debug Log Same as in english - Debug Log + Debug-Log @@ -1380,7 +1383,7 @@ The project '%1' no longer exists. Would you like to remove it from the recent projects list? - Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie aus der Liste entfernen? + Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? @@ -1400,7 +1403,7 @@ Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): @@ -1464,7 +1467,7 @@ Frame Rate: %4 Audio Frequency: %5 Audio Layout: %6 Name: %1 -Dimensionen: %2x%3 +Video-Dimensionen: %2x%3 Bildrate: %4 Audiofrequenz: %5 Audio Layout: %6 @@ -1698,17 +1701,17 @@ Audio Layout: %6 Some changed settings will require restarting Olive to take effect - Einige Änderungen erfordern einen Neustart von Olive um angwendet zu werden + Einige Änderungen erfordern einen Neustart von Olive, um angwendet zu werden Confirm Reset All Shortcuts - Bestätige Zurücksetzen aller Shortcuts + Bestätige das Zurücksetzen aller Shortcuts Are you sure you wish to reset all keyboard shortcuts to their defaults? - Sind Sie sicher das Sie alle Tastatur-Shortcuts zurücksetzen wollen? + Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? @@ -1811,19 +1814,21 @@ Audio Layout: %6 Seeking - + Suche Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Genaue Suche +Zeigt immer den richtigen Frame (kann optisch kurzzeitig anhalten, wenn Frame abgefragt wird) Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Schnelle Suche +Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Plaback aus) @@ -1840,7 +1845,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff frames Could also use 'Bilder' - frames + Frames @@ -1851,7 +1856,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Previous Frame Queue: - Vorherige Frame-Warteschleife: + Vorherige Frame-Warteschlange: @@ -1861,7 +1866,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Search for action or shortcut - Suchen nach Eintrag oder Shortcut + Nach Eintrag oder Shortcut suchen @@ -1886,7 +1891,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Reset Selected - Setze ausgewählte zurück + Ausgewählte zurücksetzen @@ -1954,7 +1959,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Sequenz kann nicht sich selbst zugewiesen werden, da es keine Medien enthalten würde. @@ -1969,7 +1974,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Delete media in use? - Benutzte Datei löschen? + Verwendete Datei löschen? @@ -2007,17 +2012,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Replace clips using "%1" - Ersetze Clips using "%1" + Ersetze Clips unter Verwendung von "%1" Select which media you want to replace this media's clips with: - + Wählen Sie, welche Medien mit den Clips dieser Medien ersetzt werden sollen Keep the same media in-points - + Anfangspunkte der Medien behalten @@ -2037,7 +2042,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Please select a media to replace with or click 'Cancel'. - Bitten wählen Sie Medien zum ersetzen aus oder klicken Sie auf 'Abbrechen'. + Bitten wählen Sie Medien zum Ersetzen aus oder klicken Sie auf 'Abbrechen'. @@ -2113,12 +2118,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SMPTE Bars - + SMPTE Farbstreifen Checkerboard - + Schachbrettmuster @@ -2133,7 +2138,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Checkerboard Size - + Größe Schachbrettmuster @@ -2213,7 +2218,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Delete All Clips Using This Media - Alle Clips die diese Medien enthalten löschen + Alle Clips, die diese Medien enthalten löschen @@ -2233,7 +2238,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff You dropped a file onto '%1'. Would you like to replace it with the dropped file? - Sie haben eine Datei auf '%1' gezogen.Möchten Sie diese ersetzen? + Sie haben eine Datei auf '%1' gezogen. Möchten Sie diese ersetzen? @@ -2261,13 +2266,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Reverse - Translation needed? - + Rückwärts Maintain Audio Pitch - Audio Pitch behandeln + Tonhöhe erhalten @@ -2403,8 +2407,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timecode - Makes no sense to translate - Timecode + Zeitstempel @@ -2439,12 +2442,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Offset - + Versatz Prepend - Voranstellen + Voreinstellung @@ -2513,17 +2516,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Bars... - + Balken... Tone... - + Ton... Noise... - + Rauschen... @@ -2533,17 +2536,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff You must save this project before you can record audio in it. - Sie müssen dieses Projekt speichern before Sie Audio aufnehmen können. + Sie müssen das Projekt speichern, bevor Sie Audio aufnehmen können. Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - Klicken Sie auf die Timeline wo Sie mit der Aufnahme beginnen möchten (ziehen um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) + Klicken Sie auf die Timeline, an welcher Stelle Sie mit der Aufnahme beginnen möchten (Ziehen, um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) Pointer Tool - + Pointer-Werkzeug @@ -2589,12 +2592,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Zoom In - Einzommen + Hereinzommen Zoom Out - Auszoomen + Herauszoomen @@ -2604,7 +2607,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Add title, solid, bars, etc. - + Titel, Solid, Balken, etc. Hinzufügen @@ -2656,7 +2659,7 @@ Dauer: %4 Couldn't locate media wrapper for sequence. - Konnte den Medienwrapper für diese Sequenz nicht finden + Konnte den Medienwrapper für diese Sequenz nicht finden. @@ -2671,17 +2674,17 @@ Dauer: %4 Bars - + Balken Tone - + Ton Noise - + Rauschen @@ -2750,8 +2753,7 @@ Dauer: %4 Blend Mode - Would not make sense to translate? - Blend Mode + Mischmodus @@ -2795,53 +2797,51 @@ Dauer: %4 Color Dodge - + Color-Dodge Linear Dodge (Add) - + Addieren Overlay - Makes no sense to translate - Overlay + Überlagern Soft Light - + Weiches Licht Hard Light - + Hartes Licht Vivid Light - + Lebhaftes Licht Linear Light - + Lineares Licht Pin Light - + Scharfes Licht Hard Mix - + Hartes Mischen Difference - Could also be 'Unterschied' Differenz @@ -2857,23 +2857,22 @@ Dauer: %4 Substract - Substrakt + Abziehen Average - Durschnittlich + Durschnitt Glow - Makes no sense to translate - Glow + Leuchten Negation - Negierung + Negativ @@ -2896,7 +2895,7 @@ Dauer: %4 Error loading VST plugin - Fehler beim laden des VST Plugins + Fehler beim Laden des VST Plugins @@ -2906,7 +2905,7 @@ Dauer: %4 Failed to load VST plugin "%1": %2 - Fehler beim laden des VST Plugins "%1":%2 + Fehler beim Laden des VST Plugins "%1":%2 @@ -2937,8 +2936,7 @@ Dauer: %4 Interface - Makes no sense to translate - Interface + Benutzeroberfläche @@ -3001,8 +2999,7 @@ Dauer: %4 Fit - Makes no sense to translate - Fit + Einpassen @@ -3036,7 +3033,7 @@ Dauer: %4 Exit Fullscreen - Vollbildschirm verlassen + Vollbild verlassen @@ -3070,7 +3067,7 @@ Dauer: %4 No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. - Kein Kandidat für Übergang '%1'. Dieser Übergang ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. + Kein Kandidat für den Übergang '%1'. Der Übergang ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen.
From 82ba97f9e5fe237971679997a3a43d48ced93f67 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 15:25:50 +1100 Subject: [PATCH 079/202] czech translation added --- ts/olive_cs.ts | 3172 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3172 insertions(+) create mode 100644 ts/olive_cs.ts diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts new file mode 100644 index 000000000..cb0e1fb41 --- /dev/null +++ b/ts/olive_cs.ts @@ -0,0 +1,3172 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + + + + + ActionSearch + + + Search for action... + Hledat činnost... + + + + Audio + + + Audio + Zvuk + + + + Recording + Nahrávání + + + + AudioNoiseEffect + + + Amount + Množství + + + + Mix + Smíchat + + + + ChannelLayoutName + + + Invalid + Neplatný + + + + Mono + Mono + + + + Stereo + Stereo + + + + CollapsibleWidget + + + <untitled> + <bez názvu> + + + + + ColorButton + + + Set Color + Nastavit barvu + + + + CornerPinEffect + + + Top Left + Nahoře vlevo + + + + Top Right + Nahoře vpravo + + + + Bottom Left + Dole vlevo + + + + Bottom Right + Dole vpravo + + + + Perspective + + + + + DebugDialog + + + Debug Log + Zápis ladění + + + + DemoNotice + + + + Welcome to Olive! + Vítejte v Olive! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + Neplatný efekt + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + Vyjmou&t + + + + &Copy + &Kopírovat + + + + Move &Up + Posunout &nahoru + + + + Move &Down + Posunout &dolu + + + + D&elete + S&mazat + + + + EffectControls + + + Effects: + Efekty: + + + + &Paste + &Vložit + + + + Add Video Effect + Přidat obrazový efekt + + + + VIDEO EFFECTS + OBRAZOVÉ EFEKTY + + + + Add Video Transition + Přidat obrazový přechod + + + + Add Audio Effect + Přidat zvukový efekt + + + + AUDIO EFFECTS + ZVUKOVÉ EFEKTY + + + + Add Audio Transition + Přidat zvukový přechod + + + + (Multiple clips selected) + (vybráno více záběrů) + + + + EffectRow + + + Disable Keyframes + Zakázat klíčové snímky + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + Zákázání klíčových snímků smaže všechny nynější klíčové snímky. Opravdu to chcete udělat? + + + + EmbeddedFileChooser + + + File: + Soubor: + + + + ExportDialog + + + Export "%1" + Vyvést "%1" + + + + Export Failed + Nepodařilo se vyvést + + + + Export failed - %1 + Nepodařilo se vyvést - %1 + + + + Invalid dimensions + Neplatné rozměry + + + + Export width and height must both be even numbers/divisible by 2. + Šířka a výška pro vyvedení musí být sudá čísla dělitelná 2. + + + + Invalid codec + Neplatný kodek + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + Nepodařilo se určit výstupní parametry pro vybraný kodek. Toto je chyba. Spojte se, prosím, s vývojáři. + + + + Invalid format + Neplatný formát + + + + Couldn't determine output format. This is a bug, please contact the developers. + Nepodařilo se určit výstupní formát. Toto je chyba. Spojte se, prosím, s vývojáři. + + + + Export Media + Vyvést záznam + + + + Quality-based (Constant Rate Factor) + Založeno na kvalitě (faktor stálé rychlosti) + + + + Constant Bitrate + Stálý datový tok + + + + Bitrate (Mbps): + Datový tok (MB/s): + + + + Quality (CRF): + Kvalita (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + Faktor kvality: + +0 = bezztrátová +17-18 = beze ztrát na obraze (komprimace, ale nepozorovatelná) +23 = vysoká jakost +51 = nejnižší možná jakost + + + + Target File Size (MB): + Velikost cílového souboru (MB): + + + + Format: + Formát: + + + + Range: + Rozsah: + + + + Entire Sequence + Celá sekvence + + + + In to Out + Vstup do výstupu + + + + Video + Obraz + + + + + Codec: + Kodek: + + + + Width: + Šířka: + + + + Height: + Výška: + + + + Frame Rate: + Snímkování: + + + + Compression Type: + Typ komprese: + + + + Sampling Rate: + Rychlost vzorkování: + + + + Bitrate (Kbps/CBR): + Datový tok (KB/s/stálý datový tok): + + + + ExportThread + + + failed to send frame to encoder (%1) + Chyba při poslání snímku kodéru (%1) + + + + failed to receive packet from encoder (%1) + Chyba při přijetí paketu od kodéru (%1) + + + + could not video encoder for %1 + Nepodařilo se najít kodér obrazu pro %1 + + + + could not allocate video stream + Nepodařilo se přiřadit datový proud obrazu + + + + could not allocate video encoding context + Nepodařilo se přiřadit kontext kódování obrazu + + + + could not open output video encoder (%1) + Nepodařilo se otevřít kodér obrazu (%1) + + + + could not copy video encoder parameters to output stream (%1) + Nepodařilo se kopírovat parametry kodéru obrazu do výstupního proudu (%1) + + + + could not audio encoder for %1 + Nepodařilo se najít kodér zvuku pro %1 + + + + could not allocate audio stream + Nepodařilo se přiřadit datový proud zvuku + + + + could not allocate audio encoding context + Nepodařilo se přiřadit kontext kódování zvuku + + + + could not open output audio encoder (%1) + Nepodařilo se otevřít kodér zvuku (%1) + + + + could not copy audio encoder parameters to output stream (%1) + Nepodařilo se kopírovat parametry kodéru zvuku do výstupního proudu (%1) + + + + could not allocate audio buffer (%1) + Nepodařilo se přiřadit vyrovnávací paměť zvuku (%1) + + + + could not create output format context + Nepodařilo se vytvořit kontext výstupního formátu + + + + could not open output file (%1) + Nepodařilo se otevřít výstupní soubor (%1) + + + + could not write output file header (%1) + Nepodařilo se zapsat hlavičku výstupního souboru (%1) + + + + could not write output file trailer (%1) + Nepodařilo se zapsat ukázku výstupního souboru (%1) + + + + FillLeftRightEffect + + + Type + Typ + + + + Fill Left with Right + Vyplnit levý pravým + + + + Fill Right with Left + Vyplnit pravý levým + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + Nepodařilo se nahrát přídavný modul Frei0r "%1": %2 + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + Poznámka: Nemůžete nahrát 32 bitové přídavné moduly Frei0r do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + Poznámka: Nemůžete nahrát 64 bitové přídavné moduly Frei0r do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. + + + + Error loading Frei0r plugin + Chyba při nahrávání přídavného modulu Frei0r + + + + GraphEditor + + + Graph Editor + Editor grafu + + + + Linear + Lineární + + + + Bezier + Bézier + + + + Hold + Držet + + + + GraphView + + + Zoom to Selection + Přiblížit na výběr + + + + Zoom to Show All + Přiblížit pro ukázání všeho + + + + Reset View + Obnovit výchozí zvětšení + + + + InterlacingName + + + None (Progressive) + Žádný (progresivní) + + + + Top Field First + Nejprve horní pole + + + + Bottom Field First + Nejprve dolní pole + + + + Invalid + Neplatný + + + + KeyframeNavigator + + + Enable Keyframes + Povolit klíčové snímky + + + + KeyframeView + + + Linear + Lineární + + + + Bezier + Bézier + + + + Hold + Držet + + + + LabelSlider + + + + Set Value + Nastavit hodnotu + + + + + New value: + Nová hodnota: + + + + LoadDialog + + + Loading... + Nahrává se... + + + + Loading '%1'... + Nahrává se '%1'... + + + + Cancel + Zrušit + + + + LoadThread + + + Version Mismatch + Rozdílná verze + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + Tento projekt byl uložen v jiné verzi Olive a nemusí být plně slučitelný s touto verzí. Přesto se jej chcete pokusit nahrát? + + + + Invalid Clip Link + Neplatný odkaz na záběr + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + Tento projekt obsahuje neplatný odkaz na záběr. Tento může být poškozen. Chcete pokračovat v jeho nahrávání? + + + + %1 - Line: %2 Col: %3 + %1 - Řádek: %2 Sloupec: %3 + + + + User aborted loading + Uživatelem přerušené nahrávání + + + + XML Parsing Error + Chyba při zpracování XML + + + + Couldn't load '%1'. %2 + Nepodařilo se nahrát '%1'. %2 + + + + Project Load Error + Chyba při nahrávání projektu + + + + Error loading project: %1 + Chyba při nahrávání projektu: %1 + + + + MainWindow + + + Welcome to %1 + Vítejte v %1 + + + + Auto-recovery + Automatické obnovení + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive nebyl zavřen řádně a byl zjištěn soubor pro automatické obnovení. Chcete jej otevřít? + + + + &Project + &Projekt + + + + &Sequence + &Sekvence + + + + &Folder + &Složka + + + + Set In Point + Nastavit bod začátku + + + + Set Out Point + Nastavit bod konce + + + + Enable/Disable In/Out Point + Povolit/Zakázat bod začátku/konce + + + + Reset In Point + Obnovit výchozí bod začátku + + + + Reset Out Point + Obnovit výchozí bod konce + + + + Clear In/Out Point + Vymazat bod začátku/konce + + + + No active sequence + Žádná činná sekvence + + + + Please open the sequence you wish to export. + Otevřete, prosím, sekvence, již chcete vyvést. + + + + Save Project As... + Uložit projekt jako... + + + + Unsaved Project + Neuložený projekt + + + + This project has changed since it was last saved. Would you like to save it before closing? + Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? + + + + &File + &Soubor + + + + &New + &Nový + + + + &Open Project + &Otevřít projekt + + + + Clear Recent List + Vyprázdnit seznam naposledy otevřených souborů + + + + Open Recent + Otevřít nedávné + + + + &Save Project + &Uložit projekt + + + + Save Project &As + Uložit projekt j&ako + + + + &Import... + &Zavést... + + + + &Export... + &Vyvést... + + + + E&xit + &Ukončit + + + + &Edit + Úp&ravy + + + + &Undo + &Zpět + + + + Redo + Znovu + + + + Cu&t + Vyjmou&t + + + + Cop&y + &Kopírovat + + + + &Paste + &Vložit + + + + Paste Insert + Vložit vložku + + + + Duplicate + Zdvojit + + + + Delete + Smazat + + + + Ripple Delete + Vytáhnout + + + + Split + Rozdělit + + + + Select &All + Vybrat &vše + + + + Deselect All + Zrušit výběr všeho + + + + Add Default Transition + Přidat výchozí přechod + + + + Link/Unlink + Spojit/Oddělit + + + + Enable/Disable + Povolit/Zakázat + + + + Nest + Vnořovat + + + + Ripple to In Point + Vložit a posunout k bodu začátku + + + + Ripple to Out Point + Vložit a posunout k bodu konce + + + + Edit to In Point + Upravit po bod začátku + + + + Edit to Out Point + Upravit po bod konce + + + + Delete In/Out Point + Smazat bod začátku/konce + + + + Ripple Delete In/Out Point + Vytáhnout bod začátku/konce + + + + Set/Edit Marker + Nastavit/Upravit značku + + + + &View + &Pohled + + + + Zoom In + Přiblížit + + + + Zoom Out + Oddálit + + + + Increase Track Height + Zvětšit výšku stopy + + + + Decrease Track Height + Zmenšit výšku stopy + + + + Toggle Show All + Přepnout ukázání všeho + + + + Track Lines + Řádky stop + + + + Rectified Waveforms + Vyspravené vlny + + + + Frames + Snímky + + + + Drop Frame + Zahodit snímek + + + + Non-Drop Frame + Nezahodit snímek + + + + Milliseconds + Milisekundy + + + + Title/Action Safe Area + + + + + Off + Vypnuto + + + + Default + Výchozí + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + Vlastní + + + + Full Screen + Celá obrazovka + + + + Full Screen Viewer + Prohlížeč na celou obrazovku + + + + &Playback + &Přehrávání + + + + Go to Start + Jít na začátek + + + + Previous Frame + Předchozí snímek + + + + Play/Pause + Přehrát/Pozastavit + + + + Play In to Out + Přehrát začátek po konec + + + + Next Frame + Další snímek + + + + Go to End + Jít na konec + + + + Go to Previous Cut + Jít na předchozí záběr + + + + Go to Next Cut + Jít na další záběr + + + + Go to In Point + Jít na bod začátku + + + + Go to Out Point + Jít na bod konce + + + + Decrease Speed + Snížit rychlost + + + + Pause + Pozastavit + + + + Increase Speed + Zvýšit rychlost + + + + Loop + Smyčka + + + + &Window + &Okno + + + + Project + Projekt + + + + Effect Controls + Ovládání efektů + + + + Timeline + Časová osa + + + + Graph Editor + Editor grafu + + + + Media Viewer + Prohlížeč záznamu + + + + Sequence Viewer + Prohlížeč řady + + + + Maximize Panel + Zvětšit panel + + + + + Reset to Default Layout + Obnovit výchozí rozvržení + + + + &Tools + &Nástroje + + + + Pointer Tool + Nástroj ukazovátka + + + + Edit Tool + Nástroj pro úpravy + + + + Ripple Tool + Nástroj pro vložení a posunutí + + + + Razor Tool + Nástroj břitvy + + + + Slip Tool + Nástroj pro sklouznutí + + + + Slide Tool + Nástroj pro sklouznutí + + + + Hand Tool + Nástroj ručičky + + + + Transition Tool + Nástroj pro přechod + + + + Enable Snapping + Povolit přichytávání + + + + Selecting Also Seeks + Výběr také vyhledává + + + + Edit Tool Also Seeks + Nástroj pro úpravy také vyhledává + + + + Edit Tool Selects Links + Nástroj pro úpravy vybírá odkazy + + + + Seek Also Selects + Vyhledávání také vybírá + + + + Seek to the End of Pastes + Vyhledávat po konec vložení + + + + Scroll Wheel Zooms + Posunovací kolečko myši přibližuje + + + + Enable Drag Files to Timeline + Povolit tažení souborů na časovou osu + + + + Auto-Scale By Default + Automaticky měnit velikost + + + + Enable Seek to Import + Povolit vyhledávání k zavedení + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + Povolit upuštění na záznam pro nahrazení + + + + Enable Hover Focus + Povolit zaměření při přejetí + + + + Ask For Name When Setting Marker + Požádat o název při nastavení značky + + + + No Auto-Scroll + Žádné automatické projíždění + + + + Page Auto-Scroll + Stránkové automatické projíždění + + + + Smooth Auto-Scroll + Jemné automatické projíždění + + + + Preferences + Nastavení + + + + Clear Undo + Vyprázdnit minulost kroků zpět + + + + &Help + Nápo&věda + + + + A&ction Search + Hledání č&inností + + + + Debug Log + Zápis ladění + + + + &About... + &O programu... + + + + <untitled> + <bez názvu> + + + + Open Project... + Otevřít projekt... + + + + Missing recent project + Chybí nedávný projekt + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? + + + + Invalid aspect ratio + Neplatný poměr stran + + + + The aspect ratio '%1' is invalid. Please try again. + Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. + + + + Enter custom aspect ratio + Zadat vlastní poměr stran + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + Zadejte poměr stran k použití pro název/bezpečná oblast činnosti (např. 16:9): + + + + Nested Sequence + Vnořená řada + + + + Media + + + New Folder + Nová složka + + + + Name: + Název: + + + + Filename: + Název souboru: + + + + Video Dimensions: + Rozměry obrazu: + + + + Frame Rate: + Snímkování: + + + + %1 fields (%2 frames) + %1 polí (%2 snímků) + + + + Interlacing: + Prokládání: + + + + Audio Frequency: + Kmitočet zvuku: + + + + Audio Channels: + Zvukové kanály: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + Název: %1 +Rozměry obrazu: %2x%3 +Snímkování: %4 +Kmitočet zvuku: %5 +Rozložení zvuku: %6 + + + + Name + Název + + + + Duration + Doba trvání + + + + Rate + Rychlost + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" Vlastnosti + + + + Tracks: + Stopy: + + + + Video %1: %2x%3 %4FPS + Obraz %1: %2x%3 %4 FPS + + + + Audio %1: %2Hz %3 channels + Zvuk %1: %2Hz %3 kanálů + + + + Conform to Frame Rate: + Odpovídá snímkování: + + + + Alpha is Premultiplied + Alfa je předznásobena + + + + Auto (%1) + Auto (%1) + + + + Interlacing: + Prokládání: + + + + Name: + Název: + + + + NewSequenceDialog + + + Editing "%1" + Upravení "%1" + + + + New Sequence + Nová řada + + + + Preset: + Přednastavení: + + + + Film 4K + Film 4K + + + + TV 4K (Ultra HD/2160p) + TV 4K (Ultra HD/2160p) + + + + 1080p + 1080p + + + + 720p + 720p + + + + 480p + 480p + + + + 360p + 360p + + + + 240p + 240p + + + + 144p + 144p + + + + NTSC (480i) + NTSC (480i) + + + + PAL (576i) + PAL (576i) + + + + Custom + Vlastní + + + + Video + Obraz + + + + Width: + Šířka: + + + + Height: + Výška: + + + + Frame Rate: + Snímkování: + + + + Pixel Aspect Ratio: + Poměr stran pixelu: + + + + Square Pixels (1.0) + Čtvercové pixely (1.0) + + + + Interlacing: + Prokládání: + + + + None (Progressive) + Žádné (progresivní) + + + + Audio + Zvuk + + + + Sample Rate: + Vzorkovací kmitočet: + + + + Name: + Název: + + + + PanEffect + + + Pan + Vyvážení + + + + PreferencesDialog + + + Preferences + Nastavení + + + + Invalid CSS File + Neplatný soubor CSS + + + + CSS file '%1' does not exist. + Soubor CSS '%1' neexistuje. + + + + Warning + Varování + + + + Some changed settings will require restarting Olive to take effect + Některá změněná nastavení budou, aby se projevila, vyžadovat opětovné spuštění Olive + + + + Confirm Reset All Shortcuts + Potvrdit obnovení výchozího nastavení všech klávesových zkratek + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + Jste si jistý, že chcete vrátit nastavení všech klávesových zkratek do jejich výchozího stavu? + + + + Import Keyboard Shortcuts + Zavést klávesové zkratky + + + + + Error saving shortcuts + Chyba při ukládání klávesových zkratek + + + + Failed to open file for reading + Soubor se nepodařilo otevřít pro čtení + + + + Export Keyboard Shortcuts + Vyvést klávesové zkratky + + + + Export Shortcuts + Vyvést zkratky + + + + Shortcuts exported successfully + Zkratky úspěšně vyvedeny + + + + Failed to open file for writing + Soubor se nepodařilo otevřít pro zápis + + + + Browse for CSS file + Hledat soubor CSS + + + + Language: + Jazyk: + + + + Custom CSS: + Vlastní CSS: + + + + Browse + Procházet + + + + Image sequence formats: + Formáty obrázkové řady: + + + + Audio Recording: + Nahrávání zvuku: + + + + Mono + Mono + + + + Stereo + Stereo + + + + Effect Textbox Lines: + Řádky textového pole efektu: + + + + Thumbnail Resolution: + Rozlišení náhledu: + + + + Waveform Resolution: + Rozlišení tvaru vlny: + + + + Use Software Fallbacks When Possible + Zajištění skrze softwarovou zálohu + + + + General + Obecné + + + + Behavior + Chování + + + + Disable Multithreading on Images + Zakázat vytvoření více vláken v jednom procesu na obrázky + + + + Seeking + Vyhledávání + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + Přesné vyhledávání +Vždy ukazovat správný snímek (obraz se při získávání správného snímku může na krátkou dobu pozastavit) + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + Rychlé vyhledávání +Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - neovlivňuje přehrávání/vyvádění) + + + + Memory Usage + Využití paměti + + + + Upcoming Frame Queue: + Nadcházející řada snímků: + + + + + frames + snímků + + + + + seconds + sekund + + + + Previous Frame Queue: + Předchozí řada snímků: + + + + Playback + Přehrávání + + + + Output Device: + Výstupní zařízení: + + + + + Default + Výchozí + + + + Input Device: + Vstupní zařízení: + + + + Sample Rate: + Vzorkovací kmitočet: + + + + Audio + Zvuk + + + + Search for action or shortcut + Hledat činnosti nebo klávesové zkratky + + + + Action + Činnost + + + + Shortcut + Zkratka + + + + Import + Zavést + + + + Export + Vyvést + + + + Reset Selected + Obnovit výchozí hodnotu u vybraného + + + + Reset All + Obnovit výchozí hodnotu u všeho + + + + Keyboard + Klávesnice + + + + PreviewGenerator + + + Could not open file - %1 + Nepodařilo se otevřít soubor - %1 + + + + Could not find stream information - %1 + Nepodařilo se najít údaje o proudu - %1 + + + + Project + + + Search media, markers, etc. + Hledat záznam, značky atd. + + + + Project + Projekt + + + + Sequence + Řada + + + + Replace '%1' + Nahradit '%1' + + + + + All Files + Všechny soubory + + + + + No active sequence + Žádná činná řada + + + + No sequence is active, please open the sequence you want to replace clips from. + Žádná řada není činná. Otevřete, prosím, řadu, ve které chcete nahradit záběry. + + + + Active sequence selected + Vybrána činná řada + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + Sekvenci nemůžete vložit do ní samé, aby žádné záběry z tohoto záznamu nebyly v této sekvenci. + + + + Rename '%1' + Přejmenovat '%1' + + + + Enter new name: + Zadat nový název: + + + + Delete media in use? + Smazat používaný záznam? + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + Záznam '%1' se nyní používá v '%2'. Jeho smazání odstraní všechny instance v řadě. Opravdu to chcete udělat? + + + + Skip + Přeskočit + + + + Image sequence detected + Zjištěna obrázková řada + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + Soubor '%1' se zdá být součástí obrázkové řady. Chcete ji zavést jako takovou? + + + + Import media... + Zavést záznam... + + + + No sequence is active, please open the sequence you want to delete clips from. + Žádná řada není činná. Otevřete, prosím, řadu, ve které chcete smazat záběry. + + + + ProxyDialog + + + Create Proxy + Vytvořit proxy + + + + Proxy + Proxy + + + + Dimensions: + Rozměry: + + + + Same Size as Source + Stejná velikost jako zdroj + + + + Half Resolution (1/2) + Poloviční rozlišení (1/2) + + + + Quarter Resolution (1/4) + Čtvrtinové rozlišení (1/4) + + + + Eighth Resolution (1/8) + Osminové rozlišení (1/8) + + + + Sixteenth Resolution (1/16) + Šestnáctinové rozlišení (1/16) + + + + Format: + Formát: + + + + ProRes HQ + ProRes HQ + + + + ProRes SQ + ProRes SQ + + + + ProRes LT + ProRes LT + + + + DNxHD + DNxHD + + + + H.264 + H.264 + + + + Location: + Umístění: + + + + Same as Source (in "%1" folder) + Stejné jako zdroj (ve složce "%1") + + + + Custom Location + Vlastní umístění + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + Nahradit záběry pomocí "%1" + + + + Select which media you want to replace this media's clips with: + Vyberte, kterým záznamem chcete nahradit záběry tohoto záznamu: + + + + Keep the same media in-points + Zachovat stejné začáteční body záznamu + + + + Replace + Nahradit + + + + Cancel + Zrušit + + + + No media selected + Nevybrán žádný záznam + + + + Please select a media to replace with or click 'Cancel'. + Vyberte, prosím, záznam k nahrazení nebo klepněte na Zrušit. + + + + Same media selected + Vybrán stejný záznam + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + Vybral jste stejný záznam, jejž chcete nahradit. Vyberte, prosím, jiný nebo klepněte na Zrušit. + + + + Folder selected + Složka vybrána + + + + You cannot replace footage with a folder. + Záběry nemůžete nahradit složkou. + + + + Active sequence selected + Vybrána činná řada + + + + You cannot insert a sequence into itself. + Nemůžete vložit řadu do ní samé. + + + + Sequence + + + %1 (copy) + %1 (kopírovat) + + + + ShakeEffect + + + Intensity + Síla + + + + Rotation + Otočení + + + + Frequency + Kmitočet + + + + SolidEffect + + + Type + Typ + + + + Solid Color + Plná barva + + + + SMPTE Bars + Pruhy SMPTE + + + + Checkerboard + Šachovnice + + + + Opacity + Neprůhlednost + + + + Color + Barva + + + + Checkerboard Size + Velikost šachovnice + + + + SourcesCommon + + + Import... + Zavést... + + + + New + Nový + + + + View + Pohled + + + + Tree View + Stromový pohled + + + + Icon View + Pohled s ikonami + + + + Show Toolbar + Ukázat nástrojový pruh + + + + Show Sequences + Ukázat řady + + + + Replace/Relink Media + Nahradit/Znovuspojit záznamy + + + + Reveal in Explorer + Ukázat v průzkumníku + + + + Reveal in Finder + Ukázat v hledači + + + + Reveal in File Manager + Ukázat ve správci souborů + + + + Replace Clips Using This Media + Nahradit záběry pomocí tohoto záznamu + + + + Create Sequence With This Media + Vytvořit řadu pomocí tohoto záznamu + + + + Duplicate + Zdvojit + + + + Delete All Clips Using This Media + Smazat všechny záběry pomocí tohoto záznamu + + + + Proxy + Proxy + + + + Create Proxy + Vytvořit proxy + + + + Delete + Smazat + + + + Properties... + Vlastnosti... + + + + Replace Media + Nahradit záznam + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + Upustil jste soubor na '%1'. Chcete jej nahradit upuštěným souborem? + + + + SpeedDialog + + + Speed/Duration + Rychlost/Doba trvání + + + + Speed: + Rychlost: + + + + Frame Rate: + Snímkování: + + + + Duration: + Doba trvání: + + + + Reverse + Obrátit + + + + Maintain Audio Pitch + Udržovat výšku tónu zvuku + + + + Ripple Changes + Změny vytažení + + + + TextEditDialog + + + Edit Text + Upravit text + + + + TextEffect + + + Text + Text + + + + Font + Písmo + + + + Size + Velikost + + + + Color + Barva + + + + Alignment + Zarovnání + + + + Left + Vlevo + + + + + Center + Na střed + + + + Right + Vpravo + + + + Justify + Do bloku + + + + Top + Nahoře + + + + Bottom + Dole + + + + Word Wrap + Zalamování slov + + + + Outline + Obrys + + + + Outline Color + Barva obrysu + + + + Outline Width + Šířka obrysu + + + + Shadow + Stín + + + + Shadow Color + Barva stínu + + + + Shadow Distance + Vzdálenost stínu + + + + Shadow Softness + Měkkost stínu + + + + Shadow Opacity + Neprůhlednost stínu + + + + Sample Text + Text příkladu + + + + &Edit Text + &Upravit text + + + + TimecodeEffect + + + Timecode + Časový kód + + + + Sequence + Řada + + + + Media + Záznamy + + + + Scale + Měřítko + + + + Color + Barva + + + + Background Color + Barva pozadí + + + + Background Opacity + Neprůhlednost pozadí + + + + Offset + Posun + + + + Prepend + Uvést na začátku + + + + Timeline + + + Timeline: + Časová osa: + + + + <none> + <žádná> + + + + Effect already exists + Efekt již existuje + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? + + + + Add + Přidat + + + + Replace + Nahradit + + + + Skip + Přeskočit + + + + Do this for all conflicts found + Použít na všechny nalezené střety + + + + Set Marker + Nastavit značku + + + + Set marker name: + Nastavit název značky: + + + + Title... + Název... + + + + Solid Color... + Plná barva... + + + + Bars... + Takty... + + + + Tone... + Tón... + + + + Noise... + Šum... + + + + Unsaved Project + Neuložený projekt + + + + You must save this project before you can record audio in it. + Musíte tento projekt uložit, předtím než do něj můžete nahrát zvuk. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + Klepněte na časovou osu, kde chcete začít s nahráváním (táhněte pro omezení nahrávky na určitý časový snímek) + + + + Pointer Tool + Nástroj ukazovátka + + + + Edit Tool + Nástroj pro úpravy + + + + Ripple Tool + Nástroj pro vložení a posunutí + + + + Razor Tool + Nástroj břitvy + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + Nástroj ručičky + + + + Transition Tool + Nástroj pro přechod + + + + Snapping + Přichytávání + + + + Zoom In + Přiblížit + + + + Zoom Out + Oddálit + + + + Record audio + Nahrát zvuk + + + + Add title, solid, bars, etc. + Přidat název, plný, takty atd. + + + + TimelineHeader + + + Center Timecodes + Vystředit časové kódy + + + + TimelineWidget + + + Link/Unlink + Spojit/Oddělit + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +Začátek: %2 +Konec: %3 +Doba trvání: %4 + + + + Rename '%1' + Přejmenovat '%1' + + + + Rename multiple clips + Přejmenovat více záběrů + + + + Enter a new name for this clip: + zadejte nový název pro tento záběr: + + + + Error + Chyba + + + + Couldn't locate media wrapper for sequence. + Nepodařilo se najít obal záznamu pro tuto řadu. + + + + Title + Název + + + + Solid Color + Plná barva + + + + Bars + Takty + + + + Tone + Tón + + + + Noise + Šum + + + + Duration: + Doba trvání: + + + + ToneEffect + + + Type + Typ + + + + Frequency + Kmitočet + + + + Amount + Množství + + + + Mix + Směs + + + + TransformEffect + + + Position + Poloha + + + + Scale + Měřítko + + + + Uniform Scale + Jednotné měřítko + + + + Rotation + Otočení + + + + Anchor Point + Bod ukotvení + + + + Opacity + Neprůhlednost + + + + Blend Mode + Režim splynutí + + + + Normal + Normální + + + + Darken + Ztmavit + + + + Multiply + Znásobit + + + + Color Burn + Vypálení barvy + + + + Linear Burn + Přímé vypálení + + + + Lighten + Vypálit + + + + Screen + Obrazovka + + + + Color Dodge + Uskočení barvy + + + + Linear Dodge (Add) + Lineární uskočení (Přidat) + + + + Overlay + Překrytí + + + + Soft Light + Tlumené světlo + + + + Hard Light + Ostré světlo + + + + Vivid Light + Jasné světlo + + + + Linear Light + Přímé světlo + + + + Pin Light + Připíchnout světlo + + + + Hard Mix + Tvrdá směs + + + + Difference + Rozdíl + + + + Exclusion + Ohraničení + + + + Reflect + Zrcadlit + + + + Substract + Odečíst + + + + Average + Průměr + + + + Glow + Záře + + + + Negation + Odmítnutí + + + + Phoenix + Fénix + + + + Transition + + + Length: + Délka: + + + + VSTHost + + + + Error loading VST plugin + Chyba při nahrávání přídavného modulu VST + + + + Failed to create VST reference + Nepodařilo se vytvořit odkaz na VST + + + + Failed to load VST plugin "%1": %2 + Nepodařilo se nahrát přídavný modul "%1": %2 + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + Poznámka: Nemůžete nahrát 32 bitové přídavné moduly VST do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + Poznámka: Nemůžete nahrát 64 bitové přídavné moduly VST do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. + + + + VST Error + Chyba VST + + + + Plugin's magic number is invalid + Kouzelné číslo přídavného modulu je neplatné + + + + Plugin + Přídavný modul + + + + Interface + Rozhraní + + + + Show + Ukázat + + + + VST Plugin + Přídavný modul VST + + + + Viewer + + + Sequence Viewer + Prohlížeč řady + + + + Media Viewer + Prohlížeč záznamu + + + + (none) + (žádný) + + + + ViewerWidget + + + Save Frame as Image... + Uložit snímek jako obrázek... + + + + Show Fullscreen + Ukázat na celou obrazovku + + + + Disable + Zakázat + + + + Screen %1: %2x%3 + Obrazovka %1: %2x%3 + + + + Zoom + Zvětšení + + + + Fit + Vejít se + + + + Custom + Vlastní + + + + Close Media + Zavřít záznam + + + + Save Frame + Uložit snímek + + + + Viewer Zoom + Zvětšení prohlížeče + + + + Set Custom Zoom Value: + Nastavit vlastní hodnotu zvětšení: + + + + ViewerWindow + + + Exit Fullscreen + Opustit celou obrazovku + + + + VoidEffect + + + (unknown) + (neznámý) + + + + Missing Effect + Chybí efekt + + + + VolumeEffect + + + Volume + Hlasitost + + + + transition + + + Invalid transition + Neplatný přechod + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + Žádný uchazeč o přechod '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. + + + From c9f686819837669f95a3f806afe0275a0deb6fa8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 15:35:49 +1100 Subject: [PATCH 080/202] removed unnecessary padding in img sequence filenames --- panels/project.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index 620efb4f3..f8c740829 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -722,7 +722,7 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla if (is_img_sequence) { // get the URL that we would pass to FFmpeg to force it to read the image as a sequence - QString new_filename = file.left(digit_test) + "%" + QString("%1").arg(digit_count, 2, 10, QChar('0')) + "d" + file.mid(lastcharindex); + QString new_filename = file.left(digit_test) + "%" + QString::number(digit_count) + "d" + file.mid(lastcharindex); // add image sequence url to a vector in case the user imported several files that // we're interpreting as a possible sequence @@ -1061,15 +1061,15 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } } - // save markers - // unnecessary for nested sequences since sequences have their own marker saving - if (c->media == nullptr || c->media->get_type() != MEDIA_TYPE_SEQUENCE) { - for (int k=0;kget_markers().size();k++) { - save_marker(stream, c->get_markers().at(k)); - } - } + // save markers + // unnecessary for nested sequences since sequences have their own marker saving + if (c->media == nullptr || c->media->get_type() != MEDIA_TYPE_SEQUENCE) { + for (int k=0;kget_markers().size();k++) { + save_marker(stream, c->get_markers().at(k)); + } + } - // save clip links + // save clip links stream.writeStartElement("linked"); // linked for (int k=0;klinked.size();k++) { stream.writeStartElement("link"); // link From 4e72f1f855c0833651df5293816c3f8cfec93285 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 16:29:29 +1100 Subject: [PATCH 081/202] minor fixes --- io/path.cpp | 8 +------- olive.pro | 1 + 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/io/path.cpp b/io/path.cpp index c3a24f84a..1c7ba4b67 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -8,14 +8,8 @@ #include "debug.h" -QString real_app_dir; - QString get_app_dir() { - if (real_app_dir.isEmpty()) { - QString app_path = QCoreApplication::applicationFilePath(); - real_app_dir = app_path.left(app_path.lastIndexOf('/')); - } - return real_app_dir; + return QCoreApplication::applicationDirPath(); } QString get_data_path() { diff --git a/olive.pro b/olive.pro index 7e4384ea6..209931772 100644 --- a/olive.pro +++ b/olive.pro @@ -251,6 +251,7 @@ TRANSLATIONS += \ ts/olive_es.ts \ ts/olive_fr.ts \ ts/olive_it.ts \ + ts/olive_cs.ts \ ts/olive_ru.ts win32 { From dc901ca8ff2ca827ea117a420a7bbd8e26d0e28b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 18:48:02 +1100 Subject: [PATCH 082/202] load/save effect settings --- io/loadthread.cpp | 18 ------- project/effect.cpp | 119 ++++++++++++++++++++++++++++++++++++++++++++- project/effect.h | 4 ++ 3 files changed, 122 insertions(+), 19 deletions(-) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 39df0c6c6..ff44fffd1 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -37,24 +37,6 @@ LoadThread::LoadThread(LoadDialog* l, bool a) : ld(l), autorecovery(a), cancelle connect(this, SIGNAL(start_question(const QString&, const QString &, int)), this, SLOT(question_func(const QString &, const QString &, int))); } -const EffectMeta* get_meta_from_name(const QString& input) { - int split_index = input.indexOf('/'); - QString category; - if (split_index > -1) { - category = input.left(split_index); - } - QString name = input.mid(split_index + 1); - - for (int j=0;j #include #include +#include QVector effects; @@ -397,6 +398,12 @@ void Effect::show_context_menu(const QPoint& pos) { menu.addAction(tr("D&elete"), this, SLOT(delete_self())); + menu.addSeparator(); + + menu.addAction(tr("Load Settings to File"), this, SLOT(load_from_file())); + + menu.addAction(tr("Save Settings to File"), this, SLOT(save_to_file())); + menu.exec(container->title_bar->mapToGlobal(pos)); } } @@ -426,7 +433,99 @@ void Effect::move_down() { command->to = command->from + 1; undo_stack.push(command); panel_effect_controls->reload_clips(); - panel_sequence_viewer->viewer_widget->frame_update(); + panel_sequence_viewer->viewer_widget->frame_update(); +} + +void Effect::save_to_file() { + // save effect settings to file + QString file = QFileDialog::getSaveFileName(mainWindow, + tr("Save Effect Settings"), + QString(), + tr("Effect XML Settings %1").arg("(*.xml)")); + + // if the user picked a file + if (!file.isEmpty()) { + QFile file_handle(file); + if (file_handle.open(QFile::WriteOnly)) { + + // write settings with xml writer + QXmlStreamWriter stream(&file_handle); + + stream.writeStartDocument(); + + stream.writeStartElement("effect"); + + // pass off to standard saving function + save(stream); + + stream.writeEndElement(); // effect + + stream.writeEndDocument(); + + file_handle.close(); + } else { + QMessageBox::critical(mainWindow, + tr("Save Settings Failed"), + tr("Failed to open \"%1\" for writing.").arg(file), + QMessageBox::Ok); + } + } +} + +void Effect::load_from_file() { + // load effect settings from file + QString file = QFileDialog::getOpenFileName(mainWindow, + tr("Load Effect Settings"), + QString(), + tr("Effect XML Settings %1").arg("(*.xml)")); + + // if the user picked a file + if (!file.isEmpty()) { + QFile file_handle(file); + if (file_handle.open(QFile::ReadOnly)) { + + // write settings with xml writer + QXmlStreamReader stream(&file_handle); + + while (!stream.atEnd()) { + stream.readNext(); + + // find the effect opening tag + if (stream.name() == "effect" && stream.isStartElement()) { + + // check the name to see if it matches this effect + const QXmlStreamAttributes& attributes = stream.attributes(); + for (int i=0;i -1) { + category = input.left(split_index); + } + QString name = input.mid(split_index + 1); + + for (int j=0;j(a) + static_cast(b); mixed_sample = qMax(qMin(mixed_sample, static_cast(INT16_MAX)), static_cast(INT16_MIN)); diff --git a/project/effect.h b/project/effect.h index 665cdcedf..43b960c7f 100644 --- a/project/effect.h +++ b/project/effect.h @@ -135,6 +135,8 @@ struct GLTextureCoords { float opacity; }; +const EffectMeta* get_meta_from_name(const QString& input); + qint16 mix_audio_sample(qint16 a, qint16 b); #include "effectfield.h" @@ -207,6 +209,8 @@ private slots: void delete_self(); void move_up(); void move_down(); + void save_to_file(); + void load_from_file(); protected: // glsl effect QOpenGLShaderProgram* glslProgram; From 1111b6a89bf1aa8825dca76cc46e19cf669412e5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 20:29:15 +1100 Subject: [PATCH 083/202] pause if preferences dialog is open, fixes #413 --- dialogs/preferencesdialog.h | 2 +- mainwindow.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index f086c1c40..2a6fa2cea 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -31,7 +31,7 @@ class PreferencesDialog : public QDialog Q_OBJECT public: - explicit PreferencesDialog(QWidget *parent = 0); + explicit PreferencesDialog(QWidget *parent = nullptr); ~PreferencesDialog(); void setup_kbd_shortcuts(QMenuBar* menu); diff --git a/mainwindow.cpp b/mainwindow.cpp index 08af530c9..64c374711 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1239,8 +1239,10 @@ void MainWindow::maximize_panel() { } } -void MainWindow::preferences() -{ +void MainWindow::preferences() { + panel_sequence_viewer->pause(); + panel_footage_viewer->pause(); + PreferencesDialog pd(this); pd.setup_kbd_shortcuts(menuBar()); pd.exec(); From 7c447680d253e2fb549b7d1cb264f2a11133e3d9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 20:30:20 +1100 Subject: [PATCH 084/202] updated czech translation, fixes #421 --- ts/olive_cs.ts | 56 +++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts index cb0e1fb41..2fe9ce677 100644 --- a/ts/olive_cs.ts +++ b/ts/olive_cs.ts @@ -6,12 +6,12 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive je nelineární editor obrazového záznamu. Tento program je zdarma a chráněn GNU GPL. Olive Team is obliged to inform users that Olive source code is available for download from its website. - + Družstvo Olive se dává na vědomí, že zdrojové kódy Olive jsou dostupné pro stažení na internetové stránce projektu. @@ -108,7 +108,7 @@ Perspective - + Perspektiva @@ -130,17 +130,17 @@ Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive je editor obrazového záznamu s otevřeným zdrojovým kódem vydaný pod GNU GPL. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Tento program je v současnosti v Alfa verzi, což znamená, že je nestálý a velice pravděpodobně náchylný k pádům, má chyby a chybí mu funkce. Není poskytována žádná záruka, takže jej používejte na vlastní nebezpečí. Hlašte, prosím, jakékoli chyby nebo žádosti o funkce na %1 Thank you for trying Olive and we hope you enjoy it! - + Děkujeme vám za zkoušení Olive. Přejeme si, aby vám dělal radost! @@ -153,7 +153,7 @@ No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Žádný uchazeč pro efekt '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. @@ -173,7 +173,7 @@ Move &Down - Posunout &dolu + Posunout &dolů @@ -305,7 +305,7 @@ Quality-based (Constant Rate Factor) - Založeno na kvalitě (faktor stálé rychlosti) + Kvalita (Constant Rate Factor) @@ -879,7 +879,7 @@ Paste Insert - Vložit vložku + Vložit vložku @@ -1004,7 +1004,7 @@ Rectified Waveforms - Vyspravené vlny + Vlnový tvar odspodu @@ -1029,7 +1029,7 @@ Title/Action Safe Area - + Bezpečná oblast @@ -1089,7 +1089,7 @@ Play In to Out - Přehrát začátek po konec + Přehrát od začátku po konec @@ -1195,7 +1195,7 @@ Pointer Tool - Nástroj ukazovátka + Ukazovátko @@ -1205,7 +1205,7 @@ Ripple Tool - Nástroj pro vložení a posunutí + Vložení a posunutí @@ -1215,22 +1215,22 @@ Slip Tool - Nástroj pro sklouznutí + Roztočení se ztotožněním Slide Tool - Nástroj pro sklouznutí + Roztočení Hand Tool - Nástroj ručičky + Ručička Transition Tool - Nástroj pro přechod + Přechod @@ -1265,7 +1265,7 @@ Scroll Wheel Zooms - Posunovací kolečko myši přibližuje + Kolečko myši přibližuje @@ -1285,7 +1285,7 @@ Audio Scrubbing - + Přehrávání zvuku při tažení ukazatele @@ -1385,7 +1385,7 @@ Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - Zadejte poměr stran k použití pro název/bezpečná oblast činnosti (např. 16:9): + Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): @@ -2628,7 +2628,7 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Bars... - Takty... + Zkušební tabulka... @@ -2678,12 +2678,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Slip Tool - + Roztočení se ztotožněním Slide Tool - + Roztočení @@ -2718,7 +2718,7 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Add title, solid, bars, etc. - Přidat název, plný, takty atd. + Přidat název, plný, zkušební tabulky atd. @@ -2785,7 +2785,7 @@ Doba trvání: %4 Bars - Takty + Zkušební tabulka @@ -2861,7 +2861,7 @@ Doba trvání: %4 Blend Mode - Režim splynutí + Režim mísení From 87df07e6e70781db0a22a556ad7724a39a52bd53 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 3 Feb 2019 20:55:47 +1100 Subject: [PATCH 085/202] fully implemented saving/loading effect data to file, fixes #418 --- project/effect.cpp | 216 +++++++++++++++++++++++++-------------------- project/effect.h | 7 +- project/undo.cpp | 50 +++++++---- project/undo.h | 17 +++- 4 files changed, 172 insertions(+), 118 deletions(-) diff --git a/project/effect.cpp b/project/effect.cpp index 906ec3302..c56315aec 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -398,11 +398,11 @@ void Effect::show_context_menu(const QPoint& pos) { menu.addAction(tr("D&elete"), this, SLOT(delete_self())); - menu.addSeparator(); + menu.addSeparator(); - menu.addAction(tr("Load Settings to File"), this, SLOT(load_from_file())); + menu.addAction(tr("Load Settings From File"), this, SLOT(load_from_file())); - menu.addAction(tr("Save Settings to File"), this, SLOT(save_to_file())); + menu.addAction(tr("Save Settings to File"), this, SLOT(save_to_file())); menu.exec(container->title_bar->mapToGlobal(pos)); } @@ -433,99 +433,57 @@ void Effect::move_down() { command->to = command->from + 1; undo_stack.push(command); panel_effect_controls->reload_clips(); - panel_sequence_viewer->viewer_widget->frame_update(); + panel_sequence_viewer->viewer_widget->frame_update(); } void Effect::save_to_file() { - // save effect settings to file - QString file = QFileDialog::getSaveFileName(mainWindow, - tr("Save Effect Settings"), - QString(), - tr("Effect XML Settings %1").arg("(*.xml)")); + // save effect settings to file + QString file = QFileDialog::getSaveFileName(mainWindow, + tr("Save Effect Settings"), + QString(), + tr("Effect XML Settings %1").arg("(*.xml)")); - // if the user picked a file - if (!file.isEmpty()) { - QFile file_handle(file); - if (file_handle.open(QFile::WriteOnly)) { + // if the user picked a file + if (!file.isEmpty()) { + QFile file_handle(file); + if (file_handle.open(QFile::WriteOnly)) { - // write settings with xml writer - QXmlStreamWriter stream(&file_handle); + file_handle.write(save_to_string()); - stream.writeStartDocument(); - - stream.writeStartElement("effect"); - - // pass off to standard saving function - save(stream); - - stream.writeEndElement(); // effect - - stream.writeEndDocument(); - - file_handle.close(); - } else { - QMessageBox::critical(mainWindow, - tr("Save Settings Failed"), - tr("Failed to open \"%1\" for writing.").arg(file), - QMessageBox::Ok); - } - } + file_handle.close(); + } else { + QMessageBox::critical(mainWindow, + tr("Save Settings Failed"), + tr("Failed to open \"%1\" for writing.").arg(file), + QMessageBox::Ok); + } + } } void Effect::load_from_file() { - // load effect settings from file - QString file = QFileDialog::getOpenFileName(mainWindow, - tr("Load Effect Settings"), - QString(), - tr("Effect XML Settings %1").arg("(*.xml)")); + // load effect settings from file + QString file = QFileDialog::getOpenFileName(mainWindow, + tr("Load Effect Settings"), + QString(), + tr("Effect XML Settings %1").arg("(*.xml)")); - // if the user picked a file - if (!file.isEmpty()) { - QFile file_handle(file); - if (file_handle.open(QFile::ReadOnly)) { + // if the user picked a file + if (!file.isEmpty()) { + QFile file_handle(file); + if (file_handle.open(QFile::ReadOnly)) { - // write settings with xml writer - QXmlStreamReader stream(&file_handle); + undo_stack.push(new SetEffectData(this, file_handle.readAll())); - while (!stream.atEnd()) { - stream.readNext(); + file_handle.close(); - // find the effect opening tag - if (stream.name() == "effect" && stream.isStartElement()) { - - // check the name to see if it matches this effect - const QXmlStreamAttributes& attributes = stream.attributes(); - for (int i=0;isetKeyframing(false); + for (int j=0;jfieldCount();j++) { + EffectField* field = row->field(j); + field->keyframes.clear(); + } + } + + // write settings with xml writer + QXmlStreamReader stream(s); + + while (!stream.atEnd()) { + stream.readNext(); + + // find the effect opening tag + if (stream.name() == "effect" && stream.isStartElement()) { + + // check the name to see if it matches this effect + const QXmlStreamAttributes& attributes = stream.attributes(); + for (int i=0;i -1) { - category = input.left(split_index); - } - QString name = input.mid(split_index + 1); + int split_index = input.indexOf('/'); + QString category; + if (split_index > -1) { + category = input.left(split_index); + } + QString name = input.mid(split_index + 1); - for (int j=0;j #include #include +#include #include "project/clip.h" #include "project/sequence.h" @@ -804,22 +805,22 @@ void SetAutoscaleAction::redo() { } AddMarkerAction::AddMarkerAction(bool is_sequence, void* s, long t, QString n) : - is_sequence_internal(is_sequence), - target(s), + is_sequence_internal(is_sequence), + target(s), time(t), name(n), old_project_changed(mainWindow->isWindowModified()) {} void AddMarkerAction::undo() { - QVector& markers = is_sequence_internal ? - static_cast(target)->markers : - static_cast(target)->get_markers(); + QVector& markers = is_sequence_internal ? + static_cast(target)->markers : + static_cast(target)->get_markers(); if (index == -1) { - markers.removeLast(); + markers.removeLast(); } else { - markers[index].name = old_name; + markers[index].name = old_name; } mainWindow->setWindowModified(old_project_changed); @@ -828,12 +829,12 @@ void AddMarkerAction::undo() { void AddMarkerAction::redo() { index = -1; - QVector& markers = is_sequence_internal ? - static_cast(target)->markers : - static_cast(target)->get_markers(); + QVector& markers = is_sequence_internal ? + static_cast(target)->markers : + static_cast(target)->get_markers(); - for (int i=0;isetWindowModified(true); @@ -1295,3 +1296,20 @@ void UpdateViewer::undo() { void UpdateViewer::redo() { panel_sequence_viewer->viewer_widget->frame_update(); } + +SetEffectData::SetEffectData(Effect *e, const QByteArray &s) : + effect(e), + data(s) +{} + +void SetEffectData::undo() { + effect->load_from_string(old_data); + + old_data.clear(); +} + +void SetEffectData::redo() { + old_data = effect->save_to_string(); + + effect->load_from_string(data); +} diff --git a/project/undo.h b/project/undo.h index 444f8e4cd..e92f8b600 100644 --- a/project/undo.h +++ b/project/undo.h @@ -384,12 +384,12 @@ private: class AddMarkerAction : public QUndoCommand { public: - AddMarkerAction(bool is_sequence, void* s, long t, QString n); + AddMarkerAction(bool is_sequence, void* s, long t, QString n); void undo(); void redo(); private: - bool is_sequence_internal; - void* target; + bool is_sequence_internal; + void* target; long time; QString name; QString old_name; @@ -651,4 +651,15 @@ public: void redo(); }; +class SetEffectData : public QUndoCommand { +public: + SetEffectData(Effect* e, const QByteArray &s); + void undo(); + void redo(); +private: + Effect* effect; + QByteArray data; + QByteArray old_data; +}; + #endif // UNDO_H From 55297a5b32a8879953f70c7a7237787bf90e3f4b Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Sun, 3 Feb 2019 16:36:55 +0300 Subject: [PATCH 086/202] Mark a bunch of user-visible messages for translation --- ui/timelinewidget.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a3d512125..641fa7349 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -74,8 +74,8 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { QMenu menu(this); - QAction* undoAction = menu.addAction("&Undo"); - QAction* redoAction = menu.addAction("&Redo"); + QAction* undoAction = menu.addAction(tr("&Undo")); + QAction* redoAction = menu.addAction(tr("&Redo")); connect(undoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(undo())); connect(redoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(redo())); undoAction->setEnabled(undo_stack.canUndo()); @@ -93,11 +93,11 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { if (!selected_clips.isEmpty()) { // clips are selected - menu.addAction("C&ut", mainWindow, SLOT(cut())); - menu.addAction("Cop&y", mainWindow, SLOT(copy())); + menu.addAction(tr("C&ut"), mainWindow, SLOT(cut())); + menu.addAction(tr("Cop&y"), mainWindow, SLOT(copy())); } - menu.addAction("&Paste", mainWindow, SLOT(paste())); + menu.addAction(tr("&Paste"), mainWindow, SLOT(paste())); if (selected_clips.isEmpty()) { // no clips are selected @@ -107,26 +107,26 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { panel_timeline->cursor_track = getTrackFromScreenPoint(pos.y()); if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { - QAction* ripple_delete_action = menu.addAction("R&ipple Delete"); + QAction* ripple_delete_action = menu.addAction(tr("R&ipple Delete")); connect(ripple_delete_action, SIGNAL(triggered(bool)), panel_timeline, SLOT(ripple_delete_empty_space())); } - QAction* seq_settings = menu.addAction("Sequence Settings"); + QAction* seq_settings = menu.addAction(tr("Sequence Settings")); connect(seq_settings, SIGNAL(triggered(bool)), this, SLOT(open_sequence_properties())); } if (!selected_clips.isEmpty()) { menu.addSeparator(); - menu.addAction("&Speed/Duration", mainWindow, SLOT(open_speed_dialog())); + menu.addAction(tr("&Speed/Duration"), mainWindow, SLOT(open_speed_dialog())); - QAction* autoscaleAction = menu.addAction("Auto-s&cale", this, SLOT(toggle_autoscale())); + QAction* autoscaleAction = menu.addAction(tr("Auto-s&cale"), this, SLOT(toggle_autoscale())); autoscaleAction->setCheckable(true); // set autoscale to the first selected clip autoscaleAction->setChecked(selected_clips.at(0)->autoscale); menu.addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links())); - menu.addAction("&Nest", mainWindow, SLOT(nest())); + menu.addAction(tr("&Nest"), mainWindow, SLOT(nest())); // stabilizer option /*int video_clip_count = 0; @@ -156,11 +156,11 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { } if (same_media) { - QAction* revealInProjectAction = menu.addAction("&Reveal in Project"); + QAction* revealInProjectAction = menu.addAction(tr("&Reveal in Project")); connect(revealInProjectAction, SIGNAL(triggered(bool)), this, SLOT(reveal_media())); } - QAction* rename = menu.addAction("R&ename"); + QAction* rename = menu.addAction(tr("R&ename")); connect(rename, SIGNAL(triggered(bool)), this, SLOT(rename_clip())); } From e83d87d6bad3dd075bac6cf7ec62fdd558576a17 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 01:34:51 +1100 Subject: [PATCH 087/202] attached clip markers to footage markers --- io/loadthread.cpp | 60 +++++++++++++++++++++++++-------------- panels/project.cpp | 21 ++++++++++---- project/clip.cpp | 4 +-- project/footage.h | 9 ++++++ project/media.cpp | 15 +++++++++- project/media.h | 5 ++++ project/projectfilter.cpp | 9 +++--- 7 files changed, 88 insertions(+), 35 deletions(-) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index ff44fffd1..7f4911be4 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -185,34 +185,34 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { int folder = 0; Media* item = new Media(0); - Footage* m = new Footage(); + Footage* f = new Footage(); - m->using_inout = false; + f->using_inout = false; for (int j=0;jsave_id = attr.value().toInt(); + f->save_id = attr.value().toInt(); } else if (attr.name() == "folder") { folder = attr.value().toInt(); } else if (attr.name() == "name") { - m->name = attr.value().toString(); + f->name = attr.value().toString(); } else if (attr.name() == "url") { - m->url = attr.value().toString(); + f->url = attr.value().toString(); - if (!QFileInfo::exists(m->url)) { // if path is not absolute - QString proj_dir_test = proj_dir.absoluteFilePath(m->url); - QString internal_proj_dir_test = internal_proj_dir.absoluteFilePath(m->url); + if (!QFileInfo::exists(f->url)) { // if path is not absolute + QString proj_dir_test = proj_dir.absoluteFilePath(f->url); + QString internal_proj_dir_test = internal_proj_dir.absoluteFilePath(f->url); if (QFileInfo::exists(proj_dir_test)) { // if path is relative to the project's current dir - m->url = proj_dir_test; + f->url = proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's current directory"; } else if (QFileInfo::exists(internal_proj_dir_test)) { // if path is relative to the last directory the project was saved in - m->url = internal_proj_dir_test; + f->url = internal_proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's internal directory"; - } else if (m->url.contains('%')) { + } else if (f->url.contains('%')) { // hack for image sequences (qt won't be able to find the URL with %, but ffmpeg may) - m->url = internal_proj_dir_test; + f->url = internal_proj_dir_test; qInfo() << "Guess image sequence" << attr.value().toString() << "path to project's internal directory"; } else { qInfo() << "Failed to match" << attr.value().toString() << "to file"; @@ -221,25 +221,41 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { qInfo() << "Matched" << attr.value().toString() << "with absolute path"; } } else if (attr.name() == "duration") { - m->length = attr.value().toLongLong(); + f->length = attr.value().toLongLong(); } else if (attr.name() == "using_inout") { - m->using_inout = (attr.value() == "1"); + f->using_inout = (attr.value() == "1"); } else if (attr.name() == "in") { - m->in = attr.value().toLong(); + f->in = attr.value().toLong(); } else if (attr.name() == "out") { - m->out = attr.value().toLong(); + f->out = attr.value().toLong(); } else if (attr.name() == "speed") { - m->speed = attr.value().toDouble(); + f->speed = attr.value().toDouble(); } else if (attr.name() == "alphapremul") { - m->alpha_is_premultiplied = (attr.value() == "1"); + f->alpha_is_premultiplied = (attr.value() == "1"); } else if (attr.name() == "proxy") { - m->proxy = (attr.value() == "1"); + f->proxy = (attr.value() == "1"); } else if (attr.name() == "proxypath") { - m->proxy_path = attr.value().toString(); + f->proxy_path = attr.value().toString(); } - } + } - item->set_footage(m); + while (!cancelled && !(stream.name() == child_search && stream.isEndElement()) && !stream.atEnd()) { + read_next_start_element(stream); + if (stream.name() == "marker" && stream.isStartElement()) { + Marker m; + for (int j=0;jmarkers.append(m); + } + } + + item->set_footage(f); if (folder == 0) { project_model.appendChild(nullptr, item); diff --git a/panels/project.cpp b/panels/project.cpp index f8c740829..725cd6152 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -970,6 +970,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("proxy", QString::number(f->proxy)); stream.writeAttribute("proxypath", f->proxy_path); + // save video stream metadata for (int j=0;jvideo_tracks.size();j++) { const FootageStream& ms = f->video_tracks.at(j); stream.writeStartElement("video"); @@ -978,8 +979,10 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("height", QString::number(ms.video_height)); stream.writeAttribute("framerate", QString::number(ms.video_frame_rate, 'f', 10)); stream.writeAttribute("infinite", QString::number(ms.infinite_length)); - stream.writeEndElement(); + stream.writeEndElement(); // video } + + // save audio stream metadata for (int j=0;jaudio_tracks.size();j++) { const FootageStream& ms = f->audio_tracks.at(j); stream.writeStartElement("audio"); @@ -987,9 +990,15 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("channels", QString::number(ms.audio_channels)); stream.writeAttribute("layout", QString::number(ms.audio_layout)); stream.writeAttribute("frequency", QString::number(ms.audio_frequency)); - stream.writeEndElement(); + stream.writeEndElement(); // audio } - stream.writeEndElement(); + + // save footage markers + for (int j=0;jmarkers.size();j++) { + save_marker(stream, f->markers.at(j)); + } + + stream.writeEndElement(); // footage media_id++; } else if (type == MEDIA_TYPE_SEQUENCE) { Sequence* s = m->to_sequence(); @@ -1062,8 +1071,8 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } // save markers - // unnecessary for nested sequences since sequences have their own marker saving - if (c->media == nullptr || c->media->get_type() != MEDIA_TYPE_SEQUENCE) { + // only necessary for null media clips, since media has its own markers + if (c->media == nullptr) { for (int k=0;kget_markers().size();k++) { save_marker(stream, c->get_markers().at(k)); } @@ -1087,7 +1096,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeEndElement(); // clip } } - for (int j=0;jmarkers.size();j++) { + for (int j=0;jmarkers.size();j++) { save_marker(stream, s->markers.at(j)); } stream.writeEndElement(); diff --git a/project/clip.cpp b/project/clip.cpp index 5516f124d..faafc8fb4 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -151,8 +151,8 @@ void Clip::queue_remove_earliest() { } QVector &Clip::get_markers() { - if (media != nullptr && media->get_type() == MEDIA_TYPE_SEQUENCE) { - return media->to_sequence()->markers; + if (media != nullptr) { + return media->get_markers(); } return markers; } diff --git a/project/footage.h b/project/footage.h index 749c3bf86..e42fc65f8 100644 --- a/project/footage.h +++ b/project/footage.h @@ -9,6 +9,8 @@ #include #include +#include "project/marker.h" + enum VideoInterlacingMode { VIDEO_PROGRESSIVE, VIDEO_TOP_FIELD_FIRST, @@ -45,6 +47,7 @@ struct Footage { Footage(); ~Footage(); + // footage metadata QString url; QString name; int64_t length; @@ -60,13 +63,19 @@ struct Footage { bool proxy; QString proxy_path; + // thumbnail/waveform generation PreviewGenerator* preview_gen; QMutex ready_lock; + // in/out points bool using_inout; long in; long out; + // markers + QVector markers; + + // functions long get_length_in_frames(double frame_rate); FootageStream *get_stream_from_file_index(bool video, int index); void reset(); diff --git a/project/media.cpp b/project/media.cpp index 92141ef7e..77b9f0c72 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -329,5 +329,18 @@ Media *Media::parentItem() { } void Media::removeChild(int i) { - children.removeAt(i); + children.removeAt(i); +} + +QVector &Media::get_markers() { + // returns the marker array from the internal object + // + // NOTE: if this media object is not footage or a sequence, the result is + // undefined - most likely a crash + + if (get_type() == MEDIA_TYPE_FOOTAGE) { + return to_footage()->markers; + } else { + return to_sequence()->markers; + } } diff --git a/project/media.h b/project/media.h index 3c04de933..b917d7495 100644 --- a/project/media.h +++ b/project/media.h @@ -4,6 +4,8 @@ #include #include +#include "project/marker.h" + #define MEDIA_TYPE_FOOTAGE 0 #define MEDIA_TYPE_SEQUENCE 1 #define MEDIA_TYPE_FOLDER 2 @@ -46,6 +48,9 @@ public: Media *parentItem(); void removeChild(int i); + // get markers from internal object + QVector& get_markers(); + bool root; int temp_id; int temp_id2; diff --git a/project/projectfilter.cpp b/project/projectfilter.cpp index 8b084b141..f6a4e58d6 100644 --- a/project/projectfilter.cpp +++ b/project/projectfilter.cpp @@ -41,10 +41,11 @@ bool ProjectFilter::filterAcceptsRow(int source_row, const QModelIndex &source_p // search markers if media is a sequene bool marker_contains_search = false; - if (media->get_type() == MEDIA_TYPE_SEQUENCE) { - Sequence* s = media->to_sequence(); - for (int i=0;imarkers.size();i++) { - if (s->markers.at(i).name.contains(search_filter, Qt::CaseInsensitive)) { + if (media->get_type() == MEDIA_TYPE_SEQUENCE + || media->get_type() == MEDIA_TYPE_FOOTAGE) { + QVector& markers = media->get_markers(); + for (int i=0;i Date: Mon, 4 Feb 2019 01:53:08 +1100 Subject: [PATCH 088/202] footage markers can now be edited in footage viewer --- panels/viewer.cpp | 13 +++++++++++-- panels/viewer.h | 5 ++++- ui/timelineheader.cpp | 15 ++++++++------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 6b014db3b..f827bd1f0 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -471,6 +471,7 @@ void Viewer::update_parents(bool reload_fx) { update_ui(reload_fx); } else { update_viewer(); + panel_timeline->repaint_timeline(); } } @@ -685,14 +686,17 @@ void Viewer::setup_ui() { void Viewer::set_media(Media* m) { main_sequence = false; - media = m; - clean_created_seq(); + media = m; + + clean_created_seq(); if (media != nullptr) { switch (media->get_type()) { case MEDIA_TYPE_FOOTAGE: { Footage* footage = media->to_footage(); + marker_ref = &footage->markers; + seq = new Sequence(); created_sequence = true; seq->wrapper_sequence = true; @@ -856,10 +860,15 @@ void Viewer::set_sequence(bool main, Sequence *s) { update_end_timecode(); viewer_container->adjust(); + + if (!created_sequence) { + marker_ref = &seq->markers; + } } else { update_playhead_timecode(0); update_end_timecode(); } + update_window_title(); update_header_zoom(); diff --git a/panels/viewer.h b/panels/viewer.h index 002caea1a..41bcdd1b4 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -16,6 +16,8 @@ class LabelSlider; class QPushButton; class QLabel; +#include "project/marker.h" + bool frame_rate_is_droppable(float rate); long timecode_to_frame(const QString& s, int view, double frame_rate); QString frame_to_timecode(long f, int view, double frame_rate); @@ -71,7 +73,8 @@ public: ViewerWidget* viewer_widget; Media* media; - Sequence* seq; + Sequence* seq; + QVector* marker_ref; void resizeEvent(QResizeEvent *event); diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index e37f16374..02e9c0b8a 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -5,6 +5,7 @@ #include "panels/timeline.h" #include "project/sequence.h" #include "project/undo.h" +#include "project/media.h" #include "panels/viewer.h" #include "io/config.h" #include "debug.h" @@ -142,8 +143,8 @@ void TimelineHeader::mousePressEvent(QMouseEvent* event) { if (event->pos().y() > get_marker_offset() && (event->pos().x() < playhead_x-PLAYHEAD_SIZE || event->pos().x() > playhead_x+PLAYHEAD_SIZE)) { - for (int i=0;iseq->markers.size();i++) { - int marker_pos = getHeaderScreenPointFromFrame(viewer->seq->markers.at(i).frame); + for (int i=0;imarker_ref->size();i++) { + int marker_pos = getHeaderScreenPointFromFrame(viewer->marker_ref->at(i).frame); if (event->pos().x() > marker_pos - MARKER_SIZE && event->pos().x() < marker_pos + MARKER_SIZE) { bool found = false; for (int j=0;jseq->markers.at(selected_markers.at(i)).frame; + selected_marker_original_times[i] = viewer->marker_ref->at(selected_markers.at(i)).frame; } drag_start = event->pos().x(); dragging_markers = true; @@ -224,7 +225,7 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { // move markers for (int i=0;iseq->markers[selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; + viewer->marker_ref[0][selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; } update_parents(); @@ -263,7 +264,7 @@ void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { bool moved = false; ComboAction* ca = new ComboAction(); for (int i=0;iseq->markers[selected_markers.at(i)]; + Marker* m = &viewer->marker_ref[0][selected_markers.at(i)]; if (selected_marker_original_times.at(i) != m->frame) { ca->append(new MoveMarkerAction(m, selected_marker_original_times.at(i), m->frame)); moved = true; @@ -403,8 +404,8 @@ void TimelineHeader::paintEvent(QPaintEvent*) { } // draw markers - for (int i=0;iseq->markers.size();i++) { - const Marker& m = viewer->seq->markers.at(i); + for (int i=0;imarker_ref->size();i++) { + const Marker& m = viewer->marker_ref->at(i); int marker_x = getHeaderScreenPointFromFrame(m.frame); From 857473359568eea11f3b49dbffcc4ece35486f78 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 02:02:48 +1100 Subject: [PATCH 089/202] footage markers can now be deleted in footage viewer --- mainwindow.cpp | 4 ++++ panels/viewer.h | 3 ++- project/undo.cpp | 10 +++++----- project/undo.h | 4 ++-- ui/timelineheader.cpp | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 64c374711..5a89652fc 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -387,6 +387,10 @@ void MainWindow::show_debug_log() { void MainWindow::delete_slot() { if (panel_timeline->headers->hasFocus()) { panel_timeline->headers->delete_markers(); + } else if (panel_footage_viewer->headers->hasFocus()) { + panel_footage_viewer->headers->delete_markers(); + } else if (panel_sequence_viewer->headers->hasFocus()) { + panel_sequence_viewer->headers->delete_markers(); } else if (panel_timeline->focused()) { panel_timeline->delete_selection(sequence->selections, false); } else if (panel_effect_controls->is_focused()) { diff --git a/panels/viewer.h b/panels/viewer.h index 41bcdd1b4..ed2953343 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -76,6 +76,8 @@ public: Sequence* seq; QVector* marker_ref; + TimelineHeader* headers; + void resizeEvent(QResizeEvent *event); public slots: @@ -120,7 +122,6 @@ private: void setup_ui(); - TimelineHeader* headers; ResizableScrollBar* horizontal_bar; ViewerContainer* viewer_container; LabelSlider* current_timecode_slider; diff --git a/project/undo.cpp b/project/undo.cpp index f8f90ff49..0ba5366c5 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -870,15 +870,15 @@ void MoveMarkerAction::redo() { mainWindow->setWindowModified(true); } -DeleteMarkerAction::DeleteMarkerAction(Sequence* s) : - seq(s), +DeleteMarkerAction::DeleteMarkerAction(QVector *m) : + active_array(m), sorted(false), old_project_changed(mainWindow->isWindowModified()) {} void DeleteMarkerAction::undo() { for (int i=markers.size()-1;i>=0;i--) { - seq->markers.insert(markers.at(i), copies.at(i)); + active_array->insert(markers.at(i), copies.at(i)); } mainWindow->setWindowModified(old_project_changed); } @@ -887,14 +887,14 @@ void DeleteMarkerAction::redo() { for (int i=0;imarkers.at(markers.at(i))); + copies.append(active_array->at(markers.at(i))); for (int j=i+1;j markers.at(i)) { markers[j]--; } } } - seq->markers.removeAt(markers.at(i)); + active_array->removeAt(markers.at(i)); } sorted = true; mainWindow->setWindowModified(true); diff --git a/project/undo.h b/project/undo.h index e92f8b600..6a30be099 100644 --- a/project/undo.h +++ b/project/undo.h @@ -411,12 +411,12 @@ private: class DeleteMarkerAction : public QUndoCommand { public: - DeleteMarkerAction(Sequence* s); + DeleteMarkerAction(QVector* m); void undo(); void redo(); QVector markers; private: - Sequence* seq; + QVector* active_array; QVector copies; bool sorted; bool old_project_changed; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 02e9c0b8a..c6bdaa1fc 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -305,7 +305,7 @@ double TimelineHeader::get_zoom() { void TimelineHeader::delete_markers() { if (selected_markers.size() > 0) { - DeleteMarkerAction* dma = new DeleteMarkerAction(viewer->seq); + DeleteMarkerAction* dma = new DeleteMarkerAction(viewer->marker_ref); for (int i=0;imarkers.append(selected_markers.at(i)); } From 64c0baba5cecb3e93292839894c6db4f6d3729d5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 02:28:34 +1100 Subject: [PATCH 090/202] set loop to disabled by default --- io/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/io/config.cpp b/io/config.cpp index b12e8d010..346abd528 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -45,7 +45,7 @@ Config::Config() previous_queue_type(FRAME_QUEUE_TYPE_FRAMES), upcoming_queue_size(0.5), upcoming_queue_type(FRAME_QUEUE_TYPE_SECONDS), - loop(true), + loop(false), seek_also_selects(false), effect_textbox_lines(3), use_software_fallback(false), From ee20048c65b57bb4e0b3343aacbdeaa1ee61ef00 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 02:31:04 +1100 Subject: [PATCH 091/202] renamed menu options, fixes #427 --- mainwindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 5a89652fc..13e934424 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -775,9 +775,9 @@ void MainWindow::setup_menus() { playback_menu->addAction(tr("Go to In Point"), this, SLOT(go_to_in()), QKeySequence("Shift+I"))->setProperty("id", "gotoin"); playback_menu->addAction(tr("Go to Out Point"), this, SLOT(go_to_out()), QKeySequence("Shift+O"))->setProperty("id", "gotoout"); playback_menu->addSeparator(); - playback_menu->addAction(tr("Decrease Speed"), this, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); - playback_menu->addAction(tr("Pause"), this, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); - playback_menu->addAction(tr("Increase Speed"), this, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); + playback_menu->addAction(tr("Shuttle Left"), this, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); + playback_menu->addAction(tr("Shuttle Stop"), this, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); + playback_menu->addAction(tr("Shuttle Right"), this, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); playback_menu->addSeparator(); loop_action = playback_menu->addAction(tr("Loop"), this, SLOT(toggle_bool_action())); From 5ccabea2086f689fcbfc7b46a4a3e508787b59ef Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 02:33:43 +1100 Subject: [PATCH 092/202] removed hardcoded widths for dialogs, fixes #425 --- dialogs/aboutdialog.cpp | 3 +-- dialogs/demonotice.cpp | 3 +-- ui/timelinewidget.cpp | 44 +++++++++++++++++++++-------------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/dialogs/aboutdialog.cpp b/dialogs/aboutdialog.cpp index 3f595143c..2d97ce95b 100644 --- a/dialogs/aboutdialog.cpp +++ b/dialogs/aboutdialog.cpp @@ -7,8 +7,7 @@ AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { - setWindowTitle("About Olive"); - setMaximumWidth(360); + setWindowTitle("About Olive"); QVBoxLayout* layout = new QVBoxLayout(this); layout->setSpacing(20); diff --git a/dialogs/demonotice.cpp b/dialogs/demonotice.cpp index 7dc0e609e..26fa72c1a 100644 --- a/dialogs/demonotice.cpp +++ b/dialogs/demonotice.cpp @@ -7,8 +7,7 @@ DemoNotice::DemoNotice(QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Welcome to Olive!")); - setMaximumWidth(600); + setWindowTitle(tr("Welcome to Olive!")); QVBoxLayout* vlayout = new QVBoxLayout(this); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a3d512125..3997b2115 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -502,27 +502,29 @@ void TimelineWidget::dropEvent(QDropEvent* event) { } void TimelineWidget::mouseDoubleClickEvent(QMouseEvent *event) { - if (panel_timeline->tool == TIMELINE_TOOL_EDIT) { - int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); - if (clip_index >= 0) { - Clip* clip = sequence->clips.at(clip_index); - if (!(event->modifiers() & Qt::ShiftModifier)) sequence->selections.clear(); - Selection s; - s.in = clip->timeline_in; - s.out = clip->timeline_out; - s.track = clip->track; - sequence->selections.append(s); - update_ui(false); - } - } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER) { - int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); - if (clip_index >= 0) { - Clip* c = sequence->clips.at(clip_index); - if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { - set_sequence(c->media->to_sequence()); - } - } - } + if (sequence != nullptr) { + if (panel_timeline->tool == TIMELINE_TOOL_EDIT) { + int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); + if (clip_index >= 0) { + Clip* clip = sequence->clips.at(clip_index); + if (!(event->modifiers() & Qt::ShiftModifier)) sequence->selections.clear(); + Selection s; + s.in = clip->timeline_in; + s.out = clip->timeline_out; + s.track = clip->track; + sequence->selections.append(s); + update_ui(false); + } + } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER) { + int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); + if (clip_index >= 0) { + Clip* c = sequence->clips.at(clip_index); + if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { + set_sequence(c->media->to_sequence()); + } + } + } + } } bool isLiveEditing() { From e35145731d4196d62593d9a06f910e063f1dc278 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 4 Feb 2019 02:37:03 +1100 Subject: [PATCH 093/202] Update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4f3fee830..e866ce9ce 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ Olive is a free non-linear video editor for Windows, macOS, and Linux. Discover more and download binaries at: https://www.olivevideoeditor.org/ -Compiling instructions for Windows, macOS, and Linux are [here](https://olivevideoeditor.org/compile.php). +Please consider supporting Olive: -If you like Olive, please consider helping keep it alive by supporting it on [Patreon](https://www.patreon.com/olivevideoeditor). +[![Become a Patron](https://olivevideoeditor.org/img/become_a_patron_button.png)](https://www.patreon.com/olivevideoeditor) + +Compiling instructions for Windows, macOS, and Linux can be found [on the main site](https://olivevideoeditor.org/compile.php). From 1fab7ec8d93b3976880ef36af09e6bf913e1144c Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Mon, 4 Feb 2019 01:59:10 +0300 Subject: [PATCH 094/202] Updated Russian translation --- ts/olive_ru.ts | 462 +++++++++++++++++++++++++++++++------------------ 1 file changed, 292 insertions(+), 170 deletions(-) diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index e2d2ad2e1..462e410b8 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -71,7 +71,7 @@ <untitled> - + <без названия> @@ -124,61 +124,113 @@ Welcome to Olive! - + Приветствуем в Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Это свободный нелинейный видеоредактор с открытым исходным кодом под лицензией GNU GPL. Если вы заплатили за эту программу, скорее всего вас обманули. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + На текущий момент программа находится на стадии альфы, т.е. она нестабильна, может часто падать и не иметь нужных вам функций. Мы не даём никаких гарантий, используйте на свой страх и риск. Сообщения об ошибках и запросы на новые функции мы принимаем здесь: %1 Thank you for trying Olive and we hope you enjoy it! - + Спасибо за интерес к Olive. Надеемся, что программа вам понравится! Effect - + Invalid effect Некорректный эффект - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Cu&t В&ырезать - + &Copy &Скопировать - + Move &Up &Поднять - + Move &Down &Опустить - + D&elete &Удалить + + + Load Settings From File + Загрузить параметры из файла + + + + Save Settings to File + Сохранить параметры в файл + + + + Save Effect Settings + Сохранить параметры эффекта + + + + + Effect XML Settings %1 + Файлы с параметрами эффектов %1 + + + + Save Settings Failed + Не удалось сохранить параметры + + + + Failed to open "%1" for writing. + Не удалось открыть "%1" для записи. + + + + Load Effect Settings + Загрузить параметры эффекта + + + + + Load Settings Failed + Не удалось загрузить параметры + + + + Failed to open "%1" for reading. + Не удалось открыть "%1" для чтения. + + + + This settings file doesn't match this effect. + Это файлс параметрами совсем другого эффекта. + EffectControls @@ -259,22 +311,22 @@ Export Failed - + Не удалось экспортировать Export failed - %1 - + Не удалось экспортировать — %1 Invalid dimensions - + Некорректный размер кадра Export width and height must both be even numbers/divisible by 2. - + Ширина и высота кадра при экспорте должны делиться на 2 без остатка. @@ -329,7 +381,12 @@ 17-18 = visually lossless (compressed, but unnoticeable) 23 = high quality 51 = lowest quality possible - + Показатель качества: + +0 = без потерь в качестве +17-18 = визуально без потерь, хотя есть сжатие +23 = высокое качество +51 = самое низкое качество @@ -509,22 +566,22 @@ Failed to load Frei0r plugin "%1": %2 - + Не удалось загрузить плагшин Frei0r "%1": %2 NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + Вы не можете загружать 32-разрядные плагины Frei0r в 64-разрядный Olive. Найдите 64-разрядную версию этого плагина или установите 32-разрядную сборку Olive. NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + Вы не можете загружать 64-разрядные плагины Frei0r в 32-разрядный Olive. Найдите 32-разрядную версию этого плагина или установите 64-разрядную сборку Olive. Error loading Frei0r plugin - + Ошибка при загрузке плагина Frei0r @@ -573,7 +630,7 @@ None (Progressive) - + Нет (прогрессивно) @@ -588,7 +645,7 @@ Invalid - + Некорректный @@ -614,7 +671,7 @@ Hold - + Константа @@ -653,54 +710,54 @@ LoadThread - + Version Mismatch - + Несовпадение версий - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? - + Invalid Clip Link - + Некорректная связь клипов - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? - + %1 - Line: %2 Col: %3 - + User aborted loading - + Пользователь прервал загрузку - + XML Parsing Error - + Ошибка разбора XML - + Couldn't load '%1'. %2 - + Не удалось загрузить '%1'. %2 - + Project Load Error - + Ошибка при загрузке проекта - + Error loading project: %1 - + Ошибка при загрузке проекта: %1 @@ -923,7 +980,7 @@ Nest - + Вложить @@ -1263,12 +1320,12 @@ Enable Drag Files to Timeline - + Разрешить перетаскивание файлов на таймлайн извне Auto-Scale By Default - + Автоматически масштабировать по умолчанию @@ -1278,7 +1335,7 @@ Audio Scrubbing - + Воспроизводить звук при прокрутке @@ -1351,37 +1408,37 @@ Открыть проект… - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence Вложенная последовательность @@ -1416,12 +1473,12 @@ %1 fields (%2 frames) - + полей: %1 (кадров: %2) Interlacing: - + Чересстрочность: @@ -1467,22 +1524,22 @@ Audio Layout: %6 "%1" Properties - + Свойства "%1" Tracks: - + Дорожек: Video %1: %2x%3 %4FPS - + Видео %1: %2x%3 %4к/с Audio %1: %2Hz %3 channels - + Звук %1: %2Гц %3 каналов @@ -1502,12 +1559,12 @@ Audio Layout: %6 Interlacing: - + Чересстрочность: Name: - + Название: @@ -1664,12 +1721,12 @@ Audio Layout: %6 Invalid CSS File - + Некорректный файл CSS CSS file '%1' does not exist. - + Файл CSS '%1' не существует. @@ -1679,17 +1736,17 @@ Audio Layout: %6 Some changed settings will require restarting Olive to take effect - + Некоторые изменения параметров вступят в силу только при следующем запуске Olive Confirm Reset All Shortcuts - + Подтвердите действие Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? @@ -1700,17 +1757,17 @@ Audio Layout: %6 Error saving shortcuts - + Ошибка при сохранении клавиатурных комбинаций Failed to open file for reading - + Не удалось открыть файл для чтения Export Keyboard Shortcuts - + Экспортировать клавиатурные комбинации @@ -1720,17 +1777,17 @@ Audio Layout: %6 Shortcuts exported successfully - + Комбинации успешно экспортированы Failed to open file for writing - + Не удалось открыть файл для записи Browse for CSS file - + Указать файл CSS @@ -1770,7 +1827,7 @@ Audio Layout: %6 Effect Textbox Lines: - + Строк в редакторе титров: @@ -1800,51 +1857,53 @@ Audio Layout: %6 Disable Multithreading on Images - + Отключить многопоточность для изображений Seeking - + Позиционирование Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Точное позиционирование +Всегда показывать правильный кадр; на его получение может уходить немного времени Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Быстрое позиционирование +Переходы без пауз, возможен кратковременный показ неправильного кадра в мониторе Memory Usage - + Использование памяти Upcoming Frame Queue: - + Очередь последующих кадров: frames - + кадров seconds - + секунд Previous Frame Queue: - + Очередь предыдущих кадров: @@ -1915,7 +1974,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Keyboard - + Клавиатурные комбинации @@ -1923,12 +1982,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Could not open file - %1 - + Не удалось открыть файл — %1 Could not find stream information - %1 - + Не удалось найти информацию потока — %1 @@ -1968,17 +2027,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff No sequence is active, please open the sequence you want to replace clips from. - + Нет активных последовательностей. Откройте последовательность, в которой хотите заменить клипы. Active sequence selected - + Выбрана активная последовательность You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Вы не можете вставить последовательность в саму себя, так что клипы из этих файлов не могут попасть в эту последовательность. @@ -1998,7 +2057,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Файл '%1' уже используется в '%2'. Его удаление приведет к удалению всех его копий в выбранной последовательности. Вы точно этого хотите? @@ -2008,12 +2067,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Image sequence detected - + Обнаружена последовательность изображений The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? @@ -2023,83 +2082,83 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff No sequence is active, please open the sequence you want to delete clips from. - + Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. ProxyDialog - + Create Proxy Создать прокси - + Proxy Прокси - + Dimensions: Размер: - + Same Size as Source В размере оригинала - + Half Resolution (1/2) Половина оригинала (1/2) - + Quarter Resolution (1/4) Четверть оригинала (1/4) - + Eighth Resolution (1/8) Восьмая оригинала (1/8) - + Sixteenth Resolution (1/16) Шестнадцатая оригинала (1/16) - + Format: Формат: - + ProRes HQ ProRes HQ - + Location: Размещение: - + Same as Source (in "%1" folder) Как в исходнике (в папке «%1») - + Proxy file exists Прокси-файл уже существует - + The file "%1" already exists. Do you wish to replace it? Файл «%1» уже существует. Заменить его? - + Custom Location Другое размещение @@ -2107,7 +2166,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff ProxyGenerator - + Finished generating proxy for "%1" Завершено создание прокси для "%1" @@ -2425,7 +2484,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Edit Text - + Изменить текст @@ -2545,47 +2604,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimecodeEffect - + Timecode Тайм-код - + Sequence Последовательность - + Media Файл - + Scale Масштаб - + Color Цвет - + Background Color Цвет фона - + Background Opacity Непрозрачность фона - + Offset Смещение - + Prepend Префикс @@ -2593,162 +2652,162 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: Таймлайн: - + <none> <нет> - + Effect already exists Эффект уже добавлен - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? - + Add Добавить - + Replace Заменить - + Skip Пропустить - + Do this for all conflicts found Применить для всех конфликтов - + Set Marker Установить маркер - + Set clip marker name: - + Установить название маркера клипа: - + Set sequence marker name: - + Установить название маркера последовательности: - + Title... Титры… - + Solid Color... Цветная заливка… - + Bars... Испытательная таблица… - + Tone... Звуковой сигнал… - + Noise... Шум… - + Unsaved Project Несохранённый проект - + You must save this project before you can record audio in it. - + Перед записью звука необходимо сохранить проект. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Щелкните на таймлайне в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Snapping Прилипание - + Zoom In Приблизить - + Zoom Out Отдалить - + Record audio Записать звук - + Add title, solid, bars, etc. Добавить титры, заливку цветом, испытательную таблицу и т.д. @@ -2758,15 +2817,75 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Center Timecodes - + Центрировать тайм-код TimelineWidget + + + &Undo + &Отменить + + + + &Redo + В&ернуть + + + + C&ut + В&ырезать + + + + Cop&y + С&копировать + + + + &Paste + &Вставить + + + + R&ipple Delete + Уда&лить со сдвигом + + + + Sequence Settings + Параметры последовательности + + + + &Speed/Duration + С&корость/Длительность + + + + Auto-s&cale + Авто&масштабирование + Link/Unlink - + Связать/Убрать связь + + + + &Nest + Вло&жить + + + + &Reveal in Project + &Показать в проекте + + + + R&ename + Пере&именовать @@ -2774,27 +2893,30 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Start: %2 End: %3 Duration: %4 - + %1 +Начало: %2 +Конец: %3 +Длительность: %4 Rename '%1' - + Переименовать '%1' Rename multiple clips - + Переименовать клипы Enter a new name for this clip: - + Новое название этого клипа: Error - + Ошибка @@ -2935,7 +3057,7 @@ Duration: %4 Linear Dodge (Add) - Линейное осветление (Добавить) + Линейное осветление (+) @@ -3027,7 +3149,7 @@ Duration: %4 Error loading VST plugin - + Ошибка при загрузке плагина VST @@ -3062,22 +3184,22 @@ Duration: %4 Plugin - + Плагин Interface - + Интерфейс Show - + Показать VST Plugin - + Плагин VST @@ -3108,7 +3230,7 @@ Duration: %4 Show Fullscreen - Выйти из полноэкранного режима + Полноэкранный режим From c7b3ea56bc1a213d56c61b4ec0467fb8d019deb8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 10:10:30 +1100 Subject: [PATCH 095/202] separated marker function for reusability --- panels/timeline.cpp | 44 +++------------------------- panels/viewer.cpp | 6 +++- panels/viewer.h | 2 ++ project/marker.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++ project/marker.h | 5 ++++ 5 files changed, 87 insertions(+), 41 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index d7f83b489..fb30670a1 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1443,12 +1443,8 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo } void Timeline::set_marker() { - // add_marker is used to determine whether we're adding a marker, depending on whether the user input a marker name - // however if (config.set_name_with_marker) is true, we don't need a marker name so we just add - bool add_marker = !config.set_name_with_marker; - // determine if any clips are selected, and if so add markers to clips rather than the sequence - QVector clips_selected; + QVector clips_selected; bool clip_mode = false; for (int i=0;iclips.size();i++) { @@ -1459,7 +1455,7 @@ void Timeline::set_marker() { // only add markers if the playhead is inside the clip if (sequence->playhead >= c->timeline_in && sequence->playhead <= c->timeline_out) { - clips_selected.append(c); + clips_selected.append(i); } // we are definitely adding markers to clips though @@ -1474,41 +1470,9 @@ void Timeline::set_marker() { return; } - QString marker_name; + // pass off to internal set marker function + set_marker_internal(sequence, clips_selected); - // if (config.set_name_with_marker) is false (set above), ask for a marker name - if (!add_marker) { - QInputDialog d(this); - d.setWindowTitle(tr("Set Marker")); - d.setLabelText(clip_mode? tr("Set clip marker name:"): tr("Set sequence marker name:")); - d.setInputMode(QInputDialog::TextInput); - add_marker = (d.exec() == QDialog::Accepted); - marker_name = d.textValue(); - } - - // if we've decided to add a marker - if (add_marker) { - ComboAction* ca = new ComboAction(); - - // add an action for each clip - foreach (Clip* c, clips_selected) { - ca->append(new AddMarkerAction(false, - c, - sequence->playhead - c->timeline_in + c->clip_in, - marker_name)); - } - - // if no clips are selected, we're adding a marker to the sequence - if (!clip_mode) { - ca->append(new AddMarkerAction(true, sequence, sequence->playhead, marker_name)); - } - - // push action - undo_stack.push(ca); - - // redraw timeline - repaint_timeline(); - } } void Timeline::toggle_links() { diff --git a/panels/viewer.cpp b/panels/viewer.cpp index f827bd1f0..fb85ef7de 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -476,7 +476,11 @@ void Viewer::update_parents(bool reload_fx) { } int Viewer::get_playback_speed() { - return playback_speed; + return playback_speed; +} + +void Viewer::set_marker() { + set_marker_internal(seq); } void Viewer::resizeEvent(QResizeEvent *) { diff --git a/panels/viewer.h b/panels/viewer.h index ed2953343..97c65ed93 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -76,6 +76,8 @@ public: Sequence* seq; QVector* marker_ref; + void set_marker(); + TimelineHeader* headers; void resizeEvent(QResizeEvent *event); diff --git a/project/marker.cpp b/project/marker.cpp index b92cdc961..d91afb668 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -1,5 +1,15 @@ #include "marker.h" +#include "io/config.h" +#include "project/undo.h" +#include "mainwindow.h" +#include "project/sequence.h" +#include "project/clip.h" +#include "panels/panels.h" + +#include +#include + void draw_marker(QPainter &p, int x, int y, int bottom, bool selected, bool flipped) { const QPoint points[5] = { QPoint(x, bottom), @@ -16,3 +26,64 @@ void draw_marker(QPainter &p, int x, int y, int bottom, bool selected, bool flip } p.drawPolygon(points, 5); } + +void set_marker_internal(Sequence* seq, const QVector& clips) { + // if clips is empty, the marker is being added to the sequence + + // add_marker is used to determine whether we're adding a marker, depending on whether the user input a marker name + // however if (config.set_name_with_marker) is true, we don't need a marker name so we just add + bool add_marker = !config.set_name_with_marker; + + QString marker_name; + + // if (config.set_name_with_marker) is false (set above), ask for a marker name + if (!add_marker) { + QInputDialog d(mainWindow); + d.setWindowTitle(QCoreApplication::translate("Marker", "Set Marker")); + d.setLabelText(clips.size() > 0 + ? QCoreApplication::translate("Marker", "Set clip marker name:") + : QCoreApplication::translate("Marker", "Set sequence marker name:")); + d.setInputMode(QInputDialog::TextInput); + add_marker = (d.exec() == QDialog::Accepted); + marker_name = d.textValue(); + } + + // if we've decided to add a marker + if (add_marker) { + + ComboAction* ca = new ComboAction(); + + if (clips.size() > 0) { + + // add a marker action for each clip + foreach (int i, clips) { + Clip* c = seq->clips.at(i); + ca->append(new AddMarkerAction(false, + c, + seq->playhead - c->timeline_in + c->clip_in, + marker_name)); + } + + } else { + + // if no clips are selected, we're adding a marker to the sequence + ca->append(new AddMarkerAction(true, seq, seq->playhead, marker_name)); + + } + + + // push action + undo_stack.push(ca); + + // redraw UI for new markers + update_ui(false); + + } +} + +void set_marker_internal(Sequence* seq) { + // create empty clip array + QVector clips; + + set_marker_internal(seq, clips); +} diff --git a/project/marker.h b/project/marker.h index 8d1ef87b8..1d6d1e2cc 100644 --- a/project/marker.h +++ b/project/marker.h @@ -6,6 +6,8 @@ #include #include +struct Sequence; + struct Marker { long frame; QString name; @@ -13,4 +15,7 @@ struct Marker { void draw_marker(QPainter& p, int x, int y, int bottom, bool selected, bool flipped); +void set_marker_internal(Sequence* seq, const QVector& clips); +void set_marker_internal(Sequence* seq); + #endif // MARKER_H From 53f6d2278f344cb13a81c4f58695f1f05e6b96cb Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 10:54:05 +1100 Subject: [PATCH 096/202] fully implemented clip markers, fixes #333 --- mainwindow.cpp | 26 ++++++--- project/marker.cpp | 126 +++++++++++++++++++++++++------------------- project/undo.cpp | 35 +++++------- project/undo.h | 9 ++-- ui/viewerwidget.cpp | 24 ++++----- 5 files changed, 119 insertions(+), 101 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 13e934424..36b880367 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -387,10 +387,10 @@ void MainWindow::show_debug_log() { void MainWindow::delete_slot() { if (panel_timeline->headers->hasFocus()) { panel_timeline->headers->delete_markers(); - } else if (panel_footage_viewer->headers->hasFocus()) { - panel_footage_viewer->headers->delete_markers(); - } else if (panel_sequence_viewer->headers->hasFocus()) { - panel_sequence_viewer->headers->delete_markers(); + } else if (panel_footage_viewer->headers->hasFocus()) { + panel_footage_viewer->headers->delete_markers(); + } else if (panel_sequence_viewer->headers->hasFocus()) { + panel_sequence_viewer->headers->delete_markers(); } else if (panel_timeline->focused()) { panel_timeline->delete_selection(sequence->selections, false); } else if (panel_effect_controls->is_focused()) { @@ -775,9 +775,9 @@ void MainWindow::setup_menus() { playback_menu->addAction(tr("Go to In Point"), this, SLOT(go_to_in()), QKeySequence("Shift+I"))->setProperty("id", "gotoin"); playback_menu->addAction(tr("Go to Out Point"), this, SLOT(go_to_out()), QKeySequence("Shift+O"))->setProperty("id", "gotoout"); playback_menu->addSeparator(); - playback_menu->addAction(tr("Shuttle Left"), this, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); - playback_menu->addAction(tr("Shuttle Stop"), this, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); - playback_menu->addAction(tr("Shuttle Right"), this, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); + playback_menu->addAction(tr("Shuttle Left"), this, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); + playback_menu->addAction(tr("Shuttle Stop"), this, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); + playback_menu->addAction(tr("Shuttle Right"), this, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); playback_menu->addSeparator(); loop_action = playback_menu->addAction(tr("Loop"), this, SLOT(toggle_bool_action())); @@ -1523,7 +1523,17 @@ void MainWindow::set_tsa_custom() { } void MainWindow::set_marker() { - if (sequence != nullptr) panel_timeline->set_marker(); + if (sequence != nullptr) { + QDockWidget* focused_panel = get_focused_panel(); + + if (focused_panel == panel_timeline) { + panel_timeline->set_marker(); + } else if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->set_marker(); + } else if (focused_panel == panel_sequence_viewer) { + panel_sequence_viewer->set_marker(); + } + } } void MainWindow::toggle_enable_clips() { diff --git a/project/marker.cpp b/project/marker.cpp index d91afb668..646459cac 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -6,84 +6,102 @@ #include "project/sequence.h" #include "project/clip.h" #include "panels/panels.h" +#include "panels/viewer.h" #include #include void draw_marker(QPainter &p, int x, int y, int bottom, bool selected, bool flipped) { - const QPoint points[5] = { - QPoint(x, bottom), - QPoint(x + MARKER_SIZE, bottom - MARKER_SIZE), - QPoint(x + MARKER_SIZE, y), - QPoint(x - MARKER_SIZE, y), - QPoint(x - MARKER_SIZE, bottom - MARKER_SIZE) - }; - p.setPen(Qt::black); - if (selected) { - p.setBrush(QColor(208, 255, 208)); - } else { - p.setBrush(QColor(128, 224, 128)); - } - p.drawPolygon(points, 5); + const QPoint points[5] = { + QPoint(x, bottom), + QPoint(x + MARKER_SIZE, bottom - MARKER_SIZE), + QPoint(x + MARKER_SIZE, y), + QPoint(x - MARKER_SIZE, y), + QPoint(x - MARKER_SIZE, bottom - MARKER_SIZE) + }; + p.setPen(Qt::black); + if (selected) { + p.setBrush(QColor(208, 255, 208)); + } else { + p.setBrush(QColor(128, 224, 128)); + } + p.drawPolygon(points, 5); } void set_marker_internal(Sequence* seq, const QVector& clips) { - // if clips is empty, the marker is being added to the sequence + // if clips is empty, the marker is being added to the sequence - // add_marker is used to determine whether we're adding a marker, depending on whether the user input a marker name - // however if (config.set_name_with_marker) is true, we don't need a marker name so we just add - bool add_marker = !config.set_name_with_marker; + // add_marker is used to determine whether we're adding a marker, depending on whether the user input a marker name + // however if (config.set_name_with_marker) is true, we don't need a marker name so we just add + bool add_marker = !config.set_name_with_marker; - QString marker_name; + QString marker_name; - // if (config.set_name_with_marker) is false (set above), ask for a marker name - if (!add_marker) { - QInputDialog d(mainWindow); - d.setWindowTitle(QCoreApplication::translate("Marker", "Set Marker")); - d.setLabelText(clips.size() > 0 - ? QCoreApplication::translate("Marker", "Set clip marker name:") - : QCoreApplication::translate("Marker", "Set sequence marker name:")); - d.setInputMode(QInputDialog::TextInput); - add_marker = (d.exec() == QDialog::Accepted); - marker_name = d.textValue(); - } + // if (config.set_name_with_marker) is false (set above), ask for a marker name + if (!add_marker) { + QInputDialog d(mainWindow); + d.setWindowTitle(QCoreApplication::translate("Marker", "Set Marker")); + d.setLabelText(clips.size() > 0 + ? QCoreApplication::translate("Marker", "Set clip marker name:") + : QCoreApplication::translate("Marker", "Set sequence marker name:")); + d.setInputMode(QInputDialog::TextInput); + add_marker = (d.exec() == QDialog::Accepted); + marker_name = d.textValue(); + } - // if we've decided to add a marker - if (add_marker) { + // if we've decided to add a marker + if (add_marker) { - ComboAction* ca = new ComboAction(); + ComboAction* ca = new ComboAction(); - if (clips.size() > 0) { + if (clips.size() > 0) { - // add a marker action for each clip - foreach (int i, clips) { - Clip* c = seq->clips.at(i); - ca->append(new AddMarkerAction(false, - c, - seq->playhead - c->timeline_in + c->clip_in, - marker_name)); - } + // add a marker action for each clip + foreach (int i, clips) { + Clip* c = seq->clips.at(i); + ca->append(new AddMarkerAction(&c->get_markers(), + seq->playhead - c->timeline_in + c->clip_in, + marker_name)); + } - } else { + } else { - // if no clips are selected, we're adding a marker to the sequence - ca->append(new AddMarkerAction(true, seq, seq->playhead, marker_name)); + // if no clips are selected, we're adding a marker to the sequence - } + // kind of hacky, we get the correct marker structure from the viewer panel object that the sequence is attached to + if (seq == panel_footage_viewer->seq) { + + // get correct marker reference from footage viewer + ca->append(new AddMarkerAction(panel_footage_viewer->marker_ref, seq->playhead, marker_name)); + + } else if (seq == panel_sequence_viewer->seq) { + + // get correct marker reference from sequence viewer + ca->append(new AddMarkerAction(panel_sequence_viewer->marker_ref, seq->playhead, marker_name)); + + } else { + + // fallback to using markers from sequence provided + ca->append(new AddMarkerAction(&seq->markers, seq->playhead, marker_name)); + + } + + } - // push action - undo_stack.push(ca); + // push action + undo_stack.push(ca); - // redraw UI for new markers - update_ui(false); + // redraw UI for new markers + update_ui(false); + panel_footage_viewer->update_viewer(); - } + } } void set_marker_internal(Sequence* seq) { - // create empty clip array - QVector clips; + // create empty clip array + QVector clips; - set_marker_internal(seq, clips); + set_marker_internal(seq, clips); } diff --git a/project/undo.cpp b/project/undo.cpp index 0ba5366c5..098f301f9 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -804,23 +804,18 @@ void SetAutoscaleAction::redo() { mainWindow->setWindowModified(true); } -AddMarkerAction::AddMarkerAction(bool is_sequence, void* s, long t, QString n) : - is_sequence_internal(is_sequence), - target(s), +AddMarkerAction::AddMarkerAction(QVector* m, long t, QString n) : + active_array(m), time(t), name(n), old_project_changed(mainWindow->isWindowModified()) {} void AddMarkerAction::undo() { - QVector& markers = is_sequence_internal ? - static_cast(target)->markers : - static_cast(target)->get_markers(); - if (index == -1) { - markers.removeLast(); + active_array->removeLast(); } else { - markers[index].name = old_name; + active_array[0][index].name = old_name; } mainWindow->setWindowModified(old_project_changed); @@ -829,12 +824,8 @@ void AddMarkerAction::undo() { void AddMarkerAction::redo() { index = -1; - QVector& markers = is_sequence_internal ? - static_cast(target)->markers : - static_cast(target)->get_markers(); - - for (int i=0;isize();i++) { + if (active_array->at(i).frame == time) { index = i; break; } @@ -844,10 +835,10 @@ void AddMarkerAction::redo() { Marker m; m.frame = time; m.name = name; - markers.append(m); + active_array->append(m); } else { - old_name = markers.at(index).name; - markers[index].name = name; + old_name = active_array->at(index).name; + active_array[0][index].name = name; } mainWindow->setWindowModified(true); @@ -871,14 +862,14 @@ void MoveMarkerAction::redo() { } DeleteMarkerAction::DeleteMarkerAction(QVector *m) : - active_array(m), + active_array(m), sorted(false), old_project_changed(mainWindow->isWindowModified()) {} void DeleteMarkerAction::undo() { for (int i=markers.size()-1;i>=0;i--) { - active_array->insert(markers.at(i), copies.at(i)); + active_array->insert(markers.at(i), copies.at(i)); } mainWindow->setWindowModified(old_project_changed); } @@ -887,14 +878,14 @@ void DeleteMarkerAction::redo() { for (int i=0;iat(markers.at(i))); + copies.append(active_array->at(markers.at(i))); for (int j=i+1;j markers.at(i)) { markers[j]--; } } } - active_array->removeAt(markers.at(i)); + active_array->removeAt(markers.at(i)); } sorted = true; mainWindow->setWindowModified(true); diff --git a/project/undo.h b/project/undo.h index 6a30be099..2d45c4746 100644 --- a/project/undo.h +++ b/project/undo.h @@ -384,12 +384,11 @@ private: class AddMarkerAction : public QUndoCommand { public: - AddMarkerAction(bool is_sequence, void* s, long t, QString n); + AddMarkerAction(QVector* m, long t, QString n); void undo(); void redo(); private: - bool is_sequence_internal; - void* target; + QVector* active_array; long time; QString name; QString old_name; @@ -411,12 +410,12 @@ private: class DeleteMarkerAction : public QUndoCommand { public: - DeleteMarkerAction(QVector* m); + DeleteMarkerAction(QVector* m); void undo(); void redo(); QVector markers; private: - QVector* active_array; + QVector* active_array; QVector copies; bool sorted; bool old_project_changed; diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index f6031f4ea..57bd5c0a3 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -93,20 +93,20 @@ void ViewerWidget::set_waveform_scroll(int s) { if (waveform) { waveform_scroll = s; update(); - } + } } void ViewerWidget::set_fullscreen(int screen) { - if (screen >= 0 && screen < QGuiApplication::screens().size()) { - QScreen* selected_screen = QGuiApplication::screens().at(screen); - window->showFullScreen(); - window->setGeometry(selected_screen->geometry()); + if (screen >= 0 && screen < QGuiApplication::screens().size()) { + QScreen* selected_screen = QGuiApplication::screens().at(screen); + window->showFullScreen(); + window->setGeometry(selected_screen->geometry()); - // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown - QTimer::singleShot(100, window, SLOT(update())); - } else { - qCritical() << "Failed to find requested screen" << screen << "to set fullscreen to"; - } + // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown + QTimer::singleShot(100, window, SLOT(update())); + } else { + qCritical() << "Failed to find requested screen" << screen << "to set fullscreen to"; + } } void ViewerWidget::show_context_menu() { @@ -183,7 +183,7 @@ void ViewerWidget::fullscreen_menu_action(QAction *action) { if (action->data().isNull()) { window->hide(); } else { - set_fullscreen(action->data().toInt()); + set_fullscreen(action->data().toInt()); } } } @@ -567,7 +567,7 @@ void ViewerWidget::paintGL() { makeCurrent(); // clear to solid black - glClearColor(0.0, 0.0, 0.0, 1.0); + glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // set color multipler to straight white From 4ac2f2b5ca990aac5c9ad651790cdbaf3d1fbc49 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 16:10:19 +1100 Subject: [PATCH 097/202] removed disable in/out, fixes #426 --- dialogs/exportdialog.cpp | 2 +- io/loadthread.cpp | 108 +++++++++++++++++++-------------------- mainwindow.cpp | 9 ---- mainwindow.h | 1 - panels/project.cpp | 25 +++++---- panels/timeline.cpp | 52 +++++++++---------- panels/viewer.cpp | 35 +++++-------- panels/viewer.h | 9 ++-- project/sequence.cpp | 3 +- project/sequence.h | 1 - project/undo.cpp | 3 -- project/undo.h | 2 - ui/timelineheader.cpp | 34 ++++++------ 13 files changed, 128 insertions(+), 156 deletions(-) diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index ec7a0ab7f..e1c9991c1 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -63,7 +63,7 @@ ExportDialog::ExportDialog(QWidget *parent) : rangeCombobox->setCurrentIndex(0); if (sequence->using_workarea) { rangeCombobox->setEnabled(true); - if (sequence->enable_workarea) rangeCombobox->setCurrentIndex(1); + rangeCombobox->setCurrentIndex(1); } format_strings.resize(FORMAT_SIZE); diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 7f4911be4..24825bcb4 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -185,34 +185,34 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { int folder = 0; Media* item = new Media(0); - Footage* f = new Footage(); + Footage* f = new Footage(); - f->using_inout = false; + f->using_inout = false; for (int j=0;jsave_id = attr.value().toInt(); + f->save_id = attr.value().toInt(); } else if (attr.name() == "folder") { folder = attr.value().toInt(); } else if (attr.name() == "name") { - f->name = attr.value().toString(); + f->name = attr.value().toString(); } else if (attr.name() == "url") { - f->url = attr.value().toString(); + f->url = attr.value().toString(); - if (!QFileInfo::exists(f->url)) { // if path is not absolute - QString proj_dir_test = proj_dir.absoluteFilePath(f->url); - QString internal_proj_dir_test = internal_proj_dir.absoluteFilePath(f->url); + if (!QFileInfo::exists(f->url)) { // if path is not absolute + QString proj_dir_test = proj_dir.absoluteFilePath(f->url); + QString internal_proj_dir_test = internal_proj_dir.absoluteFilePath(f->url); if (QFileInfo::exists(proj_dir_test)) { // if path is relative to the project's current dir - f->url = proj_dir_test; + f->url = proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's current directory"; } else if (QFileInfo::exists(internal_proj_dir_test)) { // if path is relative to the last directory the project was saved in - f->url = internal_proj_dir_test; + f->url = internal_proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's internal directory"; - } else if (f->url.contains('%')) { + } else if (f->url.contains('%')) { // hack for image sequences (qt won't be able to find the URL with %, but ffmpeg may) - f->url = internal_proj_dir_test; + f->url = internal_proj_dir_test; qInfo() << "Guess image sequence" << attr.value().toString() << "path to project's internal directory"; } else { qInfo() << "Failed to match" << attr.value().toString() << "to file"; @@ -221,41 +221,41 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { qInfo() << "Matched" << attr.value().toString() << "with absolute path"; } } else if (attr.name() == "duration") { - f->length = attr.value().toLongLong(); + f->length = attr.value().toLongLong(); } else if (attr.name() == "using_inout") { - f->using_inout = (attr.value() == "1"); + f->using_inout = (attr.value() == "1"); } else if (attr.name() == "in") { - f->in = attr.value().toLong(); + f->in = attr.value().toLong(); } else if (attr.name() == "out") { - f->out = attr.value().toLong(); + f->out = attr.value().toLong(); } else if (attr.name() == "speed") { - f->speed = attr.value().toDouble(); + f->speed = attr.value().toDouble(); } else if (attr.name() == "alphapremul") { - f->alpha_is_premultiplied = (attr.value() == "1"); + f->alpha_is_premultiplied = (attr.value() == "1"); } else if (attr.name() == "proxy") { - f->proxy = (attr.value() == "1"); + f->proxy = (attr.value() == "1"); } else if (attr.name() == "proxypath") { - f->proxy_path = attr.value().toString(); + f->proxy_path = attr.value().toString(); } - } + } - while (!cancelled && !(stream.name() == child_search && stream.isEndElement()) && !stream.atEnd()) { - read_next_start_element(stream); - if (stream.name() == "marker" && stream.isStartElement()) { - Marker m; - for (int j=0;jmarkers.append(m); - } - } + while (!cancelled && !(stream.name() == child_search && stream.isEndElement()) && !stream.atEnd()) { + read_next_start_element(stream); + if (stream.name() == "marker" && stream.isStartElement()) { + Marker m; + for (int j=0;jmarkers.append(m); + } + } - item->set_footage(f); + item->set_footage(f); if (folder == 0) { project_model.appendChild(nullptr, item); @@ -296,8 +296,6 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { open_seq = s; } else if (attr.name() == "workarea") { s->using_workarea = (attr.value() == "1"); - } else if (attr.name() == "workareaEnabled") { - s->enable_workarea = (attr.value() == "1"); } else if (attr.name() == "workareaIn") { s->workarea_in = attr.value().toLong(); } else if (attr.name() == "workareaOut") { @@ -429,24 +427,24 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { } } if (cancelled) return false; - } else if (stream.isStartElement() - && (stream.name() == "effect" - || stream.name() == "opening" - || stream.name() == "closing")) { + } else if (stream.isStartElement() + && (stream.name() == "effect" + || stream.name() == "opening" + || stream.name() == "closing")) { // "opening" and "closing" are backwards compatibility code load_effect(stream, c); - } else if (stream.name() == "marker" && stream.isStartElement()) { - Marker m; - for (int j=0;jget_markers().append(m); - } + } else if (stream.name() == "marker" && stream.isStartElement()) { + Marker m; + for (int j=0;jget_markers().append(m); + } } } if (cancelled) return false; diff --git a/mainwindow.cpp b/mainwindow.cpp index 36b880367..805d06552 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -268,7 +268,6 @@ void MainWindow::make_new_menu(QMenu *parent) { void MainWindow::make_inout_menu(QMenu *parent) { parent->addAction(tr("Set In Point"), this, SLOT(set_in_point()), QKeySequence("I"))->setProperty("id", "setinpoint"); parent->addAction(tr("Set Out Point"), this, SLOT(set_out_point()), QKeySequence("O"))->setProperty("id", "setoutpoint"); - parent->addAction(tr("Enable/Disable In/Out Point"), this, SLOT(enable_inout()))->setProperty("id", "enableinout"); parent->addSeparator(); parent->addAction(tr("Reset In Point"), this, SLOT(clear_in()))->setProperty("id", "resetin"); parent->addAction(tr("Reset Out Point"), this, SLOT(clear_out()))->setProperty("id", "resetout"); @@ -1465,14 +1464,6 @@ void MainWindow::ripple_delete_inout() } } -void MainWindow::enable_inout() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->toggle_enable_inout(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->toggle_enable_inout(); - } -} - void MainWindow::set_tsa_default() { config.show_title_safe_area = true; config.use_custom_title_safe_ratio = false; diff --git a/mainwindow.h b/mainwindow.h index bd83a9436..50f4c2798 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -115,7 +115,6 @@ private slots: void clear_inout(); void delete_inout(); void ripple_delete_inout(); - void enable_inout(); // title safe area functions void set_tsa_disable(); diff --git a/panels/project.cpp b/panels/project.cpp index 725cd6152..2180f6472 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -970,7 +970,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("proxy", QString::number(f->proxy)); stream.writeAttribute("proxypath", f->proxy_path); - // save video stream metadata + // save video stream metadata for (int j=0;jvideo_tracks.size();j++) { const FootageStream& ms = f->video_tracks.at(j); stream.writeStartElement("video"); @@ -979,10 +979,10 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("height", QString::number(ms.video_height)); stream.writeAttribute("framerate", QString::number(ms.video_frame_rate, 'f', 10)); stream.writeAttribute("infinite", QString::number(ms.infinite_length)); - stream.writeEndElement(); // video + stream.writeEndElement(); // video } - // save audio stream metadata + // save audio stream metadata for (int j=0;jaudio_tracks.size();j++) { const FootageStream& ms = f->audio_tracks.at(j); stream.writeStartElement("audio"); @@ -990,15 +990,15 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("channels", QString::number(ms.audio_channels)); stream.writeAttribute("layout", QString::number(ms.audio_layout)); stream.writeAttribute("frequency", QString::number(ms.audio_frequency)); - stream.writeEndElement(); // audio + stream.writeEndElement(); // audio } - // save footage markers - for (int j=0;jmarkers.size();j++) { - save_marker(stream, f->markers.at(j)); - } + // save footage markers + for (int j=0;jmarkers.size();j++) { + save_marker(stream, f->markers.at(j)); + } - stream.writeEndElement(); // footage + stream.writeEndElement(); // footage media_id++; } else if (type == MEDIA_TYPE_SEQUENCE) { Sequence* s = m->to_sequence(); @@ -1019,7 +1019,6 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("open", "1"); } stream.writeAttribute("workarea", QString::number(s->using_workarea)); - stream.writeAttribute("workareaEnabled", QString::number(s->enable_workarea)); stream.writeAttribute("workareaIn", QString::number(s->workarea_in)); stream.writeAttribute("workareaOut", QString::number(s->workarea_out)); @@ -1071,8 +1070,8 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, } // save markers - // only necessary for null media clips, since media has its own markers - if (c->media == nullptr) { + // only necessary for null media clips, since media has its own markers + if (c->media == nullptr) { for (int k=0;kget_markers().size();k++) { save_marker(stream, c->get_markers().at(k)); } @@ -1096,7 +1095,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeEndElement(); // clip } } - for (int j=0;jmarkers.size();j++) { + for (int j=0;jmarkers.size();j++) { save_marker(stream, s->markers.at(j)); } stream.writeEndElement(); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index fb30670a1..df07305cc 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -143,15 +143,15 @@ void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const Q } void Timeline::toggle_show_all() { - if (sequence != nullptr) { - showing_all = !showing_all; - if (showing_all) { - old_zoom = zoom; - set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); - } else { - set_zoom_value(old_zoom); - } - } + if (sequence != nullptr) { + showing_all = !showing_all; + if (showing_all) { + old_zoom = zoom; + set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); + } else { + set_zoom_value(old_zoom); + } + } } void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector& media_list) { @@ -235,7 +235,7 @@ void Timeline::create_ghosts_from_media(Sequence* seq, long entry_point, QVector case MEDIA_TYPE_SEQUENCE: g.out = entry_point + sequence_length - default_clip_in; - if (s->using_workarea && s->enable_workarea) { + if (s->using_workarea) { g.out -= (sequence_length - default_clip_out); } @@ -1430,8 +1430,8 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo return true; } else { // try to snap to clip markers - for (int j=0;jget_markers().size();j++) { - if (snap_to_point(c->get_markers().at(j).frame + c->timeline_in - c->clip_in, l)) { + for (int j=0;jget_markers().size();j++) { + if (snap_to_point(c->get_markers().at(j).frame + c->timeline_in - c->clip_in, l)) { return true; } } @@ -1444,7 +1444,7 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo void Timeline::set_marker() { // determine if any clips are selected, and if so add markers to clips rather than the sequence - QVector clips_selected; + QVector clips_selected; bool clip_mode = false; for (int i=0;iclips.size();i++) { @@ -1452,26 +1452,26 @@ void Timeline::set_marker() { if (c != nullptr && is_clip_selected(c, true)) { - // only add markers if the playhead is inside the clip - if (sequence->playhead >= c->timeline_in - && sequence->playhead <= c->timeline_out) { - clips_selected.append(i); - } + // only add markers if the playhead is inside the clip + if (sequence->playhead >= c->timeline_in + && sequence->playhead <= c->timeline_out) { + clips_selected.append(i); + } - // we are definitely adding markers to clips though + // we are definitely adding markers to clips though clip_mode = true; } } - // if we've selected clips but none of the clips are within the playhead, - // nothing to do here - if (clip_mode && clips_selected.size() == 0) { - return; - } + // if we've selected clips but none of the clips are within the playhead, + // nothing to do here + if (clip_mode && clips_selected.size() == 0) { + return; + } - // pass off to internal set marker function - set_marker_internal(sequence, clips_selected); + // pass off to internal set marker function + set_marker_internal(sequence, clips_selected); } diff --git a/panels/viewer.cpp b/panels/viewer.cpp index fb85ef7de..bf87e208a 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -282,7 +282,7 @@ void Viewer::close_media() { void Viewer::go_to_in() { if (seq != nullptr) { - if (seq->using_workarea && seq->enable_workarea) { + if (seq->using_workarea) { seek(seq->workarea_in); } else { go_to_start(); @@ -300,7 +300,7 @@ void Viewer::next_frame() { void Viewer::go_to_out() { if (seq != nullptr) { - if (seq->using_workarea && seq->enable_workarea) { + if (seq->using_workarea) { seek(seq->workarea_out); } else { go_to_end(); @@ -363,7 +363,7 @@ void Viewer::play(bool in_to_out) { uncue_recording(); } - bool seek_to_in = (seq->using_workarea && config.loop); + bool seek_to_in = (seq->using_workarea && (config.loop || playing_in_to_out)); if (!is_recording_cued() && (playing_in_to_out || seq->playhead >= seq->getEndFrame() @@ -471,16 +471,16 @@ void Viewer::update_parents(bool reload_fx) { update_ui(reload_fx); } else { update_viewer(); - panel_timeline->repaint_timeline(); + panel_timeline->repaint_timeline(); } } int Viewer::get_playback_speed() { - return playback_speed; + return playback_speed; } void Viewer::set_marker() { - set_marker_internal(seq); + set_marker_internal(seq); } void Viewer::resizeEvent(QResizeEvent *) { @@ -518,13 +518,6 @@ void Viewer::clear_inout_point() { } } -void Viewer::toggle_enable_inout() { - if (seq != nullptr && seq->using_workarea) { - undo_stack.push(new SetBool(&seq->enable_workarea, !seq->enable_workarea)); - update_parents(); - } -} - void Viewer::set_in_point() { headers->set_in_point(seq->playhead); } @@ -580,13 +573,13 @@ void Viewer::set_playback_speed(int s) { } long Viewer::get_seq_in() { - return ((config.loop || playing_in_to_out) && seq->using_workarea && seq->enable_workarea) + return ((config.loop || playing_in_to_out) && seq->using_workarea) ? seq->workarea_in : 0; } long Viewer::get_seq_out() { - return ((config.loop || playing_in_to_out) && seq->using_workarea && seq->enable_workarea && previous_playhead < seq->workarea_out) + return ((config.loop || playing_in_to_out) && seq->using_workarea && previous_playhead < seq->workarea_out) ? seq->workarea_out : seq->getEndFrame(); } @@ -690,16 +683,16 @@ void Viewer::setup_ui() { void Viewer::set_media(Media* m) { main_sequence = false; - media = m; + media = m; - clean_created_seq(); + clean_created_seq(); if (media != nullptr) { switch (media->get_type()) { case MEDIA_TYPE_FOOTAGE: { Footage* footage = media->to_footage(); - marker_ref = &footage->markers; + marker_ref = &footage->markers; seq = new Sequence(); created_sequence = true; @@ -865,9 +858,9 @@ void Viewer::set_sequence(bool main, Sequence *s) { viewer_container->adjust(); - if (!created_sequence) { - marker_ref = &seq->markers; - } + if (!created_sequence) { + marker_ref = &seq->markers; + } } else { update_playhead_timecode(0); update_end_timecode(); diff --git a/panels/viewer.h b/panels/viewer.h index 97c65ed93..51d9396d6 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -42,7 +42,6 @@ public: void clear_in(); void clear_out(); void clear_inout_point(); - void toggle_enable_inout(); void set_in_point(); void set_out_point(); void set_zoom(bool in); @@ -73,12 +72,12 @@ public: ViewerWidget* viewer_widget; Media* media; - Sequence* seq; - QVector* marker_ref; + Sequence* seq; + QVector* marker_ref; - void set_marker(); + void set_marker(); - TimelineHeader* headers; + TimelineHeader* headers; void resizeEvent(QResizeEvent *event); diff --git a/project/sequence.cpp b/project/sequence.cpp index 6a2fe62cf..6ec6afcf4 100644 --- a/project/sequence.cpp +++ b/project/sequence.cpp @@ -10,7 +10,6 @@ Sequence::Sequence() : playhead(0), using_workarea(false), - enable_workarea(true), workarea_in(0), workarea_out(0), wrapper_sequence(false) @@ -26,7 +25,7 @@ Sequence::~Sequence() { Sequence* Sequence::copy() { Sequence* s = new Sequence(); - s->name = QCoreApplication::translate("Sequence", "%1 (copy)").arg(name); + s->name = QCoreApplication::translate("Sequence", "%1 (copy)").arg(name); s->width = width; s->height = height; s->frame_rate = frame_rate; diff --git a/project/sequence.h b/project/sequence.h index e3afc6d36..bf62edfd9 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -28,7 +28,6 @@ struct Sequence { long playhead; bool using_workarea; - bool enable_workarea; long workarea_in; long workarea_out; diff --git a/project/undo.cpp b/project/undo.cpp index 098f301f9..13c38460d 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -210,7 +210,6 @@ SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long void SetTimelineInOutCommand::undo() { seq->using_workarea = old_enabled; - seq->enable_workarea = old_workarea_enabled; seq->workarea_in = old_in; seq->workarea_out = old_out; @@ -227,11 +226,9 @@ void SetTimelineInOutCommand::undo() { void SetTimelineInOutCommand::redo() { old_enabled = seq->using_workarea; - old_workarea_enabled = seq->enable_workarea; old_in = seq->workarea_in; old_out = seq->workarea_out; - if (!seq->using_workarea) seq->enable_workarea = true; seq->using_workarea = new_enabled; seq->workarea_in = new_in; seq->workarea_out = new_out; diff --git a/project/undo.h b/project/undo.h index 2d45c4746..98c78143a 100644 --- a/project/undo.h +++ b/project/undo.h @@ -174,8 +174,6 @@ public: private: Sequence* seq; - bool old_workarea_enabled; - bool old_enabled; long old_in; long old_out; diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index c6bdaa1fc..140872784 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -143,8 +143,8 @@ void TimelineHeader::mousePressEvent(QMouseEvent* event) { if (event->pos().y() > get_marker_offset() && (event->pos().x() < playhead_x-PLAYHEAD_SIZE || event->pos().x() > playhead_x+PLAYHEAD_SIZE)) { - for (int i=0;imarker_ref->size();i++) { - int marker_pos = getHeaderScreenPointFromFrame(viewer->marker_ref->at(i).frame); + for (int i=0;imarker_ref->size();i++) { + int marker_pos = getHeaderScreenPointFromFrame(viewer->marker_ref->at(i).frame); if (event->pos().x() > marker_pos - MARKER_SIZE && event->pos().x() < marker_pos + MARKER_SIZE) { bool found = false; for (int j=0;jmarker_ref->at(selected_markers.at(i)).frame; + selected_marker_original_times[i] = viewer->marker_ref->at(selected_markers.at(i)).frame; } drag_start = event->pos().x(); dragging_markers = true; @@ -225,7 +225,7 @@ void TimelineHeader::mouseMoveEvent(QMouseEvent* event) { // move markers for (int i=0;imarker_ref[0][selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; + viewer->marker_ref[0][selected_markers.at(i)].frame = selected_marker_original_times.at(i) + frame_movement; } update_parents(); @@ -264,7 +264,7 @@ void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { bool moved = false; ComboAction* ca = new ComboAction(); for (int i=0;imarker_ref[0][selected_markers.at(i)]; + Marker* m = &viewer->marker_ref[0][selected_markers.at(i)]; if (selected_marker_original_times.at(i) != m->frame) { ca->append(new MoveMarkerAction(m, selected_marker_original_times.at(i), m->frame)); moved = true; @@ -305,7 +305,7 @@ double TimelineHeader::get_zoom() { void TimelineHeader::delete_markers() { if (selected_markers.size() > 0) { - DeleteMarkerAction* dma = new DeleteMarkerAction(viewer->marker_ref); + DeleteMarkerAction* dma = new DeleteMarkerAction(viewer->marker_ref); for (int i=0;imarkers.append(selected_markers.at(i)); } @@ -397,27 +397,27 @@ void TimelineHeader::paintEvent(QPaintEvent*) { if (viewer->seq->using_workarea) { in_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_in : viewer->seq->workarea_in)); int out_x = getHeaderScreenPointFromFrame((resizing_workarea ? temp_workarea_out : viewer->seq->workarea_out)); - p.fillRect(QRect(in_x, 0, out_x-in_x, height()), viewer->seq->enable_workarea ? QColor(0, 192, 255, 128) : QColor(255, 255, 255, 64)); + p.fillRect(QRect(in_x, 0, out_x-in_x, height()), QColor(0, 192, 255, 128)); p.setPen(Qt::white); p.drawLine(in_x, 0, in_x, height()); p.drawLine(out_x, 0, out_x, height()); } // draw markers - for (int i=0;imarker_ref->size();i++) { - const Marker& m = viewer->marker_ref->at(i); + for (int i=0;imarker_ref->size();i++) { + const Marker& m = viewer->marker_ref->at(i); int marker_x = getHeaderScreenPointFromFrame(m.frame); - bool selected = false; - for (int j=0;j Date: Mon, 4 Feb 2019 17:31:35 +1100 Subject: [PATCH 098/202] added path search system for translations --- dialogs/preferencesdialog.cpp | 27 +++++++++++++++++---------- io/path.cpp | 9 +++++++++ io/path.h | 1 + main.cpp | 5 +++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 2e5e8ef81..b9218eda1 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -384,17 +384,24 @@ void PreferencesDialog::setup_ui() { language_combobox->addItem(QLocale::languageToString(QLocale("en-US").language())); // add languages from file - QDir translation_dir(QApplication::applicationDirPath().append("/ts")); - QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot); - for (int i=0;iaddItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); + QList translation_paths = get_language_paths(); - if (config.language_file == locale_full_path) { - language_combobox->setCurrentIndex(language_combobox->count() - 1); + // iterate through all language search paths + for (int j=0;jaddItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); + + if (config.language_file == locale_full_path) { + language_combobox->setCurrentIndex(language_combobox->count() - 1); + } + } } } diff --git a/io/path.cpp b/io/path.cpp index 1c7ba4b67..dc5b26a89 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -44,3 +44,12 @@ QString get_file_hash(const QString& filename) { QString cache_file = filename.mid(filename.lastIndexOf('/')+1) + QString::number(file_info.size()) + QString::number(file_info.lastModified().toMSecsSinceEpoch()); return QCryptographicHash::hash(cache_file.toUtf8(), QCryptographicHash::Md5).toHex(); } + +QList get_language_paths() { + QList language_paths; + language_paths.append(get_app_dir() + "/ts"); + language_paths.append(get_app_dir() + "/../share/olive-editor/ts"); + QString env_path(qgetenv("OLIVE_LANG_PATH")); + if (!env_path.isEmpty()) language_paths.append(env_path); + return language_paths; +} diff --git a/io/path.h b/io/path.h index 2a721c0fd..67771b330 100644 --- a/io/path.h +++ b/io/path.h @@ -7,6 +7,7 @@ QString get_app_dir(); QString get_data_path(); QString get_config_path(); QList get_effects_paths(); +QList get_language_paths(); // generate hash algorithm used to uniquely identify files QString get_file_hash(const QString& filename); diff --git a/main.cpp b/main.cpp index 434a62113..bae67df3e 100644 --- a/main.cpp +++ b/main.cpp @@ -43,6 +43,11 @@ int main(int argc, char *argv[]) { "\t--no-debug\t\tDisable internal debug log and output directly to console\n" "\t--disable-blend-modes\tDisable shader-based blending for older GPUs\n" "\t--translation \tSet an external language file to use\n" + "\n" + "Environment Variables:\n" + "\tOLIVE_EFFECTS_PATH\tSpecify a path to search for GLSL shader effects\n" + "\tFREI0R_PATH\t\tSpecify a path to search for Frei0r effects\n" + "\tOLIVE_LANG_PATH\t\tSpecify a path to search for translation files\n" "\n", argv[0]); return 0; } else if (!strcmp(argv[i], "--fullscreen") || !strcmp(argv[i], "-f")) { From 0262be6b13533d562326dd5bd7fa35915c1fafe1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 17:48:01 +1100 Subject: [PATCH 099/202] added translations to make install --- olive.pro | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/olive.pro b/olive.pro index 209931772..9b7f58012 100644 --- a/olive.pro +++ b/olive.pro @@ -284,6 +284,9 @@ unix:!mac:target.path = $$PREFIX/bin effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects +translations.files = $$PWD/ts/*.qm +unix:!mac:translations.path = $$PREFIX/share/olive-editor/ts + unix:!mac { metainfo.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.appdata.xml metainfo.path = $$PREFIX/share/metainfo @@ -307,5 +310,5 @@ unix:!mac { icon512.path = $$PREFIX/share/icons/hicolor/512x512/apps icon1024.files = $$PWD/packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png icon1024.path = $$PREFIX/share/icons/hicolor/1024x1024/apps - INSTALLS += target effects metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 icon1024 + INSTALLS += target effects translations metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 icon1024 } From 00e8b66843b92a0952be4431a3865e6526af76a5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 17:52:43 +1100 Subject: [PATCH 100/202] added lrelease to travis yaml --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 244dc4f57..8640f2512 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ install: script: - if [ "$ARCH" == "x86_64" ]; then qmake CONFIG+=release PREFIX=/usr; fi - if [ "$ARCH" == "i386" ]; then qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi + - lrelease olive.pro - make -j$(nproc) - make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ - mkdir -p appdir/usr/bin/ ; cp olive-editor appdir/usr/bin/ # FIXME; "make install" should do this From 9d7d547550ec05930e1e7330b135ab9b4580349e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 18:04:38 +1100 Subject: [PATCH 101/202] added lrelease to debian rules --- debian/rules | 4 ++++ 1 file changed, 4 insertions(+) mode change 100644 => 100755 debian/rules diff --git a/debian/rules b/debian/rules old mode 100644 new mode 100755 index 18d67d9ac..9a794c695 --- a/debian/rules +++ b/debian/rules @@ -3,3 +3,7 @@ export QT_SELECT := qt5 %: dh $@ + +override_dh_auto_build: + lrelease olive.pro + dh_auto_build From 749c4d8ff8d0a07a3d35a80df9b940318f55a395 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 4 Feb 2019 18:48:24 +1100 Subject: [PATCH 102/202] shifted lrelease command in travis yaml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8640f2512..26f5e8c42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,9 +19,9 @@ install: - source /opt/qt*/bin/qt*-env.sh script: + - lrelease olive.pro - if [ "$ARCH" == "x86_64" ]; then qmake CONFIG+=release PREFIX=/usr; fi - if [ "$ARCH" == "i386" ]; then qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi - - lrelease olive.pro - make -j$(nproc) - make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ - mkdir -p appdir/usr/bin/ ; cp olive-editor appdir/usr/bin/ # FIXME; "make install" should do this From 4812a45cf47617f8fbe8591b8049fd4239c39e35 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 5 Feb 2019 05:22:32 +1100 Subject: [PATCH 103/202] enforce xml file extension on effect settings --- project/effect.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/project/effect.cpp b/project/effect.cpp index c56315aec..804d3d630 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -445,6 +445,12 @@ void Effect::save_to_file() { // if the user picked a file if (!file.isEmpty()) { + + // ensure file ends with .xml extension + if (!file.endsWith(".xml", Qt::CaseInsensitive)) { + file.append(".xml"); + } + QFile file_handle(file); if (file_handle.open(QFile::WriteOnly)) { From 3fe8660c5e3f9cf0e94c7dc2fd0e8ef9f3b06250 Mon Sep 17 00:00:00 2001 From: alexmitchell Date: Tue, 5 Feb 2019 02:17:59 +1030 Subject: [PATCH 104/202] Add ability to load custom cursors. Add custom cursor to left / right clip position editing. Revert white space edits in timelinewidget. --- cursors/Cursor_Left_Arrow.png | Bin 0 -> 2265 bytes cursors/Cursor_Right_Arrow.png | Bin 0 -> 2084 bytes cursors/cursors.qrc | 6 + mainwindow.cpp | 3 + olive.pro | 631 +++++++++++++++++---------------- ui/cursors.cpp | 22 ++ ui/cursors.h | 13 + ui/timelinewidget.cpp | 10 + 8 files changed, 371 insertions(+), 314 deletions(-) create mode 100644 cursors/Cursor_Left_Arrow.png create mode 100644 cursors/Cursor_Right_Arrow.png create mode 100644 cursors/cursors.qrc create mode 100644 ui/cursors.cpp create mode 100644 ui/cursors.h diff --git a/cursors/Cursor_Left_Arrow.png b/cursors/Cursor_Left_Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6cac0aaf0645c85c5caafcbfb6410bd9e44870 GIT binary patch literal 2265 zcmeHJ-AhzK6ra0$_e))5A&N~RMGz_|0_&lWFf^@Av!W=H{Nk zH51S!Z^8PhzP`TfbbGRo)?B}}wH3|D$x-ZfyAp{+;`#acXW&Q&2(-cL^`4H!V!p=4 z#v@QI+)isdiTG#1U^1Bu%gf6NRgxqo%QBJ717RW-MR64KteKgaV;DDqEnrvS*XE<@ z9FNDdpokuir%)V)X+c53Ll~(ZGT)d&zOk{P zG&eU3AWq)Qa&vPTNKT;c&d@?(Tj7Vi{{hyela` zf=4dT&d$EW*RLKQDPeMQa$$XaJpd;LusVXE#*7Cm@uUZC+Aku jxs9UIij3B^?3_a#>+iLEKDqyH6&Wf@Yf9dqzwY`4Sw)Cq literal 0 HcmV?d00001 diff --git a/cursors/Cursor_Right_Arrow.png b/cursors/Cursor_Right_Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..53fab01c6f517e8fdc97ab8420f3da12450e37ee GIT binary patch literal 2084 zcmds2O=uHQ5Pq9v^Vc7Yhe%bhK`4q~0@0$iMOsqY#M+AVQV^-V2`Wl$=%FX=#iE2D zJ*m`7^&m%qnlw2(;mdn(-psf2W@h(2 zxYXNKXFX_TjMaI&J(n@s31%byW04!@Fc^m}ba|LWzvu5?K8D6}yL(`mv6Dv$-01Xq zKa{4s-iw{4A3B3gcRcp#)P86}UQc`f85{S)G?0VEe=1xilkwtg27uF?ky~3^d$_r| zna2LlL?ZD7d$oX0W3%U!7X%@*w6t^uR#YK{+>p&?a}I|?vfJ%aI-M@Gw6wHizor^y zBGF5dWNvC|dNwmNb9I}Xd<`7O=@B(sUted1LV*)S@dWg>)eyt(&(VB7pRuj2Ef@}m z2cfe7dSHj(WHnIm)e_6j%gf8Gr>BR=1EEmp8k9u7LvS)VO;il6$V#mObJD5$#l=O2 z$oXhA`eth6k*uycJmlnIpp(sHIi5?#`^mDjOYqgr=6(8JkQslU9@`@=L-u9Y-D7lWI9x0 z9I04eUtf_-Yk*_3@$qp=!#|=BORKA^Pw@g2kziI1$gxU5q_eZLqRnP28L`q8#pdSb zAiTZ+jQ|fQLXI5rdmp15h|}q0b8~ZIAQ1R4Ha6x_^ooOaBxm|`(ns_N&0+0lD3q4eR5hzmhuNVvl-yyd|yn+rYnd99grPf4j zrHD5+HUz)lAIAD7a2hy}%jJZZKci(id_u*F zOxp%>Dk71{Ev)+iH$Z(!g*3~ zK$qnqfbP0)K)hOFvQr98M^y?&dg>+{Ko>v}pw~B3Eir7%io&6c^iZke + + Cursor_Left_Arrow.png + Cursor_Right_Arrow.png + + diff --git a/mainwindow.cpp b/mainwindow.cpp index 805d06552..d8b0c474c 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -15,6 +15,7 @@ #include "ui/viewerwidget.h" #include "ui/sourceiconview.h" #include "ui/timelineheader.h" +#include "ui/cursors.h" #include "panels/panels.h" #include "panels/project.h" @@ -95,6 +96,8 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : enable_launch_with_project(false), appName(an) { + initCustomCursors(); + open_debug_file(); debug_dialog = new DebugDialog(this); diff --git a/olive.pro b/olive.pro index 9b7f58012..2bf0813c7 100644 --- a/olive.pro +++ b/olive.pro @@ -1,314 +1,317 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-05-11T10:31:59 -# -#------------------------------------------------- - -QT += core gui multimedia opengl - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -mac { - TARGET = Olive -} -!mac { - TARGET = olive-editor -} -TEMPLATE = app - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -# Tries to get the current Git short hash -system("which git") { - GITHASHVAR = $$system(git --git-dir $$PWD/.git --work-tree $$PWD log -1 --format=%h) - DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" -} - -CONFIG += c++11 - -CONFIG(debug, debug|release) { - CONFIG += console -} - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - panels/project.cpp \ - panels/effectcontrols.cpp \ - panels/viewer.cpp \ - panels/timeline.cpp \ - ui/sourcetable.cpp \ - dialogs/aboutdialog.cpp \ - ui/timelinewidget.cpp \ - project/media.cpp \ - project/footage.cpp \ - project/sequence.cpp \ - project/clip.cpp \ - playback/playback.cpp \ - playback/audio.cpp \ - io/config.cpp \ - dialogs/newsequencedialog.cpp \ - ui/viewerwidget.cpp \ - ui/viewercontainer.cpp \ - dialogs/exportdialog.cpp \ - ui/collapsiblewidget.cpp \ - panels/panels.cpp \ - playback/cacher.cpp \ - io/exportthread.cpp \ - ui/timelineheader.cpp \ - io/previewgenerator.cpp \ - ui/labelslider.cpp \ - dialogs/preferencesdialog.cpp \ - ui/audiomonitor.cpp \ - project/undo.cpp \ - ui/scrollarea.cpp \ - ui/comboboxex.cpp \ - ui/colorbutton.cpp \ - dialogs/replaceclipmediadialog.cpp \ - ui/fontcombobox.cpp \ - ui/checkboxex.cpp \ - ui/keyframeview.cpp \ - ui/texteditex.cpp \ - dialogs/demonotice.cpp \ - project/marker.cpp \ - dialogs/speeddialog.cpp \ - dialogs/mediapropertiesdialog.cpp \ - io/crc32.cpp \ - project/projectmodel.cpp \ - io/loadthread.cpp \ - dialogs/loaddialog.cpp \ - debug.cpp \ - io/path.cpp \ - effects/internal/linearfadetransition.cpp \ - effects/internal/transformeffect.cpp \ - effects/internal/solideffect.cpp \ - effects/internal/texteffect.cpp \ - effects/internal/timecodeeffect.cpp \ - effects/internal/audionoiseeffect.cpp \ - effects/internal/paneffect.cpp \ - effects/internal/toneeffect.cpp \ - effects/internal/volumeeffect.cpp \ - effects/internal/crossdissolvetransition.cpp \ - effects/internal/shakeeffect.cpp \ - effects/internal/exponentialfadetransition.cpp \ - effects/internal/logarithmicfadetransition.cpp \ - effects/internal/cornerpineffect.cpp \ - io/math.cpp \ - io/qpainterwrapper.cpp \ - project/effect.cpp \ - project/transition.cpp \ - project/effectrow.cpp \ - project/effectfield.cpp \ - effects/internal/cubetransition.cpp \ - project/effectgizmo.cpp \ - io/clipboard.cpp \ - dialogs/stabilizerdialog.cpp \ - io/avtogl.cpp \ - ui/resizablescrollbar.cpp \ - ui/sourceiconview.cpp \ - project/sourcescommon.cpp \ - ui/keyframenavigator.cpp \ - panels/grapheditor.cpp \ - ui/graphview.cpp \ - ui/keyframedrawing.cpp \ - ui/clickablelabel.cpp \ - project/keyframe.cpp \ - ui/rectangleselect.cpp \ - dialogs/actionsearch.cpp \ - ui/embeddedfilechooser.cpp \ - effects/internal/fillleftrighteffect.cpp \ - effects/internal/voideffect.cpp \ - dialogs/texteditdialog.cpp \ - dialogs/debugdialog.cpp \ - ui/renderthread.cpp \ - ui/renderfunctions.cpp \ - ui/viewerwindow.cpp \ - project/projectfilter.cpp \ - effects/internal/frei0reffect.cpp \ - project/effectloaders.cpp \ - io/crossplatformlib.cpp \ - effects/internal/vsthost.cpp \ - ui/flowlayout.cpp \ - dialogs/proxydialog.cpp \ - io/proxygenerator.cpp - -HEADERS += \ - mainwindow.h \ - panels/project.h \ - panels/effectcontrols.h \ - panels/viewer.h \ - panels/timeline.h \ - ui/sourcetable.h \ - dialogs/aboutdialog.h \ - ui/timelinewidget.h \ - project/media.h \ - project/footage.h \ - project/sequence.h \ - project/clip.h \ - playback/playback.h \ - playback/audio.h \ - io/config.h \ - dialogs/newsequencedialog.h \ - ui/viewerwidget.h \ - ui/viewercontainer.h \ - dialogs/exportdialog.h \ - ui/collapsiblewidget.h \ - panels/panels.h \ - playback/cacher.h \ - io/exportthread.h \ - ui/timelinetools.h \ - ui/timelineheader.h \ - io/previewgenerator.h \ - ui/labelslider.h \ - dialogs/preferencesdialog.h \ - ui/audiomonitor.h \ - project/undo.h \ - ui/scrollarea.h \ - ui/comboboxex.h \ - ui/colorbutton.h \ - dialogs/replaceclipmediadialog.h \ - ui/fontcombobox.h \ - ui/checkboxex.h \ - ui/keyframeview.h \ - ui/texteditex.h \ - dialogs/demonotice.h \ - project/marker.h \ - project/selection.h \ - dialogs/speeddialog.h \ - dialogs/mediapropertiesdialog.h \ - io/crc32.h \ - project/projectmodel.h \ - io/loadthread.h \ - dialogs/loaddialog.h \ - debug.h \ - io/path.h \ - effects/internal/transformeffect.h \ - effects/internal/solideffect.h \ - effects/internal/texteffect.h \ - effects/internal/timecodeeffect.h \ - effects/internal/audionoiseeffect.h \ - effects/internal/paneffect.h \ - effects/internal/toneeffect.h \ - effects/internal/volumeeffect.h \ - effects/internal/shakeeffect.h \ - effects/internal/linearfadetransition.h \ - effects/internal/crossdissolvetransition.h \ - effects/internal/exponentialfadetransition.h \ - effects/internal/logarithmicfadetransition.h \ - effects/internal/cornerpineffect.h \ - io/math.h \ - io/qpainterwrapper.h \ - project/effect.h \ - project/transition.h \ - project/effectrow.h \ - project/effectfield.h \ - effects/internal/cubetransition.h \ - project/effectgizmo.h \ - io/clipboard.h \ - dialogs/stabilizerdialog.h \ - io/avtogl.h \ - ui/resizablescrollbar.h \ - ui/sourceiconview.h \ - project/sourcescommon.h \ - ui/keyframenavigator.h \ - panels/grapheditor.h \ - ui/graphview.h \ - ui/keyframedrawing.h \ - ui/clickablelabel.h \ - project/keyframe.h \ - ui/rectangleselect.h \ - dialogs/actionsearch.h \ - ui/embeddedfilechooser.h \ - effects/internal/fillleftrighteffect.h \ - effects/internal/voideffect.h \ - dialogs/texteditdialog.h \ - dialogs/debugdialog.h \ - ui/renderthread.h \ - ui/renderfunctions.h \ - ui/viewerwindow.h \ - project/projectfilter.h \ - effects/internal/frei0reffect.h \ - project/effectloaders.h \ - io/crossplatformlib.h \ - effects/internal/vsthost.h \ - ui/flowlayout.h \ - dialogs/proxydialog.h \ - io/proxygenerator.h - -FORMS += - -TRANSLATIONS += \ - ts/olive_de.ts \ - ts/olive_es.ts \ - ts/olive_fr.ts \ - ts/olive_it.ts \ - ts/olive_cs.ts \ - ts/olive_ru.ts - -win32 { - RC_FILE = packaging/windows/resources.rc - LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 -} - -mac { - LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -framework CoreFoundation - ICON = packaging/macos/olive.icns - INCLUDEPATH = /usr/local/include -} - -unix:!mac { - CONFIG += link_pkgconfig - PKGCONFIG += libavutil libavformat libavcodec libavfilter libswscale libswresample - LIBS += -ldl -} - -RESOURCES += \ - icons/icons.qrc \ - effects/internal/internalshaders.qrc - -unix:!mac:isEmpty(PREFIX) { - PREFIX = /usr/local -} - -unix:!mac:target.path = $$PREFIX/bin - -effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert -unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects - -translations.files = $$PWD/ts/*.qm -unix:!mac:translations.path = $$PREFIX/share/olive-editor/ts - -unix:!mac { - metainfo.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.appdata.xml - metainfo.path = $$PREFIX/share/metainfo - desktop.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.desktop - desktop.path = $$PREFIX/share/applications - mime.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.xml - mime.path = $$PREFIX/share/mime/packages - icon16.files = $$PWD/packaging/linux/icons/16x16/org.olivevideoeditor.Olive.png - icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps - icon32.files = $$PWD/packaging/linux/icons/32x32/org.olivevideoeditor.Olive.png - icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps - icon48.files = $$PWD/packaging/linux/icons/48x48/org.olivevideoeditor.Olive.png - icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps - icon64.files = $$PWD/packaging/linux/icons/64x64/org.olivevideoeditor.Olive.png - icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps - icon128.files = $$PWD/packaging/linux/icons/128x128/org.olivevideoeditor.Olive.png - icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps - icon256.files = $$PWD/packaging/linux/icons/256x256/org.olivevideoeditor.Olive.png - icon256.path = $$PREFIX/share/icons/hicolor/256x256/apps - icon512.files = $$PWD/packaging/linux/icons/512x512/org.olivevideoeditor.Olive.png - icon512.path = $$PREFIX/share/icons/hicolor/512x512/apps - icon1024.files = $$PWD/packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png - icon1024.path = $$PREFIX/share/icons/hicolor/1024x1024/apps - INSTALLS += target effects translations metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 icon1024 -} +#------------------------------------------------- +# +# Project created by QtCreator 2018-05-11T10:31:59 +# +#------------------------------------------------- + +QT += core gui multimedia opengl + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +mac { + TARGET = Olive +} +!mac { + TARGET = olive-editor +} +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +# Tries to get the current Git short hash +system("which git") { + GITHASHVAR = $$system(git --git-dir $$PWD/.git --work-tree $$PWD log -1 --format=%h) + DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" +} + +CONFIG += c++11 + +CONFIG(debug, debug|release) { + CONFIG += console +} + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + panels/project.cpp \ + panels/effectcontrols.cpp \ + panels/viewer.cpp \ + panels/timeline.cpp \ + ui/sourcetable.cpp \ + dialogs/aboutdialog.cpp \ + ui/timelinewidget.cpp \ + project/media.cpp \ + project/footage.cpp \ + project/sequence.cpp \ + project/clip.cpp \ + playback/playback.cpp \ + playback/audio.cpp \ + io/config.cpp \ + dialogs/newsequencedialog.cpp \ + ui/viewerwidget.cpp \ + ui/viewercontainer.cpp \ + dialogs/exportdialog.cpp \ + ui/collapsiblewidget.cpp \ + panels/panels.cpp \ + playback/cacher.cpp \ + io/exportthread.cpp \ + ui/timelineheader.cpp \ + io/previewgenerator.cpp \ + ui/labelslider.cpp \ + dialogs/preferencesdialog.cpp \ + ui/audiomonitor.cpp \ + project/undo.cpp \ + ui/scrollarea.cpp \ + ui/comboboxex.cpp \ + ui/colorbutton.cpp \ + dialogs/replaceclipmediadialog.cpp \ + ui/fontcombobox.cpp \ + ui/checkboxex.cpp \ + ui/keyframeview.cpp \ + ui/texteditex.cpp \ + dialogs/demonotice.cpp \ + project/marker.cpp \ + dialogs/speeddialog.cpp \ + dialogs/mediapropertiesdialog.cpp \ + io/crc32.cpp \ + project/projectmodel.cpp \ + io/loadthread.cpp \ + dialogs/loaddialog.cpp \ + debug.cpp \ + io/path.cpp \ + effects/internal/linearfadetransition.cpp \ + effects/internal/transformeffect.cpp \ + effects/internal/solideffect.cpp \ + effects/internal/texteffect.cpp \ + effects/internal/timecodeeffect.cpp \ + effects/internal/audionoiseeffect.cpp \ + effects/internal/paneffect.cpp \ + effects/internal/toneeffect.cpp \ + effects/internal/volumeeffect.cpp \ + effects/internal/crossdissolvetransition.cpp \ + effects/internal/shakeeffect.cpp \ + effects/internal/exponentialfadetransition.cpp \ + effects/internal/logarithmicfadetransition.cpp \ + effects/internal/cornerpineffect.cpp \ + io/math.cpp \ + io/qpainterwrapper.cpp \ + project/effect.cpp \ + project/transition.cpp \ + project/effectrow.cpp \ + project/effectfield.cpp \ + effects/internal/cubetransition.cpp \ + project/effectgizmo.cpp \ + io/clipboard.cpp \ + dialogs/stabilizerdialog.cpp \ + io/avtogl.cpp \ + ui/resizablescrollbar.cpp \ + ui/sourceiconview.cpp \ + project/sourcescommon.cpp \ + ui/keyframenavigator.cpp \ + panels/grapheditor.cpp \ + ui/graphview.cpp \ + ui/keyframedrawing.cpp \ + ui/clickablelabel.cpp \ + project/keyframe.cpp \ + ui/rectangleselect.cpp \ + dialogs/actionsearch.cpp \ + ui/embeddedfilechooser.cpp \ + effects/internal/fillleftrighteffect.cpp \ + effects/internal/voideffect.cpp \ + dialogs/texteditdialog.cpp \ + dialogs/debugdialog.cpp \ + ui/renderthread.cpp \ + ui/renderfunctions.cpp \ + ui/viewerwindow.cpp \ + project/projectfilter.cpp \ + effects/internal/frei0reffect.cpp \ + project/effectloaders.cpp \ + io/crossplatformlib.cpp \ + effects/internal/vsthost.cpp \ + ui/flowlayout.cpp \ + dialogs/proxydialog.cpp \ + io/proxygenerator.cpp \ + ui/cursors.cpp + +HEADERS += \ + mainwindow.h \ + panels/project.h \ + panels/effectcontrols.h \ + panels/viewer.h \ + panels/timeline.h \ + ui/sourcetable.h \ + dialogs/aboutdialog.h \ + ui/timelinewidget.h \ + project/media.h \ + project/footage.h \ + project/sequence.h \ + project/clip.h \ + playback/playback.h \ + playback/audio.h \ + io/config.h \ + dialogs/newsequencedialog.h \ + ui/viewerwidget.h \ + ui/viewercontainer.h \ + dialogs/exportdialog.h \ + ui/collapsiblewidget.h \ + panels/panels.h \ + playback/cacher.h \ + io/exportthread.h \ + ui/timelinetools.h \ + ui/timelineheader.h \ + io/previewgenerator.h \ + ui/labelslider.h \ + dialogs/preferencesdialog.h \ + ui/audiomonitor.h \ + project/undo.h \ + ui/scrollarea.h \ + ui/comboboxex.h \ + ui/colorbutton.h \ + dialogs/replaceclipmediadialog.h \ + ui/fontcombobox.h \ + ui/checkboxex.h \ + ui/keyframeview.h \ + ui/texteditex.h \ + dialogs/demonotice.h \ + project/marker.h \ + project/selection.h \ + dialogs/speeddialog.h \ + dialogs/mediapropertiesdialog.h \ + io/crc32.h \ + project/projectmodel.h \ + io/loadthread.h \ + dialogs/loaddialog.h \ + debug.h \ + io/path.h \ + effects/internal/transformeffect.h \ + effects/internal/solideffect.h \ + effects/internal/texteffect.h \ + effects/internal/timecodeeffect.h \ + effects/internal/audionoiseeffect.h \ + effects/internal/paneffect.h \ + effects/internal/toneeffect.h \ + effects/internal/volumeeffect.h \ + effects/internal/shakeeffect.h \ + effects/internal/linearfadetransition.h \ + effects/internal/crossdissolvetransition.h \ + effects/internal/exponentialfadetransition.h \ + effects/internal/logarithmicfadetransition.h \ + effects/internal/cornerpineffect.h \ + io/math.h \ + io/qpainterwrapper.h \ + project/effect.h \ + project/transition.h \ + project/effectrow.h \ + project/effectfield.h \ + effects/internal/cubetransition.h \ + project/effectgizmo.h \ + io/clipboard.h \ + dialogs/stabilizerdialog.h \ + io/avtogl.h \ + ui/resizablescrollbar.h \ + ui/sourceiconview.h \ + project/sourcescommon.h \ + ui/keyframenavigator.h \ + panels/grapheditor.h \ + ui/graphview.h \ + ui/keyframedrawing.h \ + ui/clickablelabel.h \ + project/keyframe.h \ + ui/rectangleselect.h \ + dialogs/actionsearch.h \ + ui/embeddedfilechooser.h \ + effects/internal/fillleftrighteffect.h \ + effects/internal/voideffect.h \ + dialogs/texteditdialog.h \ + dialogs/debugdialog.h \ + ui/renderthread.h \ + ui/renderfunctions.h \ + ui/viewerwindow.h \ + project/projectfilter.h \ + effects/internal/frei0reffect.h \ + project/effectloaders.h \ + io/crossplatformlib.h \ + effects/internal/vsthost.h \ + ui/flowlayout.h \ + dialogs/proxydialog.h \ + io/proxygenerator.h \ + ui/cursors.h + +FORMS += + +TRANSLATIONS += \ + ts/olive_de.ts \ + ts/olive_es.ts \ + ts/olive_fr.ts \ + ts/olive_it.ts \ + ts/olive_cs.ts \ + ts/olive_ru.ts + +win32 { + RC_FILE = packaging/windows/resources.rc + LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 +} + +mac { + LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -framework CoreFoundation + ICON = packaging/macos/olive.icns + INCLUDEPATH = /usr/local/include +} + +unix:!mac { + CONFIG += link_pkgconfig + PKGCONFIG += libavutil libavformat libavcodec libavfilter libswscale libswresample + LIBS += -ldl +} + +RESOURCES += \ + icons/icons.qrc \ + effects/internal/internalshaders.qrc \ + cursors/cursors.qrc + +unix:!mac:isEmpty(PREFIX) { + PREFIX = /usr/local +} + +unix:!mac:target.path = $$PREFIX/bin + +effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert +unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects + +translations.files = $$PWD/ts/*.qm +unix:!mac:translations.path = $$PREFIX/share/olive-editor/ts + +unix:!mac { + metainfo.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.appdata.xml + metainfo.path = $$PREFIX/share/metainfo + desktop.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.desktop + desktop.path = $$PREFIX/share/applications + mime.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.xml + mime.path = $$PREFIX/share/mime/packages + icon16.files = $$PWD/packaging/linux/icons/16x16/org.olivevideoeditor.Olive.png + icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps + icon32.files = $$PWD/packaging/linux/icons/32x32/org.olivevideoeditor.Olive.png + icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps + icon48.files = $$PWD/packaging/linux/icons/48x48/org.olivevideoeditor.Olive.png + icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps + icon64.files = $$PWD/packaging/linux/icons/64x64/org.olivevideoeditor.Olive.png + icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps + icon128.files = $$PWD/packaging/linux/icons/128x128/org.olivevideoeditor.Olive.png + icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps + icon256.files = $$PWD/packaging/linux/icons/256x256/org.olivevideoeditor.Olive.png + icon256.path = $$PREFIX/share/icons/hicolor/256x256/apps + icon512.files = $$PWD/packaging/linux/icons/512x512/org.olivevideoeditor.Olive.png + icon512.path = $$PREFIX/share/icons/hicolor/512x512/apps + icon1024.files = $$PWD/packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png + icon1024.path = $$PREFIX/share/icons/hicolor/1024x1024/apps + INSTALLS += target effects translations metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 icon1024 +} diff --git a/ui/cursors.cpp b/ui/cursors.cpp new file mode 100644 index 000000000..86e89a9ac --- /dev/null +++ b/ui/cursors.cpp @@ -0,0 +1,22 @@ +#include "cursors.h" + +#include +#include + +#include + +QCursor OLIVE_CURSORS::left_arrow; +QCursor OLIVE_CURSORS::right_arrow; + +QCursor load_cursor(QString file, const int hotX, const int hotY, const bool right_aligend){ + int hotoutX; + QPixmap temp = QPixmap(file); + right_aligend? hotoutX = temp.width() : hotoutX = hotX; + return QCursor(temp,hotoutX,hotY); +} + +void initCustomCursors(){ + qInfo() << "Loading Custom Cursors"; + OLIVE_CURSORS::left_arrow = load_cursor(":/cursors/Cursor_Left_Arrow.png", 0,-1, false); + OLIVE_CURSORS::right_arrow = load_cursor(":/cursors/Cursor_Right_Arrow.png", 0,-1, true); +} diff --git a/ui/cursors.h b/ui/cursors.h new file mode 100644 index 000000000..53f1cb9fa --- /dev/null +++ b/ui/cursors.h @@ -0,0 +1,13 @@ +#ifndef CURSORS_H +#define CURSORS_H + +#include + +void initCustomCursors(); + +namespace OLIVE_CURSORS{ + extern QCursor left_arrow; + extern QCursor right_arrow; +} + +#endif // CURSORS_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 2f81dc070..8e6e55b9d 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -23,6 +23,7 @@ #include "mainwindow.h" #include "ui/rectangleselect.h" #include "playback/playback.h" +#include "ui/cursors.h" #include "debug.h" #include "project/effect.h" @@ -1986,6 +1987,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { long mouse_frame_lower = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()-lim)-1; long mouse_frame_upper = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()+lim)+1; bool found = false; + bool left_arrow_cursor = false; + bool right_arrow_cursor = false; bool cursor_contains_clip = false; int closeness = INT_MAX; int min_track = INT_MAX; @@ -2017,6 +2020,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { panel_timeline->trim_in_point = true; closeness = nc; found = true; + left_arrow_cursor = true; } } if (c->timeline_out > mouse_frame_lower && c->timeline_out < mouse_frame_upper) { @@ -2026,6 +2030,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { panel_timeline->trim_in_point = false; closeness = nc; found = true; + right_arrow_cursor = true; } } if (panel_timeline->tool == TIMELINE_TOOL_POINTER) { @@ -2064,6 +2069,11 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { QToolTip::showText(mapToGlobal(event->pos()), "HOVER OVER CLIP"); }*/ if (found) { + if (right_arrow_cursor && !panel_timeline->trim_in_point){ + setCursor(OLIVE_CURSORS::right_arrow); + }else if (left_arrow_cursor && panel_timeline->trim_in_point){ + setCursor(OLIVE_CURSORS::left_arrow); + }else setCursor(Qt::SizeHorCursor); } else { panel_timeline->trim_target = -1; From fc96ad7735c1120a9d5f4692e1208581e496c45f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 6 Feb 2019 11:52:31 +1100 Subject: [PATCH 105/202] use sizehint for viewer sizing, fixes #443 --- ui/viewercontainer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index 5ae31db03..8a744f2ec 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -82,8 +82,8 @@ void ViewerContainer::adjust() { int widget_height = height(); if (!fit) { - widget_width -= vertical_scrollbar->width(); - widget_height -= horizontal_scrollbar->height(); + widget_width -= vertical_scrollbar->sizeHint().width(); + widget_height -= horizontal_scrollbar->sizeHint().height(); } double widget_ar = double(widget_width) / double(widget_height); From 04084c36d25b4758e3b28db85024d83610dfe9b8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 03:45:02 +1100 Subject: [PATCH 106/202] fixed linesize regression when exporting, fixes #447 --- io/exportthread.cpp | 6 +++--- ui/renderthread.cpp | 20 +++++++++++++++++--- ui/renderthread.h | 3 ++- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 1f94a1b47..190a3e0a4 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -348,7 +348,7 @@ void ExportThread::run() { if (video_enabled) { do { // TODO optimize by rendering the next frame while encoding the last - renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0]); + renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0], video_frame->linesize[0]/4); waitCond.wait(&mutex); if (!continueEncode) break; } while (renderer->did_texture_fail()); @@ -371,11 +371,11 @@ void ExportThread::run() { sws_frame = av_frame_alloc(); sws_frame->format = vcodec_ctx->pix_fmt; sws_frame->width = video_width; - sws_frame->height = video_height; + sws_frame->height = video_height; av_frame_get_buffer(sws_frame, 0); // convert pixel format to format expected by the encoder - sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); + sws_scale(sws_ctx, video_frame->data, video_frame->linesize, 0, video_frame->height, sws_frame->data, sws_frame->linesize); sws_frame->pts = qRound(timecode_secs/av_q2d(video_stream->time_base)); // send converted frame to encoder diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index b85a3d349..409d948dc 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -193,9 +193,22 @@ void RenderThread::paint() { } if (pixel_buffer != nullptr) { - ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); - glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, pixel_buffer); + + // set main framebuffer to the current read buffer + ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, front_buffer); + + // store pixels in buffer + glReadPixels(0, + 0, + pixel_buffer_linesize == 0 ? tex_width : pixel_buffer_linesize, + tex_height, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixel_buffer); + + // release current read buffer ctx->functions()->glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); + pixel_buffer = nullptr; } @@ -204,7 +217,7 @@ void RenderThread::paint() { glDisable(GL_TEXTURE_2D); } -void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int idivider) { +void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int pixel_linesize, int idivider) { seq = s; // stall any dependent actions @@ -222,6 +235,7 @@ void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QStrin save_fn = save; pixel_buffer = pixels; + pixel_buffer_linesize = pixel_linesize; queued = true; diff --git a/ui/renderthread.h b/ui/renderthread.h index 201839dce..3b1e1e1cb 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -23,7 +23,7 @@ public: GLuint front_texture; Effect* gizmos; void paint(); - void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int idivider = 0); + void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int pixel_linesize = 0, int idivider = 0); bool did_texture_fail(); void cancel(); @@ -59,6 +59,7 @@ private: bool running; QString save_fn; GLvoid *pixel_buffer; + int pixel_buffer_linesize; }; #endif // RENDERTHREAD_H From 101ad79e9d074b7e02db277d69a79815171bd86b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 03:54:03 +1100 Subject: [PATCH 107/202] added graph editor to maximize panel --- mainwindow.cpp | 3 ++- ui/viewercontainer.cpp | 32 ++++++++++++++++---------------- ui/viewerwidget.cpp | 4 ++++ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 805d06552..0e1480127 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1231,7 +1231,8 @@ void MainWindow::maximize_panel() { if (focused_panel != panel_effect_controls) removeDockWidget(panel_effect_controls); if (focused_panel != panel_timeline) removeDockWidget(panel_timeline); if (focused_panel != panel_sequence_viewer) removeDockWidget(panel_sequence_viewer); - if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); + if (focused_panel != panel_footage_viewer) removeDockWidget(panel_footage_viewer); + if (focused_panel != panel_graph_editor) removeDockWidget(panel_graph_editor); } } else { // we must be maximized, restore previous state diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index 8a744f2ec..f42999c5e 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -84,24 +84,21 @@ void ViewerContainer::adjust() { if (!fit) { widget_width -= vertical_scrollbar->sizeHint().width(); widget_height -= horizontal_scrollbar->sizeHint().height(); - } - - double widget_ar = double(widget_width) / double(widget_height); - - bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; - - if (widget_is_wider_than_sequence) { - widget_width = widget_height * aspect_ratio; - widget_x = (width() / 2) - (widget_width / 2); - } else { - widget_height = widget_width / aspect_ratio; - widget_y = (height() / 2) - (widget_height / 2); - } - - child->move(widget_x, widget_y); - child->resize(widget_width, widget_height); + } if (fit) { + double widget_ar = double(widget_width) / double(widget_height); + + bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; + + if (widget_is_wider_than_sequence) { + widget_width = widget_height * aspect_ratio; + widget_x = (width() / 2) - (widget_width / 2); + } else { + widget_height = widget_width / aspect_ratio; + widget_y = (height() / 2) - (widget_height / 2); + } + zoom = double(widget_width) / double(viewer->seq->width); } else if (zoomed_width > width() || zoomed_height > height()) { horizontal_scrollbar->setVisible(true); @@ -115,6 +112,9 @@ void ViewerContainer::adjust() { adjust_scrollbars(); } + + child->move(widget_x, widget_y); + child->resize(widget_width, widget_height); } else { // if the zoom size is smaller than the available area, scale the surface down diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 57bd5c0a3..aa60717d0 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -585,6 +585,7 @@ void ViewerWidget::paintGL() { glBegin(GL_QUADS); + double ar_diff = (double(viewer->seq->width)/double(viewer->seq->height)/(double(width())/double(height()))); double zoom_factor = container->zoom/(double(width())/double(viewer->seq->width)); double zoom_size = (zoom_factor*2.0) - 2.0; double zoom_left = -zoom_size*x_scroll - 1.0; @@ -592,6 +593,9 @@ void ViewerWidget::paintGL() { double zoom_bottom = -zoom_size*(1.0-y_scroll) - 1.0; double zoom_top = zoom_size*(y_scroll) + 1.0; + //zoom_left *= ar_diff; + //zoom_right *= ar_diff; + glVertex2d(zoom_left, zoom_bottom); glTexCoord2d(0, 0); glVertex2d(zoom_left, zoom_top); From 05e431ef6ef6d2241c70ed36f40581d45dbe2210 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 6 Feb 2019 23:58:24 -0800 Subject: [PATCH 108/202] added graph editor to main window by default, fixes #436 --- mainwindow.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index 0e1480127..1d18c1b82 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -70,13 +70,13 @@ void MainWindow::setup_layout(bool reset) { panel_timeline->show(); panel_graph_editor->hide(); - addDockWidget(Qt::TopDockWidgetArea, panel_project); + addDockWidget(Qt::TopDockWidgetArea, panel_project); + addDockWidget(Qt::TopDockWidgetArea, panel_graph_editor); addDockWidget(Qt::TopDockWidgetArea, panel_footage_viewer); tabifyDockWidget(panel_footage_viewer, panel_effect_controls); panel_footage_viewer->raise(); addDockWidget(Qt::TopDockWidgetArea, panel_sequence_viewer); addDockWidget(Qt::BottomDockWidgetArea, panel_timeline); - panel_graph_editor->setFloating(true); // load panels from file if (!reset) { @@ -1640,12 +1640,7 @@ void MainWindow::set_autoscroll() { } void MainWindow::menu_click_button() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline - || focused_panel == panel_effect_controls - || focused_panel == panel_footage_viewer - || focused_panel == panel_sequence_viewer) - reinterpret_cast(static_cast(sender())->data().value())->click(); + reinterpret_cast(static_cast(sender())->data().value())->click(); } void MainWindow::toggle_panel_visibility() { From 8a5c25f41d50d52245a4f1c3232c9a62df015bec Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 00:08:57 -0800 Subject: [PATCH 109/202] fixed labelslider button check, fixes #449 --- ui/labelslider.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index faef270bd..b635fa3d2 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -106,7 +106,7 @@ void LabelSlider::set_maximum_value(double v) { } void LabelSlider::mousePressEvent(QMouseEvent *ev) { - if (ev->buttons() & Qt::LeftButton) { + if (ev->button() == Qt::LeftButton) { drag_start_value = internal_value; if (ev->modifiers() & Qt::AltModifier) { if (internal_value != default_value && !qIsNaN(default_value)) { @@ -136,8 +136,8 @@ void LabelSlider::mouseMoveEvent(QMouseEvent* event) { } } -void LabelSlider::mouseReleaseEvent(QMouseEvent*) { - if (drag_start) { +void LabelSlider::mouseReleaseEvent(QMouseEvent* ev) { + if (drag_start) { qApp->restoreOverrideCursor(); drag_start = false; if (drag_proc) { From d804f7cfc0eb9fb7d62604593aabc3da8ee52483 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 00:44:47 -0800 Subject: [PATCH 110/202] made graph editor timeline-based rather than clip based, fixes #438 --- ui/graphview.cpp | 30 ++++++++++++++++++++++-------- ui/keyframedrawing.cpp | 7 +++++++ ui/keyframedrawing.h | 3 +++ ui/keyframeview.cpp | 8 ++------ ui/keyframeview.h | 1 - 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/ui/graphview.cpp b/ui/graphview.cpp index c91a1d0c0..9f0d308cb 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -105,6 +105,10 @@ void GraphView::set_view_to_selection() { min_dbl = qMin(key.data.toDouble(), min_dbl); max_dbl = qMax(key.data.toDouble(), max_dbl); } + + min_time -= row->parent_effect->parent_clip->clip_in; + max_time -= row->parent_effect->parent_clip->clip_in; + set_view_to_rect(min_time, min_dbl, max_time, max_dbl); } } @@ -128,6 +132,9 @@ void GraphView::set_view_to_all() { } } if (can_set) { + min_time -= row->parent_effect->parent_clip->clip_in; + max_time -= row->parent_effect->parent_clip->clip_in; + set_view_to_rect(min_time, min_dbl, max_time, max_dbl); } } @@ -228,7 +235,7 @@ void GraphView::paintEvent(QPaintEvent *) { for (int j=0;jkeyframes.at(sorted_keys.at(j)); - int key_x = get_screen_x(key.time); + int key_x = get_screen_x(key.time); int key_y = get_screen_y(key.data.toDouble()); line_pen.setColor(get_curve_color(i, row->fieldCount())); @@ -283,7 +290,7 @@ void GraphView::paintEvent(QPaintEvent *) { for (int j=0;jkeyframes.at(sorted_keys.at(j)); - int key_x = get_screen_x(key.time); + int key_x = get_screen_x(key.time); int key_y = get_screen_y(key.data.toDouble()); if (key.type == EFFECT_KEYFRAME_BEZIER) { @@ -316,7 +323,7 @@ void GraphView::paintEvent(QPaintEvent *) { // draw playhead p.setPen(Qt::red); - int playhead_x = get_screen_x(panel_sequence_viewer->seq->playhead - visible_in); + int playhead_x = qRound((double(panel_sequence_viewer->seq->playhead - visible_in)*zoom) - x_scroll); p.drawLine(playhead_x, 0, playhead_x, height()); if (rect_select) { @@ -362,7 +369,7 @@ void GraphView::mousePressEvent(QMouseEvent *event) { if (field->type == EFFECT_FIELD_DOUBLE && field_visibility.at(i)) { for (int j=0;jkeyframes.size();j++) { const EffectKeyframe& key = field->keyframes.at(j); - int key_x = get_screen_x(key.time); + int key_x = get_screen_x(key.time); int key_y = get_screen_y(key.data.toDouble()); if (event->pos().x() > key_x-KEYFRAME_SIZE && event->pos().x() < key_x+KEYFRAME_SIZE @@ -544,7 +551,7 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { for (int i=0;ifieldCount();i++) { for (int j=0;jfield(i)->keyframes.size();j++) { const EffectKeyframe& key = row->field(i)->keyframes.at(j); - int key_x = get_screen_x(key.time); + int key_x = get_screen_x(key.time); int key_y = get_screen_y(key.data.toDouble()); QRect test_rect( key_x - KEYFRAME_SIZE, @@ -812,11 +819,14 @@ void GraphView::set_scroll_y(int s) { void GraphView::set_zoom(double z) { zoom = z; - emit zoom_changed(zoom); + emit zoom_changed(zoom); } int GraphView::get_screen_x(double d) { - return qRound((d*zoom) - x_scroll); + if (row != nullptr) { + d -= row->parent_effect->parent_clip->clip_in; + } + return qRound((d*zoom) - x_scroll); } int GraphView::get_screen_y(double d) { @@ -824,7 +834,11 @@ int GraphView::get_screen_y(double d) { } long GraphView::get_value_x(int i) { - return qRound((i + x_scroll)/zoom); + long frame = qRound((i + x_scroll)/zoom); + if (row != nullptr) { + frame += row->parent_effect->parent_clip->clip_in; + } + return frame; } double GraphView::get_value_y(int i) { diff --git a/ui/keyframedrawing.cpp b/ui/keyframedrawing.cpp index 2621472b7..3e33b28d4 100644 --- a/ui/keyframedrawing.cpp +++ b/ui/keyframedrawing.cpp @@ -1,9 +1,11 @@ #include "keyframedrawing.h" #include "project/effect.h" +#include "project/clip.h" #define KEYFRAME_POINT_COUNT 4 +// routine for drawing a keyframe onscreen void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r, int g, int b) { if (darker) { r *= 0.625; @@ -30,3 +32,8 @@ void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r, int p.setBrush(Qt::NoBrush); } + +// adjusts keyframe's internal time (in clip time) to timeline time +long adjust_row_keyframe(EffectRow* row, long time, long visible_in) { + return time-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in); +} diff --git a/ui/keyframedrawing.h b/ui/keyframedrawing.h index c8c60e9e3..ae1ff7717 100644 --- a/ui/keyframedrawing.h +++ b/ui/keyframedrawing.h @@ -6,6 +6,9 @@ #define KEYFRAME_SIZE 6 #define KEYFRAME_COLOR 160 +class EffectRow; + void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r = KEYFRAME_COLOR, int g = KEYFRAME_COLOR, int b = KEYFRAME_COLOR); +long adjust_row_keyframe(EffectRow* row, long time, long visible_in); #endif // KEYFRAMEDRAWING_H diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 8cfb38f0c..3e5c4b77a 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -23,10 +23,6 @@ #include #include -long KeyframeView::adjust_row_keyframe(EffectRow* row, long time) { - return time-row->parent_effect->parent_clip->clip_in+(row->parent_effect->parent_clip->timeline_in-visible_in); -} - KeyframeView::KeyframeView(QWidget *parent) : QWidget(parent), visible_in(0), @@ -113,7 +109,7 @@ void KeyframeView::paintEvent(QPaintEvent*) { for (int k=0;kkeyframes.size();k++) { if (!key_times.contains(f->keyframes.at(k).time)) { bool keyframe_selected = keyframeIsSelected(f, k); - long keyframe_frame = adjust_row_keyframe(row, f->keyframes.at(k).time); + long keyframe_frame = adjust_row_keyframe(row, f->keyframes.at(k).time, visible_in); // see if any other keyframes have this time int appearances = 0; @@ -337,7 +333,7 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) { for (int k=0;kfieldCount();k++) { EffectField* field = row->field(k); for (int j=0;jkeyframes.size();j++) { - long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time); + long keyframe_frame = adjust_row_keyframe(row, field->keyframes.at(j).time, visible_in); if (!keyframeIsSelected(field, j) && keyframe_frame >= min_frame && keyframe_frame <= max_frame) { selected_fields.append(field); selected_keyframes.append(j); diff --git a/ui/keyframeview.h b/ui/keyframeview.h index 0d553861a..dc0719b88 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -28,7 +28,6 @@ public slots: void set_y_scroll(int); void resize_move(double d); private: - long adjust_row_keyframe(EffectRow* row, long time); QVector selected_fields; QVector selected_keyframes; QVector rowY; From f15beba9fa6011a6c6a31a89272e61b1af8089b1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 00:48:44 -0800 Subject: [PATCH 111/202] made transform blend mode combobox 2 columns --- effects/internal/transformeffect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index a095b3f5a..695b7a48c 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -54,7 +54,7 @@ TransformEffect::TransformEffect(Clip* c, const EffectMeta* em) : Effect(c, em) opacity->set_double_maximum_value(100); EffectRow* blend_mode_row = add_row(tr("Blend Mode")); - blend_mode_box = blend_mode_row->add_field(EFFECT_FIELD_COMBO, "blendmode"); // blend mode + blend_mode_box = blend_mode_row->add_field(EFFECT_FIELD_COMBO, "blendmode", 2); // blend mode blend_mode_box->add_combo_item(tr("Normal"), BLEND_MODE_NORMAL); blend_mode_box->add_combo_item(tr("Darken"), BLEND_MODE_DARKEN); blend_mode_box->add_combo_item(tr("Multiply"), BLEND_MODE_MULTIPLY); From a380af4cb6ef0a90a4ffd0bfc81211c992f842a5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 02:09:06 -0800 Subject: [PATCH 112/202] added missing dep to debian package --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index bb50de7f3..ef8994c44 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: olive-editor Section: video Priority: optional Maintainer: Olive Team -Build-Depends: debhelper (>=9), build-essential, qt5-default, qtmultimedia5-dev, libqt5opengl5-dev, libqt5multimedia5-plugins, libavformat-dev, libavcodec-dev, libavutil-dev, libswscale-dev, libswresample-dev, libavfilter-dev, libpostproc-dev, git, frei0r-plugins-dev +Build-Depends: debhelper (>=9), build-essential, qt5-default, qtmultimedia5-dev, libqt5opengl5-dev, libqt5multimedia5-plugins, libavformat-dev, libavcodec-dev, libavutil-dev, libswscale-dev, libswresample-dev, libavfilter-dev, libpostproc-dev, git, frei0r-plugins-dev, qttools5-dev-tools Standards-Version: 3.9.6 Homepage: https://olivevideoeditor.org/ From 11f9465eae50f66109e9c8021fbab385d48223e9 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 7 Feb 2019 13:20:56 -0800 Subject: [PATCH 113/202] internal rendering renders alpha channel --- ui/renderthread.cpp | 3 +-- ui/viewerwidget.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index 409d948dc..f9e32a274 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -144,10 +144,9 @@ void RenderThread::run() { void RenderThread::paint() { glLoadIdentity(); - glClearColor(0, 0, 0, 1); + glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); - glClearColor(0, 0, 0, 0); glMatrixMode(GL_MODELVIEW); glEnable(GL_TEXTURE_2D); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index aa60717d0..a89279a75 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -567,7 +567,7 @@ void ViewerWidget::paintGL() { makeCurrent(); // clear to solid black - glClearColor(0.0, 0.0, 0.0, 0.0); + glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); // set color multipler to straight white From 8faa4db15cae99bb14ac48dd753d01ce87291985 Mon Sep 17 00:00:00 2001 From: alexmitchell Date: Fri, 8 Feb 2019 13:42:46 +1030 Subject: [PATCH 114/202] Correct mistakes, rename left_arrow to left_side, make lowercase, change namespace to Olive --- cursors/cursors.qrc | 4 ++-- .../{Cursor_Left_Arrow.png => left_side.png} | Bin .../{Cursor_Right_Arrow.png => right_side.png} | Bin ui/cursors.cpp | 16 ++++++++-------- ui/cursors.h | 6 +++--- ui/timelinewidget.cpp | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) rename cursors/{Cursor_Left_Arrow.png => left_side.png} (100%) rename cursors/{Cursor_Right_Arrow.png => right_side.png} (100%) diff --git a/cursors/cursors.qrc b/cursors/cursors.qrc index 96dc6728a..0d40e1940 100644 --- a/cursors/cursors.qrc +++ b/cursors/cursors.qrc @@ -1,6 +1,6 @@ - Cursor_Left_Arrow.png - Cursor_Right_Arrow.png + left_side.png + right_side.png diff --git a/cursors/Cursor_Left_Arrow.png b/cursors/left_side.png similarity index 100% rename from cursors/Cursor_Left_Arrow.png rename to cursors/left_side.png diff --git a/cursors/Cursor_Right_Arrow.png b/cursors/right_side.png similarity index 100% rename from cursors/Cursor_Right_Arrow.png rename to cursors/right_side.png diff --git a/ui/cursors.cpp b/ui/cursors.cpp index 86e89a9ac..65bb01f88 100644 --- a/ui/cursors.cpp +++ b/ui/cursors.cpp @@ -5,18 +5,18 @@ #include -QCursor OLIVE_CURSORS::left_arrow; -QCursor OLIVE_CURSORS::right_arrow; +QCursor Olive::left_side; +QCursor Olive::right_side; -QCursor load_cursor(QString file, const int hotX, const int hotY, const bool right_aligend){ - int hotoutX; +QCursor load_cursor(QString file, const int hotX, const int hotY, const bool right_aligned){ + int hotX_out; QPixmap temp = QPixmap(file); - right_aligend? hotoutX = temp.width() : hotoutX = hotX; - return QCursor(temp,hotoutX,hotY); + right_aligned? hotX_out = temp.width() : hotX_out = hotX; + return QCursor(temp,hotX_out,hotY); } void initCustomCursors(){ qInfo() << "Loading Custom Cursors"; - OLIVE_CURSORS::left_arrow = load_cursor(":/cursors/Cursor_Left_Arrow.png", 0,-1, false); - OLIVE_CURSORS::right_arrow = load_cursor(":/cursors/Cursor_Right_Arrow.png", 0,-1, true); + Olive::left_side = load_cursor(":/cursors/left_side.png", 0,-1, false); + Olive::right_side = load_cursor(":/cursors/right_side.png", 0,-1, true); } diff --git a/ui/cursors.h b/ui/cursors.h index 53f1cb9fa..cec2bb514 100644 --- a/ui/cursors.h +++ b/ui/cursors.h @@ -5,9 +5,9 @@ void initCustomCursors(); -namespace OLIVE_CURSORS{ - extern QCursor left_arrow; - extern QCursor right_arrow; +namespace Olive{ + extern QCursor left_side; + extern QCursor right_side; } #endif // CURSORS_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 8e6e55b9d..5aa17e26f 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -2070,9 +2070,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { }*/ if (found) { if (right_arrow_cursor && !panel_timeline->trim_in_point){ - setCursor(OLIVE_CURSORS::right_arrow); + setCursor(Olive::right_side); }else if (left_arrow_cursor && panel_timeline->trim_in_point){ - setCursor(OLIVE_CURSORS::left_arrow); + setCursor(Olive::left_side); }else setCursor(Qt::SizeHorCursor); } else { From 0ad58a6930ee859a1459c66f49b7dddc6a1c1fcb Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 8 Feb 2019 11:22:04 -0800 Subject: [PATCH 115/202] various improvements --- dialogs/advancedvideodialog.cpp | 70 ++++++ dialogs/advancedvideodialog.h | 24 +++ dialogs/exportdialog.cpp | 330 +++++++++++++++-------------- dialogs/exportdialog.h | 11 +- dialogs/loaddialog.cpp | 2 +- dialogs/replaceclipmediadialog.cpp | 2 +- dialogs/speeddialog.cpp | 2 +- io/exportthread.cpp | 90 ++++---- io/exportthread.h | 46 ++-- olive.pro | 6 +- ui/labelslider.cpp | 80 ++++++- 11 files changed, 435 insertions(+), 228 deletions(-) create mode 100644 dialogs/advancedvideodialog.cpp create mode 100644 dialogs/advancedvideodialog.h diff --git a/dialogs/advancedvideodialog.cpp b/dialogs/advancedvideodialog.cpp new file mode 100644 index 000000000..da5b7a366 --- /dev/null +++ b/dialogs/advancedvideodialog.cpp @@ -0,0 +1,70 @@ +#include "advancedvideodialog.h" + +#include +#include +#include +#include + +#include + +extern "C" { + #include + #include +} + +AdvancedVideoDialog::AdvancedVideoDialog(QWidget *parent, + int encoding_codec, + VideoCodecParams &iparams) : + QDialog(parent), + params(iparams) +{ + setWindowTitle(tr("Advanced Video Settings")); + + // use variable for row to assist adding new fields to this dialog + int row = 0; + + // get encoder information for this codec + AVCodec* codec_info = avcodec_find_encoder(static_cast(encoding_codec)); + + // set up grid layout for dialog + QGridLayout* layout = new QGridLayout(this); + + // codec pixel formats + layout->addWidget(new QLabel(tr("Pixel Format:")), row, 0); + + pix_fmt_combo = new QComboBox(); + + // load possible pixel formats for this codec into the combobox + int pix_fmt_index = 0; + + // AVCodec->pix_fmts is terminated by "-1" + while (codec_info->pix_fmts[pix_fmt_index] != -1) { + pix_fmt_combo->addItem(av_get_pix_fmt_name(codec_info->pix_fmts[pix_fmt_index]), + codec_info->pix_fmts[pix_fmt_index]); + + if (codec_info->pix_fmts[pix_fmt_index] == params.pix_fmt) { + pix_fmt_combo->setCurrentIndex(pix_fmt_combo->count()-1); + } + + pix_fmt_index++; + } + + layout->addWidget(pix_fmt_combo, row, 1); + + row++; + + // buttons + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + buttons->setCenterButtons(true); + connect(buttons, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttons, SIGNAL(rejected()), this, SLOT(reject())); + layout->addWidget(buttons, row, 0, 1, 2); +} + +void AdvancedVideoDialog::accept() { + // store settings back into struct + + params.pix_fmt = pix_fmt_combo->currentData().toInt(); + + QDialog::accept(); +} diff --git a/dialogs/advancedvideodialog.h b/dialogs/advancedvideodialog.h new file mode 100644 index 000000000..a9510aee3 --- /dev/null +++ b/dialogs/advancedvideodialog.h @@ -0,0 +1,24 @@ +#ifndef ADVANCEDVIDEODIALOG_H +#define ADVANCEDVIDEODIALOG_H + +#include + +#include "io/exportthread.h" + +class QComboBox; + +class AdvancedVideoDialog : public QDialog { + Q_OBJECT +public: + AdvancedVideoDialog(QWidget* parent, + int encoding_codec, + VideoCodecParams& iparams); + + void accept(); +private: + VideoCodecParams& params; + + QComboBox* pix_fmt_combo; +}; + +#endif // ADVANCEDVIDEODIALOG_H diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index e1c9991c1..9dfd6f0bb 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -16,6 +16,7 @@ #include #include "debug.h" +#include "dialogs/advancedvideodialog.h" #include "panels/panels.h" #include "panels/viewer.h" #include "panels/timeline.h" @@ -103,10 +104,21 @@ ExportDialog::ExportDialog(QWidget *parent) : ExportDialog::~ExportDialog() {} -void ExportDialog::format_changed(int index) -{ - format_vcodecs.clear(); - format_acodecs.clear(); +void ExportDialog::add_codec_to_combobox(QComboBox* box, enum AVCodecID codec) { + QString codec_name; + + AVCodec* codec_info = avcodec_find_encoder(codec); + + if (codec_info == nullptr) { + codec_name = tr("Unknown codec name %1").arg(static_cast(codec)); + } else { + codec_name = codec_info->long_name; + } + + box->addItem(codec_name, codec); +} + +void ExportDialog::format_changed(int index) { vcodecCombobox->clear(); acodecCombobox->clear(); @@ -114,204 +126,186 @@ void ExportDialog::format_changed(int index) int default_acodec = 0; switch (index) { - case FORMAT_3GPP: - format_vcodecs.append(AV_CODEC_ID_MPEG4); - format_vcodecs.append(AV_CODEC_ID_H264); + case FORMAT_3GPP: + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG4); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_H264); - format_acodecs.append(AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); default_vcodec = 1; break; case FORMAT_AIFF: - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); break; case FORMAT_APNG: - format_vcodecs.append(AV_CODEC_ID_APNG); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_APNG); break; case FORMAT_AVI: - format_vcodecs.append(AV_CODEC_ID_H264); - format_vcodecs.append(AV_CODEC_ID_MPEG4); - format_vcodecs.append(AV_CODEC_ID_MJPEG); - format_vcodecs.append(AV_CODEC_ID_MSVIDEO1); - format_vcodecs.append(AV_CODEC_ID_RAWVIDEO); - format_vcodecs.append(AV_CODEC_ID_HUFFYUV); - format_vcodecs.append(AV_CODEC_ID_DVVIDEO); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_H264); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG4); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MJPEG); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MSVIDEO1); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_RAWVIDEO); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_HUFFYUV); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_DVVIDEO); - format_acodecs.append(AV_CODEC_ID_AAC); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_FLAC); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_FLAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); default_vcodec = 3; default_acodec = 5; break; case FORMAT_DNXHD: - format_vcodecs.append(AV_CODEC_ID_DNXHD); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_DNXHD); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); break; case FORMAT_AC3: - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_EAC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_EAC3); break; case FORMAT_FLV: - format_vcodecs.append(AV_CODEC_ID_FLV1); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_FLV1); - format_acodecs.append(AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); break; case FORMAT_GIF: - format_vcodecs.append(AV_CODEC_ID_GIF); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_GIF); break; case FORMAT_IMG: - format_vcodecs.append(AV_CODEC_ID_BMP); - format_vcodecs.append(AV_CODEC_ID_MJPEG); - format_vcodecs.append(AV_CODEC_ID_JPEG2000); - format_vcodecs.append(AV_CODEC_ID_PSD); - format_vcodecs.append(AV_CODEC_ID_PNG); - format_vcodecs.append(AV_CODEC_ID_TIFF); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_BMP); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MJPEG); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_JPEG2000); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_PSD); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_PNG); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_TIFF); default_vcodec = 4; break; case FORMAT_MP2: - format_acodecs.append(AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); break; case FORMAT_MP3: - format_acodecs.append(AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); break; case FORMAT_MPEG1: - format_vcodecs.append(AV_CODEC_ID_MPEG1VIDEO); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG1VIDEO); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); default_acodec = 1; break; case FORMAT_MPEG2: - format_vcodecs.append(AV_CODEC_ID_MPEG2VIDEO); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG2VIDEO); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); default_acodec = 1; break; case FORMAT_MPEG4: - format_vcodecs.append(AV_CODEC_ID_MPEG4); - format_vcodecs.append(AV_CODEC_ID_H264); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG4); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_H264); - format_acodecs.append(AV_CODEC_ID_AAC); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); default_vcodec = 1; break; case FORMAT_MPEGTS: - format_vcodecs.append(AV_CODEC_ID_MPEG2VIDEO); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG2VIDEO); - format_acodecs.append(AV_CODEC_ID_AAC); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); default_acodec = 2; break; case FORMAT_MKV: - format_vcodecs.append(AV_CODEC_ID_MPEG4); - format_vcodecs.append(AV_CODEC_ID_H264); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG4); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_H264); - format_acodecs.append(AV_CODEC_ID_AAC); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_EAC3); - format_acodecs.append(AV_CODEC_ID_FLAC); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); - format_acodecs.append(AV_CODEC_ID_OPUS); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); - format_acodecs.append(AV_CODEC_ID_VORBIS); - format_acodecs.append(AV_CODEC_ID_WAVPACK); - format_acodecs.append(AV_CODEC_ID_WMAV1); - format_acodecs.append(AV_CODEC_ID_WMAV2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_EAC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_FLAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_OPUS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_VORBIS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_WAVPACK); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_WMAV1); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_WMAV2); default_vcodec = 1; break; case FORMAT_OGG: - format_vcodecs.append(AV_CODEC_ID_THEORA); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_THEORA); - format_acodecs.append(AV_CODEC_ID_OPUS); - format_acodecs.append(AV_CODEC_ID_VORBIS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_OPUS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_VORBIS); default_acodec = 1; break; case FORMAT_MOV: - format_vcodecs.append(AV_CODEC_ID_QTRLE); - format_vcodecs.append(AV_CODEC_ID_MPEG4); - format_vcodecs.append(AV_CODEC_ID_H264); - format_vcodecs.append(AV_CODEC_ID_MJPEG); - format_vcodecs.append(AV_CODEC_ID_PRORES); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_QTRLE); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MPEG4); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_H264); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_MJPEG); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_PRORES); - format_acodecs.append(AV_CODEC_ID_AAC); - format_acodecs.append(AV_CODEC_ID_AC3); - format_acodecs.append(AV_CODEC_ID_MP2); - format_acodecs.append(AV_CODEC_ID_MP3); - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AAC); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_AC3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_MP3); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); default_vcodec = 2; break; case FORMAT_WAV: - format_acodecs.append(AV_CODEC_ID_PCM_S16LE); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_PCM_S16LE); break; case FORMAT_WEBM: - format_vcodecs.append(AV_CODEC_ID_VP8); - format_vcodecs.append(AV_CODEC_ID_VP9); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_VP8); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_VP9); - format_acodecs.append(AV_CODEC_ID_OPUS); - format_acodecs.append(AV_CODEC_ID_VORBIS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_OPUS); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_VORBIS); default_vcodec = 1; break; case FORMAT_WMV: - format_vcodecs.append(AV_CODEC_ID_WMV1); - format_vcodecs.append(AV_CODEC_ID_WMV2); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_WMV1); + add_codec_to_combobox(vcodecCombobox, AV_CODEC_ID_WMV2); - format_acodecs.append(AV_CODEC_ID_WMAV1); - format_acodecs.append(AV_CODEC_ID_WMAV2); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_WMAV1); + add_codec_to_combobox(acodecCombobox, AV_CODEC_ID_WMAV2); default_vcodec = 1; default_acodec = 1; break; default: qCritical() << "Invalid format selection - this is a bug, please inform the developers"; - } - - AVCodec* codec_info; - for (int i=0;iaddItem("nullptr"); - } else { - vcodecCombobox->addItem(codec_info->long_name); - } - } - for (int i=0;iaddItem("nullptr"); - } else { - acodecCombobox->addItem(codec_info->long_name); - } - } + } vcodecCombobox->setCurrentIndex(default_vcodec); acodecCombobox->setCurrentIndex(default_acodec); - bool video_enabled = format_vcodecs.size() != 0; - bool audio_enabled = format_acodecs.size() != 0; + bool video_enabled = vcodecCombobox->count() != 0; + bool audio_enabled = acodecCombobox->count() != 0; videoGroupbox->setChecked(video_enabled); audioGroupbox->setChecked(audio_enabled); videoGroupbox->setEnabled(video_enabled); @@ -378,7 +372,7 @@ void ExportDialog::export_action() { ext = "gif"; break; case FORMAT_IMG: - switch (format_vcodecs.at(vcodecCombobox->currentIndex())) { + switch (vcodecCombobox->currentData().toInt()) { case AV_CODEC_ID_BMP: ext = "bmp"; break; @@ -498,7 +492,32 @@ void ExportDialog::export_action() { } } - et = new ExportThread(this); + ExportParams params; + params.filename = filename; + params.video_enabled = videoGroupbox->isChecked(); + if (params.video_enabled) { + params.video_codec = vcodecCombobox->currentData().toInt(); + params.video_width = widthSpinbox->value(); + params.video_height = heightSpinbox->value(); + params.video_frame_rate = framerateSpinbox->value(); + params.video_compression_type = compressionTypeCombobox->currentData().toInt(); + params.video_bitrate = videobitrateSpinbox->value(); + } + params.audio_enabled = audioGroupbox->isChecked(); + if (params.audio_enabled) { + params.audio_codec = acodecCombobox->currentData().toInt(); + params.audio_sampling_rate = samplingRateSpinbox->value(); + params.audio_bitrate = audiobitrateSpinbox->value(); + } + + params.start_frame = 0; + params.end_frame = sequence->getEndFrame(); // entire sequence + if (rangeCombobox->currentIndex() == 1) { + params.start_frame = qMax(sequence->workarea_in, params.start_frame); + params.end_frame = qMin(sequence->workarea_out, params.end_frame); + } + + et = new ExportThread(params, vcodec_params, this); connect(et, SIGNAL(finished()), et, SLOT(deleteLater())); connect(et, SIGNAL(finished()), this, SLOT(render_thread_finished())); @@ -510,31 +529,7 @@ void ExportDialog::export_action() { mainWindow->autorecover_interval(); - prep_ui_for_render(true); - - et->filename = filename; - et->video_enabled = videoGroupbox->isChecked(); - if (et->video_enabled) { - et->video_codec = format_vcodecs.at(vcodecCombobox->currentIndex()); - et->video_width = widthSpinbox->value(); - et->video_height = heightSpinbox->value(); - et->video_frame_rate = framerateSpinbox->value(); - et->video_compression_type = compressionTypeCombobox->currentData().toInt(); - et->video_bitrate = videobitrateSpinbox->value(); - } - et->audio_enabled = audioGroupbox->isChecked(); - if (et->audio_enabled) { - et->audio_codec = format_acodecs.at(acodecCombobox->currentIndex()); - et->audio_sampling_rate = samplingRateSpinbox->value(); - et->audio_bitrate = audiobitrateSpinbox->value(); - } - - et->start_frame = 0; - et->end_frame = sequence->getEndFrame(); // entire sequence - if (rangeCombobox->currentIndex() == 1) { - et->start_frame = qMax(sequence->workarea_in, et->start_frame); - et->end_frame = qMin(sequence->workarea_out, et->end_frame); - } + prep_ui_for_render(true); et->ed = this; cancelled = false; @@ -561,16 +556,34 @@ void ExportDialog::cancel_render() { void ExportDialog::vcodec_changed(int index) { compressionTypeCombobox->clear(); - if ((format_vcodecs.size() > 0 && format_vcodecs.at(index) == AV_CODEC_ID_H264)) { - compressionTypeCombobox->setEnabled(true); - compressionTypeCombobox->addItem(tr("Quality-based (Constant Rate Factor)"), COMPRESSION_TYPE_CFR); -// compressionTypeCombobox->addItem("File size-based (Two-Pass)", COMPRESSION_TYPE_TARGETSIZE); -// compressionTypeCombobox->addItem("Average bitrate (Two-Pass)", COMPRESSION_TYPE_TARGETBR); - } else { - compressionTypeCombobox->addItem(tr("Constant Bitrate"), COMPRESSION_TYPE_CBR); - compressionTypeCombobox->setCurrentIndex(0); - compressionTypeCombobox->setEnabled(false); - } + + if (vcodecCombobox->count() > 0) { + if (vcodecCombobox->itemData(index) == AV_CODEC_ID_H264) { + compressionTypeCombobox->setEnabled(true); + compressionTypeCombobox->addItem(tr("Quality-based (Constant Rate Factor)"), COMPRESSION_TYPE_CFR); + // compressionTypeCombobox->addItem("File size-based (Two-Pass)", COMPRESSION_TYPE_TARGETSIZE); + // compressionTypeCombobox->addItem("Average bitrate (Two-Pass)", COMPRESSION_TYPE_TARGETBR); + } else { + compressionTypeCombobox->addItem(tr("Constant Bitrate"), COMPRESSION_TYPE_CBR); + compressionTypeCombobox->setCurrentIndex(0); + compressionTypeCombobox->setEnabled(false); + } + + // set default pix_fmt for this codec + AVCodec* codec_info = avcodec_find_encoder(static_cast(vcodecCombobox->itemData(index).toInt())); + if (codec_info == nullptr) { + QMessageBox::critical(this, + tr("Invalid Codec"), + tr("Failed to find a suitable encoder for this codec. Export will likely fail.")); + } else { + vcodec_params.pix_fmt = codec_info->pix_fmts[0]; + if (vcodec_params.pix_fmt == -1) { + QMessageBox::critical(this, + tr("Invalid Codec"), + tr("Failed to find pixel format for this encoder. Export will likely fail.")); + } + } + } } void ExportDialog::comp_type_changed(int) { @@ -593,7 +606,12 @@ void ExportDialog::comp_type_changed(int) { videoBitrateLabel->setText(tr("Target File Size (MB):")); videobitrateSpinbox->setValue(100); break; - } + } +} + +void ExportDialog::open_advanced_video_dialog() { + AdvancedVideoDialog avd(this, vcodecCombobox->currentData().toInt(), vcodec_params); + avd.exec(); } void ExportDialog::setup_ui() { @@ -658,6 +676,10 @@ void ExportDialog::setup_ui() { videobitrateSpinbox->setValue(2); videoGridLayout->addWidget(videobitrateSpinbox, 5, 1, 1, 1); + QPushButton* advanced_video_button = new QPushButton(tr("Advanced")); + connect(advanced_video_button, SIGNAL(clicked(bool)), this, SLOT(open_advanced_video_dialog())); + videoGridLayout->addWidget(advanced_video_button, 6, 1); + verticalLayout->addWidget(videoGroupbox); audioGroupbox = new QGroupBox(this); diff --git a/dialogs/exportdialog.h b/dialogs/exportdialog.h index 7e78d2a95..5c0184064 100644 --- a/dialogs/exportdialog.h +++ b/dialogs/exportdialog.h @@ -12,6 +12,8 @@ class QLabel; class QProgressBar; class QGroupBox; +#include "io/exportthread.h" + class ExportDialog : public QDialog { Q_OBJECT @@ -28,17 +30,20 @@ private slots: void render_thread_finished(); void vcodec_changed(int index); void comp_type_changed(int index); + void open_advanced_video_dialog(); private: - QVector format_strings; - QVector format_vcodecs; - QVector format_acodecs; + QVector format_strings; void setup_ui(); ExportThread* et; void prep_ui_for_render(bool r); bool cancelled; + void add_codec_to_combobox(QComboBox* box, enum AVCodecID codec); + + VideoCodecParams vcodec_params; + QComboBox* rangeCombobox; QSpinBox* widthSpinbox; QDoubleSpinBox* videobitrateSpinbox; diff --git a/dialogs/loaddialog.cpp b/dialogs/loaddialog.cpp index 4c666cd82..e0b555df8 100644 --- a/dialogs/loaddialog.cpp +++ b/dialogs/loaddialog.cpp @@ -28,7 +28,7 @@ LoadDialog::LoadDialog(QWidget *parent, bool autorecovery) : QDialog(parent) { cancel_button = new QPushButton(tr("Cancel"), this); connect(cancel_button, SIGNAL(clicked(bool)), this, SLOT(cancel())); - hboxLayout = new QHBoxLayout(this); + hboxLayout = new QHBoxLayout(); hboxLayout->addStretch(); hboxLayout->addWidget(cancel_button); hboxLayout->addStretch(); diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index 41a337610..7b4171a42 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -39,7 +39,7 @@ ReplaceClipMediaDialog::ReplaceClipMediaDialog(QWidget *parent, Media *old_media use_same_media_in_points->setChecked(true); layout->addWidget(use_same_media_in_points); - QHBoxLayout* buttons = new QHBoxLayout(this); + QHBoxLayout* buttons = new QHBoxLayout(); buttons->addStretch(); diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index d03f6c3e9..d5f411059 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -23,7 +23,7 @@ SpeedDialog::SpeedDialog(QWidget *parent) : QDialog(parent) { QVBoxLayout* main_layout = new QVBoxLayout(this); - QGridLayout* grid = new QGridLayout(this); + QGridLayout* grid = new QGridLayout(); grid->setSpacing(6); grid->addWidget(new QLabel(tr("Speed:"), this), 0, 0); diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 190a3e0a4..074327d88 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -27,7 +27,11 @@ extern "C" { #include #include -ExportThread::ExportThread(QObject *parent) : +ExportThread::ExportThread(const ExportParams &iparams, + const VideoCodecParams& ivparams, + QObject *parent) : + params(iparams), + vcodec_params(ivparams), QThread(parent), continueEncode(true) { @@ -80,13 +84,13 @@ bool ExportThread::encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, bool ExportThread::setupVideo() { // if video is disabled, no setup necessary - if (!video_enabled) return true; + if (!params.video_enabled) return true; // find video encoder - vcodec = avcodec_find_encoder(static_cast(video_codec)); - if (!vcodec) { + vcodec = avcodec_find_encoder(static_cast(params.video_codec)); + if (!vcodec) { qCritical() << "Could not find video encoder"; - ed->export_error = tr("could not video encoder for %1").arg(QString::number(video_codec)); + ed->export_error = tr("could not video encoder for %1").arg(QString::number(params.video_codec)); return false; } @@ -109,14 +113,16 @@ bool ExportThread::setupVideo() { } // setup context - vcodec_ctx->codec_id = static_cast(video_codec); + vcodec_ctx->codec_id = static_cast(params.video_codec); vcodec_ctx->codec_type = AVMEDIA_TYPE_VIDEO; - vcodec_ctx->width = video_width; - vcodec_ctx->height = video_height; + vcodec_ctx->width = params.video_width; + vcodec_ctx->height = params.video_height; vcodec_ctx->sample_aspect_ratio = {1, 1}; - vcodec_ctx->pix_fmt = vcodec->pix_fmts[0]; // maybe be breakable code - vcodec_ctx->framerate = av_d2q(video_frame_rate, INT_MAX); - if (video_compression_type == COMPRESSION_TYPE_CBR) vcodec_ctx->bit_rate = qRound(video_bitrate * 1000000); + vcodec_ctx->pix_fmt = static_cast(vcodec_params.pix_fmt); + vcodec_ctx->framerate = av_d2q(params.video_frame_rate, INT_MAX); + if (params.video_compression_type == COMPRESSION_TYPE_CBR) { + vcodec_ctx->bit_rate = qRound(params.video_bitrate * 1000000); + } vcodec_ctx->time_base = av_inv_q(vcodec_ctx->framerate); video_stream->time_base = vcodec_ctx->time_base; @@ -126,9 +132,9 @@ bool ExportThread::setupVideo() { switch (vcodec_ctx->codec_id) { case AV_CODEC_ID_H264: - switch (video_compression_type) { + switch (params.video_compression_type) { case COMPRESSION_TYPE_CFR: - av_opt_set(vcodec_ctx->priv_data, "crf", QString::number(static_cast(video_bitrate)).toUtf8(), AV_OPT_SEARCH_CHILDREN); + av_opt_set(vcodec_ctx->priv_data, "crf", QString::number(static_cast(params.video_bitrate)).toUtf8(), AV_OPT_SEARCH_CHILDREN); break; } break; @@ -166,8 +172,8 @@ bool ExportThread::setupVideo() { sequence->width, sequence->height, AV_PIX_FMT_RGBA, - video_width, - video_height, + params.video_width, + params.video_height, vcodec_ctx->pix_fmt, SWS_FAST_BILINEAR, nullptr, @@ -180,13 +186,13 @@ bool ExportThread::setupVideo() { bool ExportThread::setupAudio() { // if audio is disabled, no setup necessary - if (!audio_enabled) return true; + if (!params.audio_enabled) return true; // find encoder - acodec = avcodec_find_encoder(static_cast(audio_codec)); + acodec = avcodec_find_encoder(static_cast(params.audio_codec)); if (!acodec) { qCritical() << "Could not find audio encoder"; - ed->export_error = tr("could not audio encoder for %1").arg(QString::number(audio_codec)); + ed->export_error = tr("could not audio encoder for %1").arg(QString::number(params.audio_codec)); return false; } @@ -209,16 +215,16 @@ bool ExportThread::setupAudio() { } // setup context - acodec_ctx->codec_id = static_cast(audio_codec); + acodec_ctx->codec_id = static_cast(params.audio_codec); acodec_ctx->codec_type = AVMEDIA_TYPE_AUDIO; - acodec_ctx->sample_rate = audio_sampling_rate; + acodec_ctx->sample_rate = params.audio_sampling_rate; acodec_ctx->channel_layout = AV_CH_LAYOUT_STEREO; // change this to support surround/mono sound in the future (this is what the user sets the output audio to) acodec_ctx->channels = av_get_channel_layout_nb_channels(acodec_ctx->channel_layout); acodec_ctx->sample_fmt = acodec->sample_fmts[0]; - acodec_ctx->bit_rate = audio_bitrate * 1000; + acodec_ctx->bit_rate = params.audio_bitrate * 1000; acodec_ctx->time_base.num = 1; - acodec_ctx->time_base.den = audio_sampling_rate; + acodec_ctx->time_base.den = params.audio_sampling_rate; audio_stream->time_base = acodec_ctx->time_base; if (fmt_ctx->oformat->flags & AVFMT_GLOBALHEADER) { @@ -307,18 +313,18 @@ bool ExportThread::setupContainer() { void ExportThread::run() { panel_sequence_viewer->pause(); - panel_sequence_viewer->seek(start_frame); + panel_sequence_viewer->seek(params.start_frame); // copy filename - QByteArray ba = filename.toUtf8(); + QByteArray ba = params.filename.toUtf8(); c_filename = new char[ba.size()+1]; strcpy(c_filename, ba.data()); continueEncode = setupContainer(); - if (video_enabled && continueEncode) continueEncode = setupVideo(); + if (params.video_enabled && continueEncode) continueEncode = setupVideo(); - if (audio_enabled && continueEncode) continueEncode = setupAudio(); + if (params.audio_enabled && continueEncode) continueEncode = setupAudio(); if (continueEncode) { ret = avformat_write_header(fmt_ctx, nullptr); @@ -339,13 +345,13 @@ void ExportThread::run() { mutex.lock(); - while (sequence->playhead <= end_frame && continueEncode) { + while (sequence->playhead <= params.end_frame && continueEncode) { start_time = QDateTime::currentMSecsSinceEpoch(); - if (audio_enabled) { + if (params.audio_enabled) { compose_audio(nullptr, sequence, true, false); } - if (video_enabled) { + if (params.video_enabled) { do { // TODO optimize by rendering the next frame while encoding the last renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0], video_frame->linesize[0]/4); @@ -356,8 +362,8 @@ void ExportThread::run() { } // encode last frame while rendering next frame - double timecode_secs = (double) (sequence->playhead-start_frame) / sequence->frame_rate; - if (video_enabled) { + double timecode_secs = double(sequence->playhead - params.start_frame) / sequence->frame_rate; + if (params.video_enabled) { // create sws_frame for converting pixel format // @@ -370,8 +376,8 @@ void ExportThread::run() { sws_frame = av_frame_alloc(); sws_frame->format = vcodec_ctx->pix_fmt; - sws_frame->width = video_width; - sws_frame->height = video_height; + sws_frame->width = params.video_width; + sws_frame->height = params.video_height; av_frame_get_buffer(sws_frame, 0); // convert pixel format to format expected by the encoder @@ -383,10 +389,10 @@ void ExportThread::run() { av_frame_free(&sws_frame); } - if (audio_enabled) { + if (params.audio_enabled) { // do we need to encode more audio samples? - while (continueEncode && file_audio_samples <= (timecode_secs*audio_sampling_rate)) { + while (continueEncode && file_audio_samples <= (timecode_secs*params.audio_sampling_rate)) { // copy samples from audio buffer to AVFrame int adjusted_read = audio_ibuffer_read%audio_ibuffer_size; @@ -417,11 +423,11 @@ void ExportThread::run() { // generating encoding statistics (time it took to encode this frame/estimated remaining time) frame_time = (QDateTime::currentMSecsSinceEpoch()-start_time); total_time += frame_time; - remaining_frames = (end_frame-sequence->playhead); + remaining_frames = (params.end_frame - sequence->playhead); avg_time = (total_time/frame_count); eta = (remaining_frames*avg_time); - emit progress_changed(qRound((double(sequence->playhead-start_frame) / double(end_frame-start_frame)) * 100.0), eta); + emit progress_changed(qRound((double(sequence->playhead - params.start_frame) / double(params.end_frame - params.start_frame)) * 100.0), eta); sequence->playhead++; frame_count++; } @@ -432,13 +438,13 @@ void ExportThread::run() { mutex.unlock(); if (continueEncode) { - if (video_enabled) vpkt_alloc = true; - if (audio_enabled) apkt_alloc = true; + if (params.video_enabled) vpkt_alloc = true; + if (params.audio_enabled) apkt_alloc = true; } mainWindow->set_rendering_state(false); - if (audio_enabled && continueEncode) { + if (params.audio_enabled && continueEncode) { // flush swresample do { swr_convert_frame(swr_ctx, swr_frame, nullptr); @@ -454,8 +460,8 @@ void ExportThread::run() { if (continueEncode) { // flush remaining packets while (continueVideo && continueAudio) { - if (continueVideo && video_enabled) continueVideo = encode(fmt_ctx, vcodec_ctx, nullptr, &video_pkt, video_stream, false); - if (continueAudio && audio_enabled) continueAudio = encode(fmt_ctx, acodec_ctx, nullptr, &audio_pkt, audio_stream, true); + if (continueVideo && params.video_enabled) continueVideo = encode(fmt_ctx, vcodec_ctx, nullptr, &video_pkt, video_stream, false); + if (continueAudio && params.audio_enabled) continueAudio = encode(fmt_ctx, acodec_ctx, nullptr, &audio_pkt, audio_stream, true); } ret = av_write_trailer(fmt_ctx); diff --git a/io/exportthread.h b/io/exportthread.h index ae37ed292..d2ef05486 100644 --- a/io/exportthread.h +++ b/io/exportthread.h @@ -25,28 +25,36 @@ extern "C" { #define COMPRESSION_TYPE_TARGETSIZE 2 #define COMPRESSION_TYPE_TARGETBR 3 +// structs that store parameters passed from the export dialogs to this thread + +struct ExportParams { + // export parameters + QString filename; + bool video_enabled; + int video_codec; + int video_width; + int video_height; + double video_frame_rate; + int video_compression_type; + double video_bitrate; + bool audio_enabled; + int audio_codec; + int audio_sampling_rate; + int audio_bitrate; + long start_frame; + long end_frame; +}; + +struct VideoCodecParams { + int pix_fmt; +}; + class ExportThread : public QThread { Q_OBJECT public: - ExportThread(QObject* parent = nullptr); + ExportThread(const ExportParams& iparams, const VideoCodecParams& ivparams, QObject* parent = nullptr); void run(); - // export parameters - QString filename; - bool video_enabled; - int video_codec; - int video_width; - int video_height; - double video_frame_rate; - int video_compression_type; - double video_bitrate; - bool audio_enabled; - int audio_codec; - int audio_sampling_rate; - int audio_bitrate; - long start_frame; - long end_frame; - QOffscreenSurface surface; ExportDialog* ed; @@ -62,6 +70,10 @@ private: bool setupAudio(); bool setupContainer(); + // params imported from dialogs + ExportParams params; + VideoCodecParams vcodec_params; + AVFormatContext* fmt_ctx; AVStream* video_stream; AVCodec* vcodec; diff --git a/olive.pro b/olive.pro index 9b7f58012..585b0fb40 100644 --- a/olive.pro +++ b/olive.pro @@ -139,7 +139,8 @@ SOURCES += \ effects/internal/vsthost.cpp \ ui/flowlayout.cpp \ dialogs/proxydialog.cpp \ - io/proxygenerator.cpp + io/proxygenerator.cpp \ + dialogs/advancedvideodialog.cpp HEADERS += \ mainwindow.h \ @@ -242,7 +243,8 @@ HEADERS += \ effects/internal/vsthost.h \ ui/flowlayout.h \ dialogs/proxydialog.h \ - io/proxygenerator.h + io/proxygenerator.h \ + dialogs/advancedvideodialog.h FORMS += diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index b635fa3d2..2622e3d51 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -10,7 +10,9 @@ #include LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) { + // set a default frame rate - fallback, shouldn't ever really be used frame_rate = 30; + decimal_places = 1; drag_start = false; drag_proc = false; @@ -96,7 +98,7 @@ void LabelSlider::set_default_value(double v) { } void LabelSlider::set_minimum_value(double v) { - min_value = v; + min_value = v; min_enabled = true; } @@ -106,47 +108,102 @@ void LabelSlider::set_maximum_value(double v) { } void LabelSlider::mousePressEvent(QMouseEvent *ev) { + // if primary button is clicked if (ev->button() == Qt::LeftButton) { + + // store initial value to be compared while dragging drag_start_value = internal_value; - if (ev->modifiers() & Qt::AltModifier) { + + // alt + click sets labelslider to default value + if (ev->modifiers() & Qt::AltModifier) { + + // if the value is not already default, and there is a default to set if (internal_value != default_value && !qIsNaN(default_value)) { + + // cache current value set_previous_value(); + + // set back to default set_value(default_value, true); + } + } else { + + // if value isn't valid, we set to a "default" of 0 if (qIsNaN(internal_value)) internal_value = 0; + // hide the cursor and store information about it for dragging qApp->setOverrideCursor(Qt::BlankCursor); drag_start = true; drag_start_x = cursor().pos().x(); drag_start_y = cursor().pos().y(); } + emit clicked(); - } + + } else { + + // handler if the user clicks with a non-primary button + // prevents mouse from getting stuck in "dragging" mode + mouseReleaseEvent(ev); + + } } void LabelSlider::mouseMoveEvent(QMouseEvent* event) { if (drag_start) { + // if we're dragging + + // we don't actually start fully dragging until the cursor has moved + // while the mouse is down, this helps prevent accidental drags drag_proc = true; + + // get amount cursor moved by double diff = (cursor().pos().x()-drag_start_x) + (drag_start_y-cursor().pos().y()); + + // ctrl + drag drags in smaller increments if (event->modifiers() & Qt::ControlModifier) diff *= 0.01; + + // we'll also need to drag in smaller increments for a percent value if (display_type == LABELSLIDER_PERCENT) diff *= 0.01; + + // sets the value set_value(internal_value + diff, true); + + // keep the cursor in the same location while dragging cursor().setPos(drag_start_x, drag_start_y); } } -void LabelSlider::mouseReleaseEvent(QMouseEvent* ev) { +void LabelSlider::mouseReleaseEvent(QMouseEvent*) { if (drag_start) { + + // unhide cursor qApp->restoreOverrideCursor(); + drag_start = false; - if (drag_proc) { + + if (drag_proc) { + // if we just finished fully dragging + drag_proc = false; + previous_value = drag_start_value; + emit valueChanged(); + } else { + + // if the user didn't actually drag, and just clicked in one place, + // we instead present a dialog prompt for the user to enter a + // specific value + double d = internal_value; - if (display_type == LABELSLIDER_FRAMENUMBER) { + + if (display_type == LABELSLIDER_FRAMENUMBER) { + + // ask the user to enter a timecode QString s = QInputDialog::getText( this, tr("Set Value"), @@ -155,9 +212,16 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent* ev) { valueToString(internal_value) ); if (s.isEmpty()) return; - d = timecode_to_frame(s, config.timecode_view, frame_rate); // string to frame number + + // parse string timecode to a frame number + d = timecode_to_frame(s, config.timecode_view, frame_rate); + } else { + + // ask the user to enter a normal number value bool ok; + + // percentages are stored 0.0 - 1.0 but displayed as 0% - 100% d = QInputDialog::getDouble( this, tr("Set Value"), @@ -171,6 +235,8 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent* ev) { if (!ok) return; if (display_type == LABELSLIDER_PERCENT) d *= 0.01; } + + // if the value actually changed, trigger a change event if (d != internal_value) { set_previous_value(); set_value(d, true); From a9897f1b1020a397068eb3ac86a0fbfc96e37889 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 01:47:58 -0800 Subject: [PATCH 116/202] labelslider sets its own cursor rather than the app's --- ui/labelslider.cpp | 19 ++++++++++++++----- ui/labelslider.h | 3 +++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index 2622e3d51..92d909242 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -19,7 +19,7 @@ LabelSlider::LabelSlider(QWidget* parent) : QLabel(parent) { min_enabled = false; max_enabled = false; set_color(); - setCursor(Qt::SizeHorCursor); + set_default_cursor(); internal_value = -1; set = false; display_type = LABELSLIDER_NORMAL; @@ -109,7 +109,7 @@ void LabelSlider::set_maximum_value(double v) { void LabelSlider::mousePressEvent(QMouseEvent *ev) { // if primary button is clicked - if (ev->button() == Qt::LeftButton) { + if (ev->button() == Qt::LeftButton && !drag_start) { // store initial value to be compared while dragging drag_start_value = internal_value; @@ -134,7 +134,8 @@ void LabelSlider::mousePressEvent(QMouseEvent *ev) { if (qIsNaN(internal_value)) internal_value = 0; // hide the cursor and store information about it for dragging - qApp->setOverrideCursor(Qt::BlankCursor); + set_active_cursor(); + drag_start = true; drag_start_x = cursor().pos().x(); drag_start_y = cursor().pos().y(); @@ -180,7 +181,7 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent*) { if (drag_start) { // unhide cursor - qApp->restoreOverrideCursor(); + set_default_cursor(); drag_start = false; @@ -242,5 +243,13 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent*) { set_value(d, true); } } - } + } +} + +void LabelSlider::set_default_cursor() { + setCursor(Qt::SizeHorCursor); +} + +void LabelSlider::set_active_cursor() { + setCursor(Qt::BlankCursor); } diff --git a/ui/labelslider.h b/ui/labelslider.h index f671d18df..87e42fa4c 100644 --- a/ui/labelslider.h +++ b/ui/labelslider.h @@ -52,6 +52,9 @@ private: int display_type; double frame_rate; + + void set_default_cursor(); + void set_active_cursor(); signals: void valueChanged(); void clicked(); From 16c6c40a7641290c3fc8e6d9114083abb8410d40 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 15:10:02 -0800 Subject: [PATCH 117/202] gizmos fixed when zooming, also fixes #467 #466 --- ui/viewercontainer.cpp | 84 +++++++++++++++++++++--------------------- ui/viewerwidget.cpp | 20 +++++++--- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index f42999c5e..d83f799a9 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -69,64 +69,64 @@ void ViewerContainer::adjust() { vertical_scrollbar->setVisible(false); int zoomed_width = qRound(double(viewer->seq->width)*zoom); - int zoomed_height = qRound(double(viewer->seq->height)*zoom); + int zoomed_height = qRound(double(viewer->seq->height)*zoom); - if (fit || zoomed_width > width() || zoomed_height > height()) { - // if the zoom size is greater than or equal to the available area, only use the available area + if (fit || zoomed_width > width() || zoomed_height > height()) { + // if the zoom size is greater than or equal to the available area, only use the available area - double aspect_ratio = double(viewer->seq->width)/double(viewer->seq->height); + double aspect_ratio = double(viewer->seq->width)/double(viewer->seq->height); - int widget_x = 0; - int widget_y = 0; - int widget_width = width(); - int widget_height = height(); + int widget_x = 0; + int widget_y = 0; + int widget_width = width(); + int widget_height = height(); - if (!fit) { + if (!fit) { widget_width -= vertical_scrollbar->sizeHint().width(); widget_height -= horizontal_scrollbar->sizeHint().height(); } - if (fit) { - double widget_ar = double(widget_width) / double(widget_height); + double widget_ar = double(widget_width) / double(widget_height); - bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; + bool widget_is_wider_than_sequence = widget_ar > aspect_ratio; - if (widget_is_wider_than_sequence) { - widget_width = widget_height * aspect_ratio; - widget_x = (width() / 2) - (widget_width / 2); - } else { - widget_height = widget_width / aspect_ratio; - widget_y = (height() / 2) - (widget_height / 2); - } - - zoom = double(widget_width) / double(viewer->seq->width); - } else if (zoomed_width > width() || zoomed_height > height()) { - horizontal_scrollbar->setVisible(true); - vertical_scrollbar->setVisible(true); - - horizontal_scrollbar->setMaximum(zoomed_width - width()); - vertical_scrollbar->setMaximum(zoomed_height - height()); - - horizontal_scrollbar->setValue(horizontal_scrollbar->maximum()/2); - vertical_scrollbar->setValue(vertical_scrollbar->maximum()/2); - - adjust_scrollbars(); - } + if (widget_is_wider_than_sequence) { + widget_width = widget_height * aspect_ratio; + widget_x = (width() / 2) - (widget_width / 2); + } else { + widget_height = widget_width / aspect_ratio; + widget_y = (height() / 2) - (widget_height / 2); + } child->move(widget_x, widget_y); child->resize(widget_width, widget_height); - } else { - // if the zoom size is smaller than the available area, scale the surface down - int zoomed_x = 0; - int zoomed_y = 0; + if (fit) { + zoom = double(widget_width) / double(viewer->seq->width); + } else if (zoomed_width > width() || zoomed_height > height()) { + horizontal_scrollbar->setVisible(true); + vertical_scrollbar->setVisible(true); - if (zoomed_width < width()) zoomed_x = (width()>>1)-(zoomed_width>>1); - if (zoomed_height < height()) zoomed_y = (height()>>1)-(zoomed_height>>1); + horizontal_scrollbar->setMaximum(zoomed_width - width()); + vertical_scrollbar->setMaximum(zoomed_height - height()); - child->move(zoomed_x, zoomed_y); - child->resize(zoomed_width, zoomed_height); - } + horizontal_scrollbar->setValue(horizontal_scrollbar->maximum()/2); + vertical_scrollbar->setValue(vertical_scrollbar->maximum()/2); + + adjust_scrollbars(); + } + } else { + // if the zoom size is smaller than the available area, scale the surface down + + int zoomed_x = 0; + int zoomed_y = 0; + + if (zoomed_width < width()) zoomed_x = (width()>>1)-(zoomed_width>>1); + if (zoomed_height < height()) zoomed_y = (height()>>1)-(zoomed_height>>1); + + child->move(zoomed_x, zoomed_y); + child->resize(zoomed_width, zoomed_height); + } } } } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index a89279a75..3ad4bfe46 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -341,7 +341,7 @@ void ViewerWidget::mousePressEvent(QMouseEvent* event) { if (waveform) { seek_from_click(event->x()); } else if (event->buttons() & Qt::MiddleButton || panel_timeline->tool == TIMELINE_TOOL_HAND) { - container->dragScrollPress(event->pos()); + container->dragScrollPress(event->pos()*container->zoom); } else if (event->buttons() & Qt::LeftButton) { drag_start_x = event->pos().x(); drag_start_y = event->pos().y(); @@ -367,7 +367,7 @@ void ViewerWidget::mouseMoveEvent(QMouseEvent* event) { if (waveform) { seek_from_click(event->x()); } else if (event->buttons() & Qt::MiddleButton || panel_timeline->tool == TIMELINE_TOOL_HAND) { - container->dragScrollMove(event->pos()); + container->dragScrollMove(event->pos()*container->zoom); } else if (event->buttons() & Qt::LeftButton) { if (gizmos == nullptr) { QDrag* drag = new QDrag(this); @@ -504,10 +504,18 @@ void ViewerWidget::draw_gizmos() { float dot_size = GIZMO_DOT_SIZE / width() * viewer->seq->width; float target_size = GIZMO_TARGET_SIZE / width() * viewer->seq->width; + double zoom_factor = container->zoom/(double(width())/double(viewer->seq->width)); + glPushMatrix(); - glLoadIdentity(); - glOrtho(0, viewer->seq->width, 0, viewer->seq->height, -1, 10); - float gizmo_z = 0.0f; + glLoadIdentity(); + + glOrtho(0, viewer->seq->width, 0, viewer->seq->height, -1, 10); + glScaled(zoom_factor, zoom_factor, 0.0); + glTranslated(-(viewer->seq->width-(width()/container->zoom))*x_scroll, + -((viewer->seq->height-(height()/container->zoom))*(1.0-y_scroll)), + 0); + + float gizmo_z = 0.0f; for (int j=0;jgizmo_count();j++) { EffectGizmo* g = gizmos->gizmo(j); glColor4f(g->color.redF(), g->color.greenF(), g->color.blueF(), 1.0); @@ -585,7 +593,7 @@ void ViewerWidget::paintGL() { glBegin(GL_QUADS); - double ar_diff = (double(viewer->seq->width)/double(viewer->seq->height)/(double(width())/double(height()))); +// double ar_diff = (double(viewer->seq->width)/double(viewer->seq->height)/(double(width())/double(height()))); double zoom_factor = container->zoom/(double(width())/double(viewer->seq->width)); double zoom_size = (zoom_factor*2.0) - 2.0; double zoom_left = -zoom_size*x_scroll - 1.0; From adfe8654346c3590345892a5eab29ac418611603 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 15:11:25 -0800 Subject: [PATCH 118/202] fixed double colon on transitions --- project/transition.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/transition.cpp b/project/transition.cpp index cad1c2792..0535e75e9 100644 --- a/project/transition.cpp +++ b/project/transition.cpp @@ -25,7 +25,7 @@ Transition::Transition(Clip* c, Clip* s, const EffectMeta* em) : Effect(c, em), secondary_clip(s), length(30) { - length_field = add_row(tr("Length:"), false)->add_field(EFFECT_FIELD_DOUBLE, "length"); + length_field = add_row(tr("Length"), false)->add_field(EFFECT_FIELD_DOUBLE, "length"); connect(length_field, SIGNAL(changed()), this, SLOT(set_length_from_slider())); length_field->set_double_default_value(30); length_field->set_double_minimum_value(0); From 10a1c89464ee017d0b5fbcd4a2678520d16ca65c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 15:15:34 -0800 Subject: [PATCH 119/202] fixed effect controls not updating if transitions from the selected clip are selected --- panels/effectcontrols.cpp | 4 ++++ panels/effectcontrols.h | 1 + panels/panels.cpp | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 89536bcfd..fd9969241 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -64,6 +64,10 @@ EffectControls::EffectControls(QWidget *parent) : EffectControls::~EffectControls() {} +int EffectControls::get_mode() { + return mode; +} + bool EffectControls::keyframe_focus() { return headers->hasFocus() || keyframeView->hasFocus(); } diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 042b664b2..9ca830a9e 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -35,6 +35,7 @@ class EffectControls : public QDockWidget public: explicit EffectControls(QWidget *parent = 0); ~EffectControls(); + int get_mode(); void set_clips(QVector& clips, int mode); void clear_effects(bool clear_cache); void delete_effects(); diff --git a/panels/panels.cpp b/panels/panels.cpp index b460647c9..195acee58 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -88,7 +88,10 @@ void update_effect_controls() { } } - bool same = (selected_clips.size() == panel_effect_controls->selected_clips.size()); + + + bool same = (selected_clips.size() == panel_effect_controls->selected_clips.size() + && panel_effect_controls->get_mode() == mode); if (same) { for (int i=0;iselected_clips.at(i)) { From 6ee7153f4a1d9ff7fcc672e43c379fe1f0425acc Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 15:17:57 -0800 Subject: [PATCH 120/202] fixed default transition glitches --- panels/timeline.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index df07305cc..4e67d256e 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -350,12 +350,13 @@ void Timeline::add_transition() { for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { + int transition_to_add = (c->track < 0) ? TRANSITION_INTERNAL_CROSSDISSOLVE : TRANSITION_INTERNAL_LINEARFADE; if (c->get_opening_transition() == nullptr) { - ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(transition_to_add, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); adding = true; } if (c->get_closing_transition() == nullptr) { - ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(TRANSITION_INTERNAL_LINEARFADE, EFFECT_TYPE_TRANSITION), TA_OPENING_TRANSITION, 30)); + ca->append(new AddTransitionCommand(c, nullptr, nullptr, get_internal_meta(transition_to_add, EFFECT_TYPE_TRANSITION), TA_CLOSING_TRANSITION, 30)); adding = true; } } From 6dd54019a024742d4db9990bc2456e8aaee8bcec Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 16:15:06 -0800 Subject: [PATCH 121/202] store language file paths relatively --- dialogs/advancedvideodialog.h | 3 ++- dialogs/preferencesdialog.cpp | 5 ++++- mainwindow.cpp | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/dialogs/advancedvideodialog.h b/dialogs/advancedvideodialog.h index a9510aee3..c20009998 100644 --- a/dialogs/advancedvideodialog.h +++ b/dialogs/advancedvideodialog.h @@ -14,7 +14,8 @@ public: int encoding_codec, VideoCodecParams& iparams); - void accept(); +public slots: + virtual void accept() override; private: VideoCodecParams& params; diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index b9218eda1..a7a3a92d4 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -392,11 +392,14 @@ void PreferencesDialog::setup_ui() { if (translation_dir.exists()) { QStringList translation_files = translation_dir.entryList({"*.qm"}, QDir::Files | QDir::NoDotAndDotDot); for (int i=0;iaddItem(QLocale(locale_str).nativeLanguageName(), locale_full_path); + language_combobox->addItem(QLocale(locale_str).nativeLanguageName(), locale_relative_path); if (config.language_file == locale_full_path) { language_combobox->setCurrentIndex(language_combobox->count() - 1); diff --git a/mainwindow.cpp b/mainwindow.cpp index 1d18c1b82..898e8d70d 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -207,11 +207,18 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : config.language_file : runtime_config.external_translation_file; - if (!language_file.isEmpty() - && QFileInfo::exists(language_file)) { - QTranslator* translator = new QTranslator(this); - translator->load(language_file); - QApplication::installTranslator(translator); + if (!language_file.isEmpty()) { + + // translation files are stored relative to app path (see GitHub issue #454) + QString full_language_path = QDir(get_app_dir()).filePath(language_file); + + if (QFileInfo::exists(full_language_path)) { + QTranslator* translator = new QTranslator(this); + translator->load(full_language_path); + QApplication::installTranslator(translator); + } else { + qWarning() << "Failed to load translation file" << full_language_path << ". No language will be loaded."; + } } alloc_panels(this); From 35db995c607196c3fa4195b85e4d0aef456cf4a3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 16:29:37 -0800 Subject: [PATCH 122/202] fixed #463, #454 --- dialogs/preferencesdialog.cpp | 6 +- io/previewgenerator.cpp | 324 ++++++++++++++++++---------------- 2 files changed, 175 insertions(+), 155 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index a7a3a92d4..68e5bfc88 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -401,7 +401,7 @@ void PreferencesDialog::setup_ui() { QString locale_str = locale_file_basename.mid(locale_file_basename.lastIndexOf('_')+1); language_combobox->addItem(QLocale(locale_str).nativeLanguageName(), locale_relative_path); - if (config.language_file == locale_full_path) { + if (config.language_file == locale_relative_path) { language_combobox->setCurrentIndex(language_combobox->count() - 1); } } @@ -458,7 +458,7 @@ void PreferencesDialog::setup_ui() { general_layout->addWidget(new QLabel(tr("Thumbnail Resolution:"), this), row, 0, 1, 1); thumbnail_res_spinbox = new QSpinBox(this); - thumbnail_res_spinbox->setMinimum(1); + thumbnail_res_spinbox->setMinimum(0); thumbnail_res_spinbox->setMaximum(INT_MAX); thumbnail_res_spinbox->setValue(config.thumbnail_resolution); general_layout->addWidget(thumbnail_res_spinbox, row, 1, 1, 1); @@ -466,7 +466,7 @@ void PreferencesDialog::setup_ui() { general_layout->addWidget(new QLabel(tr("Waveform Resolution:"), this), row, 2, 1, 1); waveform_res_spinbox = new QSpinBox(this); - waveform_res_spinbox->setMinimum(1); + waveform_res_spinbox->setMinimum(0); waveform_res_spinbox->setMaximum(INT_MAX); waveform_res_spinbox->setValue(config.waveform_resolution); general_layout->addWidget(waveform_res_spinbox, row, 3, 1, 1); diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 923a824a1..04d443b67 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -209,9 +209,17 @@ void PreviewGenerator::generate_waveform() { AVFrame* temp_frame = av_frame_alloc(); AVCodecContext** codec_ctx = new AVCodecContext* [fmt_ctx->nb_streams]; int64_t* media_lengths = new int64_t[fmt_ctx->nb_streams]{0}; + + // defaults to false, sets to true if we find a valid stream to make a preview of + bool create_previews = false; + for (unsigned int i=0;inb_streams;i++) { codec_ctx[i] = nullptr; - if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + + // we only generate previews for video and audio + // and only if the thumbnail and waveform sizes are > 0 + if ((fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && config.thumbnail_resolution > 0) + || (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && config.waveform_resolution > 0)) { AVCodec* codec = avcodec_find_decoder(fmt_ctx->streams[i]->codecpar->codec_id); if (codec != nullptr) { codec_ctx[i] = avcodec_alloc_context3(codec); @@ -220,189 +228,201 @@ void PreviewGenerator::generate_waveform() { if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && codec_ctx[i]->channel_layout == 0) { codec_ctx[i]->channel_layout = av_get_default_channel_layout(fmt_ctx->streams[i]->codecpar->channels); } + create_previews = true; } } - } + } - // TODO may be unnecessary - doesn't av_read_frame allocate a packet itself? - AVPacket* packet = av_packet_alloc(); + if (create_previews) { + // TODO may be unnecessary - doesn't av_read_frame allocate a packet itself? + AVPacket* packet = av_packet_alloc(); - bool done = true; + bool done = true; - bool end_of_file = false; + bool end_of_file = false; - // get the ball rolling - do { - av_read_frame(fmt_ctx, packet); - } while (codec_ctx[packet->stream_index] == nullptr); - avcodec_send_packet(codec_ctx[packet->stream_index], packet); + // get the ball rolling + do { + av_read_frame(fmt_ctx, packet); + } while (codec_ctx[packet->stream_index] == nullptr); + avcodec_send_packet(codec_ctx[packet->stream_index], packet); - while (!end_of_file) { - while (codec_ctx[packet->stream_index] == nullptr || avcodec_receive_frame(codec_ctx[packet->stream_index], temp_frame) == AVERROR(EAGAIN)) { - av_packet_unref(packet); - int read_ret = av_read_frame(fmt_ctx, packet); + while (!end_of_file) { + while (codec_ctx[packet->stream_index] == nullptr || avcodec_receive_frame(codec_ctx[packet->stream_index], temp_frame) == AVERROR(EAGAIN)) { + av_packet_unref(packet); + int read_ret = av_read_frame(fmt_ctx, packet); - //dout << "read frame for" << footage->name << footage->url << read_ret << "retrieve_duration:" << retrieve_duration << "eof:" << end_of_file << "packet pts:" << packet->pts; + //dout << "read frame for" << footage->name << footage->url << read_ret << "retrieve_duration:" << retrieve_duration << "eof:" << end_of_file << "packet pts:" << packet->pts; - if (read_ret < 0) { - end_of_file = true; - if (read_ret != AVERROR_EOF) qCritical() << "Failed to read packet for preview generation" << read_ret; - break; - } - if (codec_ctx[packet->stream_index] != nullptr) { - int send_ret = avcodec_send_packet(codec_ctx[packet->stream_index], packet); - if (send_ret < 0 && send_ret != AVERROR(EAGAIN)) { - qCritical() << "Failed to send packet for preview generation - aborting" << send_ret; - end_of_file = true; - break; - } - } - } - if (!end_of_file) { - FootageStream* s = footage->get_stream_from_file_index(fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO, packet->stream_index); - if (s != nullptr) { - if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { - if (!s->preview_done) { - int dstH = config.thumbnail_resolution; - int dstW = qRound(dstH * (float(temp_frame->width)/float(temp_frame->height))); - uint8_t* data = new uint8_t[size_t(dstW*dstH*4)]; + if (read_ret < 0) { + end_of_file = true; + if (read_ret != AVERROR_EOF) qCritical() << "Failed to read packet for preview generation" << read_ret; + break; + } + if (codec_ctx[packet->stream_index] != nullptr) { + int send_ret = avcodec_send_packet(codec_ctx[packet->stream_index], packet); + if (send_ret < 0 && send_ret != AVERROR(EAGAIN)) { + qCritical() << "Failed to send packet for preview generation - aborting" << send_ret; + end_of_file = true; + break; + } + } + } + if (!end_of_file) { + FootageStream* s = footage->get_stream_from_file_index(fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO, packet->stream_index); + if (s != nullptr) { + if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + if (!s->preview_done) { + int dstH = config.thumbnail_resolution; + int dstW = qRound(dstH * (float(temp_frame->width)/float(temp_frame->height))); + uint8_t* data = new uint8_t[size_t(dstW*dstH*4)]; - sws_ctx = sws_getContext( - temp_frame->width, - temp_frame->height, - static_cast(temp_frame->format), - dstW, - dstH, - static_cast(AV_PIX_FMT_RGBA), - SWS_FAST_BILINEAR, - nullptr, - nullptr, - nullptr - ); + sws_ctx = sws_getContext( + temp_frame->width, + temp_frame->height, + static_cast(temp_frame->format), + dstW, + dstH, + static_cast(AV_PIX_FMT_RGBA), + SWS_FAST_BILINEAR, + nullptr, + nullptr, + nullptr + ); - int linesize[AV_NUM_DATA_POINTERS]; - linesize[0] = dstW*4; - sws_scale(sws_ctx, temp_frame->data, temp_frame->linesize, 0, temp_frame->height, &data, linesize); + int linesize[AV_NUM_DATA_POINTERS]; + linesize[0] = dstW*4; + sws_scale(sws_ctx, temp_frame->data, temp_frame->linesize, 0, temp_frame->height, &data, linesize); - s->video_preview = QImage(data, dstW, dstH, linesize[0], QImage::Format_RGBA8888, thumb_data_cleanup); - s->make_square_thumb(); + s->video_preview = QImage(data, dstW, dstH, linesize[0], QImage::Format_RGBA8888, thumb_data_cleanup); + s->make_square_thumb(); - // is video interlaced? - s->video_auto_interlacing = (temp_frame->interlaced_frame) ? ((temp_frame->top_field_first) ? VIDEO_TOP_FIELD_FIRST : VIDEO_BOTTOM_FIELD_FIRST) : VIDEO_PROGRESSIVE; - s->video_interlacing = s->video_auto_interlacing; + // is video interlaced? + s->video_auto_interlacing = (temp_frame->interlaced_frame) ? ((temp_frame->top_field_first) ? VIDEO_TOP_FIELD_FIRST : VIDEO_BOTTOM_FIELD_FIRST) : VIDEO_PROGRESSIVE; + s->video_interlacing = s->video_auto_interlacing; - s->preview_done = true; + s->preview_done = true; - sws_freeContext(sws_ctx); + sws_freeContext(sws_ctx); - if (!retrieve_duration) { - avcodec_close(codec_ctx[packet->stream_index]); - codec_ctx[packet->stream_index] = nullptr; - } - } - media_lengths[packet->stream_index]++; - } else if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { - int interval = qFloor((temp_frame->sample_rate/config.waveform_resolution)/4)*4; + if (!retrieve_duration) { + avcodec_close(codec_ctx[packet->stream_index]); + codec_ctx[packet->stream_index] = nullptr; + } + } + media_lengths[packet->stream_index]++; + } else if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + int interval = qFloor((temp_frame->sample_rate/config.waveform_resolution)/4)*4; - AVFrame* swr_frame = av_frame_alloc(); - swr_frame->channel_layout = temp_frame->channel_layout; - swr_frame->sample_rate = temp_frame->sample_rate; - swr_frame->format = AV_SAMPLE_FMT_S16P; + AVFrame* swr_frame = av_frame_alloc(); + swr_frame->channel_layout = temp_frame->channel_layout; + swr_frame->sample_rate = temp_frame->sample_rate; + swr_frame->format = AV_SAMPLE_FMT_S16P; - swr_ctx = swr_alloc_set_opts( - nullptr, - temp_frame->channel_layout, - static_cast(swr_frame->format), - temp_frame->sample_rate, - temp_frame->channel_layout, - static_cast(temp_frame->format), - temp_frame->sample_rate, - 0, - nullptr - ); + swr_ctx = swr_alloc_set_opts( + nullptr, + temp_frame->channel_layout, + static_cast(swr_frame->format), + temp_frame->sample_rate, + temp_frame->channel_layout, + static_cast(temp_frame->format), + temp_frame->sample_rate, + 0, + nullptr + ); - swr_init(swr_ctx); + swr_init(swr_ctx); - swr_convert_frame(swr_ctx, swr_frame, temp_frame); + swr_convert_frame(swr_ctx, swr_frame, temp_frame); - // TODO implement a way to terminate this if the user suddenly closes the project while the waveform is being generated - int sample_size = av_get_bytes_per_sample(static_cast(swr_frame->format)); - int nb_bytes = swr_frame->nb_samples * sample_size; - int byte_interval = interval * sample_size; - for (int i=0;ichannels;j++) { - qint16 min = 0; - qint16 max = 0; - for (int k=0;kdata[j][i+k+1] << 8) | swr_frame->data[j][i+k]); - if (sample > max) { - max = sample; - } else if (sample < min) { - min = sample; - } - } else { - break; - } - } - s->audio_preview.append(min >> 8); - s->audio_preview.append(max >> 8); - if (cancelled) break; - } - } + // TODO implement a way to terminate this if the user suddenly closes the project while the waveform is being generated + int sample_size = av_get_bytes_per_sample(static_cast(swr_frame->format)); + int nb_bytes = swr_frame->nb_samples * sample_size; + int byte_interval = interval * sample_size; + for (int i=0;ichannels;j++) { + qint16 min = 0; + qint16 max = 0; + for (int k=0;kdata[j][i+k+1] << 8) | swr_frame->data[j][i+k]); + if (sample > max) { + max = sample; + } else if (sample < min) { + min = sample; + } + } else { + break; + } + } + s->audio_preview.append(min >> 8); + s->audio_preview.append(max >> 8); + if (cancelled) break; + } + } - swr_free(&swr_ctx); - av_frame_unref(swr_frame); - av_frame_free(&swr_frame); + swr_free(&swr_ctx); + av_frame_unref(swr_frame); + av_frame_free(&swr_frame); - if (cancelled) { - end_of_file = true; - break; - } - } - } + if (cancelled) { + end_of_file = true; + break; + } + } + } + + // check if we've got all our previews + if (retrieve_duration) { + done = false; + } else if (footage->audio_tracks.size() == 0) { + done = true; + for (int i=0;ivideo_tracks.size();i++) { + if (!footage->video_tracks.at(i).preview_done) { + done = false; + break; + } + } + if (done) { + end_of_file = true; + break; + } + } + av_packet_unref(packet); + } + } + + av_frame_free(&temp_frame); + av_packet_free(&packet); + + for (unsigned int i=0;inb_streams;i++) { + if (codec_ctx[i] != nullptr) { + avcodec_close(codec_ctx[i]); + avcodec_free_context(&codec_ctx[i]); + } + } + + // by this point, we'll have made all audio waveform previews + for (int i=0;iaudio_tracks.size();i++) { + footage->audio_tracks[i].preview_done = true; + } + } - // check if we've got all our previews - if (retrieve_duration) { - done = false; - } else if (footage->audio_tracks.size() == 0) { - done = true; - for (int i=0;ivideo_tracks.size();i++) { - if (!footage->video_tracks.at(i).preview_done) { - done = false; - break; - } - } - if (done) { - end_of_file = true; - break; - } - } - av_packet_unref(packet); - } - } - for (int i=0;iaudio_tracks.size();i++) { - footage->audio_tracks[i].preview_done = true; - } - av_frame_free(&temp_frame); - av_packet_free(&packet); - for (unsigned int i=0;inb_streams;i++) { - if (codec_ctx[i] != nullptr) { - avcodec_close(codec_ctx[i]); - avcodec_free_context(&codec_ctx[i]); - } - } if (retrieve_duration) { footage->length = 0; - int maximum_stream = 0; + unsigned int maximum_stream = 0; for (unsigned int i=0;inb_streams;i++) { if (media_lengths[i] > media_lengths[maximum_stream]) { maximum_stream = i; } } - footage->length = double(media_lengths[maximum_stream]) / av_q2d(fmt_ctx->streams[maximum_stream]->avg_frame_rate) * AV_TIME_BASE; // TODO redo with PTS - finalize_media(); + + // FIXME: length is currently retrieved as a frame count rather than a timestamp + footage->length = qRound(double(media_lengths[maximum_stream]) / av_q2d(fmt_ctx->streams[maximum_stream]->avg_frame_rate) * AV_TIME_BASE); + + finalize_media(); } + delete [] media_lengths; delete [] codec_ctx; } From 0f51bdbe060a3eeb2bc6e395306fd6a627dff22e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 16:31:30 -0800 Subject: [PATCH 123/202] updated language files --- ts/olive_cs.ts | 964 ++++++++++++++++++++------------- ts/olive_de.ts | 1224 +++++++++++++++++++++++++++--------------- ts/olive_es.ts | 1376 ++++++++++++++++++++++++++++++------------------ ts/olive_fr.ts | 1376 ++++++++++++++++++++++++++++++------------------ ts/olive_it.ts | 1376 ++++++++++++++++++++++++++++++------------------ ts/olive_ru.ts | 689 +++++++++++++----------- 6 files changed, 4376 insertions(+), 2629 deletions(-) diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts index 2fe9ce677..e7807dc66 100644 --- a/ts/olive_cs.ts +++ b/ts/olive_cs.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. Olive je nelineární editor obrazového záznamu. Tento program je zdarma a chráněn GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. Družstvo Olive se dává na vědomí, že zdrojové kódy Olive jsou dostupné pro stažení na internetové stránce projektu. @@ -22,6 +22,19 @@ Hledat činnost... + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio @@ -123,22 +136,22 @@ DemoNotice - + Welcome to Olive! Vítejte v Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. Olive je editor obrazového záznamu s otevřeným zdrojovým kódem vydaný pod GNU GPL. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 Tento program je v současnosti v Alfa verzi, což znamená, že je nestálý a velice pravděpodobně náchylný k pádům, má chyby a chybí mu funkce. Není poskytována žádná záruka, takže jej používejte na vlastní nebezpečí. Hlašte, prosím, jakékoli chyby nebo žádosti o funkce na %1 - + Thank you for trying Olive and we hope you enjoy it! Děkujeme vám za zkoušení Olive. Přejeme si, aby vám dělal radost! @@ -146,40 +159,92 @@ Effect - + Invalid effect Neplatný efekt - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. Žádný uchazeč pro efekt '%1'. Tento přechod může být poškozen. Pokuste se jej nebo Olive znovu nainstalovat. - + Cu&t Vyjmou&t - + &Copy &Kopírovat - + Move &Up Posunout &nahoru - + Move &Down Posunout &dolů - + D&elete S&mazat + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + EffectControls @@ -189,42 +254,42 @@ Efekty: - + &Paste &Vložit - + Add Video Effect Přidat obrazový efekt - + VIDEO EFFECTS OBRAZOVÉ EFEKTY - + Add Video Transition Přidat obrazový přechod - + Add Audio Effect Přidat zvukový efekt - + AUDIO EFFECTS ZVUKOVÉ EFEKTY - + Add Audio Transition Přidat zvukový přechod - + (Multiple clips selected) (vybráno více záběrů) @@ -253,77 +318,98 @@ ExportDialog - + Export "%1" Vyvést "%1" - + + Unknown codec name %1 + + + + Export Failed Nepodařilo se vyvést - + Export failed - %1 Nepodařilo se vyvést - %1 - + Invalid dimensions Neplatné rozměry - + Export width and height must both be even numbers/divisible by 2. Šířka a výška pro vyvedení musí být sudá čísla dělitelná 2. - + Invalid codec Neplatný kodek - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. Nepodařilo se určit výstupní parametry pro vybraný kodek. Toto je chyba. Spojte se, prosím, s vývojáři. - + Invalid format Neplatný formát - + Couldn't determine output format. This is a bug, please contact the developers. Nepodařilo se určit výstupní formát. Toto je chyba. Spojte se, prosím, s vývojáři. - + Export Media Vyvést záznam - + Quality-based (Constant Rate Factor) Kvalita (Constant Rate Factor) - + Constant Bitrate Stálý datový tok + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): Datový tok (MB/s): - + Quality (CRF): Kvalita (CRF): - + Quality Factor: 0 = lossless @@ -338,68 +424,73 @@ 51 = nejnižší možná jakost - + Target File Size (MB): Velikost cílového souboru (MB): - + Format: Formát: - + Range: Rozsah: - + Entire Sequence Celá sekvence - + In to Out Vstup do výstupu - + Video Obraz - - + + Codec: Kodek: - + Width: Šířka: - + Height: Výška: - + Frame Rate: Snímkování: - + Compression Type: Typ komprese: - + + Advanced + + + + Sampling Rate: Rychlost vzorkování: - + Bitrate (Kbps/CBR): Datový tok (KB/s/stálý datový tok): @@ -407,87 +498,87 @@ ExportThread - + failed to send frame to encoder (%1) Chyba při poslání snímku kodéru (%1) - + failed to receive packet from encoder (%1) Chyba při přijetí paketu od kodéru (%1) - + could not video encoder for %1 Nepodařilo se najít kodér obrazu pro %1 - + could not allocate video stream Nepodařilo se přiřadit datový proud obrazu - + could not allocate video encoding context Nepodařilo se přiřadit kontext kódování obrazu - + could not open output video encoder (%1) Nepodařilo se otevřít kodér obrazu (%1) - + could not copy video encoder parameters to output stream (%1) Nepodařilo se kopírovat parametry kodéru obrazu do výstupního proudu (%1) - + could not audio encoder for %1 Nepodařilo se najít kodér zvuku pro %1 - + could not allocate audio stream Nepodařilo se přiřadit datový proud zvuku - + could not allocate audio encoding context Nepodařilo se přiřadit kontext kódování zvuku - + could not open output audio encoder (%1) Nepodařilo se otevřít kodér zvuku (%1) - + could not copy audio encoder parameters to output stream (%1) Nepodařilo se kopírovat parametry kodéru zvuku do výstupního proudu (%1) - + could not allocate audio buffer (%1) Nepodařilo se přiřadit vyrovnávací paměť zvuku (%1) - + could not create output format context Nepodařilo se vytvořit kontext výstupního formátu - + could not open output file (%1) Nepodařilo se otevřít výstupní soubor (%1) - + could not write output file header (%1) Nepodařilo se zapsat hlavičku výstupního souboru (%1) - + could not write output file trailer (%1) Nepodařilo se zapsat ukázku výstupního souboru (%1) @@ -608,17 +699,17 @@ KeyframeView - + Linear Lineární - + Bezier Bézier - + Hold Držet @@ -626,14 +717,14 @@ LabelSlider - - + + Set Value Nastavit hodnotu - - + + New value: Nová hodnota: @@ -659,12 +750,12 @@ LoadThread - + Version Mismatch Rozdílná verze - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? Tento projekt byl uložen v jiné verzi Olive a nemusí být plně slučitelný s touto verzí. Přesto se jej chcete pokusit nahrát? @@ -717,731 +808,760 @@ Vítejte v %1 - + Auto-recovery Automatické obnovení - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive nebyl zavřen řádně a byl zjištěn soubor pro automatické obnovení. Chcete jej otevřít? - + &Project &Projekt - + &Sequence &Sekvence - + &Folder &Složka - + Set In Point Nastavit bod začátku - + Set Out Point Nastavit bod konce - Enable/Disable In/Out Point - Povolit/Zakázat bod začátku/konce + Povolit/Zakázat bod začátku/konce - + Reset In Point Obnovit výchozí bod začátku - + Reset Out Point Obnovit výchozí bod konce - + Clear In/Out Point Vymazat bod začátku/konce - + No active sequence Žádná činná sekvence - + Please open the sequence you wish to export. Otevřete, prosím, sekvence, již chcete vyvést. - + Save Project As... Uložit projekt jako... - + Unsaved Project Neuložený projekt - + This project has changed since it was last saved. Would you like to save it before closing? Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? - + &File &Soubor - + &New &Nový - + &Open Project &Otevřít projekt - + Clear Recent List Vyprázdnit seznam naposledy otevřených souborů - + Open Recent Otevřít nedávné - + &Save Project &Uložit projekt - + Save Project &As Uložit projekt j&ako - + &Import... &Zavést... - + &Export... &Vyvést... - + E&xit &Ukončit - + &Edit Úp&ravy - + &Undo &Zpět - + Redo Znovu - + Cu&t Vyjmou&t - + Cop&y &Kopírovat - + &Paste &Vložit - + Paste Insert Vložit vložku - + Duplicate Zdvojit - + Delete Smazat - + Ripple Delete Vytáhnout - + Split Rozdělit - + Select &All Vybrat &vše - + Deselect All Zrušit výběr všeho - + Add Default Transition Přidat výchozí přechod - + Link/Unlink Spojit/Oddělit - + Enable/Disable Povolit/Zakázat - + Nest Vnořovat - + Ripple to In Point Vložit a posunout k bodu začátku - + Ripple to Out Point Vložit a posunout k bodu konce - + Edit to In Point Upravit po bod začátku - + Edit to Out Point Upravit po bod konce - + Delete In/Out Point Smazat bod začátku/konce - + Ripple Delete In/Out Point Vytáhnout bod začátku/konce - + Set/Edit Marker Nastavit/Upravit značku - + &View &Pohled - + Zoom In Přiblížit - + Zoom Out Oddálit - + Increase Track Height Zvětšit výšku stopy - + Decrease Track Height Zmenšit výšku stopy - + Toggle Show All Přepnout ukázání všeho - + Track Lines Řádky stop - + Rectified Waveforms Vlnový tvar odspodu - + Frames Snímky - + Drop Frame Zahodit snímek - + Non-Drop Frame Nezahodit snímek - + Milliseconds Milisekundy - + Title/Action Safe Area Bezpečná oblast - + Off Vypnuto - + Default Výchozí - + 4:3 4:3 - + 16:9 16:9 - + Custom Vlastní - + Full Screen Celá obrazovka - + Full Screen Viewer Prohlížeč na celou obrazovku - + &Playback &Přehrávání - + Go to Start Jít na začátek - + Previous Frame Předchozí snímek - + Play/Pause Přehrát/Pozastavit - + Play In to Out Přehrát od začátku po konec - + Next Frame Další snímek - + Go to End Jít na konec - + Go to Previous Cut Jít na předchozí záběr - + Go to Next Cut Jít na další záběr - + Go to In Point Jít na bod začátku - + Go to Out Point Jít na bod konce - + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + Decrease Speed - Snížit rychlost + Snížit rychlost - Pause - Pozastavit + Pozastavit - Increase Speed - Zvýšit rychlost + Zvýšit rychlost - + Loop Smyčka - + &Window &Okno - + Project Projekt - + Effect Controls Ovládání efektů - + Timeline Časová osa - + Graph Editor Editor grafu - + Media Viewer Prohlížeč záznamu - + Sequence Viewer Prohlížeč řady - + Maximize Panel Zvětšit panel - + Reset to Default Layout Obnovit výchozí rozvržení - + &Tools &Nástroje - + Pointer Tool Ukazovátko - + Edit Tool Nástroj pro úpravy - + Ripple Tool Vložení a posunutí - + Razor Tool Nástroj břitvy - + Slip Tool Roztočení se ztotožněním - + Slide Tool Roztočení - + Hand Tool Ručička - + Transition Tool Přechod - + Enable Snapping Povolit přichytávání - + Selecting Also Seeks Výběr také vyhledává - + Edit Tool Also Seeks Nástroj pro úpravy také vyhledává - + Edit Tool Selects Links Nástroj pro úpravy vybírá odkazy - + Seek Also Selects Vyhledávání také vybírá - + Seek to the End of Pastes Vyhledávat po konec vložení - + Scroll Wheel Zooms Kolečko myši přibližuje - + Enable Drag Files to Timeline Povolit tažení souborů na časovou osu - + Auto-Scale By Default Automaticky měnit velikost - + Enable Seek to Import Povolit vyhledávání k zavedení - + Audio Scrubbing Přehrávání zvuku při tažení ukazatele - + Enable Drop on Media to Replace Povolit upuštění na záznam pro nahrazení - + Enable Hover Focus Povolit zaměření při přejetí - + Ask For Name When Setting Marker Požádat o název při nastavení značky - + No Auto-Scroll Žádné automatické projíždění - + Page Auto-Scroll Stránkové automatické projíždění - + Smooth Auto-Scroll Jemné automatické projíždění - + Preferences Nastavení - + Clear Undo Vyprázdnit minulost kroků zpět - + &Help Nápo&věda - + A&ction Search Hledání č&inností - + Debug Log Zápis ladění - + &About... &O programu... - + <untitled> <bez názvu> - + Open Project... Otevřít projekt... - + Missing recent project Chybí nedávný projekt - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? - + Invalid aspect ratio Neplatný poměr stran - + The aspect ratio '%1' is invalid. Please try again. Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. - + Enter custom aspect ratio Zadat vlastní poměr stran - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): - + Nested Sequence Vnořená řada + + Marker + + + Set Marker + Nastavit značku + + + + Set clip marker name: + + + + + Set sequence marker name: + + + Media - + New Folder Nová složka - + Name: Název: - + Filename: Název souboru: - + Video Dimensions: Rozměry obrazu: - + Frame Rate: Snímkování: - + %1 fields (%2 frames) %1 polí (%2 snímků) - + Interlacing: Prokládání: - + Audio Frequency: Kmitočet zvuku: - + Audio Channels: Zvukové kanály: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1454,17 +1574,17 @@ Kmitočet zvuku: %5 Rozložení zvuku: %6 - + Name Název - + Duration Doba trvání - + Rate Rychlost @@ -1653,6 +1773,14 @@ Rozložení zvuku: %6 Vyvážení + + Playback + + + Generating Proxy: %1% + + + PreferencesDialog @@ -1737,184 +1865,184 @@ Rozložení zvuku: %6 Jazyk: - + Custom CSS: Vlastní CSS: - + Browse Procházet - + Image sequence formats: Formáty obrázkové řady: - + Audio Recording: Nahrávání zvuku: - + Mono Mono - + Stereo Stereo - + Effect Textbox Lines: Řádky textového pole efektu: - + Thumbnail Resolution: Rozlišení náhledu: - + Waveform Resolution: Rozlišení tvaru vlny: - + Use Software Fallbacks When Possible Zajištění skrze softwarovou zálohu - + General Obecné - + Behavior Chování - + Disable Multithreading on Images Zakázat vytvoření více vláken v jednom procesu na obrázky - + Seeking Vyhledávání - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Přesné vyhledávání Vždy ukazovat správný snímek (obraz se při získávání správného snímku může na krátkou dobu pozastavit) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Rychlé vyhledávání Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - neovlivňuje přehrávání/vyvádění) - + Memory Usage Využití paměti - + Upcoming Frame Queue: Nadcházející řada snímků: - - + + frames snímků - - + + seconds sekund - + Previous Frame Queue: Předchozí řada snímků: - + Playback Přehrávání - + Output Device: Výstupní zařízení: - - + + Default Výchozí - + Input Device: Vstupní zařízení: - + Sample Rate: Vzorkovací kmitočet: - + Audio Zvuk - + Search for action or shortcut Hledat činnosti nebo klávesové zkratky - + Action Činnost - + Shortcut Zkratka - + Import Zavést - + Export Vyvést - + Reset Selected Obnovit výchozí hodnotu u vybraného - + Reset All Obnovit výchozí hodnotu u všeho - + Keyboard Klávesnice @@ -1922,12 +2050,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - PreviewGenerator - + Could not open file - %1 Nepodařilo se otevřít soubor - %1 - + Could not find stream information - %1 Nepodařilo se najít údaje o proudu - %1 @@ -2030,91 +2158,105 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - ProxyDialog - + Create Proxy Vytvořit proxy - + Proxy Proxy - + Dimensions: Rozměry: - + Same Size as Source Stejná velikost jako zdroj - + Half Resolution (1/2) Poloviční rozlišení (1/2) - + Quarter Resolution (1/4) Čtvrtinové rozlišení (1/4) - + Eighth Resolution (1/8) Osminové rozlišení (1/8) - + Sixteenth Resolution (1/16) Šestnáctinové rozlišení (1/16) - + Format: Formát: - + ProRes HQ ProRes HQ - ProRes SQ - ProRes SQ + ProRes SQ - ProRes LT - ProRes LT + ProRes LT - DNxHD - DNxHD + DNxHD - H.264 - H.264 + H.264 - + Location: Umístění: - + Same as Source (in "%1" folder) Stejné jako zdroj (ve složce "%1") - + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + Custom Location Vlastní umístění + + ProxyGenerator + + + Finished generating proxy for "%1" + + + ReplaceClipMediaDialog @@ -2186,7 +2328,7 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Sequence - + %1 (copy) %1 (kopírovat) @@ -2250,110 +2392,140 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - SourcesCommon - + Import... Zavést... - + New Nový - + View Pohled - + Tree View Stromový pohled - + Icon View Pohled s ikonami - + Show Toolbar Ukázat nástrojový pruh - + Show Sequences Ukázat řady - + Replace/Relink Media Nahradit/Znovuspojit záznamy - + Reveal in Explorer Ukázat v průzkumníku - + Reveal in Finder Ukázat v hledači - + Reveal in File Manager Ukázat ve správci souborů - + Replace Clips Using This Media Nahradit záběry pomocí tohoto záznamu - + Create Sequence With This Media Vytvořit řadu pomocí tohoto záznamu - + Duplicate Zdvojit - + Delete All Clips Using This Media Smazat všechny záběry pomocí tohoto záznamu - + Proxy Proxy - + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + Create Proxy Vytvořit proxy - + + Modify Proxy + + + + + Restore Original + + + + Delete Smazat - + Properties... Vlastnosti... - + Replace Media Nahradit záznam - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? Upustil jste soubor na '%1'. Chcete jej nahradit upuštěným souborem? + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + SpeedDialog @@ -2518,47 +2690,47 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - TimecodeEffect - + Timecode Časový kód - + Sequence Řada - + Media Záznamy - + Scale Měřítko - + Color Barva - + Background Color Barva pozadí - + Background Opacity Neprůhlednost pozadí - + Offset Posun - + Prepend Uvést na začátku @@ -2566,157 +2738,155 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Timeline - + Timeline: Časová osa: - + <none> <žádná> - + Effect already exists Efekt již existuje - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? - + Add Přidat - + Replace Nahradit - + Skip Přeskočit - + Do this for all conflicts found Použít na všechny nalezené střety - Set Marker - Nastavit značku + Nastavit značku - Set marker name: - Nastavit název značky: + Nastavit název značky: - + Title... Název... - + Solid Color... Plná barva... - + Bars... Zkušební tabulka... - + Tone... Tón... - + Noise... Šum... - + Unsaved Project Neuložený projekt - + You must save this project before you can record audio in it. Musíte tento projekt uložit, předtím než do něj můžete nahrát zvuk. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Klepněte na časovou osu, kde chcete začít s nahráváním (táhněte pro omezení nahrávky na určitý časový snímek) - + Pointer Tool Nástroj ukazovátka - + Edit Tool Nástroj pro úpravy - + Ripple Tool Nástroj pro vložení a posunutí - + Razor Tool Nástroj břitvy - + Slip Tool Roztočení se ztotožněním - + Slide Tool Roztočení - + Hand Tool Nástroj ručičky - + Transition Tool Nástroj pro přechod - + Snapping Přichytávání - + Zoom In Přiblížit - + Zoom Out Oddálit - + Record audio Nahrát zvuk - + Add title, solid, bars, etc. Přidat název, plný, zkušební tabulky atd. @@ -2724,18 +2894,78 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - TimelineHeader - + Center Timecodes Vystředit časové kódy TimelineWidget + + + &Undo + &Zpět + + + + &Redo + + + + + C&ut + + + + + Cop&y + &Kopírovat + + + + &Paste + &Vložit + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + Link/Unlink Spojit/Oddělit + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + %1 @@ -2773,32 +3003,32 @@ Doba trvání: %4 Nepodařilo se najít obal záznamu pro tuto řadu. - + Title Název - + Solid Color Plná barva - + Bars Zkušební tabulka - + Tone Tón - + Noise Šum - + Duration: Doba trvání: @@ -2987,9 +3217,13 @@ Doba trvání: %4 Transition - Length: - Délka: + Délka: + + + + Length + @@ -3054,17 +3288,17 @@ Doba trvání: %4 Viewer - + Sequence Viewer Prohlížeč řady - + Media Viewer Prohlížeč záznamu - + (none) (žádný) @@ -3130,7 +3364,7 @@ Doba trvání: %4 ViewerWindow - + Exit Fullscreen Opustit celou obrazovku diff --git a/ts/olive_de.ts b/ts/olive_de.ts index 1169c278f..7871c19b4 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. Olive ist ein nicht-lineares Videoschnittprogramm. Diese Software ist frei und durch die GNU GPL geschützt. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. Das Olive Team ist dazu verpflichtet, die Nutzer darüber zu informieren, dass der Quellcode von der Webseite heruntergeladen werden kann. @@ -22,16 +22,29 @@ Nach Aktion suchen... + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio - + Audio Same as in english Audio - + Recording Aufnahme @@ -74,7 +87,7 @@ CollapsibleWidget - + <untitled> <unbenannt> @@ -128,22 +141,22 @@ DemoNotice - + Welcome to Olive! Willkommen in Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. Olive ist ein freies, offenes Videoschnittprogramm welches unter der GNU GPL lizensiert ist. Sofern Sie für diese Software bezahlt haben, wurden Sie betrogen. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 Diese Software ist aktuell in einem ALPHA-Stadium, was bedeutet, dass die Software instabil ist, abstürzen könnte, Fehler enthält und einige Funktionen fehlen. Wir leisten keine Garantie, die Benutzung der Software erfolgt auf eigenes Risiko. Bitte melden Sie Fehler oder Funktionswünsche auf %1 - + Thank you for trying Olive and we hope you enjoy it! Danke das Sie Olive ausprobieren, wir hoffen es gefällt Ihnen! @@ -151,41 +164,93 @@ Effect - + Invalid effect Ungültiger Effekt - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. The last sentence does not make real sense in german. I changed it to "a reinstallation is recommended" Kein Kandidat für Effekt '%1'. Dieser Effekt ist möglicherweise beschädigt. Eine Neuinstallation wird empfohlen. - + Cu&t &Ausschneiden - + &Copy &Kopieren - + Move &Up Nach &oben - + Move &Down Nach &unten - + D&elete L&öschen + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + EffectControls @@ -195,42 +260,42 @@ Effekte: - + &Paste &Einfügen - + Add Video Effect Video-Effekt hinzufügen - + VIDEO EFFECTS VIDEO-EFFEKTE - + Add Video Transition Video-Übergang hinzufügen - + Add Audio Effect Audio-Effekt hinzufügen - + AUDIO EFFECTS AUDIO-EFFEKTE - + Add Audio Transition Audio-Übergang hinzufügen - + (Multiple clips selected) (mehrere Clips ausgewählt) @@ -238,12 +303,12 @@ EffectRow - + Disable Keyframes Keyframes deaktivieren - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? Ein Deaktivieren von Keyframes löscht alle aktuellen Keyframes. Sind Sie sicher? @@ -251,7 +316,7 @@ EmbeddedFileChooser - + File: Datei: @@ -259,78 +324,99 @@ ExportDialog - + Export "%1" Exportieren von "%1" - + + Unknown codec name %1 + + + + Export Failed Exportieren fehlgeschlagen - + Export failed - %1 Exportieren fehlgeschlagen - %1 - + Invalid dimensions Ungültige Dimensionen - + Export width and height must both be even numbers/divisible by 2. Breite und Höhe müssen Zahlen sein, die durch 2 teilbar sind. - + Invalid codec Ungültiger Codec - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. Ausgabe-Parameter für den ausgewählten Codec konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. - + Invalid format Ungültiges Format - + Couldn't determine output format. This is a bug, please contact the developers. Ausgabe-Format konnte nicht erkannt werden. Dies ist ein Fehler, bitte kontaktieren Sie den Entwickler. - + Export Media In german it would be not good to add media to the title Exportieren - + Quality-based (Constant Rate Factor) Qualität (Constant Rate Factor) - + Constant Bitrate Konstante Bitrate + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): Bitrate (Mbps): - + Quality (CRF): Qualität (CRF): - + Quality Factor: 0 = lossless @@ -345,71 +431,76 @@ 51 = kleinstmögliche Qualität - + Target File Size (MB): Ziel-Dateigröße (MB): - + Format: Same as in english Format: - + Range: Bereich: - + Entire Sequence Komplette Sequenz - + In to Out In to Out - + Video Same as in english Video - - + + Codec: Same as in english Codec: - + Width: Breite: - + Height: Höhe: - + Frame Rate: Bildfrequenz: - + Compression Type: Komprimierungsverfahren: - + + Advanced + + + + Sampling Rate: Abtastrate: - + Bitrate (Kbps/CBR): Same as in english Bitrate (Kbps/CBR): @@ -418,87 +509,87 @@ ExportThread - + failed to send frame to encoder (%1) Fehler beim Senden des Frames zum Encoder (%1) - + failed to receive packet from encoder (%1) Fehler beim Empfangen des Pakets vom Encoder (%1) - + could not video encoder for %1 Video-Encoder für %1 konnte nicht gefunden werden - + could not allocate video stream Videostream konnte nicht zugewiesen werden - + could not allocate video encoding context - + could not open output video encoder (%1) Video-Encoder konnte nicht geöffnet werden (%1) - + could not copy video encoder parameters to output stream (%1) Video-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) - + could not audio encoder for %1 Audio-Encoder für %1 konnte nicht gefunden werden - + could not allocate audio stream Audiostream konnte nicht zugewiesen werden - + could not allocate audio encoding context Audio-Encoding-Kontext konnte nicht zugewiesen werden - + could not open output audio encoder (%1) Audio-Encoder konnte nicht geöffnet werden (%1) - + could not copy audio encoder parameters to output stream (%1) Audio-Encoder-Parameter konnten nicht in den Ausgabe-Stream kopiert werden (%1) - + could not allocate audio buffer (%1) Audio-Buffer konnte nicht zugewiesen werden (%1) - + could not create output format context Ausgabe-Format-Kontext konnte nicht erstellt werden - + could not open output file (%1) Ausgabe konnte nicht geöffnet werden (%1) - + could not write output file header (%1) Ausgabe-Datei-Header konnte nicht geschrieben werden (%1) - + could not write output file trailer (%1) Ausgabe-Datei-Trailer konnte nicht geschrieben werden (%1) @@ -552,19 +643,19 @@ Grafischer Editor - + Linear Same as in english Linear - + Bezier Same as in english Bezier - + Hold Does this make sense? (is a handle button meant?) Halten @@ -614,7 +705,7 @@ KeyframeNavigator - + Enable Keyframes Keyframes aktivieren @@ -622,19 +713,19 @@ KeyframeView - + Linear Same as in english Linear - + Bezier Same as in english Bezier - + Hold Does this make sense? Halten @@ -643,14 +734,14 @@ LabelSlider - - + + Set Value Wert ändern - - + + New value: Neuer Wert: @@ -663,12 +754,12 @@ Lädt... - + Loading '%1'... Lädt '%1'... - + Cancel Abbrechen @@ -676,54 +767,54 @@ LoadThread - + Version Mismatch Unterschiedliche Versionen - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatibel. Wollen Sie trotzdem versuchen, es zu laden? - + Invalid Clip Link Ungültiger Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? Sounds better in German but has same sense Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es dennoch versuchen? - + %1 - Line: %2 Col: %3 %1 - Zeile: %2 Spalte: %3 - + User aborted loading Ladevorgang durch Nutzer abgebrochen - + XML Parsing Error Does not make sense to translate this XML Parsing Error - + Couldn't load '%1'. %2 '%1' konnte nicht geladen werden. (%2) - + Project Load Error Projektladefehler - + Error loading project: %1 Fehler beim Laden des Projektes: %1 @@ -731,736 +822,780 @@ MainWindow - + Auto-recovery Auto-Wiederherstellung - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? - + &Project &Projekt - + &Sequence &Sequenz - + &Folder &Ordner - + Set In Point Also for following translations: Not sure if sense is matched Anfangspunkt festlegen - + Set Out Point Endpunkt festlegen - Enable/Disable In/Out Point - Anfangs-/Endpunkt aktivieren/deaktiviern + Anfangs-/Endpunkt aktivieren/deaktiviern - + + Welcome to %1 + + + + Reset In Point Anfangspunkt zurücksetzen - + Reset Out Point Endpunkt zurücksetzen - + Clear In/Out Point Anfangs-/Endpunkt löschen - + No active sequence Keine aktive Sequenz - + Please open the sequence you wish to export. Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. - + Save Project As... Projekt speichern als... - + Unsaved Project Ungespeichertes Projekt - + This project has changed since it was last saved. Would you like to save it before closing? Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? - + &File &Datei - + &New &Neu - + &Open Project Projekt &öffnen - + Clear Recent List 'Zuletzt geöffnet' leeren - + Open Recent Zuletzt Verwendete öffnen - + &Save Project &Projekt speichern - + Save Project &As Projekt speichern &als... - + &Import... &Importieren... - + &Export... &Exportieren - + E&xit B&eenden - + &Edit &Bearbeiten - + &Undo &Rückgängig - + Redo Wiederholen - + Cu&t &Ausschneiden - + Cop&y &Kopieren - + &Paste &Einfügen - + Paste Insert - + Duplicate Duplizieren - + Delete Löschen - + Ripple Delete In Premiere's translations its also called "Ripple Delete" Ripple Delete - + Split Teilen - + Select &All Alles &auswählen - + Deselect All Auswahl aufheben - + Add Default Transition Standardübergang einfügen - + Link/Unlink Verbinden/Trennen - + Enable/Disable Einblenden/Ausblenden - + Nest Schachteln - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker Marker setzen/bearbeiten - + &View &Ansicht - + Zoom In Hereinzoomen - + Zoom Out Herauszoomen - + Increase Track Height Spurhöhe erhöhen - + Decrease Track Height Spurhöhe verringern - + Toggle Show All - + Track Lines Spurlinien - + Rectified Waveforms Nachgebesserte Waveforms - + Frames Bilder/Frames - + Drop Frame Same word used in German Drop Frame - + Non-Drop Frame Same word used in German Non-Drop Frame - + Milliseconds Millisekunden - + Title/Action Safe Area Sicherer Titelbereich - + Off Aus - + Default Standard - + 4:3 4:3 - + 16:9 16:9 - + Custom Benutzerdefiniert - + Full Screen Vollbild - + + Full Screen Viewer + + + + &Playback Should we translate this? Playback is also known &Wiedergabe - + Go to Start Zum Start gehen - + Previous Frame Vorheriger Frame - + Play/Pause Does not make sense to translate Play/Pause - + Play In to Out Von Anfang bis Ende wiedergeben - + Next Frame Nächster Frame - + Go to End Zum Ende springen - + Go to Previous Cut Zum vorherigen Schnitt springen - + Go to Next Cut Zum nächsten Schnitt springen - + Go to In Point Zum Anfangspunkt springen - + Go to Out Point Zum Endpunkt springen - + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + Decrease Speed - Geschwindigkeit verringern + Geschwindigkeit verringern - Pause Same as in english - Pause + Pause - Increase Speed - Geschwindigkeit erhöhen + Geschwindigkeit erhöhen - + Loop Schleife - + &Window &Fenster - + Project Projekt - + Effect Controls Effektsteuerung - + Timeline Same as in english Timeline - + Graph Editor Grafischer Editor - + Media Viewer Does this make sense to translate? Media Viewer - + Sequence Viewer Does this make sense to translate? Sequence Viewer - + + Maximize Panel + + + + Reset to Default Layout Zum Standard-Layout zurücksetzen - + &Tools &Werkzeuge - + Pointer Tool Does this make sense? Zeiger - + Edit Tool Bearbeitungs-Werkzeug - + Ripple Tool Same as 'Ripple Delete' Ripple-Werkzeug - + Razor Tool Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool Hand-Werkzeug - + Transition Tool Übergangs-Werkzeug - + Enable Snapping Snapping aktivieren - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms Could be better Scrollrad zoomt - + Enable Drag Files to Timeline Dateien auf Timeline ziehen aktivieren - + Auto-Scale By Default Skaliere automatisch - + Enable Seek to Import - + Audio Scrubbing Same as in english Audio Scrubbing - + Enable Drop on Media to Replace Auf Medien zum Ersetzen ziehen aktivieren - + Enable Hover Focus - + Ask For Name When Setting Marker Nach Namen fragen, wenn Marker gesetzt wird - + No Auto-Scroll Kein Auto-Scroll - + Page Auto-Scroll Seiten Auto-Scroll - + Smooth Auto-Scroll Weiches Auto-Scroll - + Preferences Einstellungen - + Clear Undo Rückgängig-Historie leeren - + &Help &Hilfe - + A&ction Search &Aktionensuche - + Debug Log Same as in english Debug-Log - + &About... &Über... - + <untitled> <unbenannt> - + Open Project... Projekt öffnen... - + Missing recent project Zuletzt geöffnetes Projekt existiert nicht - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? - + Invalid aspect ratio Ungültiges Seitenverhältnis - + The aspect ratio '%1' is invalid. Please try again. Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. - + Enter custom aspect ratio Benutzerdefiniertes Seitenverhältnis eingeben - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): - + Nested Sequence Geschachtelte Sequenz + + Marker + + + Set Marker + Marker setzen + + + + Set clip marker name: + + + + + Set sequence marker name: + + + Media - + New Folder Neuer Ordner: - + Name: Name: - + Filename: Dateiname: - + Video Dimensions: Video-Dimensionen: - + Frame Rate: Bildrate: - + %1 fields (%2 frames) %1 Felder (%2 frames) - + Interlacing: Same as in english Interlacing: - + Audio Frequency: Audiofrequenz: - + Audio Channels: Audiokanäle: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1473,17 +1608,17 @@ Audiofrequenz: %5 Audio Layout: %6 - + Name Name - + Duration Dauer - + Rate Same as in english, differently spoken, but same meaning Rate @@ -1497,12 +1632,12 @@ Audio Layout: %6 "%1" Eigenschaften - + Tracks: Spuren: - + Video %1: %2x%3 %4FPS Same as in english Video %1: %2x%3 %4FPS @@ -1513,29 +1648,29 @@ Audio Layout: %6 Audio %1: %2Hz %3 Kanäle - + Conform to Frame Rate: Entspricht Bildrate: - + Alpha is Premultiplied Alpha ist vormultipliziert - + Auto (%1) Same? Auto (%1) - + Interlacing: Same as in english Interlacing: - + Name: Same as in english Name: @@ -1544,12 +1679,12 @@ Audio Layout: %6 NewSequenceDialog - + Editing "%1" Bearbeitung von "%1" - + New Sequence Neue Sequenz @@ -1667,6 +1802,11 @@ Audio Layout: %6 Sample Rate: Abtastrate: + + + Name: + Name: + PanEffect @@ -1676,230 +1816,279 @@ Audio Layout: %6 Schwenken + + Playback + + + Generating Proxy: %1% + + + PreferencesDialog - + Preferences Einstellungen - + Invalid CSS File Ungültige CSS Datei - + CSS file '%1' does not exist. CSS Datei '%1' existiert nicht. - + Warning Achtung - + Some changed settings will require restarting Olive to take effect Einige Änderungen erfordern einen Neustart von Olive, um angwendet zu werden - + Confirm Reset All Shortcuts Bestätige das Zurücksetzen aller Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? - + Import Keyboard Shortcuts Tastatur-Shortcuts importieren - - + + Error saving shortcuts Fehler beim Speichern der Shortcuts - + Failed to open file for reading Fehler beim öffnen der Datei - + Export Keyboard Shortcuts Tastatur-Shortcuts exportieren - + Export Shortcuts Shortcuts exportieren - + Shortcuts exported successfully Shortcuts wurden erfolgreich exportiert - + Failed to open file for writing Fehler beim Schreiben der Datei - + Browse for CSS file Nach CSS Datei suchen - + + Language: + + + + Custom CSS: Benutzerdefiniertes CSS: - + Browse Durchsuchen - + Image sequence formats: Bilddateiformate: - + Audio Recording: Audioaufnahmen: - + Mono Same as in english Mono - + Stereo Same as in english Stereo - + Effect Textbox Lines: Effekt Textbox-Linien: - + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + Use Software Fallbacks When Possible Absicherung durch Software-Defaults - + General Allgemein - + Behavior Verhalten - + Disable Multithreading on Images Multithreading auf Bildern deaktiviern - + Seeking Suche - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Genaue Suche Zeigt immer den richtigen Frame (kann optisch kurzzeitig anhalten, wenn Frame abgefragt wird) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Schnelle Suche Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Plaback aus) - + Memory Usage Speicherauslastung - + Upcoming Frame Queue: Anstehende Frame-Warteschlange: - - + + frames Could also use 'Bilder' Frames - - + + seconds Sekunden - + Previous Frame Queue: Vorherige Frame-Warteschlange: - + Playback Wiedergabe - + + Output Device: + + + + + + Default + Standard + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + Audio + + + Search for action or shortcut Nach Eintrag oder Shortcut suchen - + Action Eintrag - + Shortcut Shortcut - + Import Importieren - + Export Exportieren - + Reset Selected Ausgewählte zurücksetzen - + Reset All Alle zurücksetzen - + Keyboard Tastatur @@ -1907,12 +2096,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf PreviewGenerator - + Could not open file - %1 Konnte Datei nicht öffnen - %1 - + Could not find stream information - %1 Konnte Stream-Informationen nicht finden - %1 @@ -1920,93 +2109,184 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Project - + + Search media, markers, etc. + + + + Project Projekt - + Sequence Sequenz - + Replace '%1' Ersetze '%1' - - + + All Files Alle Dateien - - + + No active sequence Keine aktive Sequenz - + No sequence is active, please open the sequence you want to replace clips from. Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips ersetzen möchten. - + Active sequence selected Aktive Sequenz ausgewählt - + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. Sequenz kann nicht sich selbst zugewiesen werden, da es keine Medien enthalten würde. - + Rename '%1' '%1' umbenennen - + Enter new name: Neuen Namen eingeben: - + Delete media in use? Verwendete Datei löschen? - + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? Die Datei '%1' wird aktuell in '%2' benutzt. Wenn Sie sie löschen, werden alle Instanzen in der Sequenz entfernt. Sind Sie sicher? - + Skip Überspringen - + Image sequence detected Bildsequenz erkannt - + The file '%1' appears to be part of an image sequence. Would you like to import it as such? Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? - + Import media... Medien importieren... - + No sequence is active, please open the sequence you want to delete clips from. Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + Format: + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + ReplaceClipMediaDialog @@ -2035,42 +2315,42 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Abbrechen - + No media selected Keine Medien ausgewählt - + Please select a media to replace with or click 'Cancel'. Bitten wählen Sie Medien zum Ersetzen aus oder klicken Sie auf 'Abbrechen'. - + Same media selected Identische Medien ausgewählt - + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. Sie haben die gleichen Medien ausgewählt, die Sie ersetzen möchten. Bitte wählen Sie andere Medien oder klicken Sie auf 'Abbrechen'. - + Folder selected Ordner ausgewählt - + You cannot replace footage with a folder. Sie können Footage nicht mit einem Ordner austauschen. - + Active sequence selected Aktive Sequenz ausgewählt - + You cannot insert a sequence into itself. Sie können keine Sequenz in die selbe einsetzen. @@ -2078,7 +2358,7 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Sequence - + %1 (copy) %1 (kopieren) @@ -2144,102 +2424,142 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf SourcesCommon - + Import... Importieren... - + New Neu - + View Ansicht - + Tree View A translation would be not recommended due to misunderstanding Tree View - + Icon View A translation would be not recommended due to misunderstanding Icon View - + Show Toolbar Toolbar anzeigen - + Show Sequences Sequenzen anzeigen - + Replace/Relink Media Medien ersetzen/neu verbinden - + Reveal in Explorer Im Explorer anzeigen - + Reveal in Finder Im Finder anzeigen - + Reveal in File Manager Im File Manager anzeigen - + Replace Clips Using This Media Ersetze Clips die diese Medien benutzen - + Create Sequence With This Media Sequenz mit diesen Medien erstellen - + Duplicate Duplizieren - + Delete All Clips Using This Media Alle Clips, die diese Medien enthalten löschen - + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + Delete Löschen - + Properties... Eigenschaften... - + Replace Media Medien ersetzen - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? Sie haben eine Datei auf '%1' gezogen. Möchten Sie diese ersetzen? + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + SpeedDialog @@ -2249,32 +2569,32 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Geschwindigkeit/Dauer - + Speed: Geschwindigkeit: - + Frame Rate: Bildrate: - + Duration: Dauer: - + Reverse Rückwärts - + Maintain Audio Pitch Tonhöhe erhalten - + Ripple Changes Ripple-Änderungen @@ -2405,47 +2725,47 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf TimecodeEffect - + Timecode Zeitstempel - + Sequence Sequenz - + Media Medien - + Scale Skalierung - + Color Farbe - + Background Color Hintergrundfarbe - + Background Opacity Hintergrunddeckkraft - + Offset Versatz - + Prepend Voreinstellung @@ -2453,159 +2773,157 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Timeline - + Timeline: Makes no sense to translate Timeline: - + <none> <keine> - + Effect already exists Effekt existiert bereits - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Der Clip '%1' enthält bereits den Effekt '%2'. Möchten Sie diesen ersetzen oder ihn als separaten Effekt hinzufügen? - + Add Hinzufügen - + Replace Ersetzen - + Skip Überspringen - + Do this for all conflicts found Auf alle gefundenen Konflikte anwenden - Set Marker - Marker setzen + Marker setzen - Set marker name: - Marker-Name setzen: + Marker-Name setzen: - + Title... Titel... - + Solid Color... Solid... - + Bars... Balken... - + Tone... Ton... - + Noise... Rauschen... - + Unsaved Project Ungespeichertes Projekt - + You must save this project before you can record audio in it. Sie müssen das Projekt speichern, bevor Sie Audio aufnehmen können. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Klicken Sie auf die Timeline, an welcher Stelle Sie mit der Aufnahme beginnen möchten (Ziehen, um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) - + Pointer Tool Pointer-Werkzeug - + Edit Tool Bearbeitungs-Werkzeug - + Ripple Tool Ripple-Werkzeug - + Razor Tool Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool Hand-Werkzeug - + Transition Tool Übergangs-Werkzeug - + Snapping Same as in english Snapping - + Zoom In Hereinzommen - + Zoom Out Herauszoomen - + Record audio Audio aufnehmen - + Add title, solid, bars, etc. Titel, Solid, Balken, etc. Hinzufügen @@ -2613,18 +2931,78 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf TimelineHeader - + Center Timecodes Timecodes zentrieren TimelineWidget + + + &Undo + &Rückgängig + + + + &Redo + + + + + C&ut + + + + + Cop&y + &Kopieren + + + + &Paste + &Einfügen + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + Link/Unlink Verbinden/Trennen + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + %1 @@ -2662,32 +3040,32 @@ Dauer: %4 Konnte den Medienwrapper für diese Sequenz nicht finden. - + Title Titel - + Solid Color Solid - + Bars Balken - + Tone Ton - + Noise Rauschen - + Duration: Dauer: @@ -2884,9 +3262,13 @@ Dauer: %4 Transition - Length: - Länge: + Länge: + + + + Length + @@ -2953,17 +3335,17 @@ Dauer: %4 Viewer - + Sequence Viewer Sequenz-Viewer - + Media Viewer Medien-Viewer - + (none) (keine) @@ -2971,59 +3353,59 @@ Dauer: %4 ViewerWidget - + Save Frame as Image... Frame als Bild speichern... - + Show Fullscreen Vollbildschirm - + Disable Ausblenden - + Screen %1: %2x%3 Screen %1:%2x%3 - + Zoom Same as in english Zoom - + Fit Einpassen - + Custom Benutzerdefiniert - + Close Media Medien schließen - + Save Frame Frame speichern - + Viewer Zoom Makes no sense to translate Viewer Zoom - + Set Custom Zoom Value: Benutzerdefinierten Zoomwert angeben @@ -3031,7 +3413,7 @@ Dauer: %4 ViewerWindow - + Exit Fullscreen Vollbild verlassen diff --git a/ts/olive_es.ts b/ts/olive_es.ts index ad2126531..031edc457 100644 --- a/ts/olive_es.ts +++ b/ts/olive_es.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. @@ -22,15 +22,28 @@ + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio - + Audio - + Recording @@ -69,7 +82,7 @@ CollapsibleWidget - + <untitled> @@ -122,22 +135,22 @@ DemoNotice - + Welcome to Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Thank you for trying Olive and we hope you enjoy it! @@ -145,40 +158,92 @@ Effect - + Invalid effect - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Cu&t - + &Copy - + Move &Up - + Move &Down - + D&elete + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + EffectControls @@ -188,42 +253,42 @@ - + &Paste - + Add Video Effect - + VIDEO EFFECTS - + Add Video Transition - + Add Audio Effect - + AUDIO EFFECTS - + Add Audio Transition - + (Multiple clips selected) @@ -231,12 +296,12 @@ EffectRow - + Disable Keyframes - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? @@ -244,7 +309,7 @@ EmbeddedFileChooser - + File: @@ -252,77 +317,98 @@ ExportDialog - + Export "%1" - + + Unknown codec name %1 + + + + Export Failed - + Export failed - %1 - + Invalid dimensions - + Export width and height must both be even numbers/divisible by 2. - + Invalid codec - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Invalid format - + Couldn't determine output format. This is a bug, please contact the developers. - + Export Media - + Quality-based (Constant Rate Factor) - + Constant Bitrate + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): - + Quality (CRF): - + Quality Factor: 0 = lossless @@ -332,68 +418,73 @@ - + Target File Size (MB): - + Format: - + Range: - + Entire Sequence - + In to Out - + Video - - + + Codec: - + Width: - + Height: - + Frame Rate: - + Compression Type: - + + Advanced + + + + Sampling Rate: - + Bitrate (Kbps/CBR): @@ -401,87 +492,87 @@ ExportThread - + failed to send frame to encoder (%1) - + failed to receive packet from encoder (%1) - + could not video encoder for %1 - + could not allocate video stream - + could not allocate video encoding context - + could not open output video encoder (%1) - + could not copy video encoder parameters to output stream (%1) - + could not audio encoder for %1 - + could not allocate audio stream - + could not allocate audio encoding context - + could not open output audio encoder (%1) - + could not copy audio encoder parameters to output stream (%1) - + could not allocate audio buffer (%1) - + could not create output format context - + could not open output file (%1) - + could not write output file header (%1) - + could not write output file trailer (%1) @@ -535,17 +626,17 @@ - + Linear - + Bezier - + Hold @@ -594,7 +685,7 @@ KeyframeNavigator - + Enable Keyframes @@ -602,17 +693,17 @@ KeyframeView - + Linear - + Bezier - + Hold @@ -620,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -640,12 +731,12 @@ - + Loading '%1'... - + Cancel @@ -653,52 +744,52 @@ LoadThread - + Version Mismatch - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -706,720 +797,748 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - - Enable/Disable In/Out Point + + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - - &Playback - - - - - Go to Start - - - - - Previous Frame - - - - - Play/Pause - - - - - Play In to Out - - - - - Next Frame - - - - - Go to End - - - - - Go to Previous Cut - - - - - Go to Next Cut - - - - - Go to In Point - - - - - Go to Out Point - - - - - Decrease Speed - - - - - Pause - - - - - Increase Speed - - - - - Loop + + Full Screen Viewer - &Window + &Playback - Project + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame - Effect Controls + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut - Timeline + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop - Graph Editor + Shuttle Right - - Media Viewer + + Loop + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + Sequence Viewer - - Reset to Default Layout - - - - - &Tools - - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool + + Maximize Panel - Slide Tool + Reset to Default Layout - - Hand Tool + + &Tools - - Transition Tool + + Pointer Tool + + + + + Edit Tool - Enable Snapping + Ripple Tool - - Selecting Also Seeks + + Razor Tool - - Edit Tool Also Seeks + + Slip Tool - - Edit Tool Selects Links + + Slide Tool - - Seek Also Selects + + Hand Tool - - Seek to the End of Pastes + + Transition Tool + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + Media - + New Folder - + Name: - + Filename: - + Video Dimensions: - + Frame Rate: - + %1 fields (%2 frames) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1428,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1451,12 +1570,12 @@ Audio Layout: %6 - + Tracks: - + Video %1: %2x%3 %4FPS @@ -1466,27 +1585,27 @@ Audio Layout: %6 - + Conform to Frame Rate: - + Alpha is Premultiplied - + Auto (%1) - + Interlacing: - + Name: @@ -1494,12 +1613,12 @@ Audio Layout: %6 NewSequenceDialog - + Editing "%1" - + New Sequence @@ -1613,6 +1732,11 @@ Audio Layout: %6 Sample Rate: + + + Name: + + PanEffect @@ -1622,225 +1746,274 @@ Audio Layout: %6 + + Playback + + + Generating Proxy: %1% + + + PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file - + + Language: + + + + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + Use Software Fallbacks When Possible - + General - + Behavior - + Disable Multithreading on Images - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + + + + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -1848,12 +2021,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -1861,93 +2034,184 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + + Search media, markers, etc. + + + + Project - + Sequence - + Replace '%1' - - + + All Files - - + + No active sequence - + No sequence is active, please open the sequence you want to replace clips from. - + Active sequence selected - + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Rename '%1' - + Enter new name: - + Delete media in use? - + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Skip - + Image sequence detected - + The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + ReplaceClipMediaDialog @@ -1976,42 +2240,42 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + No media selected - + Please select a media to replace with or click 'Cancel'. - + Same media selected - + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Folder selected - + You cannot replace footage with a folder. - + Active sequence selected - + You cannot insert a sequence into itself. @@ -2019,7 +2283,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Sequence - + %1 (copy) @@ -2083,100 +2347,140 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SourcesCommon - + Import... - + New - + View - + Tree View - + Icon View - + Show Toolbar - + Show Sequences - + Replace/Relink Media - + Reveal in Explorer - + Reveal in Finder - + Reveal in File Manager - + Replace Clips Using This Media - + Create Sequence With This Media - + Duplicate - + Delete All Clips Using This Media - + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + Delete - + Properties... - + Replace Media - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + SpeedDialog @@ -2186,32 +2490,32 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Speed: - + Frame Rate: - + Duration: - + Reverse - + Maintain Audio Pitch - + Ripple Changes @@ -2341,47 +2645,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimecodeEffect - + Timecode - + Sequence - + Media - + Scale - + Color - + Background Color - + Background Opacity - + Offset - + Prepend @@ -2389,157 +2693,147 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: - + <none> - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - - Set Marker - - - - - Set marker name: - - - - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -2547,18 +2841,78 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes TimelineWidget + + + &Undo + + + + + &Redo + + + + + C&ut + + + + + Cop&y + + + + + &Paste + + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + Link/Unlink + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + %1 @@ -2593,32 +2947,32 @@ Duration: %4 - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: @@ -2808,7 +3162,7 @@ Duration: %4 Transition - Length: + Length @@ -2874,17 +3228,17 @@ Duration: %4 Viewer - + Sequence Viewer - + Media Viewer - + (none) @@ -2892,57 +3246,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -2950,7 +3304,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts index f0440adf2..d16ab6ea6 100644 --- a/ts/olive_fr.ts +++ b/ts/olive_fr.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. @@ -22,15 +22,28 @@ + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio - + Audio - + Recording @@ -69,7 +82,7 @@ CollapsibleWidget - + <untitled> @@ -122,22 +135,22 @@ DemoNotice - + Welcome to Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Thank you for trying Olive and we hope you enjoy it! @@ -145,40 +158,92 @@ Effect - + Invalid effect - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Cu&t - + &Copy - + Move &Up - + Move &Down - + D&elete + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + EffectControls @@ -188,42 +253,42 @@ - + &Paste - + Add Video Effect - + VIDEO EFFECTS - + Add Video Transition - + Add Audio Effect - + AUDIO EFFECTS - + Add Audio Transition - + (Multiple clips selected) @@ -231,12 +296,12 @@ EffectRow - + Disable Keyframes - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? @@ -244,7 +309,7 @@ EmbeddedFileChooser - + File: @@ -252,77 +317,98 @@ ExportDialog - + Export "%1" - + + Unknown codec name %1 + + + + Export Failed - + Export failed - %1 - + Invalid dimensions - + Export width and height must both be even numbers/divisible by 2. - + Invalid codec - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Invalid format - + Couldn't determine output format. This is a bug, please contact the developers. - + Export Media - + Quality-based (Constant Rate Factor) - + Constant Bitrate + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): - + Quality (CRF): - + Quality Factor: 0 = lossless @@ -332,68 +418,73 @@ - + Target File Size (MB): - + Format: - + Range: - + Entire Sequence - + In to Out - + Video - - + + Codec: - + Width: - + Height: - + Frame Rate: - + Compression Type: - + + Advanced + + + + Sampling Rate: - + Bitrate (Kbps/CBR): @@ -401,87 +492,87 @@ ExportThread - + failed to send frame to encoder (%1) - + failed to receive packet from encoder (%1) - + could not video encoder for %1 - + could not allocate video stream - + could not allocate video encoding context - + could not open output video encoder (%1) - + could not copy video encoder parameters to output stream (%1) - + could not audio encoder for %1 - + could not allocate audio stream - + could not allocate audio encoding context - + could not open output audio encoder (%1) - + could not copy audio encoder parameters to output stream (%1) - + could not allocate audio buffer (%1) - + could not create output format context - + could not open output file (%1) - + could not write output file header (%1) - + could not write output file trailer (%1) @@ -535,17 +626,17 @@ - + Linear - + Bezier - + Hold @@ -594,7 +685,7 @@ KeyframeNavigator - + Enable Keyframes @@ -602,17 +693,17 @@ KeyframeView - + Linear - + Bezier - + Hold @@ -620,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -640,12 +731,12 @@ - + Loading '%1'... - + Cancel @@ -653,52 +744,52 @@ LoadThread - + Version Mismatch - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -706,720 +797,748 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - - Enable/Disable In/Out Point + + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - - &Playback - - - - - Go to Start - - - - - Previous Frame - - - - - Play/Pause - - - - - Play In to Out - - - - - Next Frame - - - - - Go to End - - - - - Go to Previous Cut - - - - - Go to Next Cut - - - - - Go to In Point - - - - - Go to Out Point - - - - - Decrease Speed - - - - - Pause - - - - - Increase Speed - - - - - Loop + + Full Screen Viewer - &Window + &Playback - Project + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame - Effect Controls + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut - Timeline + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop - Graph Editor + Shuttle Right - - Media Viewer + + Loop + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + Sequence Viewer - - Reset to Default Layout - - - - - &Tools - - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool + + Maximize Panel - Slide Tool + Reset to Default Layout - - Hand Tool + + &Tools - - Transition Tool + + Pointer Tool + + + + + Edit Tool - Enable Snapping + Ripple Tool - - Selecting Also Seeks + + Razor Tool - - Edit Tool Also Seeks + + Slip Tool - - Edit Tool Selects Links + + Slide Tool - - Seek Also Selects + + Hand Tool - - Seek to the End of Pastes + + Transition Tool + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + Media - + New Folder - + Name: - + Filename: - + Video Dimensions: - + Frame Rate: - + %1 fields (%2 frames) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1428,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1451,12 +1570,12 @@ Audio Layout: %6 - + Tracks: - + Video %1: %2x%3 %4FPS @@ -1466,27 +1585,27 @@ Audio Layout: %6 - + Conform to Frame Rate: - + Alpha is Premultiplied - + Auto (%1) - + Interlacing: - + Name: @@ -1494,12 +1613,12 @@ Audio Layout: %6 NewSequenceDialog - + Editing "%1" - + New Sequence @@ -1613,6 +1732,11 @@ Audio Layout: %6 Sample Rate: + + + Name: + + PanEffect @@ -1622,225 +1746,274 @@ Audio Layout: %6 + + Playback + + + Generating Proxy: %1% + + + PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file - + + Language: + + + + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + Use Software Fallbacks When Possible - + General - + Behavior - + Disable Multithreading on Images - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + + + + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -1848,12 +2021,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -1861,93 +2034,184 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + + Search media, markers, etc. + + + + Project - + Sequence - + Replace '%1' - - + + All Files - - + + No active sequence - + No sequence is active, please open the sequence you want to replace clips from. - + Active sequence selected - + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Rename '%1' - + Enter new name: - + Delete media in use? - + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Skip - + Image sequence detected - + The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + ReplaceClipMediaDialog @@ -1976,42 +2240,42 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + No media selected - + Please select a media to replace with or click 'Cancel'. - + Same media selected - + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Folder selected - + You cannot replace footage with a folder. - + Active sequence selected - + You cannot insert a sequence into itself. @@ -2019,7 +2283,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Sequence - + %1 (copy) @@ -2083,100 +2347,140 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SourcesCommon - + Import... - + New - + View - + Tree View - + Icon View - + Show Toolbar - + Show Sequences - + Replace/Relink Media - + Reveal in Explorer - + Reveal in Finder - + Reveal in File Manager - + Replace Clips Using This Media - + Create Sequence With This Media - + Duplicate - + Delete All Clips Using This Media - + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + Delete - + Properties... - + Replace Media - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + SpeedDialog @@ -2186,32 +2490,32 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Speed: - + Frame Rate: - + Duration: - + Reverse - + Maintain Audio Pitch - + Ripple Changes @@ -2341,47 +2645,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimecodeEffect - + Timecode - + Sequence - + Media - + Scale - + Color - + Background Color - + Background Opacity - + Offset - + Prepend @@ -2389,157 +2693,147 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: - + <none> - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - - Set Marker - - - - - Set marker name: - - - - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -2547,18 +2841,78 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes TimelineWidget + + + &Undo + + + + + &Redo + + + + + C&ut + + + + + Cop&y + + + + + &Paste + + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + Link/Unlink + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + %1 @@ -2593,32 +2947,32 @@ Duration: %4 - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: @@ -2808,7 +3162,7 @@ Duration: %4 Transition - Length: + Length @@ -2874,17 +3228,17 @@ Duration: %4 Viewer - + Sequence Viewer - + Media Viewer - + (none) @@ -2892,57 +3246,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -2950,7 +3304,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_it.ts b/ts/olive_it.ts index da1d9e8bb..214618149 100644 --- a/ts/olive_it.ts +++ b/ts/olive_it.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. @@ -22,15 +22,28 @@ + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio - + Audio - + Recording @@ -69,7 +82,7 @@ CollapsibleWidget - + <untitled> @@ -122,22 +135,22 @@ DemoNotice - + Welcome to Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Thank you for trying Olive and we hope you enjoy it! @@ -145,40 +158,92 @@ Effect - + Invalid effect - + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Cu&t - + &Copy - + Move &Up - + Move &Down - + D&elete + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + EffectControls @@ -188,42 +253,42 @@ - + &Paste - + Add Video Effect - + VIDEO EFFECTS - + Add Video Transition - + Add Audio Effect - + AUDIO EFFECTS - + Add Audio Transition - + (Multiple clips selected) @@ -231,12 +296,12 @@ EffectRow - + Disable Keyframes - + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? @@ -244,7 +309,7 @@ EmbeddedFileChooser - + File: @@ -252,77 +317,98 @@ ExportDialog - + Export "%1" - + + Unknown codec name %1 + + + + Export Failed - + Export failed - %1 - + Invalid dimensions - + Export width and height must both be even numbers/divisible by 2. - + Invalid codec - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Invalid format - + Couldn't determine output format. This is a bug, please contact the developers. - + Export Media - + Quality-based (Constant Rate Factor) - + Constant Bitrate + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): - + Quality (CRF): - + Quality Factor: 0 = lossless @@ -332,68 +418,73 @@ - + Target File Size (MB): - + Format: - + Range: - + Entire Sequence - + In to Out - + Video - - + + Codec: - + Width: - + Height: - + Frame Rate: - + Compression Type: - + + Advanced + + + + Sampling Rate: - + Bitrate (Kbps/CBR): @@ -401,87 +492,87 @@ ExportThread - + failed to send frame to encoder (%1) - + failed to receive packet from encoder (%1) - + could not video encoder for %1 - + could not allocate video stream - + could not allocate video encoding context - + could not open output video encoder (%1) - + could not copy video encoder parameters to output stream (%1) - + could not audio encoder for %1 - + could not allocate audio stream - + could not allocate audio encoding context - + could not open output audio encoder (%1) - + could not copy audio encoder parameters to output stream (%1) - + could not allocate audio buffer (%1) - + could not create output format context - + could not open output file (%1) - + could not write output file header (%1) - + could not write output file trailer (%1) @@ -535,17 +626,17 @@ - + Linear - + Bezier - + Hold @@ -594,7 +685,7 @@ KeyframeNavigator - + Enable Keyframes @@ -602,17 +693,17 @@ KeyframeView - + Linear - + Bezier - + Hold @@ -620,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -640,12 +731,12 @@ - + Loading '%1'... - + Cancel @@ -653,52 +744,52 @@ LoadThread - + Version Mismatch - + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -706,720 +797,748 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - - Enable/Disable In/Out Point + + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - - &Playback - - - - - Go to Start - - - - - Previous Frame - - - - - Play/Pause - - - - - Play In to Out - - - - - Next Frame - - - - - Go to End - - - - - Go to Previous Cut - - - - - Go to Next Cut - - - - - Go to In Point - - - - - Go to Out Point - - - - - Decrease Speed - - - - - Pause - - - - - Increase Speed - - - - - Loop + + Full Screen Viewer - &Window + &Playback - Project + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame - Effect Controls + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut - Timeline + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop - Graph Editor + Shuttle Right - - Media Viewer + + Loop + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + Sequence Viewer - - Reset to Default Layout - - - - - &Tools - - - - - Pointer Tool - - - - - Edit Tool - - - - - Ripple Tool - - - - - Razor Tool - - - - - Slip Tool + + Maximize Panel - Slide Tool + Reset to Default Layout - - Hand Tool + + &Tools - - Transition Tool + + Pointer Tool + + + + + Edit Tool - Enable Snapping + Ripple Tool - - Selecting Also Seeks + + Razor Tool - - Edit Tool Also Seeks + + Slip Tool - - Edit Tool Selects Links + + Slide Tool - - Seek Also Selects + + Hand Tool - - Seek to the End of Pastes + + Transition Tool + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + Media - + New Folder - + Name: - + Filename: - + Video Dimensions: - + Frame Rate: - + %1 fields (%2 frames) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1428,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1451,12 +1570,12 @@ Audio Layout: %6 - + Tracks: - + Video %1: %2x%3 %4FPS @@ -1466,27 +1585,27 @@ Audio Layout: %6 - + Conform to Frame Rate: - + Alpha is Premultiplied - + Auto (%1) - + Interlacing: - + Name: @@ -1494,12 +1613,12 @@ Audio Layout: %6 NewSequenceDialog - + Editing "%1" - + New Sequence @@ -1613,6 +1732,11 @@ Audio Layout: %6 Sample Rate: + + + Name: + + PanEffect @@ -1622,225 +1746,274 @@ Audio Layout: %6 + + Playback + + + Generating Proxy: %1% + + + PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file - + + Language: + + + + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + Use Software Fallbacks When Possible - + General - + Behavior - + Disable Multithreading on Images - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + + + + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -1848,12 +2021,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -1861,93 +2034,184 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Project - + + Search media, markers, etc. + + + + Project - + Sequence - + Replace '%1' - - + + All Files - - + + No active sequence - + No sequence is active, please open the sequence you want to replace clips from. - + Active sequence selected - + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. - + Rename '%1' - + Enter new name: - + Delete media in use? - + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? - + Skip - + Image sequence detected - + The file '%1' appears to be part of an image sequence. Would you like to import it as such? - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + ReplaceClipMediaDialog @@ -1976,42 +2240,42 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + No media selected - + Please select a media to replace with or click 'Cancel'. - + Same media selected - + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. - + Folder selected - + You cannot replace footage with a folder. - + Active sequence selected - + You cannot insert a sequence into itself. @@ -2019,7 +2283,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Sequence - + %1 (copy) @@ -2083,100 +2347,140 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SourcesCommon - + Import... - + New - + View - + Tree View - + Icon View - + Show Toolbar - + Show Sequences - + Replace/Relink Media - + Reveal in Explorer - + Reveal in Finder - + Reveal in File Manager - + Replace Clips Using This Media - + Create Sequence With This Media - + Duplicate - + Delete All Clips Using This Media - + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + Delete - + Properties... - + Replace Media - + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + SpeedDialog @@ -2186,32 +2490,32 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Speed: - + Frame Rate: - + Duration: - + Reverse - + Maintain Audio Pitch - + Ripple Changes @@ -2341,47 +2645,47 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimecodeEffect - + Timecode - + Sequence - + Media - + Scale - + Color - + Background Color - + Background Opacity - + Offset - + Prepend @@ -2389,157 +2693,147 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: - + <none> - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - - Set Marker - - - - - Set marker name: - - - - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -2547,18 +2841,78 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes TimelineWidget + + + &Undo + + + + + &Redo + + + + + C&ut + + + + + Cop&y + + + + + &Paste + + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + Link/Unlink + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + %1 @@ -2593,32 +2947,32 @@ Duration: %4 - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: @@ -2808,7 +3162,7 @@ Duration: %4 Transition - Length: + Length @@ -2874,17 +3228,17 @@ Duration: %4 Viewer - + Sequence Viewer - + Media Viewer - + (none) @@ -2892,57 +3246,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -2950,7 +3304,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index 462e410b8..891e992d7 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -4,12 +4,12 @@ AboutDialog - + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. Olive — нелинейный видеоредактор. Эта программа является свободной и защищена GNU GPL. - + Olive Team is obliged to inform users that Olive source code is available for download from its website. Исходный код Olive доступен для скачивания на сайте программы. @@ -22,6 +22,19 @@ Найти действие… + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio @@ -122,22 +135,22 @@ DemoNotice - + Welcome to Olive! Приветствуем в Olive! - + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. Это свободный нелинейный видеоредактор с открытым исходным кодом под лицензией GNU GPL. Если вы заплатили за эту программу, скорее всего вас обманули. - + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 На текущий момент программа находится на стадии альфы, т.е. она нестабильна, может часто падать и не иметь нужных вам функций. Мы не даём никаких гарантий, используйте на свой страх и риск. Сообщения об ошибках и запросы на новые функции мы принимаем здесь: %1 - + Thank you for trying Olive and we hope you enjoy it! Спасибо за интерес к Olive. Надеемся, что программа вам понравится! @@ -196,38 +209,38 @@ - + Effect XML Settings %1 Файлы с параметрами эффектов %1 - + Save Settings Failed Не удалось сохранить параметры - + Failed to open "%1" for writing. Не удалось открыть "%1" для записи. - + Load Effect Settings Загрузить параметры эффекта - - + + Load Settings Failed Не удалось загрузить параметры - + Failed to open "%1" for reading. Не удалось открыть "%1" для чтения. - + This settings file doesn't match this effect. Это файлс параметрами совсем другого эффекта. @@ -240,42 +253,42 @@ Эффекты: - + &Paste &Вставить - + Add Video Effect Добавить видеоэффект - + VIDEO EFFECTS ВИДЕОЭФФЕКТЫ - + Add Video Transition Добавить видеопереход - + Add Audio Effect Добавить аудиоэффект - + AUDIO EFFECTS АУДИОЭФФЕКТЫ - + Add Audio Transition Добавить аудиопереход - + (Multiple clips selected) (Выделено больше одного клипа) @@ -304,77 +317,98 @@ ExportDialog - + Export "%1" Экспортировать "%1" - + + Unknown codec name %1 + + + + Export Failed Не удалось экспортировать - + Export failed - %1 Не удалось экспортировать — %1 - + Invalid dimensions Некорректный размер кадра - + Export width and height must both be even numbers/divisible by 2. Ширина и высота кадра при экспорте должны делиться на 2 без остатка. - + Invalid codec Некорректный кодек - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Invalid format Некорректный формат - + Couldn't determine output format. This is a bug, please contact the developers. - + Export Media Экспортировать проект - + Quality-based (Constant Rate Factor) Качество (Constant Rate Factor) - + Constant Bitrate Постоянная скорость потока + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): Скорость потока (Мбит/с): - + Quality (CRF): Качество (CRF): - + Quality Factor: 0 = lossless @@ -389,68 +423,73 @@ 51 = самое низкое качество - + Target File Size (MB): Конечный размер файла (Мб): - + Format: Формат: - + Range: Диапазон: - + Entire Sequence Вся последовательность - + In to Out От входа от выхода - + Video Видео - - + + Codec: Кодек: - + Width: Ширина: - + Height: Высота: - + Frame Rate: Частота кадров: - + Compression Type: Тип сжатия: - + + Advanced + + + + Sampling Rate: Частота дискретизации: - + Bitrate (Kbps/CBR): Скорость потока (Кбит/с / CBR): @@ -458,87 +497,87 @@ ExportThread - + failed to send frame to encoder (%1) - + failed to receive packet from encoder (%1) - + could not video encoder for %1 - + could not allocate video stream - + could not allocate video encoding context - + could not open output video encoder (%1) - + could not copy video encoder parameters to output stream (%1) - + could not audio encoder for %1 - + could not allocate audio stream - + could not allocate audio encoding context - + could not open output audio encoder (%1) - + could not copy audio encoder parameters to output stream (%1) - + could not allocate audio buffer (%1) - + could not create output format context - + could not open output file (%1) - + could not write output file header (%1) - + could not write output file trailer (%1) @@ -659,17 +698,17 @@ KeyframeView - + Linear Линейный - + Bezier Безье - + Hold Константа @@ -677,14 +716,14 @@ LabelSlider - - + + Set Value Установить значение - - + + New value: Новое значение: @@ -720,42 +759,42 @@ Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? - + Invalid Clip Link Некорректная связь клипов - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? - + %1 - Line: %2 Col: %3 - + User aborted loading Пользователь прервал загрузку - + XML Parsing Error Ошибка разбора XML - + Couldn't load '%1'. %2 Не удалось загрузить '%1'. %2 - + Project Load Error Ошибка при загрузке проекта - + Error loading project: %1 Ошибка при загрузке проекта: %1 @@ -763,686 +802,715 @@ MainWindow - + Welcome to %1 Приветствуем в %1 - + Auto-recovery Автовосстановление - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? - + &Project &Проект - + &Sequence П&оследовательность - + &Folder П&апка - + Set In Point Установить точку входа - + Set Out Point Установить точку выхода - Enable/Disable In/Out Point - Переключить точку входа/выхода + Переключить точку входа/выхода - + Reset In Point Сбросить точку входа - + Reset Out Point Сбросить точку выхода - + Clear In/Out Point Очистить точку входа/выхода - + No active sequence Нет активных последовательностей - + Please open the sequence you wish to export. Откройте последовательность, которую хотите экспортировать - + Save Project As... Сохранить проект как… - + Unsaved Project Несохранённый проект - + This project has changed since it was last saved. Would you like to save it before closing? Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? - + &File &Файл - + &New &Создать - + &Open Project &Открыть проект - + Clear Recent List Очистить список - + Open Recent Открыть недавний - + &Save Project Со&хранить проект - + Save Project &As Сохранить проект &как - + &Import... &Импортировать… - + &Export... &Экспортировать…. - + E&xit В&ыход - + &Edit &Правка - + &Undo &Отменить - + Redo Вернуть - + Cu&t В&ырезать - + Cop&y С&копировать - + &Paste &Вставить - + Paste Insert - + Duplicate Сделать копию - + Delete Удалить - + Ripple Delete Удалить со сдвигом - + Split Разделить - + Select &All Выд&елить всё - + Deselect All Снять выделение - + Add Default Transition Добавить переход по умолчанию - + Link/Unlink Связать/Убрать связь - + Enable/Disable Включить/Отключить - + Nest Вложить - + Ripple to In Point Сдвиг до точки входа - + Ripple to Out Point Сдвиг до точки выхода - + Edit to In Point Правка до точки входа - + Edit to Out Point Правка до точки выхода - + Delete In/Out Point Удалить точку входа/выхода - + Ripple Delete In/Out Point Удалить со сдвигом точку входа/выхода - + Set/Edit Marker Установить/Изменить маркер - + &View &Вид - + Zoom In Приблизить - + Zoom Out Отдалить - + Increase Track Height Увеличить высоту дорожки - + Decrease Track Height Уменьшить высоту дорожки - + Toggle Show All Показывать весь проект - + Track Lines Линии дорожек - + Rectified Waveforms Волновая форма от низа - + Frames Кадры - + Drop Frame С пропуском кадров - + Non-Drop Frame Без пропуска кадров - + Milliseconds Миллисекунды - + Title/Action Safe Area Безопасная область - + Off Выкл. - + Default По умолчанию - + 4:3 4:3 - + 16:9 16:9 - + Custom Другая - + Full Screen Полноэкранный режим - + Full Screen Viewer Монитор в полноэкранном режиме - + &Playback Вос&произведение - + Go to Start К началу - + Previous Frame К предыдущему кадру - + Play/Pause Воспроизведение/Пауза - + Play In to Out Проиграть от входа до выхода - + Next Frame К следующему кадру - + Go to End В конец - + Go to Previous Cut - + Go to Next Cut - + Go to In Point К точке входа - + Go to Out Point К точке выхода - + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + Decrease Speed - Уменьшить скорость + Уменьшить скорость - Pause - Пауза + Пауза - Increase Speed - Увеличить скорость + Увеличить скорость - + Loop Петля - + &Window &Окно - + Project Проект - + Effect Controls Управление эффектами - + Timeline Таймлайн - + Graph Editor Редактор графов - + Media Viewer Монитор проекта - + Sequence Viewer Монитор последовательностей - + Maximize Panel Развернуть панель - + Reset to Default Layout Вернуть исходный вид панелей - + &Tools &Инструменты - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Enable Snapping Включить прилипание - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms Колесо мыши масштабирует таймлайн - + Enable Drag Files to Timeline Разрешить перетаскивание файлов на таймлайн извне - + Auto-Scale By Default Автоматически масштабировать по умолчанию - + Enable Seek to Import - + Audio Scrubbing Воспроизводить звук при прокрутке - + Enable Drop on Media to Replace - + Enable Hover Focus Включить фокус наводкой - + Ask For Name When Setting Marker Спрашивать имя маркера при добавлении - + No Auto-Scroll Без автопрокрутки - + Page Auto-Scroll Прокручивать перелистыванием - + Smooth Auto-Scroll Прокручивать плавно - + Preferences Параметры - + Clear Undo Очистить историю изменений - + &Help &Справка - + A&ction Search &Найти команду - + Debug Log Журнал отладки - + &About... &О программе… - + <untitled> <без названия> - + Open Project... Открыть проект… - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence Вложенная последовательность + + Marker + + + Set Marker + Установить маркер + + + + Set clip marker name: + Установить название маркера клипа: + + + + Set sequence marker name: + Установить название маркера последовательности: + + Media @@ -1795,184 +1863,184 @@ Audio Layout: %6 Язык: - + Custom CSS: Свой CSS: - + Browse Просмотр - + Image sequence formats: Форматы изображений: - + Audio Recording: Запись звука: - + Mono Моно - + Stereo Стерео - + Effect Textbox Lines: Строк в редакторе титров: - + Thumbnail Resolution: Разрешение миниатюр: - + Waveform Resolution: Разрешение волновой формы: - + Use Software Fallbacks When Possible - + General Общие - + Behavior Поведение - + Disable Multithreading on Images Отключить многопоточность для изображений - + Seeking Позиционирование - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Точное позиционирование Всегда показывать правильный кадр; на его получение может уходить немного времени - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Быстрое позиционирование Переходы без пауз, возможен кратковременный показ неправильного кадра в мониторе - + Memory Usage Использование памяти - + Upcoming Frame Queue: Очередь последующих кадров: - - + + frames кадров - - + + seconds секунд - + Previous Frame Queue: Очередь предыдущих кадров: - + Playback Воспроизведение - + Output Device: Устройство выхода: - - + + Default По умолчанию - + Input Device: Устройство входа: - + Sample Rate: Частота дискретизации: - + Audio Звук - + Search for action or shortcut Искать действие или комбинацию клавиш - + Action Действие - + Shortcut Комбинация - + Import Импортировать - + Export Экспортировать - + Reset Selected Сбросить выбранное - + Reset All Сбросить все - + Keyboard Клавиатурные комбинации @@ -1980,12 +2048,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 Не удалось открыть файл — %1 - + Could not find stream information - %1 Не удалось найти информацию потока — %1 @@ -2242,7 +2310,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Sequence - + %1 (copy) %1 (копия) @@ -2652,162 +2720,159 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: Таймлайн: - + <none> <нет> - + Effect already exists Эффект уже добавлен - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? - + Add Добавить - + Replace Заменить - + Skip Пропустить - + Do this for all conflicts found Применить для всех конфликтов - Set Marker - Установить маркер + Установить маркер - Set clip marker name: - Установить название маркера клипа: + Установить название маркера клипа: - Set sequence marker name: - Установить название маркера последовательности: + Установить название маркера последовательности: - + Title... Титры… - + Solid Color... Цветная заливка… - + Bars... Испытательная таблица… - + Tone... Звуковой сигнал… - + Noise... Шум… - + Unsaved Project Несохранённый проект - + You must save this project before you can record audio in it. Перед записью звука необходимо сохранить проект. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Щелкните на таймлайне в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Snapping Прилипание - + Zoom In Приблизить - + Zoom Out Отдалить - + Record audio Записать звук - + Add title, solid, bars, etc. Добавить титры, заливку цветом, испытательную таблицу и т.д. @@ -2815,7 +2880,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineHeader - + Center Timecodes Центрировать тайм-код @@ -2924,32 +2989,32 @@ Duration: %4 - + Title Титры - + Solid Color Цветная заливка - + Bars Испытательная таблица - + Tone Звуковой сигнал - + Noise Шум - + Duration: Длительность: @@ -3138,9 +3203,13 @@ Duration: %4 Transition - Length: - Длительность: + Длительность: + + + + Length + @@ -3205,17 +3274,17 @@ Duration: %4 Viewer - + Sequence Viewer Монитор последовательностей - + Media Viewer Монитор проекта - + (none) (нет) From 446458b97fe4113c4fe6e615d5f37c1d88a62b12 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 16:37:03 -0800 Subject: [PATCH 124/202] excluded old unaltered files --- ts/olive_ar.ts | 3351 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3351 insertions(+) create mode 100644 ts/olive_ar.ts diff --git a/ts/olive_ar.ts b/ts/olive_ar.ts new file mode 100644 index 000000000..161d20bdc --- /dev/null +++ b/ts/olive_ar.ts @@ -0,0 +1,3351 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + زيتون هو محرر فيديو غير خطي. هذا البرنامج حر ومحمي بموجب رخصة جنو العمومية. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + فريق زيتون ملزم بإخبار مستخدميه بأن الشفرة المصدرية لزيتون متوفرة للتنزيل عبر موقعه الإلكتروني. + + + + ActionSearch + + + Search for action... + ابحث عن إجراء... + + + + Audio + + + Audio + الصوت + + + + Recording + تسجيل + + + + AudioNoiseEffect + + + Amount + المقدار + + + + Mix + دمج + + + + ChannelLayoutName + + + Invalid + معطوب + + + + Mono + اُحادي + + + + Stereo + مُجسم + + + + CollapsibleWidget + + + <untitled> + <غير معنون> + + + + ColorButton + + + Set Color + حدد اللون + + + + CornerPinEffect + + + Top Left + اعلى اليسار + + + + Top Right + اعلى اليمين + + + + Bottom Left + ادنى اليسار + + + + Bottom Right + ادنى اليمين + + + + Perspective + منظور + + + + DebugDialog + + + Debug Log + سجل التنقيح + + + + DemoNotice + + + + Welcome to Olive! + مرحباً في زيتون! + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + زيتون هو محرر فيديو حر ومفتوح المصدر تحت مظلة رخصة رخصة جنو العمومية. أن دفعت ﻷجل الحصول على هذا البرنامج فقد غُششت. + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + هذا البرنامج في مرحلة ألفا حالياً حيث تعني أنه غير مستقر وفي اﻷعم اﻷغلب عرضة للتحطم, به علل, ويفتقر لبعض المميزات. نحن لا نوفر ضمانة لذا أستخدمهُ على مسؤوليتك. رجاءً بلغ أي علل أو طلب مميزات على %1 + + + + Thank you for trying Olive and we hope you enjoy it! + شكراً لتجربتك زيتون ونحن نأمل أن تستمتع به! + + + + Effect + + + Invalid effect + تأثير غير صالح + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + لا وجود للتأثير '%1'. هذا التأثير قد يكون فاسد حاول إعادة تثبيته مجدداً أو زيتون. + + + + Cu&t + قط&ع + + + + &Copy + &نسخ + + + + Move &Up + حرك &للاعلى + + + + Move &Down + حرك &لﻷسفل + + + + D&elete + ح&ذف + + + + Load Settings From File + حمل اﻹعدادات من ملف + + + + Save Settings to File + أحفظ اﻷعدادات في ملف + + + + Save Effect Settings + أحفظ أعدادات المؤثر + + + + + Effect XML Settings %1 + غير إعدادات XML %1 + + + + Save Settings Failed + حفظ اﻷعدادات فشل + + + + Failed to open "%1" for writing. + فشل فتح "%1" للكتابة. + + + + Load Effect Settings + تحميل أعدادات المؤثر + + + + + Load Settings Failed + تحميل اﻹعدادات فشل + + + + Failed to open "%1" for reading. + فشل في فتح "%1" للقراءة. + + + + This settings file doesn't match this effect. + ملف اﻷعدادات هذا لا يطابق هذا المؤثر. + + + + EffectControls + + + Effects: + المؤثرات: + + + + &Paste + &لصق + + + + Add Video Effect + أضف موثر فيديو + + + + VIDEO EFFECTS + موثرات الفيديو + + + + Add Video Transition + أضف أنتقالة فيديو + + + + Add Audio Effect + أضف موثر صوت + + + + AUDIO EFFECTS + موثرات الصوت + + + + Add Audio Transition + أضف أنتقالة صوت + + + + (Multiple clips selected) + (مقاطع عديدة محددة) + + + + EffectRow + + + Disable Keyframes + عطّل اﻹطارت المفتاحية + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + تعطيل اﻹطارات المفتاحية سوف يحذف جميع اﻹطارات المفتاحية الحالية هل أنت متأكد من ما ستقدم عليه؟ + + + + EmbeddedFileChooser + + + File: + ملف: + + + + ExportDialog + + + Export "%1" + صدّر "%1" + + + + Export Failed + فشل التصدير + + + + Export failed - %1 + فشل تصدير - %1 + + + + Invalid dimensions + أبعاد خاطئة + + + + Export width and height must both be even numbers/divisible by 2. + تصدير العرض والطول يجب أن يكون عدد زوجي/قابل للقسمة ب 2. + + + + Invalid codec + مرماز غير صالح + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + لم يتم التعرف على خيارات الإخراج للمرماز المحدد. هذه علة, رجاءً تواصل مع المطورين. + + + + Invalid format + صيغة غير صالحة + + + + Couldn't determine output format. This is a bug, please contact the developers. + لم يتم التعرف على صيغة اﻹخراج. هذه علة, رجاءً تواصل مع المطورين. + + + + Export Media + صدّر الوسائط + + + + Quality-based (Constant Rate Factor) + (عامل النسبة الثابت) أعتماداً-بالجودة + + + + Constant Bitrate + نسبة بت ثابتة + + + + Bitrate (Mbps): + نسبة البت (مب/ث): + + + + Quality (CRF): + الجودة (CRF): + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + عامل الجودة: + +0 = بدون خسارة +17-18 = بدون خسارة بصرية (مضغوط, لكن غير متأثر) +23 = جودة عالية +51 = أقل جودة ممكنة + + + + Target File Size (MB): + حجم الملف الهدف (مب): + + + + Format: + صيغة: + + + + Range: + المدى: + + + + Entire Sequence + كل المقطع + + + + In to Out + الدخل إلى الخرج + + + + Video + فيديو + + + + + Codec: + مرماز: + + + + Width: + العرض: + + + + Height: + الطول: + + + + Frame Rate: + نسبة الإطارات: + + + + Compression Type: + نوع الضغط: + + + + Sampling Rate: + معدل الإعتيان: + + + + Bitrate (Kbps/CBR): + نسبة البت (Kbps/CBR): + + + + ExportThread + + + failed to send frame to encoder (%1) + فشل إرسال اﻹطار للمُرمز.(%1) + + + + failed to receive packet from encoder (%1) + فشل إستلام الرزمة من المُرمز (%1) + + + + could not video encoder for %1 + لم يجد مُرمز فيديو ل %1 + + + + could not allocate video stream + لم يستطع تخصيص بث فيديو + + + + could not allocate video encoding context + للمراجعة + لم يستطع تخصيص سياق ترميز فيديو + + + + could not open output video encoder (%1) + لم يتم فتح مرمّز مخرجات فيديو (%1) + + + + could not copy video encoder parameters to output stream (%1) + لم يتم نسخ عوامل مرمّز الفيديو لبث المخرجات (%1) + + + + could not audio encoder for %1 + لم يستطع ترميز فيديو ل %1 + + + + could not allocate audio stream + لم يستطع تخصيص بث صوت + + + + could not allocate audio encoding context + لم يستطع تخصيص سياق ترميز صوت + + + + could not open output audio encoder (%1) + لم يتم فتح مرمّز مخرجات صوت (%1) + + + + could not copy audio encoder parameters to output stream (%1) + لم يتم نسخ عوامل مرمّز الصوت لبث المخرجات (%1) + + + + could not allocate audio buffer (%1) + لم يستطع تخصيص حافظة صوت (%1) + + + + could not create output format context + لم يستطع إنشاء سياق صيغة الصوت + + + + could not open output file (%1) + لم يستطع فتح ملف اﻹخراج (%1) + + + + could not write output file header (%1) + لم يستطع كتابة مخرجات ترويسة الملف (%1) + + + + could not write output file trailer (%1) + لم يستطع كتابة مخرجات ملحقة الملف (%1) + + + + FillLeftRightEffect + + + Type + النوع + + + + Fill Left with Right + املأ اليسار مع اليمين + + + + Fill Right with Left + املأ اليمين مع اليسار + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + فشل في تحميل إضافة Frei0r "%1": %2 + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة Frei0r 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة Frei0r 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. + + + + Error loading Frei0r plugin + خطأ تحميل إضافة Frei0r + + + + GraphEditor + + + Graph Editor + محرر المخطط + + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + GraphView + + + Zoom to Selection + قرّب للمُحدد + + + + Zoom to Show All + تقريب لرؤية الكل + + + + Reset View + صفّر الرؤية + + + + InterlacingName + + + None (Progressive) + لا شيء (متفاقم) + + + + Top Field First + الحقل العلوي أولاً + + + + Bottom Field First + الحقل السفلي أولاً + + + + Invalid + غير صالح + + + + KeyframeNavigator + + + Enable Keyframes + فعّل اﻹطارات المفتاحية + + + + KeyframeView + + + Linear + خطي + + + + Bezier + بيزير + + + + Hold + أمسك + + + + LabelSlider + + + + Set Value + حدد القيمة + + + + + New value: + قيمة جديدة: + + + + LoadDialog + + + Loading... + تحميل... + + + + Loading '%1'... + تحميل '%1'... + + + + Cancel + إلغاء + + + + LoadThread + + + Version Mismatch + عدم تطابق النسخة + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + هذا المشروع كان محفوظاً بنسخة مختلفة من زيتون وقد لا تكون متوافقة بشكل كامل مع هذه النسخة. هل تريد محاولة تحميله على إي حال؟ + + + + Invalid Clip Link + رابط مقطع غير صالح + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + هذا المشروع يحوي رابط مقطع غير صالح. قد يكون معطوباً. هل تريد اﻷستمرار بتحميله؟ + + + + %1 - Line: %2 Col: %3 + %1 - سطر: %2 عمود: %3 + + + + User aborted loading + المسخدم أجهض التحميل + + + + XML Parsing Error + خطأ تحليل XML + + + + Couldn't load '%1'. %2 + تعثر تحميل '%1'. %2 + + + + Project Load Error + خطأ تحميل المشروع + + + + Error loading project: %1 + خطأ تحميل المشروع: %1 + + + + MainWindow + + + Welcome to %1 + مرحباً في %1 + + + + Auto-recovery + اﻷستعادة التلقائية + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ + + + + &Project + &المشروع + + + + &Sequence + &مقطع + + + + &Folder + &مجلد + + + + Set In Point + ضع في نقطة + + + + Set Out Point + ضع خارج نقطة + + + + Reset In Point + صفر في النقطة + + + + Reset Out Point + صفّر النقطة + + + + Clear In/Out Point + محو نقطة الدخل/الخرج + + + + No active sequence + لا مقاطع نشطة + + + + Please open the sequence you wish to export. + رجاءً أفتح المقطع المراد تصديره. + + + + Save Project As... + أحفظ المشروع ك... + + + + Unsaved Project + مشروع غير محفوظ + + + + This project has changed since it was last saved. Would you like to save it before closing? + هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ + + + + &File + &ملف + + + + &New + &جديد + + + + &Open Project + &أفتح مشروع + + + + Clear Recent List + أفرغ قائمة مؤخراً + + + + Open Recent + أفتح مؤخراً + + + + &Save Project + &أحفظ المشروع + + + + Save Project &As + أحفظ المشروع &ك + + + + &Import... + &أستيراد + + + + &Export... + &تصدير + + + + E&xit + خ&روج + + + + &Edit + &تعديل + + + + &Undo + &تراجع + + + + Redo + أعد + + + + Cu&t + قط&ع + + + + Cop&y + &نسخ + + + + &Paste + &لصق + + + + Paste Insert + ألصق أدرج + + + + Duplicate + أستنساخ + + + + Delete + حذف + + + + Ripple Delete + حذف موجة + + + + Split + أنقسام + + + + Select &All + تحديد &الكل + + + + Deselect All + إلغاء تحديد الكل + + + + Add Default Transition + أضف اﻷنتقال الأفتراضي + + + + Link/Unlink + ربط/فصل + + + + Enable/Disable + تفعيل/تعطيل + + + + Nest + للمراجعة + تداخل + + + + Ripple to In Point + موجة لنقطة إدخال + + + + Ripple to Out Point + موجة لنقطة إخراج + + + + Edit to In Point + عدّل لنقطة إدخال + + + + Edit to Out Point + عدّل لنقطة إخراج + + + + Delete In/Out Point + محو نقطة الدخل/الخرج + + + + Ripple Delete In/Out Point + موجة حذف نقطة الإدخال/الإخراج + + + + Set/Edit Marker + حدد/عدّل اﻹشارات + + + + &View + &أظهر + + + + Zoom In + تقريب + + + + Zoom Out + أبتعاد + + + + Increase Track Height + زدّ طول المسار + + + + Decrease Track Height + قلل طول المسار + + + + Toggle Show All + فعل إظهار الكل + + + + Track Lines + تعقب السطور + + + + Rectified Waveforms + أشكال موجية متناوبة + + + + Frames + اﻹطارات + + + + Drop Frame + أفلت إطار + + + + Non-Drop Frame + إطار غير مُفلت + + + + Milliseconds + جزء من الثانية + + + + Title/Action Safe Area + عنوان/إجراء المنطقة الآمنة + + + + Off + مطفئ + + + + Default + إفتراضي + + + + 4:3 + 4:3 + + + + 16:9 + 16:9 + + + + Custom + مخصوص + + + + Full Screen + ملء الشاشة + + + + Full Screen Viewer + عارض ملء الشاشة + + + + &Playback + &الترديد + + + + Go to Start + أذهب للبداية + + + + Previous Frame + الإطار السابق + + + + Play/Pause + تشغيل/أستئناف + + + + Play In to Out + شغل من الإدخال إلى الإخراج + + + + Next Frame + اﻹطار التالي + + + + Go to End + أذهب للنهاية + + + + Go to Previous Cut + أذهب للقطعة السابقة + + + + Go to Next Cut + أذهب للقطعة التالية + + + + Go to In Point + أذهب لنقطة إدخال + + + + Go to Out Point + أذهب لنقطة إخراج + + + + Shuttle Left + توشع اليسار + + + + Shuttle Stop + إيقاف التوشع + + + + Shuttle Right + توشع اليمين + + + + Loop + حلقة + + + + &Window + &نافذة + + + + Project + المشروع + + + + Effect Controls + تحكمات المؤثر + + + + Timeline + الخط الزمني + + + + Graph Editor + محرر المخطط + + + + Media Viewer + عارض الوسائط + + + + Sequence Viewer + عارض المقطع + + + + Maximize Panel + ضخّم اللائحة + + + + Reset to Default Layout + صفّر للتخطيط المبدئي + + + + &Tools + &اﻷدوات + + + + Pointer Tool + أداة المؤشر + + + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Razor Tool + أداة القطع + + + + Slip Tool + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Transition Tool + أداة اﻷنتقال + + + + Enable Snapping + فعّل السحب + + + + Selecting Also Seeks + للمراجعة + تحديد العروضات إيضاً + + + + Edit Tool Also Seeks + أداة التحرير تعرض إيضاً + + + + Edit Tool Selects Links + أداة التحرير تحدد الروابط + + + + Seek Also Selects + للمراجعة + العرض يحدد إيضاً + + + + Seek to the End of Pastes + أعرض لنهاية الملصوقات + + + + Scroll Wheel Zooms + العجلة الدوراة تُقرّب + + + + Enable Drag Files to Timeline + أسمح بسحب الملفات للخط الزمني + + + + Auto-Scale By Default + التحجيم-التلقائي إفتراضياً + + + + Enable Seek to Import + للمراجعة + أسمح للعرض بالإستيراد + + + + Audio Scrubbing + حكّ شريط الصوت + + + + Enable Drop on Media to Replace + أسمح برمي الوسائط للأستبدال + + + + Enable Hover Focus + فعّل التركيز الحائم + + + + Ask For Name When Setting Marker + أسال عن اﻷسم حين وضع المؤشر + + + + No Auto-Scroll + لا أنزلاق التلقائي + + + + Page Auto-Scroll + أنزلاق الصفحة التلقائي + + + + Smooth Auto-Scroll + الأنزلاق التلقائي الناعم + + + + Preferences + التفضيلات + + + + Clear Undo + أمسح التراجُعات + + + + &Help + &مساعدة + + + + A&ction Search + ب&حث إجراء + + + + Debug Log + سجل التنقيح + + + + &About... + &حول... + + + + <untitled> + <غير معنون> + + + + Open Project... + أفتح مشروع... + + + + Missing recent project + مشروع ماضي ضائع + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ + + + + Invalid aspect ratio + معدل نسبة غير صالح + + + + The aspect ratio '%1' is invalid. Please try again. + معدل النسبة '%1' غير صالح. حاول مجدداً. + + + + Enter custom aspect ratio + أدخل نسبة معدل مخصصة + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): + + + + Nested Sequence + مقطع متشعب + + + + Marker + + + Set Marker + ضع وسم + + + + Set clip marker name: + ضع أسم وسم المقطوعة: + + + + Set sequence marker name: + ضع أسم وسم المقطع: + + + + Media + + + New Folder + مجلد جديد + + + + Name: + اﻷسم: + + + + Filename: + أسم الملف: + + + + Video Dimensions: + أبعاد الفيديو: + + + + Frame Rate: + معدل اﻹطارات: + + + + %1 fields (%2 frames) + %1 الحقل (%2 إطارات) + + + + Interlacing: + المشابكة: + + + + Audio Frequency: + تردد الصوت: + + + + Audio Channels: + قنوات الصوت: + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + اﻷسم: %1 +أبعاد الفيديو: %2x%3 +معدل اﻹطارات: %4 +تردد الصوت: %5 +تخطيط الصوت: %6 + + + + Name + اﻷسم + + + + Duration + المدة + + + + Rate + النسبة + + + + MediaPropertiesDialog + + + "%1" Properties + "%1" الخصائص + + + + Tracks: + المقطوعات: + + + + Video %1: %2x%3 %4FPS + فيديو %1: %2x%3 %4إطار/ث + + + + Audio %1: %2Hz %3 channels + الصوت %1: %2هرتز %3 قنوات + + + + Conform to Frame Rate: + المصادقة لمستوى اﻹطارات: + + + + Alpha is Premultiplied + ألفا مضاعفة مسبقاً + + + + Auto (%1) + تلقائي (%1) + + + + Interlacing: + المشابكة: + + + + Name: + اﻷسم: + + + + NewSequenceDialog + + + Editing "%1" + تعديل "%1" + + + + New Sequence + مقطع جديد + + + + Preset: + قالب: + + + + Film 4K + فلم 4K + + + + TV 4K (Ultra HD/2160p) + 4K تلفاز (أقصى-عالي الدقة/2160p) + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + مخصوص + + + + Video + فيديو + + + + Width: + العرض: + + + + Height: + الطول: + + + + Frame Rate: + معدل اﻹطارات: + + + + Pixel Aspect Ratio: + للمراجعة + معدل نسبة البيكسل: + + + + Square Pixels (1.0) + بكسيل مربع (1.0) + + + + Interlacing: + المشابكة: + + + + None (Progressive) + لا شيء (متفاقم) + + + + Audio + الصوت + + + + Sample Rate: + معدل الإعتيان: + + + + Name: + اﻷسم: + + + + PanEffect + + + Pan + بحاجة لمتابعة + تسطّح + + + + Playback + + + Generating Proxy: %1% + توليد وسيط: %1% + + + + PreferencesDialog + + + Preferences + التفضيلات + + + + Invalid CSS File + ملف CSS غير صالح + + + + CSS file '%1' does not exist. + ملف CSS '%1' غير موجود. + + + + Warning + تحذير + + + + Some changed settings will require restarting Olive to take effect + بعض اﻹعدادات المعدلة تتطلب من زيتون إعادة التشغيل لتأخذ تأثيرها + + + + Confirm Reset All Shortcuts + أكّد تصفير كل اﻹختصارات + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + هل أنت متأكد أنك ترغب بتصفير جميع أختصارات لوحة المفاتيح لقيمهم اﻹفتراضية؟ + + + + Import Keyboard Shortcuts + أستيراد أخصارات لوحة المفاتيح + + + + + Error saving shortcuts + خطأ حفظ اﻹختصارات + + + + Failed to open file for reading + فشل في فتح الملف للقراءة + + + + Export Keyboard Shortcuts + تصدير أختصارات لوحة المفاتيح + + + + Export Shortcuts + تصدير اﻹختصارات + + + + Shortcuts exported successfully + صُدرت اﻷختصارات بنجاح + + + + Failed to open file for writing + فشل في فتح الملف للكتابة + + + + Browse for CSS file + أبحث عن ملف CSS + + + + Language: + اللغة: + + + + Custom CSS: + CSS مخصوص: + + + + Browse + تصفّح + + + + Image sequence formats: + صيغ صور المقاطع: + + + + Audio Recording: + تسجيل الصوت: + + + + Mono + اُحادي + + + + Stereo + مُجسم + + + + Effect Textbox Lines: + للمراجعة + أثر بسطور صندوق النص: + + + + Thumbnail Resolution: + دقّة الصورة المصغرة: + + + + Waveform Resolution: + دقّة الشكل الموجي: + + + + Use Software Fallbacks When Possible + أستعمل معالجة البرمجيات حين اﻹمكان + + + + General + عام + + + + Behavior + السلوك + + + + Disable Multithreading on Images + عطل تعدد المعالجات بالصور + + + + Seeking + للمراجعة + التنزيل + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + للمراجعة + عرض دقيق +دوماً أظهر اﻹطار الصحيح (البصريات قد تتوقف بإيجاز كلما تستجلب اﻹطارات بدقة) + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + للمراجعة الشديدة + سرعة النقل +أنقل بسرعة (قد يعمق روئية اﻹطارات غير الصحيحة - لا يؤثر الترديد/تصدير) + + + + Memory Usage + أستعمال الذاكرة + + + + Upcoming Frame Queue: + إطار الصف القادم: + + + + + frames + اﻹطارات + + + + + seconds + الثوان + + + + Previous Frame Queue: + إطار الصف السابق: + + + + Playback + للمراجعة + الترديد + + + + Output Device: + جهاز اﻹخراج: + + + + + Default + إفتراضي + + + + Input Device: + جهاز اﻹدخال: + + + + Sample Rate: + معدل الإعتيان: + + + + Audio + الصوت + + + + Search for action or shortcut + ابحث عن إجراء أو أختصار + + + + Action + إجراء + + + + Shortcut + أختصار + + + + Import + أستيراد + + + + Export + تصدير + + + + Reset Selected + صفّر المحدد + + + + Reset All + صفّر الجميع + + + + Keyboard + لوحة المفاتيح + + + + PreviewGenerator + + + Could not open file - %1 + لا يمكن فتح الملف - %1 + + + + Could not find stream information - %1 + لم يتم العثور على ملومات التدفق - %1 + + + + Project + + + Search media, markers, etc. + بحث وسائط, علامات, إلخ. + + + + Project + المشروع + + + + Sequence + مقطع + + + + Replace '%1' + أستبدل '%1' + + + + + All Files + كل الملفات + + + + + No active sequence + لا مقاطع نشطة + + + + No sequence is active, please open the sequence you want to replace clips from. + لا مقطع نشط, رجاءً أفتح المقطع التي تريد أستبدال الجزء منه. + + + + Active sequence selected + مقطع نشط محدد + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + لا يمكنك إدراج المقطع بنفسه, لذا لا جزئيات من هذه الوسائط ستكون بهذا المقطع. + + + + Rename '%1' + أعد تسمية '%1' + + + + Enter new name: + أدخل اﻷسم الجديد: + + + + Delete media in use? + أحذف الوسائط المستعملة؟ + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + الوسائط '%1' حالياً مستعملة ب '%2'. حذفه سوف يحذف جميع حالات المقطع. هل أنت متأكد أنك تريد فعل هذا؟ + + + + Skip + تخطى + + + + Image sequence detected + تم التعرف على مقاطع صور + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + الملف '%1' يبدو كأنه جزء من سلسلة صور. هل تريد أستيراده هكذا؟ + + + + Import media... + أستيراد وسائط... + + + + No sequence is active, please open the sequence you want to delete clips from. + لا مقطع نشط, رجاءً أفتح المقطع المراد حذف جزء منه. + + + + ProxyDialog + + + Create Proxy + أنشئ وسيط + + + + Proxy + وسيط + + + + Dimensions: + اﻷبعاد: + + + + Same Size as Source + نفس حجم المصدر + + + + Half Resolution (1/2) + نصف الدقّة (1/2) + + + + Quarter Resolution (1/4) + ربع الدقّة (1/4) + + + + Eighth Resolution (1/8) + ثُمن الدقة (1/8) + + + + Sixteenth Resolution (1/16) + ستة أعشار الدقّة (1/16) + + + + Format: + صيغة: + + + + ProRes HQ + جودة عالية أحترافية (ProRes HQ) + + + + Location: + الموقع: + + + + Same as Source (in "%1" folder) + مثل المصدر (في مجلد "%1") + + + + Proxy file exists + ملف الوسيط موجود + + + + The file "%1" already exists. Do you wish to replace it? + الملف "%1" موجود مسبقاً. هل ترغب بأستبداله؟ + + + + Custom Location + موقع مخصوص + + + + ProxyGenerator + + + Finished generating proxy for "%1" + أنتهى توليد وسيط إلى "%1" + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + أستبدل المقاطع بأستعمال "%1" + + + + Select which media you want to replace this media's clips with: + أختار إي الوسائط تريد أستبدالها لمقاطع الوسائط هذخ مع: + + + + Keep the same media in-points + ضع ذات الوسائط في نقاط + + + + Replace + أستبدل + + + + Cancel + إلغاء + + + + No media selected + لا وسائط محددة + + + + Please select a media to replace with or click 'Cancel'. + رجاءً أختر الوسائط للأستبدال مع أو أنقر 'إلغاء'. + + + + Same media selected + ذات الوسائط مختارة + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + أخترت ذات الوسائط المراد أستبدالها. رجاءً أختر غيرها أو أنقر 'إلغاء'. + + + + Folder selected + مجلد محدد + + + + You cannot replace footage with a folder. + لا يمكنك أستبدال اللقطات مع مجلد. + + + + Active sequence selected + مقاطع نشطة محددة + + + + You cannot insert a sequence into itself. + لا يسعك إدراج مقطع في نفسه. + + + + Sequence + + + %1 (copy) + %1 (نسخ) + + + + ShakeEffect + + + Intensity + للمراجعة(كثافة أم شدة) + الكثافة + + + + Rotation + الدوران + + + + Frequency + التردد + + + + SolidEffect + + + Type + النوع + + + + Solid Color + لون صلب + + + + SMPTE Bars + ألواح SMPTE + + + + Checkerboard + لوح التدقيق + + + + Opacity + العتمة + + + + Color + اللون + + + + Checkerboard Size + حجم لوح التدقيق + + + + SourcesCommon + + + Import... + أستيراد... + + + + New + جديد + + + + View + أظهر + + + + Tree View + مظهر الشجرة + + + + Icon View + مظهر الإيقونات + + + + Show Toolbar + أظهر لوح اﻷدوات + + + + Show Sequences + أظهر المقاطع + + + + Replace/Relink Media + أستبدل/أعد ربط الوسائط + + + + Reveal in Explorer + أظهر في الكاشف + + + + Reveal in Finder + أظهر في البحث + + + + Reveal in File Manager + أظهر بمتصفح الملفات + + + + Replace Clips Using This Media + أستبدل المقاطع مستعملاً هذه الوسائط + + + + Create Sequence With This Media + أنشئ مقطع مع هذه الوسائط + + + + Duplicate + أستنساخ + + + + Delete All Clips Using This Media + أحذف جميع هذه المقاطع المستعملة هذه الوسائط + + + + Proxy + وسيط + + + + Generating proxy: %1% complete + توليد الوسيط: %1% أكتمل + + + + Create/Modify Proxy + أنشئ/غيّر وسيط + + + + Create Proxy + أنشئ وسيط + + + + Modify Proxy + غيّر الوسيط + + + + Restore Original + أستعد اﻷصل + + + + Delete + حذف + + + + Properties... + الخصائص... + + + + Replace Media + أستبدل الوسائط + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + أنت أوقعت ملفً على '%1' هل تريد أستبداله مع الملف المرمي؟ + + + + Delete proxy + حذف وسيط + + + + Would you like to delete the proxy file "%1" as well? + هل تريد حذف ملف الوسيط "%1" إيضاً؟ + + + + SpeedDialog + + + Dialog + الحوار + + + + + Speed: + السرعة: + + + + + Frame Rate: + معدل اﻹطارات: + + + + + Duration: + المدة: + + + + Speed/Duration + السرعة/المدّة + + + + Reverse + معكوس + + + + Maintain Audio Pitch + للمراجعة + حافظ على حدة الصوت + + + + Ripple Changes + تغيرات الموجة + + + + TextEditDialog + + + Edit Text + عدّل النص + + + + TextEffect + + + Text + النص + + + + Font + الخط + + + + Size + الحجم + + + + Color + اللون + + + + Alignment + محاذاة + + + + Left + يسار + + + + + Center + المركز + + + + Right + يمين + + + + Justify + تسوية + + + + Top + أعلى + + + + Bottom + القاع + + + + Word Wrap + لُف الكلمة + + + + Outline + الخلاصة + + + + Outline Color + لون الخلاصة + + + + Outline Width + عرض الخلاصة + + + + Shadow + الظل + + + + Shadow Color + لون الظل + + + + Shadow Distance + مسافة الظل + + + + Shadow Softness + نعومة الظل + + + + Shadow Opacity + عتمة الظل + + + + Sample Text + عينة نص + + + + &Edit Text + &عدل النص + + + + TimecodeEffect + + + Timecode + شفرة الوقت + + + + Sequence + مقطع + + + + Media + الوسائط + + + + Scale + المقياس + + + + Color + اللون + + + + Background Color + لون الخلفية + + + + Background Opacity + عتمة الخلفية + + + + Offset + اﻷزاحة + + + + Prepend + باحجة للمراجعة + البادئة + + + + Timeline + + + Timeline: + الخط الزمني: + + + + <none> + <لا شيء> + + + + Effect already exists + المؤثر موجود مسبقاً + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + المقطع '%1' يحتوي على المؤثر '%2'. هل تفضل أستبداله مع الملصوق أو إضافته كمؤثر منفصل؟ + + + + Add + أضف + + + + Replace + أستبدل + + + + Skip + تخطى + + + + Do this for all conflicts found + أفعل هذا مع كل التعارضات الموجودة + + + + Title... + العنوان... + + + + Solid Color... + بحاجة لمتابعة + لون صلب... + + + + Bars... + ألواح... + + + + Tone... + نغّم... + + + + Noise... + ضجيج... + + + + Unsaved Project + مشروع غير محفوظ + + + + You must save this project before you can record audio in it. + يجب عليك حفظ المشروع قبل تسجيل الصوت فيه. + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + أنقر على الخط الزمني حيث تريد بدء التسجيل (أسحب لوضع حد للتسجيل في إطار وقت معين) + + + + Pointer Tool + أداة المؤشر + + + + Edit Tool + أداة التحرير + + + + Ripple Tool + أداة الموجة + + + + Razor Tool + أداة القطع + + + + Slip Tool + بحاجة لمتابعة + أداة المنزلقة + + + + Slide Tool + أداة الشريحة + + + + Hand Tool + أداة اليد + + + + Transition Tool + أداة اﻷنتقال + + + + Snapping + بحاجة لمتابعة + الساحبة + + + + Zoom In + تقريب + + + + Zoom Out + أبتعاد + + + + Record audio + سجّل الصوت + + + + Add title, solid, bars, etc. + أضف عنوان, صلب, ألواح, إلخ. + + + + TimelineHeader + + + Center Timecodes + وسّط رمز الوقت + + + + TimelineWidget + + + &Undo + &تراجع + + + + &Redo + &أعد + + + + C&ut + قط&ع + + + + Cop&y + &نسخ + + + + &Paste + &لصق + + + + R&ipple Delete + حذف مو&جة + + + + Sequence Settings + اﻷعدادات المقطع + + + + &Speed/Duration + &السرعة/المدّة + + + + Auto-s&cale + التحجيم-التلقا&ئي + + + + Link/Unlink + ربط/فصل + + + + &Nest + &تداخل + + + + &Reveal in Project + &أبرّز في المشروع + + + + R&ename + أ&عد تسمية + + + + %1 +Start: %2 +End: %3 +Duration: %4 + %1 +بدء: %2 +أنتهاء: %3 +المدة: %4 + + + + Rename '%1' + أعد تسمية '%1' + + + + Rename multiple clips + أعد تسمية عدة مقاطع + + + + Enter a new name for this clip: + أدخل أسم جديد لهذا المقطع: + + + + Error + خطأ + + + + Couldn't locate media wrapper for sequence. + لم يتم رصد موقع غلاف الوسائط للمقطع. + + + + Title + عنوان + + + + Solid Color + لون صلب + + + + Bars + ألواح + + + + Tone + نغّم + + + + Noise + ضجيج + + + + Duration: + المدة: + + + + ToneEffect + + + Type + نوع + + + + Frequency + التردد + + + + Amount + مقدار + + + + Mix + دمج + + + + TransformEffect + + + Position + الموضع + + + + Scale + المقياس + + + + Uniform Scale + المقياس الموحد + + + + Rotation + الدوران + + + + Anchor Point + نقطة المرساة + + + + Opacity + العتمة + + + + Blend Mode + طور المزج + + + + Normal + عادي + + + + Darken + ظلّم + + + + Multiply + ضاعف + + + + Color Burn + حرق اللون + + + + Linear Burn + حرق خطي + + + + Lighten + خفّف + + + + Screen + شاشة + + + + Color Dodge + بحاجة لمتابعة + تلفيق اللون + + + + Linear Dodge (Add) + تلفيق خطي (أضف) + + + + Overlay + غطاء + + + + Soft Light + ضوء ناعم + + + + Hard Light + ضوء خشن + + + + Vivid Light + بحاجة لمتابعة + ضوء حيوي + + + + Linear Light + ضوء خطي + + + + Pin Light + بحاجة لمتابعة + ضوء الدبوس + + + + Hard Mix + بحاجة لمتابعة + دمج صلب + + + + Difference + فرق + + + + Exclusion + حصر + + + + Reflect + أنعكاس + + + + Substract + طرح + + + + Average + متوسط + + + + Glow + توهج + + + + Negation + نفي + + + + Phoenix + فينيكس + + + + Transition + + + Length: + الطول: + + + + VSTHost + + + + Error loading VST plugin + خطأ تحميل إضافة VST + + + + Failed to create VST reference + فشل إنشاء مرجع VST + + + + Failed to load VST plugin "%1": %2 + فشب تحميل إضافة VST "%1": %2 + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة VST 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + ملحوظة: لا يمكنك تحميل إضافة VST 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. + + + + VST Error + خطأ VST + + + + Plugin's magic number is invalid + رقم اﻹضافة السحري غير صالح + + + + Plugin + إضافة + + + + Interface + واجهة + + + + Show + أظهر + + + + VST Plugin + إضافة VST + + + + Viewer + + + Sequence Viewer + عارض المقطع + + + + Media Viewer + عارض الوسائط + + + + (none) + (لا شيء) + + + + ViewerWidget + + + Save Frame as Image... + احفظ اﻹطار كصورة... + + + + Show Fullscreen + أظهر ملء الشاشة + + + + Disable + تعطيل + + + + Screen %1: %2x%3 + الشاشة %1: %2x%3 + + + + Zoom + قرّب + + + + Fit + وائم + + + + Custom + مخصوص + + + + Close Media + أغلق الوسائط + + + + Save Frame + أحفظ اﻹطار + + + + Viewer Zoom + تقريب الرؤية + + + + Set Custom Zoom Value: + حدد قيمة تقريب مخصصة: + + + + ViewerWindow + + + Exit Fullscreen + الخروج من ملء الشاشة + + + + VoidEffect + + + (unknown) + (غير معلوم) + + + + Missing Effect + تأثير مفقود + + + + VolumeEffect + + + Volume + درجة الصوت + + + + transition + + + Invalid transition + أنتقال غير صالح + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + لا مرشح للأنتقال '%1'. هذه اﻷنتقالة قد تكون فاسدة. جرب إعادة تثبيتها أو زيتون. + + + From 39bf40c3d6c12b696bc581ce1ce1495fd31254fe Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 16:39:19 -0800 Subject: [PATCH 125/202] added arabic to project file --- olive.pro | 1 + ts/olive_ar.ts | 585 ++++++++++++++++++++++++++----------------------- 2 files changed, 313 insertions(+), 273 deletions(-) diff --git a/olive.pro b/olive.pro index 585b0fb40..df1ac6c08 100644 --- a/olive.pro +++ b/olive.pro @@ -254,6 +254,7 @@ TRANSLATIONS += \ ts/olive_fr.ts \ ts/olive_it.ts \ ts/olive_cs.ts \ + ts/olive_ar.ts \ ts/olive_ru.ts win32 { diff --git a/ts/olive_ar.ts b/ts/olive_ar.ts index 161d20bdc..25b34796c 100644 --- a/ts/olive_ar.ts +++ b/ts/olive_ar.ts @@ -22,6 +22,19 @@ ابحث عن إجراء... + + AdvancedVideoDialog + + + Advanced Video Settings + + + + + Pixel Format: + + + Audio @@ -240,42 +253,42 @@ المؤثرات: - + &Paste &لصق - + Add Video Effect أضف موثر فيديو - + VIDEO EFFECTS موثرات الفيديو - + Add Video Transition أضف أنتقالة فيديو - + Add Audio Effect أضف موثر صوت - + AUDIO EFFECTS موثرات الصوت - + Add Audio Transition أضف أنتقالة صوت - + (Multiple clips selected) (مقاطع عديدة محددة) @@ -304,77 +317,98 @@ ExportDialog - + Export "%1" صدّر "%1" - + + Unknown codec name %1 + + + + Export Failed فشل التصدير - + Export failed - %1 فشل تصدير - %1 - + Invalid dimensions أبعاد خاطئة - + Export width and height must both be even numbers/divisible by 2. تصدير العرض والطول يجب أن يكون عدد زوجي/قابل للقسمة ب 2. - + Invalid codec مرماز غير صالح - + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. لم يتم التعرف على خيارات الإخراج للمرماز المحدد. هذه علة, رجاءً تواصل مع المطورين. - + Invalid format صيغة غير صالحة - + Couldn't determine output format. This is a bug, please contact the developers. لم يتم التعرف على صيغة اﻹخراج. هذه علة, رجاءً تواصل مع المطورين. - + Export Media صدّر الوسائط - + Quality-based (Constant Rate Factor) (عامل النسبة الثابت) أعتماداً-بالجودة - + Constant Bitrate نسبة بت ثابتة + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + Bitrate (Mbps): نسبة البت (مب/ث): - + Quality (CRF): الجودة (CRF): - + Quality Factor: 0 = lossless @@ -389,68 +423,73 @@ 51 = أقل جودة ممكنة - + Target File Size (MB): حجم الملف الهدف (مب): - + Format: صيغة: - + Range: المدى: - + Entire Sequence كل المقطع - + In to Out الدخل إلى الخرج - + Video فيديو - - + + Codec: مرماز: - + Width: العرض: - + Height: الطول: - + Frame Rate: نسبة الإطارات: - + Compression Type: نوع الضغط: - + + Advanced + + + + Sampling Rate: معدل الإعتيان: - + Bitrate (Kbps/CBR): نسبة البت (Kbps/CBR): @@ -458,88 +497,88 @@ ExportThread - + failed to send frame to encoder (%1) فشل إرسال اﻹطار للمُرمز.(%1) - + failed to receive packet from encoder (%1) فشل إستلام الرزمة من المُرمز (%1) - + could not video encoder for %1 لم يجد مُرمز فيديو ل %1 - + could not allocate video stream لم يستطع تخصيص بث فيديو - + could not allocate video encoding context للمراجعة لم يستطع تخصيص سياق ترميز فيديو - + could not open output video encoder (%1) لم يتم فتح مرمّز مخرجات فيديو (%1) - + could not copy video encoder parameters to output stream (%1) لم يتم نسخ عوامل مرمّز الفيديو لبث المخرجات (%1) - + could not audio encoder for %1 لم يستطع ترميز فيديو ل %1 - + could not allocate audio stream لم يستطع تخصيص بث صوت - + could not allocate audio encoding context لم يستطع تخصيص سياق ترميز صوت - + could not open output audio encoder (%1) لم يتم فتح مرمّز مخرجات صوت (%1) - + could not copy audio encoder parameters to output stream (%1) لم يتم نسخ عوامل مرمّز الصوت لبث المخرجات (%1) - + could not allocate audio buffer (%1) لم يستطع تخصيص حافظة صوت (%1) - + could not create output format context لم يستطع إنشاء سياق صيغة الصوت - + could not open output file (%1) لم يستطع فتح ملف اﻹخراج (%1) - + could not write output file header (%1) لم يستطع كتابة مخرجات ترويسة الملف (%1) - + could not write output file trailer (%1) لم يستطع كتابة مخرجات ملحقة الملف (%1) @@ -660,17 +699,17 @@ KeyframeView - + Linear خطي - + Bezier بيزير - + Hold أمسك @@ -678,14 +717,14 @@ LabelSlider - - + + Set Value حدد القيمة - - + + New value: قيمة جديدة: @@ -764,681 +803,681 @@ MainWindow - + Welcome to %1 مرحباً في %1 - + Auto-recovery اﻷستعادة التلقائية - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ - + &Project &المشروع - + &Sequence &مقطع - + &Folder &مجلد - + Set In Point ضع في نقطة - + Set Out Point ضع خارج نقطة - + Reset In Point صفر في النقطة - + Reset Out Point صفّر النقطة - + Clear In/Out Point محو نقطة الدخل/الخرج - + No active sequence لا مقاطع نشطة - + Please open the sequence you wish to export. رجاءً أفتح المقطع المراد تصديره. - + Save Project As... أحفظ المشروع ك... - + Unsaved Project مشروع غير محفوظ - + This project has changed since it was last saved. Would you like to save it before closing? هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ - + &File &ملف - + &New &جديد - + &Open Project &أفتح مشروع - + Clear Recent List أفرغ قائمة مؤخراً - + Open Recent أفتح مؤخراً - + &Save Project &أحفظ المشروع - + Save Project &As أحفظ المشروع &ك - + &Import... &أستيراد - + &Export... &تصدير - + E&xit خ&روج - + &Edit &تعديل - + &Undo &تراجع - + Redo أعد - + Cu&t قط&ع - + Cop&y &نسخ - + &Paste &لصق - + Paste Insert ألصق أدرج - + Duplicate أستنساخ - + Delete حذف - + Ripple Delete حذف موجة - + Split أنقسام - + Select &All تحديد &الكل - + Deselect All إلغاء تحديد الكل - + Add Default Transition أضف اﻷنتقال الأفتراضي - + Link/Unlink ربط/فصل - + Enable/Disable تفعيل/تعطيل - + Nest للمراجعة تداخل - + Ripple to In Point موجة لنقطة إدخال - + Ripple to Out Point موجة لنقطة إخراج - + Edit to In Point عدّل لنقطة إدخال - + Edit to Out Point عدّل لنقطة إخراج - + Delete In/Out Point محو نقطة الدخل/الخرج - + Ripple Delete In/Out Point موجة حذف نقطة الإدخال/الإخراج - + Set/Edit Marker حدد/عدّل اﻹشارات - + &View &أظهر - + Zoom In تقريب - + Zoom Out أبتعاد - + Increase Track Height زدّ طول المسار - + Decrease Track Height قلل طول المسار - + Toggle Show All فعل إظهار الكل - + Track Lines تعقب السطور - + Rectified Waveforms أشكال موجية متناوبة - + Frames اﻹطارات - + Drop Frame أفلت إطار - + Non-Drop Frame إطار غير مُفلت - + Milliseconds جزء من الثانية - + Title/Action Safe Area عنوان/إجراء المنطقة الآمنة - + Off مطفئ - + Default إفتراضي - + 4:3 4:3 - + 16:9 16:9 - + Custom مخصوص - + Full Screen ملء الشاشة - + Full Screen Viewer عارض ملء الشاشة - + &Playback &الترديد - + Go to Start أذهب للبداية - + Previous Frame الإطار السابق - + Play/Pause تشغيل/أستئناف - + Play In to Out شغل من الإدخال إلى الإخراج - + Next Frame اﻹطار التالي - + Go to End أذهب للنهاية - + Go to Previous Cut أذهب للقطعة السابقة - + Go to Next Cut أذهب للقطعة التالية - + Go to In Point أذهب لنقطة إدخال - + Go to Out Point أذهب لنقطة إخراج - + Shuttle Left توشع اليسار - + Shuttle Stop إيقاف التوشع - + Shuttle Right توشع اليمين - + Loop حلقة - + &Window &نافذة - + Project المشروع - + Effect Controls تحكمات المؤثر - + Timeline الخط الزمني - + Graph Editor محرر المخطط - + Media Viewer عارض الوسائط - + Sequence Viewer عارض المقطع - + Maximize Panel ضخّم اللائحة - + Reset to Default Layout صفّر للتخطيط المبدئي - + &Tools &اﻷدوات - + Pointer Tool أداة المؤشر - + Edit Tool أداة التحرير - + Ripple Tool أداة الموجة - + Razor Tool أداة القطع - + Slip Tool أداة المنزلقة - + Slide Tool أداة الشريحة - + Hand Tool أداة اليد - + Transition Tool أداة اﻷنتقال - + Enable Snapping فعّل السحب - + Selecting Also Seeks للمراجعة تحديد العروضات إيضاً - + Edit Tool Also Seeks أداة التحرير تعرض إيضاً - + Edit Tool Selects Links أداة التحرير تحدد الروابط - + Seek Also Selects للمراجعة العرض يحدد إيضاً - + Seek to the End of Pastes أعرض لنهاية الملصوقات - + Scroll Wheel Zooms العجلة الدوراة تُقرّب - + Enable Drag Files to Timeline أسمح بسحب الملفات للخط الزمني - + Auto-Scale By Default التحجيم-التلقائي إفتراضياً - + Enable Seek to Import للمراجعة أسمح للعرض بالإستيراد - + Audio Scrubbing حكّ شريط الصوت - + Enable Drop on Media to Replace أسمح برمي الوسائط للأستبدال - + Enable Hover Focus فعّل التركيز الحائم - + Ask For Name When Setting Marker أسال عن اﻷسم حين وضع المؤشر - + No Auto-Scroll لا أنزلاق التلقائي - + Page Auto-Scroll أنزلاق الصفحة التلقائي - + Smooth Auto-Scroll الأنزلاق التلقائي الناعم - + Preferences التفضيلات - + Clear Undo أمسح التراجُعات - + &Help &مساعدة - + A&ction Search ب&حث إجراء - + Debug Log سجل التنقيح - + &About... &حول... - + <untitled> <غير معنون> - + Open Project... أفتح مشروع... - + Missing recent project مشروع ماضي ضائع - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ - + Invalid aspect ratio معدل نسبة غير صالح - + The aspect ratio '%1' is invalid. Please try again. معدل النسبة '%1' غير صالح. حاول مجدداً. - + Enter custom aspect ratio أدخل نسبة معدل مخصصة - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): - + Nested Sequence مقطع متشعب @@ -1815,79 +1854,79 @@ Audio Layout: %6 اللغة: - + Custom CSS: CSS مخصوص: - + Browse تصفّح - + Image sequence formats: صيغ صور المقاطع: - + Audio Recording: تسجيل الصوت: - + Mono اُحادي - + Stereo مُجسم - + Effect Textbox Lines: للمراجعة أثر بسطور صندوق النص: - + Thumbnail Resolution: دقّة الصورة المصغرة: - + Waveform Resolution: دقّة الشكل الموجي: - + Use Software Fallbacks When Possible أستعمل معالجة البرمجيات حين اﻹمكان - + General عام - + Behavior السلوك - + Disable Multithreading on Images عطل تعدد المعالجات بالصور - + Seeking للمراجعة التنزيل - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) للمراجعة @@ -1895,7 +1934,7 @@ Always show the correct frame (visual may pause briefly as correct frame is retr دوماً أظهر اﻹطار الصحيح (البصريات قد تتوقف بإيجاز كلما تستجلب اﻹطارات بدقة) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) للمراجعة الشديدة @@ -1903,101 +1942,101 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff أنقل بسرعة (قد يعمق روئية اﻹطارات غير الصحيحة - لا يؤثر الترديد/تصدير) - + Memory Usage أستعمال الذاكرة - + Upcoming Frame Queue: إطار الصف القادم: - - + + frames اﻹطارات - - + + seconds الثوان - + Previous Frame Queue: إطار الصف السابق: - + Playback للمراجعة الترديد - + Output Device: جهاز اﻹخراج: - - + + Default إفتراضي - + Input Device: جهاز اﻹدخال: - + Sample Rate: معدل الإعتيان: - + Audio الصوت - + Search for action or shortcut ابحث عن إجراء أو أختصار - + Action إجراء - + Shortcut أختصار - + Import أستيراد - + Export تصدير - + Reset Selected صفّر المحدد - + Reset All صفّر الجميع - + Keyboard لوحة المفاتيح @@ -2005,12 +2044,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 لا يمكن فتح الملف - %1 - + Could not find stream information - %1 لم يتم العثور على ملومات التدفق - %1 @@ -2470,24 +2509,20 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff SpeedDialog - Dialog - الحوار + الحوار - Speed: السرعة: - Frame Rate: معدل اﻹطارات: - Duration: المدة: @@ -2688,150 +2723,150 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Timeline - + Timeline: الخط الزمني: - + <none> <لا شيء> - + Effect already exists المؤثر موجود مسبقاً - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? المقطع '%1' يحتوي على المؤثر '%2'. هل تفضل أستبداله مع الملصوق أو إضافته كمؤثر منفصل؟ - + Add أضف - + Replace أستبدل - + Skip تخطى - + Do this for all conflicts found أفعل هذا مع كل التعارضات الموجودة - + Title... العنوان... - + Solid Color... بحاجة لمتابعة لون صلب... - + Bars... ألواح... - + Tone... نغّم... - + Noise... ضجيج... - + Unsaved Project مشروع غير محفوظ - + You must save this project before you can record audio in it. يجب عليك حفظ المشروع قبل تسجيل الصوت فيه. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) أنقر على الخط الزمني حيث تريد بدء التسجيل (أسحب لوضع حد للتسجيل في إطار وقت معين) - + Pointer Tool أداة المؤشر - + Edit Tool أداة التحرير - + Ripple Tool أداة الموجة - + Razor Tool أداة القطع - + Slip Tool بحاجة لمتابعة أداة المنزلقة - + Slide Tool أداة الشريحة - + Hand Tool أداة اليد - + Transition Tool أداة اﻷنتقال - + Snapping بحاجة لمتابعة الساحبة - + Zoom In تقريب - + Zoom Out أبتعاد - + Record audio سجّل الصوت - + Add title, solid, bars, etc. أضف عنوان, صلب, ألواح, إلخ. @@ -3166,9 +3201,13 @@ Duration: %4 Transition - Length: - الطول: + الطول: + + + + Length + @@ -3233,12 +3272,12 @@ Duration: %4 Viewer - + Sequence Viewer عارض المقطع - + Media Viewer عارض الوسائط From 7c3209adea0fb60a8222b4c7b0b6d30b916a0af5 Mon Sep 17 00:00:00 2001 From: naj59 Date: Sun, 10 Feb 2019 01:55:47 +0100 Subject: [PATCH 126/202] updated german translation --- ts/olive_de.ts | 109 +++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/ts/olive_de.ts b/ts/olive_de.ts index 7871c19b4..0da998680 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -27,7 +27,7 @@ Advanced Video Settings - + Erweiterte Video-Einstellungen @@ -202,54 +202,54 @@ Load Settings From File - + Einstellungen aus Datei laden Save Settings to File - + Einstellungen in Datei speichern Save Effect Settings - + Effekt-Einstellungen speichern Effect XML Settings %1 - + XML Effekt-Einstellungen %1 Save Settings Failed - + Speichern der Einstellungen fehlgeschlagen Failed to open "%1" for writing. - + Fehler beim Öffnen von "%1" Load Effect Settings - + Effekt-Einstellungen laden Load Settings Failed - + Laden von Einstellungen fehlgeschlagen Failed to open "%1" for reading. - + Fehler beim Öffnen von "%1" This settings file doesn't match this effect. - + Die Einstellungsdatei stimmt nicht mit diesem Effekt überein. @@ -331,7 +331,7 @@ Unknown codec name %1 - + Unbekannter Codec-Name %1 @@ -393,7 +393,7 @@ Invalid Codec - + Ungültiger Codec @@ -492,7 +492,7 @@ Advanced - + Erweitert @@ -864,7 +864,7 @@ Welcome to %1 - + Willkommen in %1 @@ -1172,12 +1172,13 @@ Full Screen - Vollbild + Vollbild Full Screen Viewer - + Does this make sense? + Vollbild-Viewer @@ -1310,7 +1311,7 @@ Maximize Panel - + Panel maximieren @@ -1805,7 +1806,7 @@ Audio Layout: %6 Name: - Name: + Name: @@ -1821,7 +1822,7 @@ Audio Layout: %6 Generating Proxy: %1% - + Proxy wird generiert: %1% @@ -1905,7 +1906,7 @@ Audio Layout: %6 Language: - + Sprache: @@ -1947,7 +1948,7 @@ Audio Layout: %6 Thumbnail Resolution: - + Thumbnail-Auflösung: @@ -2029,18 +2030,18 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Output Device: - + Ausgabegerät: Default - Standard + Standard Input Device: - + Eingabegerät: @@ -2206,22 +2207,23 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Create Proxy - + Proxy erstellen Proxy - + Same as in english + Proxy Dimensions: - + Dimensionen: Same Size as Source - + Selbe Größe wie Quelle @@ -2246,12 +2248,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Format: - Format: + Format: ProRes HQ - + ProRes HQ @@ -2261,17 +2263,17 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Same as Source (in "%1" folder) - + Genau wie Quelle (in Ordner "%1") Proxy file exists - + Proxy-Datei existiert bereits The file "%1" already exists. Do you wish to replace it? - + Die Datei "%1" existiert bereits. Möchten Sie sie ersetzen? @@ -2284,7 +2286,7 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Finished generating proxy for "%1" - + Proxy-Generierung für "%1" wurde abgeschlossen @@ -2503,32 +2505,32 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Proxy - + Proxy Generating proxy: %1% complete - + Proxy wird generiert: %1% fertig Create/Modify Proxy - + Erstelle/Modifiziere Proxy Create Proxy - + Proxy erstellen Modify Proxy - + Proxy modifizieren Restore Original - + Original wiederherstellen @@ -2553,12 +2555,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Delete proxy - + Proxy löschen Would you like to delete the proxy file "%1" as well? - + Möchten Sie die Proxy-Datei "%1" ebenfalls löschen? @@ -2951,37 +2953,38 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf C&ut - + &Ausschneiden Cop&y - &Kopieren + &Kopieren &Paste - &Einfügen + &Einfügen R&ipple Delete - + Taken from Premiere + R&ipple Delete Sequence Settings - + Sequenz-Einstellungen &Speed/Duration - + &Geschwindigkeit/Dauer Auto-s&cale - + Auto-&Skalierung @@ -2996,12 +2999,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf &Reveal in Project - + &Im Projekt anzeigen R&ename - + U&mbenennen @@ -3268,7 +3271,7 @@ Dauer: %4 Length - + Länge From 760c8232c6c7e5384295de7a426b1779b5880d77 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 17:45:18 -0800 Subject: [PATCH 127/202] fixed #422 --- dialogs/mediapropertiesdialog.cpp | 5 +++-- project/media.cpp | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dialogs/mediapropertiesdialog.cpp b/dialogs/mediapropertiesdialog.cpp index a2cf5fc67..1b10f9e37 100644 --- a/dialogs/mediapropertiesdialog.cpp +++ b/dialogs/mediapropertiesdialog.cpp @@ -53,10 +53,11 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : for (int i=0;iaudio_tracks.size();i++) { const FootageStream& fs = f->audio_tracks.at(i); QListWidgetItem* item = new QListWidgetItem( - tr("Audio %1: %2Hz %3 channels").arg( + tr("Audio %1: %2Hz %3 %4").arg( QString::number(fs.file_index), QString::number(fs.audio_frequency), - QString::number(fs.audio_channels) + QString::number(fs.audio_channels), + tr("channel(s)", "", fs.audio_channels) ), track_list ); diff --git a/project/media.cpp b/project/media.cpp index 77b9f0c72..c17ccd9dc 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -8,8 +8,8 @@ #include "panels/project.h" #include "projectmodel.h" -#include #include +#include #include "debug.h" @@ -117,9 +117,12 @@ void Media::update_tooltip(const QString& error) { if (f->video_tracks.at(i).video_interlacing == VIDEO_PROGRESSIVE) { tooltip += QString::number(f->video_tracks.at(i).video_frame_rate * f->speed); } else { - tooltip += QCoreApplication::translate("Media", "%1 fields (%2 frames)").arg( - QString::number(f->video_tracks.at(i).video_frame_rate * f->speed * 2), - QString::number(f->video_tracks.at(i).video_frame_rate * f->speed) + double adjusted_rate = f->video_tracks.at(i).video_frame_rate * f->speed; + tooltip += QString("%1 %2 (%3 %4)").arg( + QString::number(adjusted_rate * 2), + QCoreApplication::translate("Media", "field(s)", "", qCeil(adjusted_rate * 2)), + QString::number(adjusted_rate), + QCoreApplication::translate("Media", "frame(s)", "", qCeil(adjusted_rate)) ); } } From 121b4f52ea7a343c969a6e733cb2ac91fcbce88d Mon Sep 17 00:00:00 2001 From: alexmitchell Date: Sun, 10 Feb 2019 15:27:48 +1030 Subject: [PATCH 128/202] Add "yes to all" to proxydialog.cpp change --- dialogs/proxydialog.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index 5e646abd7..9f85b09d8 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -70,6 +70,7 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : void ProxyDialog::accept() { QVector info_list; + bool yesForAll = false; for (int i=0;iproxy = true; From ca4e39449b0222f3e6194e50ce3e2d7433fd0b62 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 22:09:42 -0800 Subject: [PATCH 129/202] made volume effect use decibels --- dialogs/mediapropertiesdialog.cpp | 7 +- effects/internal/audionoiseeffect.h | 1 + effects/internal/fillleftrighteffect.h | 1 + effects/internal/paneffect.h | 1 + effects/internal/toneeffect.h | 1 + effects/internal/voideffect.h | 1 + effects/internal/volumeeffect.cpp | 12 ++-- effects/internal/volumeeffect.h | 1 + io/math.cpp | 8 +++ io/math.h | 4 ++ io/proxygenerator.h | 4 +- project/media.cpp | 11 ++-- ui/labelslider.cpp | 89 ++++++++++++++++++++++---- ui/labelslider.h | 9 ++- 14 files changed, 117 insertions(+), 33 deletions(-) diff --git a/dialogs/mediapropertiesdialog.cpp b/dialogs/mediapropertiesdialog.cpp index 1b10f9e37..992513654 100644 --- a/dialogs/mediapropertiesdialog.cpp +++ b/dialogs/mediapropertiesdialog.cpp @@ -51,13 +51,12 @@ MediaPropertiesDialog::MediaPropertiesDialog(QWidget *parent, Media *i) : track_list->addItem(item); } for (int i=0;iaudio_tracks.size();i++) { - const FootageStream& fs = f->audio_tracks.at(i); + const FootageStream& fs = f->audio_tracks.at(i); QListWidgetItem* item = new QListWidgetItem( - tr("Audio %1: %2Hz %3 %4").arg( + tr("Audio %1: %2Hz %3").arg( QString::number(fs.file_index), QString::number(fs.audio_frequency), - QString::number(fs.audio_channels), - tr("channel(s)", "", fs.audio_channels) + tr("%n channel(s)", "", fs.audio_channels) ), track_list ); diff --git a/effects/internal/audionoiseeffect.h b/effects/internal/audionoiseeffect.h index fa1643290..0a1103fae 100644 --- a/effects/internal/audionoiseeffect.h +++ b/effects/internal/audionoiseeffect.h @@ -4,6 +4,7 @@ #include "project/effect.h" class AudioNoiseEffect : public Effect { + Q_OBJECT public: AudioNoiseEffect(Clip* c, const EffectMeta* em); void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count); diff --git a/effects/internal/fillleftrighteffect.h b/effects/internal/fillleftrighteffect.h index 3b3390d2e..e8e538c6a 100644 --- a/effects/internal/fillleftrighteffect.h +++ b/effects/internal/fillleftrighteffect.h @@ -4,6 +4,7 @@ #include "project/effect.h" class FillLeftRightEffect : public Effect { + Q_OBJECT public: FillLeftRightEffect(Clip* c, const EffectMeta* em); void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count); diff --git a/effects/internal/paneffect.h b/effects/internal/paneffect.h index b4f7e8b9c..8d8fb857f 100644 --- a/effects/internal/paneffect.h +++ b/effects/internal/paneffect.h @@ -4,6 +4,7 @@ #include "project/effect.h" class PanEffect : public Effect { + Q_OBJECT public: PanEffect(Clip* c, const EffectMeta* em); void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count); diff --git a/effects/internal/toneeffect.h b/effects/internal/toneeffect.h index 4ad7492f4..43844595d 100644 --- a/effects/internal/toneeffect.h +++ b/effects/internal/toneeffect.h @@ -4,6 +4,7 @@ #include "project/effect.h" class ToneEffect : public Effect { + Q_OBJECT public: ToneEffect(Clip *c, const EffectMeta* em); void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count); diff --git a/effects/internal/voideffect.h b/effects/internal/voideffect.h index 0376b6a73..6dd255c4d 100644 --- a/effects/internal/voideffect.h +++ b/effects/internal/voideffect.h @@ -10,6 +10,7 @@ #include "project/effect.h" class VoidEffect : public Effect { + Q_OBJECT public: VoidEffect(Clip* c, const QString& n); diff --git a/effects/internal/volumeeffect.cpp b/effects/internal/volumeeffect.cpp index 997d9a2e6..7b1824e7b 100644 --- a/effects/internal/volumeeffect.cpp +++ b/effects/internal/volumeeffect.cpp @@ -10,20 +10,20 @@ VolumeEffect::VolumeEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { EffectRow* volume_row = add_row(tr("Volume")); - volume_val = volume_row->add_field(EFFECT_FIELD_DOUBLE, "volume"); - volume_val->set_double_minimum_value(0); + volume_val = volume_row->add_field(EFFECT_FIELD_DOUBLE, "volume"); // set defaults - volume_val->set_double_default_value(100); + volume_val->set_double_default_value(1); + static_cast(volume_val->get_ui_element())->set_display_type(LABELSLIDER_DECIBEL); } void VolumeEffect::process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int) { double interval = (timecode_end-timecode_start)/nb_bytes; for (int i=0;iget_double_value(timecode_start+(interval*i), true)*0.01); + double vol_val = log_volume(volume_val->get_double_value(timecode_start+(interval*i), true)); - qint32 right_samp = (qint16) (((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); - qint32 left_samp = (qint16) (((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); + qint32 right_samp = qint16(((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); + qint32 left_samp = qint16(((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); left_samp *= vol_val; right_samp *= vol_val; diff --git a/effects/internal/volumeeffect.h b/effects/internal/volumeeffect.h index 870f008a9..4ae7b8e9f 100644 --- a/effects/internal/volumeeffect.h +++ b/effects/internal/volumeeffect.h @@ -4,6 +4,7 @@ #include "project/effect.h" class VolumeEffect : public Effect { + Q_OBJECT public: VolumeEffect(Clip* c, const EffectMeta* em); void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count); diff --git a/io/math.cpp b/io/math.cpp index 4d71229a4..32e03f6e8 100644 --- a/io/math.cpp +++ b/io/math.cpp @@ -52,3 +52,11 @@ double cubic_t_from_x(double x_target, double a, double b, double c, double d) { return percent; } + +double amplitude_to_db(double amplitude) { + return (20.0*(qLn(amplitude)/qLn(10.0))); +} + +double db_to_amplitude(double db) { + return qPow(M_E, (db*qLn(10.0))/20.0); +} diff --git a/io/math.h b/io/math.h index ba1e7ed9e..a4f2adb4c 100644 --- a/io/math.h +++ b/io/math.h @@ -10,4 +10,8 @@ double cubic_from_t(double a, double b, double c, double d, double t); double cubic_t_from_x(double x_target, double a, double b, double c, double d); double solveCubicBezier(double p0, double p1, double p2, double p3, double x); +// decibel conversion functions +double amplitude_to_db(double amplitude); +double db_to_amplitude(double db); + #endif // MATH_H diff --git a/io/proxygenerator.h b/io/proxygenerator.h index b6bcaf294..357d9c66c 100644 --- a/io/proxygenerator.h +++ b/io/proxygenerator.h @@ -15,8 +15,8 @@ struct ProxyInfo { QString path; }; -class ProxyGenerator : public QThread -{ +class ProxyGenerator : public QThread { + Q_OBJECT public: ProxyGenerator(); void run(); diff --git a/project/media.cpp b/project/media.cpp index c17ccd9dc..66456095e 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -118,12 +118,11 @@ void Media::update_tooltip(const QString& error) { tooltip += QString::number(f->video_tracks.at(i).video_frame_rate * f->speed); } else { double adjusted_rate = f->video_tracks.at(i).video_frame_rate * f->speed; - tooltip += QString("%1 %2 (%3 %4)").arg( - QString::number(adjusted_rate * 2), - QCoreApplication::translate("Media", "field(s)", "", qCeil(adjusted_rate * 2)), - QString::number(adjusted_rate), - QCoreApplication::translate("Media", "frame(s)", "", qCeil(adjusted_rate)) - ); + + tooltip += QCoreApplication::translate("Media", "%1 field(s) (%2 frame(s))").arg( + QString::number(adjusted_rate*2.0), + QString::number(adjusted_rate) + ); } } tooltip += "\n"; diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index 92d909242..401ef8433 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -3,6 +3,7 @@ #include "project/undo.h" #include "panels/viewer.h" #include "io/config.h" +#include "io/math.h" #include "debug.h" #include @@ -38,7 +39,7 @@ void LabelSlider::set_display_type(int type) { void LabelSlider::set_value(double v, bool userSet) { set = true; - if (v != internal_value) { + if (!qFuzzyCompare(v, internal_value)) { if (min_enabled && v < min_value) { internal_value = min_value; } else if (max_enabled && v > max_value) { @@ -65,8 +66,27 @@ QString LabelSlider::valueToString(double v) { return "---"; } else { switch (display_type) { - case LABELSLIDER_FRAMENUMBER: return frame_to_timecode(v, config.timecode_view, frame_rate); - case LABELSLIDER_PERCENT: return QString::number((v*100), 'f', decimal_places) + "%"; + case LABELSLIDER_FRAMENUMBER: + return frame_to_timecode(long(v), config.timecode_view, frame_rate); + case LABELSLIDER_PERCENT: + return QString::number((v*100), 'f', decimal_places).append("%"); + case LABELSLIDER_DECIBEL: + { + QString db_str; + + // -96 dB is considered -infinity + if (amplitude_to_db(v) <= -96) { + // hex sequence for -infinity + db_str = "-\xE2\x88\x9E"; + } else { + db_str = QString::number(amplitude_to_db(v), 'f', decimal_places); + } + + // add "dB" suffix + db_str.append(" dB"); + + return db_str; + } } return QString::number(v, 'f', decimal_places); } @@ -118,7 +138,8 @@ void LabelSlider::mousePressEvent(QMouseEvent *ev) { if (ev->modifiers() & Qt::AltModifier) { // if the value is not already default, and there is a default to set - if (internal_value != default_value && !qIsNaN(default_value)) { + if (!qFuzzyCompare(internal_value, default_value) + && !qIsNaN(default_value)) { // cache current value set_previous_value(); @@ -166,11 +187,28 @@ void LabelSlider::mouseMoveEvent(QMouseEvent* event) { // ctrl + drag drags in smaller increments if (event->modifiers() & Qt::ControlModifier) diff *= 0.01; - // we'll also need to drag in smaller increments for a percent value - if (display_type == LABELSLIDER_PERCENT) diff *= 0.01; + if (display_type == LABELSLIDER_PERCENT) { + // we'll also need to drag in smaller increments for a percent value - // sets the value - set_value(internal_value + diff, true); + diff *= 0.01; + } + + // determine what the new value will be + double new_value; + + if (display_type == LABELSLIDER_DECIBEL) { + // we move in terms of dB for decibel display + + new_value = db_to_amplitude(amplitude_to_db(internal_value) + diff); + + } else { + // for most display types, just add the mouse difference + + new_value = internal_value + diff; + } + + // set internal value + set_value(new_value, true); // keep the cursor in the same location while dragging cursor().setPos(drag_start_x, drag_start_y); @@ -222,23 +260,50 @@ void LabelSlider::mouseReleaseEvent(QMouseEvent*) { // ask the user to enter a normal number value bool ok; + // value to show + double shown_value = internal_value; + if (display_type == LABELSLIDER_PERCENT) { + shown_value *= 100; + } else if (display_type == LABELSLIDER_DECIBEL) { + shown_value = amplitude_to_db(shown_value); + } + + // set correct minimum value + double shown_minimum_value; + if (min_enabled) { + // if this field has a minimum value set, use it + shown_minimum_value = min_value; + } else if (display_type == LABELSLIDER_DECIBEL) { + // minimum decibel amount is -96db + shown_minimum_value = -96; + } else { + // lowest possible minimum integer + shown_minimum_value = INT_MIN; + } + // percentages are stored 0.0 - 1.0 but displayed as 0% - 100% d = QInputDialog::getDouble( this, tr("Set Value"), tr("New value:"), - (display_type == LABELSLIDER_PERCENT) ? internal_value * 100 : internal_value, - (min_enabled) ? min_value : INT_MIN, + shown_value, + shown_minimum_value, (max_enabled) ? max_value : INT_MAX, decimal_places, &ok ); if (!ok) return; - if (display_type == LABELSLIDER_PERCENT) d *= 0.01; + + // convert shown value back to internal value + if (display_type == LABELSLIDER_PERCENT) { + d *= 0.01; + } else if (display_type == LABELSLIDER_DECIBEL) { + d = db_to_amplitude(d); + } } // if the value actually changed, trigger a change event - if (d != internal_value) { + if (!qFuzzyCompare(d, internal_value)) { set_previous_value(); set_value(d, true); } diff --git a/ui/labelslider.h b/ui/labelslider.h index 87e42fa4c..408217fd1 100644 --- a/ui/labelslider.h +++ b/ui/labelslider.h @@ -4,9 +4,12 @@ #include #include -#define LABELSLIDER_NORMAL 0 -#define LABELSLIDER_FRAMENUMBER 1 -#define LABELSLIDER_PERCENT 2 +enum LabelSliderDisplayType { + LABELSLIDER_NORMAL, + LABELSLIDER_FRAMENUMBER, + LABELSLIDER_PERCENT, + LABELSLIDER_DECIBEL +}; class LabelSlider : public QLabel { From bfb3f28b484ec3b407fc0923531ed9674ab0460d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 22:47:18 -0800 Subject: [PATCH 130/202] enforce absolute path if matching by absolute path --- io/loadthread.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 24825bcb4..281841763 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -218,6 +218,7 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { qInfo() << "Failed to match" << attr.value().toString() << "to file"; } } else { + f->url = QFileInfo(f->url).absoluteFilePath(); qInfo() << "Matched" << attr.value().toString() << "with absolute path"; } } else if (attr.name() == "duration") { From c435d6da176b0723b133b5c8f8c62ba684888aff Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 23:24:43 -0800 Subject: [PATCH 131/202] added third method of matching footage files --- io/loadthread.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 281841763..4422353fb 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -201,15 +201,25 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { f->url = attr.value().toString(); if (!QFileInfo::exists(f->url)) { // if path is not absolute + // tries to locate file using a file path relative to the project's current folder QString proj_dir_test = proj_dir.absoluteFilePath(f->url); + + // tries to locate file using a file path relative to the folder the project was saved in + // (unaffected by moving the project file) QString internal_proj_dir_test = internal_proj_dir.absoluteFilePath(f->url); + // tries to locate file using the file name directly in the project's current folder + QString proj_dir_direct_test = proj_dir.filePath(QFileInfo(f->url).fileName()); + if (QFileInfo::exists(proj_dir_test)) { // if path is relative to the project's current dir f->url = proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's current directory"; } else if (QFileInfo::exists(internal_proj_dir_test)) { // if path is relative to the last directory the project was saved in f->url = internal_proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's internal directory"; + } else if (QFileInfo::exists(proj_dir_direct_test)) + f->url = proj_dir_direct_test; + qInfo() << "Matched" << attr.value().toString() << "directly to project's current directory"; } else if (f->url.contains('%')) { // hack for image sequences (qt won't be able to find the URL with %, but ffmpeg may) f->url = internal_proj_dir_test; From 559509cdb01db44a20e83377c6cf616775fe0b33 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 23:26:46 -0800 Subject: [PATCH 132/202] slightly better formatting --- io/loadthread.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 4422353fb..290a26197 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -211,21 +211,31 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { // tries to locate file using the file name directly in the project's current folder QString proj_dir_direct_test = proj_dir.filePath(QFileInfo(f->url).fileName()); - if (QFileInfo::exists(proj_dir_test)) { // if path is relative to the project's current dir + if (QFileInfo::exists(proj_dir_test)) { + f->url = proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's current directory"; - } else if (QFileInfo::exists(internal_proj_dir_test)) { // if path is relative to the last directory the project was saved in + + } else if (QFileInfo::exists(internal_proj_dir_test)) { + f->url = internal_proj_dir_test; qInfo() << "Matched" << attr.value().toString() << "relative to project's internal directory"; - } else if (QFileInfo::exists(proj_dir_direct_test)) + + } else if (QFileInfo::exists(proj_dir_direct_test)) { + f->url = proj_dir_direct_test; qInfo() << "Matched" << attr.value().toString() << "directly to project's current directory"; + } else if (f->url.contains('%')) { + // hack for image sequences (qt won't be able to find the URL with %, but ffmpeg may) - f->url = internal_proj_dir_test; + f->url = internal_proj_dir_test; qInfo() << "Guess image sequence" << attr.value().toString() << "path to project's internal directory"; + } else { + qInfo() << "Failed to match" << attr.value().toString() << "to file"; + } } else { f->url = QFileInfo(f->url).absoluteFilePath(); From e30ad3d928d3d501b0d512d2450a5e3926a4919e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 23:37:51 -0800 Subject: [PATCH 133/202] updated ffmpeg in travis yaml --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 26f5e8c42..32fcb5ebe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ matrix: before_install: - sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y - - sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y + - sudo add-apt-repository ppa:jonathonf/ffmpeg-4 -y - sudo apt-get update -qq install: From 7f8b0bc207de28d876ea188dbe880a5b0c7b683c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 23:48:20 -0800 Subject: [PATCH 134/202] travis update --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 32fcb5ebe..7acd9589b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,8 +14,8 @@ before_install: - sudo apt-get update -qq install: - - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi - - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi + - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavcodec58 libavfilter7 libavformat58 libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi + - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavcodec58:i386 libavfilter7:i386 libavformat58:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi - source /opt/qt*/bin/qt*-env.sh script: From 5661473dec7b85031c8dd9ea1321fe23f60b3044 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 9 Feb 2019 23:58:44 -0800 Subject: [PATCH 135/202] reverted to previous ffmpeg for travis --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7acd9589b..26f5e8c42 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,12 +10,12 @@ matrix: before_install: - sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y - - sudo add-apt-repository ppa:jonathonf/ffmpeg-4 -y + - sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y - sudo apt-get update -qq install: - - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavcodec58 libavfilter7 libavformat58 libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi - - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavcodec58:i386 libavfilter7:i386 libavformat58:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi + - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi + - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi - source /opt/qt*/bin/qt*-env.sh script: From fc344d994822ba4b11aadcf0f4b38f7aec941b80 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 01:40:48 -0800 Subject: [PATCH 136/202] reveal in project selects entire row instead of one cell --- panels/project.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/panels/project.cpp b/panels/project.cpp index 2180f6472..bc4f22bd1 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -831,7 +831,12 @@ bool Project::reveal_media(Media *media, QModelIndex parent) { } // select item - tree_view->selectionModel()->select(sorted_index, QItemSelectionModel::Select); + QItemSelection row_select( + sorter->index(sorted_index.row(), 0, sorted_index.parent()), + sorter->index(sorted_index.row(), sorter->columnCount()-1, sorted_index.parent()) + ); + + tree_view->selectionModel()->select(row_select, QItemSelectionModel::Select); } else if (config.project_view_type == PROJECT_VIEW_ICON) { icon_view->setRootIndex(hierarchy); icon_view->selectionModel()->select(sorted_index, QItemSelectionModel::Select); From 12487a0cb3994448f0a995cefa1cf91d5678dbfc Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 02:49:10 -0800 Subject: [PATCH 137/202] don't use logarithmic algorithm for db volume --- effects/internal/volumeeffect.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/effects/internal/volumeeffect.cpp b/effects/internal/volumeeffect.cpp index 7b1824e7b..ec943c13d 100644 --- a/effects/internal/volumeeffect.cpp +++ b/effects/internal/volumeeffect.cpp @@ -20,7 +20,8 @@ VolumeEffect::VolumeEffect(Clip* c, const EffectMeta *em) : Effect(c, em) { void VolumeEffect::process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int) { double interval = (timecode_end-timecode_start)/nb_bytes; for (int i=0;iget_double_value(timecode_start+(interval*i), true)); +// double vol_val = log_volume(volume_val->get_double_value(timecode_start+(interval*i), true)); + double vol_val = volume_val->get_double_value(timecode_start+(interval*i), true); qint32 right_samp = qint16(((samples[i+3] & 0xFF) << 8) | (samples[i+2] & 0xFF)); qint32 left_samp = qint16(((samples[i+1] & 0xFF) << 8) | (samples[i] & 0xFF)); From 85325cd7d311a83308f04cd668b713ba77e496e1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 03:07:52 -0800 Subject: [PATCH 138/202] switched to opengl widget and made shortcuts application context, fixes #400 --- dialogs/preferencesdialog.cpp | 1 + main.cpp | 2 ++ mainwindow.cpp | 5 ++-- panels/viewer.cpp | 15 +++++----- ui/viewerwidget.cpp | 54 +++++++++-------------------------- ui/viewerwindow.cpp | 33 +++++++++++---------- ui/viewerwindow.h | 19 ++++++------ 7 files changed, 57 insertions(+), 72 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 68e5bfc88..df686be31 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -37,6 +37,7 @@ KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) void KeySequenceEditor::set_action_shortcut() { action->setShortcut(keySequence()); + action->setShortcutContext(Qt::ApplicationShortcut); } void KeySequenceEditor::reset_to_default() { diff --git a/main.cpp b/main.cpp index bae67df3e..1dd61ea02 100644 --- a/main.cpp +++ b/main.cpp @@ -86,6 +86,8 @@ int main(int argc, char *argv[]) { av_register_all(); avfilter_register_all(); + QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); + QApplication a(argc, argv); a.setWindowIcon(QIcon(":/icons/olive64.png")); diff --git a/mainwindow.cpp b/mainwindow.cpp index 898e8d70d..906e79132 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -321,10 +321,11 @@ void kbd_shortcut_processor(QByteArray& file, QMenu* menu, bool save, bool first } QKeySequence ks(shortcut); if (!ks.isEmpty()) { - a->setShortcut(ks); + a->setShortcut(ks); } } } + a->setShortcutContext(Qt::ApplicationShortcut); } } } @@ -972,7 +973,7 @@ void MainWindow::setup_menus() { tools_menu->addSeparator(); - tools_menu->addAction(tr("Preferences"), this, SLOT(preferences()), QKeySequence("Ctrl+."))->setProperty("id", "prefs"); + tools_menu->addAction(tr("Preferences"), this, SLOT(preferences()), QKeySequence("Ctrl+,"))->setProperty("id", "prefs"); #ifdef QT_DEBUG tools_menu->addAction(tr("Clear Undo"), this, SLOT(clear_undo_stack()))->setProperty("id", "clearundo"); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index bf87e208a..d2bcbd592 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -363,17 +363,18 @@ void Viewer::play(bool in_to_out) { uncue_recording(); } + if (playback_speed == 0) { + playback_speed = 1; + } + bool seek_to_in = (seq->using_workarea && (config.loop || playing_in_to_out)); if (!is_recording_cued() + && playback_speed > 0 && (playing_in_to_out - || seq->playhead >= seq->getEndFrame() + || seq->playhead >= seq->getEndFrame() || (seek_to_in && seq->playhead >= seq->workarea_out))) { seek(seek_to_in ? seq->workarea_in : 0); - } - - if (playback_speed == 0) { - playback_speed = 1; - } + } reset_all_audio(); if (is_recording_cued() && !start_recording()) { @@ -781,7 +782,7 @@ void Viewer::timer_update() { if (recording_start != recording_end && seq->playhead >= recording_end) { pause(); } - } else { + } else if (playback_speed > 0) { if (seq->playhead >= seq->getEndFrame()) { pause(); } diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 3ad4bfe46..033a845e5 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -55,8 +55,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) : waveform_scroll(0), dragging(false), gizmos(nullptr), - selected_gizmo(nullptr), - window(nullptr), + selected_gizmo(nullptr), x_scroll(0), y_scroll(0) { @@ -74,13 +73,11 @@ ViewerWidget::ViewerWidget(QWidget *parent) : renderer->start(QThread::HighPriority); connect(renderer, SIGNAL(ready()), this, SLOT(queue_repaint())); connect(renderer, SIGNAL(finished()), renderer, SLOT(deleteLater())); + + window = new ViewerWindow(this); } ViewerWidget::~ViewerWidget() { - if (window != nullptr) { - window->close(); - delete window; - } renderer->cancel(); delete renderer; } @@ -100,10 +97,7 @@ void ViewerWidget::set_fullscreen(int screen) { if (screen >= 0 && screen < QGuiApplication::screens().size()) { QScreen* selected_screen = QGuiApplication::screens().at(screen); window->showFullScreen(); - window->setGeometry(selected_screen->geometry()); - - // HACK: window seems to show with distorted texture on first showing, so we queue an update after it's shown - QTimer::singleShot(100, window, SLOT(update())); + window->setGeometry(selected_screen->geometry()); } else { qCritical() << "Failed to find requested screen" << screen << "to set fullscreen to"; } @@ -119,7 +113,7 @@ void ViewerWidget::show_context_menu() { connect(show_fullscreen_action, SIGNAL(triggered()), this, SLOT(show_fullscreen()));*/ QMenu* fullscreen_menu = menu.addMenu(tr("Show Fullscreen")); QList screens = QGuiApplication::screens(); - if (window != nullptr && window->isVisible()) { + if (window->isVisible()) { fullscreen_menu->addAction(tr("Disable")); } for (int i=0;idata().isNull()) { - window->hide(); - } else { - set_fullscreen(action->data().toInt()); - } - } + if (action->data().isNull()) { + window->hide(); + } else { + set_fullscreen(action->data().toInt()); + } } void ViewerWidget::set_fit_zoom() { @@ -222,9 +212,7 @@ void ViewerWidget::retry() { void ViewerWidget::initializeGL() { initializeOpenGLFunctions(); - connect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(context_destroy()), Qt::DirectConnection); - - window = new ViewerWindow(context()); + connect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(context_destroy()), Qt::DirectConnection); } void ViewerWidget::frame_update() { @@ -254,16 +242,6 @@ void ViewerWidget::set_scroll(double x, double y) { update(); } -//void ViewerWidget::resizeGL(int w, int h) -//{ -//} - -/*void ViewerWidget::paintEvent(QPaintEvent *e) { - if (!rendering) { - QOpenGLWidget::paintEvent(e); - } -}*/ - void ViewerWidget::seek_from_click(int x) { viewer->seek(getFrameFromScreenPoint(waveform_zoom, x+waveform_scroll)); } @@ -272,11 +250,7 @@ void ViewerWidget::context_destroy() { makeCurrent(); if (viewer->seq != nullptr) { closeActiveClips(viewer->seq); - } - if (window != nullptr) { - delete window; - } - //QMetaObject::invokeMethod(renderer, "delete_ctx", Qt::QueuedConnection); + } renderer->delete_ctx(); doneCurrent(); } @@ -405,7 +379,7 @@ void ViewerWidget::wheelEvent(QWheelEvent *event) { } void ViewerWidget::close_window() { - if (window != nullptr) window->hide(); + window->hide(); } void ViewerWidget::draw_waveform_func() { @@ -629,7 +603,7 @@ void ViewerWidget::paintGL() { glDisable(GL_TEXTURE_2D); - if (window != nullptr && window->isVisible()) { + if (window->isVisible()) { window->set_texture(renderer->front_texture, double(viewer->seq->width)/double(viewer->seq->height), &renderer->mutex); } diff --git a/ui/viewerwindow.cpp b/ui/viewerwindow.cpp index ca4b47c41..317c8983a 100644 --- a/ui/viewerwindow.cpp +++ b/ui/viewerwindow.cpp @@ -5,28 +5,31 @@ #include #include #include +#include +#include +#include #include #include "mainwindow.h" -ViewerWindow::ViewerWindow(QOpenGLContext *share) : - QOpenGLWindow(share), +ViewerWindow::ViewerWindow(QWidget *parent) : + QOpenGLWidget(parent, Qt::Window), texture(0), - mutex(nullptr), + mutex(nullptr), show_fullscreen_msg(false) { - fullscreen_msg_timer.setInterval(2000); - connect(&fullscreen_msg_timer, SIGNAL(timeout()), this, SLOT(fullscreen_msg_timeout())); + setMouseTracking(true); - installEventFilter(mainWindow); + fullscreen_msg_timer.setInterval(2000); + connect(&fullscreen_msg_timer, SIGNAL(timeout()), this, SLOT(fullscreen_msg_timeout())); } void ViewerWindow::set_texture(GLuint t, double iar, QMutex* imutex) { texture = t; ar = iar; mutex = imutex; - update(); + update(); } void ViewerWindow::keyPressEvent(QKeyEvent *e) { @@ -46,14 +49,14 @@ void ViewerWindow::mouseMoveEvent(QMouseEvent *) { if (!show_fullscreen_msg) { show_fullscreen_msg = true; update(); - } + } } void ViewerWindow::paintGL() { if (texture > 0) { if (mutex != nullptr) mutex->lock(); - glClearColor(0.0, 0.0, 0.0, 1.0); + glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); @@ -63,7 +66,7 @@ void ViewerWindow::paintGL() { glLoadIdentity(); glOrtho(0, 1, 0, 1, -1, 1); - glBegin(GL_QUADS); + glBegin(GL_QUADS); double top = 0; double left = 0; @@ -85,17 +88,17 @@ void ViewerWindow::paintGL() { glVertex2d(left, top); glTexCoord2d(0, 0); glVertex2d(left, bottom); - glTexCoord2d(1, 0); + glTexCoord2d(1, 0); glVertex2d(right, bottom); - glTexCoord2d(1, 1); + glTexCoord2d(1, 1); glVertex2d(right, top); - glTexCoord2d(0, 1); + glTexCoord2d(0, 1); glEnd(); glBindTexture(GL_TEXTURE_2D, 0); - glDisable(GL_TEXTURE_2D); + glDisable(GL_TEXTURE_2D); if (mutex != nullptr) mutex->unlock(); } @@ -128,7 +131,7 @@ void ViewerWindow::paintGL() { p.drawRect(fullscreen_msg_rect); p.drawText(text_x, text_y, fs_str); - } + } } void ViewerWindow::fullscreen_msg_timeout() { diff --git a/ui/viewerwindow.h b/ui/viewerwindow.h index 573687736..b1b491173 100644 --- a/ui/viewerwindow.h +++ b/ui/viewerwindow.h @@ -1,30 +1,33 @@ #ifndef VIEWERWINDOW_H #define VIEWERWINDOW_H -#include +#include #include class QMutex; +class QMenu; +class QShortcut; -class ViewerWindow : public QOpenGLWindow { +class ViewerWindow : public QOpenGLWidget { Q_OBJECT public: - ViewerWindow(QOpenGLContext* share); - void set_texture(GLuint t, double iar, QMutex *imutex); + ViewerWindow(QWidget *parent); + void set_texture(GLuint t, double iar, QMutex *imutex); protected: virtual void keyPressEvent(QKeyEvent*) override; virtual void mousePressEvent(QMouseEvent*) override; - virtual void mouseMoveEvent(QMouseEvent*) override; + virtual void mouseMoveEvent(QMouseEvent*) override; + + virtual void paintGL() override; private: - virtual void paintGL() override; GLuint texture; double ar; - QMutex* mutex; + QMutex* mutex; // exit full screen message QTimer fullscreen_msg_timer; bool show_fullscreen_msg; - QRect fullscreen_msg_rect; + QRect fullscreen_msg_rect; private slots: void fullscreen_msg_timeout(); }; From 847f43bf1e15320d335438f30a190bdff3346598 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 03:54:36 -0800 Subject: [PATCH 139/202] new tool button sizing algorithm, fixes #471 --- panels/timeline.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 4e67d256e..192cc5717 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -535,14 +535,27 @@ void Timeline::resizeEvent(QResizeEvent *) { // resize tool button widget to its contents QList tool_button_children = tool_button_widget->findChildren(); - int total_client_height = 0; - int horizontal_spacing = static_cast(tool_button_widget->layout())->horizontalSpacing(); - int vertical_spacing = static_cast(tool_button_widget->layout())->verticalSpacing(); - for (int i=0;iheight() + vertical_spacing; - } - int comp_height = tool_button_widget->height(); - int cols = qCeil(double(total_client_height)/double(comp_height)); + + int horizontal_spacing = static_cast(tool_button_widget->layout())->horizontalSpacing(); + int vertical_spacing = static_cast(tool_button_widget->layout())->verticalSpacing(); + int total_area = tool_button_widget->height(); + + int button_count = tool_button_children.size(); + int button_height = tool_button_children.at(0)->sizeHint().height() + vertical_spacing; + + int cols = 0; + + int col_height; + + if (button_height < total_area) { + do { + cols++; + col_height = (qCeil(double(button_count)/double(cols))*button_height)-vertical_spacing; + } while (col_height > total_area); + } else { + cols = button_count; + } + tool_button_widget->setFixedWidth((tool_button_children.at(0)->sizeHint().width())*cols + horizontal_spacing*(cols-1) + 1); } From 97548f1ff5fe4357c64d1fce6918e5a07e143c6c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 04:48:24 -0800 Subject: [PATCH 140/202] implemented more vst opcodes --- effects/internal/vsthost.cpp | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index 71a54a92e..c0302308d 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -32,25 +32,43 @@ struct VSTRect { #define effGetChunk 23 #define effSetChunk 24 +const char* productString = "OLIVETEAM"; + // C callbacks extern "C" { // Main host callback intptr_t hostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) { switch(opcode) { + case audioMasterAutomate: + effect->setParameter(effect, index, opt); + break; case audioMasterVersion: return 2400; case audioMasterIdle: effect->dispatcher(effect, effEditIdle, 0, 0, nullptr, 0); - break; + break; + case audioMasterWantMidi: + // no midi support, return 0 + break; + case audioMasterGetSampleRate: + return current_audio_freq(); + case audioMasterGetBlockSize: + return BLOCK_SIZE; case audioMasterGetCurrentProcessLevel: - return 0; - // handle other opcodes here... there will be lots of them + // process level happens to be 0 + break; + case audioMasterGetProductString: + strcpy(static_cast(ptr), "OLIVETEAM"); + break; + case audioMasterBeginEdit: + // we don't really care about this + // but we are aware of it + break; case audioMasterEndEdit: // change made mainWindow->setWindowModified(true); break; default: qInfo() << "Plugin requested unhandled opcode" << opcode; - break; } return 0; } @@ -331,8 +349,7 @@ void VSTHost::change_plugin() { startPlugin(); VSTRect* eRect = nullptr; plugin->dispatcher(plugin, effEditGetRect, 0, 0, &eRect, 0); - dialog->setFixedWidth(eRect->right); - dialog->setFixedHeight(eRect->bottom); + dialog->setFixedSize(eRect->right - eRect->left, eRect->bottom - eRect->top); } else { #ifdef __APPLE__ CFBundleUnloadExecutable(bundle); From 57e038afc4af4f6b8573cc0ada26a1ef7e75ee7b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 05:11:20 -0800 Subject: [PATCH 141/202] added vst main fallback --- effects/internal/vsthost.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index c0302308d..325a6683e 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -144,10 +144,20 @@ void VSTHost::loadPlugin() { return; } - vstPluginFuncPtr mainEntryPoint = - reinterpret_cast(LibAddress(modulePtr, "VSTPluginMain")); - // Instantiate the plugin - plugin = mainEntryPoint(hostCallback); + vstPluginFuncPtr mainEntryPoint = reinterpret_cast(LibAddress(modulePtr, "VSTPluginMain")); + + if (mainEntryPoint == nullptr) { + // if there's no VSTPluginMain(), fallback to main() + mainEntryPoint = reinterpret_cast(LibAddress(modulePtr, "main")); + } + + if (mainEntryPoint == nullptr) { + QMessageBox::critical(nullptr, tr("Error loading VST plugin"), tr("Failed to locate entry point for dynamic library.")); + LibClose(modulePtr); + } else { + // Instantiate the plugin + plugin = mainEntryPoint(hostCallback); + } #endif } From 33c53a2c7925d87fd1e51c24180ed234054be445 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 12:14:02 -0800 Subject: [PATCH 142/202] adding org and app name #451 --- effects/internal/vsthost.cpp | 2 -- main.cpp | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index 325a6683e..fd22d4b94 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -32,8 +32,6 @@ struct VSTRect { #define effGetChunk 23 #define effSetChunk 24 -const char* productString = "OLIVETEAM"; - // C callbacks extern "C" { // Main host callback diff --git a/main.cpp b/main.cpp index 1dd61ea02..f079e3725 100644 --- a/main.cpp +++ b/main.cpp @@ -89,7 +89,10 @@ int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QApplication a(argc, argv); - a.setWindowIcon(QIcon(":/icons/olive64.png")); + a.setWindowIcon(QIcon(":/icons/olive64.png")); + + QCoreApplication::setOrganizationName("olivevideoeditor.org"); + QCoreApplication::setApplicationName("Olive"); MainWindow w(nullptr, appName); w.updateTitle(""); From 27ff00d7973d1e43e4b7e5c25b392469127e3bad Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 12:56:51 -0800 Subject: [PATCH 143/202] segmented travis --- .travis.yml | 44 +++++++++++++-------------------------- .travis/after_success.sh | 15 +++++++++++++ .travis/before_install.sh | 9 ++++++++ .travis/install.sh | 10 +++++++++ .travis/script.sh | 30 ++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 29 deletions(-) create mode 100644 .travis/after_success.sh create mode 100644 .travis/before_install.sh create mode 100644 .travis/install.sh create mode 100644 .travis/script.sh diff --git a/.travis.yml b/.travis.yml index 26f5e8c42..f5d777dd7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,44 +1,30 @@ language: cpp -compiler: gcc -sudo: require -dist: trusty matrix: include: - - env: ARCH=x86_64 - - env: ARCH=i386 + - os: linux + env: ARCH=x86_64 + compiler: gcc + sudo: require + dist: trusty + - os: linux + env: ARCH=i386 + compiler: gcc + sudo: require + dist: trusty + - os: osx before_install: - - sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y - - sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y - - sudo apt-get update -qq + - bash ./.travis/before_install.sh install: - - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi - - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi - - source /opt/qt*/bin/qt*-env.sh + - bash ./.travis/install.sh script: - - lrelease olive.pro - - if [ "$ARCH" == "x86_64" ]; then qmake CONFIG+=release PREFIX=/usr; fi - - if [ "$ARCH" == "i386" ]; then qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi - - make -j$(nproc) - - make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ - - mkdir -p appdir/usr/bin/ ; cp olive-editor appdir/usr/bin/ # FIXME; "make install" should do this - - wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" - - chmod a+x linuxdeployqt-continuous-x86_64.AppImage - - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file - - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage - - if [ "$ARCH" == "i386" ]; then rm Olive*.AppImage; wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage"; chmod a+x appimagetool-i686.AppImage; ./appimagetool-i686.AppImage 'appdir' -n -g; fi + - bash ./.travis/script.sh after_success: - - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - - # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage - - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - # only create release for master - - if [ "$TRAVIS_BRANCH" != "master" ]; then export TRAVIS_EVENT_TYPE=pull_request; fi - - bash upload.sh Olive*.AppImage* + - bash ./.travis/after_success.sh branches: except: diff --git a/.travis/after_success.sh b/.travis/after_success.sh new file mode 100644 index 000000000..c6fbeb4a6 --- /dev/null +++ b/.travis/after_success.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + upload.sh Olive*.zip +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq + # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage + wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + # only create release for master + if [ "$TRAVIS_BRANCH" != "master" ]; then + export TRAVIS_EVENT_TYPE=pull_request + fi + upload.sh Olive*.AppImage* +fi \ No newline at end of file diff --git a/.travis/before_install.sh b/.travis/before_install.sh new file mode 100644 index 000000000..2fb95c978 --- /dev/null +++ b/.travis/before_install.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + brew install ffmpeg qt5 +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y + sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y + sudo apt-get update -qq +fi \ No newline at end of file diff --git a/.travis/install.sh b/.travis/install.sh new file mode 100644 index 000000000..8dd271ec9 --- /dev/null +++ b/.travis/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + brew install ffmpeg qt5 +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi + if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi + source /opt/qt*/bin/qt*-env.sh +fi + diff --git a/.travis/script.sh b/.travis/script.sh new file mode 100644 index 000000000..6a6612e68 --- /dev/null +++ b/.travis/script.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + lrelease olive.pro + qmake CONFIG+=release PREFIX=/usr + make -j$(nproc) + macdeployqt Olive.app + zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + lrelease olive.pro + if [ "$ARCH" == "i386" ]; then + qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi + else + qmake CONFIG+=release PREFIX=/usr + fi + make -j$(nproc) + make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ + wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" + chmod a+x linuxdeployqt-continuous-x86_64.AppImage + unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH + export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file + ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage + if [ "$ARCH" == "i386" ]; then + rm Olive*.AppImage + wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage" + chmod a+x appimagetool-i686.AppImage + ./appimagetool-i686.AppImage 'appdir' -n -g + fi +fi + From 7f78f544f0dc0b4b8e4102d936e7670d7652eb49 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 12:58:02 -0800 Subject: [PATCH 144/202] setOrganizationDomain instead of setOrganizationName --- main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index f079e3725..03f1ba1fd 100644 --- a/main.cpp +++ b/main.cpp @@ -91,7 +91,7 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setWindowIcon(QIcon(":/icons/olive64.png")); - QCoreApplication::setOrganizationName("olivevideoeditor.org"); + QCoreApplication::setOrganizationDomain("olivevideoeditor.org"); QCoreApplication::setApplicationName("Olive"); MainWindow w(nullptr, appName); From 7db1fe71655ea35b88d61203d0ff3f66e2896c35 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 13:00:56 -0800 Subject: [PATCH 145/202] changed line endings in shell scripts --- .travis/after_success.sh | 28 +++++++++--------- .travis/before_install.sh | 16 +++++------ .travis/script.sh | 60 +++++++++++++++++++-------------------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index c6fbeb4a6..99064916d 100644 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -1,15 +1,15 @@ -#!/bin/bash - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - upload.sh Olive*.zip -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then - find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - # only create release for master - if [ "$TRAVIS_BRANCH" != "master" ]; then - export TRAVIS_EVENT_TYPE=pull_request - fi - upload.sh Olive*.AppImage* +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + upload.sh Olive*.zip +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq + # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage + wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + # only create release for master + if [ "$TRAVIS_BRANCH" != "master" ]; then + export TRAVIS_EVENT_TYPE=pull_request + fi + upload.sh Olive*.AppImage* fi \ No newline at end of file diff --git a/.travis/before_install.sh b/.travis/before_install.sh index 2fb95c978..e117fc6d2 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -1,9 +1,9 @@ -#!/bin/bash - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - brew install ffmpeg qt5 -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then - sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y - sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y - sudo apt-get update -qq +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + brew install ffmpeg qt5 +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y + sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y + sudo apt-get update -qq fi \ No newline at end of file diff --git a/.travis/script.sh b/.travis/script.sh index 6a6612e68..ce40bfa8e 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -1,30 +1,30 @@ -#!/bin/bash - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - lrelease olive.pro - qmake CONFIG+=release PREFIX=/usr - make -j$(nproc) - macdeployqt Olive.app - zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then - lrelease olive.pro - if [ "$ARCH" == "i386" ]; then - qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi - else - qmake CONFIG+=release PREFIX=/usr - fi - make -j$(nproc) - make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ - wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" - chmod a+x linuxdeployqt-continuous-x86_64.AppImage - unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage - if [ "$ARCH" == "i386" ]; then - rm Olive*.AppImage - wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage" - chmod a+x appimagetool-i686.AppImage - ./appimagetool-i686.AppImage 'appdir' -n -g - fi -fi - +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + lrelease olive.pro + qmake CONFIG+=release PREFIX=/usr + make -j$(nproc) + macdeployqt Olive.app + zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + lrelease olive.pro + if [ "$ARCH" == "i386" ]; then + qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi + else + qmake CONFIG+=release PREFIX=/usr + fi + make -j$(nproc) + make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ + wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" + chmod a+x linuxdeployqt-continuous-x86_64.AppImage + unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH + export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file + ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage + if [ "$ARCH" == "i386" ]; then + rm Olive*.AppImage + wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage" + chmod a+x appimagetool-i686.AppImage + ./appimagetool-i686.AppImage 'appdir' -n -g + fi +fi + From 83c24de83f3603b998bb94007329f1231092b9a6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 13:04:03 -0800 Subject: [PATCH 146/202] one more line ending change --- .travis/install.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 8dd271ec9..5a63a5f10 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -1,10 +1,10 @@ -#!/bin/bash - -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - brew install ffmpeg qt5 -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi - source /opt/qt*/bin/qt*-env.sh -fi - +#!/bin/bash + +if [[ $TRAVIS_OS_NAME == 'osx' ]]; then + brew install ffmpeg qt5 +elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then + if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi + if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi + source /opt/qt*/bin/qt*-env.sh +fi + From 7877cfe397488ea1e76e422db9039aadb8221a37 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 13:16:16 -0800 Subject: [PATCH 147/202] bash to source in travis --- .travis.yml | 8 ++++---- .travis/before_install.sh | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index f5d777dd7..bbd600671 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,16 +15,16 @@ matrix: - os: osx before_install: - - bash ./.travis/before_install.sh + - source ./.travis/before_install.sh install: - - bash ./.travis/install.sh + - source ./.travis/install.sh script: - - bash ./.travis/script.sh + - source ./.travis/script.sh after_success: - - bash ./.travis/after_success.sh + - source ./.travis/after_success.sh branches: except: diff --git a/.travis/before_install.sh b/.travis/before_install.sh index e117fc6d2..a9312b90e 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -1,7 +1,7 @@ #!/bin/bash if [[ $TRAVIS_OS_NAME == 'osx' ]]; then - brew install ffmpeg qt5 + # do nothing elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y From 487c011603ea47e375175f742d3ad0bf0d9403ad Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 13:20:35 -0800 Subject: [PATCH 148/202] wrap os name in quotes --- .travis/after_success.sh | 9 ++++++--- .travis/before_install.sh | 4 ++-- .travis/install.sh | 4 ++-- .travis/script.sh | 6 +++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 99064916d..5835e24ee 100644 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -1,14 +1,17 @@ #!/bin/bash -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then +if [[ "$TRAVIS_OS_NAME" == "osx" ]] +then wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh upload.sh Olive*.zip -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then +elif [[ "$TRAVIS_OS_NAME" == "linux" ]] +then find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh # only create release for master - if [ "$TRAVIS_BRANCH" != "master" ]; then + if [ "$TRAVIS_BRANCH" != "master" ] + then export TRAVIS_EVENT_TYPE=pull_request fi upload.sh Olive*.AppImage* diff --git a/.travis/before_install.sh b/.travis/before_install.sh index a9312b90e..f2a63cec1 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -1,8 +1,8 @@ #!/bin/bash -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then # do nothing -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then +elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y sudo apt-get update -qq diff --git a/.travis/install.sh b/.travis/install.sh index 5a63a5f10..442b139bb 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -1,8 +1,8 @@ #!/bin/bash -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ffmpeg qt5 -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then +elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi source /opt/qt*/bin/qt*-env.sh diff --git a/.travis/script.sh b/.travis/script.sh index ce40bfa8e..b64c5bdae 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -1,12 +1,12 @@ #!/bin/bash -if [[ $TRAVIS_OS_NAME == 'osx' ]]; then +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then lrelease olive.pro qmake CONFIG+=release PREFIX=/usr make -j$(nproc) macdeployqt Olive.app zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app -elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then +elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then lrelease olive.pro if [ "$ARCH" == "i386" ]; then qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi @@ -24,7 +24,7 @@ elif [[ $TRAVIS_OS_NAME == 'linux' ]]; then rm Olive*.AppImage wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage" chmod a+x appimagetool-i686.AppImage - ./appimagetool-i686.AppImage 'appdir' -n -g + ./appimagetool-i686.AppImage "appdir" -n -g fi fi From 9a20fa8ba54a3a4b8e1be5dd870869e22a0cde78 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 13:29:55 -0800 Subject: [PATCH 149/202] reworded before_install --- .travis/before_install.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis/before_install.sh b/.travis/before_install.sh index f2a63cec1..e817cf6c7 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -1,8 +1,11 @@ #!/bin/bash -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then +#if [[ "$TRAVIS_OS_NAME" == "osx" ]] +#then # do nothing -elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then +#elif [[ "$TRAVIS_OS_NAME" == "linux" ]] +if [[ "$TRAVIS_OS_NAME" == "linux" ]] +then sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y sudo apt-get update -qq From 4b0444aa64552b4b901a7e2e3d00e3c9fe6ff310 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 14:15:09 -0800 Subject: [PATCH 150/202] fixed syntax error --- .travis/script.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis/script.sh b/.travis/script.sh index b64c5bdae..111de5f4b 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -9,7 +9,7 @@ if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then lrelease olive.pro if [ "$ARCH" == "i386" ]; then - qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32; fi + qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32 else qmake CONFIG+=release PREFIX=/usr fi @@ -27,4 +27,3 @@ elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./appimagetool-i686.AppImage "appdir" -n -g fi fi - From da808fa4ee20186124e2884940b9192fa60cbf68 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 14:16:32 -0800 Subject: [PATCH 151/202] add qt to path in mac travis --- .travis/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis/install.sh b/.travis/install.sh index 442b139bb..c7a2ca658 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -2,6 +2,7 @@ if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ffmpeg qt5 + export PATH="/usr/local/opt/qt/bin:$PATH" elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi From 6c110ddac3b70ff6e95660e5400cbcc9c248c2a0 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 14:36:40 -0800 Subject: [PATCH 152/202] fixed upload step in travis --- .travis/after_success.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 5835e24ee..2251a7ed4 100644 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -3,7 +3,7 @@ if [[ "$TRAVIS_OS_NAME" == "osx" ]] then wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh - upload.sh Olive*.zip + bash upload.sh Olive*.zip elif [[ "$TRAVIS_OS_NAME" == "linux" ]] then find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq @@ -14,5 +14,5 @@ then then export TRAVIS_EVENT_TYPE=pull_request fi - upload.sh Olive*.AppImage* + bash upload.sh Olive*.AppImage* fi \ No newline at end of file From 5d41b9005f28658a69a3d470a09f8e76fb104d1f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 10 Feb 2019 16:09:10 -0800 Subject: [PATCH 153/202] some path updates and mac travis fixes --- .travis/install.sh | 4 ++-- .travis/script.sh | 41 ++++++++++++++++++++++++++++++++++++++++- io/path.cpp | 26 ++++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 5 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index c7a2ca658..d4c733ebd 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -1,8 +1,8 @@ #!/bin/bash if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - brew install ffmpeg qt5 - export PATH="/usr/local/opt/qt/bin:$PATH" + brew install ffmpeg qt5 python@2 + export PATH="/usr/local/opt/qt/bin:/usr/local/opt/python@2/libexec/bin:$PATH" elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi diff --git a/.travis/script.sh b/.travis/script.sh index 111de5f4b..6ca216706 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -1,25 +1,64 @@ #!/bin/bash if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + # generate translation files lrelease olive.pro + + # generate Makefile qmake CONFIG+=release PREFIX=/usr + + # run Makefile make -j$(nproc) + + # move Qt deps into bundle macdeployqt Olive.app + + # fix other deps that macdeployqt missed + wget -c -nv https://github.com/arl/macdeployqtfix/raw/master/macdeployqtfix.py + python2 macdeployqtfix.py Olive.app/Contents/MacOS/Olive /usr/local/Cellar/qt5/5.*/ + + # move translations into bundle + mkdir Olive.app/Contents/Translations + mv ts/*.qm Olive.app/Contents/Translations + + # move external effects into bundle + mkdir Olive.app/Contents/Effects + cp effects/* Olive.app/Contents/Effects + + # distribute in zip zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + # generate translation files lrelease olive.pro + + # generate Makefile if [ "$ARCH" == "i386" ]; then + # use extra compiler flags to force 32-bit build qmake CONFIG+=release "QMAKE_CFLAGS+=-m32" "QMAKE_CXXFLAGS+=-m32" "QMAKE_LFLAGS+=-m32" PREFIX=/usr -spec linux-g++-32 else qmake CONFIG+=release PREFIX=/usr fi + + # run Makefile make -j$(nproc) + + # use `make install` on `appdir` to place files in the correct place make INSTALL_ROOT=appdir -j$(nproc) install ; find appdir/ + + # download linuxdeployqt wget -c -nv "https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage" chmod a+x linuxdeployqt-continuous-x86_64.AppImage + unset QTDIR; unset QT_PLUGIN_PATH ; unset LD_LIBRARY_PATH - export VERSION=$(git rev-parse --short HEAD) # linuxdeployqt uses this for naming the file + + # linuxdeployqt uses this for naming the file + export VERSION=$(git rev-parse --short HEAD) + + # use linuxdeployqt to set up dependencies ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage + + # 64-bit linuxdeployqt can only generate a 64-bit AppImage + # to generate a 32-bit one, we need to download and run 32-bit AppImageTool if [ "$ARCH" == "i386" ]; then rm Olive*.AppImage wget -c -nv "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-i686.AppImage" diff --git a/io/path.cpp b/io/path.cpp index dc5b26a89..dafa5ae7f 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -31,12 +31,24 @@ QString get_config_path() { } QList get_effects_paths() { + // returns a list of the effects paths to search + QList effects_paths; - effects_paths.append(get_app_dir() + "/effects"); + + // "effects" subfolder in program folder - best for Windows + effects_paths.append(get_app_dir() + "/effects"); + + // "Effects" folder one level above the program's directory - best for Mac + effects_paths.append(get_app_dir() + "/../Effects"); + + // folder in share folder - best for Linux effects_paths.append(get_app_dir() + "/../share/olive-editor/effects"); + + // Olive will also accept a manually provided folder with an environment variable QString env_path(qgetenv("OLIVE_EFFECTS_PATH")); if (!env_path.isEmpty()) effects_paths.append(env_path); - return effects_paths; + + return effects_paths; } QString get_file_hash(const QString& filename) { @@ -47,9 +59,19 @@ QString get_file_hash(const QString& filename) { QList get_language_paths() { QList language_paths; + + // subfolder in program folder - best for Windows (or compiling+running from source dir) language_paths.append(get_app_dir() + "/ts"); + + // folder one level above the program's directory - best for Mac + language_paths.append(get_app_dir() + "/../Translations"); + + // folder in share folder - best for Linux language_paths.append(get_app_dir() + "/../share/olive-editor/ts"); + + // Olive will also accept a manually provided folder with an environment variable QString env_path(qgetenv("OLIVE_LANG_PATH")); if (!env_path.isEmpty()) language_paths.append(env_path); + return language_paths; } From 32dec87575732a0df1479874242e67ac1d68631f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 11 Feb 2019 01:09:02 -0800 Subject: [PATCH 154/202] updated version name --- .travis.yml | 2 ++ .travis/after_success.sh | 25 ++++++++++++++++++------- .travis/before_install.sh | 12 ++++++++++-- .travis/install.sh | 5 +++++ .travis/script.sh | 7 +++++++ main.cpp | 2 +- 6 files changed, 43 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index bbd600671..4f8fe8933 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,8 @@ matrix: sudo: require dist: trusty - os: osx + - os: windows + env: ARCH=x86_64 before_install: - source ./.travis/before_install.sh diff --git a/.travis/after_success.sh b/.travis/after_success.sh index 2251a7ed4..cd6abd13f 100644 --- a/.travis/after_success.sh +++ b/.travis/after_success.sh @@ -1,18 +1,29 @@ #!/bin/bash -if [[ "$TRAVIS_OS_NAME" == "osx" ]] -then - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh +# retrieve upload tool +wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + + # upload final package bash upload.sh Olive*.zip -elif [[ "$TRAVIS_OS_NAME" == "linux" ]] -then + +elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + find appdir -executable -type f -exec ldd {} \; | grep " => /usr" | cut -d " " -f 2-3 | sort | uniq - # curl --upload-file Olive*.AppImage https://transfer.sh/Olive-git.$(git rev-parse --short HEAD)-$ARCH.AppImage - wget -c https://github.com/probonopd/uploadtool/raw/master/upload.sh + # only create release for master if [ "$TRAVIS_BRANCH" != "master" ] then export TRAVIS_EVENT_TYPE=pull_request fi + + # upload final package bash upload.sh Olive*.AppImage* + +elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + + # upload final package + bash upload.sh Olive*.zip + fi \ No newline at end of file diff --git a/.travis/before_install.sh b/.travis/before_install.sh index e817cf6c7..9ea7b6d48 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -4,9 +4,17 @@ #then # do nothing #elif [[ "$TRAVIS_OS_NAME" == "linux" ]] -if [[ "$TRAVIS_OS_NAME" == "linux" ]] -then +if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + + # install apt repos necessary for Olive sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y sudo apt-get update -qq + +elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + + # install msys2 for mingw package installation + # (chocolatey is seemingly missing a recent version of Qt) + choco install msys2 + fi \ No newline at end of file diff --git a/.travis/install.sh b/.travis/install.sh index d4c733ebd..3983d60dd 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -7,5 +7,10 @@ elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi source /opt/qt*/bin/qt*-env.sh +elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + #/c/msys64/usr/bin/bash -l -c "pacman -Syu --noconfirm" + + # install build tools + /c/msys64/usr/bin/bash -l -c "pacman -S --noconfirm mingw-w64-x86_64-toolchain mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-qt5" fi diff --git a/.travis/script.sh b/.travis/script.sh index 6ca216706..46ae8084e 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -65,4 +65,11 @@ elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then chmod a+x appimagetool-i686.AppImage ./appimagetool-i686.AppImage "appdir" -n -g fi +elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + /c/msys64/mingw64/bin/qmake CONFIG+=release + /c/msys64/mingw64/bin/mingw32-make -f Makefile.Debug + mkdir olive-editor + mv olive-editor.exe olive-editor/ + /c/msys64/mingw64/bin/windeployqt olive-editor/olive-editor.exe + 7z a Olive-$(git rev-parse --short HEAD)-w64p.zip olive-editor fi diff --git a/main.cpp b/main.cpp index 03f1ba1fd..fcacb54ac 100644 --- a/main.cpp +++ b/main.cpp @@ -11,7 +11,7 @@ extern "C" { } int main(int argc, char *argv[]) { - QString appName = "Olive (January 2019 | Alpha"; + QString appName = "Olive (February 2019 | Alpha"; #ifdef GITHASH appName += " | "; appName += GITHASH; From cee7c197aeedbc50c693cb4deaf70d4488014df3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 11 Feb 2019 02:04:50 -0800 Subject: [PATCH 155/202] improved waveform generator --- .travis/before_install.sh | 2 +- io/previewgenerator.cpp | 168 +++++++++++++++++++++++++++----------- project/footage.cpp | 1 - 3 files changed, 121 insertions(+), 50 deletions(-) diff --git a/.travis/before_install.sh b/.travis/before_install.sh index 9ea7b6d48..edad318ca 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -15,6 +15,6 @@ elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then # install msys2 for mingw package installation # (chocolatey is seemingly missing a recent version of Qt) - choco install msys2 + choco install msys2 -y fi \ No newline at end of file diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 04d443b67..8b2255465 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -207,14 +207,25 @@ void PreviewGenerator::generate_waveform() { SwsContext* sws_ctx; SwrContext* swr_ctx; AVFrame* temp_frame = av_frame_alloc(); + + // stores codec contexts for format's streams AVCodecContext** codec_ctx = new AVCodecContext* [fmt_ctx->nb_streams]; + + // stores media lengths while scanning in case the format has no duration metadata int64_t* media_lengths = new int64_t[fmt_ctx->nb_streams]{0}; + // stores samples while scanning before they get sent to preview file + qint16*** waveform_cache_data = new qint16** [fmt_ctx->nb_streams]; + int waveform_cache_count = 0; + // defaults to false, sets to true if we find a valid stream to make a preview of bool create_previews = false; for (unsigned int i=0;inb_streams;i++) { + + // default to nullptr values for easier memory management later codec_ctx[i] = nullptr; + waveform_cache_data[i] = nullptr; // we only generate previews for video and audio // and only if the thumbnail and waveform sizes are > 0 @@ -222,12 +233,33 @@ void PreviewGenerator::generate_waveform() { || (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && config.waveform_resolution > 0)) { AVCodec* codec = avcodec_find_decoder(fmt_ctx->streams[i]->codecpar->codec_id); if (codec != nullptr) { + + // alloc the context and load the params into it codec_ctx[i] = avcodec_alloc_context3(codec); avcodec_parameters_to_context(codec_ctx[i], fmt_ctx->streams[i]->codecpar); + + // open the decoder avcodec_open2(codec_ctx[i], codec, nullptr); - if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && codec_ctx[i]->channel_layout == 0) { - codec_ctx[i]->channel_layout = av_get_default_channel_layout(fmt_ctx->streams[i]->codecpar->channels); + + // audio specific functions + if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { + + // allocate sample cache for this stream + waveform_cache_data[i] = new qint16* [fmt_ctx->streams[i]->codecpar->channels]; + + // each channel gets a min and a max value so we allocate two ints for each one + for (int j=0;jstreams[i]->codecpar->channels;j++) { + waveform_cache_data[i][j] = new qint16[2]; + } + + // if codec context has no defined channel layout, guess it from the channel count + if (codec_ctx[i]->channel_layout == 0) { + codec_ctx[i]->channel_layout = av_get_default_channel_layout(fmt_ctx->streams[i]->codecpar->channels); + } + } + + // enable next step of process create_previews = true; } } @@ -312,8 +344,6 @@ void PreviewGenerator::generate_waveform() { } media_lengths[packet->stream_index]++; } else if (fmt_ctx->streams[packet->stream_index]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { - int interval = qFloor((temp_frame->sample_rate/config.waveform_resolution)/4)*4; - AVFrame* swr_frame = av_frame_alloc(); swr_frame->channel_layout = temp_frame->channel_layout; swr_frame->sample_rate = temp_frame->sample_rate; @@ -335,34 +365,61 @@ void PreviewGenerator::generate_waveform() { swr_convert_frame(swr_ctx, swr_frame, temp_frame); - // TODO implement a way to terminate this if the user suddenly closes the project while the waveform is being generated + // `config.waveform_resolution` determines how many samples per second are stored in waveform. + // `sample_rate` is samples per second, so `interval` is how many samples are averaged in + // each "point" of the waveform + int interval = qFloor((temp_frame->sample_rate/config.waveform_resolution)/4)*4; + + // get the amount of bytes in an audio sample int sample_size = av_get_bytes_per_sample(static_cast(swr_frame->format)); + + // total amount of data in this frame int nb_bytes = swr_frame->nb_samples * sample_size; - int byte_interval = interval * sample_size; - for (int i=0;ichannels;j++) { - qint16 min = 0; - qint16 max = 0; - for (int k=0;kdata[j][i+k+1] << 8) | swr_frame->data[j][i+k]); - if (sample > max) { - max = sample; - } else if (sample < min) { - min = sample; - } - } else { - break; - } + + // loop through entire frame + for (int i=0;ichannels;j++) { + qint16& min = waveform_cache_data[packet->stream_index][j][0]; + qint16& max = waveform_cache_data[packet->stream_index][j][1]; + + s->audio_preview.append(min >> 8); + s->audio_preview.append(max >> 8); } - s->audio_preview.append(min >> 8); - s->audio_preview.append(max >> 8); - if (cancelled) break; + + waveform_cache_count = 0; + } + + // standard processing for each channel of information + for (int j=0;jchannels;j++) { + qint16& min = waveform_cache_data[packet->stream_index][j][0]; + qint16& max = waveform_cache_data[packet->stream_index][j][1]; + + // if we're starting over, reset cache to zero + if (waveform_cache_count == 0) { + min = 0; + max = 0; + } + + // store most minimum and most maximum samples of this interval + qint16 sample = qint16((swr_frame->data[j][i+1] << 8) | swr_frame->data[j][i]); + min = qMin(min, sample); + max = qMax(max, sample); + } + + waveform_cache_count++; + + if (cancelled) { + break; } } swr_free(&swr_ctx); - av_frame_unref(swr_frame); av_frame_free(&swr_frame); if (cancelled) { @@ -396,6 +453,13 @@ void PreviewGenerator::generate_waveform() { av_packet_free(&packet); for (unsigned int i=0;inb_streams;i++) { + if (waveform_cache_data[i] != nullptr) { + for (int j=0;jchannels;j++) { + delete [] waveform_cache_data[i][j]; + } + delete [] waveform_cache_data[i]; + } + if (codec_ctx[i] != nullptr) { avcodec_close(codec_ctx[i]); avcodec_free_context(&codec_ctx[i]); @@ -423,6 +487,7 @@ void PreviewGenerator::generate_waveform() { finalize_media(); } + delete [] waveform_cache_data; delete [] media_lengths; delete [] codec_ctx; } @@ -468,22 +533,26 @@ void PreviewGenerator::run() { if (retrieve_preview(hash)) { sem.acquire(); - generate_waveform(); + if (!cancelled) { + generate_waveform(); - // save preview to file - for (int i=0;ivideo_tracks.size();i++) { - FootageStream& ms = footage->video_tracks[i]; - ms.video_preview.save(get_thumbnail_path(hash, ms), "PNG"); - //dout << "saved" << ms->file_index << "thumbnail to" << get_thumbnail_path(hash, ms); - } - for (int i=0;iaudio_tracks.size();i++) { - FootageStream& ms = footage->audio_tracks[i]; - QFile f(get_waveform_path(hash, ms)); - f.open(QFile::WriteOnly); - f.write(ms.audio_preview.constData(), ms.audio_preview.size()); - f.close(); - //dout << "saved" << ms->file_index << "waveform to" << get_waveform_path(hash, ms); - } + if (!cancelled) { + // save preview to file + for (int i=0;ivideo_tracks.size();i++) { + FootageStream& ms = footage->video_tracks[i]; + ms.video_preview.save(get_thumbnail_path(hash, ms), "PNG"); + //dout << "saved" << ms->file_index << "thumbnail to" << get_thumbnail_path(hash, ms); + } + for (int i=0;iaudio_tracks.size();i++) { + FootageStream& ms = footage->audio_tracks[i]; + QFile f(get_waveform_path(hash, ms)); + f.open(QFile::WriteOnly); + f.write(ms.audio_preview.constData(), ms.audio_preview.size()); + f.close(); + //dout << "saved" << ms->file_index << "waveform to" << get_waveform_path(hash, ms); + } + } + } sem.release(); } @@ -491,14 +560,16 @@ void PreviewGenerator::run() { avformat_close_input(&fmt_ctx); } - if (error) { - media->update_tooltip(errorStr); - emit set_icon(ICON_TYPE_ERROR, replace); - footage->invalid = true; - footage->ready_lock.unlock(); - } else { - media->update_tooltip(); - } + if (!cancelled) { + if (error) { + media->update_tooltip(errorStr); + emit set_icon(ICON_TYPE_ERROR, replace); + footage->invalid = true; + footage->ready_lock.unlock(); + } else { + media->update_tooltip(); + } + } delete [] filename; footage->preview_gen = nullptr; @@ -506,4 +577,5 @@ void PreviewGenerator::run() { void PreviewGenerator::cancel() { cancelled = true; + wait(); } diff --git a/project/footage.cpp b/project/footage.cpp index 82ecc5915..9aa00da3f 100644 --- a/project/footage.cpp +++ b/project/footage.cpp @@ -31,7 +31,6 @@ Footage::~Footage() { void Footage::reset() { if (preview_gen != nullptr) { preview_gen->cancel(); - preview_gen->wait(); } video_tracks.clear(); audio_tracks.clear(); From 679d7b752ba511d2cd0ba90e1b282bd8cf21e9ec Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 11 Feb 2019 02:29:22 -0800 Subject: [PATCH 156/202] preferences dialog update --- dialogs/preferencesdialog.cpp | 124 ++++---- dialogs/preferencesdialog.h | 8 +- io/config.cpp | 11 +- io/config.h | 3 +- main.cpp | 6 +- playback/cacher.cpp | 12 +- ts/olive_ar.ts | 570 ++++++++++++++++++---------------- ts/olive_cs.ts | 567 +++++++++++++++++---------------- ts/olive_de.ts | 566 +++++++++++++++++---------------- ts/olive_es.ts | 558 +++++++++++++++++---------------- ts/olive_fr.ts | 558 +++++++++++++++++---------------- ts/olive_it.ts | 558 +++++++++++++++++---------------- ts/olive_ru.ts | 567 +++++++++++++++++---------------- 13 files changed, 2202 insertions(+), 1906 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index df686be31..aa26047ba 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -89,7 +89,40 @@ void PreferencesDialog::setup_kbd_shortcut_worker(QMenu* menu, QTreeWidgetItem* key_shortcut_actions.append(a); } } - } + } +} + +void PreferencesDialog::delete_previews(char type) { + if (type != 't' && type != 'w' && type != 1) return; + + QDir preview_path(get_data_path() + "/previews"); + + if (type == 1) { + // indiscriminately delete everything + preview_path.removeRecursively(); + } else { + QStringList preview_file_list = preview_path.entryList(QDir::Files | QDir::NoDotAndDotDot); + for (int i=0;i= 0 + && preview_file_str.at(identifier_char_index) >= 48 + && preview_file_str.at(identifier_char_index) <= 57) { + identifier_char_index--; + } + + // thumbnails will have a 't' towards the end of the filenames, waveforms will have a 'w' + // if they match the type of preview we're deleting, remove them + if (preview_file_str.at(identifier_char_index) == type) { + QFile::remove(preview_path.filePath(preview_file_str)); + } + } + } } void PreferencesDialog::setup_kbd_shortcuts(QMenuBar* menubar) { @@ -131,8 +164,7 @@ void PreferencesDialog::save() { mainWindow->load_css_from_file(config.css_path); config.recording_mode = recordingComboBox->currentIndex() + 1; config.img_seq_formats = imgSeqFormatEdit->text(); - config.fast_seeking = fastSeekButton->isChecked(); - config.disable_multithreading_for_images = disable_img_multithread->isChecked(); + config.fast_seeking = fastSeekButton->isChecked(); config.upcoming_queue_size = upcoming_queue_spinbox->value(); config.upcoming_queue_type = upcoming_queue_type->currentIndex(); config.previous_queue_size = previous_queue_spinbox->value(); @@ -195,36 +227,7 @@ void PreferencesDialog::save() { } } - if (delete_match != 0) { - QDir preview_path(get_data_path() + "/previews"); - - if (delete_match == 1) { - // indiscriminately delete everything - preview_path.removeRecursively(); - } else { - QStringList preview_file_list = preview_path.entryList(QDir::Files | QDir::NoDotAndDotDot); - for (int i=0;i= 0 - && preview_file_str.at(identifier_char_index) >= 48 - && preview_file_str.at(identifier_char_index) <= 57) { - identifier_char_index--; - } - - // thumbnails will have a 't' towards the end of the filenames, waveforms will have a 'w' - // if they match the type of preview we're deleting, remove them - if (preview_file_str.at(identifier_char_index) == delete_match) { - QFile::remove(preview_path.filePath(preview_file_str)); - } - } - } - } + delete_previews(delete_match); } // save keyboard shortcuts @@ -362,7 +365,20 @@ void PreferencesDialog::browse_css_file() { QString fn = QFileDialog::getOpenFileName(this, tr("Browse for CSS file")); if (!fn.isEmpty()) { custom_css_fn->setText(fn); - } + } +} + +void PreferencesDialog::delete_all_previews() { + if (QMessageBox::question(this, + tr("Delete All Previews"), + tr("Are you sure you want to delete all previews?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + delete_previews(1); + QMessageBox::information(this, + tr("Previews Deleted"), + tr("All previews deleted succesfully. You may have to re-open your current project for changes to take effect."), + QMessageBox::Ok); + } } void PreferencesDialog::setup_ui() { @@ -377,7 +393,7 @@ void PreferencesDialog::setup_ui() { QGridLayout* general_layout = new QGridLayout(general_tab); // General -> Language - general_layout->addWidget(new QLabel(tr("Language:")), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Language:")), row, 0); language_combobox = new QComboBox(); @@ -409,69 +425,72 @@ void PreferencesDialog::setup_ui() { } } - general_layout->addWidget(language_combobox, row, 1, 1, 3); + general_layout->addWidget(language_combobox, row, 1, 1, 4); row++; // General -> Custom CSS - general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Custom CSS:"), this), row, 0); custom_css_fn = new QLineEdit(general_tab); custom_css_fn->setText(config.css_path); - general_layout->addWidget(custom_css_fn, row, 1, 1, 2); + general_layout->addWidget(custom_css_fn, row, 1, 1, 3); QPushButton* custom_css_browse = new QPushButton(tr("Browse"), general_tab); connect(custom_css_browse, SIGNAL(clicked(bool)), this, SLOT(browse_css_file())); - general_layout->addWidget(custom_css_browse, row, 3, 1, 1); + general_layout->addWidget(custom_css_browse, row, 4); row++; // General -> Image Sequence Formats - general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Image sequence formats:"), this), row, 0); imgSeqFormatEdit = new QLineEdit(general_tab); - general_layout->addWidget(imgSeqFormatEdit, row, 1, 1, 3); + general_layout->addWidget(imgSeqFormatEdit, row, 1, 1, 4); row++; // General -> Audio Recording - general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Audio Recording:"), this), row, 0); recordingComboBox = new QComboBox(general_tab); recordingComboBox->addItem(tr("Mono")); recordingComboBox->addItem(tr("Stereo")); - general_layout->addWidget(recordingComboBox, row, 1, 1, 3); + general_layout->addWidget(recordingComboBox, row, 1, 1, 4); row++; // General -> Effect Textbox Lines - general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Effect Textbox Lines:"), this), row, 0); effect_textbox_lines_field = new QSpinBox(general_tab); effect_textbox_lines_field->setMinimum(1); effect_textbox_lines_field->setValue(config.effect_textbox_lines); - general_layout->addWidget(effect_textbox_lines_field, row, 1, 1, 3); + general_layout->addWidget(effect_textbox_lines_field, row, 1, 1, 4); row++; // General -> Thumbnail and Waveform Resolution - general_layout->addWidget(new QLabel(tr("Thumbnail Resolution:"), this), row, 0, 1, 1); + general_layout->addWidget(new QLabel(tr("Thumbnail Resolution:"), this), row, 0); thumbnail_res_spinbox = new QSpinBox(this); thumbnail_res_spinbox->setMinimum(0); thumbnail_res_spinbox->setMaximum(INT_MAX); thumbnail_res_spinbox->setValue(config.thumbnail_resolution); - general_layout->addWidget(thumbnail_res_spinbox, row, 1, 1, 1); + general_layout->addWidget(thumbnail_res_spinbox, row, 1); - general_layout->addWidget(new QLabel(tr("Waveform Resolution:"), this), row, 2, 1, 1); + general_layout->addWidget(new QLabel(tr("Waveform Resolution:"), this), row, 2); waveform_res_spinbox = new QSpinBox(this); waveform_res_spinbox->setMinimum(0); waveform_res_spinbox->setMaximum(INT_MAX); waveform_res_spinbox->setValue(config.waveform_resolution); - general_layout->addWidget(waveform_res_spinbox, row, 3, 1, 1); + general_layout->addWidget(waveform_res_spinbox, row, 3); + QPushButton* delete_preview_btn = new QPushButton(tr("Delete Previews")); + general_layout->addWidget(delete_preview_btn, row, 4); + connect(delete_preview_btn, SIGNAL(clicked(bool)), this, SLOT(delete_all_previews())); row++; @@ -489,12 +508,7 @@ void PreferencesDialog::setup_ui() { // Playback QWidget* playback_tab = new QWidget(this); - QVBoxLayout* playback_tab_layout = new QVBoxLayout(playback_tab); - - // Playback -> Disable Multithreading on Images - disable_img_multithread = new QCheckBox(tr("Disable Multithreading on Images"), playback_tab); - disable_img_multithread->setChecked(config.disable_multithreading_for_images); - playback_tab_layout->addWidget(disable_img_multithread); + QVBoxLayout* playback_tab_layout = new QVBoxLayout(playback_tab); // Playback -> Seeking QGroupBox* seeking_group = new QGroupBox(playback_tab); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index 2a6fa2cea..2286bc07a 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -44,18 +44,22 @@ private slots: void load_shortcut_file(); void save_shortcut_file(); void browse_css_file(); + void delete_all_previews(); private: void setup_ui(); void setup_kbd_shortcut_worker(QMenu* menu, QTreeWidgetItem* parent); + // used to delete previews + // type can be: 't' for thumbnails, 'w' for waveforms, or 1 for all + void delete_previews(char type); + QLineEdit* custom_css_fn; QLineEdit* imgSeqFormatEdit; QComboBox* recordingComboBox; QRadioButton* accurateSeekButton; QRadioButton* fastSeekButton; - QTreeWidget* keyboard_tree; - QCheckBox* disable_img_multithread; + QTreeWidget* keyboard_tree; QDoubleSpinBox* upcoming_queue_spinbox; QComboBox* upcoming_queue_type; QDoubleSpinBox* previous_queue_spinbox; diff --git a/io/config.cpp b/io/config.cpp index 346abd528..e33a6ea91 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -39,8 +39,7 @@ Config::Config() hover_focus(false), project_view_type(PROJECT_VIEW_TREE), set_name_with_marker(true), - show_project_toolbar(false), - disable_multithreading_for_images(false), + show_project_toolbar(false), previous_queue_size(3), previous_queue_type(FRAME_QUEUE_TYPE_FRAMES), upcoming_queue_size(0.5), @@ -142,10 +141,7 @@ void Config::load(QString path) { set_name_with_marker = (stream.text() == "1"); } else if (stream.name() == "ShowProjectToolbar") { stream.readNext(); - show_project_toolbar = (stream.text() == "1"); - } else if (stream.name() == "DisableMultithreadedImages") { - stream.readNext(); - disable_multithreading_for_images = (stream.text() == "1"); + show_project_toolbar = (stream.text() == "1"); } else if (stream.name() == "PreviousFrameQueueSize") { stream.readNext(); previous_queue_size = stream.text().toDouble(); @@ -241,8 +237,7 @@ void Config::save(QString path) { stream.writeTextElement("HoverFocus", QString::number(hover_focus)); stream.writeTextElement("ProjectViewType", QString::number(project_view_type)); stream.writeTextElement("SetNameWithMarker", QString::number(set_name_with_marker)); - stream.writeTextElement("ShowProjectToolbar", QString::number(panel_project->toolbar_widget->isVisible())); - stream.writeTextElement("DisableMultithreadedImages", QString::number(disable_multithreading_for_images)); + stream.writeTextElement("ShowProjectToolbar", QString::number(panel_project->toolbar_widget->isVisible())); stream.writeTextElement("PreviousFrameQueueSize", QString::number(previous_queue_size)); stream.writeTextElement("PreviousFrameQueueType", QString::number(previous_queue_type)); stream.writeTextElement("UpcomingFrameQueueSize", QString::number(upcoming_queue_size)); diff --git a/io/config.h b/io/config.h index 9c9bf9b7b..11466c653 100644 --- a/io/config.h +++ b/io/config.h @@ -53,8 +53,7 @@ struct Config { bool hover_focus; int project_view_type; bool set_name_with_marker; - bool show_project_toolbar; - bool disable_multithreading_for_images; + bool show_project_toolbar; double previous_queue_size; int previous_queue_type; double upcoming_queue_size; diff --git a/main.cpp b/main.cpp index fcacb54ac..06b4b7532 100644 --- a/main.cpp +++ b/main.cpp @@ -80,11 +80,7 @@ int main(int argc, char *argv[]) { if (use_internal_logger) { qInstallMessageHandler(debug_message_handler); - } - - // init ffmpeg subsystem - av_register_all(); - avfilter_register_all(); + } QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 0f29b290b..3506ab07e 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -737,14 +737,10 @@ void open_clip_worker(Clip* clip) { clip->opts = nullptr; - // optimized decoding settings - if ((clip->stream->codecpar->codec_id != AV_CODEC_ID_PNG && - clip->stream->codecpar->codec_id != AV_CODEC_ID_APNG && - clip->stream->codecpar->codec_id != AV_CODEC_ID_TIFF && - clip->stream->codecpar->codec_id != AV_CODEC_ID_PSD) - || !config.disable_multithreading_for_images) { - av_dict_set(&clip->opts, "threads", "auto", 0); - } + // enable multithreading on decoding + av_dict_set(&clip->opts, "threads", "auto", 0); + + // enable extra optimization code on h264 (not even sure if they help) if (clip->stream->codecpar->codec_id == AV_CODEC_ID_H264) { av_dict_set(&clip->opts, "tune", "fastdecode", 0); av_dict_set(&clip->opts, "tune", "zerolatency", 0); diff --git a/ts/olive_ar.ts b/ts/olive_ar.ts index 25b34796c..29559ccad 100644 --- a/ts/olive_ar.ts +++ b/ts/olive_ar.ts @@ -717,14 +717,14 @@ LabelSlider - - + + Set Value حدد القيمة - - + + New value: قيمة جديدة: @@ -760,42 +760,42 @@ هذا المشروع كان محفوظاً بنسخة مختلفة من زيتون وقد لا تكون متوافقة بشكل كامل مع هذه النسخة. هل تريد محاولة تحميله على إي حال؟ - + Invalid Clip Link رابط مقطع غير صالح - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? هذا المشروع يحوي رابط مقطع غير صالح. قد يكون معطوباً. هل تريد اﻷستمرار بتحميله؟ - + %1 - Line: %2 Col: %3 %1 - سطر: %2 عمود: %3 - + User aborted loading المسخدم أجهض التحميل - + XML Parsing Error خطأ تحليل XML - + Couldn't load '%1'. %2 تعثر تحميل '%1'. %2 - + Project Load Error خطأ تحميل المشروع - + Error loading project: %1 خطأ تحميل المشروع: %1 @@ -858,626 +858,626 @@ محو نقطة الدخل/الخرج - + No active sequence لا مقاطع نشطة - + Please open the sequence you wish to export. رجاءً أفتح المقطع المراد تصديره. - + Save Project As... أحفظ المشروع ك... - + Unsaved Project مشروع غير محفوظ - + This project has changed since it was last saved. Would you like to save it before closing? هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ - + &File &ملف - + &New &جديد - + &Open Project &أفتح مشروع - + Clear Recent List أفرغ قائمة مؤخراً - + Open Recent أفتح مؤخراً - + &Save Project &أحفظ المشروع - + Save Project &As أحفظ المشروع &ك - + &Import... &أستيراد - + &Export... &تصدير - + E&xit خ&روج - + &Edit &تعديل - + &Undo &تراجع - + Redo أعد - + Cu&t قط&ع - + Cop&y &نسخ - + &Paste &لصق - + Paste Insert ألصق أدرج - + Duplicate أستنساخ - + Delete حذف - + Ripple Delete حذف موجة - + Split أنقسام - + Select &All تحديد &الكل - + Deselect All إلغاء تحديد الكل - + Add Default Transition أضف اﻷنتقال الأفتراضي - + Link/Unlink ربط/فصل - + Enable/Disable تفعيل/تعطيل - + Nest للمراجعة تداخل - + Ripple to In Point موجة لنقطة إدخال - + Ripple to Out Point موجة لنقطة إخراج - + Edit to In Point عدّل لنقطة إدخال - + Edit to Out Point عدّل لنقطة إخراج - + Delete In/Out Point محو نقطة الدخل/الخرج - + Ripple Delete In/Out Point موجة حذف نقطة الإدخال/الإخراج - + Set/Edit Marker حدد/عدّل اﻹشارات - + &View &أظهر - + Zoom In تقريب - + Zoom Out أبتعاد - + Increase Track Height زدّ طول المسار - + Decrease Track Height قلل طول المسار - + Toggle Show All فعل إظهار الكل - + Track Lines تعقب السطور - + Rectified Waveforms أشكال موجية متناوبة - + Frames اﻹطارات - + Drop Frame أفلت إطار - + Non-Drop Frame إطار غير مُفلت - + Milliseconds جزء من الثانية - + Title/Action Safe Area عنوان/إجراء المنطقة الآمنة - + Off مطفئ - + Default إفتراضي - + 4:3 4:3 - + 16:9 16:9 - + Custom مخصوص - + Full Screen ملء الشاشة - + Full Screen Viewer عارض ملء الشاشة - + &Playback &الترديد - + Go to Start أذهب للبداية - + Previous Frame الإطار السابق - + Play/Pause تشغيل/أستئناف - + Play In to Out شغل من الإدخال إلى الإخراج - + Next Frame اﻹطار التالي - + Go to End أذهب للنهاية - + Go to Previous Cut أذهب للقطعة السابقة - + Go to Next Cut أذهب للقطعة التالية - + Go to In Point أذهب لنقطة إدخال - + Go to Out Point أذهب لنقطة إخراج - + Shuttle Left توشع اليسار - + Shuttle Stop إيقاف التوشع - + Shuttle Right توشع اليمين - + Loop حلقة - + &Window &نافذة - + Project المشروع - + Effect Controls تحكمات المؤثر - + Timeline الخط الزمني - + Graph Editor محرر المخطط - + Media Viewer عارض الوسائط - + Sequence Viewer عارض المقطع - + Maximize Panel ضخّم اللائحة - + Reset to Default Layout صفّر للتخطيط المبدئي - + &Tools &اﻷدوات - + Pointer Tool أداة المؤشر - + Edit Tool أداة التحرير - + Ripple Tool أداة الموجة - + Razor Tool أداة القطع - + Slip Tool أداة المنزلقة - + Slide Tool أداة الشريحة - + Hand Tool أداة اليد - + Transition Tool أداة اﻷنتقال - + Enable Snapping فعّل السحب - + Selecting Also Seeks للمراجعة تحديد العروضات إيضاً - + Edit Tool Also Seeks أداة التحرير تعرض إيضاً - + Edit Tool Selects Links أداة التحرير تحدد الروابط - + Seek Also Selects للمراجعة العرض يحدد إيضاً - + Seek to the End of Pastes أعرض لنهاية الملصوقات - + Scroll Wheel Zooms العجلة الدوراة تُقرّب - + Enable Drag Files to Timeline أسمح بسحب الملفات للخط الزمني - + Auto-Scale By Default التحجيم-التلقائي إفتراضياً - + Enable Seek to Import للمراجعة أسمح للعرض بالإستيراد - + Audio Scrubbing حكّ شريط الصوت - + Enable Drop on Media to Replace أسمح برمي الوسائط للأستبدال - + Enable Hover Focus فعّل التركيز الحائم - + Ask For Name When Setting Marker أسال عن اﻷسم حين وضع المؤشر - + No Auto-Scroll لا أنزلاق التلقائي - + Page Auto-Scroll أنزلاق الصفحة التلقائي - + Smooth Auto-Scroll الأنزلاق التلقائي الناعم - + Preferences التفضيلات - + Clear Undo أمسح التراجُعات - + &Help &مساعدة - + A&ction Search ب&حث إجراء - + Debug Log سجل التنقيح - + &About... &حول... - + <untitled> <غير معنون> - + Open Project... أفتح مشروع... - + Missing recent project مشروع ماضي ضائع - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ - + Invalid aspect ratio معدل نسبة غير صالح - + The aspect ratio '%1' is invalid. Please try again. معدل النسبة '%1' غير صالح. حاول مجدداً. - + Enter custom aspect ratio أدخل نسبة معدل مخصصة - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): - + Nested Sequence مقطع متشعب @@ -1528,27 +1528,31 @@ معدل اﻹطارات: - %1 fields (%2 frames) - %1 الحقل (%2 إطارات) + %1 الحقل (%2 إطارات) - + + %1 field(s) (%2 frame(s)) + + + + Interlacing: المشابكة: - + Audio Frequency: تردد الصوت: - + Audio Channels: قنوات الصوت: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1561,17 +1565,17 @@ Audio Layout: %6 تخطيط الصوت: %6 - + Name اﻷسم - + Duration المدة - + Rate النسبة @@ -1594,9 +1598,25 @@ Audio Layout: %6 فيديو %1: %2x%3 %4إطار/ث - Audio %1: %2Hz %3 channels - الصوت %1: %2هرتز %3 قنوات + الصوت %1: %2هرتز %3 قنوات + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + @@ -1773,160 +1793,184 @@ Audio Layout: %6 PreferencesDialog - + Preferences التفضيلات - + Invalid CSS File ملف CSS غير صالح - + CSS file '%1' does not exist. ملف CSS '%1' غير موجود. - + Warning تحذير - + Some changed settings will require restarting Olive to take effect بعض اﻹعدادات المعدلة تتطلب من زيتون إعادة التشغيل لتأخذ تأثيرها - + Confirm Reset All Shortcuts أكّد تصفير كل اﻹختصارات - + Are you sure you wish to reset all keyboard shortcuts to their defaults? هل أنت متأكد أنك ترغب بتصفير جميع أختصارات لوحة المفاتيح لقيمهم اﻹفتراضية؟ - + Import Keyboard Shortcuts أستيراد أخصارات لوحة المفاتيح - - + + Error saving shortcuts خطأ حفظ اﻹختصارات - + Failed to open file for reading فشل في فتح الملف للقراءة - + Export Keyboard Shortcuts تصدير أختصارات لوحة المفاتيح - + Export Shortcuts تصدير اﻹختصارات - + Shortcuts exported successfully صُدرت اﻷختصارات بنجاح - + Failed to open file for writing فشل في فتح الملف للكتابة - + Browse for CSS file أبحث عن ملف CSS + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: اللغة: - + Custom CSS: CSS مخصوص: - + Browse تصفّح - + Image sequence formats: صيغ صور المقاطع: - + Audio Recording: تسجيل الصوت: - + Mono اُحادي - + Stereo مُجسم - + Effect Textbox Lines: للمراجعة أثر بسطور صندوق النص: - + Thumbnail Resolution: دقّة الصورة المصغرة: - + Waveform Resolution: دقّة الشكل الموجي: - + + Delete Previews + + + + Use Software Fallbacks When Possible أستعمل معالجة البرمجيات حين اﻹمكان - + General عام - + Behavior السلوك - Disable Multithreading on Images - عطل تعدد المعالجات بالصور + عطل تعدد المعالجات بالصور - + Seeking للمراجعة التنزيل - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) للمراجعة @@ -1934,7 +1978,7 @@ Always show the correct frame (visual may pause briefly as correct frame is retr دوماً أظهر اﻹطار الصحيح (البصريات قد تتوقف بإيجاز كلما تستجلب اﻹطارات بدقة) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) للمراجعة الشديدة @@ -1942,101 +1986,101 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff أنقل بسرعة (قد يعمق روئية اﻹطارات غير الصحيحة - لا يؤثر الترديد/تصدير) - + Memory Usage أستعمال الذاكرة - + Upcoming Frame Queue: إطار الصف القادم: - - + + frames اﻹطارات - - + + seconds الثوان - + Previous Frame Queue: إطار الصف السابق: - + Playback للمراجعة الترديد - + Output Device: جهاز اﻹخراج: - - + + Default إفتراضي - + Input Device: جهاز اﻹدخال: - + Sample Rate: معدل الإعتيان: - + Audio الصوت - + Search for action or shortcut ابحث عن إجراء أو أختصار - + Action إجراء - + Shortcut أختصار - + Import أستيراد - + Export تصدير - + Reset Selected صفّر المحدد - + Reset All صفّر الجميع - + Keyboard لوحة المفاتيح @@ -2044,12 +2088,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 لا يمكن فتح الملف - %1 - + Could not find stream information - %1 لم يتم العثور على ملومات التدفق - %1 @@ -2078,13 +2122,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files كل الملفات - + No active sequence لا مقاطع نشطة @@ -2139,12 +2183,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff الملف '%1' يبدو كأنه جزء من سلسلة صور. هل تريد أستيراده هكذا؟ - + Import media... أستيراد وسائط... - + No sequence is active, please open the sequence you want to delete clips from. لا مقطع نشط, رجاءً أفتح المقطع المراد حذف جزء منه. @@ -2733,140 +2777,140 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff <لا شيء> - + Effect already exists المؤثر موجود مسبقاً - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? المقطع '%1' يحتوي على المؤثر '%2'. هل تفضل أستبداله مع الملصوق أو إضافته كمؤثر منفصل؟ - + Add أضف - + Replace أستبدل - + Skip تخطى - + Do this for all conflicts found أفعل هذا مع كل التعارضات الموجودة - + Title... العنوان... - + Solid Color... بحاجة لمتابعة لون صلب... - + Bars... ألواح... - + Tone... نغّم... - + Noise... ضجيج... - + Unsaved Project مشروع غير محفوظ - + You must save this project before you can record audio in it. يجب عليك حفظ المشروع قبل تسجيل الصوت فيه. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) أنقر على الخط الزمني حيث تريد بدء التسجيل (أسحب لوضع حد للتسجيل في إطار وقت معين) - + Pointer Tool أداة المؤشر - + Edit Tool أداة التحرير - + Ripple Tool أداة الموجة - + Razor Tool أداة القطع - + Slip Tool بحاجة لمتابعة أداة المنزلقة - + Slide Tool أداة الشريحة - + Hand Tool أداة اليد - + Transition Tool أداة اﻷنتقال - + Snapping بحاجة لمتابعة الساحبة - + Zoom In تقريب - + Zoom Out أبتعاد - + Record audio سجّل الصوت - + Add title, solid, bars, etc. أضف عنوان, صلب, ألواح, إلخ. @@ -3213,58 +3257,64 @@ Duration: %4 VSTHost - - + + + Error loading VST plugin خطأ تحميل إضافة VST - + Failed to create VST reference فشل إنشاء مرجع VST - + Failed to load VST plugin "%1": %2 فشب تحميل إضافة VST "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. ملحوظة: لا يمكنك تحميل إضافة VST 32-بت لنسخة زيتون مبنية ل64-بت. رجاءً جد نسخة 64-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 32-بت. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. ملحوظة: لا يمكنك تحميل إضافة VST 64-بت لنسخة زيتون مبنية ل32-بت. رجاءً جد نسخة 32-بت من هذه الإضافة أو أنتقل لنسخة زيتون مبنية على 64-بت. - + + Failed to locate entry point for dynamic library. + + + + VST Error خطأ VST - + Plugin's magic number is invalid رقم اﻹضافة السحري غير صالح - + Plugin إضافة - + Interface واجهة - + Show أظهر - + VST Plugin إضافة VST @@ -3282,7 +3332,7 @@ Duration: %4 عارض الوسائط - + (none) (لا شيء) @@ -3290,57 +3340,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... احفظ اﻹطار كصورة... - + Show Fullscreen أظهر ملء الشاشة - + Disable تعطيل - + Screen %1: %2x%3 الشاشة %1: %2x%3 - + Zoom قرّب - + Fit وائم - + Custom مخصوص - + Close Media أغلق الوسائط - + Save Frame أحفظ اﻹطار - + Viewer Zoom تقريب الرؤية - + Set Custom Zoom Value: حدد قيمة تقريب مخصصة: @@ -3348,7 +3398,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen الخروج من ملء الشاشة diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts index e7807dc66..eedba77d9 100644 --- a/ts/olive_cs.ts +++ b/ts/olive_cs.ts @@ -717,14 +717,14 @@ LabelSlider - - + + Set Value Nastavit hodnotu - - + + New value: Nová hodnota: @@ -760,42 +760,42 @@ Tento projekt byl uložen v jiné verzi Olive a nemusí být plně slučitelný s touto verzí. Přesto se jej chcete pokusit nahrát? - + Invalid Clip Link Neplatný odkaz na záběr - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? Tento projekt obsahuje neplatný odkaz na záběr. Tento může být poškozen. Chcete pokračovat v jeho nahrávání? - + %1 - Line: %2 Col: %3 %1 - Řádek: %2 Sloupec: %3 - + User aborted loading Uživatelem přerušené nahrávání - + XML Parsing Error Chyba při zpracování XML - + Couldn't load '%1'. %2 Nepodařilo se nahrát '%1'. %2 - + Project Load Error Chyba při nahrávání projektu - + Error loading project: %1 Chyba při nahrávání projektu: %1 @@ -862,367 +862,367 @@ Vymazat bod začátku/konce - + No active sequence Žádná činná sekvence - + Please open the sequence you wish to export. Otevřete, prosím, sekvence, již chcete vyvést. - + Save Project As... Uložit projekt jako... - + Unsaved Project Neuložený projekt - + This project has changed since it was last saved. Would you like to save it before closing? Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? - + &File &Soubor - + &New &Nový - + &Open Project &Otevřít projekt - + Clear Recent List Vyprázdnit seznam naposledy otevřených souborů - + Open Recent Otevřít nedávné - + &Save Project &Uložit projekt - + Save Project &As Uložit projekt j&ako - + &Import... &Zavést... - + &Export... &Vyvést... - + E&xit &Ukončit - + &Edit Úp&ravy - + &Undo &Zpět - + Redo Znovu - + Cu&t Vyjmou&t - + Cop&y &Kopírovat - + &Paste &Vložit - + Paste Insert Vložit vložku - + Duplicate Zdvojit - + Delete Smazat - + Ripple Delete Vytáhnout - + Split Rozdělit - + Select &All Vybrat &vše - + Deselect All Zrušit výběr všeho - + Add Default Transition Přidat výchozí přechod - + Link/Unlink Spojit/Oddělit - + Enable/Disable Povolit/Zakázat - + Nest Vnořovat - + Ripple to In Point Vložit a posunout k bodu začátku - + Ripple to Out Point Vložit a posunout k bodu konce - + Edit to In Point Upravit po bod začátku - + Edit to Out Point Upravit po bod konce - + Delete In/Out Point Smazat bod začátku/konce - + Ripple Delete In/Out Point Vytáhnout bod začátku/konce - + Set/Edit Marker Nastavit/Upravit značku - + &View &Pohled - + Zoom In Přiblížit - + Zoom Out Oddálit - + Increase Track Height Zvětšit výšku stopy - + Decrease Track Height Zmenšit výšku stopy - + Toggle Show All Přepnout ukázání všeho - + Track Lines Řádky stop - + Rectified Waveforms Vlnový tvar odspodu - + Frames Snímky - + Drop Frame Zahodit snímek - + Non-Drop Frame Nezahodit snímek - + Milliseconds Milisekundy - + Title/Action Safe Area Bezpečná oblast - + Off Vypnuto - + Default Výchozí - + 4:3 4:3 - + 16:9 16:9 - + Custom Vlastní - + Full Screen Celá obrazovka - + Full Screen Viewer Prohlížeč na celou obrazovku - + &Playback &Přehrávání - + Go to Start Jít na začátek - + Previous Frame Předchozí snímek - + Play/Pause Přehrát/Pozastavit - + Play In to Out Přehrát od začátku po konec - + Next Frame Další snímek - + Go to End Jít na konec - + Go to Previous Cut Jít na předchozí záběr - + Go to Next Cut Jít na další záběr - + Go to In Point Jít na bod začátku - + Go to Out Point Jít na bod konce - + Shuttle Left - + Shuttle Stop - + Shuttle Right @@ -1239,258 +1239,258 @@ Zvýšit rychlost - + Loop Smyčka - + &Window &Okno - + Project Projekt - + Effect Controls Ovládání efektů - + Timeline Časová osa - + Graph Editor Editor grafu - + Media Viewer Prohlížeč záznamu - + Sequence Viewer Prohlížeč řady - + Maximize Panel Zvětšit panel - + Reset to Default Layout Obnovit výchozí rozvržení - + &Tools &Nástroje - + Pointer Tool Ukazovátko - + Edit Tool Nástroj pro úpravy - + Ripple Tool Vložení a posunutí - + Razor Tool Nástroj břitvy - + Slip Tool Roztočení se ztotožněním - + Slide Tool Roztočení - + Hand Tool Ručička - + Transition Tool Přechod - + Enable Snapping Povolit přichytávání - + Selecting Also Seeks Výběr také vyhledává - + Edit Tool Also Seeks Nástroj pro úpravy také vyhledává - + Edit Tool Selects Links Nástroj pro úpravy vybírá odkazy - + Seek Also Selects Vyhledávání také vybírá - + Seek to the End of Pastes Vyhledávat po konec vložení - + Scroll Wheel Zooms Kolečko myši přibližuje - + Enable Drag Files to Timeline Povolit tažení souborů na časovou osu - + Auto-Scale By Default Automaticky měnit velikost - + Enable Seek to Import Povolit vyhledávání k zavedení - + Audio Scrubbing Přehrávání zvuku při tažení ukazatele - + Enable Drop on Media to Replace Povolit upuštění na záznam pro nahrazení - + Enable Hover Focus Povolit zaměření při přejetí - + Ask For Name When Setting Marker Požádat o název při nastavení značky - + No Auto-Scroll Žádné automatické projíždění - + Page Auto-Scroll Stránkové automatické projíždění - + Smooth Auto-Scroll Jemné automatické projíždění - + Preferences Nastavení - + Clear Undo Vyprázdnit minulost kroků zpět - + &Help Nápo&věda - + A&ction Search Hledání č&inností - + Debug Log Zápis ladění - + &About... &O programu... - + <untitled> <bez názvu> - + Open Project... Otevřít projekt... - + Missing recent project Chybí nedávný projekt - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? - + Invalid aspect ratio Neplatný poměr stran - + The aspect ratio '%1' is invalid. Please try again. Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. - + Enter custom aspect ratio Zadat vlastní poměr stran - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): - + Nested Sequence Vnořená řada @@ -1541,27 +1541,31 @@ Snímkování: - %1 fields (%2 frames) - %1 polí (%2 snímků) + %1 polí (%2 snímků) - + + %1 field(s) (%2 frame(s)) + + + + Interlacing: Prokládání: - + Audio Frequency: Kmitočet zvuku: - + Audio Channels: Zvukové kanály: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1574,17 +1578,17 @@ Kmitočet zvuku: %5 Rozložení zvuku: %6 - + Name Název - + Duration Doba trvání - + Rate Rychlost @@ -1607,9 +1611,22 @@ Rozložení zvuku: %6 Obraz %1: %2x%3 %4 FPS - Audio %1: %2Hz %3 channels - Zvuk %1: %2Hz %3 kanálů + Zvuk %1: %2Hz %3 kanálů + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + @@ -1784,265 +1801,289 @@ Rozložení zvuku: %6 PreferencesDialog - + Preferences Nastavení - + Invalid CSS File Neplatný soubor CSS - + CSS file '%1' does not exist. Soubor CSS '%1' neexistuje. - + Warning Varování - + Some changed settings will require restarting Olive to take effect Některá změněná nastavení budou, aby se projevila, vyžadovat opětovné spuštění Olive - + Confirm Reset All Shortcuts Potvrdit obnovení výchozího nastavení všech klávesových zkratek - + Are you sure you wish to reset all keyboard shortcuts to their defaults? Jste si jistý, že chcete vrátit nastavení všech klávesových zkratek do jejich výchozího stavu? - + Import Keyboard Shortcuts Zavést klávesové zkratky - - + + Error saving shortcuts Chyba při ukládání klávesových zkratek - + Failed to open file for reading Soubor se nepodařilo otevřít pro čtení - + Export Keyboard Shortcuts Vyvést klávesové zkratky - + Export Shortcuts Vyvést zkratky - + Shortcuts exported successfully Zkratky úspěšně vyvedeny - + Failed to open file for writing Soubor se nepodařilo otevřít pro zápis - + Browse for CSS file Hledat soubor CSS + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: Jazyk: - + Custom CSS: Vlastní CSS: - + Browse Procházet - + Image sequence formats: Formáty obrázkové řady: - + Audio Recording: Nahrávání zvuku: - + Mono Mono - + Stereo Stereo - + Effect Textbox Lines: Řádky textového pole efektu: - + Thumbnail Resolution: Rozlišení náhledu: - + Waveform Resolution: Rozlišení tvaru vlny: - + + Delete Previews + + + + Use Software Fallbacks When Possible Zajištění skrze softwarovou zálohu - + General Obecné - + Behavior Chování - Disable Multithreading on Images - Zakázat vytvoření více vláken v jednom procesu na obrázky + Zakázat vytvoření více vláken v jednom procesu na obrázky - + Seeking Vyhledávání - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Přesné vyhledávání Vždy ukazovat správný snímek (obraz se při získávání správného snímku může na krátkou dobu pozastavit) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Rychlé vyhledávání Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - neovlivňuje přehrávání/vyvádění) - + Memory Usage Využití paměti - + Upcoming Frame Queue: Nadcházející řada snímků: - - + + frames snímků - - + + seconds sekund - + Previous Frame Queue: Předchozí řada snímků: - + Playback Přehrávání - + Output Device: Výstupní zařízení: - - + + Default Výchozí - + Input Device: Vstupní zařízení: - + Sample Rate: Vzorkovací kmitočet: - + Audio Zvuk - + Search for action or shortcut Hledat činnosti nebo klávesové zkratky - + Action Činnost - + Shortcut Zkratka - + Import Zavést - + Export Vyvést - + Reset Selected Obnovit výchozí hodnotu u vybraného - + Reset All Obnovit výchozí hodnotu u všeho - + Keyboard Klávesnice @@ -2050,12 +2091,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - PreviewGenerator - + Could not open file - %1 Nepodařilo se otevřít soubor - %1 - + Could not find stream information - %1 Nepodařilo se najít údaje o proudu - %1 @@ -2084,13 +2125,13 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - - + All Files Všechny soubory - + No active sequence Žádná činná řada @@ -2145,12 +2186,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Soubor '%1' se zdá být součástí obrázkové řady. Chcete ji zavést jako takovou? - + Import media... Zavést záznam... - + No sequence is active, please open the sequence you want to delete clips from. Žádná řada není činná. Otevřete, prosím, řadu, ve které chcete smazat záběry. @@ -2748,32 +2789,32 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - <žádná> - + Effect already exists Efekt již existuje - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Záběr '%1' již obsahuje '%2' efekt. Chcete jej nahradit vloženým nebo jej přidat jako samostatný efekt? - + Add Přidat - + Replace Nahradit - + Skip Přeskočit - + Do this for all conflicts found Použít na všechny nalezené střety @@ -2786,107 +2827,107 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Nastavit název značky: - + Title... Název... - + Solid Color... Plná barva... - + Bars... Zkušební tabulka... - + Tone... Tón... - + Noise... Šum... - + Unsaved Project Neuložený projekt - + You must save this project before you can record audio in it. Musíte tento projekt uložit, předtím než do něj můžete nahrát zvuk. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Klepněte na časovou osu, kde chcete začít s nahráváním (táhněte pro omezení nahrávky na určitý časový snímek) - + Pointer Tool Nástroj ukazovátka - + Edit Tool Nástroj pro úpravy - + Ripple Tool Nástroj pro vložení a posunutí - + Razor Tool Nástroj břitvy - + Slip Tool Roztočení se ztotožněním - + Slide Tool Roztočení - + Hand Tool Nástroj ručičky - + Transition Tool Nástroj pro přechod - + Snapping Přichytávání - + Zoom In Přiblížit - + Zoom Out Oddálit - + Record audio Nahrát zvuk - + Add title, solid, bars, etc. Přidat název, plný, zkušební tabulky atd. @@ -3229,58 +3270,64 @@ Doba trvání: %4 VSTHost - - + + + Error loading VST plugin Chyba při nahrávání přídavného modulu VST - + Failed to create VST reference Nepodařilo se vytvořit odkaz na VST - + Failed to load VST plugin "%1": %2 Nepodařilo se nahrát přídavný modul "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. Poznámka: Nemůžete nahrát 32 bitové přídavné moduly VST do 64 bitového sestavení Olive. Najděte, prosím, 64 bitovou verzi tohoto přídavného modulu nebo přepněte na 32 bitové sestavení Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. Poznámka: Nemůžete nahrát 64 bitové přídavné moduly VST do 32 bitového sestavení Olive. Najděte, prosím, 32 bitovou verzi tohoto přídavného modulu nebo přepněte na 64 bitové sestavení Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error Chyba VST - + Plugin's magic number is invalid Kouzelné číslo přídavného modulu je neplatné - + Plugin Přídavný modul - + Interface Rozhraní - + Show Ukázat - + VST Plugin Přídavný modul VST @@ -3298,7 +3345,7 @@ Doba trvání: %4 Prohlížeč záznamu - + (none) (žádný) @@ -3306,57 +3353,57 @@ Doba trvání: %4 ViewerWidget - + Save Frame as Image... Uložit snímek jako obrázek... - + Show Fullscreen Ukázat na celou obrazovku - + Disable Zakázat - + Screen %1: %2x%3 Obrazovka %1: %2x%3 - + Zoom Zvětšení - + Fit Vejít se - + Custom Vlastní - + Close Media Zavřít záznam - + Save Frame Uložit snímek - + Viewer Zoom Zvětšení prohlížeče - + Set Custom Zoom Value: Nastavit vlastní hodnotu zvětšení: @@ -3364,7 +3411,7 @@ Doba trvání: %4 ViewerWindow - + Exit Fullscreen Opustit celou obrazovku diff --git a/ts/olive_de.ts b/ts/olive_de.ts index 0da998680..b534abfb4 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -734,14 +734,14 @@ LabelSlider - - + + Set Value Wert ändern - - + + New value: Neuer Wert: @@ -777,44 +777,44 @@ Dieses Projekt wurde mit einer anderen Version von Olive gespeichert und ist möglicherweise nicht vollständig kompatibel. Wollen Sie trotzdem versuchen, es zu laden? - + Invalid Clip Link Ungültiger Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? Sounds better in German but has same sense Dieses Projekt enthält eine ungültige Verlinkung zu einem Clip. Das Projekt ist möglicherweise beschädigt. Wollen Sie es dennoch versuchen? - + %1 - Line: %2 Col: %3 %1 - Zeile: %2 Spalte: %3 - + User aborted loading Ladevorgang durch Nutzer abgebrochen - + XML Parsing Error Does not make sense to translate this XML Parsing Error - + Couldn't load '%1'. %2 '%1' konnte nicht geladen werden. (%2) - + Project Load Error Projektladefehler - + Error loading project: %1 Fehler beim Laden des Projektes: %1 @@ -882,373 +882,373 @@ Anfangs-/Endpunkt löschen - + No active sequence Keine aktive Sequenz - + Please open the sequence you wish to export. Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. - + Save Project As... Projekt speichern als... - + Unsaved Project Ungespeichertes Projekt - + This project has changed since it was last saved. Would you like to save it before closing? Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? - + &File &Datei - + &New &Neu - + &Open Project Projekt &öffnen - + Clear Recent List 'Zuletzt geöffnet' leeren - + Open Recent Zuletzt Verwendete öffnen - + &Save Project &Projekt speichern - + Save Project &As Projekt speichern &als... - + &Import... &Importieren... - + &Export... &Exportieren - + E&xit B&eenden - + &Edit &Bearbeiten - + &Undo &Rückgängig - + Redo Wiederholen - + Cu&t &Ausschneiden - + Cop&y &Kopieren - + &Paste &Einfügen - + Paste Insert - + Duplicate Duplizieren - + Delete Löschen - + Ripple Delete In Premiere's translations its also called "Ripple Delete" Ripple Delete - + Split Teilen - + Select &All Alles &auswählen - + Deselect All Auswahl aufheben - + Add Default Transition Standardübergang einfügen - + Link/Unlink Verbinden/Trennen - + Enable/Disable Einblenden/Ausblenden - + Nest Schachteln - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker Marker setzen/bearbeiten - + &View &Ansicht - + Zoom In Hereinzoomen - + Zoom Out Herauszoomen - + Increase Track Height Spurhöhe erhöhen - + Decrease Track Height Spurhöhe verringern - + Toggle Show All - + Track Lines Spurlinien - + Rectified Waveforms Nachgebesserte Waveforms - + Frames Bilder/Frames - + Drop Frame Same word used in German Drop Frame - + Non-Drop Frame Same word used in German Non-Drop Frame - + Milliseconds Millisekunden - + Title/Action Safe Area Sicherer Titelbereich - + Off Aus - + Default Standard - + 4:3 4:3 - + 16:9 16:9 - + Custom Benutzerdefiniert - + Full Screen Vollbild - + Full Screen Viewer Does this make sense? Vollbild-Viewer - + &Playback Should we translate this? Playback is also known &Wiedergabe - + Go to Start Zum Start gehen - + Previous Frame Vorheriger Frame - + Play/Pause Does not make sense to translate Play/Pause - + Play In to Out Von Anfang bis Ende wiedergeben - + Next Frame Nächster Frame - + Go to End Zum Ende springen - + Go to Previous Cut Zum vorherigen Schnitt springen - + Go to Next Cut Zum nächsten Schnitt springen - + Go to In Point Zum Anfangspunkt springen - + Go to Out Point Zum Endpunkt springen - + Shuttle Left - + Shuttle Stop - + Shuttle Right @@ -1266,265 +1266,265 @@ Geschwindigkeit erhöhen - + Loop Schleife - + &Window &Fenster - + Project Projekt - + Effect Controls Effektsteuerung - + Timeline Same as in english Timeline - + Graph Editor Grafischer Editor - + Media Viewer Does this make sense to translate? Media Viewer - + Sequence Viewer Does this make sense to translate? Sequence Viewer - + Maximize Panel Panel maximieren - + Reset to Default Layout Zum Standard-Layout zurücksetzen - + &Tools &Werkzeuge - + Pointer Tool Does this make sense? Zeiger - + Edit Tool Bearbeitungs-Werkzeug - + Ripple Tool Same as 'Ripple Delete' Ripple-Werkzeug - + Razor Tool Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool Hand-Werkzeug - + Transition Tool Übergangs-Werkzeug - + Enable Snapping Snapping aktivieren - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms Could be better Scrollrad zoomt - + Enable Drag Files to Timeline Dateien auf Timeline ziehen aktivieren - + Auto-Scale By Default Skaliere automatisch - + Enable Seek to Import - + Audio Scrubbing Same as in english Audio Scrubbing - + Enable Drop on Media to Replace Auf Medien zum Ersetzen ziehen aktivieren - + Enable Hover Focus - + Ask For Name When Setting Marker Nach Namen fragen, wenn Marker gesetzt wird - + No Auto-Scroll Kein Auto-Scroll - + Page Auto-Scroll Seiten Auto-Scroll - + Smooth Auto-Scroll Weiches Auto-Scroll - + Preferences Einstellungen - + Clear Undo Rückgängig-Historie leeren - + &Help &Hilfe - + A&ction Search &Aktionensuche - + Debug Log Same as in english Debug-Log - + &About... &Über... - + <untitled> <unbenannt> - + Open Project... Projekt öffnen... - + Missing recent project Zuletzt geöffnetes Projekt existiert nicht - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? - + Invalid aspect ratio Ungültiges Seitenverhältnis - + The aspect ratio '%1' is invalid. Please try again. Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. - + Enter custom aspect ratio Benutzerdefiniertes Seitenverhältnis eingeben - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): - + Nested Sequence Geschachtelte Sequenz @@ -1575,28 +1575,32 @@ Bildrate: - %1 fields (%2 frames) - %1 Felder (%2 frames) + %1 Felder (%2 frames) - + + %1 field(s) (%2 frame(s)) + + + + Interlacing: Same as in english Interlacing: - + Audio Frequency: Audiofrequenz: - + Audio Channels: Audiokanäle: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1609,17 +1613,17 @@ Audiofrequenz: %5 Audio Layout: %6 - + Name Name - + Duration Dauer - + Rate Same as in english, differently spoken, but same meaning Rate @@ -1644,9 +1648,21 @@ Audio Layout: %6 Video %1: %2x%3 %4FPS - Audio %1: %2Hz %3 channels - Audio %1: %2Hz %3 Kanäle + Audio %1: %2Hz %3 Kanäle + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + @@ -1828,268 +1844,292 @@ Audio Layout: %6 PreferencesDialog - + Preferences Einstellungen - + Invalid CSS File Ungültige CSS Datei - + CSS file '%1' does not exist. CSS Datei '%1' existiert nicht. - + Warning Achtung - + Some changed settings will require restarting Olive to take effect Einige Änderungen erfordern einen Neustart von Olive, um angwendet zu werden - + Confirm Reset All Shortcuts Bestätige das Zurücksetzen aller Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? Sind Sie sicher, dass Sie alle Tastatur-Shortcuts zurücksetzen wollen? - + Import Keyboard Shortcuts Tastatur-Shortcuts importieren - - + + Error saving shortcuts Fehler beim Speichern der Shortcuts - + Failed to open file for reading Fehler beim öffnen der Datei - + Export Keyboard Shortcuts Tastatur-Shortcuts exportieren - + Export Shortcuts Shortcuts exportieren - + Shortcuts exported successfully Shortcuts wurden erfolgreich exportiert - + Failed to open file for writing Fehler beim Schreiben der Datei - + Browse for CSS file Nach CSS Datei suchen + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: Sprache: - + Custom CSS: Benutzerdefiniertes CSS: - + Browse Durchsuchen - + Image sequence formats: Bilddateiformate: - + Audio Recording: Audioaufnahmen: - + Mono Same as in english Mono - + Stereo Same as in english Stereo - + Effect Textbox Lines: Effekt Textbox-Linien: - + Thumbnail Resolution: Thumbnail-Auflösung: - + Waveform Resolution: - + + Delete Previews + + + + Use Software Fallbacks When Possible Absicherung durch Software-Defaults - + General Allgemein - + Behavior Verhalten - Disable Multithreading on Images - Multithreading auf Bildern deaktiviern + Multithreading auf Bildern deaktiviern - + Seeking Suche - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Genaue Suche Zeigt immer den richtigen Frame (kann optisch kurzzeitig anhalten, wenn Frame abgefragt wird) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Schnelle Suche Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Plaback aus) - + Memory Usage Speicherauslastung - + Upcoming Frame Queue: Anstehende Frame-Warteschlange: - - + + frames Could also use 'Bilder' Frames - - + + seconds Sekunden - + Previous Frame Queue: Vorherige Frame-Warteschlange: - + Playback Wiedergabe - + Output Device: Ausgabegerät: - - + + Default Standard - + Input Device: Eingabegerät: - + Sample Rate: - + Audio Audio - + Search for action or shortcut Nach Eintrag oder Shortcut suchen - + Action Eintrag - + Shortcut Shortcut - + Import Importieren - + Export Exportieren - + Reset Selected Ausgewählte zurücksetzen - + Reset All Alle zurücksetzen - + Keyboard Tastatur @@ -2097,12 +2137,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf PreviewGenerator - + Could not open file - %1 Konnte Datei nicht öffnen - %1 - + Could not find stream information - %1 Konnte Stream-Informationen nicht finden - %1 @@ -2131,13 +2171,13 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf - + All Files Alle Dateien - + No active sequence Keine aktive Sequenz @@ -2192,12 +2232,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? - + Import media... Medien importieren... - + No sequence is active, please open the sequence you want to delete clips from. Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. @@ -2786,32 +2826,32 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf <keine> - + Effect already exists Effekt existiert bereits - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Der Clip '%1' enthält bereits den Effekt '%2'. Möchten Sie diesen ersetzen oder ihn als separaten Effekt hinzufügen? - + Add Hinzufügen - + Replace Ersetzen - + Skip Überspringen - + Do this for all conflicts found Auf alle gefundenen Konflikte anwenden @@ -2824,108 +2864,108 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Marker-Name setzen: - + Title... Titel... - + Solid Color... Solid... - + Bars... Balken... - + Tone... Ton... - + Noise... Rauschen... - + Unsaved Project Ungespeichertes Projekt - + You must save this project before you can record audio in it. Sie müssen das Projekt speichern, bevor Sie Audio aufnehmen können. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Klicken Sie auf die Timeline, an welcher Stelle Sie mit der Aufnahme beginnen möchten (Ziehen, um das Limit der Aufnahme auf einen bestimmten Timeframe zu setzen) - + Pointer Tool Pointer-Werkzeug - + Edit Tool Bearbeitungs-Werkzeug - + Ripple Tool Ripple-Werkzeug - + Razor Tool Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool Hand-Werkzeug - + Transition Tool Übergangs-Werkzeug - + Snapping Same as in english Snapping - + Zoom In Hereinzommen - + Zoom Out Herauszoomen - + Record audio Audio aufnehmen - + Add title, solid, bars, etc. Titel, Solid, Balken, etc. Hinzufügen @@ -3277,59 +3317,65 @@ Dauer: %4 VSTHost - - + + + Error loading VST plugin Fehler beim Laden des VST Plugins - + Failed to create VST reference Fehler beim Herstellen einer VST Referenz - + Failed to load VST plugin "%1": %2 Fehler beim Laden des VST Plugins "%1":%2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. HINWEIS: Sie können keine 32-bit VST Plugins in einer 64-bit Version von Olive laden. Sie benötigen entweder eine 64-bit Version des Plugins oder eine 32-bit Version von Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. HINWEIS: Sie können keine 64-bit VST Plugins in einer 32-bit Version von Olive laden. Sie benötigen entweder eine 32-bit Version des Plugins oder eine 64-bit Version von Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error VST Fehler - + Plugin's magic number is invalid Die Magic Number des Plugins ist ungültig - + Plugin Same as in english Plugin - + Interface Benutzeroberfläche - + Show Anzeigen - + VST Plugin Same as in english VST Plugin @@ -3348,7 +3394,7 @@ Dauer: %4 Medien-Viewer - + (none) (keine) @@ -3356,59 +3402,59 @@ Dauer: %4 ViewerWidget - + Save Frame as Image... Frame als Bild speichern... - + Show Fullscreen Vollbildschirm - + Disable Ausblenden - + Screen %1: %2x%3 Screen %1:%2x%3 - + Zoom Same as in english Zoom - + Fit Einpassen - + Custom Benutzerdefiniert - + Close Media Medien schließen - + Save Frame Frame speichern - + Viewer Zoom Makes no sense to translate Viewer Zoom - + Set Custom Zoom Value: Benutzerdefinierten Zoomwert angeben @@ -3416,7 +3462,7 @@ Dauer: %4 ViewerWindow - + Exit Fullscreen Vollbild verlassen diff --git a/ts/olive_es.ts b/ts/olive_es.ts index 031edc457..94382c716 100644 --- a/ts/olive_es.ts +++ b/ts/olive_es.ts @@ -711,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -754,42 +754,42 @@ - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -852,622 +852,622 @@ - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -1518,27 +1518,27 @@ - - %1 fields (%2 frames) + + %1 field(s) (%2 frame(s)) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1547,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1581,9 +1581,17 @@ Audio Layout: %6 - Audio %1: %2Hz %3 channels + Audio %1: %2Hz %3 + + + %n channel(s) + + + + + Conform to Frame Rate: @@ -1757,263 +1765,283 @@ Audio Layout: %6 PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: - + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + Thumbnail Resolution: - + Waveform Resolution: - + + Delete Previews + + + + Use Software Fallbacks When Possible - + General - + Behavior - - Disable Multithreading on Images - - - - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + Output Device: - - + + Default - + Input Device: - + Sample Rate: - + Audio - + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -2021,12 +2049,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -2055,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2116,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2703,137 +2731,137 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -3169,58 +3197,64 @@ Duration: %4 VSTHost - - + + + Error loading VST plugin - + Failed to create VST reference - + Failed to load VST plugin "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error - + Plugin's magic number is invalid - + Plugin - + Interface - + Show - + VST Plugin @@ -3238,7 +3272,7 @@ Duration: %4 - + (none) @@ -3246,57 +3280,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -3304,7 +3338,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts index d16ab6ea6..f9e8615e5 100644 --- a/ts/olive_fr.ts +++ b/ts/olive_fr.ts @@ -711,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -754,42 +754,42 @@ - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -852,622 +852,622 @@ - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -1518,27 +1518,27 @@ - - %1 fields (%2 frames) + + %1 field(s) (%2 frame(s)) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1547,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1581,9 +1581,17 @@ Audio Layout: %6 - Audio %1: %2Hz %3 channels + Audio %1: %2Hz %3 + + + %n channel(s) + + + + + Conform to Frame Rate: @@ -1757,263 +1765,283 @@ Audio Layout: %6 PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: - + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + Thumbnail Resolution: - + Waveform Resolution: - + + Delete Previews + + + + Use Software Fallbacks When Possible - + General - + Behavior - - Disable Multithreading on Images - - - - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + Output Device: - - + + Default - + Input Device: - + Sample Rate: - + Audio - + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -2021,12 +2049,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -2055,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2116,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2703,137 +2731,137 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -3169,58 +3197,64 @@ Duration: %4 VSTHost - - + + + Error loading VST plugin - + Failed to create VST reference - + Failed to load VST plugin "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error - + Plugin's magic number is invalid - + Plugin - + Interface - + Show - + VST Plugin @@ -3238,7 +3272,7 @@ Duration: %4 - + (none) @@ -3246,57 +3280,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -3304,7 +3338,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_it.ts b/ts/olive_it.ts index 214618149..7729daca6 100644 --- a/ts/olive_it.ts +++ b/ts/olive_it.ts @@ -711,14 +711,14 @@ LabelSlider - - + + Set Value - - + + New value: @@ -754,42 +754,42 @@ - + Invalid Clip Link - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? - + %1 - Line: %2 Col: %3 - + User aborted loading - + XML Parsing Error - + Couldn't load '%1'. %2 - + Project Load Error - + Error loading project: %1 @@ -852,622 +852,622 @@ - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -1518,27 +1518,27 @@ - - %1 fields (%2 frames) + + %1 field(s) (%2 frame(s)) - + Interlacing: - + Audio Frequency: - + Audio Channels: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1547,17 +1547,17 @@ Audio Layout: %6 - + Name - + Duration - + Rate @@ -1581,9 +1581,17 @@ Audio Layout: %6 - Audio %1: %2Hz %3 channels + Audio %1: %2Hz %3 + + + %n channel(s) + + + + + Conform to Frame Rate: @@ -1757,263 +1765,283 @@ Audio Layout: %6 PreferencesDialog - + Preferences - + Invalid CSS File - + CSS file '%1' does not exist. - + Warning - + Some changed settings will require restarting Olive to take effect - + Confirm Reset All Shortcuts - + Are you sure you wish to reset all keyboard shortcuts to their defaults? - + Import Keyboard Shortcuts - - + + Error saving shortcuts - + Failed to open file for reading - + Export Keyboard Shortcuts - + Export Shortcuts - + Shortcuts exported successfully - + Failed to open file for writing - + Browse for CSS file + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: - + Custom CSS: - + Browse - + Image sequence formats: - + Audio Recording: - + Mono - + Stereo - + Effect Textbox Lines: - + Thumbnail Resolution: - + Waveform Resolution: - + + Delete Previews + + + + Use Software Fallbacks When Possible - + General - + Behavior - - Disable Multithreading on Images - - - - + Seeking - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) - + Memory Usage - + Upcoming Frame Queue: - - + + frames - - + + seconds - + Previous Frame Queue: - + Playback - + Output Device: - - + + Default - + Input Device: - + Sample Rate: - + Audio - + Search for action or shortcut - + Action - + Shortcut - + Import - + Export - + Reset Selected - + Reset All - + Keyboard @@ -2021,12 +2049,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 - + Could not find stream information - %1 @@ -2055,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2116,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2703,137 +2731,137 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Effect already exists - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? - + Add - + Replace - + Skip - + Do this for all conflicts found - + Title... - + Solid Color... - + Bars... - + Tone... - + Noise... - + Unsaved Project - + You must save this project before you can record audio in it. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Snapping - + Zoom In - + Zoom Out - + Record audio - + Add title, solid, bars, etc. @@ -3169,58 +3197,64 @@ Duration: %4 VSTHost - - + + + Error loading VST plugin - + Failed to create VST reference - + Failed to load VST plugin "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error - + Plugin's magic number is invalid - + Plugin - + Interface - + Show - + VST Plugin @@ -3238,7 +3272,7 @@ Duration: %4 - + (none) @@ -3246,57 +3280,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... - + Show Fullscreen - + Disable - + Screen %1: %2x%3 - + Zoom - + Fit - + Custom - + Close Media - + Save Frame - + Viewer Zoom - + Set Custom Zoom Value: @@ -3304,7 +3338,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index 891e992d7..f09293692 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -716,14 +716,14 @@ LabelSlider - - + + Set Value Установить значение - - + + New value: Новое значение: @@ -759,42 +759,42 @@ Этот проект был сохранён в другой версии Olive, которая неполностью совместима с установленной у вас. Всё-таки попробовать загрузить? - + Invalid Clip Link Некорректная связь клипов - + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? В проекте обнаружена некорректная связь клипов. Всё-таки попробовать загрузить её? - + %1 - Line: %2 Col: %3 - + User aborted loading Пользователь прервал загрузку - + XML Parsing Error Ошибка разбора XML - + Couldn't load '%1'. %2 Не удалось загрузить '%1'. %2 - + Project Load Error Ошибка при загрузке проекта - + Error loading project: %1 Ошибка при загрузке проекта: %1 @@ -861,367 +861,367 @@ Очистить точку входа/выхода - + No active sequence Нет активных последовательностей - + Please open the sequence you wish to export. Откройте последовательность, которую хотите экспортировать - + Save Project As... Сохранить проект как… - + Unsaved Project Несохранённый проект - + This project has changed since it was last saved. Would you like to save it before closing? Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? - + &File &Файл - + &New &Создать - + &Open Project &Открыть проект - + Clear Recent List Очистить список - + Open Recent Открыть недавний - + &Save Project Со&хранить проект - + Save Project &As Сохранить проект &как - + &Import... &Импортировать… - + &Export... &Экспортировать…. - + E&xit В&ыход - + &Edit &Правка - + &Undo &Отменить - + Redo Вернуть - + Cu&t В&ырезать - + Cop&y С&копировать - + &Paste &Вставить - + Paste Insert - + Duplicate Сделать копию - + Delete Удалить - + Ripple Delete Удалить со сдвигом - + Split Разделить - + Select &All Выд&елить всё - + Deselect All Снять выделение - + Add Default Transition Добавить переход по умолчанию - + Link/Unlink Связать/Убрать связь - + Enable/Disable Включить/Отключить - + Nest Вложить - + Ripple to In Point Сдвиг до точки входа - + Ripple to Out Point Сдвиг до точки выхода - + Edit to In Point Правка до точки входа - + Edit to Out Point Правка до точки выхода - + Delete In/Out Point Удалить точку входа/выхода - + Ripple Delete In/Out Point Удалить со сдвигом точку входа/выхода - + Set/Edit Marker Установить/Изменить маркер - + &View &Вид - + Zoom In Приблизить - + Zoom Out Отдалить - + Increase Track Height Увеличить высоту дорожки - + Decrease Track Height Уменьшить высоту дорожки - + Toggle Show All Показывать весь проект - + Track Lines Линии дорожек - + Rectified Waveforms Волновая форма от низа - + Frames Кадры - + Drop Frame С пропуском кадров - + Non-Drop Frame Без пропуска кадров - + Milliseconds Миллисекунды - + Title/Action Safe Area Безопасная область - + Off Выкл. - + Default По умолчанию - + 4:3 4:3 - + 16:9 16:9 - + Custom Другая - + Full Screen Полноэкранный режим - + Full Screen Viewer Монитор в полноэкранном режиме - + &Playback Вос&произведение - + Go to Start К началу - + Previous Frame К предыдущему кадру - + Play/Pause Воспроизведение/Пауза - + Play In to Out Проиграть от входа до выхода - + Next Frame К следующему кадру - + Go to End В конец - + Go to Previous Cut - + Go to Next Cut - + Go to In Point К точке входа - + Go to Out Point К точке выхода - + Shuttle Left - + Shuttle Stop - + Shuttle Right @@ -1238,257 +1238,257 @@ Увеличить скорость - + Loop Петля - + &Window &Окно - + Project Проект - + Effect Controls Управление эффектами - + Timeline Таймлайн - + Graph Editor Редактор графов - + Media Viewer Монитор проекта - + Sequence Viewer Монитор последовательностей - + Maximize Panel Развернуть панель - + Reset to Default Layout Вернуть исходный вид панелей - + &Tools &Инструменты - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Enable Snapping Включить прилипание - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms Колесо мыши масштабирует таймлайн - + Enable Drag Files to Timeline Разрешить перетаскивание файлов на таймлайн извне - + Auto-Scale By Default Автоматически масштабировать по умолчанию - + Enable Seek to Import - + Audio Scrubbing Воспроизводить звук при прокрутке - + Enable Drop on Media to Replace - + Enable Hover Focus Включить фокус наводкой - + Ask For Name When Setting Marker Спрашивать имя маркера при добавлении - + No Auto-Scroll Без автопрокрутки - + Page Auto-Scroll Прокручивать перелистыванием - + Smooth Auto-Scroll Прокручивать плавно - + Preferences Параметры - + Clear Undo Очистить историю изменений - + &Help &Справка - + A&ction Search &Найти команду - + Debug Log Журнал отладки - + &About... &О программе… - + <untitled> <без названия> - + Open Project... Открыть проект… - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence Вложенная последовательность @@ -1539,27 +1539,31 @@ Частота кадров: - %1 fields (%2 frames) - полей: %1 (кадров: %2) + полей: %1 (кадров: %2) - + + %1 field(s) (%2 frame(s)) + + + + Interlacing: Чересстрочность: - + Audio Frequency: Частота звука: - + Audio Channels: Звуковых каналов: - + Name: %1 Video Dimensions: %2x%3 Frame Rate: %4 @@ -1572,17 +1576,17 @@ Audio Layout: %6 Звуковые каналы: %6 - + Name Название - + Duration Длительность - + Rate Частота @@ -1605,9 +1609,22 @@ Audio Layout: %6 Видео %1: %2x%3 %4к/с - Audio %1: %2Hz %3 channels - Звук %1: %2Гц %3 каналов + Звук %1: %2Гц %3 каналов + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + @@ -1782,265 +1799,289 @@ Audio Layout: %6 PreferencesDialog - + Preferences Параметры - + Invalid CSS File Некорректный файл CSS - + CSS file '%1' does not exist. Файл CSS '%1' не существует. - + Warning Предупреждение - + Some changed settings will require restarting Olive to take effect Некоторые изменения параметров вступят в силу только при следующем запуске Olive - + Confirm Reset All Shortcuts Подтвердите действие - + Are you sure you wish to reset all keyboard shortcuts to their defaults? Вы действительно хотите сбросить все клавиатурные комбинации к исходным значениям? - + Import Keyboard Shortcuts Импортировать клавиатурные комбинации - - + + Error saving shortcuts Ошибка при сохранении клавиатурных комбинаций - + Failed to open file for reading Не удалось открыть файл для чтения - + Export Keyboard Shortcuts Экспортировать клавиатурные комбинации - + Export Shortcuts Экспортировать клавиатурные комбинации - + Shortcuts exported successfully Комбинации успешно экспортированы - + Failed to open file for writing Не удалось открыть файл для записи - + Browse for CSS file Указать файл CSS + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + Language: Язык: - + Custom CSS: Свой CSS: - + Browse Просмотр - + Image sequence formats: Форматы изображений: - + Audio Recording: Запись звука: - + Mono Моно - + Stereo Стерео - + Effect Textbox Lines: Строк в редакторе титров: - + Thumbnail Resolution: Разрешение миниатюр: - + Waveform Resolution: Разрешение волновой формы: - + + Delete Previews + + + + Use Software Fallbacks When Possible - + General Общие - + Behavior Поведение - Disable Multithreading on Images - Отключить многопоточность для изображений + Отключить многопоточность для изображений - + Seeking Позиционирование - + Accurate Seeking Always show the correct frame (visual may pause briefly as correct frame is retrieved) Точное позиционирование Всегда показывать правильный кадр; на его получение может уходить немного времени - + Fast Seeking Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) Быстрое позиционирование Переходы без пауз, возможен кратковременный показ неправильного кадра в мониторе - + Memory Usage Использование памяти - + Upcoming Frame Queue: Очередь последующих кадров: - - + + frames кадров - - + + seconds секунд - + Previous Frame Queue: Очередь предыдущих кадров: - + Playback Воспроизведение - + Output Device: Устройство выхода: - - + + Default По умолчанию - + Input Device: Устройство входа: - + Sample Rate: Частота дискретизации: - + Audio Звук - + Search for action or shortcut Искать действие или комбинацию клавиш - + Action Действие - + Shortcut Комбинация - + Import Импортировать - + Export Экспортировать - + Reset Selected Сбросить выбранное - + Reset All Сбросить все - + Keyboard Клавиатурные комбинации @@ -2048,12 +2089,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff PreviewGenerator - + Could not open file - %1 Не удалось открыть файл — %1 - + Could not find stream information - %1 Не удалось найти информацию потока — %1 @@ -2082,13 +2123,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files Все файлы - + No active sequence Нет активных последовательностей @@ -2143,12 +2184,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? - + Import media... Импортировать медиафайлы… - + No sequence is active, please open the sequence you want to delete clips from. Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. @@ -2730,32 +2771,32 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff <нет> - + Effect already exists Эффект уже добавлен - + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? Клип '%1' уже содержит эффект '%2'. Хотите заменить его на вставляемый эффект или добавить вставляемый эффект как отдельный? - + Add Добавить - + Replace Заменить - + Skip Пропустить - + Do this for all conflicts found Применить для всех конфликтов @@ -2772,107 +2813,107 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Установить название маркера последовательности: - + Title... Титры… - + Solid Color... Цветная заливка… - + Bars... Испытательная таблица… - + Tone... Звуковой сигнал… - + Noise... Шум… - + Unsaved Project Несохранённый проект - + You must save this project before you can record audio in it. Перед записью звука необходимо сохранить проект. - + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) Щелкните на таймлайне в точке, от которой хотите начать запись звука. Перетащите курсор после щелчка, чтобы сразу задать длительность записи. - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Snapping Прилипание - + Zoom In Приблизить - + Zoom Out Отдалить - + Record audio Записать звук - + Add title, solid, bars, etc. Добавить титры, заливку цветом, испытательную таблицу и т.д. @@ -3215,58 +3256,64 @@ Duration: %4 VSTHost - - + + + Error loading VST plugin Ошибка при загрузке плагина VST - + Failed to create VST reference - + Failed to load VST plugin "%1": %2 - + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. - + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. - + + Failed to locate entry point for dynamic library. + + + + VST Error - + Plugin's magic number is invalid - + Plugin Плагин - + Interface Интерфейс - + Show Показать - + VST Plugin Плагин VST @@ -3284,7 +3331,7 @@ Duration: %4 Монитор проекта - + (none) (нет) @@ -3292,57 +3339,57 @@ Duration: %4 ViewerWidget - + Save Frame as Image... Сохранить кадр как изображение… - + Show Fullscreen Полноэкранный режим - + Disable Отключить - + Screen %1: %2x%3 Экран %1: %2×%3 - + Zoom Масштаб - + Fit Уместить - + Custom Другой - + Close Media Закрыть файл - + Save Frame Сохранить кадр - + Viewer Zoom Масштаб просмотра - + Set Custom Zoom Value: Другое значение масштаба: @@ -3350,7 +3397,7 @@ Duration: %4 ViewerWindow - + Exit Fullscreen Выйти из полноэкранного режима From 28a38e11504ded888b35cebd10a7e21c0c099579 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 11 Feb 2019 02:51:49 -0800 Subject: [PATCH 157/202] updated windows travis --- .travis.yml | 2 +- .travis/before_install.sh | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4f8fe8933..be5d689cc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ matrix: env: ARCH=x86_64 before_install: - - source ./.travis/before_install.sh + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then choco install msys2 -y; else source ./.travis/before_install.sh; fi install: - source ./.travis/install.sh diff --git a/.travis/before_install.sh b/.travis/before_install.sh index edad318ca..75b153289 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -1,9 +1,5 @@ #!/bin/bash -#if [[ "$TRAVIS_OS_NAME" == "osx" ]] -#then - # do nothing -#elif [[ "$TRAVIS_OS_NAME" == "linux" ]] if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then # install apt repos necessary for Olive From 92ea56642e5b6cc7b20193a4a10e86423c50009f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 11 Feb 2019 03:18:46 -0800 Subject: [PATCH 158/202] disabled windows build, updated to ffmpeg 4 --- .travis.yml | 6 +++--- .travis/before_install.sh | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index be5d689cc..b718c49b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,11 +13,11 @@ matrix: sudo: require dist: trusty - os: osx - - os: windows - env: ARCH=x86_64 + # Can't build on Windows - affected by https://travis-ci.community/t/current-known-issues-please-read-this-before-posting-a-new-topic/264/10 + # - os: windows before_install: - - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then choco install msys2 -y; else source ./.travis/before_install.sh; fi + - source ./.travis/before_install.sh install: - source ./.travis/install.sh diff --git a/.travis/before_install.sh b/.travis/before_install.sh index 75b153289..d16ea4f65 100644 --- a/.travis/before_install.sh +++ b/.travis/before_install.sh @@ -5,6 +5,7 @@ if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then # install apt repos necessary for Olive sudo add-apt-repository ppa:beineri/opt-qt593-trusty -y sudo add-apt-repository ppa:jonathonf/ffmpeg-3 -y + sudo add-apt-repository ppa:jonathonf/ffmpeg-4 -y sudo apt-get update -qq elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then From 3b6a3cfee51480ce739e4233889a4d8524b0e1dc Mon Sep 17 00:00:00 2001 From: Peter Eszlari Date: Tue, 12 Feb 2019 11:00:03 +0100 Subject: [PATCH 159/202] linux/wayland: fix icon --- main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.cpp b/main.cpp index 06b4b7532..6f6ff5640 100644 --- a/main.cpp +++ b/main.cpp @@ -87,8 +87,10 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); a.setWindowIcon(QIcon(":/icons/olive64.png")); + QCoreApplication::setOrganizationName("olivevideoeditor.org"); QCoreApplication::setOrganizationDomain("olivevideoeditor.org"); QCoreApplication::setApplicationName("Olive"); + QGuiApplication::setDesktopFileName("org.olivevideoeditor.Olive"); MainWindow w(nullptr, appName); w.updateTitle(""); From 09039dd90308bfad609e19089090cff6257cf33f Mon Sep 17 00:00:00 2001 From: Alexandre Prokoudine Date: Tue, 12 Feb 2019 22:03:28 +0300 Subject: [PATCH 160/202] Update Russian translation --- ts/olive_ru.ts | 70 +++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index f09293692..bd00569fd 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -27,12 +27,12 @@ Advanced Video Settings - + Дополнительные параметры видео Pixel Format: - + Формат пикселей: @@ -385,12 +385,12 @@ Invalid Codec - + Некорректный кодек Failed to find a suitable encoder for this codec. Export will likely fail. - + Не удалось найти подходящий кодировщик для этого кодека. Экспорт не гарантирован. @@ -481,7 +481,7 @@ Advanced - + Дополнительно @@ -1213,17 +1213,17 @@ Shuttle Left - + Уменьшить скорость Shuttle Stop - + Пауза Shuttle Right - + Увеличить скорость Decrease Speed @@ -1340,27 +1340,27 @@ Selecting Also Seeks - + Выделение с перемоткой Edit Tool Also Seeks - + Выделение с перемоткой Edit Tool Selects Links - + Выделение выбирает связи Seek Also Selects - + Перемотка с выделением Seek to the End of Pastes - + Перемотка до конца вставок @@ -1370,7 +1370,7 @@ Enable Drag Files to Timeline - Разрешить перетаскивание файлов на таймлайн извне + Разрешить перетаскивание на таймлайн извне @@ -1460,17 +1460,17 @@ Missing recent project - + Отсутствует недавний проект The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Проект '%1' больше не существует. Удалить его из списка недавних? Invalid aspect ratio - + Некорректное соотношение сторон @@ -1480,7 +1480,7 @@ Enter custom aspect ratio - + Введите другое соотношение сторон @@ -1498,17 +1498,17 @@ Set Marker - Установить маркер + Установить маркер Set clip marker name: - Установить название маркера клипа: + Название маркера клипа: Set sequence marker name: - Установить название маркера последовательности: + Название маркера последовательности: @@ -1545,7 +1545,7 @@ %1 field(s) (%2 frame(s)) - + полей: %1 (кадров: %2) @@ -1620,10 +1620,10 @@ Audio Layout: %6 %n channel(s) - - - - + + %n канал + %n канала + %n каналов @@ -1639,7 +1639,7 @@ Audio Layout: %6 Auto (%1) - + Авто (%1) @@ -1877,22 +1877,22 @@ Audio Layout: %6 Delete All Previews - + Удалить все миниатюры Are you sure you want to delete all previews? - + Действительно удалить все миниатюры? Previews Deleted - + Миниатюры удалены All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - + Все миниатюры успешно удалены. Возможно, понадобится заново открыть проект, чтобы изменения вступили в силу. @@ -1947,12 +1947,12 @@ Audio Layout: %6 Delete Previews - + Удалить миниатюры Use Software Fallbacks When Possible - + По возможности использовать программную реализацию вместо аппаратной @@ -2547,7 +2547,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Would you like to delete the proxy file "%1" as well? - + Заодно удалить прокси-файл "%1"? @@ -3250,7 +3250,7 @@ Duration: %4 Length - + Длительность From 8db130529c08b74ed42983d5baa32eb26f3a5aff Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 12 Feb 2019 14:27:37 -0800 Subject: [PATCH 161/202] addressed #479 and #483 --- .../1024x1024/org.olivevideoeditor.Olive.png | Bin 203063 -> 0 bytes ts/olive_cs.ts | 151 +++++++++--------- 2 files changed, 75 insertions(+), 76 deletions(-) delete mode 100644 packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png diff --git a/packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png b/packaging/linux/icons/1024x1024/org.olivevideoeditor.Olive.png deleted file mode 100644 index 6ecaaddd7f15a92d833794d8f6603c1e5d488831..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203063 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 diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts index eedba77d9..fb181d259 100644 --- a/ts/olive_cs.ts +++ b/ts/olive_cs.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -27,12 +27,12 @@ Advanced Video Settings - + Pokročilá nastavení obrazu Pixel Format: - + Formát pixelu: @@ -196,54 +196,54 @@ Load Settings From File - + Nahrát nastavení ze souboru Save Settings to File - + Uložit nastavení do souboru Save Effect Settings - + Uložit nastavení efektu Effect XML Settings %1 - + Nastavení XML efektu %1 Save Settings Failed - + Nastavení se nepodařilo uložit Failed to open "%1" for writing. - + Nepodařilo se otevřít "%1" pro zápis. Load Effect Settings - + Nahrát nastavení efektu Load Settings Failed - + Nastavení se nepodařilo nahrát Failed to open "%1" for reading. - + Nepodařilo se otevřít "%1" pro čtení. This settings file doesn't match this effect. - + Tento soubor s nastavením neodpovídá tomuto efektu. @@ -325,7 +325,7 @@ Unknown codec name %1 - + Neznámý název kodeku %1 @@ -386,17 +386,17 @@ Invalid Codec - + Neplatný kodek Failed to find a suitable encoder for this codec. Export will likely fail. - + Nepodařilo se najít vhodný kodér pro tento kodek. Vyvedení pravděpodobně selže. Failed to find pixel format for this encoder. Export will likely fail. - + Nepodařilo se najít formát pixelu pro tento kodér. Vyvedení pravděpodobně selže. @@ -482,7 +482,7 @@ Advanced - + Pokročilé @@ -844,7 +844,7 @@ Enable/Disable In/Out Point - Povolit/Zakázat bod začátku/konce + Povolit/Zakázat bod začátku/konce @@ -869,7 +869,7 @@ Please open the sequence you wish to export. - Otevřete, prosím, sekvence, již chcete vyvést. + Otevřete, prosím, sekvenci, již chcete vyvést. @@ -1214,29 +1214,29 @@ Shuttle Left - + Jezdit tam a zpět vlevo Shuttle Stop - + Zastavit pendlování Shuttle Right - + Jezdit tam a zpět vpravo Decrease Speed - Snížit rychlost + Snížit rychlost Pause - Pozastavit + Pozastavit Increase Speed - Zvýšit rychlost + Zvýšit rychlost @@ -1281,8 +1281,7 @@ Maximize Panel - Zvětšit panel - + Zvětšit panel @@ -1500,17 +1499,17 @@ Set Marker - Nastavit značku + Nastavit značku Set clip marker name: - + Nastavit název značky záběru: Set sequence marker name: - + Nastavit název značky sekvence: @@ -1542,12 +1541,12 @@ %1 fields (%2 frames) - %1 polí (%2 snímků) + %1 polí (%2 snímků) %1 field(s) (%2 frame(s)) - + %1 pole(í) (%2 snímek(y)) @@ -1612,20 +1611,20 @@ Rozložení zvuku: %6 Audio %1: %2Hz %3 channels - Zvuk %1: %2Hz %3 kanálů + Zvuk %1: %2Hz %3 kanálů Audio %1: %2Hz %3 - + Zvuk %1: %2Hz %3 %n channel(s) - - - - + + %n kanál + %n kanály + %n kanálů @@ -1795,7 +1794,7 @@ Rozložení zvuku: %6 Generating Proxy: %1% - + Vytvoření proxy: %1% @@ -1879,22 +1878,22 @@ Rozložení zvuku: %6 Delete All Previews - + Smazat všechny náhledy Are you sure you want to delete all previews? - + Opravdu chcete smazat všechny náhledy? Previews Deleted - + Náhledy smazány All previews deleted succesfully. You may have to re-open your current project for changes to take effect. - + Všechny náhledy byly úspěšně smazány. Možná budete muset nynější projekt otevřít znovu, aby se změny projevily. @@ -1949,7 +1948,7 @@ Rozložení zvuku: %6 Delete Previews - + Smazat náhledy @@ -1968,7 +1967,7 @@ Rozložení zvuku: %6 Disable Multithreading on Images - Zakázat vytvoření více vláken v jednom procesu na obrázky + Zakázat vytvoření více vláken v jednom procesu na obrázky @@ -2250,19 +2249,19 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - ProRes SQ - ProRes SQ + ProRes SQ ProRes LT - ProRes LT + ProRes LT DNxHD - DNxHD + DNxHD H.264 - H.264 + H.264 @@ -2277,12 +2276,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Proxy file exists - + Soubor proxy existuje The file "%1" already exists. Do you wish to replace it? - + Soubor "%1" již existuje. Chcete jej nahradit? @@ -2295,7 +2294,7 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Finished generating proxy for "%1" - + Dokončeno vytvoření proxy pro "%1" @@ -2515,12 +2514,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Generating proxy: %1% complete - + Vytvoření proxy: %1% hotovo Create/Modify Proxy - + Vytvořit/Změnit proxy @@ -2530,12 +2529,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Modify Proxy - + Změnit proxy Restore Original - + Obnovit původní @@ -2560,12 +2559,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Delete proxy - + Smazat proxy Would you like to delete the proxy file "%1" as well? - + Chcete smazat i soubor proxy "%1"? @@ -2820,11 +2819,11 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Set Marker - Nastavit značku + Nastavit značku Set marker name: - Nastavit název značky: + Nastavit název značky: @@ -2945,47 +2944,47 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - &Undo - &Zpět + &Zpět &Redo - + &Znovu C&ut - + Vyj&mout Cop&y - &Kopírovat + &Kopírovat &Paste - &Vložit + &Vložit R&ipple Delete - + &Vytáhnout (smazat a posunout) Sequence Settings - + Nastavení sekvence &Speed/Duration - + &Rychlost/Doba trvání Auto-s&cale - + Automatická &změna velikosti @@ -2995,17 +2994,17 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - &Nest - + &Vnořovat &Reveal in Project - + &Odkrýt v projektu R&ename - + &Přejmenovat @@ -3259,12 +3258,12 @@ Doba trvání: %4 Transition Length: - Délka: + Délka: Length - + Délka @@ -3299,7 +3298,7 @@ Doba trvání: %4 Failed to locate entry point for dynamic library. - + Nepodařilo se najít vstupní bod pro dynamickou knihovnu. From 158e69fd06650b98f0fdef4ab7c4a3285ce8abaf Mon Sep 17 00:00:00 2001 From: elsandosgrande <40576902+elsandosgrande@users.noreply.github.com> Date: Wed, 13 Feb 2019 00:46:50 +0100 Subject: [PATCH 162/202] Add files via upload --- olive.pro | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/olive.pro b/olive.pro index df1ac6c08..096aaa482 100644 --- a/olive.pro +++ b/olive.pro @@ -255,7 +255,11 @@ TRANSLATIONS += \ ts/olive_it.ts \ ts/olive_cs.ts \ ts/olive_ar.ts \ - ts/olive_ru.ts + ts/olive_ru.ts \ + ts/olive_bs.ts \ + ts/olive_sr.ts + + win32 { RC_FILE = packaging/windows/resources.rc From d4365a389c4ec0201c97c1e1e9c0b2aa02112e70 Mon Sep 17 00:00:00 2001 From: elsandosgrande <40576902+elsandosgrande@users.noreply.github.com> Date: Wed, 13 Feb 2019 00:49:04 +0100 Subject: [PATCH 163/202] Add files via upload --- ts/olive_bs.ts | 3382 ++++++++++++++++++++++++++++++++++++++++++++++++ ts/olive_sr.ts | 3381 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 6763 insertions(+) create mode 100644 ts/olive_bs.ts create mode 100644 ts/olive_sr.ts diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts new file mode 100644 index 000000000..909a216e2 --- /dev/null +++ b/ts/olive_bs.ts @@ -0,0 +1,3382 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + To the best of my knowledge, there is no translation for free as in libre that sounds quite as nicely as slobodan. + Olive je nelinearni video uređivač. Ovaj software je slobodan i zaštićen GNU GPL-om. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive tim je pod obavezom da obavijesti svoje korisnike da je Olive-ov izvorni kod dostupan za preuzimanje sa njegove web stranice + + + + ActionSearch + + + Search for action... + Potražite radnju... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Napredne video postavke + + + + Pixel Format: + Pixel format: + + + + Audio + + + Audio + Audio + + + + Recording + Snimanje + + + + AudioNoiseEffect + + + Amount + Količina + + + + Mix + Miks + + + + ChannelLayoutName + + + Invalid + Nevažeće + + + + Mono + Mono + + + + Stereo + Stereo + + + + CollapsibleWidget + + + <untitled> + <neimenovano> + + + + ColorButton + + + Set Color + Postavi boju + + + + CornerPinEffect + + + Top Left + Gornje lijevo + + + + Top Right + Gornje desno + + + + Bottom Left + Donje lijevo + + + + Bottom Right + Donje desno + + + + Perspective + Perspektiva + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Unknown codec name %1 + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Advanced + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + Nevažeće + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Welcome to %1 + Dobrodišli u %1 + + + + Auto-recovery + Automatski oporavak + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Maximize Panel + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + <neimenovano> + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + Audio + + + + Sample Rate: + + + + + Name: + + + + + PanEffect + + + Pan + + + + + Playback + + + Generating Proxy: %1% + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + Mono + + + + Stereo + Stereo + + + + Effect Textbox Lines: + + + + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + Audio + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Search media, markers, etc. + + + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + &Undo + + + + + &Redo + + + + + C&ut + + + + + Cop&y + + + + + &Paste + + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + + + + Link/Unlink + + + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + Količina + + + + Mix + Miks + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length + + + + + VSTHost + + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts new file mode 100644 index 000000000..c647840a2 --- /dev/null +++ b/ts/olive_sr.ts @@ -0,0 +1,3381 @@ + + + + + AboutDialog + + + Olive is a non-linear video editor. This software is free and protected by the GNU GPL. + Olive је нелинеарни видео уређивач. Овај софтвер је слободани заштићен GNU GPL-ом. + + + + Olive Team is obliged to inform users that Olive source code is available for download from its website. + Olive тим је под обавезом да обавести своје кориснике да је Olive-ов изворни код доступан за преузимање са његове веб странице. + + + + ActionSearch + + + Search for action... + Потражите радњу... + + + + AdvancedVideoDialog + + + Advanced Video Settings + Напредне видео поставке + + + + Pixel Format: + Пиксел формат: + + + + Audio + + + Audio + Аудио + + + + Recording + Снимање + + + + AudioNoiseEffect + + + Amount + Количина + + + + Mix + Микс + + + + ChannelLayoutName + + + Invalid + Неважеће + + + + Mono + Моно + + + + Stereo + Стерео + + + + CollapsibleWidget + + + <untitled> + <неименовано> + + + + ColorButton + + + Set Color + Постави боју + + + + CornerPinEffect + + + Top Left + Горње лево + + + + Top Right + Горње десно + + + + Bottom Left + Доње лево + + + + Bottom Right + Доње десно + + + + Perspective + Перспектива + + + + DebugDialog + + + Debug Log + + + + + DemoNotice + + + + Welcome to Olive! + + + + + Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. + + + + + This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 + + + + + Thank you for trying Olive and we hope you enjoy it! + + + + + Effect + + + Invalid effect + + + + + No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. + + + + + Cu&t + + + + + &Copy + + + + + Move &Up + + + + + Move &Down + + + + + D&elete + + + + + Load Settings From File + + + + + Save Settings to File + + + + + Save Effect Settings + + + + + + Effect XML Settings %1 + + + + + Save Settings Failed + + + + + Failed to open "%1" for writing. + + + + + Load Effect Settings + + + + + + Load Settings Failed + + + + + Failed to open "%1" for reading. + + + + + This settings file doesn't match this effect. + + + + + EffectControls + + + Effects: + + + + + &Paste + + + + + Add Video Effect + + + + + VIDEO EFFECTS + + + + + Add Video Transition + + + + + Add Audio Effect + + + + + AUDIO EFFECTS + + + + + Add Audio Transition + + + + + (Multiple clips selected) + + + + + EffectRow + + + Disable Keyframes + + + + + Disabling keyframes will delete all current keyframes. Are you sure you want to do this? + + + + + EmbeddedFileChooser + + + File: + + + + + ExportDialog + + + Export "%1" + + + + + Unknown codec name %1 + + + + + Export Failed + + + + + Export failed - %1 + + + + + Invalid dimensions + + + + + Export width and height must both be even numbers/divisible by 2. + + + + + Invalid codec + + + + + Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. + + + + + Invalid format + + + + + Couldn't determine output format. This is a bug, please contact the developers. + + + + + Export Media + + + + + Quality-based (Constant Rate Factor) + + + + + Constant Bitrate + + + + + + Invalid Codec + + + + + Failed to find a suitable encoder for this codec. Export will likely fail. + + + + + Failed to find pixel format for this encoder. Export will likely fail. + + + + + Bitrate (Mbps): + + + + + Quality (CRF): + + + + + Quality Factor: + +0 = lossless +17-18 = visually lossless (compressed, but unnoticeable) +23 = high quality +51 = lowest quality possible + + + + + Target File Size (MB): + + + + + Format: + + + + + Range: + + + + + Entire Sequence + + + + + In to Out + + + + + Video + + + + + + Codec: + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Compression Type: + + + + + Advanced + + + + + Sampling Rate: + + + + + Bitrate (Kbps/CBR): + + + + + ExportThread + + + failed to send frame to encoder (%1) + + + + + failed to receive packet from encoder (%1) + + + + + could not video encoder for %1 + + + + + could not allocate video stream + + + + + could not allocate video encoding context + + + + + could not open output video encoder (%1) + + + + + could not copy video encoder parameters to output stream (%1) + + + + + could not audio encoder for %1 + + + + + could not allocate audio stream + + + + + could not allocate audio encoding context + + + + + could not open output audio encoder (%1) + + + + + could not copy audio encoder parameters to output stream (%1) + + + + + could not allocate audio buffer (%1) + + + + + could not create output format context + + + + + could not open output file (%1) + + + + + could not write output file header (%1) + + + + + could not write output file trailer (%1) + + + + + FillLeftRightEffect + + + Type + + + + + Fill Left with Right + + + + + Fill Right with Left + + + + + Frei0rEffect + + + Failed to load Frei0r plugin "%1": %2 + + + + + NOTE: You can't load 32-bit Frei0r plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit Frei0r plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Error loading Frei0r plugin + + + + + GraphEditor + + + Graph Editor + + + + + Linear + + + + + Bezier + + + + + Hold + + + + + GraphView + + + Zoom to Selection + + + + + Zoom to Show All + + + + + Reset View + + + + + InterlacingName + + + None (Progressive) + + + + + Top Field First + + + + + Bottom Field First + + + + + Invalid + Неважеће + + + + KeyframeNavigator + + + Enable Keyframes + + + + + KeyframeView + + + Linear + + + + + Bezier + + + + + Hold + + + + + LabelSlider + + + + Set Value + + + + + + New value: + + + + + LoadDialog + + + Loading... + + + + + Loading '%1'... + + + + + Cancel + + + + + LoadThread + + + Version Mismatch + + + + + This project was saved in a different version of Olive and may not be fully compatible with this version. Would you like to attempt loading it anyway? + + + + + Invalid Clip Link + + + + + This project contains an invalid clip link. It may be corrupt. Would you like to continue loading it? + + + + + %1 - Line: %2 Col: %3 + + + + + User aborted loading + + + + + XML Parsing Error + + + + + Couldn't load '%1'. %2 + + + + + Project Load Error + + + + + Error loading project: %1 + + + + + MainWindow + + + Welcome to %1 + + + + + Auto-recovery + + + + + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? + + + + + &Project + + + + + &Sequence + + + + + &Folder + + + + + Set In Point + + + + + Set Out Point + + + + + Reset In Point + + + + + Reset Out Point + + + + + Clear In/Out Point + + + + + No active sequence + + + + + Please open the sequence you wish to export. + + + + + Save Project As... + + + + + Unsaved Project + + + + + This project has changed since it was last saved. Would you like to save it before closing? + + + + + &File + + + + + &New + + + + + &Open Project + + + + + Clear Recent List + + + + + Open Recent + + + + + &Save Project + + + + + Save Project &As + + + + + &Import... + + + + + &Export... + + + + + E&xit + + + + + &Edit + + + + + &Undo + + + + + Redo + + + + + Cu&t + + + + + Cop&y + + + + + &Paste + + + + + Paste Insert + + + + + Duplicate + + + + + Delete + + + + + Ripple Delete + + + + + Split + + + + + Select &All + + + + + Deselect All + + + + + Add Default Transition + + + + + Link/Unlink + + + + + Enable/Disable + + + + + Nest + + + + + Ripple to In Point + + + + + Ripple to Out Point + + + + + Edit to In Point + + + + + Edit to Out Point + + + + + Delete In/Out Point + + + + + Ripple Delete In/Out Point + + + + + Set/Edit Marker + + + + + &View + + + + + Zoom In + + + + + Zoom Out + + + + + Increase Track Height + + + + + Decrease Track Height + + + + + Toggle Show All + + + + + Track Lines + + + + + Rectified Waveforms + + + + + Frames + + + + + Drop Frame + + + + + Non-Drop Frame + + + + + Milliseconds + + + + + Title/Action Safe Area + + + + + Off + + + + + Default + + + + + 4:3 + + + + + 16:9 + + + + + Custom + + + + + Full Screen + + + + + Full Screen Viewer + + + + + &Playback + + + + + Go to Start + + + + + Previous Frame + + + + + Play/Pause + + + + + Play In to Out + + + + + Next Frame + + + + + Go to End + + + + + Go to Previous Cut + + + + + Go to Next Cut + + + + + Go to In Point + + + + + Go to Out Point + + + + + Shuttle Left + + + + + Shuttle Stop + + + + + Shuttle Right + + + + + Loop + + + + + &Window + + + + + Project + + + + + Effect Controls + + + + + Timeline + + + + + Graph Editor + + + + + Media Viewer + + + + + Sequence Viewer + + + + + Maximize Panel + + + + + Reset to Default Layout + + + + + &Tools + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Enable Snapping + + + + + Selecting Also Seeks + + + + + Edit Tool Also Seeks + + + + + Edit Tool Selects Links + + + + + Seek Also Selects + + + + + Seek to the End of Pastes + + + + + Scroll Wheel Zooms + + + + + Enable Drag Files to Timeline + + + + + Auto-Scale By Default + + + + + Enable Seek to Import + + + + + Audio Scrubbing + + + + + Enable Drop on Media to Replace + + + + + Enable Hover Focus + + + + + Ask For Name When Setting Marker + + + + + No Auto-Scroll + + + + + Page Auto-Scroll + + + + + Smooth Auto-Scroll + + + + + Preferences + + + + + Clear Undo + + + + + &Help + + + + + A&ction Search + + + + + Debug Log + + + + + &About... + + + + + <untitled> + <неименовано> + + + + Open Project... + + + + + Missing recent project + + + + + The project '%1' no longer exists. Would you like to remove it from the recent projects list? + + + + + Invalid aspect ratio + + + + + The aspect ratio '%1' is invalid. Please try again. + + + + + Enter custom aspect ratio + + + + + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): + + + + + Nested Sequence + + + + + Marker + + + Set Marker + + + + + Set clip marker name: + + + + + Set sequence marker name: + + + + + Media + + + New Folder + + + + + Name: + + + + + Filename: + + + + + Video Dimensions: + + + + + Frame Rate: + + + + + %1 field(s) (%2 frame(s)) + + + + + Interlacing: + + + + + Audio Frequency: + + + + + Audio Channels: + + + + + Name: %1 +Video Dimensions: %2x%3 +Frame Rate: %4 +Audio Frequency: %5 +Audio Layout: %6 + + + + + Name + + + + + Duration + + + + + Rate + + + + + MediaPropertiesDialog + + + "%1" Properties + + + + + Tracks: + + + + + Video %1: %2x%3 %4FPS + + + + + Audio %1: %2Hz %3 + + + + + %n channel(s) + + + + + + + + + Conform to Frame Rate: + + + + + Alpha is Premultiplied + + + + + Auto (%1) + + + + + Interlacing: + + + + + Name: + + + + + NewSequenceDialog + + + Editing "%1" + + + + + New Sequence + + + + + Preset: + + + + + Film 4K + + + + + TV 4K (Ultra HD/2160p) + + + + + 1080p + + + + + 720p + + + + + 480p + + + + + 360p + + + + + 240p + + + + + 144p + + + + + NTSC (480i) + + + + + PAL (576i) + + + + + Custom + + + + + Video + + + + + Width: + + + + + Height: + + + + + Frame Rate: + + + + + Pixel Aspect Ratio: + + + + + Square Pixels (1.0) + + + + + Interlacing: + + + + + None (Progressive) + + + + + Audio + Аудио + + + + Sample Rate: + + + + + Name: + + + + + PanEffect + + + Pan + + + + + Playback + + + Generating Proxy: %1% + + + + + PreferencesDialog + + + Preferences + + + + + Invalid CSS File + + + + + CSS file '%1' does not exist. + + + + + Warning + + + + + Some changed settings will require restarting Olive to take effect + + + + + Confirm Reset All Shortcuts + + + + + Are you sure you wish to reset all keyboard shortcuts to their defaults? + + + + + Import Keyboard Shortcuts + + + + + + Error saving shortcuts + + + + + Failed to open file for reading + + + + + Export Keyboard Shortcuts + + + + + Export Shortcuts + + + + + Shortcuts exported successfully + + + + + Failed to open file for writing + + + + + Browse for CSS file + + + + + Delete All Previews + + + + + Are you sure you want to delete all previews? + + + + + Previews Deleted + + + + + All previews deleted succesfully. You may have to re-open your current project for changes to take effect. + + + + + Language: + + + + + Custom CSS: + + + + + Browse + + + + + Image sequence formats: + + + + + Audio Recording: + + + + + Mono + Моно + + + + Stereo + Стерео + + + + Effect Textbox Lines: + + + + + Thumbnail Resolution: + + + + + Waveform Resolution: + + + + + Delete Previews + + + + + Use Software Fallbacks When Possible + + + + + General + + + + + Behavior + + + + + Seeking + + + + + Accurate Seeking +Always show the correct frame (visual may pause briefly as correct frame is retrieved) + + + + + Fast Seeking +Seek quickly (may briefly show inaccurate frames when seeking - doesn't affect playback/export) + + + + + Memory Usage + + + + + Upcoming Frame Queue: + + + + + + frames + + + + + + seconds + + + + + Previous Frame Queue: + + + + + Playback + + + + + Output Device: + + + + + + Default + + + + + Input Device: + + + + + Sample Rate: + + + + + Audio + Аудио + + + + Search for action or shortcut + + + + + Action + + + + + Shortcut + + + + + Import + + + + + Export + + + + + Reset Selected + + + + + Reset All + + + + + Keyboard + + + + + PreviewGenerator + + + Could not open file - %1 + + + + + Could not find stream information - %1 + + + + + Project + + + Search media, markers, etc. + + + + + Project + + + + + Sequence + + + + + Replace '%1' + + + + + + All Files + + + + + + No active sequence + + + + + No sequence is active, please open the sequence you want to replace clips from. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself, so no clips of this media would be in this sequence. + + + + + Rename '%1' + + + + + Enter new name: + + + + + Delete media in use? + + + + + The media '%1' is currently used in '%2'. Deleting it will remove all instances in the sequence. Are you sure you want to do this? + + + + + Skip + + + + + Image sequence detected + + + + + The file '%1' appears to be part of an image sequence. Would you like to import it as such? + + + + + Import media... + + + + + No sequence is active, please open the sequence you want to delete clips from. + + + + + ProxyDialog + + + Create Proxy + + + + + Proxy + + + + + Dimensions: + + + + + Same Size as Source + + + + + Half Resolution (1/2) + + + + + Quarter Resolution (1/4) + + + + + Eighth Resolution (1/8) + + + + + Sixteenth Resolution (1/16) + + + + + Format: + + + + + ProRes HQ + + + + + Location: + + + + + Same as Source (in "%1" folder) + + + + + Proxy file exists + + + + + The file "%1" already exists. Do you wish to replace it? + + + + + Custom Location + + + + + ProxyGenerator + + + Finished generating proxy for "%1" + + + + + ReplaceClipMediaDialog + + + Replace clips using "%1" + + + + + Select which media you want to replace this media's clips with: + + + + + Keep the same media in-points + + + + + Replace + + + + + Cancel + + + + + No media selected + + + + + Please select a media to replace with or click 'Cancel'. + + + + + Same media selected + + + + + You selected the same media that you're replacing. Please select a different one or click 'Cancel'. + + + + + Folder selected + + + + + You cannot replace footage with a folder. + + + + + Active sequence selected + + + + + You cannot insert a sequence into itself. + + + + + Sequence + + + %1 (copy) + + + + + ShakeEffect + + + Intensity + + + + + Rotation + + + + + Frequency + + + + + SolidEffect + + + Type + + + + + Solid Color + + + + + SMPTE Bars + + + + + Checkerboard + + + + + Opacity + + + + + Color + + + + + Checkerboard Size + + + + + SourcesCommon + + + Import... + + + + + New + + + + + View + + + + + Tree View + + + + + Icon View + + + + + Show Toolbar + + + + + Show Sequences + + + + + Replace/Relink Media + + + + + Reveal in Explorer + + + + + Reveal in Finder + + + + + Reveal in File Manager + + + + + Replace Clips Using This Media + + + + + Create Sequence With This Media + + + + + Duplicate + + + + + Delete All Clips Using This Media + + + + + Proxy + + + + + Generating proxy: %1% complete + + + + + Create/Modify Proxy + + + + + Create Proxy + + + + + Modify Proxy + + + + + Restore Original + + + + + Delete + + + + + Properties... + + + + + Replace Media + + + + + You dropped a file onto '%1'. Would you like to replace it with the dropped file? + + + + + Delete proxy + + + + + Would you like to delete the proxy file "%1" as well? + + + + + SpeedDialog + + + Speed/Duration + + + + + Speed: + + + + + Frame Rate: + + + + + Duration: + + + + + Reverse + + + + + Maintain Audio Pitch + + + + + Ripple Changes + + + + + TextEditDialog + + + Edit Text + + + + + TextEffect + + + Text + + + + + Font + + + + + Size + + + + + Color + + + + + Alignment + + + + + Left + + + + + + Center + + + + + Right + + + + + Justify + + + + + Top + + + + + Bottom + + + + + Word Wrap + + + + + Outline + + + + + Outline Color + + + + + Outline Width + + + + + Shadow + + + + + Shadow Color + + + + + Shadow Distance + + + + + Shadow Softness + + + + + Shadow Opacity + + + + + Sample Text + + + + + &Edit Text + + + + + TimecodeEffect + + + Timecode + + + + + Sequence + + + + + Media + + + + + Scale + + + + + Color + + + + + Background Color + + + + + Background Opacity + + + + + Offset + + + + + Prepend + + + + + Timeline + + + Timeline: + + + + + <none> + + + + + Effect already exists + + + + + Clip '%1' already contains a '%2' effect. Would you like to replace it with the pasted one or add it as a separate effect? + + + + + Add + + + + + Replace + + + + + Skip + + + + + Do this for all conflicts found + + + + + Title... + + + + + Solid Color... + + + + + Bars... + + + + + Tone... + + + + + Noise... + + + + + Unsaved Project + + + + + You must save this project before you can record audio in it. + + + + + Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe) + + + + + Pointer Tool + + + + + Edit Tool + + + + + Ripple Tool + + + + + Razor Tool + + + + + Slip Tool + + + + + Slide Tool + + + + + Hand Tool + + + + + Transition Tool + + + + + Snapping + + + + + Zoom In + + + + + Zoom Out + + + + + Record audio + + + + + Add title, solid, bars, etc. + + + + + TimelineHeader + + + Center Timecodes + + + + + TimelineWidget + + + &Undo + + + + + &Redo + + + + + C&ut + + + + + Cop&y + + + + + &Paste + + + + + R&ipple Delete + + + + + Sequence Settings + + + + + &Speed/Duration + + + + + Auto-s&cale + + + + + Link/Unlink + + + + + &Nest + + + + + &Reveal in Project + + + + + R&ename + + + + + %1 +Start: %2 +End: %3 +Duration: %4 + + + + + Rename '%1' + + + + + Rename multiple clips + + + + + Enter a new name for this clip: + + + + + Error + + + + + Couldn't locate media wrapper for sequence. + + + + + Title + + + + + Solid Color + + + + + Bars + + + + + Tone + + + + + Noise + + + + + Duration: + + + + + ToneEffect + + + Type + + + + + Frequency + + + + + Amount + Количина + + + + Mix + Микс + + + + TransformEffect + + + Position + + + + + Scale + + + + + Uniform Scale + + + + + Rotation + + + + + Anchor Point + + + + + Opacity + + + + + Blend Mode + + + + + Normal + + + + + Darken + + + + + Multiply + + + + + Color Burn + + + + + Linear Burn + + + + + Lighten + + + + + Screen + + + + + Color Dodge + + + + + Linear Dodge (Add) + + + + + Overlay + + + + + Soft Light + + + + + Hard Light + + + + + Vivid Light + + + + + Linear Light + + + + + Pin Light + + + + + Hard Mix + + + + + Difference + + + + + Exclusion + + + + + Reflect + + + + + Substract + + + + + Average + + + + + Glow + + + + + Negation + + + + + Phoenix + + + + + Transition + + + Length + + + + + VSTHost + + + + + Error loading VST plugin + + + + + Failed to create VST reference + + + + + Failed to load VST plugin "%1": %2 + + + + + NOTE: You can't load 32-bit VST plugins into a 64-bit build of Olive. Please find a 64-bit version of this plugin or switch to a 32-bit build of Olive. + + + + + NOTE: You can't load 64-bit VST plugins into a 32-bit build of Olive. Please find a 32-bit version of this plugin or switch to a 64-bit build of Olive. + + + + + Failed to locate entry point for dynamic library. + + + + + VST Error + + + + + Plugin's magic number is invalid + + + + + Plugin + + + + + Interface + + + + + Show + + + + + VST Plugin + + + + + Viewer + + + Sequence Viewer + + + + + Media Viewer + + + + + (none) + + + + + ViewerWidget + + + Save Frame as Image... + + + + + Show Fullscreen + + + + + Disable + + + + + Screen %1: %2x%3 + + + + + Zoom + + + + + Fit + + + + + Custom + + + + + Close Media + + + + + Save Frame + + + + + Viewer Zoom + + + + + Set Custom Zoom Value: + + + + + ViewerWindow + + + Exit Fullscreen + + + + + VoidEffect + + + (unknown) + + + + + Missing Effect + + + + + VolumeEffect + + + Volume + + + + + transition + + + Invalid transition + + + + + No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive. + + + + From 74906127192a4856295a1907b5d33cacb03ba87c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 12 Feb 2019 16:02:36 -0800 Subject: [PATCH 164/202] code revision --- mainwindow.cpp | 2 +- ui/cursors.cpp | 29 ++++++---- ui/cursors.h | 6 +- ui/timelinewidget.cpp | 125 +++++++++++++++++++++++++++++++++--------- 4 files changed, 122 insertions(+), 40 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index eb83b16d1..28f0991b1 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -96,7 +96,7 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : enable_launch_with_project(false), appName(an) { - initCustomCursors(); + init_custom_cursors(); open_debug_file(); diff --git a/ui/cursors.cpp b/ui/cursors.cpp index 65bb01f88..5b6056748 100644 --- a/ui/cursors.cpp +++ b/ui/cursors.cpp @@ -5,18 +5,25 @@ #include -QCursor Olive::left_side; -QCursor Olive::right_side; +QCursor Olive::Cursor_LeftTrim; +QCursor Olive::Cursor_RightTrim; -QCursor load_cursor(QString file, const int hotX, const int hotY, const bool right_aligned){ - int hotX_out; - QPixmap temp = QPixmap(file); - right_aligned? hotX_out = temp.width() : hotX_out = hotX; - return QCursor(temp,hotX_out,hotY); +QCursor load_cursor(const QString& file, int hotX, int hotY, const bool& right_aligned){ + // load specified file into a pixmap + QPixmap temp(file); + + // set cursor's horizontal hotspot + if (right_aligned) { + hotX = temp.width() - hotX; + } + + // return cursor + return QCursor(temp, hotX, hotY); } -void initCustomCursors(){ - qInfo() << "Loading Custom Cursors"; - Olive::left_side = load_cursor(":/cursors/left_side.png", 0,-1, false); - Olive::right_side = load_cursor(":/cursors/right_side.png", 0,-1, true); +void init_custom_cursors(){ + qInfo() << "Initializing custom cursors"; + Olive::Cursor_LeftTrim = load_cursor(":/cursors/left_side.png", 0, -1, false); + Olive::Cursor_RightTrim = load_cursor(":/cursors/right_side.png", 0, -1, true); + qInfo() << "Finished initializing custom cursors"; } diff --git a/ui/cursors.h b/ui/cursors.h index cec2bb514..f12f94868 100644 --- a/ui/cursors.h +++ b/ui/cursors.h @@ -3,11 +3,11 @@ #include -void initCustomCursors(); +void init_custom_cursors(); namespace Olive{ - extern QCursor left_side; - extern QCursor right_side; + extern QCursor Cursor_LeftTrim; + extern QCursor Cursor_RightTrim; } #endif // CURSORS_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 5aa17e26f..a977dc979 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1978,66 +1978,132 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER || panel_timeline->tool == TIMELINE_TOOL_RIPPLE || panel_timeline->tool == TIMELINE_TOOL_ROLLING) { + + // hide any tooltip that may be currently showing QToolTip::hideText(); + // cache cursor position QPoint pos = event->pos(); + // + // check to see if the cursor is on a clip edge + // + + // threshold around a trim point that the cursor can be within and still considered "trimming" int lim = 5; + long mouse_frame_lower = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()-lim)-1; + long mouse_frame_upper = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()+lim)+1; + + // current track that the cursor is on int mouse_track = getTrackFromScreenPoint(pos.y()); - long mouse_frame_lower = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()-lim)-1; - long mouse_frame_upper = panel_timeline->getTimelineFrameFromScreenPoint(pos.x()+lim)+1; - bool found = false; - bool left_arrow_cursor = false; - bool right_arrow_cursor = false; + + // used to determine whether we the cursor found a trim point or not + bool found = false; + + // used to determine whether the cursor is within the rect of a clip bool cursor_contains_clip = false; + + // used to determine how close the cursor is to a trim point + // (and more specifically, whether another point is closer or not) int closeness = INT_MAX; + + // while we loop through the clips, we cache the maximum/minimum tracks in this sequence int min_track = INT_MAX; int max_track = INT_MIN; + + // we default to selecting no transition, but set this accordingly if the cursor is on a transition panel_timeline->transition_select = TA_NO_TRANSITION; + + // set currently trimming clip to -1 (aka null) + panel_timeline->trim_target = -1; + + // loop through current clips in the sequence for (int i=0;iclips.size();i++) { Clip* c = sequence->clips.at(i); if (c != nullptr) { + + // cache track range min_track = qMin(min_track, c->track); max_track = qMax(max_track, c->track); + + // if this clip is on the same track the mouse is if (c->track == mouse_track) { + + // if this cursor is inside the boundaries of this clip (hovering over the clip) if (panel_timeline->cursor_frame >= c->timeline_in && panel_timeline->cursor_frame <= c->timeline_out) { + + // acknowledge that we are hovering over a clip cursor_contains_clip = true; + // start a timer to show a tooltip about this clip tooltip_timer.start(); tooltip_clip = i; - if (c->get_opening_transition() != nullptr && panel_timeline->cursor_frame <= c->timeline_in + c->get_opening_transition()->get_true_length()) { + // check if the cursor is specifically hovering over one of the clip's transitions + if (c->get_opening_transition() != nullptr + && panel_timeline->cursor_frame <= c->timeline_in + c->get_opening_transition()->get_true_length()) { + panel_timeline->transition_select = TA_OPENING_TRANSITION; - } else if (c->get_closing_transition() != nullptr && panel_timeline->cursor_frame >= c->timeline_out - c->get_closing_transition()->get_true_length()) { + + } else if (c->get_closing_transition() != nullptr + && panel_timeline->cursor_frame >= c->timeline_out - c->get_closing_transition()->get_true_length()) { + panel_timeline->transition_select = TA_CLOSING_TRANSITION; + } } + + // is the cursor hovering around the clip's IN point? if (c->timeline_in > mouse_frame_lower && c->timeline_in < mouse_frame_upper) { + + // test how close this IN point is to the cursor int nc = qAbs(c->timeline_in + 1 - panel_timeline->cursor_frame); + + // and test whether it's closer than the last in/out point we found if (nc < closeness) { + + // if so, this is the point we'll make active for now (unless we find a closer one later) panel_timeline->trim_target = i; panel_timeline->trim_in_point = true; closeness = nc; - found = true; - left_arrow_cursor = true; + found = true; + } } + + // is the cursor hovering around the clip's OUT point? if (c->timeline_out > mouse_frame_lower && c->timeline_out < mouse_frame_upper) { + + // test how close this OUT point is to the cursor int nc = qAbs(c->timeline_out - 1 - panel_timeline->cursor_frame); + + // and test whether it's closer than the last in/out point we found if (nc < closeness) { + + // if so, this is the point we'll make active for now (unless we find a closer one later) panel_timeline->trim_target = i; panel_timeline->trim_in_point = false; closeness = nc; - found = true; - right_arrow_cursor = true; + found = true; + } } + + // the pointer can be used to resize/trim transitions, here we test if the + // cursor is within the trim point of one of the clip's transitions if (panel_timeline->tool == TIMELINE_TOOL_POINTER) { + + // if the clip has an opening transition if (c->get_opening_transition() != nullptr) { + + // cache the timeline frame where the transition ends long transition_point = c->timeline_in + c->get_opening_transition()->get_true_length(); + // check if the cursor is hovering around it (within the threshold) if (transition_point > mouse_frame_lower && transition_point < mouse_frame_upper) { + + // similar to above, test how close it is and if it's closer, make this active int nc = qAbs(transition_point - 1 - panel_timeline->cursor_frame); if (nc < closeness) { panel_timeline->trim_target = i; @@ -2048,9 +2114,17 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } } } + + // if the clip has a closing transition if (c->get_closing_transition() != nullptr) { + + // cache the timeline frame where the transition starts long transition_point = c->timeline_out - c->get_closing_transition()->get_true_length(); + + // check if the cursor is hovering around it (within the threshold) if (transition_point > mouse_frame_lower && transition_point < mouse_frame_upper) { + + // similar to above, test how close it is and if it's closer, make this active int nc = qAbs(transition_point + 1 - panel_timeline->cursor_frame); if (nc < closeness) { panel_timeline->trim_target = i; @@ -2064,21 +2138,22 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } } } - } - /*if (cursor_contains_clip) { - QToolTip::showText(mapToGlobal(event->pos()), "HOVER OVER CLIP"); - }*/ - if (found) { - if (right_arrow_cursor && !panel_timeline->trim_in_point){ - setCursor(Olive::right_side); - }else if (left_arrow_cursor && panel_timeline->trim_in_point){ - setCursor(Olive::left_side); - }else - setCursor(Qt::SizeHorCursor); - } else { - panel_timeline->trim_target = -1; + } - // look for track heights + // if the cursor is indeed on a clip edge, we set the cursor accordingly + if (found) { + + if (panel_timeline->trim_in_point) { // if we're trimming an IN point + setCursor(Olive::Cursor_LeftTrim); + } else { // if we're trimming an OUT point + setCursor(Olive::Cursor_RightTrim); + } + + } else { + // we didn't find a trim target, so we must be doing something else + // (e.g. dragging a clip or resizing the track heights) + + // check to see if we're resizing a track height int track_y = 0; for (int i=0;iget_track_height_size(bottom_align);i++) { int track = (bottom_align) ? -1-i : i; From 9fd320de45ca2207a2e9c6ef86942b6f8d55cf8c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 12 Feb 2019 16:11:07 -0800 Subject: [PATCH 165/202] slight conformity changes --- dialogs/proxydialog.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/dialogs/proxydialog.cpp b/dialogs/proxydialog.cpp index 9f85b09d8..9aef33dcb 100644 --- a/dialogs/proxydialog.cpp +++ b/dialogs/proxydialog.cpp @@ -70,7 +70,9 @@ ProxyDialog::ProxyDialog(QWidget *parent, const QVector &footage) : void ProxyDialog::accept() { QVector info_list; - bool yesForAll = false; + + // set to TRUE if any existing proxies exist and the user chooses to overwrite all of them + bool overwrite_all_existing = false; for (int i=0;iproxy = true; From e1e6b23533d284c022af6a570f907e55d98f1e6f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 12 Feb 2019 16:46:22 -0800 Subject: [PATCH 166/202] added commenting to reveal media --- panels/project.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/panels/project.cpp b/panels/project.cpp index bc4f22bd1..c98e094d0 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -817,20 +817,28 @@ bool Project::reveal_media(Media *media, QModelIndex parent) { Media* m = project_model.getItem(item); if (m->get_type() == MEDIA_TYPE_FOLDER) { + + // if this item is a folder, recursively run this function to search it too if (reveal_media(media, item)) return true; + } else if (m == media) { - // expand all folders leading to this media + // if m == media, then we found the media object we were looking for + + // get sorter proxy item (the item that's "visible") QModelIndex sorted_index = sorter->mapFromSource(item); + // retrieve its parent item QModelIndex hierarchy = sorted_index.parent(); if (config.project_view_type == PROJECT_VIEW_TREE) { + + // if we're in tree view, expand every folder in the hierarchy containing the media while (hierarchy.isValid()) { tree_view->setExpanded(hierarchy, true); hierarchy = hierarchy.parent(); } - // select item + // select item (requires a QItemSelection object to select the whole row) QItemSelection row_select( sorter->index(sorted_index.row(), 0, sorted_index.parent()), sorter->index(sorted_index.row(), sorter->columnCount()-1, sorted_index.parent()) @@ -838,9 +846,16 @@ bool Project::reveal_media(Media *media, QModelIndex parent) { tree_view->selectionModel()->select(row_select, QItemSelectionModel::Select); } else if (config.project_view_type == PROJECT_VIEW_ICON) { + + // if we're in icon view, we just "browse" to the parent folder icon_view->setRootIndex(hierarchy); + + // select item in this folder icon_view->selectionModel()->select(sorted_index, QItemSelectionModel::Select); + + // update the "up" button state set_up_dir_enabled(); + } return true; From 73ac2d52d7ca109873f507b4c0e3033697f6b166 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 12 Feb 2019 18:26:05 -0800 Subject: [PATCH 167/202] added debug info to deb pkg for #460 --- debian/rules | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debian/rules b/debian/rules index 9a794c695..6bb702cee 100755 --- a/debian/rules +++ b/debian/rules @@ -4,6 +4,10 @@ export QT_SELECT := qt5 %: dh $@ +override_dh_auto_configure: + ls -a + dh_auto_configure + override_dh_auto_build: lrelease olive.pro dh_auto_build From 4890650466459fb9aefa8b7e49f378332068c0e6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 13 Feb 2019 01:45:34 -0800 Subject: [PATCH 168/202] added enable/disable to context menu --- ui/timelinewidget.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index a977dc979..82989339d 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -125,7 +125,9 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { // set autoscale to the first selected clip autoscaleAction->setChecked(selected_clips.at(0)->autoscale); - menu.addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links())); + menu.addAction(tr("Enable/Disable"), mainWindow, SLOT(toggle_enable_clips())); + + menu.addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links())); menu.addAction(tr("&Nest"), mainWindow, SLOT(nest())); From a4ae5e8ea3e1bdb03a763b4227301c08d3ab5440 Mon Sep 17 00:00:00 2001 From: elsandosgrande <40576902+elsandosgrande@users.noreply.github.com> Date: Wed, 13 Feb 2019 16:19:54 +0100 Subject: [PATCH 169/202] Bosnian and Serbian translations, second iteration --- ts/olive_bs.ts | 10 +++++----- ts/olive_sr.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 909a216e2..2307053fb 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -129,7 +129,7 @@ Debug Log - + Zapis za debugiranje @@ -138,22 +138,22 @@ Welcome to Olive! - + Dobrodošli u Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive je slobodan video uređivač sa otvorenim izvornim kodom izdan pod GNU GPL-om. Ako ste platili za ovaj software, vi ste bili prevareni. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Ovaj software je trenutno u ALFA stanju, što znači da je nestabilan i veoma je vjerovatno da će se srušiti, imati greške i da ne dostaje nekih mogućnosti. Mi ne dajemo nikakvu garanciju, tako da koristite na svoj sopstveni rizik. Molimo da prijavite sve greške i željene funkcije na %1 Thank you for trying Olive and we hope you enjoy it! - + Hvala što isprobavate Olive i nadamo se da ćete uživati u njemu! diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index c647840a2..3bafc554d 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -128,7 +128,7 @@ Debug Log - + Запис за дебугирање @@ -137,22 +137,22 @@ Welcome to Olive! - + Добродошли у Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive је слободан видео уређивач са отвореним изворним кодом издан под GNU GPL-ом. Ако сте платили за овај софтвер, ви сте били преварени. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Овај софтвер је тренутно у АЛФА стању, што значи да је нестабилан и веома је вероватно да ће се срушити, имати грешака и да не достаје неких могућности. Ми не даје никакву гаранцију, тако да користите на свој сопствени ризик. Молимо да пријавите све грешке и жељене функције на %1 Thank you for trying Olive and we hope you enjoy it! - + Хвала што испробавате Olive и надамо се да ћете уживати у њему! From bd5b2cf036d4c168aa1a965fa88f4567bda093d6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 13 Feb 2019 11:00:32 -0800 Subject: [PATCH 170/202] reverted init functions from ffmpeg 3 --- main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main.cpp b/main.cpp index 6f6ff5640..f313bff71 100644 --- a/main.cpp +++ b/main.cpp @@ -82,6 +82,10 @@ int main(int argc, char *argv[]) { qInstallMessageHandler(debug_message_handler); } + // init ffmpeg subsystem + av_register_all(); + avfilter_register_all(); + QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts); QApplication a(argc, argv); From ba81e49e92a2e4cd92b317b5fb81f5b0f683b7eb Mon Sep 17 00:00:00 2001 From: naj59 Date: Wed, 13 Feb 2019 21:28:57 +0100 Subject: [PATCH 171/202] basic issue template --- ISSUE_TEMPLATE.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 ISSUE_TEMPLATE.md diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..15137c1b6 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,26 @@ + +*If you are requesting a feature, you can remove the following content. If not, it would help get a faster feedback on your issue.* + +__Olive version:__ +__Source:__ *(AppImage, Website etc.)* +__Operating system:__ *(Ubuntu 18.04 64-bit)* +__CPU:__ *Intel i5-4300U* +__GPU:__ *NVIDIA Geforce GT 1030 2GB (Driver ver xxx.xx.xx)* + +### Detailed Description + +*your issue description here* + +### Steps to reproduce + +1. +2. +3. +4. +... + +### Output log + +``` +please paste it here for better reading +``` \ No newline at end of file From 49f94cd03462164417d94fd7a0e83018e7e4e966 Mon Sep 17 00:00:00 2001 From: elsandosgrande Date: Wed, 13 Feb 2019 23:01:19 +0100 Subject: [PATCH 172/202] Bosnian and Serbian translations, third iteration --- ts/olive_bs.ts | 400 ++++++++++++++++++++++++------------------------ ts/olive_sr.ts | 401 +++++++++++++++++++++++++------------------------ 2 files changed, 406 insertions(+), 395 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 2307053fb..6e4e0dce3 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -161,89 +161,90 @@ Invalid effect - + Nevažeći efekat No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Nema kandidata za efekat '%1'. Moguće je da je ovaj efekat koruptiran. Pokušajte ponovno instalirati njega ili Olive. Cu&t - + I'll have to check back on this later to see how it works with the keyboard in practice + &Reži &Copy - + &Kopiraj Move &Up - + Pomjeri &gore Move &Down - + Pomjeri &dolje D&elete - + &Obriši Load Settings From File - + Učitaj postavke iz datoteke Save Settings to File - + Spasi postavke u datoteku Save Effect Settings - + Spasi postavke efekata Effect XML Settings %1 - + XML postavke-efekta %1 Save Settings Failed - + Spašavanje postavki neuspješno Failed to open "%1" for writing. - + Neuspješno otvaranje "%1" za uređivanje. Load Effect Settings - + Učitaj postavke efekta Load Settings Failed - + Učitavanje postavki neuspješno Failed to open "%1" for reading. - + Neuspješno otvaranje "%1" za čitanje. This settings file doesn't match this effect. - + Ova datoteka postavki nije prikladna za ovaj efekat. @@ -251,47 +252,47 @@ Effects: - + Efekti: &Paste - + &Zalijepi Add Video Effect - + Dodaj video efekat VIDEO EFFECTS - + VIDEO EFEKTI Add Video Transition - + Dodaj video prelaz Add Audio Effect - + Dodaj audio efekat AUDIO EFFECTS - + AUDIO EFEKTI Add Audio Transition - + Dodaj audio prelaz (Multiple clips selected) - + (Vše snimki je odabrano) @@ -299,12 +300,12 @@ Disable Keyframes - + Onemogući ključne kadrove Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Onemogućavanje ključnih kadrova će obrisati sve trenutne ključne kadrove. Da li ste sigurni da želite ovo uraditi? @@ -312,7 +313,7 @@ File: - + Datoteka: @@ -798,677 +799,677 @@ MainWindow - + Welcome to %1 Dobrodišli u %1 - + Auto-recovery Automatski oporavak - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + Zapis za debugiranje - + &About... - + <untitled> <neimenovano> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2085,13 +2086,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2146,12 +2147,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2219,17 +2220,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2879,72 +2880,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2952,57 +2958,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index 3bafc554d..01fd8832d 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -6,7 +6,7 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive је нелинеарни видео уређивач. Овај софтвер је слободани заштићен GNU GPL-ом. + Olive је нелинеарни видео уређивач. Овај софтвер је слободан и заштићен GNU GPL-ом. @@ -160,89 +160,89 @@ Invalid effect - + Неважећи ефекат No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Нема кандидата за ефекат '%1'. Могуће је да је овај ефекат коруптиран. Покушајте поновно инсталирати њега или Olive. Cu&t - + &Режи &Copy - + &Копирај Move &Up - + Помери &горе Move &Down - + Помери &доле D&elete - + &Обриши Load Settings From File - + Учитај поставке из датотеке Save Settings to File - + Спаси поставке у датотеку Save Effect Settings - + Спаси пиставке ефекта Effect XML Settings %1 - + XML поставке ефекта %1 Save Settings Failed - + Спашавање поставки неуспешно Failed to open "%1" for writing. - + Неуспешно отварање "%1" за уређивање. Load Effect Settings - + Учитај поставке ефекта Load Settings Failed - + Учитавање поставки неуспешно Failed to open "%1" for reading. - + Неуспешно отварање "%1" за читање. This settings file doesn't match this effect. - + Ова датотека поставки није прикладна за овај ефекат. @@ -250,47 +250,47 @@ Effects: - + Ефекти: &Paste - + &Залепи Add Video Effect - + Додај видео ефекат VIDEO EFFECTS - + ВИДЕО ЕФЕКТИ Add Video Transition - + Додај видео прелаз Add Audio Effect - + Додај аудио ефекат AUDIO EFFECTS - + АУДИО ЕФЕКТИ Add Audio Transition - + Додај аудио прелаз (Multiple clips selected) - + (Више снимки је одабрано) @@ -298,12 +298,12 @@ Disable Keyframes - + Онемогући кључне кадрове Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Онемогућавање кључних кадрова ће обрисати све тренутне кључне кадрове. Да ли сте сигурни да желите ово урадити? @@ -311,7 +311,7 @@ File: - + Датотека: @@ -797,677 +797,677 @@ MainWindow - + Welcome to %1 - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + Запис за дебугирање - + &About... - + <untitled> <неименовано> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2084,13 +2084,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2145,12 +2145,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2218,17 +2218,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2878,72 +2878,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2951,57 +2956,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: From 6e7ce7945f7114578347cab857e8087cf5415fad Mon Sep 17 00:00:00 2001 From: elsandosgrande <40576902+elsandosgrande@users.noreply.github.com> Date: Wed, 13 Feb 2019 16:19:54 +0100 Subject: [PATCH 173/202] Bosnian and Serbian translations, second iteration --- ts/olive_bs.ts | 10 +++++----- ts/olive_sr.ts | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 909a216e2..2307053fb 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -129,7 +129,7 @@ Debug Log - + Zapis za debugiranje @@ -138,22 +138,22 @@ Welcome to Olive! - + Dobrodošli u Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive je slobodan video uređivač sa otvorenim izvornim kodom izdan pod GNU GPL-om. Ako ste platili za ovaj software, vi ste bili prevareni. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Ovaj software je trenutno u ALFA stanju, što znači da je nestabilan i veoma je vjerovatno da će se srušiti, imati greške i da ne dostaje nekih mogućnosti. Mi ne dajemo nikakvu garanciju, tako da koristite na svoj sopstveni rizik. Molimo da prijavite sve greške i željene funkcije na %1 Thank you for trying Olive and we hope you enjoy it! - + Hvala što isprobavate Olive i nadamo se da ćete uživati u njemu! diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index c647840a2..3bafc554d 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -128,7 +128,7 @@ Debug Log - + Запис за дебугирање @@ -137,22 +137,22 @@ Welcome to Olive! - + Добродошли у Olive! Olive is a free open-source video editor released under the GNU GPL. If you have paid for this software, you have been scammed. - + Olive је слободан видео уређивач са отвореним изворним кодом издан под GNU GPL-ом. Ако сте платили за овај софтвер, ви сте били преварени. This software is currently in ALPHA which means it is unstable and very likely to crash, have bugs, and have missing features. We offer no warranty so use at your own risk. Please report any bugs or feature requests at %1 - + Овај софтвер је тренутно у АЛФА стању, што значи да је нестабилан и веома је вероватно да ће се срушити, имати грешака и да не достаје неких могућности. Ми не даје никакву гаранцију, тако да користите на свој сопствени ризик. Молимо да пријавите све грешке и жељене функције на %1 Thank you for trying Olive and we hope you enjoy it! - + Хвала што испробавате Olive и надамо се да ћете уживати у њему! From 7b1e60592d58e38d738f9bb06831c0379f339a6f Mon Sep 17 00:00:00 2001 From: elsandosgrande Date: Wed, 13 Feb 2019 23:01:19 +0100 Subject: [PATCH 174/202] Bosnian and Serbian translations, third iteration --- ts/olive_bs.ts | 400 ++++++++++++++++++++++++------------------------ ts/olive_sr.ts | 401 +++++++++++++++++++++++++------------------------ 2 files changed, 406 insertions(+), 395 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 2307053fb..6e4e0dce3 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -161,89 +161,90 @@ Invalid effect - + Nevažeći efekat No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Nema kandidata za efekat '%1'. Moguće je da je ovaj efekat koruptiran. Pokušajte ponovno instalirati njega ili Olive. Cu&t - + I'll have to check back on this later to see how it works with the keyboard in practice + &Reži &Copy - + &Kopiraj Move &Up - + Pomjeri &gore Move &Down - + Pomjeri &dolje D&elete - + &Obriši Load Settings From File - + Učitaj postavke iz datoteke Save Settings to File - + Spasi postavke u datoteku Save Effect Settings - + Spasi postavke efekata Effect XML Settings %1 - + XML postavke-efekta %1 Save Settings Failed - + Spašavanje postavki neuspješno Failed to open "%1" for writing. - + Neuspješno otvaranje "%1" za uređivanje. Load Effect Settings - + Učitaj postavke efekta Load Settings Failed - + Učitavanje postavki neuspješno Failed to open "%1" for reading. - + Neuspješno otvaranje "%1" za čitanje. This settings file doesn't match this effect. - + Ova datoteka postavki nije prikladna za ovaj efekat. @@ -251,47 +252,47 @@ Effects: - + Efekti: &Paste - + &Zalijepi Add Video Effect - + Dodaj video efekat VIDEO EFFECTS - + VIDEO EFEKTI Add Video Transition - + Dodaj video prelaz Add Audio Effect - + Dodaj audio efekat AUDIO EFFECTS - + AUDIO EFEKTI Add Audio Transition - + Dodaj audio prelaz (Multiple clips selected) - + (Vše snimki je odabrano) @@ -299,12 +300,12 @@ Disable Keyframes - + Onemogući ključne kadrove Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Onemogućavanje ključnih kadrova će obrisati sve trenutne ključne kadrove. Da li ste sigurni da želite ovo uraditi? @@ -312,7 +313,7 @@ File: - + Datoteka: @@ -798,677 +799,677 @@ MainWindow - + Welcome to %1 Dobrodišli u %1 - + Auto-recovery Automatski oporavak - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive se nije pravilno zatvorio i datoteka za automatsko obnavljanje je primjećena. Da li želite da ju otvorite? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + Zapis za debugiranje - + &About... - + <untitled> <neimenovano> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2085,13 +2086,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2146,12 +2147,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2219,17 +2220,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2879,72 +2880,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2952,57 +2958,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index 3bafc554d..01fd8832d 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -6,7 +6,7 @@ Olive is a non-linear video editor. This software is free and protected by the GNU GPL. - Olive је нелинеарни видео уређивач. Овај софтвер је слободани заштићен GNU GPL-ом. + Olive је нелинеарни видео уређивач. Овај софтвер је слободан и заштићен GNU GPL-ом. @@ -160,89 +160,89 @@ Invalid effect - + Неважећи ефекат No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive. - + Нема кандидата за ефекат '%1'. Могуће је да је овај ефекат коруптиран. Покушајте поновно инсталирати њега или Olive. Cu&t - + &Режи &Copy - + &Копирај Move &Up - + Помери &горе Move &Down - + Помери &доле D&elete - + &Обриши Load Settings From File - + Учитај поставке из датотеке Save Settings to File - + Спаси поставке у датотеку Save Effect Settings - + Спаси пиставке ефекта Effect XML Settings %1 - + XML поставке ефекта %1 Save Settings Failed - + Спашавање поставки неуспешно Failed to open "%1" for writing. - + Неуспешно отварање "%1" за уређивање. Load Effect Settings - + Учитај поставке ефекта Load Settings Failed - + Учитавање поставки неуспешно Failed to open "%1" for reading. - + Неуспешно отварање "%1" за читање. This settings file doesn't match this effect. - + Ова датотека поставки није прикладна за овај ефекат. @@ -250,47 +250,47 @@ Effects: - + Ефекти: &Paste - + &Залепи Add Video Effect - + Додај видео ефекат VIDEO EFFECTS - + ВИДЕО ЕФЕКТИ Add Video Transition - + Додај видео прелаз Add Audio Effect - + Додај аудио ефекат AUDIO EFFECTS - + АУДИО ЕФЕКТИ Add Audio Transition - + Додај аудио прелаз (Multiple clips selected) - + (Више снимки је одабрано) @@ -298,12 +298,12 @@ Disable Keyframes - + Онемогући кључне кадрове Disabling keyframes will delete all current keyframes. Are you sure you want to do this? - + Онемогућавање кључних кадрова ће обрисати све тренутне кључне кадрове. Да ли сте сигурни да желите ово урадити? @@ -311,7 +311,7 @@ File: - + Датотека: @@ -797,677 +797,677 @@ MainWindow - + Welcome to %1 - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + Запис за дебугирање - + &About... - + <untitled> <неименовано> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2084,13 +2084,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2145,12 +2145,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2218,17 +2218,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2878,72 +2878,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2951,57 +2956,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: From 52c1fd47b6914e3c77fd50328750ab6f8462da3d Mon Sep 17 00:00:00 2001 From: elsandosgrande Date: Thu, 14 Feb 2019 06:42:03 +0100 Subject: [PATCH 175/202] Test --- ts/olive_ar.ts | 339 +++++++++++++++++++++++---------------------- ts/olive_cs.ts | 369 +++++++++++++++++++++++++------------------------ ts/olive_de.ts | 339 +++++++++++++++++++++++---------------------- ts/olive_es.ts | 339 +++++++++++++++++++++++---------------------- ts/olive_fr.ts | 339 +++++++++++++++++++++++---------------------- ts/olive_it.ts | 339 +++++++++++++++++++++++---------------------- ts/olive_ru.ts | 339 +++++++++++++++++++++++---------------------- 7 files changed, 1219 insertions(+), 1184 deletions(-) diff --git a/ts/olive_ar.ts b/ts/olive_ar.ts index 29559ccad..2ed4ac778 100644 --- a/ts/olive_ar.ts +++ b/ts/olive_ar.ts @@ -803,681 +803,681 @@ MainWindow - + Welcome to %1 مرحباً في %1 - + Auto-recovery اﻷستعادة التلقائية - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? زيتون لم يغلق بشكل سليم وتم التعرف على ملف اﻷستعادة التلقائة. هل تريد فتحه؟ - + &Project &المشروع - + &Sequence &مقطع - + &Folder &مجلد - + Set In Point ضع في نقطة - + Set Out Point ضع خارج نقطة - + Reset In Point صفر في النقطة - + Reset Out Point صفّر النقطة - + Clear In/Out Point محو نقطة الدخل/الخرج - + No active sequence لا مقاطع نشطة - + Please open the sequence you wish to export. رجاءً أفتح المقطع المراد تصديره. - + Save Project As... أحفظ المشروع ك... - + Unsaved Project مشروع غير محفوظ - + This project has changed since it was last saved. Would you like to save it before closing? هذا المشروع غُيِرَ منذ أخر مرة. أتريد حفظه قبل اﻹغلاق؟ - + &File &ملف - + &New &جديد - + &Open Project &أفتح مشروع - + Clear Recent List أفرغ قائمة مؤخراً - + Open Recent أفتح مؤخراً - + &Save Project &أحفظ المشروع - + Save Project &As أحفظ المشروع &ك - + &Import... &أستيراد - + &Export... &تصدير - + E&xit خ&روج - + &Edit &تعديل - + &Undo &تراجع - + Redo أعد - + Cu&t قط&ع - + Cop&y &نسخ - + &Paste &لصق - + Paste Insert ألصق أدرج - + Duplicate أستنساخ - + Delete حذف - + Ripple Delete حذف موجة - + Split أنقسام - + Select &All تحديد &الكل - + Deselect All إلغاء تحديد الكل - + Add Default Transition أضف اﻷنتقال الأفتراضي - + Link/Unlink ربط/فصل - + Enable/Disable تفعيل/تعطيل - + Nest للمراجعة تداخل - + Ripple to In Point موجة لنقطة إدخال - + Ripple to Out Point موجة لنقطة إخراج - + Edit to In Point عدّل لنقطة إدخال - + Edit to Out Point عدّل لنقطة إخراج - + Delete In/Out Point محو نقطة الدخل/الخرج - + Ripple Delete In/Out Point موجة حذف نقطة الإدخال/الإخراج - + Set/Edit Marker حدد/عدّل اﻹشارات - + &View &أظهر - + Zoom In تقريب - + Zoom Out أبتعاد - + Increase Track Height زدّ طول المسار - + Decrease Track Height قلل طول المسار - + Toggle Show All فعل إظهار الكل - + Track Lines تعقب السطور - + Rectified Waveforms أشكال موجية متناوبة - + Frames اﻹطارات - + Drop Frame أفلت إطار - + Non-Drop Frame إطار غير مُفلت - + Milliseconds جزء من الثانية - + Title/Action Safe Area عنوان/إجراء المنطقة الآمنة - + Off مطفئ - + Default إفتراضي - + 4:3 4:3 - + 16:9 16:9 - + Custom مخصوص - + Full Screen ملء الشاشة - + Full Screen Viewer عارض ملء الشاشة - + &Playback &الترديد - + Go to Start أذهب للبداية - + Previous Frame الإطار السابق - + Play/Pause تشغيل/أستئناف - + Play In to Out شغل من الإدخال إلى الإخراج - + Next Frame اﻹطار التالي - + Go to End أذهب للنهاية - + Go to Previous Cut أذهب للقطعة السابقة - + Go to Next Cut أذهب للقطعة التالية - + Go to In Point أذهب لنقطة إدخال - + Go to Out Point أذهب لنقطة إخراج - + Shuttle Left توشع اليسار - + Shuttle Stop إيقاف التوشع - + Shuttle Right توشع اليمين - + Loop حلقة - + &Window &نافذة - + Project المشروع - + Effect Controls تحكمات المؤثر - + Timeline الخط الزمني - + Graph Editor محرر المخطط - + Media Viewer عارض الوسائط - + Sequence Viewer عارض المقطع - + Maximize Panel ضخّم اللائحة - + Reset to Default Layout صفّر للتخطيط المبدئي - + &Tools &اﻷدوات - + Pointer Tool أداة المؤشر - + Edit Tool أداة التحرير - + Ripple Tool أداة الموجة - + Razor Tool أداة القطع - + Slip Tool أداة المنزلقة - + Slide Tool أداة الشريحة - + Hand Tool أداة اليد - + Transition Tool أداة اﻷنتقال - + Enable Snapping فعّل السحب - + Selecting Also Seeks للمراجعة تحديد العروضات إيضاً - + Edit Tool Also Seeks أداة التحرير تعرض إيضاً - + Edit Tool Selects Links أداة التحرير تحدد الروابط - + Seek Also Selects للمراجعة العرض يحدد إيضاً - + Seek to the End of Pastes أعرض لنهاية الملصوقات - + Scroll Wheel Zooms العجلة الدوراة تُقرّب - + Enable Drag Files to Timeline أسمح بسحب الملفات للخط الزمني - + Auto-Scale By Default التحجيم-التلقائي إفتراضياً - + Enable Seek to Import للمراجعة أسمح للعرض بالإستيراد - + Audio Scrubbing حكّ شريط الصوت - + Enable Drop on Media to Replace أسمح برمي الوسائط للأستبدال - + Enable Hover Focus فعّل التركيز الحائم - + Ask For Name When Setting Marker أسال عن اﻷسم حين وضع المؤشر - + No Auto-Scroll لا أنزلاق التلقائي - + Page Auto-Scroll أنزلاق الصفحة التلقائي - + Smooth Auto-Scroll الأنزلاق التلقائي الناعم - + Preferences التفضيلات - + Clear Undo أمسح التراجُعات - + &Help &مساعدة - + A&ction Search ب&حث إجراء - + Debug Log سجل التنقيح - + &About... &حول... - + <untitled> <غير معنون> - + Open Project... أفتح مشروع... - + Missing recent project مشروع ماضي ضائع - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? المشروع '%1' غير بعد اﻷن. هل ترغب بحذفه من من قائمة مشاريع مؤخراً؟ - + Invalid aspect ratio معدل نسبة غير صالح - + The aspect ratio '%1' is invalid. Please try again. معدل النسبة '%1' غير صالح. حاول مجدداً. - + Enter custom aspect ratio أدخل نسبة معدل مخصصة - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): أدخل معدل النسبة لأستعماله في العنوان/الإجراء المنطقة الآمنة (كــ. 16:9): - + Nested Sequence مقطع متشعب @@ -2122,13 +2122,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files كل الملفات - + No active sequence لا مقاطع نشطة @@ -2183,12 +2183,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff الملف '%1' يبدو كأنه جزء من سلسلة صور. هل تريد أستيراده هكذا؟ - + Import media... أستيراد وسائط... - + No sequence is active, please open the sequence you want to delete clips from. لا مقطع نشط, رجاءً أفتح المقطع المراد حذف جزء منه. @@ -2256,17 +2256,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff مثل المصدر (في مجلد "%1") - + Proxy file exists ملف الوسيط موجود - + The file "%1" already exists. Do you wish to replace it? الملف "%1" موجود مسبقاً. هل ترغب بأستبداله؟ - + Custom Location موقع مخصوص @@ -2926,72 +2926,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo &تراجع - + &Redo &أعد - + C&ut قط&ع - + Cop&y &نسخ - + &Paste &لصق - + R&ipple Delete حذف مو&جة - + Sequence Settings اﻷعدادات المقطع - + &Speed/Duration &السرعة/المدّة - + Auto-s&cale التحجيم-التلقا&ئي - + + Enable/Disable + تفعيل/تعطيل + + + Link/Unlink ربط/فصل - + &Nest &تداخل - + &Reveal in Project &أبرّز في المشروع - + R&ename أ&عد تسمية - + %1 Start: %2 End: %3 @@ -3002,57 +3007,57 @@ Duration: %4 المدة: %4 - + Rename '%1' أعد تسمية '%1' - + Rename multiple clips أعد تسمية عدة مقاطع - + Enter a new name for this clip: أدخل أسم جديد لهذا المقطع: - + Error خطأ - + Couldn't locate media wrapper for sequence. لم يتم رصد موقع غلاف الوسائط للمقطع. - + Title عنوان - + Solid Color لون صلب - + Bars ألواح - + Tone نغّم - + Noise ضجيج - + Duration: المدة: diff --git a/ts/olive_cs.ts b/ts/olive_cs.ts index fb181d259..d9e8bcf2f 100644 --- a/ts/olive_cs.ts +++ b/ts/olive_cs.ts @@ -1,6 +1,6 @@ - + AboutDialog @@ -803,693 +803,693 @@ MainWindow - + Welcome to %1 Vítejte v %1 - + Auto-recovery Automatické obnovení - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive nebyl zavřen řádně a byl zjištěn soubor pro automatické obnovení. Chcete jej otevřít? - + &Project &Projekt - + &Sequence &Sekvence - + &Folder &Složka - + Set In Point Nastavit bod začátku - + Set Out Point Nastavit bod konce Enable/Disable In/Out Point - Povolit/Zakázat bod začátku/konce + Povolit/Zakázat bod začátku/konce - + Reset In Point Obnovit výchozí bod začátku - + Reset Out Point Obnovit výchozí bod konce - + Clear In/Out Point Vymazat bod začátku/konce - + No active sequence Žádná činná sekvence - + Please open the sequence you wish to export. Otevřete, prosím, sekvenci, již chcete vyvést. - + Save Project As... Uložit projekt jako... - + Unsaved Project Neuložený projekt - + This project has changed since it was last saved. Would you like to save it before closing? Tento projekt se od doby, kdy byl naposledy uložen, změnil. Chcete jej před zavřením uložit? - + &File &Soubor - + &New &Nový - + &Open Project &Otevřít projekt - + Clear Recent List Vyprázdnit seznam naposledy otevřených souborů - + Open Recent Otevřít nedávné - + &Save Project &Uložit projekt - + Save Project &As Uložit projekt j&ako - + &Import... &Zavést... - + &Export... &Vyvést... - + E&xit &Ukončit - + &Edit Úp&ravy - + &Undo &Zpět - + Redo Znovu - + Cu&t Vyjmou&t - + Cop&y &Kopírovat - + &Paste &Vložit - + Paste Insert Vložit vložku - + Duplicate Zdvojit - + Delete Smazat - + Ripple Delete Vytáhnout - + Split Rozdělit - + Select &All Vybrat &vše - + Deselect All Zrušit výběr všeho - + Add Default Transition Přidat výchozí přechod - + Link/Unlink Spojit/Oddělit - + Enable/Disable Povolit/Zakázat - + Nest Vnořovat - + Ripple to In Point Vložit a posunout k bodu začátku - + Ripple to Out Point Vložit a posunout k bodu konce - + Edit to In Point Upravit po bod začátku - + Edit to Out Point Upravit po bod konce - + Delete In/Out Point Smazat bod začátku/konce - + Ripple Delete In/Out Point Vytáhnout bod začátku/konce - + Set/Edit Marker Nastavit/Upravit značku - + &View &Pohled - + Zoom In Přiblížit - + Zoom Out Oddálit - + Increase Track Height Zvětšit výšku stopy - + Decrease Track Height Zmenšit výšku stopy - + Toggle Show All Přepnout ukázání všeho - + Track Lines Řádky stop - + Rectified Waveforms Vlnový tvar odspodu - + Frames Snímky - + Drop Frame Zahodit snímek - + Non-Drop Frame Nezahodit snímek - + Milliseconds Milisekundy - + Title/Action Safe Area Bezpečná oblast - + Off Vypnuto - + Default Výchozí - + 4:3 4:3 - + 16:9 16:9 - + Custom Vlastní - + Full Screen Celá obrazovka - + Full Screen Viewer Prohlížeč na celou obrazovku - + &Playback &Přehrávání - + Go to Start Jít na začátek - + Previous Frame Předchozí snímek - + Play/Pause Přehrát/Pozastavit - + Play In to Out Přehrát od začátku po konec - + Next Frame Další snímek - + Go to End Jít na konec - + Go to Previous Cut Jít na předchozí záběr - + Go to Next Cut Jít na další záběr - + Go to In Point Jít na bod začátku - + Go to Out Point Jít na bod konce - + Shuttle Left Jezdit tam a zpět vlevo - + Shuttle Stop Zastavit pendlování - + Shuttle Right Jezdit tam a zpět vpravo Decrease Speed - Snížit rychlost + Snížit rychlost Pause - Pozastavit + Pozastavit Increase Speed - Zvýšit rychlost + Zvýšit rychlost - + Loop Smyčka - + &Window &Okno - + Project Projekt - + Effect Controls Ovládání efektů - + Timeline Časová osa - + Graph Editor Editor grafu - + Media Viewer Prohlížeč záznamu - + Sequence Viewer Prohlížeč řady - + Maximize Panel Zvětšit panel - + Reset to Default Layout Obnovit výchozí rozvržení - + &Tools &Nástroje - + Pointer Tool Ukazovátko - + Edit Tool Nástroj pro úpravy - + Ripple Tool Vložení a posunutí - + Razor Tool Nástroj břitvy - + Slip Tool Roztočení se ztotožněním - + Slide Tool Roztočení - + Hand Tool Ručička - + Transition Tool Přechod - + Enable Snapping Povolit přichytávání - + Selecting Also Seeks Výběr také vyhledává - + Edit Tool Also Seeks Nástroj pro úpravy také vyhledává - + Edit Tool Selects Links Nástroj pro úpravy vybírá odkazy - + Seek Also Selects Vyhledávání také vybírá - + Seek to the End of Pastes Vyhledávat po konec vložení - + Scroll Wheel Zooms Kolečko myši přibližuje - + Enable Drag Files to Timeline Povolit tažení souborů na časovou osu - + Auto-Scale By Default Automaticky měnit velikost - + Enable Seek to Import Povolit vyhledávání k zavedení - + Audio Scrubbing Přehrávání zvuku při tažení ukazatele - + Enable Drop on Media to Replace Povolit upuštění na záznam pro nahrazení - + Enable Hover Focus Povolit zaměření při přejetí - + Ask For Name When Setting Marker Požádat o název při nastavení značky - + No Auto-Scroll Žádné automatické projíždění - + Page Auto-Scroll Stránkové automatické projíždění - + Smooth Auto-Scroll Jemné automatické projíždění - + Preferences Nastavení - + Clear Undo Vyprázdnit minulost kroků zpět - + &Help Nápo&věda - + A&ction Search Hledání č&inností - + Debug Log Zápis ladění - + &About... &O programu... - + <untitled> <bez názvu> - + Open Project... Otevřít projekt... - + Missing recent project Chybí nedávný projekt - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Projekt '%1' už neexistuje. Chcete jej odstranit ze seznamu nedávných projektů? - + Invalid aspect ratio Neplatný poměr stran - + The aspect ratio '%1' is invalid. Please try again. Poměr stran '%1' je neplatný. Zkuste to, prosím, znovu. - + Enter custom aspect ratio Zadat vlastní poměr stran - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Zadejte poměr stran k použití pro bezpečnou oblast (např. 16:9): - + Nested Sequence Vnořená řada @@ -1541,7 +1541,7 @@ %1 fields (%2 frames) - %1 polí (%2 snímků) + %1 polí (%2 snímků) @@ -1611,7 +1611,7 @@ Rozložení zvuku: %6 Audio %1: %2Hz %3 channels - Zvuk %1: %2Hz %3 kanálů + Zvuk %1: %2Hz %3 kanálů @@ -1967,7 +1967,7 @@ Rozložení zvuku: %6 Disable Multithreading on Images - Zakázat vytvoření více vláken v jednom procesu na obrázky + Zakázat vytvoření více vláken v jednom procesu na obrázky @@ -2124,13 +2124,13 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - - + All Files Všechny soubory - + No active sequence Žádná činná řada @@ -2185,12 +2185,12 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Soubor '%1' se zdá být součástí obrázkové řady. Chcete ji zavést jako takovou? - + Import media... Zavést záznam... - + No sequence is active, please open the sequence you want to delete clips from. Žádná řada není činná. Otevřete, prosím, řadu, ve které chcete smazat záběry. @@ -2249,19 +2249,19 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - ProRes SQ - ProRes SQ + ProRes SQ ProRes LT - ProRes LT + ProRes LT DNxHD - DNxHD + DNxHD H.264 - H.264 + H.264 @@ -2274,17 +2274,17 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Stejné jako zdroj (ve složce "%1") - + Proxy file exists Soubor proxy existuje - + The file "%1" already exists. Do you wish to replace it? Soubor "%1" již existuje. Chcete jej nahradit? - + Custom Location Vlastní umístění @@ -2819,11 +2819,11 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - Set Marker - Nastavit značku + Nastavit značku Set marker name: - Nastavit název značky: + Nastavit název značky: @@ -2942,72 +2942,77 @@ Vyhledávat rychle (při hledání se mohou krátce ukázat nepřesné snímky - TimelineWidget - + &Undo &Zpět - + &Redo &Znovu - + C&ut Vyj&mout - + Cop&y &Kopírovat - + &Paste &Vložit - + R&ipple Delete &Vytáhnout (smazat a posunout) - + Sequence Settings Nastavení sekvence - + &Speed/Duration &Rychlost/Doba trvání - + Auto-s&cale Automatická &změna velikosti - + + Enable/Disable + Povolit/Zakázat + + + Link/Unlink Spojit/Oddělit - + &Nest &Vnořovat - + &Reveal in Project &Odkrýt v projektu - + R&ename &Přejmenovat - + %1 Start: %2 End: %3 @@ -3018,57 +3023,57 @@ Konec: %3 Doba trvání: %4 - + Rename '%1' Přejmenovat '%1' - + Rename multiple clips Přejmenovat více záběrů - + Enter a new name for this clip: zadejte nový název pro tento záběr: - + Error Chyba - + Couldn't locate media wrapper for sequence. Nepodařilo se najít obal záznamu pro tuto řadu. - + Title Název - + Solid Color Plná barva - + Bars Zkušební tabulka - + Tone Tón - + Noise Šum - + Duration: Doba trvání: @@ -3258,7 +3263,7 @@ Doba trvání: %4 Transition Length: - Délka: + Délka: diff --git a/ts/olive_de.ts b/ts/olive_de.ts index b534abfb4..59fc7c3ac 100644 --- a/ts/olive_de.ts +++ b/ts/olive_de.ts @@ -822,38 +822,38 @@ MainWindow - + Auto-recovery Auto-Wiederherstellung - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive wurde nicht richtig beendet und eine Wiederherstellungsdatei wurde gefunden. Möchten Sie diese öffnen? - + &Project &Projekt - + &Sequence &Sequenz - + &Folder &Ordner - + Set In Point Also for following translations: Not sure if sense is matched Anfangspunkt festlegen - + Set Out Point Endpunkt festlegen @@ -862,393 +862,393 @@ Anfangs-/Endpunkt aktivieren/deaktiviern - + Welcome to %1 Willkommen in %1 - + Reset In Point Anfangspunkt zurücksetzen - + Reset Out Point Endpunkt zurücksetzen - + Clear In/Out Point Anfangs-/Endpunkt löschen - + No active sequence Keine aktive Sequenz - + Please open the sequence you wish to export. Bitte öffnen Sie die Sequenz, die Sie exportieren möchten. - + Save Project As... Projekt speichern als... - + Unsaved Project Ungespeichertes Projekt - + This project has changed since it was last saved. Would you like to save it before closing? Das Projekt enthält ungespeicherte Änderungen. Wollen Sie diese jetzt speichern? - + &File &Datei - + &New &Neu - + &Open Project Projekt &öffnen - + Clear Recent List 'Zuletzt geöffnet' leeren - + Open Recent Zuletzt Verwendete öffnen - + &Save Project &Projekt speichern - + Save Project &As Projekt speichern &als... - + &Import... &Importieren... - + &Export... &Exportieren - + E&xit B&eenden - + &Edit &Bearbeiten - + &Undo &Rückgängig - + Redo Wiederholen - + Cu&t &Ausschneiden - + Cop&y &Kopieren - + &Paste &Einfügen - + Paste Insert - + Duplicate Duplizieren - + Delete Löschen - + Ripple Delete In Premiere's translations its also called "Ripple Delete" Ripple Delete - + Split Teilen - + Select &All Alles &auswählen - + Deselect All Auswahl aufheben - + Add Default Transition Standardübergang einfügen - + Link/Unlink Verbinden/Trennen - + Enable/Disable Einblenden/Ausblenden - + Nest Schachteln - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker Marker setzen/bearbeiten - + &View &Ansicht - + Zoom In Hereinzoomen - + Zoom Out Herauszoomen - + Increase Track Height Spurhöhe erhöhen - + Decrease Track Height Spurhöhe verringern - + Toggle Show All - + Track Lines Spurlinien - + Rectified Waveforms Nachgebesserte Waveforms - + Frames Bilder/Frames - + Drop Frame Same word used in German Drop Frame - + Non-Drop Frame Same word used in German Non-Drop Frame - + Milliseconds Millisekunden - + Title/Action Safe Area Sicherer Titelbereich - + Off Aus - + Default Standard - + 4:3 4:3 - + 16:9 16:9 - + Custom Benutzerdefiniert - + Full Screen Vollbild - + Full Screen Viewer Does this make sense? Vollbild-Viewer - + &Playback Should we translate this? Playback is also known &Wiedergabe - + Go to Start Zum Start gehen - + Previous Frame Vorheriger Frame - + Play/Pause Does not make sense to translate Play/Pause - + Play In to Out Von Anfang bis Ende wiedergeben - + Next Frame Nächster Frame - + Go to End Zum Ende springen - + Go to Previous Cut Zum vorherigen Schnitt springen - + Go to Next Cut Zum nächsten Schnitt springen - + Go to In Point Zum Anfangspunkt springen - + Go to Out Point Zum Endpunkt springen - + Shuttle Left - + Shuttle Stop - + Shuttle Right @@ -1266,265 +1266,265 @@ Geschwindigkeit erhöhen - + Loop Schleife - + &Window &Fenster - + Project Projekt - + Effect Controls Effektsteuerung - + Timeline Same as in english Timeline - + Graph Editor Grafischer Editor - + Media Viewer Does this make sense to translate? Media Viewer - + Sequence Viewer Does this make sense to translate? Sequence Viewer - + Maximize Panel Panel maximieren - + Reset to Default Layout Zum Standard-Layout zurücksetzen - + &Tools &Werkzeuge - + Pointer Tool Does this make sense? Zeiger - + Edit Tool Bearbeitungs-Werkzeug - + Ripple Tool Same as 'Ripple Delete' Ripple-Werkzeug - + Razor Tool Schneide-Werkzeug - + Slip Tool - + Slide Tool - + Hand Tool Hand-Werkzeug - + Transition Tool Übergangs-Werkzeug - + Enable Snapping Snapping aktivieren - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms Could be better Scrollrad zoomt - + Enable Drag Files to Timeline Dateien auf Timeline ziehen aktivieren - + Auto-Scale By Default Skaliere automatisch - + Enable Seek to Import - + Audio Scrubbing Same as in english Audio Scrubbing - + Enable Drop on Media to Replace Auf Medien zum Ersetzen ziehen aktivieren - + Enable Hover Focus - + Ask For Name When Setting Marker Nach Namen fragen, wenn Marker gesetzt wird - + No Auto-Scroll Kein Auto-Scroll - + Page Auto-Scroll Seiten Auto-Scroll - + Smooth Auto-Scroll Weiches Auto-Scroll - + Preferences Einstellungen - + Clear Undo Rückgängig-Historie leeren - + &Help &Hilfe - + A&ction Search &Aktionensuche - + Debug Log Same as in english Debug-Log - + &About... &Über... - + <untitled> <unbenannt> - + Open Project... Projekt öffnen... - + Missing recent project Zuletzt geöffnetes Projekt existiert nicht - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Das Projekt '%1' existiert nicht mehr oder wurde verschoben. Möchten Sie es aus der Liste entfernen? - + Invalid aspect ratio Ungültiges Seitenverhältnis - + The aspect ratio '%1' is invalid. Please try again. Das Seitenverhältnis '%1' ist ungültig. Bitte versuchen Sie es erneut. - + Enter custom aspect ratio Benutzerdefiniertes Seitenverhältnis eingeben - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): Geben Sie das Seitenverhältnis für den sicheren Bereich ein (z.B. 16:9): - + Nested Sequence Geschachtelte Sequenz @@ -2171,13 +2171,13 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf - + All Files Alle Dateien - + No active sequence Keine aktive Sequenz @@ -2232,12 +2232,12 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Die Datei '%1' scheint eine Bildsequenz zu enthalten. Möchten Sie sie als solche importieren? - + Import media... Medien importieren... - + No sequence is active, please open the sequence you want to delete clips from. Keine Sequenz ist aktiv. Bitten öffnen Sie die Sequenz, bei der Sie Clips löschen möchten. @@ -2306,17 +2306,17 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf Genau wie Quelle (in Ordner "%1") - + Proxy file exists Proxy-Datei existiert bereits - + The file "%1" already exists. Do you wish to replace it? Die Datei "%1" existiert bereits. Möchten Sie sie ersetzen? - + Custom Location @@ -2981,73 +2981,78 @@ Sucht schneller (kann kurzzeitig ungenaue Frame anzeigen - wirkt sich nicht auf TimelineWidget - + &Undo &Rückgängig - + &Redo - + C&ut &Ausschneiden - + Cop&y &Kopieren - + &Paste &Einfügen - + R&ipple Delete Taken from Premiere R&ipple Delete - + Sequence Settings Sequenz-Einstellungen - + &Speed/Duration &Geschwindigkeit/Dauer - + Auto-s&cale Auto-&Skalierung - + + Enable/Disable + Einblenden/Ausblenden + + + Link/Unlink Verbinden/Trennen - + &Nest - + &Reveal in Project &Im Projekt anzeigen - + R&ename U&mbenennen - + %1 Start: %2 End: %3 @@ -3058,57 +3063,57 @@ Ende: %3 Dauer: %4 - + Rename '%1' '%1' umbenennen - + Rename multiple clips Mehrere Clips umbenennen - + Enter a new name for this clip: Geben Sie einen neuen Namen für den Clip ein: - + Error Fehler - + Couldn't locate media wrapper for sequence. Konnte den Medienwrapper für diese Sequenz nicht finden. - + Title Titel - + Solid Color Solid - + Bars Balken - + Tone Ton - + Noise Rauschen - + Duration: Dauer: diff --git a/ts/olive_es.ts b/ts/olive_es.ts index 94382c716..e1a6776ea 100644 --- a/ts/olive_es.ts +++ b/ts/olive_es.ts @@ -797,677 +797,677 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2083,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2144,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2217,17 +2217,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2877,72 +2877,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2950,57 +2955,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: diff --git a/ts/olive_fr.ts b/ts/olive_fr.ts index f9e8615e5..699ac8de4 100644 --- a/ts/olive_fr.ts +++ b/ts/olive_fr.ts @@ -797,677 +797,677 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2083,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2144,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2217,17 +2217,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2877,72 +2877,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2950,57 +2955,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: diff --git a/ts/olive_it.ts b/ts/olive_it.ts index 7729daca6..bdfffef1a 100644 --- a/ts/olive_it.ts +++ b/ts/olive_it.ts @@ -797,677 +797,677 @@ MainWindow - + Auto-recovery - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? - + &Project - + &Sequence - + &Folder - + Set In Point - + Set Out Point - + Welcome to %1 - + Reset In Point - + Reset Out Point - + Clear In/Out Point - + No active sequence - + Please open the sequence you wish to export. - + Save Project As... - + Unsaved Project - + This project has changed since it was last saved. Would you like to save it before closing? - + &File - + &New - + &Open Project - + Clear Recent List - + Open Recent - + &Save Project - + Save Project &As - + &Import... - + &Export... - + E&xit - + &Edit - + &Undo - + Redo - + Cu&t - + Cop&y - + &Paste - + Paste Insert - + Duplicate - + Delete - + Ripple Delete - + Split - + Select &All - + Deselect All - + Add Default Transition - + Link/Unlink - + Enable/Disable - + Nest - + Ripple to In Point - + Ripple to Out Point - + Edit to In Point - + Edit to Out Point - + Delete In/Out Point - + Ripple Delete In/Out Point - + Set/Edit Marker - + &View - + Zoom In - + Zoom Out - + Increase Track Height - + Decrease Track Height - + Toggle Show All - + Track Lines - + Rectified Waveforms - + Frames - + Drop Frame - + Non-Drop Frame - + Milliseconds - + Title/Action Safe Area - + Off - + Default - + 4:3 - + 16:9 - + Custom - + Full Screen - + Full Screen Viewer - + &Playback - + Go to Start - + Previous Frame - + Play/Pause - + Play In to Out - + Next Frame - + Go to End - + Go to Previous Cut - + Go to Next Cut - + Go to In Point - + Go to Out Point - + Shuttle Left - + Shuttle Stop - + Shuttle Right - + Loop - + &Window - + Project - + Effect Controls - + Timeline - + Graph Editor - + Media Viewer - + Sequence Viewer - + Maximize Panel - + Reset to Default Layout - + &Tools - + Pointer Tool - + Edit Tool - + Ripple Tool - + Razor Tool - + Slip Tool - + Slide Tool - + Hand Tool - + Transition Tool - + Enable Snapping - + Selecting Also Seeks - + Edit Tool Also Seeks - + Edit Tool Selects Links - + Seek Also Selects - + Seek to the End of Pastes - + Scroll Wheel Zooms - + Enable Drag Files to Timeline - + Auto-Scale By Default - + Enable Seek to Import - + Audio Scrubbing - + Enable Drop on Media to Replace - + Enable Hover Focus - + Ask For Name When Setting Marker - + No Auto-Scroll - + Page Auto-Scroll - + Smooth Auto-Scroll - + Preferences - + Clear Undo - + &Help - + A&ction Search - + Debug Log - + &About... - + <untitled> - + Open Project... - + Missing recent project - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? - + Invalid aspect ratio - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence @@ -2083,13 +2083,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files - + No active sequence @@ -2144,12 +2144,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Import media... - + No sequence is active, please open the sequence you want to delete clips from. @@ -2217,17 +2217,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + Proxy file exists - + The file "%1" already exists. Do you wish to replace it? - + Custom Location @@ -2877,72 +2877,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo - + &Redo - + C&ut - + Cop&y - + &Paste - + R&ipple Delete - + Sequence Settings - + &Speed/Duration - + Auto-s&cale - + + Enable/Disable + + + + Link/Unlink - + &Nest - + &Reveal in Project - + R&ename - + %1 Start: %2 End: %3 @@ -2950,57 +2955,57 @@ Duration: %4 - + Rename '%1' - + Rename multiple clips - + Enter a new name for this clip: - + Error - + Couldn't locate media wrapper for sequence. - + Title - + Solid Color - + Bars - + Tone - + Noise - + Duration: diff --git a/ts/olive_ru.ts b/ts/olive_ru.ts index bd00569fd..e3b8ad0be 100644 --- a/ts/olive_ru.ts +++ b/ts/olive_ru.ts @@ -802,42 +802,42 @@ MainWindow - + Welcome to %1 Приветствуем в %1 - + Auto-recovery Автовосстановление - + Olive didn't close properly and an autorecovery file was detected. Would you like to open it? Olive аварийно завершил работу, обнаружен файл автовосстановления. Открыть его? - + &Project &Проект - + &Sequence П&оследовательность - + &Folder П&апка - + Set In Point Установить точку входа - + Set Out Point Установить точку выхода @@ -846,382 +846,382 @@ Переключить точку входа/выхода - + Reset In Point Сбросить точку входа - + Reset Out Point Сбросить точку выхода - + Clear In/Out Point Очистить точку входа/выхода - + No active sequence Нет активных последовательностей - + Please open the sequence you wish to export. Откройте последовательность, которую хотите экспортировать - + Save Project As... Сохранить проект как… - + Unsaved Project Несохранённый проект - + This project has changed since it was last saved. Would you like to save it before closing? Проект был изменён с момента последнего сохранения. Хотите сохранить его перед закрытием? - + &File &Файл - + &New &Создать - + &Open Project &Открыть проект - + Clear Recent List Очистить список - + Open Recent Открыть недавний - + &Save Project Со&хранить проект - + Save Project &As Сохранить проект &как - + &Import... &Импортировать… - + &Export... &Экспортировать…. - + E&xit В&ыход - + &Edit &Правка - + &Undo &Отменить - + Redo Вернуть - + Cu&t В&ырезать - + Cop&y С&копировать - + &Paste &Вставить - + Paste Insert - + Duplicate Сделать копию - + Delete Удалить - + Ripple Delete Удалить со сдвигом - + Split Разделить - + Select &All Выд&елить всё - + Deselect All Снять выделение - + Add Default Transition Добавить переход по умолчанию - + Link/Unlink Связать/Убрать связь - + Enable/Disable Включить/Отключить - + Nest Вложить - + Ripple to In Point Сдвиг до точки входа - + Ripple to Out Point Сдвиг до точки выхода - + Edit to In Point Правка до точки входа - + Edit to Out Point Правка до точки выхода - + Delete In/Out Point Удалить точку входа/выхода - + Ripple Delete In/Out Point Удалить со сдвигом точку входа/выхода - + Set/Edit Marker Установить/Изменить маркер - + &View &Вид - + Zoom In Приблизить - + Zoom Out Отдалить - + Increase Track Height Увеличить высоту дорожки - + Decrease Track Height Уменьшить высоту дорожки - + Toggle Show All Показывать весь проект - + Track Lines Линии дорожек - + Rectified Waveforms Волновая форма от низа - + Frames Кадры - + Drop Frame С пропуском кадров - + Non-Drop Frame Без пропуска кадров - + Milliseconds Миллисекунды - + Title/Action Safe Area Безопасная область - + Off Выкл. - + Default По умолчанию - + 4:3 4:3 - + 16:9 16:9 - + Custom Другая - + Full Screen Полноэкранный режим - + Full Screen Viewer Монитор в полноэкранном режиме - + &Playback Вос&произведение - + Go to Start К началу - + Previous Frame К предыдущему кадру - + Play/Pause Воспроизведение/Пауза - + Play In to Out Проиграть от входа до выхода - + Next Frame К следующему кадру - + Go to End В конец - + Go to Previous Cut - + Go to Next Cut - + Go to In Point К точке входа - + Go to Out Point К точке выхода - + Shuttle Left Уменьшить скорость - + Shuttle Stop Пауза - + Shuttle Right Увеличить скорость @@ -1238,257 +1238,257 @@ Увеличить скорость - + Loop Петля - + &Window &Окно - + Project Проект - + Effect Controls Управление эффектами - + Timeline Таймлайн - + Graph Editor Редактор графов - + Media Viewer Монитор проекта - + Sequence Viewer Монитор последовательностей - + Maximize Panel Развернуть панель - + Reset to Default Layout Вернуть исходный вид панелей - + &Tools &Инструменты - + Pointer Tool Указатель - + Edit Tool Выделение - + Ripple Tool Монтаж со сдвигом - + Razor Tool Подрезка - + Slip Tool Прокрутка с совмещением - + Slide Tool Прокрутка - + Hand Tool Навигация - + Transition Tool Переход - + Enable Snapping Включить прилипание - + Selecting Also Seeks Выделение с перемоткой - + Edit Tool Also Seeks Выделение с перемоткой - + Edit Tool Selects Links Выделение выбирает связи - + Seek Also Selects Перемотка с выделением - + Seek to the End of Pastes Перемотка до конца вставок - + Scroll Wheel Zooms Колесо мыши масштабирует таймлайн - + Enable Drag Files to Timeline Разрешить перетаскивание на таймлайн извне - + Auto-Scale By Default Автоматически масштабировать по умолчанию - + Enable Seek to Import - + Audio Scrubbing Воспроизводить звук при прокрутке - + Enable Drop on Media to Replace - + Enable Hover Focus Включить фокус наводкой - + Ask For Name When Setting Marker Спрашивать имя маркера при добавлении - + No Auto-Scroll Без автопрокрутки - + Page Auto-Scroll Прокручивать перелистыванием - + Smooth Auto-Scroll Прокручивать плавно - + Preferences Параметры - + Clear Undo Очистить историю изменений - + &Help &Справка - + A&ction Search &Найти команду - + Debug Log Журнал отладки - + &About... &О программе… - + <untitled> <без названия> - + Open Project... Открыть проект… - + Missing recent project Отсутствует недавний проект - + The project '%1' no longer exists. Would you like to remove it from the recent projects list? Проект '%1' больше не существует. Удалить его из списка недавних? - + Invalid aspect ratio Некорректное соотношение сторон - + The aspect ratio '%1' is invalid. Please try again. - + Enter custom aspect ratio Введите другое соотношение сторон - + Enter the aspect ratio to use for the title/action safe area (e.g. 16:9): - + Nested Sequence Вложенная последовательность @@ -2123,13 +2123,13 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff - + All Files Все файлы - + No active sequence Нет активных последовательностей @@ -2184,12 +2184,12 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Похоже, что файл '%1' яавляется частью последовательности изображений. Загрузить его как таковой? - + Import media... Импортировать медиафайлы… - + No sequence is active, please open the sequence you want to delete clips from. Нет активных последовательностей. Откройте последовательность, из которой хотите удалить клипы. @@ -2257,17 +2257,17 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Как в исходнике (в папке «%1») - + Proxy file exists Прокси-файл уже существует - + The file "%1" already exists. Do you wish to replace it? Файл «%1» уже существует. Заменить его? - + Custom Location Другое размещение @@ -2929,72 +2929,77 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff TimelineWidget - + &Undo &Отменить - + &Redo В&ернуть - + C&ut В&ырезать - + Cop&y С&копировать - + &Paste &Вставить - + R&ipple Delete Уда&лить со сдвигом - + Sequence Settings Параметры последовательности - + &Speed/Duration С&корость/Длительность - + Auto-s&cale Авто&масштабирование - + + Enable/Disable + Включить/Отключить + + + Link/Unlink Связать/Убрать связь - + &Nest Вло&жить - + &Reveal in Project &Показать в проекте - + R&ename Пере&именовать - + %1 Start: %2 End: %3 @@ -3005,57 +3010,57 @@ Duration: %4 Длительность: %4 - + Rename '%1' Переименовать '%1' - + Rename multiple clips Переименовать клипы - + Enter a new name for this clip: Новое название этого клипа: - + Error Ошибка - + Couldn't locate media wrapper for sequence. - + Title Титры - + Solid Color Цветная заливка - + Bars Испытательная таблица - + Tone Звуковой сигнал - + Noise Шум - + Duration: Длительность: From e9fe837236ec15ea65e28865f4d237cbfd342e4f Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Feb 2019 05:27:21 -0800 Subject: [PATCH 176/202] first commit of big refactor --- dialogs/actionsearch.cpp | 2 +- dialogs/exportdialog.cpp | 30 +- dialogs/loaddialog.cpp | 8 +- dialogs/preferencesdialog.cpp | 7 +- dialogs/proxydialog.cpp | 3 +- dialogs/replaceclipmediadialog.cpp | 14 +- dialogs/speeddialog.cpp | 10 +- effects/internal/texteffect.cpp | 2 +- effects/internal/timecodeeffect.cpp | 2 +- effects/internal/vsthost.cpp | 6 +- io/exportthread.cpp | 35 +- io/loadthread.cpp | 37 +- io/path.cpp | 52 ++- io/path.h | 5 +- io/proxygenerator.cpp | 2 +- main.cpp | 21 +- mainwindow.cpp | 300 ++++--------- mainwindow.h | 47 +- olive.pro | 645 ++++++++++++++-------------- oliveglobal.cpp | 192 +++++++++ oliveglobal.h | 91 ++++ panels/effectcontrols.cpp | 14 +- panels/panels.cpp | 30 +- panels/panels.h | 10 +- panels/project.cpp | 59 ++- panels/project.h | 2 +- panels/timeline.cpp | 278 ++++++------ panels/viewer.cpp | 4 +- playback/audio.cpp | 27 +- playback/cacher.cpp | 2 +- playback/playback.cpp | 2 +- project/clip.cpp | 2 + project/clip.h | 3 - project/effect.cpp | 14 +- project/effectfield.h | 16 +- project/effectgizmo.h | 8 +- project/effectrow.cpp | 8 +- project/marker.cpp | 2 +- project/media.h | 8 +- project/projectelements.h | 15 + project/sequence.cpp | 2 +- project/sequence.h | 4 +- project/sourcescommon.cpp | 15 +- project/transition.cpp | 2 +- project/undo.cpp | 226 +++++----- ui/audiomonitor.cpp | 2 +- ui/comboboxex.cpp | 6 +- ui/keyframeview.cpp | 8 +- ui/menuhelper.cpp | 23 + ui/menuhelper.h | 45 ++ ui/timelineheader.cpp | 5 +- ui/timelinewidget.cpp | 252 +++++------ 52 files changed, 1419 insertions(+), 1186 deletions(-) create mode 100644 oliveglobal.cpp create mode 100644 oliveglobal.h create mode 100644 project/projectelements.h create mode 100644 ui/menuhelper.cpp create mode 100644 ui/menuhelper.h diff --git a/dialogs/actionsearch.cpp b/dialogs/actionsearch.cpp index 13c7f3c3b..1fe19c5b3 100644 --- a/dialogs/actionsearch.cpp +++ b/dialogs/actionsearch.cpp @@ -43,7 +43,7 @@ ActionSearch::ActionSearch(QWidget *parent) : void ActionSearch::search_update(const QString &s, const QString &p, QMenu *parent) { if (parent == nullptr) { list_widget->clear(); - QList menus = mainWindow->menuBar()->actions(); + QList menus = Olive::MainWindow->menuBar()->actions(); for (int i=0;imenu(); search_update(s, p, menu); diff --git a/dialogs/exportdialog.cpp b/dialogs/exportdialog.cpp index 9dfd6f0bb..15ecdbe75 100644 --- a/dialogs/exportdialog.cpp +++ b/dialogs/exportdialog.cpp @@ -15,11 +15,9 @@ #include #include -#include "debug.h" +#include "oliveglobal.h" #include "dialogs/advancedvideodialog.h" #include "panels/panels.h" -#include "panels/viewer.h" -#include "panels/timeline.h" #include "ui/viewerwidget.h" #include "project/sequence.h" #include "io/exportthread.h" @@ -58,11 +56,11 @@ enum ExportFormats { ExportDialog::ExportDialog(QWidget *parent) : QDialog(parent) { - setWindowTitle(tr("Export \"%1\"").arg(sequence->name)); + setWindowTitle(tr("Export \"%1\"").arg(Olive::ActiveSequence->name)); setup_ui(); rangeCombobox->setCurrentIndex(0); - if (sequence->using_workarea) { + if (Olive::ActiveSequence->using_workarea) { rangeCombobox->setEnabled(true); rangeCombobox->setCurrentIndex(1); } @@ -95,10 +93,10 @@ ExportDialog::ExportDialog(QWidget *parent) : } formatCombobox->setCurrentIndex(FORMAT_MPEG4); - widthSpinbox->setValue(sequence->width); - heightSpinbox->setValue(sequence->height); - samplingRateSpinbox->setValue(sequence->audio_frequency); - framerateSpinbox->setValue(sequence->frame_rate); + widthSpinbox->setValue(Olive::ActiveSequence->width); + heightSpinbox->setValue(Olive::ActiveSequence->height); + samplingRateSpinbox->setValue(Olive::ActiveSequence->audio_frequency); + framerateSpinbox->setValue(Olive::ActiveSequence->frame_rate); } ExportDialog::~ExportDialog() @@ -511,10 +509,10 @@ void ExportDialog::export_action() { } params.start_frame = 0; - params.end_frame = sequence->getEndFrame(); // entire sequence + params.end_frame = Olive::ActiveSequence->getEndFrame(); // entire sequence if (rangeCombobox->currentIndex() == 1) { - params.start_frame = qMax(sequence->workarea_in, params.start_frame); - params.end_frame = qMin(sequence->workarea_out, params.end_frame); + params.start_frame = qMax(Olive::ActiveSequence->workarea_in, params.start_frame); + params.end_frame = qMin(Olive::ActiveSequence->workarea_out, params.end_frame); } et = new ExportThread(params, vcodec_params, this); @@ -523,11 +521,11 @@ void ExportDialog::export_action() { connect(et, SIGNAL(finished()), this, SLOT(render_thread_finished())); connect(et, SIGNAL(progress_changed(int, qint64)), this, SLOT(update_progress_bar(int, qint64))); - closeActiveClips(sequence); + closeActiveClips(Olive::ActiveSequence); - mainWindow->set_rendering_state(true); + Olive::Global.data()->set_rendering_state(true); - mainWindow->autorecover_interval(); + Olive::Global.data()->save_autorecovery_file(); prep_ui_for_render(true); @@ -594,7 +592,7 @@ void ExportDialog::comp_type_changed(int) { case COMPRESSION_TYPE_CBR: case COMPRESSION_TYPE_TARGETBR: videoBitrateLabel->setText(tr("Bitrate (Mbps):")); - videobitrateSpinbox->setValue(qMax(0.5, (double) qRound((0.01528 * sequence->height) - 4.5))); + videobitrateSpinbox->setValue(qMax(0.5, (double) qRound((0.01528 * Olive::ActiveSequence->height) - 4.5))); break; case COMPRESSION_TYPE_CFR: videoBitrateLabel->setText(tr("Quality (CRF):")); diff --git a/dialogs/loaddialog.cpp b/dialogs/loaddialog.cpp index e0b555df8..046ebcda1 100644 --- a/dialogs/loaddialog.cpp +++ b/dialogs/loaddialog.cpp @@ -6,8 +6,10 @@ #include #include +#include "oliveglobal.h" + #include "panels/panels.h" -#include "panels/project.h" + #include "io/loadthread.h" #include "playback/playback.h" #include "ui/sourcetable.h" @@ -19,7 +21,7 @@ LoadDialog::LoadDialog(QWidget *parent, bool autorecovery) : QDialog(parent) { QVBoxLayout* layout = new QVBoxLayout(this); - layout->addWidget(new QLabel(tr("Loading '%1'...").arg(project_url.mid(project_url.lastIndexOf('/')+1)), this)); + layout->addWidget(new QLabel(tr("Loading '%1'...").arg(Olive::ActiveProjectFilename.mid(Olive::ActiveProjectFilename.lastIndexOf('/')+1)), this)); bar = new QProgressBar(this); bar->setValue(0); @@ -51,7 +53,7 @@ void LoadDialog::cancel() { } void LoadDialog::die() { - mainWindow->new_project(); + Olive::Global.data()->new_project(); reject(); } diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index aa26047ba..221f66a34 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -26,8 +26,7 @@ #include #include #include - -#include "debug.h" +#include KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) : QKeySequenceEdit(parent), action(a) { @@ -161,7 +160,7 @@ void PreferencesDialog::save() { // save settings from UI to backend config.css_path = custom_css_fn->text(); - mainWindow->load_css_from_file(config.css_path); + Olive::MainWindow->load_css_from_file(config.css_path); config.recording_mode = recordingComboBox->currentIndex() + 1; config.img_seq_formats = imgSeqFormatEdit->text(); config.fast_seeking = fastSeekButton->isChecked(); @@ -411,7 +410,7 @@ void PreferencesDialog::setup_ui() { for (int i=0;i #include #include - #include #include "io/proxygenerator.h" @@ -133,7 +132,7 @@ void ProxyDialog::accept() { proxy_generator.queue(info_list.at(i)); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); QDialog::accept(); } diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index 7b4171a42..49a2940b2 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -2,15 +2,11 @@ #include "ui/sourcetable.h" #include "panels/panels.h" -#include "panels/timeline.h" -#include "panels/project.h" -#include "project/sequence.h" -#include "project/clip.h" +#include "project/projectelements.h" + #include "playback/playback.h" #include "playback/cacher.h" -#include "project/footage.h" #include "project/undo.h" -#include "project/media.h" #include #include @@ -84,7 +80,7 @@ void ReplaceClipMediaDialog::replace() { QMessageBox::Ok ); } else { - if (new_item->get_type() == MEDIA_TYPE_SEQUENCE && sequence == new_item->to_sequence()) { + if (new_item->get_type() == MEDIA_TYPE_SEQUENCE && Olive::ActiveSequence == new_item->to_sequence()) { QMessageBox::critical( this, tr("Active sequence selected"), @@ -98,8 +94,8 @@ void ReplaceClipMediaDialog::replace() { use_same_media_in_points->isChecked() ); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && c->media == media) { rcmc->clips.append(c); } diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index d5f411059..f00e39bb4 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -41,7 +41,7 @@ SpeedDialog::SpeedDialog(QWidget *parent) : QDialog(parent) { grid->addWidget(new QLabel(tr("Duration:"), this), 2, 0); duration = new LabelSlider(this); duration->set_display_type(LABELSLIDER_FRAMENUMBER); - duration->set_frame_rate(sequence->frame_rate); + duration->set_frame_rate(Olive::ActiveSequence->frame_rate); grid->addWidget(duration, 2, 1); main_layout->addLayout(grid); @@ -322,14 +322,14 @@ void set_speed(ComboAction* ca, Clip* c, double speed, bool ripple, long& ep, lo sel.in = c->timeline_in; sel.out = proposed_out; sel.track = c->track; - sequence->selections.append(sel); + Olive::ActiveSequence->selections.append(sel); } void SpeedDialog::accept() { ComboAction* ca = new ComboAction(); - SetSelectionsCommand* sel_command = new SetSelectionsCommand(sequence); - sel_command->old_data = sequence->selections; + SetSelectionsCommand* sel_command = new SetSelectionsCommand(Olive::ActiveSequence); + sel_command->old_data = Olive::ActiveSequence->selections; long earliest_point = LONG_MAX; long longest_ripple = LONG_MIN; @@ -402,7 +402,7 @@ void SpeedDialog::accept() { ripple_clips(ca, clips.at(0)->sequence, earliest_point, longest_ripple); } - sel_command->new_data = sequence->selections; + sel_command->new_data = Olive::ActiveSequence->selections; ca->append(sel_command); undo_stack.push(ca); diff --git a/effects/internal/texteffect.cpp b/effects/internal/texteffect.cpp index 7f4c36940..4fd0abb02 100644 --- a/effects/internal/texteffect.cpp +++ b/effects/internal/texteffect.cpp @@ -310,7 +310,7 @@ void TextEffect::text_edit_menu() { } void TextEffect::open_text_edit() { - TextEditDialog ted(mainWindow, text_val->get_current_data().toString()); + TextEditDialog ted(Olive::MainWindow, text_val->get_current_data().toString()); ted.exec(); QString result = ted.get_string(); if (!result.isEmpty()) { diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index 52a1d65c7..0d0aae920 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -62,7 +62,7 @@ TimecodeEffect::TimecodeEffect(Clip *c, const EffectMeta* em) : void TimecodeEffect::redraw(double timecode) { if (tc_select->get_combo_data(timecode).toBool()){ - display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(sequence->playhead, config.timecode_view, sequence->frame_rate);} + display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(Olive::ActiveSequence->playhead, config.timecode_view, Olive::ActiveSequence->frame_rate);} else { double media_rate = parent_clip->getMediaFrameRate(); display_timecode = prepend_text->get_string_value(timecode) + frame_to_timecode(timecode * media_rate, config.timecode_view, media_rate);} diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index fd22d4b94..0709bd027 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -63,7 +63,7 @@ extern "C" { // but we are aware of it break; case audioMasterEndEdit: // change made - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); break; default: qInfo() << "Plugin requested unhandled opcode" << opcode; @@ -178,7 +178,7 @@ bool VSTHost::configurePluginCallbacks() { // real VST plugin, or is otherwise corrupt. if(plugin->magic != kEffectMagic) { qCritical() << "Plugin's magic number is bad"; - QMessageBox::critical(mainWindow, tr("VST Error"), tr("Plugin's magic number is invalid")); + QMessageBox::critical(Olive::MainWindow, tr("VST Error"), tr("Plugin's magic number is invalid")); return false; } @@ -250,7 +250,7 @@ VSTHost::VSTHost(Clip* c, const EffectMeta *em) : Effect(c, em) { connect(show_interface_btn, SIGNAL(toggled(bool)), this, SLOT(show_interface(bool))); interface_row->add_widget(show_interface_btn); - dialog = new QDialog(mainWindow); + dialog = new QDialog(Olive::MainWindow); dialog->setWindowTitle(tr("VST Plugin")); dialog->setAttribute(Qt::WA_NativeWindow, true); dialog->setWindowFlags(dialog->windowFlags() | Qt::MSWindowsFixedSizeDialogHint); diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 074327d88..48708a143 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -1,10 +1,11 @@ #include "exportthread.h" +#include "oliveglobal.h" + #include "project/sequence.h" #include "panels/panels.h" -#include "panels/timeline.h" -#include "panels/viewer.h" + #include "ui/viewerwidget.h" #include "ui/renderthread.h" #include "ui/renderfunctions.h" @@ -162,15 +163,15 @@ bool ExportThread::setupVideo() { video_frame = av_frame_alloc(); av_frame_make_writable(video_frame); video_frame->format = AV_PIX_FMT_RGBA; - video_frame->width = sequence->width; - video_frame->height = sequence->height; + video_frame->width = Olive::ActiveSequence->width; + video_frame->height = Olive::ActiveSequence->height; av_frame_get_buffer(video_frame, 0); av_init_packet(&video_pkt); sws_ctx = sws_getContext( - sequence->width, - sequence->height, + Olive::ActiveSequence->width, + Olive::ActiveSequence->height, AV_PIX_FMT_RGBA, params.video_width, params.video_height, @@ -253,9 +254,9 @@ bool ExportThread::setupAudio() { acodec_ctx->channel_layout, acodec_ctx->sample_fmt, acodec_ctx->sample_rate, - sequence->audio_layout, + Olive::ActiveSequence->audio_layout, AV_SAMPLE_FMT_S16, - sequence->audio_frequency, + Olive::ActiveSequence->audio_frequency, 0, nullptr ); @@ -263,7 +264,7 @@ bool ExportThread::setupAudio() { // initialize raw audio frame audio_frame = av_frame_alloc(); - audio_frame->sample_rate = sequence->audio_frequency; + audio_frame->sample_rate = Olive::ActiveSequence->audio_frequency; audio_frame->nb_samples = acodec_ctx->frame_size; if (audio_frame->nb_samples == 0) audio_frame->nb_samples = 256; // should possibly be smaller? audio_frame->format = AV_SAMPLE_FMT_S16; @@ -345,16 +346,16 @@ void ExportThread::run() { mutex.lock(); - while (sequence->playhead <= params.end_frame && continueEncode) { + while (Olive::ActiveSequence->playhead <= params.end_frame && continueEncode) { start_time = QDateTime::currentMSecsSinceEpoch(); if (params.audio_enabled) { - compose_audio(nullptr, sequence, true, false); + compose_audio(nullptr, Olive::ActiveSequence, true, false); } if (params.video_enabled) { do { // TODO optimize by rendering the next frame while encoding the last - renderer->start_render(nullptr, sequence, nullptr, video_frame->data[0], video_frame->linesize[0]/4); + renderer->start_render(nullptr, Olive::ActiveSequence, nullptr, video_frame->data[0], video_frame->linesize[0]/4); waitCond.wait(&mutex); if (!continueEncode) break; } while (renderer->did_texture_fail()); @@ -362,7 +363,7 @@ void ExportThread::run() { } // encode last frame while rendering next frame - double timecode_secs = double(sequence->playhead - params.start_frame) / sequence->frame_rate; + double timecode_secs = double(Olive::ActiveSequence->playhead - params.start_frame) / Olive::ActiveSequence->frame_rate; if (params.video_enabled) { // create sws_frame for converting pixel format @@ -423,12 +424,12 @@ void ExportThread::run() { // generating encoding statistics (time it took to encode this frame/estimated remaining time) frame_time = (QDateTime::currentMSecsSinceEpoch()-start_time); total_time += frame_time; - remaining_frames = (params.end_frame - sequence->playhead); + remaining_frames = (params.end_frame - Olive::ActiveSequence->playhead); avg_time = (total_time/frame_count); eta = (remaining_frames*avg_time); - emit progress_changed(qRound((double(sequence->playhead - params.start_frame) / double(params.end_frame - params.start_frame)) * 100.0), eta); - sequence->playhead++; + emit progress_changed(qRound((double(Olive::ActiveSequence->playhead - params.start_frame) / double(params.end_frame - params.start_frame)) * 100.0), eta); + Olive::ActiveSequence->playhead++; frame_count++; } @@ -442,7 +443,7 @@ void ExportThread::run() { if (params.audio_enabled) apkt_alloc = true; } - mainWindow->set_rendering_state(false); + Olive::Global.data()->set_rendering_state(false); if (params.audio_enabled && continueEncode) { // flush swresample diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 290a26197..7e83c81dd 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -1,19 +1,17 @@ #include "loadthread.h" +#include "oliveglobal.h" + #include "mainwindow.h" + #include "panels/panels.h" -#include "panels/effectcontrols.h" -#include "panels/project.h" -#include "project/footage.h" + +#include "project/projectelements.h" + #include "io/config.h" -#include "project/clip.h" -#include "project/sequence.h" -#include "project/transition.h" -#include "project/effect.h" #include "playback/playback.h" #include "io/previewgenerator.h" #include "dialogs/loaddialog.h" -#include "project/media.h" #include "effects/internal/voideffect.h" #include "debug.h" @@ -575,7 +573,7 @@ Media* LoadThread::find_loaded_folder_by_id(int id) { void LoadThread::run() { mutex.lock(); - QFile file(project_url); + QFile file(Olive::ActiveProjectFilename); if (!file.open(QIODevice::ReadOnly)) { qCritical() << "Could not open file"; return; @@ -586,9 +584,9 @@ void LoadThread::run() { * case the project file has moved without the footage, * we check both */ - proj_dir = QFileInfo(project_url).absoluteDir(); - internal_proj_dir = QFileInfo(project_url).absoluteDir(); - internal_proj_url = project_url; + proj_dir = QFileInfo(Olive::ActiveProjectFilename).absoluteDir(); + internal_proj_dir = QFileInfo(Olive::ActiveProjectFilename).absoluteDir(); + internal_proj_url = Olive::ActiveProjectFilename; QXmlStreamReader stream(&file); @@ -696,7 +694,7 @@ void LoadThread::cancel() { void LoadThread::question_func(const QString &title, const QString &text, int buttons) { question_btn = QMessageBox::warning( - mainWindow, + Olive::MainWindow, title, text, static_cast(buttons)); @@ -706,12 +704,12 @@ void LoadThread::question_func(const QString &title, const QString &text, int bu void LoadThread::error_func() { if (xml_error) { qCritical() << "Error parsing XML." << error_str; - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, tr("XML Parsing Error"), - tr("Couldn't load '%1'. %2").arg(project_url, error_str), + tr("Couldn't load '%1'. %2").arg(Olive::ActiveProjectFilename, error_str), QMessageBox::Ok); } else { - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, tr("Project Load Error"), tr("Error loading project: %1").arg(error_str), QMessageBox::Ok); @@ -733,12 +731,13 @@ void LoadThread::success_func() { orig_filename.insert(insert_index, " (" + recover_text + ")"); counter++; } - mainWindow->updateTitle(orig_filename); + + Olive::Global.data()->update_project_filename(orig_filename); } else { - panel_project->add_recent_project(project_url); + panel_project->add_recent_project(Olive::ActiveProjectFilename); } - mainWindow->setWindowModified(autorecovery); + Olive::MainWindow->setWindowModified(autorecovery); if (open_seq != nullptr) set_sequence(open_seq); update_ui(false); } diff --git a/io/path.cpp b/io/path.cpp index dafa5ae7f..5bca2b4f4 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -8,41 +8,56 @@ #include "debug.h" -QString get_app_dir() { +QString get_app_path() { return QCoreApplication::applicationDirPath(); } +QDir get_app_dir() { + return QDir(get_app_path()); +} + QString get_data_path() { - QString app_dir = get_app_dir(); - if (QFileInfo::exists(app_dir + "/portable")) { - return app_dir; + QDir app_dir = get_app_dir(); + if (QFileInfo::exists(app_dir.filePath("portable"))) { + return app_dir.absolutePath(); } else { return QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); } } +QDir get_data_dir() { + return QDir(get_data_path()); +} + QString get_config_path() { - QString app_dir = get_app_dir(); - if (QFileInfo::exists(app_dir + "/portable")) { - return app_dir; + QDir app_dir = get_app_dir(); + if (QFileInfo::exists(app_dir.filePath("portable"))) { + return app_dir.absolutePath(); } else { return QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); } } +QDir get_config_dir() { + return QDir(get_config_path()); +} + QList get_effects_paths() { // returns a list of the effects paths to search QList effects_paths; + // get current app working directory + QDir app_dir = get_app_dir(); + // "effects" subfolder in program folder - best for Windows - effects_paths.append(get_app_dir() + "/effects"); + effects_paths.append(app_dir.filePath("effects")); // "Effects" folder one level above the program's directory - best for Mac - effects_paths.append(get_app_dir() + "/../Effects"); + effects_paths.append(app_dir.filePath("../Effects")); // folder in share folder - best for Linux - effects_paths.append(get_app_dir() + "/../share/olive-editor/effects"); + effects_paths.append(app_dir.filePath("/../share/olive-editor/effects")); // Olive will also accept a manually provided folder with an environment variable QString env_path(qgetenv("OLIVE_EFFECTS_PATH")); @@ -52,22 +67,29 @@ QList get_effects_paths() { } QString get_file_hash(const QString& filename) { - QFileInfo file_info(filename); - QString cache_file = filename.mid(filename.lastIndexOf('/')+1) + QString::number(file_info.size()) + QString::number(file_info.lastModified().toMSecsSinceEpoch()); + QFileInfo file_info(filename); + + QString cache_file = filename.mid(filename.lastIndexOf('/')+1) + + QString::number(file_info.size()) + + QString::number(file_info.lastModified().toMSecsSinceEpoch()); + return QCryptographicHash::hash(cache_file.toUtf8(), QCryptographicHash::Md5).toHex(); } QList get_language_paths() { QList language_paths; + // get current app working directory + QDir app_dir = get_app_dir(); + // subfolder in program folder - best for Windows (or compiling+running from source dir) - language_paths.append(get_app_dir() + "/ts"); + language_paths.append(app_dir.filePath("ts")); // folder one level above the program's directory - best for Mac - language_paths.append(get_app_dir() + "/../Translations"); + language_paths.append(app_dir.filePath("../Translations")); // folder in share folder - best for Linux - language_paths.append(get_app_dir() + "/../share/olive-editor/ts"); + language_paths.append(app_dir.filePath("../share/olive-editor/ts")); // Olive will also accept a manually provided folder with an environment variable QString env_path(qgetenv("OLIVE_LANG_PATH")); diff --git a/io/path.h b/io/path.h index 67771b330..9cd3f3b2f 100644 --- a/io/path.h +++ b/io/path.h @@ -2,10 +2,13 @@ #define PATH_H #include +#include -QString get_app_dir(); +QString get_app_path(); QString get_data_path(); +QDir get_data_dir(); QString get_config_path(); +QDir get_config_dir(); QList get_effects_paths(); QList get_language_paths(); diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp index d09e58e63..3fc7effde 100644 --- a/io/proxygenerator.cpp +++ b/io/proxygenerator.cpp @@ -297,7 +297,7 @@ void ProxyGenerator::transcode(const ProxyInfo& info) { info.footage->proxy_path = info.path; qInfo() << "Finished creating proxy for" << info.footage->url; - QMetaObject::invokeMethod(mainWindow->statusBar(), + QMetaObject::invokeMethod(Olive::MainWindow->statusBar(), "showMessage", Qt::QueuedConnection, Q_ARG(QString, tr("Finished generating proxy for \"%1\"").arg(info.footage->url))); diff --git a/main.cpp b/main.cpp index f313bff71..4f748ab18 100644 --- a/main.cpp +++ b/main.cpp @@ -3,6 +3,8 @@ #include "debug.h" +#include "oliveglobal.h" + #include "io/config.h" extern "C" { @@ -11,12 +13,7 @@ extern "C" { } int main(int argc, char *argv[]) { - QString appName = "Olive (February 2019 | Alpha"; -#ifdef GITHASH - appName += " | "; - appName += GITHASH; -#endif - appName += ")"; + Olive::Global = QSharedPointer(new OliveGlobal); bool launch_fullscreen = false; QString load_proj; @@ -30,7 +27,7 @@ int main(int argc, char *argv[]) { #ifndef GITHASH qWarning() << "No Git commit information found"; #endif - printf("%s\n", appName.toUtf8().constData()); + printf("%s\n", Olive::AppName.toUtf8().constData()); return 0; } else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) { printf("Usage: %s [options] [filename]\n\n" @@ -96,11 +93,13 @@ int main(int argc, char *argv[]) { QCoreApplication::setApplicationName("Olive"); QGuiApplication::setDesktopFileName("org.olivevideoeditor.Olive"); - MainWindow w(nullptr, appName); - w.updateTitle(""); + MainWindow w(nullptr); - if (!load_proj.isEmpty()) { - w.launch_with_project(load_proj); + // connect main window's first paint to global's init finished function + QObject::connect(&w, SIGNAL(finished_first_paint()), Olive::Global.data(), SLOT(finished_initialize())); + + if (!load_proj.isEmpty()) { + Olive::Global.data()->load_project_on_launch(load_proj); } if (launch_fullscreen) { w.showFullScreen(); diff --git a/mainwindow.cpp b/mainwindow.cpp index 28f0991b1..9c796a229 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,14 +1,15 @@ #include "mainwindow.h" +#include "oliveglobal.h" + +#include "ui/menuhelper.h" + +#include "project/projectelements.h" + #include "io/config.h" #include "io/path.h" #include "io/proxygenerator.h" -#include "project/footage.h" -#include "project/sequence.h" -#include "project/clip.h" -#include "project/undo.h" -#include "project/media.h" #include "project/projectfilter.h" #include "ui/sourcetable.h" @@ -54,14 +55,9 @@ #include #include -MainWindow* mainWindow; +MainWindow* Olive::MainWindow; #define DEFAULT_CSS "QPushButton::checked { background: rgb(25, 25, 25); }" -#define OLIVE_FILE_FILTER "Olive Project (*.ove)" - -QTimer autorecovery_timer; -QString config_fn; -bool demoNoticeShown = false; void MainWindow::setup_layout(bool reset) { panel_project->show(); @@ -81,7 +77,7 @@ void MainWindow::setup_layout(bool reset) { // load panels from file if (!reset) { - QFile panel_config(get_config_path() + "/layout"); + QFile panel_config(get_config_path() + "/layout"); if (panel_config.exists() && panel_config.open(QFile::ReadOnly)) { restoreState(panel_config.readAll(), 0); panel_config.close(); @@ -91,10 +87,9 @@ void MainWindow::setup_layout(bool reset) { layout()->update(); } -MainWindow::MainWindow(QWidget *parent, const QString &an) : - QMainWindow(parent), - enable_launch_with_project(false), - appName(an) +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + first_show(true) { init_custom_cursors(); @@ -102,7 +97,7 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : debug_dialog = new DebugDialog(this); - mainWindow = this; + Olive::MainWindow = this; // set up style? @@ -160,12 +155,12 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : if (deleted_ars > 0) qInfo() << "Deleted" << deleted_ars << "autorecovery" << ((deleted_ars == 1) ? "file that was" : "files that were") << "older than 7 days"; // delete previews older than 30 days - QDir preview_dir = QDir(data_dir + "/previews"); + QDir preview_dir = QDir(dir.filePath("previews")); if (preview_dir.exists()) { deleted_ars = 0; QStringList old_prevs = preview_dir.entryList(QDir::Files); for (int i=0;ishowMessage(tr("Welcome to %1").arg(appName)); + statusBar->showMessage(tr("Welcome to %1").arg(Olive::AppName)); setStatusBar(statusBar); // populate menu bars setup_menus(); - if (!data_dir.isEmpty()) { - // detect auto-recovery file - autorecovery_filename = data_dir + "/autorecovery.ove"; - if (QFile::exists(autorecovery_filename)) { - if (QMessageBox::question(nullptr, tr("Auto-recovery"), tr("Olive didn't close properly and an autorecovery file was detected. Would you like to open it?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { - enable_launch_with_project = false; - open_project_worker(autorecovery_filename, true); - } - } - autorecovery_timer.setInterval(60000); - QObject::connect(&autorecovery_timer, SIGNAL(timeout()), this, SLOT(autorecover_interval())); - autorecovery_timer.start(); - } + Olive::Global.data()->check_for_autorecovery_file(); // set up panel layout setup_layout(false); @@ -255,6 +238,9 @@ MainWindow::MainWindow(QWidget *parent, const QString &an) : // start omnipotent proxy generator process proxy_generator.start(); + + // set default window title + updateTitle(); } MainWindow::~MainWindow() { @@ -262,28 +248,6 @@ MainWindow::~MainWindow() { close_debug_file(); } -void MainWindow::launch_with_project(const QString& s) { - project_url = s; - enable_launch_with_project = true; - demoNoticeShown = true; -} - -void MainWindow::make_new_menu(QMenu *parent) { - parent->addAction(tr("&Project"), this, SLOT(new_project()), QKeySequence("Ctrl+N"))->setProperty("id", "newproj"); - parent->addSeparator(); - parent->addAction(tr("&Sequence"), this, SLOT(new_sequence()), QKeySequence("Ctrl+Shift+N"))->setProperty("id", "newseq"); - parent->addAction(tr("&Folder"), this, SLOT(new_folder()))->setProperty("id", "newfolder"); -} - -void MainWindow::make_inout_menu(QMenu *parent) { - parent->addAction(tr("Set In Point"), this, SLOT(set_in_point()), QKeySequence("I"))->setProperty("id", "setinpoint"); - parent->addAction(tr("Set Out Point"), this, SLOT(set_out_point()), QKeySequence("O"))->setProperty("id", "setoutpoint"); - parent->addSeparator(); - parent->addAction(tr("Reset In Point"), this, SLOT(clear_in()))->setProperty("id", "resetin"); - parent->addAction(tr("Reset Out Point"), this, SLOT(clear_out()))->setProperty("id", "resetout"); - parent->addAction(tr("Clear In/Out Point"), this, SLOT(clear_inout()), QKeySequence("G"))->setProperty("id", "clearinout"); -} - void kbd_shortcut_processor(QByteArray& file, QMenu* menu, bool save, bool first) { QList actions = menu->actions(); for (int i=0;iheaders->hasFocus()) { panel_sequence_viewer->headers->delete_markers(); } else if (panel_timeline->focused()) { - panel_timeline->delete_selection(sequence->selections, false); + panel_timeline->delete_selection(Olive::ActiveSequence->selections, false); } else if (panel_effect_controls->is_focused()) { panel_effect_controls->delete_effects(); } else if (panel_project->is_focused()) { @@ -456,7 +411,7 @@ void MainWindow::zoom_out() { } void MainWindow::export_dialog() { - if (sequence == nullptr) { + if (Olive::ActiveSequence == nullptr) { QMessageBox::information(this, tr("No active sequence"), tr("Please open the sequence you wish to export."), QMessageBox::Ok); } else { ExportDialog e(this); @@ -465,9 +420,9 @@ void MainWindow::export_dialog() { } void MainWindow::ripple_delete() { - if (sequence != nullptr) { - if (sequence->selections.size() > 0) { - panel_timeline->delete_selection(sequence->selections, true); + if (Olive::ActiveSequence != nullptr) { + if (Olive::ActiveSequence->selections.size() > 0) { + panel_timeline->delete_selection(Olive::ActiveSequence->selections, true); } else if (config.hover_focus && get_focused_panel() == panel_timeline) { if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { panel_timeline->ripple_delete_empty_space(); @@ -494,10 +449,10 @@ void MainWindow::redo() { } void MainWindow::open_speed_dialog() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { SpeedDialog s(this); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { s.clips.append(c); } @@ -507,7 +462,7 @@ void MainWindow::open_speed_dialog() { } void MainWindow::cut() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QDockWidget* focused_panel = get_focused_panel(); if (panel_timeline == focused_panel) { panel_timeline->copy(true); @@ -518,7 +473,7 @@ void MainWindow::cut() { } void MainWindow::copy() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QDockWidget* focused_panel = get_focused_panel(); if (panel_timeline == focused_panel) { panel_timeline->copy(false); @@ -530,73 +485,11 @@ void MainWindow::copy() { void MainWindow::paste() { QDockWidget* focused_panel = get_focused_panel(); - if ((panel_timeline == focused_panel || panel_effect_controls == focused_panel) && sequence != nullptr) { + if ((panel_timeline == focused_panel || panel_effect_controls == focused_panel) && Olive::ActiveSequence != nullptr) { panel_timeline->paste(false); } } -void MainWindow::new_project() { - if (can_close_project()) { - panel_effect_controls->clear_effects(true); - undo_stack.clear(); - project_url.clear(); - panel_project->new_project(); - updateTitle(""); - update_ui(false); - panel_project->tree_view->update(); - } -} - -void MainWindow::autorecover_interval() { - if (isWindowModified()) { - panel_project->save_project(true); - qInfo() << "Auto-recovery project saved"; - } -} - -bool MainWindow::save_project_as() { - QString fn = QFileDialog::getSaveFileName(this, tr("Save Project As..."), "", OLIVE_FILE_FILTER); - if (!fn.isEmpty()) { - if (!fn.endsWith(".ove", Qt::CaseInsensitive)) { - fn += ".ove"; - } - updateTitle(fn); - panel_project->save_project(false); - return true; - } - return false; -} - -bool MainWindow::save_project() { - if (project_url.isEmpty()) { - return save_project_as(); - } else { - panel_project->save_project(false); - return true; - } -} - -bool MainWindow::can_close_project() { - if (isWindowModified()) { - QMessageBox* m = new QMessageBox( - QMessageBox::Question, - tr("Unsaved Project"), - tr("This project has changed since it was last saved. Would you like to save it before closing?"), - QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, - this - ); - m->setWindowModality(Qt::WindowModal); - int r = m->exec(); - delete m; - if (r == QMessageBox::Yes) { - return save_project(); - } else if (r == QMessageBox::Cancel) { - return false; - } - } - return true; -} - void MainWindow::setup_menus() { QMenuBar* menuBar = new QMenuBar(this); setMenuBar(menuBar); @@ -607,9 +500,9 @@ void MainWindow::setup_menus() { connect(file_menu, SIGNAL(aboutToShow()), this, SLOT(fileMenu_About_To_Be_Shown())); QMenu* new_menu = file_menu->addMenu(tr("&New")); - make_new_menu(new_menu); + Olive::MenuHelper.make_new_menu(new_menu); - file_menu->addAction(tr("&Open Project"), this, SLOT(open_project()), QKeySequence("Ctrl+O"))->setProperty("id", "openproj"); + file_menu->addAction(tr("&Open Project"), Olive::Global.data(), SLOT(open_project()), QKeySequence("Ctrl+O"))->setProperty("id", "openproj"); clear_open_recent_action = new QAction(tr("Clear Recent List"), menuBar); clear_open_recent_action->setProperty("id", "clearopenrecent"); @@ -619,8 +512,8 @@ void MainWindow::setup_menus() { open_recent->addAction(clear_open_recent_action); - file_menu->addAction(tr("&Save Project"), this, SLOT(save_project()), QKeySequence("Ctrl+S"))->setProperty("id", "saveproj"); - file_menu->addAction(tr("Save Project &As"), this, SLOT(save_project_as()), QKeySequence("Ctrl+Shift+S"))->setProperty("id", "saveprojas"); + file_menu->addAction(tr("&Save Project"), Olive::Global.data(), SLOT(save_project()), QKeySequence("Ctrl+S"))->setProperty("id", "saveproj"); + file_menu->addAction(tr("Save Project &As"), Olive::Global.data(), SLOT(save_project_as()), QKeySequence("Ctrl+Shift+S"))->setProperty("id", "saveprojas"); file_menu->addSeparator(); @@ -677,7 +570,7 @@ void MainWindow::setup_menus() { edit_menu->addSeparator(); - make_inout_menu(edit_menu); + Olive::MenuHelper.make_inout_menu(edit_menu); edit_menu->addAction(tr("Delete In/Out Point"), this, SLOT(delete_inout()), QKeySequence(";"))->setProperty("id", "deleteinout"); edit_menu->addAction(tr("Ripple Delete In/Out Point"), this, SLOT(ripple_delete_inout()), QKeySequence("'"))->setProperty("id", "rippledeleteinout"); @@ -1016,13 +909,15 @@ void MainWindow::set_button_action_checked(QAction *a) { a->setChecked(reinterpret_cast(a->data().value())->isChecked()); } -void MainWindow::updateTitle(const QString& url) { - project_url = url; - setWindowTitle(appName + " - " + ((project_url.isEmpty()) ? tr("") : project_url) + "[*]"); +void MainWindow::updateTitle() { + setWindowTitle(QString("%1 - %2[*]").arg(Olive::AppName, + (Olive::ActiveProjectFilename.isEmpty()) ? + tr("") : Olive::ActiveProjectFilename) + ); } void MainWindow::closeEvent(QCloseEvent *e) { - if (can_close_project()) { + if (Olive::Global.data()->can_close_project()) { // stop proxy generator thread proxy_generator.cancel(); @@ -1036,18 +931,22 @@ void MainWindow::closeEvent(QCloseEvent *e) { panel_footage_viewer->set_main_sequence(); QString data_dir = get_data_path(); - QString config_dir = get_config_path(); + QString config_path = get_config_path(); if (!data_dir.isEmpty() && !autorecovery_filename.isEmpty()) { if (QFile::exists(autorecovery_filename)) { QFile::rename(autorecovery_filename, autorecovery_filename + "." + QDateTime::currentDateTimeUtc().toString("yyyyMMddHHmmss")); } } - if (!config_dir.isEmpty() && !config_fn.isEmpty()) { + if (!config_path.isEmpty()) { + QDir config_dir = QDir(config_path); + + QString config_fn = config_dir.filePath("config.xml"); + // save settings config.save(config_fn); // save panel layout - QFile panel_config(config_dir + "/layout"); + QFile panel_config(config_path + "/layout"); if (panel_config.open(QFile::WriteOnly)) { panel_config.write(saveState(0)); panel_config.close(); @@ -1055,7 +954,7 @@ void MainWindow::closeEvent(QCloseEvent *e) { qCritical() << "Failed to save layout"; } - save_shortcuts(config_dir + "/shortcuts"); + save_shortcuts(config_path + "/shortcuts"); } stop_audio(); @@ -1068,42 +967,17 @@ void MainWindow::closeEvent(QCloseEvent *e) { void MainWindow::paintEvent(QPaintEvent *event) { QMainWindow::paintEvent(event); - if (enable_launch_with_project) { - QTimer::singleShot(10, this, SLOT(load_with_launch())); - enable_launch_with_project = false; - } - if (!demoNoticeShown) { -#ifndef QT_DEBUG - DemoNotice* d = new DemoNotice(this); - connect(d, SIGNAL(finished(int)), d, SLOT(deleteLater())); - d->open(); -#endif - demoNoticeShown = true; - } + if (first_show) { + emit finished_first_paint(); + first_show = false; + } } void MainWindow::clear_undo_stack() { undo_stack.clear(); } -void MainWindow::open_project() { - QString fn = QFileDialog::getOpenFileName(this, tr("Open Project..."), "", OLIVE_FILE_FILTER); - if (!fn.isEmpty() && can_close_project()) { - open_project_worker(fn, false); - } -} - -void MainWindow::open_project_worker(const QString& fn, bool autorecovery) { - updateTitle(fn); - panel_project->load_project(autorecovery); - undo_stack.clear(); -} - -void MainWindow::load_with_launch() { - open_project_worker(project_url, false); -} - void MainWindow::show_action_search() { ActionSearch as(this); as.exec(); @@ -1214,14 +1088,14 @@ void MainWindow::decrease_speed() { void MainWindow::prev_cut() { QDockWidget* focused_panel = get_focused_panel(); - if (sequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { + if (Olive::ActiveSequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { panel_timeline->previous_cut(); } } void MainWindow::next_cut() { QDockWidget* focused_panel = get_focused_panel(); - if (sequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { + if (Olive::ActiveSequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { panel_timeline->next_cut(); } } @@ -1376,7 +1250,7 @@ void MainWindow::fileMenu_About_To_Be_Shown() { QAction* action = open_recent->addAction(recent_projects.at(i)); action->setProperty("keyignore", true); action->setData(i); - connect(action, SIGNAL(triggered()), this, SLOT(load_recent_project())); + connect(action, SIGNAL(triggered()), Olive::Global.data(), SLOT(open_recent())); } open_recent->addSeparator(); @@ -1386,26 +1260,6 @@ void MainWindow::fileMenu_About_To_Be_Shown() { } } -void MainWindow::fileMenu_About_To_Hide() { -} - -void MainWindow::load_recent_project() { - int index = static_cast(sender())->data().toInt(); - QString recent_url = recent_projects.at(index); - if (!QFile::exists(recent_url)) { - if (QMessageBox::question( - this, - tr("Missing recent project"), - tr("The project '%1' no longer exists. Would you like to remove it from the recent projects list?").arg(recent_url), - QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { - recent_projects.removeAt(index); - panel_project->save_recent_projects(); - } - } else if (can_close_project()) { - open_project_worker(recent_url, false); - } -} - void MainWindow::ripple_to_in_point() { if (panel_timeline->focused()) panel_timeline->ripple_to_in_point(true, true); } @@ -1526,7 +1380,7 @@ void MainWindow::set_tsa_custom() { } void MainWindow::set_marker() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QDockWidget* focused_panel = get_focused_panel(); if (focused_panel == panel_timeline) { @@ -1540,11 +1394,11 @@ void MainWindow::set_marker() { } void MainWindow::toggle_enable_clips() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { ComboAction* ca = new ComboAction(); bool push_undo = false; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { ca->append(new SetEnableCommand(c, !c->enabled)); push_undo = true; @@ -1570,13 +1424,13 @@ void MainWindow::edit_to_out_point() { } void MainWindow::nest() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QVector selected_clips; long earliest_point = LONG_MAX; // get selected clips - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { selected_clips.append(i); earliest_point = qMin(c->timeline_in, earliest_point); @@ -1591,19 +1445,19 @@ void MainWindow::nest() { // create "nest" sequence s->name = panel_project->get_next_sequence_name(tr("Nested Sequence")); - s->width = sequence->width; - s->height = sequence->height; - s->frame_rate = sequence->frame_rate; - s->audio_frequency = sequence->audio_frequency; - s->audio_layout = sequence->audio_layout; + s->width = Olive::ActiveSequence->width; + s->height = Olive::ActiveSequence->height; + s->frame_rate = Olive::ActiveSequence->frame_rate; + s->audio_frequency = Olive::ActiveSequence->audio_frequency; + s->audio_layout = Olive::ActiveSequence->audio_layout; // copy all selected clips to the nest for (int i=0;iappend(new DeleteClipAction(sequence, selected_clips.at(i))); + ca->append(new DeleteClipAction(Olive::ActiveSequence, selected_clips.at(i))); // copy to new - Clip* copy = sequence->clips.at(selected_clips.at(i))->copy(s); + Clip* copy = Olive::ActiveSequence->clips.at(selected_clips.at(i))->copy(s); copy->timeline_in -= earliest_point; copy->timeline_out -= earliest_point; s->clips.append(copy); @@ -1618,11 +1472,11 @@ void MainWindow::nest() { // add nested sequence to active sequence QVector media_list; media_list.append(m); - panel_timeline->create_ghosts_from_media(sequence, earliest_point, media_list); - panel_timeline->add_clips_from_ghosts(ca, sequence); + panel_timeline->create_ghosts_from_media(Olive::ActiveSequence, earliest_point, media_list); + panel_timeline->add_clips_from_ghosts(ca, Olive::ActiveSequence); panel_effect_controls->clear_effects(true); - sequence->selections.clear(); + Olive::ActiveSequence->selections.clear(); undo_stack.push(ca); @@ -1633,7 +1487,7 @@ void MainWindow::nest() { void MainWindow::paste_insert() { QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline && sequence != nullptr) { + if (focused_panel == panel_timeline && Olive::ActiveSequence != nullptr) { panel_timeline->paste(true); } } diff --git a/mainwindow.h b/mainwindow.h index 50f4c2798..96c84b08c 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -11,36 +11,33 @@ class Timeline; class MainWindow : public QMainWindow { Q_OBJECT public: - explicit MainWindow(QWidget *parent, const QString& an); - void updateTitle(const QString &url); - ~MainWindow(); + explicit MainWindow(QWidget *parent); + virtual ~MainWindow() override; + + void updateTitle(); void launch_with_project(const QString& s); - void make_new_menu(QMenu* parent); - void make_inout_menu(QMenu* parent); - void load_shortcuts(const QString &fn, bool first = false); void save_shortcuts(const QString &fn); void load_css_from_file(const QString& fn); - void set_rendering_state(bool rendering); - public slots: void undo(); void redo(); void open_speed_dialog(); void cut(); void copy(); - void paste(); - void new_project(); - void autorecover_interval(); + void paste(); void nest(); void toggle_full_screen(); void toggle_bool_action(); +signals: + void finished_first_paint(); + protected: virtual void closeEvent(QCloseEvent *) override; virtual void paintEvent(QPaintEvent *event) override; @@ -60,10 +57,6 @@ private slots: void export_dialog(); void ripple_delete(); - void open_project(); - bool save_project_as(); - bool save_project(); - void go_to_in(); void go_to_out(); void go_to_start(); @@ -88,8 +81,7 @@ private slots: void full_screen_viewer(); - void fileMenu_About_To_Be_Shown(); - void fileMenu_About_To_Hide(); + void fileMenu_About_To_Be_Shown(); void editMenu_About_To_Be_Shown(); void windowMenu_About_To_Be_Shown(); void playbackMenu_About_To_Be_Shown(); @@ -100,9 +92,7 @@ private slots: void add_default_transition(); - void new_folder(); - - void load_recent_project(); + void new_folder(); void ripple_to_in_point(); void ripple_to_out_point(); @@ -132,16 +122,12 @@ private slots: void set_autoscroll(); void menu_click_button(); void toggle_panel_visibility(); - void set_timecode_view(); - void open_project_worker(const QString &fn, bool autorecovery); - - void load_with_launch(); + void set_timecode_view(); void show_action_search(); private: void setup_layout(bool reset); - bool can_close_project(); void setup_menus(); void set_bool_action_checked(QAction* a); @@ -202,14 +188,15 @@ private: QAction* undo_action; QAction* redo_action; - bool enable_launch_with_project; - - QString appName; - // used to store the panel state when one panel is maximized QByteArray temp_panel_state; + + // used in paintEvent() to determine the first paintEvent() performed + bool first_show; }; -extern MainWindow* mainWindow; +namespace Olive { + extern MainWindow* MainWindow; +} #endif // MAINWINDOW_H diff --git a/olive.pro b/olive.pro index 97df2a284..76763b4b9 100644 --- a/olive.pro +++ b/olive.pro @@ -1,320 +1,325 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-05-11T10:31:59 -# -#------------------------------------------------- - -QT += core gui multimedia opengl - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets - -mac { - TARGET = Olive -} -!mac { - TARGET = olive-editor -} -TEMPLATE = app - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -# Tries to get the current Git short hash -system("which git") { - GITHASHVAR = $$system(git --git-dir $$PWD/.git --work-tree $$PWD log -1 --format=%h) - DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" -} - -CONFIG += c++11 - -CONFIG(debug, debug|release) { - CONFIG += console -} - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - panels/project.cpp \ - panels/effectcontrols.cpp \ - panels/viewer.cpp \ - panels/timeline.cpp \ - ui/sourcetable.cpp \ - dialogs/aboutdialog.cpp \ - ui/timelinewidget.cpp \ - project/media.cpp \ - project/footage.cpp \ - project/sequence.cpp \ - project/clip.cpp \ - playback/playback.cpp \ - playback/audio.cpp \ - io/config.cpp \ - dialogs/newsequencedialog.cpp \ - ui/viewerwidget.cpp \ - ui/viewercontainer.cpp \ - dialogs/exportdialog.cpp \ - ui/collapsiblewidget.cpp \ - panels/panels.cpp \ - playback/cacher.cpp \ - io/exportthread.cpp \ - ui/timelineheader.cpp \ - io/previewgenerator.cpp \ - ui/labelslider.cpp \ - dialogs/preferencesdialog.cpp \ - ui/audiomonitor.cpp \ - project/undo.cpp \ - ui/scrollarea.cpp \ - ui/comboboxex.cpp \ - ui/colorbutton.cpp \ - dialogs/replaceclipmediadialog.cpp \ - ui/fontcombobox.cpp \ - ui/checkboxex.cpp \ - ui/keyframeview.cpp \ - ui/texteditex.cpp \ - dialogs/demonotice.cpp \ - project/marker.cpp \ - dialogs/speeddialog.cpp \ - dialogs/mediapropertiesdialog.cpp \ - io/crc32.cpp \ - project/projectmodel.cpp \ - io/loadthread.cpp \ - dialogs/loaddialog.cpp \ - debug.cpp \ - io/path.cpp \ - effects/internal/linearfadetransition.cpp \ - effects/internal/transformeffect.cpp \ - effects/internal/solideffect.cpp \ - effects/internal/texteffect.cpp \ - effects/internal/timecodeeffect.cpp \ - effects/internal/audionoiseeffect.cpp \ - effects/internal/paneffect.cpp \ - effects/internal/toneeffect.cpp \ - effects/internal/volumeeffect.cpp \ - effects/internal/crossdissolvetransition.cpp \ - effects/internal/shakeeffect.cpp \ - effects/internal/exponentialfadetransition.cpp \ - effects/internal/logarithmicfadetransition.cpp \ - effects/internal/cornerpineffect.cpp \ - io/math.cpp \ - io/qpainterwrapper.cpp \ - project/effect.cpp \ - project/transition.cpp \ - project/effectrow.cpp \ - project/effectfield.cpp \ - effects/internal/cubetransition.cpp \ - project/effectgizmo.cpp \ - io/clipboard.cpp \ - dialogs/stabilizerdialog.cpp \ - io/avtogl.cpp \ - ui/resizablescrollbar.cpp \ - ui/sourceiconview.cpp \ - project/sourcescommon.cpp \ - ui/keyframenavigator.cpp \ - panels/grapheditor.cpp \ - ui/graphview.cpp \ - ui/keyframedrawing.cpp \ - ui/clickablelabel.cpp \ - project/keyframe.cpp \ - ui/rectangleselect.cpp \ - dialogs/actionsearch.cpp \ - ui/embeddedfilechooser.cpp \ - effects/internal/fillleftrighteffect.cpp \ - effects/internal/voideffect.cpp \ - dialogs/texteditdialog.cpp \ - dialogs/debugdialog.cpp \ - ui/renderthread.cpp \ - ui/renderfunctions.cpp \ - ui/viewerwindow.cpp \ - project/projectfilter.cpp \ - effects/internal/frei0reffect.cpp \ - project/effectloaders.cpp \ - io/crossplatformlib.cpp \ - effects/internal/vsthost.cpp \ - ui/flowlayout.cpp \ - dialogs/proxydialog.cpp \ - io/proxygenerator.cpp \ - dialogs/advancedvideodialog.cpp \ - ui/cursors.cpp - -HEADERS += \ - mainwindow.h \ - panels/project.h \ - panels/effectcontrols.h \ - panels/viewer.h \ - panels/timeline.h \ - ui/sourcetable.h \ - dialogs/aboutdialog.h \ - ui/timelinewidget.h \ - project/media.h \ - project/footage.h \ - project/sequence.h \ - project/clip.h \ - playback/playback.h \ - playback/audio.h \ - io/config.h \ - dialogs/newsequencedialog.h \ - ui/viewerwidget.h \ - ui/viewercontainer.h \ - dialogs/exportdialog.h \ - ui/collapsiblewidget.h \ - panels/panels.h \ - playback/cacher.h \ - io/exportthread.h \ - ui/timelinetools.h \ - ui/timelineheader.h \ - io/previewgenerator.h \ - ui/labelslider.h \ - dialogs/preferencesdialog.h \ - ui/audiomonitor.h \ - project/undo.h \ - ui/scrollarea.h \ - ui/comboboxex.h \ - ui/colorbutton.h \ - dialogs/replaceclipmediadialog.h \ - ui/fontcombobox.h \ - ui/checkboxex.h \ - ui/keyframeview.h \ - ui/texteditex.h \ - dialogs/demonotice.h \ - project/marker.h \ - project/selection.h \ - dialogs/speeddialog.h \ - dialogs/mediapropertiesdialog.h \ - io/crc32.h \ - project/projectmodel.h \ - io/loadthread.h \ - dialogs/loaddialog.h \ - debug.h \ - io/path.h \ - effects/internal/transformeffect.h \ - effects/internal/solideffect.h \ - effects/internal/texteffect.h \ - effects/internal/timecodeeffect.h \ - effects/internal/audionoiseeffect.h \ - effects/internal/paneffect.h \ - effects/internal/toneeffect.h \ - effects/internal/volumeeffect.h \ - effects/internal/shakeeffect.h \ - effects/internal/linearfadetransition.h \ - effects/internal/crossdissolvetransition.h \ - effects/internal/exponentialfadetransition.h \ - effects/internal/logarithmicfadetransition.h \ - effects/internal/cornerpineffect.h \ - io/math.h \ - io/qpainterwrapper.h \ - project/effect.h \ - project/transition.h \ - project/effectrow.h \ - project/effectfield.h \ - effects/internal/cubetransition.h \ - project/effectgizmo.h \ - io/clipboard.h \ - dialogs/stabilizerdialog.h \ - io/avtogl.h \ - ui/resizablescrollbar.h \ - ui/sourceiconview.h \ - project/sourcescommon.h \ - ui/keyframenavigator.h \ - panels/grapheditor.h \ - ui/graphview.h \ - ui/keyframedrawing.h \ - ui/clickablelabel.h \ - project/keyframe.h \ - ui/rectangleselect.h \ - dialogs/actionsearch.h \ - ui/embeddedfilechooser.h \ - effects/internal/fillleftrighteffect.h \ - effects/internal/voideffect.h \ - dialogs/texteditdialog.h \ - dialogs/debugdialog.h \ - ui/renderthread.h \ - ui/renderfunctions.h \ - ui/viewerwindow.h \ - project/projectfilter.h \ - effects/internal/frei0reffect.h \ - project/effectloaders.h \ - io/crossplatformlib.h \ - effects/internal/vsthost.h \ - ui/flowlayout.h \ - dialogs/proxydialog.h \ - io/proxygenerator.h \ - dialogs/advancedvideodialog.h \ - ui/cursors.h - -FORMS += - -TRANSLATIONS += \ - ts/olive_de.ts \ - ts/olive_es.ts \ - ts/olive_fr.ts \ - ts/olive_it.ts \ - ts/olive_cs.ts \ - ts/olive_ar.ts \ - ts/olive_ru.ts \ - ts/olive_bs.ts \ - ts/olive_sr.ts - -win32 { - RC_FILE = packaging/windows/resources.rc - LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 -} - -mac { - LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -framework CoreFoundation - ICON = packaging/macos/olive.icns - INCLUDEPATH = /usr/local/include -} - -unix:!mac { - CONFIG += link_pkgconfig - PKGCONFIG += libavutil libavformat libavcodec libavfilter libswscale libswresample - LIBS += -ldl -} - -RESOURCES += \ - icons/icons.qrc \ - effects/internal/internalshaders.qrc \ - cursors/cursors.qrc - -unix:!mac:isEmpty(PREFIX) { - PREFIX = /usr/local -} - -unix:!mac:target.path = $$PREFIX/bin - -effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert -unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects - -translations.files = $$PWD/ts/*.qm -unix:!mac:translations.path = $$PREFIX/share/olive-editor/ts - -unix:!mac { - metainfo.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.appdata.xml - metainfo.path = $$PREFIX/share/metainfo - desktop.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.desktop - desktop.path = $$PREFIX/share/applications - mime.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.xml - mime.path = $$PREFIX/share/mime/packages - icon16.files = $$PWD/packaging/linux/icons/16x16/org.olivevideoeditor.Olive.png - icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps - icon32.files = $$PWD/packaging/linux/icons/32x32/org.olivevideoeditor.Olive.png - icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps - icon48.files = $$PWD/packaging/linux/icons/48x48/org.olivevideoeditor.Olive.png - icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps - icon64.files = $$PWD/packaging/linux/icons/64x64/org.olivevideoeditor.Olive.png - icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps - icon128.files = $$PWD/packaging/linux/icons/128x128/org.olivevideoeditor.Olive.png - icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps - icon256.files = $$PWD/packaging/linux/icons/256x256/org.olivevideoeditor.Olive.png - icon256.path = $$PREFIX/share/icons/hicolor/256x256/apps - icon512.files = $$PWD/packaging/linux/icons/512x512/org.olivevideoeditor.Olive.png - icon512.path = $$PREFIX/share/icons/hicolor/512x512/apps - INSTALLS += target effects translations metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 -} +#------------------------------------------------- +# +# Project created by QtCreator 2018-05-11T10:31:59 +# +#------------------------------------------------- + +QT += core gui multimedia opengl + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +mac { + TARGET = Olive +} +!mac { + TARGET = olive-editor +} +TEMPLATE = app + +# The following define makes your compiler emit warnings if you use +# any feature of Qt which has been marked as deprecated (the exact warnings +# depend on your compiler). Please consult the documentation of the +# deprecated API in order to know how to port your code away from it. +DEFINES += QT_DEPRECATED_WARNINGS + +# You can also make your code fail to compile if you use deprecated APIs. +# In order to do so, uncomment the following line. +# You can also select to disable deprecated APIs only up to a certain version of Qt. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +# Tries to get the current Git short hash +system("which git") { + GITHASHVAR = $$system(git --git-dir $$PWD/.git --work-tree $$PWD log -1 --format=%h) + DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" +} + +CONFIG += c++11 + +CONFIG(debug, debug|release) { + CONFIG += console +} + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + panels/project.cpp \ + panels/effectcontrols.cpp \ + panels/viewer.cpp \ + panels/timeline.cpp \ + ui/sourcetable.cpp \ + dialogs/aboutdialog.cpp \ + ui/timelinewidget.cpp \ + project/media.cpp \ + project/footage.cpp \ + project/sequence.cpp \ + project/clip.cpp \ + playback/playback.cpp \ + playback/audio.cpp \ + io/config.cpp \ + dialogs/newsequencedialog.cpp \ + ui/viewerwidget.cpp \ + ui/viewercontainer.cpp \ + dialogs/exportdialog.cpp \ + ui/collapsiblewidget.cpp \ + panels/panels.cpp \ + playback/cacher.cpp \ + io/exportthread.cpp \ + ui/timelineheader.cpp \ + io/previewgenerator.cpp \ + ui/labelslider.cpp \ + dialogs/preferencesdialog.cpp \ + ui/audiomonitor.cpp \ + project/undo.cpp \ + ui/scrollarea.cpp \ + ui/comboboxex.cpp \ + ui/colorbutton.cpp \ + dialogs/replaceclipmediadialog.cpp \ + ui/fontcombobox.cpp \ + ui/checkboxex.cpp \ + ui/keyframeview.cpp \ + ui/texteditex.cpp \ + dialogs/demonotice.cpp \ + project/marker.cpp \ + dialogs/speeddialog.cpp \ + dialogs/mediapropertiesdialog.cpp \ + io/crc32.cpp \ + project/projectmodel.cpp \ + io/loadthread.cpp \ + dialogs/loaddialog.cpp \ + debug.cpp \ + io/path.cpp \ + effects/internal/linearfadetransition.cpp \ + effects/internal/transformeffect.cpp \ + effects/internal/solideffect.cpp \ + effects/internal/texteffect.cpp \ + effects/internal/timecodeeffect.cpp \ + effects/internal/audionoiseeffect.cpp \ + effects/internal/paneffect.cpp \ + effects/internal/toneeffect.cpp \ + effects/internal/volumeeffect.cpp \ + effects/internal/crossdissolvetransition.cpp \ + effects/internal/shakeeffect.cpp \ + effects/internal/exponentialfadetransition.cpp \ + effects/internal/logarithmicfadetransition.cpp \ + effects/internal/cornerpineffect.cpp \ + io/math.cpp \ + io/qpainterwrapper.cpp \ + project/effect.cpp \ + project/transition.cpp \ + project/effectrow.cpp \ + project/effectfield.cpp \ + effects/internal/cubetransition.cpp \ + project/effectgizmo.cpp \ + io/clipboard.cpp \ + dialogs/stabilizerdialog.cpp \ + io/avtogl.cpp \ + ui/resizablescrollbar.cpp \ + ui/sourceiconview.cpp \ + project/sourcescommon.cpp \ + ui/keyframenavigator.cpp \ + panels/grapheditor.cpp \ + ui/graphview.cpp \ + ui/keyframedrawing.cpp \ + ui/clickablelabel.cpp \ + project/keyframe.cpp \ + ui/rectangleselect.cpp \ + dialogs/actionsearch.cpp \ + ui/embeddedfilechooser.cpp \ + effects/internal/fillleftrighteffect.cpp \ + effects/internal/voideffect.cpp \ + dialogs/texteditdialog.cpp \ + dialogs/debugdialog.cpp \ + ui/renderthread.cpp \ + ui/renderfunctions.cpp \ + ui/viewerwindow.cpp \ + project/projectfilter.cpp \ + effects/internal/frei0reffect.cpp \ + project/effectloaders.cpp \ + io/crossplatformlib.cpp \ + effects/internal/vsthost.cpp \ + ui/flowlayout.cpp \ + dialogs/proxydialog.cpp \ + io/proxygenerator.cpp \ + dialogs/advancedvideodialog.cpp \ + ui/cursors.cpp \ + ui/menuhelper.cpp \ + oliveglobal.cpp + +HEADERS += \ + mainwindow.h \ + panels/project.h \ + panels/effectcontrols.h \ + panels/viewer.h \ + panels/timeline.h \ + ui/sourcetable.h \ + dialogs/aboutdialog.h \ + ui/timelinewidget.h \ + project/media.h \ + project/footage.h \ + project/sequence.h \ + project/clip.h \ + playback/playback.h \ + playback/audio.h \ + io/config.h \ + dialogs/newsequencedialog.h \ + ui/viewerwidget.h \ + ui/viewercontainer.h \ + dialogs/exportdialog.h \ + ui/collapsiblewidget.h \ + panels/panels.h \ + playback/cacher.h \ + io/exportthread.h \ + ui/timelinetools.h \ + ui/timelineheader.h \ + io/previewgenerator.h \ + ui/labelslider.h \ + dialogs/preferencesdialog.h \ + ui/audiomonitor.h \ + project/undo.h \ + ui/scrollarea.h \ + ui/comboboxex.h \ + ui/colorbutton.h \ + dialogs/replaceclipmediadialog.h \ + ui/fontcombobox.h \ + ui/checkboxex.h \ + ui/keyframeview.h \ + ui/texteditex.h \ + dialogs/demonotice.h \ + project/marker.h \ + project/selection.h \ + dialogs/speeddialog.h \ + dialogs/mediapropertiesdialog.h \ + io/crc32.h \ + project/projectmodel.h \ + io/loadthread.h \ + dialogs/loaddialog.h \ + debug.h \ + io/path.h \ + effects/internal/transformeffect.h \ + effects/internal/solideffect.h \ + effects/internal/texteffect.h \ + effects/internal/timecodeeffect.h \ + effects/internal/audionoiseeffect.h \ + effects/internal/paneffect.h \ + effects/internal/toneeffect.h \ + effects/internal/volumeeffect.h \ + effects/internal/shakeeffect.h \ + effects/internal/linearfadetransition.h \ + effects/internal/crossdissolvetransition.h \ + effects/internal/exponentialfadetransition.h \ + effects/internal/logarithmicfadetransition.h \ + effects/internal/cornerpineffect.h \ + io/math.h \ + io/qpainterwrapper.h \ + project/effect.h \ + project/transition.h \ + project/effectrow.h \ + project/effectfield.h \ + effects/internal/cubetransition.h \ + project/effectgizmo.h \ + io/clipboard.h \ + dialogs/stabilizerdialog.h \ + io/avtogl.h \ + ui/resizablescrollbar.h \ + ui/sourceiconview.h \ + project/sourcescommon.h \ + ui/keyframenavigator.h \ + panels/grapheditor.h \ + ui/graphview.h \ + ui/keyframedrawing.h \ + ui/clickablelabel.h \ + project/keyframe.h \ + ui/rectangleselect.h \ + dialogs/actionsearch.h \ + ui/embeddedfilechooser.h \ + effects/internal/fillleftrighteffect.h \ + effects/internal/voideffect.h \ + dialogs/texteditdialog.h \ + dialogs/debugdialog.h \ + ui/renderthread.h \ + ui/renderfunctions.h \ + ui/viewerwindow.h \ + project/projectfilter.h \ + effects/internal/frei0reffect.h \ + project/effectloaders.h \ + io/crossplatformlib.h \ + effects/internal/vsthost.h \ + ui/flowlayout.h \ + dialogs/proxydialog.h \ + io/proxygenerator.h \ + dialogs/advancedvideodialog.h \ + ui/cursors.h \ + ui/menuhelper.h \ + oliveglobal.h \ + project/projectelements.h + +FORMS += + +TRANSLATIONS += \ + ts/olive_de.ts \ + ts/olive_es.ts \ + ts/olive_fr.ts \ + ts/olive_it.ts \ + ts/olive_cs.ts \ + ts/olive_ar.ts \ + ts/olive_ru.ts \ + ts/olive_bs.ts \ + ts/olive_sr.ts + +win32 { + RC_FILE = packaging/windows/resources.rc + LIBS += -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -lopengl32 -luser32 +} + +mac { + LIBS += -L/usr/local/lib -lavutil -lavformat -lavcodec -lavfilter -lswscale -lswresample -framework CoreFoundation + ICON = packaging/macos/olive.icns + INCLUDEPATH = /usr/local/include +} + +unix:!mac { + CONFIG += link_pkgconfig + PKGCONFIG += libavutil libavformat libavcodec libavfilter libswscale libswresample + LIBS += -ldl +} + +RESOURCES += \ + icons/icons.qrc \ + effects/internal/internalshaders.qrc \ + cursors/cursors.qrc + +unix:!mac:isEmpty(PREFIX) { + PREFIX = /usr/local +} + +unix:!mac:target.path = $$PREFIX/bin + +effects.files = $$PWD/effects/*.frag $$PWD/effects/*.xml $$PWD/effects/*.vert +unix:!mac:effects.path = $$PREFIX/share/olive-editor/effects + +translations.files = $$PWD/ts/*.qm +unix:!mac:translations.path = $$PREFIX/share/olive-editor/ts + +unix:!mac { + metainfo.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.appdata.xml + metainfo.path = $$PREFIX/share/metainfo + desktop.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.desktop + desktop.path = $$PREFIX/share/applications + mime.files = $$PWD/packaging/linux/org.olivevideoeditor.Olive.xml + mime.path = $$PREFIX/share/mime/packages + icon16.files = $$PWD/packaging/linux/icons/16x16/org.olivevideoeditor.Olive.png + icon16.path = $$PREFIX/share/icons/hicolor/16x16/apps + icon32.files = $$PWD/packaging/linux/icons/32x32/org.olivevideoeditor.Olive.png + icon32.path = $$PREFIX/share/icons/hicolor/32x32/apps + icon48.files = $$PWD/packaging/linux/icons/48x48/org.olivevideoeditor.Olive.png + icon48.path = $$PREFIX/share/icons/hicolor/48x48/apps + icon64.files = $$PWD/packaging/linux/icons/64x64/org.olivevideoeditor.Olive.png + icon64.path = $$PREFIX/share/icons/hicolor/64x64/apps + icon128.files = $$PWD/packaging/linux/icons/128x128/org.olivevideoeditor.Olive.png + icon128.path = $$PREFIX/share/icons/hicolor/128x128/apps + icon256.files = $$PWD/packaging/linux/icons/256x256/org.olivevideoeditor.Olive.png + icon256.path = $$PREFIX/share/icons/hicolor/256x256/apps + icon512.files = $$PWD/packaging/linux/icons/512x512/org.olivevideoeditor.Olive.png + icon512.path = $$PREFIX/share/icons/hicolor/512x512/apps + INSTALLS += target effects translations metainfo desktop mime icon16 icon32 icon48 icon64 icon128 icon256 icon512 +} diff --git a/oliveglobal.cpp b/oliveglobal.cpp new file mode 100644 index 000000000..da97a9e58 --- /dev/null +++ b/oliveglobal.cpp @@ -0,0 +1,192 @@ +#include "oliveglobal.h" + +#include "mainwindow.h" + +#include "panels/panels.h" + +#include "io/path.h" + +#include "playback/audio.h" + +#include "dialogs/demonotice.h" + +#include +#include +#include +#include + +QSharedPointer Olive::Global; +QString Olive::ActiveProjectFilename; +QString Olive::AppName; + +OliveGlobal::OliveGlobal() { + // sets current app name + QString version_id; +#ifdef GITHASH + version_id = QString(" | %1").arg(GITHASH); +#endif + Olive::AppName = QString("Olive (February 2019 | Alpha%1)").arg(version_id); + + // set the file filter used in all file dialogs pertaining to Olive project files. + project_file_filter = tr("Olive Project %1").arg("(*.ove)"); + + // set default value + enable_load_project_on_init = false; +} + +const QString &OliveGlobal::get_project_file_filter() { + return project_file_filter; +} + +void OliveGlobal::update_project_filename(const QString &s) { + // set filename to s + Olive::ActiveProjectFilename = s; + + // update main window title to reflect new project filename + Olive::MainWindow->updateTitle(); +} + +void OliveGlobal::check_for_autorecovery_file() { + QString data_dir = get_data_path(); + if (!data_dir.isEmpty()) { + // detect auto-recovery file + autorecovery_filename = data_dir + "/autorecovery.ove"; + if (QFile::exists(autorecovery_filename)) { + if (QMessageBox::question(nullptr, tr("Auto-recovery"), tr("Olive didn't close properly and an autorecovery file was detected. Would you like to open it?"), QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { + enable_load_project_on_init = false; + open_project_worker(autorecovery_filename, true); + } + } + autorecovery_timer.setInterval(60000); + QObject::connect(&autorecovery_timer, SIGNAL(timeout()), this, SLOT(save_autorecovery_file())); + autorecovery_timer.start(); + } +} + +void OliveGlobal::set_rendering_state(bool rendering) { + audio_rendering = rendering; + if (rendering) { + autorecovery_timer.stop(); + } else { + autorecovery_timer.start(); + } +} + +void OliveGlobal::load_project_on_launch(const QString& s) { + Olive::ActiveProjectFilename = s; + enable_load_project_on_init = true; +} + +void OliveGlobal::new_project() { + if (can_close_project()) { + // clear effects panel + panel_effect_controls->clear_effects(true); + + // clear project contents (footage, sequences, etc.) + panel_project->new_project(); + + // clear undo stack + undo_stack.clear(); + + // empty current project filename + update_project_filename(""); + + // full update of all panels + update_ui(false); + } +} + +void OliveGlobal::open_project() { + QString fn = QFileDialog::getOpenFileName(Olive::MainWindow, tr("Open Project..."), "", project_file_filter); + if (!fn.isEmpty() && can_close_project()) { + open_project_worker(fn, false); + } +} + +void OliveGlobal::open_recent() { + int index = static_cast(sender())->data().toInt(); + QString recent_url = recent_projects.at(index); + if (!QFile::exists(recent_url)) { + if (QMessageBox::question( + Olive::MainWindow, + tr("Missing recent project"), + tr("The project '%1' no longer exists. Would you like to remove it from the recent projects list?").arg(recent_url), + QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { + recent_projects.removeAt(index); + panel_project->save_recent_projects(); + } + } else if (Olive::Global.data()->can_close_project()) { + open_project_worker(recent_url, false); + } +} + +bool OliveGlobal::save_project_as() { + QString fn = QFileDialog::getSaveFileName(Olive::MainWindow, tr("Save Project As..."), "", project_file_filter); + if (!fn.isEmpty()) { + if (!fn.endsWith(".ove", Qt::CaseInsensitive)) { + fn += ".ove"; + } + update_project_filename(fn); + panel_project->save_project(false); + return true; + } + return false; +} + +bool OliveGlobal::save_project() { + if (Olive::ActiveProjectFilename.isEmpty()) { + return save_project_as(); + } else { + panel_project->save_project(false); + return true; + } +} + +bool OliveGlobal::can_close_project() { + if (Olive::MainWindow->isWindowModified()) { + QMessageBox* m = new QMessageBox( + QMessageBox::Question, + tr("Unsaved Project"), + tr("This project has changed since it was last saved. Would you like to save it before closing?"), + QMessageBox::Yes|QMessageBox::No|QMessageBox::Cancel, + Olive::MainWindow + ); + m->setWindowModality(Qt::WindowModal); + int r = m->exec(); + delete m; + if (r == QMessageBox::Yes) { + return save_project(); + } else if (r == QMessageBox::Cancel) { + return false; + } + } + return true; +} + +void OliveGlobal::finished_initialize() { + // if a project was set as a command line argument, we load it here + if (enable_load_project_on_init) { + open_project_worker(Olive::ActiveProjectFilename, false); + enable_load_project_on_init = false; + } else { + // if we are not loading a project on launch and are running a release build, open the demo notice dialog +#ifndef QT_DEBUG + DemoNotice* d = new DemoNotice(Olive::MainWindow); + connect(d, SIGNAL(finished(int)), d, SLOT(deleteLater())); + d->open(); +#endif + } +} + +void OliveGlobal::save_autorecovery_file() { + if (Olive::MainWindow->isWindowModified()) { + panel_project->save_project(true); + qInfo() << "Auto-recovery project saved"; + } +} + +void OliveGlobal::open_project_worker(const QString& fn, bool autorecovery) { + update_project_filename(fn); + panel_project->load_project(autorecovery); + undo_stack.clear(); +} diff --git a/oliveglobal.h b/oliveglobal.h new file mode 100644 index 000000000..c22431df9 --- /dev/null +++ b/oliveglobal.h @@ -0,0 +1,91 @@ +#ifndef OLIVEGLOBAL_H +#define OLIVEGLOBAL_H + +#include "project/undo.h" + +#include + +class OliveGlobal : public QObject { + Q_OBJECT +public: + OliveGlobal(); + + const QString& get_project_file_filter(); + + void update_project_filename(const QString& s); + + void check_for_autorecovery_file(); + + void set_rendering_state(bool rendering); + + void load_project_on_launch(const QString& s); + +public slots: + void new_project(); + void open_project(); + void open_recent(); + bool save_project_as(); + bool save_project(); + + bool can_close_project(); + + /** + * @brief Function called when Olive has finished starting up + * + * Sets up some last things for Olive that must be run after Olive has completed initialization. If a project was + * loaded as a command line argument, it's loaded here. + */ + void finished_initialize(); + + /** + * @brief Save an auto-recovery file of the current project. + * + * Call this function to save the current state of the project as an auto-recovery project. Called regularly by + * `autorecovery_timer`. + */ + void save_autorecovery_file(); + +private: + void open_project_worker(const QString& fn, bool autorecovery); + + /** + * @brief File filter used for any file dialogs relating to Olive project files. + */ + QString project_file_filter; + + /** + * @brief Regular interval to save an auto-recovery project. + */ + QTimer autorecovery_timer; + + /** + * @brief Internal variable set to **TRUE** by main() if a project file was set as an argument + */ + bool enable_load_project_on_init; + + +private slots: + +}; + +namespace Olive { + /** + * @brief Object resource for various global functions used throughout Olive + */ + extern QSharedPointer Global; + + /** + * @brief Currently active project filename + * + * Filename for the currently active project. Empty means the file has not + * been saved yet. + */ + extern QString ActiveProjectFilename; + + /** + * @brief Current application name + */ + extern QString AppName; +} + +#endif // OLIVEGLOBAL_H diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index fd9969241..0dec04212 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -80,7 +80,7 @@ void EffectControls::set_zoom(bool in) { void EffectControls::menu_select(QAction* q) { ComboAction* ca = new ComboAction(); for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); if ((c->track < 0) == (effect_menu_subtype == EFFECT_TYPE_VIDEO)) { const EffectMeta* meta = reinterpret_cast(q->data().value()); if (effect_menu_type == EFFECT_TYPE_TRANSITION) { @@ -120,7 +120,7 @@ void EffectControls::copy(bool del) { ComboAction* ca = new ComboAction(); EffectDeleteCommand* del_com = (del) ? new EffectDeleteCommand() : nullptr; for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); for (int j=0;jeffects.size();j++) { Effect* effect = c->effects.at(j); if (effect->container->selected) { @@ -262,7 +262,7 @@ void EffectControls::clear_effects(bool clear_cache) { void EffectControls::deselect_all_effects(QWidget* sender) { for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); for (int j=0;jeffects.size();j++) { if (c->effects.at(j)->container != sender) { c->effects.at(j)->container->header_click(false, false); @@ -485,7 +485,7 @@ void EffectControls::load_effects() { if (!multiple) { // load in new clips for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); QVBoxLayout* layout; if (c->track < 0) { vcontainer->setVisible(true); @@ -505,7 +505,7 @@ void EffectControls::load_effects() { } } if (selected_clips.size() > 0) { - setWindowTitle(panel_name + sequence->clips.at(selected_clips.at(0))->name); + setWindowTitle(panel_name + Olive::ActiveSequence->clips.at(selected_clips.at(0))->name); keyframeView->setEnabled(true); headers->setVisible(true); @@ -519,7 +519,7 @@ void EffectControls::delete_effects() { if (mode == TA_NO_TRANSITION) { EffectDeleteCommand* command = new EffectDeleteCommand(); for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); for (int j=0;jeffects.size();j++) { Effect* effect = c->effects.at(j); if (effect->container->selected) { @@ -575,7 +575,7 @@ void EffectControls::resizeEvent(QResizeEvent*) { bool EffectControls::is_focused() { if (this->hasFocus()) return true; for (int i=0;iclips.at(selected_clips.at(i)); + Clip* c = Olive::ActiveSequence->clips.at(selected_clips.at(i)); if (c != nullptr) { for (int j=0;jeffects.size();j++) { if (c->effects.at(j)->container->is_focused()) { diff --git a/panels/panels.cpp b/panels/panels.cpp index 195acee58..d06c5b0ad 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -1,26 +1,22 @@ #include "panels.h" -#include "timeline.h" -#include "effectcontrols.h" -#include "viewer.h" -#include "project.h" #include "project/sequence.h" #include "project/clip.h" #include "project/transition.h" #include "io/config.h" -#include "grapheditor.h" + #include "project/effectloaders.h" #include "debug.h" #include #include -Project* panel_project = 0; -EffectControls* panel_effect_controls = 0; -Viewer* panel_sequence_viewer = 0; -Viewer* panel_footage_viewer = 0; -Timeline* panel_timeline = 0; -GraphEditor* panel_graph_editor = 0; +Project* panel_project = nullptr; +EffectControls* panel_effect_controls = nullptr; +Viewer* panel_sequence_viewer = nullptr; +Viewer* panel_footage_viewer = nullptr; +Timeline* panel_timeline = nullptr; +GraphEditor* panel_graph_editor = nullptr; void update_effect_controls() { // SEND CLIPS TO EFFECT CONTROLS @@ -32,12 +28,12 @@ void update_effect_controls() { int aclip = -1; QVector selected_clips; int mode = TA_NO_TRANSITION; - if (sequence != nullptr) { - for (int i=0;iclips.size();i++) { - Clip* clip = sequence->clips.at(i); + if (Olive::ActiveSequence != nullptr) { + for (int i=0;iclips.size();i++) { + Clip* clip = Olive::ActiveSequence->clips.at(i); if (clip != nullptr) { - for (int j=0;jselections.size();j++) { - const Selection& s = sequence->selections.at(j); + for (int j=0;jselections.size();j++) { + const Selection& s = Olive::ActiveSequence->selections.at(j); bool add = true; if (clip->timeline_in >= s.in && clip->timeline_out <= s.out && clip->track == s.track) { mode = TA_NO_TRANSITION; @@ -72,7 +68,7 @@ void update_effect_controls() { if (aclip >= 0) selected_clips.append(aclip); if (vclip >= 0 && aclip >= 0) { bool found = false; - Clip* vclip_ref = sequence->clips.at(vclip); + Clip* vclip_ref = Olive::ActiveSequence->clips.at(vclip); for (int i=0;ilinked.size();i++) { if (vclip_ref->linked.at(i) == aclip) { found = true; diff --git a/panels/panels.h b/panels/panels.h index 0e934513e..4f90bd4d5 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -1,11 +1,11 @@ #ifndef PANELS_H #define PANELS_H -class Project; -class EffectControls; -class Viewer; -class Timeline; -class GraphEditor; +#include "timeline.h" +#include "effectcontrols.h" +#include "viewer.h" +#include "grapheditor.h" +#include "project.h" class QWidget; class QDockWidget; diff --git a/panels/project.cpp b/panels/project.cpp index c98e094d0..4126418f2 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -1,15 +1,12 @@ #include "project.h" -#include "project/footage.h" + +#include "oliveglobal.h" + +#include "project/projectelements.h" #include "panels/panels.h" -#include "panels/timeline.h" -#include "panels/viewer.h" + #include "playback/playback.h" -#include "project/effect.h" -#include "project/transition.h" -#include "panels/timeline.h" -#include "project/sequence.h" -#include "project/clip.h" #include "io/previewgenerator.h" #include "project/undo.h" #include "mainwindow.h" @@ -21,9 +18,9 @@ #include "dialogs/mediapropertiesdialog.h" #include "dialogs/loaddialog.h" #include "io/clipboard.h" -#include "project/media.h" #include "ui/sourcetable.h" #include "ui/sourceiconview.h" +#include "ui/menuhelper.h" #include "project/sourcescommon.h" #include "project/projectfilter.h" #include "debug.h" @@ -54,7 +51,6 @@ extern "C" { ProjectModel project_model; QString autorecovery_filename; -QString project_url = ""; QStringList recent_projects; QString recent_proj_file; @@ -100,7 +96,7 @@ Project::Project(QWidget *parent) : icon2.addFile(QStringLiteral(":/icons/open-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_open->setIcon(icon2); toolbar_open->setToolTip("Open Project"); - connect(toolbar_open, SIGNAL(clicked(bool)), mainWindow, SLOT(open_project())); + connect(toolbar_open, SIGNAL(clicked(bool)), Olive::Global.data(), SLOT(open_project())); toolbar->addWidget(toolbar_open); QPushButton* toolbar_save = new QPushButton(); @@ -109,7 +105,7 @@ Project::Project(QWidget *parent) : icon3.addFile(QStringLiteral(":/icons/save-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_save->setIcon(icon3); toolbar_save->setToolTip("Save Project"); - connect(toolbar_save, SIGNAL(clicked(bool)), mainWindow, SLOT(save_project())); + connect(toolbar_save, SIGNAL(clicked(bool)), Olive::Global.data(), SLOT(save_project())); toolbar->addWidget(toolbar_save); QPushButton* toolbar_undo = new QPushButton(); @@ -118,7 +114,7 @@ Project::Project(QWidget *parent) : icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_undo->setIcon(icon4); toolbar_undo->setToolTip("Undo"); - connect(toolbar_undo, SIGNAL(clicked(bool)), mainWindow, SLOT(undo())); + connect(toolbar_undo, SIGNAL(clicked(bool)), Olive::MainWindow, SLOT(undo())); toolbar->addWidget(toolbar_undo); QPushButton* toolbar_redo = new QPushButton(); @@ -127,7 +123,7 @@ Project::Project(QWidget *parent) : icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_redo->setIcon(icon5); toolbar_redo->setToolTip("Redo"); - connect(toolbar_redo, SIGNAL(clicked(bool)), mainWindow, SLOT(redo())); + connect(toolbar_redo, SIGNAL(clicked(bool)), Olive::MainWindow, SLOT(redo())); toolbar->addWidget(toolbar_redo); QLineEdit* toolbar_search = new QLineEdit(); @@ -349,7 +345,7 @@ void Project::replace_media(Media* item, QString filename) { } void Project::replace_clip_media() { - if (sequence == nullptr) { + if (Olive::ActiveSequence == nullptr) { QMessageBox::critical(this, tr("No active sequence"), tr("No sequence is active, please open the sequence you want to replace clips from."), @@ -358,7 +354,7 @@ void Project::replace_clip_media() { QModelIndexList selected_items = get_current_selected(); if (selected_items.size() == 1) { Media* item = item_to_media(selected_items.at(0)); - if (item->get_type() == MEDIA_TYPE_SEQUENCE && sequence == item->to_sequence()) { + if (item->get_type() == MEDIA_TYPE_SEQUENCE && Olive::ActiveSequence == item->to_sequence()) { QMessageBox::critical(this, tr("Active sequence selected"), tr("You cannot insert a sequence into itself, so no clips of this media would be in this sequence."), @@ -573,7 +569,7 @@ void Project::delete_selected_media() { // remove if (remove) { panel_effect_controls->clear_effects(true); - if (sequence != nullptr) sequence->selections.clear(); + if (Olive::ActiveSequence != nullptr) Olive::ActiveSequence->selections.clear(); // remove media and parents for (int m=0;mto_sequence(); - if (s == sequence) { + if (s == Olive::ActiveSequence) { ca->append(new ChangeSequenceAction(nullptr)); } @@ -876,7 +872,7 @@ void Project::import_dialog() { } void Project::delete_clips_using_selected_media() { - if (sequence == nullptr) { + if (Olive::ActiveSequence == nullptr) { QMessageBox::critical(this, tr("No active sequence"), tr("No sequence is active, please open the sequence you want to delete clips from."), @@ -885,13 +881,13 @@ void Project::delete_clips_using_selected_media() { ComboAction* ca = new ComboAction(); bool deleted = false; QModelIndexList items = get_current_selected(); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { for (int j=0;jmedia == m) { - ca->append(new DeleteClipAction(sequence, i)); + ca->append(new DeleteClipAction(Olive::ActiveSequence, i)); deleted = true; } } @@ -923,6 +919,9 @@ void Project::clear() { // delete everything else project_model.clear(); + + // update tree view (sometimes this doesn't seem to update reliably) + panel_project->tree_view->update(); } void Project::new_project() { @@ -930,7 +929,7 @@ void Project::new_project() { set_sequence(nullptr); panel_footage_viewer->set_media(nullptr); clear(); - mainWindow->setWindowModified(false); + Olive::MainWindow->setWindowModified(false); } void Project::load_project(bool autorecovery) { @@ -1035,7 +1034,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, stream.writeAttribute("framerate", QString::number(s->frame_rate, 'f', 10)); stream.writeAttribute("afreq", QString::number(s->audio_frequency)); stream.writeAttribute("alayout", QString::number(s->audio_layout)); - if (s == sequence) { + if (s == Olive::ActiveSequence) { stream.writeAttribute("open", "1"); } stream.writeAttribute("workarea", QString::number(s->using_workarea)); @@ -1135,7 +1134,7 @@ void Project::save_project(bool autorecovery) { media_id = 1; sequence_id = 1; - QFile file(autorecovery ? autorecovery_filename : project_url); + QFile file(autorecovery ? autorecovery_filename : Olive::ActiveProjectFilename); if (!file.open(QIODevice::WriteOnly/* | QIODevice::Text*/)) { qCritical() << "Could not open file"; return; @@ -1149,8 +1148,8 @@ void Project::save_project(bool autorecovery) { stream.writeTextElement("version", QString::number(SAVE_VERSION)); - stream.writeTextElement("url", project_url); - proj_dir = QFileInfo(project_url).absoluteDir(); + stream.writeTextElement("url", Olive::ActiveProjectFilename); + proj_dir = QFileInfo(Olive::ActiveProjectFilename).absoluteDir(); save_folder(stream, MEDIA_TYPE_FOLDER, true); @@ -1175,8 +1174,8 @@ void Project::save_project(bool autorecovery) { file.close(); if (!autorecovery) { - add_recent_project(project_url); - mainWindow->setWindowModified(false); + add_recent_project(Olive::ActiveProjectFilename); + Olive::MainWindow->setWindowModified(false); } } @@ -1241,7 +1240,7 @@ void Project::go_up_dir() { void Project::make_new_menu() { QMenu new_menu(this); - mainWindow->make_new_menu(&new_menu); + Olive::MenuHelper.make_new_menu(&new_menu); new_menu.exec(QCursor::pos()); } diff --git a/panels/project.h b/panels/project.h index 4f2c37aef..23a95d611 100644 --- a/panels/project.h +++ b/panels/project.h @@ -7,6 +7,7 @@ #include #include "project/projectmodel.h" +#include "project/projectfilter.h" struct Footage; struct Sequence; @@ -28,7 +29,6 @@ class SourcesCommon; #define LOAD_TYPE_URL 70 extern QString autorecovery_filename; -extern QString project_url; extern QStringList recent_projects; extern QString recent_proj_file; diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 192cc5717..0e1e773f4 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1,22 +1,16 @@ #include "timeline.h" +#include "oliveglobal.h" + #include "panels/panels.h" -#include "panels/project.h" -#include "panels/effectcontrols.h" +#include "project/projectelements.h" + #include "ui/timelinewidget.h" -#include "project/sequence.h" -#include "project/clip.h" #include "ui/viewerwidget.h" #include "playback/audio.h" -#include "panels/viewer.h" #include "playback/cacher.h" #include "playback/playback.h" -#include "project/undo.h" -#include "project/media.h" #include "io/config.h" -#include "project/effect.h" -#include "project/transition.h" -#include "project/footage.h" #include "io/clipboard.h" #include "ui/timelineheader.h" #include "ui/resizablescrollbar.h" @@ -104,14 +98,14 @@ Timeline::Timeline(QWidget *parent) : Timeline::~Timeline() {} void Timeline::previous_cut() { - if (sequence->playhead > 0) { + if (Olive::ActiveSequence->playhead > 0) { long p_cut = 0; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { - if (c->timeline_out > p_cut && c->timeline_out < sequence->playhead) { + if (c->timeline_out > p_cut && c->timeline_out < Olive::ActiveSequence->playhead) { p_cut = c->timeline_out; - } else if (c->timeline_in > p_cut && c->timeline_in < sequence->playhead) { + } else if (c->timeline_in > p_cut && c->timeline_in < Olive::ActiveSequence->playhead) { p_cut = c->timeline_in; } } @@ -123,13 +117,13 @@ void Timeline::previous_cut() { void Timeline::next_cut() { bool seek_enabled = false; long n_cut = LONG_MAX; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { - if (c->timeline_in < n_cut && c->timeline_in > sequence->playhead) { + if (c->timeline_in < n_cut && c->timeline_in > Olive::ActiveSequence->playhead) { n_cut = c->timeline_in; seek_enabled = true; - } else if (c->timeline_out < n_cut && c->timeline_out > sequence->playhead) { + } else if (c->timeline_out < n_cut && c->timeline_out > Olive::ActiveSequence->playhead) { n_cut = c->timeline_out; seek_enabled = true; } @@ -143,11 +137,11 @@ void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const Q } void Timeline::toggle_show_all() { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { showing_all = !showing_all; if (showing_all) { old_zoom = zoom; - set_zoom_value(double(timeline_area->width() - 200) / double(sequence->getEndFrame())); + set_zoom_value(double(timeline_area->width() - 200) / double(Olive::ActiveSequence->getEndFrame())); } else { set_zoom_value(old_zoom); } @@ -347,8 +341,8 @@ void Timeline::add_transition() { ComboAction* ca = new ComboAction(); bool adding = false; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { int transition_to_add = (c->track < 0) ? TRANSITION_INTERNAL_CROSSDISSOLVE : TRANSITION_INTERNAL_LINEARFADE; if (c->get_opening_transition() == nullptr) { @@ -384,7 +378,7 @@ int Timeline::calculate_track_height(int track, int value) { } void Timeline::update_sequence() { - bool null_sequence = (sequence == nullptr); + bool null_sequence = (Olive::ActiveSequence == nullptr); for (int i=0;isetEnabled(!null_sequence); @@ -400,7 +394,7 @@ void Timeline::update_sequence() { if (null_sequence) { setWindowTitle(title + tr("")); } else { - setWindowTitle(title + sequence->name); + setWindowTitle(title + Olive::ActiveSequence->name); update_ui(false); } } @@ -410,27 +404,27 @@ int Timeline::get_snap_range() { } bool Timeline::focused() { - return (sequence != nullptr && (headers->hasFocus() || video_area->hasFocus() || audio_area->hasFocus())); + return (Olive::ActiveSequence != nullptr && (headers->hasFocus() || video_area->hasFocus() || audio_area->hasFocus())); } void Timeline::repaint_timeline() { if (!block_repaints) { bool draw = true; - if (sequence != nullptr + if (Olive::ActiveSequence != nullptr && !horizontalScrollBar->isSliderDown() && !horizontalScrollBar->is_resizing() && panel_sequence_viewer->playing && !zoom_just_changed) { // auto scroll if (config.autoscroll == AUTOSCROLL_PAGE_SCROLL) { - int playhead_x = panel_timeline->getTimelineScreenPointFromFrame(sequence->playhead); + int playhead_x = panel_timeline->getTimelineScreenPointFromFrame(Olive::ActiveSequence->playhead); if (playhead_x < 0 || playhead_x > (editAreas->width() - videoScrollbar->width())) { - horizontalScrollBar->setValue(getScreenPointFromFrame(zoom, sequence->playhead)); + horizontalScrollBar->setValue(getScreenPointFromFrame(zoom, Olive::ActiveSequence->playhead)); draw = false; } } else if (config.autoscroll == AUTOSCROLL_SMOOTH_SCROLL) { - if (center_scroll_to_playhead(horizontalScrollBar, zoom, sequence->playhead)) { + if (center_scroll_to_playhead(horizontalScrollBar, zoom, Olive::ActiveSequence->playhead)) { draw = false; } } @@ -443,7 +437,7 @@ void Timeline::repaint_timeline() { video_area->update(); audio_area->update(); - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { set_sb_max(); } } @@ -451,16 +445,16 @@ void Timeline::repaint_timeline() { } void Timeline::select_all() { - if (sequence != nullptr) { - sequence->selections.clear(); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + if (Olive::ActiveSequence != nullptr) { + Olive::ActiveSequence->selections.clear(); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { Selection s; s.in = c->timeline_in; s.out = c->timeline_out; s.track = c->track; - sequence->selections.append(s); + Olive::ActiveSequence->selections.append(s); } } repaint_timeline(); @@ -472,17 +466,17 @@ void Timeline::scroll_to_frame(long frame) { } void Timeline::select_from_playhead() { - sequence->selections.clear(); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + Olive::ActiveSequence->selections.clear(); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr - && c->timeline_in <= sequence->playhead - && c->timeline_out > sequence->playhead) { + && c->timeline_in <= Olive::ActiveSequence->playhead + && c->timeline_out > Olive::ActiveSequence->playhead) { Selection s; s.in = c->timeline_in; s.out = c->timeline_out; s.track = c->track; - sequence->selections.append(s); + Olive::ActiveSequence->selections.append(s); } } } @@ -493,8 +487,8 @@ bool Timeline::can_ripple_empty_space(long frame, int track) { rc_ripple_min = 0; rc_ripple_max = LONG_MAX; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { if (c->timeline_in > frame || c->timeline_out > frame) { at_end_of_sequence = false; @@ -530,7 +524,7 @@ void Timeline::ripple_delete_empty_space() { void Timeline::resizeEvent(QResizeEvent *) { // adjust maximum scrollbar - if (sequence != nullptr) set_sb_max(); + if (Olive::ActiveSequence != nullptr) set_sb_max(); // resize tool button widget to its contents @@ -560,21 +554,21 @@ void Timeline::resizeEvent(QResizeEvent *) { } void Timeline::delete_in_out(bool ripple) { - if (sequence != nullptr && sequence->using_workarea) { + if (Olive::ActiveSequence != nullptr && Olive::ActiveSequence->using_workarea) { QVector areas; int video_tracks = 0, audio_tracks = 0; - sequence->getTrackLimits(&video_tracks, &audio_tracks); + Olive::ActiveSequence->getTrackLimits(&video_tracks, &audio_tracks); for (int i=video_tracks;i<=audio_tracks;i++) { Selection s; - s.in = sequence->workarea_in; - s.out = sequence->workarea_out; + s.in = Olive::ActiveSequence->workarea_in; + s.out = Olive::ActiveSequence->workarea_out; s.track = i; areas.append(s); } ComboAction* ca = new ComboAction(); delete_areas_and_relink(ca, areas, true); - if (ripple) ripple_clips(ca, sequence, sequence->workarea_in, sequence->workarea_in - sequence->workarea_out); - ca->append(new SetTimelineInOutCommand(sequence, false, 0, 0)); + if (ripple) ripple_clips(ca, Olive::ActiveSequence, Olive::ActiveSequence->workarea_in, Olive::ActiveSequence->workarea_in - Olive::ActiveSequence->workarea_out); + ca->append(new SetTimelineInOutCommand(Olive::ActiveSequence, false, 0, 0)); undo_stack.push(ca); update_ui(true); } @@ -603,8 +597,8 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele ripple_point++; bool can_ripple = true; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && c->timeline_in < ripple_point && c->timeline_out > ripple_point) { // conflict detected, but this clip may be getting deleted so let's check bool deleted = false; @@ -618,8 +612,8 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } } if (!deleted) { - for (int j=0;jclips.size();j++) { - Clip* cc = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* cc = Olive::ActiveSequence->clips.at(j); if (cc != nullptr && cc->track == c->track && cc->timeline_in > c->timeline_out @@ -632,7 +626,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } if (can_ripple) { - ripple_clips(ca, sequence, ripple_point, -ripple_length); + ripple_clips(ca, Olive::ActiveSequence, ripple_point, -ripple_length); panel_sequence_viewer->seek(ripple_point-1); } } @@ -652,7 +646,7 @@ void Timeline::set_zoom_value(double v) { // TODO find a way to gradually move towards target_scroll instead of just centering it? if (!horizontalScrollBar->is_resizing()) - center_scroll_to_playhead(horizontalScrollBar, zoom, sequence->playhead); + center_scroll_to_playhead(horizontalScrollBar, zoom, Olive::ActiveSequence->playhead); } void Timeline::set_zoom(bool in) { @@ -668,9 +662,9 @@ void Timeline::decheck_tool_buttons(QObject* sender) { QVector Timeline::get_tracks_of_linked_clips(int i) { QVector tracks; - Clip* clip = sequence->clips.at(i); + Clip* clip = Olive::ActiveSequence->clips.at(i); for (int j=0;jlinked.size();j++) { - tracks.append(sequence->clips.at(clip->linked.at(j))->track); + tracks.append(Olive::ActiveSequence->clips.at(clip->linked.at(j))->track); } return tracks; } @@ -703,7 +697,7 @@ Clip* Timeline::split_clip(ComboAction* ca, bool transitions, int p, long frame) } Clip* Timeline::split_clip(ComboAction* ca, bool transitions, int p, long frame, long post_in) { - Clip* pre = sequence->clips.at(p); + Clip* pre = Olive::ActiveSequence->clips.at(p); if (pre != nullptr && pre->timeline_in < frame && pre->timeline_out > frame) { // guard against attempts to split at in/out points bool splitting_closing_dual_transition = false; @@ -713,7 +707,7 @@ Clip* Timeline::split_clip(ComboAction* ca, bool transitions, int p, long frame, splitting_closing_dual_transition = true; } - Clip* post = pre->copy(sequence, transitions && !splitting_closing_dual_transition); + Clip* post = pre->copy(Olive::ActiveSequence, transitions && !splitting_closing_dual_transition); long new_clip_length = frame - pre->timeline_in; @@ -778,7 +772,7 @@ bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool split_cache.append(clip); - Clip* c = sequence->clips.at(clip); + Clip* c = Olive::ActiveSequence->clips.at(clip); if (c != nullptr) { QVector pre_clips; QVector post_clips; @@ -799,7 +793,7 @@ bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool for (int i=0;ilinked.size();i++) { int l = c->linked.at(i); if (!has_clip_been_split(l)) { - Clip* link = sequence->clips.at(l); + Clip* link = Olive::ActiveSequence->clips.at(l); if ((original_clip_is_selected && is_clip_selected(link, true)) || !original_clip_is_selected) { split_cache.append(l); Clip* s = split_clip(ca, true, l, frame); @@ -813,7 +807,7 @@ bool Timeline::split_clip_and_relink(ComboAction *ca, int clip, long frame, bool relink_clips_using_ids(pre_clips, post_clips); } - ca->append(new AddClipCommand(sequence, post_clips)); + ca->append(new AddClipCommand(Olive::ActiveSequence, post_clips)); return true; } } @@ -873,8 +867,8 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area for (int i=0;iclips.size();j++) { - Clip* c = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* c = Olive::ActiveSequence->clips.at(j); if (c != nullptr && c->track == s.track && !c->undeletable) { if (selection_contains_transition(s, c, TA_OPENING_TRANSITION)) { // delete opening transition @@ -884,7 +878,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area ca->append(new DeleteTransitionCommand(c->sequence, c->closing_transition)); } else if (c->timeline_in >= s.in && c->timeline_out <= s.out) { // clips falls entirely within deletion area - ca->append(new DeleteClipAction(sequence, j)); + ca->append(new DeleteClipAction(Olive::ActiveSequence, j)); } else if (c->timeline_in < s.in && c->timeline_out > s.out) { // middle of clip is within deletion area @@ -930,7 +924,7 @@ void Timeline::delete_areas_and_relink(ComboAction* ca, QVector& area } relink_clips_using_ids(pre_clips, post_clips); - ca->append(new AddClipCommand(sequence, post_clips)); + ca->append(new AddClipCommand(Olive::ActiveSequence, post_clips)); } void Timeline::copy(bool del) { @@ -939,11 +933,11 @@ void Timeline::copy(bool del) { long min_in = 0; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { - for (int j=0;jselections.size();j++) { - const Selection& s = sequence->selections.at(j); + for (int j=0;jselections.size();j++) { + const Selection& s = Olive::ActiveSequence->selections.at(j); if (s.track == c->track && !((c->timeline_in <= s.in && c->timeline_out <= s.in) || (c->timeline_in >= s.out && c->timeline_out >= s.out))) { if (!cleared) { clear_clipboard(); @@ -987,7 +981,7 @@ void Timeline::copy(bool del) { } if (del && copied) { - delete_selection(sequence->selections, false); + delete_selection(Olive::ActiveSequence->selections, false); } } @@ -995,7 +989,7 @@ void Timeline::relink_clips_using_ids(QVector& old_clips, QVector& n // relink pasted clips for (int i=0;iclips.at(old_clips.at(i)); + Clip* oc = Olive::ActiveSequence->clips.at(old_clips.at(i)); for (int j=0;jlinked.size();j++) { for (int k=0;klinked.at(j) == old_clips.at(k)) { @@ -1022,15 +1016,15 @@ void Timeline::paste(bool insert) { Clip* c = static_cast(clipboard.at(i)); // create copy of clip and offset by playhead - Clip* cc = c->copy(sequence); + Clip* cc = c->copy(Olive::ActiveSequence); // convert frame rates - cc->timeline_in = refactor_frame_number(cc->timeline_in, c->cached_fr, sequence->frame_rate); - cc->timeline_out = refactor_frame_number(cc->timeline_out, c->cached_fr, sequence->frame_rate); - cc->clip_in = refactor_frame_number(cc->clip_in, c->cached_fr, sequence->frame_rate); + cc->timeline_in = refactor_frame_number(cc->timeline_in, c->cached_fr, Olive::ActiveSequence->frame_rate); + cc->timeline_out = refactor_frame_number(cc->timeline_out, c->cached_fr, Olive::ActiveSequence->frame_rate); + cc->clip_in = refactor_frame_number(cc->clip_in, c->cached_fr, Olive::ActiveSequence->frame_rate); - cc->timeline_in += sequence->playhead; - cc->timeline_out += sequence->playhead; + cc->timeline_in += Olive::ActiveSequence->playhead; + cc->timeline_out += Olive::ActiveSequence->playhead; cc->track = c->track; paste_start = qMin(paste_start, cc->timeline_in); @@ -1048,8 +1042,8 @@ void Timeline::paste(bool insert) { } if (insert) { split_cache.clear(); - split_all_clips_at_point(ca, sequence->playhead); - ripple_clips(ca, sequence, paste_start, paste_end - paste_start); + split_all_clips_at_point(ca, Olive::ActiveSequence->playhead); + ripple_clips(ca, Olive::ActiveSequence, paste_start, paste_end - paste_start); } else { delete_areas_and_relink(ca, delete_areas, false); } @@ -1069,7 +1063,7 @@ void Timeline::paste(bool insert) { } } - ca->append(new AddClipCommand(sequence, pasted_clips)); + ca->append(new AddClipCommand(Olive::ActiveSequence, pasted_clips)); undo_stack.push(ca); @@ -1086,8 +1080,8 @@ void Timeline::paste(bool insert) { bool skip = false; bool ask_conflict = true; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { for (int j=0;j(clipboard.at(j)); @@ -1156,8 +1150,8 @@ void Timeline::paste(bool insert) { } void Timeline::ripple_to_in_point(bool in, bool ripple) { - if (sequence != nullptr) { - if (sequence->clips.size() > 0) { + if (Olive::ActiveSequence != nullptr) { + if (Olive::ActiveSequence->clips.size() > 0) { // get track count int track_min = INT_MAX; int track_max = INT_MIN; @@ -1169,25 +1163,25 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { long prev_cut = 0; // find closest in point to playhead - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { track_min = qMin(track_min, c->track); track_max = qMax(track_max, c->track); sequence_end = qMax(c->timeline_out, sequence_end); - if (c->timeline_in == sequence->playhead) + if (c->timeline_in == Olive::ActiveSequence->playhead) playhead_falls_on_in = true; - if (c->timeline_out == sequence->playhead) + if (c->timeline_out == Olive::ActiveSequence->playhead) playhead_falls_on_out = true; - if (c->timeline_in > sequence->playhead) + if (c->timeline_in > Olive::ActiveSequence->playhead) next_cut = qMin(c->timeline_in, next_cut); - if (c->timeline_out > sequence->playhead) + if (c->timeline_out > Olive::ActiveSequence->playhead) next_cut = qMin(c->timeline_out, next_cut); - if (c->timeline_in < sequence->playhead) + if (c->timeline_in < Olive::ActiveSequence->playhead) prev_cut = qMax(c->timeline_in, prev_cut); - if (c->timeline_out < sequence->playhead) + if (c->timeline_out < Olive::ActiveSequence->playhead) prev_cut = qMax(c->timeline_out, prev_cut); } } @@ -1197,13 +1191,13 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { QVector areas; ComboAction* ca = new ComboAction(); bool push_undo = true; - long seek = sequence->playhead; + long seek = Olive::ActiveSequence->playhead; - if ((in && (playhead_falls_on_out || (playhead_falls_on_in && sequence->playhead == 0))) - || (!in && (playhead_falls_on_in || (playhead_falls_on_out && sequence->playhead == sequence_end)))) { // one frame mode + if ((in && (playhead_falls_on_out || (playhead_falls_on_in && Olive::ActiveSequence->playhead == 0))) + || (!in && (playhead_falls_on_in || (playhead_falls_on_out && Olive::ActiveSequence->playhead == sequence_end)))) { // one frame mode if (ripple) { // set up deletion areas based on track count - long in_point = sequence->playhead; + long in_point = Olive::ActiveSequence->playhead; if (!in) { in_point--; seek--; @@ -1221,7 +1215,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // trim and move clips around the in point delete_areas_and_relink(ca, areas, true); - if (ripple) ripple_clips(ca, sequence, in_point, -1); + if (ripple) ripple_clips(ca, Olive::ActiveSequence, in_point, -1); } else { push_undo = false; } @@ -1232,8 +1226,8 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // set up deletion areas based on track count Selection s; if (in) seek = prev_cut; - s.in = in ? prev_cut : sequence->playhead; - s.out = in ? sequence->playhead : next_cut; + s.in = in ? prev_cut : Olive::ActiveSequence->playhead; + s.out = in ? Olive::ActiveSequence->playhead : next_cut; if (s.in == s.out) { push_undo = false; @@ -1245,7 +1239,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { // trim and move clips around the in point delete_areas_and_relink(ca, areas, true); - if (ripple) ripple_clips(ca, sequence, s.in, s.in - s.out); + if (ripple) ripple_clips(ca, Olive::ActiveSequence, s.in, s.in - s.out); } } @@ -1254,7 +1248,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { update_ui(true); - if (seek != sequence->playhead && ripple) panel_sequence_viewer->seek(seek); + if (seek != Olive::ActiveSequence->playhead && ripple) panel_sequence_viewer->seek(seek); } else { delete ca; } @@ -1273,11 +1267,11 @@ bool Timeline::split_selection(ComboAction* ca) { QVector secondary_post_splits; // find clips within selection and split - for (int j=0;jclips.size();j++) { - Clip* clip = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* clip = Olive::ActiveSequence->clips.at(j); if (clip != nullptr) { - for (int i=0;iselections.size();i++) { - const Selection& s = sequence->selections.at(i); + for (int i=0;iselections.size();i++) { + const Selection& s = Olive::ActiveSequence->selections.at(i); if (s.track == clip->track) { Clip* post_b = split_clip(ca, true, j, s.out); Clip* post_a = split_clip(ca, post_b == nullptr, j, s.in); @@ -1300,8 +1294,8 @@ bool Timeline::split_selection(ComboAction* ca) { relink_clips_using_ids(pre_splits, post_splits); relink_clips_using_ids(pre_splits, secondary_post_splits); - ca->append(new AddClipCommand(sequence, post_splits)); - ca->append(new AddClipCommand(sequence, secondary_post_splits)); + ca->append(new AddClipCommand(Olive::ActiveSequence, post_splits)); + ca->append(new AddClipCommand(Olive::ActiveSequence, secondary_post_splits)); return true; } @@ -1310,8 +1304,8 @@ bool Timeline::split_selection(ComboAction* ca) { bool Timeline::split_all_clips_at_point(ComboAction* ca, long point) { bool split = false; - for (int j=0;jclips.size();j++) { - Clip* c = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* c = Olive::ActiveSequence->clips.at(j); if (c != nullptr) { // always relinks if (split_clip_and_relink(ca, j, point, true)) { @@ -1327,14 +1321,14 @@ void Timeline::split_at_playhead() { bool split_selected = false; split_cache.clear(); - if (sequence->selections.size() > 0) { + if (Olive::ActiveSequence->selections.size() > 0) { // see if whole clips are selected QVector pre_clips; QVector post_clips; - for (int j=0;jclips.size();j++) { - Clip* clip = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* clip = Olive::ActiveSequence->clips.at(j); if (clip != nullptr && is_clip_selected(clip, true)) { - Clip* s = split_clip(ca, true, j, sequence->playhead); + Clip* s = split_clip(ca, true, j, Olive::ActiveSequence->playhead); if (s != nullptr) { pre_clips.append(j); post_clips.append(s); @@ -1346,7 +1340,7 @@ void Timeline::split_at_playhead() { if (split_selected) { // relink clips if we split relink_clips_using_ids(pre_clips, post_clips); - ca->append(new AddClipCommand(sequence, post_clips)); + ca->append(new AddClipCommand(Olive::ActiveSequence, post_clips)); } else { // split a selection if not split_selected = split_selection(ca); @@ -1355,7 +1349,7 @@ void Timeline::split_at_playhead() { // if nothing was selected or no selections fell within playhead, simply split at playhead if (!split_selected) { - split_selected = split_all_clips_at_point(ca, sequence->playhead); + split_selected = split_all_clips_at_point(ca, Olive::ActiveSequence->playhead); } if (split_selected) { @@ -1367,13 +1361,13 @@ void Timeline::split_at_playhead() { } void Timeline::deselect_area(long in, long out, int track) { - int len = sequence->selections.size(); + int len = Olive::ActiveSequence->selections.size(); for (int i=0;iselections[i]; + Selection& s = Olive::ActiveSequence->selections[i]; if (s.track == track) { if (s.in >= in && s.out <= out) { // whole selection is in deselect area - sequence->selections.removeAt(i); + Olive::ActiveSequence->selections.removeAt(i); i--; len--; } else if (s.in < in && s.out > out) { @@ -1382,7 +1376,7 @@ void Timeline::deselect_area(long in, long out, int track) { new_sel.in = out; new_sel.out = s.out; new_sel.track = s.track; - sequence->selections.append(new_sel); + Olive::ActiveSequence->selections.append(new_sel); s.out = in; } else if (s.in < in && s.out > in) { @@ -1412,25 +1406,25 @@ bool Timeline::snap_to_timeline(long* l, bool use_playhead, bool use_markers, bo if (snapping) { if (use_playhead && !panel_sequence_viewer->playing) { // snap to playhead - if (snap_to_point(sequence->playhead, l)) return true; + if (snap_to_point(Olive::ActiveSequence->playhead, l)) return true; } // snap to marker if (use_markers) { - for (int i=0;imarkers.size();i++) { - if (snap_to_point(sequence->markers.at(i).frame, l)) return true; + for (int i=0;imarkers.size();i++) { + if (snap_to_point(Olive::ActiveSequence->markers.at(i).frame, l)) return true; } } // snap to in/out - if (use_workarea && sequence->using_workarea) { - if (snap_to_point(sequence->workarea_in, l)) return true; - if (snap_to_point(sequence->workarea_out, l)) return true; + if (use_workarea && Olive::ActiveSequence->using_workarea) { + if (snap_to_point(Olive::ActiveSequence->workarea_in, l)) return true; + if (snap_to_point(Olive::ActiveSequence->workarea_out, l)) return true; } // snap to clip/transition - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { if (snap_to_point(c->timeline_in, l)) { return true; @@ -1461,14 +1455,14 @@ void Timeline::set_marker() { QVector clips_selected; bool clip_mode = false; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { // only add markers if the playhead is inside the clip - if (sequence->playhead >= c->timeline_in - && sequence->playhead <= c->timeline_out) { + if (Olive::ActiveSequence->playhead >= c->timeline_in + && Olive::ActiveSequence->playhead <= c->timeline_out) { clips_selected.append(i); } @@ -1485,15 +1479,15 @@ void Timeline::set_marker() { } // pass off to internal set marker function - set_marker_internal(sequence, clips_selected); + set_marker_internal(Olive::ActiveSequence, clips_selected); } void Timeline::toggle_links() { LinkCommand* command = new LinkCommand(); - command->s = sequence; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + command->s = Olive::ActiveSequence; + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { if (!command->clips.contains(i)) command->clips.append(i); @@ -1537,7 +1531,7 @@ void Timeline::decrease_track_height() { } void Timeline::deselect() { - sequence->selections.clear(); + Olive::ActiveSequence->selections.clear(); repaint_timeline(); } @@ -1608,7 +1602,7 @@ void Timeline::setScroll(int s) { } void Timeline::record_btn_click() { - if (project_url.isEmpty()) { + if (Olive::ActiveProjectFilename.isEmpty()) { QMessageBox::critical(this, tr("Unsaved Project"), tr("You must save this project before you can record audio in it."), @@ -1616,7 +1610,7 @@ void Timeline::record_btn_click() { } else { creating = true; creating_object = ADD_OBJ_AUDIO; - mainWindow->statusBar()->showMessage( + Olive::MainWindow->statusBar()->showMessage( tr("Click on the timeline where you want to start recording (drag to limit the recording to a certain timeframe)"), 10000); } @@ -1674,7 +1668,7 @@ void Timeline::resize_move(double z) { } void Timeline::set_sb_max() { - headers->set_scrollbar_max(horizontalScrollBar, sequence->getEndFrame(), editAreas->width() - getScreenPointFromFrame(zoom, 200)); + headers->set_scrollbar_max(horizontalScrollBar, Olive::ActiveSequence->getEndFrame(), editAreas->width() - getScreenPointFromFrame(zoom, 200)); } void Timeline::setup_ui() { diff --git a/panels/viewer.cpp b/panels/viewer.cpp index d2bcbd592..8a2b44fbc 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -96,7 +96,7 @@ bool Viewer::is_main_sequence() { void Viewer::set_main_sequence() { clean_created_seq(); - set_sequence(true, sequence); + set_sequence(true, Olive::ActiveSequence); } void Viewer::reset_all_audio() { @@ -835,7 +835,7 @@ void Viewer::set_sequence(bool main, Sequence *s) { } main_sequence = main; - seq = (main) ? sequence : s; + seq = (main) ? Olive::ActiveSequence : s; bool null_sequence = (seq == nullptr); diff --git a/playback/audio.cpp b/playback/audio.cpp index 44402a6f6..89c12f5ec 100644 --- a/playback/audio.cpp +++ b/playback/audio.cpp @@ -1,12 +1,12 @@ #include "audio.h" +#include "oliveglobal.h" + #include "project/sequence.h" -#include "io/config.h" -#include "panels/project.h" #include "panels/panels.h" -#include "panels/timeline.h" -#include "panels/viewer.h" + +#include "io/config.h" #include "ui/audiomonitor.h" #include "playback/playback.h" #include "debug.h" @@ -132,7 +132,7 @@ void clear_audio_ibuffer() { } int current_audio_freq() { - return audio_rendering ? sequence->audio_frequency : audio_output->format().sampleRate(); + return audio_rendering ? Olive::ActiveSequence->audio_frequency : audio_output->format().sampleRate(); } qint64 get_buffer_offset_from_frame(double framerate, long frame) { @@ -303,26 +303,31 @@ void write_wave_trailer(QFile& f) { } bool start_recording() { - if (sequence == nullptr) { + if (Olive::ActiveSequence == nullptr) { qCritical() << "No active sequence to record into"; return false; } - QString audio_path = project_url + " " + QCoreApplication::translate("Audio", "Audio"); + QString audio_path = QCoreApplication::translate("Audio", "%1 Audio").arg(Olive::ActiveProjectFilename); QDir audio_dir(audio_path); if (!audio_dir.exists() && !audio_dir.mkpath(".")) { qCritical() << "Failed to create audio directory"; return false; } - QString audio_filename; + QString audio_file_path; int file_number = 0; do { file_number++; - audio_filename = audio_path + "/" + QCoreApplication::translate("Audio", "Recording") + " " + QString::number(file_number) + ".wav"; - } while (QFile(audio_filename).exists()); - output_recording.setFileName(audio_filename); + QString audio_filename = QString("%1.wav").arg( + QCoreApplication::translate("Audio", "Recording %1").arg(QString::number(file_number)) + ); + + audio_file_path = audio_dir.filePath(audio_filename); + } while (QFile(audio_file_path).exists()); + + output_recording.setFileName(audio_file_path); if (!output_recording.open(QFile::WriteOnly)) { qCritical() << "Failed to open output file. Does Olive have permission to write to this directory?"; return false; diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 3506ab07e..37e391d4f 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -117,7 +117,7 @@ void cache_audio_worker(Clip* c, bool scrubbing, QVector& nests, int play } if (temp_reverse) { - long seq_end = sequence->getEndFrame(); + long seq_end = Olive::ActiveSequence->getEndFrame(); timeline_in = seq_end - timeline_in; timeline_out = seq_end - timeline_out; target_frame = seq_end - target_frame; diff --git a/playback/playback.cpp b/playback/playback.cpp index af4d03f72..b293def72 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -432,7 +432,7 @@ bool is_clip_active(Clip* c, long playhead) { void set_sequence(Sequence* s) { panel_effect_controls->clear_effects(true); - sequence = s; + Olive::ActiveSequence = s; panel_sequence_viewer->set_main_sequence(); panel_timeline->update_sequence(); panel_timeline->setFocus(); diff --git a/project/clip.cpp b/project/clip.cpp index faafc8fb4..9e7663a58 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -277,11 +277,13 @@ int Clip::getWidth() { const FootageStream* ms = media->to_footage()->get_stream_from_file_index(track < 0, media_stream); if (ms != nullptr) return ms->video_width; if (sequence != nullptr) return sequence->width; + break; } case MEDIA_TYPE_SEQUENCE: { Sequence* s = media->to_sequence(); return s->width; + break; } } return 0; diff --git a/project/clip.h b/project/clip.h index 82d385437..343ef181b 100644 --- a/project/clip.h +++ b/project/clip.h @@ -7,9 +7,6 @@ #include "marker.h" -#define SKIP_TYPE_DISCARD 0 -#define SKIP_TYPE_SEEK 1 - class Cacher; class Effect; class Transition; diff --git a/project/effect.cpp b/project/effect.cpp index 804d3d630..1409d94cf 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -76,7 +76,7 @@ Effect* create_effect(Clip* c, const EffectMeta* em) { return new Effect(c, em); } else { qCritical() << "Invalid effect data"; - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, QCoreApplication::translate("Effect", "Invalid effect"), QCoreApplication::translate("Effect", "No candidate for effect '%1'. This effect may be corrupt. Try reinstalling it or Olive.").arg(em->name)); } @@ -375,7 +375,7 @@ void Effect::field_changed() { void Effect::show_context_menu(const QPoint& pos) { if (meta->type == EFFECT_TYPE_EFFECT) { - QMenu menu(mainWindow); + QMenu menu(Olive::MainWindow); int index = get_index_in_clip(); @@ -438,7 +438,7 @@ void Effect::move_down() { void Effect::save_to_file() { // save effect settings to file - QString file = QFileDialog::getSaveFileName(mainWindow, + QString file = QFileDialog::getSaveFileName(Olive::MainWindow, tr("Save Effect Settings"), QString(), tr("Effect XML Settings %1").arg("(*.xml)")); @@ -458,7 +458,7 @@ void Effect::save_to_file() { file_handle.close(); } else { - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, tr("Save Settings Failed"), tr("Failed to open \"%1\" for writing.").arg(file), QMessageBox::Ok); @@ -468,7 +468,7 @@ void Effect::save_to_file() { void Effect::load_from_file() { // load effect settings from file - QString file = QFileDialog::getOpenFileName(mainWindow, + QString file = QFileDialog::getOpenFileName(Olive::MainWindow, tr("Load Effect Settings"), QString(), tr("Effect XML Settings %1").arg("(*.xml)")); @@ -484,7 +484,7 @@ void Effect::load_from_file() { update_ui(false); } else { - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, tr("Load Settings Failed"), tr("Failed to open \"%1\" for reading.").arg(file), QMessageBox::Ok); @@ -693,7 +693,7 @@ void Effect::load_from_string(const QByteArray &s) { // pass off to standard loading function load(stream); } else { - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, tr("Load Settings Failed"), tr("This settings file doesn't match this effect."), QMessageBox::Ok); diff --git a/project/effectfield.h b/project/effectfield.h index 1fa3bcbfa..d485e4c9b 100644 --- a/project/effectfield.h +++ b/project/effectfield.h @@ -1,13 +1,15 @@ #ifndef EFFECTFIELD_H #define EFFECTFIELD_H -#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 -#define EFFECT_FIELD_FILE 6 +enum EffectFieldType { + EFFECT_FIELD_DOUBLE, + EFFECT_FIELD_COLOR, + EFFECT_FIELD_STRING, + EFFECT_FIELD_BOOL, + EFFECT_FIELD_COMBO, + EFFECT_FIELD_FONT, + EFFECT_FIELD_FILE +}; #include #include diff --git a/project/effectgizmo.h b/project/effectgizmo.h index 1eb7e2e28..0b4ed02f9 100644 --- a/project/effectgizmo.h +++ b/project/effectgizmo.h @@ -1,9 +1,11 @@ #ifndef EFFECTGIZMO_H #define EFFECTGIZMO_H -#define GIZMO_TYPE_DOT 0 -#define GIZMO_TYPE_POLY 1 -#define GIZMO_TYPE_TARGET 2 +enum GizmoType { + GIZMO_TYPE_DOT, + GIZMO_TYPE_POLY, + GIZMO_TYPE_TARGET +}; #define GIZMO_DOT_SIZE 2.5 #define GIZMO_TARGET_SIZE 5.0 diff --git a/project/effectrow.cpp b/project/effectrow.cpp index e803364ea..fb3849849 100644 --- a/project/effectrow.cpp +++ b/project/effectrow.cpp @@ -101,7 +101,7 @@ void EffectRow::goto_previous_key() { EffectField* f = field(i); for (int j=0;jkeyframes.size();j++) { long comp = f->keyframes.at(j).time - c->clip_in + c->timeline_in; - if (comp < sequence->playhead) { + if (comp < Olive::ActiveSequence->playhead) { key = qMax(comp, key); } } @@ -117,7 +117,7 @@ void EffectRow::toggle_key() { EffectField* f = field(j); for (int i=0;ikeyframes.size();i++) { long comp = c->timeline_in - c->clip_in + f->keyframes.at(i).time; - if (comp == sequence->playhead) { + if (comp == Olive::ActiveSequence->playhead) { key_fields.append(f); key_field_index.append(i); } @@ -144,7 +144,7 @@ void EffectRow::goto_next_key() { EffectField* f = field(i); for (int j=0;jkeyframes.size();j++) { long comp = f->keyframes.at(j).time - c->clip_in + c->timeline_in; - if (comp > sequence->playhead) { + if (comp > Olive::ActiveSequence->playhead) { key = qMin(comp, key); } } @@ -174,7 +174,7 @@ void EffectRow::add_widget(QWidget* w) { } void EffectRow::set_keyframe_now(ComboAction* ca) { - long time = sequence->playhead-parent_effect->parent_clip->timeline_in+parent_effect->parent_clip->clip_in; + long time = Olive::ActiveSequence->playhead-parent_effect->parent_clip->timeline_in+parent_effect->parent_clip->clip_in; if (!just_made_unsafe_keyframe) { EffectKeyframe key; diff --git a/project/marker.cpp b/project/marker.cpp index 646459cac..985eae67d 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -39,7 +39,7 @@ void set_marker_internal(Sequence* seq, const QVector& clips) { // if (config.set_name_with_marker) is false (set above), ask for a marker name if (!add_marker) { - QInputDialog d(mainWindow); + QInputDialog d(Olive::MainWindow); d.setWindowTitle(QCoreApplication::translate("Marker", "Set Marker")); d.setLabelText(clips.size() > 0 ? QCoreApplication::translate("Marker", "Set clip marker name:") diff --git a/project/media.h b/project/media.h index b917d7495..ff7ea236f 100644 --- a/project/media.h +++ b/project/media.h @@ -6,9 +6,11 @@ #include "project/marker.h" -#define MEDIA_TYPE_FOOTAGE 0 -#define MEDIA_TYPE_SEQUENCE 1 -#define MEDIA_TYPE_FOLDER 2 +enum MediaType { + MEDIA_TYPE_FOOTAGE, + MEDIA_TYPE_SEQUENCE, + MEDIA_TYPE_FOLDER +}; struct Footage; class MediaThrobber; diff --git a/project/projectelements.h b/project/projectelements.h new file mode 100644 index 000000000..e41e27aa5 --- /dev/null +++ b/project/projectelements.h @@ -0,0 +1,15 @@ +#ifndef PROJECTELEMENTS_H +#define PROJECTELEMENTS_H + +// includes elements the user can use in a project +#include "media.h" +#include "footage.h" +#include "sequence.h" + +// includes elements the user can use in a sequence +#include "clip.h" +#include "transition.h" +#include "marker.h" +#include "effect.h" + +#endif // PROJECTELEMENTS_H diff --git a/project/sequence.cpp b/project/sequence.cpp index 6ec6afcf4..bd9eec73b 100644 --- a/project/sequence.cpp +++ b/project/sequence.cpp @@ -111,4 +111,4 @@ void Sequence::getTrackLimits(int* video_tracks, int* audio_tracks) { } // static variable for the currently active sequence -Sequence* sequence = nullptr; +Sequence* Olive::ActiveSequence = nullptr; diff --git a/project/sequence.h b/project/sequence.h index bf62edfd9..0e69b6d97 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -41,6 +41,8 @@ struct Sequence { }; // static variable for the currently active sequence -extern Sequence* sequence; +namespace Olive { + extern Sequence* ActiveSequence; +} #endif // SEQUENCE_H diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 0c7f55fcd..ad8707f0f 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -13,6 +13,7 @@ #include "io/config.h" #include "dialogs/proxydialog.h" #include "ui/viewerwidget.h" +#include "ui/menuhelper.h" #include "io/proxygenerator.h" #include "mainwindow.h" @@ -61,7 +62,7 @@ void SourcesCommon::show_context_menu(QWidget* parent, const QModelIndexList& it QObject::connect(import_action, SIGNAL(triggered(bool)), project_parent, SLOT(import_dialog())); QMenu* new_menu = menu.addMenu(tr("New")); - mainWindow->make_new_menu(new_menu); + Olive::MenuHelper.make_new_menu(new_menu); QMenu* view_menu = menu.addMenu(tr("View")); @@ -356,7 +357,7 @@ void SourcesCommon::item_renamed(Media* item) { void SourcesCommon::open_create_proxy_dialog() { // open the proxy dialog and send it a list of currently selected footage - ProxyDialog pd(mainWindow, cached_selected_footage); + ProxyDialog pd(Olive::MainWindow, cached_selected_footage); pd.exec(); } @@ -368,7 +369,7 @@ void SourcesCommon::clear_proxies_from_selected() { if (f->proxy && !f->proxy_path.isEmpty()) { if (QFileInfo::exists(f->proxy_path)) { - if (QMessageBox::question(mainWindow, + if (QMessageBox::question(Olive::MainWindow, tr("Delete proxy"), tr("Would you like to delete the proxy file \"%1\" as well?").arg(f->proxy_path), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { @@ -381,9 +382,9 @@ void SourcesCommon::clear_proxies_from_selected() { f->proxy_path.clear(); } - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { // close all clips so we can delete any proxies requested to be deleted - closeActiveClips(sequence); + closeActiveClips(Olive::ActiveSequence); } // delete proxies requested to be deleted @@ -391,10 +392,10 @@ void SourcesCommon::clear_proxies_from_selected() { QFile::remove(delete_list.at(i)); } - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { // update viewer (will re-open active clips with original media) panel_sequence_viewer->viewer_widget->frame_update(); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } diff --git a/project/transition.cpp b/project/transition.cpp index 0535e75e9..5a3123b6f 100644 --- a/project/transition.cpp +++ b/project/transition.cpp @@ -75,7 +75,7 @@ Transition* get_transition_from_meta(Clip* c, Clip* s, const EffectMeta* em) { } } else { qCritical() << "Invalid transition data"; - QMessageBox::critical(mainWindow, + QMessageBox::critical(Olive::MainWindow, QCoreApplication::translate("transition", "Invalid transition"), QCoreApplication::translate("transition", "No candidate for transition '%1'. This transition may be corrupt. Try reinstalling it or Olive.").arg(em->name) ); diff --git a/project/undo.cpp b/project/undo.cpp index 13c38460d..458a07fa7 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -73,7 +73,7 @@ MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int new_clip_in(iclip_in), new_track(itrack), relative(irelative), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void MoveClipAction::undo() { @@ -89,7 +89,7 @@ void MoveClipAction::undo() { clip->track = old_track; } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void MoveClipAction::redo() { @@ -105,7 +105,7 @@ void MoveClipAction::redo() { clip->track = new_track; } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } DeleteClipAction::DeleteClipAction(Sequence* s, int clip) : @@ -113,7 +113,7 @@ DeleteClipAction::DeleteClipAction(Sequence* s, int clip) : index(clip), opening_transition(-1), closing_transition(-1), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} DeleteClipAction::~DeleteClipAction() { @@ -144,7 +144,7 @@ void DeleteClipAction::undo() { ref = nullptr; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void DeleteClipAction::redo() { @@ -184,7 +184,7 @@ void DeleteClipAction::redo() { } } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } ChangeSequenceAction::ChangeSequenceAction(Sequence* s) : @@ -196,7 +196,7 @@ void ChangeSequenceAction::undo() { } void ChangeSequenceAction::redo() { - old_sequence = sequence; + old_sequence = Olive::ActiveSequence; set_sequence(new_sequence); } @@ -205,7 +205,7 @@ SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long new_enabled(enabled), new_in(in), new_out(out), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetTimelineInOutCommand::undo() { @@ -221,7 +221,7 @@ void SetTimelineInOutCommand::undo() { m->out = old_out; } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetTimelineInOutCommand::redo() { @@ -241,7 +241,7 @@ void SetTimelineInOutCommand::redo() { m->out = new_out; } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int insert_pos) : @@ -250,7 +250,7 @@ AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int ref(e), pos(insert_pos), done(false), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} AddEffectCommand::~AddEffectCommand() { @@ -265,7 +265,7 @@ void AddEffectCommand::undo() { clip->effects.removeAt(pos); } done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void AddEffectCommand::redo() { @@ -278,7 +278,7 @@ void AddEffectCommand::redo() { clip->effects.insert(pos, ref); } done = true; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } AddTransitionCommand::AddTransitionCommand(Clip* c, Clip *s, Transition* copy, const EffectMeta *itransition, int itype, int ilength) : @@ -288,7 +288,7 @@ AddTransitionCommand::AddTransitionCommand(Clip* c, Clip *s, Transition* copy, c transition(itransition), type(itype), length(ilength), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void AddTransitionCommand::undo() { @@ -303,7 +303,7 @@ void AddTransitionCommand::undo() { if (secondary != nullptr) secondary->opening_transition = old_stransition; } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void AddTransitionCommand::redo() { @@ -328,27 +328,27 @@ void AddTransitionCommand::redo() { clip->get_closing_transition()->set_length(length); } } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) : clip(c), type(itype), new_length(ilength), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void ModifyTransitionCommand::undo() { Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); t->set_length(old_length); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void ModifyTransitionCommand::redo() { Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); old_length = t->get_true_length(); t->set_length(new_length); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } DeleteTransitionCommand::DeleteTransitionCommand(Sequence* s, int transition_index) : @@ -357,7 +357,7 @@ DeleteTransitionCommand::DeleteTransitionCommand(Sequence* s, int transition_ind transition(nullptr), otc(nullptr), ctc(nullptr), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} DeleteTransitionCommand::~DeleteTransitionCommand() { @@ -371,7 +371,7 @@ void DeleteTransitionCommand::undo() { if (ctc != nullptr) ctc->closing_transition = index; transition = nullptr; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void DeleteTransitionCommand::redo() { @@ -392,14 +392,14 @@ void DeleteTransitionCommand::redo() { transition = seq->transitions.at(index); seq->transitions[index] = nullptr; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } NewSequenceCommand::NewSequenceCommand(Media *s, Media* iparent) : seq(s), parent(iparent), done(false), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) { if (parent == nullptr) parent = project_model.get_root(); } @@ -412,21 +412,21 @@ void NewSequenceCommand::undo() { project_model.removeChild(parent, seq); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void NewSequenceCommand::redo() { project_model.appendChild(parent, seq); done = true; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } AddMediaCommand::AddMediaCommand(Media* iitem, Media *iparent) : item(iitem), parent(iparent), done(false), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} AddMediaCommand::~AddMediaCommand() { @@ -438,20 +438,20 @@ AddMediaCommand::~AddMediaCommand() { void AddMediaCommand::undo() { project_model.removeChild(parent, item); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void AddMediaCommand::redo() { project_model.appendChild(parent, item); done = true; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } DeleteMediaCommand::DeleteMediaCommand(Media* i) : item(i), parent(i->parentItem()), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} DeleteMediaCommand::~DeleteMediaCommand() { @@ -463,21 +463,21 @@ DeleteMediaCommand::~DeleteMediaCommand() { void DeleteMediaCommand::undo() { project_model.appendChild(parent, item); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); done = false; } void DeleteMediaCommand::redo() { project_model.removeChild(parent, item); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); done = true; } AddClipCommand::AddClipCommand(Sequence* s, QVector& add) : seq(s), clips(add), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} AddClipCommand::~AddClipCommand() { @@ -498,7 +498,7 @@ void AddClipCommand::undo() { if (c->open) close_clip(c, true); seq->clips.removeLast(); } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void AddClipCommand::redo() { @@ -525,10 +525,10 @@ void AddClipCommand::redo() { } } } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } -LinkCommand::LinkCommand() : link(true), old_project_changed(mainWindow->isWindowModified()) {} +LinkCommand::LinkCommand() : link(true), old_project_changed(Olive::MainWindow->isWindowModified()) {} void LinkCommand::undo() { for (int i=0;ilinked = old_links.at(i); } } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void LinkCommand::redo() { @@ -558,30 +558,30 @@ void LinkCommand::redo() { c->linked.clear(); } } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } -CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked()), done(true), old_project_changed(mainWindow->isWindowModified()) {} +CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked()), done(true), old_project_changed(Olive::MainWindow->isWindowModified()) {} CheckboxCommand::~CheckboxCommand() {} void CheckboxCommand::undo() { box->setChecked(!checked); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void CheckboxCommand::redo() { if (!done) { box->setChecked(checked); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } ReplaceMediaCommand::ReplaceMediaCommand(Media* i, QString s) : item(i), new_filename(s), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) { old_filename = item->to_footage()->url; } @@ -610,20 +610,20 @@ void ReplaceMediaCommand::replace(QString& filename) { void ReplaceMediaCommand::undo() { replace(old_filename); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void ReplaceMediaCommand::redo() { replace(new_filename); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } ReplaceClipMediaCommand::ReplaceClipMediaCommand(Media *a, Media *b, bool e) : old_media(a), new_media(b), preserve_clip_ins(e), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void ReplaceClipMediaCommand::replace(bool undo) { @@ -660,17 +660,17 @@ void ReplaceClipMediaCommand::replace(bool undo) { void ReplaceClipMediaCommand::undo() { replace(true); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void ReplaceClipMediaCommand::redo() { replace(false); update_ui(true); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } -EffectDeleteCommand::EffectDeleteCommand() : done(false), old_project_changed(mainWindow->isWindowModified()) {} +EffectDeleteCommand::EffectDeleteCommand() : done(false), old_project_changed(Olive::MainWindow->isWindowModified()) {} EffectDeleteCommand::~EffectDeleteCommand() { if (done) { @@ -687,7 +687,7 @@ void EffectDeleteCommand::undo() { } panel_effect_controls->reload_clips(); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void EffectDeleteCommand::redo() { @@ -702,16 +702,16 @@ void EffectDeleteCommand::redo() { } panel_effect_controls->reload_clips(); done = true; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } -MediaMove::MediaMove() : old_project_changed(mainWindow->isWindowModified()) {} +MediaMove::MediaMove() : old_project_changed(Olive::MainWindow->isWindowModified()) {} void MediaMove::undo() { for (int i=0;isetWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void MediaMove::redo() { @@ -722,47 +722,47 @@ void MediaMove::redo() { froms[i] = parent; project_model.moveChild(items.at(i), to); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } MediaRename::MediaRename(Media* iitem, QString ito) : item(iitem), from(iitem->get_name()), to(ito), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void MediaRename::undo() { item->set_name(from); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void MediaRename::redo() { item->set_name(to); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } KeyframeDelete::KeyframeDelete(EffectField *ifield, int iindex) : field(ifield), index(iindex), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void KeyframeDelete::undo() { field->keyframes.insert(index, deleted_key); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void KeyframeDelete::redo() { deleted_key = field->keyframes.at(index); field->keyframes.removeAt(index); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } EffectFieldUndo::EffectFieldUndo(EffectField* f) : field(f), done(true), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) { old_val = field->get_previous_data(); new_val = field->get_current_data(); @@ -771,18 +771,18 @@ EffectFieldUndo::EffectFieldUndo(EffectField* f) : void EffectFieldUndo::undo() { field->set_current_data(old_val); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void EffectFieldUndo::redo() { if (!done) { field->set_current_data(new_val); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetAutoscaleAction::SetAutoscaleAction() : - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetAutoscaleAction::undo() { @@ -790,7 +790,7 @@ void SetAutoscaleAction::undo() { clips.at(i)->autoscale = !clips.at(i)->autoscale; } panel_sequence_viewer->viewer_widget->frame_update(); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetAutoscaleAction::redo() { @@ -798,14 +798,14 @@ void SetAutoscaleAction::redo() { clips.at(i)->autoscale = !clips.at(i)->autoscale; } panel_sequence_viewer->viewer_widget->frame_update(); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } AddMarkerAction::AddMarkerAction(QVector* m, long t, QString n) : active_array(m), time(t), name(n), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void AddMarkerAction::undo() { @@ -815,7 +815,7 @@ void AddMarkerAction::undo() { active_array[0][index].name = old_name; } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void AddMarkerAction::redo() { @@ -838,37 +838,37 @@ void AddMarkerAction::redo() { active_array[0][index].name = name; } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } MoveMarkerAction::MoveMarkerAction(Marker* m, long o, long n) : marker(m), old_time(o), new_time(n), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void MoveMarkerAction::undo() { marker->frame = old_time; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void MoveMarkerAction::redo() { marker->frame = new_time; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } DeleteMarkerAction::DeleteMarkerAction(QVector *m) : active_array(m), sorted(false), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void DeleteMarkerAction::undo() { for (int i=markers.size()-1;i>=0;i--) { active_array->insert(markers.at(i), copies.at(i)); } - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void DeleteMarkerAction::redo() { @@ -885,55 +885,55 @@ void DeleteMarkerAction::redo() { active_array->removeAt(markers.at(i)); } sorted = true; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetSpeedAction::SetSpeedAction(Clip* c, double speed) : clip(c), old_speed(c->speed), new_speed(speed), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetSpeedAction::undo() { clip->speed = old_speed; clip->recalculateMaxLength(); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetSpeedAction::redo() { clip->speed = new_speed; clip->recalculateMaxLength(); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetBool::SetBool(bool* b, bool setting) : boolean(b), old_setting(*b), new_setting(setting), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetBool::undo() { *boolean = old_setting; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetBool::redo() { *boolean = new_setting; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetSelectionsCommand::SetSelectionsCommand(Sequence* s) : seq(s), done(true), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetSelectionsCommand::undo() { seq->selections = old_data; done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetSelectionsCommand::redo() { @@ -941,30 +941,30 @@ void SetSelectionsCommand::redo() { seq->selections = new_data; done = true; } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetEnableCommand::SetEnableCommand(Clip* c, bool enable) : clip(c), old_val(c->enabled), new_val(enable), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetEnableCommand::undo() { clip->enabled = old_val; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetEnableCommand::redo() { clip->enabled = new_val; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } EditSequenceCommand::EditSequenceCommand(Media* i, Sequence *s) : item(i), seq(s), - old_project_changed(mainWindow->isWindowModified()), + old_project_changed(Olive::MainWindow->isWindowModified()), old_name(s->name), old_width(s->width), old_height(s->height), @@ -982,7 +982,7 @@ void EditSequenceCommand::undo() { seq->audio_layout = old_audio_layout; update(); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void EditSequenceCommand::redo() { @@ -994,7 +994,7 @@ void EditSequenceCommand::redo() { seq->audio_layout = audio_layout; update(); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } void EditSequenceCommand::update() { @@ -1005,7 +1005,7 @@ void EditSequenceCommand::update() { if (seq->clips.at(i) != nullptr) seq->clips.at(i)->refresh(); } - if (sequence == seq) { + if (Olive::ActiveSequence == seq) { set_sequence(seq); } } @@ -1014,34 +1014,34 @@ SetInt::SetInt(int* pointer, int new_value) : p(pointer), oldval(*pointer), newval(new_value), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetInt::undo() { *p = oldval; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetInt::redo() { *p = newval; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetString::SetString(QString* pointer, QString new_value) : p(pointer), oldval(*pointer), newval(new_value), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetString::undo() { *p = oldval; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetString::redo() { *p = newval; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } void CloseAllClipsCommand::undo() { @@ -1049,7 +1049,7 @@ void CloseAllClipsCommand::undo() { } void CloseAllClipsCommand::redo() { - closeActiveClips(sequence); + closeActiveClips(Olive::ActiveSequence); } UpdateFootageTooltip::UpdateFootageTooltip(Media *i) : @@ -1065,22 +1065,22 @@ void UpdateFootageTooltip::redo() { } MoveEffectCommand::MoveEffectCommand() : - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void MoveEffectCommand::undo() { clip->effects.move(to, from); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void MoveEffectCommand::redo() { clip->effects.move(from, to); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } RemoveClipsFromClipboard::RemoveClipsFromClipboard(int index) : pos(index), - old_project_changed(mainWindow->isWindowModified()), + old_project_changed(Olive::MainWindow->isWindowModified()), done(false) {} @@ -1102,7 +1102,7 @@ void RemoveClipsFromClipboard::redo() { } RenameClipCommand::RenameClipCommand() : - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void RenameClipCommand::undo() { @@ -1122,18 +1122,18 @@ void RenameClipCommand::redo() { SetPointer::SetPointer(void **pointer, void *data) : p(pointer), new_data(data), - old_changed(mainWindow->isWindowModified()) + old_changed(Olive::MainWindow->isWindowModified()) {} void SetPointer::undo() { *p = old_data; - mainWindow->setWindowModified(old_changed); + Olive::MainWindow->setWindowModified(old_changed); } void SetPointer::redo() { old_data = *p; *p = new_data; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } void ReloadEffectsCommand::undo() { @@ -1175,17 +1175,17 @@ SetDouble::SetDouble(double* pointer, double old_value, double new_value) : p(pointer), oldval(old_value), newval(new_value), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetDouble::undo() { *p = oldval; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetDouble::redo() { *p = newval; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } SetQVariant::SetQVariant(QVariant *itarget, const QVariant &iold, const QVariant &inew) : @@ -1206,17 +1206,17 @@ SetLong::SetLong(long *pointer, long old_value, long new_value) : p(pointer), oldval(old_value), newval(new_value), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void SetLong::undo() { *p = oldval; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void SetLong::redo() { *p = newval; - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } KeyframeFieldSet::KeyframeFieldSet(EffectField *ifield, int ii) : @@ -1224,19 +1224,19 @@ KeyframeFieldSet::KeyframeFieldSet(EffectField *ifield, int ii) : index(ii), key(ifield->keyframes.at(ii)), done(true), - old_project_changed(mainWindow->isWindowModified()) + old_project_changed(Olive::MainWindow->isWindowModified()) {} void KeyframeFieldSet::undo() { field->keyframes.removeAt(index); - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); done = false; } void KeyframeFieldSet::redo() { if (!done) { field->keyframes.insert(index, key); - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } done = true; } diff --git a/ui/audiomonitor.cpp b/ui/audiomonitor.cpp index 114e745b0..de511478a 100644 --- a/ui/audiomonitor.cpp +++ b/ui/audiomonitor.cpp @@ -48,7 +48,7 @@ void AudioMonitor::resizeEvent(QResizeEvent *e) { } void AudioMonitor::paintEvent(QPaintEvent *) { - if (sequence != nullptr && values.size() > 0) { + if (Olive::ActiveSequence != nullptr && values.size() > 0) { QPainter p(this); int channel_x = AUDIO_MONITOR_GAP; int channel_count = values.size(); diff --git a/ui/comboboxex.cpp b/ui/comboboxex.cpp index 8b04dd378..e961a4183 100644 --- a/ui/comboboxex.cpp +++ b/ui/comboboxex.cpp @@ -11,17 +11,17 @@ class ComboBoxExCommand : public QUndoCommand { public: ComboBoxExCommand(ComboBoxEx* obj, int old_index, int new_index) : - combobox(obj), old_val(old_index), new_val(new_index), done(true), old_project_changed(mainWindow->isWindowModified()) {} + combobox(obj), old_val(old_index), new_val(new_index), done(true), old_project_changed(Olive::MainWindow->isWindowModified()) {} void undo() { combobox->setCurrentIndex(old_val); done = false; - mainWindow->setWindowModified(old_project_changed); + Olive::MainWindow->setWindowModified(old_project_changed); } void redo() { if (!done) { combobox->setCurrentIndex(new_val); } - mainWindow->setWindowModified(true); + Olive::MainWindow->setWindowModified(true); } private: ComboBoxEx* combobox; diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 3e5c4b77a..12d4999f5 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -86,13 +86,13 @@ void KeyframeView::paintEvent(QPaintEvent*) { visible_out = 0; for (int j=0;jselected_clips.size();j++) { - Clip* c = sequence->clips.at(panel_effect_controls->selected_clips.at(j)); + Clip* c = Olive::ActiveSequence->clips.at(panel_effect_controls->selected_clips.at(j)); visible_in = qMin(visible_in, c->timeline_in); visible_out = qMax(visible_out, c->timeline_out); } for (int j=0;jselected_clips.size();j++) { - Clip* c = sequence->clips.at(panel_effect_controls->selected_clips.at(j)); + Clip* c = Olive::ActiveSequence->clips.at(panel_effect_controls->selected_clips.at(j)); for (int i=0;ieffects.size();i++) { Effect* e = c->effects.at(i); if (e->container->is_expanded()) { @@ -148,7 +148,7 @@ void KeyframeView::paintEvent(QPaintEvent*) { panel_effect_controls->horizontalScrollBar->setMaximum(qMax(max_width - width(), 0)); header->set_visible_in(visible_in); - int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, sequence->playhead-visible_in) - x_scroll; + int playhead_x = getScreenPointFromFrame(panel_effect_controls->zoom, Olive::ActiveSequence->playhead-visible_in) - x_scroll; if (dragging && panel_timeline->snapped) { p.setPen(Qt::white); } else { @@ -356,7 +356,7 @@ void KeyframeView::mouseMoveEvent(QMouseEvent* event) { Clip* c = field->parent_row->parent_effect->parent_clip; long key_time = old_key_vals.at(i) + frame_diff - c->clip_in + c->timeline_in; long key_eval = key_time; - if (panel_timeline->snap_to_point(sequence->playhead, &key_eval)) { + if (panel_timeline->snap_to_point(Olive::ActiveSequence->playhead, &key_eval)) { frame_diff += (key_eval - key_time); break; } diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp new file mode 100644 index 000000000..9ad5aaa07 --- /dev/null +++ b/ui/menuhelper.cpp @@ -0,0 +1,23 @@ +#include "menuhelper.h" + +#include "oliveglobal.h" + +#include "mainwindow.h" + +MenuHelper Olive::MenuHelper; + +void MenuHelper::make_new_menu(QMenu *parent) { + parent->addAction(tr("&Project"), Olive::Global.data(), SLOT(new_project()), QKeySequence("Ctrl+N"))->setProperty("id", "newproj"); + parent->addSeparator(); + parent->addAction(tr("&Sequence"), Olive::MainWindow, SLOT(new_sequence()), QKeySequence("Ctrl+Shift+N"))->setProperty("id", "newseq"); + parent->addAction(tr("&Folder"), Olive::MainWindow, SLOT(new_folder()))->setProperty("id", "newfolder"); +} + +void MenuHelper::make_inout_menu(QMenu *parent) { + parent->addAction(tr("Set In Point"), Olive::MainWindow, SLOT(set_in_point()), QKeySequence("I"))->setProperty("id", "setinpoint"); + parent->addAction(tr("Set Out Point"), Olive::MainWindow, SLOT(set_out_point()), QKeySequence("O"))->setProperty("id", "setoutpoint"); + parent->addSeparator(); + parent->addAction(tr("Reset In Point"), Olive::MainWindow, SLOT(clear_in()))->setProperty("id", "resetin"); + parent->addAction(tr("Reset Out Point"), Olive::MainWindow, SLOT(clear_out()))->setProperty("id", "resetout"); + parent->addAction(tr("Clear In/Out Point"), Olive::MainWindow, SLOT(clear_inout()), QKeySequence("G"))->setProperty("id", "clearinout"); +} diff --git a/ui/menuhelper.h b/ui/menuhelper.h new file mode 100644 index 000000000..96d740f45 --- /dev/null +++ b/ui/menuhelper.h @@ -0,0 +1,45 @@ +#ifndef MENUHELPER_H +#define MENUHELPER_H + +#include +#include + +class MenuHelper : public QObject { + Q_OBJECT +public: + /** + * @brief Creates a menu of new items that can be created + * + * Adds the full set of creatable items to a QMenu (e.g. new project, + * new sequence, new folder, etc.) + * + * @param parent + * + * The menu to add items to. + */ + void make_new_menu(QMenu* parent); + + /** + * @brief Creates a menu of options for working with in/out points + * + * Adds a set of options for working with sequence/footage in/out points, + * e.g. setting in/out points, clearing in/out points, etc. + * + * @param parent + * + * The menu to add items to. + */ + void make_inout_menu(QMenu* parent); +private slots: + + +}; + +namespace Olive { + /** + * @brief A global MenuHelper object to assist menu creation throughout Olive. + */ + extern MenuHelper MenuHelper; +} + +#endif // MENUHELPER_H diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 140872784..25541e464 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -8,6 +8,7 @@ #include "project/media.h" #include "panels/viewer.h" #include "io/config.h" +#include "ui/menuhelper.h" #include "debug.h" #include @@ -436,11 +437,11 @@ void TimelineHeader::paintEvent(QPaintEvent*) { void TimelineHeader::show_context_menu(const QPoint &pos) { QMenu menu(this); - mainWindow->make_inout_menu(&menu); + Olive::MenuHelper.make_inout_menu(&menu); menu.addSeparator(); - QAction* center_timecodes = menu.addAction(tr("Center Timecodes"), mainWindow, SLOT(toggle_bool_action())); + QAction* center_timecodes = menu.addAction(tr("Center Timecodes"), Olive::MainWindow, SLOT(toggle_bool_action())); center_timecodes->setCheckable(true); center_timecodes->setChecked(config.center_timeline_timecodes); center_timecodes->setData(reinterpret_cast(&config.center_timeline_timecodes)); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 82989339d..785bfee8d 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -68,7 +68,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) : QWidget(parent) { } void TimelineWidget::show_context_menu(const QPoint& pos) { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { // hack because sometimes right clicking doesn't trigger mouse release event panel_timeline->rect_select_init = false; panel_timeline->rect_select_proc = false; @@ -77,16 +77,16 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { QAction* undoAction = menu.addAction(tr("&Undo")); QAction* redoAction = menu.addAction(tr("&Redo")); - connect(undoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(undo())); - connect(redoAction, SIGNAL(triggered(bool)), mainWindow, SLOT(redo())); + connect(undoAction, SIGNAL(triggered(bool)), Olive::MainWindow, SLOT(undo())); + connect(redoAction, SIGNAL(triggered(bool)), Olive::MainWindow, SLOT(redo())); undoAction->setEnabled(undo_stack.canUndo()); redoAction->setEnabled(undo_stack.canRedo()); menu.addSeparator(); // collect all the selected clips QVector selected_clips; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { selected_clips.append(c); } @@ -94,11 +94,11 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { if (!selected_clips.isEmpty()) { // clips are selected - menu.addAction(tr("C&ut"), mainWindow, SLOT(cut())); - menu.addAction(tr("Cop&y"), mainWindow, SLOT(copy())); + menu.addAction(tr("C&ut"), Olive::MainWindow, SLOT(cut())); + menu.addAction(tr("Cop&y"), Olive::MainWindow, SLOT(copy())); } - menu.addAction(tr("&Paste"), mainWindow, SLOT(paste())); + menu.addAction(tr("&Paste"), Olive::MainWindow, SLOT(paste())); if (selected_clips.isEmpty()) { // no clips are selected @@ -118,18 +118,18 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { if (!selected_clips.isEmpty()) { menu.addSeparator(); - menu.addAction(tr("&Speed/Duration"), mainWindow, SLOT(open_speed_dialog())); + menu.addAction(tr("&Speed/Duration"), Olive::MainWindow, SLOT(open_speed_dialog())); QAction* autoscaleAction = menu.addAction(tr("Auto-s&cale"), this, SLOT(toggle_autoscale())); autoscaleAction->setCheckable(true); // set autoscale to the first selected clip autoscaleAction->setChecked(selected_clips.at(0)->autoscale); - menu.addAction(tr("Enable/Disable"), mainWindow, SLOT(toggle_enable_clips())); + menu.addAction(tr("Enable/Disable"), Olive::MainWindow, SLOT(toggle_enable_clips())); menu.addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links())); - menu.addAction(tr("&Nest"), mainWindow, SLOT(nest())); + menu.addAction(tr("&Nest"), Olive::MainWindow, SLOT(nest())); // stabilizer option /*int video_clip_count = 0; @@ -173,8 +173,8 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { void TimelineWidget::toggle_autoscale() { SetAutoscaleAction* action = new SetAutoscaleAction(); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { action->clips.append(c); } @@ -187,16 +187,16 @@ void TimelineWidget::toggle_autoscale() { } void TimelineWidget::tooltip_timer_timeout() { - if (sequence != nullptr) { - if (tooltip_clip < sequence->clips.size()) { - Clip* c = sequence->clips.at(tooltip_clip); + if (Olive::ActiveSequence != nullptr) { + if (tooltip_clip < Olive::ActiveSequence->clips.size()) { + Clip* c = Olive::ActiveSequence->clips.at(tooltip_clip); if (c != nullptr) { QToolTip::showText(QCursor::pos(), tr("%1\nStart: %2\nEnd: %3\nDuration: %4").arg( c->name, - frame_to_timecode(c->timeline_in, config.timecode_view, sequence->frame_rate), - frame_to_timecode(c->timeline_out, config.timecode_view, sequence->frame_rate), - frame_to_timecode(c->getLength(), config.timecode_view, sequence->frame_rate) + frame_to_timecode(c->timeline_in, config.timecode_view, Olive::ActiveSequence->frame_rate), + frame_to_timecode(c->timeline_out, config.timecode_view, Olive::ActiveSequence->frame_rate), + frame_to_timecode(c->getLength(), config.timecode_view, Olive::ActiveSequence->frame_rate) )); } } @@ -206,8 +206,8 @@ void TimelineWidget::tooltip_timer_timeout() { void TimelineWidget::rename_clip() { QVector selected_clips; - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && is_clip_selected(c, true)) { selected_clips.append(c); } @@ -242,7 +242,7 @@ void TimelineWidget::open_sequence_properties() { } panel_project->get_all_media_from_table(all_top_level_items, sequence_items, MEDIA_TYPE_SEQUENCE); // find all sequences in project for (int i=0;ito_sequence() == sequence) { + if (sequence_items.at(i)->to_sequence() == Olive::ActiveSequence) { NewSequenceDialog nsd(this, sequence_items.at(i)); nsd.exec(); return; @@ -272,7 +272,7 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { if (event->source() == panel_footage_viewer->viewer_widget) { Sequence* proposed_seq = panel_footage_viewer->seq; - if (proposed_seq != sequence) { // don't allow nesting the same sequence + if (proposed_seq != Olive::ActiveSequence) { // don't allow nesting the same sequence media_list.append(panel_footage_viewer->media); import_init = true; } @@ -314,7 +314,7 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { event->acceptProposedAction(); long entry_point; - Sequence* seq = sequence; + Sequence* seq = Olive::ActiveSequence; if (seq == nullptr) { // if no sequence, we're going to create a new one using the clips as a reference @@ -338,7 +338,7 @@ void TimelineWidget::dragMoveEvent(QDragMoveEvent *event) { if (panel_timeline->importing) { event->acceptProposedAction(); - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QPoint pos = event->pos(); update_ghosts(pos, event->keyboardModifiers() & Qt::ShiftModifier); panel_timeline->move_insert = ((event->keyboardModifiers() & Qt::ControlModifier) && (panel_timeline->tool == TIMELINE_TOOL_POINTER || panel_timeline->importing)); @@ -424,8 +424,8 @@ void insert_clips(ComboAction* ca) { panel_timeline->split_cache.clear(); - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { // don't split any clips that are moving bool found = false; @@ -452,13 +452,13 @@ void insert_clips(ComboAction* ca) { long ripple_length = (latest_new_point - earliest_new_point); - ripple_clips(ca, sequence, earliest_new_point, ripple_length, ignore_clips); + ripple_clips(ca, Olive::ActiveSequence, earliest_new_point, ripple_length, ignore_clips); if (ripple_old_point) { // works for moving later clips earlier but not earlier to later long second_ripple_length = (earliest_old_point - latest_old_point); - ripple_clips(ca, sequence, latest_old_point, second_ripple_length, ignore_clips); + ripple_clips(ca, Olive::ActiveSequence, latest_old_point, second_ripple_length, ignore_clips); if (earliest_old_point < earliest_new_point) { for (int i=0;ighosts.size();i++) { @@ -466,8 +466,8 @@ void insert_clips(ComboAction* ca) { g.in += second_ripple_length; g.out += second_ripple_length; } - for (int i=0;iselections.size();i++) { - Selection& s = sequence->selections[i]; + for (int i=0;iselections.size();i++) { + Selection& s = Olive::ActiveSequence->selections[i]; s.in += second_ripple_length; s.out += second_ripple_length; } @@ -481,7 +481,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) { ComboAction* ca = new ComboAction(); - Sequence* s = sequence; + Sequence* s = Olive::ActiveSequence; // if we're dropping into nothing, create a new sequences based on the clip being dragged if (s == nullptr) { @@ -505,23 +505,23 @@ void TimelineWidget::dropEvent(QDropEvent* event) { } void TimelineWidget::mouseDoubleClickEvent(QMouseEvent *event) { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { if (panel_timeline->tool == TIMELINE_TOOL_EDIT) { int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); if (clip_index >= 0) { - Clip* clip = sequence->clips.at(clip_index); - if (!(event->modifiers() & Qt::ShiftModifier)) sequence->selections.clear(); + Clip* clip = Olive::ActiveSequence->clips.at(clip_index); + if (!(event->modifiers() & Qt::ShiftModifier)) Olive::ActiveSequence->selections.clear(); Selection s; s.in = clip->timeline_in; s.out = clip->timeline_out; s.track = clip->track; - sequence->selections.append(s); + Olive::ActiveSequence->selections.append(s); update_ui(false); } } else if (panel_timeline->tool == TIMELINE_TOOL_POINTER) { int clip_index = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); if (clip_index >= 0) { - Clip* c = sequence->clips.at(clip_index); + Clip* c = Olive::ActiveSequence->clips.at(clip_index); if (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) { set_sequence(c->media->to_sequence()); } @@ -535,7 +535,7 @@ bool isLiveEditing() { } void TimelineWidget::mousePressEvent(QMouseEvent *event) { - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { int tool = panel_timeline->tool; if (event->button() == Qt::MiddleButton) { tool = TIMELINE_TOOL_HAND; @@ -561,7 +561,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { bool alt = (event->modifiers() & Qt::AltModifier); if (shift) { - panel_timeline->selection_offset = sequence->selections.size(); + panel_timeline->selection_offset = Olive::ActiveSequence->selections.size(); } else { panel_timeline->selection_offset = 0; } @@ -608,7 +608,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { panel_timeline->moving_init = true; } else { if (clip_index >= 0) { - Clip* clip = sequence->clips.at(clip_index); + Clip* clip = Olive::ActiveSequence->clips.at(clip_index); if (clip != nullptr) { if (is_clip_selected(clip, true)) { if (shift) { @@ -616,7 +616,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { if (!alt) { for (int i=0;ilinked.size();i++) { - Clip* link = sequence->clips.at(clip->linked.at(i)); + Clip* link = Olive::ActiveSequence->clips.at(clip->linked.at(i)); panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); } } @@ -624,7 +624,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { panel_timeline->deselect_area(clip->timeline_in, clip->timeline_out, clip->track); for (int i=0;ilinked.size();i++) { - Clip* link = sequence->clips.at(clip->linked.at(i)); + Clip* link = Olive::ActiveSequence->clips.at(clip->linked.at(i)); panel_timeline->deselect_area(link->timeline_in, link->timeline_out, link->track); } @@ -640,12 +640,12 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { s.out = clip->timeline_out; if (clip->get_closing_transition()->secondary_clip != nullptr) s.out += clip->get_closing_transition()->get_true_length(); } - sequence->selections.append(s); + Olive::ActiveSequence->selections.append(s); } } else { // if "shift" is not down if (!shift) { - sequence->selections.clear(); + Olive::ActiveSequence->selections.clear(); } Selection s; @@ -666,7 +666,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { } s.track = clip->track; - sequence->selections.append(s); + Olive::ActiveSequence->selections.append(s); if (config.select_also_seeks) { panel_sequence_viewer->seek(clip->timeline_in); @@ -675,13 +675,13 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { // if alt is not down, select links if (!alt && panel_timeline->transition_select == TA_NO_TRANSITION) { for (int i=0;ilinked.size();i++) { - Clip* link = sequence->clips.at(clip->linked.at(i)); + Clip* link = Olive::ActiveSequence->clips.at(clip->linked.at(i)); if (!is_clip_selected(link, true)) { Selection ss; ss.in = link->timeline_in; ss.out = link->timeline_out; ss.track = link->track; - sequence->selections.append(ss); + Olive::ActiveSequence->selections.append(ss); } } } @@ -692,7 +692,7 @@ void TimelineWidget::mousePressEvent(QMouseEvent *event) { } else { // if "shift" is not down if (!shift) { - sequence->selections.clear(); + Olive::ActiveSequence->selections.clear(); } panel_timeline->rect_select_init = true; @@ -758,7 +758,7 @@ void make_room_for_transition(ComboAction* ca, Clip* c, int type, long transitio void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { QToolTip::hideText(); - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { bool alt = (event->modifiers() & Qt::AltModifier); bool shift = (event->modifiers() & Qt::ShiftModifier); bool ctrl = (event->modifiers() & Qt::ControlModifier); @@ -772,11 +772,11 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { const Ghost& g = panel_timeline->ghosts.at(0); if (panel_timeline->creating_object == ADD_OBJ_AUDIO) { - mainWindow->statusBar()->clearMessage(); + Olive::MainWindow->statusBar()->clearMessage(); panel_sequence_viewer->cue_recording(qMin(g.in, g.out), qMax(g.in, g.out), g.track); panel_timeline->creating = false; } else if (g.in != g.out) { - Clip* c = new Clip(sequence); + Clip* c = new Clip(Olive::ActiveSequence); c->media = nullptr; c->timeline_in = qMin(g.in, g.out); c->timeline_out = qMax(g.in, g.out); @@ -800,7 +800,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { QVector add; add.append(c); - ca->append(new AddClipCommand(sequence, add)); + ca->append(new AddClipCommand(Olive::ActiveSequence, add)); if (c->track < 0) { // default video effects (before custom effects) @@ -875,9 +875,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { ripple_length = first_ghost.old_in - first_ghost.in; ripple_point = first_ghost.old_in; - for (int i=0;iselections.size();i++) { - sequence->selections[i].in += ripple_length; - sequence->selections[i].out += ripple_length; + for (int i=0;iselections.size();i++) { + Olive::ActiveSequence->selections[i].in += ripple_length; + Olive::ActiveSequence->selections[i].out += ripple_length; } } else { // if we're trimming an out-point @@ -900,7 +900,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } if (!panel_timeline->trim_in_point) ripple_length = -ripple_length; - ripple_clips(ca, sequence, ripple_point, ripple_length, ignore_clips); + ripple_clips(ca, Olive::ActiveSequence, ripple_point, ripple_length, ignore_clips); } if (panel_timeline->tool == TIMELINE_TOOL_POINTER @@ -914,7 +914,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { const Ghost& g = panel_timeline->ghosts.at(i); if (g.old_in != g.in || g.old_out != g.out || g.track != g.old_track || g.clip_in != g.old_clip_in) { // create copy of clip - Clip* c = sequence->clips.at(g.clip)->copy(sequence); + Clip* c = Olive::ActiveSequence->clips.at(g.clip)->copy(Olive::ActiveSequence); c->timeline_in = g.in; c->timeline_out = g.out; @@ -936,7 +936,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { // relink duplicated clips panel_timeline->relink_clips_using_ids(old_clips, new_clips); - ca->append(new AddClipCommand(sequence, new_clips)); + ca->append(new AddClipCommand(Olive::ActiveSequence, new_clips)); } } else { // INSERT if holding ctrl @@ -949,7 +949,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { // step 1 - set clips that are moving to "undeletable" (to avoid step 2 deleting any part of them) const Ghost& g = panel_timeline->ghosts.at(i); - sequence->clips.at(g.clip)->undeletable = true; + Olive::ActiveSequence->clips.at(g.clip)->undeletable = true; if (g.transition != nullptr) { g.transition->parent_clip->undeletable = true; if (g.transition->secondary_clip != nullptr) g.transition->secondary_clip->undeletable = true; @@ -964,7 +964,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { panel_timeline->delete_areas_and_relink(ca, delete_areas, false); for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); - sequence->clips.at(g.clip)->undeletable = false; + Olive::ActiveSequence->clips.at(g.clip)->undeletable = false; if (g.transition != nullptr) { g.transition->parent_clip->undeletable = false; if (g.transition->secondary_clip != nullptr) g.transition->secondary_clip->undeletable = false; @@ -975,7 +975,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { Ghost& g = panel_timeline->ghosts[i]; // step 3 - move clips - Clip* c = sequence->clips.at(g.clip); + Clip* c = Olive::ActiveSequence->clips.at(g.clip); if (g.transition == nullptr) { move_clip(ca, c, (g.in - g.old_in), (g.out - g.old_out), (g.clip_in - g.old_clip_in), (g.track - g.old_track), true, true); @@ -1047,13 +1047,13 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { long transition_start = qMin(g.in, g.out); long transition_end = qMax(g.in, g.out); - Clip* pre = sequence->clips.at(g.clip); + Clip* pre = Olive::ActiveSequence->clips.at(g.clip); Clip* post = pre; make_room_for_transition(ca, pre, panel_timeline->transition_tool_type, transition_start, transition_end, true); if (panel_timeline->transition_tool_post_clip > -1) { - post = sequence->clips.at(panel_timeline->transition_tool_post_clip); + post = Olive::ActiveSequence->clips.at(panel_timeline->transition_tool_post_clip); int opposite_type = (panel_timeline->transition_tool_type == TA_OPENING_TRANSITION) ? TA_CLOSING_TRANSITION : TA_OPENING_TRANSITION; make_room_for_transition( ca, @@ -1123,10 +1123,10 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } // remove duplicate selections - panel_timeline->clean_up_selections(sequence->selections); + panel_timeline->clean_up_selections(Olive::ActiveSequence->selections); if (selection_command != nullptr) { - selection_command->new_data = sequence->selections; + selection_command->new_data = Olive::ActiveSequence->selections; ca->append(selection_command); selection_command = nullptr; push_undo = true; @@ -1165,7 +1165,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { void TimelineWidget::init_ghosts() { for (int i=0;ighosts.size();i++) { Ghost& g = panel_timeline->ghosts[i]; - Clip* c = sequence->clips.at(g.clip); + Clip* c = Olive::ActiveSequence->clips.at(g.clip); g.track = g.old_track = c->track; g.clip_in = g.old_clip_in = c->clip_in; @@ -1195,8 +1195,8 @@ void TimelineWidget::init_ghosts() { c->recalculateMaxLength(); g.media_length = c->getMaximumLength(); } - for (int i=0;iselections.size();i++) { - Selection& s = sequence->selections[i]; + for (int i=0;iselections.size();i++) { + Selection& s = Olive::ActiveSequence->selections[i]; s.old_in = s.in; s.old_out = s.out; s.old_track = s.track; @@ -1271,7 +1271,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { // if the ghost is attached to a clip, snap its markers too if (panel_timeline->trim_target == -1 && g.clip >= 0) { - Clip* c = sequence->clips.at(g.clip); + Clip* c = Olive::ActiveSequence->clips.at(g.clip); for (int j=0;jget_markers().size();j++) { long marker_real_time = c->get_markers().at(j).frame + c->timeline_in - c->clip_in; fm = marker_real_time + frame_diff; @@ -1291,7 +1291,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { for (int i=0;ighosts.size();i++) { const Ghost& g = panel_timeline->ghosts.at(i); Clip* c = nullptr; - if (g.clip != -1) c = sequence->clips.at(g.clip); + if (g.clip != -1) c = Olive::ActiveSequence->clips.at(g.clip); const FootageStream* ms = nullptr; if (g.clip != -1 && c->media != nullptr && c->media->get_type() == MEDIA_TYPE_FOOTAGE) { @@ -1447,7 +1447,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { validate_transitions(c, panel_timeline->transition_tool_type, frame_diff); } else { Clip* otc = c; // open transition clip - Clip* ctc = sequence->clips.at(panel_timeline->transition_tool_post_clip); // close transition clip + Clip* ctc = Olive::ActiveSequence->clips.at(panel_timeline->transition_tool_post_clip); // close transition clip if (panel_timeline->transition_tool_type == TA_CLOSING_TRANSITION) { // swap @@ -1510,7 +1510,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { g.in = g.old_in + frame_diff; g.out = g.old_out + frame_diff; - if (g.transition != nullptr && g.transition == sequence->clips.at(g.clip)->get_opening_transition()) { + if (g.transition != nullptr && g.transition == Olive::ActiveSequence->clips.at(g.clip)->get_opening_transition()) { g.clip_in = g.old_clip_in + frame_diff; } @@ -1543,8 +1543,8 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { // apply changes to selections if (effective_tool != TIMELINE_TOOL_SLIP && !panel_timeline->importing && !panel_timeline->creating) { - for (int i=0;iselections.size();i++) { - Selection& s = sequence->selections[i]; + for (int i=0;iselections.size();i++) { + Selection& s = Olive::ActiveSequence->selections[i]; if (panel_timeline->trim_target > -1) { if (panel_timeline->trim_in_point) { s.in = s.old_in + frame_diff; @@ -1552,8 +1552,8 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { s.out = s.old_out + frame_diff; } } else if (clips_are_movable) { - for (int i=0;iselections.size();i++) { - Selection& s = sequence->selections[i]; + for (int i=0;iselections.size();i++) { + Selection& s = Olive::ActiveSequence->selections[i]; s.in = s.old_in + frame_diff; s.out = s.old_out + frame_diff; s.track = s.old_track; @@ -1574,9 +1574,9 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { } if (panel_timeline->importing) { - QToolTip::showText(mapToGlobal(mouse_pos), frame_to_timecode(earliest_in_point, config.timecode_view, sequence->frame_rate)); + QToolTip::showText(mapToGlobal(mouse_pos), frame_to_timecode(earliest_in_point, config.timecode_view, Olive::ActiveSequence->frame_rate)); } else { - QString tip = ((frame_diff < 0) ? "-" : "+") + frame_to_timecode(qAbs(frame_diff), config.timecode_view, sequence->frame_rate); + QString tip = ((frame_diff < 0) ? "-" : "+") + frame_to_timecode(qAbs(frame_diff), config.timecode_view, Olive::ActiveSequence->frame_rate); if (panel_timeline->trim_target > -1) { // find which clip is being moved const Ghost* g = nullptr; @@ -1595,7 +1595,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { } else { len += frame_diff; } - tip += frame_to_timecode(len, config.timecode_view, sequence->frame_rate); + tip += frame_to_timecode(len, config.timecode_view, Olive::ActiveSequence->frame_rate); } } QToolTip::showText(mapToGlobal(mouse_pos), tip); @@ -1604,7 +1604,7 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { tooltip_timer.stop(); - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { bool alt = (event->modifiers() & Qt::AltModifier); panel_timeline->cursor_frame = panel_timeline->getTimelineFrameFromScreenPoint(event->pos().x()); @@ -1619,12 +1619,12 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } if (panel_timeline->selecting) { int selection_count = 1 + qMax(panel_timeline->cursor_track, panel_timeline->drag_track_start) - qMin(panel_timeline->cursor_track, panel_timeline->drag_track_start) + panel_timeline->selection_offset; - if (sequence->selections.size() != selection_count) { - sequence->selections.resize(selection_count); + if (Olive::ActiveSequence->selections.size() != selection_count) { + Olive::ActiveSequence->selections.resize(selection_count); } int minimum_selection_track = qMin(panel_timeline->cursor_track, panel_timeline->drag_track_start); for (int i=panel_timeline->selection_offset;iselections[i]; + Selection& s = Olive::ActiveSequence->selections[i]; s.track = minimum_selection_track + i - panel_timeline->selection_offset; long in = panel_timeline->drag_frame_start; long out = panel_timeline->cursor_frame; @@ -1634,10 +1634,10 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { // select linked clips too if (config.edit_tool_selects_links) { - for (int j=0;jclips.size();j++) { - Clip* c = sequence->clips.at(j); - for (int k=0;kselections.size();k++) { - const Selection& s = sequence->selections.at(k); + for (int j=0;jclips.size();j++) { + Clip* c = Olive::ActiveSequence->clips.at(j); + for (int k=0;kselections.size();k++) { + const Selection& s = Olive::ActiveSequence->selections.at(k); if (!(c->timeline_in < s.in && c->timeline_out < s.in) && !(c->timeline_in > s.out && c->timeline_out > s.out) && c->track == s.track) { @@ -1645,8 +1645,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { QVector linked_tracks = panel_timeline->get_tracks_of_linked_clips(j); for (int k=0;kselections.size();l++) { - const Selection& test_sel = sequence->selections.at(l); + for (int l=0;lselections.size();l++) { + const Selection& test_sel = Olive::ActiveSequence->selections.at(l); if (test_sel.track == linked_tracks.at(k) && test_sel.in == s.in && test_sel.out == s.out) { @@ -1659,7 +1659,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { link_sel.in = s.in; link_sel.out = s.out; link_sel.track = linked_tracks.at(k); - sequence->selections.append(link_sel); + Olive::ActiveSequence->selections.append(link_sel); } } @@ -1701,8 +1701,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } else { // set up movement // create ghosts - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { Ghost g; g.transition = nullptr; @@ -1712,8 +1712,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { // if a whole clip is not selected, maybe just a transition is if (panel_timeline->tool == TIMELINE_TOOL_POINTER && (c->get_opening_transition() != nullptr || c->get_closing_transition() != nullptr)) { // check if any selections contain the whole clip or transition - for (int j=0;jselections.size();j++) { - const Selection& s = sequence->selections.at(j); + for (int j=0;jselections.size();j++) { + const Selection& s = Olive::ActiveSequence->selections.at(j); if (s.track == c->track) { if (selection_contains_transition(s, c, TA_OPENING_TRANSITION)) { g.transition = c->get_opening_transition(); @@ -1750,11 +1750,11 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { int size = panel_timeline->ghosts.size(); if (panel_timeline->tool == TIMELINE_TOOL_ROLLING) { for (int i=0;iclips.at(panel_timeline->ghosts.at(i).clip); + Clip* ghost_clip = Olive::ActiveSequence->clips.at(panel_timeline->ghosts.at(i).clip); // see if any ghosts are touching, in which case flip them for (int k=0;kclips.at(panel_timeline->ghosts.at(k).clip); + Clip* comp_clip = Olive::ActiveSequence->clips.at(panel_timeline->ghosts.at(k).clip); if ((panel_timeline->trim_in_point && comp_clip->timeline_out == ghost_clip->timeline_in) || (!panel_timeline->trim_in_point && comp_clip->timeline_in == ghost_clip->timeline_out)) { panel_timeline->ghosts[k].trim_in = !panel_timeline->trim_in_point; @@ -1765,9 +1765,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { // then look for other clips we're touching for (int i=0;ighosts.at(i); - Clip* ghost_clip = sequence->clips.at(g.clip); - for (int j=0;jclips.size();j++) { - Clip* comp_clip = sequence->clips.at(j); + Clip* ghost_clip = Olive::ActiveSequence->clips.at(g.clip); + for (int j=0;jclips.size();j++) { + Clip* comp_clip = Olive::ActiveSequence->clips.at(j); if (comp_clip->track == ghost_clip->track) { if ((panel_timeline->trim_in_point && comp_clip->timeline_out == ghost_clip->timeline_in) || (!panel_timeline->trim_in_point && comp_clip->timeline_in == ghost_clip->timeline_out)) { @@ -1804,10 +1804,10 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } else if (panel_timeline->tool == TIMELINE_TOOL_SLIDE) { for (int i=0;ighosts.at(i); - Clip* ghost_clip = sequence->clips.at(g.clip); + Clip* ghost_clip = Olive::ActiveSequence->clips.at(g.clip); panel_timeline->ghosts[i].trimming = false; - for (int j=0;jclips.size();j++) { - Clip* c = sequence->clips.at(j); + for (int j=0;jclips.size();j++) { + Clip* c = Olive::ActiveSequence->clips.at(j); if (c != nullptr && c->track == ghost_clip->track) { bool found = false; for (int k=0;kghosts.size();i++) { - Clip* c = sequence->clips.at(panel_timeline->ghosts.at(i).clip); + Clip* c = Olive::ActiveSequence->clips.at(panel_timeline->ghosts.at(i).clip); if (panel_timeline->trim_in_point) { axis = qMin(axis, c->timeline_in); } else { @@ -1847,8 +1847,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } } - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && !is_clip_selected(c, true)) { bool clip_is_post = (c->timeline_in >= axis); @@ -1874,8 +1874,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } // store selections - selection_command = new SetSelectionsCommand(sequence); - selection_command->old_data = sequence->selections; + selection_command = new SetSelectionsCommand(Olive::ActiveSequence); + selection_command->old_data = Olive::ActiveSequence->selections; panel_timeline->moving_proc = true; } @@ -1923,8 +1923,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { int track_max = qMax(track_start, track_end); QVector selected_clips; - for (int i=0;iclips.size();i++) { - Clip* clip = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* clip = Olive::ActiveSequence->clips.at(i); if (clip != nullptr && clip->track >= track_min && clip->track <= track_max && @@ -1935,7 +1935,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { if (!alt) { for (int j=0;jlinked.size();j++) { - session_clips.append(sequence->clips.at(clip->linked.at(j))); + session_clips.append(Olive::ActiveSequence->clips.at(clip->linked.at(j))); } } @@ -1956,9 +1956,9 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } } - sequence->selections.resize(selected_clips.size() + panel_timeline->selection_offset); + Olive::ActiveSequence->selections.resize(selected_clips.size() + panel_timeline->selection_offset); for (int i=0;iselections[i+panel_timeline->selection_offset]; + Selection& s = Olive::ActiveSequence->selections[i+panel_timeline->selection_offset]; Clip* clip = selected_clips.at(i); s.old_in = s.in = clip->timeline_in; s.old_out = s.out = clip->timeline_out; @@ -2020,8 +2020,8 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { panel_timeline->trim_target = -1; // loop through current clips in the sequence - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr) { // cache track range @@ -2195,7 +2195,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { if (panel_timeline->transition_tool_proc) { update_ghosts(event->pos(), event->modifiers() & Qt::ShiftModifier); } else { - Clip* c = sequence->clips.at(panel_timeline->transition_tool_pre_clip); + Clip* c = Olive::ActiveSequence->clips.at(panel_timeline->transition_tool_pre_clip); Ghost g; @@ -2212,7 +2212,7 @@ void TimelineWidget::mouseMoveEvent(QMouseEvent *event) { } else { int mouse_clip = getClipIndexFromCoords(panel_timeline->cursor_frame, panel_timeline->cursor_track); if (mouse_clip > -1) { - Clip* c = sequence->clips.at(mouse_clip); + Clip* c = Olive::ActiveSequence->clips.at(mouse_clip); if (same_sign(c->track, panel_timeline->transition_tool_side)) { panel_timeline->transition_tool_pre_clip = mouse_clip; long halfway = c->timeline_in + (c->getLength()/2); @@ -2350,14 +2350,14 @@ void draw_transition(QPainter& p, Clip* c, const QRect& clip_rect, QRect& text_r void TimelineWidget::paintEvent(QPaintEvent*) { // Draw clips - if (sequence != nullptr) { + if (Olive::ActiveSequence != nullptr) { QPainter p(this); // get widget width and height int video_track_limit = 0; int audio_track_limit = 0; - for (int i=0;iclips.size();i++) { - Clip* clip = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* clip = Olive::ActiveSequence->clips.at(i); if (clip != nullptr) { video_track_limit = qMin(video_track_limit, clip->track); audio_track_limit = qMax(audio_track_limit, clip->track); @@ -2380,8 +2380,8 @@ void TimelineWidget::paintEvent(QPaintEvent*) { scrollBar->setMaximum(qMax(0, panel_height - height())); } - for (int i=0;iclips.size();i++) { - Clip* clip = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* clip = Olive::ActiveSequence->clips.at(i); if (clip != nullptr && is_track_visible(clip->track)) { QRect clip_rect(panel_timeline->getTimelineScreenPointFromFrame(clip->timeline_in), getScreenPointFromTrack(clip->track), getScreenPointFromFrame(panel_timeline->zoom, clip->getLength()), panel_timeline->calculate_track_height(clip->track, -1)); QRect text_rect(clip_rect.left() + CLIP_TEXT_PADDING, clip_rect.top() + CLIP_TEXT_PADDING, clip_rect.width() - CLIP_TEXT_PADDING - 1, clip_rect.height() - CLIP_TEXT_PADDING - 1); @@ -2665,8 +2665,8 @@ void TimelineWidget::paintEvent(QPaintEvent*) { } // Draw selections - for (int i=0;iselections.size();i++) { - const Selection& s = sequence->selections.at(i); + for (int i=0;iselections.size();i++) { + const Selection& s = Olive::ActiveSequence->selections.at(i); if (is_track_visible(s.track)) { int selection_y = getScreenPointFromTrack(s.track); int selection_x = panel_timeline->getTimelineScreenPointFromFrame(s.in); @@ -2743,7 +2743,7 @@ void TimelineWidget::paintEvent(QPaintEvent*) { // Draw playhead p.setPen(Qt::red); - int playhead_x = panel_timeline->getTimelineScreenPointFromFrame(sequence->playhead); + int playhead_x = panel_timeline->getTimelineScreenPointFromFrame(Olive::ActiveSequence->playhead); p.drawLine(playhead_x, rect().top(), playhead_x, rect().bottom()); // draw border @@ -2817,8 +2817,8 @@ int TimelineWidget::getScreenPointFromTrack(int track) { } int TimelineWidget::getClipIndexFromCoords(long frame, int track) { - for (int i=0;iclips.size();i++) { - Clip* c = sequence->clips.at(i); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); if (c != nullptr && c->track == track && frame >= c->timeline_in && frame < c->timeline_out) { return i; } From da9c72c1d5b6fbb6ab4d9c9ba9e9a7f15880969e Mon Sep 17 00:00:00 2001 From: elsandosgrande Date: Thu, 14 Feb 2019 20:17:26 +0100 Subject: [PATCH 177/202] Bosnian and Serbian translations, fourth iteration --- ts/olive_bs.ts | 92 +++++++++++++++++++++++++----------------------- ts/olive_sr.ts | 95 ++++++++++++++++++++++++++------------------------ 2 files changed, 99 insertions(+), 88 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 6e4e0dce3..06ebc936e 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -321,93 +321,93 @@ Export "%1" - + Izvoz "%1" Unknown codec name %1 - + Nepoznato ime kodeka %1 Export Failed - + Izvoz neuspješan Export failed - %1 - + Izvoz neuspješan - %1 Invalid dimensions - + Nevažeće dimenzije Export width and height must both be even numbers/divisible by 2. - + Visina i širina izvoza obje moraju biti parni brojevi/djeljive sa dva. Invalid codec - + Nevažeći kodek Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Parametri odabranog kodeka se nisu mogli odrediti. Ovo je greška, molimo da kontaktirate developere. Invalid format - + Nevažeći format Couldn't determine output format. This is a bug, please contact the developers. - + Izlazni format se nije mogao odrediti. Ovo je greška, molimo da kontaktirate developere. Export Media - + Izvoz medija Quality-based (Constant Rate Factor) - + Bazirano na kvaliteti (Faktor stalne stope/Constant Rate Factor) Constant Bitrate - + Stalna stopa bitova Invalid Codec - + Nevažeći kodek Failed to find a suitable encoder for this codec. Export will likely fail. - + Traganje za prikladnim koderom za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. Failed to find pixel format for this encoder. Export will likely fail. - + Traganje za prikladnim formatom piksela za ovaj kodek nije uspjelo. Izvoz najvjerovatnije neće uspjeti. Bitrate (Mbps): - + Stopa bitova (Mbps): Quality (CRF): - + Kvaliteta (CRF): @@ -417,78 +417,84 @@ 17-18 = visually lossless (compressed, but unnoticeable) 23 = high quality 51 = lowest quality possible - + Faktor kvalitete: + +0 = besprijekorno +17-18 = oku besprijekorno (komprimirano, ali neprimjetno) +23 = visoka kvaliteta +51 = najniža kvaliteta moguća Target File Size (MB): - + Željena veličina datoteke (MB): Format: - + Format: Range: - + Raspon: Entire Sequence - + Čitava sekvenca In to Out - + I have no clue what to call this really, it only plays sound, but that's not in the name, so I can't mention sound, so I assume that "in" and "out" reference the in and out points respectively. + Od početka do kraja Video - + Video Codec: - + Kodek: Width: - + Širina: Height: - + Visina: Frame Rate: - + Okvirna stopa: Compression Type: - + Tip komprimacije: Advanced - + Napredno Sampling Rate: - + Stopa uzoraka: Bitrate (Kbps/CBR): - + Stopa bitova (Kbps/CBR): @@ -946,7 +952,7 @@ Cu&t - + &Reži @@ -956,7 +962,7 @@ &Paste - + &Zalijepi @@ -1517,7 +1523,7 @@ Frame Rate: - + Okvirna stopa: @@ -1696,22 +1702,22 @@ Audio Layout: %6 Video - + Video Width: - + Širina: Height: - + Visina: Frame Rate: - + Okvirna stopa: @@ -2202,7 +2208,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Format: - + Format: @@ -2528,7 +2534,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Frame Rate: - + Okvirna stopa: @@ -2902,7 +2908,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff &Paste - + &Zalijepi diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index 01fd8832d..8dcae4bcb 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -265,7 +265,7 @@ VIDEO EFFECTS - ВИДЕО ЕФЕКТИ + Видео ефекти @@ -280,7 +280,7 @@ AUDIO EFFECTS - АУДИО ЕФЕКТИ + Аудио ефекти @@ -319,93 +319,93 @@ Export "%1" - + Извоз "%1" Unknown codec name %1 - + Непознато име кодека %1 Export Failed - + Извоз неуспешан Export failed - %1 - + Извоз неуспешан - %1 Invalid dimensions - + Неважеће димензије Export width and height must both be even numbers/divisible by 2. - + Висина и ширина извоза обе морају бити парни бројеви/дељиве са два. Invalid codec - + Неважећи кодек Couldn't determine output parameters for the selected codec. This is a bug, please contact the developers. - + Параметри одабраног кодека се нису могли одредити. Ово је грешка, молимо да контактирате девелопере. Invalid format - + Неважећи формат Couldn't determine output format. This is a bug, please contact the developers. - + Излазни формат се није могао одредити. Ово је грешка, молимо да контактирате девелопере. Export Media - + Извоз медија Quality-based (Constant Rate Factor) - + Базирано на квалитети (Фактор сталне стопе/Constant Rate Factor) Constant Bitrate - + Стална стопа битова Invalid Codec - + Неважећи кодек Failed to find a suitable encoder for this codec. Export will likely fail. - + Трагање за пркладним кодером за овај кодек није успело. Извоз највероватније неће успети. Failed to find pixel format for this encoder. Export will likely fail. - + Трагање за прикладним форматом пиксела за овај кодек није успело. Извоз највероватније неће успети. Bitrate (Mbps): - + Стопа битова (Mbps): Quality (CRF): - + Квалитета (CRF): @@ -415,78 +415,83 @@ 17-18 = visually lossless (compressed, but unnoticeable) 23 = high quality 51 = lowest quality possible - + Фактор квалитете: + +0 = беспрекорно +17-18 = оку беспрекорно (компримирано, али неприметљиво) +23 = висока квалитета +51 = најнижа квалитета могућа Target File Size (MB): - + Жељена величина датотеке (MB): Format: - + Формат: Range: - + Распон: Entire Sequence - + Читава секвенца In to Out - + Од почетка до краја Video - + Видео Codec: - + Кодек: Width: - + Ширина: Height: - + Висина: Frame Rate: - + Оквирна стопа: Compression Type: - + Тип компримације: Advanced - + Напредно Sampling Rate: - + Стопа узорака: Bitrate (Kbps/CBR): - + Стопа битова (Kbps/CBR): @@ -944,7 +949,7 @@ Cu&t - + &Режи @@ -954,7 +959,7 @@ &Paste - + &Залепи @@ -1515,7 +1520,7 @@ Frame Rate: - + Оквирна стопа: @@ -1694,22 +1699,22 @@ Audio Layout: %6 Video - + Видео Width: - + Ширина: Height: - + Висина: Frame Rate: - + Оквирна стопа: @@ -2200,7 +2205,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Format: - + Формат: @@ -2526,7 +2531,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff Frame Rate: - + Оквирна стопа: @@ -2900,7 +2905,7 @@ Seek quickly (may briefly show inaccurate frames when seeking - doesn't aff &Paste - + &Залепи From ad74b6018ffdb67abf91cecd682a8d82a912f826 Mon Sep 17 00:00:00 2001 From: elsandosgrande Date: Thu, 14 Feb 2019 21:16:03 +0100 Subject: [PATCH 178/202] Bosnian and Serbian translations, fith iteration --- ts/olive_bs.ts | 35 ++++++++++++++++++----------------- ts/olive_sr.ts | 34 +++++++++++++++++----------------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/ts/olive_bs.ts b/ts/olive_bs.ts index 06ebc936e..07591fb53 100644 --- a/ts/olive_bs.ts +++ b/ts/olive_bs.ts @@ -502,87 +502,88 @@ failed to send frame to encoder (%1) - + Slanje okvira koderu nije uspjelo (%1) failed to receive packet from encoder (%1) - + Primanje paketa od kodera nije uspjelo (%1) could not video encoder for %1 - + Nije mogao video koder za %1 could not allocate video stream - + Video tok se nije mogao zauzeti could not allocate video encoding context - + Kontekst video kodiranja se nije moago zauzeti could not open output video encoder (%1) - + Izlazni video koder se nije moago otvoriti (%1) could not copy video encoder parameters to output stream (%1) - + Parametri video kodera se nisu mogli kopirati u izlazni tok (%1) could not audio encoder for %1 - + Not sure if there should be anything in between "not" and "audio" + Nije mogao audio koder za %1 could not allocate audio stream - + Audio tok se nije mogao zauzeti could not allocate audio encoding context - + Kontekst audio kodiranja se nije mogao zauzeti could not open output audio encoder (%1) - + Izlaz audio kodera se nije mogao otvoriti (%1) could not copy audio encoder parameters to output stream (%1) - + Parametri audio kodera se nisu mogli kopirati u izlazni tok (%1) could not allocate audio buffer (%1) - + Audio međuspremnik se nije mogao zauzeti (%1) could not create output format context - + Kontekst izlaznog formata se nije mogao stvoriti could not open output file (%1) - + Izlazna datoteka se nije mogla otvoriti (%1) could not write output file header (%1) - + Zaglavlje izlazne datoteke se nije moglo ispisati (%1) could not write output file trailer (%1) - + Zaglavlje izlazne datoteke se nije moglo ispisati (%1) diff --git a/ts/olive_sr.ts b/ts/olive_sr.ts index 8dcae4bcb..4b5302fd3 100644 --- a/ts/olive_sr.ts +++ b/ts/olive_sr.ts @@ -499,87 +499,87 @@ failed to send frame to encoder (%1) - + Слање оквира кодеру није успело (%1) failed to receive packet from encoder (%1) - + Примање пакета од кодера није успело (%1) could not video encoder for %1 - + Није могао видео кодер за %1 could not allocate video stream - + Видео ток се није могао заузети could not allocate video encoding context - + Контекст видео кодирања се није могао заузети could not open output video encoder (%1) - + Излазни видео кодер се није могао отворити (%1) could not copy video encoder parameters to output stream (%1) - + Параметри видео кодера се нису могли копирати у излазни ток (%1) could not audio encoder for %1 - + Није могао аудио кодер за %1 could not allocate audio stream - + Аудио ток се није могао заузети could not allocate audio encoding context - + Контекст аудио кодирања се није могао заузети could not open output audio encoder (%1) - + Излаз аудио кодера се није могао отворити (%1) could not copy audio encoder parameters to output stream (%1) - + Параметри аудио кодера се нису могли копирати у излазни ток (%1) could not allocate audio buffer (%1) - + Аудио међуспремник се није могао заузети (%1) could not create output format context - + Контекст излазног формата се није могао створити could not open output file (%1) - + Излазна датотека се није могла отворити (%1) could not write output file header (%1) - + Заглавље излазне датотеке се није могло исписати (%1) could not write output file trailer (%1) - + Подножје излазне датотеке се није могло исписати (%1) From abe76c794116cd9c8559f5988b09aac98d55ac0e Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Feb 2019 12:37:30 -0800 Subject: [PATCH 179/202] further improvements --- dialogs/mediapropertiesdialog.cpp | 2 +- dialogs/newsequencedialog.cpp | 4 +- dialogs/replaceclipmediadialog.cpp | 2 +- dialogs/speeddialog.cpp | 2 +- effects/internal/vsthost.cpp | 2 + io/avtogl.cpp | 19 - io/avtogl.h | 9 - mainwindow.cpp | 74 +-- mainwindow.h | 7 +- olive.pro | 2 - oliveglobal.cpp | 4 +- panels/effectcontrols.cpp | 6 +- panels/project.cpp | 12 +- panels/timeline.cpp | 40 +- panels/timeline.h | 6 +- panels/viewer.cpp | 8 +- playback/playback.cpp | 11 +- project/effect.cpp | 10 +- project/effectfield.cpp | 2 +- project/effectrow.cpp | 6 +- project/keyframe.cpp | 2 +- project/marker.cpp | 4 +- project/marker.h | 2 +- project/media.cpp | 2 +- project/sourcescommon.cpp | 8 +- project/undo.cpp | 844 +++++++++++++---------------- project/undo.h | 457 ++++++++-------- ui/checkboxex.cpp | 2 +- ui/graphview.cpp | 6 +- ui/keyframeview.cpp | 4 +- ui/renderfunctions.cpp | 7 +- ui/renderthread.cpp | 2 + ui/timelineheader.cpp | 12 +- ui/timelinewidget.cpp | 34 +- ui/viewerwidget.cpp | 1 - 35 files changed, 737 insertions(+), 878 deletions(-) delete mode 100644 io/avtogl.cpp delete mode 100644 io/avtogl.h diff --git a/dialogs/mediapropertiesdialog.cpp b/dialogs/mediapropertiesdialog.cpp index 992513654..be2d3752e 100644 --- a/dialogs/mediapropertiesdialog.cpp +++ b/dialogs/mediapropertiesdialog.cpp @@ -185,7 +185,7 @@ void MediaPropertiesDialog::accept() { } ca->appendPost(new UpdateViewer()); - undo_stack.push(ca); + Olive::UndoStack.push(ca); QDialog::accept(); } diff --git a/dialogs/newsequencedialog.cpp b/dialogs/newsequencedialog.cpp index b80fde74f..054c3e065 100644 --- a/dialogs/newsequencedialog.cpp +++ b/dialogs/newsequencedialog.cpp @@ -76,7 +76,7 @@ void NewSequenceDialog::create() { ComboAction* ca = new ComboAction(); panel_project->new_sequence(ca, s, true, nullptr); - undo_stack.push(ca); + Olive::UndoStack.push(ca); } else { ComboAction* ca = new ComboAction(); @@ -98,7 +98,7 @@ void NewSequenceDialog::create() { } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); } accept(); diff --git a/dialogs/replaceclipmediadialog.cpp b/dialogs/replaceclipmediadialog.cpp index 49a2940b2..73face296 100644 --- a/dialogs/replaceclipmediadialog.cpp +++ b/dialogs/replaceclipmediadialog.cpp @@ -101,7 +101,7 @@ void ReplaceClipMediaDialog::replace() { } } - undo_stack.push(rcmc); + Olive::UndoStack.push(rcmc); close(); } diff --git a/dialogs/speeddialog.cpp b/dialogs/speeddialog.cpp index f00e39bb4..cfd8ef5a4 100644 --- a/dialogs/speeddialog.cpp +++ b/dialogs/speeddialog.cpp @@ -405,7 +405,7 @@ void SpeedDialog::accept() { sel_command->new_data = Olive::ActiveSequence->selections; ca->append(sel_command); - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); QDialog::accept(); diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index 0709bd027..710dc6e6b 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -36,6 +36,8 @@ struct VSTRect { extern "C" { // Main host callback intptr_t hostCallback(AEffect* effect, int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) { + Q_UNUSED(value) + switch(opcode) { case audioMasterAutomate: effect->setParameter(effect, index, opt); diff --git a/io/avtogl.cpp b/io/avtogl.cpp deleted file mode 100644 index 3b2e39c4e..000000000 --- a/io/avtogl.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "avtogl.h" - -extern "C" { - #include -} - -enum QOpenGLTexture::PixelFormat get_gl_pix_fmt_from_av(int format) { - /*switch (format) { - case AV_PIX_FMT_RGB24: return QOpenGLTexture::RGB; - }*/ - return QOpenGLTexture::RGBA; -} - -enum QOpenGLTexture::TextureFormat get_gl_tex_fmt_from_av(int format) { - /*switch (format) { - case AV_PIX_FMT_RGB24: return QOpenGLTexture::RGB8_UNorm; - }*/ - return QOpenGLTexture::RGBA8_UNorm; -} diff --git a/io/avtogl.h b/io/avtogl.h deleted file mode 100644 index b2bfd1e34..000000000 --- a/io/avtogl.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef AVTOGL_H -#define AVTOGL_H - -#include - -enum QOpenGLTexture::PixelFormat get_gl_pix_fmt_from_av(int format); -enum QOpenGLTexture::TextureFormat get_gl_tex_fmt_from_av(int format); - -#endif // AVTOGL_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 9c796a229..4a1780f6a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -432,20 +432,24 @@ void MainWindow::ripple_delete() { } void MainWindow::editMenu_About_To_Be_Shown() { - undo_action->setEnabled(undo_stack.canUndo()); - redo_action->setEnabled(undo_stack.canRedo()); + undo_action->setEnabled(Olive::UndoStack.canUndo()); + redo_action->setEnabled(Olive::UndoStack.canRedo()); } void MainWindow::undo() { - if (!panel_timeline->importing) { // workaround to prevent crash (and also users should never need to do this) - undo_stack.undo(); + // workaround to prevent crash (and also users should never need to do this) + if (!panel_timeline->importing) { + Olive::UndoStack.undo(); update_ui(true); } } void MainWindow::redo() { - undo_stack.redo(); - update_ui(true); + // workaround to prevent crash (and also users should never need to do this) + if (!panel_timeline->importing) { + Olive::UndoStack.redo(); + update_ui(true); + } } void MainWindow::open_speed_dialog() { @@ -558,7 +562,7 @@ void MainWindow::setup_menus() { edit_menu->addAction(tr("Add Default Transition"), this, SLOT(add_default_transition()), QKeySequence("Ctrl+Shift+D"))->setProperty("id", "deftransition"); edit_menu->addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links()), QKeySequence("Ctrl+L"))->setProperty("id", "linkunlink"); - edit_menu->addAction(tr("Enable/Disable"), this, SLOT(toggle_enable_clips()), QKeySequence("Shift+E"))->setProperty("id", "enabledisable"); + edit_menu->addAction(tr("Enable/Disable"), panel_timeline, SLOT(toggle_enable_on_selected_clips()), QKeySequence("Shift+E"))->setProperty("id", "enabledisable"); edit_menu->addAction(tr("Nest"), this, SLOT(nest()))->setProperty("id", "nest"); edit_menu->addSeparator(); @@ -585,8 +589,8 @@ void MainWindow::setup_menus() { view_menu->addAction(tr("Zoom In"), this, SLOT(zoom_in()), QKeySequence("="))->setProperty("id", "zoomin"); view_menu->addAction(tr("Zoom Out"), this, SLOT(zoom_out()), QKeySequence("-"))->setProperty("id", "zoomout"); - view_menu->addAction(tr("Increase Track Height"), this, SLOT(zoom_in_tracks()), QKeySequence("Ctrl+="))->setProperty("id", "vzoomin"); - view_menu->addAction(tr("Decrease Track Height"), this, SLOT(zoom_out_tracks()), QKeySequence("Ctrl+-"))->setProperty("id", "vzoomout"); + view_menu->addAction(tr("Increase Track Height"), panel_timeline, SLOT(increase_track_height()), QKeySequence("Ctrl+="))->setProperty("id", "vzoomin"); + view_menu->addAction(tr("Decrease Track Height"), panel_timeline, SLOT(decrease_track_height()), QKeySequence("Ctrl+-"))->setProperty("id", "vzoomout"); show_all = view_menu->addAction(tr("Toggle Show All"), panel_timeline, SLOT(toggle_show_all()), QKeySequence("\\")); show_all->setProperty("id", "showall"); @@ -672,8 +676,8 @@ void MainWindow::setup_menus() { playback_menu->addAction(tr("Next Frame"), this, SLOT(next_frame()), QKeySequence("Right"))->setProperty("id", "nextframe"); playback_menu->addAction(tr("Go to End"), this, SLOT(go_to_end()), QKeySequence("End"))->setProperty("id", "gotoend"); playback_menu->addSeparator(); - playback_menu->addAction(tr("Go to Previous Cut"), this, SLOT(prev_cut()), QKeySequence("Up"))->setProperty("id", "prevcut"); - playback_menu->addAction(tr("Go to Next Cut"), this, SLOT(next_cut()), QKeySequence("Down"))->setProperty("id", "nextcut"); + playback_menu->addAction(tr("Go to Previous Cut"), panel_timeline, SLOT(previous_cut()), QKeySequence("Up"))->setProperty("id", "prevcut"); + playback_menu->addAction(tr("Go to Next Cut"), panel_timeline, SLOT(next_cut()), QKeySequence("Down"))->setProperty("id", "nextcut"); playback_menu->addSeparator(); playback_menu->addAction(tr("Go to In Point"), this, SLOT(go_to_in()), QKeySequence("Shift+I"))->setProperty("id", "gotoin"); playback_menu->addAction(tr("Go to Out Point"), this, SLOT(go_to_out()), QKeySequence("Shift+O"))->setProperty("id", "gotoout"); @@ -975,7 +979,7 @@ void MainWindow::paintEvent(QPaintEvent *event) { } void MainWindow::clear_undo_stack() { - undo_stack.clear(); + Olive::UndoStack.clear(); } void MainWindow::show_action_search() { @@ -1086,20 +1090,6 @@ void MainWindow::decrease_speed() { } } -void MainWindow::prev_cut() { - QDockWidget* focused_panel = get_focused_panel(); - if (Olive::ActiveSequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { - panel_timeline->previous_cut(); - } -} - -void MainWindow::next_cut() { - QDockWidget* focused_panel = get_focused_panel(); - if (Olive::ActiveSequence != nullptr && (panel_timeline == focused_panel || panel_sequence_viewer == focused_panel)) { - panel_timeline->next_cut(); - } -} - void MainWindow::maximize_panel() { // toggles between normal state and a state of one panel being maximized if (temp_panel_state.isEmpty()) { @@ -1137,14 +1127,6 @@ void MainWindow::preferences() { pd.exec(); } -void MainWindow::zoom_in_tracks() { - panel_timeline->increase_track_height(); -} - -void MainWindow::zoom_out_tracks() { - panel_timeline->decrease_track_height(); -} - void MainWindow::full_screen_viewer() { if (get_focused_panel() == panel_footage_viewer) { panel_footage_viewer->viewer_widget->set_fullscreen(); @@ -1229,7 +1211,7 @@ void MainWindow::add_default_transition() { void MainWindow::new_folder() { Media* m = panel_project->new_folder(nullptr); - undo_stack.push(new AddMediaCommand(m, panel_project->get_selected_folder())); + Olive::UndoStack.push(new AddMediaCommand(m, panel_project->get_selected_folder())); QModelIndex index = project_model.create_index(m->row(), 0, m); switch (config.project_view_type) { @@ -1393,26 +1375,6 @@ void MainWindow::set_marker() { } } -void MainWindow::toggle_enable_clips() { - if (Olive::ActiveSequence != nullptr) { - ComboAction* ca = new ComboAction(); - bool push_undo = false; - for (int i=0;iclips.size();i++) { - Clip* c = Olive::ActiveSequence->clips.at(i); - if (c != nullptr && is_clip_selected(c, true)) { - ca->append(new SetEnableCommand(c, !c->enabled)); - push_undo = true; - } - } - if (push_undo) { - undo_stack.push(ca); - update_ui(true); - } else { - delete ca; - } - } -} - void MainWindow::edit_to_in_point() { QDockWidget* focused_panel = get_focused_panel(); if (focused_panel == panel_timeline) panel_timeline->ripple_to_in_point(true, false); @@ -1478,7 +1440,7 @@ void MainWindow::nest() { panel_effect_controls->clear_effects(true); Olive::ActiveSequence->selections.clear(); - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); } diff --git a/mainwindow.h b/mainwindow.h index 96c84b08c..92514b300 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -16,8 +16,6 @@ public: void updateTitle(); - void launch_with_project(const QString& s); - void load_shortcuts(const QString &fn, bool first = false); void save_shortcuts(const QString &fn); @@ -74,10 +72,7 @@ private slots: void maximize_panel(); void reset_layout(); - void preferences(); - - void zoom_in_tracks(); - void zoom_out_tracks(); + void preferences(); void full_screen_viewer(); diff --git a/olive.pro b/olive.pro index 76763b4b9..ab11ef443 100644 --- a/olive.pro +++ b/olive.pro @@ -112,7 +112,6 @@ SOURCES += \ project/effectgizmo.cpp \ io/clipboard.cpp \ dialogs/stabilizerdialog.cpp \ - io/avtogl.cpp \ ui/resizablescrollbar.cpp \ ui/sourceiconview.cpp \ project/sourcescommon.cpp \ @@ -219,7 +218,6 @@ HEADERS += \ project/effectgizmo.h \ io/clipboard.h \ dialogs/stabilizerdialog.h \ - io/avtogl.h \ ui/resizablescrollbar.h \ ui/sourceiconview.h \ project/sourcescommon.h \ diff --git a/oliveglobal.cpp b/oliveglobal.cpp index da97a9e58..2767eb8c8 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -86,7 +86,7 @@ void OliveGlobal::new_project() { panel_project->new_project(); // clear undo stack - undo_stack.clear(); + Olive::UndoStack.clear(); // empty current project filename update_project_filename(""); @@ -188,5 +188,5 @@ void OliveGlobal::save_autorecovery_file() { void OliveGlobal::open_project_worker(const QString& fn, bool autorecovery) { update_project_filename(fn); panel_project->load_project(autorecovery); - undo_stack.clear(); + Olive::UndoStack.clear(); } diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 0dec04212..76dde43c1 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -95,7 +95,7 @@ void EffectControls::menu_select(QAction* q) { } } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); if (effect_menu_type == EFFECT_TYPE_TRANSITION) { update_ui(true); } else { @@ -146,7 +146,7 @@ void EffectControls::copy(bool del) { delete del_com; } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); } } @@ -529,7 +529,7 @@ void EffectControls::delete_effects() { } } if (command->clips.size() > 0) { - undo_stack.push(command); + Olive::UndoStack.push(command); panel_sequence_viewer->viewer_widget->frame_update(); } else { delete command; diff --git a/panels/project.cpp b/panels/project.cpp index 4126418f2..566d5083f 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -314,7 +314,7 @@ void Project::duplicate_selected() { } } if (duped) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); } else { delete ca; } @@ -340,7 +340,7 @@ void Project::replace_media(Media* item, QString filename) { } if (!filename.isEmpty()) { ReplaceMediaCommand* rmc = new ReplaceMediaCommand(item, filename); - undo_stack.push(rmc); + Olive::UndoStack.push(rmc); } } @@ -394,7 +394,7 @@ void Project::open_properties() { item->get_name()); if (!new_name.isEmpty()) { MediaRename* mr = new MediaRename(item, new_name); - undo_stack.push(mr); + Olive::UndoStack.push(mr); } } } @@ -608,7 +608,7 @@ void Project::delete_selected_media() { } } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); // redraw clips if (redraw) { @@ -785,7 +785,7 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla } if (create_undo_action) { if (imported) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); for (int i=0;iworkarea_in, Olive::ActiveSequence->workarea_in - Olive::ActiveSequence->workarea_out); ca->append(new SetTimelineInOutCommand(Olive::ActiveSequence, false, 0, 0)); - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); - } + } +} + +void Timeline::toggle_enable_on_selected_clips() { + if (Olive::ActiveSequence != nullptr) { + ComboAction* ca = new ComboAction(); + bool push_undo = false; + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); + if (c != nullptr && is_clip_selected(c, true)) { + ca->append(new SetBool(&c->enabled, !c->enabled)); + push_undo = true; + } + } + if (push_undo) { + Olive::UndoStack.push(ca); + update_ui(true); + } else { + delete ca; + } + } } void Timeline::delete_selection(QVector& selections, bool ripple_delete) { @@ -631,7 +651,7 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); } @@ -1065,7 +1085,7 @@ void Timeline::paste(bool insert) { ca->append(new AddClipCommand(Olive::ActiveSequence, pasted_clips)); - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); @@ -1139,8 +1159,8 @@ void Timeline::paste(bool insert) { } } if (push) { - ca->appendPost(new ReloadEffectsCommand()); - undo_stack.push(ca); + ca->appendPost(new ReloadEffectsCommand()); + Olive::UndoStack.push(ca); } else { delete ca; } @@ -1244,7 +1264,7 @@ void Timeline::ripple_to_in_point(bool in, bool ripple) { } if (push_undo) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); @@ -1353,7 +1373,7 @@ void Timeline::split_at_playhead() { } if (split_selected) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(true); } else { delete ca; @@ -1501,7 +1521,7 @@ void Timeline::toggle_links() { } } if (command->clips.size() > 0) { - undo_stack.push(command); + Olive::UndoStack.push(command); repaint_timeline(); } else { delete command; diff --git a/panels/timeline.h b/panels/timeline.h index 3dbf51eb2..af8ef47ce 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -95,8 +95,6 @@ public: bool has_clip_been_split(int c); void ripple_to_in_point(bool in, bool ripple); void delete_in_out(bool ripple); - void previous_cut(); - void next_cut(); void create_ghosts_from_media(Sequence *seq, long entry_point, QVector &media_list); void add_clips_from_ghosts(ComboAction *ca, Sequence *s); @@ -215,6 +213,10 @@ public slots: void toggle_links(); void split_at_playhead(); void ripple_delete_empty_space(); + void toggle_enable_on_selected_clips(); + + void previous_cut(); + void next_cut(); private slots: void zoom_in(); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 8a2b44fbc..681cf6fa8 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -440,7 +440,7 @@ void Viewer::pause() { QVector add_clips; add_clips.append(c); - undo_stack.push(new AddClipCommand(seq, add_clips)); // add clip + Olive::UndoStack.push(new AddClipCommand(seq, add_clips)); // add clip } } } @@ -500,21 +500,21 @@ void Viewer::update_viewer() { void Viewer::clear_in() { if (seq->using_workarea) { - undo_stack.push(new SetTimelineInOutCommand(seq, true, 0, seq->workarea_out)); + Olive::UndoStack.push(new SetTimelineInOutCommand(seq, true, 0, seq->workarea_out)); update_parents(); } } void Viewer::clear_out() { if (seq->using_workarea) { - undo_stack.push(new SetTimelineInOutCommand(seq, true, seq->workarea_in, seq->getEndFrame())); + Olive::UndoStack.push(new SetTimelineInOutCommand(seq, true, seq->workarea_in, seq->getEndFrame())); update_parents(); } } void Viewer::clear_inout_point() { if (seq->using_workarea) { - undo_stack.push(new SetTimelineInOutCommand(seq, false, 0, 0)); + Olive::UndoStack.push(new SetTimelineInOutCommand(seq, false, 0, 0)); update_parents(); } } diff --git a/playback/playback.cpp b/playback/playback.cpp index b293def72..babbaf094 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -12,7 +12,6 @@ #include "panels/effectcontrols.h" #include "project/media.h" #include "io/config.h" -#include "io/avtogl.h" #include "io/proxygenerator.h" #include "debug.h" @@ -36,8 +35,6 @@ extern "C" { //#define GCF_DEBUG #endif -bool rendering = false; - long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate) { return qRound((double(framenumber)/source_frame_rate)*target_frame_rate); } @@ -327,12 +324,16 @@ void get_clip_frame(Clip* c, long playhead, bool& texture_failed) { memcpy(data_buffer_1, target_frame->data[0], frame_size); } - e->process_image(get_timecode(c, playhead), using_db_1 ? data_buffer_1 : data_buffer_2, using_db_1 ? data_buffer_2 : data_buffer_1, frame_size); + e->process_image(get_timecode(c, playhead), + using_db_1 ? data_buffer_1 : data_buffer_2, + using_db_1 ? data_buffer_2 : data_buffer_1, + frame_size + ); using_db_1 = !using_db_1; } } - c->texture->setData(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8, const_cast(using_db_1 ? data_buffer_1 : data_buffer_2)); + c->texture->setData(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8, const_cast(using_db_1 ? data_buffer_1 : data_buffer_2)); if (data_buffer_1 != target_frame->data[0]) { delete [] data_buffer_1; diff --git a/project/effect.cpp b/project/effect.cpp index 1409d94cf..f32622d69 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -412,7 +412,7 @@ void Effect::delete_self() { EffectDeleteCommand* command = new EffectDeleteCommand(); command->clips.append(parent_clip); command->fx.append(get_index_in_clip()); - undo_stack.push(command); + Olive::UndoStack.push(command); update_ui(true); } @@ -421,7 +421,7 @@ void Effect::move_up() { command->clip = parent_clip; command->from = get_index_in_clip(); command->to = command->from - 1; - undo_stack.push(command); + Olive::UndoStack.push(command); panel_effect_controls->reload_clips(); panel_sequence_viewer->viewer_widget->frame_update(); } @@ -431,7 +431,7 @@ void Effect::move_down() { command->clip = parent_clip; command->from = get_index_in_clip(); command->to = command->from + 1; - undo_stack.push(command); + Olive::UndoStack.push(command); panel_effect_controls->reload_clips(); panel_sequence_viewer->viewer_widget->frame_update(); } @@ -478,7 +478,7 @@ void Effect::load_from_file() { QFile file_handle(file); if (file_handle.open(QFile::ReadOnly)) { - undo_stack.push(new SetEffectData(this, file_handle.readAll())); + Olive::UndoStack.push(new SetEffectData(this, file_handle.readAll())); file_handle.close(); @@ -942,7 +942,7 @@ void Effect::gizmo_move(EffectGizmo* gizmo, int x_movement, int y_movement, doub gizmo->y_field2->set_double_value(gizmo->y_field2->get_double_value(timecode) + y_movement*gizmo->y_field_multi2); gizmo->y_field2->make_key_from_change(ca); } - if (done) undo_stack.push(ca); + if (done) Olive::UndoStack.push(ca); break; } } diff --git a/project/effectfield.cpp b/project/effectfield.cpp index 44461f168..b1569169e 100644 --- a/project/effectfield.cpp +++ b/project/effectfield.cpp @@ -329,7 +329,7 @@ void EffectField::ui_element_change() { ComboAction* ca = nullptr; if (!dragging_double) ca = new ComboAction(); make_key_from_change(ca); - if (!dragging_double) undo_stack.push(ca); + if (!dragging_double) Olive::UndoStack.push(ca); emit changed(); } diff --git a/project/effectrow.cpp b/project/effectrow.cpp index fb3849849..464ae55fa 100644 --- a/project/effectrow.cpp +++ b/project/effectrow.cpp @@ -71,7 +71,7 @@ void EffectRow::set_keyframe_enabled(bool enabled) { ComboAction* ca = new ComboAction(); ca->append(new SetKeyframing(this, true)); set_keyframe_now(ca); - undo_stack.push(ca); + Olive::UndoStack.push(ca); } else { if (QMessageBox::question(panel_effect_controls, tr("Disable Keyframes"), @@ -86,7 +86,7 @@ void EffectRow::set_keyframe_enabled(bool enabled) { } } ca->append(new SetKeyframing(this, false)); - undo_stack.push(ca); + Olive::UndoStack.push(ca); panel_effect_controls->update_keyframes(); } else { setKeyframing(true); @@ -133,7 +133,7 @@ void EffectRow::toggle_key() { ca->append(new KeyframeDelete(key_fields.at(i), key_field_index.at(i))); } } - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(false); } diff --git a/project/keyframe.cpp b/project/keyframe.cpp index 09b73be75..6bc5a941c 100644 --- a/project/keyframe.cpp +++ b/project/keyframe.cpp @@ -38,7 +38,7 @@ void delete_keyframes(QVector& selected_key_fields, QVector for (int i=0;iappend(new KeyframeDelete(fields.at(i), key_indices.at(i))); } - undo_stack.push(ca); + Olive::UndoStack.push(ca); selected_keys.clear(); selected_key_fields.clear(); update_ui(false); diff --git a/project/marker.cpp b/project/marker.cpp index 985eae67d..02fc18ee4 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -11,7 +11,7 @@ #include #include -void draw_marker(QPainter &p, int x, int y, int bottom, bool selected, bool flipped) { +void draw_marker(QPainter &p, int x, int y, int bottom, bool selected) { const QPoint points[5] = { QPoint(x, bottom), QPoint(x + MARKER_SIZE, bottom - MARKER_SIZE), @@ -90,7 +90,7 @@ void set_marker_internal(Sequence* seq, const QVector& clips) { // push action - undo_stack.push(ca); + Olive::UndoStack.push(ca); // redraw UI for new markers update_ui(false); diff --git a/project/marker.h b/project/marker.h index 1d6d1e2cc..9e6897871 100644 --- a/project/marker.h +++ b/project/marker.h @@ -13,7 +13,7 @@ struct Marker { QString name; }; -void draw_marker(QPainter& p, int x, int y, int bottom, bool selected, bool flipped); +void draw_marker(QPainter& p, int x, int y, int bottom, bool selected); void set_marker_internal(Sequence* seq, const QVector& clips); void set_marker_internal(Sequence* seq); diff --git a/project/media.cpp b/project/media.cpp index 66456095e..1302e34cf 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -244,7 +244,7 @@ bool Media::setData(int col, const QVariant &value) { if (col == 0) { QString n = value.toString(); if (!n.isEmpty() && get_name() != n) { - undo_stack.push(new MediaRename(this, value.toString())); + Olive::UndoStack.push(new MediaRename(this, value.toString())); return true; } } diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index ad8707f0f..eee339e62 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -49,7 +49,7 @@ void SourcesCommon::create_seq_from_selected() { panel_timeline->add_clips_from_ghosts(ca, s); project_parent->new_sequence(ca, s, true, nullptr); - undo_stack.push(ca); + Olive::UndoStack.push(ca); } } @@ -227,7 +227,7 @@ void SourcesCommon::mouseDoubleClickEvent(QMouseEvent *, const QModelIndexList& panel_footage_viewer->setFocus(); break; case MEDIA_TYPE_SEQUENCE: - undo_stack.push(new ChangeSequenceAction(item->to_sequence())); + Olive::UndoStack.push(new ChangeSequenceAction(item->to_sequence())); break; } } @@ -306,7 +306,7 @@ void SourcesCommon::dropEvent(QWidget* parent, QDropEvent *event, const QModelIn MediaMove* mm = new MediaMove(); mm->to = m; mm->items = move_items; - undo_stack.push(mm); + Olive::UndoStack.push(mm); } } } @@ -350,7 +350,7 @@ void SourcesCommon::rename_interval() { void SourcesCommon::item_renamed(Media* item) { if (editing_item == item) { MediaRename* mr = new MediaRename(item, "idk"); - undo_stack.push(mr); + Olive::UndoStack.push(mr); editing_item = nullptr; } } diff --git a/project/undo.cpp b/project/undo.cpp index 458a07fa7..dba77b36c 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -26,7 +26,7 @@ #include "project/media.h" #include "debug.h" -QUndoStack undo_stack; +QUndoStack Olive::UndoStack; ComboAction::ComboAction() {} @@ -62,37 +62,37 @@ void ComboAction::appendPost(QUndoCommand* u) { post_commands.append(u); } -MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack, bool irelative) : - clip(c), - old_in(c->timeline_in), - old_out(c->timeline_out), - old_clip_in(c->clip_in), - old_track(c->track), - new_in(iin), - new_out(iout), - new_clip_in(iclip_in), - new_track(itrack), - relative(irelative), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +MoveClipAction::MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack, bool irelative) { + clip = c; -void MoveClipAction::undo() { + old_in = c->timeline_in; + old_out = c->timeline_out; + old_clip_in = c->clip_in; + old_track = c->track; + + new_in = iin; + new_out = iout; + new_clip_in = iclip_in; + new_track = itrack; + + relative = irelative; +} + +void MoveClipAction::doUndo() { if (relative) { clip->timeline_in -= new_in; clip->timeline_out -= new_out; - clip->clip_in -= new_clip_in; + clip->clip_in -= new_clip_in; clip->track -= new_track; } else { clip->timeline_in = old_in; clip->timeline_out = old_out; clip->clip_in = old_clip_in; clip->track = old_track; - } - - Olive::MainWindow->setWindowModified(old_project_changed); + } } -void MoveClipAction::redo() { +void MoveClipAction::doRedo() { if (relative) { clip->timeline_in += new_in; clip->timeline_out += new_out; @@ -103,24 +103,21 @@ void MoveClipAction::redo() { clip->timeline_out = new_out; clip->clip_in = new_clip_in; clip->track = new_track; - } - - Olive::MainWindow->setWindowModified(true); + } } -DeleteClipAction::DeleteClipAction(Sequence* s, int clip) : - seq(s), - index(clip), - opening_transition(-1), - closing_transition(-1), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +DeleteClipAction::DeleteClipAction(Sequence* s, int clip) { + seq = s; + index = clip; + opening_transition = -1; + closing_transition = -1; +} DeleteClipAction::~DeleteClipAction() { if (ref != nullptr) delete ref; } -void DeleteClipAction::undo() { +void DeleteClipAction::doUndo() { // restore ref to clip seq->clips[index] = ref; @@ -142,12 +139,10 @@ void DeleteClipAction::undo() { seq->clips.at(linkClipIndex.at(i))->linked.insert(linkLinkIndex.at(i), index); } - ref = nullptr; - - Olive::MainWindow->setWindowModified(old_project_changed); + ref = nullptr; } -void DeleteClipAction::redo() { +void DeleteClipAction::doRedo() { // remove ref to clip ref = seq->clips.at(index); if (ref->open) { @@ -182,33 +177,30 @@ void DeleteClipAction::redo() { } } } - } - - Olive::MainWindow->setWindowModified(true); + } } -ChangeSequenceAction::ChangeSequenceAction(Sequence* s) : - new_sequence(s) -{} +ChangeSequenceAction::ChangeSequenceAction(Sequence* s) { + new_sequence = s; +} -void ChangeSequenceAction::undo() { +void ChangeSequenceAction::doUndo() { set_sequence(old_sequence); } -void ChangeSequenceAction::redo() { +void ChangeSequenceAction::doRedo() { old_sequence = Olive::ActiveSequence; set_sequence(new_sequence); } -SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long in, long out) : - seq(s), - new_enabled(enabled), - new_in(in), - new_out(out), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetTimelineInOutCommand::SetTimelineInOutCommand(Sequence *s, bool enabled, long in, long out) { + seq = s; + new_enabled = enabled; + new_in = in; + new_out = out; +} -void SetTimelineInOutCommand::undo() { +void SetTimelineInOutCommand::doUndo() { seq->using_workarea = old_enabled; seq->workarea_in = old_in; seq->workarea_out = old_out; @@ -219,12 +211,10 @@ void SetTimelineInOutCommand::undo() { m->using_inout = old_enabled; m->in = old_in; m->out = old_out; - } - - Olive::MainWindow->setWindowModified(old_project_changed); + } } -void SetTimelineInOutCommand::redo() { +void SetTimelineInOutCommand::doRedo() { old_enabled = seq->using_workarea; old_in = seq->workarea_in; old_out = seq->workarea_out; @@ -239,36 +229,32 @@ void SetTimelineInOutCommand::redo() { m->using_inout = new_enabled; m->in = new_in; m->out = new_out; - } - - Olive::MainWindow->setWindowModified(true); + } } -AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int insert_pos) : - clip(c), - meta(m), - ref(e), - pos(insert_pos), - done(false), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +AddEffectCommand::AddEffectCommand(Clip* c, Effect* e, const EffectMeta *m, int insert_pos) { + clip = c; + ref = e; + meta = m; + pos = insert_pos; + done = false; +} AddEffectCommand::~AddEffectCommand() { if (!done && ref != nullptr) delete ref; } -void AddEffectCommand::undo() { +void AddEffectCommand::doUndo() { clip->effects.last()->close(); if (pos < 0) { clip->effects.removeLast(); } else { clip->effects.removeAt(pos); } - done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + done = false; } -void AddEffectCommand::redo() { +void AddEffectCommand::doRedo() { if (ref == nullptr) { ref = create_effect(clip, meta); } @@ -278,20 +264,23 @@ void AddEffectCommand::redo() { clip->effects.insert(pos, ref); } done = true; - Olive::MainWindow->setWindowModified(true); } -AddTransitionCommand::AddTransitionCommand(Clip* c, Clip *s, Transition* copy, const EffectMeta *itransition, int itype, int ilength) : - clip(c), - secondary(s), - transition_to_copy(copy), - transition(itransition), - type(itype), - length(ilength), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +AddTransitionCommand::AddTransitionCommand(Clip* c, + Clip *s, + Transition* copy, + const EffectMeta *itransition, + int itype, + int ilength) { + clip = c; + secondary = s; + transition_to_copy = copy; + transition = itransition; + type = itype; + length = ilength; +} -void AddTransitionCommand::undo() { +void AddTransitionCommand::doUndo() { clip->sequence->hard_delete_transition(clip, type); if (secondary != nullptr) secondary->sequence->hard_delete_transition(secondary, (type == TA_OPENING_TRANSITION) ? TA_CLOSING_TRANSITION : TA_OPENING_TRANSITION); @@ -301,12 +290,10 @@ void AddTransitionCommand::undo() { } else { clip->closing_transition = old_ptransition; if (secondary != nullptr) secondary->opening_transition = old_stransition; - } - - Olive::MainWindow->setWindowModified(old_project_changed); + } } -void AddTransitionCommand::redo() { +void AddTransitionCommand::doRedo() { if (type == TA_OPENING_TRANSITION) { old_ptransition = clip->opening_transition; clip->opening_transition = (transition_to_copy == nullptr) ? create_transition(clip, secondary, transition) : transition_to_copy->copy(clip, nullptr); @@ -327,54 +314,48 @@ void AddTransitionCommand::redo() { if (length > 0) { clip->get_closing_transition()->set_length(length); } - } - Olive::MainWindow->setWindowModified(true); + } } -ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) : - clip(c), - type(itype), - new_length(ilength), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +ModifyTransitionCommand::ModifyTransitionCommand(Clip* c, int itype, long ilength) { + clip = c; + type = itype; + new_length = ilength; +} -void ModifyTransitionCommand::undo() { +void ModifyTransitionCommand::doUndo() { Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); - t->set_length(old_length); - Olive::MainWindow->setWindowModified(old_project_changed); + t->set_length(old_length); } -void ModifyTransitionCommand::redo() { +void ModifyTransitionCommand::doRedo() { Transition* t = (type == TA_OPENING_TRANSITION) ? clip->get_opening_transition() : clip->get_closing_transition(); old_length = t->get_true_length(); - t->set_length(new_length); - Olive::MainWindow->setWindowModified(true); + t->set_length(new_length); } -DeleteTransitionCommand::DeleteTransitionCommand(Sequence* s, int transition_index) : - seq(s), - index(transition_index), - transition(nullptr), - otc(nullptr), - ctc(nullptr), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +DeleteTransitionCommand::DeleteTransitionCommand(Sequence* s, int transition_index) { + seq = s; + index = transition_index; + transition = nullptr; + otc = nullptr; + ctc = nullptr; +} DeleteTransitionCommand::~DeleteTransitionCommand() { if (transition != nullptr) delete transition; } -void DeleteTransitionCommand::undo() { +void DeleteTransitionCommand::doUndo() { seq->transitions[index] = transition; if (otc != nullptr) otc->opening_transition = index; if (ctc != nullptr) ctc->closing_transition = index; - transition = nullptr; - Olive::MainWindow->setWindowModified(old_project_changed); + transition = nullptr; } -void DeleteTransitionCommand::redo() { +void DeleteTransitionCommand::doRedo() { for (int i=0;iclips.size();i++) { Clip* c = seq->clips.at(i); if (c != nullptr) { @@ -390,17 +371,14 @@ void DeleteTransitionCommand::redo() { } transition = seq->transitions.at(index); - seq->transitions[index] = nullptr; - - Olive::MainWindow->setWindowModified(true); + seq->transitions[index] = nullptr; } -NewSequenceCommand::NewSequenceCommand(Media *s, Media* iparent) : - seq(s), - parent(iparent), - done(false), - old_project_changed(Olive::MainWindow->isWindowModified()) -{ +NewSequenceCommand::NewSequenceCommand(Media *s, Media* iparent) { + seq = s; + parent = iparent; + done = false; + if (parent == nullptr) parent = project_model.get_root(); } @@ -408,26 +386,23 @@ NewSequenceCommand::~NewSequenceCommand() { if (!done) delete seq; } -void NewSequenceCommand::undo() { +void NewSequenceCommand::doUndo() { project_model.removeChild(parent, seq); - done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + done = false; } -void NewSequenceCommand::redo() { +void NewSequenceCommand::doRedo() { project_model.appendChild(parent, seq); - done = true; - Olive::MainWindow->setWindowModified(true); + done = true; } -AddMediaCommand::AddMediaCommand(Media* iitem, Media *iparent) : - item(iitem), - parent(iparent), - done(false), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +AddMediaCommand::AddMediaCommand(Media* iitem, Media *iparent) { + item = iitem; + parent = iparent; + done = false; +} AddMediaCommand::~AddMediaCommand() { if (!done) { @@ -435,24 +410,22 @@ AddMediaCommand::~AddMediaCommand() { } } -void AddMediaCommand::undo() { +void AddMediaCommand::doUndo() { project_model.removeChild(parent, item); done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void AddMediaCommand::redo() { +void AddMediaCommand::doRedo() { project_model.appendChild(parent, item); done = true; - Olive::MainWindow->setWindowModified(true); } -DeleteMediaCommand::DeleteMediaCommand(Media* i) : - item(i), - parent(i->parentItem()), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +DeleteMediaCommand::DeleteMediaCommand(Media* i) { + item = i; + parent = i->parentItem(); +} DeleteMediaCommand::~DeleteMediaCommand() { if (done) { @@ -460,25 +433,23 @@ DeleteMediaCommand::~DeleteMediaCommand() { } } -void DeleteMediaCommand::undo() { +void DeleteMediaCommand::doUndo() { project_model.appendChild(parent, item); - Olive::MainWindow->setWindowModified(old_project_changed); + done = false; } -void DeleteMediaCommand::redo() { +void DeleteMediaCommand::doRedo() { project_model.removeChild(parent, item); - Olive::MainWindow->setWindowModified(true); done = true; } -AddClipCommand::AddClipCommand(Sequence* s, QVector& add) : - seq(s), - clips(add), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +AddClipCommand::AddClipCommand(Sequence* s, QVector& add) { + seq = s; + clips = add; +} AddClipCommand::~AddClipCommand() { for (int i=0;iclear_effects(true); for (int i=0;iclips.last(); @@ -498,10 +469,10 @@ void AddClipCommand::undo() { if (c->open) close_clip(c, true); seq->clips.removeLast(); } - Olive::MainWindow->setWindowModified(old_project_changed); + } -void AddClipCommand::redo() { +void AddClipCommand::doRedo() { if (undone_clips.size() > 0) { for (int i=0;iclips.append(undone_clips.at(i)); @@ -525,12 +496,13 @@ void AddClipCommand::redo() { } } } - Olive::MainWindow->setWindowModified(true); } -LinkCommand::LinkCommand() : link(true), old_project_changed(Olive::MainWindow->isWindowModified()) {} +LinkCommand::LinkCommand() { + link = true; +} -void LinkCommand::undo() { +void LinkCommand::doUndo() { for (int i=0;iclips.at(clips.at(i)); if (link) { @@ -539,10 +511,10 @@ void LinkCommand::undo() { c->linked = old_links.at(i); } } - Olive::MainWindow->setWindowModified(old_project_changed); + } -void LinkCommand::redo() { +void LinkCommand::doRedo() { old_links.clear(); for (int i=0;ilinked.clear(); } } - Olive::MainWindow->setWindowModified(true); } -CheckboxCommand::CheckboxCommand(QCheckBox* b) : box(b), checked(box->isChecked()), done(true), old_project_changed(Olive::MainWindow->isWindowModified()) {} +CheckboxCommand::CheckboxCommand(QCheckBox* b) { + box = b; + checked = box->isChecked(); + done = true; +} CheckboxCommand::~CheckboxCommand() {} -void CheckboxCommand::undo() { +void CheckboxCommand::doUndo() { box->setChecked(!checked); done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void CheckboxCommand::redo() { +void CheckboxCommand::doRedo() { if (!done) { box->setChecked(checked); } - Olive::MainWindow->setWindowModified(true); } -ReplaceMediaCommand::ReplaceMediaCommand(Media* i, QString s) : - item(i), - new_filename(s), - old_project_changed(Olive::MainWindow->isWindowModified()) -{ +ReplaceMediaCommand::ReplaceMediaCommand(Media* i, QString s) { + item = i; + new_filename = s; old_filename = item->to_footage()->url; } @@ -607,24 +579,21 @@ void ReplaceMediaCommand::replace(QString& filename) { panel_project->process_file_list(files, false, item, nullptr); } -void ReplaceMediaCommand::undo() { +void ReplaceMediaCommand::doUndo() { replace(old_filename); - Olive::MainWindow->setWindowModified(old_project_changed); + } -void ReplaceMediaCommand::redo() { +void ReplaceMediaCommand::doRedo() { replace(new_filename); - - Olive::MainWindow->setWindowModified(true); } -ReplaceClipMediaCommand::ReplaceClipMediaCommand(Media *a, Media *b, bool e) : - old_media(a), - new_media(b), - preserve_clip_ins(e), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +ReplaceClipMediaCommand::ReplaceClipMediaCommand(Media *a, Media *b, bool e) { + old_media = a; + new_media = b; + preserve_clip_ins = e; +} void ReplaceClipMediaCommand::replace(bool undo) { if (!undo) { @@ -657,20 +626,19 @@ void ReplaceClipMediaCommand::replace(bool undo) { } } -void ReplaceClipMediaCommand::undo() { - replace(true); - - Olive::MainWindow->setWindowModified(old_project_changed); +void ReplaceClipMediaCommand::doUndo() { + replace(true); } -void ReplaceClipMediaCommand::redo() { +void ReplaceClipMediaCommand::doRedo() { replace(false); update_ui(true); - Olive::MainWindow->setWindowModified(true); } -EffectDeleteCommand::EffectDeleteCommand() : done(false), old_project_changed(Olive::MainWindow->isWindowModified()) {} +EffectDeleteCommand::EffectDeleteCommand() { + done = false; +} EffectDeleteCommand::~EffectDeleteCommand() { if (done) { @@ -680,17 +648,17 @@ EffectDeleteCommand::~EffectDeleteCommand() { } } -void EffectDeleteCommand::undo() { +void EffectDeleteCommand::doUndo() { for (int i=0;ieffects.insert(fx.at(i), deleted_objects.at(i)); } panel_effect_controls->reload_clips(); done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void EffectDeleteCommand::redo() { +void EffectDeleteCommand::doRedo() { deleted_objects.clear(); for (int i=0;ireload_clips(); done = true; - Olive::MainWindow->setWindowModified(true); } -MediaMove::MediaMove() : old_project_changed(Olive::MainWindow->isWindowModified()) {} +MediaMove::MediaMove() {} -void MediaMove::undo() { +void MediaMove::doUndo() { for (int i=0;isetWindowModified(old_project_changed); + } -void MediaMove::redo() { +void MediaMove::doRedo() { if (to == nullptr) to = project_model.get_root(); froms.resize(items.size()); for (int i=0;isetWindowModified(true); } -MediaRename::MediaRename(Media* iitem, QString ito) : - item(iitem), - from(iitem->get_name()), - to(ito), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +MediaRename::MediaRename(Media* iitem, QString ito) { + item = iitem; + from = iitem->get_name(); + to = ito; +} -void MediaRename::undo() { +void MediaRename::doUndo() { item->set_name(from); - Olive::MainWindow->setWindowModified(old_project_changed); + } -void MediaRename::redo() { +void MediaRename::doRedo() { item->set_name(to); - Olive::MainWindow->setWindowModified(true); } -KeyframeDelete::KeyframeDelete(EffectField *ifield, int iindex) : - field(ifield), - index(iindex), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +KeyframeDelete::KeyframeDelete(EffectField *ifield, int iindex) { + field = ifield; + index = iindex; +} -void KeyframeDelete::undo() { +void KeyframeDelete::doUndo() { field->keyframes.insert(index, deleted_key); - Olive::MainWindow->setWindowModified(old_project_changed); } -void KeyframeDelete::redo() { +void KeyframeDelete::doRedo() { deleted_key = field->keyframes.at(index); field->keyframes.removeAt(index); - Olive::MainWindow->setWindowModified(true); } -EffectFieldUndo::EffectFieldUndo(EffectField* f) : - field(f), - done(true), - old_project_changed(Olive::MainWindow->isWindowModified()) -{ +EffectFieldUndo::EffectFieldUndo(EffectField* f) { + field = f; + done = true; + old_val = field->get_previous_data(); new_val = field->get_current_data(); } -void EffectFieldUndo::undo() { +void EffectFieldUndo::doUndo() { field->set_current_data(old_val); done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void EffectFieldUndo::redo() { +void EffectFieldUndo::doRedo() { if (!done) { field->set_current_data(new_val); } - Olive::MainWindow->setWindowModified(true); } -SetAutoscaleAction::SetAutoscaleAction() : - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetAutoscaleAction::SetAutoscaleAction() {} -void SetAutoscaleAction::undo() { +void SetAutoscaleAction::doUndo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } panel_sequence_viewer->viewer_widget->frame_update(); - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetAutoscaleAction::redo() { +void SetAutoscaleAction::doRedo() { for (int i=0;iautoscale = !clips.at(i)->autoscale; } panel_sequence_viewer->viewer_widget->frame_update(); - Olive::MainWindow->setWindowModified(true); } -AddMarkerAction::AddMarkerAction(QVector* m, long t, QString n) : - active_array(m), - time(t), - name(n), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +AddMarkerAction::AddMarkerAction(QVector* m, long t, QString n) { + active_array = m; + time = t; + name = n; +} -void AddMarkerAction::undo() { +void AddMarkerAction::doUndo() { if (index == -1) { active_array->removeLast(); } else { active_array[0][index].name = old_name; - } - - Olive::MainWindow->setWindowModified(old_project_changed); + } } -void AddMarkerAction::redo() { +void AddMarkerAction::doRedo() { index = -1; for (int i=0;isize();i++) { @@ -837,41 +790,36 @@ void AddMarkerAction::redo() { old_name = active_array->at(index).name; active_array[0][index].name = name; } - - Olive::MainWindow->setWindowModified(true); } -MoveMarkerAction::MoveMarkerAction(Marker* m, long o, long n) : - marker(m), - old_time(o), - new_time(n), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +MoveMarkerAction::MoveMarkerAction(Marker* m, long o, long n) { + marker = m; + old_time = o; + new_time = n; +} -void MoveMarkerAction::undo() { +void MoveMarkerAction::doUndo() { marker->frame = old_time; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void MoveMarkerAction::redo() { +void MoveMarkerAction::doRedo() { marker->frame = new_time; - Olive::MainWindow->setWindowModified(true); } -DeleteMarkerAction::DeleteMarkerAction(QVector *m) : - active_array(m), - sorted(false), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +DeleteMarkerAction::DeleteMarkerAction(QVector *m) { + active_array = m; + sorted = false; +} -void DeleteMarkerAction::undo() { +void DeleteMarkerAction::doUndo() { for (int i=markers.size()-1;i>=0;i--) { active_array->insert(markers.at(i), copies.at(i)); } - Olive::MainWindow->setWindowModified(old_project_changed); + } -void DeleteMarkerAction::redo() { +void DeleteMarkerAction::doRedo() { for (int i=0;iremoveAt(markers.at(i)); } sorted = true; - Olive::MainWindow->setWindowModified(true); } -SetSpeedAction::SetSpeedAction(Clip* c, double speed) : - clip(c), - old_speed(c->speed), - new_speed(speed), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetSpeedAction::SetSpeedAction(Clip* c, double speed) { + clip = c; + old_speed = c->speed; + new_speed = speed; +} -void SetSpeedAction::undo() { +void SetSpeedAction::doUndo() { clip->speed = old_speed; clip->recalculateMaxLength(); - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetSpeedAction::redo() { +void SetSpeedAction::doRedo() { clip->speed = new_speed; clip->recalculateMaxLength(); - Olive::MainWindow->setWindowModified(true); } -SetBool::SetBool(bool* b, bool setting) : - boolean(b), - old_setting(*b), - new_setting(setting), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} - -void SetBool::undo() { - *boolean = old_setting; - Olive::MainWindow->setWindowModified(old_project_changed); +SetBool::SetBool(bool* b, bool setting) { + boolean = b; + old_setting = *b; + new_setting = setting; } -void SetBool::redo() { +void SetBool::doUndo() { + *boolean = old_setting; +} + +void SetBool::doRedo() { *boolean = new_setting; - Olive::MainWindow->setWindowModified(true); } -SetSelectionsCommand::SetSelectionsCommand(Sequence* s) : - seq(s), - done(true), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetSelectionsCommand::SetSelectionsCommand(Sequence* s) { + seq = s; + done = true; +} -void SetSelectionsCommand::undo() { +void SetSelectionsCommand::doUndo() { seq->selections = old_data; - done = false; - Olive::MainWindow->setWindowModified(old_project_changed); + done = false; } -void SetSelectionsCommand::redo() { +void SetSelectionsCommand::doRedo() { if (!done) { seq->selections = new_data; done = true; } - Olive::MainWindow->setWindowModified(true); } -SetEnableCommand::SetEnableCommand(Clip* c, bool enable) : - clip(c), - old_val(c->enabled), - new_val(enable), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} - -void SetEnableCommand::undo() { - clip->enabled = old_val; - Olive::MainWindow->setWindowModified(old_project_changed); +EditSequenceCommand::EditSequenceCommand(Media* i, Sequence *s) { + item = i; + seq = s; + old_name = s->name; + old_width = s->width; + old_height = s->height; + old_frame_rate = s->frame_rate; + old_audio_frequency = s->audio_frequency; + old_audio_layout = s->audio_layout; } -void SetEnableCommand::redo() { - clip->enabled = new_val; - Olive::MainWindow->setWindowModified(true); -} - -EditSequenceCommand::EditSequenceCommand(Media* i, Sequence *s) : - item(i), - seq(s), - old_project_changed(Olive::MainWindow->isWindowModified()), - old_name(s->name), - old_width(s->width), - old_height(s->height), - old_frame_rate(s->frame_rate), - old_audio_frequency(s->audio_frequency), - old_audio_layout(s->audio_layout) -{} - -void EditSequenceCommand::undo() { +void EditSequenceCommand::doUndo() { seq->name = old_name; seq->width = old_width; seq->height = old_height; seq->frame_rate = old_frame_rate; seq->audio_frequency = old_audio_frequency; seq->audio_layout = old_audio_layout; - update(); - - Olive::MainWindow->setWindowModified(old_project_changed); + update(); } -void EditSequenceCommand::redo() { +void EditSequenceCommand::doRedo() { seq->name = name; seq->width = width; seq->height = height; seq->frame_rate = frame_rate; seq->audio_frequency = audio_frequency; seq->audio_layout = audio_layout; - update(); - - Olive::MainWindow->setWindowModified(true); + update(); } void EditSequenceCommand::update() { @@ -1010,79 +927,71 @@ void EditSequenceCommand::update() { } } -SetInt::SetInt(int* pointer, int new_value) : - p(pointer), - oldval(*pointer), - newval(new_value), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetInt::SetInt(int* pointer, int new_value) { + p = pointer; + oldval = *pointer; + newval = new_value; +} -void SetInt::undo() { +void SetInt::doUndo() { *p = oldval; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetInt::redo() { +void SetInt::doRedo() { *p = newval; - Olive::MainWindow->setWindowModified(true); } -SetString::SetString(QString* pointer, QString new_value) : - p(pointer), - oldval(*pointer), - newval(new_value), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetString::SetString(QString* pointer, QString new_value) { + p = pointer; + oldval = *pointer; + newval = new_value; +} -void SetString::undo() { +void SetString::doUndo() { *p = oldval; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetString::redo() { - *p = newval; - Olive::MainWindow->setWindowModified(true); +void SetString::doRedo() { + *p = newval; } -void CloseAllClipsCommand::undo() { +void CloseAllClipsCommand::doUndo() { redo(); } -void CloseAllClipsCommand::redo() { +void CloseAllClipsCommand::doRedo() { closeActiveClips(Olive::ActiveSequence); } -UpdateFootageTooltip::UpdateFootageTooltip(Media *i) : - item(i) -{} +UpdateFootageTooltip::UpdateFootageTooltip(Media *i) { + item = i; +} -void UpdateFootageTooltip::undo() { +void UpdateFootageTooltip::doUndo() { redo(); } -void UpdateFootageTooltip::redo() { +void UpdateFootageTooltip::doRedo() { item->update_tooltip(); } -MoveEffectCommand::MoveEffectCommand() : - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +MoveEffectCommand::MoveEffectCommand() {} -void MoveEffectCommand::undo() { +void MoveEffectCommand::doUndo() { clip->effects.move(to, from); - Olive::MainWindow->setWindowModified(old_project_changed); + } -void MoveEffectCommand::redo() { - clip->effects.move(from, to); - Olive::MainWindow->setWindowModified(true); +void MoveEffectCommand::doRedo() { + clip->effects.move(from, to); } -RemoveClipsFromClipboard::RemoveClipsFromClipboard(int index) : - pos(index), - old_project_changed(Olive::MainWindow->isWindowModified()), - done(false) -{} +RemoveClipsFromClipboard::RemoveClipsFromClipboard(int index) { + pos = index; + done = false; +} RemoveClipsFromClipboard::~RemoveClipsFromClipboard() { if (done) { @@ -1090,28 +999,26 @@ RemoveClipsFromClipboard::~RemoveClipsFromClipboard() { } } -void RemoveClipsFromClipboard::undo() { +void RemoveClipsFromClipboard::doUndo() { clipboard.insert(pos, clip); done = false; } -void RemoveClipsFromClipboard::redo() { +void RemoveClipsFromClipboard::doRedo() { clip = static_cast(clipboard.at(pos)); clipboard.removeAt(pos); done = true; } -RenameClipCommand::RenameClipCommand() : - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +RenameClipCommand::RenameClipCommand() {} -void RenameClipCommand::undo() { +void RenameClipCommand::doUndo() { for (int i=0;iname = old_names.at(i); } } -void RenameClipCommand::redo() { +void RenameClipCommand::doRedo() { old_names.resize(clips.size()); for (int i=0;iname; @@ -1119,44 +1026,41 @@ void RenameClipCommand::redo() { } } -SetPointer::SetPointer(void **pointer, void *data) : - p(pointer), - new_data(data), - old_changed(Olive::MainWindow->isWindowModified()) -{} - -void SetPointer::undo() { - *p = old_data; - Olive::MainWindow->setWindowModified(old_changed); +SetPointer::SetPointer(void **pointer, void *data) { + p = pointer; + new_data = data; } -void SetPointer::redo() { +void SetPointer::doUndo() { + *p = old_data; +} + +void SetPointer::doRedo() { old_data = *p; - *p = new_data; - Olive::MainWindow->setWindowModified(true); + *p = new_data; } -void ReloadEffectsCommand::undo() { +void ReloadEffectsCommand::doUndo() { redo(); } -void ReloadEffectsCommand::redo() { +void ReloadEffectsCommand::doRedo() { panel_effect_controls->reload_clips(); } -RippleAction::RippleAction(Sequence *is, long ipoint, long ilength, const QVector &iignore) : - s(is), - point(ipoint), - length(ilength), - ignore(iignore) -{} +RippleAction::RippleAction(Sequence *is, long ipoint, long ilength, const QVector &iignore) { + s = is; + point = ipoint; + length = ilength; + ignore = iignore; +} -void RippleAction::undo() { +void RippleAction::doUndo() { ca->undo(); delete ca; } -void RippleAction::redo() { +void RippleAction::doRedo() { ca = new ComboAction(); for (int i=0;iclips.size();i++) { if (!ignore.contains(i)) { @@ -1171,98 +1075,92 @@ void RippleAction::redo() { ca->redo(); } -SetDouble::SetDouble(double* pointer, double old_value, double new_value) : - p(pointer), - oldval(old_value), - newval(new_value), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetDouble::SetDouble(double* pointer, double old_value, double new_value) { + p = pointer; + oldval = old_value; + newval = new_value; +} -void SetDouble::undo() { +void SetDouble::doUndo() { *p = oldval; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetDouble::redo() { - *p = newval; - Olive::MainWindow->setWindowModified(true); +void SetDouble::doRedo() { + *p = newval; } -SetQVariant::SetQVariant(QVariant *itarget, const QVariant &iold, const QVariant &inew) : - target(itarget), - old_val(iold), - new_val(inew) -{} +SetQVariant::SetQVariant(QVariant *itarget, const QVariant &iold, const QVariant &inew) { + target = itarget; + old_val = iold; + new_val = inew; +} -void SetQVariant::undo() { +void SetQVariant::doUndo() { *target = old_val; } -void SetQVariant::redo() { +void SetQVariant::doRedo() { *target = new_val; } -SetLong::SetLong(long *pointer, long old_value, long new_value) : - p(pointer), - oldval(old_value), - newval(new_value), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +SetLong::SetLong(long *pointer, long old_value, long new_value) { + p = pointer; + oldval = old_value; + newval = new_value; +} -void SetLong::undo() { +void SetLong::doUndo() { *p = oldval; - Olive::MainWindow->setWindowModified(old_project_changed); + } -void SetLong::redo() { - *p = newval; - Olive::MainWindow->setWindowModified(true); +void SetLong::doRedo() { + *p = newval; } -KeyframeFieldSet::KeyframeFieldSet(EffectField *ifield, int ii) : - field(ifield), - index(ii), - key(ifield->keyframes.at(ii)), - done(true), - old_project_changed(Olive::MainWindow->isWindowModified()) -{} +KeyframeFieldSet::KeyframeFieldSet(EffectField *ifield, int ii) { + field = ifield; + index = ii; + key = ifield->keyframes.at(ii); + done = true; +} -void KeyframeFieldSet::undo() { +void KeyframeFieldSet::doUndo() { field->keyframes.removeAt(index); - Olive::MainWindow->setWindowModified(old_project_changed); + done = false; } -void KeyframeFieldSet::redo() { +void KeyframeFieldSet::doRedo() { if (!done) { field->keyframes.insert(index, key); - Olive::MainWindow->setWindowModified(true); } done = true; } -SetKeyframing::SetKeyframing(EffectRow *irow, bool ib) : - row(irow), - b(ib) -{} +SetKeyframing::SetKeyframing(EffectRow *irow, bool ib) { + row = irow; + b = ib; +} -void SetKeyframing::undo() { +void SetKeyframing::doUndo() { row->setKeyframing(!b); } -void SetKeyframing::redo() { +void SetKeyframing::doRedo() { row->setKeyframing(b); } -RefreshClips::RefreshClips(Media *m) : - media(m) -{} +RefreshClips::RefreshClips(Media *m) { + media = m; +} -void RefreshClips::undo() { +void RefreshClips::doUndo() { redo(); } -void RefreshClips::redo() { +void RefreshClips::doRedo() { // close any clips currently using this media QVector all_sequences = panel_project->list_all_project_sequences(); for (int i=0;iviewer_widget->frame_update(); } -SetEffectData::SetEffectData(Effect *e, const QByteArray &s) : - effect(e), - data(s) -{} +SetEffectData::SetEffectData(Effect *e, const QByteArray &s) { + effect = e; + data = s; +} -void SetEffectData::undo() { +void SetEffectData::doUndo() { effect->load_from_string(old_data); old_data.clear(); } -void SetEffectData::redo() { +void SetEffectData::doRedo() { old_data = effect->save_to_string(); effect->load_from_string(data); } + +OliveAction::OliveAction(bool iset_window_modified) { + set_window_modified = iset_window_modified; +} + +OliveAction::~OliveAction() {} + +void OliveAction::undo() { + doUndo(); + + if (set_window_modified) { + Olive::MainWindow->setWindowModified(old_window_modified); + } +} + +void OliveAction::redo() { + doRedo(); + + if (set_window_modified) { + + // store current modified state + old_window_modified = Olive::MainWindow->isWindowModified(); + + // set modified to true + Olive::MainWindow->setWindowModified(true); + + } +} diff --git a/project/undo.h b/project/undo.h index 98c78143a..3b539220d 100644 --- a/project/undo.h +++ b/project/undo.h @@ -25,14 +25,16 @@ struct EffectMeta; #include #include -extern QUndoStack undo_stack; +namespace Olive { + extern QUndoStack UndoStack; +} class ComboAction : public QUndoCommand { public: ComboAction(); - ~ComboAction(); - void undo(); - void redo(); + virtual ~ComboAction() override; + virtual void undo() override; + virtual void redo() override; void append(QUndoCommand* u); void appendPost(QUndoCommand* u); private: @@ -40,11 +42,33 @@ private: QVector post_commands; }; -class MoveClipAction : public QUndoCommand { +class OliveAction : public QUndoCommand { +public: + OliveAction(bool iset_window_modified = true); + virtual ~OliveAction() override; + + virtual void undo() override; + virtual void redo() override; + + virtual void doUndo() = 0; + virtual void doRedo() = 0; +private: + /** + * @brief Setting whether to change the windowModified state of MainWindow + */ + bool set_window_modified; + + /** + * @brief Cache previous window modified value to return to if the user undoes this action + */ + bool old_window_modified; +}; + +class MoveClipAction : public OliveAction { public: MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack, bool irelative); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Clip* clip; @@ -58,16 +82,14 @@ private: long new_clip_in; int new_track; - bool relative; - - bool old_project_changed; + bool relative; }; -class RippleAction : public QUndoCommand { +class RippleAction : public OliveAction { public: RippleAction(Sequence *is, long ipoint, long ilength, const QVector& iignore); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence *s; long point; @@ -76,12 +98,12 @@ private: ComboAction* ca; }; -class DeleteClipAction : public QUndoCommand { +class DeleteClipAction : public OliveAction { public: DeleteClipAction(Sequence* s, int clip); - ~DeleteClipAction(); - void undo(); - void redo(); + virtual ~DeleteClipAction() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence* seq; Clip* ref; @@ -91,86 +113,80 @@ private: int closing_transition; QVector linkClipIndex; - QVector linkLinkIndex; - - bool old_project_changed; + QVector linkLinkIndex; }; -class ChangeSequenceAction : public QUndoCommand { +class ChangeSequenceAction : public OliveAction { public: ChangeSequenceAction(Sequence* s); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence* old_sequence; Sequence* new_sequence; }; -class AddEffectCommand : public QUndoCommand { +class AddEffectCommand : public OliveAction { public: AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1); - ~AddEffectCommand(); - void undo(); - void redo(); + virtual ~AddEffectCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Clip* clip; const EffectMeta* meta; Effect* ref; int pos; - bool done; - bool old_project_changed; + bool done; }; -class AddTransitionCommand : public QUndoCommand { +class AddTransitionCommand : public OliveAction { public: AddTransitionCommand(Clip* c, Clip* s, Transition *copy, const EffectMeta* itransition, int itype, int ilength); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Clip* clip; Clip* secondary; Transition* transition_to_copy; const EffectMeta* transition; int type; - int length; - bool old_project_changed; + int length; int old_ptransition; int old_stransition; }; -class ModifyTransitionCommand : public QUndoCommand { +class ModifyTransitionCommand : public OliveAction { public: ModifyTransitionCommand(Clip* c, int itype, long ilength); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Clip* clip; int type; long new_length; - long old_length; - bool old_project_changed; + long old_length; }; -class DeleteTransitionCommand : public QUndoCommand { +class DeleteTransitionCommand : public OliveAction { public: DeleteTransitionCommand(Sequence* s, int transition_index); - ~DeleteTransitionCommand(); - void undo(); - void redo(); + virtual ~DeleteTransitionCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence* seq; int index; Transition* transition; Clip* otc; - Clip* ctc; - bool old_project_changed; + Clip* ctc; }; -class SetTimelineInOutCommand : public QUndoCommand { +class SetTimelineInOutCommand : public OliveAction { public: SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence* seq; @@ -180,299 +196,263 @@ private: bool new_enabled; long new_in; - long new_out; - - bool old_project_changed; + long new_out; }; -class NewSequenceCommand : public QUndoCommand { +class NewSequenceCommand : public OliveAction { public: NewSequenceCommand(Media *s, Media* iparent); - ~NewSequenceCommand(); - void undo(); - void redo(); + virtual ~NewSequenceCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Media* seq; Media* parent; - bool done; - bool old_project_changed; + bool done; }; -class AddMediaCommand : public QUndoCommand { +class AddMediaCommand : public OliveAction { public: AddMediaCommand(Media* iitem, Media* iparent); - ~AddMediaCommand(); - void undo(); - void redo(); + virtual ~AddMediaCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Media* item; Media* parent; - bool done; - bool old_project_changed; + bool done; }; -class DeleteMediaCommand : public QUndoCommand { +class DeleteMediaCommand : public OliveAction { public: DeleteMediaCommand(Media *i); - ~DeleteMediaCommand(); - void undo(); - void redo(); + virtual ~DeleteMediaCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Media* item; - Media* parent; - bool old_project_changed; + Media* parent; bool done; }; -class AddClipCommand : public QUndoCommand { +class AddClipCommand : public OliveAction { public: AddClipCommand(Sequence* s, QVector& add); - ~AddClipCommand(); - void undo(); - void redo(); + virtual ~AddClipCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: Sequence* seq; QVector clips; - QVector undone_clips; - bool old_project_changed; + QVector undone_clips; }; -class LinkCommand : public QUndoCommand { +class LinkCommand : public OliveAction { public: LinkCommand(); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; Sequence* s; QVector clips; bool link; private: - QVector< QVector > old_links; - bool old_project_changed; + QVector< QVector > old_links; }; -class CheckboxCommand : public QUndoCommand { +class CheckboxCommand : public OliveAction { public: CheckboxCommand(QCheckBox* b); - ~CheckboxCommand(); - void undo(); - void redo(); + virtual ~CheckboxCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; private: QCheckBox* box; bool checked; - bool done; - bool old_project_changed; + bool done; }; -class ReplaceMediaCommand : public QUndoCommand { +class ReplaceMediaCommand : public OliveAction { public: ReplaceMediaCommand(Media*, QString); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Media *item; QString old_filename; - QString new_filename; - bool old_project_changed; + QString new_filename; void replace(QString& filename); }; -class ReplaceClipMediaCommand : public QUndoCommand { +class ReplaceClipMediaCommand : public OliveAction { public: ReplaceClipMediaCommand(Media *, Media *, bool); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; QVector clips; private: Media* old_media; Media* new_media; - bool preserve_clip_ins; - bool old_project_changed; + bool preserve_clip_ins; QVector old_clip_ins; void replace(bool undo); }; -class EffectDeleteCommand : public QUndoCommand { +class EffectDeleteCommand : public OliveAction { public: EffectDeleteCommand(); - ~EffectDeleteCommand(); - void undo(); - void redo(); + virtual ~EffectDeleteCommand() override; + virtual void doUndo() override; + virtual void doRedo() override; QVector clips; QVector fx; private: - bool done; - bool old_project_changed; + bool done; QVector deleted_objects; }; -class MediaMove : public QUndoCommand { +class MediaMove : public OliveAction { public: MediaMove(); QVector items; Media* to; - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: - QVector froms; - bool old_project_changed; + QVector froms; }; -class MediaRename : public QUndoCommand { +class MediaRename : public OliveAction { public: MediaRename(Media* iitem, QString to); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: - bool old_project_changed; Media* item; QString from; QString to; }; -class KeyframeDelete : public QUndoCommand { +class KeyframeDelete : public OliveAction { public: KeyframeDelete(EffectField* ifield, int iindex); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: EffectField* field; int index; bool done; - EffectKeyframe deleted_key; - bool old_project_changed; + EffectKeyframe deleted_key; }; // a more modern version of the above, could probably replace it // assumes the keyframe already exists -class KeyframeFieldSet : public QUndoCommand { +class KeyframeFieldSet : public OliveAction { public: KeyframeFieldSet(EffectField* ifield, int ii); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: EffectField* field; int index; EffectKeyframe key; - bool done; - bool old_project_changed; + bool done; }; -class EffectFieldUndo : public QUndoCommand { +class EffectFieldUndo : public OliveAction { public: EffectFieldUndo(EffectField* field); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: EffectField* field; QVariant old_val; QVariant new_val; - bool done; - bool old_project_changed; + bool done; }; -class SetAutoscaleAction : public QUndoCommand { +class SetAutoscaleAction : public OliveAction { public: SetAutoscaleAction(); - void undo(); - void redo(); - QVector clips; -private: - bool old_project_changed; + virtual void doUndo() override; + virtual void doRedo() override; + QVector clips; }; -class AddMarkerAction : public QUndoCommand { +class AddMarkerAction : public OliveAction { public: AddMarkerAction(QVector* m, long t, QString n); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: QVector* active_array; long time; QString name; - QString old_name; - bool old_project_changed; + QString old_name; int index; }; -class MoveMarkerAction : public QUndoCommand { +class MoveMarkerAction : public OliveAction { public: MoveMarkerAction(Marker* m, long o, long n); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Marker* marker; long old_time; - long new_time; - bool old_project_changed; + long new_time; }; -class DeleteMarkerAction : public QUndoCommand { +class DeleteMarkerAction : public OliveAction { public: DeleteMarkerAction(QVector* m); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; QVector markers; private: QVector* active_array; QVector copies; - bool sorted; - bool old_project_changed; + bool sorted; }; -class SetSpeedAction : public QUndoCommand { +class SetSpeedAction : public OliveAction { public: SetSpeedAction(Clip* c, double speed); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Clip* clip; double old_speed; - double new_speed; - bool old_project_changed; + double new_speed; }; -class SetBool : public QUndoCommand { +class SetBool : public OliveAction { public: SetBool(bool* b, bool setting); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: bool* boolean; bool old_setting; - bool new_setting; - bool old_project_changed; + bool new_setting; }; -class SetSelectionsCommand : public QUndoCommand { +class SetSelectionsCommand : public OliveAction { public: SetSelectionsCommand(Sequence *s); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; QVector old_data; QVector new_data; private: Sequence* seq; - bool done; - bool old_project_changed; + bool done; }; -class SetEnableCommand : public QUndoCommand { -public: - SetEnableCommand(Clip* c, bool enable); - void undo(); - void redo(); -private: - Clip* clip; - bool old_val; - bool new_val; - bool old_project_changed; -}; - -class EditSequenceCommand : public QUndoCommand { +class EditSequenceCommand : public OliveAction { public: EditSequenceCommand(Media *i, Sequence* s); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; void update(); QString name; @@ -483,8 +463,7 @@ public: int audio_layout; private: Media* item; - Sequence* seq; - bool old_project_changed; + Sequence* seq; QString old_name; int old_width; @@ -494,111 +473,103 @@ private: int old_audio_layout; }; -class SetInt : public QUndoCommand { +class SetInt : public OliveAction { public: SetInt(int* pointer, int new_value); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: int* p; int oldval; - int newval; - bool old_project_changed; + int newval; }; -class SetLong : public QUndoCommand { +class SetLong : public OliveAction { public: SetLong(long* pointer, long old_value, long new_value); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: long* p; long oldval; - long newval; - bool old_project_changed; + long newval; }; -class SetDouble : public QUndoCommand { +class SetDouble : public OliveAction { public: SetDouble(double* pointer, double old_value, double new_value); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: double* p; double oldval; - double newval; - bool old_project_changed; + double newval; }; -class SetString : public QUndoCommand { +class SetString : public OliveAction { public: SetString(QString* pointer, QString new_value); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: QString* p; QString oldval; - QString newval; - bool old_project_changed; + QString newval; }; -class CloseAllClipsCommand : public QUndoCommand { +class CloseAllClipsCommand : public OliveAction { public: - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; }; -class UpdateFootageTooltip : public QUndoCommand { +class UpdateFootageTooltip : public OliveAction { public: UpdateFootageTooltip(Media* i); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Media* item; }; -class MoveEffectCommand : public QUndoCommand { +class MoveEffectCommand : public OliveAction { public: MoveEffectCommand(); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; Clip* clip; int from; - int to; -private: - bool old_project_changed; + int to; }; -class RemoveClipsFromClipboard : public QUndoCommand { +class RemoveClipsFromClipboard : public OliveAction { public: RemoveClipsFromClipboard(int index); - ~RemoveClipsFromClipboard(); - void undo(); - void redo(); + virtual ~RemoveClipsFromClipboard() override; + virtual void doUndo() override; + virtual void doRedo() override; private: int pos; - Clip* clip; - bool old_project_changed; + Clip* clip; bool done; }; -class RenameClipCommand : public QUndoCommand { +class RenameClipCommand : public OliveAction { public: RenameClipCommand(); QVector clips; QString new_name; - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: - QVector old_names; - bool old_project_changed; + QVector old_names; }; -class SetPointer : public QUndoCommand { +class SetPointer : public OliveAction { public: SetPointer(void** pointer, void* data); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: bool old_changed; void** p; @@ -606,53 +577,53 @@ private: void* old_data; }; -class ReloadEffectsCommand : public QUndoCommand { +class ReloadEffectsCommand : public OliveAction { public: - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; }; -class SetQVariant : public QUndoCommand { +class SetQVariant : public OliveAction { public: SetQVariant(QVariant* itarget, const QVariant& iold, const QVariant& inew); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: QVariant* target; QVariant old_val; QVariant new_val; }; -class SetKeyframing : public QUndoCommand { +class SetKeyframing : public OliveAction { public: SetKeyframing(EffectRow* irow, bool ib); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: EffectRow* row; bool b; }; -class RefreshClips : public QUndoCommand { +class RefreshClips : public OliveAction { public: RefreshClips(Media* m); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Media* media; }; -class UpdateViewer : public QUndoCommand { +class UpdateViewer : public OliveAction { public: - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; }; -class SetEffectData : public QUndoCommand { +class SetEffectData : public OliveAction { public: SetEffectData(Effect* e, const QByteArray &s); - void undo(); - void redo(); + virtual void doUndo() override; + virtual void doRedo() override; private: Effect* effect; QByteArray data; diff --git a/ui/checkboxex.cpp b/ui/checkboxex.cpp index c9134c321..0b3f7bec1 100644 --- a/ui/checkboxex.cpp +++ b/ui/checkboxex.cpp @@ -8,5 +8,5 @@ CheckboxEx::CheckboxEx(QWidget* parent) : QCheckBox(parent) { void CheckboxEx::checkbox_command() { CheckboxCommand* c = new CheckboxCommand(this); - undo_stack.push(c); + Olive::UndoStack.push(c); } diff --git a/ui/graphview.cpp b/ui/graphview.cpp index 9f0d308cb..867d49765 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -679,7 +679,7 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { void GraphView::mouseReleaseEvent(QMouseEvent *) { if (click_add_proc) { - undo_stack.push(new KeyframeFieldSet(click_add_field, click_add_key)); + Olive::UndoStack.push(new KeyframeFieldSet(click_add_field, click_add_key)); } else if (moved_keys && selected_keys.size() > 0) { ComboAction* ca = new ComboAction(); switch (current_handle) { @@ -701,7 +701,7 @@ void GraphView::mouseReleaseEvent(QMouseEvent *) { } break; } - undo_stack.push(ca); + Olive::UndoStack.push(ca); } moved_keys = false; mousedown = false; @@ -772,7 +772,7 @@ void GraphView::set_selected_keyframe_type(int type) { EffectKeyframe& key = row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)]; ca->append(new SetInt(&key.type, type)); } - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(false); } } diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index 12d4999f5..ce47ee95f 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -70,7 +70,7 @@ void KeyframeView::menu_set_key_type(QAction* a) { EffectField* f = selected_fields.at(i); ca->append(new SetInt(&f->keyframes[selected_keyframes.at(i)].type, a->data().toInt())); } - undo_stack.push(ca); + Olive::UndoStack.push(ca); update_ui(false); } } @@ -405,7 +405,7 @@ void KeyframeView::mouseReleaseEvent(QMouseEvent*) { selected_fields.at(i)->keyframes.at(selected_keyframes.at(i)).time )); } - undo_stack.push(ca); + Olive::UndoStack.push(ca); } select_rect = false; diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index bb8cd863b..6b8c35d0e 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -19,7 +19,6 @@ #include "io/math.h" #include "io/config.h" -#include "io/avtogl.h" #include "panels/timeline.h" #include "panels/viewer.h" @@ -281,10 +280,10 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { c->texture = new QOpenGLTexture(QOpenGLTexture::Target2D); c->texture->setSize(c->stream->codecpar->width, c->stream->codecpar->height); - c->texture->setFormat(get_gl_tex_fmt_from_av(c->pix_fmt)); + c->texture->setFormat(QOpenGLTexture::RGBA8_UNorm); c->texture->setMipLevels(c->texture->maximumMipLevels()); c->texture->setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear); - c->texture->allocateStorage(get_gl_pix_fmt_from_av(c->pix_fmt), QOpenGLTexture::UInt8); + c->texture->allocateStorage(QOpenGLTexture::RGBA, QOpenGLTexture::UInt8); } // retrieve video frame from cache and store it in c->texture @@ -304,7 +303,7 @@ GLuint compose_sequence(ComposeSequenceParams ¶ms) { // create 3 fbos for nested sequences, 2 for most clips int fbo_count = (c->media != nullptr && c->media->get_type() == MEDIA_TYPE_SEQUENCE) ? 3 : 2; - c->fbo = new QOpenGLFramebufferObject* [fbo_count]; + c->fbo = new QOpenGLFramebufferObject* [size_t(fbo_count)]; for (int j=0;jfbo[j] = new QOpenGLFramebufferObject(video_width, video_height); diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index f9e32a274..cdf72326b 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -217,6 +217,8 @@ void RenderThread::paint() { } void RenderThread::start_render(QOpenGLContext *share, Sequence *s, const QString& save, GLvoid* pixels, int pixel_linesize, int idivider) { + Q_UNUSED(idivider); + seq = s; // stall any dependent actions diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 25541e464..206213b10 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -95,7 +95,7 @@ void TimelineHeader::set_in_point(long new_in) { new_out = viewer->seq->getEndFrame(); } - undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); + Olive::UndoStack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); update_parents(); } @@ -107,7 +107,7 @@ void TimelineHeader::set_out_point(long new_out) { new_in = 0; } - undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); + Olive::UndoStack.push(new SetTimelineInOutCommand(viewer->seq, true, new_in, new_out)); update_parents(); } @@ -260,7 +260,7 @@ void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { if (viewer->seq != nullptr) { dragging = false; if (resizing_workarea) { - undo_stack.push(new SetTimelineInOutCommand(viewer->seq, true, temp_workarea_in, temp_workarea_out)); + Olive::UndoStack.push(new SetTimelineInOutCommand(viewer->seq, true, temp_workarea_in, temp_workarea_out)); } else if (dragging_markers && selected_markers.size() > 0) { bool moved = false; ComboAction* ca = new ComboAction(); @@ -272,7 +272,7 @@ void TimelineHeader::mouseReleaseEvent(QMouseEvent*) { } } if (moved) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); } else { delete ca; } @@ -310,7 +310,7 @@ void TimelineHeader::delete_markers() { for (int i=0;imarkers.append(selected_markers.at(i)); } - undo_stack.push(dma); + Olive::UndoStack.push(dma); update_parents(); } } @@ -418,7 +418,7 @@ void TimelineHeader::paintEvent(QPaintEvent*) { } } - draw_marker(p, marker_x, yoff, height()-1, selected, false); + draw_marker(p, marker_x, yoff, height()-1, selected); } // draw playhead triangle diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 785bfee8d..09f9289ac 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -79,8 +79,8 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { QAction* redoAction = menu.addAction(tr("&Redo")); connect(undoAction, SIGNAL(triggered(bool)), Olive::MainWindow, SLOT(undo())); connect(redoAction, SIGNAL(triggered(bool)), Olive::MainWindow, SLOT(redo())); - undoAction->setEnabled(undo_stack.canUndo()); - redoAction->setEnabled(undo_stack.canRedo()); + undoAction->setEnabled(Olive::UndoStack.canUndo()); + redoAction->setEnabled(Olive::UndoStack.canRedo()); menu.addSeparator(); // collect all the selected clips @@ -180,7 +180,7 @@ void TimelineWidget::toggle_autoscale() { } } if (action->clips.size() > 0) { - undo_stack.push(action); + Olive::UndoStack.push(action); } else { delete action; } @@ -223,7 +223,7 @@ void TimelineWidget::rename_clip() { RenameClipCommand* rcc = new RenameClipCommand(); rcc->new_name = s; rcc->clips = selected_clips; - undo_stack.push(rcc); + Olive::UndoStack.push(rcc); update_ui(true); } } @@ -302,7 +302,7 @@ void TimelineWidget::dragEnterEvent(QDragEnterEvent *event) { } if (media_list.isEmpty()) { - undo_stack.undo(); + Olive::UndoStack.undo(); } else { import_init = true; panel_timeline->importing_files = true; @@ -369,7 +369,7 @@ void TimelineWidget::dragLeaveEvent(QDragLeaveEvent* event) { event->accept(); if (panel_timeline->importing) { if (panel_timeline->importing_files) { - undo_stack.undo(); + Olive::UndoStack.undo(); } panel_timeline->importing_files = false; panel_timeline->ghosts.clear(); @@ -496,7 +496,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) { panel_timeline->add_clips_from_ghosts(ca, s); - undo_stack.push(ca); + Olive::UndoStack.push(ca); setFocus(); @@ -1133,7 +1133,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { } if (push_undo) { - undo_stack.push(ca); + Olive::UndoStack.push(ca); } else { delete ca; } @@ -2257,7 +2257,7 @@ void draw_waveform(Clip* clip, const FootageStream* ms, long media_length, QPain int last_waveform_index = -1; for (int i=waveform_start;iclip_in + ((double) i/zoom))/media_length) * ms->audio_preview.size())/divider)*divider; + int waveform_index = qFloor((((clip->clip_in + (double(i)/zoom))/media_length) * ms->audio_preview.size())/divider)*divider; if (last_waveform_index < 0) last_waveform_index = waveform_index; if (clip->reverse) { @@ -2455,13 +2455,23 @@ void TimelineWidget::paintEvent(QPaintEvent*) { space_for_thumb -= getScreenPointFromFrame(panel_timeline->zoom, clip->get_closing_transition()->get_true_length()); } int thumb_height = clip_rect.height()-thumb_y; - int thumb_width = (thumb_height*((double)ms->video_preview.width()/(double)ms->video_preview.height())); + int thumb_width = qRound(thumb_height*(double(ms->video_preview.width())/double(ms->video_preview.height()))); if (thumb_x + thumb_width >= 0 && thumb_height > thumb_y && thumb_y + thumb_height >= 0 && space_for_thumb > MAX_TEXT_WIDTH) { int thumb_clip_width = qMin(thumb_width, space_for_thumb); - p.drawImage(QRect(thumb_x, clip_rect.y()+thumb_y, thumb_clip_width, thumb_height), ms->video_preview, QRect(0, 0, thumb_clip_width*((double)ms->video_preview.width()/(double)thumb_width), ms->video_preview.height())); + p.drawImage(QRect(thumb_x, + clip_rect.y()+thumb_y, + thumb_clip_width, + thumb_height), + ms->video_preview, + QRect(0, + 0, + qRound(thumb_clip_width*(double(ms->video_preview.width())/double(thumb_width))), + ms->video_preview.height() + ) + ); } } if (clip->timeline_out - clip->timeline_in + clip->clip_in > clip->getMaximumLength()) { @@ -2526,7 +2536,7 @@ void TimelineWidget::paintEvent(QPaintEvent*) { long marker_time = m.frame + clip->timeline_in - clip->clip_in; int marker_x = panel_timeline->getTimelineScreenPointFromFrame(marker_time); if (marker_x > clip_rect.x() && marker_x < clip_rect.right()) { - draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false, false); + draw_marker(p, marker_x, clip_rect.bottom()-p.fontMetrics().height(), clip_rect.bottom(), false); } } p.setBrush(Qt::NoBrush); diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 033a845e5..2ae3ac687 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -19,7 +19,6 @@ #include "project/undo.h" #include "project/media.h" #include "ui/viewercontainer.h" -#include "io/avtogl.h" #include "ui/timelinewidget.h" #include "ui/renderfunctions.h" #include "ui/renderthread.h" From 8034f047bae7c78ad6d476600b7467eb95a096c8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Feb 2019 13:10:51 -0800 Subject: [PATCH 180/202] added focus panel filter --- mainwindow.cpp | 120 +++++---------------------------------------- mainwindow.h | 17 +------ olive.pro | 6 ++- panels/timeline.h | 6 ++- ui/focusfilter.cpp | 109 ++++++++++++++++++++++++++++++++++++++++ ui/focusfilter.h | 29 +++++++++++ 6 files changed, 159 insertions(+), 128 deletions(-) create mode 100644 ui/focusfilter.cpp create mode 100644 ui/focusfilter.h diff --git a/mainwindow.cpp b/mainwindow.cpp index 4a1780f6a..e96cdff13 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -17,6 +17,7 @@ #include "ui/sourceiconview.h" #include "ui/timelineheader.h" #include "ui/cursors.h" +#include "ui/focusfilter.h" #include "panels/panels.h" #include "panels/project.h" @@ -669,22 +670,22 @@ void MainWindow::setup_menus() { QMenu* playback_menu = menuBar->addMenu(tr("&Playback")); connect(playback_menu, SIGNAL(aboutToShow()), this, SLOT(playbackMenu_About_To_Be_Shown())); - playback_menu->addAction(tr("Go to Start"), this, SLOT(go_to_start()), QKeySequence("Home"))->setProperty("id", "gotostart"); - playback_menu->addAction(tr("Previous Frame"), this, SLOT(prev_frame()), QKeySequence("Left"))->setProperty("id", "prevframe"); - playback_menu->addAction(tr("Play/Pause"), this, SLOT(playpause()), QKeySequence("Space"))->setProperty("id", "playpause"); - playback_menu->addAction(tr("Play In to Out"), this, SLOT(play_in_to_out()), QKeySequence("Shift+Space"))->setProperty("id", "playintoout"); - playback_menu->addAction(tr("Next Frame"), this, SLOT(next_frame()), QKeySequence("Right"))->setProperty("id", "nextframe"); - playback_menu->addAction(tr("Go to End"), this, SLOT(go_to_end()), QKeySequence("End"))->setProperty("id", "gotoend"); + playback_menu->addAction(tr("Go to Start"), &Olive::FocusFilter, SLOT(go_to_start()), QKeySequence("Home"))->setProperty("id", "gotostart"); + playback_menu->addAction(tr("Previous Frame"), &Olive::FocusFilter, SLOT(prev_frame()), QKeySequence("Left"))->setProperty("id", "prevframe"); + playback_menu->addAction(tr("Play/Pause"), &Olive::FocusFilter, SLOT(playpause()), QKeySequence("Space"))->setProperty("id", "playpause"); + playback_menu->addAction(tr("Play In to Out"), &Olive::FocusFilter, SLOT(play_in_to_out()), QKeySequence("Shift+Space"))->setProperty("id", "playintoout"); + playback_menu->addAction(tr("Next Frame"), &Olive::FocusFilter, SLOT(next_frame()), QKeySequence("Right"))->setProperty("id", "nextframe"); + playback_menu->addAction(tr("Go to End"), &Olive::FocusFilter, SLOT(go_to_end()), QKeySequence("End"))->setProperty("id", "gotoend"); playback_menu->addSeparator(); playback_menu->addAction(tr("Go to Previous Cut"), panel_timeline, SLOT(previous_cut()), QKeySequence("Up"))->setProperty("id", "prevcut"); playback_menu->addAction(tr("Go to Next Cut"), panel_timeline, SLOT(next_cut()), QKeySequence("Down"))->setProperty("id", "nextcut"); playback_menu->addSeparator(); - playback_menu->addAction(tr("Go to In Point"), this, SLOT(go_to_in()), QKeySequence("Shift+I"))->setProperty("id", "gotoin"); - playback_menu->addAction(tr("Go to Out Point"), this, SLOT(go_to_out()), QKeySequence("Shift+O"))->setProperty("id", "gotoout"); + playback_menu->addAction(tr("Go to In Point"), &Olive::FocusFilter, SLOT(go_to_in()), QKeySequence("Shift+I"))->setProperty("id", "gotoin"); + playback_menu->addAction(tr("Go to Out Point"), &Olive::FocusFilter, SLOT(go_to_out()), QKeySequence("Shift+O"))->setProperty("id", "gotoout"); playback_menu->addSeparator(); - playback_menu->addAction(tr("Shuttle Left"), this, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); - playback_menu->addAction(tr("Shuttle Stop"), this, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); - playback_menu->addAction(tr("Shuttle Right"), this, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); + playback_menu->addAction(tr("Shuttle Left"), &Olive::FocusFilter, SLOT(decrease_speed()), QKeySequence("J"))->setProperty("id", "decspeed"); + playback_menu->addAction(tr("Shuttle Stop"), &Olive::FocusFilter, SLOT(pause()), QKeySequence("K"))->setProperty("id", "pause"); + playback_menu->addAction(tr("Shuttle Right"), &Olive::FocusFilter, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); playback_menu->addSeparator(); loop_action = playback_menu->addAction(tr("Loop"), this, SLOT(toggle_bool_action())); @@ -991,104 +992,7 @@ void MainWindow::reset_layout() { setup_layout(true); } -void MainWindow::go_to_in() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->go_to_in(); - } else { - panel_sequence_viewer->go_to_in(); - } -} -void MainWindow::go_to_out() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->go_to_out(); - } else { - panel_sequence_viewer->go_to_out(); - } -} - -void MainWindow::go_to_start() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->go_to_start(); - } else { - panel_sequence_viewer->go_to_start(); - } -} - -void MainWindow::prev_frame() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->previous_frame(); - } else { - panel_sequence_viewer->previous_frame(); - } -} - -void MainWindow::play_in_to_out() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->play(true); - } else { - panel_sequence_viewer->play(true); - } -} - -void MainWindow::next_frame() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->next_frame(); - } else { - panel_sequence_viewer->next_frame(); - } -} - -void MainWindow::go_to_end() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->go_to_end(); - } else { - panel_sequence_viewer->go_to_end(); - } -} - -void MainWindow::playpause() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->toggle_play(); - } else { - panel_sequence_viewer->toggle_play(); - } -} - -void MainWindow::pause() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->pause(); - } else { - panel_sequence_viewer->pause(); - } -} - -void MainWindow::increase_speed() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->increase_speed(); - } else { - panel_sequence_viewer->increase_speed(); - } -} - -void MainWindow::decrease_speed() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->decrease_speed(); - } else { - panel_sequence_viewer->decrease_speed(); - } -} void MainWindow::maximize_panel() { // toggles between normal state and a state of one panel being maximized diff --git a/mainwindow.h b/mainwindow.h index 92514b300..2ca0d1fa3 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -53,21 +53,7 @@ private slots: void zoom_in(); void zoom_out(); void export_dialog(); - void ripple_delete(); - - void go_to_in(); - void go_to_out(); - void go_to_start(); - void prev_frame(); - void play_in_to_out(); - void playpause(); - void pause(); - void increase_speed(); - void decrease_speed(); - void next_frame(); - void go_to_end(); - void prev_cut(); - void next_cut(); + void ripple_delete(); void maximize_panel(); void reset_layout(); @@ -110,7 +96,6 @@ private slots: void set_marker(); - void toggle_enable_clips(); void edit_to_in_point(); void edit_to_out_point(); void paste_insert(); diff --git a/olive.pro b/olive.pro index ab11ef443..203268b9f 100644 --- a/olive.pro +++ b/olive.pro @@ -142,7 +142,8 @@ SOURCES += \ dialogs/advancedvideodialog.cpp \ ui/cursors.cpp \ ui/menuhelper.cpp \ - oliveglobal.cpp + oliveglobal.cpp \ + ui/focusfilter.cpp HEADERS += \ mainwindow.h \ @@ -249,7 +250,8 @@ HEADERS += \ ui/cursors.h \ ui/menuhelper.h \ oliveglobal.h \ - project/projectelements.h + project/projectelements.h \ + ui/focusfilter.h FORMS += diff --git a/panels/timeline.h b/panels/timeline.h index af8ef47ce..d357ff654 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -88,8 +88,7 @@ public: void delete_areas_and_relink(ComboAction *ca, QVector& areas, bool deselect_areas); void relink_clips_using_ids(QVector& old_clips, QVector& new_clips); void update_sequence(); - void increase_track_height(); - void decrease_track_height(); + void add_transition(); QVector get_tracks_of_linked_clips(int i); bool has_clip_been_split(int c); @@ -215,6 +214,9 @@ public slots: void ripple_delete_empty_space(); void toggle_enable_on_selected_clips(); + void increase_track_height(); + void decrease_track_height(); + void previous_cut(); void next_cut(); diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp new file mode 100644 index 000000000..7d5424bf9 --- /dev/null +++ b/ui/focusfilter.cpp @@ -0,0 +1,109 @@ +#include "focusfilter.h" + +#include "panels/panels.h" + +FocusFilter Olive::FocusFilter; + +FocusFilter::FocusFilter() +{ + +} + +void FocusFilter::go_to_in() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->go_to_in(); + } else { + panel_sequence_viewer->go_to_in(); + } +} + +void FocusFilter::go_to_out() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->go_to_out(); + } else { + panel_sequence_viewer->go_to_out(); + } +} + +void FocusFilter::go_to_start() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->go_to_start(); + } else { + panel_sequence_viewer->go_to_start(); + } +} + +void FocusFilter::prev_frame() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->previous_frame(); + } else { + panel_sequence_viewer->previous_frame(); + } +} + +void FocusFilter::play_in_to_out() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->play(true); + } else { + panel_sequence_viewer->play(true); + } +} + +void FocusFilter::next_frame() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->next_frame(); + } else { + panel_sequence_viewer->next_frame(); + } +} + +void FocusFilter::go_to_end() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->go_to_end(); + } else { + panel_sequence_viewer->go_to_end(); + } +} + +void FocusFilter::playpause() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->toggle_play(); + } else { + panel_sequence_viewer->toggle_play(); + } +} + +void FocusFilter::pause() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->pause(); + } else { + panel_sequence_viewer->pause(); + } +} + +void FocusFilter::increase_speed() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->increase_speed(); + } else { + panel_sequence_viewer->increase_speed(); + } +} + +void FocusFilter::decrease_speed() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->decrease_speed(); + } else { + panel_sequence_viewer->decrease_speed(); + } +} diff --git a/ui/focusfilter.h b/ui/focusfilter.h new file mode 100644 index 000000000..f528ef997 --- /dev/null +++ b/ui/focusfilter.h @@ -0,0 +1,29 @@ +#ifndef FOCUSFILTER_H +#define FOCUSFILTER_H + +#include + +class FocusFilter : public QObject { + Q_OBJECT +public: + FocusFilter(); + +public slots: + void go_to_in(); + void go_to_out(); + void go_to_start(); + void prev_frame(); + void play_in_to_out(); + void playpause(); + void pause(); + void increase_speed(); + void decrease_speed(); + void next_frame(); + void go_to_end(); +}; + +namespace Olive { + extern FocusFilter FocusFilter; +} + +#endif // FOCUSFILTER_H From acf286e1d8a653011306dac60d2c5f78e71305e5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Feb 2019 16:42:36 -0800 Subject: [PATCH 181/202] added focus filter --- dialogs/newsequencedialog.cpp | 2 +- io/loadthread.cpp | 4 +- mainwindow.cpp | 379 +++++----------------------------- mainwindow.h | 38 +--- olive.pro | 7 + oliveglobal.cpp | 40 ++++ oliveglobal.h | 11 + panels/project.cpp | 35 +++- panels/project.h | 6 +- panels/timeline.cpp | 76 ++++++- panels/timeline.h | 5 +- project/sourcescommon.cpp | 2 +- ui/focusfilter.cpp | 125 +++++++++++ ui/focusfilter.h | 17 ++ ui/menuhelper.cpp | 54 ++++- ui/menuhelper.h | 28 +++ ui/timelinewidget.cpp | 25 +-- 17 files changed, 442 insertions(+), 412 deletions(-) diff --git a/dialogs/newsequencedialog.cpp b/dialogs/newsequencedialog.cpp index 054c3e065..51a5dd9ac 100644 --- a/dialogs/newsequencedialog.cpp +++ b/dialogs/newsequencedialog.cpp @@ -75,7 +75,7 @@ void NewSequenceDialog::create() { s->audio_layout = AV_CH_LAYOUT_STEREO; ComboAction* ca = new ComboAction(); - panel_project->new_sequence(ca, s, true, nullptr); + panel_project->create_sequence_internal(ca, s, true, nullptr); Olive::UndoStack.push(ca); } else { ComboAction* ca = new ComboAction(); diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 7e83c81dd..09d8016b0 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -163,7 +163,7 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { switch (type) { case MEDIA_TYPE_FOLDER: { - Media* folder = panel_project->new_folder(nullptr); + Media* folder = panel_project->create_folder_internal(nullptr); folder->temp_id2 = 0; for (int j=0;jnew_sequence(nullptr, s, false, parent); + Media* m = panel_project->create_sequence_internal(nullptr, s, false, parent); loaded_sequences.append(m); } diff --git a/mainwindow.cpp b/mainwindow.cpp index e96cdff13..db76121f9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -29,8 +29,6 @@ #include "dialogs/aboutdialog.h" #include "dialogs/newsequencedialog.h" #include "dialogs/exportdialog.h" -#include "dialogs/preferencesdialog.h" -#include "dialogs/demonotice.h" #include "dialogs/speeddialog.h" #include "dialogs/actionsearch.h" #include "dialogs/debugdialog.h" @@ -350,67 +348,6 @@ void MainWindow::show_debug_log() { debug_dialog->show(); } -void MainWindow::delete_slot() { - if (panel_timeline->headers->hasFocus()) { - panel_timeline->headers->delete_markers(); - } else if (panel_footage_viewer->headers->hasFocus()) { - panel_footage_viewer->headers->delete_markers(); - } else if (panel_sequence_viewer->headers->hasFocus()) { - panel_sequence_viewer->headers->delete_markers(); - } else if (panel_timeline->focused()) { - panel_timeline->delete_selection(Olive::ActiveSequence->selections, false); - } else if (panel_effect_controls->is_focused()) { - panel_effect_controls->delete_effects(); - } else if (panel_project->is_focused()) { - panel_project->delete_selected_media(); - } else if (panel_effect_controls->keyframe_focus()) { - panel_effect_controls->delete_selected_keyframes(); - } else if (panel_graph_editor->view_is_focused()) { - panel_graph_editor->delete_selected_keys(); - } -} - -void MainWindow::select_all() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline) { - panel_timeline->select_all(); - } else if (focused_panel == panel_graph_editor) { - panel_graph_editor->select_all(); - } -} - -void MainWindow::new_sequence() { - NewSequenceDialog nsd(this); - nsd.set_sequence_name(panel_project->get_next_sequence_name()); - nsd.exec(); -} - -void MainWindow::zoom_in() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline) { - panel_timeline->set_zoom(true); - } else if (focused_panel == panel_effect_controls) { - panel_effect_controls->set_zoom(true); - } else if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->set_zoom(true); - } else if (focused_panel == panel_sequence_viewer) { - panel_sequence_viewer->set_zoom(true); - } -} - -void MainWindow::zoom_out() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline) { - panel_timeline->set_zoom(false); - } else if (focused_panel == panel_effect_controls) { - panel_effect_controls->set_zoom(false); - } else if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->set_zoom(false); - } else if (focused_panel == panel_sequence_viewer) { - panel_sequence_viewer->set_zoom(false); - } -} - void MainWindow::export_dialog() { if (Olive::ActiveSequence == nullptr) { QMessageBox::information(this, tr("No active sequence"), tr("Please open the sequence you wish to export."), QMessageBox::Ok); @@ -437,22 +374,6 @@ void MainWindow::editMenu_About_To_Be_Shown() { redo_action->setEnabled(Olive::UndoStack.canRedo()); } -void MainWindow::undo() { - // workaround to prevent crash (and also users should never need to do this) - if (!panel_timeline->importing) { - Olive::UndoStack.undo(); - update_ui(true); - } -} - -void MainWindow::redo() { - // workaround to prevent crash (and also users should never need to do this) - if (!panel_timeline->importing) { - Olive::UndoStack.redo(); - update_ui(true); - } -} - void MainWindow::open_speed_dialog() { if (Olive::ActiveSequence != nullptr) { SpeedDialog s(this); @@ -466,35 +387,6 @@ void MainWindow::open_speed_dialog() { } } -void MainWindow::cut() { - if (Olive::ActiveSequence != nullptr) { - QDockWidget* focused_panel = get_focused_panel(); - if (panel_timeline == focused_panel) { - panel_timeline->copy(true); - } else if (panel_effect_controls == focused_panel) { - panel_effect_controls->copy(true); - } - } -} - -void MainWindow::copy() { - if (Olive::ActiveSequence != nullptr) { - QDockWidget* focused_panel = get_focused_panel(); - if (panel_timeline == focused_panel) { - panel_timeline->copy(false); - } else if (panel_effect_controls == focused_panel) { - panel_effect_controls->copy(false); - } - } -} - -void MainWindow::paste() { - QDockWidget* focused_panel = get_focused_panel(); - if ((panel_timeline == focused_panel || panel_effect_controls == focused_panel) && Olive::ActiveSequence != nullptr) { - panel_timeline->paste(false); - } -} - void MainWindow::setup_menus() { QMenuBar* menuBar = new QMenuBar(this); setMenuBar(menuBar); @@ -537,34 +429,24 @@ void MainWindow::setup_menus() { QMenu* edit_menu = menuBar->addMenu(tr("&Edit")); connect(edit_menu, SIGNAL(aboutToShow()), this, SLOT(editMenu_About_To_Be_Shown())); - undo_action = edit_menu->addAction(tr("&Undo"), this, SLOT(undo()), QKeySequence("Ctrl+Z")); + undo_action = edit_menu->addAction(tr("&Undo"), Olive::Global.data(), SLOT(undo()), QKeySequence("Ctrl+Z")); undo_action->setProperty("id", "undo"); - redo_action = edit_menu->addAction(tr("Redo"), this, SLOT(redo()), QKeySequence("Ctrl+Shift+Z")); + redo_action = edit_menu->addAction(tr("Redo"), Olive::Global.data(), SLOT(redo()), QKeySequence("Ctrl+Shift+Z")); redo_action->setProperty("id", "redo"); edit_menu->addSeparator(); - edit_menu->addAction(tr("Cu&t"), this, SLOT(cut()), QKeySequence("Ctrl+X"))->setProperty("id", "cut"); - edit_menu->addAction(tr("Cop&y"), this, SLOT(copy()), QKeySequence("Ctrl+C"))->setProperty("id", "copy"); - edit_menu->addAction(tr("&Paste"), this, SLOT(paste()), QKeySequence("Ctrl+V"))->setProperty("id", "paste"); - edit_menu->addAction(tr("Paste Insert"), this, SLOT(paste_insert()), QKeySequence("Ctrl+Shift+V"))->setProperty("id", "pasteinsert"); - edit_menu->addAction(tr("Duplicate"), this, SLOT(duplicate()), QKeySequence("Ctrl+D"))->setProperty("id", "duplicate"); - edit_menu->addAction(tr("Delete"), this, SLOT(delete_slot()), QKeySequence("Del"))->setProperty("id", "delete"); - edit_menu->addAction(tr("Ripple Delete"), this, SLOT(ripple_delete()), QKeySequence("Shift+Del"))->setProperty("id", "rippledelete"); - edit_menu->addAction(tr("Split"), panel_timeline, SLOT(split_at_playhead()), QKeySequence("Ctrl+K"))->setProperty("id", "split"); + Olive::MenuHelper.make_edit_functions_menu(edit_menu); edit_menu->addSeparator(); - edit_menu->addAction(tr("Select &All"), this, SLOT(select_all()), QKeySequence("Ctrl+A"))->setProperty("id", "selectall"); + edit_menu->addAction(tr("Select &All"), &Olive::FocusFilter, SLOT(select_all()), QKeySequence("Ctrl+A"))->setProperty("id", "selectall"); edit_menu->addAction(tr("Deselect All"), panel_timeline, SLOT(deselect()), QKeySequence("Ctrl+Shift+A"))->setProperty("id", "deselectall"); edit_menu->addSeparator(); - edit_menu->addAction(tr("Add Default Transition"), this, SLOT(add_default_transition()), QKeySequence("Ctrl+Shift+D"))->setProperty("id", "deftransition"); - edit_menu->addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links()), QKeySequence("Ctrl+L"))->setProperty("id", "linkunlink"); - edit_menu->addAction(tr("Enable/Disable"), panel_timeline, SLOT(toggle_enable_on_selected_clips()), QKeySequence("Shift+E"))->setProperty("id", "enabledisable"); - edit_menu->addAction(tr("Nest"), this, SLOT(nest()))->setProperty("id", "nest"); + Olive::MenuHelper.make_clip_functions_menu(edit_menu); edit_menu->addSeparator(); @@ -588,8 +470,8 @@ void MainWindow::setup_menus() { QMenu* view_menu = menuBar->addMenu(tr("&View")); connect(view_menu, SIGNAL(aboutToShow()), this, SLOT(viewMenu_About_To_Be_Shown())); - view_menu->addAction(tr("Zoom In"), this, SLOT(zoom_in()), QKeySequence("="))->setProperty("id", "zoomin"); - view_menu->addAction(tr("Zoom Out"), this, SLOT(zoom_out()), QKeySequence("-"))->setProperty("id", "zoomout"); + view_menu->addAction(tr("Zoom In"), &Olive::FocusFilter, SLOT(zoom_in()), QKeySequence("="))->setProperty("id", "zoomin"); + view_menu->addAction(tr("Zoom Out"), &Olive::FocusFilter, SLOT(zoom_out()), QKeySequence("-"))->setProperty("id", "zoomout"); view_menu->addAction(tr("Increase Track Height"), panel_timeline, SLOT(increase_track_height()), QKeySequence("Ctrl+="))->setProperty("id", "vzoomin"); view_menu->addAction(tr("Decrease Track Height"), panel_timeline, SLOT(decrease_track_height()), QKeySequence("Ctrl+-"))->setProperty("id", "vzoomout"); @@ -874,7 +756,7 @@ void MainWindow::setup_menus() { tools_menu->addSeparator(); - tools_menu->addAction(tr("Preferences"), this, SLOT(preferences()), QKeySequence("Ctrl+,"))->setProperty("id", "prefs"); + tools_menu->addAction(tr("Preferences"), Olive::Global.data(), SLOT(open_preferences()), QKeySequence("Ctrl+,"))->setProperty("id", "prefs"); #ifdef QT_DEBUG tools_menu->addAction(tr("Clear Undo"), this, SLOT(clear_undo_stack()))->setProperty("id", "clearundo"); @@ -897,23 +779,6 @@ void MainWindow::setup_menus() { load_shortcuts(get_config_path() + "/shortcuts", true); } -void MainWindow::set_bool_action_checked(QAction *a) { - if (!a->data().isNull()) { - bool* variable = reinterpret_cast(a->data().value()); - a->setChecked(*variable); - } -} - -void MainWindow::set_int_action_checked(QAction *a, const int& i) { - if (!a->data().isNull()) { - a->setChecked(a->data() == i); - } -} - -void MainWindow::set_button_action_checked(QAction *a) { - a->setChecked(reinterpret_cast(a->data().value())->isChecked()); -} - void MainWindow::updateTitle() { setWindowTitle(QString("%1 - %2[*]").arg(Olive::AppName, (Olive::ActiveProjectFilename.isEmpty()) ? @@ -1022,15 +887,6 @@ void MainWindow::maximize_panel() { } } -void MainWindow::preferences() { - panel_sequence_viewer->pause(); - panel_footage_viewer->pause(); - - PreferencesDialog pd(this); - pd.setup_kbd_shortcuts(menuBar()); - pd.exec(); -} - void MainWindow::full_screen_viewer() { if (get_focused_panel() == panel_footage_viewer) { panel_footage_viewer->viewer_widget->set_fullscreen(); @@ -1050,16 +906,16 @@ void MainWindow::windowMenu_About_To_Be_Shown() { } void MainWindow::playbackMenu_About_To_Be_Shown() { - set_bool_action_checked(loop_action); + Olive::MenuHelper.set_bool_action_checked(loop_action); } void MainWindow::viewMenu_About_To_Be_Shown() { - set_bool_action_checked(track_lines); + Olive::MenuHelper.set_bool_action_checked(track_lines); - set_int_action_checked(frames_action, config.timecode_view); - set_int_action_checked(drop_frame_action, config.timecode_view); - set_int_action_checked(nondrop_frame_action, config.timecode_view); - set_int_action_checked(milliseconds_action, config.timecode_view); + Olive::MenuHelper.set_int_action_checked(frames_action, config.timecode_view); + Olive::MenuHelper.set_int_action_checked(drop_frame_action, config.timecode_view); + Olive::MenuHelper.set_int_action_checked(nondrop_frame_action, config.timecode_view); + Olive::MenuHelper.set_int_action_checked(milliseconds_action, config.timecode_view); title_safe_off->setChecked(!config.show_title_safe_area); title_safe_default->setChecked(config.show_title_safe_area && !config.use_custom_title_safe_ratio); @@ -1073,59 +929,34 @@ void MainWindow::viewMenu_About_To_Be_Shown() { } void MainWindow::toolMenu_About_To_Be_Shown() { - set_button_action_checked(pointer_tool_action); - set_button_action_checked(edit_tool_action); - set_button_action_checked(ripple_tool_action); - set_button_action_checked(razor_tool_action); - set_button_action_checked(slip_tool_action); - set_button_action_checked(slide_tool_action); - set_button_action_checked(hand_tool_action); - set_button_action_checked(transition_tool_action); - set_button_action_checked(snap_toggle); + Olive::MenuHelper.set_button_action_checked(pointer_tool_action); + Olive::MenuHelper.set_button_action_checked(edit_tool_action); + Olive::MenuHelper.set_button_action_checked(ripple_tool_action); + Olive::MenuHelper.set_button_action_checked(razor_tool_action); + Olive::MenuHelper.set_button_action_checked(slip_tool_action); + Olive::MenuHelper.set_button_action_checked(slide_tool_action); + Olive::MenuHelper.set_button_action_checked(hand_tool_action); + Olive::MenuHelper.set_button_action_checked(transition_tool_action); + Olive::MenuHelper.set_button_action_checked(snap_toggle); - set_bool_action_checked(selecting_also_seeks); - set_bool_action_checked(edit_tool_also_seeks); - set_bool_action_checked(edit_tool_selects_links); - set_bool_action_checked(seek_to_end_of_pastes); - set_bool_action_checked(scroll_wheel_zooms); - set_bool_action_checked(rectified_waveforms); - set_bool_action_checked(enable_drag_files_to_timeline); - set_bool_action_checked(autoscale_by_default); - set_bool_action_checked(enable_seek_to_import); - set_bool_action_checked(enable_audio_scrubbing); - set_bool_action_checked(enable_drop_on_media_to_replace); - set_bool_action_checked(enable_hover_focus); - set_bool_action_checked(set_name_and_marker); - set_bool_action_checked(seek_also_selects); + Olive::MenuHelper.set_bool_action_checked(selecting_also_seeks); + Olive::MenuHelper.set_bool_action_checked(edit_tool_also_seeks); + Olive::MenuHelper.set_bool_action_checked(edit_tool_selects_links); + Olive::MenuHelper.set_bool_action_checked(seek_to_end_of_pastes); + Olive::MenuHelper.set_bool_action_checked(scroll_wheel_zooms); + Olive::MenuHelper.set_bool_action_checked(rectified_waveforms); + Olive::MenuHelper.set_bool_action_checked(enable_drag_files_to_timeline); + Olive::MenuHelper.set_bool_action_checked(autoscale_by_default); + Olive::MenuHelper.set_bool_action_checked(enable_seek_to_import); + Olive::MenuHelper.set_bool_action_checked(enable_audio_scrubbing); + Olive::MenuHelper.set_bool_action_checked(enable_drop_on_media_to_replace); + Olive::MenuHelper.set_bool_action_checked(enable_hover_focus); + Olive::MenuHelper.set_bool_action_checked(set_name_and_marker); + Olive::MenuHelper.set_bool_action_checked(seek_also_selects); - set_int_action_checked(no_autoscroll, config.autoscroll); - set_int_action_checked(page_autoscroll, config.autoscroll); - set_int_action_checked(smooth_autoscroll, config.autoscroll); -} - -void MainWindow::duplicate() { - if (panel_project->is_focused()) { - panel_project->duplicate_selected(); - } -} - -void MainWindow::add_default_transition() { - if (panel_timeline->focused()) panel_timeline->add_transition(); -} - -void MainWindow::new_folder() { - Media* m = panel_project->new_folder(nullptr); - Olive::UndoStack.push(new AddMediaCommand(m, panel_project->get_selected_folder())); - - QModelIndex index = project_model.create_index(m->row(), 0, m); - switch (config.project_view_type) { - case PROJECT_VIEW_TREE: - panel_project->tree_view->edit(panel_project->sorter->mapFromSource(index)); - break; - case PROJECT_VIEW_ICON: - panel_project->icon_view->edit(panel_project->sorter->mapFromSource(index)); - break; - } + Olive::MenuHelper.set_int_action_checked(no_autoscroll, config.autoscroll); + Olive::MenuHelper.set_int_action_checked(page_autoscroll, config.autoscroll); + Olive::MenuHelper.set_int_action_checked(smooth_autoscroll, config.autoscroll); } void MainWindow::fileMenu_About_To_Be_Shown() { @@ -1147,51 +978,11 @@ void MainWindow::fileMenu_About_To_Be_Shown() { } void MainWindow::ripple_to_in_point() { - if (panel_timeline->focused()) panel_timeline->ripple_to_in_point(true, true); + panel_timeline->ripple_to_in_point(true, true); } void MainWindow::ripple_to_out_point() { - if (panel_timeline->focused()) panel_timeline->ripple_to_in_point(false, true); -} - -void MainWindow::set_in_point() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->set_in_point(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->set_in_point(); - } -} - -void MainWindow::set_out_point() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->set_out_point(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->set_out_point(); - } -} - -void MainWindow::clear_in() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->clear_in(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->clear_in(); - } -} - -void MainWindow::clear_out() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->clear_out(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->clear_out(); - } -} - -void MainWindow::clear_inout() { - if (panel_timeline->focused() || panel_sequence_viewer->is_focused()) { - panel_sequence_viewer->clear_inout_point(); - } else if (panel_footage_viewer->is_focused()) { - panel_footage_viewer->clear_inout_point(); - } + panel_timeline->ripple_to_in_point(false, true); } void MainWindow::toggle_full_screen() { @@ -1204,16 +995,11 @@ void MainWindow::toggle_full_screen() { } void MainWindow::delete_inout() { - if (panel_timeline->focused()) { - panel_timeline->delete_in_out(false); - } + panel_timeline->delete_in_out(false); } -void MainWindow::ripple_delete_inout() -{ - if (panel_timeline->focused()) { - panel_timeline->delete_in_out(true); - } +void MainWindow::ripple_delete_inout() { + panel_timeline->delete_in_out(true); } void MainWindow::set_tsa_default() { @@ -1280,82 +1066,11 @@ void MainWindow::set_marker() { } void MainWindow::edit_to_in_point() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline) panel_timeline->ripple_to_in_point(true, false); + panel_timeline->ripple_to_in_point(true, false); } void MainWindow::edit_to_out_point() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline) panel_timeline->ripple_to_in_point(false, false); -} - -void MainWindow::nest() { - if (Olive::ActiveSequence != nullptr) { - QVector selected_clips; - long earliest_point = LONG_MAX; - - // get selected clips - for (int i=0;iclips.size();i++) { - Clip* c = Olive::ActiveSequence->clips.at(i); - if (c != nullptr && is_clip_selected(c, true)) { - selected_clips.append(i); - earliest_point = qMin(c->timeline_in, earliest_point); - } - } - - // nest them - if (!selected_clips.isEmpty()) { - ComboAction* ca = new ComboAction(); - - Sequence* s = new Sequence(); - - // create "nest" sequence - s->name = panel_project->get_next_sequence_name(tr("Nested Sequence")); - s->width = Olive::ActiveSequence->width; - s->height = Olive::ActiveSequence->height; - s->frame_rate = Olive::ActiveSequence->frame_rate; - s->audio_frequency = Olive::ActiveSequence->audio_frequency; - s->audio_layout = Olive::ActiveSequence->audio_layout; - - // copy all selected clips to the nest - for (int i=0;iappend(new DeleteClipAction(Olive::ActiveSequence, selected_clips.at(i))); - - // copy to new - Clip* copy = Olive::ActiveSequence->clips.at(selected_clips.at(i))->copy(s); - copy->timeline_in -= earliest_point; - copy->timeline_out -= earliest_point; - s->clips.append(copy); - } - - // relink clips in new nested sequences - panel_timeline->relink_clips_using_ids(selected_clips, s->clips); - - // add sequence to project - Media* m = panel_project->new_sequence(ca, s, false, nullptr); - - // add nested sequence to active sequence - QVector media_list; - media_list.append(m); - panel_timeline->create_ghosts_from_media(Olive::ActiveSequence, earliest_point, media_list); - panel_timeline->add_clips_from_ghosts(ca, Olive::ActiveSequence); - - panel_effect_controls->clear_effects(true); - Olive::ActiveSequence->selections.clear(); - - Olive::UndoStack.push(ca); - - update_ui(true); - } - } -} - -void MainWindow::paste_insert() { - QDockWidget* focused_panel = get_focused_panel(); - if (focused_panel == panel_timeline && Olive::ActiveSequence != nullptr) { - panel_timeline->paste(true); - } + panel_timeline->ripple_to_in_point(false, false); } void MainWindow::toggle_bool_action() { diff --git a/mainwindow.h b/mainwindow.h index 2ca0d1fa3..efedb5d38 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,14 +22,9 @@ public: void load_css_from_file(const QString& fn); public slots: - void undo(); - void redo(); - void open_speed_dialog(); - void cut(); - void copy(); - void paste(); - void nest(); - void toggle_full_screen(); + void open_speed_dialog(); + + void toggle_full_screen(); void toggle_bool_action(); @@ -45,21 +40,13 @@ private slots: void show_about(); void show_debug_log(); - void delete_slot(); - void select_all(); - void new_sequence(); - - void zoom_in(); - void zoom_out(); void export_dialog(); void ripple_delete(); void maximize_panel(); void reset_layout(); - void preferences(); - void full_screen_viewer(); void fileMenu_About_To_Be_Shown(); @@ -67,23 +54,11 @@ private slots: void windowMenu_About_To_Be_Shown(); void playbackMenu_About_To_Be_Shown(); void viewMenu_About_To_Be_Shown(); - void toolMenu_About_To_Be_Shown(); - - void duplicate(); - - void add_default_transition(); - - void new_folder(); + void toolMenu_About_To_Be_Shown(); void ripple_to_in_point(); void ripple_to_out_point(); - void set_in_point(); - void set_out_point(); - - void clear_in(); - void clear_out(); - void clear_inout(); void delete_inout(); void ripple_delete_inout(); @@ -98,7 +73,6 @@ private slots: void edit_to_in_point(); void edit_to_out_point(); - void paste_insert(); void set_autoscroll(); void menu_click_button(); void toggle_panel_visibility(); @@ -110,10 +84,6 @@ private: void setup_layout(bool reset); void setup_menus(); - void set_bool_action_checked(QAction* a); - void set_int_action_checked(QAction* a, const int& i); - void set_button_action_checked(QAction* a); - // menu bar menus QMenu* window_menu; diff --git a/olive.pro b/olive.pro index 203268b9f..44ccc6861 100644 --- a/olive.pro +++ b/olive.pro @@ -30,6 +30,13 @@ DEFINES += QT_DEPRECATED_WARNINGS # Tries to get the current Git short hash system("which git") { GITHASHVAR = $$system(git --git-dir $$PWD/.git --work-tree $$PWD log -1 --format=%h) + + # Fallback for Ubuntu/Launchpad (extracts Git hash from debian/changelog rather than Git repo) + # (see https://answers.launchpad.net/launchpad/+question/678556) + isEmpty(GITHASHVAR) { + GITHASHVAR = $$system(grep -Po '(?<=-)(([a-z0-9])\w+)(?=\+)' debian/changelog) + } + DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" } diff --git a/oliveglobal.cpp b/oliveglobal.cpp index 2767eb8c8..c0816abbf 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -9,6 +9,9 @@ #include "playback/audio.h" #include "dialogs/demonotice.h" +#include "dialogs/preferencesdialog.h" + +#include "project/sequence.h" #include #include @@ -185,8 +188,45 @@ void OliveGlobal::save_autorecovery_file() { } } +void OliveGlobal::open_preferences() { + panel_sequence_viewer->pause(); + panel_footage_viewer->pause(); + + PreferencesDialog pd(Olive::MainWindow); + pd.setup_kbd_shortcuts(Olive::MainWindow->menuBar()); + pd.exec(); +} + void OliveGlobal::open_project_worker(const QString& fn, bool autorecovery) { update_project_filename(fn); panel_project->load_project(autorecovery); Olive::UndoStack.clear(); } + +void OliveGlobal::undo() { + // workaround to prevent crash (and also users should never need to do this) + if (!panel_timeline->importing) { + Olive::UndoStack.undo(); + update_ui(true); + } +} + +void OliveGlobal::redo() { + // workaround to prevent crash (and also users should never need to do this) + if (!panel_timeline->importing) { + Olive::UndoStack.redo(); + update_ui(true); + } +} + +void OliveGlobal::paste() { + if (Olive::ActiveSequence != nullptr) { + panel_timeline->paste(false); + } +} + +void OliveGlobal::paste_insert() { + if (Olive::ActiveSequence != nullptr) { + panel_timeline->paste(true); + } +} diff --git a/oliveglobal.h b/oliveglobal.h index c22431df9..6615a37ab 100644 --- a/oliveglobal.h +++ b/oliveglobal.h @@ -21,6 +21,12 @@ public: void load_project_on_launch(const QString& s); public slots: + void undo(); + void redo(); + + void paste(); + void paste_insert(); + void new_project(); void open_project(); void open_recent(); @@ -45,6 +51,11 @@ public slots: */ void save_autorecovery_file(); + /** + * @brief Opens the Preferences dialog + */ + void open_preferences(); + private: void open_project_worker(const QString& fn, bool autorecovery); diff --git a/panels/project.cpp b/panels/project.cpp index 566d5083f..6178f5881 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -114,7 +114,7 @@ Project::Project(QWidget *parent) : icon4.addFile(QStringLiteral(":/icons/undo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_undo->setIcon(icon4); toolbar_undo->setToolTip("Undo"); - connect(toolbar_undo, SIGNAL(clicked(bool)), Olive::MainWindow, SLOT(undo())); + connect(toolbar_undo, SIGNAL(clicked(bool)), Olive::Global.data(), SLOT(undo())); toolbar->addWidget(toolbar_undo); QPushButton* toolbar_redo = new QPushButton(); @@ -123,7 +123,7 @@ Project::Project(QWidget *parent) : icon5.addFile(QStringLiteral(":/icons/redo-disabled.png"), QSize(), QIcon::Disabled, QIcon::On); toolbar_redo->setIcon(icon5); toolbar_redo->setToolTip("Redo"); - connect(toolbar_redo, SIGNAL(clicked(bool)), Olive::MainWindow, SLOT(redo())); + connect(toolbar_redo, SIGNAL(clicked(bool)), Olive::Global.data(), SLOT(redo())); toolbar->addWidget(toolbar_redo); QLineEdit* toolbar_search = new QLineEdit(); @@ -309,7 +309,7 @@ void Project::duplicate_selected() { for (int j=0;jget_type() == MEDIA_TYPE_SEQUENCE) { - new_sequence(ca, i->to_sequence()->copy(), false, item_to_media(items.at(j).parent())); + create_sequence_internal(ca, i->to_sequence()->copy(), false, item_to_media(items.at(j).parent())); duped = true; } } @@ -398,10 +398,31 @@ void Project::open_properties() { } } } - } + } } -Media* Project::new_sequence(ComboAction *ca, Sequence *s, bool open, Media* parent) { +void Project::new_folder() { + Media* m = create_folder_internal(nullptr); + Olive::UndoStack.push(new AddMediaCommand(m, get_selected_folder())); + + QModelIndex index = project_model.create_index(m->row(), 0, m); + switch (config.project_view_type) { + case PROJECT_VIEW_TREE: + tree_view->edit(sorter->mapFromSource(index)); + break; + case PROJECT_VIEW_ICON: + icon_view->edit(sorter->mapFromSource(index)); + break; + } +} + +void Project::new_sequence() { + NewSequenceDialog nsd(this); + nsd.set_sequence_name(panel_project->get_next_sequence_name()); + nsd.exec(); +} + +Media* Project::create_sequence_internal(ComboAction *ca, Sequence *s, bool open, Media* parent) { if (parent == nullptr) parent = project_model.get_root(); Media* item = new Media(parent); item->set_sequence(s); @@ -434,7 +455,7 @@ bool Project::is_focused() { return tree_view->hasFocus() || icon_view->hasFocus(); } -Media* Project::new_folder(QString name) { +Media* Project::create_folder_internal(QString name) { Media* item = new Media(nullptr); item->set_folder(); item->set_name(name); @@ -648,7 +669,7 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla for (int i=0;iseek(earliest_point); } - panel_timeline->ghosts.clear(); - panel_timeline->importing = false; - panel_timeline->snapped = false; + ghosts.clear(); + importing = false; + snapped = false; } int Timeline::get_track_height_size(bool video) { @@ -362,7 +362,69 @@ void Timeline::add_transition() { delete ca; } - update_ui(true); + update_ui(true); +} + +void Timeline::nest() { + if (Olive::ActiveSequence != nullptr) { + QVector selected_clips; + long earliest_point = LONG_MAX; + + // get selected clips + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); + if (c != nullptr && is_clip_selected(c, true)) { + selected_clips.append(i); + earliest_point = qMin(c->timeline_in, earliest_point); + } + } + + // nest them + if (!selected_clips.isEmpty()) { + ComboAction* ca = new ComboAction(); + + Sequence* s = new Sequence(); + + // create "nest" sequence + s->name = panel_project->get_next_sequence_name(tr("Nested Sequence")); + s->width = Olive::ActiveSequence->width; + s->height = Olive::ActiveSequence->height; + s->frame_rate = Olive::ActiveSequence->frame_rate; + s->audio_frequency = Olive::ActiveSequence->audio_frequency; + s->audio_layout = Olive::ActiveSequence->audio_layout; + + // copy all selected clips to the nest + for (int i=0;iappend(new DeleteClipAction(Olive::ActiveSequence, selected_clips.at(i))); + + // copy to new + Clip* copy = Olive::ActiveSequence->clips.at(selected_clips.at(i))->copy(s); + copy->timeline_in -= earliest_point; + copy->timeline_out -= earliest_point; + s->clips.append(copy); + } + + // relink clips in new nested sequences + relink_clips_using_ids(selected_clips, s->clips); + + // add sequence to project + Media* m = panel_project->create_sequence_internal(ca, s, false, nullptr); + + // add nested sequence to active sequence + QVector media_list; + media_list.append(m); + create_ghosts_from_media(Olive::ActiveSequence, earliest_point, media_list); + add_clips_from_ghosts(ca, Olive::ActiveSequence); + + panel_effect_controls->clear_effects(true); + Olive::ActiveSequence->selections.clear(); + + Olive::UndoStack.push(ca); + + update_ui(true); + } + } } int Timeline::calculate_track_height(int track, int value) { @@ -418,7 +480,7 @@ void Timeline::repaint_timeline() { && !zoom_just_changed) { // auto scroll if (config.autoscroll == AUTOSCROLL_PAGE_SCROLL) { - int playhead_x = panel_timeline->getTimelineScreenPointFromFrame(Olive::ActiveSequence->playhead); + int playhead_x = getTimelineScreenPointFromFrame(Olive::ActiveSequence->playhead); if (playhead_x < 0 || playhead_x > (editAreas->width() - videoScrollbar->width())) { horizontalScrollBar->setValue(getScreenPointFromFrame(zoom, Olive::ActiveSequence->playhead)); draw = false; @@ -515,11 +577,11 @@ void Timeline::ripple_delete_empty_space() { Selection s; s.in = rc_ripple_min; s.out = rc_ripple_max; - s.track = panel_timeline->cursor_track; + s.track = cursor_track; sels.append(s); - panel_timeline->delete_selection(sels, true); + delete_selection(sels, true); } void Timeline::resizeEvent(QResizeEvent *) { diff --git a/panels/timeline.h b/panels/timeline.h index d357ff654..77f0e7c7b 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -89,7 +89,6 @@ public: void relink_clips_using_ids(QVector& old_clips, QVector& new_clips); void update_sequence(); - void add_transition(); QVector get_tracks_of_linked_clips(int i); bool has_clip_been_split(int c); void ripple_to_in_point(bool in, bool ripple); @@ -220,6 +219,10 @@ public slots: void previous_cut(); void next_cut(); + void add_transition(); + + void nest(); + private slots: void zoom_in(); void zoom_out(); diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index eee339e62..56047899d 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -48,7 +48,7 @@ void SourcesCommon::create_seq_from_selected() { panel_timeline->create_ghosts_from_media(s, 0, media_list); panel_timeline->add_clips_from_ghosts(ca, s); - project_parent->new_sequence(ca, s, true, nullptr); + project_parent->create_sequence_internal(ca, s, true, nullptr); Olive::UndoStack.push(ca); } } diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp index 7d5424bf9..e0f50bfbf 100644 --- a/ui/focusfilter.cpp +++ b/ui/focusfilter.cpp @@ -1,6 +1,8 @@ #include "focusfilter.h" #include "panels/panels.h" +#include "project/sequence.h" +#include "ui/timelineheader.h" FocusFilter Olive::FocusFilter; @@ -107,3 +109,126 @@ void FocusFilter::decrease_speed() { panel_sequence_viewer->decrease_speed(); } } + +void FocusFilter::set_in_point() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->set_in_point(); + } else { + panel_sequence_viewer->set_in_point(); + } +} + +void FocusFilter::set_out_point() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->set_out_point(); + } else { + panel_sequence_viewer->set_out_point(); + } +} + +void FocusFilter::clear_in() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->clear_in(); + } else { + panel_sequence_viewer->clear_in(); + } +} + +void FocusFilter::clear_out() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->clear_out(); + } else { + panel_sequence_viewer->clear_out(); + } +} + +void FocusFilter::clear_inout() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->clear_inout_point(); + } else { + panel_sequence_viewer->clear_inout_point(); + } +} + +void FocusFilter::delete_function() { + if (panel_timeline->headers->hasFocus()) { + panel_timeline->headers->delete_markers(); + } else if (panel_footage_viewer->headers->hasFocus()) { + panel_footage_viewer->headers->delete_markers(); + } else if (panel_sequence_viewer->headers->hasFocus()) { + panel_sequence_viewer->headers->delete_markers(); + } else if (panel_effect_controls->is_focused()) { + panel_effect_controls->delete_effects(); + } else if (panel_project->is_focused()) { + panel_project->delete_selected_media(); + } else if (panel_effect_controls->keyframe_focus()) { + panel_effect_controls->delete_selected_keyframes(); + } else if (panel_graph_editor->view_is_focused()) { + panel_graph_editor->delete_selected_keys(); + } else { + panel_timeline->delete_selection(Olive::ActiveSequence->selections, false); + } +} + +void FocusFilter::duplicate() { + if (panel_project->is_focused()) { + panel_project->duplicate_selected(); + } +} + +void FocusFilter::select_all() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_graph_editor) { + panel_graph_editor->select_all(); + } else { + panel_timeline->select_all(); + } +} + +void FocusFilter::zoom_in() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_effect_controls) { + panel_effect_controls->set_zoom(true); + } else if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->set_zoom(true); + } else if (focused_panel == panel_sequence_viewer) { + panel_sequence_viewer->set_zoom(true); + } else { + panel_timeline->set_zoom(true); + } +} + +void FocusFilter::zoom_out() { + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_effect_controls) { + panel_effect_controls->set_zoom(false); + } else if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->set_zoom(false); + } else if (focused_panel == panel_sequence_viewer) { + panel_sequence_viewer->set_zoom(false); + } else { + panel_timeline->set_zoom(false); + } +} + +void FocusFilter::cut() { + if (Olive::ActiveSequence != nullptr) { + QDockWidget* focused_panel = get_focused_panel(); + if (panel_effect_controls == focused_panel) { + panel_effect_controls->copy(true); + } else { + panel_timeline->copy(true); + } + } +} + +void FocusFilter::copy() { + if (Olive::ActiveSequence != nullptr) { + QDockWidget* focused_panel = get_focused_panel(); + if (panel_effect_controls == focused_panel) { + panel_effect_controls->copy(false); + } else { + panel_timeline->copy(false); + } + } +} diff --git a/ui/focusfilter.h b/ui/focusfilter.h index f528ef997..a54fcfa56 100644 --- a/ui/focusfilter.h +++ b/ui/focusfilter.h @@ -9,6 +9,11 @@ public: FocusFilter(); public slots: + void cut(); + void copy(); + + void duplicate(); + void go_to_in(); void go_to_out(); void go_to_start(); @@ -20,6 +25,18 @@ public slots: void decrease_speed(); void next_frame(); void go_to_end(); + + void set_in_point(); + void set_out_point(); + void clear_in(); + void clear_out(); + void clear_inout(); + + void delete_function(); + void select_all(); + + void zoom_in(); + void zoom_out(); }; namespace Olive { diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp index 9ad5aaa07..95f34d7d8 100644 --- a/ui/menuhelper.cpp +++ b/ui/menuhelper.cpp @@ -2,6 +2,10 @@ #include "oliveglobal.h" +#include "ui/focusfilter.h" + +#include "panels/panels.h" + #include "mainwindow.h" MenuHelper Olive::MenuHelper; @@ -9,15 +13,51 @@ MenuHelper Olive::MenuHelper; void MenuHelper::make_new_menu(QMenu *parent) { parent->addAction(tr("&Project"), Olive::Global.data(), SLOT(new_project()), QKeySequence("Ctrl+N"))->setProperty("id", "newproj"); parent->addSeparator(); - parent->addAction(tr("&Sequence"), Olive::MainWindow, SLOT(new_sequence()), QKeySequence("Ctrl+Shift+N"))->setProperty("id", "newseq"); - parent->addAction(tr("&Folder"), Olive::MainWindow, SLOT(new_folder()))->setProperty("id", "newfolder"); + parent->addAction(tr("&Sequence"), panel_project, SLOT(new_sequence()), QKeySequence("Ctrl+Shift+N"))->setProperty("id", "newseq"); + parent->addAction(tr("&Folder"), panel_project, SLOT(new_folder()))->setProperty("id", "newfolder"); } void MenuHelper::make_inout_menu(QMenu *parent) { - parent->addAction(tr("Set In Point"), Olive::MainWindow, SLOT(set_in_point()), QKeySequence("I"))->setProperty("id", "setinpoint"); - parent->addAction(tr("Set Out Point"), Olive::MainWindow, SLOT(set_out_point()), QKeySequence("O"))->setProperty("id", "setoutpoint"); + parent->addAction(tr("Set In Point"), &Olive::FocusFilter, SLOT(set_in_point()), QKeySequence("I"))->setProperty("id", "setinpoint"); + parent->addAction(tr("Set Out Point"), &Olive::FocusFilter, SLOT(set_out_point()), QKeySequence("O"))->setProperty("id", "setoutpoint"); parent->addSeparator(); - parent->addAction(tr("Reset In Point"), Olive::MainWindow, SLOT(clear_in()))->setProperty("id", "resetin"); - parent->addAction(tr("Reset Out Point"), Olive::MainWindow, SLOT(clear_out()))->setProperty("id", "resetout"); - parent->addAction(tr("Clear In/Out Point"), Olive::MainWindow, SLOT(clear_inout()), QKeySequence("G"))->setProperty("id", "clearinout"); + parent->addAction(tr("Reset In Point"), &Olive::FocusFilter, SLOT(clear_in()))->setProperty("id", "resetin"); + parent->addAction(tr("Reset Out Point"), &Olive::FocusFilter, SLOT(clear_out()))->setProperty("id", "resetout"); + parent->addAction(tr("Clear In/Out Point"), &Olive::FocusFilter, SLOT(clear_inout()), QKeySequence("G"))->setProperty("id", "clearinout"); +} + +void MenuHelper::make_clip_functions_menu(QMenu *parent) { + parent->addAction(tr("Add Default Transition"), panel_timeline, SLOT(add_transition()), QKeySequence("Ctrl+Shift+D"))->setProperty("id", "deftransition"); + parent->addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links()), QKeySequence("Ctrl+L"))->setProperty("id", "linkunlink"); + parent->addAction(tr("Enable/Disable"), panel_timeline, SLOT(toggle_enable_on_selected_clips()), QKeySequence("Shift+E"))->setProperty("id", "enabledisable"); + parent->addAction(tr("Nest"), panel_timeline, SLOT(nest()))->setProperty("id", "nest"); +} + +void MenuHelper::make_edit_functions_menu(QMenu *parent) { + parent->addAction(tr("Cu&t"), &Olive::FocusFilter, SLOT(cut()), QKeySequence("Ctrl+X"))->setProperty("id", "cut"); + parent->addAction(tr("Cop&y"), &Olive::FocusFilter, SLOT(copy()), QKeySequence("Ctrl+C"))->setProperty("id", "copy"); + parent->addAction(tr("&Paste"), Olive::Global.data(), SLOT(paste()), QKeySequence("Ctrl+V"))->setProperty("id", "paste"); + parent->addAction(tr("Paste Insert"), Olive::Global.data(), SLOT(paste_insert()), QKeySequence("Ctrl+Shift+V"))->setProperty("id", "pasteinsert"); + parent->addAction(tr("Duplicate"), &Olive::FocusFilter, SLOT(duplicate()), QKeySequence("Ctrl+D"))->setProperty("id", "duplicate"); + parent->addAction(tr("Delete"), &Olive::FocusFilter, SLOT(delete_function()), QKeySequence("Del"))->setProperty("id", "delete"); + parent->addAction(tr("Ripple Delete"), this, SLOT(ripple_delete()), QKeySequence("Shift+Del"))->setProperty("id", "rippledelete"); + parent->addAction(tr("Split"), panel_timeline, SLOT(split_at_playhead()), QKeySequence("Ctrl+K"))->setProperty("id", "split"); +} + +void MenuHelper::set_bool_action_checked(QAction *a) { + if (!a->data().isNull()) { + bool* variable = reinterpret_cast(a->data().value()); + a->setChecked(*variable); + } +} + +void MenuHelper::set_int_action_checked(QAction *a, const int& i) { + if (!a->data().isNull()) { + a->setChecked(a->data() == i); + } +} + +#include +void MenuHelper::set_button_action_checked(QAction *a) { + a->setChecked(reinterpret_cast(a->data().value())->isChecked()); } diff --git a/ui/menuhelper.h b/ui/menuhelper.h index 96d740f45..6487d5da0 100644 --- a/ui/menuhelper.h +++ b/ui/menuhelper.h @@ -30,6 +30,34 @@ public: * The menu to add items to. */ void make_inout_menu(QMenu* parent); + + /** + * @brief Creates a menu of clip functions + * + * Adds a set of clip functions including: + * * Add Default Transition + * * Link/Unlink + * * Enable/Disable + * * Nest + * + * @param parent + * + * The menu to add items to. + */ + void make_clip_functions_menu(QMenu* parent); + + /** + * @brief Creates standard edit menu (cut, copy, paste, etc.) + * + * @param parent + * + * The menu to add items to. + */ + void make_edit_functions_menu(QMenu* parent); + + void set_bool_action_checked(QAction* a); + void set_int_action_checked(QAction* a, const int& i); + void set_button_action_checked(QAction* a); private slots: diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 09f9289ac..ff6d71d1e 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1,29 +1,22 @@ #include "timelinewidget.h" -#include "playback/audio.h" #include "panels/panels.h" +#include "project/projectelements.h" + +#include "playback/audio.h" #include "io/config.h" -#include "project/sequence.h" -#include "project/transition.h" -#include "project/clip.h" -#include "panels/project.h" -#include "panels/timeline.h" -#include "project/footage.h" #include "ui/sourcetable.h" #include "ui/sourceiconview.h" -#include "panels/effectcontrols.h" -#include "panels/viewer.h" #include "project/undo.h" -#include "mainwindow.h" #include "ui/viewerwidget.h" #include "dialogs/stabilizerdialog.h" -#include "project/media.h" #include "ui/resizablescrollbar.h" #include "dialogs/newsequencedialog.h" #include "mainwindow.h" #include "ui/rectangleselect.h" #include "playback/playback.h" #include "ui/cursors.h" +#include "ui/menuhelper.h" #include "debug.h" #include "project/effect.h" @@ -123,13 +116,9 @@ void TimelineWidget::show_context_menu(const QPoint& pos) { QAction* autoscaleAction = menu.addAction(tr("Auto-s&cale"), this, SLOT(toggle_autoscale())); autoscaleAction->setCheckable(true); // set autoscale to the first selected clip - autoscaleAction->setChecked(selected_clips.at(0)->autoscale); + autoscaleAction->setChecked(selected_clips.at(0)->autoscale); - menu.addAction(tr("Enable/Disable"), Olive::MainWindow, SLOT(toggle_enable_clips())); - - menu.addAction(tr("Link/Unlink"), panel_timeline, SLOT(toggle_links())); - - menu.addAction(tr("&Nest"), Olive::MainWindow, SLOT(nest())); + Olive::MenuHelper.make_clip_functions_menu(&menu); // stabilizer option /*int video_clip_count = 0; @@ -486,7 +475,7 @@ void TimelineWidget::dropEvent(QDropEvent* event) { // if we're dropping into nothing, create a new sequences based on the clip being dragged if (s == nullptr) { s = self_created_sequence; - panel_project->new_sequence(ca, self_created_sequence, true, nullptr); + panel_project->create_sequence_internal(ca, self_created_sequence, true, nullptr); self_created_sequence = nullptr; } else if (event->keyboardModifiers() & Qt::ControlModifier) { insert_clips(ca); From f34a2914ee7ad8f8453a2256fff5d570e72966e7 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 14 Feb 2019 20:30:44 -0800 Subject: [PATCH 182/202] completed focus filter and menu helpers --- debug.cpp | 4 +- dialogs/debugdialog.cpp | 2 +- dialogs/debugdialog.h | 4 +- mainwindow.cpp | 339 ++++++++++------------------------------ mainwindow.h | 38 +---- oliveglobal.cpp | 52 ++++++ oliveglobal.h | 35 +++++ panels/project.cpp | 5 +- panels/project.h | 4 +- panels/timeline.cpp | 42 ++++- panels/timeline.h | 13 +- panels/viewer.cpp | 1 - panels/viewer.h | 4 +- ui/focusfilter.cpp | 22 +++ ui/focusfilter.h | 4 + ui/menuhelper.cpp | 87 ++++++++++- ui/menuhelper.h | 11 ++ 17 files changed, 358 insertions(+), 309 deletions(-) diff --git a/debug.cpp b/debug.cpp index 18935b40c..cbe4aa357 100644 --- a/debug.cpp +++ b/debug.cpp @@ -65,8 +65,8 @@ void debug_message_handler(QtMsgType type, const QMessageLogContext &context, co fflush(stderr); // abort(); } - if (debug_dialog != nullptr && debug_dialog->isVisible()) { - QMetaObject::invokeMethod(debug_dialog, "update_log", Qt::QueuedConnection); + if (Olive::DebugDialog != nullptr && Olive::DebugDialog->isVisible()) { + QMetaObject::invokeMethod(Olive::DebugDialog, "update_log", Qt::QueuedConnection); } debug_mutex.unlock(); } diff --git a/dialogs/debugdialog.cpp b/dialogs/debugdialog.cpp index 6d2718bec..b1aab93ac 100644 --- a/dialogs/debugdialog.cpp +++ b/dialogs/debugdialog.cpp @@ -6,7 +6,7 @@ #include "debug.h" -DebugDialog* debug_dialog = nullptr; +DebugDialog* Olive::DebugDialog = nullptr; DebugDialog::DebugDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Debug Log")); diff --git a/dialogs/debugdialog.h b/dialogs/debugdialog.h index a22deef8e..113777ac0 100644 --- a/dialogs/debugdialog.h +++ b/dialogs/debugdialog.h @@ -16,6 +16,8 @@ private: QTextEdit* textEdit; }; -extern DebugDialog* debug_dialog; +namespace Olive { + extern DebugDialog* DebugDialog; +} #endif // DEBUGDIALOG_H diff --git a/mainwindow.cpp b/mainwindow.cpp index db76121f9..f94db8ff9 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -20,17 +20,7 @@ #include "ui/focusfilter.h" #include "panels/panels.h" -#include "panels/project.h" -#include "panels/effectcontrols.h" -#include "panels/viewer.h" -#include "panels/timeline.h" -#include "panels/grapheditor.h" -#include "dialogs/aboutdialog.h" -#include "dialogs/newsequencedialog.h" -#include "dialogs/exportdialog.h" -#include "dialogs/speeddialog.h" -#include "dialogs/actionsearch.h" #include "dialogs/debugdialog.h" #include "playback/audio.h" @@ -94,7 +84,7 @@ MainWindow::MainWindow(QWidget *parent) : open_debug_file(); - debug_dialog = new DebugDialog(this); + Olive::DebugDialog = new DebugDialog(this); Olive::MainWindow = this; @@ -168,9 +158,8 @@ MainWindow::MainWindow(QWidget *parent) : if (deleted_ars > 0) qInfo() << "Deleted" << deleted_ars << "preview" << ((deleted_ars == 1) ? "file that was" : "files that were") << "last read over 30 days ago"; } - // search for open recents list - recent_proj_file = dir.filePath("recents"); - QFile f(recent_proj_file); + // search for open recents list + QFile f(Olive::Global.data()->get_recent_project_list_file()); if (f.exists() && f.open(QFile::ReadOnly | QFile::Text)) { QTextStream text_stream(&f); while (true) { @@ -339,54 +328,11 @@ void MainWindow::load_css_from_file(const QString &fn) { } } -void MainWindow::show_about() { - AboutDialog a(this); - a.exec(); -} - -void MainWindow::show_debug_log() { - debug_dialog->show(); -} - -void MainWindow::export_dialog() { - if (Olive::ActiveSequence == nullptr) { - QMessageBox::information(this, tr("No active sequence"), tr("Please open the sequence you wish to export."), QMessageBox::Ok); - } else { - ExportDialog e(this); - e.exec(); - } -} - -void MainWindow::ripple_delete() { - if (Olive::ActiveSequence != nullptr) { - if (Olive::ActiveSequence->selections.size() > 0) { - panel_timeline->delete_selection(Olive::ActiveSequence->selections, true); - } else if (config.hover_focus && get_focused_panel() == panel_timeline) { - if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { - panel_timeline->ripple_delete_empty_space(); - } - } - } -} - void MainWindow::editMenu_About_To_Be_Shown() { undo_action->setEnabled(Olive::UndoStack.canUndo()); redo_action->setEnabled(Olive::UndoStack.canRedo()); } -void MainWindow::open_speed_dialog() { - if (Olive::ActiveSequence != nullptr) { - SpeedDialog s(this); - for (int i=0;iclips.size();i++) { - Clip* c = Olive::ActiveSequence->clips.at(i); - if (c != nullptr && is_clip_selected(c, true)) { - s.clips.append(c); - } - } - if (s.clips.size() > 0) s.run(); - } -} - void MainWindow::setup_menus() { QMenuBar* menuBar = new QMenuBar(this); setMenuBar(menuBar); @@ -418,7 +364,7 @@ void MainWindow::setup_menus() { file_menu->addSeparator(); - file_menu->addAction(tr("&Export..."), this, SLOT(export_dialog()), QKeySequence("Ctrl+M"))->setProperty("id", "export"); + file_menu->addAction(tr("&Export..."), Olive::Global.data(), SLOT(open_export_dialog()), QKeySequence("Ctrl+M"))->setProperty("id", "export"); file_menu->addSeparator(); @@ -450,20 +396,20 @@ void MainWindow::setup_menus() { edit_menu->addSeparator(); - edit_menu->addAction(tr("Ripple to In Point"), this, SLOT(ripple_to_in_point()), QKeySequence("Q"))->setProperty("id", "rippletoin"); - edit_menu->addAction(tr("Ripple to Out Point"), this, SLOT(ripple_to_out_point()), QKeySequence("W"))->setProperty("id", "rippletoout"); - edit_menu->addAction(tr("Edit to In Point"), this, SLOT(edit_to_in_point()), QKeySequence("Ctrl+Alt+Q"))->setProperty("id", "edittoin"); - edit_menu->addAction(tr("Edit to Out Point"), this, SLOT(edit_to_out_point()), QKeySequence("Ctrl+Alt+W"))->setProperty("id", "edittoout"); + edit_menu->addAction(tr("Ripple to In Point"), panel_timeline, SLOT(ripple_to_in_point()), QKeySequence("Q"))->setProperty("id", "rippletoin"); + edit_menu->addAction(tr("Ripple to Out Point"), panel_timeline, SLOT(ripple_to_out_point()), QKeySequence("W"))->setProperty("id", "rippletoout"); + edit_menu->addAction(tr("Edit to In Point"), panel_timeline, SLOT(edit_to_in_point()), QKeySequence("Ctrl+Alt+Q"))->setProperty("id", "edittoin"); + edit_menu->addAction(tr("Edit to Out Point"), panel_timeline, SLOT(edit_to_out_point()), QKeySequence("Ctrl+Alt+W"))->setProperty("id", "edittoout"); edit_menu->addSeparator(); Olive::MenuHelper.make_inout_menu(edit_menu); - edit_menu->addAction(tr("Delete In/Out Point"), this, SLOT(delete_inout()), QKeySequence(";"))->setProperty("id", "deleteinout"); - edit_menu->addAction(tr("Ripple Delete In/Out Point"), this, SLOT(ripple_delete_inout()), QKeySequence("'"))->setProperty("id", "rippledeleteinout"); + edit_menu->addAction(tr("Delete In/Out Point"), panel_timeline, SLOT(delete_inout()), QKeySequence(";"))->setProperty("id", "deleteinout"); + edit_menu->addAction(tr("Ripple Delete In/Out Point"), panel_timeline, SLOT(ripple_delete_inout()), QKeySequence("'"))->setProperty("id", "rippledeleteinout"); edit_menu->addSeparator(); - edit_menu->addAction(tr("Set/Edit Marker"), this, SLOT(set_marker()), QKeySequence("M"))->setProperty("id", "marker"); + edit_menu->addAction(tr("Set/Edit Marker"), &Olive::FocusFilter, SLOT(set_marker()), QKeySequence("M"))->setProperty("id", "marker"); // INITIALIZE VIEW MENU @@ -481,31 +427,31 @@ void MainWindow::setup_menus() { view_menu->addSeparator(); - track_lines = view_menu->addAction(tr("Track Lines"), this, SLOT(toggle_bool_action())); + track_lines = view_menu->addAction(tr("Track Lines"), &Olive::MenuHelper, SLOT(toggle_bool_action())); track_lines->setProperty("id", "tracklines"); track_lines->setCheckable(true); track_lines->setData(reinterpret_cast(&config.show_track_lines)); - rectified_waveforms = view_menu->addAction(tr("Rectified Waveforms"), this, SLOT(toggle_bool_action())); + rectified_waveforms = view_menu->addAction(tr("Rectified Waveforms"), &Olive::MenuHelper, SLOT(toggle_bool_action())); rectified_waveforms->setProperty("id", "rectifiedwaveforms"); rectified_waveforms->setCheckable(true); rectified_waveforms->setData(reinterpret_cast(&config.rectified_waveforms)); view_menu->addSeparator(); - frames_action = view_menu->addAction(tr("Frames"), this, SLOT(set_timecode_view())); + frames_action = view_menu->addAction(tr("Frames"), &Olive::MenuHelper, SLOT(set_timecode_view())); frames_action->setProperty("id", "modeframes"); frames_action->setData(TIMECODE_FRAMES); frames_action->setCheckable(true); - drop_frame_action = view_menu->addAction(tr("Drop Frame"), this, SLOT(set_timecode_view())); + drop_frame_action = view_menu->addAction(tr("Drop Frame"), &Olive::MenuHelper, SLOT(set_timecode_view())); drop_frame_action->setProperty("id", "modedropframe"); drop_frame_action->setData(TIMECODE_DROP); drop_frame_action->setCheckable(true); - nondrop_frame_action = view_menu->addAction(tr("Non-Drop Frame"), this, SLOT(set_timecode_view())); + nondrop_frame_action = view_menu->addAction(tr("Non-Drop Frame"), &Olive::MenuHelper, SLOT(set_timecode_view())); nondrop_frame_action->setProperty("id", "modenondropframe"); nondrop_frame_action->setData(TIMECODE_NONDROP); nondrop_frame_action->setCheckable(true); - milliseconds_action = view_menu->addAction(tr("Milliseconds"), this, SLOT(set_timecode_view())); + milliseconds_action = view_menu->addAction(tr("Milliseconds"), &Olive::MenuHelper, SLOT(set_timecode_view())); milliseconds_action->setProperty("id", "milliseconds"); milliseconds_action->setData(TIMECODE_MILLISECONDS); milliseconds_action->setCheckable(true); @@ -517,27 +463,32 @@ void MainWindow::setup_menus() { title_safe_off = title_safe_area_menu->addAction(tr("Off")); title_safe_off->setProperty("id", "titlesafeoff"); title_safe_off->setCheckable(true); - connect(title_safe_off, SIGNAL(triggered(bool)), this, SLOT(set_tsa_disable())); + title_safe_off->setData(qSNaN()); + connect(title_safe_off, SIGNAL(triggered(bool)), &Olive::MenuHelper, SLOT(set_titlesafe_from_menu())); title_safe_default = title_safe_area_menu->addAction(tr("Default")); title_safe_default->setProperty("id", "titlesafedefault"); title_safe_default->setCheckable(true); - connect(title_safe_default, SIGNAL(triggered(bool)), this, SLOT(set_tsa_default())); + title_safe_default->setData(0.0); + connect(title_safe_default, SIGNAL(triggered(bool)), &Olive::MenuHelper, SLOT(set_titlesafe_from_menu())); title_safe_43 = title_safe_area_menu->addAction(tr("4:3")); title_safe_43->setProperty("id", "titlesafe43"); title_safe_43->setCheckable(true); - connect(title_safe_43, SIGNAL(triggered(bool)), this, SLOT(set_tsa_43())); + title_safe_43->setData(4.0/3.0); + connect(title_safe_43, SIGNAL(triggered(bool)), &Olive::MenuHelper, SLOT(set_titlesafe_from_menu())); title_safe_169 = title_safe_area_menu->addAction(tr("16:9")); title_safe_169->setProperty("id", "titlesafe169"); title_safe_169->setCheckable(true); - connect(title_safe_169, SIGNAL(triggered(bool)), this, SLOT(set_tsa_169())); + title_safe_169->setData(16.0/9.0); + connect(title_safe_169, SIGNAL(triggered(bool)), &Olive::MenuHelper, SLOT(set_titlesafe_from_menu())); title_safe_custom = title_safe_area_menu->addAction(tr("Custom")); title_safe_custom->setProperty("id", "titlesafecustom"); title_safe_custom->setCheckable(true); - connect(title_safe_custom, SIGNAL(triggered(bool)), this, SLOT(set_tsa_custom())); + title_safe_custom->setData(-1.0); + connect(title_safe_custom, SIGNAL(triggered(bool)), &Olive::MenuHelper, SLOT(set_titlesafe_from_menu())); view_menu->addSeparator(); @@ -545,7 +496,7 @@ void MainWindow::setup_menus() { full_screen->setProperty("id", "fullscreen"); full_screen->setCheckable(true); - view_menu->addAction(tr("Full Screen Viewer"), this, SLOT(full_screen_viewer()))->setProperty("id", "fullscreenviewer"); + view_menu->addAction(tr("Full Screen Viewer"), &Olive::FocusFilter, SLOT(set_viewer_fullscreen()))->setProperty("id", "fullscreenviewer"); // INITIALIZE PLAYBACK MENU @@ -570,7 +521,7 @@ void MainWindow::setup_menus() { playback_menu->addAction(tr("Shuttle Right"), &Olive::FocusFilter, SLOT(increase_speed()), QKeySequence("L"))->setProperty("id", "incspeed"); playback_menu->addSeparator(); - loop_action = playback_menu->addAction(tr("Loop"), this, SLOT(toggle_bool_action())); + loop_action = playback_menu->addAction(tr("Loop"), &Olive::MenuHelper, SLOT(toggle_bool_action())); loop_action->setProperty("id", "loop"); loop_action->setCheckable(true); loop_action->setData(reinterpret_cast(&config.loop)); @@ -580,32 +531,32 @@ void MainWindow::setup_menus() { window_menu = menuBar->addMenu(tr("&Window")); connect(window_menu, SIGNAL(aboutToShow()), this, SLOT(windowMenu_About_To_Be_Shown())); - QAction* window_project_action = window_menu->addAction(tr("Project"), this, SLOT(toggle_panel_visibility())); + QAction* window_project_action = window_menu->addAction(tr("Project"), this, SLOT(toggle_panel_visibility())); window_project_action->setProperty("id", "panelproject"); window_project_action->setCheckable(true); window_project_action->setData(reinterpret_cast(panel_project)); - QAction* window_effectcontrols_action = window_menu->addAction(tr("Effect Controls"), this, SLOT(toggle_panel_visibility())); + QAction* window_effectcontrols_action = window_menu->addAction(tr("Effect Controls"), this, SLOT(toggle_panel_visibility())); window_effectcontrols_action->setProperty("id", "paneleffectcontrols"); window_effectcontrols_action->setCheckable(true); window_effectcontrols_action->setData(reinterpret_cast(panel_effect_controls)); - QAction* window_timeline_action = window_menu->addAction(tr("Timeline"), this, SLOT(toggle_panel_visibility())); + QAction* window_timeline_action = window_menu->addAction(tr("Timeline"), this, SLOT(toggle_panel_visibility())); window_timeline_action->setProperty("id", "paneltimeline"); window_timeline_action->setCheckable(true); window_timeline_action->setData(reinterpret_cast(panel_timeline)); - QAction* window_graph_editor_action = window_menu->addAction(tr("Graph Editor"), this, SLOT(toggle_panel_visibility())); + QAction* window_graph_editor_action = window_menu->addAction(tr("Graph Editor"), this, SLOT(toggle_panel_visibility())); window_graph_editor_action->setProperty("id", "panelgrapheditor"); window_graph_editor_action->setCheckable(true); window_graph_editor_action->setData(reinterpret_cast(panel_graph_editor)); - QAction* window_footageviewer_action = window_menu->addAction(tr("Media Viewer"), this, SLOT(toggle_panel_visibility())); + QAction* window_footageviewer_action = window_menu->addAction(tr("Media Viewer"), this, SLOT(toggle_panel_visibility())); window_footageviewer_action->setProperty("id", "panelfootageviewer"); window_footageviewer_action->setCheckable(true); window_footageviewer_action->setData(reinterpret_cast(panel_footage_viewer)); - QAction* window_sequenceviewer_action = window_menu->addAction(tr("Sequence Viewer"), this, SLOT(toggle_panel_visibility())); + QAction* window_sequenceviewer_action = window_menu->addAction(tr("Sequence Viewer"), this, SLOT(toggle_panel_visibility())); window_sequenceviewer_action->setProperty("id", "panelsequenceviewer"); window_sequenceviewer_action->setCheckable(true); window_sequenceviewer_action->setData(reinterpret_cast(panel_sequence_viewer)); @@ -623,133 +574,133 @@ void MainWindow::setup_menus() { QMenu* tools_menu = menuBar->addMenu(tr("&Tools")); connect(tools_menu, SIGNAL(aboutToShow()), this, SLOT(toolMenu_About_To_Be_Shown())); - pointer_tool_action = tools_menu->addAction(tr("Pointer Tool"), this, SLOT(menu_click_button()), QKeySequence("V")); + pointer_tool_action = tools_menu->addAction(tr("Pointer Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("V")); pointer_tool_action->setProperty("id", "pointertool"); pointer_tool_action->setCheckable(true); pointer_tool_action->setData(reinterpret_cast(panel_timeline->toolArrowButton)); - edit_tool_action = tools_menu->addAction(tr("Edit Tool"), this, SLOT(menu_click_button()), QKeySequence("X")); + edit_tool_action = tools_menu->addAction(tr("Edit Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("X")); edit_tool_action->setProperty("id", "edittool"); edit_tool_action->setCheckable(true); edit_tool_action->setData(reinterpret_cast(panel_timeline->toolEditButton)); - ripple_tool_action = tools_menu->addAction(tr("Ripple Tool"), this, SLOT(menu_click_button()), QKeySequence("B")); + ripple_tool_action = tools_menu->addAction(tr("Ripple Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("B")); ripple_tool_action->setProperty("id", "rippletool"); ripple_tool_action->setCheckable(true); ripple_tool_action->setData(reinterpret_cast(panel_timeline->toolRippleButton)); - razor_tool_action = tools_menu->addAction(tr("Razor Tool"), this, SLOT(menu_click_button()), QKeySequence("C")); + razor_tool_action = tools_menu->addAction(tr("Razor Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("C")); razor_tool_action->setProperty("id", "razortool"); razor_tool_action->setCheckable(true); razor_tool_action->setData(reinterpret_cast(panel_timeline->toolRazorButton)); - slip_tool_action = tools_menu->addAction(tr("Slip Tool"), this, SLOT(menu_click_button()), QKeySequence("Y")); + slip_tool_action = tools_menu->addAction(tr("Slip Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("Y")); slip_tool_action->setProperty("id", "sliptool"); slip_tool_action->setCheckable(true); slip_tool_action->setData(reinterpret_cast(panel_timeline->toolSlipButton)); - slide_tool_action = tools_menu->addAction(tr("Slide Tool"), this, SLOT(menu_click_button()), QKeySequence("U")); + slide_tool_action = tools_menu->addAction(tr("Slide Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("U")); slide_tool_action->setProperty("id", "slidetool"); slide_tool_action->setCheckable(true); slide_tool_action->setData(reinterpret_cast(panel_timeline->toolSlideButton)); - hand_tool_action = tools_menu->addAction(tr("Hand Tool"), this, SLOT(menu_click_button()), QKeySequence("H")); + hand_tool_action = tools_menu->addAction(tr("Hand Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("H")); hand_tool_action->setProperty("id", "handtool"); hand_tool_action->setCheckable(true); hand_tool_action->setData(reinterpret_cast(panel_timeline->toolHandButton)); - transition_tool_action = tools_menu->addAction(tr("Transition Tool"), this, SLOT(menu_click_button()), QKeySequence("T")); + transition_tool_action = tools_menu->addAction(tr("Transition Tool"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("T")); transition_tool_action->setProperty("id", "transitiontool"); transition_tool_action->setCheckable(true); transition_tool_action->setData(reinterpret_cast(panel_timeline->toolTransitionButton)); tools_menu->addSeparator(); - snap_toggle = tools_menu->addAction(tr("Enable Snapping"), this, SLOT(menu_click_button()), QKeySequence("S")); + snap_toggle = tools_menu->addAction(tr("Enable Snapping"), &Olive::MenuHelper, SLOT(menu_click_button()), QKeySequence("S")); snap_toggle->setProperty("id", "snapping"); snap_toggle->setCheckable(true); snap_toggle->setData(reinterpret_cast(panel_timeline->snappingButton)); tools_menu->addSeparator(); - selecting_also_seeks = tools_menu->addAction(tr("Selecting Also Seeks"), this, SLOT(toggle_bool_action())); + selecting_also_seeks = tools_menu->addAction(tr("Selecting Also Seeks"), &Olive::MenuHelper, SLOT(toggle_bool_action())); selecting_also_seeks->setProperty("id", "selectingalsoseeks"); selecting_also_seeks->setCheckable(true); selecting_also_seeks->setData(reinterpret_cast(&config.select_also_seeks)); - edit_tool_also_seeks = tools_menu->addAction(tr("Edit Tool Also Seeks"), this, SLOT(toggle_bool_action())); + edit_tool_also_seeks = tools_menu->addAction(tr("Edit Tool Also Seeks"), &Olive::MenuHelper, SLOT(toggle_bool_action())); edit_tool_also_seeks->setProperty("id", "editalsoseeks"); edit_tool_also_seeks->setCheckable(true); edit_tool_also_seeks->setData(reinterpret_cast(&config.edit_tool_also_seeks)); - edit_tool_selects_links = tools_menu->addAction(tr("Edit Tool Selects Links"), this, SLOT(toggle_bool_action())); + edit_tool_selects_links = tools_menu->addAction(tr("Edit Tool Selects Links"), &Olive::MenuHelper, SLOT(toggle_bool_action())); edit_tool_selects_links->setProperty("id", "editselectslinks"); edit_tool_selects_links->setCheckable(true); edit_tool_selects_links->setData(reinterpret_cast(&config.edit_tool_selects_links)); - seek_also_selects = tools_menu->addAction(tr("Seek Also Selects"), this, SLOT(toggle_bool_action())); + seek_also_selects = tools_menu->addAction(tr("Seek Also Selects"), &Olive::MenuHelper, SLOT(toggle_bool_action())); seek_also_selects->setProperty("id", "seekalsoselects"); seek_also_selects->setCheckable(true); seek_also_selects->setData(reinterpret_cast(&config.seek_also_selects)); - seek_to_end_of_pastes = tools_menu->addAction(tr("Seek to the End of Pastes"), this, SLOT(toggle_bool_action())); + seek_to_end_of_pastes = tools_menu->addAction(tr("Seek to the End of Pastes"), &Olive::MenuHelper, SLOT(toggle_bool_action())); seek_to_end_of_pastes->setProperty("id", "seektoendofpastes"); seek_to_end_of_pastes->setCheckable(true); seek_to_end_of_pastes->setData(reinterpret_cast(&config.paste_seeks)); - scroll_wheel_zooms = tools_menu->addAction(tr("Scroll Wheel Zooms"), this, SLOT(toggle_bool_action())); + scroll_wheel_zooms = tools_menu->addAction(tr("Scroll Wheel Zooms"), &Olive::MenuHelper, SLOT(toggle_bool_action())); scroll_wheel_zooms->setProperty("id", "scrollwheelzooms"); scroll_wheel_zooms->setCheckable(true); scroll_wheel_zooms->setData(reinterpret_cast(&config.scroll_zooms)); - enable_drag_files_to_timeline = tools_menu->addAction(tr("Enable Drag Files to Timeline"), this, SLOT(toggle_bool_action())); + enable_drag_files_to_timeline = tools_menu->addAction(tr("Enable Drag Files to Timeline"), &Olive::MenuHelper, SLOT(toggle_bool_action())); enable_drag_files_to_timeline->setProperty("id", "enabledragfilestotimeline"); enable_drag_files_to_timeline->setCheckable(true); enable_drag_files_to_timeline->setData(reinterpret_cast(&config.enable_drag_files_to_timeline)); - autoscale_by_default = tools_menu->addAction(tr("Auto-Scale By Default"), this, SLOT(toggle_bool_action())); + autoscale_by_default = tools_menu->addAction(tr("Auto-Scale By Default"), &Olive::MenuHelper, SLOT(toggle_bool_action())); autoscale_by_default->setProperty("id", "autoscalebydefault"); autoscale_by_default->setCheckable(true); autoscale_by_default->setData(reinterpret_cast(&config.autoscale_by_default)); - enable_seek_to_import = tools_menu->addAction(tr("Enable Seek to Import"), this, SLOT(toggle_bool_action())); + enable_seek_to_import = tools_menu->addAction(tr("Enable Seek to Import"), &Olive::MenuHelper, SLOT(toggle_bool_action())); enable_seek_to_import->setProperty("id", "enableseektoimport"); enable_seek_to_import->setCheckable(true); enable_seek_to_import->setData(reinterpret_cast(&config.enable_seek_to_import)); - enable_audio_scrubbing = tools_menu->addAction(tr("Audio Scrubbing"), this, SLOT(toggle_bool_action())); + enable_audio_scrubbing = tools_menu->addAction(tr("Audio Scrubbing"), &Olive::MenuHelper, SLOT(toggle_bool_action())); enable_audio_scrubbing->setProperty("id", "audioscrubbing"); enable_audio_scrubbing->setCheckable(true); enable_audio_scrubbing->setData(reinterpret_cast(&config.enable_audio_scrubbing)); - enable_drop_on_media_to_replace = tools_menu->addAction(tr("Enable Drop on Media to Replace"), this, SLOT(toggle_bool_action())); + enable_drop_on_media_to_replace = tools_menu->addAction(tr("Enable Drop on Media to Replace"), &Olive::MenuHelper, SLOT(toggle_bool_action())); enable_drop_on_media_to_replace->setProperty("id", "enabledropmediareplace"); enable_drop_on_media_to_replace->setCheckable(true); enable_drop_on_media_to_replace->setData(reinterpret_cast(&config.drop_on_media_to_replace)); - enable_hover_focus = tools_menu->addAction(tr("Enable Hover Focus"), this, SLOT(toggle_bool_action())); + enable_hover_focus = tools_menu->addAction(tr("Enable Hover Focus"), &Olive::MenuHelper, SLOT(toggle_bool_action())); enable_hover_focus->setProperty("id", "hoverfocus"); enable_hover_focus->setCheckable(true); enable_hover_focus->setData(reinterpret_cast(&config.hover_focus)); - set_name_and_marker = tools_menu->addAction(tr("Ask For Name When Setting Marker"), this, SLOT(toggle_bool_action())); + set_name_and_marker = tools_menu->addAction(tr("Ask For Name When Setting Marker"), &Olive::MenuHelper, SLOT(toggle_bool_action())); set_name_and_marker->setProperty("id", "asknamemarkerset"); set_name_and_marker->setCheckable(true); set_name_and_marker->setData(reinterpret_cast(&config.set_name_with_marker)); tools_menu->addSeparator(); - no_autoscroll = tools_menu->addAction(tr("No Auto-Scroll"), this, SLOT(set_autoscroll())); + no_autoscroll = tools_menu->addAction(tr("No Auto-Scroll"), &Olive::MenuHelper, SLOT(set_autoscroll())); no_autoscroll->setProperty("id", "autoscrollno"); no_autoscroll->setData(AUTOSCROLL_NO_SCROLL); no_autoscroll->setCheckable(true); - page_autoscroll = tools_menu->addAction(tr("Page Auto-Scroll"), this, SLOT(set_autoscroll())); + page_autoscroll = tools_menu->addAction(tr("Page Auto-Scroll"), &Olive::MenuHelper, SLOT(set_autoscroll())); page_autoscroll->setProperty("id", "autoscrollpage"); page_autoscroll->setData(AUTOSCROLL_PAGE_SCROLL); page_autoscroll->setCheckable(true); - smooth_autoscroll = tools_menu->addAction(tr("Smooth Auto-Scroll"), this, SLOT(set_autoscroll())); + smooth_autoscroll = tools_menu->addAction(tr("Smooth Auto-Scroll"), &Olive::MenuHelper, SLOT(set_autoscroll())); smooth_autoscroll->setProperty("id", "autoscrollsmooth"); smooth_autoscroll->setData(AUTOSCROLL_SMOOTH_SCROLL); smooth_autoscroll->setCheckable(true); @@ -759,22 +710,22 @@ void MainWindow::setup_menus() { tools_menu->addAction(tr("Preferences"), Olive::Global.data(), SLOT(open_preferences()), QKeySequence("Ctrl+,"))->setProperty("id", "prefs"); #ifdef QT_DEBUG - tools_menu->addAction(tr("Clear Undo"), this, SLOT(clear_undo_stack()))->setProperty("id", "clearundo"); + tools_menu->addAction(tr("Clear Undo"), Olive::Global.data(), SLOT(clear_undo_stack()))->setProperty("id", "clearundo"); #endif // INITIALIZE HELP MENU QMenu* help_menu = menuBar->addMenu(tr("&Help")); - help_menu->addAction(tr("A&ction Search"), this, SLOT(show_action_search()), QKeySequence("/"))->setProperty("id", "actionsearch"); + help_menu->addAction(tr("A&ction Search"), Olive::Global.data(), SLOT(open_action_search()), QKeySequence("/"))->setProperty("id", "actionsearch"); help_menu->addSeparator(); - help_menu->addAction(tr("Debug Log"), this, SLOT(show_debug_log()))->setProperty("id", "debuglog"); + help_menu->addAction(tr("Debug Log"), Olive::Global.data(), SLOT(open_debug_log()))->setProperty("id", "debuglog"); help_menu->addSeparator(); - help_menu->addAction(tr("&About..."), this, SLOT(show_about()))->setProperty("id", "about"); + help_menu->addAction(tr("&About..."), Olive::Global.data(), SLOT(open_about_dialog()))->setProperty("id", "about"); load_shortcuts(get_config_path() + "/shortcuts", true); } @@ -844,15 +795,6 @@ void MainWindow::paintEvent(QPaintEvent *event) { } } -void MainWindow::clear_undo_stack() { - Olive::UndoStack.clear(); -} - -void MainWindow::show_action_search() { - ActionSearch as(this); - as.exec(); -} - void MainWindow::reset_layout() { setup_layout(true); } @@ -887,14 +829,6 @@ void MainWindow::maximize_panel() { } } -void MainWindow::full_screen_viewer() { - if (get_focused_panel() == panel_footage_viewer) { - panel_footage_viewer->viewer_widget->set_fullscreen(); - } else { - panel_sequence_viewer->viewer_widget->set_fullscreen(); - } -} - void MainWindow::windowMenu_About_To_Be_Shown() { QList window_actions = window_menu->actions(); for (int i=0;isetChecked(!config.show_title_safe_area); - title_safe_default->setChecked(config.show_title_safe_area && !config.use_custom_title_safe_ratio); - title_safe_43->setChecked(config.show_title_safe_area && config.use_custom_title_safe_ratio && qFuzzyCompare(config.custom_title_safe_ratio, 4.0/3.0)); - title_safe_169->setChecked(config.show_title_safe_area && config.use_custom_title_safe_ratio && qFuzzyCompare(config.custom_title_safe_ratio, 16.0/9.0)); - title_safe_custom->setChecked(config.show_title_safe_area && config.use_custom_title_safe_ratio && !title_safe_43->isChecked() && !title_safe_169->isChecked()); + title_safe_default->setChecked(config.show_title_safe_area + && !config.use_custom_title_safe_ratio); + title_safe_43->setChecked(config.show_title_safe_area + && config.use_custom_title_safe_ratio + && qFuzzyCompare(config.custom_title_safe_ratio, title_safe_43->data().toDouble())); + title_safe_169->setChecked(config.show_title_safe_area + && config.use_custom_title_safe_ratio + && qFuzzyCompare(config.custom_title_safe_ratio, title_safe_169->data().toDouble())); + title_safe_custom->setChecked(config.show_title_safe_area + && config.use_custom_title_safe_ratio + && !title_safe_43->isChecked() + && !title_safe_169->isChecked()); full_screen->setChecked(windowState() == Qt::WindowFullScreen); @@ -959,6 +901,16 @@ void MainWindow::toolMenu_About_To_Be_Shown() { Olive::MenuHelper.set_int_action_checked(smooth_autoscroll, config.autoscroll); } +void MainWindow::toggle_panel_visibility() { + QAction* action = static_cast(sender()); + QDockWidget* w = reinterpret_cast(action->data().value()); + w->setVisible(!w->isVisible()); + + // layout has changed, we're no longer in maximized panel mode, + // so we clear this byte array + temp_panel_state.clear(); +} + void MainWindow::fileMenu_About_To_Be_Shown() { if (recent_projects.size() > 0) { open_recent->clear(); @@ -977,14 +929,6 @@ void MainWindow::fileMenu_About_To_Be_Shown() { } } -void MainWindow::ripple_to_in_point() { - panel_timeline->ripple_to_in_point(true, true); -} - -void MainWindow::ripple_to_out_point() { - panel_timeline->ripple_to_in_point(false, true); -} - void MainWindow::toggle_full_screen() { if (windowState() == Qt::WindowFullScreen) { setWindowState(Qt::WindowNoState); // seems to be necessary for it to return to Maximized correctly on Linux @@ -993,114 +937,3 @@ void MainWindow::toggle_full_screen() { setWindowState(Qt::WindowFullScreen); } } - -void MainWindow::delete_inout() { - panel_timeline->delete_in_out(false); -} - -void MainWindow::ripple_delete_inout() { - panel_timeline->delete_in_out(true); -} - -void MainWindow::set_tsa_default() { - config.show_title_safe_area = true; - config.use_custom_title_safe_ratio = false; - panel_sequence_viewer->viewer_widget->update(); -} - -void MainWindow::set_tsa_disable() { - config.show_title_safe_area = false; - panel_sequence_viewer->viewer_widget->update(); -} - -void MainWindow::set_tsa_43() { - config.show_title_safe_area = true; - config.use_custom_title_safe_ratio = true; - config.custom_title_safe_ratio = 4.0/3.0; - panel_sequence_viewer->viewer_widget->update(); -} - -void MainWindow::set_tsa_169() { - config.show_title_safe_area = true; - config.use_custom_title_safe_ratio = true; - config.custom_title_safe_ratio = 16.0/9.0; - panel_sequence_viewer->viewer_widget->update(); -} - -void MainWindow::set_tsa_custom() { - QString input; - bool invalid = false; - QRegExp arTest("[0-9.]+:[0-9.]+"); - - do { - if (invalid) { - QMessageBox::critical(this, tr("Invalid aspect ratio"), tr("The aspect ratio '%1' is invalid. Please try again.").arg(input)); - } - - input = QInputDialog::getText(this, tr("Enter custom aspect ratio"), tr("Enter the aspect ratio to use for the title/action safe area (e.g. 16:9):")); - invalid = !arTest.exactMatch(input) && !input.isEmpty(); - } while (invalid); - - if (!input.isEmpty()) { - QStringList inputList = input.split(':'); - - config.show_title_safe_area = true; - config.use_custom_title_safe_ratio = true; - config.custom_title_safe_ratio = inputList.at(0).toDouble()/inputList.at(1).toDouble(); - panel_sequence_viewer->viewer_widget->update(); - } -} - -void MainWindow::set_marker() { - if (Olive::ActiveSequence != nullptr) { - QDockWidget* focused_panel = get_focused_panel(); - - if (focused_panel == panel_timeline) { - panel_timeline->set_marker(); - } else if (focused_panel == panel_footage_viewer) { - panel_footage_viewer->set_marker(); - } else if (focused_panel == panel_sequence_viewer) { - panel_sequence_viewer->set_marker(); - } - } -} - -void MainWindow::edit_to_in_point() { - panel_timeline->ripple_to_in_point(true, false); -} - -void MainWindow::edit_to_out_point() { - panel_timeline->ripple_to_in_point(false, false); -} - -void MainWindow::toggle_bool_action() { - QAction* action = static_cast(sender()); - bool* variable = reinterpret_cast(action->data().value()); - *variable = !(*variable); - update_ui(false); -} - -void MainWindow::set_autoscroll() { - QAction* action = static_cast(sender()); - config.autoscroll = action->data().toInt(); -} - -void MainWindow::menu_click_button() { - reinterpret_cast(static_cast(sender())->data().value())->click(); -} - -void MainWindow::toggle_panel_visibility() { - QAction* action = static_cast(sender()); - QDockWidget* w = reinterpret_cast(action->data().value()); - w->setVisible(!w->isVisible()); - - // layout has changed, we're no longer in maximized panel mode, - // so we clear this byte array - temp_panel_state.clear(); -} - -void MainWindow::set_timecode_view() { - QAction* action = static_cast(sender()); - config.timecode_view = action->data().toInt(); - update_ui(false); -} diff --git a/mainwindow.h b/mainwindow.h index efedb5d38..79c216a70 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,12 +22,8 @@ public: void load_css_from_file(const QString& fn); public slots: - void open_speed_dialog(); - void toggle_full_screen(); - void toggle_bool_action(); - signals: void finished_first_paint(); @@ -36,19 +32,9 @@ protected: virtual void paintEvent(QPaintEvent *event) override; private slots: - void clear_undo_stack(); - - void show_about(); - void show_debug_log(); - - void export_dialog(); - void ripple_delete(); - void maximize_panel(); void reset_layout(); - void full_screen_viewer(); - void fileMenu_About_To_Be_Shown(); void editMenu_About_To_Be_Shown(); void windowMenu_About_To_Be_Shown(); @@ -56,29 +42,7 @@ private slots: void viewMenu_About_To_Be_Shown(); void toolMenu_About_To_Be_Shown(); - void ripple_to_in_point(); - void ripple_to_out_point(); - - void delete_inout(); - void ripple_delete_inout(); - - // title safe area functions - void set_tsa_disable(); - void set_tsa_default(); - void set_tsa_43(); - void set_tsa_169(); - void set_tsa_custom(); - - void set_marker(); - - void edit_to_in_point(); - void edit_to_out_point(); - void set_autoscroll(); - void menu_click_button(); - void toggle_panel_visibility(); - void set_timecode_view(); - - void show_action_search(); + void toggle_panel_visibility(); private: void setup_layout(bool reset); diff --git a/oliveglobal.cpp b/oliveglobal.cpp index c0816abbf..3536b05cc 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -10,6 +10,11 @@ #include "dialogs/demonotice.h" #include "dialogs/preferencesdialog.h" +#include "dialogs/exportdialog.h" +#include "dialogs/debugdialog.h" +#include "dialogs/aboutdialog.h" +#include "dialogs/speeddialog.h" +#include "dialogs/actionsearch.h" #include "project/sequence.h" @@ -80,6 +85,10 @@ void OliveGlobal::load_project_on_launch(const QString& s) { enable_load_project_on_init = true; } +QString OliveGlobal::get_recent_project_list_file() { + return get_data_dir().filePath("recents"); +} + void OliveGlobal::new_project() { if (can_close_project()) { // clear effects panel @@ -166,6 +175,18 @@ bool OliveGlobal::can_close_project() { return true; } +void OliveGlobal::open_export_dialog() { + if (Olive::ActiveSequence == nullptr) { + QMessageBox::information(Olive::MainWindow, + tr("No active sequence"), + tr("Please open the sequence you wish to export."), + QMessageBox::Ok); + } else { + ExportDialog e(Olive::MainWindow); + e.exec(); + } +} + void OliveGlobal::finished_initialize() { // if a project was set as a command line argument, we load it here if (enable_load_project_on_init) { @@ -230,3 +251,34 @@ void OliveGlobal::paste_insert() { panel_timeline->paste(true); } } + +void OliveGlobal::open_about_dialog() { + AboutDialog a(Olive::MainWindow); + a.exec(); +} + +void OliveGlobal::open_debug_log() { + Olive::DebugDialog->show(); +} + +void OliveGlobal::open_speed_dialog() { + if (Olive::ActiveSequence != nullptr) { + SpeedDialog s(Olive::MainWindow); + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); + if (c != nullptr && is_clip_selected(c, true)) { + s.clips.append(c); + } + } + if (s.clips.size() > 0) s.run(); + } +} + +void OliveGlobal::clear_undo_stack() { + Olive::UndoStack.clear(); +} + +void OliveGlobal::open_action_search() { + ActionSearch as(Olive::MainWindow); + as.exec(); +} diff --git a/oliveglobal.h b/oliveglobal.h index 6615a37ab..b18d59275 100644 --- a/oliveglobal.h +++ b/oliveglobal.h @@ -4,6 +4,7 @@ #include "project/undo.h" #include +#include class OliveGlobal : public QObject { Q_OBJECT @@ -20,13 +21,39 @@ public: void load_project_on_launch(const QString& s); + QString get_recent_project_list_file(); + public slots: + /** + * @brief Undo user's last action + */ void undo(); + + /** + * @brief Redo user's last action + */ void redo(); + /** + * @brief Paste contents of clipboard + * + * Pastes contents of clipboard. Seeing as several types of data can be copied into the clipboard, this + * function will automatically determine what type of data is in the clipboard and paste it in the correct + * location (e.g. clip data will go to the Timeline, effect data will go to Effect Controls). + */ void paste(); + + /** + * @brief Paste contents of clipboard, making space for it when possible + * + * Pastes contents of clipboard (same as paste()). If the clipboard contains clip data, the clips are cut at the + * current playhead and ripple forward to make space for the clips in the clipboard. Can be considered + * semi-non-destructive as a result (as opposed to paste() overwriting clips). If the clipboard contains effect + * data, the functionality is identical to paste(). + */ void paste_insert(); + void new_project(); void open_project(); void open_recent(); @@ -35,6 +62,14 @@ public slots: bool can_close_project(); + void open_export_dialog(); + void open_about_dialog(); + void open_debug_log(); + void open_speed_dialog(); + void open_action_search(); + + void clear_undo_stack(); + /** * @brief Function called when Olive has finished starting up * diff --git a/panels/project.cpp b/panels/project.cpp index 6178f5881..b1908b47a 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -52,7 +52,6 @@ ProjectModel project_model; QString autorecovery_filename; QStringList recent_projects; -QString recent_proj_file; Project::Project(QWidget *parent) : QDockWidget(parent) @@ -1226,7 +1225,7 @@ void Project::set_tree_view() { void Project::save_recent_projects() { // save to file - QFile f(recent_proj_file); + QFile f(Olive::Global->get_recent_project_list_file()); if (f.open(QFile::WriteOnly | QFile::Truncate | QFile::Text)) { QTextStream out(&f); for (int i=0;i &media_list); @@ -107,7 +105,7 @@ private slots: void set_icon_view_size(int); void set_up_dir_enabled(); void go_up_dir(); - void make_new_menu(); + void make_new_menu(); }; class MediaThrobber : public QObject { diff --git a/panels/timeline.cpp b/panels/timeline.cpp index ab2ec1ad5..428a6aaa0 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -615,7 +615,7 @@ void Timeline::resizeEvent(QResizeEvent *) { tool_button_widget->setFixedWidth((tool_button_children.at(0)->sizeHint().width())*cols + horizontal_spacing*(cols-1) + 1); } -void Timeline::delete_in_out(bool ripple) { +void Timeline::delete_in_out_internal(bool ripple) { if (Olive::ActiveSequence != nullptr && Olive::ActiveSequence->using_workarea) { QVector areas; int video_tracks = 0, audio_tracks = 0; @@ -1231,7 +1231,7 @@ void Timeline::paste(bool insert) { } } -void Timeline::ripple_to_in_point(bool in, bool ripple) { +void Timeline::edit_to_point_internal(bool in, bool ripple) { if (Olive::ActiveSequence != nullptr) { if (Olive::ActiveSequence->clips.size() > 0) { // get track count @@ -1439,7 +1439,19 @@ void Timeline::split_at_playhead() { update_ui(true); } else { delete ca; - } + } +} + +void Timeline::ripple_delete() { + if (Olive::ActiveSequence != nullptr) { + if (Olive::ActiveSequence->selections.size() > 0) { + panel_timeline->delete_selection(Olive::ActiveSequence->selections, true); + } else if (config.hover_focus && get_focused_panel() == panel_timeline) { + if (panel_timeline->can_ripple_empty_space(panel_timeline->cursor_frame, panel_timeline->cursor_track)) { + panel_timeline->ripple_delete_empty_space(); + } + } + } } void Timeline::deselect_area(long in, long out, int track) { @@ -1565,6 +1577,30 @@ void Timeline::set_marker() { } +void Timeline::delete_inout() { + panel_timeline->delete_in_out_internal(false); +} + +void Timeline::ripple_delete_inout() { + panel_timeline->delete_in_out_internal(true); +} + +void Timeline::ripple_to_in_point() { + panel_timeline->edit_to_point_internal(true, true); +} + +void Timeline::ripple_to_out_point() { + panel_timeline->edit_to_point_internal(false, true); +} + +void Timeline::edit_to_in_point() { + panel_timeline->edit_to_point_internal(true, false); +} + +void Timeline::edit_to_out_point() { + panel_timeline->edit_to_point_internal(false, false); +} + void Timeline::toggle_links() { LinkCommand* command = new LinkCommand(); command->s = Olive::ActiveSequence; diff --git a/panels/timeline.h b/panels/timeline.h index 77f0e7c7b..96ddabedd 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -91,8 +91,8 @@ public: QVector get_tracks_of_linked_clips(int i); bool has_clip_been_split(int c); - void ripple_to_in_point(bool in, bool ripple); - void delete_in_out(bool ripple); + void edit_to_point_internal(bool in, bool ripple); + void delete_in_out_internal(bool ripple); void create_ghosts_from_media(Sequence *seq, long entry_point, QVector &media_list); void add_clips_from_ghosts(ComboAction *ca, Sequence *s); @@ -210,9 +210,18 @@ public slots: void deselect(); void toggle_links(); void split_at_playhead(); + void ripple_delete(); void ripple_delete_empty_space(); void toggle_enable_on_selected_clips(); + void delete_inout(); + void ripple_delete_inout(); + + void ripple_to_in_point(); + void ripple_to_out_point(); + void edit_to_in_point(); + void edit_to_out_point(); + void increase_track_height(); void decrease_track_height(); diff --git a/panels/viewer.cpp b/panels/viewer.cpp index 681cf6fa8..21cf08898 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -13,7 +13,6 @@ #include "project/undo.h" #include "ui/audiomonitor.h" #include "playback/playback.h" -#include "ui/viewerwidget.h" #include "ui/viewercontainer.h" #include "ui/labelslider.h" #include "ui/timelineheader.h" diff --git a/panels/viewer.h b/panels/viewer.h index 51d9396d6..c7c9a74c0 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -6,7 +6,6 @@ #include class Timeline; -class ViewerWidget; class Media; struct Sequence; class TimelineHeader; @@ -17,6 +16,7 @@ class QPushButton; class QLabel; #include "project/marker.h" +#include "ui/viewerwidget.h" bool frame_rate_is_droppable(float rate); long timecode_to_frame(const QString& s, int view, double frame_rate); @@ -27,7 +27,7 @@ class Viewer : public QDockWidget Q_OBJECT public: - explicit Viewer(QWidget *parent = 0); + explicit Viewer(QWidget *parent = nullptr); ~Viewer(); bool is_focused(); diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp index e0f50bfbf..bc903de67 100644 --- a/ui/focusfilter.cpp +++ b/ui/focusfilter.cpp @@ -74,6 +74,28 @@ void FocusFilter::go_to_end() { } } +void FocusFilter::set_viewer_fullscreen() { + if (get_focused_panel() == panel_footage_viewer) { + panel_footage_viewer->viewer_widget->set_fullscreen(); + } else { + panel_sequence_viewer->viewer_widget->set_fullscreen(); + } +} + +void FocusFilter::set_marker() { + if (Olive::ActiveSequence != nullptr) { + QDockWidget* focused_panel = get_focused_panel(); + + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->set_marker(); + } else if (focused_panel == panel_sequence_viewer) { + panel_sequence_viewer->set_marker(); + } else { + panel_timeline->set_marker(); + } + } +} + void FocusFilter::playpause() { QDockWidget* focused_panel = get_focused_panel(); if (focused_panel == panel_footage_viewer) { diff --git a/ui/focusfilter.h b/ui/focusfilter.h index a54fcfa56..b560c9178 100644 --- a/ui/focusfilter.h +++ b/ui/focusfilter.h @@ -26,6 +26,10 @@ public slots: void next_frame(); void go_to_end(); + void set_viewer_fullscreen(); + + void set_marker(); + void set_in_point(); void set_out_point(); void clear_in(); diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp index 95f34d7d8..ca145baf5 100644 --- a/ui/menuhelper.cpp +++ b/ui/menuhelper.cpp @@ -4,10 +4,15 @@ #include "ui/focusfilter.h" +#include "io/config.h" + #include "panels/panels.h" #include "mainwindow.h" +#include +#include + MenuHelper Olive::MenuHelper; void MenuHelper::make_new_menu(QMenu *parent) { @@ -40,7 +45,7 @@ void MenuHelper::make_edit_functions_menu(QMenu *parent) { parent->addAction(tr("Paste Insert"), Olive::Global.data(), SLOT(paste_insert()), QKeySequence("Ctrl+Shift+V"))->setProperty("id", "pasteinsert"); parent->addAction(tr("Duplicate"), &Olive::FocusFilter, SLOT(duplicate()), QKeySequence("Ctrl+D"))->setProperty("id", "duplicate"); parent->addAction(tr("Delete"), &Olive::FocusFilter, SLOT(delete_function()), QKeySequence("Del"))->setProperty("id", "delete"); - parent->addAction(tr("Ripple Delete"), this, SLOT(ripple_delete()), QKeySequence("Shift+Del"))->setProperty("id", "rippledelete"); + parent->addAction(tr("Ripple Delete"), panel_timeline, SLOT(ripple_delete()), QKeySequence("Shift+Del"))->setProperty("id", "rippledelete"); parent->addAction(tr("Split"), panel_timeline, SLOT(split_at_playhead()), QKeySequence("Ctrl+K"))->setProperty("id", "split"); } @@ -61,3 +66,83 @@ void MenuHelper::set_int_action_checked(QAction *a, const int& i) { void MenuHelper::set_button_action_checked(QAction *a) { a->setChecked(reinterpret_cast(a->data().value())->isChecked()); } + +void MenuHelper::toggle_bool_action() { + QAction* action = static_cast(sender()); + bool* variable = reinterpret_cast(action->data().value()); + *variable = !(*variable); + update_ui(false); +} + +void MenuHelper::set_titlesafe_from_menu() { + double tsa = static_cast(sender())->data().toDouble(); + + if (qIsNaN(tsa)) { + + // disable title safe area + config.show_title_safe_area = false; + + } else { + + // using title safe area + config.show_title_safe_area = true; + + // are we using the default area aspect ratio, or a specific one + if (qIsNull(tsa)) { + + // default title safe area + config.use_custom_title_safe_ratio = false; + + } else { + + // using a specific aspect ratio + config.use_custom_title_safe_ratio = true; + + if (tsa < 0.0) { + + // set a custom title safe area + QString input; + bool invalid = false; + QRegExp arTest("[0-9.]+:[0-9.]+"); + + do { + if (invalid) { + QMessageBox::critical(Olive::MainWindow, tr("Invalid aspect ratio"), tr("The aspect ratio '%1' is invalid. Please try again.").arg(input)); + } + + input = QInputDialog::getText(Olive::MainWindow, tr("Enter custom aspect ratio"), tr("Enter the aspect ratio to use for the title/action safe area (e.g. 16:9):")); + invalid = !arTest.exactMatch(input) && !input.isEmpty(); + } while (invalid); + + if (!input.isEmpty()) { + QStringList inputList = input.split(':'); + config.custom_title_safe_ratio = inputList.at(0).toDouble()/inputList.at(1).toDouble(); + } + + } else { + + // specified tsa is a specific custom aspect ratio + config.custom_title_safe_ratio = tsa; + } + + } + + } + + panel_sequence_viewer->viewer_widget->update(); +} + +void MenuHelper::set_autoscroll() { + QAction* action = static_cast(sender()); + config.autoscroll = action->data().toInt(); +} + +void MenuHelper::menu_click_button() { + reinterpret_cast(static_cast(sender())->data().value())->click(); +} + +void MenuHelper::set_timecode_view() { + QAction* action = static_cast(sender()); + config.timecode_view = action->data().toInt(); + update_ui(false); +} diff --git a/ui/menuhelper.h b/ui/menuhelper.h index 6487d5da0..31273909e 100644 --- a/ui/menuhelper.h +++ b/ui/menuhelper.h @@ -58,6 +58,17 @@ public: void set_bool_action_checked(QAction* a); void set_int_action_checked(QAction* a, const int& i); void set_button_action_checked(QAction* a); + +public slots: + + void toggle_bool_action(); + + void set_titlesafe_from_menu(); + + void set_autoscroll(); + void menu_click_button(); + void set_timecode_view(); + private slots: From 46c365c388f204d898c672439fdf82b21a762903 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 01:00:38 -0800 Subject: [PATCH 183/202] added more documentation --- mainwindow.cpp | 8 +-- mainwindow.h | 134 ++++++++++++++++++++++++++++++++++++- oliveglobal.cpp | 3 +- oliveglobal.h | 149 ++++++++++++++++++++++++++++++++++++++++- ui/focusfilter.cpp | 5 +- ui/focusfilter.h | 161 +++++++++++++++++++++++++++++++++++++++++++++ ui/menuhelper.cpp | 5 ++ ui/menuhelper.h | 82 +++++++++++++++++++++++ 8 files changed, 533 insertions(+), 14 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index f94db8ff9..1ba325b3e 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -286,7 +286,7 @@ void kbd_shortcut_processor(QByteArray& file, QMenu* menu, bool save, bool first } } -void MainWindow::load_shortcuts(const QString& fn, bool first) { +void MainWindow::load_shortcuts(const QString& fn) { QByteArray shortcut_bytes; QFile shortcut_path(fn); if (shortcut_path.exists() && shortcut_path.open(QFile::ReadOnly)) { @@ -296,7 +296,7 @@ void MainWindow::load_shortcuts(const QString& fn, bool first) { QList menus = menuBar()->actions(); for (int i=0;imenu(); - kbd_shortcut_processor(shortcut_bytes, menu, false, first); + kbd_shortcut_processor(shortcut_bytes, menu, false, true); } } @@ -727,7 +727,7 @@ void MainWindow::setup_menus() { help_menu->addAction(tr("&About..."), Olive::Global.data(), SLOT(open_about_dialog()))->setProperty("id", "about"); - load_shortcuts(get_config_path() + "/shortcuts", true); + load_shortcuts(get_config_path() + "/shortcuts"); } void MainWindow::updateTitle() { @@ -919,7 +919,7 @@ void MainWindow::fileMenu_About_To_Be_Shown() { QAction* action = open_recent->addAction(recent_projects.at(i)); action->setProperty("keyignore", true); action->setData(i); - connect(action, SIGNAL(triggered()), Olive::Global.data(), SLOT(open_recent())); + connect(action, SIGNAL(triggered()), &Olive::MenuHelper, SLOT(open_recent_from_menu())); } open_recent->addSeparator(); diff --git a/mainwindow.h b/mainwindow.h index 79c216a70..b79ea0293 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -14,38 +14,168 @@ public: explicit MainWindow(QWidget *parent); virtual ~MainWindow() override; + /** + * @brief Update window title + * + * Updates the window title to reflect the current project filename. Call if the project filename changes. + * + * NOTE: It's recommended to use update_project_filename() from Olive::Global to update the filename completely + * instead of calling this function directly (update_project_filename() calls this function in the process). + */ void updateTitle(); - void load_shortcuts(const QString &fn, bool first = false); + /** + * @brief Load shortcut file. + * + * Loads a shortcut configuration from file and sets Olive to use them. + * + * @param fn + * + * URL of the shortcut file to be loaded + * + */ + void load_shortcuts(const QString &fn); + + /** + * @brief Save shortcut file. + * + * Saves the current shortcut configuration to file. Only saves shortcuts that have been changed from default. + * + * @param fn + * + * URL to save the shortcut file to. + */ void save_shortcuts(const QString &fn); + /** + * @brief Load a CSS/QSS style from file to customize Olive's interface. + * + * @param fn + * + * URL to load the CSS file from. + */ void load_css_from_file(const QString& fn); public slots: + /** + * @brief Toggles full screen mode. + * + * Toggles the main window between full screen and windowed modes. + */ void toggle_full_screen(); signals: + /** + * @brief Signal emitted once when the main window has finished initializing + * + * Emitted the first time paintEvent runs. Connect this to functions that must be completed post-initialization. + */ void finished_first_paint(); protected: + /** + * @brief Close event + * + * Confirms whether the project can be closed, and if so performs various clean-up functions before the application + * exits. It's preferable to call clean-up functions here rather than in the destructor because this will get called + * first. + */ virtual void closeEvent(QCloseEvent *) override; - virtual void paintEvent(QPaintEvent *event) override; + + /** + * @brief Paint event + * + * Overridden to provide the finished_first_paint() signal. + */ + virtual void paintEvent(QPaintEvent *) override; private slots: + /** + * @brief Maximizes the currently hovered panel. + * + * Saves the current state of the panels/dock widgets and removes all except the currently hovered panel, + * effectively maximizing the panel to the entire window. + */ void maximize_panel(); + + /** + * @brief Reset panel layout to default. + * + * Resets the current panel layout to default. Doesn't save the current layout. + */ void reset_layout(); + /** + * @brief Function to prepare File menu. + * + * Primarily used to populate the Open Recent Projects menu. + */ void fileMenu_About_To_Be_Shown(); + + /** + * @brief Function to prepare Edit menu. + * + * Primarily used to set the enabled state on Undo and Redo depending if there are undos/redos available. + */ void editMenu_About_To_Be_Shown(); + + /** + * @brief Function to prepare Window menu. + * + * Primarily used to set the checked state of menu items corresponding to the panels that are currently visible. + */ void windowMenu_About_To_Be_Shown(); + + /** + * @brief Function to prepare Playback menu. + * + * Primarily used to set the checked state on the "Loop" item. + */ void playbackMenu_About_To_Be_Shown(); + + /** + * @brief Function to prepare View menu. + * + * Primarily used to set the checked state of various options in the view menu (e.g. title safe area, timecode + * units, etc.) + */ void viewMenu_About_To_Be_Shown(); + + /** + * @brief Function to prepare Tools menu. + * + * Primarily used to set the checked state on various settings available from the Tools menu. + */ void toolMenu_About_To_Be_Shown(); + /** + * @brief Toggle whether a panel is visible or not. + * + * Assumes the sender() QAction has a pointer to a QDockWidget in its data variable. Casts it and toggles its + * visibility. + */ void toggle_panel_visibility(); private: + /** + * @brief Internal function for setting the panel layout to a predetermined preset. + * + * Resets layout to default and optionally loads a layout from file. If loading from file, this function will + * always load from `get_config_path() + "/layout"`. + * + * @param reset + * + * **TRUE** if this function should just reset the current layout. **FALSE** if it should load from the + * aforementioned layout file. + */ void setup_layout(bool reset); + + /** + * @brief Initialize menu bar menus and items. + * + * Internal initialization function for all menus and menu items in the main window. Called once from the + * MainWindow() constructor. + */ void setup_menus(); // menu bar menus diff --git a/oliveglobal.cpp b/oliveglobal.cpp index 3536b05cc..2a1036b39 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -115,8 +115,7 @@ void OliveGlobal::open_project() { } } -void OliveGlobal::open_recent() { - int index = static_cast(sender())->data().toInt(); +void OliveGlobal::open_recent(int index) { QString recent_url = recent_projects.at(index); if (!QFile::exists(recent_url)) { if (QMessageBox::question( diff --git a/oliveglobal.h b/oliveglobal.h index b18d59275..5349f3d64 100644 --- a/oliveglobal.h +++ b/oliveglobal.h @@ -6,21 +6,86 @@ #include #include +/** + * @brief The Olive Global class + * + * A resource for various global functions used throughout Olive. + */ class OliveGlobal : public QObject { Q_OBJECT public: + /** + * @brief OliveGlobal Constructor + * + * Creates Olive Global object. Also sets some default runtime settings and the application name. + */ OliveGlobal(); + /** + * @brief Returns the file dialog filter used when interfacing with Olive project files. + * + * @return The file filter string used by QFileDialog to limit the files shown to Olive (*.ove) files. + */ const QString& get_project_file_filter(); + /** + * @brief Change the current active project filename + * + * Triggered to change the current active project filename. Call this before calling any internal project + * saving or loading functions in order to set which file to work with (OliveGlobal::open_project() and + * OliveGlobal::save_project_as() do this automatically). Also updates the main window title to reflect the + * project filename. + * + * @param s + * + * The URL of the project file to work with. Can be an empty string, in which case Olive will treat the project + * as an unsaved project. + */ void update_project_filename(const QString& s); + /** + * @brief Check whether an auto-recovery file exists and ask the user if they want to load it. + * + * Usually called on initialization. Checks if an auto-recovery file exists (meaning the last session of Olive + * didn't close correctly). If it finds one, asks the user if they want to load it. If so, loads the auto-recovery + * project. + */ void check_for_autorecovery_file(); + /** + * @brief Set the application state depending on if the user is exporting a video + * + * Some background functions shouldn't run while Olive is exporting a video. This function will disable/enable them + * as necessary. + * + * The current functions are as follows: + * * Auto-recovery interval. Olive saves an auto-recovery just before exporting anyway and seeing as the user + * cannot make changes while rendering, there's no reason to continue saving auto-recovery files. + * * Audio device playback. Olive uses the same internal audio buffer for exporting as it does for playback, but + * this buffer does not need to be forwarded to the output device when exporting. + * + * @param rendering + * + * **TRUE** if Olive is about to export a video. **FALSE** if Olive has finished exporting. + */ void set_rendering_state(bool rendering); + /** + * @brief Set a project to load just after launching + * + * Called by main() if Olive was called with a project file as a running argument. Sets up Olive to load the + * specified project once its finished initializing. + * + * @param s + * + * The URL of the project file to load. + */ void load_project_on_launch(const QString& s); + /** + * @brief Retrieves the URL of the config file containing the autorecovery projects + * @return The URL as a string + */ QString get_recent_project_list_file(); public slots: @@ -53,21 +118,101 @@ public slots: */ void paste_insert(); - + /** + * @brief Create new project. + * + * Confirms whether the current project can be closed, and if so, clears all current project data and resets + * program state. Standard `File > New` behavior. + */ void new_project(); + + /** + * @brief Open a project from file. + * + * Confirms whether the current project can be closed, and if so, shows an open file dialog to allow the user to + * select a project file and then triggers a project load with it. + */ void open_project(); - void open_recent(); + + /** + * @brief Open recent project from list + * + * Triggers a project load from the internal recent projects list. + * + * @param index + * + * Index in the list of the project fille to load + */ + void open_recent(int index); + + /** + * @brief Shows a save file dialog and saves the project as the resulting filename + * + * Shows a save file dialog for the user to save their current project as a different filename from the current + * one. Also triggered by save_project() if the file hasn't been saved yet. + * + * @return **TRUE** if the user saved the project. **FALSE** if they cancelled out of the save file dialog. Useful + * if a user is closing an unsaved project, clicks "Yes" to save, we know if they actually saved or not and won't + * continue closing the project if they didn't. + */ bool save_project_as(); + + /** + * @brief Saves the current project to file + * + * If the project has been saved already, this function will overwrite the project file with the current project + * data. Calls save_project_as() if the file has not been saved before. + * + * @return **TRUE** if the project has been saved before and was successfully overwritten. Otherwise returns the + * value of save_project_as(). Useful if the user closing an unsaved project, clicks "Yes" to save, we know if they + * actually saved or not and won't continue closing the project if they didn't. + */ bool save_project(); + /** + * @brief Determine whether the current project can be closed. + * + * Queried any time the current project is going to be closed (e.g. starting a new project, loading a project, + * exiting Olive, etc.) If the project has unsaved changes, this function asks the user whether they want to save or + * not. If the user does, calls save_project() (which may in turn call save_project_as() if the project has never + * been saved). + * + * @return **TRUE** if the project can be closed. FALSE if not. If the project does NOT have unsaved changes, always + * returns **TRUE**. If it does and the user clicks YES, this returns the result of save_project(). If the user + * clicks NO, this returns **TRUE**. If the user clicks CANCEL, this returns **FALSE**. + */ bool can_close_project(); + /** + * @brief Open the Export dialog to trigger an export of the current sequence. + */ void open_export_dialog(); + + /** + * @brief Open the About Olive dialog. + */ void open_about_dialog(); + + /** + * @brief Open the Debug Log window. + */ void open_debug_log(); + + /** + * @brief Open the Speed/Duration dialog. + */ void open_speed_dialog(); + + /** + * @brief Open the Action Search overlay. + */ void open_action_search(); + /** + * @brief Clears the current undo stack. + * + * Clears all current commands in the undo stack. Mostly used for debugging. + */ void clear_undo_stack(); /** diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp index bc903de67..b3286a607 100644 --- a/ui/focusfilter.cpp +++ b/ui/focusfilter.cpp @@ -6,10 +6,7 @@ FocusFilter Olive::FocusFilter; -FocusFilter::FocusFilter() -{ - -} +FocusFilter::FocusFilter() {} void FocusFilter::go_to_in() { QDockWidget* focused_panel = get_focused_panel(); diff --git a/ui/focusfilter.h b/ui/focusfilter.h index b560c9178..9c780622e 100644 --- a/ui/focusfilter.h +++ b/ui/focusfilter.h @@ -3,43 +3,204 @@ #include +/** + * @brief The FocusFilter class + * + * Some keyboard shortcuts/menu actions will do different things depending on the panel that's currently focused. + * For example, pressing "Set Marker" will set a marker on the main active sequence if the timeline is focused, + * or on the media in the Media Viewer if the Media Viewer is focused. This class provides slots/functions that + * can be called that will check which panel is focused and call the appropriate function. + * + * Responds to `config.hover_focus`. Default behavior is focus by clicking on the panels, but if `hover_focus` is + * **TRUE**, the focused panel will be whichever panel has the cursor currently hovering over it. + */ class FocusFilter : public QObject { Q_OBJECT public: + /** + * @brief FocusFilter Constructor + * + * Currently empty. + */ FocusFilter(); public slots: + /** + * @brief Cuts selected clips or selected effects (but not both). + * + * If the Effect Controls panel is focused, cuts selected effects. Otherwise cuts selected clips. + */ void cut(); + + /** + * @brief Copies selected clips or selected effects (but not both). + * + * If the Effect Controls panel is focused, copies selected effects. Otherwise copies selected clips. + */ void copy(); + /** + * @brief Duplicates currently selected items + * + * Currently this only duplicates Sequences in the project panel. + */ void duplicate(); + /** + * @brief Go to In Point. + * + * Calls go_to_in() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void go_to_in(); + + /** + * @brief Go to Out Point. + * + * Calls go_to_out() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void go_to_out(); + + /** + * @brief Go to Start + * + * Calls go_to_start() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void go_to_start(); + + /** + * @brief Go to Previous Frame + * + * Calls previous_frame() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void prev_frame(); + + /** + * @brief Play In Point to Out Point + * + * Calls play(true) on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void play_in_to_out(); + + /** + * @brief Toggle Play/Pause + * + * Calls toggle_play() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void playpause(); + + /** + * @brief Pause/Shuttle Stop. + * + * Calls pause() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void pause(); + + /** + * @brief Increase Speed/Shuttle Right + * + * Calls increase_speed() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void increase_speed(); + + /** + * @brief Decrease Speed/Shuttle Left + * + * Calls decrease_speed() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void decrease_speed(); + + /** + * @brief Go to Next Frame + * + * Calls next_frame() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void next_frame(); + + /** + * @brief Go to End + * + * Calls go_to_end() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void go_to_end(); + /** + * @brief Set currently focused viewer to full screen + * + * Calls viewer_widget->set_fullscreen() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void set_viewer_fullscreen(); + /** + * @brief Set a marker at the current playhead + * + * Calls set_marker() on Media Viewer or Sequence Viewer if it's focused. Otherwise calls it on Timeline. + */ void set_marker(); + /** + * @brief Set in point + * + * Calls set_in_point() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void set_in_point(); + + /** + * @brief Set out point + * + * Calls set_out_point() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void set_out_point(); + + /** + * @brief Clear in point + * + * Calls clear_in() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void clear_in(); + + /** + * @brief Clear out point + * + * Calls clear_out() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void clear_out(); + + /** + * @brief Clear in/out point + * + * Calls clear_inout() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. + */ void clear_inout(); + /** + * @brief Delete + * + * Calls various delete functions based on which UI elements are focused. Deletes span anywhere from deleting + * clips (Timeline), to effects (Effect Controls), to markers (TimelineHeader). + */ void delete_function(); + + /** + * @brief Select All + * + * Calls select_all() on Graph Editor if its focused or Timeline if it's not. + */ void select_all(); + /** + * @brief Zoom In + * + * Calls zoom_in() on Effect Controls, Footage Viewer, or Sequence Viewer if one of them is focused. Otherwise + * calls it on Timeline. + */ void zoom_in(); + + /** + * @brief Zoom Out + * + * Calls zoom_out() on Effect Controls, Footage Viewer, or Sequence Viewer if one of them is focused. Otherwise + * calls it on Timeline. + */ void zoom_out(); }; diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp index ca145baf5..b2f03f438 100644 --- a/ui/menuhelper.cpp +++ b/ui/menuhelper.cpp @@ -146,3 +146,8 @@ void MenuHelper::set_timecode_view() { config.timecode_view = action->data().toInt(); update_ui(false); } + +void MenuHelper::open_recent_from_menu() { + int index = static_cast(sender())->data().toInt(); + Olive::Global.data()->open_recent(index); +} diff --git a/ui/menuhelper.h b/ui/menuhelper.h index 31273909e..4d904d394 100644 --- a/ui/menuhelper.h +++ b/ui/menuhelper.h @@ -55,20 +55,102 @@ public: */ void make_edit_functions_menu(QMenu* parent); + /** + * @brief Sets the checked state of a menu item based on a Boolean variable. + * + * Many menu items simply toggle a Boolean variable. This is a convenience function, assuming the QAction's data + * variable is a pointer to a Boolean variable, that sets the checked state of the QAction to the enabled state + * of the Boolean. Used heavily in functions like toolMenu_About_To_Be_Shown() + * + * @param a + * + * The QAction to set the checked state of. + */ void set_bool_action_checked(QAction* a); + + /** + * @brief Sets the checked state of a menu item based on an integer variable. + * + * Many menu items simply set a variable to a particular integer. This is a convenience function, assuming the + * QAction's data variable is an integer to set a variable to, that sets the checked state of the QAction to + * whether the QAction's integer equals the integer variable. Used heavily in functions like + * viewMenu_About_To_Be_Shown() + * + * @param a + * + * The QAction to set the checked state of + * + * @param i + * + * The integer variable to compare the QAction's integer to + */ void set_int_action_checked(QAction* a, const int& i); + + /** + * @brief Sets the checked state of a menu item based on a QPushButton. + * + * Some menu items function largely as a proxy to a QPushButton. Assuming the QAction's data variable is a + * pointer to a QPushButton, this sets a QAction's checked state to the checked state of the QPushButton. + * + * @param a + */ void set_button_action_checked(QAction* a); public slots: + /** + * @brief Sets a QAction's Boolean reference to the opposite of its current value + * + * Many menu items simply toggle a Boolean variable. This is a convenience function, assuming the QAction's data + * variable is a pointer to a Boolean variable, that sets the Boolean variable to the opposite of its current value. + */ void toggle_bool_action(); + /** + * @brief Set Title/Action Safe Area from QAction + * + * A receiver for several Title/Action Safe Area setting items. Assumes the sender() is a QAction with a data + * variable as a `double`. The `double` can be the following values: + * * NaN (qSNaN()) - Disable Title/Action Safe Area + * * 0 - Enable Title/Action Safe Area, default aspect ratio (match current active Sequence's aspect ratio). + * * Negative Value - Enable Title/Action Safe Area, any negative number assumes a custom aspect ratio. Will ask + * the user to enter an aspect ratio and will use the result. + * * Positive Value - Enable Title/Action Safe Area, use value as the aspect ratio. + */ void set_titlesafe_from_menu(); + /** + * @brief Set Autoscroll setting from QAction + * + * Assumes the sender() is a QAction with an integer as its data variable. The data variable should be + * `AUTOSCROLL_NO_SCROLL`, `AUTOSCROLL_PAGE_SCROLL` (default) or `AUTOSCROLL_SMOOTH_SCROLL`. + */ void set_autoscroll(); + + /** + * @brief Clicks a QPushButton referenced by a QAction when triggered. + * + * Some menu items function largely as a proxy to a QPushButton. Assuming the QAction's data variable is a + * pointer to a QPushButton, this triggers a click() event on that QPushButton. + */ void menu_click_button(); + + /** + * @brief Sets the current timecode setting + * + * Assumes the sender() is a QAction with an integer as its data variable. The data variable should be + * `AUTOSCROLL_NO_AUTOSCROLL`, `AUTOSCROLL_PAGE_AUTOSCROLL` (default) or `AUTOSCROLL_SMOOTH_AUTOSCROLL`. + */ void set_timecode_view(); + /** + * @brief Calls open_recent() in Olive::Global using the index from a QAction + * + * Assumes the sender() is a QAction with an integer as its data variable. The data variable is an index of + * the internal auto-recovery project list. + */ + void open_recent_from_menu(); + private slots: From 671000836e79fccae249bd32386405bf24383aac Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 02:07:28 -0800 Subject: [PATCH 184/202] documented labelslider --- .gitignore | 1 + Doxyfile | 2565 ++++++++++++++++++++++++++++++++++++++++++++ oliveglobal.h | 16 + panels/viewer.cpp | 3 +- ui/labelslider.cpp | 9 +- ui/labelslider.h | 157 ++- 6 files changed, 2743 insertions(+), 8 deletions(-) create mode 100644 Doxyfile diff --git a/.gitignore b/.gitignore index efb18c4b3..d70139df6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ Makefile .qmake.stash effects/frei0r ts/*.qm +docs diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 000000000..132db714e --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2565 @@ +# Doxyfile 1.8.15 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Olive" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is +# Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files +# were built. This is equivalent to specifying the "-p" option to a clang tool, +# such as clang-check. These options will then be passed to the parser. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via Javascript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have Javascript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: https://developer.apple.com/xcode/), introduced with OSX +# 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
aboutdialog.h
+
+
+
1 #ifndef ABOUTDIALOG_H
2 #define ABOUTDIALOG_H
3 
4 #include <QDialog>
5 
6 class AboutDialog : public QDialog
7 {
8  Q_OBJECT
9 
10 public:
11  explicit AboutDialog(QWidget *parent = 0);
12 };
13 
14 #endif // ABOUTDIALOG_H
Definition: aboutdialog.h:6
+
+ + + + diff --git a/docs/html/actionsearch_8h_source.html b/docs/html/actionsearch_8h_source.html new file mode 100644 index 000000000..3933eeb7e --- /dev/null +++ b/docs/html/actionsearch_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: dialogs/actionsearch.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
actionsearch.h
+
+
+
1 #ifndef ACTIONSEARCH_H
2 #define ACTIONSEARCH_H
3 
4 #include <QDialog>
5 #include <QLineEdit>
6 #include <QListWidget>
7 
8 class QListWidget;
9 class QMenu;
10 
11 class ActionSearchList : public QListWidget {
12  Q_OBJECT
13 public:
14  ActionSearchList(QWidget* parent);
15 protected:
16  void mouseDoubleClickEvent(QMouseEvent *event);
17 signals:
18  void dbl_click();
19 };
20 
21 class ActionSearch : public QDialog
22 {
23  Q_OBJECT
24 public:
25  ActionSearch(QWidget* parent = nullptr);
26 private slots:
27  void search_update(const QString& s, const QString &p = nullptr, QMenu *parent = nullptr);
28  void perform_action();
29  void move_selection_up();
30  void move_selection_down();
31 private:
32  ActionSearchList* list_widget;
33 };
34 
35 class ActionSearchEntry : public QLineEdit {
36  Q_OBJECT
37 public:
38  ActionSearchEntry(QWidget* parent);
39 protected:
40  void keyPressEvent(QKeyEvent * event);
41 signals:
42  void moveSelectionUp();
43  void moveSelectionDown();
44 };
45 
46 #endif // ACTIONSEARCH_H
Definition: actionsearch.h:11
+
Definition: actionsearch.h:21
+
Definition: actionsearch.h:35
+
+ + + + diff --git a/docs/html/advancedvideodialog_8h_source.html b/docs/html/advancedvideodialog_8h_source.html new file mode 100644 index 000000000..662d8afff --- /dev/null +++ b/docs/html/advancedvideodialog_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: dialogs/advancedvideodialog.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
advancedvideodialog.h
+
+
+
1 #ifndef ADVANCEDVIDEODIALOG_H
2 #define ADVANCEDVIDEODIALOG_H
3 
4 #include <QDialog>
5 
6 #include "io/exportthread.h"
7 
8 class QComboBox;
9 
10 class AdvancedVideoDialog : public QDialog {
11  Q_OBJECT
12 public:
13  AdvancedVideoDialog(QWidget* parent,
14  int encoding_codec,
15  VideoCodecParams& iparams);
16 
17 public slots:
18  virtual void accept() override;
19 private:
20  VideoCodecParams& params;
21 
22  QComboBox* pix_fmt_combo;
23 };
24 
25 #endif // ADVANCEDVIDEODIALOG_H
Definition: advancedvideodialog.h:10
+
Definition: exportthread.h:48
+
+ + + + diff --git a/docs/html/annotated.html b/docs/html/annotated.html new file mode 100644 index 000000000..5ae3acc0e --- /dev/null +++ b/docs/html/annotated.html @@ -0,0 +1,248 @@ + + + + + + + +Olive: Class List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 C_AEffect
 C_VstEvent
 C_VstEvents
 C_VstMidiEvent
 C_VstParameterProperties
 C_VstTimeInfo
 CAboutDialog
 CActionSearch
 CActionSearchEntry
 CActionSearchList
 CAddClipCommand
 CAddEffectCommand
 CAddMarkerAction
 CAddMediaCommand
 CAddTransitionCommand
 CAdvancedVideoDialog
 CAudioMonitor
 CAudioNoiseEffect
 CAudioSenderThread
 CCacher
 CChangeSequenceAction
 CCheckboxCommand
 CCheckboxEx
 CClickableLabel
 CClip
 CCloseAllClipsCommand
 CCollapsibleWidget
 CCollapsibleWidgetHeader
 CColorButton
 CColorCommand
 CComboAction
 CComboBoxEx
 CComboBoxExCommand
 CComposeSequenceParams
 CConfig
 CCornerPinEffect
 CCrc32
 CCrossDissolveTransition
 CCubeTransition
 CDebugDialog
 CDeleteClipAction
 CDeleteMarkerAction
 CDeleteMediaCommand
 CDeleteTransitionCommand
 CDemoNotice
 CEditSequenceCommand
 CEffect
 CEffectControls
 CEffectDeleteCommand
 CEffectField
 CEffectFieldUndo
 CEffectGizmo
 CEffectInit
 CEffectKeyframe
 CEffectMeta
 CEffectRow
 CEffectsArea
 CEmbeddedFileChooser
 CExponentialFadeTransition
 CExportDialog
 CExportParams
 CExportThread
 CFillLeftRightEffect
 CFlowLayout
 CFocusFilterThe FocusFilter class
 CFontCombobox
 CFootage
 CFootageStream
 CFrei0rEffect
 CGhost
 CGLTextureCoords
 CGraphEditor
 CGraphView
 CKeyframeDelete
 CKeyframeFieldSet
 CKeyframeNavigator
 CKeyframeView
 CKeySequenceEditor
 CLabelSliderThe LabelSlider class
 CLinearFadeTransition
 CLinkCommand
 CLoadDialog
 CLoadThread
 CLogarithmicFadeTransition
 CMainWindow
 CMarker
 CMedia
 CMediaMove
 CMediaPropertiesDialog
 CMediaRename
 CMediaThrobber
 CMenuHelper
 CModifyTransitionCommand
 CMoveClipAction
 CMoveEffectCommand
 CMoveMarkerAction
 CNewSequenceCommand
 CNewSequenceDialog
 COliveAction
 COliveGlobalThe Olive Global class
 COTreeView
 CPanEffect
 CPlayButton
 CPreferencesDialog
 CPreviewGenerator
 CProject
 CProjectFilter
 CProjectModel
 CProxyDialog
 CProxyGenerator
 CProxyInfo
 CQPainterWrapper
 CRefreshClips
 CReloadEffectsCommand
 CRemoveClipsFromClipboard
 CRenameClipCommand
 CRenderThread
 CReplaceClipMediaCommand
 CReplaceClipMediaDialog
 CReplaceMediaCommand
 CResizableScrollBar
 CRippleAction
 CRuntimeConfig
 CScrollArea
 CSelection
 CSequence
 CSetAutoscaleAction
 CSetBool
 CSetDouble
 CSetEffectData
 CSetInt
 CSetKeyframing
 CSetLong
 CSetPointer
 CSetQVariant
 CSetSelectionsCommand
 CSetSpeedAction
 CSetString
 CSetTimelineInOutCommand
 CShakeEffect
 CSolidEffect
 CSourceIconView
 CSourcesCommon
 CSourceTable
 CSpeedDialog
 CStabilizerDialog
 CTextEditDialog
 CTextEditEx
 CTextEffect
 CTimecodeEffect
 CTimeline
 CTimelineHeader
 CTimelineWidget
 CToneEffect
 CTransformEffect
 CTransition
 CTransitionData
 CUpdateFootageTooltip
 CUpdateViewer
 CVideoCodecParams
 CViewer
 CViewerContainer
 CViewerWidget
 CViewerWindow
 CVoidEffect
 CVolumeEffect
 CVSTHost
 CVSTRect
+
+
+ + + + diff --git a/docs/html/audio_8h_source.html b/docs/html/audio_8h_source.html new file mode 100644 index 000000000..0322aeb92 --- /dev/null +++ b/docs/html/audio_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: playback/audio.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
audio.h
+
+
+
1 #ifndef AUDIO_H
2 #define AUDIO_H
3 
4 #include <QVector>
5 #include <QThread>
6 #include <QWaitCondition>
7 #include <QMutex>
8 
9 //#define INT16_MAX 0x7fff
10 //#define INT16_MIN (-INT16_MAX-1)
11 
12 class QIODevice;
13 class QAudioOutput;
14 class QComboBox;
15 
16 struct Sequence;
17 
18 class AudioSenderThread : public QThread {
19  Q_OBJECT
20 public:
22  void run();
23  void stop();
24  QWaitCondition cond;
25  bool close;
26  QMutex lock;
27 public slots:
28  void notifyReceiver();
29 private:
30  QVector<qint16> samples;
31  int send_audio_to_output(qint64 offset, int max);
32 };
33 
34 double log_volume(double linear);
35 
36 extern QAudioOutput* audio_output;
37 extern QIODevice* audio_io_device;
38 extern AudioSenderThread* audio_thread;
39 extern QMutex audio_write_lock;
40 
41 #define audio_ibuffer_size 192000
42 extern qint8 audio_ibuffer[audio_ibuffer_size];
43 extern qint64 audio_ibuffer_read;
44 extern long audio_ibuffer_frame;
45 extern double audio_ibuffer_timecode;
46 extern bool audio_scrub;
47 extern bool recording;
48 extern bool audio_rendering;
49 void clear_audio_ibuffer();
50 
51 int current_audio_freq();
52 
53 bool is_audio_device_set();
54 
55 void init_audio();
56 void stop_audio();
57 qint64 get_buffer_offset_from_frame(double framerate, long frame);
58 
59 bool start_recording();
60 void stop_recording();
61 QString get_recorded_audio_filename();
62 
63 void combobox_audio_sample_rates(QComboBox* combobox);
64 
65 #endif // AUDIO_H
Definition: sequence.h:13
+
Definition: audio.h:18
+
+ + + + diff --git a/docs/html/audiomonitor_8h_source.html b/docs/html/audiomonitor_8h_source.html new file mode 100644 index 000000000..366b8da29 --- /dev/null +++ b/docs/html/audiomonitor_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/audiomonitor.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
audiomonitor.h
+
+
+
1 #ifndef AUDIOMONITOR_H
2 #define AUDIOMONITOR_H
3 
4 #include <QWidget>
5 #include <QTimer>
6 
7 class AudioMonitor : public QWidget
8 {
9  Q_OBJECT
10 public:
11  explicit AudioMonitor(QWidget *parent = 0);
12  void set_value(const QVector<double>& values);
13 
14 protected:
15  void paintEvent(QPaintEvent *);
16  void resizeEvent(QResizeEvent *);
17 
18 signals:
19 
20 public slots:
21 
22 private:
23  QLinearGradient gradient;
24  QVector<double> values;
25  QTimer clear_timer;
26 
27 private slots:
28  void clear();
29 };
30 
31 #endif // AUDIOMONITOR_H
Definition: audiomonitor.h:7
+
+ + + + diff --git a/docs/html/audionoiseeffect_8h_source.html b/docs/html/audionoiseeffect_8h_source.html new file mode 100644 index 000000000..8b4658a25 --- /dev/null +++ b/docs/html/audionoiseeffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/audionoiseeffect.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
audionoiseeffect.h
+
+
+
1 #ifndef AUDIONOISEEFFECT_H
2 #define AUDIONOISEEFFECT_H
3 
4 #include "project/effect.h"
5 
6 class AudioNoiseEffect : public Effect {
7  Q_OBJECT
8 public:
9  AudioNoiseEffect(Clip* c, const EffectMeta* em);
10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
11 
12  EffectField* amount_val;
13  EffectField* mix_val;
14 };
15 
16 #endif // AUDIONOISEEFFECT_H
Definition: effect.h:146
+
Definition: effect.h:27
+
Definition: audionoiseeffect.h:6
+
Definition: clip.h:33
+
Definition: effectfield.h:23
+
+ + + + diff --git a/docs/html/bc_s.png b/docs/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/docs/html/bdwn.png b/docs/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +Olive: playback/cacher.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
cacher.h
+
+
+
1 #ifndef CACHER_H
2 #define CACHER_H
3 
4 #include <QThread>
5 #include <QVector>
6 
7 class Clip;
8 
9 class Cacher : public QThread
10 {
11 // Q_OBJECT
12 public:
13  Cacher(Clip* c);
14  void run();
15 
16  bool caching;
17 
18  // must be set before caching
19  long playhead;
20  bool reset;
21  bool scrubbing;
22  bool interrupt;
23  bool queued;
24  int playback_speed;
25  QVector<Clip*> nests;
26 
27 private:
28  Clip* clip;
29 };
30 
31 void open_clip_worker(Clip* clip);
32 void cache_clip_worker(Clip* clip, long playhead, bool reset, bool scrubbing, QVector<Clip *> nest, int playback_speed);
33 void close_clip_worker(Clip* clip);
34 
35 #endif // CACHER_H
Definition: cacher.h:9
+
Definition: clip.h:33
+
+ + + + diff --git a/docs/html/checkboxex_8h_source.html b/docs/html/checkboxex_8h_source.html new file mode 100644 index 000000000..d24354433 --- /dev/null +++ b/docs/html/checkboxex_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/checkboxex.h Source File + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
checkboxex.h
+
+
+
1 #ifndef CHECKBOXEX_H
2 #define CHECKBOXEX_H
3 
4 #include <QCheckBox>
5 
6 class CheckboxEx : public QCheckBox
7 {
8  Q_OBJECT
9 public:
10  CheckboxEx(QWidget* parent = 0);
11 private slots:
12  void checkbox_command();
13 };
14 
15 #endif // CHECKBOXEX_H
Definition: checkboxex.h:6
+
+ + + + diff --git a/docs/html/class_about_dialog-members.html b/docs/html/class_about_dialog-members.html new file mode 100644 index 000000000..0a57d071e --- /dev/null +++ b/docs/html/class_about_dialog-members.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AboutDialog Member List
+
+
+ +

This is the complete list of members for AboutDialog, including all inherited members.

+ + +
AboutDialog(QWidget *parent=0) (defined in AboutDialog)AboutDialogexplicit
+ + + + diff --git a/docs/html/class_about_dialog.html b/docs/html/class_about_dialog.html new file mode 100644 index 000000000..27b7df8e5 --- /dev/null +++ b/docs/html/class_about_dialog.html @@ -0,0 +1,96 @@ + + + + + + + +Olive: AboutDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AboutDialog Class Reference
+
+
+
+Inheritance diagram for AboutDialog:
+
+
+ +
+ + + + +

+Public Member Functions

AboutDialog (QWidget *parent=0)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_about_dialog.png b/docs/html/class_about_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..62c4106f3fab0ba24e0608d9db250dd08922ead1 GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^fj}ICycx<+0;H>occSW`J30IbuXmiCz;>QU3`AZ zLN~c9kGHMhvHic}V(IaWQ#Xq1i;itGPqR(d>2F-)-a9wW|Jp_2ns*%EH=euuYO4zG zr0hRS`X-q)sOxL~yLR1Y(zBmk7tiPjHz=Algk0*qJ#DRzxme;Rqx(PftM>LVaOx-@ zusO|PaNdaN%;p}3&p@sv$Vm*HAc>0+i{IH#IeF{&;ikz;*Jtwk_wJA9lm4r5e&MCO znX3<n>NRjDa3P#HX3 L{an^LB{Ts5sWZfB literal 0 HcmV?d00001 diff --git a/docs/html/class_action_search-members.html b/docs/html/class_action_search-members.html new file mode 100644 index 000000000..b13f0513a --- /dev/null +++ b/docs/html/class_action_search-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ActionSearch Member List
+
+
+ +

This is the complete list of members for ActionSearch, including all inherited members.

+ + + + + + + +
ActionSearch(QWidget *parent=nullptr) (defined in ActionSearch)ActionSearch
list_widget (defined in ActionSearch)ActionSearchprivate
move_selection_down() (defined in ActionSearch)ActionSearchprivateslot
move_selection_up() (defined in ActionSearch)ActionSearchprivateslot
perform_action() (defined in ActionSearch)ActionSearchprivateslot
search_update(const QString &s, const QString &p=nullptr, QMenu *parent=nullptr) (defined in ActionSearch)ActionSearchprivateslot
+ + + + diff --git a/docs/html/class_action_search.html b/docs/html/class_action_search.html new file mode 100644 index 000000000..3b1ba6b04 --- /dev/null +++ b/docs/html/class_action_search.html @@ -0,0 +1,119 @@ + + + + + + + +Olive: ActionSearch Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ActionSearch Class Reference
+
+
+
+Inheritance diagram for ActionSearch:
+
+
+ +
+ + + + +

+Public Member Functions

ActionSearch (QWidget *parent=nullptr)
 
+ + + + + + + + + +

+Private Slots

+void search_update (const QString &s, const QString &p=nullptr, QMenu *parent=nullptr)
 
+void perform_action ()
 
+void move_selection_up ()
 
+void move_selection_down ()
 
+ + + +

+Private Attributes

+ActionSearchListlist_widget
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_action_search.png b/docs/html/class_action_search.png new file mode 100644 index 0000000000000000000000000000000000000000..474f7d02036b4e716bfc415815b7f6f65d67c8e7 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^kw6^4!3-o_Z)t`CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^@i=_&z%9i=_k+S+zCnF{bN`0jOV+)UCUXq zDlUZQ=TxiJtKuezx`uvr{HgzoF-3492V=}NCV@o;pEkKHJbZ#xrln8$|LL0^Mi=I* zs7oFQo-~=~f#yk1whv!^0u>7=GBA35dOvx&@u}1Q&TM_k;4Za~?}=q?|AuvQ7o9(u z9hWPYJ?ZHBWzX$qeQip9;FA~adpmgh% + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ActionSearchEntry Member List
+
+
+ +

This is the complete list of members for ActionSearchEntry, including all inherited members.

+ + + + + +
ActionSearchEntry(QWidget *parent) (defined in ActionSearchEntry)ActionSearchEntry
keyPressEvent(QKeyEvent *event) (defined in ActionSearchEntry)ActionSearchEntryprotected
moveSelectionDown() (defined in ActionSearchEntry)ActionSearchEntrysignal
moveSelectionUp() (defined in ActionSearchEntry)ActionSearchEntrysignal
+ + + + diff --git a/docs/html/class_action_search_entry.html b/docs/html/class_action_search_entry.html new file mode 100644 index 000000000..9dfe61616 --- /dev/null +++ b/docs/html/class_action_search_entry.html @@ -0,0 +1,113 @@ + + + + + + + +Olive: ActionSearchEntry Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ActionSearchEntry Class Reference
+
+
+
+Inheritance diagram for ActionSearchEntry:
+
+
+ +
+ + + + + + +

+Signals

+void moveSelectionUp ()
 
+void moveSelectionDown ()
 
+ + + +

+Public Member Functions

ActionSearchEntry (QWidget *parent)
 
+ + + +

+Protected Member Functions

+void keyPressEvent (QKeyEvent *event)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_action_search_entry.png b/docs/html/class_action_search_entry.png new file mode 100644 index 0000000000000000000000000000000000000000..fffe68a21336d861e0d7cfb02422e0b1527db31f GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^Hn^w23>d)!Q|_UM_MCIio1vEAC9kH22Mlm7Q@?HsQn-H?oXJie2DSsgxm z=HA6B+n)6gb~${~NK1IXsWVs1{D1n_;5^UtsiFH7J!5NS*1vxAciPp}JI>wWzHqeK z@Ox$Y+=|t|_fD%`@jQ86`s>o-<|UO_oH4?b(Hl$6ibC zIMzrD5KqJe`}%9x`8Vzqe`s`n{~`dI4LD@7%ro + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ActionSearchList Member List
+
+
+ +

This is the complete list of members for ActionSearchList, including all inherited members.

+ + + + +
ActionSearchList(QWidget *parent) (defined in ActionSearchList)ActionSearchList
dbl_click() (defined in ActionSearchList)ActionSearchListsignal
mouseDoubleClickEvent(QMouseEvent *event) (defined in ActionSearchList)ActionSearchListprotected
+ + + + diff --git a/docs/html/class_action_search_list.html b/docs/html/class_action_search_list.html new file mode 100644 index 000000000..377614415 --- /dev/null +++ b/docs/html/class_action_search_list.html @@ -0,0 +1,110 @@ + + + + + + + +Olive: ActionSearchList Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ActionSearchList Class Reference
+
+
+
+Inheritance diagram for ActionSearchList:
+
+
+ +
+ + + + +

+Signals

+void dbl_click ()
 
+ + + +

+Public Member Functions

ActionSearchList (QWidget *parent)
 
+ + + +

+Protected Member Functions

+void mouseDoubleClickEvent (QMouseEvent *event)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_action_search_list.png b/docs/html/class_action_search_list.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d41799220c4cd1a4ed848bcb4faca6cfde40ed GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^IY1o1!3-o%GbCsNDTx4|5ZC|z{{xvX-h3_XKQsZz z0^C7v#hAr*{o=U(i4t-#~bA8+;l|MA;w zPC4qCS5!~$U3I~zh~YT9wE6F@nKv~OCz-ejt9jo2WuLJAS!B-KZC^jdOf8=~T}5^7 zK`D)V_ZyLK`V($<-n|*Wa^EN4nQOIIuZ){CH?{q!uYS^+hr|v)E<2Gs0 zy#w1m?>34%lJ@Jzfj{pLyj%75JxmqdTPYGAzCk?BXP9K&K0p>GvDOL|*uBOhltC&u6D z6=u7zo|E~-wHC&b>_ZH@OcNRI&N67o^ObPeuEz7>@R^(`1`UQFk-x?f2kg{;C+oJz4C>Q&XYbi%T>f>d%R=efVHt-XJ((6Yf6BDH)H8QEJ{*TR)9vt?Gi)!}pD@{X Uhqb7r0^^Xu)78&qol`;+0HxjbqyPW_ literal 0 HcmV?d00001 diff --git a/docs/html/class_add_clip_command-members.html b/docs/html/class_add_clip_command-members.html new file mode 100644 index 000000000..dc5954abe --- /dev/null +++ b/docs/html/class_add_clip_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AddClipCommand Member List
+
+
+ +

This is the complete list of members for AddClipCommand, including all inherited members.

+ + + + + + + + + + + + +
AddClipCommand(Sequence *s, QVector< Clip * > &add) (defined in AddClipCommand)AddClipCommand
clips (defined in AddClipCommand)AddClipCommandprivate
doRedo() override (defined in AddClipCommand)AddClipCommandvirtual
doUndo() override (defined in AddClipCommand)AddClipCommandvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in AddClipCommand)AddClipCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
undone_clips (defined in AddClipCommand)AddClipCommandprivate
~AddClipCommand() override (defined in AddClipCommand)AddClipCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_add_clip_command.html b/docs/html/class_add_clip_command.html new file mode 100644 index 000000000..5a253a5d7 --- /dev/null +++ b/docs/html/class_add_clip_command.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: AddClipCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AddClipCommand Class Reference
+
+
+
+Inheritance diagram for AddClipCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

AddClipCommand (Sequence *s, QVector< Clip * > &add)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Sequenceseq
 
+QVector< Clip * > clips
 
+QVector< Clip * > undone_clips
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_add_clip_command.png b/docs/html/class_add_clip_command.png new file mode 100644 index 0000000000000000000000000000000000000000..6a6a8ea070ed35454bdace87e61e1a3efd06fc55 GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^1wh=v!3-oh{?F$HQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM(wq666=m08|75S5Ji)F)%R2dAc};R4~4s`*zZ51s(_gM?Rnb<=2Ex z=ogdSe)f{}=9>?7G*sLTzL_g289Sai^Gwjm*f@Nj&Ye{m?@#ZyGL1+}E9>92M_BCq z)&hgzL&%9C+==6X7YAbur(%P)B1?g43&Xk=frJyAbWZz3goHj9bP5d(|EIlhO?~x# z^U$k(@9v$H3cWgy`=O%sNtL^QtG9V4`c0Ix%}-Fz-Ocg+_1pNlF~^tle@I@q;#EW4 z*`tiRIc}%E1?otD$NgC{Z|aq=`}K0tUthH3*sZ1e_?_GP9}z!3$(n^mwjM8yU;3Ui zH1sa#!d0uZ6+=QxpGqG}jhxoWu;(aqg4*WR{^Kc+a~{5$ojphI4|AxL6GJ>Ummioa zz{DdcIFpmfpkIJ#$EVPTr!(GvJ9X>$+r>|JGni{yddHaS#7_FQtxEiX+VewyRxVjr z+qPHs_F8LOr`?WoPlT^Oqh>*BiEYb&1}DZZ^}qixu=J_*8};AHXHVWv svH!R9=bv;<@LF!eEby85}Sb4q9e03qK*<^TWy literal 0 HcmV?d00001 diff --git a/docs/html/class_add_effect_command-members.html b/docs/html/class_add_effect_command-members.html new file mode 100644 index 000000000..ab29815cb --- /dev/null +++ b/docs/html/class_add_effect_command-members.html @@ -0,0 +1,92 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AddEffectCommand Member List
+
+
+ +

This is the complete list of members for AddEffectCommand, including all inherited members.

+ + + + + + + + + + + + + + +
AddEffectCommand(Clip *c, Effect *e, const EffectMeta *m, int insert_pos=-1) (defined in AddEffectCommand)AddEffectCommand
clip (defined in AddEffectCommand)AddEffectCommandprivate
done (defined in AddEffectCommand)AddEffectCommandprivate
doRedo() override (defined in AddEffectCommand)AddEffectCommandvirtual
doUndo() override (defined in AddEffectCommand)AddEffectCommandvirtual
meta (defined in AddEffectCommand)AddEffectCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
pos (defined in AddEffectCommand)AddEffectCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
ref (defined in AddEffectCommand)AddEffectCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
~AddEffectCommand() override (defined in AddEffectCommand)AddEffectCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_add_effect_command.html b/docs/html/class_add_effect_command.html new file mode 100644 index 000000000..663d0f56e --- /dev/null +++ b/docs/html/class_add_effect_command.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: AddEffectCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AddEffectCommand Class Reference
+
+
+
+Inheritance diagram for AddEffectCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

AddEffectCommand (Clip *c, Effect *e, const EffectMeta *m, int insert_pos=-1)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + +

+Private Attributes

+Clipclip
 
+const EffectMetameta
 
+Effectref
 
+int pos
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_add_effect_command.png b/docs/html/class_add_effect_command.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee4bfd209ed5928c1be1cd3543e7267aa47c2ff GIT binary patch literal 754 zcmeAS@N?(olHy`uVBq!ia0vp^)j-_A!3-on$fx`QQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;F0d9{geiK_VLJ7>;x7R;XcQz*~aIG$~{tIIKl50?B5 zjyxsya*v-d-`!j_qh`tP^Uo@GFwWsLZ_t0p_CfUy!@d^j1Jetbe+cC<#2?}b5tN;JhgFAJf_2%z%4Yl4Y4|SYS#s~<-uH@g zb63uD_x|uJVb#``Yl|22My*@-Ixj5e`c27P{iU^YcZCSAc34~Ozv}RnXJ=2Xjwv(G zzhAt3cin3{?_G{9q-@No%+1|ciyL(?oIXgf1YA_HOa2MD0^-` i&w;7XPzOiV2mZTX6Y_(y{<;AZD1)b~pUXO@geCykCWAEq literal 0 HcmV?d00001 diff --git a/docs/html/class_add_marker_action-members.html b/docs/html/class_add_marker_action-members.html new file mode 100644 index 000000000..23efcec6a --- /dev/null +++ b/docs/html/class_add_marker_action-members.html @@ -0,0 +1,91 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AddMarkerAction Member List
+
+
+ +

This is the complete list of members for AddMarkerAction, including all inherited members.

+ + + + + + + + + + + + + +
active_array (defined in AddMarkerAction)AddMarkerActionprivate
AddMarkerAction(QVector< Marker > *m, long t, QString n) (defined in AddMarkerAction)AddMarkerAction
doRedo() override (defined in AddMarkerAction)AddMarkerActionvirtual
doUndo() override (defined in AddMarkerAction)AddMarkerActionvirtual
index (defined in AddMarkerAction)AddMarkerActionprivate
name (defined in AddMarkerAction)AddMarkerActionprivate
old_name (defined in AddMarkerAction)AddMarkerActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
time (defined in AddMarkerAction)AddMarkerActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_add_marker_action.html b/docs/html/class_add_marker_action.html new file mode 100644 index 000000000..b5af33d98 --- /dev/null +++ b/docs/html/class_add_marker_action.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: AddMarkerAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AddMarkerAction Class Reference
+
+
+
+Inheritance diagram for AddMarkerAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

AddMarkerAction (QVector< Marker > *m, long t, QString n)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + +

+Private Attributes

+QVector< Marker > * active_array
 
+long time
 
+QString name
 
+QString old_name
 
+int index
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_add_marker_action.png b/docs/html/class_add_marker_action.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f3f48355becfc1bceafcc4e77d80c88b0f52 GIT binary patch literal 725 zcmeAS@N?(olHy`uVBq!ia0vp^1wh=v!3-oh{?F$HQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM(wq666=m08|75S5Ji)F)%Qtc)B=-R4~4s`!H{_0T07@w^jH5_u6wY z=5TeC#{KgAdPG;Tv-seQe{L>I)H`NI+IwZBO*_@zdR}YRt*`gZN;jN2^G5FWCxsZ> z>xY^njW=uewXQWcJ3YzK62}(TFn>Thj;E*y~))8-yZE}*1A6E z`%b;?BWL0-yKwJZ6=b~GetAn;+R7;x&ge|_=WungV)`J)-!Sisn4R3*-o34h*RS8W z`vdo?EiDW?rwAxa6=GTvwP8`u*I=e)m#6M~PJ>Z`&JR{Mh>8sdY){PR{AS zBbL7B3=O@k39?W%B-Hn*@S#MBwmybEN0}F>?``dOPfyN&_~Lc;8@)eGTDpo3da5iQ zOIsLLV)%hiQ1B%u(}jMZ$36u<^v=(jw(;&pK7UEJSe*^AeiFN~FWkvJyVOAKwN4@X zp>HeC^orZrFWRroyRCW!hi`kx6imPUA>_sMw!`kO z9G&LX3+3ZmFTX#x+CZg1y+rxrv$hRS|2s(pKloNqJAaov$6@Q5PA>h-=_l`c=5v;Z zO2yr&%UF9!LcXlBa{Je4t_dE%VE)Oqu*1XsALC5t@F=+>dsu;KkipZ{&t;ucLK6U; CK1#;` literal 0 HcmV?d00001 diff --git a/docs/html/class_add_media_command-members.html b/docs/html/class_add_media_command-members.html new file mode 100644 index 000000000..9b3ac22b2 --- /dev/null +++ b/docs/html/class_add_media_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AddMediaCommand Member List
+
+
+ +

This is the complete list of members for AddMediaCommand, including all inherited members.

+ + + + + + + + + + + + +
AddMediaCommand(Media *iitem, Media *iparent) (defined in AddMediaCommand)AddMediaCommand
done (defined in AddMediaCommand)AddMediaCommandprivate
doRedo() override (defined in AddMediaCommand)AddMediaCommandvirtual
doUndo() override (defined in AddMediaCommand)AddMediaCommandvirtual
item (defined in AddMediaCommand)AddMediaCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
parent (defined in AddMediaCommand)AddMediaCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~AddMediaCommand() override (defined in AddMediaCommand)AddMediaCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_add_media_command.html b/docs/html/class_add_media_command.html new file mode 100644 index 000000000..5b564f5a9 --- /dev/null +++ b/docs/html/class_add_media_command.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: AddMediaCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AddMediaCommand Class Reference
+
+
+
+Inheritance diagram for AddMediaCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

AddMediaCommand (Media *iitem, Media *iparent)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Mediaitem
 
+Mediaparent
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_add_media_command.png b/docs/html/class_add_media_command.png new file mode 100644 index 0000000000000000000000000000000000000000..73e5425e38fda93b0b29c34fa62d1b0a30415823 GIT binary patch literal 750 zcmeAS@N?(olHy`uVBq!ia0vp^wLsj#!3-q-GK%a4QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;ChTVqn zm&v~sveLeFaDOY>TT)#Yxou}|S@nvqt8{O#Kiy@O!MOj{nW)_<_mAaMoU*8Na+;uyy86vu(S1RCD)T{Jq=X9vT@Jzx6u1`;XpPg)FsN z>vd+v*ZuZ?FDp6wJp10?=o{*tGxM_-=;cPvXbw9&sMDBtIWE8Ry}j+?*Eg1HSK+J+bne3woS4g zTi0LTK3^>6*!g+Se0Q&S)lhft^Y;&~yXQZ9zGBt953Badd|fND`(OH7yIX!gZhu?% z?DdY_7rFOm+t<8bcWid;{&(5`xXVJX{&&3<8mjEEdsP<8!*7|hmXYClMI|9NCIJ_q zmwwoOJDl{_BcANNRfRSjk)&1MMz5Vl+dq-ve+x7Ruz14r$J*zeC$=WBo z<~JKljka*~yo2KG9}X{(RcHdnfk2+PVCN(GLlH?LVq!tLz{JVm>FVdQ&MBb@00obB A?f?J) literal 0 HcmV?d00001 diff --git a/docs/html/class_add_transition_command-members.html b/docs/html/class_add_transition_command-members.html new file mode 100644 index 000000000..fd30dfbfc --- /dev/null +++ b/docs/html/class_add_transition_command-members.html @@ -0,0 +1,94 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AddTransitionCommand Member List
+
+
+ +

This is the complete list of members for AddTransitionCommand, including all inherited members.

+ + + + + + + + + + + + + + + + +
AddTransitionCommand(Clip *c, Clip *s, Transition *copy, const EffectMeta *itransition, int itype, int ilength) (defined in AddTransitionCommand)AddTransitionCommand
clip (defined in AddTransitionCommand)AddTransitionCommandprivate
doRedo() override (defined in AddTransitionCommand)AddTransitionCommandvirtual
doUndo() override (defined in AddTransitionCommand)AddTransitionCommandvirtual
length (defined in AddTransitionCommand)AddTransitionCommandprivate
old_ptransition (defined in AddTransitionCommand)AddTransitionCommandprivate
old_stransition (defined in AddTransitionCommand)AddTransitionCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
secondary (defined in AddTransitionCommand)AddTransitionCommandprivate
transition (defined in AddTransitionCommand)AddTransitionCommandprivate
transition_to_copy (defined in AddTransitionCommand)AddTransitionCommandprivate
type (defined in AddTransitionCommand)AddTransitionCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_add_transition_command.html b/docs/html/class_add_transition_command.html new file mode 100644 index 000000000..71fc7f7a2 --- /dev/null +++ b/docs/html/class_add_transition_command.html @@ -0,0 +1,143 @@ + + + + + + + +Olive: AddTransitionCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AddTransitionCommand Class Reference
+
+
+
+Inheritance diagram for AddTransitionCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

AddTransitionCommand (Clip *c, Clip *s, Transition *copy, const EffectMeta *itransition, int itype, int ilength)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + + + + + + + +

+Private Attributes

+Clipclip
 
+Clipsecondary
 
+Transitiontransition_to_copy
 
+const EffectMetatransition
 
+int type
 
+int length
 
+int old_ptransition
 
+int old_stransition
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_add_transition_command.png b/docs/html/class_add_transition_command.png new file mode 100644 index 0000000000000000000000000000000000000000..e5cf1383c96f170952331b84aa17f2b44abf3ce8 GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^6M?vcgBeI(xc}1$NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~-Sl*E45?szJNMzF)e1ar{*Qe2f3JU> zEh-u|>)N|A{mqm4mMd`0GN)W1E)O#k>UjnyxT%6T^2oi11Xl;g@?)s=@`7jLb*@-1QOtnZxR zGxuJ4t?OyKZr#OZ?_`z8=v_bs$Bh?fUCEbN8~s1M=hfK{+XA=GR{6T4?Aj{J)eEfy zPu?ne2h(wZC$5J=LzJa!%2^Z^jEVjvJIPam{FvEnY!;=8DKgY!PvWbY#yLZeJ-QK-3%zW}ruK4JQ zXZMR@yLMMQU;d_W{O(^)@gB3;?7@+j|1CSGy4dLWuMer5V%J)4_fGr$`@Z0u*XyP0 zZlAcb*LimFQ`x#BEBsa$-?=;g)4sq;-|uhl#r)qNC~JG~T)u>9dhU92-nB=b_xjym z{3=J*?RIVTHM^82@BUR@I&s%lt@qB|WDq0GV{zuJWfK{G2<9<38_v1-)@;_L0=LZ< z61*NuK8<9qaFb#@vP96qhXC~_RoQs+!UGI!O1%t8mpBxbnOR+ZmT>bQL+rB)Q4PzE z+-2BT zlE2L87F$%>J^kGm?HvOBKKmlit0K8K zIU(PY61Jqh@r+O3opy!in(-?6pN$t+Zg-5;lbrimdGS3vD@n;3&94`tuV3%=`@Le; zj{0k-K588NwRUUz+RDSBn;m1%HP7|8Kfr+S@0kg1X=%zI`Gs{1%w-89ZJ6 KT-G@yGywpFF^fI` literal 0 HcmV?d00001 diff --git a/docs/html/class_advanced_video_dialog-members.html b/docs/html/class_advanced_video_dialog-members.html new file mode 100644 index 000000000..d96299b0d --- /dev/null +++ b/docs/html/class_advanced_video_dialog-members.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AdvancedVideoDialog Member List
+
+
+ +

This is the complete list of members for AdvancedVideoDialog, including all inherited members.

+ + + + + +
accept() override (defined in AdvancedVideoDialog)AdvancedVideoDialogvirtualslot
AdvancedVideoDialog(QWidget *parent, int encoding_codec, VideoCodecParams &iparams) (defined in AdvancedVideoDialog)AdvancedVideoDialog
params (defined in AdvancedVideoDialog)AdvancedVideoDialogprivate
pix_fmt_combo (defined in AdvancedVideoDialog)AdvancedVideoDialogprivate
+ + + + diff --git a/docs/html/class_advanced_video_dialog.html b/docs/html/class_advanced_video_dialog.html new file mode 100644 index 000000000..3b2e0dd6f --- /dev/null +++ b/docs/html/class_advanced_video_dialog.html @@ -0,0 +1,113 @@ + + + + + + + +Olive: AdvancedVideoDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AdvancedVideoDialog Class Reference
+
+
+
+Inheritance diagram for AdvancedVideoDialog:
+
+
+ +
+ + + + +

+Public Slots

+virtual void accept () override
 
+ + + +

+Public Member Functions

AdvancedVideoDialog (QWidget *parent, int encoding_codec, VideoCodecParams &iparams)
 
+ + + + + +

+Private Attributes

+VideoCodecParamsparams
 
+QComboBox * pix_fmt_combo
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_advanced_video_dialog.png b/docs/html/class_advanced_video_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..5c96592d97116bea7b0a59a1d3ef7bfe158a3c07 GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^-9Q|`!3-qj?8+2@lth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C`Mo$;VkP61Pa~-F@Qs8mRH>>;qUw(hs z3J2${R-bdu&Cz*h(#(>_d{H+o&GCSWCd*4D&v_*iRnD{Pz3#m~Pc=i{^V0D>??2tB zdtTV+J$IjtS4eZvA~D_m?Pu#wF74{M=&EPD`u&xqZ*R@NXsUO5zHs`N|FLSdB{yqV z9xuGV`gfgXa{N1GPb*K6>F@7|ds;c#YI$0D|MT;nq#mnsQuxf#GdgSx_RrY_S{(GY zN6XA~(ChY+nCYQ+)1ATi66=A*9 afxo~##IxOJrZg}@89ZJ6T-G@yGywoo>G&@I literal 0 HcmV?d00001 diff --git a/docs/html/class_audio_monitor-members.html b/docs/html/class_audio_monitor-members.html new file mode 100644 index 000000000..ab1f5641b --- /dev/null +++ b/docs/html/class_audio_monitor-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AudioMonitor Member List
+
+
+ +

This is the complete list of members for AudioMonitor, including all inherited members.

+ + + + + + + + + +
AudioMonitor(QWidget *parent=0) (defined in AudioMonitor)AudioMonitorexplicit
clear() (defined in AudioMonitor)AudioMonitorprivateslot
clear_timer (defined in AudioMonitor)AudioMonitorprivate
gradient (defined in AudioMonitor)AudioMonitorprivate
paintEvent(QPaintEvent *) (defined in AudioMonitor)AudioMonitorprotected
resizeEvent(QResizeEvent *) (defined in AudioMonitor)AudioMonitorprotected
set_value(const QVector< double > &values) (defined in AudioMonitor)AudioMonitor
values (defined in AudioMonitor)AudioMonitorprivate
+ + + + diff --git a/docs/html/class_audio_monitor.html b/docs/html/class_audio_monitor.html new file mode 100644 index 000000000..35ea0c2d5 --- /dev/null +++ b/docs/html/class_audio_monitor.html @@ -0,0 +1,129 @@ + + + + + + + +Olive: AudioMonitor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for AudioMonitor:
+
+
+ +
+ + + + + + +

+Public Member Functions

AudioMonitor (QWidget *parent=0)
 
+void set_value (const QVector< double > &values)
 
+ + + + + +

+Protected Member Functions

+void paintEvent (QPaintEvent *)
 
+void resizeEvent (QResizeEvent *)
 
+ + + +

+Private Slots

+void clear ()
 
+ + + + + + + +

+Private Attributes

+QLinearGradient gradient
 
+QVector< double > values
 
+QTimer clear_timer
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_audio_monitor.png b/docs/html/class_audio_monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..6685c7cc45b542a631c7b3359c0c2b15d44eed0a GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^5kMTk!3-omhsg zxutF^s4<;X71JafcsJBdSJ2b+UBlz6AEccpP4zoq`B_4y{72zY!SHSGR$SS+?!|%m zYYSgJUiT<4yd`}?%F>^c%O{$%uk+{eESt5aqDJG-X3t4;<2c0x4FwqPTw`Jo+r*^b zEqIe_Pf_lPvusMgLjp$IsAYB zbB*8*{e7RVvjwp=NNqoG+dtsL93SO>@!;Sp!TENjLL$n_I=u``XqBc-xK|}mSI7A^L<{R<1X+w XpE8jNe{|ao7`zOgu6{1-oD!M + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AudioNoiseEffect Member List
+
+
+ +

This is the complete list of members for AudioNoiseEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
amount_val (defined in AudioNoiseEffect)AudioNoiseEffect
are_gizmos_enabled() (defined in Effect)Effect
AudioNoiseEffect(Clip *c, const EffectMeta *em) (defined in AudioNoiseEffect)AudioNoiseEffect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
mix_val (defined in AudioNoiseEffect)AudioNoiseEffect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in AudioNoiseEffect)AudioNoiseEffectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_audio_noise_effect.html b/docs/html/class_audio_noise_effect.html new file mode 100644 index 000000000..921e76db9 --- /dev/null +++ b/docs/html/class_audio_noise_effect.html @@ -0,0 +1,269 @@ + + + + + + + +Olive: AudioNoiseEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
AudioNoiseEffect Class Reference
+
+
+
+Inheritance diagram for AudioNoiseEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

AudioNoiseEffect (Clip *c, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldamount_val
 
+EffectFieldmix_val
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_audio_noise_effect.png b/docs/html/class_audio_noise_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..8d1bd7c446684267749582ec907c6bc3963762d2 GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^c|hF3!3-n~XXu3iDTx4|5ZC|z{{xvX-h3_XKQsZz z0^?c~3{pan=r&K;}=0fHTN+k?#Eqn($E-*?6S}`a)u_w5^VCdnHJuoqI zmYV$x7neO8b2~Z&_lHiuHh=3x!HIvZzPY-%?OB)o?)lkzuk9`oi(}faMQ3(**gP*Q zX?>=q^hq@TdESE0Ct{P!FMib&6|8LBKWXAI87nq9%E@3`BhR-T9rpZV3bCtnTh>PL@D eHJ3g)W?$eL(Ph5#*)(9%VeoYIb6Mw<&;$Vc;WWDd literal 0 HcmV?d00001 diff --git a/docs/html/class_audio_sender_thread-members.html b/docs/html/class_audio_sender_thread-members.html new file mode 100644 index 000000000..42bd8e50e --- /dev/null +++ b/docs/html/class_audio_sender_thread-members.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
AudioSenderThread Member List
+
+
+ +

This is the complete list of members for AudioSenderThread, including all inherited members.

+ + + + + + + + + + +
AudioSenderThread() (defined in AudioSenderThread)AudioSenderThread
close (defined in AudioSenderThread)AudioSenderThread
cond (defined in AudioSenderThread)AudioSenderThread
lock (defined in AudioSenderThread)AudioSenderThread
notifyReceiver() (defined in AudioSenderThread)AudioSenderThreadslot
run() (defined in AudioSenderThread)AudioSenderThread
samples (defined in AudioSenderThread)AudioSenderThreadprivate
send_audio_to_output(qint64 offset, int max) (defined in AudioSenderThread)AudioSenderThreadprivate
stop() (defined in AudioSenderThread)AudioSenderThread
+ + + + diff --git a/docs/html/class_audio_sender_thread.html b/docs/html/class_audio_sender_thread.html new file mode 100644 index 000000000..66230eb11 --- /dev/null +++ b/docs/html/class_audio_sender_thread.html @@ -0,0 +1,133 @@ + + + + + + + +Olive: AudioSenderThread Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for AudioSenderThread:
+
+
+ +
+ + + + +

+Public Slots

+void notifyReceiver ()
 
+ + + + + +

+Public Member Functions

+void run ()
 
+void stop ()
 
+ + + + + + + +

+Public Attributes

+QWaitCondition cond
 
+bool close
 
+QMutex lock
 
+ + + +

+Private Member Functions

+int send_audio_to_output (qint64 offset, int max)
 
+ + + +

+Private Attributes

+QVector< qint16 > samples
 
+
The documentation for this class was generated from the following files:
    +
  • playback/audio.h
  • +
  • playback/audio.cpp
  • +
+
+ + + + diff --git a/docs/html/class_audio_sender_thread.png b/docs/html/class_audio_sender_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..37bfb18f5e8317f95de04e71f1c99b97efbeb082 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^bwC`z!3-o{L>vAAQW60^A+G=b{|AY@`C8h4XabN0 z#s>}@VC}pk59D%`1o;Is02P72)l(rx3=E8uJzX3_Dj46+Jz3Rkz{BP~{m=XV$9V5e zI4E#SCu{#NgO5#5J}$arXxz;_d5OldxJgYvtbZ*H@ZS98+-JRYRk8CQ6>WI!b*Ur# zwfBvzee?Hkd+BwG_31O_Uq@d>-+z+pamn)hoH(PeCA%jqaj)@?pCGt)5xs$(8g8w+9NafaBiO?qt-4ke|MPAA z{k<30eQK|Y{~5XO|6|6QSx|3uT%SF&^&_jcg^$|4Kf#T_C}Z$+^>bP0l+XkKzhVU> literal 0 HcmV?d00001 diff --git a/docs/html/class_cacher-members.html b/docs/html/class_cacher-members.html new file mode 100644 index 000000000..d4272c919 --- /dev/null +++ b/docs/html/class_cacher-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Cacher Member List
+
+
+ +

This is the complete list of members for Cacher, including all inherited members.

+ + + + + + + + + + + + +
Cacher(Clip *c) (defined in Cacher)Cacher
caching (defined in Cacher)Cacher
clip (defined in Cacher)Cacherprivate
interrupt (defined in Cacher)Cacher
nests (defined in Cacher)Cacher
playback_speed (defined in Cacher)Cacher
playhead (defined in Cacher)Cacher
queued (defined in Cacher)Cacher
reset (defined in Cacher)Cacher
run() (defined in Cacher)Cacher
scrubbing (defined in Cacher)Cacher
+ + + + diff --git a/docs/html/class_cacher.html b/docs/html/class_cacher.html new file mode 100644 index 000000000..3fb1008a4 --- /dev/null +++ b/docs/html/class_cacher.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: Cacher Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for Cacher:
+
+
+ +
+ + + + + + +

+Public Member Functions

Cacher (Clip *c)
 
+void run ()
 
+ + + + + + + + + + + + + + + + + +

+Public Attributes

+bool caching
 
+long playhead
 
+bool reset
 
+bool scrubbing
 
+bool interrupt
 
+bool queued
 
+int playback_speed
 
+QVector< Clip * > nests
 
+ + + +

+Private Attributes

+Clipclip
 
+
The documentation for this class was generated from the following files:
    +
  • playback/cacher.h
  • +
  • playback/cacher.cpp
  • +
+
+ + + + diff --git a/docs/html/class_cacher.png b/docs/html/class_cacher.png new file mode 100644 index 0000000000000000000000000000000000000000..6a413d90a811572bdf02ca5594fd4880fe4652a0 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^c0e4!!3-qJ9-74fDTx4|5ZC|z{{xvX-h3_XKQsZz z0^D;}1UH{O$-tE21UF{d?uex&PP1okQ_8-=> zZa%&kWb)!++;mHGs|9nsVG?(p1k+^-#O-2ZwvLS)h88vd+}yhm2Ktp z>bqy&Y}dJaM(61DQco{tgCyn?#>?|>PqAOV|BYmQ(Em?Qrt?ime#xLYjc-B{kovb( z&$Cj%VcJsj>kJnRG%mbyzqj{qh<>KY!-rq}wq{MqzPq&igGt!N>l>;r?mp|cd~f!? z>&ffpe_a)~eb@E-lkMmJP5k`y-s5PkyT8ut>W-by + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ChangeSequenceAction Member List
+
+
+ +

This is the complete list of members for ChangeSequenceAction, including all inherited members.

+ + + + + + + + + + +
ChangeSequenceAction(Sequence *s) (defined in ChangeSequenceAction)ChangeSequenceAction
doRedo() override (defined in ChangeSequenceAction)ChangeSequenceActionvirtual
doUndo() override (defined in ChangeSequenceAction)ChangeSequenceActionvirtual
new_sequence (defined in ChangeSequenceAction)ChangeSequenceActionprivate
old_sequence (defined in ChangeSequenceAction)ChangeSequenceActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_change_sequence_action.html b/docs/html/class_change_sequence_action.html new file mode 100644 index 000000000..0c6d20dae --- /dev/null +++ b/docs/html/class_change_sequence_action.html @@ -0,0 +1,125 @@ + + + + + + + +Olive: ChangeSequenceAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ChangeSequenceAction Class Reference
+
+
+
+Inheritance diagram for ChangeSequenceAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

ChangeSequenceAction (Sequence *s)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Private Attributes

+Sequenceold_sequence
 
+Sequencenew_sequence
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_change_sequence_action.png b/docs/html/class_change_sequence_action.png new file mode 100644 index 0000000000000000000000000000000000000000..043cc4baed2a85cb31f26e6ae161d58bc5db997b GIT binary patch literal 865 zcmeAS@N?(olHy`uVBq!ia0vp^Q-HXGgBeJgeKTSMQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;f#U&~y4{NXd9T#!xPw+0Q!zw3_ z-~1pRbn|J|A*>3j6Iem#41U(T$_o0g@O#zv)f?cMA8#OvjX#i}chr>@)@m$h^A zsh729ud0VvU7U2~Y1OiMBE3_l+*&QI>lqv89V-0aA?q%u{Nz>kJ=>S=N(8ES^=|dF zwQ29ac&*$k2Q;Mn^&G9A`chxtt?t`g8!+ir_RAYib-RA6yyWN5^!y|MbK#00&7~$1 z4DyfI45XC3?&dK^^=g<}_okaJ33+43Ag{>!Kye9!O^ZlF`vj&B0znLNPFx3^Js2xE zG#U7jB>%@|&03aeGULpdV@gZToUv({GIM5oc2MTO=u=OPjI%S|*-9p-ee3cL+I?a2 z)u7`4v5UKdZX0EDZFA9C^YV0%_wRqfR?mO2p5*sXHGX}eZ|4`Ide2pIVf}{2)o1;e zZ2MmN|JUpyj+MK%?^&krX}Vkg`fTa7$HSM%om-i;U3BH%yYKehpKN6On@KS>?U^Fn z0f9@GWzJ$_e&BqE!7bTk`vYZSdAoaGp(#%yZRLJak;%T?bQEoDm zcB^>1?PVtocWyShwPTgVrRbND%T}Fx9JEtE zUFZJWzBOw0LDgG}=X + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CheckboxCommand Member List
+
+
+ +

This is the complete list of members for CheckboxCommand, including all inherited members.

+ + + + + + + + + + + + +
box (defined in CheckboxCommand)CheckboxCommandprivate
CheckboxCommand(QCheckBox *b) (defined in CheckboxCommand)CheckboxCommand
checked (defined in CheckboxCommand)CheckboxCommandprivate
done (defined in CheckboxCommand)CheckboxCommandprivate
doRedo() override (defined in CheckboxCommand)CheckboxCommandvirtual
doUndo() override (defined in CheckboxCommand)CheckboxCommandvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~CheckboxCommand() override (defined in CheckboxCommand)CheckboxCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_checkbox_command.html b/docs/html/class_checkbox_command.html new file mode 100644 index 000000000..37c7df864 --- /dev/null +++ b/docs/html/class_checkbox_command.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: CheckboxCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CheckboxCommand Class Reference
+
+
+
+Inheritance diagram for CheckboxCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

CheckboxCommand (QCheckBox *b)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+QCheckBox * box
 
+bool checked
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_checkbox_command.png b/docs/html/class_checkbox_command.png new file mode 100644 index 0000000000000000000000000000000000000000..d32b81856612fa3339b7e01fe4bf9aaa640ab3f9 GIT binary patch literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^)j-_A!3-on$fx`QQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;K%rCEz$?37cl=2%4@jobJ>Kq$uqQ+ z<6&6n*QepTQ~!C_X02Mqdv>pQaY$(OoSotCyIq&=taq<@cW$+=^r_okI_(>GUjF)d zIm`2pCpXtT6AOKN;hbeH^ZnxMmtR?~T2-63>$9Rg_lB3YcT2a-d0T$hcW(aUXKt&1 zFZ=zWHoP?U&g;_X=k{f*SN&5zw06}i?;W9`wUTeP4D%QncKKKn2EnN36Y zlb1*5{`&cRUG-V!9VhO^ZnMu<$zNV_+SqjA8=Y&VX??lPLMOuW@2p<__ELiUs{YKq zvt`aEaIewK|F*Y0{k7eeJ8zzFURhf;J@ixb_aLYH1=FXl+hv_vXff&D%x0NeC-=>^ zdS7~0JNmQN*}Dbu_sT!lKA)WR%Es6BTIJ7uxAhmaoh UiT9gV2uzj?p00i_>zopr0F + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CheckboxEx Member List
+
+
+ +

This is the complete list of members for CheckboxEx, including all inherited members.

+ + + +
checkbox_command() (defined in CheckboxEx)CheckboxExprivateslot
CheckboxEx(QWidget *parent=0) (defined in CheckboxEx)CheckboxEx
+ + + + diff --git a/docs/html/class_checkbox_ex.html b/docs/html/class_checkbox_ex.html new file mode 100644 index 000000000..28bf13f1e --- /dev/null +++ b/docs/html/class_checkbox_ex.html @@ -0,0 +1,103 @@ + + + + + + + +Olive: CheckboxEx Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CheckboxEx Class Reference
+
+
+
+Inheritance diagram for CheckboxEx:
+
+
+ +
+ + + + +

+Public Member Functions

CheckboxEx (QWidget *parent=0)
 
+ + + +

+Private Slots

+void checkbox_command ()
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_checkbox_ex.png b/docs/html/class_checkbox_ex.png new file mode 100644 index 0000000000000000000000000000000000000000..e2776e50bf71b7151b5af118b2948df34a2cec09 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^ARNHK3?%njU0MXBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J8MJY5_^Dj46+z1??Mfybpk-s=DVt`idpx(8tt8cFAeew0$NSZJju2igJI=F43~nIi?Y7rY;G$Ou5-|T(&4j zwe`NkJl0+2Z#9-pHJSFy$$eUaM?t^L^}m + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ClickableLabel Member List
+
+
+ +

This is the complete list of members for ClickableLabel, including all inherited members.

+ + + + + +
ClickableLabel(QWidget *parent=0, Qt::WindowFlags f=0) (defined in ClickableLabel)ClickableLabel
ClickableLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0) (defined in ClickableLabel)ClickableLabel
clicked() (defined in ClickableLabel)ClickableLabelsignal
mousePressEvent(QMouseEvent *ev) (defined in ClickableLabel)ClickableLabel
+ + + + diff --git a/docs/html/class_clickable_label.html b/docs/html/class_clickable_label.html new file mode 100644 index 000000000..1fb04e306 --- /dev/null +++ b/docs/html/class_clickable_label.html @@ -0,0 +1,109 @@ + + + + + + + +Olive: ClickableLabel Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ClickableLabel Class Reference
+
+
+
+Inheritance diagram for ClickableLabel:
+
+
+ +
+ + + + +

+Signals

+void clicked ()
 
+ + + + + + + +

+Public Member Functions

ClickableLabel (QWidget *parent=0, Qt::WindowFlags f=0)
 
ClickableLabel (const QString &text, QWidget *parent=0, Qt::WindowFlags f=0)
 
+void mousePressEvent (QMouseEvent *ev)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_clickable_label.png b/docs/html/class_clickable_label.png new file mode 100644 index 0000000000000000000000000000000000000000..23158f3d24d97f9380677b872215140b927a7fed GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^@jx8F!3-oljzkIpDTx4|5ZC|z{{xvX-h3_XKQsZz z0^Qc_5QcTF+tBuqW5q7k9o7u&iSIs z%dXjfKNtMnUUemCN}uL__h0Ul>fC;*o>c!k>B(ot{WBwF7|LfbFmZnK4}QaR@L#0- zE{84u&wuy-#TYlCj$!^6<{wMs52*iTuzSh=!PCCs{Ql3gflg#>nFy5R|8+W7-}vmL zyN{wDq^w{3N{z`oR#((emHnabZIr~n1{Y$&&Kly(q#@NYhI=(!1*Xf`CHckJ$ zQBTJC*S7k-zmCPLA1j$&{rvqaa*2iv`w{uVByZL`7o4x(Q k@4x`Ho&8T*T44?2;VqWNQ=)>e0|T4E)78&qol`;+0M16)XaE2J literal 0 HcmV?d00001 diff --git a/docs/html/class_clip-members.html b/docs/html/class_clip-members.html new file mode 100644 index 000000000..eaff25ebe --- /dev/null +++ b/docs/html/class_clip-members.html @@ -0,0 +1,161 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Clip Member List
+
+
+ +

This is the complete list of members for Clip, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
audio_buffer_write (defined in Clip)Clip
audio_just_reset (defined in Clip)Clip
audio_reset (defined in Clip)Clip
audio_target_frame (defined in Clip)Clip
autoscale (defined in Clip)Clip
buffersink_ctx (defined in Clip)Clip
buffersrc_ctx (defined in Clip)Clip
cached_fr (defined in Clip)Clip
cacher (defined in Clip)Clip
calculated_length (defined in Clip)Clip
can_cache (defined in Clip)Clip
Clip(Sequence *s) (defined in Clip)Clip
clip_in (defined in Clip)Clip
closing_transition (defined in Clip)Clip
codec (defined in Clip)Clip
codecCtx (defined in Clip)Clip
color_b (defined in Clip)Clip
color_g (defined in Clip)Clip
color_r (defined in Clip)Clip
copy(Sequence *s, bool duplicate_transitions=true) (defined in Clip)Clip
effects (defined in Clip)Clip
enabled (defined in Clip)Clip
fbo (defined in Clip)Clip
filter_graph (defined in Clip)Clip
finished_opening (defined in Clip)Clip
formatCtx (defined in Clip)Clip
frame (defined in Clip)Clip
frame_sample_index (defined in Clip)Clip
get_clip_in_with_transition() (defined in Clip)Clip
get_closing_transition() (defined in Clip)Clip
get_markers() (defined in Clip)Clip
get_opening_transition() (defined in Clip)Clip
get_timeline_in_with_transition() (defined in Clip)Clip
get_timeline_out_with_transition() (defined in Clip)Clip
getHeight() (defined in Clip)Clip
getLength() (defined in Clip)Clip
getMaximumLength() (defined in Clip)Clip
getMediaFrameRate() (defined in Clip)Clip
getWidth() (defined in Clip)Clip
ignore_reverse (defined in Clip)Clip
last_invalid_ts (defined in Clip)Clip
linked (defined in Clip)Clip
load_id (defined in Clip)Clip
lock (defined in Clip)Clip
maintain_audio_pitch (defined in Clip)Clip
markers (defined in Clip)Clipprivate
max_queue_size (defined in Clip)Clip
media (defined in Clip)Clip
media_stream (defined in Clip)Clip
multithreaded (defined in Clip)Clip
name (defined in Clip)Clip
open (defined in Clip)Clip
open_lock (defined in Clip)Clip
opening_transition (defined in Clip)Clip
opts (defined in Clip)Clip
pix_fmt (defined in Clip)Clip
pkt (defined in Clip)Clip
pkt_written (defined in Clip)Clip
queue (defined in Clip)Clip
queue_clear() (defined in Clip)Clip
queue_lock (defined in Clip)Clip
queue_remove_earliest() (defined in Clip)Clip
reached_end (defined in Clip)Clip
recalculateMaxLength() (defined in Clip)Clip
refactor_frame_rate(ComboAction *ca, double multiplier, bool change_timeline_points) (defined in Clip)Clip
refresh() (defined in Clip)Clip
replaced (defined in Clip)Clip
reset() (defined in Clip)Clip
reset_audio() (defined in Clip)Clip
reverse (defined in Clip)Clip
reverse_target (defined in Clip)Clip
sequence (defined in Clip)Clip
speed (defined in Clip)Clip
stream (defined in Clip)Clip
texture (defined in Clip)Clip
texture_frame (defined in Clip)Clip
timeline_in (defined in Clip)Clip
timeline_out (defined in Clip)Clip
track (defined in Clip)Clip
undeletable (defined in Clip)Clip
use_existing_frame (defined in Clip)Clip
~Clip() (defined in Clip)Clip
+ + + + diff --git a/docs/html/class_clip.html b/docs/html/class_clip.html new file mode 100644 index 000000000..aabe97ef1 --- /dev/null +++ b/docs/html/class_clip.html @@ -0,0 +1,338 @@ + + + + + + + +Olive: Clip Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Clip (Sequence *s)
 
+Clipcopy (Sequence *s, bool duplicate_transitions=true)
 
+void reset_audio ()
 
+void reset ()
 
+void refresh ()
 
+long get_clip_in_with_transition ()
 
+long get_timeline_in_with_transition ()
 
+long get_timeline_out_with_transition ()
 
+long getLength ()
 
+double getMediaFrameRate ()
 
+long getMaximumLength ()
 
+void recalculateMaxLength ()
 
+int getWidth ()
 
+int getHeight ()
 
+void refactor_frame_rate (ComboAction *ca, double multiplier, bool change_timeline_points)
 
+void queue_clear ()
 
+void queue_remove_earliest ()
 
+QVector< Marker > & get_markers ()
 
+Transitionget_opening_transition ()
 
+Transitionget_closing_transition ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+Sequencesequence
 
+bool enabled
 
+long clip_in
 
+long timeline_in
 
+long timeline_out
 
+int track
 
+QString name
 
+quint8 color_r
 
+quint8 color_g
 
+quint8 color_b
 
+Mediamedia
 
+int media_stream
 
+double speed
 
+double cached_fr
 
+bool reverse
 
+bool maintain_audio_pitch
 
+bool autoscale
 
+QList< Effect * > effects
 
+QVector< int > linked
 
+int opening_transition
 
+int closing_transition
 
+AVFormatContext * formatCtx
 
+AVStream * stream
 
+AVCodec * codec
 
+AVCodecContext * codecCtx
 
+AVPacket * pkt
 
+AVFrame * frame
 
+AVDictionary * opts
 
+long calculated_length
 
+int load_id
 
+bool undeletable
 
+bool reached_end
 
+bool pkt_written
 
+bool open
 
+bool finished_opening
 
+bool replaced
 
+bool ignore_reverse
 
+int pix_fmt
 
+bool use_existing_frame
 
+bool multithreaded
 
+Cachercacher
 
+QWaitCondition can_cache
 
+int max_queue_size
 
+QVector< AVFrame * > queue
 
+QMutex queue_lock
 
+QMutex lock
 
+QMutex open_lock
 
+int64_t last_invalid_ts
 
+AVFilterGraph * filter_graph
 
+AVFilterContext * buffersink_ctx
 
+AVFilterContext * buffersrc_ctx
 
+QOpenGLFramebufferObject ** fbo
 
+QOpenGLTexture * texture
 
+long texture_frame
 
+int64_t reverse_target
 
+int frame_sample_index
 
+qint64 audio_buffer_write
 
+bool audio_reset
 
+bool audio_just_reset
 
+long audio_target_frame
 
+ + + +

+Private Attributes

+QVector< Markermarkers
 
+
The documentation for this class was generated from the following files:
    +
  • project/clip.h
  • +
  • project/clip.cpp
  • +
+
+ + + + diff --git a/docs/html/class_close_all_clips_command-members.html b/docs/html/class_close_all_clips_command-members.html new file mode 100644 index 000000000..00d1902e8 --- /dev/null +++ b/docs/html/class_close_all_clips_command-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CloseAllClipsCommand Member List
+
+
+ +

This is the complete list of members for CloseAllClipsCommand, including all inherited members.

+ + + + + + + +
doRedo() override (defined in CloseAllClipsCommand)CloseAllClipsCommandvirtual
doUndo() override (defined in CloseAllClipsCommand)CloseAllClipsCommandvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_close_all_clips_command.html b/docs/html/class_close_all_clips_command.html new file mode 100644 index 000000000..6d141149d --- /dev/null +++ b/docs/html/class_close_all_clips_command.html @@ -0,0 +1,112 @@ + + + + + + + +Olive: CloseAllClipsCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CloseAllClipsCommand Class Reference
+
+
+
+Inheritance diagram for CloseAllClipsCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_close_all_clips_command.png b/docs/html/class_close_all_clips_command.png new file mode 100644 index 0000000000000000000000000000000000000000..4eac3cd5dd3aa7e169d0e5da6e930963141bcc6a GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^eL&p7!3-qXs+84%lth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C$4Nn)xkP61Pb6@wpGT>o5zV68PfB7{F zt}p5JPE7RQ@=41%SZ4Cc(*H?m*Z60se06%|5#$2IM^>IoUfqBGYcjX#EYC}(hn}Td ztvqqj+jkSl|G9Vb*>7qA^VU47ijtZcGR@Fn`JVbsDlfNt%6fKrK=BLz<7d`LGuR#E zT_FGK($2fPKE3pQo_Be&f4WuWCWfRSb_JzU1|V5U6pNh`i*_?Uf^8@!~n$e}lz8^m> zw&(i#SARo}-`VSU_t~#Ywa&|P!nPHb*B`oV_4$>}xAL!l&ReCHL{C}&Iz&BtZFu|@ zw)kt7cdUb8oLr^^dnIpFOX} z>hj6StOAp*7z9@`3rr+H)rSBBNZz0!&O^4L;|gPkM#-_>zdzU(92MDF-#2ybPs8Ls z#+a16eJ_1#=e#)M`&=#k>~x6(uHUR~tN1RS&1T8}bw#k5y!XV7ojSrh_!iE%^|JP) z)#aOF3ukmSwe>khc1`r%>#LTX$}93yyoAB}(yY0$ZcCZNrYGBrmpoe;|1D>0`E9G+ zN4rXw-LDEvH=prW$gJd6H*1-Oe_Hx}|LB$N=T>jcKW1<%Rowo?l<$6zQ{I-os$Omt zd3*2X=zCckpRIeYYWIp^&*|msz5!i-;{OY*(U literal 0 HcmV?d00001 diff --git a/docs/html/class_collapsible_widget-members.html b/docs/html/class_collapsible_widget-members.html new file mode 100644 index 000000000..188f3964f --- /dev/null +++ b/docs/html/class_collapsible_widget-members.html @@ -0,0 +1,99 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CollapsibleWidget Member List
+
+
+ +

This is the complete list of members for CollapsibleWidget, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
collapse_button (defined in CollapsibleWidget)CollapsibleWidgetprivate
CollapsibleWidget(QWidget *parent=0) (defined in CollapsibleWidget)CollapsibleWidget
contents (defined in CollapsibleWidget)CollapsibleWidget
deselect_others(QWidget *) (defined in CollapsibleWidget)CollapsibleWidgetsignal
enabled_check (defined in CollapsibleWidget)CollapsibleWidget
header (defined in CollapsibleWidget)CollapsibleWidgetprivate
header_click(bool s, bool deselect) (defined in CollapsibleWidget)CollapsibleWidgetslot
is_expanded() (defined in CollapsibleWidget)CollapsibleWidget
is_focused() (defined in CollapsibleWidget)CollapsibleWidget
layout (defined in CollapsibleWidget)CollapsibleWidgetprivate
line (defined in CollapsibleWidget)CollapsibleWidgetprivate
on_enabled_change(bool b) (defined in CollapsibleWidget)CollapsibleWidgetprivateslot
on_visible_change() (defined in CollapsibleWidget)CollapsibleWidgetprivateslot
selected (defined in CollapsibleWidget)CollapsibleWidget
set_button_icon(bool open) (defined in CollapsibleWidget)CollapsibleWidgetprivate
setContents(QWidget *c) (defined in CollapsibleWidget)CollapsibleWidget
setText(const QString &) (defined in CollapsibleWidget)CollapsibleWidget
title_bar (defined in CollapsibleWidget)CollapsibleWidget
title_bar_layout (defined in CollapsibleWidget)CollapsibleWidgetprivate
visibleChanged() (defined in CollapsibleWidget)CollapsibleWidgetsignal
+ + + + diff --git a/docs/html/class_collapsible_widget.html b/docs/html/class_collapsible_widget.html new file mode 100644 index 000000000..589d670c1 --- /dev/null +++ b/docs/html/class_collapsible_widget.html @@ -0,0 +1,177 @@ + + + + + + + +Olive: CollapsibleWidget Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for CollapsibleWidget:
+
+
+ +
+ + + + +

+Public Slots

+void header_click (bool s, bool deselect)
 
+ + + + + +

+Signals

+void deselect_others (QWidget *)
 
+void visibleChanged ()
 
+ + + + + + + + + + + +

+Public Member Functions

CollapsibleWidget (QWidget *parent=0)
 
+void setContents (QWidget *c)
 
+void setText (const QString &)
 
+bool is_focused ()
 
+bool is_expanded ()
 
+ + + + + + + + + +

+Public Attributes

+CheckboxExenabled_check
 
+bool selected
 
+QWidget * contents
 
+CollapsibleWidgetHeadertitle_bar
 
+ + + + + +

+Private Slots

+void on_enabled_change (bool b)
 
+void on_visible_change ()
 
+ + + +

+Private Member Functions

+void set_button_icon (bool open)
 
+ + + + + + + + + + + +

+Private Attributes

+QLabel * header
 
+QVBoxLayout * layout
 
+QPushButton * collapse_button
 
+QFrame * line
 
+QHBoxLayout * title_bar_layout
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_collapsible_widget.png b/docs/html/class_collapsible_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..35cfa0a712f7f6fe7003770a6d21e5cdb670c841 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^1wb6Y!3-q7O=9#1QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;7VID!w(;FsExs&RADa-TL_0WVJTzQ5bLBZ;c(Z|dTELKOiGCrP` zIrZB0rJ^6^l}mh241GAyJA9jp>DA{;c20Qw{lFiU2}_(ySA6)JHb0)*bC+*CqlvM! zMnnG>28opy4;)W6C^Y$SQrcUF?+?>-KLv+)Uj>J7?D)XCGiThmm?f5TvbxP$|(hVT!kR`uOij>GO-3t%cij4;#te z4ri{tn_bEv`6FI3przWytdePlN%`y(!ui^VLfhim*wickYb9*CC3vBDPX0@=fUWDc zoOR6PonH5i&-=me@)y516uqpH-MvNSx?ZoO-#nA~^WCg(f3!=e6XIdWdpmEwdc*B6 fq7KHJ8-Fp@uW+{LU3SV27*!0Ou6{1-oD!M + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CollapsibleWidgetHeader Member List
+
+
+ +

This is the complete list of members for CollapsibleWidgetHeader, including all inherited members.

+ + + + + + +
CollapsibleWidgetHeader(QWidget *parent=0) (defined in CollapsibleWidgetHeader)CollapsibleWidgetHeader
mousePressEvent(QMouseEvent *event) (defined in CollapsibleWidgetHeader)CollapsibleWidgetHeaderprotected
paintEvent(QPaintEvent *event) (defined in CollapsibleWidgetHeader)CollapsibleWidgetHeaderprotected
select(bool, bool) (defined in CollapsibleWidgetHeader)CollapsibleWidgetHeadersignal
selected (defined in CollapsibleWidgetHeader)CollapsibleWidgetHeader
+ + + + diff --git a/docs/html/class_collapsible_widget_header.html b/docs/html/class_collapsible_widget_header.html new file mode 100644 index 000000000..2d45e3e3e --- /dev/null +++ b/docs/html/class_collapsible_widget_header.html @@ -0,0 +1,120 @@ + + + + + + + +Olive: CollapsibleWidgetHeader Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CollapsibleWidgetHeader Class Reference
+
+
+
+Inheritance diagram for CollapsibleWidgetHeader:
+
+
+ +
+ + + + +

+Signals

+void select (bool, bool)
 
+ + + +

+Public Member Functions

CollapsibleWidgetHeader (QWidget *parent=0)
 
+ + + +

+Public Attributes

+bool selected
 
+ + + + + +

+Protected Member Functions

+void mousePressEvent (QMouseEvent *event)
 
+void paintEvent (QPaintEvent *event)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_collapsible_widget_header.png b/docs/html/class_collapsible_widget_header.png new file mode 100644 index 0000000000000000000000000000000000000000..ea4678453dc15259b9c46f1edb93b321b43e9201 GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^vw%2&gBeI(3!3vCNJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~zVLK$45?szJNItUY6Bj&aPyz{{`W>3 zJg`5pQh~>AZQGj}4HLx^Z*HG4vzJrNQ&}i$(i7DyDko1@Ze7{-%xrVZE2VkTkG4du z4(<8BA<8dc^49kuVP{J$mxfQWi3yLM)3te(rrj15%O4$4R#JzTO;nK&zp`y(|J9(i zHWRk0OzD205$hkCvHaVYnCNR;^|Gr)t)jgq^-GsGuWrl_T75mi^HXv7H9x)0`|GNw zFNx+f_55VCZPv`26Bugx#1G8qS^cew_qEx&Tib80$YWmZ+RF5U)09DfA=?AhD-3&D zq#C9NFnb29u>wi*kEE&bX2XLFZYoffPPuwrkB&_&**DqRC!PE5-ftW4 zZm<^LeCtkFv+VQFb8lUYcz(5OLGh<)9&nj={{wC(JqeGVueJDjfPGMQT*mXmTU$5G-#T}V`R2_bR;w-)7q1Q7ZFIfw z`qp($&mY&eZtJUUU01)0%Qq>swW_T7v-Ppoz0dr%R`IeG6lPyrHJAUu(f=FwGWWOu i{VW-M_Dqh)K8DT-v3>84KJWmh0|rl5KbLh*2~7aj-XQ+~ literal 0 HcmV?d00001 diff --git a/docs/html/class_color_button-members.html b/docs/html/class_color_button-members.html new file mode 100644 index 000000000..1bee88432 --- /dev/null +++ b/docs/html/class_color_button-members.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ColorButton Member List
+
+
+ +

This is the complete list of members for ColorButton, including all inherited members.

+ + + + + + + + + + +
color (defined in ColorButton)ColorButtonprivate
color_changed() (defined in ColorButton)ColorButtonsignal
ColorButton(QWidget *parent=0) (defined in ColorButton)ColorButton
get_color() (defined in ColorButton)ColorButton
getPreviousValue() (defined in ColorButton)ColorButton
open_dialog() (defined in ColorButton)ColorButtonprivateslot
previousColor (defined in ColorButton)ColorButtonprivate
set_button_color() (defined in ColorButton)ColorButtonprivate
set_color(QColor c) (defined in ColorButton)ColorButton
+ + + + diff --git a/docs/html/class_color_button.html b/docs/html/class_color_button.html new file mode 100644 index 000000000..2837b001e --- /dev/null +++ b/docs/html/class_color_button.html @@ -0,0 +1,136 @@ + + + + + + + +Olive: ColorButton Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ColorButton:
+
+
+ +
+ + + + +

+Signals

+void color_changed ()
 
+ + + + + + + + + +

+Public Member Functions

ColorButton (QWidget *parent=0)
 
+QColor get_color ()
 
+void set_color (QColor c)
 
+const QColor & getPreviousValue ()
 
+ + + +

+Private Slots

+void open_dialog ()
 
+ + + +

+Private Member Functions

+void set_button_color ()
 
+ + + + + +

+Private Attributes

+QColor color
 
+QColor previousColor
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_color_button.png b/docs/html/class_color_button.png new file mode 100644 index 0000000000000000000000000000000000000000..dced9dea83cf5991918423c6667871e97b4113c4 GIT binary patch literal 421 zcmV;W0b2fvP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003rNklP&@ycIp!0D)DDs8e-FG>`y4gv0rqq&Sv=qa?76DKKIJVwT)D6sjYW%Qf-#p z@CZ{?^{5^%k9ex}LCvjM)%oNn>NEpGt4!6*Eoz-tJu7uPc0h)@$$ADXHKmlCBGgci zsU+zg0I(Ss0Jz5y^}0^5N7NU3fIXxBsTl}0)KEhWHPlf5txA&a0Rn(?g!&D&ygro! zAfNhjb@s8KK`l$!&+3xhQq`&yRic)cZ|iDJwYj`+)jz{l8+i-)tkgPW`(~_sS5 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ColorCommand Member List
+
+
+ +

This is the complete list of members for ColorCommand, including all inherited members.

+ + + + + + + +
ColorCommand(ColorButton *s, QColor o, QColor n) (defined in ColorCommand)ColorCommand
new_color (defined in ColorCommand)ColorCommandprivate
old_color (defined in ColorCommand)ColorCommandprivate
redo() (defined in ColorCommand)ColorCommand
sender (defined in ColorCommand)ColorCommandprivate
undo() (defined in ColorCommand)ColorCommand
+ + + + diff --git a/docs/html/class_color_command.html b/docs/html/class_color_command.html new file mode 100644 index 000000000..99a5083a2 --- /dev/null +++ b/docs/html/class_color_command.html @@ -0,0 +1,115 @@ + + + + + + + +Olive: ColorCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ColorCommand Class Reference
+
+
+
+Inheritance diagram for ColorCommand:
+
+
+ +
+ + + + + + + + +

+Public Member Functions

ColorCommand (ColorButton *s, QColor o, QColor n)
 
+void undo ()
 
+void redo ()
 
+ + + + + + + +

+Private Attributes

+ColorButtonsender
 
+QColor old_color
 
+QColor new_color
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_color_command.png b/docs/html/class_color_command.png new file mode 100644 index 0000000000000000000000000000000000000000..29c91e771974afd718de4e701d9e812e494d7d94 GIT binary patch literal 488 zcmeAS@N?(olHy`uVBq!ia0vp^SwI}X!3-pi$qD2EDTx4|5ZC|z{{xvX-h3_XKQsZz z0^a!(h>kP61Pb1(M2R^V~zkGJ~&|M+bt z#>o>lZC?@hvg_1j3)wfqN}u~?M)nwZc3p7uywvoM?W@$JlJ(QKoqC=+Q{}H;YNd1N zq3SCKrY$SP zG$s8PsMLl_t9o+Z((sH5&^dKR$A#hlI(CPiM*;or654!URa`eR1^$1@k|%PY%Zw|* zQJQtbf?lSG3vP@$8H*XjwgfV8-&*m_*tlDeO<*BN;{L)*3oL{`T)fR-Tza=A_tb6q z=iAh!6P8&|Xeew_3zO6sW?Em7} zzkE}lt1(?QzPIpIM{i*A?E}Y8?svV~Y&_$@!rTYSk~>ppF0B?hupMl-Mg!~7MQ6@9 bePKR%!{%?^^IamqXkqYl^>bP0l+XkKtqa?U literal 0 HcmV?d00001 diff --git a/docs/html/class_combo_action-members.html b/docs/html/class_combo_action-members.html new file mode 100644 index 000000000..490e37cf6 --- /dev/null +++ b/docs/html/class_combo_action-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ComboAction Member List
+
+
+ +

This is the complete list of members for ComboAction, including all inherited members.

+ + + + + + + + + +
append(QUndoCommand *u) (defined in ComboAction)ComboAction
appendPost(QUndoCommand *u) (defined in ComboAction)ComboAction
ComboAction() (defined in ComboAction)ComboAction
commands (defined in ComboAction)ComboActionprivate
post_commands (defined in ComboAction)ComboActionprivate
redo() override (defined in ComboAction)ComboActionvirtual
undo() override (defined in ComboAction)ComboActionvirtual
~ComboAction() override (defined in ComboAction)ComboActionvirtual
+ + + + diff --git a/docs/html/class_combo_action.html b/docs/html/class_combo_action.html new file mode 100644 index 000000000..2dffe3df1 --- /dev/null +++ b/docs/html/class_combo_action.html @@ -0,0 +1,115 @@ + + + + + + + +Olive: ComboAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ComboAction Class Reference
+
+
+
+Inheritance diagram for ComboAction:
+
+
+ +
+ + + + + + + + + + +

+Public Member Functions

+virtual void undo () override
 
+virtual void redo () override
 
+void append (QUndoCommand *u)
 
+void appendPost (QUndoCommand *u)
 
+ + + + + +

+Private Attributes

+QVector< QUndoCommand * > commands
 
+QVector< QUndoCommand * > post_commands
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_combo_action.png b/docs/html/class_combo_action.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1d3686b89651761216e42984e1e57d99dfcf90 GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^SwI}X!3-pi$qD2EDTx4|5ZC|z{{xvX-h3_XKQsZz z0^T2B|pkP61Pb8oMEWx(SyJ$}aj|Brch zF6R~LYn|BFWR$BXw_eTS{fwDMIVLaR$ep5M`9=E5VvkF^ZL6-_&`+H7Wu8}syXm3q zD@mb~;$C*VT0iT|JLwa*PsC4flMOn4^rBU5VoCghqW#}*J=*Z!eVI?@+^N5d!u{if zy*BOCy{mpj;GM(MT{|6m+5eqivGnaCruLNP^o?3K@0@#gb?+st%c==J>1 zdtN=>vr{C{>ZkUpd8qx-K2Zi&T(t?RlXJ54wu-U{4z)DgRjT|@hyQ2e7PbG&Kot1 dHw*k_47zFaY)^n{958YiJYD@<);T3K0RVMg-Fg53 literal 0 HcmV?d00001 diff --git a/docs/html/class_combo_box_ex-members.html b/docs/html/class_combo_box_ex-members.html new file mode 100644 index 000000000..77f1edb95 --- /dev/null +++ b/docs/html/class_combo_box_ex-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ComboBoxEx Member List
+
+
+ +

This is the complete list of members for ComboBoxEx, including all inherited members.

+ + + + + + + + + +
ComboBoxEx(QWidget *parent=0) (defined in ComboBoxEx)ComboBoxEx
getPreviousIndex() (defined in ComboBoxEx)ComboBoxEx
index (defined in ComboBoxEx)ComboBoxExprivate
index_changed(int) (defined in ComboBoxEx)ComboBoxExprivateslot
previousIndex (defined in ComboBoxEx)ComboBoxExprivate
setCurrentIndexEx(int i) (defined in ComboBoxEx)ComboBoxEx
setCurrentTextEx(const QString &text) (defined in ComboBoxEx)ComboBoxEx
wheelEvent(QWheelEvent *e) (defined in ComboBoxEx)ComboBoxExprivate
+ + + + diff --git a/docs/html/class_combo_box_ex.html b/docs/html/class_combo_box_ex.html new file mode 100644 index 000000000..5d1585c8a --- /dev/null +++ b/docs/html/class_combo_box_ex.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: ComboBoxEx Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ComboBoxEx:
+
+
+ + +FontCombobox + +
+ + + + + + + + + + +

+Public Member Functions

ComboBoxEx (QWidget *parent=0)
 
+void setCurrentIndexEx (int i)
 
+void setCurrentTextEx (const QString &text)
 
+int getPreviousIndex ()
 
+ + + +

+Private Slots

+void index_changed (int)
 
+ + + +

+Private Member Functions

+void wheelEvent (QWheelEvent *e)
 
+ + + + + +

+Private Attributes

+int index
 
+int previousIndex
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_combo_box_ex.png b/docs/html/class_combo_box_ex.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3b3ca4818b153a273bbe7403e41f869803318a GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Pz!3-qz1Ld9qDTx4|5ZC|z{{xvX-h3_XKQsZz z0^OK^7b+Pv0_T3ZjOES=M~k?372h-*`JQO8IyZzt)w@~`?JT#;?u+lavuJX3iGW4=hhG!ke!HH1DSmp?u7c@b`y4{Q zHn%v0UR7mTwMy^4z>+DKTp02;GMq`-mJq2XoyINq`Mjx*_#gJ|8Y~QUiVOvuj1Ar# z3^7g&4}_Q)rVB9a_~Yd0rFpi6#h@R^sfpb%&)VU<;mZlBcI}E8Qr( zH(~YkqigntX>N|XQFm?G)|@vQ`vq>8oIk(B-fFJ0|JJgM2i&0!+NbEDxwMnv zP7>pclQ{=B`Iwy%vw1c@dxqW*{=7gAh8l!}TNn`QqsFGyyUCD%dSmq=d7~syT0~OP%3&LsVgKnao&8cQ$?2_N4~m!;#%<0r$@gr zuh|-X*)bt|+m=~(zKgt_R&*)r@h{^WzQ$^N3-zA<*l_*hy$AB*b8;_ET`>2CV?iz3 zJ;m+b7u&YJU-0!x(QC2Jjx!1%3l#+f3xBpLJfEZfiG9XTZ~KxYy98jGV(@hJb6Mw< G&;$SzY%mJ| literal 0 HcmV?d00001 diff --git a/docs/html/class_combo_box_ex_command-members.html b/docs/html/class_combo_box_ex_command-members.html new file mode 100644 index 000000000..f8b69237b --- /dev/null +++ b/docs/html/class_combo_box_ex_command-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ComboBoxExCommand Member List
+
+
+ +

This is the complete list of members for ComboBoxExCommand, including all inherited members.

+ + + + + + + + + +
combobox (defined in ComboBoxExCommand)ComboBoxExCommandprivate
ComboBoxExCommand(ComboBoxEx *obj, int old_index, int new_index) (defined in ComboBoxExCommand)ComboBoxExCommandinline
done (defined in ComboBoxExCommand)ComboBoxExCommandprivate
new_val (defined in ComboBoxExCommand)ComboBoxExCommandprivate
old_project_changed (defined in ComboBoxExCommand)ComboBoxExCommandprivate
old_val (defined in ComboBoxExCommand)ComboBoxExCommandprivate
redo() (defined in ComboBoxExCommand)ComboBoxExCommandinline
undo() (defined in ComboBoxExCommand)ComboBoxExCommandinline
+ + + + diff --git a/docs/html/class_combo_box_ex_command.html b/docs/html/class_combo_box_ex_command.html new file mode 100644 index 000000000..b57c09c3c --- /dev/null +++ b/docs/html/class_combo_box_ex_command.html @@ -0,0 +1,120 @@ + + + + + + + +Olive: ComboBoxExCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ComboBoxExCommand Class Reference
+
+
+
+Inheritance diagram for ComboBoxExCommand:
+
+
+ +
+ + + + + + + + +

+Public Member Functions

ComboBoxExCommand (ComboBoxEx *obj, int old_index, int new_index)
 
+void undo ()
 
+void redo ()
 
+ + + + + + + + + + + +

+Private Attributes

+ComboBoxExcombobox
 
+int old_val
 
+int new_val
 
+bool done
 
+bool old_project_changed
 
+
The documentation for this class was generated from the following file:
    +
  • ui/comboboxex.cpp
  • +
+
+ + + + diff --git a/docs/html/class_combo_box_ex_command.png b/docs/html/class_combo_box_ex_command.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1b491ab52f8680dc1175810dfd94ac1f70fe48 GIT binary patch literal 601 zcmeAS@N?(olHy`uVBq!ia0vp^y+9nm!3-pY71+{%lth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C`3r`ovkP61Pb8k<2tiZz>t#A4N|MA%p z21*>yje>VynYQZ1jM*;y3Fo!b(r!0+UQ%1qt8x^CV{Y2${rqTC|0}@2chbFN%fE-7 zP1&)H(@phdmwryx|GyWnZT@XG<*dde_tov&%X%%eYY(`4UpnG$w)9^1^98q$9#3+8 zvc~1&B$LlK@9D@j_ogIsE>_KacI#N`pGM!E&+NBbQ?JlpAJ5>s<@ zinpko-Sg+(m$mO+|1LjOJMEUr z`>uRX%wXQ*Klfg4U;2b6C)H+sy%Lwo6!9VF^5WC-Wjt5BJmYu2K7VnI?)*dYf9I_9 z&0^lVb=%5pyJb^8Oj=ZWU32eEtJ>p6!E5I*>pof9>;KO9i>+4lllQ*&_qi_9vrheY zD(%ddJ^yB#x&FJJd(TR9!^%B3W + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CornerPinEffect Member List
+
+
+ +

This is the complete list of members for CornerPinEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
bottom_left_gizmo (defined in CornerPinEffect)CornerPinEffectprivate
bottom_left_x (defined in CornerPinEffect)CornerPinEffectprivate
bottom_left_y (defined in CornerPinEffect)CornerPinEffectprivate
bottom_right_gizmo (defined in CornerPinEffect)CornerPinEffectprivate
bottom_right_x (defined in CornerPinEffect)CornerPinEffectprivate
bottom_right_y (defined in CornerPinEffect)CornerPinEffectprivate
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
CornerPinEffect(Clip *c, const EffectMeta *em) (defined in CornerPinEffect)CornerPinEffect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in CornerPinEffect)CornerPinEffectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
perspective (defined in CornerPinEffect)CornerPinEffectprivate
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in CornerPinEffect)CornerPinEffectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &coords, int iterations) (defined in CornerPinEffect)CornerPinEffectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
top_left_gizmo (defined in CornerPinEffect)CornerPinEffectprivate
top_left_x (defined in CornerPinEffect)CornerPinEffectprivate
top_left_y (defined in CornerPinEffect)CornerPinEffectprivate
top_right_gizmo (defined in CornerPinEffect)CornerPinEffectprivate
top_right_x (defined in CornerPinEffect)CornerPinEffectprivate
top_right_y (defined in CornerPinEffect)CornerPinEffectprivate
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_corner_pin_effect.html b/docs/html/class_corner_pin_effect.html new file mode 100644 index 000000000..0d645658e --- /dev/null +++ b/docs/html/class_corner_pin_effect.html @@ -0,0 +1,302 @@ + + + + + + + +Olive: CornerPinEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CornerPinEffect Class Reference
+
+
+
+Inheritance diagram for CornerPinEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CornerPinEffect (Clip *c, const EffectMeta *em)
 
+void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+void process_shader (double timecode, GLTextureCoords &coords, int iterations)
 
+void gizmo_draw (double timecode, GLTextureCoords &coords)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+EffectFieldtop_left_x
 
+EffectFieldtop_left_y
 
+EffectFieldtop_right_x
 
+EffectFieldtop_right_y
 
+EffectFieldbottom_left_x
 
+EffectFieldbottom_left_y
 
+EffectFieldbottom_right_x
 
+EffectFieldbottom_right_y
 
+EffectFieldperspective
 
+EffectGizmotop_left_gizmo
 
+EffectGizmotop_right_gizmo
 
+EffectGizmobottom_left_gizmo
 
+EffectGizmobottom_right_gizmo
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_corner_pin_effect.png b/docs/html/class_corner_pin_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..115b70f7d76f6ceb609cb8cc1215f09c4d3e4058 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^=|J4U!3-qN_Oi|aQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;pv`6#bA-DIj=G)dc(@i3{z@t_2ymK zC-zoi%c_6K|dlc&eE`yR)Br z)n@g1cc)zadcr^N+QMef^z*(Ayru6}@6H#$bMK_+dB + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Crc32 Member List
+
+
+ +

This is the complete list of members for Crc32, including all inherited members.

+ + + + + + + + +
calculateFromFile(QString filename) (defined in Crc32)Crc32
Crc32() (defined in Crc32)Crc32
crc_table (defined in Crc32)Crc32private
initInstance(int i) (defined in Crc32)Crc32
instances (defined in Crc32)Crc32private
pushData(int i, char *data, int len) (defined in Crc32)Crc32
releaseInstance(int i) (defined in Crc32)Crc32
+ + + + diff --git a/docs/html/class_crc32.html b/docs/html/class_crc32.html new file mode 100644 index 000000000..2775145a3 --- /dev/null +++ b/docs/html/class_crc32.html @@ -0,0 +1,109 @@ + + + + + + + +Olive: Crc32 Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + +

+Public Member Functions

+quint32 calculateFromFile (QString filename)
 
+void initInstance (int i)
 
+void pushData (int i, char *data, int len)
 
+quint32 releaseInstance (int i)
 
+ + + + + +

+Private Attributes

+quint32 crc_table [256]
 
+QMap< int, quint32 > instances
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_cross_dissolve_transition-members.html b/docs/html/class_cross_dissolve_transition-members.html new file mode 100644 index 000000000..daec4c886 --- /dev/null +++ b/docs/html/class_cross_dissolve_transition-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CrossDissolveTransition Member List
+
+
+ +

This is the complete list of members for CrossDissolveTransition, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c, Clip *s) (defined in Transition)Transition
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
CrossDissolveTransition(Clip *c, Clip *s, const EffectMeta *em) (defined in CrossDissolveTransition)CrossDissolveTransition
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_length() (defined in Transition)Transition
get_true_length() (defined in Transition)Transition
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &, int data) (defined in CrossDissolveTransition)CrossDissolveTransitionvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
secondary_clip (defined in Transition)Transition
set_enabled(bool b) (defined in Effect)Effect
set_length(long l) (defined in Transition)Transition
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_cross_dissolve_transition.html b/docs/html/class_cross_dissolve_transition.html new file mode 100644 index 000000000..cd543322d --- /dev/null +++ b/docs/html/class_cross_dissolve_transition.html @@ -0,0 +1,280 @@ + + + + + + + +Olive: CrossDissolveTransition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CrossDissolveTransition Class Reference
+
+
+
+Inheritance diagram for CrossDissolveTransition:
+
+
+ + +Transition +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CrossDissolveTransition (Clip *c, Clip *s, const EffectMeta *em)
 
+void process_coords (double timecode, GLTextureCoords &, int data)
 
- Public Member Functions inherited from Transition
Transition (Clip *c, Clip *s, const EffectMeta *em)
 
+int copy (Clip *c, Clip *s)
 
+void set_length (long l)
 
+long get_true_length ()
 
+long get_length ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Transition
+Clipsecondary_clip
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_cross_dissolve_transition.png b/docs/html/class_cross_dissolve_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d35e5495353aeac09bc36ccaa9a2d489d82bc6 GIT binary patch literal 963 zcmeAS@N?(olHy`uVBq!ia0vp^Q-JsY2Q!eo`ga#Qkdg@S332`Z|38rV;?396{zDUh zEHFNB-~emq9eE&^qa?^Lm;tB=1g@S6F=Aj~4)Szy45?szJNIqTW-A`H>;35${@(xS z`IDopAZqFdvsp5!dl+?+wrz6xALONZalwq4N0pYIIb*YA%FLPVlY`=QFU`-Lo_4L* z`1JhAw@lx~pP%;Ac%`lO+naMX&NMBLZ?AScduC6J`qr4W#eWZ;d1D?kV`bx&`272N z1rwsO{>ui%yMD0=zQ1Mh%$xi%*K6OeTlw|vmajLa?Fjs?yE!dw|ASZNzf@QMm0z+h z^3CLbinC|_wGKLU=8SX5${;UJwgav{3>P~zOnn*GDtX7nWQX#&vfhiakOYY#H)=-^b45?s1Wb3v%f z%Gtp-t0x5AtYxqx#;qWa%+~{&a&duIkWP>n#QYy?Ln7@anLHDVYEzl}#AR7s&4X;W z^&V3#6^qa1E&qJyZ&IHvi|WbKl`BgprUEYVE?keSAUc-#(kJT>5PL z^L4ksrmZ|&+mjowCdF=w>d>sdw2QC}Ry~%sBY)GHB@(Azm&A9jMncmOR_UF0pyb(Lcfs z?sDnd?U*ErxOJHqq)-3#ta08Cg-?&=Y<54?+j`%?KR5E`{^`=!?AP_Ld-!&puH)_R zwL5QT?!NcU=~c7;l5bzRw5A00()Cf_o?xBk-gE0cek+1%RqZzrqV zvEY@zt5;>N%$t4d$A;hEF4m)0QW|9LM14 L>gTe~DWM4fNSnsu literal 0 HcmV?d00001 diff --git a/docs/html/class_cube_transition-members.html b/docs/html/class_cube_transition-members.html new file mode 100644 index 000000000..3276fc8a2 --- /dev/null +++ b/docs/html/class_cube_transition-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
CubeTransition Member List
+
+
+ +

This is the complete list of members for CubeTransition, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c, Clip *s) (defined in Transition)Transition
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
CubeTransition(Clip *c, Clip *s, const EffectMeta *em) (defined in CubeTransition)CubeTransition
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_length() (defined in Transition)Transition
get_true_length() (defined in Transition)Transition
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &, int data) (defined in CubeTransition)CubeTransitionvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
secondary_clip (defined in Transition)Transition
set_enabled(bool b) (defined in Effect)Effect
set_length(long l) (defined in Transition)Transition
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_cube_transition.html b/docs/html/class_cube_transition.html new file mode 100644 index 000000000..3a246d6b0 --- /dev/null +++ b/docs/html/class_cube_transition.html @@ -0,0 +1,280 @@ + + + + + + + +Olive: CubeTransition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
CubeTransition Class Reference
+
+
+
+Inheritance diagram for CubeTransition:
+
+
+ + +Transition +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

CubeTransition (Clip *c, Clip *s, const EffectMeta *em)
 
+void process_coords (double timecode, GLTextureCoords &, int data)
 
- Public Member Functions inherited from Transition
Transition (Clip *c, Clip *s, const EffectMeta *em)
 
+int copy (Clip *c, Clip *s)
 
+void set_length (long l)
 
+long get_true_length ()
 
+long get_length ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Transition
+Clipsecondary_clip
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_cube_transition.png b/docs/html/class_cube_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..b41989634564b34f3154472e2a9eb8c4ecfc9429 GIT binary patch literal 796 zcmeAS@N?(olHy`uVBq!ia0vp^i9mdSgBeIF&-i-_NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~t@d=80T?z4gnr;u-gwmL^S`(3h1dwRY<@S^a&N#p}LA^M=<={(o=lwO1b%*^D=P zFz6XFvkp4<@lO^qVkLEMYvL%*!B`$?(C0x#9SIlPN)7 z8X}%tD!h}PeAMPKt2@@s=^0(UXZn)9^%Aq{_TQK0{cbTW;@HBCv)8M>Y!OeIk!j^= z_4JUXj6~D9g@SI9zaCFqlK$sZ@r$g?|4kmRqWF49C`APDm5uViWKHO76RAFt6Hp<9hRk z + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DebugDialog Member List
+
+
+ +

This is the complete list of members for DebugDialog, including all inherited members.

+ + + + + +
DebugDialog(QWidget *parent=0) (defined in DebugDialog)DebugDialog
showEvent(QShowEvent *event) (defined in DebugDialog)DebugDialogprotected
textEdit (defined in DebugDialog)DebugDialogprivate
update_log() (defined in DebugDialog)DebugDialogslot
+ + + + diff --git a/docs/html/class_debug_dialog.html b/docs/html/class_debug_dialog.html new file mode 100644 index 000000000..1199852d7 --- /dev/null +++ b/docs/html/class_debug_dialog.html @@ -0,0 +1,117 @@ + + + + + + + +Olive: DebugDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for DebugDialog:
+
+
+ +
+ + + + +

+Public Slots

+void update_log ()
 
+ + + +

+Public Member Functions

DebugDialog (QWidget *parent=0)
 
+ + + +

+Protected Member Functions

+void showEvent (QShowEvent *event)
 
+ + + +

+Private Attributes

+QTextEdit * textEdit
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_debug_dialog.png b/docs/html/class_debug_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1cbb9a1efbcb3f91f7e6e8a52345e619686958 GIT binary patch literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^p+FqK!3-qhpPjr7q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgtvp>ELn;{G&OJM+MS-WqTKxCl`xS*h zx}_u|5?9|jwa~ZW+hk73a{_`h^*B8JrUn0>wo5*x&v2!;%FS!MTO0h2xL+|5cRCX! zv^{pSz?=M@0O3zFY?np-xw!Y*_fpn*L5CMFW>OAW%&vCD^zV)H(W~Mg-&tSXpki%0 z-zqA6(whJ+7Eie+<_}M=P*U2=$}sm9L&C0U0o!v~%Q#IP#1pOu#9w9hD_s>l_f^Pp ztFQNiTwRuNGcinldgbVqijpcu20yK3yRv?BeNEX}7$0V}Vt)D^zlaV+|91;#Y|&3Y znH)U1)O=Oo%oWMnzrFTyYwZk>uI^R;G&iay_KHbP0l+XkKPmi|Y literal 0 HcmV?d00001 diff --git a/docs/html/class_delete_clip_action-members.html b/docs/html/class_delete_clip_action-members.html new file mode 100644 index 000000000..a4c979452 --- /dev/null +++ b/docs/html/class_delete_clip_action-members.html @@ -0,0 +1,94 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DeleteClipAction Member List
+
+
+ +

This is the complete list of members for DeleteClipAction, including all inherited members.

+ + + + + + + + + + + + + + + + +
closing_transition (defined in DeleteClipAction)DeleteClipActionprivate
DeleteClipAction(Sequence *s, int clip) (defined in DeleteClipAction)DeleteClipAction
doRedo() override (defined in DeleteClipAction)DeleteClipActionvirtual
doUndo() override (defined in DeleteClipAction)DeleteClipActionvirtual
index (defined in DeleteClipAction)DeleteClipActionprivate
linkClipIndex (defined in DeleteClipAction)DeleteClipActionprivate
linkLinkIndex (defined in DeleteClipAction)DeleteClipActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
opening_transition (defined in DeleteClipAction)DeleteClipActionprivate
redo() override (defined in OliveAction)OliveActionvirtual
ref (defined in DeleteClipAction)DeleteClipActionprivate
seq (defined in DeleteClipAction)DeleteClipActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~DeleteClipAction() override (defined in DeleteClipAction)DeleteClipActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_delete_clip_action.html b/docs/html/class_delete_clip_action.html new file mode 100644 index 000000000..fe204c61c --- /dev/null +++ b/docs/html/class_delete_clip_action.html @@ -0,0 +1,140 @@ + + + + + + + +Olive: DeleteClipAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
DeleteClipAction Class Reference
+
+
+
+Inheritance diagram for DeleteClipAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

DeleteClipAction (Sequence *s, int clip)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + + + + + +

+Private Attributes

+Sequenceseq
 
+Clipref
 
+int index
 
+int opening_transition
 
+int closing_transition
 
+QVector< int > linkClipIndex
 
+QVector< int > linkLinkIndex
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_delete_clip_action.png b/docs/html/class_delete_clip_action.png new file mode 100644 index 0000000000000000000000000000000000000000..ed04a526800bf4dc635eaaf838ca6d7eab3b93b1 GIT binary patch literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0x2KC^NCo5Dxv%>c8}PXG_qN>s-#cAM zfwQG7;(bM!va(&$ho>ypznCj289JRgqclas*torp?W@$JQd>RKRa>_k7;j#m$-RC> z^9MQ853^?Oy(}3zeeVn%{eZZ|ZxZ&dp76Ksv_;RWjLr57x?Y#-($25LF zj=rlSd&=im@r+tW(}#Q^GiUR!*!Hl#S87@9j04LeCL4d4{1*WC(sh&D>W?{sX4v!9odD(0ofihY14o4KOXcaliC;)^oO5-g>w1n(bY+=T&3W`}pavV%`}3lJp8GU10ZY z-Q2nm>1)SUtSbAZl=b>XcG#}3(t&HYo1JQXrS@UNZuZ(z_E(=`O@+e)f7jYK`UkFB z^*^jLD6~`q$l^P?Xj$egCzcN}#tuD?0zS(e>vGmzq7kO>YPw&-A_f~Tkp^cht`FrG zoG78lAPADSZ`3lrWVJ4=Q>%ZM?7aN8+v`^ZpAy*0KG*B(+MU_K{ZZ?WAL|a)-|DeY zcW3prZSNN5&RiTG9+G?E#H)a-msk0(%+wQ6Q114dEnre(@O1TaS?83{1OOMpJCOhY literal 0 HcmV?d00001 diff --git a/docs/html/class_delete_marker_action-members.html b/docs/html/class_delete_marker_action-members.html new file mode 100644 index 000000000..139136abe --- /dev/null +++ b/docs/html/class_delete_marker_action-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DeleteMarkerAction Member List
+
+
+ +

This is the complete list of members for DeleteMarkerAction, including all inherited members.

+ + + + + + + + + + + + +
active_array (defined in DeleteMarkerAction)DeleteMarkerActionprivate
copies (defined in DeleteMarkerAction)DeleteMarkerActionprivate
DeleteMarkerAction(QVector< Marker > *m) (defined in DeleteMarkerAction)DeleteMarkerAction
doRedo() override (defined in DeleteMarkerAction)DeleteMarkerActionvirtual
doUndo() override (defined in DeleteMarkerAction)DeleteMarkerActionvirtual
markers (defined in DeleteMarkerAction)DeleteMarkerAction
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
sorted (defined in DeleteMarkerAction)DeleteMarkerActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_delete_marker_action.html b/docs/html/class_delete_marker_action.html new file mode 100644 index 000000000..91f73ae92 --- /dev/null +++ b/docs/html/class_delete_marker_action.html @@ -0,0 +1,135 @@ + + + + + + + +Olive: DeleteMarkerAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
DeleteMarkerAction Class Reference
+
+
+
+Inheritance diagram for DeleteMarkerAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

DeleteMarkerAction (QVector< Marker > *m)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + +

+Public Attributes

+QVector< int > markers
 
+ + + + + + + +

+Private Attributes

+QVector< Marker > * active_array
 
+QVector< Markercopies
 
+bool sorted
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_delete_marker_action.png b/docs/html/class_delete_marker_action.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb5946ba1f53834776e8404beb6327985f6313a GIT binary patch literal 748 zcmeAS@N?(olHy`uVBq!ia0vp^wLsj#!3-q-GK%a4QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;J3M9x7;jcky?aK-X@CDdk;lK*^_!VSq@|Vlwm)UA zYPDO&pLX_)+)Jj~*XP$)*UapXds>yoZ-XECO z9XoOROw8`GZQllKN{jreJb6xf6w-p&gRC&Z@td${-Jj!;hN8{ zvM*-F*ZuZ?pSJ7RXVdp}V(+?-oY`KQRJ=3hb6T4H(j~KJx@x>kOB3W;-reEC`GEN@ z!yyr`{dbia1g*?f<&hEcB}1-5V#RLa#2Icj^6;$r~>9?r+)WaR1R%=Un&bP@$lg+4YrM zPTs8BHrxE=qE*aav*+DEEdH`?X8ht+Rg1!3Mz5M4^yZ$u_xH`Zhwm>dH;sRrw}8EF zdfktEvAyQM_TIn#NBqUARsX#`!$W%mE`^3Fi}=l7mf0nAfPEKZi{_NN-L8+EUmDv8 z$b0|4Y&yTBK|obj!O4@oBj6IF(v*@04g~k!WKaw>D1b!vx5Rl}@ShXCo0tFlecp3( zC%cyaI+yC9pSJz9aMk?FoBw?K@-?z3VC}aTFQS);{ePR1x8&&Bdv-;4|4rPt@OT*S z9kUy4w>|7P^j~`SFt*A!#J7|E+uY|cWF(x;vN-1pAy*E#PmwKLzX(VOJm_Fv)H z!Fdow~$Cqu$M<7c_LlF*X+ YJv~W+X9L0|fk~6W)78&qol`;+09jOQ3IG5A literal 0 HcmV?d00001 diff --git a/docs/html/class_delete_media_command-members.html b/docs/html/class_delete_media_command-members.html new file mode 100644 index 000000000..2a33aefaf --- /dev/null +++ b/docs/html/class_delete_media_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DeleteMediaCommand Member List
+
+
+ +

This is the complete list of members for DeleteMediaCommand, including all inherited members.

+ + + + + + + + + + + + +
DeleteMediaCommand(Media *i) (defined in DeleteMediaCommand)DeleteMediaCommand
done (defined in DeleteMediaCommand)DeleteMediaCommandprivate
doRedo() override (defined in DeleteMediaCommand)DeleteMediaCommandvirtual
doUndo() override (defined in DeleteMediaCommand)DeleteMediaCommandvirtual
item (defined in DeleteMediaCommand)DeleteMediaCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
parent (defined in DeleteMediaCommand)DeleteMediaCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~DeleteMediaCommand() override (defined in DeleteMediaCommand)DeleteMediaCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_delete_media_command.html b/docs/html/class_delete_media_command.html new file mode 100644 index 000000000..94b584e6d --- /dev/null +++ b/docs/html/class_delete_media_command.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: DeleteMediaCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
DeleteMediaCommand Class Reference
+
+
+
+Inheritance diagram for DeleteMediaCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

DeleteMediaCommand (Media *i)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Mediaitem
 
+Mediaparent
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_delete_media_command.png b/docs/html/class_delete_media_command.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8f96f5eea05ca7b65418b48d575d23e17b47db GIT binary patch literal 814 zcmeAS@N?(olHy`uVBq!ia0vp^T|nHy!3-q%CpO0dDTx4|5ZC|z{{xvX-h3_XKQsZz z0^+$|Z>jDw!-!u9IvQDtXT1p8DK-ugvLqU)hq$ORDFT z*oSMfUDsld^xX9*bn4enH8<3}KQlc^J<)bLQg-j$^~zoW!f!J?i}oy<^jKSEGQ%jdhCCHJ%`Fxw#toqZ1nQ3XVcehTqOG^{K6MECc@0rKl zujV%IR$p(F=9vk+Yw$R#qQbUh<B{^J1E_PkZio3F?4g--il6Rx_de(tHN_dl~Q z@N2K$eD!_PtPC!h)oWP$mBVW@_Z6?5zIk;nr`ICQ54Kvp2PSeY+4pwY&WNdh?#*?5 z8n#XQEc34Ao8&9EYK2eSzxS?C-NH@r=P%2a{A}RU`ug5$WpRA!|8-N|H{N!vTvxUB z^iJ83>-!}qEy&G29+kdbi($VvB5F2<1bJn0{9~NxlXJR_--H#IxEVZM{an^LB{Ts5 DTWfBA literal 0 HcmV?d00001 diff --git a/docs/html/class_delete_transition_command-members.html b/docs/html/class_delete_transition_command-members.html new file mode 100644 index 000000000..616feda11 --- /dev/null +++ b/docs/html/class_delete_transition_command-members.html @@ -0,0 +1,92 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DeleteTransitionCommand Member List
+
+
+ +

This is the complete list of members for DeleteTransitionCommand, including all inherited members.

+ + + + + + + + + + + + + + +
ctc (defined in DeleteTransitionCommand)DeleteTransitionCommandprivate
DeleteTransitionCommand(Sequence *s, int transition_index) (defined in DeleteTransitionCommand)DeleteTransitionCommand
doRedo() override (defined in DeleteTransitionCommand)DeleteTransitionCommandvirtual
doUndo() override (defined in DeleteTransitionCommand)DeleteTransitionCommandvirtual
index (defined in DeleteTransitionCommand)DeleteTransitionCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
otc (defined in DeleteTransitionCommand)DeleteTransitionCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in DeleteTransitionCommand)DeleteTransitionCommandprivate
transition (defined in DeleteTransitionCommand)DeleteTransitionCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
~DeleteTransitionCommand() override (defined in DeleteTransitionCommand)DeleteTransitionCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_delete_transition_command.html b/docs/html/class_delete_transition_command.html new file mode 100644 index 000000000..09690e13e --- /dev/null +++ b/docs/html/class_delete_transition_command.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: DeleteTransitionCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
DeleteTransitionCommand Class Reference
+
+
+
+Inheritance diagram for DeleteTransitionCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

DeleteTransitionCommand (Sequence *s, int transition_index)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + +

+Private Attributes

+Sequenceseq
 
+int index
 
+Transitiontransition
 
+Clipotc
 
+Clipctc
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_delete_transition_command.png b/docs/html/class_delete_transition_command.png new file mode 100644 index 0000000000000000000000000000000000000000..94a3dfd293d8cc6e8e7897f61c48ed1a967b5cb7 GIT binary patch literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^^MJU6gBeIFURiV=NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~J@j;O45?szJNI?pY6Bj&<8H6M|I4q@ zcsNPqMbP%!!kMwD3P*PO2%pJ6bLJQ8c+#YrXSzP`U#W;Hut?#`>v3ty%L#V$Kw^Q3sDw&(xuE0dRKtW@_54Dz3} z=*#-_v}?Ky^PjL?(64=cH!t@0*R|%izP`D>GcHZfVa^rij!9JvfkFHVUauHkJZ&2^ zRN>A~727(wbZut+Y28KU`Vrew@6GAlv~=~oFE#sf4sQIn>fQ1$XYTT6{N7V{W&g_X z^3}h0?2dnuyZ5Kb`=6KYSYKYf__ktQ?D~^;w%#+@;ue4HcJ237K6k%Ndu~>|f8q0Y z|8#@S-?jC6wR5*S*bRSQ^By)R;Xa_glkto9{i^NJ*XwFu_mL%6VaoHv404fcws}1+S@J!A{YK%9hlP0! z@)lQSuX{Rw-PX53U!!Ip%ZjY2)DSj1_-el1+0TDor@dFRzB*goX4Trgs}>wg%xu0b zwR9&(&eXdp`7cf1-%8tXd3Eztxrpd*ljpvk`u)d>YcJLw{AqIkQnp(4y6b;tHnVCi zuhMGXwP(rp_w}=Oiu0G7FLsQ5m3aEX>#E=7`G3u9Q}QYk<&Dbu&Sgf)=gr=EwmZO7 r`bw((&BbyK^+<8|>$uL3uX4mRotomyJ%m56Yu6{1-oD!M + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
DemoNotice Member List
+
+
+ +

This is the complete list of members for DemoNotice, including all inherited members.

+ + +
DemoNotice(QWidget *parent=0) (defined in DemoNotice)DemoNoticeexplicit
+ + + + diff --git a/docs/html/class_demo_notice.html b/docs/html/class_demo_notice.html new file mode 100644 index 000000000..58247bf81 --- /dev/null +++ b/docs/html/class_demo_notice.html @@ -0,0 +1,96 @@ + + + + + + + +Olive: DemoNotice Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
DemoNotice Class Reference
+
+
+
+Inheritance diagram for DemoNotice:
+
+
+ +
+ + + + +

+Public Member Functions

DemoNotice (QWidget *parent=0)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_demo_notice.png b/docs/html/class_demo_notice.png new file mode 100644 index 0000000000000000000000000000000000000000..3301740b98fc041838711aec0194c6f98053fe1a GIT binary patch literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#JAMJzX3_Dj46+Jv*sIfrrgneE;|Q$E7Sk zBQK_^-8_6PDAil!g=dFp`k6CI2URrtRHvxOCqG;r{d`7~m8vH{PwUZ-zTZ|F?7!JA z@>D@JdU379i|4I3uer-T^!V%6R+=5X$$7_pHLrOhe7oLQAC9@Zap6zC%e(z|>3B|V z;ks|(>^VyzTyN#hYxk$C{QSYYaAu?eLvRkmL>KPux;G?r@6>KQR`5{%#U~*qi%2I1 zd2fyf$()QeI*JYbsw@)8X=0pg0>_1zerO!JqS#=Vxo+K!#ScGey}8a@vLya>3xjyo z!$SX=a>AZL^I!k@dGP6`tkUqrd*5#bEIA&)wBcD+Tl&M&^FMZqlxh3il~gZOUn47< zUJ-rOxovywK7GTjRlj(=uce2dKJ|I$f3CV$Mh+}M`ybbHojt?!lj-Oj{h)9EY-@nQ O%HZkh=d#Wzp$P!#j<^s2 literal 0 HcmV?d00001 diff --git a/docs/html/class_edit_sequence_command-members.html b/docs/html/class_edit_sequence_command-members.html new file mode 100644 index 000000000..aca726ef5 --- /dev/null +++ b/docs/html/class_edit_sequence_command-members.html @@ -0,0 +1,101 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EditSequenceCommand Member List
+
+
+ +

This is the complete list of members for EditSequenceCommand, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + +
audio_frequency (defined in EditSequenceCommand)EditSequenceCommand
audio_layout (defined in EditSequenceCommand)EditSequenceCommand
doRedo() override (defined in EditSequenceCommand)EditSequenceCommandvirtual
doUndo() override (defined in EditSequenceCommand)EditSequenceCommandvirtual
EditSequenceCommand(Media *i, Sequence *s) (defined in EditSequenceCommand)EditSequenceCommand
frame_rate (defined in EditSequenceCommand)EditSequenceCommand
height (defined in EditSequenceCommand)EditSequenceCommand
item (defined in EditSequenceCommand)EditSequenceCommandprivate
name (defined in EditSequenceCommand)EditSequenceCommand
old_audio_frequency (defined in EditSequenceCommand)EditSequenceCommandprivate
old_audio_layout (defined in EditSequenceCommand)EditSequenceCommandprivate
old_frame_rate (defined in EditSequenceCommand)EditSequenceCommandprivate
old_height (defined in EditSequenceCommand)EditSequenceCommandprivate
old_name (defined in EditSequenceCommand)EditSequenceCommandprivate
old_width (defined in EditSequenceCommand)EditSequenceCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in EditSequenceCommand)EditSequenceCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
update() (defined in EditSequenceCommand)EditSequenceCommand
width (defined in EditSequenceCommand)EditSequenceCommand
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_edit_sequence_command.html b/docs/html/class_edit_sequence_command.html new file mode 100644 index 000000000..edf38b06d --- /dev/null +++ b/docs/html/class_edit_sequence_command.html @@ -0,0 +1,168 @@ + + + + + + + +Olive: EditSequenceCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EditSequenceCommand Class Reference
+
+
+
+Inheritance diagram for EditSequenceCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

EditSequenceCommand (Media *i, Sequence *s)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
+void update ()
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + + + +

+Public Attributes

+QString name
 
+int width
 
+int height
 
+double frame_rate
 
+int audio_frequency
 
+int audio_layout
 
+ + + + + + + + + + + + + + + + + +

+Private Attributes

+Mediaitem
 
+Sequenceseq
 
+QString old_name
 
+int old_width
 
+int old_height
 
+double old_frame_rate
 
+int old_audio_frequency
 
+int old_audio_layout
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_edit_sequence_command.png b/docs/html/class_edit_sequence_command.png new file mode 100644 index 0000000000000000000000000000000000000000..aae9d3213a38fef6f08102cdb093acac617f87b6 GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^6M(pbgBeKL%TB5RQW60^A+G=b{|7Q(y!l$%e+Z-k zj1L?*z}k679?0b=3GxeO04f53tEWPY7#NstdAc};R4~4s`#SHnf&g3l)+z7*-v41? z_UzGVGr!q#A-P9cc-BZ7T-d*4$|a8pDw#4)9+PZ9xMtz=b@87*1<&@|<#{PPro6nh zt6jh3l9s33d(NlREN{2@d`?>9y{Ssi|10b5;y#VmTNm8CFHM~7l)ZDBSMug*=Rbx` z53=Z4n$GPUv{b#nzKsr19JU~7<9rUFA<3;O|& z9@BWAaW3&C;*$Z{86)<-8{NJoknTdeMSW^XA)cE!5ku z^CNd*N}BqY+Ps{T=Q z-IHoECt!{d!+Zgz4;+dN{RF5VyPY(bnh2>h6hakiI8}B(KQ(7sRKx8%{5r|uow3nn zRoR^PIrfM|gWx33yyDGeQ2t{5dl#XCyyyLN}p49 zQM}NtZ)xWB`M!M8pS)g_%-ny^d2PV%_P)ut_x@B72%68Qzi&tTsb$e_Z~6Q;8}DWg zoxd$dd`80bPm1d@VwED-tQDk`_`2Q^Zmt~DcmA?=4K-> + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Effect Member List
+
+
+ +

This is the complete list of members for Effect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
bound (defined in Effect)Effectprivate
cachedValues (defined in Effect)Effectprivate
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
delete_self() (defined in Effect)Effectprivateslot
delete_texture() (defined in Effect)Effectprivate
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_index_in_clip() (defined in Effect)Effectprivate
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
gizmos (defined in Effect)Effectprivate
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
isOpen (defined in Effect)Effectprivate
iterations (defined in Effect)Effectprivate
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_file() (defined in Effect)Effectprivateslot
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
move_down() (defined in Effect)Effectprivateslot
move_up() (defined in Effect)Effectprivateslot
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
redraw(double timecode) (defined in Effect)Effectprivatevirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
rows (defined in Effect)Effectprivate
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_file() (defined in Effect)Effectprivateslot
save_to_string() (defined in Effect)Effect
script (defined in Effect)Effectprivate
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
show_context_menu(const QPoint &) (defined in Effect)Effectprivateslot
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
ui (defined in Effect)Effectprivate
ui_layout (defined in Effect)Effectprivate
validate_meta_path() (defined in Effect)Effectprivate
valueHasChanged(double timecode) (defined in Effect)Effectprivate
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_effect.html b/docs/html/class_effect.html new file mode 100644 index 000000000..734905a08 --- /dev/null +++ b/docs/html/class_effect.html @@ -0,0 +1,347 @@ + + + + + + + +Olive: Effect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for Effect:
+
+
+ + +AudioNoiseEffect +CornerPinEffect +FillLeftRightEffect +Frei0rEffect +PanEffect +ShakeEffect +SolidEffect +TextEffect +TimecodeEffect +ToneEffect +TransformEffect +Transition +VoidEffect +VolumeEffect +VSTHost + +
+ + + + +

+Public Slots

+void field_changed ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + + + + + + + + + + + +

+Protected Attributes

+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+ + + + + + + + + + + + + +

+Private Slots

+void show_context_menu (const QPoint &)
 
+void delete_self ()
 
+void move_up ()
 
+void move_down ()
 
+void save_to_file ()
 
+void load_from_file ()
 
+ + + + + + + + + + + +

+Private Member Functions

+virtual void redraw (double timecode)
 
+bool valueHasChanged (double timecode)
 
+void delete_texture ()
 
+int get_index_in_clip ()
 
+void validate_meta_path ()
 
+ + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QString script
 
+bool isOpen
 
+QVector< EffectRow * > rows
 
+QVector< EffectGizmo * > gizmos
 
+QGridLayout * ui_layout
 
+QWidget * ui
 
+bool bound
 
+int iterations
 
+QVector< QVariant > cachedValues
 
+
The documentation for this class was generated from the following files:
    +
  • project/effect.h
  • +
  • project/effect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_effect.png b/docs/html/class_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0cc08be9e8ff053a141b38692acb15dde4751b GIT binary patch literal 4343 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 literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_controls-members.html b/docs/html/class_effect_controls-members.html new file mode 100644 index 000000000..f75efb2cc --- /dev/null +++ b/docs/html/class_effect_controls-members.html @@ -0,0 +1,129 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectControls Member List
+
+
+ +

This is the complete list of members for EffectControls, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
acontainer (defined in EffectControls)EffectControlsprivate
add_effect_paste_action(QMenu *menu) (defined in EffectControls)EffectControls
audio_effect_area (defined in EffectControls)EffectControlsprivate
audio_effect_click() (defined in EffectControls)EffectControlsprivateslot
audio_transition_click() (defined in EffectControls)EffectControlsprivateslot
clear_effects(bool clear_cache) (defined in EffectControls)EffectControls
copy(bool del=false) (defined in EffectControls)EffectControlsslot
cut() (defined in EffectControls)EffectControlsslot
delete_effects() (defined in EffectControls)EffectControls
delete_selected_keyframes() (defined in EffectControls)EffectControls
deselect_all_effects(QWidget *) (defined in EffectControls)EffectControlsprivateslot
effect_menu_subtype (defined in EffectControls)EffectControlsprivate
effect_menu_type (defined in EffectControls)EffectControlsprivate
EffectControls(QWidget *parent=0) (defined in EffectControls)EffectControlsexplicit
effects_area (defined in EffectControls)EffectControlsprivate
effects_area_context_menu() (defined in EffectControls)EffectControlsprivateslot
effects_loaded (defined in EffectControls)EffectControls
get_mode() (defined in EffectControls)EffectControls
headers (defined in EffectControls)EffectControlsprivate
horizontalScrollBar (defined in EffectControls)EffectControls
is_focused() (defined in EffectControls)EffectControls
keyframe_focus() (defined in EffectControls)EffectControls
keyframeView (defined in EffectControls)EffectControlsprivate
lblMultipleClipsSelected (defined in EffectControls)EffectControlsprivate
load_effects() (defined in EffectControls)EffectControlsprivate
load_keyframes() (defined in EffectControls)EffectControlsprivate
menu_select(QAction *q) (defined in EffectControls)EffectControlsprivateslot
mode (defined in EffectControls)EffectControlsprivate
multiple (defined in EffectControls)EffectControls
open_effect(QVBoxLayout *hlayout, Effect *e) (defined in EffectControls)EffectControlsprivate
panel_name (defined in EffectControls)EffectControlsprivate
queue_post_update() (defined in EffectControls)EffectControlsprivateslot
reload_clips() (defined in EffectControls)EffectControls
resizeEvent(QResizeEvent *event) (defined in EffectControls)EffectControlsprotected
scroll_to_frame(long frame) (defined in EffectControls)EffectControls
scrollArea (defined in EffectControls)EffectControlsprivate
selected_clips (defined in EffectControls)EffectControls
set_clips(QVector< int > &clips, int mode) (defined in EffectControls)EffectControls
set_zoom(bool in) (defined in EffectControls)EffectControls
setup_ui() (defined in EffectControls)EffectControlsprivate
show_effect_menu(int type, int subtype) (defined in EffectControls)EffectControlsprivate
update_keyframes() (defined in EffectControls)EffectControlsslot
update_scrollbar() (defined in EffectControls)EffectControlsprivateslot
vcontainer (defined in EffectControls)EffectControlsprivate
verticalScrollBar (defined in EffectControls)EffectControls
video_effect_area (defined in EffectControls)EffectControlsprivate
video_effect_click() (defined in EffectControls)EffectControlsprivateslot
video_transition_click() (defined in EffectControls)EffectControlsprivateslot
zoom (defined in EffectControls)EffectControls
~EffectControls() (defined in EffectControls)EffectControls
+ + + + diff --git a/docs/html/class_effect_controls.html b/docs/html/class_effect_controls.html new file mode 100644 index 000000000..fa4c107f2 --- /dev/null +++ b/docs/html/class_effect_controls.html @@ -0,0 +1,264 @@ + + + + + + + +Olive: EffectControls Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for EffectControls:
+
+
+ +
+ + + + + + + + +

+Public Slots

+void cut ()
 
+void copy (bool del=false)
 
+void update_keyframes ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

EffectControls (QWidget *parent=0)
 
+int get_mode ()
 
+void set_clips (QVector< int > &clips, int mode)
 
+void clear_effects (bool clear_cache)
 
+void delete_effects ()
 
+bool is_focused ()
 
+void reload_clips ()
 
+void set_zoom (bool in)
 
+bool keyframe_focus ()
 
+void delete_selected_keyframes ()
 
+void scroll_to_frame (long frame)
 
+void add_effect_paste_action (QMenu *menu)
 
+ + + + + + + + + + + + + +

+Public Attributes

+bool multiple
 
+QVector< int > selected_clips
 
+double zoom
 
+ResizableScrollBarhorizontalScrollBar
 
+QScrollBar * verticalScrollBar
 
+QMutex effects_loaded
 
+ + + +

+Protected Member Functions

+void resizeEvent (QResizeEvent *event)
 
+ + + + + + + + + + + + + + + + + + + +

+Private Slots

+void menu_select (QAction *q)
 
+void video_effect_click ()
 
+void audio_effect_click ()
 
+void video_transition_click ()
 
+void audio_transition_click ()
 
+void deselect_all_effects (QWidget *)
 
+void update_scrollbar ()
 
+void queue_post_update ()
 
+void effects_area_context_menu ()
 
+ + + + + + + + + + + +

+Private Member Functions

+void show_effect_menu (int type, int subtype)
 
+void load_effects ()
 
+void load_keyframes ()
 
+void open_effect (QVBoxLayout *hlayout, Effect *e)
 
+void setup_ui ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+int effect_menu_type
 
+int effect_menu_subtype
 
+QString panel_name
 
+int mode
 
+TimelineHeaderheaders
 
+EffectsAreaeffects_area
 
+QScrollArea * scrollArea
 
+QLabel * lblMultipleClipsSelected
 
+KeyframeViewkeyframeView
 
+QWidget * video_effect_area
 
+QWidget * audio_effect_area
 
+QWidget * vcontainer
 
+QWidget * acontainer
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effect_controls.png b/docs/html/class_effect_controls.png new file mode 100644 index 0000000000000000000000000000000000000000..6597a5668fd2fa2e49a4000b1752011f2cd47fc7 GIT binary patch literal 482 zcmV<80UiE{P)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0004TNklzslKw)jg&&ot-IP!GMb-1g{Yh@e-n{>Z5?Gsv3O_zMXIB zCtD`d_Mes4n5EUw!4tS2sA|^?{Kz_iH$OT`4W-T;Jb%v&-Da*~pTc{{)=Egj)XuA2 zm#*vZ17 zrRQz0oA8Ti8M^E6Nm@STyjIJFw0z3>P%SCaQs-S=w8K2D7J#P}Z~&u#0~mS3MMRwR Y2O=Xh|L2+A-v9sr07*qoM6N<$f;A84%K!iX literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_delete_command-members.html b/docs/html/class_effect_delete_command-members.html new file mode 100644 index 000000000..208cffe2d --- /dev/null +++ b/docs/html/class_effect_delete_command-members.html @@ -0,0 +1,91 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectDeleteCommand Member List
+
+
+ +

This is the complete list of members for EffectDeleteCommand, including all inherited members.

+ + + + + + + + + + + + + +
clips (defined in EffectDeleteCommand)EffectDeleteCommand
deleted_objects (defined in EffectDeleteCommand)EffectDeleteCommandprivate
done (defined in EffectDeleteCommand)EffectDeleteCommandprivate
doRedo() override (defined in EffectDeleteCommand)EffectDeleteCommandvirtual
doUndo() override (defined in EffectDeleteCommand)EffectDeleteCommandvirtual
EffectDeleteCommand() (defined in EffectDeleteCommand)EffectDeleteCommand
fx (defined in EffectDeleteCommand)EffectDeleteCommand
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~EffectDeleteCommand() override (defined in EffectDeleteCommand)EffectDeleteCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_effect_delete_command.html b/docs/html/class_effect_delete_command.html new file mode 100644 index 000000000..4a490875c --- /dev/null +++ b/docs/html/class_effect_delete_command.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: EffectDeleteCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EffectDeleteCommand Class Reference
+
+
+
+Inheritance diagram for EffectDeleteCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Public Attributes

+QVector< Clip * > clips
 
+QVector< int > fx
 
+ + + + + +

+Private Attributes

+bool done
 
+QVector< Effect * > deleted_objects
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_effect_delete_command.png b/docs/html/class_effect_delete_command.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8c77555bc0b4d5f72014d1879ee44edc48379b GIT binary patch literal 806 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oX3?#Wzf)jw0M1W6->;M1%fy@_gzLxeMngC>h z@qq&eSUc~?1GyX}L4LsuKt&*M^;C!v0|V1mPZ!6K3dXl{U-xY`;BoQq3EBT&x?Y#l zv(0 z`!2uZt6%3G%Qn4xcm9u*$Ij~fX-hBtefU`{W#7+Lym9MJcSvnjX*pTGl!_dbjtPi{vN2t2=i84`=V#-OY65t}ElC zcZ()E1bJmLFxR}1KENTz`lL*{B}HU{^>GQ6!woK18CEc}2(WS}a0xhwC^Tp|Fa$O* zEMj1EVPxuHf=PVY?yxL#mYc!knKyx6PgCO(Fcyww_56PS&N(Av;nRDY?b6bY@8j6y zAhTw|lYg&8raPXx@-y%>^Z9ePLmZ#IJ|6FV@3D7+e4~o-?Tz1d{#aBev*i7??}o%62+6s-;YyjdYFZT~9tAEpvOjzFqtJQ_idlLQh|nxOYVdJAS!lH7WAh@=FWUrcIQdP{dZ|@au)E zfXAw{GS96q?YO33x>1CM|>PrXJ7yT literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_field-members.html b/docs/html/class_effect_field-members.html new file mode 100644 index 000000000..5c070c1b9 --- /dev/null +++ b/docs/html/class_effect_field-members.html @@ -0,0 +1,124 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectField Member List
+
+
+ +

This is the complete list of members for EffectField, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_combo_item(const QString &name, const QVariant &data) (defined in EffectField)EffectField
changed() (defined in EffectField)EffectFieldsignal
clicked() (defined in EffectField)EffectFieldsignal
EffectField(EffectRow *parent, int t, const QString &i) (defined in EffectField)EffectField
frameToTimecode(long frame) (defined in EffectField)EffectField
get_bool_value(double timecode, bool async=false) (defined in EffectField)EffectField
get_color_value(double timecode, bool async=false) (defined in EffectField)EffectField
get_combo_data(double timecode) (defined in EffectField)EffectField
get_combo_index(double timecode, bool async=false) (defined in EffectField)EffectField
get_combo_string(double timecode) (defined in EffectField)EffectField
get_current_data() (defined in EffectField)EffectField
get_double_value(double timecode, bool async=false) (defined in EffectField)EffectField
get_filename(double timecode, bool async=false) (defined in EffectField)EffectField
get_font_name(double timecode, bool async=false) (defined in EffectField)EffectField
get_keyframe_data(double timecode, int &before, int &after, double &d) (defined in EffectField)EffectField
get_previous_data() (defined in EffectField)EffectField
get_string_value(double timecode, bool async=false) (defined in EffectField)EffectField
get_ui_element() (defined in EffectField)EffectField
get_validated_keyframe_handle(int key, bool post) (defined in EffectField)EffectField
hasKeyframes() (defined in EffectField)EffectFieldprivate
id (defined in EffectField)EffectField
is_enabled() (defined in EffectField)EffectField
keyframes (defined in EffectField)EffectField
make_key_from_change(ComboAction *ca) (defined in EffectField)EffectField
parent_row (defined in EffectField)EffectField
set_bool_value(bool b) (defined in EffectField)EffectField
set_color_value(QColor color) (defined in EffectField)EffectField
set_combo_index(int index) (defined in EffectField)EffectField
set_combo_string(const QString &s) (defined in EffectField)EffectField
set_current_data(const QVariant &) (defined in EffectField)EffectField
set_double_default_value(double v) (defined in EffectField)EffectField
set_double_maximum_value(double v) (defined in EffectField)EffectField
set_double_minimum_value(double v) (defined in EffectField)EffectField
set_double_value(double v) (defined in EffectField)EffectField
set_enabled(bool e) (defined in EffectField)EffectField
set_filename(const QString &s) (defined in EffectField)EffectField
set_font_name(const QString &s) (defined in EffectField)EffectField
set_string_value(const QString &s) (defined in EffectField)EffectField
timecodeToFrame(double timecode) (defined in EffectField)EffectField
toggled(bool) (defined in EffectField)EffectFieldsignal
type (defined in EffectField)EffectField
ui_element (defined in EffectField)EffectField
ui_element_change() (defined in EffectField)EffectFieldslot
validate_keyframe_data(double timecode, bool async=false) (defined in EffectField)EffectField
~EffectField() (defined in EffectField)EffectField
+ + + + diff --git a/docs/html/class_effect_field.html b/docs/html/class_effect_field.html new file mode 100644 index 000000000..a9d8f8f01 --- /dev/null +++ b/docs/html/class_effect_field.html @@ -0,0 +1,241 @@ + + + + + + + +Olive: EffectField Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for EffectField:
+
+
+ +
+ + + + +

+Public Slots

+void ui_element_change ()
 
+ + + + + + + +

+Signals

+void changed ()
 
+void toggled (bool)
 
+void clicked ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

EffectField (EffectRow *parent, int t, const QString &i)
 
+double get_validated_keyframe_handle (int key, bool post)
 
+QVariant get_previous_data ()
 
+QVariant get_current_data ()
 
+double frameToTimecode (long frame)
 
+long timecodeToFrame (double timecode)
 
+void set_current_data (const QVariant &)
 
+void get_keyframe_data (double timecode, int &before, int &after, double &d)
 
+QVariant validate_keyframe_data (double timecode, bool async=false)
 
+double get_double_value (double timecode, bool async=false)
 
+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)
 
+QString get_string_value (double timecode, bool async=false)
 
+void set_string_value (const QString &s)
 
+void add_combo_item (const QString &name, const QVariant &data)
 
+int get_combo_index (double timecode, bool async=false)
 
+QVariant get_combo_data (double timecode)
 
+QString get_combo_string (double timecode)
 
+void set_combo_index (int index)
 
+void set_combo_string (const QString &s)
 
+bool get_bool_value (double timecode, bool async=false)
 
+void set_bool_value (bool b)
 
+QString get_font_name (double timecode, bool async=false)
 
+void set_font_name (const QString &s)
 
+QColor get_color_value (double timecode, bool async=false)
 
+void set_color_value (QColor color)
 
+QString get_filename (double timecode, bool async=false)
 
+void set_filename (const QString &s)
 
+QWidget * get_ui_element ()
 
+bool is_enabled ()
 
+void set_enabled (bool e)
 
+void make_key_from_change (ComboAction *ca)
 
+ + + + + + + + + + + +

+Public Attributes

+EffectRowparent_row
 
+int type
 
+QString id
 
+QVector< EffectKeyframekeyframes
 
+QWidget * ui_element
 
+ + + +

+Private Member Functions

+bool hasKeyframes ()
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effect_field.png b/docs/html/class_effect_field.png new file mode 100644 index 0000000000000000000000000000000000000000..77d3c51ca396262668a29fd77ca10e5edbe5d412 GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^o=OzQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;cxAr*{o=ibgcqQK+QAOGn8|Hsp! z8zx+Nb1iH2sh~7xo;f}?8S@1N3k4UgdbL1d<*Hjzo|S8wIFFCx#v%JRRioVRFN zz~+kSu`Bl#AM0)1@3`sO(f^ZItgj9 zeUxmWTf45V@#)G{_uE*5HV;fws-L?~-sS(Ac`C2t p#5ukP(Og0eYwP`m1V3J2zm%fQx!7P;126y?JYD@<);T3K0RWtfylDUc literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_field_undo-members.html b/docs/html/class_effect_field_undo-members.html new file mode 100644 index 000000000..1d99a4285 --- /dev/null +++ b/docs/html/class_effect_field_undo-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectFieldUndo Member List
+
+
+ +

This is the complete list of members for EffectFieldUndo, including all inherited members.

+ + + + + + + + + + + + +
done (defined in EffectFieldUndo)EffectFieldUndoprivate
doRedo() override (defined in EffectFieldUndo)EffectFieldUndovirtual
doUndo() override (defined in EffectFieldUndo)EffectFieldUndovirtual
EffectFieldUndo(EffectField *field) (defined in EffectFieldUndo)EffectFieldUndo
field (defined in EffectFieldUndo)EffectFieldUndoprivate
new_val (defined in EffectFieldUndo)EffectFieldUndoprivate
old_val (defined in EffectFieldUndo)EffectFieldUndoprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_effect_field_undo.html b/docs/html/class_effect_field_undo.html new file mode 100644 index 000000000..f021d49ea --- /dev/null +++ b/docs/html/class_effect_field_undo.html @@ -0,0 +1,131 @@ + + + + + + + +Olive: EffectFieldUndo Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EffectFieldUndo Class Reference
+
+
+
+Inheritance diagram for EffectFieldUndo:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

EffectFieldUndo (EffectField *field)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + +

+Private Attributes

+EffectFieldfield
 
+QVariant old_val
 
+QVariant new_val
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_effect_field_undo.png b/docs/html/class_effect_field_undo.png new file mode 100644 index 0000000000000000000000000000000000000000..7bee2515d0954063c60fe6d8582980fb01485704 GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0qo<2wNCo5DxetrBDDW_t7arU5U%Gzz z0*9ky7%VOZj_?H{JffEokGMxsl&4 z$KEw*KIL<)dRA><=|jHIm9y1X{X6hK+SIo?sPS%6?75U{KF5B~vi-g87U!0uzq#Jn z?N|0V^Q(IP3eC@4CdR+xf>P6-DTJn_@g;>SDJe4SImad7JSQvma7^K{OT0p_9?TCo`S{lDzhR-W636nALbmRIAJYCT zjaTy6{s%k5uRi%y{(AmB&1l=u-=Du-R+Im`^Oxz=6|Y(hpS`pAyUK1&e_*KWk43BI z-3Zfm{@uH(Zky~BZ_|(mH|5!mU6oyRy8LQrOt9?vWY&GFf1t#JK}@#yPBmo0}~j7r>mdK II;Vst0H8lS?EnA( literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_gizmo-members.html b/docs/html/class_effect_gizmo-members.html new file mode 100644 index 000000000..ab724ad78 --- /dev/null +++ b/docs/html/class_effect_gizmo-members.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectGizmo Member List
+
+
+ +

This is the complete list of members for EffectGizmo, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + +
color (defined in EffectGizmo)EffectGizmo
cursor (defined in EffectGizmo)EffectGizmoprivate
EffectGizmo(int type) (defined in EffectGizmo)EffectGizmo
get_cursor() (defined in EffectGizmo)EffectGizmo
get_point_count() (defined in EffectGizmo)EffectGizmo
get_type() (defined in EffectGizmo)EffectGizmo
screen_pos (defined in EffectGizmo)EffectGizmo
set_cursor(int c) (defined in EffectGizmo)EffectGizmo
set_previous_value() (defined in EffectGizmo)EffectGizmo
type (defined in EffectGizmo)EffectGizmoprivate
world_pos (defined in EffectGizmo)EffectGizmo
x_field1 (defined in EffectGizmo)EffectGizmo
x_field2 (defined in EffectGizmo)EffectGizmo
x_field_multi1 (defined in EffectGizmo)EffectGizmo
x_field_multi2 (defined in EffectGizmo)EffectGizmo
y_field1 (defined in EffectGizmo)EffectGizmo
y_field2 (defined in EffectGizmo)EffectGizmo
y_field_multi1 (defined in EffectGizmo)EffectGizmo
y_field_multi2 (defined in EffectGizmo)EffectGizmo
+ + + + diff --git a/docs/html/class_effect_gizmo.html b/docs/html/class_effect_gizmo.html new file mode 100644 index 000000000..0aa18d27c --- /dev/null +++ b/docs/html/class_effect_gizmo.html @@ -0,0 +1,152 @@ + + + + + + + +Olive: EffectGizmo Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + +

+Public Member Functions

EffectGizmo (int type)
 
+void set_previous_value ()
 
+int get_point_count ()
 
+int get_type ()
 
+int get_cursor ()
 
+void set_cursor (int c)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+QVector< QPoint > world_pos
 
+QVector< QPoint > screen_pos
 
+EffectFieldx_field1
 
+double x_field_multi1
 
+EffectFieldy_field1
 
+double y_field_multi1
 
+EffectFieldx_field2
 
+double x_field_multi2
 
+EffectFieldy_field2
 
+double y_field_multi2
 
+QColor color
 
+ + + + + +

+Private Attributes

+int type
 
+int cursor
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effect_init-members.html b/docs/html/class_effect_init-members.html new file mode 100644 index 000000000..060e54d30 --- /dev/null +++ b/docs/html/class_effect_init-members.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectInit Member List
+
+
+ +

This is the complete list of members for EffectInit, including all inherited members.

+ + + +
EffectInit() (defined in EffectInit)EffectInit
run() (defined in EffectInit)EffectInitprotected
+ + + + diff --git a/docs/html/class_effect_init.html b/docs/html/class_effect_init.html new file mode 100644 index 000000000..ecac34ede --- /dev/null +++ b/docs/html/class_effect_init.html @@ -0,0 +1,96 @@ + + + + + + + +Olive: EffectInit Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EffectInit Class Reference
+
+
+
+Inheritance diagram for EffectInit:
+
+
+ +
+ + + + +

+Protected Member Functions

+void run ()
 
+
The documentation for this class was generated from the following files:
    +
  • project/effect.h
  • +
  • project/effectloaders.cpp
  • +
+
+ + + + diff --git a/docs/html/class_effect_init.png b/docs/html/class_effect_init.png new file mode 100644 index 0000000000000000000000000000000000000000..545514dde3d3a5bcd8862eaabd66141e75832a55 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^c0e4!!3-qJ9-74fDTx4|5ZC|z{{xvX-h3_XKQsZz z0^X?T_i-)b&5Qe;uBD-^!t9Epy8aD~Aps_2c?3 zm7|Uff!qH5WT*^ecs2LlS-Dkl-_=-4tG>UFJ3s%@>J#gWKJd@k*7aHMz0vOA=I>v2 zKHuyAsP+Am*?-Ihnp+VweThN+(YY$(o1dL^ Q1O^g=r>mdKI;Vst0A0MZVE_OC literal 0 HcmV?d00001 diff --git a/docs/html/class_effect_keyframe-members.html b/docs/html/class_effect_keyframe-members.html new file mode 100644 index 000000000..5e32a8065 --- /dev/null +++ b/docs/html/class_effect_keyframe-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectKeyframe Member List
+
+
+ +

This is the complete list of members for EffectKeyframe, including all inherited members.

+ + + + + + + + + +
data (defined in EffectKeyframe)EffectKeyframe
EffectKeyframe() (defined in EffectKeyframe)EffectKeyframe
post_handle_x (defined in EffectKeyframe)EffectKeyframe
post_handle_y (defined in EffectKeyframe)EffectKeyframe
pre_handle_x (defined in EffectKeyframe)EffectKeyframe
pre_handle_y (defined in EffectKeyframe)EffectKeyframe
time (defined in EffectKeyframe)EffectKeyframe
type (defined in EffectKeyframe)EffectKeyframe
+ + + + diff --git a/docs/html/class_effect_keyframe.html b/docs/html/class_effect_keyframe.html new file mode 100644 index 000000000..1007785c5 --- /dev/null +++ b/docs/html/class_effect_keyframe.html @@ -0,0 +1,108 @@ + + + + + + + +Olive: EffectKeyframe Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EffectKeyframe Class Reference
+
+
+ + + + + + + + + + + + + + + + +

+Public Attributes

+long time
 
+int type
 
+QVariant data
 
+double pre_handle_x
 
+double pre_handle_y
 
+double post_handle_x
 
+double post_handle_y
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effect_row-members.html b/docs/html/class_effect_row-members.html new file mode 100644 index 000000000..4b575b1f5 --- /dev/null +++ b/docs/html/class_effect_row-members.html @@ -0,0 +1,110 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectRow Member List
+
+
+ +

This is the complete list of members for EffectRow, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_field(int type, const QString &id, int colspan=1) (defined in EffectRow)EffectRow
add_widget(QWidget *w) (defined in EffectRow)EffectRow
column_count (defined in EffectRow)EffectRowprivate
delete_keyframe_at_time(ComboAction *ca, long time) (defined in EffectRow)EffectRow
EffectRow(Effect *parent, bool save, QGridLayout *uilayout, const QString &n, int row, bool keyframable=true) (defined in EffectRow)EffectRow
field(int i) (defined in EffectRow)EffectRow
fieldCount() (defined in EffectRow)EffectRow
fields (defined in EffectRow)EffectRowprivate
focus_row() (defined in EffectRow)EffectRowslot
get_name() (defined in EffectRow)EffectRow
goto_next_key() (defined in EffectRow)EffectRowslot
goto_previous_key() (defined in EffectRow)EffectRowslot
isKeyframing() (defined in EffectRow)EffectRow
just_made_unsafe_keyframe (defined in EffectRow)EffectRowprivate
key_is_new (defined in EffectRow)EffectRowprivate
keyframe_nav (defined in EffectRow)EffectRowprivate
keyframing (defined in EffectRow)EffectRowprivate
label (defined in EffectRow)EffectRow
name (defined in EffectRow)EffectRowprivate
parent_effect (defined in EffectRow)EffectRow
savable (defined in EffectRow)EffectRow
set_keyframe_enabled(bool) (defined in EffectRow)EffectRowprivateslot
set_keyframe_now(ComboAction *ca) (defined in EffectRow)EffectRow
setKeyframing(bool) (defined in EffectRow)EffectRow
toggle_key() (defined in EffectRow)EffectRowslot
ui (defined in EffectRow)EffectRowprivate
ui_row (defined in EffectRow)EffectRowprivate
unsafe_keys (defined in EffectRow)EffectRowprivate
unsafe_old_data (defined in EffectRow)EffectRowprivate
widgets (defined in EffectRow)EffectRowprivate
~EffectRow() (defined in EffectRow)EffectRow
+ + + + diff --git a/docs/html/class_effect_row.html b/docs/html/class_effect_row.html new file mode 100644 index 000000000..fab9f8734 --- /dev/null +++ b/docs/html/class_effect_row.html @@ -0,0 +1,199 @@ + + + + + + + +Olive: EffectRow Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for EffectRow:
+
+
+ +
+ + + + + + + + + + +

+Public Slots

+void goto_previous_key ()
 
+void toggle_key ()
 
+void goto_next_key ()
 
+void focus_row ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

EffectRow (Effect *parent, bool save, QGridLayout *uilayout, const QString &n, int row, bool keyframable=true)
 
+EffectFieldadd_field (int type, const QString &id, int colspan=1)
 
+void add_widget (QWidget *w)
 
+EffectFieldfield (int i)
 
+int fieldCount ()
 
+void set_keyframe_now (ComboAction *ca)
 
+void delete_keyframe_at_time (ComboAction *ca, long time)
 
+const QString & get_name ()
 
+bool isKeyframing ()
 
+void setKeyframing (bool)
 
+ + + + + + + +

+Public Attributes

+ClickableLabellabel
 
+Effectparent_effect
 
+bool savable
 
+ + + +

+Private Slots

+void set_keyframe_enabled (bool)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+bool keyframing
 
+QGridLayout * ui
 
+QString name
 
+int ui_row
 
+QVector< EffectField * > fields
 
+QVector< QWidget * > widgets
 
+KeyframeNavigatorkeyframe_nav
 
+bool just_made_unsafe_keyframe
 
+QVector< int > unsafe_keys
 
+QVector< QVariant > unsafe_old_data
 
+QVector< bool > key_is_new
 
+int column_count
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effect_row.png b/docs/html/class_effect_row.png new file mode 100644 index 0000000000000000000000000000000000000000..37e5c736065d7006a05fbd8e83d50e45e26f9176 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^u0R~X!3-oTJUonnlth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#CGrl*TzNCo5Dxi|Be6?t6y9F}bZ)lwF=+NN~42`|AaK)-`S(tsciVWxKhSpscFOAF-pVN$*l)wn&>+&6)ngD@b+H*1+CF zuP$%@{prT}pt$)~|Mgd`+Pf{##U+gOgPZt)P1^$2WwWPoKb79ZxVin)>Z}qC24-0< zhxN{kFG@8S_VTeVxc+|$$W4q9R~9mSIW=WQwmAor*XQg+`30d1r+j9v?hBgF^y*qr z&D+Jx1;qCpEv{6q)oJnF>oQd@@X)Cqq4%~6ZtRiByEm^=GvM(n#iPqs@14lMrpf+v zx9&3&{bg?N7;j4XYB0#Z4q&MI>)F+DV%0td@sAoUd36<^fC0(i>FVdQ&MBb@08{0$ A9RL6T literal 0 HcmV?d00001 diff --git a/docs/html/class_effects_area-members.html b/docs/html/class_effects_area-members.html new file mode 100644 index 000000000..2ef05af3d --- /dev/null +++ b/docs/html/class_effects_area-members.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EffectsArea Member List
+
+
+ +

This is the complete list of members for EffectsArea, including all inherited members.

+ + + + + + +
EffectsArea(QWidget *parent=0) (defined in EffectsArea)EffectsArea
header (defined in EffectsArea)EffectsArea
keyframe_area (defined in EffectsArea)EffectsArea
parent_widget (defined in EffectsArea)EffectsArea
receive_wheel_event(QWheelEvent *e) (defined in EffectsArea)EffectsAreaslot
+ + + + diff --git a/docs/html/class_effects_area.html b/docs/html/class_effects_area.html new file mode 100644 index 000000000..0853571d5 --- /dev/null +++ b/docs/html/class_effects_area.html @@ -0,0 +1,116 @@ + + + + + + + +Olive: EffectsArea Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
EffectsArea Class Reference
+
+
+
+Inheritance diagram for EffectsArea:
+
+
+ +
+ + + + +

+Public Slots

+void receive_wheel_event (QWheelEvent *e)
 
+ + + +

+Public Member Functions

EffectsArea (QWidget *parent=0)
 
+ + + + + + + +

+Public Attributes

+QScrollArea * parent_widget
 
+KeyframeViewkeyframe_area
 
+TimelineHeaderheader
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_effects_area.png b/docs/html/class_effects_area.png new file mode 100644 index 0000000000000000000000000000000000000000..9000ea2ed7dd2b1477bd8133f440a27629c08536 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^{y-eS!3-qxvu^wXQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;G3f~AkUbv_BL*p=mUwLLZNPst5E53THTr={&aKe`b1*VSw0G4xau>wTYiqyk6&Q? zzPFgQ>hr%pHT?V!*sW|DYGvgP?BnB4h;L`#u>LUfj1ysQH@hs^wK{;KjJi|TwuQKw&7Wi1incYk|pExdE&)`yN|8MpRxuHWyqXPYJS z`tRW%EGN&84%%sc|I@DHW_s$b+Iu|zyWLCrf9vAYpWF8AS~1tIp&ew&{|V`7&z9>y XR@SS$uUQrg3||IMS3j3^P6 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
EmbeddedFileChooser Member List
+
+
+ +

This is the complete list of members for EmbeddedFileChooser, including all inherited members.

+ + + + + + + + + + + +
browse() (defined in EmbeddedFileChooser)EmbeddedFileChooserprivateslot
changed() (defined in EmbeddedFileChooser)EmbeddedFileChoosersignal
EmbeddedFileChooser(QWidget *parent=0) (defined in EmbeddedFileChooser)EmbeddedFileChooser
file_label (defined in EmbeddedFileChooser)EmbeddedFileChooserprivate
filename (defined in EmbeddedFileChooser)EmbeddedFileChooserprivate
getFilename() (defined in EmbeddedFileChooser)EmbeddedFileChooser
getPreviousValue() (defined in EmbeddedFileChooser)EmbeddedFileChooser
old_filename (defined in EmbeddedFileChooser)EmbeddedFileChooserprivate
setFilename(const QString &s) (defined in EmbeddedFileChooser)EmbeddedFileChooser
update_label() (defined in EmbeddedFileChooser)EmbeddedFileChooserprivate
+ + + + diff --git a/docs/html/class_embedded_file_chooser.html b/docs/html/class_embedded_file_chooser.html new file mode 100644 index 000000000..c8adb4605 --- /dev/null +++ b/docs/html/class_embedded_file_chooser.html @@ -0,0 +1,139 @@ + + + + + + + +Olive: EmbeddedFileChooser Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for EmbeddedFileChooser:
+
+
+ +
+ + + + +

+Signals

+void changed ()
 
+ + + + + + + + + +

+Public Member Functions

EmbeddedFileChooser (QWidget *parent=0)
 
+const QString & getFilename ()
 
+const QString & getPreviousValue ()
 
+void setFilename (const QString &s)
 
+ + + +

+Private Slots

+void browse ()
 
+ + + +

+Private Member Functions

+void update_label ()
 
+ + + + + + + +

+Private Attributes

+QLabel * file_label
 
+QString filename
 
+QString old_filename
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_embedded_file_chooser.png b/docs/html/class_embedded_file_chooser.png new file mode 100644 index 0000000000000000000000000000000000000000..66939c1e5e3a15221e816e2154aabd67737283df GIT binary patch literal 559 zcmeAS@N?(olHy`uVBq!ia0vp^JwP15!3-q-Jj#s#QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;RS$$-brKkv`I|GnXv z3+NWgXEjflsL~I@{3&s{`_Ht_NuK^H<=tnay&hkC zx1XM(R5G=4+Ul8cr&qR2D(T=hy1A(8y3f_elb0yRO!i!VZsly1mkRPHbMBi>^Ng+Y zPMzeGc|Xwe-ECj%nZK*m<{R%mRk1ts3dG`OE&sK_zeIrp`;gYh-%Mx%N2uU#;imHX-$V}YiTgR$R<9ge4OpW}ZZ zUS@RK>6h!ufSqwa1#T?M+Sn3y-K;%!p6RAv6W-rDt#i=(qxY{rCa+e;u1PtyRX1__ z9^EyUva8=zE!+S3M98kglO8%@mwA{XG^PTDm+SdIxIjj2E z1{s QFm@R{UHx3vIVCg!0DXc2^Z)<= literal 0 HcmV?d00001 diff --git a/docs/html/class_exponential_fade_transition-members.html b/docs/html/class_exponential_fade_transition-members.html new file mode 100644 index 000000000..89f888e86 --- /dev/null +++ b/docs/html/class_exponential_fade_transition-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ExponentialFadeTransition Member List
+
+
+ +

This is the complete list of members for ExponentialFadeTransition, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c, Clip *s) (defined in Transition)Transition
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ExponentialFadeTransition(Clip *c, Clip *s, const EffectMeta *em) (defined in ExponentialFadeTransition)ExponentialFadeTransition
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_length() (defined in Transition)Transition
get_true_length() (defined in Transition)Transition
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in ExponentialFadeTransition)ExponentialFadeTransitionvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
secondary_clip (defined in Transition)Transition
set_enabled(bool b) (defined in Effect)Effect
set_length(long l) (defined in Transition)Transition
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_exponential_fade_transition.html b/docs/html/class_exponential_fade_transition.html new file mode 100644 index 000000000..a9dbfd2ff --- /dev/null +++ b/docs/html/class_exponential_fade_transition.html @@ -0,0 +1,280 @@ + + + + + + + +Olive: ExponentialFadeTransition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ExponentialFadeTransition Class Reference
+
+
+
+Inheritance diagram for ExponentialFadeTransition:
+
+
+ + +Transition +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ExponentialFadeTransition (Clip *c, Clip *s, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Transition
Transition (Clip *c, Clip *s, const EffectMeta *em)
 
+int copy (Clip *c, Clip *s)
 
+void set_length (long l)
 
+long get_true_length ()
 
+long get_length ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Transition
+Clipsecondary_clip
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_exponential_fade_transition.png b/docs/html/class_exponential_fade_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..033b06ad5abeff7937ee11019768bc71d5268072 GIT binary patch literal 993 zcmeAS@N?(olHy`uVBq!ia0vp^3xW6m2Q!e2R{vZLq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ03p`yMLn;{G&V60I z*R;&o;`?OZRrA1h-De4V#7_M5)?C`smXszo!^Fh+^Tf8aG`pI%?;)?(Z(BCA^y%N_ zJ9zk)|GmHY>c3+jI>M_>j~Au&zS?^$IXCT_)O2aRwOiM(KXWGT`7a4Rp8qA&`Dagl zILW3yufo3KeDV+1qS-V5cAPG@ykZ%%zbX1yo}%p2PnWXOz8UTRGP~&EqWM`BPiO5H zaW>xE?cr=}ET5T?_Uv(5gqP+-#vM~Q6-*xTF4x?ZRB?EALc!4=Z8J|Z#9b0N;4a1V z!^4?DK9l2tGB0Dz62*po6P6DX+ZgPSB%xsH@XVJ$x zp8d7IM61Llrdfs*o8(U~zJG7VaXB{Cm!@~xUdNrA7bH0~EnrgI5&6U4?#QOUPxJ=N;Z%A%=RGt z&NI2o?|VNpRcD{}YEV3#beOYU@ql)TdC&Cx-TPwy-)wO|ymME%UjCjvKUQq5U9oMS zUV``4p8Uhb_a86HUL2p_|3kAadr$v{`ioh=cCr3)-M0N+$vhq7s$)N7@(f?jw_npY z{r0)U{V$mhKV;GHeVHdc_pm;Xc>BGA_pdKK`Z(|0hS?kJ-yd&V-1*nDdefuI>DBMc zHcZ#JFfE^FyU$OzFK>%2s#=+HE3 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ExportDialog Member List
+
+
+ +

This is the complete list of members for ExportDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
acodecCombobox (defined in ExportDialog)ExportDialogprivate
add_codec_to_combobox(QComboBox *box, enum AVCodecID codec) (defined in ExportDialog)ExportDialogprivate
audiobitrateSpinbox (defined in ExportDialog)ExportDialogprivate
audioGroupbox (defined in ExportDialog)ExportDialogprivate
cancel_button (defined in ExportDialog)ExportDialogprivate
cancel_render() (defined in ExportDialog)ExportDialogprivateslot
cancelled (defined in ExportDialog)ExportDialogprivate
comp_type_changed(int index) (defined in ExportDialog)ExportDialogprivateslot
compressionTypeCombobox (defined in ExportDialog)ExportDialogprivate
et (defined in ExportDialog)ExportDialogprivate
export_action() (defined in ExportDialog)ExportDialogprivateslot
export_button (defined in ExportDialog)ExportDialogprivate
export_error (defined in ExportDialog)ExportDialog
ExportDialog(QWidget *parent=0) (defined in ExportDialog)ExportDialogexplicit
format_changed(int index) (defined in ExportDialog)ExportDialogprivateslot
format_strings (defined in ExportDialog)ExportDialogprivate
formatCombobox (defined in ExportDialog)ExportDialogprivate
framerateSpinbox (defined in ExportDialog)ExportDialogprivate
heightSpinbox (defined in ExportDialog)ExportDialogprivate
open_advanced_video_dialog() (defined in ExportDialog)ExportDialogprivateslot
prep_ui_for_render(bool r) (defined in ExportDialog)ExportDialogprivate
progressBar (defined in ExportDialog)ExportDialogprivate
rangeCombobox (defined in ExportDialog)ExportDialogprivate
render_thread_finished() (defined in ExportDialog)ExportDialogprivateslot
renderCancel (defined in ExportDialog)ExportDialogprivate
samplingRateSpinbox (defined in ExportDialog)ExportDialogprivate
setup_ui() (defined in ExportDialog)ExportDialogprivate
update_progress_bar(int value, qint64 remaining_ms) (defined in ExportDialog)ExportDialogprivateslot
vcodec_changed(int index) (defined in ExportDialog)ExportDialogprivateslot
vcodec_params (defined in ExportDialog)ExportDialogprivate
vcodecCombobox (defined in ExportDialog)ExportDialogprivate
videoBitrateLabel (defined in ExportDialog)ExportDialogprivate
videobitrateSpinbox (defined in ExportDialog)ExportDialogprivate
videoGroupbox (defined in ExportDialog)ExportDialogprivate
widthSpinbox (defined in ExportDialog)ExportDialogprivate
~ExportDialog() (defined in ExportDialog)ExportDialog
+ + + + diff --git a/docs/html/class_export_dialog.html b/docs/html/class_export_dialog.html new file mode 100644 index 000000000..7b42e9813 --- /dev/null +++ b/docs/html/class_export_dialog.html @@ -0,0 +1,214 @@ + + + + + + + +Olive: ExportDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ExportDialog:
+
+
+ +
+ + + + +

+Public Member Functions

ExportDialog (QWidget *parent=0)
 
+ + + +

+Public Attributes

+QString export_error
 
+ + + + + + + + + + + + + + + + + +

+Private Slots

+void format_changed (int index)
 
+void export_action ()
 
+void update_progress_bar (int value, qint64 remaining_ms)
 
+void cancel_render ()
 
+void render_thread_finished ()
 
+void vcodec_changed (int index)
 
+void comp_type_changed (int index)
 
+void open_advanced_video_dialog ()
 
+ + + + + + + +

+Private Member Functions

+void setup_ui ()
 
+void prep_ui_for_render (bool r)
 
+void add_codec_to_combobox (QComboBox *box, enum AVCodecID codec)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QVector< QString > format_strings
 
+ExportThreadet
 
+bool cancelled
 
+VideoCodecParams vcodec_params
 
+QComboBox * rangeCombobox
 
+QSpinBox * widthSpinbox
 
+QDoubleSpinBox * videobitrateSpinbox
 
+QLabel * videoBitrateLabel
 
+QDoubleSpinBox * framerateSpinbox
 
+QComboBox * vcodecCombobox
 
+QComboBox * acodecCombobox
 
+QSpinBox * samplingRateSpinbox
 
+QSpinBox * audiobitrateSpinbox
 
+QProgressBar * progressBar
 
+QComboBox * formatCombobox
 
+QSpinBox * heightSpinbox
 
+QPushButton * export_button
 
+QPushButton * cancel_button
 
+QPushButton * renderCancel
 
+QGroupBox * videoGroupbox
 
+QGroupBox * audioGroupbox
 
+QComboBox * compressionTypeCombobox
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_export_dialog.png b/docs/html/class_export_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5c4ee5a27aebed07863bbfa077a794689782b2 GIT binary patch literal 439 zcmV;o0Z9IdP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003-NklG(3opeUjwMEUB59GXR5Z0N%`yZrcRw3~6xs zTc=3>(e#%Tz?mfl@MTE>d|6TeUzQZWmn8)l!OYAX48WHq1@I+H)7SvogljpaP7S zx6@&1>|spWOl(M7%kN3^T)NV;V`xu%(~rZg@6(ulJ$;}$9zJI7($<~=)$yd$@|3Sv hAAm2jq-JK$`~lKEG2o=lOhf + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ExportThread Member List
+
+
+ +

This is the complete list of members for ExportThread, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
acodec (defined in ExportThread)ExportThreadprivate
acodec_ctx (defined in ExportThread)ExportThreadprivate
aframe_bytes (defined in ExportThread)ExportThreadprivate
apkt_alloc (defined in ExportThread)ExportThreadprivate
audio_frame (defined in ExportThread)ExportThreadprivate
audio_pkt (defined in ExportThread)ExportThreadprivate
audio_stream (defined in ExportThread)ExportThreadprivate
c_filename (defined in ExportThread)ExportThreadprivate
continueEncode (defined in ExportThread)ExportThread
ed (defined in ExportThread)ExportThread
encode(AVFormatContext *ofmt_ctx, AVCodecContext *codec_ctx, AVFrame *frame, AVPacket *packet, AVStream *stream, bool rescale) (defined in ExportThread)ExportThreadprivate
ExportThread(const ExportParams &iparams, const VideoCodecParams &ivparams, QObject *parent=nullptr) (defined in ExportThread)ExportThread
fmt_ctx (defined in ExportThread)ExportThreadprivate
mutex (defined in ExportThread)ExportThreadprivate
params (defined in ExportThread)ExportThreadprivate
progress_changed(int value, qint64 remaining_ms) (defined in ExportThread)ExportThreadsignal
ret (defined in ExportThread)ExportThreadprivate
run() (defined in ExportThread)ExportThread
setupAudio() (defined in ExportThread)ExportThreadprivate
setupContainer() (defined in ExportThread)ExportThreadprivate
setupVideo() (defined in ExportThread)ExportThreadprivate
surface (defined in ExportThread)ExportThread
swr_ctx (defined in ExportThread)ExportThreadprivate
swr_frame (defined in ExportThread)ExportThreadprivate
sws_ctx (defined in ExportThread)ExportThreadprivate
sws_frame (defined in ExportThread)ExportThreadprivate
vcodec (defined in ExportThread)ExportThreadprivate
vcodec_ctx (defined in ExportThread)ExportThreadprivate
vcodec_params (defined in ExportThread)ExportThreadprivate
video_frame (defined in ExportThread)ExportThreadprivate
video_pkt (defined in ExportThread)ExportThreadprivate
video_stream (defined in ExportThread)ExportThreadprivate
vpkt_alloc (defined in ExportThread)ExportThreadprivate
waitCond (defined in ExportThread)ExportThreadprivate
wake() (defined in ExportThread)ExportThreadslot
+ + + + diff --git a/docs/html/class_export_thread.html b/docs/html/class_export_thread.html new file mode 100644 index 000000000..a4894f271 --- /dev/null +++ b/docs/html/class_export_thread.html @@ -0,0 +1,218 @@ + + + + + + + +Olive: ExportThread Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ExportThread:
+
+
+ +
+ + + + +

+Public Slots

+void wake ()
 
+ + + +

+Signals

+void progress_changed (int value, qint64 remaining_ms)
 
+ + + + + +

+Public Member Functions

ExportThread (const ExportParams &iparams, const VideoCodecParams &ivparams, QObject *parent=nullptr)
 
+void run ()
 
+ + + + + + + +

+Public Attributes

+QOffscreenSurface surface
 
+ExportDialoged
 
+bool continueEncode
 
+ + + + + + + + + +

+Private Member Functions

+bool encode (AVFormatContext *ofmt_ctx, AVCodecContext *codec_ctx, AVFrame *frame, AVPacket *packet, AVStream *stream, bool rescale)
 
+bool setupVideo ()
 
+bool setupAudio ()
 
+bool setupContainer ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+ExportParams params
 
+VideoCodecParams vcodec_params
 
+AVFormatContext * fmt_ctx
 
+AVStream * video_stream
 
+AVCodec * vcodec
 
+AVCodecContext * vcodec_ctx
 
+AVFrame * video_frame
 
+AVFrame * sws_frame
 
+SwsContext * sws_ctx
 
+AVStream * audio_stream
 
+AVCodec * acodec
 
+AVFrame * audio_frame
 
+AVFrame * swr_frame
 
+AVCodecContext * acodec_ctx
 
+AVPacket video_pkt
 
+AVPacket audio_pkt
 
+SwrContext * swr_ctx
 
+bool vpkt_alloc
 
+bool apkt_alloc
 
+int aframe_bytes
 
+int ret
 
+char * c_filename
 
+QMutex mutex
 
+QWaitCondition waitCond
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_export_thread.png b/docs/html/class_export_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..0d96b16d01c26211574653bb0d0047fe799babb1 GIT binary patch literal 432 zcmV;h0Z;ykP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003$Nklw-n$2OH!?#U^BB00ywP!poe;ahoKX> z7x>BTL+%Ftg|{NW0R~tpzySuR72p5^)C%x_0h^ii5C-sh1^A2Le3SrfJv&bw_slB; zfCEhp?3LQEXHM60DrW5TY%fP3!$9sdj%;GP2f6|k9E a2R#7h+%#Q}D-S;a0000 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
FillLeftRightEffect Member List
+
+
+ +

This is the complete list of members for FillLeftRightEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fill_type (defined in FillLeftRightEffect)FillLeftRightEffectprivate
FillLeftRightEffect(Clip *c, const EffectMeta *em) (defined in FillLeftRightEffect)FillLeftRightEffect
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in FillLeftRightEffect)FillLeftRightEffectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_fill_left_right_effect.html b/docs/html/class_fill_left_right_effect.html new file mode 100644 index 000000000..13949e4f8 --- /dev/null +++ b/docs/html/class_fill_left_right_effect.html @@ -0,0 +1,266 @@ + + + + + + + +Olive: FillLeftRightEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
FillLeftRightEffect Class Reference
+
+
+
+Inheritance diagram for FillLeftRightEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

FillLeftRightEffect (Clip *c, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + +

+Private Attributes

+EffectFieldfill_type
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_fill_left_right_effect.png b/docs/html/class_fill_left_right_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..f8cff107f97a4f72965c9cc6e75f16c6cec13e1c GIT binary patch literal 656 zcmeAS@N?(olHy`uVBq!ia0vp^`9R#k!3-qtMY(1GDTx4|5ZC|z{{xvX-h3_XKQsZz z0^YvZlL7jA!l{(AZk1|ClN2HA(q8LwA@+ph^`D=9?-$2^54mqDTJYX_*CqF`8 z|7RKZj3@6GzIXgrw(oZ4Dru87=NIieA0Iydsl&eSb(Z$ucjectVU+vmR`ZmDd5_N@ iIYy8Nrv!a^EdS$SWXap+=u5!l!{F)a=d#Wzp$P!zT|htp literal 0 HcmV?d00001 diff --git a/docs/html/class_flow_layout-members.html b/docs/html/class_flow_layout-members.html new file mode 100644 index 000000000..1d11e67f7 --- /dev/null +++ b/docs/html/class_flow_layout-members.html @@ -0,0 +1,99 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
FlowLayout Member List
+
+
+ +

This is the complete list of members for FlowLayout, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
addItem(QLayoutItem *item) override (defined in FlowLayout)FlowLayout
count() const override (defined in FlowLayout)FlowLayout
doLayout(const QRect &rect, bool testOnly) const (defined in FlowLayout)FlowLayoutprivate
expandingDirections() const override (defined in FlowLayout)FlowLayout
FlowLayout(QWidget *parent, int margin=-1, int hSpacing=-1, int vSpacing=-1) (defined in FlowLayout)FlowLayoutexplicit
FlowLayout(int margin=-1, int hSpacing=-1, int vSpacing=-1) (defined in FlowLayout)FlowLayoutexplicit
hasHeightForWidth() const override (defined in FlowLayout)FlowLayout
heightForWidth(int) const override (defined in FlowLayout)FlowLayout
horizontalSpacing() const (defined in FlowLayout)FlowLayout
itemAt(int index) const override (defined in FlowLayout)FlowLayout
itemList (defined in FlowLayout)FlowLayoutprivate
m_hSpace (defined in FlowLayout)FlowLayoutprivate
m_vSpace (defined in FlowLayout)FlowLayoutprivate
minimumSize() const override (defined in FlowLayout)FlowLayout
setGeometry(const QRect &rect) override (defined in FlowLayout)FlowLayout
sizeHint() const override (defined in FlowLayout)FlowLayout
smartSpacing(QStyle::PixelMetric pm) const (defined in FlowLayout)FlowLayoutprivate
takeAt(int index) override (defined in FlowLayout)FlowLayout
verticalSpacing() const (defined in FlowLayout)FlowLayout
~FlowLayout() (defined in FlowLayout)FlowLayout
+ + + + diff --git a/docs/html/class_flow_layout.html b/docs/html/class_flow_layout.html new file mode 100644 index 000000000..92213ec03 --- /dev/null +++ b/docs/html/class_flow_layout.html @@ -0,0 +1,158 @@ + + + + + + + +Olive: FlowLayout Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for FlowLayout:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

FlowLayout (QWidget *parent, int margin=-1, int hSpacing=-1, int vSpacing=-1)
 
FlowLayout (int margin=-1, int hSpacing=-1, int vSpacing=-1)
 
+void addItem (QLayoutItem *item) override
 
+int horizontalSpacing () const
 
+int verticalSpacing () const
 
+Qt::Orientations expandingDirections () const override
 
+bool hasHeightForWidth () const override
 
+int heightForWidth (int) const override
 
+int count () const override
 
+QLayoutItem * itemAt (int index) const override
 
+QSize minimumSize () const override
 
+void setGeometry (const QRect &rect) override
 
+QSize sizeHint () const override
 
+QLayoutItem * takeAt (int index) override
 
+ + + + + +

+Private Member Functions

+int doLayout (const QRect &rect, bool testOnly) const
 
+int smartSpacing (QStyle::PixelMetric pm) const
 
+ + + + + + + +

+Private Attributes

+QList< QLayoutItem * > itemList
 
+int m_hSpace
 
+int m_vSpace
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_flow_layout.png b/docs/html/class_flow_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..a93772a0d8e8f30cb2638a2e6ec6ed16c29c39b4 GIT binary patch literal 421 zcmV;W0b2fvP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003rNklHBXPsFp|JUVlcYH5HZ!v<00vk9(nz%}OQtT> zw#pK9xwd~@(`f^E!L$LynKpnp(*_V{+5qBA8*pf5W@%smNlY6+oNDu$+{p+2-X_@} zx=Vkw)g%k`)n|I2Z${<$-nKgqHlOHrmvcKu)Yj~1%yt)lwAC^-8xGjY@3hmyA&lD& zJlL9h)vxKHdgVy{8{zfyppyQnrT~NVSG=%2EQs5l;^+4bAWpi?%q)vP47V+nk+*%@ P00000NkvXXu0mjfOz6eA literal 0 HcmV?d00001 diff --git a/docs/html/class_focus_filter-members.html b/docs/html/class_focus_filter-members.html new file mode 100644 index 000000000..2966b5433 --- /dev/null +++ b/docs/html/class_focus_filter-members.html @@ -0,0 +1,105 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
FocusFilter Member List
+
+ + + + + diff --git a/docs/html/class_focus_filter.html b/docs/html/class_focus_filter.html new file mode 100644 index 000000000..945306bda --- /dev/null +++ b/docs/html/class_focus_filter.html @@ -0,0 +1,906 @@ + + + + + + + +Olive: FocusFilter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
FocusFilter Class Reference
+
+
+ +

The FocusFilter class. + More...

+ +

#include <focusfilter.h>

+
+Inheritance diagram for FocusFilter:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Slots

void cut ()
 Cuts selected clips or selected effects (but not both). More...
 
void copy ()
 Copies selected clips or selected effects (but not both). More...
 
void duplicate ()
 Duplicates currently selected items. More...
 
void go_to_in ()
 Go to In Point. More...
 
void go_to_out ()
 Go to Out Point. More...
 
void go_to_start ()
 Go to Start. More...
 
void prev_frame ()
 Go to Previous Frame. More...
 
void play_in_to_out ()
 Play In Point to Out Point. More...
 
void playpause ()
 Toggle Play/Pause. More...
 
void pause ()
 Pause/Shuttle Stop. More...
 
void increase_speed ()
 Increase Speed/Shuttle Right. More...
 
void decrease_speed ()
 Decrease Speed/Shuttle Left. More...
 
void next_frame ()
 Go to Next Frame. More...
 
void go_to_end ()
 Go to End. More...
 
void set_viewer_fullscreen ()
 Set currently focused viewer to full screen. More...
 
void set_marker ()
 Set a marker at the current playhead. More...
 
void set_in_point ()
 Set in point. More...
 
void set_out_point ()
 Set out point. More...
 
void clear_in ()
 Clear in point. More...
 
void clear_out ()
 Clear out point. More...
 
void clear_inout ()
 Clear in/out point. More...
 
void delete_function ()
 Delete. More...
 
void select_all ()
 Select All. More...
 
void zoom_in ()
 Zoom In. More...
 
void zoom_out ()
 Zoom Out. More...
 
+ + + + +

+Public Member Functions

 FocusFilter ()
 FocusFilter Constructor. More...
 
+

Detailed Description

+

The FocusFilter class.

+

Some keyboard shortcuts/menu actions will do different things depending on the panel that's currently focused. For example, pressing "Set Marker" will set a marker on the main active sequence if the timeline is focused, or on the media in the Media Viewer if the Media Viewer is focused. This class provides slots/functions that can be called that will check which panel is focused and call the appropriate function.

+

Responds to config.hover_focus. Default behavior is focus by clicking on the panels, but if hover_focus is TRUE, the focused panel will be whichever panel has the cursor currently hovering over it.

+

Constructor & Destructor Documentation

+ +

◆ FocusFilter()

+ +
+
+ + + + + + + +
FocusFilter::FocusFilter ()
+
+ +

FocusFilter Constructor.

+

Currently empty.

+ +
+
+

Member Function Documentation

+ +

◆ clear_in

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::clear_in ()
+
+slot
+
+ +

Clear in point.

+

Calls clear_in() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ clear_inout

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::clear_inout ()
+
+slot
+
+ +

Clear in/out point.

+

Calls clear_inout() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ clear_out

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::clear_out ()
+
+slot
+
+ +

Clear out point.

+

Calls clear_out() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ copy

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::copy ()
+
+slot
+
+ +

Copies selected clips or selected effects (but not both).

+

If the Effect Controls panel is focused, copies selected effects. Otherwise copies selected clips.

+ +
+
+ +

◆ cut

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::cut ()
+
+slot
+
+ +

Cuts selected clips or selected effects (but not both).

+

If the Effect Controls panel is focused, cuts selected effects. Otherwise cuts selected clips.

+ +
+
+ +

◆ decrease_speed

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::decrease_speed ()
+
+slot
+
+ +

Decrease Speed/Shuttle Left.

+

Calls decrease_speed() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ delete_function

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::delete_function ()
+
+slot
+
+ +

Delete.

+

Calls various delete functions based on which UI elements are focused. Deletes span anywhere from deleting clips (Timeline), to effects (Effect Controls), to markers (TimelineHeader).

+ +
+
+ +

◆ duplicate

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::duplicate ()
+
+slot
+
+ +

Duplicates currently selected items.

+

Currently this only duplicates Sequences in the project panel.

+ +
+
+ +

◆ go_to_end

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::go_to_end ()
+
+slot
+
+ +

Go to End.

+

Calls go_to_end() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ go_to_in

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::go_to_in ()
+
+slot
+
+ +

Go to In Point.

+

Calls go_to_in() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ go_to_out

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::go_to_out ()
+
+slot
+
+ +

Go to Out Point.

+

Calls go_to_out() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ go_to_start

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::go_to_start ()
+
+slot
+
+ +

Go to Start.

+

Calls go_to_start() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ increase_speed

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::increase_speed ()
+
+slot
+
+ +

Increase Speed/Shuttle Right.

+

Calls increase_speed() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ next_frame

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::next_frame ()
+
+slot
+
+ +

Go to Next Frame.

+

Calls next_frame() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ pause

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::pause ()
+
+slot
+
+ +

Pause/Shuttle Stop.

+

Calls pause() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ play_in_to_out

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::play_in_to_out ()
+
+slot
+
+ +

Play In Point to Out Point.

+

Calls play(true) on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ playpause

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::playpause ()
+
+slot
+
+ +

Toggle Play/Pause.

+

Calls toggle_play() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ prev_frame

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::prev_frame ()
+
+slot
+
+ +

Go to Previous Frame.

+

Calls previous_frame() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ select_all

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::select_all ()
+
+slot
+
+ +

Select All.

+

Calls select_all() on Graph Editor if its focused or Timeline if it's not.

+ +
+
+ +

◆ set_in_point

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::set_in_point ()
+
+slot
+
+ +

Set in point.

+

Calls set_in_point() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ set_marker

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::set_marker ()
+
+slot
+
+ +

Set a marker at the current playhead.

+

Calls set_marker() on Media Viewer or Sequence Viewer if it's focused. Otherwise calls it on Timeline.

+ +
+
+ +

◆ set_out_point

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::set_out_point ()
+
+slot
+
+ +

Set out point.

+

Calls set_out_point() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ set_viewer_fullscreen

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::set_viewer_fullscreen ()
+
+slot
+
+ +

Set currently focused viewer to full screen.

+

Calls viewer_widget->set_fullscreen() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer.

+ +
+
+ +

◆ zoom_in

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::zoom_in ()
+
+slot
+
+ +

Zoom In.

+

Calls zoom_in() on Effect Controls, Footage Viewer, or Sequence Viewer if one of them is focused. Otherwise calls it on Timeline.

+ +
+
+ +

◆ zoom_out

+ +
+
+ + + + + +
+ + + + + + + +
void FocusFilter::zoom_out ()
+
+slot
+
+ +

Zoom Out.

+

Calls zoom_out() on Effect Controls, Footage Viewer, or Sequence Viewer if one of them is focused. Otherwise calls it on Timeline.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_focus_filter.png b/docs/html/class_focus_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..870840a45b1f2b32ff4f9bf239e525b262205846 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^K0qA6!3-o@Vv~OYDTx4|5ZC|z{{xvX-h3_XKQsZz z0^)7XSRee$Q%~ z7Dl(ErCHx6XjVC}RS7McCn)%lDKPY_V#=yjW@?)@>-=32vnuPlox0o2y?g7{Hq}qL z8@Oe$_MvW>*Eg^70{WpE_%* zL;6*p&HD2jj!&&ut&Wp;ZyXvbea}cxP@Tcdf?>~xDYEU0&jx>c{b}>gQ~wH0o!Jsp zQW(sf*blS7wy;OS@&zpYjwB7nys`8scX9eF>IlJ1FQ6lBF$?v`X>1OwMerJBWY7@HJ r + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
FontCombobox Member List
+
+
+ +

This is the complete list of members for FontCombobox, including all inherited members.

+ + + + + + + + + + +
ComboBoxEx(QWidget *parent=0) (defined in ComboBoxEx)ComboBoxEx
FontCombobox(QWidget *parent=0) (defined in FontCombobox)FontCombobox
getPreviousIndex() (defined in ComboBoxEx)ComboBoxEx
getPreviousValue() (defined in FontCombobox)FontCombobox
previousValue (defined in FontCombobox)FontComboboxprivate
setCurrentIndexEx(int i) (defined in ComboBoxEx)ComboBoxEx
setCurrentTextEx(const QString &text) (defined in ComboBoxEx)ComboBoxEx
updateInternals() (defined in FontCombobox)FontComboboxprivateslot
value (defined in FontCombobox)FontComboboxprivate
+ + + + diff --git a/docs/html/class_font_combobox.html b/docs/html/class_font_combobox.html new file mode 100644 index 000000000..fae31f2c6 --- /dev/null +++ b/docs/html/class_font_combobox.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: FontCombobox Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
FontCombobox Class Reference
+
+
+
+Inheritance diagram for FontCombobox:
+
+
+ + +ComboBoxEx + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

FontCombobox (QWidget *parent=0)
 
+const QString & getPreviousValue ()
 
- Public Member Functions inherited from ComboBoxEx
ComboBoxEx (QWidget *parent=0)
 
+void setCurrentIndexEx (int i)
 
+void setCurrentTextEx (const QString &text)
 
+int getPreviousIndex ()
 
+ + + +

+Private Slots

+void updateInternals ()
 
+ + + + + +

+Private Attributes

+QString previousValue
 
+QString value
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_font_combobox.png b/docs/html/class_font_combobox.png new file mode 100644 index 0000000000000000000000000000000000000000..487391ff7a63ce760a7ad300229a662399d3afd6 GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^2|(Pz!3-qz1Ld9qDTx4|5ZC|z{{xvX-h3_XKQsZz z0^kP61Pb8l~2qQJv2J0kVp|NiUT z3JcPX1y8=Y)^_HiP^Seu&su9PeZuJ(dbM9*#j06JIxa+mOwliTNh(_AJLWA`nv*us9>tH|$d3jCYD#Gn3FxZ~9X_fm-uwT{*f zpHHO+NN)e*WZ?6pbwT{W=%(b|^SR^lE*{mj;_NZ5s6FxX+w|;9@zaBL6-@uy=Meg} zxy2#$stU`hRciMImQ0zX%+NoB(dMJrna!IIMsMhOpIspShkd&S3xk;=g8?UFgC_@r zj}t?J5EH{>0frfWoDQ1!PFD9(QmSila5?hib<>tVE-q}pZp+QI;$lB3%#ex8s0miNVv=&t;ucLK6VTNh-wv literal 0 HcmV?d00001 diff --git a/docs/html/class_frei0r_effect-members.html b/docs/html/class_frei0r_effect-members.html new file mode 100644 index 000000000..6db53fc72 --- /dev/null +++ b/docs/html/class_frei0r_effect-members.html @@ -0,0 +1,140 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Frei0rEffect Member List
+
+
+ +

This is the complete list of members for Frei0rEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
construct_module() (defined in Frei0rEffect)Frei0rEffectprivate
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
destruct_module() (defined in Frei0rEffect)Frei0rEffectprivate
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
Frei0rEffect(Clip *c, const EffectMeta *em) (defined in Frei0rEffect)Frei0rEffect
get_param_info (defined in Frei0rEffect)Frei0rEffectprivate
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
handle (defined in Frei0rEffect)Frei0rEffectprivate
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
instance (defined in Frei0rEffect)Frei0rEffectprivate
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open (defined in Frei0rEffect)Frei0rEffectprivate
open() (defined in Effect)Effect
param_count (defined in Frei0rEffect)Frei0rEffectprivate
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Frei0rEffect)Frei0rEffectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Frei0rEffect)Frei0rEffectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
~Frei0rEffect() (defined in Frei0rEffect)Frei0rEffect
+ + + + diff --git a/docs/html/class_frei0r_effect.html b/docs/html/class_frei0r_effect.html new file mode 100644 index 000000000..152cc7067 --- /dev/null +++ b/docs/html/class_frei0r_effect.html @@ -0,0 +1,288 @@ + + + + + + + +Olive: Frei0rEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for Frei0rEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Frei0rEffect (Clip *c, const EffectMeta *em)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void refresh ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + +

+Private Member Functions

+void destruct_module ()
 
+void construct_module ()
 
+ + + + + + + + + + + +

+Private Attributes

+ModulePtr handle
 
+f0r_instance_t instance
 
+int param_count
 
+f0rGetParamInfo get_param_info
 
+bool open
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/frei0reffect.h
  • +
  • effects/internal/frei0reffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_frei0r_effect.png b/docs/html/class_frei0r_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c1ebdae81dc742013321cd96a41a6e429a3e0d GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^0YKcr!3-qb7tOf~q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg&w9EzhEy=VoqMrwjRKE@e|FOU|NZYf zxQvX9&ulZF?YrwC$EJd9TVCx`QWD}!N)vPEI(w#ur!{)xuZxx0X|cQWJ3y?Wevht6q`BQF1c!I;(|wk~^vVbqTgN2Lz8)-O1v$x<-Mi9ueI<-{KWtO literal 0 HcmV?d00001 diff --git a/docs/html/class_graph_editor-members.html b/docs/html/class_graph_editor-members.html new file mode 100644 index 000000000..467a25835 --- /dev/null +++ b/docs/html/class_graph_editor-members.html @@ -0,0 +1,102 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
GraphEditor Member List
+
+
+ +

This is the complete list of members for GraphEditor, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
bezier_button (defined in GraphEditor)GraphEditorprivate
current_row_desc (defined in GraphEditor)GraphEditorprivate
delete_selected_keys() (defined in GraphEditor)GraphEditor
GraphEditor(QWidget *parent=0) (defined in GraphEditor)GraphEditor
header (defined in GraphEditor)GraphEditorprivate
hold_button (defined in GraphEditor)GraphEditorprivate
keyframe_nav (defined in GraphEditor)GraphEditorprivate
linear_button (defined in GraphEditor)GraphEditorprivate
passthrough_slider_value() (defined in GraphEditor)GraphEditorprivateslot
row (defined in GraphEditor)GraphEditorprivate
select_all() (defined in GraphEditor)GraphEditor
set_field_visibility(bool b) (defined in GraphEditor)GraphEditorprivateslot
set_key_button_enabled(bool e, int type) (defined in GraphEditor)GraphEditorprivateslot
set_keyframe_type() (defined in GraphEditor)GraphEditorprivateslot
set_row(EffectRow *r) (defined in GraphEditor)GraphEditor
slider_proxies (defined in GraphEditor)GraphEditorprivate
slider_proxy_buttons (defined in GraphEditor)GraphEditorprivate
slider_proxy_sources (defined in GraphEditor)GraphEditorprivate
update_panel() (defined in GraphEditor)GraphEditor
value_layout (defined in GraphEditor)GraphEditorprivate
view (defined in GraphEditor)GraphEditorprivate
view_is_focused() (defined in GraphEditor)GraphEditor
view_is_under_mouse() (defined in GraphEditor)GraphEditor
+ + + + diff --git a/docs/html/class_graph_editor.html b/docs/html/class_graph_editor.html new file mode 100644 index 000000000..240db335c --- /dev/null +++ b/docs/html/class_graph_editor.html @@ -0,0 +1,170 @@ + + + + + + + +Olive: GraphEditor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
GraphEditor Class Reference
+
+
+
+Inheritance diagram for GraphEditor:
+
+
+ +
+ + + + + + + + + + + + + + + + +

+Public Member Functions

GraphEditor (QWidget *parent=0)
 
+void update_panel ()
 
+void set_row (EffectRow *r)
 
+bool view_is_focused ()
 
+bool view_is_under_mouse ()
 
+void delete_selected_keys ()
 
+void select_all ()
 
+ + + + + + + + + +

+Private Slots

+void set_key_button_enabled (bool e, int type)
 
+void passthrough_slider_value ()
 
+void set_keyframe_type ()
 
+void set_field_visibility (bool b)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+GraphViewview
 
+TimelineHeaderheader
 
+QHBoxLayout * value_layout
 
+QVector< LabelSlider * > slider_proxies
 
+QVector< QPushButton * > slider_proxy_buttons
 
+QVector< LabelSlider * > slider_proxy_sources
 
+QLabel * current_row_desc
 
+EffectRowrow
 
+KeyframeNavigatorkeyframe_nav
 
+QPushButton * linear_button
 
+QPushButton * bezier_button
 
+QPushButton * hold_button
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_graph_editor.png b/docs/html/class_graph_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..3834069067a3d2df2064cd3fd87de008bdaf3a90 GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^kw6^4!3-o_Z)t`CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^6i*k&kP61Pb7MChQs8m(k4yP)eeIL{ zf+*|W@;r6r`38)9o*cDqE=OEEI20vLoU~WZ{~r14XyM5%f773uUcQvH{)x+5cEy%; zzA3!7)VHs5zM}Bz%!AL_Zl$v=+5hz25#AQo6c{WRw%gA8_=%J2Q~dWoy}A3zv-6fk zyM8S_UwB%sa>wD?bo=Yaw&X_@X`J6VFFK(6)&A6T(e%`_44AE<;h*U&>NjzV z+41>rzopr E0HFKYH~;_u literal 0 HcmV?d00001 diff --git a/docs/html/class_graph_view-members.html b/docs/html/class_graph_view-members.html new file mode 100644 index 000000000..c47b01441 --- /dev/null +++ b/docs/html/class_graph_view-members.html @@ -0,0 +1,141 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
GraphView Member List
+
+
+ +

This is the complete list of members for GraphView, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
click_add (defined in GraphView)GraphViewprivate
click_add_field (defined in GraphView)GraphViewprivate
click_add_key (defined in GraphView)GraphViewprivate
click_add_proc (defined in GraphView)GraphViewprivate
click_add_type (defined in GraphView)GraphViewprivate
current_handle (defined in GraphView)GraphViewprivate
delete_selected_keys() (defined in GraphView)GraphView
draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos) (defined in GraphView)GraphViewprivate
draw_lines(QPainter &p, bool vert) (defined in GraphView)GraphViewprivate
field_visibility (defined in GraphView)GraphViewprivate
get_screen_x(double) (defined in GraphView)GraphViewprivate
get_screen_y(double) (defined in GraphView)GraphViewprivate
get_value_x(int) (defined in GraphView)GraphViewprivate
get_value_y(int) (defined in GraphView)GraphViewprivate
GraphView(QWidget *parent=0) (defined in GraphView)GraphView
handle_field (defined in GraphView)GraphViewprivate
handle_index (defined in GraphView)GraphViewprivate
mousedown (defined in GraphView)GraphViewprivate
mouseMoveEvent(QMouseEvent *event) (defined in GraphView)GraphView
mousePressEvent(QMouseEvent *event) (defined in GraphView)GraphView
mouseReleaseEvent(QMouseEvent *event) (defined in GraphView)GraphView
moved_keys (defined in GraphView)GraphViewprivate
old_post_handle_x (defined in GraphView)GraphViewprivate
old_post_handle_y (defined in GraphView)GraphViewprivate
old_pre_handle_x (defined in GraphView)GraphViewprivate
old_pre_handle_y (defined in GraphView)GraphViewprivate
paintEvent(QPaintEvent *event) (defined in GraphView)GraphView
rect_select (defined in GraphView)GraphViewprivate
rect_select_h (defined in GraphView)GraphViewprivate
rect_select_offset (defined in GraphView)GraphViewprivate
rect_select_w (defined in GraphView)GraphViewprivate
rect_select_x (defined in GraphView)GraphViewprivate
rect_select_y (defined in GraphView)GraphViewprivate
reset_view() (defined in GraphView)GraphViewprivateslot
row (defined in GraphView)GraphViewprivate
select_all() (defined in GraphView)GraphView
selected_keys (defined in GraphView)GraphViewprivate
selected_keys_fields (defined in GraphView)GraphViewprivate
selected_keys_old_doubles (defined in GraphView)GraphViewprivate
selected_keys_old_vals (defined in GraphView)GraphViewprivate
selection_changed(bool, int) (defined in GraphView)GraphViewsignal
selection_update() (defined in GraphView)GraphViewprivate
set_field_visibility(int field, bool b) (defined in GraphView)GraphView
set_row(EffectRow *r) (defined in GraphView)GraphView
set_scroll_x(int s) (defined in GraphView)GraphViewprivate
set_scroll_y(int s) (defined in GraphView)GraphViewprivate
set_selected_keyframe_type(int type) (defined in GraphView)GraphView
set_view_to_all() (defined in GraphView)GraphViewprivateslot
set_view_to_rect(int x1, double y1, int x2, double y2) (defined in GraphView)GraphViewprivateslot
set_view_to_selection() (defined in GraphView)GraphViewprivateslot
set_zoom(double z) (defined in GraphView)GraphViewprivate
show_context_menu(const QPoint &pos) (defined in GraphView)GraphViewprivateslot
start_x (defined in GraphView)GraphViewprivate
start_y (defined in GraphView)GraphViewprivate
visible_in (defined in GraphView)GraphViewprivate
wheelEvent(QWheelEvent *event) (defined in GraphView)GraphView
x_scroll (defined in GraphView)GraphViewprivate
x_scroll_changed(int) (defined in GraphView)GraphViewsignal
y_scroll (defined in GraphView)GraphViewprivate
y_scroll_changed(int) (defined in GraphView)GraphViewsignal
zoom (defined in GraphView)GraphViewprivate
zoom_changed(double) (defined in GraphView)GraphViewsignal
+ + + + diff --git a/docs/html/class_graph_view.html b/docs/html/class_graph_view.html new file mode 100644 index 000000000..b00855b68 --- /dev/null +++ b/docs/html/class_graph_view.html @@ -0,0 +1,295 @@ + + + + + + + +Olive: GraphView Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for GraphView:
+
+
+ +
+ + + + + + + + + + +

+Signals

+void x_scroll_changed (int)
 
+void y_scroll_changed (int)
 
+void zoom_changed (double)
 
+void selection_changed (bool, int)
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

GraphView (QWidget *parent=0)
 
+void paintEvent (QPaintEvent *event)
 
+void mousePressEvent (QMouseEvent *event)
 
+void mouseMoveEvent (QMouseEvent *event)
 
+void mouseReleaseEvent (QMouseEvent *event)
 
+void wheelEvent (QWheelEvent *event)
 
+void set_row (EffectRow *r)
 
+void set_selected_keyframe_type (int type)
 
+void set_field_visibility (int field, bool b)
 
+void delete_selected_keys ()
 
+void select_all ()
 
+ + + + + + + + + + + +

+Private Slots

+void show_context_menu (const QPoint &pos)
 
+void reset_view ()
 
+void set_view_to_selection ()
 
+void set_view_to_all ()
 
+void set_view_to_rect (int x1, double y1, int x2, double y2)
 
+ + + + + + + + + + + + + + + + + + + + + +

+Private Member Functions

+void set_scroll_x (int s)
 
+void set_scroll_y (int s)
 
+void set_zoom (double z)
 
+int get_screen_x (double)
 
+int get_screen_y (double)
 
+long get_value_x (int)
 
+double get_value_y (int)
 
+void selection_update ()
 
+void draw_lines (QPainter &p, bool vert)
 
+void draw_line_text (QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+int x_scroll
 
+int y_scroll
 
+bool mousedown
 
+int start_x
 
+int start_y
 
+double zoom
 
+QVector< bool > field_visibility
 
+QVector< int > selected_keys
 
+QVector< int > selected_keys_fields
 
+QVector< long > selected_keys_old_vals
 
+QVector< double > selected_keys_old_doubles
 
+double old_pre_handle_x
 
+double old_pre_handle_y
 
+double old_post_handle_x
 
+double old_post_handle_y
 
+int handle_field
 
+int handle_index
 
+bool moved_keys
 
+int current_handle
 
+EffectRowrow
 
+bool rect_select
 
+int rect_select_x
 
+int rect_select_y
 
+int rect_select_w
 
+int rect_select_h
 
+int rect_select_offset
 
+long visible_in
 
+bool click_add
 
+bool click_add_proc
 
+EffectFieldclick_add_field
 
+int click_add_key
 
+int click_add_type
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_graph_view.png b/docs/html/class_graph_view.png new file mode 100644 index 0000000000000000000000000000000000000000..5de535f324cb9ab78fd6bac9b5f925a0f7023429 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^-as6{!3-qR8Y>!rlth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#CGo2QFoNCo5Dxo4*xR^V{cpZ(!qzD=jv zzXdZN@pR8D&iO3r{ei8qthd8sfdp7&hpq4T7Kd~$YY6!X_s>%Qm=~m z#HDYVyYtRZ2EJ>&nPGD?&%H}}y4_Lgb7N@J{m7k;^Y$1m4Ev|6ST4_gt!VGNpHiP@ zeKkz1H~+p~S}gMKhgDhCYoDb)FaH00#j1Zk2XzD|N-)-3V-#58aINsjL8eG`EgrFx zzc$z2(P?1K6>Er}&HCVa8sm?xkqmXYVU?X7ES!uS7l8s-Hw39Ou-$!^bME~04bR;+ zebzY5G-JhvERUk6GUrp1gM2PN&5|t+hwW9X6b;L3NwmGV zlgUx#7w*84~Pr$DTay{w@m bv`Bx#3+)fOH79+6q0Hdv>gTe~DWM4f8QsOD literal 0 HcmV?d00001 diff --git a/docs/html/class_key_sequence_editor-members.html b/docs/html/class_key_sequence_editor-members.html new file mode 100644 index 000000000..951233599 --- /dev/null +++ b/docs/html/class_key_sequence_editor-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
KeySequenceEditor Member List
+
+
+ +

This is the complete list of members for KeySequenceEditor, including all inherited members.

+ + + + + + + +
action (defined in KeySequenceEditor)KeySequenceEditorprivate
action_name() (defined in KeySequenceEditor)KeySequenceEditor
export_shortcut() (defined in KeySequenceEditor)KeySequenceEditor
KeySequenceEditor(QWidget *parent, QAction *a) (defined in KeySequenceEditor)KeySequenceEditor
reset_to_default() (defined in KeySequenceEditor)KeySequenceEditor
set_action_shortcut() (defined in KeySequenceEditor)KeySequenceEditor
+ + + + diff --git a/docs/html/class_key_sequence_editor.html b/docs/html/class_key_sequence_editor.html new file mode 100644 index 000000000..fb98e86ab --- /dev/null +++ b/docs/html/class_key_sequence_editor.html @@ -0,0 +1,115 @@ + + + + + + + +Olive: KeySequenceEditor Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
KeySequenceEditor Class Reference
+
+
+
+Inheritance diagram for KeySequenceEditor:
+
+
+ +
+ + + + + + + + + + + + +

+Public Member Functions

KeySequenceEditor (QWidget *parent, QAction *a)
 
+void set_action_shortcut ()
 
+void reset_to_default ()
 
+QString action_name ()
 
+QString export_shortcut ()
 
+ + + +

+Private Attributes

+QAction * action
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_key_sequence_editor.png b/docs/html/class_key_sequence_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..0b90b9429076e160b7e1e413df3012c9e9f18f45 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^)j%A;!3-q%ihk_?QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;Ln;{G&b?jqM1jYpKW^Fo|NZ8M z=7qB((@#%Wwe*y%wbKiZjAxR@n|%+dWOnmKPrCMM`-c5%%lCek_k8Mkcv6Y;!Al>l zZFQ}cC#&pCzcf*0@6`E1`>MY!*m@y9>PvY|8G>Th;z4FvId)Es}y)wV}qdOpI z-J-X9j;uR2dsg4wz)yBtF3JUG>|9uIZ(aKFd2cIchI~8gF1uSd-ar5QYujpr346j+ zd&8q + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
KeyframeDelete Member List
+
+
+ +

This is the complete list of members for KeyframeDelete, including all inherited members.

+ + + + + + + + + + + + +
deleted_key (defined in KeyframeDelete)KeyframeDeleteprivate
done (defined in KeyframeDelete)KeyframeDeleteprivate
doRedo() override (defined in KeyframeDelete)KeyframeDeletevirtual
doUndo() override (defined in KeyframeDelete)KeyframeDeletevirtual
field (defined in KeyframeDelete)KeyframeDeleteprivate
index (defined in KeyframeDelete)KeyframeDeleteprivate
KeyframeDelete(EffectField *ifield, int iindex) (defined in KeyframeDelete)KeyframeDelete
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_keyframe_delete.html b/docs/html/class_keyframe_delete.html new file mode 100644 index 000000000..7359dabf3 --- /dev/null +++ b/docs/html/class_keyframe_delete.html @@ -0,0 +1,131 @@ + + + + + + + +Olive: KeyframeDelete Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
KeyframeDelete Class Reference
+
+
+
+Inheritance diagram for KeyframeDelete:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

KeyframeDelete (EffectField *ifield, int iindex)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + +

+Private Attributes

+EffectFieldfield
 
+int index
 
+bool done
 
+EffectKeyframe deleted_key
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_keyframe_delete.png b/docs/html/class_keyframe_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..f058e327f0cb0faf6d69d68cd00def0d3d3e50f2 GIT binary patch literal 718 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#BLtfz}(NCo5DxwrdP8}Kk3cRTd||8aJX zCrk^cmzr0HNE#kdobIV~d7qM!5!;b7IV=l}jEg^*uQK)AW@PWR-s;}&nKSnuySI16 zriU9>UCv7T*0Fh&$nlg-ISRSTYZF$Bo(#P2{$zp4mBsT{1jQ`66Y;iwu4ZJ>1?j&f z;pVQ3jV6D4*SBxQs&{;$r)I0K`gNdw%`3j@NsU)iuFmjVJ#)+V(vtVPwbTRD)*Em5 z^{3A-DeQjqVY?;s8`IMEd#^ZiMyBP|nKK6?rgoeVV7QmgCUMx}sttc}Z?NvNz;%tQ z^v@m$V65N}ZDMh z_JsOgHsNJ_P@C3Z*b{vAv%z(Xt4UH%rB?j9#KR-n(2nV9kXNR9yQJ`N9N=(beefVZ zB)ULUeC~6hqAAPmijR8Tj+lX4eh#YB<#M&EG+SM?)#XwwSkpiLauIDc7yNZ ziuJ#WtE2b3gkRm)G;h_-AC-sXSDZTdX7>r(&%dLlzCK=7{M&MuZ}+BFx2tPRt#8HN zb=iJ0?&%TZ(Aop}atU@_!E(=gtc4bx+EL@SoX2P9mGce_ZT$cHYyxV3iNB8f`tkm; kAHs|UAGT@{l9;tryau4orLup00i_>zopr0KXPevH$=8 literal 0 HcmV?d00001 diff --git a/docs/html/class_keyframe_field_set-members.html b/docs/html/class_keyframe_field_set-members.html new file mode 100644 index 000000000..8c4741430 --- /dev/null +++ b/docs/html/class_keyframe_field_set-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
KeyframeFieldSet Member List
+
+
+ +

This is the complete list of members for KeyframeFieldSet, including all inherited members.

+ + + + + + + + + + + + +
done (defined in KeyframeFieldSet)KeyframeFieldSetprivate
doRedo() override (defined in KeyframeFieldSet)KeyframeFieldSetvirtual
doUndo() override (defined in KeyframeFieldSet)KeyframeFieldSetvirtual
field (defined in KeyframeFieldSet)KeyframeFieldSetprivate
index (defined in KeyframeFieldSet)KeyframeFieldSetprivate
key (defined in KeyframeFieldSet)KeyframeFieldSetprivate
KeyframeFieldSet(EffectField *ifield, int ii) (defined in KeyframeFieldSet)KeyframeFieldSet
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_keyframe_field_set.html b/docs/html/class_keyframe_field_set.html new file mode 100644 index 000000000..be7adccf7 --- /dev/null +++ b/docs/html/class_keyframe_field_set.html @@ -0,0 +1,131 @@ + + + + + + + +Olive: KeyframeFieldSet Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
KeyframeFieldSet Class Reference
+
+
+
+Inheritance diagram for KeyframeFieldSet:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

KeyframeFieldSet (EffectField *ifield, int ii)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + +

+Private Attributes

+EffectFieldfield
 
+int index
 
+EffectKeyframe key
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_keyframe_field_set.png b/docs/html/class_keyframe_field_set.png new file mode 100644 index 0000000000000000000000000000000000000000..4abf1c0e4521348b0661830a59c35d1228fe4d36 GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^1wh=v!3-oh{?F$HQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM(wq666=m08|75S5Ji)F)%RId%8G=R4~4s`*zZ10}eNS3+3`U|vwi-;%uiTczUwO~>9)?8xiy%5*38ydhY#%Ro@V$rCHUysGjC>Y+RdzX z&UQnRsqyY$*&Sz>CEgEOmU3;%wPKxe*8^qyU6**8O}W_L@Y?45q>U?%?zw-;YjV_= z!#w(I>?XqXp^Nn!TrcQ1WQW@_P2+!*nqc}SaJpEu*hJCQGk?66sr@VWY*vcP&80_Q z@3QWUtkiAOeX`E`?3sJ(_)LtsL&2^Qb`YG{##G^{?BKnXtuHw_Df_{ZZ0{VtKTUdX z9U3A^6&zMr2`GffatN&AW8ny8XKGo+%;_k9_w|Tyr%)#@2j$Ay?NQNFJYZzEPKeR$FctFT`wBiGuBtM zwaczPaHntGtl!4>ZXf;rBy{?+?*+y(yF?DW^o?KO{b2XLitq#5YZHI(S8oWYWespy cvhW|{x%1)4Y&AC?0+T0$r>mdKI;Vst08EZqSpWb4 literal 0 HcmV?d00001 diff --git a/docs/html/class_keyframe_navigator-members.html b/docs/html/class_keyframe_navigator-members.html new file mode 100644 index 000000000..50047f33a --- /dev/null +++ b/docs/html/class_keyframe_navigator-members.html @@ -0,0 +1,94 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
KeyframeNavigator Member List
+
+
+ +

This is the complete list of members for KeyframeNavigator, including all inherited members.

+ + + + + + + + + + + + + + + + +
clicked() (defined in KeyframeNavigator)KeyframeNavigatorsignal
enable_keyframe_toggle(bool) (defined in KeyframeNavigator)KeyframeNavigator
enable_keyframes(bool) (defined in KeyframeNavigator)KeyframeNavigator
goto_next_key() (defined in KeyframeNavigator)KeyframeNavigatorsignal
goto_previous_key() (defined in KeyframeNavigator)KeyframeNavigatorsignal
key_addremove (defined in KeyframeNavigator)KeyframeNavigatorprivate
key_controls (defined in KeyframeNavigator)KeyframeNavigatorprivate
keyframe_enable (defined in KeyframeNavigator)KeyframeNavigatorprivate
keyframe_enabled_changed(bool) (defined in KeyframeNavigator)KeyframeNavigatorsignal
keyframe_ui_enabled(bool) (defined in KeyframeNavigator)KeyframeNavigatorprivateslot
KeyframeNavigator(QWidget *parent=0, bool addLeftPad=true) (defined in KeyframeNavigator)KeyframeNavigator
left_key_nav (defined in KeyframeNavigator)KeyframeNavigatorprivate
right_key_nav (defined in KeyframeNavigator)KeyframeNavigatorprivate
toggle_key() (defined in KeyframeNavigator)KeyframeNavigatorsignal
~KeyframeNavigator() (defined in KeyframeNavigator)KeyframeNavigator
+ + + + diff --git a/docs/html/class_keyframe_navigator.html b/docs/html/class_keyframe_navigator.html new file mode 100644 index 000000000..bd66dfcd5 --- /dev/null +++ b/docs/html/class_keyframe_navigator.html @@ -0,0 +1,147 @@ + + + + + + + +Olive: KeyframeNavigator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
KeyframeNavigator Class Reference
+
+
+
+Inheritance diagram for KeyframeNavigator:
+
+
+ +
+ + + + + + + + + + + + +

+Signals

+void goto_previous_key ()
 
+void toggle_key ()
 
+void goto_next_key ()
 
+void keyframe_enabled_changed (bool)
 
+void clicked ()
 
+ + + + + + + +

+Public Member Functions

KeyframeNavigator (QWidget *parent=0, bool addLeftPad=true)
 
+void enable_keyframes (bool)
 
+void enable_keyframe_toggle (bool)
 
+ + + +

+Private Slots

+void keyframe_ui_enabled (bool)
 
+ + + + + + + + + + + +

+Private Attributes

+QHBoxLayout * key_controls
 
+QPushButton * left_key_nav
 
+QPushButton * key_addremove
 
+QPushButton * right_key_nav
 
+QPushButton * keyframe_enable
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_keyframe_navigator.png b/docs/html/class_keyframe_navigator.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf2a9235b9f74520cfbf44524a3cddfddb841e5 GIT binary patch literal 540 zcmeAS@N?(olHy`uVBq!ia0vp^l|UT8!3-q1+O=ANlth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C`YEKu(kP61Pb8nZmDDb$J$36S=Uq0OR ziBiQ(s|)KAdzX7O^1f!hW$o*(o*MEF*SjalzTgp+$bZcj~9f z96FsePiUga=9{YSlln?#?@?O3eMzUE<0QT>d^i7Y;!WvQk$ufpSsbgr+o;Aa?Kt<> zQ0{NeTlXs0|Cn?A|MS>0OK-)QDS95SddIi>^>fLhs;wTEcFJ}AeDv0EUud(AXRgV_ zvuCO}9^~$2*tJ6X=hs)Q@7(4cn0w*xiTKFd%{&);fY=K=E^tpvi)~>nxuC$j<&wOD z{@FV5U{0nhPu$9j&+$s`WMH$HaQjB(Ex!}l4Bh7H|LyqQ)_>fRTeKy|l%@KIaEG8} z%DMG-6&BjRSChPdzPxw#9H~EjMxU}YCpw>c#I9@;cq{0_yqMG5cHfw^b+&Ei@$a>F zB7ZFowon&mGb@ry-lX-hdcr@eoi7&o>0NPrw7lq?YmvsIGyTTDUtEgf`&+Vp;kN0U zc(&G-wc8eKm)*5uQa!iceIM}?`}=RqmvZoYtj&4BE8fe@`1L~h_OBinzRWgS2#iVw MPgg&ebxsLQ0B2 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
KeyframeView Member List
+
+
+ +

This is the complete list of members for KeyframeView, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
delete_selected_keyframes() (defined in KeyframeView)KeyframeView
drag_frame_start (defined in KeyframeView)KeyframeViewprivate
dragging (defined in KeyframeView)KeyframeViewprivate
header (defined in KeyframeView)KeyframeView
keyframeIsSelected(EffectField *field, int keyframe) (defined in KeyframeView)KeyframeViewprivate
KeyframeView(QWidget *parent=0) (defined in KeyframeView)KeyframeView
keys_selected (defined in KeyframeView)KeyframeViewprivate
last_frame_diff (defined in KeyframeView)KeyframeViewprivate
menu_set_key_type(QAction *) (defined in KeyframeView)KeyframeViewprivateslot
mousedown (defined in KeyframeView)KeyframeViewprivate
mouseMoveEvent(QMouseEvent *event) (defined in KeyframeView)KeyframeViewprivate
mousePressEvent(QMouseEvent *event) (defined in KeyframeView)KeyframeViewprivate
mouseReleaseEvent(QMouseEvent *event) (defined in KeyframeView)KeyframeViewprivate
old_key_vals (defined in KeyframeView)KeyframeViewprivate
paintEvent(QPaintEvent *event) (defined in KeyframeView)KeyframeViewprivate
rect_select_h (defined in KeyframeView)KeyframeViewprivate
rect_select_offset (defined in KeyframeView)KeyframeViewprivate
rect_select_w (defined in KeyframeView)KeyframeViewprivate
rect_select_x (defined in KeyframeView)KeyframeViewprivate
rect_select_y (defined in KeyframeView)KeyframeViewprivate
resize_move(double d) (defined in KeyframeView)KeyframeViewslot
rows (defined in KeyframeView)KeyframeViewprivate
rowY (defined in KeyframeView)KeyframeViewprivate
scroll_drag (defined in KeyframeView)KeyframeViewprivate
select_rect (defined in KeyframeView)KeyframeViewprivate
selected_fields (defined in KeyframeView)KeyframeViewprivate
selected_keyframes (defined in KeyframeView)KeyframeViewprivate
set_x_scroll(int) (defined in KeyframeView)KeyframeViewslot
set_y_scroll(int) (defined in KeyframeView)KeyframeViewslot
show_context_menu(const QPoint &pos) (defined in KeyframeView)KeyframeViewprivateslot
update_keys() (defined in KeyframeView)KeyframeViewprivate
visible_in (defined in KeyframeView)KeyframeView
visible_out (defined in KeyframeView)KeyframeView
wheel_event_signal(QWheelEvent *) (defined in KeyframeView)KeyframeViewsignal
wheelEvent(QWheelEvent *e) (defined in KeyframeView)KeyframeViewprivate
x_scroll (defined in KeyframeView)KeyframeViewprivate
y_scroll (defined in KeyframeView)KeyframeViewprivate
+ + + + diff --git a/docs/html/class_keyframe_view.html b/docs/html/class_keyframe_view.html new file mode 100644 index 000000000..816f6e6d0 --- /dev/null +++ b/docs/html/class_keyframe_view.html @@ -0,0 +1,228 @@ + + + + + + + +Olive: KeyframeView Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for KeyframeView:
+
+
+ +
+ + + + + + + + +

+Public Slots

+void set_x_scroll (int)
 
+void set_y_scroll (int)
 
+void resize_move (double d)
 
+ + + +

+Signals

+void wheel_event_signal (QWheelEvent *)
 
+ + + + + +

+Public Member Functions

KeyframeView (QWidget *parent=0)
 
+void delete_selected_keyframes ()
 
+ + + + + + + +

+Public Attributes

+TimelineHeaderheader
 
+long visible_in
 
+long visible_out
 
+ + + + + +

+Private Slots

+void show_context_menu (const QPoint &pos)
 
+void menu_set_key_type (QAction *)
 
+ + + + + + + + + + + + + + + +

+Private Member Functions

+void mousePressEvent (QMouseEvent *event)
 
+void mouseMoveEvent (QMouseEvent *event)
 
+void mouseReleaseEvent (QMouseEvent *event)
 
+void paintEvent (QPaintEvent *event)
 
+void wheelEvent (QWheelEvent *e)
 
+bool keyframeIsSelected (EffectField *field, int keyframe)
 
+void update_keys ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QVector< EffectField * > selected_fields
 
+QVector< int > selected_keyframes
 
+QVector< int > rowY
 
+QVector< EffectRow * > rows
 
+QVector< long > old_key_vals
 
+bool mousedown
 
+bool dragging
 
+bool keys_selected
 
+bool select_rect
 
+bool scroll_drag
 
+long drag_frame_start
 
+long last_frame_diff
 
+int rect_select_x
 
+int rect_select_y
 
+int rect_select_w
 
+int rect_select_h
 
+int rect_select_offset
 
+int x_scroll
 
+int y_scroll
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_keyframe_view.png b/docs/html/class_keyframe_view.png new file mode 100644 index 0000000000000000000000000000000000000000..e2db32bd000d7bacc4cf843e5f4a2f2b0c28ad3e GIT binary patch literal 494 zcmeAS@N?(olHy`uVBq!ia0vp^aX=iv!3-pqvl;0CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^T2B|pkP61Pa|4T86nNOo^}ql9UmqhX z+H@q!|JF{;;=7ADym=0$pE>iZ(KATDEp8IizX1F9e=en6JJ@bH@rg_PYVPCAzhp8* z|9u$5Att1Pd-|D0TV>;LSF>Y4X$XuK)c zdcL4u>3jBF`9=Am=Qd4Jxw@w`YybSJ==bMms%+gMUt2Nd7<=R-y$>I&j5p^o{Am$) zu>bWce*LO zPwuM;-k-K}>G_!&|8M + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LabelSlider Member List
+
+
+ +

This is the complete list of members for LabelSlider, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
clicked()LabelSlidersignal
decimal_placesLabelSlider
default_value (defined in LabelSlider)LabelSliderprivate
display_type (defined in LabelSlider)LabelSliderprivate
drag_proc (defined in LabelSlider)LabelSliderprivate
drag_start (defined in LabelSlider)LabelSliderprivate
drag_start_value (defined in LabelSlider)LabelSliderprivate
drag_start_x (defined in LabelSlider)LabelSliderprivate
drag_start_y (defined in LabelSlider)LabelSliderprivate
frame_rate (defined in LabelSlider)LabelSliderprivate
getPreviousValue()LabelSlider
internal_value (defined in LabelSlider)LabelSliderprivate
is_dragging()LabelSlider
is_set()LabelSlider
LabelSlider(QWidget *parent=nullptr) (defined in LabelSlider)LabelSlider
max_enabled (defined in LabelSlider)LabelSliderprivate
max_value (defined in LabelSlider)LabelSliderprivate
min_enabled (defined in LabelSlider)LabelSliderprivate
min_value (defined in LabelSlider)LabelSliderprivate
mouseMoveEvent(QMouseEvent *ev) (defined in LabelSlider)LabelSliderprotected
mousePressEvent(QMouseEvent *ev) (defined in LabelSlider)LabelSliderprotected
mouseReleaseEvent(QMouseEvent *ev) (defined in LabelSlider)LabelSliderprotected
previous_value (defined in LabelSlider)LabelSliderprivate
set (defined in LabelSlider)LabelSliderprivate
set_active_cursor()LabelSliderprivate
set_color(QString c=nullptr)LabelSlider
set_default_cursor()LabelSliderprivate
set_default_value(double v)LabelSlider
set_display_type(int type)LabelSlider
set_frame_rate(double d)LabelSlider
set_maximum_value(double v)LabelSlider
set_minimum_value(double v)LabelSlider
set_previous_value()LabelSlider
set_value(double v, bool userSet)LabelSlider
value()LabelSlider
valueChanged()LabelSlidersignal
valueToString()LabelSlider
+ + + + diff --git a/docs/html/class_label_slider.html b/docs/html/class_label_slider.html new file mode 100644 index 000000000..d407ef734 --- /dev/null +++ b/docs/html/class_label_slider.html @@ -0,0 +1,634 @@ + + + + + + + +Olive: LabelSlider Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

The LabelSlider class. + More...

+ +

#include <labelslider.h>

+
+Inheritance diagram for LabelSlider:
+
+
+ +
+ + + + + + + + +

+Signals

void valueChanged ()
 valueChanged signal More...
 
void clicked ()
 clicked signal More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

LabelSlider (QWidget *parent=nullptr)
 
void set_frame_rate (double d)
 Set the display frame rate. More...
 
void set_display_type (int type)
 Sets the way to display the value. More...
 
void set_value (double v, bool userSet)
 Set the value. More...
 
void set_default_value (double v)
 Set the default value. More...
 
void set_minimum_value (double v)
 Set the minimum value. More...
 
void set_maximum_value (double v)
 Set the maximum value. More...
 
double value ()
 Returns the internal value as a double. More...
 
bool is_set ()
 Returns whether a value has been set or not. More...
 
bool is_dragging ()
 Returns whether the user is currently dragging. More...
 
QString valueToString ()
 Convert the internal value to a displayed string according to display_type More...
 
double getPreviousValue ()
 Returns whatever value was set before the last set_value() More...
 
void set_previous_value ()
 Updates previous value. More...
 
void set_color (QString c=nullptr)
 Set the display color. More...
 
+ + + + +

+Public Attributes

int decimal_places
 Set how many decimal places to show for a floating-point number. More...
 
+ + + + + + + +

+Protected Member Functions

+void mousePressEvent (QMouseEvent *ev)
 
+void mouseMoveEvent (QMouseEvent *ev)
 
+void mouseReleaseEvent (QMouseEvent *ev)
 
+ + + + + + + +

+Private Member Functions

+void set_default_cursor ()
 Internal function to set the standard cursor (usually SizeHorCursor)
 
+void set_active_cursor ()
 Internal function to set the cursor while dragging (usually NoCursor aka invisible)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+double default_value
 
+double internal_value
 
+double drag_start_value
 
+double previous_value
 
+bool min_enabled
 
+double min_value
 
+bool max_enabled
 
+double max_value
 
+bool drag_start
 
+bool drag_proc
 
+int drag_start_x
 
+int drag_start_y
 
+bool set
 
+int display_type
 
+double frame_rate
 
+

Detailed Description

+

The LabelSlider class.

+

A UI element that shows a number and can be dragged to increase/decrease its value or clicked to enter a specific one.

+

Member Function Documentation

+ +

◆ clicked

+ +
+
+ + + + + +
+ + + + + + + +
void LabelSlider::clicked ()
+
+signal
+
+ +

clicked signal

+

Emitted if the user clicks on the LabelSlider in any way

+ +
+
+ +

◆ getPreviousValue()

+ +
+
+ + + + + + + +
double LabelSlider::getPreviousValue ()
+
+ +

Returns whatever value was set before the last set_value()

+

For various reasons (largely undo capabilities) it is helpful to retrieve whatever the value was before the current one. If the user dragged the current value, this will return the value just before the user started dragging.

+
Returns
The previous value
+ +
+
+ +

◆ is_dragging()

+ +
+
+ + + + + + + +
bool LabelSlider::is_dragging ()
+
+ +

Returns whether the user is currently dragging.

+
Returns
TRUE if the user is dragging, FALSE if not.
+ +
+
+ +

◆ is_set()

+ +
+
+ + + + + + + +
bool LabelSlider::is_set ()
+
+ +

Returns whether a value has been set or not.

+

If a value has been entered by any means (i.e. if set_value() was called), this will be TRUE. If set_value() has not been called and is_set() is FALSE, calling set_default_value() will automatically set the value to the default value WITHOUT changing the is_set() state (i.e. it will still be FALSE and calling set_default_value() again will change the current value again unless it's been changed through some other means in that time).

+
Returns
TRUE if a value has been set, FALSE if not.
+ +
+
+ +

◆ set_color()

+ +
+
+ + + + + + + + +
void LabelSlider::set_color (QString c = nullptr)
+
+ +

Set the display color.

+
Parameters
+ + +
cColor to set to
+
+
+ +
+
+ +

◆ set_default_value()

+ +
+
+ + + + + + + + +
void LabelSlider::set_default_value (double v)
+
+ +

Set the default value.

+

If a default value is set, alt+clicking the LabelSlider will return to the default value.

+
Parameters
+ + +
vValue to set as default
+
+
+ +
+
+ +

◆ set_display_type()

+ +
+
+ + + + + + + + +
void LabelSlider::set_display_type (int type)
+
+ +

Sets the way to display the value.

+
    +
  • LABELSLIDER_NORMAL - Shows the value as a normal number
  • +
  • LABELSLIDER_FRAMENUMBER - Shows the number as a timecode according to config.timecode_view. By default, will render hh:mm:ss:ff
  • +
  • LABELSLIDER_PERCENT - Shows the number as a percentage. 1.0 becomes "100%", 0.5 becomes 50%, etc.
  • +
  • LABELSLIDER_DECIBLE - Shows the number as a decibel. 1.0 becomes "0 dB", 2.0 becames roughly "6 dB", 0.5 becomes roughly "-6 dB", etc.
  • +
+
Parameters
+ + +
typeThe display type to set to. Should be a member of enum LabelSliderDisplayType.
+
+
+ +
+
+ +

◆ set_frame_rate()

+ +
+
+ + + + + + + + +
void LabelSlider::set_frame_rate (double d)
+
+ +

Set the display frame rate.

+

If the display_type is set to LABELSLIDER_FRAMENUMBER, this function sets how many frames per second the timecode will be in.

+
Parameters
+ + +
d
+
+
+ +
+
+ +

◆ set_maximum_value()

+ +
+
+ + + + + + + + +
void LabelSlider::set_maximum_value (double v)
+
+ +

Set the maximum value.

+

If a maximum value is set, the value will never go above it. If the user manually sets a value higher than the maximum, it will automatically snap to the maximum.

+
Parameters
+ + +
vValue to set as maximum
+
+
+ +
+
+ +

◆ set_minimum_value()

+ +
+
+ + + + + + + + +
void LabelSlider::set_minimum_value (double v)
+
+ +

Set the minimum value.

+

If a minimum value is set, the value will never go below it. If the user manually sets a value lower than the minimum, it will automatically snap to the minimum.

+
Parameters
+ + +
vValue to set as minimum
+
+
+ +
+
+ +

◆ set_previous_value()

+ +
+
+ + + + + + + +
void LabelSlider::set_previous_value ()
+
+ +

Updates previous value.

+

Called internally to store the current value as the previous value in anticipation of an upcoming value change. Can also be called externally (mainly for dragged EffectGizmos) in anticipation of an external change.

+ +
+
+ +

◆ set_value()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void LabelSlider::set_value (double v,
bool userSet 
)
+
+ +

Set the value.

+
Parameters
+ + + +
vValue to set to.
userSetTRUE if this was called through a user action, FALSE if this was called through some other way. The only difference is TRUE will emit a signal (valueChanged()) indicating that the value has changed, and FALSE will not.
+
+
+ +
+
+ +

◆ value()

+ +
+
+ + + + + + + +
double LabelSlider::value ()
+
+ +

Returns the internal value as a double.

+
Returns
The internal value. This will not respect the display_type, i.e. 100% will return as 1.0, 12dB will return as 400%, and a timecode will return as a frame number.
+ +
+
+ +

◆ valueChanged

+ +
+
+ + + + + +
+ + + + + + + +
void LabelSlider::valueChanged ()
+
+signal
+
+ +

valueChanged signal

+

Emitted if the value changed at it was instigated by the user.

+ +
+
+ +

◆ valueToString()

+ +
+
+ + + + + + + +
QString LabelSlider::valueToString ()
+
+ +

Convert the internal value to a displayed string according to display_type

+
Returns
The internal value as a string
+ +
+
+

Member Data Documentation

+ +

◆ decimal_places

+ +
+
+ + + + +
int LabelSlider::decimal_places
+
+ +

Set how many decimal places to show for a floating-point number.

+

Defaults to 1

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_label_slider.png b/docs/html/class_label_slider.png new file mode 100644 index 0000000000000000000000000000000000000000..bd07d4f5cb28f5b12f9e7e1dbd20bb5bc441edb8 GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^K0qA6!3-o@Vv~OYDTx4|5ZC|z{{xvX-h3_XKQsZz z0^kP61Pa}O3Z8}PWy*L(B-f8oId zo#c$bRnFVl66{Id3*`voi)=+wHp-rLwpP*l85zYdVkgC~U-omhwe_tm z*{MILme+WphGejmO($Dm<>8jr#< zPUeoxLkvl?3>s#ro!Nip%%&E`CmBEit3=!4o>Lo69lzZqutvt@l6Qn@z&7Kom#;S8 z`Z_^-&9!%~eOso>238+>o_BjsK-RgLZ!Vwvc4JxfF4w(l_5O0~-drMiV8TDaGF_>J zyK{LrWbNe1n(^#udD+}&e-<;>ECN~kyL8sfr!TlA{d9d3q9>{W!;-<%)z4*}Q$iB} DflawQ literal 0 HcmV?d00001 diff --git a/docs/html/class_linear_fade_transition-members.html b/docs/html/class_linear_fade_transition-members.html new file mode 100644 index 000000000..07894e3dc --- /dev/null +++ b/docs/html/class_linear_fade_transition-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LinearFadeTransition Member List
+
+
+ +

This is the complete list of members for LinearFadeTransition, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c, Clip *s) (defined in Transition)Transition
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_length() (defined in Transition)Transition
get_true_length() (defined in Transition)Transition
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
LinearFadeTransition(Clip *c, Clip *s, const EffectMeta *em) (defined in LinearFadeTransition)LinearFadeTransition
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in LinearFadeTransition)LinearFadeTransitionvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
secondary_clip (defined in Transition)Transition
set_enabled(bool b) (defined in Effect)Effect
set_length(long l) (defined in Transition)Transition
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_linear_fade_transition.html b/docs/html/class_linear_fade_transition.html new file mode 100644 index 000000000..fe1fc50f3 --- /dev/null +++ b/docs/html/class_linear_fade_transition.html @@ -0,0 +1,280 @@ + + + + + + + +Olive: LinearFadeTransition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
LinearFadeTransition Class Reference
+
+
+
+Inheritance diagram for LinearFadeTransition:
+
+
+ + +Transition +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

LinearFadeTransition (Clip *c, Clip *s, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Transition
Transition (Clip *c, Clip *s, const EffectMeta *em)
 
+int copy (Clip *c, Clip *s)
 
+void set_length (long l)
 
+long get_true_length ()
 
+long get_length ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Transition
+Clipsecondary_clip
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_linear_fade_transition.png b/docs/html/class_linear_fade_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..777c27a936ccb6dd8e1a0d3d25cbb94a85922d04 GIT binary patch literal 871 zcmeAS@N?(olHy`uVBq!ia0vp^EkJyLgBeJE3buX^q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0zInPhhEy=VoqK!TYXu$`@n(_#|K;bK zgwHvhdHIc4$j(_eRU8tI-nhAb$&{en$!E^IvQl6=bY_m8lTFag__N#7o|UBD%ocdP z?ezT3$L-lR?klY{bxHXkGTVK#%b7E8X1;gsDG#2Xf96cwM|qb=4391!- zv_QX#MgNidQ%BFdIr4q=owX)BoW-u3r$R@9!d6WC!YW-(xL+dyn-BbD)Z=!JK z%u3OYDM71p8fL#^$lA@?u`at|5o^c1g?6sO0)euOj1Oc57#S^CT^tzv7zG6yf*n{` z9*BU1{&KmTv%GE=ISJ%+r%9Ks1u}o|iZ51Od+VO}CE@+7fm?p-?&tp4aZG07!t9J? z*`8H5>jgVcx+;5$*Ql%WDZF~>axg^j(DE*o*w5#mw5;y?+wMH+-}@gq>@6zG8#p*T z{cM32gqt1kEoazzm&xV2sl!Dkm-7Mh7jbs1=xbp3z}L~hFo#J=fdQoYfTjWyQvnx9 zsE$?X`JC+8I-aFKrz@U(8QNj;Pvzx}zZWz-cfH`ASh4G1HOqU4B@bKMXMCCNe80%J zCznn2<;?ZYK92GMOG=g`1x%XvtJh0d1Jv5izQe(VQ3JTpV4nNou-fK?%`+469hQ7P}y-XkOIWf%nmEd>t zYf0y3PWFi}cDK!bx%b&Jo1Li{FJ>_t{I6YOSh7~z*Zk?9$`33_ymxM$*?amtXvn0zxSFde7 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LinkCommand Member List
+
+
+ +

This is the complete list of members for LinkCommand, including all inherited members.

+ + + + + + + + + + + + +
clips (defined in LinkCommand)LinkCommand
doRedo() override (defined in LinkCommand)LinkCommandvirtual
doUndo() override (defined in LinkCommand)LinkCommandvirtual
link (defined in LinkCommand)LinkCommand
LinkCommand() (defined in LinkCommand)LinkCommand
old_links (defined in LinkCommand)LinkCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
s (defined in LinkCommand)LinkCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_link_command.html b/docs/html/class_link_command.html new file mode 100644 index 000000000..c8dec0e89 --- /dev/null +++ b/docs/html/class_link_command.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: LinkCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for LinkCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Public Attributes

+Sequences
 
+QVector< int > clips
 
+bool link
 
+ + + +

+Private Attributes

+QVector< QVector< int > > old_links
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_link_command.png b/docs/html/class_link_command.png new file mode 100644 index 0000000000000000000000000000000000000000..581b7b64a94488fd5a818060fc1b560933f32720 GIT binary patch literal 679 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0nWu|mNCo5DxrzNt6nGrsvy=Y+x3_Z- zJaABU@4Yhp*?twu0jGq6_A4t1F(;*oIj%Z$M&?h?t5B8KpMR`geXA}qEv>A7)1Fm) zhp(@4ymID^_PJHRZkSJg%5d9on|XwL=%#+}V;5I8n*DChdVT$#V9vS!w=y@&%nkf@ zJUG_IYU<1{xikJQ%bI2#5`DKOV5|7Q>#GuPwR7c|Wf!pp8o#_<{q4o>RptTa`Pv(P z{`uybbZwhyK+rMKjI?iimz+9t2JD<8t6W^17%I;32sqElns+#+aMe+fr(7X_FLC*Z zHnfK@T6l;yG^0^h@0<7r^Z2YZ^y+;IqXuwEecuSQOK^Dn6=lCDVrqS`6$fnF`RTRlkGViVs zO3U7_HDxK7y?yTSRU3cLe7!8IQfJ}ygtuFl>ugT_^x}$xq;25aNlI%z>h8!5vtGVt z(VogxYL9(cFKrLLc9^?n*{xT{mP*AdoQN)-zv`s*d9E#QMgFg_diU^4-S6_P;!;l6 uuQ}{(k{0FoV7r9tfa59#8E|0#U=H*MvUOhhFbtTg7(8A5T-G@yGywqOYe6&s literal 0 HcmV?d00001 diff --git a/docs/html/class_load_dialog-members.html b/docs/html/class_load_dialog-members.html new file mode 100644 index 000000000..ccadfebcd --- /dev/null +++ b/docs/html/class_load_dialog-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LoadDialog Member List
+
+
+ +

This is the complete list of members for LoadDialog, including all inherited members.

+ + + + + + + + + +
bar (defined in LoadDialog)LoadDialogprivate
cancel() (defined in LoadDialog)LoadDialogprivateslot
cancel_button (defined in LoadDialog)LoadDialogprivate
die() (defined in LoadDialog)LoadDialogprivateslot
hboxLayout (defined in LoadDialog)LoadDialogprivate
LoadDialog(QWidget *parent, bool autorecovery) (defined in LoadDialog)LoadDialog
lt (defined in LoadDialog)LoadDialogprivate
thread_done() (defined in LoadDialog)LoadDialogprivateslot
+ + + + diff --git a/docs/html/class_load_dialog.html b/docs/html/class_load_dialog.html new file mode 100644 index 000000000..4affbe4e8 --- /dev/null +++ b/docs/html/class_load_dialog.html @@ -0,0 +1,125 @@ + + + + + + + +Olive: LoadDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for LoadDialog:
+
+
+ +
+ + + + +

+Public Member Functions

LoadDialog (QWidget *parent, bool autorecovery)
 
+ + + + + + + +

+Private Slots

+void cancel ()
 
+void die ()
 
+void thread_done ()
 
+ + + + + + + + + +

+Private Attributes

+QProgressBar * bar
 
+QPushButton * cancel_button
 
+QHBoxLayout * hboxLayout
 
+LoadThreadlt
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_load_dialog.png b/docs/html/class_load_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..f7063f32d0795d7db87b1b8e9ea9faeea2bdaa72 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^K0qA6!3-o@Vv~OYDTx4|5ZC|z{{xvX-h3_XKQsZz z0^aZ$9(?|Hs~3 zoGJ@fI>y~$ow}?nyZ8xvQt!;jDF&Wh7n?jU&8XT?tKWXskJs~3cxl4(pVAp@VRh=0 z_da@}w0im(=C`e)m#)rk{kq}YsaG4fo%M|PRkY=0L+Lh4`^}dws_)#H{&WAuT(3#N zi3ZQlsGMAQ>1|b$N@mkQ}w)TXLG1DvyF2P;!~@x2ZFkDubsl$=k*M&F90xJ}JK9LwxG)tHO(_ zHcW~*TeqOqbfWh;?lo(lghjG{TfFJ~nco|XAGO(@jh_A3xY{i)E$m&;=CgCk_NQBZ y+UMJl*?O?bn0ZF<%d)-c42QegX3k`N$6* literal 0 HcmV?d00001 diff --git a/docs/html/class_load_thread-members.html b/docs/html/class_load_thread-members.html new file mode 100644 index 000000000..a4abebe3c --- /dev/null +++ b/docs/html/class_load_thread-members.html @@ -0,0 +1,119 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LoadThread Member List
+
+
+ +

This is the complete list of members for LoadThread, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
autorecovery (defined in LoadThread)LoadThreadprivate
cancel() (defined in LoadThread)LoadThread
cancelled (defined in LoadThread)LoadThreadprivate
create_dual_transition(const TransitionData *td, Clip *primary, Clip *secondary, const EffectMeta *meta) (defined in LoadThread)LoadThreadprivateslot
create_effect_ui(QXmlStreamReader *stream, Clip *c, int type, const QString *effect_name, const EffectMeta *meta, long effect_length, bool effect_enabled) (defined in LoadThread)LoadThreadprivateslot
current_element_count (defined in LoadThread)LoadThreadprivate
error() (defined in LoadThread)LoadThreadsignal
error_func() (defined in LoadThread)LoadThreadprivateslot
error_str (defined in LoadThread)LoadThreadprivate
find_loaded_folder_by_id(int id) (defined in LoadThread)LoadThreadprivate
internal_proj_dir (defined in LoadThread)LoadThreadprivate
internal_proj_url (defined in LoadThread)LoadThreadprivate
is_element(QXmlStreamReader &stream) (defined in LoadThread)LoadThreadprivate
ld (defined in LoadThread)LoadThreadprivate
load_effect(QXmlStreamReader &stream, Clip *c) (defined in LoadThread)LoadThreadprivate
load_worker(QFile &f, QXmlStreamReader &stream, int type) (defined in LoadThread)LoadThreadprivate
loaded_clips (defined in LoadThread)LoadThreadprivate
loaded_folders (defined in LoadThread)LoadThreadprivate
loaded_media_items (defined in LoadThread)LoadThreadprivate
loaded_sequences (defined in LoadThread)LoadThreadprivate
LoadThread(LoadDialog *l, bool a) (defined in LoadThread)LoadThread
mutex (defined in LoadThread)LoadThreadprivate
open_seq (defined in LoadThread)LoadThreadprivate
proj_dir (defined in LoadThread)LoadThreadprivate
question_btn (defined in LoadThread)LoadThreadprivate
question_func(const QString &title, const QString &text, int buttons) (defined in LoadThread)LoadThreadprivateslot
read_next(QXmlStreamReader &stream) (defined in LoadThread)LoadThreadprivate
read_next_start_element(QXmlStreamReader &stream) (defined in LoadThread)LoadThreadprivate
report_progress(int p) (defined in LoadThread)LoadThreadsignal
run() (defined in LoadThread)LoadThread
show_err (defined in LoadThread)LoadThreadprivate
start_create_dual_transition(const TransitionData *td, Clip *primary, Clip *secondary, const EffectMeta *meta) (defined in LoadThread)LoadThreadsignal
start_create_effect_ui(QXmlStreamReader *stream, Clip *c, int type, const QString *effect_name, const EffectMeta *meta, long effect_length, bool effect_enabled) (defined in LoadThread)LoadThreadsignal
start_question(const QString &title, const QString &text, int buttons) (defined in LoadThread)LoadThreadsignal
success() (defined in LoadThread)LoadThreadsignal
success_func() (defined in LoadThread)LoadThreadprivateslot
total_element_count (defined in LoadThread)LoadThreadprivate
update_current_element_count(QXmlStreamReader &stream) (defined in LoadThread)LoadThreadprivate
waitCond (defined in LoadThread)LoadThreadprivate
xml_error (defined in LoadThread)LoadThreadprivate
+ + + + diff --git a/docs/html/class_load_thread.html b/docs/html/class_load_thread.html new file mode 100644 index 000000000..155016c3b --- /dev/null +++ b/docs/html/class_load_thread.html @@ -0,0 +1,229 @@ + + + + + + + +Olive: LoadThread Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for LoadThread:
+
+
+ +
+ + + + + + + + + + + + + + +

+Signals

+void start_question (const QString &title, const QString &text, int buttons)
 
+void success ()
 
+void error ()
 
+void start_create_effect_ui (QXmlStreamReader *stream, Clip *c, int type, const QString *effect_name, const EffectMeta *meta, long effect_length, bool effect_enabled)
 
+void start_create_dual_transition (const TransitionData *td, Clip *primary, Clip *secondary, const EffectMeta *meta)
 
+void report_progress (int p)
 
+ + + + + + + +

+Public Member Functions

LoadThread (LoadDialog *l, bool a)
 
+void run ()
 
+void cancel ()
 
+ + + + + + + + + + + +

+Private Slots

+void question_func (const QString &title, const QString &text, int buttons)
 
+void error_func ()
 
+void success_func ()
 
+void create_effect_ui (QXmlStreamReader *stream, Clip *c, int type, const QString *effect_name, const EffectMeta *meta, long effect_length, bool effect_enabled)
 
+void create_dual_transition (const TransitionData *td, Clip *primary, Clip *secondary, const EffectMeta *meta)
 
+ + + + + + + + + + + + + + + +

+Private Member Functions

+bool load_worker (QFile &f, QXmlStreamReader &stream, int type)
 
+void load_effect (QXmlStreamReader &stream, Clip *c)
 
+void read_next (QXmlStreamReader &stream)
 
+void read_next_start_element (QXmlStreamReader &stream)
 
+void update_current_element_count (QXmlStreamReader &stream)
 
+bool is_element (QXmlStreamReader &stream)
 
+Mediafind_loaded_folder_by_id (int id)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+LoadDialogld
 
+bool autorecovery
 
+Sequenceopen_seq
 
+QVector< Media * > loaded_media_items
 
+QDir proj_dir
 
+QDir internal_proj_dir
 
+QString internal_proj_url
 
+bool show_err
 
+QString error_str
 
+QVector< Media * > loaded_folders
 
+QVector< Clip * > loaded_clips
 
+QVector< Media * > loaded_sequences
 
+int current_element_count
 
+int total_element_count
 
+QMutex mutex
 
+QWaitCondition waitCond
 
+bool cancelled
 
+bool xml_error
 
+QMessageBox::StandardButton question_btn
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_load_thread.png b/docs/html/class_load_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..11ca4fd77fabfc74e48d54af199d8ac1116f61eb GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J8eJzX3_Dj46+J-w+#frr&v`uzX@A3GG9 znESlUw(EsnK6ZSj*#xcYGiFvcc}|iK*6>W;(vldqvSssY^Lg{lT5k7NY`2)YL~MWS z%U=a+ZQqqGtNxz3)EVcc<)=|SiAg2*|&_YPfso?RmTuTj%q@qj`w zhruxsrXIsqhGZYb0}{a;7ml4dBg}K4Uz0^bnS1v=)57eUo1dd2WEp0CX<0aRQ^=tb zfeQ2ry+qs?6-uqsB(EeA!&$xQ$ zt;5N@zrQ4{(S7se*>T2%DIlZk?arQw`N6R6g?@nhZ7x<|Kr(o``njxgN@xNAH+Hgw literal 0 HcmV?d00001 diff --git a/docs/html/class_logarithmic_fade_transition-members.html b/docs/html/class_logarithmic_fade_transition-members.html new file mode 100644 index 000000000..68f30c984 --- /dev/null +++ b/docs/html/class_logarithmic_fade_transition-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LogarithmicFadeTransition Member List
+
+
+ +

This is the complete list of members for LogarithmicFadeTransition, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c, Clip *s) (defined in Transition)Transition
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
get_length() (defined in Transition)Transition
get_true_length() (defined in Transition)Transition
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
LogarithmicFadeTransition(Clip *c, Clip *s, const EffectMeta *em) (defined in LogarithmicFadeTransition)LogarithmicFadeTransition
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in LogarithmicFadeTransition)LogarithmicFadeTransitionvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
secondary_clip (defined in Transition)Transition
set_enabled(bool b) (defined in Effect)Effect
set_length(long l) (defined in Transition)Transition
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_logarithmic_fade_transition.html b/docs/html/class_logarithmic_fade_transition.html new file mode 100644 index 000000000..12aa217ca --- /dev/null +++ b/docs/html/class_logarithmic_fade_transition.html @@ -0,0 +1,280 @@ + + + + + + + +Olive: LogarithmicFadeTransition Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
LogarithmicFadeTransition Class Reference
+
+
+
+Inheritance diagram for LogarithmicFadeTransition:
+
+
+ + +Transition +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

LogarithmicFadeTransition (Clip *c, Clip *s, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Transition
Transition (Clip *c, Clip *s, const EffectMeta *em)
 
+int copy (Clip *c, Clip *s)
 
+void set_length (long l)
 
+long get_true_length ()
 
+long get_length ()
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Transition
+Clipsecondary_clip
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_logarithmic_fade_transition.png b/docs/html/class_logarithmic_fade_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..80b04132b877769cf414999d8e81c7d8632970bd GIT binary patch literal 995 zcmeAS@N?(olHy`uVBq!ia0vp^3xW6m2Q!e2R{vZLq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0i#%N%Ln;{G&V60<%7BOM`uy}o-|HU> z7b)@?iUdTJum$D|#}|l2HtnAhOJ3$b0QX1?TkszP5UObT>9MJ)SP-lM!NQ#$mu}CQ(Jp&Zgy~L6hPX>%Xd;beHm))Ne9HMLtu*(+*@)FVBIMJPZpt^DTHTiXN8kYdR?U zSUOFYxxy2lBawVivp8|>*0we+Phcc?ewqk$^JCw`M*CG(p0_YH_bmEY$5UVPOR`E` zVwz@1u*vb;nQv~*e3qxC`qK1H+v!NZc|k9?rU6}dMELnVv@r?HfJVr=Hv6tV z?q_T{xv%wGug{HHEwsS9{#nu6ubmIi zp4faY@3QIjZ!a$xzR_#AwB_(;c_}^r+EW{JyVWGFyX^dTUpK=4r|;oo?=lZR=G$%a z#zQ3I_T{$S=YLLqc)9Y%Zw}U5W!DRAFF32d`?P&?{`zUNkD70-i7l{rTB|G1%lM7u z=f<7MJGi+HJl`RHxP5;hL;bPlU^Wg1XhK|^sJYbTnfzAsMU%WZXT||@B!j1`pUXO@ GgeCx|*S*gG literal 0 HcmV?d00001 diff --git a/docs/html/class_main_window-members.html b/docs/html/class_main_window-members.html new file mode 100644 index 000000000..cb1814dc6 --- /dev/null +++ b/docs/html/class_main_window-members.html @@ -0,0 +1,146 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MainWindow Member List
+
+
+ +

This is the complete list of members for MainWindow, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
autoscale_by_default (defined in MainWindow)MainWindowprivate
clear_open_recent_action (defined in MainWindow)MainWindowprivate
closeEvent(QCloseEvent *) overrideMainWindowprotectedvirtual
drop_frame_action (defined in MainWindow)MainWindowprivate
edit_tool_action (defined in MainWindow)MainWindowprivate
edit_tool_also_seeks (defined in MainWindow)MainWindowprivate
edit_tool_selects_links (defined in MainWindow)MainWindowprivate
editMenu_About_To_Be_Shown()MainWindowprivateslot
enable_audio_scrubbing (defined in MainWindow)MainWindowprivate
enable_drag_files_to_timeline (defined in MainWindow)MainWindowprivate
enable_drop_on_media_to_replace (defined in MainWindow)MainWindowprivate
enable_hover_focus (defined in MainWindow)MainWindowprivate
enable_seek_to_import (defined in MainWindow)MainWindowprivate
fileMenu_About_To_Be_Shown()MainWindowprivateslot
finished_first_paint()MainWindowsignal
first_show (defined in MainWindow)MainWindowprivate
frames_action (defined in MainWindow)MainWindowprivate
full_screen (defined in MainWindow)MainWindowprivate
hand_tool_action (defined in MainWindow)MainWindowprivate
load_css_from_file(const QString &fn)MainWindow
load_shortcuts(const QString &fn)MainWindow
loop_action (defined in MainWindow)MainWindowprivate
MainWindow(QWidget *parent) (defined in MainWindow)MainWindowexplicit
maximize_panel()MainWindowprivateslot
milliseconds_action (defined in MainWindow)MainWindowprivate
no_autoscroll (defined in MainWindow)MainWindowprivate
nondrop_frame_action (defined in MainWindow)MainWindowprivate
open_recent (defined in MainWindow)MainWindowprivate
page_autoscroll (defined in MainWindow)MainWindowprivate
paintEvent(QPaintEvent *) overrideMainWindowprotectedvirtual
playbackMenu_About_To_Be_Shown()MainWindowprivateslot
pointer_tool_action (defined in MainWindow)MainWindowprivate
razor_tool_action (defined in MainWindow)MainWindowprivate
rectified_waveforms (defined in MainWindow)MainWindowprivate
redo_action (defined in MainWindow)MainWindowprivate
reset_layout()MainWindowprivateslot
ripple_tool_action (defined in MainWindow)MainWindowprivate
save_shortcuts(const QString &fn)MainWindow
scroll_wheel_zooms (defined in MainWindow)MainWindowprivate
seek_also_selects (defined in MainWindow)MainWindowprivate
seek_to_end_of_pastes (defined in MainWindow)MainWindowprivate
selecting_also_seeks (defined in MainWindow)MainWindowprivate
set_name_and_marker (defined in MainWindow)MainWindowprivate
setup_layout(bool reset)MainWindowprivate
setup_menus()MainWindowprivate
show_all (defined in MainWindow)MainWindowprivate
slide_tool_action (defined in MainWindow)MainWindowprivate
slip_tool_action (defined in MainWindow)MainWindowprivate
smooth_autoscroll (defined in MainWindow)MainWindowprivate
snap_toggle (defined in MainWindow)MainWindowprivate
temp_panel_state (defined in MainWindow)MainWindowprivate
title_safe_169 (defined in MainWindow)MainWindowprivate
title_safe_43 (defined in MainWindow)MainWindowprivate
title_safe_custom (defined in MainWindow)MainWindowprivate
title_safe_default (defined in MainWindow)MainWindowprivate
title_safe_off (defined in MainWindow)MainWindowprivate
toggle_full_screen()MainWindowslot
toggle_panel_visibility()MainWindowprivateslot
toolMenu_About_To_Be_Shown()MainWindowprivateslot
track_lines (defined in MainWindow)MainWindowprivate
transition_tool_action (defined in MainWindow)MainWindowprivate
undo_action (defined in MainWindow)MainWindowprivate
updateTitle()MainWindow
viewMenu_About_To_Be_Shown()MainWindowprivateslot
window_menu (defined in MainWindow)MainWindowprivate
windowMenu_About_To_Be_Shown()MainWindowprivateslot
~MainWindow() override (defined in MainWindow)MainWindowvirtual
+ + + + diff --git a/docs/html/class_main_window.html b/docs/html/class_main_window.html new file mode 100644 index 000000000..403f3d58c --- /dev/null +++ b/docs/html/class_main_window.html @@ -0,0 +1,846 @@ + + + + + + + +Olive: MainWindow Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for MainWindow:
+
+
+ +
+ + + + + +

+Public Slots

void toggle_full_screen ()
 Toggles full screen mode. More...
 
+ + + + +

+Signals

void finished_first_paint ()
 Signal emitted once when the main window has finished initializing. More...
 
+ + + + + + + + + + + + + + + +

+Public Member Functions

MainWindow (QWidget *parent)
 
void updateTitle ()
 Update window title. More...
 
void load_shortcuts (const QString &fn)
 Load shortcut file. More...
 
void save_shortcuts (const QString &fn)
 Save shortcut file. More...
 
void load_css_from_file (const QString &fn)
 Load a CSS/QSS style from file to customize Olive's interface. More...
 
+ + + + + + + +

+Protected Member Functions

virtual void closeEvent (QCloseEvent *) override
 Close event. More...
 
virtual void paintEvent (QPaintEvent *) override
 Paint event. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Slots

void maximize_panel ()
 Maximizes the currently hovered panel. More...
 
void reset_layout ()
 Reset panel layout to default. More...
 
void fileMenu_About_To_Be_Shown ()
 Function to prepare File menu. More...
 
void editMenu_About_To_Be_Shown ()
 Function to prepare Edit menu. More...
 
void windowMenu_About_To_Be_Shown ()
 Function to prepare Window menu. More...
 
void playbackMenu_About_To_Be_Shown ()
 Function to prepare Playback menu. More...
 
void viewMenu_About_To_Be_Shown ()
 Function to prepare View menu. More...
 
void toolMenu_About_To_Be_Shown ()
 Function to prepare Tools menu. More...
 
void toggle_panel_visibility ()
 Toggle whether a panel is visible or not. More...
 
+ + + + + + + +

+Private Member Functions

void setup_layout (bool reset)
 Internal function for setting the panel layout to a predetermined preset. More...
 
void setup_menus ()
 Initialize menu bar menus and items. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QMenu * window_menu
 
+QMenu * open_recent
 
+QAction * clear_open_recent_action
 
+QAction * track_lines
 
+QAction * frames_action
 
+QAction * drop_frame_action
 
+QAction * nondrop_frame_action
 
+QAction * milliseconds_action
 
+QAction * no_autoscroll
 
+QAction * page_autoscroll
 
+QAction * smooth_autoscroll
 
+QAction * title_safe_off
 
+QAction * title_safe_default
 
+QAction * title_safe_43
 
+QAction * title_safe_169
 
+QAction * title_safe_custom
 
+QAction * full_screen
 
+QAction * show_all
 
+QAction * pointer_tool_action
 
+QAction * edit_tool_action
 
+QAction * ripple_tool_action
 
+QAction * razor_tool_action
 
+QAction * slip_tool_action
 
+QAction * slide_tool_action
 
+QAction * hand_tool_action
 
+QAction * transition_tool_action
 
+QAction * snap_toggle
 
+QAction * selecting_also_seeks
 
+QAction * edit_tool_also_seeks
 
+QAction * edit_tool_selects_links
 
+QAction * seek_to_end_of_pastes
 
+QAction * scroll_wheel_zooms
 
+QAction * rectified_waveforms
 
+QAction * enable_drag_files_to_timeline
 
+QAction * autoscale_by_default
 
+QAction * enable_seek_to_import
 
+QAction * enable_audio_scrubbing
 
+QAction * enable_drop_on_media_to_replace
 
+QAction * enable_hover_focus
 
+QAction * set_name_and_marker
 
+QAction * loop_action
 
+QAction * seek_also_selects
 
+QAction * undo_action
 
+QAction * redo_action
 
+QByteArray temp_panel_state
 
+bool first_show
 
+

Member Function Documentation

+ +

◆ closeEvent()

+ +
+
+ + + + + +
+ + + + + + + + +
void MainWindow::closeEvent (QCloseEvent * e)
+
+overrideprotectedvirtual
+
+ +

Close event.

+

Confirms whether the project can be closed, and if so performs various clean-up functions before the application exits. It's preferable to call clean-up functions here rather than in the destructor because this will get called first.

+ +
+
+ +

◆ editMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::editMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare Edit menu.

+

Primarily used to set the enabled state on Undo and Redo depending if there are undos/redos available.

+ +
+
+ +

◆ fileMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::fileMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare File menu.

+

Primarily used to populate the Open Recent Projects menu.

+ +
+
+ +

◆ finished_first_paint

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::finished_first_paint ()
+
+signal
+
+ +

Signal emitted once when the main window has finished initializing.

+

Emitted the first time paintEvent runs. Connect this to functions that must be completed post-initialization.

+ +
+
+ +

◆ load_css_from_file()

+ +
+
+ + + + + + + + +
void MainWindow::load_css_from_file (const QString & fn)
+
+ +

Load a CSS/QSS style from file to customize Olive's interface.

+
Parameters
+ + +
fnURL to load the CSS file from.
+
+
+ +
+
+ +

◆ load_shortcuts()

+ +
+
+ + + + + + + + +
void MainWindow::load_shortcuts (const QString & fn)
+
+ +

Load shortcut file.

+

Loads a shortcut configuration from file and sets Olive to use them.

+
Parameters
+ + +
fnURL of the shortcut file to be loaded
+
+
+ +
+
+ +

◆ maximize_panel

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::maximize_panel ()
+
+privateslot
+
+ +

Maximizes the currently hovered panel.

+

Saves the current state of the panels/dock widgets and removes all except the currently hovered panel, effectively maximizing the panel to the entire window.

+ +
+
+ +

◆ paintEvent()

+ +
+
+ + + + + +
+ + + + + + + + +
void MainWindow::paintEvent (QPaintEvent * event)
+
+overrideprotectedvirtual
+
+ +

Paint event.

+

Overridden to provide the finished_first_paint() signal.

+ +
+
+ +

◆ playbackMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::playbackMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare Playback menu.

+

Primarily used to set the checked state on the "Loop" item.

+ +
+
+ +

◆ reset_layout

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::reset_layout ()
+
+privateslot
+
+ +

Reset panel layout to default.

+

Resets the current panel layout to default. Doesn't save the current layout.

+ +
+
+ +

◆ save_shortcuts()

+ +
+
+ + + + + + + + +
void MainWindow::save_shortcuts (const QString & fn)
+
+ +

Save shortcut file.

+

Saves the current shortcut configuration to file. Only saves shortcuts that have been changed from default.

+
Parameters
+ + +
fnURL to save the shortcut file to.
+
+
+ +
+
+ +

◆ setup_layout()

+ +
+
+ + + + + +
+ + + + + + + + +
void MainWindow::setup_layout (bool reset)
+
+private
+
+ +

Internal function for setting the panel layout to a predetermined preset.

+

Resets layout to default and optionally loads a layout from file. If loading from file, this function will always load from get_config_path() + "/layout".

+
Parameters
+ + +
resetTRUE if this function should just reset the current layout. FALSE if it should load from the aforementioned layout file.
+
+
+ +
+
+ +

◆ setup_menus()

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::setup_menus ()
+
+private
+
+ +

Initialize menu bar menus and items.

+

Internal initialization function for all menus and menu items in the main window. Called once from the MainWindow() constructor.

+ +
+
+ +

◆ toggle_full_screen

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::toggle_full_screen ()
+
+slot
+
+ +

Toggles full screen mode.

+

Toggles the main window between full screen and windowed modes.

+ +
+
+ +

◆ toggle_panel_visibility

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::toggle_panel_visibility ()
+
+privateslot
+
+ +

Toggle whether a panel is visible or not.

+

Assumes the sender() QAction has a pointer to a QDockWidget in its data variable. Casts it and toggles its visibility.

+ +
+
+ +

◆ toolMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::toolMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare Tools menu.

+

Primarily used to set the checked state on various settings available from the Tools menu.

+ +
+
+ +

◆ updateTitle()

+ +
+
+ + + + + + + +
void MainWindow::updateTitle ()
+
+ +

Update window title.

+

Updates the window title to reflect the current project filename. Call if the project filename changes.

+

NOTE: It's recommended to use update_project_filename() from Olive::Global to update the filename completely instead of calling this function directly (update_project_filename() calls this function in the process).

+ +
+
+ +

◆ viewMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::viewMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare View menu.

+

Primarily used to set the checked state of various options in the view menu (e.g. title safe area, timecode units, etc.)

+ +
+
+ +

◆ windowMenu_About_To_Be_Shown

+ +
+
+ + + + + +
+ + + + + + + +
void MainWindow::windowMenu_About_To_Be_Shown ()
+
+privateslot
+
+ +

Function to prepare Window menu.

+

Primarily used to set the checked state of menu items corresponding to the panels that are currently visible.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_main_window.png b/docs/html/class_main_window.png new file mode 100644 index 0000000000000000000000000000000000000000..26ef7f61d62190198febd9fb74da6d63e7509592 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^aX=iv!3-pqvl;0CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^bWaz@kP61Pa|4SGEAY6?uiNx}e_^(C zkIR}RFI{H7oMI@Q5+K*TlsO?SOxF6=jR zdEm^3^4Yd~8^DVV6IqgdPx~4BF&wi+? zdGU~U(4wk6Gb3j*#9icF;J5Y1?X^?lyZ|J41leowKOoWkWp%qme84KCdL6EYq$ z3hCN7ENW%<__F^)T3YEL2B6~^I_iwa7zA_u*dYF_dT`Q3XBE@Pgg&ebxsLQ E06|pWxc~qF literal 0 HcmV?d00001 diff --git a/docs/html/class_media-members.html b/docs/html/class_media-members.html new file mode 100644 index 000000000..889d418d7 --- /dev/null +++ b/docs/html/class_media-members.html @@ -0,0 +1,116 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Media Member List
+
+
+ +

This is the complete list of members for Media, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
appendChild(Media *child) (defined in Media)Media
child(int row) (defined in Media)Media
childCount() const (defined in Media)Media
children (defined in Media)Mediaprivate
columnCount() const (defined in Media)Media
data(int column, int role) (defined in Media)Media
folder_name (defined in Media)Mediaprivate
get_frame_rate(int stream=-1) (defined in Media)Media
get_markers() (defined in Media)Media
get_name() (defined in Media)Media
get_sampling_rate(int stream=-1) (defined in Media)Media
get_type() (defined in Media)Media
icon (defined in Media)Mediaprivate
Media(Media *iparent) (defined in Media)Media
object (defined in Media)Mediaprivate
parent (defined in Media)Mediaprivate
parentItem() (defined in Media)Media
removeChild(int i) (defined in Media)Media
root (defined in Media)Media
row() const (defined in Media)Media
set_folder() (defined in Media)Media
set_footage(Footage *f) (defined in Media)Media
set_icon(const QIcon &ico) (defined in Media)Media
set_name(const QString &n) (defined in Media)Media
set_parent(Media *p) (defined in Media)Media
set_sequence(Sequence *s) (defined in Media)Media
setData(int col, const QVariant &value) (defined in Media)Media
temp_id (defined in Media)Media
temp_id2 (defined in Media)Media
throbber (defined in Media)Media
to_footage() (defined in Media)Media
to_object() (defined in Media)Media
to_sequence() (defined in Media)Media
tooltip (defined in Media)Mediaprivate
type (defined in Media)Mediaprivate
update_tooltip(const QString &error=0) (defined in Media)Media
~Media() (defined in Media)Media
+ + + + diff --git a/docs/html/class_media.html b/docs/html/class_media.html new file mode 100644 index 000000000..762b7e895 --- /dev/null +++ b/docs/html/class_media.html @@ -0,0 +1,203 @@ + + + + + + + +Olive: Media Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Media (Media *iparent)
 
+Footageto_footage ()
 
+Sequenceto_sequence ()
 
+void set_footage (Footage *f)
 
+void set_sequence (Sequence *s)
 
+void set_folder ()
 
+void set_icon (const QIcon &ico)
 
+void set_parent (Media *p)
 
+void update_tooltip (const QString &error=0)
 
+void * to_object ()
 
+int get_type ()
 
+const QString & get_name ()
 
+void set_name (const QString &n)
 
+double get_frame_rate (int stream=-1)
 
+int get_sampling_rate (int stream=-1)
 
+void appendChild (Media *child)
 
+bool setData (int col, const QVariant &value)
 
+Mediachild (int row)
 
+int childCount () const
 
+int columnCount () const
 
+QVariant data (int column, int role)
 
+int row () const
 
+MediaparentItem ()
 
+void removeChild (int i)
 
+QVector< Marker > & get_markers ()
 
+ + + + + + + + + +

+Public Attributes

+MediaThrobberthrobber
 
+bool root
 
+int temp_id
 
+int temp_id2
 
+ + + + + + + + + + + + + + + +

+Private Attributes

+int type
 
+void * object
 
+QList< Media * > children
 
+Mediaparent
 
+QString folder_name
 
+QString tooltip
 
+QIcon icon
 
+
The documentation for this class was generated from the following files:
    +
  • project/media.h
  • +
  • project/media.cpp
  • +
+
+ + + + diff --git a/docs/html/class_media_move-members.html b/docs/html/class_media_move-members.html new file mode 100644 index 000000000..212ad5d3a --- /dev/null +++ b/docs/html/class_media_move-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MediaMove Member List
+
+
+ +

This is the complete list of members for MediaMove, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in MediaMove)MediaMovevirtual
doUndo() override (defined in MediaMove)MediaMovevirtual
froms (defined in MediaMove)MediaMoveprivate
items (defined in MediaMove)MediaMove
MediaMove() (defined in MediaMove)MediaMove
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
to (defined in MediaMove)MediaMove
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_media_move.html b/docs/html/class_media_move.html new file mode 100644 index 000000000..0b8b4efeb --- /dev/null +++ b/docs/html/class_media_move.html @@ -0,0 +1,129 @@ + + + + + + + +Olive: MediaMove Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for MediaMove:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Public Attributes

+QVector< Media * > items
 
+Mediato
 
+ + + +

+Private Attributes

+QVector< Media * > froms
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_media_move.png b/docs/html/class_media_move.png new file mode 100644 index 0000000000000000000000000000000000000000..48e5ab86fc251fd02f11bfd3dae06a8c7815febb GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0ou`XqNCo5Dxo;<}R^V~)f7Da?-+W)# zlzy(ayIyW8FMCwLqFB&!?4O%U3SY;}n>H*nS63oOAwo&m9fsuW!s(UC~=>6Y=){#-L44-15KO zj^$nDma3Nf^4z`^s|wn+o}QHst$lDmtaSO_lLxXkX8EOG@wrtr_wMg?r#Pn^ea*AR zZojd|nOB?mWrBZ6W~6=F+;Zy78OIf8&d8hz?d(V z!gFoHvj5!kHolrMC+>U2%eh;wuDLZ|e!J0*t-oJYYXx5A%RTeL;_oV}HGM#BKNh{R z*yz5_jMQe>Zy?6OlBqnkbi!Z zUcGs}FV}zRVtFQmqy=7c-M{Yn)h*B<_&&6sUukQ9?9#q$kF*8yvI(=w_2!)loGUwb z!YZbWoeNjht?pm-N$I8j(#Yp;PALBTa_(XNDlab^*#{o17n0|^nVwwvZ|yqwY5CvF zzRn5AWt+x(#j;%O>0BO`9~KLl3IwzmfR0yE3jV>aur0{2KD;&sn7SA|UHx3vIVCg! E02Qx0>;M1& literal 0 HcmV?d00001 diff --git a/docs/html/class_media_properties_dialog-members.html b/docs/html/class_media_properties_dialog-members.html new file mode 100644 index 000000000..5cab326d9 --- /dev/null +++ b/docs/html/class_media_properties_dialog-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MediaPropertiesDialog Member List
+
+
+ +

This is the complete list of members for MediaPropertiesDialog, including all inherited members.

+ + + + + + + + + +
accept() (defined in MediaPropertiesDialog)MediaPropertiesDialogprivateslot
conform_fr (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
interlacing_box (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
item (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
MediaPropertiesDialog(QWidget *parent, Media *i) (defined in MediaPropertiesDialog)MediaPropertiesDialog
name_box (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
premultiply_alpha_setting (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
track_list (defined in MediaPropertiesDialog)MediaPropertiesDialogprivate
+ + + + diff --git a/docs/html/class_media_properties_dialog.html b/docs/html/class_media_properties_dialog.html new file mode 100644 index 000000000..d235adf63 --- /dev/null +++ b/docs/html/class_media_properties_dialog.html @@ -0,0 +1,125 @@ + + + + + + + +Olive: MediaPropertiesDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MediaPropertiesDialog Class Reference
+
+
+
+Inheritance diagram for MediaPropertiesDialog:
+
+
+ +
+ + + + +

+Public Member Functions

MediaPropertiesDialog (QWidget *parent, Media *i)
 
+ + + +

+Private Slots

+void accept ()
 
+ + + + + + + + + + + + + +

+Private Attributes

+QComboBox * interlacing_box
 
+QLineEdit * name_box
 
+Mediaitem
 
+QListWidget * track_list
 
+QDoubleSpinBox * conform_fr
 
+QCheckBox * premultiply_alpha_setting
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_media_properties_dialog.png b/docs/html/class_media_properties_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..cb03cb13dad4661293faf2a08e0e454479eeb776 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^y+9nm!3-pY71+{%lth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C`QBN1gkP61Pb5BodG2n3JpS|z@|KrK! zNpX*QawBKWN-DhF!Q#h$K{qY!GRNd4o+2ibo@i&NoV+eMtNio&>swaztGwLfcR{3~ z@rmH9H~V8QY3W}wyn40h=e)OCvwAMAms|XC$2+Upv$n6j5^Qq%e52Q0$H!-`G}lh< z{&e!%p8QE~zs;PqqE@3{!I(f}ylub0H?&XIw0bFCOt>e50AcP{YdGuzmsK2T>D-eNAi!!Y?rV;F4m9cVvE`jgb6m zpLyoYGC?+jPN)(s6YUWG?RP?*UsW~4UwtcCW_FOlEp%3i?4{CjXB!6pzV^+ZEzbUO zx8q;E@QBa1oaoxmmp@%w;dt%J?1b2P3xiDkZ~pxDjwgFc)@z$tx79rSFWY8(`r~`~ zi-T2f)Zewi`ESe0(;x55$>j1ncgsrLnbYn<%7t(5)4Ib~uFu#tXLj%{>)CJTB_8{x z{q$mvu|=)%FTUEx>bbA0H{{=nD@j{b>2DUiW#&pFrMo_*vf)i{&x;)3jQyfEzx~*2 u=?39lk8)mpSKIdx?BnYtCTVG#U$F1&4V{~rt9t|($qb&ZelF{r5}E*4fC&o# literal 0 HcmV?d00001 diff --git a/docs/html/class_media_rename-members.html b/docs/html/class_media_rename-members.html new file mode 100644 index 000000000..995d601d7 --- /dev/null +++ b/docs/html/class_media_rename-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MediaRename Member List
+
+
+ +

This is the complete list of members for MediaRename, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in MediaRename)MediaRenamevirtual
doUndo() override (defined in MediaRename)MediaRenamevirtual
from (defined in MediaRename)MediaRenameprivate
item (defined in MediaRename)MediaRenameprivate
MediaRename(Media *iitem, QString to) (defined in MediaRename)MediaRename
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
to (defined in MediaRename)MediaRenameprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_media_rename.html b/docs/html/class_media_rename.html new file mode 100644 index 000000000..76127b63b --- /dev/null +++ b/docs/html/class_media_rename.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: MediaRename Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MediaRename Class Reference
+
+
+
+Inheritance diagram for MediaRename:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

MediaRename (Media *iitem, QString to)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Mediaitem
 
+QString from
 
+QString to
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_media_rename.png b/docs/html/class_media_rename.png new file mode 100644 index 0000000000000000000000000000000000000000..5e11e6ccd9cef13bd4410b9fd4511f04ac238ffd GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0i>HfYNCo5DxwrdP8}Kk3cRTd||MBHd zr|odid>#A#;;GPOJFT39E~mS=6giwZW27;4W@N+tK-$P5pLN>u>RHIs2RE zP2B#{i8H>Y&WdpAGrn-{!B3Fkeui-R7#rvYnqo_=Bfu2Yz)o z-Vnkd=*23qAcTPtjk;=g*nr2_5y|J?+8I!s+evX7uk`x$NKP)xLJOj=!qb3cSkvXV&J|J*$7E{*?+1J>I_R z>9Kh`AH9+f`MUY-A}6isjnTJxf81qWb+`IzYE1Cj+WC#;p{rKi_g)zi$~?s@)YM^J zmPDH(Ys2pz2FoWaj~Skwy1Z(}rkKuE_Olw7GIa!KH83n?;y|NTeG?Qs$;fyD4NP=O&y}Yp8w`Qv5wt|N3mJ_=3H`y8QP01#%OD*WN9?c_})4k6dkiqh7+gd5(Dp zO8-7d$@{x|)w}Jp%CeV#uIBpkG-zw(G~M5_zZ<9jG<&(oK4hzo#ohyVAKqEnuuewx zx80Ao`K9Z2*@V`s{^p5cs&U%oIepz%d5#aZQ@9ik%m)Si2mW`-K@n>ouILA*F$Pap KKbLh*2~7aO#!5^8 literal 0 HcmV?d00001 diff --git a/docs/html/class_media_throbber-members.html b/docs/html/class_media_throbber-members.html new file mode 100644 index 000000000..accbbb3a1 --- /dev/null +++ b/docs/html/class_media_throbber-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MediaThrobber Member List
+
+
+ +

This is the complete list of members for MediaThrobber, including all inherited members.

+ + + + + + + + + +
animation (defined in MediaThrobber)MediaThrobberprivate
animation_update() (defined in MediaThrobber)MediaThrobberprivateslot
animator (defined in MediaThrobber)MediaThrobberprivate
item (defined in MediaThrobber)MediaThrobberprivate
MediaThrobber(Media *) (defined in MediaThrobber)MediaThrobber
pixmap (defined in MediaThrobber)MediaThrobberprivate
start() (defined in MediaThrobber)MediaThrobberslot
stop(int, bool replace) (defined in MediaThrobber)MediaThrobberslot
+ + + + diff --git a/docs/html/class_media_throbber.html b/docs/html/class_media_throbber.html new file mode 100644 index 000000000..764c8eb3e --- /dev/null +++ b/docs/html/class_media_throbber.html @@ -0,0 +1,129 @@ + + + + + + + +Olive: MediaThrobber Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for MediaThrobber:
+
+
+ +
+ + + + + + +

+Public Slots

+void start ()
 
+void stop (int, bool replace)
 
+ + + +

+Public Member Functions

MediaThrobber (Media *)
 
+ + + +

+Private Slots

+void animation_update ()
 
+ + + + + + + + + +

+Private Attributes

+QPixmap pixmap
 
+int animation
 
+Mediaitem
 
+QTimer * animator
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_media_throbber.png b/docs/html/class_media_throbber.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca92ec760fc483ae8f6d17eb46865d3b713cf1d GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^$v_;y!3-p=xUH7}DTx4|5ZC|z{{xvX-h3_XKQsZz z0^WKS2zkP61Pb1!acR^VYZ*SG!u|M>Q4 z3T~RsxrJ7H&+O<`*uWMv-_Tf^N6piDCZFf4$J{dBp+|P#nIf|8m{G2KWa-~Zvp=Ek zmCxVaRi4j2@21eT8r96>mF`)U@jR149=6(O^_hQPwWhpaiP4XSWXp!g=}} zA}8~B6RJhsyX49yJAXFrdzyQB@AHSUHy`%P`(I|6KYe}<+mXGW0{3O@vS|_7v-yaT z9^d)uOJzCdk{>hZ1o6&R*2_+Dw7O-Gd{%CQ^6m$RXZL-2c6Be4PSDvsuPpf1&Sy`U zsQ&z7!Ijrq9bStg!#`KE7PP%&c=5PhCM_-bCv(mlYd?8!uM}VuFnGH9xvX + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MenuHelper Member List
+
+ + + + + diff --git a/docs/html/class_menu_helper.html b/docs/html/class_menu_helper.html new file mode 100644 index 000000000..fe9b3ee0c --- /dev/null +++ b/docs/html/class_menu_helper.html @@ -0,0 +1,514 @@ + + + + + + + +Olive: MenuHelper Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MenuHelper Class Reference
+
+
+
+Inheritance diagram for MenuHelper:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +

+Public Slots

void toggle_bool_action ()
 Sets a QAction's Boolean reference to the opposite of its current value. More...
 
void set_titlesafe_from_menu ()
 Set Title/Action Safe Area from QAction. More...
 
void set_autoscroll ()
 Set Autoscroll setting from QAction. More...
 
void menu_click_button ()
 Clicks a QPushButton referenced by a QAction when triggered. More...
 
void set_timecode_view ()
 Sets the current timecode setting. More...
 
void open_recent_from_menu ()
 Calls open_recent() in Olive::Global using the index from a QAction. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

void make_new_menu (QMenu *parent)
 Creates a menu of new items that can be created. More...
 
void make_inout_menu (QMenu *parent)
 Creates a menu of options for working with in/out points. More...
 
void make_clip_functions_menu (QMenu *parent)
 Creates a menu of clip functions. More...
 
void make_edit_functions_menu (QMenu *parent)
 Creates standard edit menu (cut, copy, paste, etc.) More...
 
void set_bool_action_checked (QAction *a)
 Sets the checked state of a menu item based on a Boolean variable. More...
 
void set_int_action_checked (QAction *a, const int &i)
 Sets the checked state of a menu item based on an integer variable. More...
 
void set_button_action_checked (QAction *a)
 Sets the checked state of a menu item based on a QPushButton. More...
 
+

Member Function Documentation

+ +

◆ make_clip_functions_menu()

+ +
+
+ + + + + + + + +
void MenuHelper::make_clip_functions_menu (QMenu * parent)
+
+ +

Creates a menu of clip functions.

+

Adds a set of clip functions including:

    +
  • Add Default Transition
  • +
  • Link/Unlink
  • +
  • Enable/Disable
  • +
  • Nest
  • +
+
Parameters
+ + +
parentThe menu to add items to.
+
+
+ +
+
+ +

◆ make_edit_functions_menu()

+ +
+
+ + + + + + + + +
void MenuHelper::make_edit_functions_menu (QMenu * parent)
+
+ +

Creates standard edit menu (cut, copy, paste, etc.)

+
Parameters
+ + +
parentThe menu to add items to.
+
+
+ +
+
+ +

◆ make_inout_menu()

+ +
+
+ + + + + + + + +
void MenuHelper::make_inout_menu (QMenu * parent)
+
+ +

Creates a menu of options for working with in/out points.

+

Adds a set of options for working with sequence/footage in/out points, e.g. setting in/out points, clearing in/out points, etc.

+
Parameters
+ + +
parentThe menu to add items to.
+
+
+ +
+
+ +

◆ make_new_menu()

+ +
+
+ + + + + + + + +
void MenuHelper::make_new_menu (QMenu * parent)
+
+ +

Creates a menu of new items that can be created.

+

Adds the full set of creatable items to a QMenu (e.g. new project, new sequence, new folder, etc.)

+
Parameters
+ + +
parentThe menu to add items to.
+
+
+ +
+
+ +

◆ menu_click_button

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::menu_click_button ()
+
+slot
+
+ +

Clicks a QPushButton referenced by a QAction when triggered.

+

Some menu items function largely as a proxy to a QPushButton. Assuming the QAction's data variable is a pointer to a QPushButton, this triggers a click() event on that QPushButton.

+ +
+
+ +

◆ open_recent_from_menu

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::open_recent_from_menu ()
+
+slot
+
+ +

Calls open_recent() in Olive::Global using the index from a QAction.

+

Assumes the sender() is a QAction with an integer as its data variable. The data variable is an index of the internal auto-recovery project list.

+ +
+
+ +

◆ set_autoscroll

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::set_autoscroll ()
+
+slot
+
+ +

Set Autoscroll setting from QAction.

+

Assumes the sender() is a QAction with an integer as its data variable. The data variable should be AUTOSCROLL_NO_SCROLL, AUTOSCROLL_PAGE_SCROLL (default) or AUTOSCROLL_SMOOTH_SCROLL.

+ +
+
+ +

◆ set_bool_action_checked()

+ +
+
+ + + + + + + + +
void MenuHelper::set_bool_action_checked (QAction * a)
+
+ +

Sets the checked state of a menu item based on a Boolean variable.

+

Many menu items simply toggle a Boolean variable. This is a convenience function, assuming the QAction's data variable is a pointer to a Boolean variable, that sets the checked state of the QAction to the enabled state of the Boolean. Used heavily in functions like toolMenu_About_To_Be_Shown()

+
Parameters
+ + +
aThe QAction to set the checked state of.
+
+
+ +
+
+ +

◆ set_button_action_checked()

+ +
+
+ + + + + + + + +
void MenuHelper::set_button_action_checked (QAction * a)
+
+ +

Sets the checked state of a menu item based on a QPushButton.

+

Some menu items function largely as a proxy to a QPushButton. Assuming the QAction's data variable is a pointer to a QPushButton, this sets a QAction's checked state to the checked state of the QPushButton.

+
Parameters
+ + +
a
+
+
+ +
+
+ +

◆ set_int_action_checked()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void MenuHelper::set_int_action_checked (QAction * a,
const int & i 
)
+
+ +

Sets the checked state of a menu item based on an integer variable.

+

Many menu items simply set a variable to a particular integer. This is a convenience function, assuming the QAction's data variable is an integer to set a variable to, that sets the checked state of the QAction to whether the QAction's integer equals the integer variable. Used heavily in functions like viewMenu_About_To_Be_Shown()

+
Parameters
+ + + +
aThe QAction to set the checked state of
iThe integer variable to compare the QAction's integer to
+
+
+ +
+
+ +

◆ set_timecode_view

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::set_timecode_view ()
+
+slot
+
+ +

Sets the current timecode setting.

+

Assumes the sender() is a QAction with an integer as its data variable. The data variable should be AUTOSCROLL_NO_AUTOSCROLL, AUTOSCROLL_PAGE_AUTOSCROLL (default) or AUTOSCROLL_SMOOTH_AUTOSCROLL.

+ +
+
+ +

◆ set_titlesafe_from_menu

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::set_titlesafe_from_menu ()
+
+slot
+
+ +

Set Title/Action Safe Area from QAction.

+

A receiver for several Title/Action Safe Area setting items. Assumes the sender() is a QAction with a data variable as a double. The double can be the following values:

    +
  • NaN (qSNaN()) - Disable Title/Action Safe Area
  • +
  • 0 - Enable Title/Action Safe Area, default aspect ratio (match current active Sequence's aspect ratio).
  • +
  • Negative Value - Enable Title/Action Safe Area, any negative number assumes a custom aspect ratio. Will ask the user to enter an aspect ratio and will use the result.
  • +
  • Positive Value - Enable Title/Action Safe Area, use value as the aspect ratio.
  • +
+ +
+
+ +

◆ toggle_bool_action

+ +
+
+ + + + + +
+ + + + + + + +
void MenuHelper::toggle_bool_action ()
+
+slot
+
+ +

Sets a QAction's Boolean reference to the opposite of its current value.

+

Many menu items simply toggle a Boolean variable. This is a convenience function, assuming the QAction's data variable is a pointer to a Boolean variable, that sets the Boolean variable to the opposite of its current value.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_menu_helper.png b/docs/html/class_menu_helper.png new file mode 100644 index 0000000000000000000000000000000000000000..eebeb00717fdd69b8bba413b5b05294b7435c23d GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^ARNHK3?%njU0MXBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J9BJY5_^Dj46+y`9Ib$m7x<|LFh!$J3rB zWh5L{iwj+=WB9P{TAIT7j*cH(fuUbR6hcF5P2AP)9}9cC>Q#W+?&TiMTjq!A&GzVC zkuQ5uPOEVFs?^VXM&D1}h*+5w|84Och4rd=x93l|x$*Uhl8V62@>eiR3Xe!XbxAt)Hm_~s?!1MT`Jj~|}<;$A1bcc!_* z|BlCvECoRdj5Q)24Dzf(2izN3J_IT-`l%{C(q=gj4B|P5eR{=Rc_;1qM2Ssrc5=>q zcg=9>YUj2!n@b%fGgjz*Y%=u7`{xo>A9F#-# + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ModifyTransitionCommand Member List
+
+
+ +

This is the complete list of members for ModifyTransitionCommand, including all inherited members.

+ + + + + + + + + + + + +
clip (defined in ModifyTransitionCommand)ModifyTransitionCommandprivate
doRedo() override (defined in ModifyTransitionCommand)ModifyTransitionCommandvirtual
doUndo() override (defined in ModifyTransitionCommand)ModifyTransitionCommandvirtual
ModifyTransitionCommand(Clip *c, int itype, long ilength) (defined in ModifyTransitionCommand)ModifyTransitionCommand
new_length (defined in ModifyTransitionCommand)ModifyTransitionCommandprivate
old_length (defined in ModifyTransitionCommand)ModifyTransitionCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
type (defined in ModifyTransitionCommand)ModifyTransitionCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_modify_transition_command.html b/docs/html/class_modify_transition_command.html new file mode 100644 index 000000000..b53aa5063 --- /dev/null +++ b/docs/html/class_modify_transition_command.html @@ -0,0 +1,131 @@ + + + + + + + +Olive: ModifyTransitionCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ModifyTransitionCommand Class Reference
+
+
+
+Inheritance diagram for ModifyTransitionCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

ModifyTransitionCommand (Clip *c, int itype, long ilength)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + +

+Private Attributes

+Clipclip
 
+int type
 
+long new_length
 
+long old_length
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_modify_transition_command.png b/docs/html/class_modify_transition_command.png new file mode 100644 index 0000000000000000000000000000000000000000..d138b07edca3d22a395faec7ea8725da3da2b39a GIT binary patch literal 877 zcmeAS@N?(olHy`uVBq!ia0vp^3xT+UgBeKf(5bEhQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;`0rLn;{G&V4;;wSoZK?2TIYfA9Zj z7$-0#;@HW&8&;cLwGTDyJuqYck|{ygC#bAUJ`^yire&eZ&mCz$d{(}krym`z>@#Uy zq2ixOiDK5~IbXakNy;0=C>^`~YQnLnv&3`7=Fi*KdF^?s%eoxdrx~7B50^cRxu3Oj zbHv-_2Xv-uue~^_1)F z6>eGuRPz|5ruY5BZN9UEXP!QqUd-zi6uGP~^@MwI5?+(~4W_8bCu(@w{cB0| z()`MEz`c^8#P@q!zx(^HyV8A4bG5(aOYG!%pvuEo)1uhWZ@}_Fu#Lg)kiY?V38o($ z&J6O291oNck{|7*_zoMC@HWqkJl?W!=FENr6XVZ?#|?VxFV||NrHO{#?v^m#+_tI)T8d!yS6M`U`4vCp#CGnMTz9@y@BgHQGjF~ZY)ebC zJ9Od98Fz_UGk^XNZaZwiW6S&@P>vz?^4^D!FYZqI-nKa5dDmZQH$CPGP7H5g_v4@b zHqE71OjR2CU^=ANE!z6w$Cn%l;ZX?d@YP5JkG z`~LI@-?HNd?s?Y_=Ww3-H0`0`zQh{=)rSoZuG_+QqV(`FOP%klPd)wh;_B`>=kqt7 zF4YTHUzFh&Fzs + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MoveClipAction Member List
+
+
+ +

This is the complete list of members for MoveClipAction, including all inherited members.

+ + + + + + + + + + + + + + + + + + +
clip (defined in MoveClipAction)MoveClipActionprivate
doRedo() override (defined in MoveClipAction)MoveClipActionvirtual
doUndo() override (defined in MoveClipAction)MoveClipActionvirtual
MoveClipAction(Clip *c, long iin, long iout, long iclip_in, int itrack, bool irelative) (defined in MoveClipAction)MoveClipAction
new_clip_in (defined in MoveClipAction)MoveClipActionprivate
new_in (defined in MoveClipAction)MoveClipActionprivate
new_out (defined in MoveClipAction)MoveClipActionprivate
new_track (defined in MoveClipAction)MoveClipActionprivate
old_clip_in (defined in MoveClipAction)MoveClipActionprivate
old_in (defined in MoveClipAction)MoveClipActionprivate
old_out (defined in MoveClipAction)MoveClipActionprivate
old_track (defined in MoveClipAction)MoveClipActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
relative (defined in MoveClipAction)MoveClipActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_move_clip_action.html b/docs/html/class_move_clip_action.html new file mode 100644 index 000000000..827299099 --- /dev/null +++ b/docs/html/class_move_clip_action.html @@ -0,0 +1,149 @@ + + + + + + + +Olive: MoveClipAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MoveClipAction Class Reference
+
+
+
+Inheritance diagram for MoveClipAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

MoveClipAction (Clip *c, long iin, long iout, long iclip_in, int itrack, bool irelative)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+Clipclip
 
+long old_in
 
+long old_out
 
+long old_clip_in
 
+int old_track
 
+long new_in
 
+long new_out
 
+long new_clip_in
 
+int new_track
 
+bool relative
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_move_clip_action.png b/docs/html/class_move_clip_action.png new file mode 100644 index 0000000000000000000000000000000000000000..62c88f306163e2558d928cc231e3fe63a8cc8e85 GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0zo(01NCo5Dxi|CH8t^b2cRTd||MBU} zirl9o*F|q%)gvLaVKV2zJ<3W#%t>itj;qd`k@?f}Do`amT3>hd`{^deo4;$k^bO@b zA1WSbyg6MabnQ*`$xm6gUB3~w;hyQqx_GxMe%xOc$FJB{_xftW_kaB}&Ai{n^w#|h zGe5h)X!6HBGPOaaFZr&9nd^uAZTr9dRnd)Zt~YA0kHxs0O|dz@c>TZC+n94d?PJ<~ zKi^+y^S>D8)Dxwwvu4)nuQW0)o}guH%)U`eaH0T%T{>HbqMzyc#B~-|le&snSN+Ri zUB-35c@=}q60QS|Xw)r3-^(J*lUHT2tPBb*{U9B(NhW*uyj8214{x3=6Z-bN_0@Gd zXF9h%&#!nFn)+eeolP&Mz71WSwYNSds^De(YWv{MRdEK-?&L0yzq_yZu^MuYU3>SaTp-^Z + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MoveEffectCommand Member List
+
+
+ +

This is the complete list of members for MoveEffectCommand, including all inherited members.

+ + + + + + + + + + + +
clip (defined in MoveEffectCommand)MoveEffectCommand
doRedo() override (defined in MoveEffectCommand)MoveEffectCommandvirtual
doUndo() override (defined in MoveEffectCommand)MoveEffectCommandvirtual
from (defined in MoveEffectCommand)MoveEffectCommand
MoveEffectCommand() (defined in MoveEffectCommand)MoveEffectCommand
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
to (defined in MoveEffectCommand)MoveEffectCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_move_effect_command.html b/docs/html/class_move_effect_command.html new file mode 100644 index 000000000..5a1be92ab --- /dev/null +++ b/docs/html/class_move_effect_command.html @@ -0,0 +1,125 @@ + + + + + + + +Olive: MoveEffectCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MoveEffectCommand Class Reference
+
+
+
+Inheritance diagram for MoveEffectCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Public Attributes

+Clipclip
 
+int from
 
+int to
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_move_effect_command.png b/docs/html/class_move_effect_command.png new file mode 100644 index 0000000000000000000000000000000000000000..2b18da489cc49d6ddb699431d97984e1becb4602 GIT binary patch literal 757 zcmeAS@N?(olHy`uVBq!ia0vp^EkNAC!3-n?BR0PSQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;e`)EoiBD!!oz_?I zdh=XBR^QX^vW3g6+p}bjZS$57x4-c%@b0YRneHz`+;`7ja>L-r#r1n1y4k>2!2iv&3?UD>tUGpL03qRbb@BOi^R%TvaKJiTKn!@t^mjqncc39j^`4`&c*irJP@My`!SobQf zBX)IvLY`lfZ}`P<=+0i{SmQ6}f2MYnMeaU!_ixmDhb4dP<5q78R*1^?{XJb_iIrEp zn#sFx1;6{9%cQhiZle5OVu?CL;sSsw3y-F5YXitkq_{=H~T*Hq9R4=d>1^oRB zt?Va4clqAWC%OWaS^R2qADxJfYxBro#Jq6IsjE?&H(0(ne)tTFshd|dpWe&~ zFAX_%9?KT^+rIL$v%p=R`Cea^@BY)Xr*l)4%%aa~b=REvV!9mfwS>59YH2b_90?M< ps?;{Ni6^X literal 0 HcmV?d00001 diff --git a/docs/html/class_move_marker_action-members.html b/docs/html/class_move_marker_action-members.html new file mode 100644 index 000000000..d12c80f9c --- /dev/null +++ b/docs/html/class_move_marker_action-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
MoveMarkerAction Member List
+
+
+ +

This is the complete list of members for MoveMarkerAction, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in MoveMarkerAction)MoveMarkerActionvirtual
doUndo() override (defined in MoveMarkerAction)MoveMarkerActionvirtual
marker (defined in MoveMarkerAction)MoveMarkerActionprivate
MoveMarkerAction(Marker *m, long o, long n) (defined in MoveMarkerAction)MoveMarkerAction
new_time (defined in MoveMarkerAction)MoveMarkerActionprivate
old_time (defined in MoveMarkerAction)MoveMarkerActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_move_marker_action.html b/docs/html/class_move_marker_action.html new file mode 100644 index 000000000..00baadb3e --- /dev/null +++ b/docs/html/class_move_marker_action.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: MoveMarkerAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
MoveMarkerAction Class Reference
+
+
+
+Inheritance diagram for MoveMarkerAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

MoveMarkerAction (Marker *m, long o, long n)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Markermarker
 
+long old_time
 
+long new_time
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_move_marker_action.png b/docs/html/class_move_marker_action.png new file mode 100644 index 0000000000000000000000000000000000000000..02bf81528485261bc42095d7391735ca3f2a92c9 GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0vp^l|bCV!3-q7yxMXcNJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~WqG+bx?Ou{-p!IfTu%;7GWlYzq!imSV`k|Eh1oM*Uz$&xpF927+toXy64TP&XNuP; zPr_9hvpQ_H@P&@i?^ZSX@D`)2Vh0lF{jJss^ zmQC;H{Y+VLA}z@N>>KS(r~ftW+48`4)BlZjYUY>Uecg8ZcJ9RwvpoOGY`(wa{L+}# zr`5M(f6J(({qyWIeY*CZnQ`|;kV`TroISJX%2XYtOU?}PuNg16-aXOpu3uvQiRWF* zJNJK+_u8IdNR&!x(BL(4n8GHh;ML3{u+)*QAvARH zm+F&7^_OPIgu;&d?p|uPL!Ec& zxA_x_dA&7l*2KLzdG8(bsueum|4Z)8_c6U0`RZu+6Y+nsJ+ptWikr-z7r&=%|1ZUI z*L4Z`lZ%)C60`kLt{?pW-fr*0J^GL9r4<4|;cf3FCirq;eUMw+9yP-(Szt + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
NewSequenceCommand Member List
+
+
+ +

This is the complete list of members for NewSequenceCommand, including all inherited members.

+ + + + + + + + + + + + +
done (defined in NewSequenceCommand)NewSequenceCommandprivate
doRedo() override (defined in NewSequenceCommand)NewSequenceCommandvirtual
doUndo() override (defined in NewSequenceCommand)NewSequenceCommandvirtual
NewSequenceCommand(Media *s, Media *iparent) (defined in NewSequenceCommand)NewSequenceCommand
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
parent (defined in NewSequenceCommand)NewSequenceCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in NewSequenceCommand)NewSequenceCommandprivate
undo() override (defined in OliveAction)OliveActionvirtual
~NewSequenceCommand() override (defined in NewSequenceCommand)NewSequenceCommandvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_new_sequence_command.html b/docs/html/class_new_sequence_command.html new file mode 100644 index 000000000..b271506d5 --- /dev/null +++ b/docs/html/class_new_sequence_command.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: NewSequenceCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
NewSequenceCommand Class Reference
+
+
+
+Inheritance diagram for NewSequenceCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

NewSequenceCommand (Media *s, Media *iparent)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Mediaseq
 
+Mediaparent
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_new_sequence_command.png b/docs/html/class_new_sequence_command.png new file mode 100644 index 0000000000000000000000000000000000000000..2c805de14a44a724eec3ff6556a9173d7af2073f GIT binary patch literal 861 zcmeAS@N?(olHy`uVBq!ia0vp^Q-HXGgBeJgeKTSMQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;)Q_FY+9ko}UC@PFxYB zxzt30A^s7Yft0e>-8|-~UX9Xnsq$^Ck!zL!m;eA3c@zE4Y&b2@eA%wf}&CI4ri{%K^KopHKbA5FTV zR`O}fl`Z?TO9HcM&un6O?Q}-x^z^0AejoRLx#zmRN1dbA%*gh#GfU6@QCwLSVSDV% z8`Jq7Ykz;W`0H!g5^^_s+so-oX1zK6b=ktNKSWm^E?;$Oo6^?1+i!j^23ot{!DHsk zN)An9V}8Zdv}cJSD>G*;JIL@u$h_gAMBuA3=?hsdD|cV62y^yw{l@qM%?~&|_@{K` zlprZyp#u@naG0=k+M;xe<;({{*RiKfUu!gduIIU1jPpLZJ#frgcgE(=C*PT6weNpw zU+Ss7vpzO7u;kN%tW#+TrXM>)0&hy4I;VFR=>PcpN!KIx|C8GK + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
NewSequenceDialog Member List
+
+
+ +

This is the complete list of members for NewSequenceDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + +
audio_frequency_combobox (defined in NewSequenceDialog)NewSequenceDialogprivate
create() (defined in NewSequenceDialog)NewSequenceDialogprivateslot
existing_item (defined in NewSequenceDialog)NewSequenceDialogprivate
existing_sequence (defined in NewSequenceDialog)NewSequenceDialogprivate
frame_rate_combobox (defined in NewSequenceDialog)NewSequenceDialogprivate
height_numeric (defined in NewSequenceDialog)NewSequenceDialogprivate
interlacing_combobox (defined in NewSequenceDialog)NewSequenceDialogprivate
NewSequenceDialog(QWidget *parent=0, Media *existing=0) (defined in NewSequenceDialog)NewSequenceDialogexplicit
par_combobox (defined in NewSequenceDialog)NewSequenceDialogprivate
preset_changed(int index) (defined in NewSequenceDialog)NewSequenceDialogprivateslot
preset_combobox (defined in NewSequenceDialog)NewSequenceDialogprivate
sequence_name_edit (defined in NewSequenceDialog)NewSequenceDialogprivate
set_sequence_name(const QString &s) (defined in NewSequenceDialog)NewSequenceDialog
setup_ui() (defined in NewSequenceDialog)NewSequenceDialogprivate
width_numeric (defined in NewSequenceDialog)NewSequenceDialogprivate
~NewSequenceDialog() (defined in NewSequenceDialog)NewSequenceDialog
+ + + + diff --git a/docs/html/class_new_sequence_dialog.html b/docs/html/class_new_sequence_dialog.html new file mode 100644 index 000000000..0f77fc0c5 --- /dev/null +++ b/docs/html/class_new_sequence_dialog.html @@ -0,0 +1,150 @@ + + + + + + + +Olive: NewSequenceDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for NewSequenceDialog:
+
+
+ +
+ + + + + + +

+Public Member Functions

NewSequenceDialog (QWidget *parent=0, Media *existing=0)
 
+void set_sequence_name (const QString &s)
 
+ + + + + +

+Private Slots

+void create ()
 
+void preset_changed (int index)
 
+ + + +

+Private Member Functions

+void setup_ui ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+Sequenceexisting_sequence
 
+Mediaexisting_item
 
+QComboBox * preset_combobox
 
+QSpinBox * height_numeric
 
+QSpinBox * width_numeric
 
+QComboBox * par_combobox
 
+QComboBox * interlacing_combobox
 
+QComboBox * frame_rate_combobox
 
+QComboBox * audio_frequency_combobox
 
+QLineEdit * sequence_name_edit
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_new_sequence_dialog.png b/docs/html/class_new_sequence_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..ef06ce6b76c1800e26015bf059e65fc48d84549d GIT binary patch literal 504 zcmeAS@N?(olHy`uVBq!ia0vp^jX)g0!3-ohWuCnNQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;&O|I6)GN0l}%@Nxknk@I&$Vu*D{V*i|)SKF6eRI zRMYb0l*bqD%sTU7kH5m{?K`76ZKi3TceuVOaL43?ztSCtLRrqm?zqWb^x!wwGh2<) z?RQwyo;e;Bih0SL_KeZfV8%@LDff@5{E%W&TI9iaAUcXcA><*;X`x;LzYR<*%14Bs z#CkLVtyl42Vt6*4#d87}eaL2UaaqX3=&)dt0;g2dqza4O@r((6N1vaa^UlQU!q>d^ zy$ug~ezzx_e{(A#%duTH`qrvh`=TRf`2_J_{g$0x>9F9noT$`-OFE0E22a@S<(zQr zR-~U@LDgxKY0rIbuX`z2p>s~s!%-%Mv*l*X^1OR(Yphm<-O}(8$Y`GSTh{L8*Ox`M z9ZlW^EFvr>R;~ff@7WJeIR9fo@#>^fzwLQj#9qE@s^veW{^4gVLqlNgGs#}n4>b%7 ki+>%EeBnJG?%%(REARLTzEqFm2SyWvr>mdKI;Vst06b*elK=n! literal 0 HcmV?d00001 diff --git a/docs/html/class_o_tree_view-members.html b/docs/html/class_o_tree_view-members.html new file mode 100644 index 000000000..fc1ce5d44 --- /dev/null +++ b/docs/html/class_o_tree_view-members.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
OTreeView Member List
+
+
+ +

This is the complete list of members for OTreeView, including all inherited members.

+ + +
OTreeView(QWidget *parent=0) (defined in OTreeView)OTreeView
+ + + + diff --git a/docs/html/class_o_tree_view.html b/docs/html/class_o_tree_view.html new file mode 100644 index 000000000..d4564230d --- /dev/null +++ b/docs/html/class_o_tree_view.html @@ -0,0 +1,96 @@ + + + + + + + +Olive: OTreeView Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
OTreeView Class Reference
+
+
+
+Inheritance diagram for OTreeView:
+
+
+ +
+ + + + +

+Public Member Functions

OTreeView (QWidget *parent=0)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_o_tree_view.png b/docs/html/class_o_tree_view.png new file mode 100644 index 0000000000000000000000000000000000000000..8e39dee8ec54c42db8b2ada37c26fc5d50bb681e GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^K0qA6!3-o@Vv~OYDTx4|5ZC|z{{xvX-h3_XKQsZz z0^|JId3G~d7sW#;hplNu0CVI>AH?0 zHQ{p~EzZuqKF9C)j^y&^IWgvb#kU$){{M4<5oGN#J!9kOBl7BHI>z@VEJ^`}ErX}4 KpUXO@geCy-xyYaZ literal 0 HcmV?d00001 diff --git a/docs/html/class_olive_action-members.html b/docs/html/class_olive_action-members.html new file mode 100644 index 000000000..32c52ea20 --- /dev/null +++ b/docs/html/class_olive_action-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
OliveAction Member List
+
+
+ +

This is the complete list of members for OliveAction, including all inherited members.

+ + + + + + + + + +
doRedo()=0 (defined in OliveAction)OliveActionpure virtual
doUndo()=0 (defined in OliveAction)OliveActionpure virtual
old_window_modifiedOliveActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
set_window_modifiedOliveActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_olive_action.html b/docs/html/class_olive_action.html new file mode 100644 index 000000000..d70968da3 --- /dev/null +++ b/docs/html/class_olive_action.html @@ -0,0 +1,169 @@ + + + + + + + +Olive: OliveAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
OliveAction Class Referenceabstract
+
+
+
+Inheritance diagram for OliveAction:
+
+
+ + +AddClipCommand +AddEffectCommand +AddMarkerAction +AddMediaCommand +AddTransitionCommand +ChangeSequenceAction +CheckboxCommand +CloseAllClipsCommand +DeleteClipAction +DeleteMarkerAction +DeleteMediaCommand +DeleteTransitionCommand +EditSequenceCommand +EffectDeleteCommand +EffectFieldUndo +KeyframeDelete +KeyframeFieldSet +LinkCommand +MediaMove +MediaRename +ModifyTransitionCommand +MoveClipAction +MoveEffectCommand +MoveMarkerAction +NewSequenceCommand +RefreshClips +ReloadEffectsCommand +RemoveClipsFromClipboard +RenameClipCommand +ReplaceClipMediaCommand +ReplaceMediaCommand +RippleAction +SetAutoscaleAction +SetBool +SetDouble +SetEffectData +SetInt +SetKeyframing +SetLong +SetPointer +SetQVariant +SetSelectionsCommand +SetSpeedAction +SetString +SetTimelineInOutCommand +UpdateFootageTooltip +UpdateViewer + +
+ + + + + + + + + + + + +

+Public Member Functions

OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+virtual void doUndo ()=0
 
+virtual void doRedo ()=0
 
+ + + + + + + +

+Private Attributes

+bool set_window_modified
 Setting whether to change the windowModified state of MainWindow.
 
+bool old_window_modified
 Cache previous window modified value to return to if the user undoes this action.
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_olive_action.png b/docs/html/class_olive_action.png new file mode 100644 index 0000000000000000000000000000000000000000..ef92f733b26c91c02edd232b3c702f50fd2ce634 GIT binary patch literal 18379 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 JAANQBzW_&jpmhKM literal 0 HcmV?d00001 diff --git a/docs/html/class_olive_global-members.html b/docs/html/class_olive_global-members.html new file mode 100644 index 000000000..f1a3ed374 --- /dev/null +++ b/docs/html/class_olive_global-members.html @@ -0,0 +1,109 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
OliveGlobal Member List
+
+ + + + + diff --git a/docs/html/class_olive_global.html b/docs/html/class_olive_global.html new file mode 100644 index 000000000..9a7c3bb2b --- /dev/null +++ b/docs/html/class_olive_global.html @@ -0,0 +1,745 @@ + + + + + + + +Olive: OliveGlobal Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

The Olive Global class. + More...

+ +

#include <oliveglobal.h>

+
+Inheritance diagram for OliveGlobal:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Slots

+void undo ()
 Undo user's last action.
 
+void redo ()
 Redo user's last action.
 
void paste ()
 Paste contents of clipboard. More...
 
void paste_insert ()
 Paste contents of clipboard, making space for it when possible. More...
 
void new_project ()
 Create new project. More...
 
void open_project ()
 Open a project from file. More...
 
void open_recent (int index)
 Open recent project from list. More...
 
bool save_project_as ()
 Shows a save file dialog and saves the project as the resulting filename. More...
 
bool save_project ()
 Saves the current project to file. More...
 
bool can_close_project ()
 Determine whether the current project can be closed. More...
 
+void open_export_dialog ()
 Open the Export dialog to trigger an export of the current sequence.
 
+void open_about_dialog ()
 Open the About Olive dialog.
 
+void open_debug_log ()
 Open the Debug Log window.
 
+void open_speed_dialog ()
 Open the Speed/Duration dialog.
 
+void open_action_search ()
 Open the Action Search overlay.
 
void clear_undo_stack ()
 Clears the current undo stack. More...
 
void finished_initialize ()
 Function called when Olive has finished starting up. More...
 
void save_autorecovery_file ()
 Save an auto-recovery file of the current project. More...
 
+void open_preferences ()
 Opens the Preferences dialog.
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 OliveGlobal ()
 OliveGlobal Constructor. More...
 
const QString & get_project_file_filter ()
 Returns the file dialog filter used when interfacing with Olive project files. More...
 
void update_project_filename (const QString &s)
 Change the current active project filename. More...
 
void check_for_autorecovery_file ()
 Check whether an auto-recovery file exists and ask the user if they want to load it. More...
 
void set_rendering_state (bool rendering)
 Set the application state depending on if the user is exporting a video. More...
 
void load_project_on_launch (const QString &s)
 Set a project to load just after launching. More...
 
QString get_recent_project_list_file ()
 Retrieves the URL of the config file containing the autorecovery projects. More...
 
+ + + + +

+Private Member Functions

void open_project_worker (const QString &fn, bool autorecovery)
 Internal function to handle loading a project from file. More...
 
+ + + + + + + + + + +

+Private Attributes

+QString project_file_filter
 File filter used for any file dialogs relating to Olive project files.
 
+QTimer autorecovery_timer
 Regular interval to save an auto-recovery project.
 
+bool enable_load_project_on_init
 Internal variable set to TRUE by main() if a project file was set as an argument.
 
+

Detailed Description

+

The Olive Global class.

+

A resource for various global functions used throughout Olive.

+

Constructor & Destructor Documentation

+ +

◆ OliveGlobal()

+ +
+
+ + + + + + + +
OliveGlobal::OliveGlobal ()
+
+ +

OliveGlobal Constructor.

+

Creates Olive Global object. Also sets some default runtime settings and the application name.

+ +
+
+

Member Function Documentation

+ +

◆ can_close_project

+ +
+
+ + + + + +
+ + + + + + + +
bool OliveGlobal::can_close_project ()
+
+slot
+
+ +

Determine whether the current project can be closed.

+

Queried any time the current project is going to be closed (e.g. starting a new project, loading a project, exiting Olive, etc.) If the project has unsaved changes, this function asks the user whether they want to save or not. If the user does, calls save_project() (which may in turn call save_project_as() if the project has never been saved).

+
Returns
TRUE if the project can be closed. FALSE if not. If the project does NOT have unsaved changes, always returns TRUE. If it does and the user clicks YES, this returns the result of save_project(). If the user clicks NO, this returns TRUE. If the user clicks CANCEL, this returns FALSE.
+ +
+
+ +

◆ check_for_autorecovery_file()

+ +
+
+ + + + + + + +
void OliveGlobal::check_for_autorecovery_file ()
+
+ +

Check whether an auto-recovery file exists and ask the user if they want to load it.

+

Usually called on initialization. Checks if an auto-recovery file exists (meaning the last session of Olive didn't close correctly). If it finds one, asks the user if they want to load it. If so, loads the auto-recovery project.

+ +
+
+ +

◆ clear_undo_stack

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::clear_undo_stack ()
+
+slot
+
+ +

Clears the current undo stack.

+

Clears all current commands in the undo stack. Mostly used for debugging.

+ +
+
+ +

◆ finished_initialize

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::finished_initialize ()
+
+slot
+
+ +

Function called when Olive has finished starting up.

+

Sets up some last things for Olive that must be run after Olive has completed initialization. If a project was loaded as a command line argument, it's loaded here.

+ +
+
+ +

◆ get_project_file_filter()

+ +
+
+ + + + + + + +
const QString & OliveGlobal::get_project_file_filter ()
+
+ +

Returns the file dialog filter used when interfacing with Olive project files.

+
Returns
The file filter string used by QFileDialog to limit the files shown to Olive (*.ove) files.
+ +
+
+ +

◆ get_recent_project_list_file()

+ +
+
+ + + + + + + +
QString OliveGlobal::get_recent_project_list_file ()
+
+ +

Retrieves the URL of the config file containing the autorecovery projects.

+
Returns
The URL as a string
+ +
+
+ +

◆ load_project_on_launch()

+ +
+
+ + + + + + + + +
void OliveGlobal::load_project_on_launch (const QString & s)
+
+ +

Set a project to load just after launching.

+

Called by main() if Olive was called with a project file as a running argument. Sets up Olive to load the specified project once its finished initializing.

+
Parameters
+ + +
sThe URL of the project file to load.
+
+
+ +
+
+ +

◆ new_project

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::new_project ()
+
+slot
+
+ +

Create new project.

+

Confirms whether the current project can be closed, and if so, clears all current project data and resets program state. Standard File > New behavior.

+ +
+
+ +

◆ open_project

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::open_project ()
+
+slot
+
+ +

Open a project from file.

+

Confirms whether the current project can be closed, and if so, shows an open file dialog to allow the user to select a project file and then triggers a project load with it.

+ +
+
+ +

◆ open_project_worker()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void OliveGlobal::open_project_worker (const QString & fn,
bool autorecovery 
)
+
+private
+
+ +

Internal function to handle loading a project from file.

+

Start loading a project. Doesn't check if the current project can be closed, doesn't check if the project exists. In most cases, you'll want open_project() to be end-user friendly.

+
Parameters
+ + + +
fnThe URL to the project to load.
autorecoveryWhether this file is an autorecovery file. If it is, after the load Olive will set the project URL to a new file beside the original project file so that it does not overwrite the original and so that the user is not working on the autorecovery project in Olive's application data directory.
+
+
+ +
+
+ +

◆ open_recent

+ +
+
+ + + + + +
+ + + + + + + + +
void OliveGlobal::open_recent (int index)
+
+slot
+
+ +

Open recent project from list.

+

Triggers a project load from the internal recent projects list.

+
Parameters
+ + +
indexIndex in the list of the project fille to load
+
+
+ +
+
+ +

◆ paste

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::paste ()
+
+slot
+
+ +

Paste contents of clipboard.

+

Pastes contents of clipboard. Seeing as several types of data can be copied into the clipboard, this function will automatically determine what type of data is in the clipboard and paste it in the correct location (e.g. clip data will go to the Timeline, effect data will go to Effect Controls).

+ +
+
+ +

◆ paste_insert

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::paste_insert ()
+
+slot
+
+ +

Paste contents of clipboard, making space for it when possible.

+

Pastes contents of clipboard (same as paste()). If the clipboard contains clip data, the clips are cut at the current playhead and ripple forward to make space for the clips in the clipboard. Can be considered semi-non-destructive as a result (as opposed to paste() overwriting clips). If the clipboard contains effect data, the functionality is identical to paste().

+ +
+
+ +

◆ save_autorecovery_file

+ +
+
+ + + + + +
+ + + + + + + +
void OliveGlobal::save_autorecovery_file ()
+
+slot
+
+ +

Save an auto-recovery file of the current project.

+

Call this function to save the current state of the project as an auto-recovery project. Called regularly by autorecovery_timer.

+ +
+
+ +

◆ save_project

+ +
+
+ + + + + +
+ + + + + + + +
bool OliveGlobal::save_project ()
+
+slot
+
+ +

Saves the current project to file.

+

If the project has been saved already, this function will overwrite the project file with the current project data. Calls save_project_as() if the file has not been saved before.

+
Returns
TRUE if the project has been saved before and was successfully overwritten. Otherwise returns the value of save_project_as(). Useful if the user closing an unsaved project, clicks "Yes" to save, we know if they actually saved or not and won't continue closing the project if they didn't.
+ +
+
+ +

◆ save_project_as

+ +
+
+ + + + + +
+ + + + + + + +
bool OliveGlobal::save_project_as ()
+
+slot
+
+ +

Shows a save file dialog and saves the project as the resulting filename.

+

Shows a save file dialog for the user to save their current project as a different filename from the current one. Also triggered by save_project() if the file hasn't been saved yet.

+
Returns
TRUE if the user saved the project. FALSE if they cancelled out of the save file dialog. Useful if a user is closing an unsaved project, clicks "Yes" to save, we know if they actually saved or not and won't continue closing the project if they didn't.
+ +
+
+ +

◆ set_rendering_state()

+ +
+
+ + + + + + + + +
void OliveGlobal::set_rendering_state (bool rendering)
+
+ +

Set the application state depending on if the user is exporting a video.

+

Some background functions shouldn't run while Olive is exporting a video. This function will disable/enable them as necessary.

+

The current functions are as follows:

    +
  • Auto-recovery interval. Olive saves an auto-recovery just before exporting anyway and seeing as the user cannot make changes while rendering, there's no reason to continue saving auto-recovery files.
  • +
  • Audio device playback. Olive uses the same internal audio buffer for exporting as it does for playback, but this buffer does not need to be forwarded to the output device when exporting.
  • +
+
Parameters
+ + +
renderingTRUE if Olive is about to export a video. FALSE if Olive has finished exporting.
+
+
+ +
+
+ +

◆ update_project_filename()

+ +
+
+ + + + + + + + +
void OliveGlobal::update_project_filename (const QString & s)
+
+ +

Change the current active project filename.

+

Triggered to change the current active project filename. Call this before calling any internal project saving or loading functions in order to set which file to work with (OliveGlobal::open_project() and OliveGlobal::save_project_as() do this automatically). Also updates the main window title to reflect the project filename.

+
Parameters
+ + +
sThe URL of the project file to work with. Can be an empty string, in which case Olive will treat the project as an unsaved project.
+
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_olive_global.png b/docs/html/class_olive_global.png new file mode 100644 index 0000000000000000000000000000000000000000..76473c44b2d2a773a09b8a375a11c42332f7f80a GIT binary patch literal 419 zcmV;U0bKrxP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003pNkl53`I|0?EnAqj)+ng9Iw~JcYt`KZx4zi+*8z8Q=N)d} ztb2FgTD{g;|K8QpcJ}WyJL~L`b-xwQQ~waRFf+e*s;WN4<3vQl1hAqFAWpHkZ42ea z;y$!UUNG*TcQ$bVP9+Y&r^EsHlsEvN5(nT@;sAb0L?liKK$H>(;FH0X#+20T5w+SX z{hT^#xDz$EJ3i<;u7&G5)SI%Yx)?j*31@<-moUtGhbuOQO1}xWxLP^hoLZgY?1X2W zt={^6=gY(8Xg9IztXX4z0suTp9Dq;zVH6RG(hv2QE+0Zwc5eUx N002ovPDHLkV1m49!E68k literal 0 HcmV?d00001 diff --git a/docs/html/class_pan_effect-members.html b/docs/html/class_pan_effect-members.html new file mode 100644 index 000000000..b5b454403 --- /dev/null +++ b/docs/html/class_pan_effect-members.html @@ -0,0 +1,133 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
PanEffect Member List
+
+
+ +

This is the complete list of members for PanEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
pan_val (defined in PanEffect)PanEffect
PanEffect(Clip *c, const EffectMeta *em) (defined in PanEffect)PanEffect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in PanEffect)PanEffectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_pan_effect.html b/docs/html/class_pan_effect.html new file mode 100644 index 000000000..024e507eb --- /dev/null +++ b/docs/html/class_pan_effect.html @@ -0,0 +1,266 @@ + + + + + + + +Olive: PanEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
PanEffect Class Reference
+
+
+
+Inheritance diagram for PanEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

PanEffect (Clip *c, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldpan_val
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/paneffect.h
  • +
  • effects/internal/paneffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_pan_effect.png b/docs/html/class_pan_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..9d870bebe8183be73552d157dbf6cffd99a0a46f GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^&OqG3!3-q3t(TbrDTx4|5ZC|z{{xvX-h3_XKQsZz z0^#hxyXAr*{o=jQeuR^V}&-z)O2{&DUP zjb)8F!HYtdmYN0&Gw~mv@J(MysoO27r|{&t4nwKE2H&*4udR|yev@KVnBMKkXwykVX3-0;qd``@1?*`8Xt z;_CX$-fybkXskTuWlcAo|Fh9b6vCosDg*B=uQj5J}|kOFjsznh-Hg_T!o z^HZ38OS7`KoIAWigkAfLMC#o=S>BtzJx>W*(J3#HnkH3zX7Rn;#4!HuQ+Jt^Rzv)dCEOUpqo~*AG>b}@@HVxa#xqIKg_|`Obr{3UCIJR OA%mx@pUXO@geCw;G4EXf literal 0 HcmV?d00001 diff --git a/docs/html/class_play_button-members.html b/docs/html/class_play_button-members.html new file mode 100644 index 000000000..810236b61 --- /dev/null +++ b/docs/html/class_play_button-members.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
PlayButton Member List
+
+
+ +

This is the complete list of members for PlayButton, including all inherited members.

+ + + + +
pause_text (defined in PlayButton)PlayButtonprivate
play_text (defined in PlayButton)PlayButtonprivate
PlayButton(QWidget *parent=0) (defined in PlayButton)PlayButton
+ + + + diff --git a/docs/html/class_play_button.html b/docs/html/class_play_button.html new file mode 100644 index 000000000..3e90bf874 --- /dev/null +++ b/docs/html/class_play_button.html @@ -0,0 +1,106 @@ + + + + + + + +Olive: PlayButton Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
PlayButton Class Reference
+
+
+
+Inheritance diagram for PlayButton:
+
+
+ +
+ + + + +

+Public Member Functions

PlayButton (QWidget *parent=0)
 
+ + + + + +

+Private Attributes

+QString play_text
 
+QString pause_text
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_play_button.png b/docs/html/class_play_button.png new file mode 100644 index 0000000000000000000000000000000000000000..afbe5ae2744090ad0b395de9de70650feca4bc24 GIT binary patch literal 422 zcmV;X0a^ZuP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003sNklpQ&UsR$WN$64P>cmQk%Yt8tc{8N*v}H(4tOcTLUd>2q7#or#f{T zl_Xai0K91j04%pH)Z^HJ-9mjpH(>Wrzp4hD>QtvX)u~Q(>d#V1a=C#3u-Ke>3pIYg za~gns#PJHdR8vxWA>#NqRaFZ^9I3{2i9Nv7}OdomU%KO0PB^XqDi2NE6l5 z`T + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
PreferencesDialog Member List
+
+
+ +

This is the complete list of members for PreferencesDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
accurateSeekButton (defined in PreferencesDialog)PreferencesDialogprivate
audio_input_devices (defined in PreferencesDialog)PreferencesDialogprivate
audio_output_devices (defined in PreferencesDialog)PreferencesDialogprivate
audio_sample_rate (defined in PreferencesDialog)PreferencesDialogprivate
browse_css_file() (defined in PreferencesDialog)PreferencesDialogprivateslot
custom_css_fn (defined in PreferencesDialog)PreferencesDialogprivate
delete_all_previews() (defined in PreferencesDialog)PreferencesDialogprivateslot
delete_previews(char type) (defined in PreferencesDialog)PreferencesDialogprivate
effect_textbox_lines_field (defined in PreferencesDialog)PreferencesDialogprivate
fastSeekButton (defined in PreferencesDialog)PreferencesDialogprivate
imgSeqFormatEdit (defined in PreferencesDialog)PreferencesDialogprivate
key_shortcut_actions (defined in PreferencesDialog)PreferencesDialogprivate
key_shortcut_fields (defined in PreferencesDialog)PreferencesDialogprivate
key_shortcut_items (defined in PreferencesDialog)PreferencesDialogprivate
keyboard_tree (defined in PreferencesDialog)PreferencesDialogprivate
language_combobox (defined in PreferencesDialog)PreferencesDialogprivate
load_shortcut_file() (defined in PreferencesDialog)PreferencesDialogprivateslot
PreferencesDialog(QWidget *parent=nullptr) (defined in PreferencesDialog)PreferencesDialogexplicit
previous_queue_spinbox (defined in PreferencesDialog)PreferencesDialogprivate
previous_queue_type (defined in PreferencesDialog)PreferencesDialogprivate
recordingComboBox (defined in PreferencesDialog)PreferencesDialogprivate
refine_shortcut_list(const QString &, QTreeWidgetItem *parent=nullptr) (defined in PreferencesDialog)PreferencesDialogprivateslot
reset_all_shortcuts() (defined in PreferencesDialog)PreferencesDialogprivateslot
reset_default_shortcut() (defined in PreferencesDialog)PreferencesDialogprivateslot
save() (defined in PreferencesDialog)PreferencesDialogprivateslot
save_shortcut_file() (defined in PreferencesDialog)PreferencesDialogprivateslot
setup_kbd_shortcut_worker(QMenu *menu, QTreeWidgetItem *parent) (defined in PreferencesDialog)PreferencesDialogprivate
setup_kbd_shortcuts(QMenuBar *menu) (defined in PreferencesDialog)PreferencesDialog
setup_ui() (defined in PreferencesDialog)PreferencesDialogprivate
thumbnail_res_spinbox (defined in PreferencesDialog)PreferencesDialogprivate
upcoming_queue_spinbox (defined in PreferencesDialog)PreferencesDialogprivate
upcoming_queue_type (defined in PreferencesDialog)PreferencesDialogprivate
use_software_fallbacks_checkbox (defined in PreferencesDialog)PreferencesDialogprivate
waveform_res_spinbox (defined in PreferencesDialog)PreferencesDialogprivate
~PreferencesDialog() (defined in PreferencesDialog)PreferencesDialog
+ + + + diff --git a/docs/html/class_preferences_dialog.html b/docs/html/class_preferences_dialog.html new file mode 100644 index 000000000..41ce9da2c --- /dev/null +++ b/docs/html/class_preferences_dialog.html @@ -0,0 +1,207 @@ + + + + + + + +Olive: PreferencesDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for PreferencesDialog:
+
+
+ +
+ + + + + + +

+Public Member Functions

PreferencesDialog (QWidget *parent=nullptr)
 
+void setup_kbd_shortcuts (QMenuBar *menu)
 
+ + + + + + + + + + + + + + + + + +

+Private Slots

+void save ()
 
+void reset_default_shortcut ()
 
+void reset_all_shortcuts ()
 
+bool refine_shortcut_list (const QString &, QTreeWidgetItem *parent=nullptr)
 
+void load_shortcut_file ()
 
+void save_shortcut_file ()
 
+void browse_css_file ()
 
+void delete_all_previews ()
 
+ + + + + + + +

+Private Member Functions

+void setup_ui ()
 
+void setup_kbd_shortcut_worker (QMenu *menu, QTreeWidgetItem *parent)
 
+void delete_previews (char type)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QLineEdit * custom_css_fn
 
+QLineEdit * imgSeqFormatEdit
 
+QComboBox * recordingComboBox
 
+QRadioButton * accurateSeekButton
 
+QRadioButton * fastSeekButton
 
+QTreeWidget * keyboard_tree
 
+QDoubleSpinBox * upcoming_queue_spinbox
 
+QComboBox * upcoming_queue_type
 
+QDoubleSpinBox * previous_queue_spinbox
 
+QComboBox * previous_queue_type
 
+QSpinBox * effect_textbox_lines_field
 
+QCheckBox * use_software_fallbacks_checkbox
 
+QComboBox * audio_output_devices
 
+QComboBox * audio_input_devices
 
+QComboBox * audio_sample_rate
 
+QComboBox * language_combobox
 
+QSpinBox * thumbnail_res_spinbox
 
+QSpinBox * waveform_res_spinbox
 
+QVector< QAction * > key_shortcut_actions
 
+QVector< QTreeWidgetItem * > key_shortcut_items
 
+QVector< KeySequenceEditor * > key_shortcut_fields
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_preferences_dialog.png b/docs/html/class_preferences_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..d480f0ad5e81e358c1e0d153f8b38a8215db32cd GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^Wk4Lj!3-pS_Y`sfDTx4|5ZC|z{{xvX-h3_XKQsZz z0^QcoAhkP61Pb1!aMt-#|N9=GfN|Nix& zQ#GzQpU-@7Zi;02NtP2_ir2!=ocYB)dC9$55uRMv{`b{xyKkqa?C*K0I_s$15^f{0 z-MUe2DY-aUHA3rjU4~SdJ?EYgS@^kSGFZJ&`Zm*q}9r691 zT6~PUchF+C1pB(}ldddSdu>w5>YuEWmL$~5UOTg9H$&ZOc8B`jgLZPxJCZkWm$H-# zd^>GbnZ&rrbR)yTSrH8hzB&#Y)Wj4bgt-OQbh2_>JHoW(#F;hw4H|%MY)I%mw(K9% zpWrHnyb_m_(yJAXwrzUy*C}L?NmBUvS;by|JnXBtX}vN2U0^UzyPs43@I|gS`(8?L zl^dP!-gN$UYiPpXwO2N@-hTSJ@%qV6B1bbncLq<5wF)oq+n~Qf^rvr5V%VMQy}GXd zByWd2d3E=iTHL+2KV?s-e%4>K`g^yZUFnHiJHOB6x!}mWVe4+zjhZQ ZQS!dK{E3q%{DG0e;OXk;vd$@?2>?F0;hO*e literal 0 HcmV?d00001 diff --git a/docs/html/class_preview_generator-members.html b/docs/html/class_preview_generator-members.html new file mode 100644 index 000000000..5f63258c1 --- /dev/null +++ b/docs/html/class_preview_generator-members.html @@ -0,0 +1,97 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
PreviewGenerator Member List
+
+
+ +

This is the complete list of members for PreviewGenerator, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
cancel() (defined in PreviewGenerator)PreviewGenerator
cancelled (defined in PreviewGenerator)PreviewGeneratorprivate
contains_still_image (defined in PreviewGenerator)PreviewGeneratorprivate
data_path (defined in PreviewGenerator)PreviewGeneratorprivate
finalize_media() (defined in PreviewGenerator)PreviewGeneratorprivate
fmt_ctx (defined in PreviewGenerator)PreviewGeneratorprivate
footage (defined in PreviewGenerator)PreviewGeneratorprivate
generate_waveform() (defined in PreviewGenerator)PreviewGeneratorprivate
get_thumbnail_path(const QString &hash, const FootageStream &ms) (defined in PreviewGenerator)PreviewGeneratorprivate
get_waveform_path(const QString &hash, const FootageStream &ms) (defined in PreviewGenerator)PreviewGeneratorprivate
media (defined in PreviewGenerator)PreviewGeneratorprivate
parse_media() (defined in PreviewGenerator)PreviewGeneratorprivate
PreviewGenerator(Media *, Footage *, bool) (defined in PreviewGenerator)PreviewGenerator
replace (defined in PreviewGenerator)PreviewGeneratorprivate
retrieve_duration (defined in PreviewGenerator)PreviewGeneratorprivate
retrieve_preview(const QString &hash) (defined in PreviewGenerator)PreviewGeneratorprivate
run() (defined in PreviewGenerator)PreviewGenerator
set_icon(int, bool) (defined in PreviewGenerator)PreviewGeneratorsignal
+ + + + diff --git a/docs/html/class_preview_generator.html b/docs/html/class_preview_generator.html new file mode 100644 index 000000000..0c46e8103 --- /dev/null +++ b/docs/html/class_preview_generator.html @@ -0,0 +1,159 @@ + + + + + + + +Olive: PreviewGenerator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for PreviewGenerator:
+
+
+ +
+ + + + +

+Signals

+void set_icon (int, bool)
 
+ + + + + + + +

+Public Member Functions

PreviewGenerator (Media *, Footage *, bool)
 
+void run ()
 
+void cancel ()
 
+ + + + + + + + + + + + + +

+Private Member Functions

+void parse_media ()
 
+bool retrieve_preview (const QString &hash)
 
+void generate_waveform ()
 
+void finalize_media ()
 
+QString get_thumbnail_path (const QString &hash, const FootageStream &ms)
 
+QString get_waveform_path (const QString &hash, const FootageStream &ms)
 
+ + + + + + + + + + + + + + + + + +

+Private Attributes

+AVFormatContext * fmt_ctx
 
+Mediamedia
 
+Footagefootage
 
+bool retrieve_duration
 
+bool contains_still_image
 
+bool replace
 
+bool cancelled
 
+QString data_path
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_preview_generator.png b/docs/html/class_preview_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb8cb7b509c8013a723fb0826c9212b51a8f67f GIT binary patch literal 487 zcmeAS@N?(olHy`uVBq!ia0vp^#Xuau!3-p2m+tZbQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;>VP=h&J?pZSKy(mZOO&NKZyyB^-RnjU#Nai>+?qwiJebF$sMwDnY1 z9#=g#=fSS@<nV_uO1(s!T! zEm`oRWYV3T(XtPEFTY$q=e1Xs(&o0*gV*<5nl^LSxwF;0|34kK^3#8J(6_hPTl4ZQ zsi#^0ZEmyOUvIVc`ophYy_ + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Project Member List
+
+
+ +

This is the complete list of members for Project, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_recent_project(QString url) (defined in Project)Project
clear() (defined in Project)Project
clear_recent_projects() (defined in Project)Projectprivateslot
create_folder_internal(QString name) (defined in Project)Project
create_sequence_internal(ComboAction *ca, Sequence *s, bool open, Media *parent) (defined in Project)Project
delete_clips_using_selected_media() (defined in Project)Projectslot
delete_selected_media() (defined in Project)Projectslot
directory_up (defined in Project)Projectprivate
duplicate_selected() (defined in Project)Projectslot
folder_id (defined in Project)Projectprivate
get_all_media_from_table(QList< Media * > &items, QList< Media * > &list, int type=-1) (defined in Project)Project
get_current_selected() (defined in Project)Project
get_file_name_from_path(const QString &path) (defined in Project)Projectprivate
get_next_sequence_name(QString start=0) (defined in Project)Project
get_selected_folder() (defined in Project)Project
go_up_dir() (defined in Project)Projectprivateslot
icon_view (defined in Project)Project
icon_view_container (defined in Project)Projectprivate
import_dialog() (defined in Project)Projectslot
is_focused() (defined in Project)Project
item_to_media(const QModelIndex &index) (defined in Project)Project
last_imported_media (defined in Project)Project
list_all_project_sequences() (defined in Project)Project
list_all_sequences_worker(QVector< Media * > *list, Media *parent) (defined in Project)Projectprivate
load_project(bool autorecovery) (defined in Project)Project
make_new_menu() (defined in Project)Projectprivateslot
media_id (defined in Project)Projectprivate
new_folder() (defined in Project)Projectslot
new_project() (defined in Project)Project
new_sequence() (defined in Project)Projectslot
open_properties() (defined in Project)Projectslot
process_file_list(QStringList &files, bool recursive=false, Media *replace=nullptr, Media *parent=nullptr) (defined in Project)Project
proj_dir (defined in Project)Projectprivate
Project(QWidget *parent=0) (defined in Project)Projectexplicit
replace_clip_media() (defined in Project)Projectslot
replace_media(Media *item, QString filename) (defined in Project)Project
replace_selected_file() (defined in Project)Projectslot
reveal_media(Media *media, QModelIndex parent=QModelIndex()) (defined in Project)Project
save_folder(QXmlStreamWriter &stream, int type, bool set_ids_only, const QModelIndex &parent=QModelIndex()) (defined in Project)Projectprivate
save_project(bool autorecovery) (defined in Project)Project
save_recent_projects() (defined in Project)Project
sequence_id (defined in Project)Projectprivate
set_icon_view() (defined in Project)Projectprivateslot
set_icon_view_size(int) (defined in Project)Projectprivateslot
set_tree_view() (defined in Project)Projectprivateslot
set_up_dir_enabled() (defined in Project)Projectprivateslot
sorter (defined in Project)Project
sources_common (defined in Project)Project
start_preview_generator(Media *item, bool replacing) (defined in Project)Project
toolbar_widget (defined in Project)Project
tree_view (defined in Project)Project
update_view_type() (defined in Project)Projectprivateslot
~Project() (defined in Project)Project
+ + + + diff --git a/docs/html/class_project.html b/docs/html/class_project.html new file mode 100644 index 000000000..6ba97e37d --- /dev/null +++ b/docs/html/class_project.html @@ -0,0 +1,269 @@ + + + + + + + +Olive: Project Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for Project:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + +

+Public Slots

+void import_dialog ()
 
+void delete_selected_media ()
 
+void duplicate_selected ()
 
+void delete_clips_using_selected_media ()
 
+void replace_selected_file ()
 
+void replace_clip_media ()
 
+void open_properties ()
 
+void new_folder ()
 
+void new_sequence ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Project (QWidget *parent=0)
 
+bool is_focused ()
 
+void clear ()
 
+Mediacreate_sequence_internal (ComboAction *ca, Sequence *s, bool open, Media *parent)
 
+QString get_next_sequence_name (QString start=0)
 
+void process_file_list (QStringList &files, bool recursive=false, Media *replace=nullptr, Media *parent=nullptr)
 
+void replace_media (Media *item, QString filename)
 
+Mediaget_selected_folder ()
 
+bool reveal_media (Media *media, QModelIndex parent=QModelIndex())
 
+void add_recent_project (QString url)
 
+void new_project ()
 
+void load_project (bool autorecovery)
 
+void save_project (bool autorecovery)
 
+Mediacreate_folder_internal (QString name)
 
+Mediaitem_to_media (const QModelIndex &index)
 
+void save_recent_projects ()
 
+QVector< Media * > list_all_project_sequences ()
 
+QModelIndexList get_current_selected ()
 
+void start_preview_generator (Media *item, bool replacing)
 
+void get_all_media_from_table (QList< Media * > &items, QList< Media * > &list, int type=-1)
 
+ + + + + + + + + + + + + +

+Public Attributes

+SourceTabletree_view
 
+SourceIconViewicon_view
 
+SourcesCommonsources_common
 
+ProjectFiltersorter
 
+QVector< Media * > last_imported_media
 
+QWidget * toolbar_widget
 
+ + + + + + + + + + + + + + + + + +

+Private Slots

+void update_view_type ()
 
+void set_icon_view ()
 
+void set_tree_view ()
 
+void clear_recent_projects ()
 
+void set_icon_view_size (int)
 
+void set_up_dir_enabled ()
 
+void go_up_dir ()
 
+void make_new_menu ()
 
+ + + + + + + +

+Private Member Functions

+void save_folder (QXmlStreamWriter &stream, int type, bool set_ids_only, const QModelIndex &parent=QModelIndex())
 
+void list_all_sequences_worker (QVector< Media * > *list, Media *parent)
 
+QString get_file_name_from_path (const QString &path)
 
+ + + + + + + + + + + + + +

+Private Attributes

+int folder_id
 
+int media_id
 
+int sequence_id
 
+QDir proj_dir
 
+QWidget * icon_view_container
 
+QPushButton * directory_up
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_project.png b/docs/html/class_project.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc3cb1f8b246944a3f3d92b339456dd06a9bea3 GIT binary patch literal 427 zcmV;c0aX5pP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0003xNkl%6m8`g6WujmJmMMOLVa9Rt1i`>Y|;)Ql2Kfq3CKk{4FMv#HM1v$t7mVz8) z082p*GJvJeCyR)<2mx?VkpG;l7YsCQFrNE$L_Xem2f5g&|3w-}>Bgw8kuyTa-Dv9o zMxDuXb=E+>o(+Sn2YQgZ)w{_*&2xX1W^I()1sHYl8@yorU&z;N;}v~-vWSR>z5uqN VGQtn|xdZ?J002ovPDHLkV1m2P$szy% literal 0 HcmV?d00001 diff --git a/docs/html/class_project_filter-members.html b/docs/html/class_project_filter-members.html new file mode 100644 index 000000000..f93a2d60f --- /dev/null +++ b/docs/html/class_project_filter-members.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ProjectFilter Member List
+
+
+ +

This is the complete list of members for ProjectFilter, including all inherited members.

+ + + + + + + + +
filterAcceptsRow(int source_row, const QModelIndex &source_parent) const (defined in ProjectFilter)ProjectFilterprotectedvirtual
get_show_sequences() (defined in ProjectFilter)ProjectFilter
ProjectFilter(QObject *parent=nullptr) (defined in ProjectFilter)ProjectFilter
search_filter (defined in ProjectFilter)ProjectFilterprivate
set_show_sequences(bool b) (defined in ProjectFilter)ProjectFilterslot
show_sequences (defined in ProjectFilter)ProjectFilterprivate
update_search_filter(const QString &s) (defined in ProjectFilter)ProjectFilterslot
+ + + + diff --git a/docs/html/class_project_filter.html b/docs/html/class_project_filter.html new file mode 100644 index 000000000..27e5518c6 --- /dev/null +++ b/docs/html/class_project_filter.html @@ -0,0 +1,126 @@ + + + + + + + +Olive: ProjectFilter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ProjectFilter:
+
+
+ +
+ + + + + + +

+Public Slots

+void set_show_sequences (bool b)
 
+void update_search_filter (const QString &s)
 
+ + + + + +

+Public Member Functions

ProjectFilter (QObject *parent=nullptr)
 
+bool get_show_sequences ()
 
+ + + +

+Protected Member Functions

+virtual bool filterAcceptsRow (int source_row, const QModelIndex &source_parent) const
 
+ + + + + +

+Private Attributes

+bool show_sequences
 
+QString search_filter
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_project_filter.png b/docs/html/class_project_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..7597edf3a182d182eadcb27a170f13681a2fea67 GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^eLx(*!3-pSi0@4WQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;WpjRKErcwE*0|MKUz zh;w*E*&5GVv@Gaom1 z<(1p+-t=3wcx`y$wBNsjtYrO6vc$YEc|2V*DXY8i)!FuJQ(gD+8{J2L|BWnj|CqaR zt;O$MXLsImnzQK&uWah)eRKB9e%V~M?%LfRr8$2E)_(h9@#x2$%-+1O9LslqwP=?x zv1or0V)wm?-D2L06MXYoc@bFRr}JV`g=B?%U$c>Q2Ft zOSxqF*014PzH-gF;;oxhUP|7rJn-3K`?q?T=l8z-bf3P&qf^;);3VbWXU(ioJACpKQ^!;bhKWM#3PFz;T)bo&JUW>LGz%G&RQVj19AWI3 zf{^^R*di_MGY9hwSE!QMBaxfs3f^w`aC^hl%JD3aBSznZVFy+YG zO-mnz*fkjc6wL$<#SW~j`w&|9sQ6!cf!xpQ mPvvF7E}zAJ{7jBiE#niJfLqbKk~x8Cfx*+&&t;ucLK6ViSsI}L literal 0 HcmV?d00001 diff --git a/docs/html/class_project_model-members.html b/docs/html/class_project_model-members.html new file mode 100644 index 000000000..cc98e60fb --- /dev/null +++ b/docs/html/class_project_model-members.html @@ -0,0 +1,102 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ProjectModel Member List
+
+
+ +

This is the complete list of members for ProjectModel, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
appendChild(Media *parent, Media *child) (defined in ProjectModel)ProjectModel
child(int i, Media *parent=nullptr) (defined in ProjectModel)ProjectModel
childCount(Media *parent=nullptr) (defined in ProjectModel)ProjectModel
clear() (defined in ProjectModel)ProjectModel
columnCount(const QModelIndex &parent=QModelIndex()) const override (defined in ProjectModel)ProjectModel
create_index(int arow, int acolumn, void *aid) (defined in ProjectModel)ProjectModel
data(const QModelIndex &index, int role) const override (defined in ProjectModel)ProjectModel
destroy_root() (defined in ProjectModel)ProjectModel
flags(const QModelIndex &index) const override (defined in ProjectModel)ProjectModel
get_root() (defined in ProjectModel)ProjectModel
getItem(const QModelIndex &index) const (defined in ProjectModel)ProjectModel
headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override (defined in ProjectModel)ProjectModel
index(int row, int column, const QModelIndex &parent=QModelIndex()) const override (defined in ProjectModel)ProjectModel
make_root() (defined in ProjectModel)ProjectModel
moveChild(Media *child, Media *to) (defined in ProjectModel)ProjectModel
parent(const QModelIndex &index) const override (defined in ProjectModel)ProjectModel
ProjectModel(QObject *parent=nullptr) (defined in ProjectModel)ProjectModel
removeChild(Media *parent, Media *m) (defined in ProjectModel)ProjectModel
root_item (defined in ProjectModel)ProjectModelprivate
rowCount(const QModelIndex &parent=QModelIndex()) const override (defined in ProjectModel)ProjectModel
set_icon(Media *m, const QIcon &ico) (defined in ProjectModel)ProjectModel
setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override (defined in ProjectModel)ProjectModel
~ProjectModel() override (defined in ProjectModel)ProjectModel
+ + + + diff --git a/docs/html/class_project_model.html b/docs/html/class_project_model.html new file mode 100644 index 000000000..65c94dfee --- /dev/null +++ b/docs/html/class_project_model.html @@ -0,0 +1,163 @@ + + + + + + + +Olive: ProjectModel Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ProjectModel Class Reference
+
+
+
+Inheritance diagram for ProjectModel:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ProjectModel (QObject *parent=nullptr)
 
+void make_root ()
 
+void destroy_root ()
 
+void clear ()
 
+Mediaget_root ()
 
+QVariant data (const QModelIndex &index, int role) const override
 
+Qt::ItemFlags flags (const QModelIndex &index) const override
 
+QVariant headerData (int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
 
+QModelIndex index (int row, int column, const QModelIndex &parent=QModelIndex()) const override
 
+QModelIndex create_index (int arow, int acolumn, void *aid)
 
+QModelIndex parent (const QModelIndex &index) const override
 
+bool setData (const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
+int rowCount (const QModelIndex &parent=QModelIndex()) const override
 
+int columnCount (const QModelIndex &parent=QModelIndex()) const override
 
+MediagetItem (const QModelIndex &index) const
 
+void appendChild (Media *parent, Media *child)
 
+void moveChild (Media *child, Media *to)
 
+void removeChild (Media *parent, Media *m)
 
+Mediachild (int i, Media *parent=nullptr)
 
+int childCount (Media *parent=nullptr)
 
+void set_icon (Media *m, const QIcon &ico)
 
+ + + +

+Private Attributes

+Mediaroot_item
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_project_model.png b/docs/html/class_project_model.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bc1f96659ebda82c3e24caf9238706bafec9b5 GIT binary patch literal 551 zcmV+?0@(eDP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0005DNklqWR3;Yr9GAY{b@LS1(wcI+Tqo&Zj{}Db$hLq#>89(d=0tg>-ydJmB4( zGdObd{&afJHg3o_Q}$E$nH204|ETi^(WGcI-lS+UB|8cIx%j=R`ShdneQWRby@C5Y zH1tWfPjtQ{{k|4nl8UtOl2oL6yqQ^<0N&9BpiZ^;%cYcGi@(w<`NjA@-uVj;P^EfQUXXZ$`p z!5 p{|o==55)T70Tk)a~N4E?4=*0j4002ovPDHLkV1kuF4ut>! literal 0 HcmV?d00001 diff --git a/docs/html/class_proxy_dialog-members.html b/docs/html/class_proxy_dialog-members.html new file mode 100644 index 000000000..1529df83f --- /dev/null +++ b/docs/html/class_proxy_dialog-members.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ProxyDialog Member List
+
+
+ +

This is the complete list of members for ProxyDialog, including all inherited members.

+ + + + + + + + + + +
accept() override (defined in ProxyDialog)ProxyDialogvirtualslot
custom_location (defined in ProxyDialog)ProxyDialogprivate
format_combobox (defined in ProxyDialog)ProxyDialogprivate
location_changed(int i) (defined in ProxyDialog)ProxyDialogprivateslot
location_combobox (defined in ProxyDialog)ProxyDialogprivate
proxy_folder_name (defined in ProxyDialog)ProxyDialogprivate
ProxyDialog(QWidget *parent, const QVector< Footage * > &footage) (defined in ProxyDialog)ProxyDialog
selected_footage (defined in ProxyDialog)ProxyDialogprivate
size_combobox (defined in ProxyDialog)ProxyDialogprivate
+ + + + diff --git a/docs/html/class_proxy_dialog.html b/docs/html/class_proxy_dialog.html new file mode 100644 index 000000000..afde5790f --- /dev/null +++ b/docs/html/class_proxy_dialog.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: ProxyDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ProxyDialog:
+
+
+ +
+ + + + +

+Public Slots

+virtual void accept () override
 
+ + + +

+Public Member Functions

ProxyDialog (QWidget *parent, const QVector< Footage * > &footage)
 
+ + + +

+Private Slots

+void location_changed (int i)
 
+ + + + + + + + + + + + + +

+Private Attributes

+QComboBox * size_combobox
 
+QComboBox * format_combobox
 
+QComboBox * location_combobox
 
+QString custom_location
 
+QString proxy_folder_name
 
+QVector< Footage * > selected_footage
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_proxy_dialog.png b/docs/html/class_proxy_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..22671b92980f75df7528f401b557c12420f44c3a GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^fj}I4=-c?esHef)1)^PE4J$r1IFY`_twobN*5HtU7w3!c#6sUi$SJ zyD2N!md5mdOMKEVy?R~$vL5B{)~3I1m0dSJ_E&ks>lK9;UY{&pBW)9A@;!Ox?-kc4 ziKtxvan8~!s9{&7=i9CK(k7Xl5AR7!o5|2}gCWS%JTH2i(cK-~lc)YXR)6tzDvL*g zB;&J4w}#4Tf(i3dS!Se5GQKl3_GV@FNC8Uh>{;r|U>?Ic&-6_B<6N)Zd;B@1`e!bl zV->2F9mngnQ|@hZ_q?9xi=I`Plo6HT?toOHBEC9!tIN*>|A)@5GN@wI+RK zvWD~8FGy4$lz)EXzN+u~+Etb>7H?l)&0FC9W@FW1i9hFe7=|pgKlJ)9hXKU7e;D** W^glkmbj}hOzzm+QelF{r5}E+bBg7d1 literal 0 HcmV?d00001 diff --git a/docs/html/class_proxy_generator-members.html b/docs/html/class_proxy_generator-members.html new file mode 100644 index 000000000..5d335ccdb --- /dev/null +++ b/docs/html/class_proxy_generator-members.html @@ -0,0 +1,91 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ProxyGenerator Member List
+
+
+ +

This is the complete list of members for ProxyGenerator, including all inherited members.

+ + + + + + + + + + + + + +
cancel() (defined in ProxyGenerator)ProxyGenerator
cancelled (defined in ProxyGenerator)ProxyGeneratorprivate
current_progress (defined in ProxyGenerator)ProxyGeneratorprivate
get_proxy_progress(Footage *f) (defined in ProxyGenerator)ProxyGenerator
mutex (defined in ProxyGenerator)ProxyGeneratorprivate
proxy_queue (defined in ProxyGenerator)ProxyGeneratorprivate
ProxyGenerator() (defined in ProxyGenerator)ProxyGenerator
queue(const ProxyInfo &info) (defined in ProxyGenerator)ProxyGenerator
run() (defined in ProxyGenerator)ProxyGenerator
skip (defined in ProxyGenerator)ProxyGeneratorprivate
transcode(const ProxyInfo &info) (defined in ProxyGenerator)ProxyGeneratorprivate
waitCond (defined in ProxyGenerator)ProxyGeneratorprivate
+ + + + diff --git a/docs/html/class_proxy_generator.html b/docs/html/class_proxy_generator.html new file mode 100644 index 000000000..74e258ccd --- /dev/null +++ b/docs/html/class_proxy_generator.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: ProxyGenerator Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ProxyGenerator:
+
+
+ +
+ + + + + + + + + + +

+Public Member Functions

+void run ()
 
+void queue (const ProxyInfo &info)
 
+void cancel ()
 
+double get_proxy_progress (Footage *f)
 
+ + + +

+Private Member Functions

+void transcode (const ProxyInfo &info)
 
+ + + + + + + + + + + + + +

+Private Attributes

+QVector< ProxyInfoproxy_queue
 
+QWaitCondition waitCond
 
+QMutex mutex
 
+bool cancelled
 
+bool skip
 
+double current_progress
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_proxy_generator.png b/docs/html/class_proxy_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..bf10958961be98d31eecf21150fd86910e23fcb6 GIT binary patch literal 482 zcmV<80UiE{P)Mc0000OP)t-s|Ns90 z008Lh^>vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0004TNkl23u^lAQV|A0lIGGDEQ})`{CgCLMRo-eOQ>%t1Nj<&A zn^K z;C_w4JRU|O;*9FsOLg*$fks?KP7z!lT#+s zd=$?)QN8*aw$AqNX7yOSD$H8si&=NE!E_I84^tx2dDOJLz2yKuz^wi)railZuydH@ z49jS91KWgNOw(y)|M{UUr&PX5Sn9xf_UtS0{X=mEbHQ_T0&~Tq7k>l*PW>Fl% + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
QPainterWrapper Member List
+
+
+ +

This is the complete list of members for QPainterWrapper, including all inherited members.

+ + + + + + + + + +
drawRect(int x, int y, int width, int height) (defined in QPainterWrapper)QPainterWrapperslot
fill(const QString &color) (defined in QPainterWrapper)QPainterWrapperslot
fillRect(int x, int y, int width, int height, const QString &brush) (defined in QPainterWrapper)QPainterWrapperslot
img (defined in QPainterWrapper)QPainterWrapper
painter (defined in QPainterWrapper)QPainterWrapper
QPainterWrapper() (defined in QPainterWrapper)QPainterWrapper
setBrush(const QString &brush) (defined in QPainterWrapper)QPainterWrapperslot
setPen(const QString &pen) (defined in QPainterWrapper)QPainterWrapperslot
+ + + + diff --git a/docs/html/class_q_painter_wrapper.html b/docs/html/class_q_painter_wrapper.html new file mode 100644 index 000000000..8ef68d729 --- /dev/null +++ b/docs/html/class_q_painter_wrapper.html @@ -0,0 +1,118 @@ + + + + + + + +Olive: QPainterWrapper Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
QPainterWrapper Class Reference
+
+
+
+Inheritance diagram for QPainterWrapper:
+
+
+ +
+ + + + + + + + + + + + +

+Public Slots

+void fill (const QString &color)
 
+void fillRect (int x, int y, int width, int height, const QString &brush)
 
+void drawRect (int x, int y, int width, int height)
 
+void setPen (const QString &pen)
 
+void setBrush (const QString &brush)
 
+ + + + + +

+Public Attributes

+QImage * img
 
+QPainter * painter
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_q_painter_wrapper.png b/docs/html/class_q_painter_wrapper.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e68ce472d01913aefad180aa0b4bda454b67bd GIT binary patch literal 496 zcmVvTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0004hNkl=Mq3`DP9GXMX_trrj&oTRQox^NB?mLP5<#?C8dW&?#u(lAY)B*p1R@)lp! zqcoLNwTFj2!*fFZI17s4c`oH>&2!bB@zUiwNK#iA zP%v+~u=D)x7*XB!H*nyp2^3fU1S^ymRoH=DMMEe^pQ!?nzeVuQoRUM_%!R-9U#-bCFwK-e1O) z0Zo3}HPn7+^7DNBpdyX7s|(Qg=N(>4sd@eTJ9+*N_4JI>5y@^XFYoXB^HuMc+J8XR mCJ!J^lLru|H}K5N#_0nVeL~SpwC`g80000 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RefreshClips Member List
+
+
+ +

This is the complete list of members for RefreshClips, including all inherited members.

+ + + + + + + + + +
doRedo() override (defined in RefreshClips)RefreshClipsvirtual
doUndo() override (defined in RefreshClips)RefreshClipsvirtual
media (defined in RefreshClips)RefreshClipsprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
RefreshClips(Media *m) (defined in RefreshClips)RefreshClips
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_refresh_clips.html b/docs/html/class_refresh_clips.html new file mode 100644 index 000000000..b80e85622 --- /dev/null +++ b/docs/html/class_refresh_clips.html @@ -0,0 +1,122 @@ + + + + + + + +Olive: RefreshClips Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RefreshClips Class Reference
+
+
+
+Inheritance diagram for RefreshClips:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

RefreshClips (Media *m)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + +

+Private Attributes

+Mediamedia
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_refresh_clips.png b/docs/html/class_refresh_clips.png new file mode 100644 index 0000000000000000000000000000000000000000..adc048553c4b8a4f3bdff9186b1f990731244eae GIT binary patch literal 697 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0ho_5UNCo5DxtWtbTX8T*$E3cifBd{c z*lUlUnCrh8VF z9p3sX;mVmeUFo6Kx!osA8lFm==6e=4Ip=NZvA9g;x^KN%E4SaWdvWf6MCQgfQy1Ud zzTB#^RLl6~>4$H`r*iYJn6_tU;7{)VQKc4d)tK)l<()gYV&<2prQa_8Uv<|Z`cC?S z-@kJmlb)Tn+2Ch+&cS%|{G}mjX^dW}X<`cDs!EfX4m|H+uza%enBm!}%V+sSu5-C6 zfA&BSql<>9LqiZF3mO$#-Igd(ln@Ylc0tIhRgC}mwPw!yX)7LjwQt>f6}Qk@%i!Eu zlTDYru0LG7E=pbhcC5MWW|`9Pvu}_4OV4?A{MGr8MXT7q7^YvB4F72$zj)QHkIS<5 zZggK)@?JjV=f$!>#n9=E)q7vR2qQgB$wz=TGvvQ<*DRA7(<3Lns4 zJ+0(pZiD)_eWn$U(k{2J%3C>EblW}MAODK6GB(RWoWY#l&ztI6d{$ z{nI+7+Ih0)SDEo$DEzwC>T2-r{2#V+?mfG?^4jm)e2;IxedZS$ADi&~WzCVTuikRo z{0h74_~)PX`Q!IjopzZ1yOwR6-~RUVMgkAK*NJIELiR*xXUCEc@>aKlOy#3am;=)p NgQu&X%Q~loCID07MN|L) literal 0 HcmV?d00001 diff --git a/docs/html/class_reload_effects_command-members.html b/docs/html/class_reload_effects_command-members.html new file mode 100644 index 000000000..66eae28c0 --- /dev/null +++ b/docs/html/class_reload_effects_command-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ReloadEffectsCommand Member List
+
+
+ +

This is the complete list of members for ReloadEffectsCommand, including all inherited members.

+ + + + + + + +
doRedo() override (defined in ReloadEffectsCommand)ReloadEffectsCommandvirtual
doUndo() override (defined in ReloadEffectsCommand)ReloadEffectsCommandvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_reload_effects_command.html b/docs/html/class_reload_effects_command.html new file mode 100644 index 000000000..908d73c94 --- /dev/null +++ b/docs/html/class_reload_effects_command.html @@ -0,0 +1,112 @@ + + + + + + + +Olive: ReloadEffectsCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ReloadEffectsCommand Class Reference
+
+
+
+Inheritance diagram for ReloadEffectsCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_reload_effects_command.png b/docs/html/class_reload_effects_command.png new file mode 100644 index 0000000000000000000000000000000000000000..dde19efea357edf9eee66a58c5dde0426205f672 GIT binary patch literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^6M?vcgBeI(xc}1$NJ#|vgt-3y{~ySF@#br3|Dg#$ z78oBmaDcV*jy#adQ4-`A%m7pb0#{Fk7%?y~UGQ{q45?szJNNaZ)d~V^vo~tp|GodC zVHcC2y5a0M3%8|p_nk<6A$#Edk|~!0Ca7d89P*e{1Hv_ne_xEB_uK#FE1teztX^7jWwYwa!>)_B#${EfPd)p) zY4w@7muIIfkqa*_`IOPK|fLi+Sd!7;8?~A1 z?#rn`(S1Nej&t8%Jn7q`fcsltZQjc36%;$I&*rInx$mU9`393z;8?LY$SYHY!R`=m zf<~M1uDfo*Qs*+nqXPmTZZA^K4`mr-B8st^Jefp^HaA=?BAXJ{9pR&-qiBC!z*@XSMSZtP~Deb z@XG`?s;bCrzAr^E;=qvGIHZBje9thGOrs%vo+s50vjPv?WTx0&6)knO0uQ|Z@7MHu~C$rv}Jf|z`x9^pQ`6YH@%S!{jx5w@A{Q( zZGL@y&9g$@$(}ytoBDpmqVn?>5572P(*IiG>egn#CEH|#E}RX#*ZOGhb{oCBl5u5! zO&2>yp#kTJ*>LowBfJT-P6uL`6#nheA6$F-201dW14n7 y*^s){xsRbup@*U75XS*^Ak}8#rMYzC5B9|uiaMT7DF^_jcLq;aKbLh*2~7ZA&V>B{ literal 0 HcmV?d00001 diff --git a/docs/html/class_remove_clips_from_clipboard-members.html b/docs/html/class_remove_clips_from_clipboard-members.html new file mode 100644 index 000000000..44801d332 --- /dev/null +++ b/docs/html/class_remove_clips_from_clipboard-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RemoveClipsFromClipboard Member List
+
+
+ +

This is the complete list of members for RemoveClipsFromClipboard, including all inherited members.

+ + + + + + + + + + + + +
clip (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardprivate
done (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardprivate
doRedo() override (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardvirtual
doUndo() override (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
pos (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardprivate
redo() override (defined in OliveAction)OliveActionvirtual
RemoveClipsFromClipboard(int index) (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboard
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
~RemoveClipsFromClipboard() override (defined in RemoveClipsFromClipboard)RemoveClipsFromClipboardvirtual
+ + + + diff --git a/docs/html/class_remove_clips_from_clipboard.html b/docs/html/class_remove_clips_from_clipboard.html new file mode 100644 index 000000000..c19ffdb69 --- /dev/null +++ b/docs/html/class_remove_clips_from_clipboard.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: RemoveClipsFromClipboard Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RemoveClipsFromClipboard Class Reference
+
+
+
+Inheritance diagram for RemoveClipsFromClipboard:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

RemoveClipsFromClipboard (int index)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+int pos
 
+Clipclip
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_remove_clips_from_clipboard.png b/docs/html/class_remove_clips_from_clipboard.png new file mode 100644 index 0000000000000000000000000000000000000000..09227ce47dfd9634961e88a2764c8ffe291a9bc3 GIT binary patch literal 870 zcmeAS@N?(olHy`uVBq!ia0vp^D}lI!gBeJ!{%zd{q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0zIwVihEy=Vo%?puW-S4>*&DUa|Godw zu#U0Iuuy$>dsTXOT%g1oo}T@lnoIQ*JcHOEFxFf117S_I{fyGt@la ze|+|3yRZ4d>&torJ*!$bzck9;vqmq|=l+}{KiPfCD>r_v>%3uAxu9p-67ISLtMA46 z(mI>|i_BEr?x!6!Y26P`KYzWcE2q4=22`MJXQ+Gc8}sFzPxfU;$!)v6?5u(3u19rm z#r2MAOD_&ub=wf6<3shV?fSc?ZjG-gyYA_!b=zb^OU=@6sxR|7gFQc~`lz0qZZK6P zewUH2=2AI^g6E7ESntlTliRzZEZM57Y|*X$%qw;c=80Snyk{`|5L(8tuSK&#A2;{U z>t%-xcw!GEq+Mf7%u0LaJ!96)pGDVAdh0KjW~HTxUfn#|GA&KM;Bv`Un?R4N#q4Kq zFFU>ad5W&)>>0v)XZn3VUtd}9=Du;csc+h~1@nr(>(t!cGAHbuq494H`OB%h=ck6n z{@=gsX~w;$`%Ttn)xQqs&)T`)*tW*MJL>$h*R`>~_vd7#ecRo#a^_5ZxC1UteQChs z%+IjnGsBCfJRkY~xRBk3vaZ&FZ;zW~$sd?)!1_Vehp~n;m?8d<$bsp&x&KNpPYHU( zB;>#j4TjTcR@21~MC)vJ|K{kukZDT>>%O}8S~IMtEB=1b_N;pSUG{q>vGt#K-I>;$ zWwPFAt7Yf!jn4!2Mp+vi51(%N?@GztS(>|c*vFg_SJSw?>-^iRQjM0Iez+b@_&n#? z%e5bbFMoPj=5szQoBf*S`fVF0UQVs%*Sux6K_Yk0hYi2YeP7Snd*|=nPfK5}V|iuC zJ~Mh5=Z(*==E&)MvyM9F8L+MR^5g^GEbpHC;rce;@${9qB69ZK>09qdtd+d6;;+r$ z3Be7!@5DWte87Np$Fu9cjQjkcacpD1OLOTJ#{Y~Pq}vSB`~$jxnS#O7)z4*}Q$iB} D6cD0_ literal 0 HcmV?d00001 diff --git a/docs/html/class_rename_clip_command-members.html b/docs/html/class_rename_clip_command-members.html new file mode 100644 index 000000000..4dfc686e0 --- /dev/null +++ b/docs/html/class_rename_clip_command-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RenameClipCommand Member List
+
+
+ +

This is the complete list of members for RenameClipCommand, including all inherited members.

+ + + + + + + + + + + +
clips (defined in RenameClipCommand)RenameClipCommand
doRedo() override (defined in RenameClipCommand)RenameClipCommandvirtual
doUndo() override (defined in RenameClipCommand)RenameClipCommandvirtual
new_name (defined in RenameClipCommand)RenameClipCommand
old_names (defined in RenameClipCommand)RenameClipCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
RenameClipCommand() (defined in RenameClipCommand)RenameClipCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_rename_clip_command.html b/docs/html/class_rename_clip_command.html new file mode 100644 index 000000000..8a51ec546 --- /dev/null +++ b/docs/html/class_rename_clip_command.html @@ -0,0 +1,129 @@ + + + + + + + +Olive: RenameClipCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RenameClipCommand Class Reference
+
+
+
+Inheritance diagram for RenameClipCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Public Attributes

+QVector< Clip * > clips
 
+QString new_name
 
+ + + +

+Private Attributes

+QVector< QString > old_names
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_rename_clip_command.png b/docs/html/class_rename_clip_command.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc24c62c6ec34f21214dfc4a17718fa6033e130 GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^Z9v??!3-ot*Ct;EQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;8}{n-sP^-z#{<$>$NC8{bO! zP71qzzjxQFtp(M=v(9^$32n+ z&uf1m!JNEMqA^*ZXNM-kEHQ~jMuvGnFEAVkPGDhUsNm{3z`)?&C@8`3K-1u##xWD$ z;QGX%(6?(3aPWkN`kNc3{EVKT9UN+El&o&IYSr>x?Gpw4K6OjhpD7Se_MWqBr*Bzk z)S{-1-{S4B?$~qx;4c>EkgF5F?%eLWzxU#jr0h zHQ%Ql2>T~=?BVWs|d;ZO@-9m#AD>+<3=Z@ptcy zJ*$dOrY`#S@TmR!hYxd1TD1~x+w?rvVDY={`!ywao9)d6@9n;!Yx5IlJV}?Bc2n%e z`4_r9&e!D6AG37pG_&3#-FhJ3`ggzi(r=$$uDW)&TzUSVPj@#Qi>=U_S=D}(p`rY1 oW!Hg@{~JKzf9!~W;LCOOSC40wMDFug228LFp00i_>zopr0J`8^+5i9m literal 0 HcmV?d00001 diff --git a/docs/html/class_render_thread-members.html b/docs/html/class_render_thread-members.html new file mode 100644 index 000000000..e0cde0f72 --- /dev/null +++ b/docs/html/class_render_thread-members.html @@ -0,0 +1,115 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RenderThread Member List
+
+
+ +

This is the complete list of members for RenderThread, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
back_buffer_1 (defined in RenderThread)RenderThreadprivate
back_buffer_2 (defined in RenderThread)RenderThreadprivate
back_texture_1 (defined in RenderThread)RenderThreadprivate
back_texture_2 (defined in RenderThread)RenderThreadprivate
blend_mode_program (defined in RenderThread)RenderThreadprivate
cancel() (defined in RenderThread)RenderThread
ctx (defined in RenderThread)RenderThreadprivate
delete_ctx() (defined in RenderThread)RenderThreadslot
delete_fbo() (defined in RenderThread)RenderThreadprivate
delete_shader_program() (defined in RenderThread)RenderThreadprivate
delete_texture() (defined in RenderThread)RenderThreadprivate
did_texture_fail() (defined in RenderThread)RenderThread
divider (defined in RenderThread)RenderThreadprivate
front_buffer (defined in RenderThread)RenderThread
front_texture (defined in RenderThread)RenderThread
gizmos (defined in RenderThread)RenderThread
mutex (defined in RenderThread)RenderThread
paint() (defined in RenderThread)RenderThread
pixel_buffer (defined in RenderThread)RenderThreadprivate
pixel_buffer_linesize (defined in RenderThread)RenderThreadprivate
premultiply_program (defined in RenderThread)RenderThreadprivate
queued (defined in RenderThread)RenderThreadprivate
ready() (defined in RenderThread)RenderThreadsignal
RenderThread() (defined in RenderThread)RenderThread
run() (defined in RenderThread)RenderThread
running (defined in RenderThread)RenderThreadprivate
save_fn (defined in RenderThread)RenderThreadprivate
seq (defined in RenderThread)RenderThreadprivate
share_ctx (defined in RenderThread)RenderThreadprivate
start_render(QOpenGLContext *share, Sequence *s, const QString &save=nullptr, GLvoid *pixels=nullptr, int pixel_linesize=0, int idivider=0) (defined in RenderThread)RenderThread
surface (defined in RenderThread)RenderThreadprivate
tex_height (defined in RenderThread)RenderThreadprivate
tex_width (defined in RenderThread)RenderThreadprivate
texture_failed (defined in RenderThread)RenderThreadprivate
waitCond (defined in RenderThread)RenderThreadprivate
~RenderThread() (defined in RenderThread)RenderThread
+ + + + diff --git a/docs/html/class_render_thread.html b/docs/html/class_render_thread.html new file mode 100644 index 000000000..7cec56a52 --- /dev/null +++ b/docs/html/class_render_thread.html @@ -0,0 +1,215 @@ + + + + + + + +Olive: RenderThread Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for RenderThread:
+
+
+ +
+ + + + +

+Public Slots

+void delete_ctx ()
 
+ + + +

+Signals

+void ready ()
 
+ + + + + + + + + + + +

+Public Member Functions

+void run ()
 
+void paint ()
 
+void start_render (QOpenGLContext *share, Sequence *s, const QString &save=nullptr, GLvoid *pixels=nullptr, int pixel_linesize=0, int idivider=0)
 
+bool did_texture_fail ()
 
+void cancel ()
 
+ + + + + + + + + +

+Public Attributes

+QMutex mutex
 
+GLuint front_buffer
 
+GLuint front_texture
 
+Effectgizmos
 
+ + + + + + + +

+Private Member Functions

+void delete_texture ()
 
+void delete_fbo ()
 
+void delete_shader_program ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QWaitCondition waitCond
 
+QOffscreenSurface surface
 
+QOpenGLContext * share_ctx
 
+QOpenGLContext * ctx
 
+QOpenGLShaderProgram * blend_mode_program
 
+QOpenGLShaderProgram * premultiply_program
 
+GLuint back_buffer_1
 
+GLuint back_buffer_2
 
+GLuint back_texture_1
 
+GLuint back_texture_2
 
+Sequenceseq
 
+int divider
 
+int tex_width
 
+int tex_height
 
+bool queued
 
+bool texture_failed
 
+bool running
 
+QString save_fn
 
+GLvoid * pixel_buffer
 
+int pixel_buffer_linesize
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_render_thread.png b/docs/html/class_render_thread.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cbba746dc16a07e9ca55d2cbb3459ef8278e72 GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^u|OQa!3-pQ3_JCKlth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#Bbgr|#RNCo5DxexOWEAX(Lum807zw~;| zWsHwfe53PcwOtXua^R?hJwsYrX2PT?N49te9m&6WUHyCF+_~z78>%w)x1WwOp1P!? zyR1L&QS`UcJ@F^jhqrxyyLyZ4?S(b2ldANd=*_I!)$eiX#LTc zzkRy)okyxcWG$6r5c}?&OPT$?cc1Tz)o|2CIe$Hqyu$R})!OZwC2QW7oo%f9 zJY)BD1&`%FOH$UKetYrosh02?a@uEV%b#s|7t1?;^_j@K$LCerL|r#txcBYMM{;i& k + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ReplaceClipMediaCommand Member List
+
+
+ +

This is the complete list of members for ReplaceClipMediaCommand, including all inherited members.

+ + + + + + + + + + + + + + +
clips (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommand
doRedo() override (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandvirtual
doUndo() override (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandvirtual
new_media (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandprivate
old_clip_ins (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandprivate
old_media (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
preserve_clip_ins (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandprivate
redo() override (defined in OliveAction)OliveActionvirtual
replace(bool undo) (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommandprivate
ReplaceClipMediaCommand(Media *, Media *, bool) (defined in ReplaceClipMediaCommand)ReplaceClipMediaCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_replace_clip_media_command.html b/docs/html/class_replace_clip_media_command.html new file mode 100644 index 000000000..f974f2c5e --- /dev/null +++ b/docs/html/class_replace_clip_media_command.html @@ -0,0 +1,145 @@ + + + + + + + +Olive: ReplaceClipMediaCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ReplaceClipMediaCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

ReplaceClipMediaCommand (Media *, Media *, bool)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + +

+Public Attributes

+QVector< Clip * > clips
 
+ + + +

+Private Member Functions

+void replace (bool undo)
 
+ + + + + + + + + +

+Private Attributes

+Mediaold_media
 
+Medianew_media
 
+bool preserve_clip_ins
 
+QVector< int > old_clip_ins
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_replace_clip_media_command.png b/docs/html/class_replace_clip_media_command.png new file mode 100644 index 0000000000000000000000000000000000000000..0808bf3257c52d1fead597bdfd2fd215d80b0ac2 GIT binary patch literal 890 zcmeAS@N?(olHy`uVBq!ia0vp^tAMzJgBeIVoN4F{WfqIDf^uuWQ4k zXMf#4W6iX!Mz3@|`+sDF^6SlAHRYGl8z8U3b8F>Y_EoRTzo%aPc3|&Xt2b&uB?`GjU?W3!EcD;R|c0H{@?eDY&DqEl4ny|Y@o!R5kd!bd6p7^ftnq&@g z>Y1gpg1mwm9-QY);CmKmJ9k;(T=%azR^6{%R!wAN_`?~>knbdVV0HlO2elB!J-E5g z_J_w#OP$FqX1rOFBh=V9-|6a^GqbmcUjA9WH?DhTr2F?b3dhd8VZ9fsJByufW%auU zKlf$T{oEB(d2!tu@7U1w->2_i`!S~8|8BVH%$p5%&+b0{PD6c5_d`zC&S$KPx_ahKIw#!n08``7X?j;v zBd2LHe0a`c!2Wr~Jip63&MmGon|riW>FNmvhJP(u4dx5E9{8?cst{hqa1S^4^ZnJ! zrd*Plz>uZ@4Tn{)e)TfOTF!Ilv)_DlO4R+;+$&`n=Pi-Qn>z94!v(5)xKHqzYc=n_ z9>X7cI%}%yY5rf{wb!$v7fD~0ic>4OTv+X&w@&yy%O?istD9CIU1)bBHtK5Do&9^| zUv5jzJG*)1)VT-zO08>tPuzXWW9t>RRfiLI?R3aGb#{`hOv4`kN~g2uOq)x}e^1q) z$KSSd`L6es&l&FYm3*!#2`gXqy?y6mE1LrOIakeU%H`hAy?VD=;q9rq263YUyO#PY zz4)9ZT|3+S7SD#a`I7~Owy3h_J$@4=nsGXMCjWzKP$0OkVyN$dM*2>b_fvvqHP(Nw XZkH%}@gNqMQ5Za3{an^LB{Ts5-PNjZ literal 0 HcmV?d00001 diff --git a/docs/html/class_replace_clip_media_dialog-members.html b/docs/html/class_replace_clip_media_dialog-members.html new file mode 100644 index 000000000..b85aeb069 --- /dev/null +++ b/docs/html/class_replace_clip_media_dialog-members.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ReplaceClipMediaDialog Member List
+
+
+ +

This is the complete list of members for ReplaceClipMediaDialog, including all inherited members.

+ + + + + + +
media (defined in ReplaceClipMediaDialog)ReplaceClipMediaDialogprivate
replace() (defined in ReplaceClipMediaDialog)ReplaceClipMediaDialogprivateslot
ReplaceClipMediaDialog(QWidget *parent, Media *old_media) (defined in ReplaceClipMediaDialog)ReplaceClipMediaDialog
tree (defined in ReplaceClipMediaDialog)ReplaceClipMediaDialogprivate
use_same_media_in_points (defined in ReplaceClipMediaDialog)ReplaceClipMediaDialogprivate
+ + + + diff --git a/docs/html/class_replace_clip_media_dialog.html b/docs/html/class_replace_clip_media_dialog.html new file mode 100644 index 000000000..600550dd5 --- /dev/null +++ b/docs/html/class_replace_clip_media_dialog.html @@ -0,0 +1,116 @@ + + + + + + + +Olive: ReplaceClipMediaDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ReplaceClipMediaDialog Class Reference
+
+
+
+Inheritance diagram for ReplaceClipMediaDialog:
+
+
+ +
+ + + + +

+Public Member Functions

ReplaceClipMediaDialog (QWidget *parent, Media *old_media)
 
+ + + +

+Private Slots

+void replace ()
 
+ + + + + + + +

+Private Attributes

+Mediamedia
 
+QTreeView * tree
 
+QCheckBox * use_same_media_in_points
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_replace_clip_media_dialog.png b/docs/html/class_replace_clip_media_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..4229d589d1e1c4a3057878807fba6dbad3b3006c GIT binary patch literal 577 zcmeAS@N?(olHy`uVBq!ia0vp^(}6gEgBeIFuMu|#QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;-G7WE1$+?+IwE&ue|m; zz|ykz#_Ez=U3Z!f%;yCKTE_L=6_-OFc~5F zQ#39ujqxDEp@|T&^AESmGbL2K^Pc{pS1dR?dA;G1eQEDlw=A#Jb$(ZM^@HL9pEoA^ z4O3q78W>eywYgFoUa~_v@X1ywB+FMw$KbwO?MfY)x!?AD+3(rr+Ve zO&Rx|59c~wY`qol@V`ba{;d{IeLgdb642Ky-;9jAkBjsEjehk^xlaTb-wd9velF{r G5}E+-DiJgQ literal 0 HcmV?d00001 diff --git a/docs/html/class_replace_media_command-members.html b/docs/html/class_replace_media_command-members.html new file mode 100644 index 000000000..f44a9ddbf --- /dev/null +++ b/docs/html/class_replace_media_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ReplaceMediaCommand Member List
+
+
+ +

This is the complete list of members for ReplaceMediaCommand, including all inherited members.

+ + + + + + + + + + + + +
doRedo() override (defined in ReplaceMediaCommand)ReplaceMediaCommandvirtual
doUndo() override (defined in ReplaceMediaCommand)ReplaceMediaCommandvirtual
item (defined in ReplaceMediaCommand)ReplaceMediaCommandprivate
new_filename (defined in ReplaceMediaCommand)ReplaceMediaCommandprivate
old_filename (defined in ReplaceMediaCommand)ReplaceMediaCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
replace(QString &filename) (defined in ReplaceMediaCommand)ReplaceMediaCommandprivate
ReplaceMediaCommand(Media *, QString) (defined in ReplaceMediaCommand)ReplaceMediaCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_replace_media_command.html b/docs/html/class_replace_media_command.html new file mode 100644 index 000000000..1e2b8bfe8 --- /dev/null +++ b/docs/html/class_replace_media_command.html @@ -0,0 +1,135 @@ + + + + + + + +Olive: ReplaceMediaCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ReplaceMediaCommand Class Reference
+
+
+
+Inheritance diagram for ReplaceMediaCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

ReplaceMediaCommand (Media *, QString)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + +

+Private Member Functions

+void replace (QString &filename)
 
+ + + + + + + +

+Private Attributes

+Mediaitem
 
+QString old_filename
 
+QString new_filename
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_replace_media_command.png b/docs/html/class_replace_media_command.png new file mode 100644 index 0000000000000000000000000000000000000000..8cb28b3f010e06c94b19d986c3adf30c512d890d GIT binary patch literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^Q-HXGgBeJgeKTSMQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;<$FZ?ck2_YRtTp**Yq|GL0^`yLf<<1E-L{p8p%BOj^RBsp=^huCGzTH-&|l|>Pj z$L{`}<-cUw=c;@EwB9?ddULn`<@6=1u5X{Zy6x8E@FjfrS3cVMHYj^aT36=;L^g}QROL}WzWqpDpuXSYh?Lc9 z-Nc3OdCI2mv)p%mYTT{vgjoLy<*R!nuPF$ zzZ41PIkko7&UH%{E{)6ff6pxkM&rK!&TKDQfsuJ(^^}>B>3 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ResizableScrollBar Member List
+
+
+ +

This is the complete list of members for ResizableScrollBar, including all inherited members.

+ + + + + + + + + + + + + + +
is_resizing() (defined in ResizableScrollBar)ResizableScrollBar
mouseMoveEvent(QMouseEvent *) override (defined in ResizableScrollBar)ResizableScrollBarprotected
mousePressEvent(QMouseEvent *) override (defined in ResizableScrollBar)ResizableScrollBarprotected
mouseReleaseEvent(QMouseEvent *) override (defined in ResizableScrollBar)ResizableScrollBarprotected
ResizableScrollBar(QWidget *parent=0) (defined in ResizableScrollBar)ResizableScrollBar
resize_init (defined in ResizableScrollBar)ResizableScrollBarprivate
resize_move(double i) (defined in ResizableScrollBar)ResizableScrollBarsignal
resize_proc (defined in ResizableScrollBar)ResizableScrollBarprivate
resize_start (defined in ResizableScrollBar)ResizableScrollBarprivate
resize_start_max (defined in ResizableScrollBar)ResizableScrollBarprivate
resize_start_width (defined in ResizableScrollBar)ResizableScrollBarprivate
resize_top (defined in ResizableScrollBar)ResizableScrollBarprivate
resizeEvent(QResizeEvent *event) override (defined in ResizableScrollBar)ResizableScrollBarprotected
+ + + + diff --git a/docs/html/class_resizable_scroll_bar.html b/docs/html/class_resizable_scroll_bar.html new file mode 100644 index 000000000..a77e06873 --- /dev/null +++ b/docs/html/class_resizable_scroll_bar.html @@ -0,0 +1,144 @@ + + + + + + + +Olive: ResizableScrollBar Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ResizableScrollBar:
+
+
+ +
+ + + + +

+Signals

+void resize_move (double i)
 
+ + + + + +

+Public Member Functions

ResizableScrollBar (QWidget *parent=0)
 
+bool is_resizing ()
 
+ + + + + + + + + +

+Protected Member Functions

+void resizeEvent (QResizeEvent *event) override
 
+void mousePressEvent (QMouseEvent *) override
 
+void mouseMoveEvent (QMouseEvent *) override
 
+void mouseReleaseEvent (QMouseEvent *) override
 
+ + + + + + + + + + + + + +

+Private Attributes

+bool resize_init
 
+bool resize_proc
 
+int resize_start
 
+bool resize_top
 
+int resize_start_max
 
+int resize_start_width
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_resizable_scroll_bar.png b/docs/html/class_resizable_scroll_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..55d0f01f0a7117d00d7873dd02b4d2699fdcb796 GIT binary patch literal 535 zcmeAS@N?(olHy`uVBq!ia0vp^>fb}rSqfiTwYe3AADOfdp-YzCBb^t(@TyU)bd`s`@Ra)nE#UX#rZExU(%}>e;My(5H~cIW?(C@2FX0UxAr8%|0%-NIe$zUuIOBTeVM~z zPr96f&D8Hl*FDK)xpMDI-TCuh4po+Q`dzMkWKr%nefpm3>~ks)PqS4!-!@e@_TJw5 zwZ>OIme%&iJ~f@D`CX#^-He4R@_9<0`+lFOXXcW(Sugd>^>4eX^QvmwDzwVE_c2{v zx6FLrBd1#DzpH-DTl)9R??v + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
RippleAction Member List
+
+
+ +

This is the complete list of members for RippleAction, including all inherited members.

+ + + + + + + + + + + + + +
ca (defined in RippleAction)RippleActionprivate
doRedo() override (defined in RippleAction)RippleActionvirtual
doUndo() override (defined in RippleAction)RippleActionvirtual
ignore (defined in RippleAction)RippleActionprivate
length (defined in RippleAction)RippleActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
point (defined in RippleAction)RippleActionprivate
redo() override (defined in OliveAction)OliveActionvirtual
RippleAction(Sequence *is, long ipoint, long ilength, const QVector< int > &iignore) (defined in RippleAction)RippleAction
s (defined in RippleAction)RippleActionprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_ripple_action.html b/docs/html/class_ripple_action.html new file mode 100644 index 000000000..2351173df --- /dev/null +++ b/docs/html/class_ripple_action.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: RippleAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
RippleAction Class Reference
+
+
+
+Inheritance diagram for RippleAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

RippleAction (Sequence *is, long ipoint, long ilength, const QVector< int > &iignore)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + +

+Private Attributes

+Sequences
 
+long point
 
+long length
 
+QVector< int > ignore
 
+ComboActionca
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_ripple_action.png b/docs/html/class_ripple_action.png new file mode 100644 index 0000000000000000000000000000000000000000..acc198e75c9986b5a6235f93924c6fef59ba5095 GIT binary patch literal 684 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0wWo_?NCo5Dxo;<}R^V~)f7Da?-+bR! z;S~{Ym(9L=Q@TCafy3S4o4Jybp+Z`k;F42k&Kx|yVwuX!*MFCvS#|rhiSg#@HJ7`y z%=d(qx}7}}_i>HZ)on9u%r@jCS2pboSBb9gy&;{tpl@G*?%PYZ*jNAc*Vdi3_hR?H zJ6Aogt~j$q_wI}4RkPj&=vEdlT*d$A^s2lYu54l5p@wq}X;5V5jWBQ@E;-r}*efxn&yR3tsi7 zC9GnwS;BR|aTS9M8nr6sumO*u!HQLG6SP7@+4noD_GhnqzG&603wNw%E?!k?8Js(7 zvgwkY^@oesMKw=99xGp!cJtM`S-&s)OV(`p{px$jqE)iDEYpv_48MB$mF22cyyl^= zJAHRvx^jQTD)-ZlJ41Zg-o1V1wtJUz>5p}*dbC%qy`T1Aw^r!Y^OHapt_%t-6<96R zmdL^Qpw_KH;!((BiDzBGwmyOD9IncrJrKfJ;UU`49KvXUMuqNlaY=GuPyz|dhv~jF z>SZj=%(E%ili#`8YR#3%y}WyhP1c7LM}FU)UwpHGbI$ME?wjWxvtnOyYU--B4lge8 ztlQkUEN0JYXVnA7=bP_-ui3Xc`06)_+*cJLcOMiP-2VM*$*U)^rmOBf2rs*O{y^;3 zueW*jthK7sm;dShQ$LhpzEUUyUs9-&lHwocFvlR#}O0h1Pkr>mdKI;Vst07nl# A_5c6? literal 0 HcmV?d00001 diff --git a/docs/html/class_scroll_area-members.html b/docs/html/class_scroll_area-members.html new file mode 100644 index 000000000..cc9487f7e --- /dev/null +++ b/docs/html/class_scroll_area-members.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ScrollArea Member List
+
+
+ +

This is the complete list of members for ScrollArea, including all inherited members.

+ + + +
ScrollArea(QWidget *parent=0) (defined in ScrollArea)ScrollArea
wheelEvent(QWheelEvent *) (defined in ScrollArea)ScrollArea
+ + + + diff --git a/docs/html/class_scroll_area.html b/docs/html/class_scroll_area.html new file mode 100644 index 000000000..3dc96dff6 --- /dev/null +++ b/docs/html/class_scroll_area.html @@ -0,0 +1,99 @@ + + + + + + + +Olive: ScrollArea Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
ScrollArea Class Reference
+
+
+
+Inheritance diagram for ScrollArea:
+
+
+ +
+ + + + + + +

+Public Member Functions

ScrollArea (QWidget *parent=0)
 
+void wheelEvent (QWheelEvent *)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_scroll_area.png b/docs/html/class_scroll_area.png new file mode 100644 index 0000000000000000000000000000000000000000..da29f186dd81a5ee0cc6f6e04f7c25e1873631b2 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^!9X0q!3-pWe(anBq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgy**tVLn;{G&fUG~umTTjc<=fD|38+V zIV{v@(He9|vWxf8MBYa}RcFpjI;f&K_3e};Hgi5tjnGliEYQ2IJZa0Lvbe{u7mH64 z$@KfJ@%CKx2l4k!LH&N)ueR;{d}r@ztG%tYTPyyAmHW)O`bs|a>6ghnFPqApzIZd} z%Vg`D73V+M`Ja23`Do?&owJuTPA&d8@9U?1+}9IM*jm-TD^34@UsbagWToHonUQ)7 z_X`pOYs)}ec#>YoN%Iy>B+{q43#2KJc zn-{!xhm`owsr&SxB-3ZEuB*M|q`B!^O8ESR{cWw;!_Gbb{$}o7-nKi7FF${0^7}s@ i$hs$mR%g!?{bXi5XCR<_F}5EV)C``kelF{r5}E+TUf8q% literal 0 HcmV?d00001 diff --git a/docs/html/class_set_autoscale_action-members.html b/docs/html/class_set_autoscale_action-members.html new file mode 100644 index 000000000..343377eb4 --- /dev/null +++ b/docs/html/class_set_autoscale_action-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetAutoscaleAction Member List
+
+
+ +

This is the complete list of members for SetAutoscaleAction, including all inherited members.

+ + + + + + + + + +
clips (defined in SetAutoscaleAction)SetAutoscaleAction
doRedo() override (defined in SetAutoscaleAction)SetAutoscaleActionvirtual
doUndo() override (defined in SetAutoscaleAction)SetAutoscaleActionvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
SetAutoscaleAction() (defined in SetAutoscaleAction)SetAutoscaleAction
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_autoscale_action.html b/docs/html/class_set_autoscale_action.html new file mode 100644 index 000000000..2c79c7f33 --- /dev/null +++ b/docs/html/class_set_autoscale_action.html @@ -0,0 +1,119 @@ + + + + + + + +Olive: SetAutoscaleAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetAutoscaleAction Class Reference
+
+
+
+Inheritance diagram for SetAutoscaleAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + +

+Public Member Functions

+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + +

+Public Attributes

+QVector< Clip * > clips
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_autoscale_action.png b/docs/html/class_set_autoscale_action.png new file mode 100644 index 0000000000000000000000000000000000000000..a39607e3b537c631e3e87d6d2180ded2526e4b2b GIT binary patch literal 734 zcmeAS@N?(olHy`uVBq!ia0vp^RY2Uq!3-qj@A4l3QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;cwnX6VG?tby>&^@>E!+K#ATPwD@9nVsG`&pv)*={{a?G3vQ ztv+vW*%|qFO`GkLnAX`de`;JvOY7s>GIQqQV~bo}+BhE6o@Gcj;j=w|_{QT4+?68L z3cuX7Z7wj(<1%Sj%*6X(g#)vN)&+(>1UKfgiSK0z!hY5m}eL+iumW z-dQ`DH0(D_nU|Ca7n7sTJq>=o`T$%Z;k-Gt_?-W(Hh}f4=OETnqcwEou{wzlh6V z- + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetBool Member List
+
+
+ +

This is the complete list of members for SetBool, including all inherited members.

+ + + + + + + + + + + +
boolean (defined in SetBool)SetBoolprivate
doRedo() override (defined in SetBool)SetBoolvirtual
doUndo() override (defined in SetBool)SetBoolvirtual
new_setting (defined in SetBool)SetBoolprivate
old_setting (defined in SetBool)SetBoolprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
SetBool(bool *b, bool setting) (defined in SetBool)SetBool
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_bool.html b/docs/html/class_set_bool.html new file mode 100644 index 000000000..3dae68c10 --- /dev/null +++ b/docs/html/class_set_bool.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetBool Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetBool Class Reference
+
+
+
+Inheritance diagram for SetBool:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetBool (bool *b, bool setting)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+bool * boolean
 
+bool old_setting
 
+bool new_setting
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_bool.png b/docs/html/class_set_bool.png new file mode 100644 index 0000000000000000000000000000000000000000..c6b101e3e797f3672beb2fa1a66de07417c0059d GIT binary patch literal 655 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0oTrOpNCo5DxfdrbQQ%>)-gxTIfBE^! z8U?FgpK&dYj^3E#=#g>pM_-2rPshwimX$`v#UJWJ)+D^hVRa(68Rs0Y8)qI!rv^GSqIc+(^bn?ePvueM@Z#BOl_Fj9# z@4wp=3}2rwU9?Ole8J3{o0ptAbH;JinKLp+R=K!1G5nY#snBL|)uw&tqmXXRQ=%(= zEft-i#lXLksbGQ@13Ma(b=<@^n8#<;D#0aQp;r(32b?Tg^R{Z$Dn6cMb;DJ+=BKan zE#B0|^EkiaT&U?zo4nc=Q#W0W-Fk1oUT)D#`PKHpovY*wj?LNYw|^D?>*SD7_In{$ z&A+Xhy0A9j>iKQrPlI?xcYJSeEG%t*b-Mm)XiRYK_hi<(RY9S9r-!UuW#ut-)vD%* zt3Wq!Fw8e*J|eJu)^mgKIa!9TJDEcFZ(#~%eV`c1z!${&Kmm<rnTrgnI6)H8g` X4g6`?xQY{)dKf%i{an^LB{Ts5SZXR2 literal 0 HcmV?d00001 diff --git a/docs/html/class_set_double-members.html b/docs/html/class_set_double-members.html new file mode 100644 index 000000000..02b4c5def --- /dev/null +++ b/docs/html/class_set_double-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetDouble Member List
+
+
+ +

This is the complete list of members for SetDouble, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in SetDouble)SetDoublevirtual
doUndo() override (defined in SetDouble)SetDoublevirtual
newval (defined in SetDouble)SetDoubleprivate
oldval (defined in SetDouble)SetDoubleprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
p (defined in SetDouble)SetDoubleprivate
redo() override (defined in OliveAction)OliveActionvirtual
SetDouble(double *pointer, double old_value, double new_value) (defined in SetDouble)SetDouble
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_double.html b/docs/html/class_set_double.html new file mode 100644 index 000000000..4b7e7c410 --- /dev/null +++ b/docs/html/class_set_double.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetDouble Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetDouble Class Reference
+
+
+
+Inheritance diagram for SetDouble:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetDouble (double *pointer, double old_value, double new_value)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+double * p
 
+double oldval
 
+double newval
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_double.png b/docs/html/class_set_double.png new file mode 100644 index 0000000000000000000000000000000000000000..514db854d96bfea8f8ca38e5bc052dc1d7483e2d GIT binary patch literal 678 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0si%u$NCo5Dxo;<}R^V~)f7Da?-+W)) zf&*gFyI($g_vXk)j!6duXZ>?`QDHlBMyDxc=1j{U_N%sfZ2MMoWzDwuOJ~l!3%s=Y zm5EI_@1nG{^FLOtI=gX(j`WS~8|x2#3sXH_J+rVZYr)*VPFufczvnUg9Up#6H$C0t z_tSNHv;0!k{@Tv@yCCb5?5e$aaVu^y|KFBn@z#~qtlPAhEztPo`{Oqk{|~io+*J|X zc=rB#524N9?lGmF+QD@8Ox-k)Q#_{5oY@>PwZnsh;k_~Q5rO5io*RVE$ue}^$rM_@ zg(;Zzfnq2FUl8j91vKjGtYw*9jh>;VO(82+S^ePEid?t$ZeHlszPvX|?xDATdzEJB zU7L{ir|o%EsM`Da(RNkI_g}5Nb?>@6uioE{zig+jc-3I{{FTMuRc33?28O=fu~JKY z+cmH2{}!z3z1Cc`au=7)@4F8BcR7Fkus=&{-KxIt`=*z3w^H*$h=v}w!W0!o;)Vpu{Yg209?bg<5 z{G7Yxbu@d#^mV(ftbB{z_>~VZpFh3m|2OZ@=^uPUqj|Q6Jl?f4R_tr|{;k>#isqqb zz2eV(G2VZ*P-^L&YfjeZp7+$OU}CiMSj8Z-gzJFg8ZQ@>mio1?gJgE({8a%aDh5wi KKbLh*2~7aqO*?D= literal 0 HcmV?d00001 diff --git a/docs/html/class_set_effect_data-members.html b/docs/html/class_set_effect_data-members.html new file mode 100644 index 000000000..9c87a0975 --- /dev/null +++ b/docs/html/class_set_effect_data-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetEffectData Member List
+
+
+ +

This is the complete list of members for SetEffectData, including all inherited members.

+ + + + + + + + + + + +
data (defined in SetEffectData)SetEffectDataprivate
doRedo() override (defined in SetEffectData)SetEffectDatavirtual
doUndo() override (defined in SetEffectData)SetEffectDatavirtual
effect (defined in SetEffectData)SetEffectDataprivate
old_data (defined in SetEffectData)SetEffectDataprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
SetEffectData(Effect *e, const QByteArray &s) (defined in SetEffectData)SetEffectData
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_effect_data.html b/docs/html/class_set_effect_data.html new file mode 100644 index 000000000..3a0e79e9f --- /dev/null +++ b/docs/html/class_set_effect_data.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetEffectData Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetEffectData Class Reference
+
+
+
+Inheritance diagram for SetEffectData:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetEffectData (Effect *e, const QByteArray &s)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Effecteffect
 
+QByteArray data
 
+QByteArray old_data
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_effect_data.png b/docs/html/class_set_effect_data.png new file mode 100644 index 0000000000000000000000000000000000000000..268a8f7d573fd6821f2d4acdc8c30f6c9b38c3b2 GIT binary patch literal 708 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#BLu&0Y-NCo5Dxo;{Kn zMHQ*-rIpj~zPxZU*-pWdapQhL!A`-XG_i#)GiO?Uv0jlrQRnZ!6>)EO?3g)o@A5}+ zfz}VRuN=rq`!=<2#jV`-lgbUIJzv>QuW{N|d2=KGs)cv|GHva9ondbF(cV8w^LN6Q z->D(uvF%2a_wkm`59r;^y!F~y?vU9Z@)x(=jtfaBj@X=@U^;o<-17c?t7kPm@!MT&EKqHWWPnGMyLYJ%eO?-oUW`u+)PtgbsZU4vQCAWWR z{H#@3%k$nIau2;-)_Ti8Jl$jaKep#mp=Rr^>rRi`(za{yw4a{?d;331)bgvYvI=-# zJk`&BRcUr@NT~JRPA$pmYhKs?E3Ddj&1GjmEbF_+c?<3DHd@t&`yLIwV)kD9gPvFD z*Z*39t5)%;dWBwH7;y#Yh7N{z*=!wwGFkHuM-;AL*X$DQ_;rEHN2I|W*}04sQ#2Ub z!G3w=@1o+y;m`u)Tv)$oT2$tnr7q&9wH9nUyD*-~;#Eu3veLJeLCKc$H(7qU&TNs@ zqjhm@|E5hm-X*Ue?me8hl7B(wVwP=&Jd0LMJNIx)iQiWR^}mg`cS|j}b+PcD*s9v= zi&tpX@Rh%q=hV_!Z50$Laq5rH^;N(kdul5gN5`zoWoU md5#acpg`?+?d)iIA + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetInt Member List
+
+
+ +

This is the complete list of members for SetInt, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in SetInt)SetIntvirtual
doUndo() override (defined in SetInt)SetIntvirtual
newval (defined in SetInt)SetIntprivate
oldval (defined in SetInt)SetIntprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
p (defined in SetInt)SetIntprivate
redo() override (defined in OliveAction)OliveActionvirtual
SetInt(int *pointer, int new_value) (defined in SetInt)SetInt
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_int.html b/docs/html/class_set_int.html new file mode 100644 index 000000000..b6be30542 --- /dev/null +++ b/docs/html/class_set_int.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetInt Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetInt Class Reference
+
+
+
+Inheritance diagram for SetInt:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetInt (int *pointer, int new_value)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+int * p
 
+int oldval
 
+int newval
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_int.png b/docs/html/class_set_int.png new file mode 100644 index 0000000000000000000000000000000000000000..195111073e491e44b0486880d5236861ed83797c GIT binary patch literal 649 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0gr|#RNCo5Dxrv(>EATLw7asfbzrIFy zg~Mw9y)ni4R)rAL*0%cn?kx2SV(+y# z{Qh%I!SHqT%!r_G+855e*}UY`nKO>7&YY1svdYE9iDAci9s%b$S@RCZ6s~I5JSDo~ z*Cj3=(T4UAMhg$ohGsNsYxb;Vnrv#JS2==~u6p&re8rQ(sryVquQop1-YgON_V&cA zt1@d855E_;IlfAD=e~EJF17Bu>Ki(5{&usU67N^PU+EHBE|J{VcX|D*!@nee`np#= zJu+{r(HHrUubba4h*`CeY5T_yhj;99{`xJpRP=ht>(3F5<)N!q{ht=Ha+Q_G)K#mR zBd(hG26HfcpUIfi5q!3IhPK~V1J|8Qq480TE15n_&|+X;$y9(wtt#v6IMTr20utUI z80xjc`}L=F>k14vxbUv758L`?-My~dS_X^9#~AZY?OLi-c~ky?qWP&sC)}>S4rG!k zTFvx2bL-w3x2@BT3dt`0^@VZW{m{49xbCcCe$euVp9O4N{AwXV&WHT|cLHxQpLEm$ PrW*!NS3j3^P6 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetKeyframing Member List
+
+
+ +

This is the complete list of members for SetKeyframing, including all inherited members.

+ + + + + + + + + + +
b (defined in SetKeyframing)SetKeyframingprivate
doRedo() override (defined in SetKeyframing)SetKeyframingvirtual
doUndo() override (defined in SetKeyframing)SetKeyframingvirtual
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
row (defined in SetKeyframing)SetKeyframingprivate
SetKeyframing(EffectRow *irow, bool ib) (defined in SetKeyframing)SetKeyframing
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_keyframing.html b/docs/html/class_set_keyframing.html new file mode 100644 index 000000000..3cb8388ef --- /dev/null +++ b/docs/html/class_set_keyframing.html @@ -0,0 +1,125 @@ + + + + + + + +Olive: SetKeyframing Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetKeyframing Class Reference
+
+
+
+Inheritance diagram for SetKeyframing:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetKeyframing (EffectRow *irow, bool ib)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Private Attributes

+EffectRowrow
 
+bool b
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_keyframing.png b/docs/html/class_set_keyframing.png new file mode 100644 index 0000000000000000000000000000000000000000..70596830c410bb2c292706791fab286c571c7d18 GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#BLhNp{TNCo5Dxv%?PEAX%#?-SYoUwXco zg8^^mkVl)UkclnY8x4{MA$an`h3vX`1@E z>lWwxz`3!;o6Dk*!lIzujOjJzQPyu(VM2?d*5|&U^(RKqwk`ugvNqGyaDt7h|S%>SUjcvqgh)&%qd>76d~^z5GA zRauL>SIpU%zSiWg`Jz90z9Ae}Lmt@WiQRg^c;(^VBGK@`)O%qMVyCQn_5Z5N%2jM8 zfvZ+A_PXkx-ozt#pmr@ovI*bTb%!G!2k>9gxaM$0e(ixyrVbSMA~}Cmor}vc4n~QE zKtH`;4~$;AdFAE1dUpQD&F+OYCqHe}x%2S#%HJ#0&h9HUzQ6haOF{eX`u(>gep`9m zUbn!jW6uklSE5o=&VRWc_|MDkUFntI?^o>!-?fnLxb_%4S98sp3UcQ@TnJ5RWfq<&v1KFP(<7pU0z^1WbkzLb6Mw<&;$TApi~k7 literal 0 HcmV?d00001 diff --git a/docs/html/class_set_long-members.html b/docs/html/class_set_long-members.html new file mode 100644 index 000000000..32d40a748 --- /dev/null +++ b/docs/html/class_set_long-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetLong Member List
+
+
+ +

This is the complete list of members for SetLong, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in SetLong)SetLongvirtual
doUndo() override (defined in SetLong)SetLongvirtual
newval (defined in SetLong)SetLongprivate
oldval (defined in SetLong)SetLongprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
p (defined in SetLong)SetLongprivate
redo() override (defined in OliveAction)OliveActionvirtual
SetLong(long *pointer, long old_value, long new_value) (defined in SetLong)SetLong
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_long.html b/docs/html/class_set_long.html new file mode 100644 index 000000000..5ea58e153 --- /dev/null +++ b/docs/html/class_set_long.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetLong Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetLong Class Reference
+
+
+
+Inheritance diagram for SetLong:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetLong (long *pointer, long old_value, long new_value)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+long * p
 
+long oldval
 
+long newval
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_long.png b/docs/html/class_set_long.png new file mode 100644 index 0000000000000000000000000000000000000000..3841251a269cb0c4b3df231c58f6cf630059f068 GIT binary patch literal 672 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0zNd?0NCo5Dxfds`R^V~)f7J8yzx_Tf ztqoVR%yZxQsrR`HFtKOcsdaTxVLNh0rzvFSOv@kkt1LaI71du^v29=5%$awSdDpMH z`yrp82byawebL(zvO2Q`6J6UfaHx9*J8i`}PHQ=*sK2?%jM-KW}Bkw^J8i zoQ|C|E;eIZn(0UO*T#Dt2(=6zr4GAZTMG~S5I=; z%;w)0Q%QTfw`7fTpYeq=Z#FMEb>@uYsxxO~j;wNVabl>LE2z+Ban+)2=cACxnx{lp z{JO;BBihg&!f4?k+R%(fUCowgQ)FWcy~+`^bk(Z|`YTd)O)J_N8fv|3+hmE*-1o*; zms!qq-t|p-Uh!3{9XjQ)Uz~2fS{HTix%=BWua3XE9`UB_h0j(JQV7<9DeEmb-Q}o?o$T%Zes}tDj?k)~|lMJ4!h3 z+>W)k{S2c)I$z JtaD0e0sx%*Jrw`| literal 0 HcmV?d00001 diff --git a/docs/html/class_set_pointer-members.html b/docs/html/class_set_pointer-members.html new file mode 100644 index 000000000..95855a6e4 --- /dev/null +++ b/docs/html/class_set_pointer-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetPointer Member List
+
+
+ +

This is the complete list of members for SetPointer, including all inherited members.

+ + + + + + + + + + + + +
doRedo() override (defined in SetPointer)SetPointervirtual
doUndo() override (defined in SetPointer)SetPointervirtual
new_data (defined in SetPointer)SetPointerprivate
old_changed (defined in SetPointer)SetPointerprivate
old_data (defined in SetPointer)SetPointerprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
p (defined in SetPointer)SetPointerprivate
redo() override (defined in OliveAction)OliveActionvirtual
SetPointer(void **pointer, void *data) (defined in SetPointer)SetPointer
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_pointer.html b/docs/html/class_set_pointer.html new file mode 100644 index 000000000..bc8cdbf04 --- /dev/null +++ b/docs/html/class_set_pointer.html @@ -0,0 +1,131 @@ + + + + + + + +Olive: SetPointer Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetPointer Class Reference
+
+
+
+Inheritance diagram for SetPointer:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetPointer (void **pointer, void *data)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + +

+Private Attributes

+bool old_changed
 
+void ** p
 
+void * new_data
 
+void * old_data
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_pointer.png b/docs/html/class_set_pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..11d763db463f76a53147c7bf5f577e123d4f57a6 GIT binary patch literal 687 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0ou`XqNCo5DxwqFXHsE16?sn+^|Kqov z*5&Rf*{fb1BAM#tF^8wmXTG4|Oy;CCv*v)AGcAAEuS%bo^Zirs;#+lG#>Ttdxz?{r zvIyr*JA39_Md;P&dp>fUZ!+KHZ?FyZtn<_MTJE=HwSGwT{%@yJCjT#9emBT!@zv>( zvUjYe&is$oB$RQ3t)mL-3ZoQ_4en_V0HPw8-E#3UGb{H?%4~AzpKpF^ah5$-LcY3 z{o9(U@BTHfD%&PE#rtY#!pm~zzwh|2-Y&ly5)=CL`93E5(3PwHMLR8B^-3XR)hfPc ztEQz!E@Sv$seM4^*~)9Bv$E&CN}Tm{){0-3xOhYx+5;FZI7Azo(WtB5E-8E*2Y8%V zA3T`8V%w@rrSC~^-R@N}u+Lestut@;^obKi9yDl&p33{Lxyp8@@4V-iZk%j;&K@zP z+AH#E&y-G+Y2u7~3gX0mK0SR*b#B~+RSa!0p$Vc-*7Sv(&1TqByjUmbz|>cpobp!X zr98Dd@JDp%g8Tx+gQ)D}o^`NPfxcGddO&JLf4{L8ikNeFR2cLJs^22WQ%mvv4F FO#p;kJy!q# literal 0 HcmV?d00001 diff --git a/docs/html/class_set_q_variant-members.html b/docs/html/class_set_q_variant-members.html new file mode 100644 index 000000000..4e1f348bc --- /dev/null +++ b/docs/html/class_set_q_variant-members.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetQVariant Member List
+
+
+ +

This is the complete list of members for SetQVariant, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in SetQVariant)SetQVariantvirtual
doUndo() override (defined in SetQVariant)SetQVariantvirtual
new_val (defined in SetQVariant)SetQVariantprivate
old_val (defined in SetQVariant)SetQVariantprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
SetQVariant(QVariant *itarget, const QVariant &iold, const QVariant &inew) (defined in SetQVariant)SetQVariant
target (defined in SetQVariant)SetQVariantprivate
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_q_variant.html b/docs/html/class_set_q_variant.html new file mode 100644 index 000000000..649d0135a --- /dev/null +++ b/docs/html/class_set_q_variant.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetQVariant Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetQVariant Class Reference
+
+
+
+Inheritance diagram for SetQVariant:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetQVariant (QVariant *itarget, const QVariant &iold, const QVariant &inew)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+QVariant * target
 
+QVariant old_val
 
+QVariant new_val
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_q_variant.png b/docs/html/class_set_q_variant.png new file mode 100644 index 0000000000000000000000000000000000000000..e63d4f60cd02ebfae902182c764f329c6024f48e GIT binary patch literal 705 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#BLfTxRNNCo5DxwrdX8SpS1Ul;QKzr1|L zy9rFO^UtmeTW9p-S<0*vPbCE>nkuBFX>&}SIkS0w;N8hjR=oD_es$aO%$YaFMHRuJ zhqJGyTs!kdw0~9D)U!{@8cKS;u(_}I^s-;SqSx%=`nttlZ?CPIeD~*jYgO;uGhzE} zuX>uUIFq7t`Ktday*mrNDnGkjjsGz{^m1yx(T3Y=qK#*oPTpv z$8!p8-X|kmdD4dY?3sPj17^;&1iNOdmf%EHhM08rh{IM__vsg}4ZiEMI)*#6-h|ni z^?_mt1D_M?0|hkd?aghu(af_~z2b6Oy6V*f^A%6N$$SkA31x5FI9Vd}?dh4TGW@3{zZ7J*uIl^uce(GqTg6{Zr>=O_V)*Qh)!$WiYx)C2Wq$-r&3`jb z+xc(rs=95lQ@l-65_0*OAHUO}omAM+{4GHuw|*9CXxz;GrrhsoU}&ab`;vb4C`<3|KVAAElk3u1DjwJ{U$(W`Q@meA z-OD<*Z|@QcMQMB=y=moDo m>`WFMq7BXVtAzw357|rg2kHN3{agu5Zw#KUelF{r5}E)$^E>na literal 0 HcmV?d00001 diff --git a/docs/html/class_set_selections_command-members.html b/docs/html/class_set_selections_command-members.html new file mode 100644 index 000000000..751a41ad4 --- /dev/null +++ b/docs/html/class_set_selections_command-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetSelectionsCommand Member List
+
+
+ +

This is the complete list of members for SetSelectionsCommand, including all inherited members.

+ + + + + + + + + + + + +
done (defined in SetSelectionsCommand)SetSelectionsCommandprivate
doRedo() override (defined in SetSelectionsCommand)SetSelectionsCommandvirtual
doUndo() override (defined in SetSelectionsCommand)SetSelectionsCommandvirtual
new_data (defined in SetSelectionsCommand)SetSelectionsCommand
old_data (defined in SetSelectionsCommand)SetSelectionsCommand
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in SetSelectionsCommand)SetSelectionsCommandprivate
SetSelectionsCommand(Sequence *s) (defined in SetSelectionsCommand)SetSelectionsCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_selections_command.html b/docs/html/class_set_selections_command.html new file mode 100644 index 000000000..ac0096f20 --- /dev/null +++ b/docs/html/class_set_selections_command.html @@ -0,0 +1,135 @@ + + + + + + + +Olive: SetSelectionsCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetSelectionsCommand Class Reference
+
+
+
+Inheritance diagram for SetSelectionsCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetSelectionsCommand (Sequence *s)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + +

+Public Attributes

+QVector< Selectionold_data
 
+QVector< Selectionnew_data
 
+ + + + + +

+Private Attributes

+Sequenceseq
 
+bool done
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_selections_command.png b/docs/html/class_set_selections_command.png new file mode 100644 index 0000000000000000000000000000000000000000..cf33bfc687eae250bd72f185f853a27b3f1860cd GIT binary patch literal 841 zcmeAS@N?(olHy`uVBq!ia0vp^{XpEo!3-o{?(mQVQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;CQqz0H&PmS;IV>3EQT<_sIt?3($C!UmsH_* z?fJfsZ!MoZb&2-9Pnw;-6J;;H3*P8+Vv%M1+pn)nSKjdZ<`S#xnI88!^4#~$x{+s} zB=2xdwSF1u9n>!VT;0ONZqnAZ(Yl_p^L~VU|I>DU(}Vg$%i~z`f0vwAS$Wv|_iCw) zy9(8{BX6I(I_b*8pWoBxf4IBgUi{VcthXsacb~av{yg??(vtsvzdV9`p!iIKU0T{> zh7ZDb7}$~w=HJfMS$MGKos~0Z@3YCjxgT_WVeIgfZA};F&+AOy_Vdj3 z{{6O<_Ww8CFRwjw*Lq8BTt)T#4=ZN?pm5%+c_hjmCFF*J0{nO8OXaC(g zH``(Lhs^nxzc0V#zx#aE-FNHzf9%*@Kj%wfdB3N8`S%$hhUA6xS<5nI80wm&4><5V zE8g9!YBJ+|Y`Vt6i#0{{j4>1K7z|%B3rr?J)n7Y)CP%@b0T`>`aJX6f>}c%KYQcp3 z?+!n7ay1VadwoBfZujPU1beoU!&N;tn<-2-i(d!J<^If8e%&*7*P5HASM83>()s$k zSZ;Nnooeu@Qy%RebFGi@yb9a7K#U L)z4*}Q$iB}@z + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetSpeedAction Member List
+
+
+ +

This is the complete list of members for SetSpeedAction, including all inherited members.

+ + + + + + + + + + + +
clip (defined in SetSpeedAction)SetSpeedActionprivate
doRedo() override (defined in SetSpeedAction)SetSpeedActionvirtual
doUndo() override (defined in SetSpeedAction)SetSpeedActionvirtual
new_speed (defined in SetSpeedAction)SetSpeedActionprivate
old_speed (defined in SetSpeedAction)SetSpeedActionprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
SetSpeedAction(Clip *c, double speed) (defined in SetSpeedAction)SetSpeedAction
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_speed_action.html b/docs/html/class_set_speed_action.html new file mode 100644 index 000000000..525e90395 --- /dev/null +++ b/docs/html/class_set_speed_action.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetSpeedAction Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetSpeedAction Class Reference
+
+
+
+Inheritance diagram for SetSpeedAction:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetSpeedAction (Clip *c, double speed)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+Clipclip
 
+double old_speed
 
+double new_speed
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_speed_action.png b/docs/html/class_set_speed_action.png new file mode 100644 index 0000000000000000000000000000000000000000..fcb4db12e1e2ded3091ce578475fb4bd67c0187f GIT binary patch literal 719 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#BLoTrOpNCo5Dxrvh(EATkPKkE7U|NoCQ zO)8?>Z=cmG-|T)oTtH~vg&XHPI(irljinEU%$%wE!+Mqb#5Zq$UR_kPzh&mk+CHIs zA5ezi0XK+y97{8|KW7 z`*u3^u8Cu++Q(OE@gaIP3$0!~Ydt0ZV|wV_E#jgt#ELEFMjCfsH{Ja`ZmV!c_iwI} z_3^wy#`SN7RhPy$rlr}R203Jgmhonm8 zKT(Ial}sK6p$weMxD*bCFsjVZYG4Uwosh8VR(j;LR34pGtCVMGg%rtzMM?cpoNxJ8{mHRjF-0rn!A*YV!mll_KE>_q%3f6^ul*r*>Z(`Y zjY3zg;#}qxYI-o@>L#7j0u1-kStSlzT;0W2+#8&`EO1@ps`#izpc@lcF$npHIy9kq zVAVH4K}lvN1CaQK=^@oqcg%b)*l@y7(rMf5*&@qtS^L#UGImU1kS~(|w?=EX^}bgp zu33xKW-ZcMB5P>6vAE&wlUI!MgiDW@r|xv%`Fi~4mftfjOYSsb%>Qh7m&@kd0sG$i zV^waY`=*`Sy()@D@wuhpnwMt(OGCX2-0%He+w|&F^j+D6+U`@0Q#MxxHm;kJHEaC= v{yOaj?)#tHKgq9V_yltFMlHdKihmdbUIk^Fb=hnNralHwS3j3^P6 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetString Member List
+
+
+ +

This is the complete list of members for SetString, including all inherited members.

+ + + + + + + + + + + +
doRedo() override (defined in SetString)SetStringvirtual
doUndo() override (defined in SetString)SetStringvirtual
newval (defined in SetString)SetStringprivate
oldval (defined in SetString)SetStringprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
p (defined in SetString)SetStringprivate
redo() override (defined in OliveAction)OliveActionvirtual
SetString(QString *pointer, QString new_value) (defined in SetString)SetString
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_string.html b/docs/html/class_set_string.html new file mode 100644 index 000000000..7304f2182 --- /dev/null +++ b/docs/html/class_set_string.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: SetString Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetString Class Reference
+
+
+
+Inheritance diagram for SetString:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetString (QString *pointer, QString new_value)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + +

+Private Attributes

+QString * p
 
+QString oldval
 
+QString newval
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_string.png b/docs/html/class_set_string.png new file mode 100644 index 0000000000000000000000000000000000000000..57317189a8350e9df35419b1b38f253f9f909a37 GIT binary patch literal 693 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0i>HfYNCo5DxwrdP8}Kk3cRTd||MB)o z6TG=uuic&#`m{??al2>F&01HN6rPTmH#wYA)1E!}ze3J))3m2y?pwdwoH_GGs)wbau|%IOCV=uivb`AKL2>yXWkI zXP5BEy|@Hi^R)S8e!z62ifhl0uPxL2TKm;@>WWugnz*qjjscJ-1_izbYiOetN*lRaP8RSFLK^ zxGHnjGSVI1+0nzuDB-w*LFSL_)mav2A6(kB_1=va)mLwYv+HbK`;>j-js>TddvCup zY2M{GPp6p`h%MaAaP34cV@}e{sN%q13}qI+-JjCDuH2fosqq%mhSRM)J_}D*=ik4% ze$~854>Wb{mTBcbiFjHSe!G0C{W6);vxMeeo!-b`F0tfSFAvKOr|;%G4?2ISGd*~a f9jc_{{DVDeUJ&1Ut7=nV8e{Nu^>bP0l+XkKnd?B- literal 0 HcmV?d00001 diff --git a/docs/html/class_set_timeline_in_out_command-members.html b/docs/html/class_set_timeline_in_out_command-members.html new file mode 100644 index 000000000..fff32bd34 --- /dev/null +++ b/docs/html/class_set_timeline_in_out_command-members.html @@ -0,0 +1,93 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SetTimelineInOutCommand Member List
+
+
+ +

This is the complete list of members for SetTimelineInOutCommand, including all inherited members.

+ + + + + + + + + + + + + + + +
doRedo() override (defined in SetTimelineInOutCommand)SetTimelineInOutCommandvirtual
doUndo() override (defined in SetTimelineInOutCommand)SetTimelineInOutCommandvirtual
new_enabled (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
new_in (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
new_out (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
old_enabled (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
old_in (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
old_out (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
redo() override (defined in OliveAction)OliveActionvirtual
seq (defined in SetTimelineInOutCommand)SetTimelineInOutCommandprivate
SetTimelineInOutCommand(Sequence *s, bool enabled, long in, long out) (defined in SetTimelineInOutCommand)SetTimelineInOutCommand
undo() override (defined in OliveAction)OliveActionvirtual
~OliveAction() override (defined in OliveAction)OliveActionvirtual
+ + + + diff --git a/docs/html/class_set_timeline_in_out_command.html b/docs/html/class_set_timeline_in_out_command.html new file mode 100644 index 000000000..9d48ae8db --- /dev/null +++ b/docs/html/class_set_timeline_in_out_command.html @@ -0,0 +1,140 @@ + + + + + + + +Olive: SetTimelineInOutCommand Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SetTimelineInOutCommand Class Reference
+
+
+
+Inheritance diagram for SetTimelineInOutCommand:
+
+
+ + +OliveAction + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

SetTimelineInOutCommand (Sequence *s, bool enabled, long in, long out)
 
+virtual void doUndo () override
 
+virtual void doRedo () override
 
- Public Member Functions inherited from OliveAction
OliveAction (bool iset_window_modified=true)
 
+virtual void undo () override
 
+virtual void redo () override
 
+ + + + + + + + + + + + + + + +

+Private Attributes

+Sequenceseq
 
+bool old_enabled
 
+long old_in
 
+long old_out
 
+bool new_enabled
 
+long new_in
 
+long new_out
 
+
The documentation for this class was generated from the following files:
    +
  • project/undo.h
  • +
  • project/undo.cpp
  • +
+
+ + + + diff --git a/docs/html/class_set_timeline_in_out_command.png b/docs/html/class_set_timeline_in_out_command.png new file mode 100644 index 0000000000000000000000000000000000000000..099e236025be09e6742f35fbc0ff5fed704c5893 GIT binary patch literal 870 zcmeAS@N?(olHy`uVBq!ia0vp^3xT+UgBeKf(5bEhQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;gu< zTs}|zX@l-q>9Q)-mtFjldCJcYznk#vX_R=bX#6^_MSrViPxSY4w~d~pw(EPQ$Y_+G?Ao{MuB{U*#|d3bsvp@;F># z*_2Bs7;2`lAGpAi|D&R3oyDGqIu<(~{b&n3%@B7;;DEaX(+>`32Khve2g*E*H7$w_ z{RS)_1lt(wkR<;verV!*`GUdBnY=y{vt|MVz}Q&6oageN=ss^_!s_@7|e`pFFP~W_J7#nstDU- zXWr!gX}i76?(}lYzVwLi)9(HeZ}ZiC{#osU*WW!4Usgw4%`?2S{&v(qMQ7v9^Obqd zo~dbBICEydfr;_wkJ>!TGiSN6Jy>kR(3Vzl_;_;3(TBY02M>xKH}8pJ`yhns2b>=K zAOJ3ODs#et~Huny;a)5_@_0u!Ytyl%qFIi7e{9=w~mj0 z#%yuf^p0HF@6(yn9e;a0F|E=2tQeN|v^CCbaov|(pOC{ z<e7f(Oe-~F&fd3xKvSiR!Y)mJ^|Ke%u%zx03gj;mJ`b8mKS z4iL4j`CVi>=aO^Q?XXX(ng4BBBzh6id3?QrkLJ>eKbbiW)vw^)VgD1DDHuFm{an^L HB{Ts59tWNL literal 0 HcmV?d00001 diff --git a/docs/html/class_shake_effect-members.html b/docs/html/class_shake_effect-members.html new file mode 100644 index 000000000..0a3855bc2 --- /dev/null +++ b/docs/html/class_shake_effect-members.html @@ -0,0 +1,136 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ShakeEffect Member List
+
+
+ +

This is the complete list of members for ShakeEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
frequency_val (defined in ShakeEffect)ShakeEffect
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
intensity_val (defined in ShakeEffect)ShakeEffect
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in ShakeEffect)ShakeEffectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
random_vals (defined in ShakeEffect)ShakeEffectprivate
refresh() (defined in Effect)Effectvirtual
rotation_val (defined in ShakeEffect)ShakeEffect
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
ShakeEffect(Clip *c, const EffectMeta *em) (defined in ShakeEffect)ShakeEffect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_shake_effect.html b/docs/html/class_shake_effect.html new file mode 100644 index 000000000..c841359fe --- /dev/null +++ b/docs/html/class_shake_effect.html @@ -0,0 +1,279 @@ + + + + + + + +Olive: ShakeEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ShakeEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ShakeEffect (Clip *c, const EffectMeta *em)
 
+void process_coords (double timecode, GLTextureCoords &coords, int data)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldintensity_val
 
+EffectFieldrotation_val
 
+EffectFieldfrequency_val
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + +

+Private Attributes

+double random_vals [RANDOM_VAL_SIZE]
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/shakeeffect.h
  • +
  • effects/internal/shakeeffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_shake_effect.png b/docs/html/class_shake_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c7503335e8671ee0b5754962a259bb8fce24af GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^0YKcr!3-qb7tOf~q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgZ+p5phEy=VoqMtGu>udnako|f|M#y~ zoZzsq`pbvR(37H@1-#UbExQ@+;$q`?=FA_Cg)?u;1wRa2Qx~Ftc1`xSNH^_@`ekfi?f(H%OZ%tN TncKpFQP1G%>gTe~DWM4fg$)pu literal 0 HcmV?d00001 diff --git a/docs/html/class_solid_effect-members.html b/docs/html/class_solid_effect-members.html new file mode 100644 index 000000000..db9f32d7e --- /dev/null +++ b/docs/html/class_solid_effect-members.html @@ -0,0 +1,138 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SolidEffect Member List
+
+
+ +

This is the complete list of members for SolidEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
checkerboard_size_field (defined in SolidEffect)SolidEffectprivate
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
opacity_field (defined in SolidEffect)SolidEffectprivate
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
redraw(double timecode) (defined in SolidEffect)SolidEffectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
solid_color_field (defined in SolidEffect)SolidEffectprivate
solid_type (defined in SolidEffect)SolidEffectprivate
SolidEffect(Clip *c, const EffectMeta *em) (defined in SolidEffect)SolidEffect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
ui_update(int) (defined in SolidEffect)SolidEffectprivateslot
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_solid_effect.html b/docs/html/class_solid_effect.html new file mode 100644 index 000000000..9a6d9956d --- /dev/null +++ b/docs/html/class_solid_effect.html @@ -0,0 +1,285 @@ + + + + + + + +Olive: SolidEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SolidEffect Class Reference
+
+
+
+Inheritance diagram for SolidEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

SolidEffect (Clip *c, const EffectMeta *em)
 
+void redraw (double timecode)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + +

+Private Slots

+void ui_update (int)
 
+ + + + + + + + + +

+Private Attributes

+EffectFieldsolid_type
 
+EffectFieldsolid_color_field
 
+EffectFieldopacity_field
 
+EffectFieldcheckerboard_size_field
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/solideffect.h
  • +
  • effects/internal/solideffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_solid_effect.png b/docs/html/class_solid_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a8b30cec2edbcd42c06861c15ac6fccb7331c3 GIT binary patch literal 551 zcmV+?0@(eDP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0005DNkl`gbBbVOpsDaE|64J9SD=Es?8IVlusE{RJFD9 z^-ELNU)OzLTI1SdD^sQ0#;V%4$(S~}PE~cl$kUDK%RF`BZ%t$RR8`OX_dE@?yB@Ik z2CJ&h5hhhtn};c-lso`1`N99@%i^VSGd)C3DnHXt)-Fr{6NCxCCQJY}VFIuT6M#*a zKt#j^1i*nX0oXKCNq;xL-&jYrHtV1Qw01n#795l3(XrWZ + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SourceIconView Member List
+
+
+ +

This is the complete list of members for SourceIconView, including all inherited members.

+ + + + + + + + + + + +
changed_root() (defined in SourceIconView)SourceIconViewsignal
dragEnterEvent(QDragEnterEvent *event) (defined in SourceIconView)SourceIconView
dragMoveEvent(QDragMoveEvent *event) (defined in SourceIconView)SourceIconView
dropEvent(QDropEvent *event) (defined in SourceIconView)SourceIconView
item_click(const QModelIndex &index) (defined in SourceIconView)SourceIconViewprivateslot
mouseDoubleClickEvent(QMouseEvent *event) (defined in SourceIconView)SourceIconView
mousePressEvent(QMouseEvent *event) (defined in SourceIconView)SourceIconView
project_parent (defined in SourceIconView)SourceIconView
show_context_menu() (defined in SourceIconView)SourceIconViewprivateslot
SourceIconView(QWidget *parent=0) (defined in SourceIconView)SourceIconView
+ + + + diff --git a/docs/html/class_source_icon_view.html b/docs/html/class_source_icon_view.html new file mode 100644 index 000000000..1629c6a9f --- /dev/null +++ b/docs/html/class_source_icon_view.html @@ -0,0 +1,135 @@ + + + + + + + +Olive: SourceIconView Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
SourceIconView Class Reference
+
+
+
+Inheritance diagram for SourceIconView:
+
+
+ +
+ + + + +

+Signals

+void changed_root ()
 
+ + + + + + + + + + + + + +

+Public Member Functions

SourceIconView (QWidget *parent=0)
 
+void mousePressEvent (QMouseEvent *event)
 
+void mouseDoubleClickEvent (QMouseEvent *event)
 
+void dragEnterEvent (QDragEnterEvent *event)
 
+void dragMoveEvent (QDragMoveEvent *event)
 
+void dropEvent (QDropEvent *event)
 
+ + + +

+Public Attributes

+Projectproject_parent
 
+ + + + + +

+Private Slots

+void show_context_menu ()
 
+void item_click (const QModelIndex &index)
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_source_icon_view.png b/docs/html/class_source_icon_view.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d1d6ad7d0f1b8d47db0d5b5496032551570c76 GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^nLr%C!3-pIHCN{XDTx4|5ZC|z{{xvX-h3_XKQsZz z0^Do+>3kP61Pb1zP7R^VY(*Wdg9|M6&7 zfryJ_gd+f{^R-Z{S9FtYfescHmKDy@ZHQmQQcg1*IVohI`^wK$N zvdZ2gotfvCoXYepI%~3Cfwzo#(v{-NA$F!Kf9~;|wDrx|n>%A?%!+@0_cZ&A^M!xc zS6-j;EIUj8yLRxtx%VcO9GH9S^|iYl>-}C%eZKPMyxi}rman;TFIvs>mqg;EC6R|z zJU8!{b>@r>!;Z7e2UyK7KYqBh$k^7^Ps{%D{xy3I7=47*8X^y|7oVpF?J4Z4}@7{cH#mpD%;GC)920 e)QpY!_c26VvD>T>=34@c83s>RKbLh*2~7Z{INnzP literal 0 HcmV?d00001 diff --git a/docs/html/class_source_table-members.html b/docs/html/class_source_table-members.html new file mode 100644 index 000000000..3a8b49a73 --- /dev/null +++ b/docs/html/class_source_table-members.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SourceTable Member List
+
+
+ +

This is the complete list of members for SourceTable, including all inherited members.

+ + + + + + + + + + +
dragEnterEvent(QDragEnterEvent *event) (defined in SourceTable)SourceTableprotected
dragMoveEvent(QDragMoveEvent *event) (defined in SourceTable)SourceTableprotected
dropEvent(QDropEvent *event) (defined in SourceTable)SourceTableprotected
item_click(const QModelIndex &index) (defined in SourceTable)SourceTableprivateslot
mouseDoubleClickEvent(QMouseEvent *) (defined in SourceTable)SourceTableprotected
mousePressEvent(QMouseEvent *) (defined in SourceTable)SourceTableprotected
project_parent (defined in SourceTable)SourceTable
show_context_menu() (defined in SourceTable)SourceTableprivateslot
SourceTable(QWidget *parent=0) (defined in SourceTable)SourceTable
+ + + + diff --git a/docs/html/class_source_table.html b/docs/html/class_source_table.html new file mode 100644 index 000000000..10b64774a --- /dev/null +++ b/docs/html/class_source_table.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: SourceTable Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for SourceTable:
+
+
+ +
+ + + + +

+Public Member Functions

SourceTable (QWidget *parent=0)
 
+ + + +

+Public Attributes

+Projectproject_parent
 
+ + + + + + + + + + + +

+Protected Member Functions

+void mousePressEvent (QMouseEvent *)
 
+void mouseDoubleClickEvent (QMouseEvent *)
 
+void dragEnterEvent (QDragEnterEvent *event)
 
+void dragMoveEvent (QDragMoveEvent *event)
 
+void dropEvent (QDropEvent *event)
 
+ + + + + +

+Private Slots

+void item_click (const QModelIndex &index)
 
+void show_context_menu ()
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_source_table.png b/docs/html/class_source_table.png new file mode 100644 index 0000000000000000000000000000000000000000..b0f105dcf6907e4e9cc4db4cb28a7945134ed897 GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^AwV3!!3-ofs4RL4q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgy**tVLn;{G&OP0CSb@j2-~8+U{~uKz zrYa=Pn7DaG%2x3ehU#YKca@bM>AHko4QC7u{d$$bcJ1llsFkbAybdPEh+KAFUuwH- zl~v~6YUZ=2`D(9C$tTkUS z|2+2<^9Age=l|mR(tU?tqhT`>*Mrp!Oh2?1Fzn;fXjsq0wLw`>FkcbElloG`o3Qp# zzHR<;!7AVC(A#TxGxSvd`&b=|iPSXcw_LyU`mfyIUyqzzIWu?#@Ac28;_kld-K6^M z>aF89m*xCoE;%u4!O;b`>iBd2`MRyuerr2dtG4LA-7fb3&;7ECQ;nvme_wz8R4s!# itH^ + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SourcesCommon Member List
+
+
+ +

This is the complete list of members for SourcesCommon, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + +
cached_selected_footage (defined in SourcesCommon)SourcesCommonprivate
clear_proxies_from_selected() (defined in SourcesCommon)SourcesCommonprivateslot
create_seq_from_selected() (defined in SourcesCommon)SourcesCommonprivateslot
dropEvent(QWidget *parent, QDropEvent *e, const QModelIndex &drop_item, const QModelIndexList &items) (defined in SourcesCommon)SourcesCommon
editing_index (defined in SourcesCommon)SourcesCommonprivate
editing_item (defined in SourcesCommon)SourcesCommonprivate
item_click(Media *m, const QModelIndex &index) (defined in SourcesCommon)SourcesCommon
item_renamed(Media *item) (defined in SourcesCommon)SourcesCommonprivateslot
mouseDoubleClickEvent(QMouseEvent *e, const QModelIndexList &selected_items) (defined in SourcesCommon)SourcesCommon
mousePressEvent(QMouseEvent *e) (defined in SourcesCommon)SourcesCommon
open_create_proxy_dialog() (defined in SourcesCommon)SourcesCommonprivateslot
project_parent (defined in SourcesCommon)SourcesCommonprivate
rename_interval() (defined in SourcesCommon)SourcesCommonprivateslot
rename_timer (defined in SourcesCommon)SourcesCommonprivate
reveal_in_browser() (defined in SourcesCommon)SourcesCommonprivateslot
selected_items (defined in SourcesCommon)SourcesCommonprivate
show_context_menu(QWidget *parent, const QModelIndexList &items) (defined in SourcesCommon)SourcesCommon
SourcesCommon(Project *parent) (defined in SourcesCommon)SourcesCommon
stop_rename_timer() (defined in SourcesCommon)SourcesCommonprivate
view (defined in SourcesCommon)SourcesCommon
+ + + + diff --git a/docs/html/class_sources_common.html b/docs/html/class_sources_common.html new file mode 100644 index 000000000..6d9c929ce --- /dev/null +++ b/docs/html/class_sources_common.html @@ -0,0 +1,169 @@ + + + + + + + +Olive: SourcesCommon Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for SourcesCommon:
+
+
+ +
+ + + + + + + + + + + + + + +

+Public Member Functions

SourcesCommon (Project *parent)
 
+void show_context_menu (QWidget *parent, const QModelIndexList &items)
 
+void mousePressEvent (QMouseEvent *e)
 
+void mouseDoubleClickEvent (QMouseEvent *e, const QModelIndexList &selected_items)
 
+void dropEvent (QWidget *parent, QDropEvent *e, const QModelIndex &drop_item, const QModelIndexList &items)
 
+void item_click (Media *m, const QModelIndex &index)
 
+ + + +

+Public Attributes

+QAbstractItemView * view
 
+ + + + + + + + + + + + + +

+Private Slots

+void create_seq_from_selected ()
 
+void reveal_in_browser ()
 
+void rename_interval ()
 
+void item_renamed (Media *item)
 
+void open_create_proxy_dialog ()
 
+void clear_proxies_from_selected ()
 
+ + + +

+Private Member Functions

+void stop_rename_timer ()
 
+ + + + + + + + + + + + + +

+Private Attributes

+Mediaediting_item
 
+QModelIndex editing_index
 
+QModelIndexList selected_items
 
+Projectproject_parent
 
+QTimer rename_timer
 
+QVector< Footage * > cached_selected_footage
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_sources_common.png b/docs/html/class_sources_common.png new file mode 100644 index 0000000000000000000000000000000000000000..3c908137a62eb0e3fe36130b6df032d402c50799 GIT binary patch literal 472 zcmV;}0Vn>6P)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0004JNklDxzOg@{xW2OD3+eOc7svtKFWzC=R>P~r(Pp&${ z%*@l4(RL_D+2g#OIqFV+P|B%y*kP3#swW*5*e>dYc0Syv)Tzl0?HOKSt?&AEUCow0 z$l7?MUA31F*2du(uHQ>>TUm1N!)?C7CN_qS-$MYmf(78yjag=9WAp`RG(b3bBa;09 O0000 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
SpeedDialog Member List
+
+
+ +

This is the complete list of members for SpeedDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + + + +
accept() (defined in SpeedDialog)SpeedDialogprivateslot
clips (defined in SpeedDialog)SpeedDialog
current_frame_rate (defined in SpeedDialog)SpeedDialogprivate
current_length (defined in SpeedDialog)SpeedDialogprivate
current_percent (defined in SpeedDialog)SpeedDialogprivate
default_frame_rate (defined in SpeedDialog)SpeedDialogprivate
default_length (defined in SpeedDialog)SpeedDialogprivate
duration (defined in SpeedDialog)SpeedDialogprivate
duration_update() (defined in SpeedDialog)SpeedDialogprivateslot
frame_rate (defined in SpeedDialog)SpeedDialogprivate
frame_rate_update() (defined in SpeedDialog)SpeedDialogprivateslot
maintain_pitch (defined in SpeedDialog)SpeedDialogprivate
percent (defined in SpeedDialog)SpeedDialogprivate
percent_update() (defined in SpeedDialog)SpeedDialogprivateslot
reverse (defined in SpeedDialog)SpeedDialogprivate
ripple (defined in SpeedDialog)SpeedDialogprivate
run() (defined in SpeedDialog)SpeedDialog
SpeedDialog(QWidget *parent=0) (defined in SpeedDialog)SpeedDialog
+ + + + diff --git a/docs/html/class_speed_dialog.html b/docs/html/class_speed_dialog.html new file mode 100644 index 000000000..4daf68b0f --- /dev/null +++ b/docs/html/class_speed_dialog.html @@ -0,0 +1,159 @@ + + + + + + + +Olive: SpeedDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for SpeedDialog:
+
+
+ +
+ + + + + + +

+Public Member Functions

SpeedDialog (QWidget *parent=0)
 
+void run ()
 
+ + + +

+Public Attributes

+QVector< Clip * > clips
 
+ + + + + + + + + +

+Private Slots

+void percent_update ()
 
+void duration_update ()
 
+void frame_rate_update ()
 
+void accept ()
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+LabelSliderpercent
 
+LabelSliderduration
 
+LabelSliderframe_rate
 
+QCheckBox * reverse
 
+QCheckBox * maintain_pitch
 
+QCheckBox * ripple
 
+double default_frame_rate
 
+double current_frame_rate
 
+double current_percent
 
+long default_length
 
+long current_length
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_speed_dialog.png b/docs/html/class_speed_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1f538a41c47cc0038c64e0b7d94bc9c9c5123e GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^AwV3!!3-ofs4RL4q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg-8@|!Ln;{G&JCR0tiZ!&uK)MnfBSX0 z0s&VZNy_E5&CHw3d{gMq&z_l)CNory8ZDh9a(d>M%ZE*?f|jYgoFtt2?M;jSlFS^= zc}tI&$8J)U`FBJ%(t7(w(`>ZMX%=lx)Hxy z-*aw@cmBMUDy0+r94|dHj;{rptg&)tqyfX+Jq(K^6>ImhMYwy2r|&84_#$6g@5R_O zGpHeAnTWzPP1cT7FUBMwSMJQ2MF$x`tcb2Jw@n*_r+L0#^E_1~!F$>}Ikp?0CT=@l z;!%6x`a7p->pIU*(XrjEZ{J=TDSN5n=WmVdC7EkBzIB>va;a>2Y3fe(Y>NrcW^%v0 z)pGWiRmqfky}zZ)-kv!+bD4F;&A-3q{W|@^{rh@7IS2lSmoC4vzm@sZeExd7h6p#$ evuBzrnJ-N+e0cRDM;kDd89ZJ6T-G@yGywp?@ynY4 literal 0 HcmV?d00001 diff --git a/docs/html/class_stabilizer_dialog-members.html b/docs/html/class_stabilizer_dialog-members.html new file mode 100644 index 000000000..c0fd2aa39 --- /dev/null +++ b/docs/html/class_stabilizer_dialog-members.html @@ -0,0 +1,95 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
StabilizerDialog Member List
+
+
+ +

This is the complete list of members for StabilizerDialog, including all inherited members.

+ + + + + + + + + + + + + + + + + +
accuracy_slider (defined in StabilizerDialog)StabilizerDialogprivate
analysis (defined in StabilizerDialog)StabilizerDialogprivate
analysis_layout (defined in StabilizerDialog)StabilizerDialogprivate
buttons (defined in StabilizerDialog)StabilizerDialogprivate
enable_stab (defined in StabilizerDialog)StabilizerDialogprivate
gaussian_motion (defined in StabilizerDialog)StabilizerDialogprivate
layout (defined in StabilizerDialog)StabilizerDialogprivate
mincontrast_slider (defined in StabilizerDialog)StabilizerDialogprivate
set_all_enabled(bool e) (defined in StabilizerDialog)StabilizerDialogprivateslot
shakiness_slider (defined in StabilizerDialog)StabilizerDialogprivate
smoothing_slider (defined in StabilizerDialog)StabilizerDialogprivate
stabilization (defined in StabilizerDialog)StabilizerDialogprivate
stabilization_layout (defined in StabilizerDialog)StabilizerDialogprivate
StabilizerDialog(QWidget *parent=0) (defined in StabilizerDialog)StabilizerDialog
stepsize_slider (defined in StabilizerDialog)StabilizerDialogprivate
tripod_mode_box (defined in StabilizerDialog)StabilizerDialogprivate
+ + + + diff --git a/docs/html/class_stabilizer_dialog.html b/docs/html/class_stabilizer_dialog.html new file mode 100644 index 000000000..22bf1f666 --- /dev/null +++ b/docs/html/class_stabilizer_dialog.html @@ -0,0 +1,149 @@ + + + + + + + +Olive: StabilizerDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
StabilizerDialog Class Reference
+
+
+
+Inheritance diagram for StabilizerDialog:
+
+
+ +
+ + + + +

+Public Member Functions

StabilizerDialog (QWidget *parent=0)
 
+ + + +

+Private Slots

+void set_all_enabled (bool e)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QVBoxLayout * layout
 
+QCheckBox * enable_stab
 
+QDialogButtonBox * buttons
 
+QGroupBox * analysis
 
+QGridLayout * analysis_layout
 
+LabelSlidershakiness_slider
 
+LabelSlideraccuracy_slider
 
+LabelSliderstepsize_slider
 
+LabelSlidermincontrast_slider
 
+QCheckBox * tripod_mode_box
 
+QGroupBox * stabilization
 
+QGridLayout * stabilization_layout
 
+LabelSlidersmoothing_slider
 
+QCheckBox * gaussian_motion
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_stabilizer_dialog.png b/docs/html/class_stabilizer_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..c4851d601eedec830932b1ad29d8eb992e8e20e0 GIT binary patch literal 477 zcmV<30V4j1P)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0004ONklpZWmat zkZg|mmP;gGlwC^#;Acqy+$;%znU&(ut(F`1-9@Qrz&XaCsyK zO#!T-yQQah@<^VL9{cY!yPE$=nsl070Hc{Md751S!-!E^pL&3I_$rB+*<^kIo=Q9C TX`OT}00000NkvXXu0mjftH#nR literal 0 HcmV?d00001 diff --git a/docs/html/class_text_edit_dialog-members.html b/docs/html/class_text_edit_dialog-members.html new file mode 100644 index 000000000..836e5b320 --- /dev/null +++ b/docs/html/class_text_edit_dialog-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TextEditDialog Member List
+
+
+ +

This is the complete list of members for TextEditDialog, including all inherited members.

+ + + + + + + +
cancel() (defined in TextEditDialog)TextEditDialogprivateslot
get_string() (defined in TextEditDialog)TextEditDialog
result_str (defined in TextEditDialog)TextEditDialogprivate
save() (defined in TextEditDialog)TextEditDialogprivateslot
textEdit (defined in TextEditDialog)TextEditDialogprivate
TextEditDialog(QWidget *parent=0, const QString &s=0) (defined in TextEditDialog)TextEditDialog
+ + + + diff --git a/docs/html/class_text_edit_dialog.html b/docs/html/class_text_edit_dialog.html new file mode 100644 index 000000000..7287a1cac --- /dev/null +++ b/docs/html/class_text_edit_dialog.html @@ -0,0 +1,119 @@ + + + + + + + +Olive: TextEditDialog Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
TextEditDialog Class Reference
+
+
+
+Inheritance diagram for TextEditDialog:
+
+
+ +
+ + + + + + +

+Public Member Functions

TextEditDialog (QWidget *parent=0, const QString &s=0)
 
+const QString & get_string ()
 
+ + + + + +

+Private Slots

+void save ()
 
+void cancel ()
 
+ + + + + +

+Private Attributes

+QString result_str
 
+QPlainTextEdit * textEdit
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_text_edit_dialog.png b/docs/html/class_text_edit_dialog.png new file mode 100644 index 0000000000000000000000000000000000000000..d44b662e597673128b71957d26b6b11a23ad27c4 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^F+d!^!3-o9e|{tgq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgBRyRlLn;{G&b>IPS%JsZKW@+e|Hrer zxg=I?%ii@^$2hK&k+0(9hn|^{Qw%)2E;e{ix;+1&{PVqAG&N!;m8_8caq4!%`iAF! z?kv$@f2r(96~t^2{}*Dbp82du9a&3%5e@%fWg=YrpD zzpCV^F3R@*Lb0dS!Z&>?xu)x4Jd1Xj-Z`V=!H}Q9)DfgoGmGiv#1AuN-T7PZ?}%cP zIgovTaSo8mM4?{ZKXCTUq87#@89?EEO!0l<8t4B+E|;ILI@35+!(nyS^L_RU%^Fm1 z^4YW3ztcRM$7Oo-bGGlZLZEA>xPN<4nebPn{Z>k6>=u6izf+&zc9p)o?Zb5I^XXd; ztv+X06Z?myCR)P%!#v&J^PU%6|2(bq)aPAM^Pb23+;T4GmCe-ifm<13mKaprFK*Bd m$(vaCl*!_*R9>3c68RQwv)9|NCWrt7p25@A&t;ucLK6VHNYU8< literal 0 HcmV?d00001 diff --git a/docs/html/class_text_edit_ex-members.html b/docs/html/class_text_edit_ex-members.html new file mode 100644 index 000000000..7da2a126f --- /dev/null +++ b/docs/html/class_text_edit_ex-members.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TextEditEx Member List
+
+
+ +

This is the complete list of members for TextEditEx, including all inherited members.

+ + + + + + + + + + +
getPlainTextEx() (defined in TextEditEx)TextEditEx
getPreviousValue() (defined in TextEditEx)TextEditEx
previousText (defined in TextEditEx)TextEditExprivate
setPlainTextEx(const QString &text) (defined in TextEditEx)TextEditEx
text (defined in TextEditEx)TextEditExprivate
TextEditEx(QWidget *parent=0) (defined in TextEditEx)TextEditEx
updateInternals() (defined in TextEditEx)TextEditExprivateslot
updateSelf() (defined in TextEditEx)TextEditExsignal
updateText() (defined in TextEditEx)TextEditExprivateslot
+ + + + diff --git a/docs/html/class_text_edit_ex.html b/docs/html/class_text_edit_ex.html new file mode 100644 index 000000000..4cdfeac5b --- /dev/null +++ b/docs/html/class_text_edit_ex.html @@ -0,0 +1,132 @@ + + + + + + + +Olive: TextEditEx Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for TextEditEx:
+
+
+ +
+ + + + +

+Signals

+void updateSelf ()
 
+ + + + + + + + + +

+Public Member Functions

TextEditEx (QWidget *parent=0)
 
+void setPlainTextEx (const QString &text)
 
+const QString & getPreviousValue ()
 
+const QString & getPlainTextEx ()
 
+ + + + + +

+Private Slots

+void updateInternals ()
 
+void updateText ()
 
+ + + + + +

+Private Attributes

+QString previousText
 
+QString text
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_text_edit_ex.png b/docs/html/class_text_edit_ex.png new file mode 100644 index 0000000000000000000000000000000000000000..f7be0db1696ea9e906535eb3b70e338a2fe5a412 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^Za^Hs!3-oP*MBwuQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;tVNY<2e{Pxe99j3-Ve?QmyDXV6hp_aaNe`2t*&#uSmmmfHvx$5$A$-$D&!&&Dz zcQDRebBldOUa;lfOZKyS@4IhbxkdK+(@sva)U + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TextEffect Member List
+
+
+ +

This is the complete list of members for TextEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
font (defined in TextEffect)TextEffectprivate
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
halign_field (defined in TextEffect)TextEffect
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
open() (defined in Effect)Effect
open_text_edit() (defined in TextEffect)TextEffectprivateslot
outline_bool (defined in TextEffect)TextEffect
outline_color (defined in TextEffect)TextEffect
outline_enable(bool) (defined in TextEffect)TextEffectprivateslot
outline_width (defined in TextEffect)TextEffect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
redraw(double timecode) (defined in TextEffect)TextEffectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_color_button (defined in TextEffect)TextEffect
set_enabled(bool b) (defined in Effect)Effect
set_font_combobox (defined in TextEffect)TextEffect
setIterations(int i) (defined in Effect)Effect
shadow_bool (defined in TextEffect)TextEffect
shadow_color (defined in TextEffect)TextEffect
shadow_distance (defined in TextEffect)TextEffect
shadow_enable(bool) (defined in TextEffect)TextEffectprivateslot
shadow_opacity (defined in TextEffect)TextEffect
shadow_softness (defined in TextEffect)TextEffect
size_val (defined in TextEffect)TextEffect
startEffect() (defined in Effect)Effectvirtual
text_edit_menu() (defined in TextEffect)TextEffectprivateslot
text_val (defined in TextEffect)TextEffect
TextEffect(Clip *c, const EffectMeta *em) (defined in TextEffect)TextEffect
texture (defined in Effect)Effectprotected
valign_field (defined in TextEffect)TextEffect
vertPath (defined in Effect)Effectprotected
word_wrap_field (defined in TextEffect)TextEffect
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_text_effect.html b/docs/html/class_text_effect.html new file mode 100644 index 000000000..8171fb096 --- /dev/null +++ b/docs/html/class_text_effect.html @@ -0,0 +1,334 @@ + + + + + + + +Olive: TextEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for TextEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

TextEffect (Clip *c, const EffectMeta *em)
 
+void redraw (double timecode)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldtext_val
 
+EffectFieldsize_val
 
+EffectFieldset_color_button
 
+EffectFieldset_font_combobox
 
+EffectFieldhalign_field
 
+EffectFieldvalign_field
 
+EffectFieldword_wrap_field
 
+EffectFieldoutline_bool
 
+EffectFieldoutline_width
 
+EffectFieldoutline_color
 
+EffectFieldshadow_bool
 
+EffectFieldshadow_distance
 
+EffectFieldshadow_color
 
+EffectFieldshadow_softness
 
+EffectFieldshadow_opacity
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + + + + + + + +

+Private Slots

+void outline_enable (bool)
 
+void shadow_enable (bool)
 
+void text_edit_menu ()
 
+void open_text_edit ()
 
+ + + +

+Private Attributes

+QFont font
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/texteffect.h
  • +
  • effects/internal/texteffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_text_effect.png b/docs/html/class_text_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..c8185e1297b16eddfab722adac38747d283c2ac2 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^E6z5gQNr}$0Lz8b94Ae9H}p(6(^q#|;G}ry zaa9KP7^Z|m&W59^3}Vw6BI^8woH+IhgoOSs=v=jGsp`Zpp3S16cW;0EXy*{-B?iJR#{yElW5YtSX0H@W-nEStXmaTVu+t|u~=KE-Uk zv1g&C=X>A7zZjMz_N~y#dpucX|HeGENws^U_D)!HdwtQR2{HN0&m|jAx?8EdGPr8v zT(|4D{N(CpP2Od7dS0KU;Z;rc + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TimecodeEffect Member List
+
+
+ +

This is the complete list of members for TimecodeEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
are_gizmos_enabled() (defined in Effect)Effect
bg_alpha (defined in TimecodeEffect)TimecodeEffect
close() (defined in Effect)Effect
color_bg_val (defined in TimecodeEffect)TimecodeEffect
color_val (defined in TimecodeEffect)TimecodeEffect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
display_timecode (defined in TimecodeEffect)TimecodeEffectprivate
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
font (defined in TimecodeEffect)TimecodeEffectprivate
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
offset_x_val (defined in TimecodeEffect)TimecodeEffect
offset_y_val (defined in TimecodeEffect)TimecodeEffect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
prepend_text (defined in TimecodeEffect)TimecodeEffect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
redraw(double timecode) (defined in TimecodeEffect)TimecodeEffectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
scale_val (defined in TimecodeEffect)TimecodeEffect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
tc_select (defined in TimecodeEffect)TimecodeEffect
texture (defined in Effect)Effectprotected
TimecodeEffect(Clip *c, const EffectMeta *em) (defined in TimecodeEffect)TimecodeEffect
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_timecode_effect.html b/docs/html/class_timecode_effect.html new file mode 100644 index 000000000..380a3172f --- /dev/null +++ b/docs/html/class_timecode_effect.html @@ -0,0 +1,300 @@ + + + + + + + +Olive: TimecodeEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
TimecodeEffect Class Reference
+
+
+
+Inheritance diagram for TimecodeEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

TimecodeEffect (Clip *c, const EffectMeta *em)
 
+void redraw (double timecode)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldscale_val
 
+EffectFieldcolor_val
 
+EffectFieldcolor_bg_val
 
+EffectFieldbg_alpha
 
+EffectFieldoffset_x_val
 
+EffectFieldoffset_y_val
 
+EffectFieldprepend_text
 
+EffectFieldtc_select
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + + + +

+Private Attributes

+QFont font
 
+QString display_timecode
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_timecode_effect.png b/docs/html/class_timecode_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..b65367d44aa8eeaa50b67791b21b00c32a649f49 GIT binary patch literal 608 zcmeAS@N?(olHy`uVBq!ia0vp^$w1t}!3-piq%D00q$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXg-+Q_^hEy=Vo%_0PwE+*?ae1M-|K@h5 z=T5nhyo-0$u5~l4mUybEE!%HsoXzv>-MuL#J9Z!c!Eii4G&Or?>Gwxfo6Zy;-}dTP zso9^<5dE1q&( z#nb=imCqWlUi~=a5#;zU-ZQAD#3QIjzo;bk`c~ElQnn7sc?Dl;t55Rw$-5Sxl5@S%-`8o-pBLa+*xPU_OW}p*s-6{&+YmjPuXmH}F*Mv + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Timeline Member List
+
+
+ +

This is the complete list of members for Timeline, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_btn_click() (defined in Timeline)Timelineprivateslot
add_clips_from_ghosts(ComboAction *ca, Sequence *s) (defined in Timeline)Timeline
add_menu_item(QAction *) (defined in Timeline)Timelineprivateslot
add_transition() (defined in Timeline)Timelineslot
addButton (defined in Timeline)Timelineprivate
audio_area (defined in Timeline)Timelineprivate
audio_ghosts (defined in Timeline)Timeline
audio_monitor (defined in Timeline)Timeline
audio_track_heights (defined in Timeline)Timeline
audioScrollbar (defined in Timeline)Timelineprivate
block_repaints (defined in Timeline)Timeline
calculate_track_height(int track, int height) (defined in Timeline)Timeline
can_ripple_empty_space(long frame, int track) (defined in Timeline)Timeline
clean_up_selections(QVector< Selection > &areas) (defined in Timeline)Timeline
copy(bool del) (defined in Timeline)Timeline
create_ghosts_from_media(Sequence *seq, long entry_point, QVector< Media * > &media_list) (defined in Timeline)Timeline
creating (defined in Timeline)Timeline
creating_object (defined in Timeline)Timeline
cursor_frame (defined in Timeline)Timeline
cursor_track (defined in Timeline)Timeline
decheck_tool_buttons(QObject *sender) (defined in Timeline)Timelineprivate
decrease_track_height() (defined in Timeline)Timelineslot
default_track_height (defined in Timeline)Timelineprivate
delete_areas_and_relink(ComboAction *ca, QVector< Selection > &areas, bool deselect_areas) (defined in Timeline)Timeline
delete_in_out_internal(bool ripple) (defined in Timeline)Timeline
delete_inout() (defined in Timeline)Timelineslot
delete_selection(QVector< Selection > &selections, bool ripple) (defined in Timeline)Timeline
deselect() (defined in Timeline)Timelineslot
deselect_area(long in, long out, int track) (defined in Timeline)Timeline
drag_frame_start (defined in Timeline)Timeline
drag_track_start (defined in Timeline)Timeline
drag_x_start (defined in Timeline)Timeline
drag_y_start (defined in Timeline)Timeline
edit_to_in_point() (defined in Timeline)Timelineslot
edit_to_out_point() (defined in Timeline)Timelineslot
edit_to_point_internal(bool in, bool ripple) (defined in Timeline)Timeline
editAreas (defined in Timeline)Timelineprivate
focused() (defined in Timeline)Timeline
get_snap_range() (defined in Timeline)Timeline
get_track_height_size(bool video) (defined in Timeline)Timeline
get_tracks_of_linked_clips(int i) (defined in Timeline)Timeline
getDisplayFrameFromScreenPoint(int x) (defined in Timeline)Timeline
getDisplayScreenPointFromFrame(long frame) (defined in Timeline)Timeline
getTimelineFrameFromScreenPoint(int x) (defined in Timeline)Timeline
getTimelineScreenPointFromFrame(long frame) (defined in Timeline)Timeline
ghosts (defined in Timeline)Timeline
hand_moving (defined in Timeline)Timeline
has_clip_been_split(int c) (defined in Timeline)Timeline
headers (defined in Timeline)Timeline
horizontalScrollBar (defined in Timeline)Timeline
importing (defined in Timeline)Timeline
importing_files (defined in Timeline)Timeline
increase_track_height() (defined in Timeline)Timelineslot
move_insert (defined in Timeline)Timeline
moving_init (defined in Timeline)Timeline
moving_proc (defined in Timeline)Timeline
nest() (defined in Timeline)Timelineslot
next_cut() (defined in Timeline)Timelineslot
old_zoom (defined in Timeline)Timeline
paste(bool insert=false) (defined in Timeline)Timelineslot
previous_cut() (defined in Timeline)Timelineslot
rc_ripple_max (defined in Timeline)Timelineprivate
rc_ripple_min (defined in Timeline)Timelineprivate
record_btn_click() (defined in Timeline)Timelineprivateslot
recordButton (defined in Timeline)Timelineprivate
rect_select_h (defined in Timeline)Timeline
rect_select_init (defined in Timeline)Timeline
rect_select_proc (defined in Timeline)Timeline
rect_select_w (defined in Timeline)Timeline
rect_select_x (defined in Timeline)Timeline
rect_select_y (defined in Timeline)Timeline
relink_clips_using_ids(QVector< int > &old_clips, QVector< Clip * > &new_clips) (defined in Timeline)Timeline
repaint_timeline() (defined in Timeline)Timelineslot
resize_move(double d) (defined in Timeline)Timelineprivateslot
resizeEvent(QResizeEvent *event) (defined in Timeline)Timeline
ripple_delete() (defined in Timeline)Timelineslot
ripple_delete_empty_space() (defined in Timeline)Timelineslot
ripple_delete_inout() (defined in Timeline)Timelineslot
ripple_to_in_point() (defined in Timeline)Timelineslot
ripple_to_out_point() (defined in Timeline)Timelineslot
scroll (defined in Timeline)Timelineprivate
scroll_to_frame(long frame) (defined in Timeline)Timeline
select_all() (defined in Timeline)Timeline
select_from_playhead() (defined in Timeline)Timeline
selecting (defined in Timeline)Timeline
selection_offset (defined in Timeline)Timeline
set_marker() (defined in Timeline)Timeline
set_sb_max() (defined in Timeline)Timelineprivate
set_tool() (defined in Timeline)Timelineprivateslot
set_tool(int tool) (defined in Timeline)Timelineprivate
set_zoom(bool in) (defined in Timeline)Timeline
set_zoom_value(double v) (defined in Timeline)Timelineprivate
setScroll(int) (defined in Timeline)Timelineprivateslot
setup_ui() (defined in Timeline)Timelineprivate
showing_all (defined in Timeline)Timeline
snap_point (defined in Timeline)Timeline
snap_to_point(long point, long *l) (defined in Timeline)Timeline
snap_to_timeline(long *l, bool use_playhead, bool use_markers, bool use_workarea) (defined in Timeline)Timeline
snapped (defined in Timeline)Timeline
snapping (defined in Timeline)Timeline
snapping_clicked(bool checked) (defined in Timeline)Timelineprivateslot
snappingButton (defined in Timeline)Timeline
split_all_clips_at_point(ComboAction *ca, long point) (defined in Timeline)Timeline
split_at_playhead() (defined in Timeline)Timelineslot
split_cache (defined in Timeline)Timeline
split_clip(ComboAction *ca, bool transitions, int p, long frame) (defined in Timeline)Timeline
split_clip(ComboAction *ca, bool transitions, int p, long frame, long post_in) (defined in Timeline)Timeline
split_clip_and_relink(ComboAction *ca, int clip, long frame, bool relink) (defined in Timeline)Timeline
split_selection(ComboAction *ca) (defined in Timeline)Timeline
split_tracks (defined in Timeline)Timeline
splitting (defined in Timeline)Timeline
Timeline(QWidget *parent=nullptr) (defined in Timeline)Timelineexplicit
timeline_area (defined in Timeline)Timelineprivate
toggle_enable_on_selected_clips() (defined in Timeline)Timelineslot
toggle_links() (defined in Timeline)Timelineslot
toggle_show_all() (defined in Timeline)Timelineslot
tool (defined in Timeline)Timeline
tool_button_widget (defined in Timeline)Timelineprivate
tool_buttons (defined in Timeline)Timelineprivate
toolArrowButton (defined in Timeline)Timeline
toolEditButton (defined in Timeline)Timeline
toolHandButton (defined in Timeline)Timeline
toolRazorButton (defined in Timeline)Timeline
toolRippleButton (defined in Timeline)Timeline
toolSlideButton (defined in Timeline)Timeline
toolSlipButton (defined in Timeline)Timeline
toolTransitionButton (defined in Timeline)Timeline
transition_menu_select(QAction *) (defined in Timeline)Timelineprivateslot
transition_select (defined in Timeline)Timeline
transition_tool_click() (defined in Timeline)Timelineprivateslot
transition_tool_init (defined in Timeline)Timeline
transition_tool_meta (defined in Timeline)Timeline
transition_tool_post_clip (defined in Timeline)Timeline
transition_tool_pre_clip (defined in Timeline)Timeline
transition_tool_proc (defined in Timeline)Timeline
transition_tool_side (defined in Timeline)Timeline
transition_tool_type (defined in Timeline)Timeline
trim_in_point (defined in Timeline)Timeline
trim_target (defined in Timeline)Timeline
update_effect_controls() (defined in Timeline)Timeline
update_sequence() (defined in Timeline)Timeline
video_area (defined in Timeline)Timelineprivate
video_ghosts (defined in Timeline)Timeline
video_track_heights (defined in Timeline)Timeline
videoScrollbar (defined in Timeline)Timelineprivate
zoom (defined in Timeline)Timeline
zoom_in() (defined in Timeline)Timelineprivateslot
zoom_just_changed (defined in Timeline)Timeline
zoom_out() (defined in Timeline)Timelineprivateslot
zoomInButton (defined in Timeline)Timelineprivate
zoomOutButton (defined in Timeline)Timelineprivate
~Timeline() (defined in Timeline)Timeline
+ + + + diff --git a/docs/html/class_timeline.html b/docs/html/class_timeline.html new file mode 100644 index 000000000..b0aa2b5fb --- /dev/null +++ b/docs/html/class_timeline.html @@ -0,0 +1,566 @@ + + + + + + + +Olive: Timeline Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for Timeline:
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Slots

+void paste (bool insert=false)
 
+void repaint_timeline ()
 
+void toggle_show_all ()
 
+void deselect ()
 
+void toggle_links ()
 
+void split_at_playhead ()
 
+void ripple_delete ()
 
+void ripple_delete_empty_space ()
 
+void toggle_enable_on_selected_clips ()
 
+void delete_inout ()
 
+void ripple_delete_inout ()
 
+void ripple_to_in_point ()
 
+void ripple_to_out_point ()
 
+void edit_to_in_point ()
 
+void edit_to_out_point ()
 
+void increase_track_height ()
 
+void decrease_track_height ()
 
+void previous_cut ()
 
+void next_cut ()
 
+void add_transition ()
 
+void nest ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

Timeline (QWidget *parent=nullptr)
 
+bool focused ()
 
+void set_zoom (bool in)
 
+void copy (bool del)
 
+Clipsplit_clip (ComboAction *ca, bool transitions, int p, long frame)
 
+Clipsplit_clip (ComboAction *ca, bool transitions, int p, long frame, long post_in)
 
+bool split_selection (ComboAction *ca)
 
+bool split_all_clips_at_point (ComboAction *ca, long point)
 
+bool split_clip_and_relink (ComboAction *ca, int clip, long frame, bool relink)
 
+void clean_up_selections (QVector< Selection > &areas)
 
+void deselect_area (long in, long out, int track)
 
+void delete_areas_and_relink (ComboAction *ca, QVector< Selection > &areas, bool deselect_areas)
 
+void relink_clips_using_ids (QVector< int > &old_clips, QVector< Clip * > &new_clips)
 
+void update_sequence ()
 
+QVector< int > get_tracks_of_linked_clips (int i)
 
+bool has_clip_been_split (int c)
 
+void edit_to_point_internal (bool in, bool ripple)
 
+void delete_in_out_internal (bool ripple)
 
+void create_ghosts_from_media (Sequence *seq, long entry_point, QVector< Media * > &media_list)
 
+void add_clips_from_ghosts (ComboAction *ca, Sequence *s)
 
+int getTimelineScreenPointFromFrame (long frame)
 
+long getTimelineFrameFromScreenPoint (int x)
 
+int getDisplayScreenPointFromFrame (long frame)
 
+long getDisplayFrameFromScreenPoint (int x)
 
+int get_snap_range ()
 
+bool snap_to_point (long point, long *l)
 
+bool snap_to_timeline (long *l, bool use_playhead, bool use_markers, bool use_workarea)
 
+void set_marker ()
 
+void update_effect_controls ()
 
+int get_track_height_size (bool video)
 
+int calculate_track_height (int track, int height)
 
+void delete_selection (QVector< Selection > &selections, bool ripple)
 
+void select_all ()
 
+void scroll_to_frame (long frame)
 
+void select_from_playhead ()
 
+bool can_ripple_empty_space (long frame, int track)
 
+void resizeEvent (QResizeEvent *event)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+int tool
 
+long cursor_frame
 
+int cursor_track
 
+double zoom
 
+bool zoom_just_changed
 
+long drag_frame_start
 
+int drag_track_start
 
+bool showing_all
 
+double old_zoom
 
+QVector< int > video_track_heights
 
+QVector< int > audio_track_heights
 
+bool snapping
 
+bool snapped
 
+long snap_point
 
+bool selecting
 
+int selection_offset
 
+bool rect_select_init
 
+bool rect_select_proc
 
+int rect_select_x
 
+int rect_select_y
 
+int rect_select_w
 
+int rect_select_h
 
+bool moving_init
 
+bool moving_proc
 
+QVector< Ghostghosts
 
+bool video_ghosts
 
+bool audio_ghosts
 
+bool move_insert
 
+int trim_target
 
+bool trim_in_point
 
+int transition_select
 
+bool splitting
 
+QVector< int > split_tracks
 
+QVector< int > split_cache
 
+bool importing
 
+bool importing_files
 
+bool creating
 
+int creating_object
 
+bool transition_tool_init
 
+bool transition_tool_proc
 
+int transition_tool_pre_clip
 
+int transition_tool_post_clip
 
+int transition_tool_type
 
+const EffectMetatransition_tool_meta
 
+int transition_tool_side
 
+bool hand_moving
 
+int drag_x_start
 
+int drag_y_start
 
+bool block_repaints
 
+TimelineHeaderheaders
 
+AudioMonitoraudio_monitor
 
+ResizableScrollBarhorizontalScrollBar
 
+QPushButton * toolArrowButton
 
+QPushButton * toolEditButton
 
+QPushButton * toolRippleButton
 
+QPushButton * toolRazorButton
 
+QPushButton * toolSlipButton
 
+QPushButton * toolSlideButton
 
+QPushButton * toolHandButton
 
+QPushButton * toolTransitionButton
 
+QPushButton * snappingButton
 
+ + + + + + + + + + + + + + + + + + + + + + + +

+Private Slots

+void zoom_in ()
 
+void zoom_out ()
 
+void snapping_clicked (bool checked)
 
+void add_btn_click ()
 
+void add_menu_item (QAction *)
 
+void setScroll (int)
 
+void record_btn_click ()
 
+void transition_tool_click ()
 
+void transition_menu_select (QAction *)
 
+void resize_move (double d)
 
+void set_tool ()
 
+ + + + + + + + + + + +

+Private Member Functions

+void set_zoom_value (double v)
 
+void decheck_tool_buttons (QObject *sender)
 
+void set_tool (int tool)
 
+void set_sb_max ()
 
+void setup_ui ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+QVector< QPushButton * > tool_buttons
 
+int scroll
 
+int default_track_height
 
+long rc_ripple_min
 
+long rc_ripple_max
 
+QWidget * timeline_area
 
+TimelineWidgetvideo_area
 
+TimelineWidgetaudio_area
 
+QWidget * editAreas
 
+QScrollBar * videoScrollbar
 
+QScrollBar * audioScrollbar
 
+QPushButton * zoomInButton
 
+QPushButton * zoomOutButton
 
+QPushButton * recordButton
 
+QPushButton * addButton
 
+QWidget * tool_button_widget
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_timeline.png b/docs/html/class_timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..96daf6f514f79cab0fa6fc710010d7313ba56dc9 GIT binary patch literal 426 zcmeAS@N?(olHy`uVBq!ia0vp^kw6^4!3-o_Z)t`CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^Wb`g5kt%CD`( z>#~@4vaUV3bhSXGQ00=-HGL*?x3A~4SH8}2|5D1Vg$$=-_j*-7nW6pbqj~N3Nim=P z^vGgqPJc9x$3#mO3&OarrTHa?#U^yZBCB7@0e#lH~M_< z&BBD`FT^Lfx|pzRSj+6-n)T%I1*g>${Wl0j_5Yc;H8Ev@iL$h0f*PDy_FlcaV+99e zz=Vnar~FB&_RrQnWA%Br-GwdUPXr8>ewpks(|`LXhN|2N%ug1n=R6SOUvS;;*(Cw5 z-4kWLZBcdya%a!Xe(gH-PxsXqS&P3hRNdT}n9?xQZi + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TimelineHeader Member List
+
+
+ +

This is the complete list of members for TimelineHeader, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
delete_markers() (defined in TimelineHeader)TimelineHeader
drag_start (defined in TimelineHeader)TimelineHeaderprivate
dragging (defined in TimelineHeader)TimelineHeaderprivate
dragging_markers (defined in TimelineHeader)TimelineHeaderprivate
fm (defined in TimelineHeader)TimelineHeaderprivate
focusOutEvent(QFocusEvent *) (defined in TimelineHeader)TimelineHeaderprotected
get_marker_offset() (defined in TimelineHeader)TimelineHeaderprivate
get_zoom() (defined in TimelineHeader)TimelineHeader
getHeaderFrameFromScreenPoint(int x) (defined in TimelineHeader)TimelineHeaderprivate
getHeaderScreenPointFromFrame(long frame) (defined in TimelineHeader)TimelineHeaderprivate
height_actual (defined in TimelineHeader)TimelineHeaderprivate
in_visible (defined in TimelineHeader)TimelineHeaderprivate
mouseMoveEvent(QMouseEvent *) (defined in TimelineHeader)TimelineHeaderprotected
mousePressEvent(QMouseEvent *) (defined in TimelineHeader)TimelineHeaderprotected
mouseReleaseEvent(QMouseEvent *) (defined in TimelineHeader)TimelineHeaderprotected
paintEvent(QPaintEvent *) (defined in TimelineHeader)TimelineHeaderprotected
resized_scroll_listener(double d) (defined in TimelineHeader)TimelineHeaderslot
resizing_workarea (defined in TimelineHeader)TimelineHeaderprivate
resizing_workarea_in (defined in TimelineHeader)TimelineHeaderprivate
scroll (defined in TimelineHeader)TimelineHeaderprivate
selected_marker_original_times (defined in TimelineHeader)TimelineHeaderprivate
selected_markers (defined in TimelineHeader)TimelineHeaderprivate
sequence_end (defined in TimelineHeader)TimelineHeaderprivate
set_in_point(long p) (defined in TimelineHeader)TimelineHeader
set_out_point(long p) (defined in TimelineHeader)TimelineHeader
set_playhead(int mouse_x) (defined in TimelineHeader)TimelineHeaderprivate
set_scroll(int) (defined in TimelineHeader)TimelineHeaderslot
set_scrollbar_max(QScrollBar *bar, long sequence_end_frame, int offset) (defined in TimelineHeader)TimelineHeader
set_visible_in(long i) (defined in TimelineHeader)TimelineHeaderslot
show_context_menu(const QPoint &pos) (defined in TimelineHeader)TimelineHeaderslot
show_text(bool enable) (defined in TimelineHeader)TimelineHeader
snapping (defined in TimelineHeader)TimelineHeader
temp_workarea_in (defined in TimelineHeader)TimelineHeaderprivate
temp_workarea_out (defined in TimelineHeader)TimelineHeaderprivate
text_enabled (defined in TimelineHeader)TimelineHeaderprivate
TimelineHeader(QWidget *parent=0) (defined in TimelineHeader)TimelineHeaderexplicit
update_parents() (defined in TimelineHeader)TimelineHeaderprivate
update_zoom(double z) (defined in TimelineHeader)TimelineHeaderslot
viewer (defined in TimelineHeader)TimelineHeader
zoom (defined in TimelineHeader)TimelineHeaderprivate
+ + + + diff --git a/docs/html/class_timeline_header.html b/docs/html/class_timeline_header.html new file mode 100644 index 000000000..634be020d --- /dev/null +++ b/docs/html/class_timeline_header.html @@ -0,0 +1,233 @@ + + + + + + + +Olive: TimelineHeader Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for TimelineHeader:
+
+
+ +
+ + + + + + + + + + + + +

+Public Slots

+void update_zoom (double z)
 
+void set_scroll (int)
 
+void set_visible_in (long i)
 
+void show_context_menu (const QPoint &pos)
 
+void resized_scroll_listener (double d)
 
+ + + + + + + + + + + + + + + +

+Public Member Functions

TimelineHeader (QWidget *parent=0)
 
+void set_in_point (long p)
 
+void set_out_point (long p)
 
+void show_text (bool enable)
 
+double get_zoom ()
 
+void delete_markers ()
 
+void set_scrollbar_max (QScrollBar *bar, long sequence_end_frame, int offset)
 
+ + + + + +

+Public Attributes

+Viewerviewer
 
+bool snapping
 
+ + + + + + + + + + + +

+Protected Member Functions

+void paintEvent (QPaintEvent *)
 
+void mousePressEvent (QMouseEvent *)
 
+void mouseMoveEvent (QMouseEvent *)
 
+void mouseReleaseEvent (QMouseEvent *)
 
+void focusOutEvent (QFocusEvent *)
 
+ + + + + + + + + + + +

+Private Member Functions

+void update_parents ()
 
+void set_playhead (int mouse_x)
 
+int get_marker_offset ()
 
+long getHeaderFrameFromScreenPoint (int x)
 
+int getHeaderScreenPointFromFrame (long frame)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+bool dragging
 
+bool resizing_workarea
 
+bool resizing_workarea_in
 
+long temp_workarea_in
 
+long temp_workarea_out
 
+long sequence_end
 
+double zoom
 
+long in_visible
 
+QFontMetrics fm
 
+int drag_start
 
+bool dragging_markers
 
+QVector< int > selected_markers
 
+QVector< long > selected_marker_original_times
 
+int scroll
 
+int height_actual
 
+bool text_enabled
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_timeline_header.png b/docs/html/class_timeline_header.png new file mode 100644 index 0000000000000000000000000000000000000000..4735a7d6eff0e0e125f59eb28eb69a2fc3456f18 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IXgGd*1#Ln;{G&b^)2V!-3lA3x*&|Hnm~ zPq<1?vxS;OrSXP+IH|&Se#XqNVrrhXrV5juT#IkeS-bJr3WI%BZx@|2UBaR=)sC%m zvfi9C-!^SnVt#s3$VpDltCM%@sGQdDT>59i+wcut3ZA^R+?K26IB$Em<7tYv?DoHB z4*h+%N@4!($pwB|>TBOcRZhBc;jZxes^5Gn_H!qdEQ`rPmu6ewZpSjl3E z!AQM(Pn;hI&$!k(xgzn1Hg6(#f0gc&z+XZ|S2R~G_uKZ|bXs%Ggp#(KR!>ihKA+29 zFw%#9v5R>*S%YJ!6dW1H(&e!KgczExqvQ-jIXt~UXsRk>ohPT7(8A5T-G@y GGywpI*v_E< literal 0 HcmV?d00001 diff --git a/docs/html/class_timeline_widget-members.html b/docs/html/class_timeline_widget-members.html new file mode 100644 index 000000000..30312bd2d --- /dev/null +++ b/docs/html/class_timeline_widget-members.html @@ -0,0 +1,120 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TimelineWidget Member List
+
+
+ +

This is the complete list of members for TimelineWidget, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bottom_align (defined in TimelineWidget)TimelineWidget
dragEnterEvent(QDragEnterEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
dragLeaveEvent(QDragLeaveEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
dragMoveEvent(QDragMoveEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
dropEvent(QDropEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
getClipIndexFromCoords(long frame, int track) (defined in TimelineWidget)TimelineWidgetprivate
getScreenPointFromTrack(int track) (defined in TimelineWidget)TimelineWidgetprivate
getTrackFromScreenPoint(int y) (defined in TimelineWidget)TimelineWidgetprivate
init_ghosts() (defined in TimelineWidget)TimelineWidgetprivate
is_track_visible(int track) (defined in TimelineWidget)TimelineWidgetprivate
leaveEvent(QEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
mouseDoubleClickEvent(QMouseEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
mouseMoveEvent(QMouseEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
mousePressEvent(QMouseEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
mouseReleaseEvent(QMouseEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
open_sequence_properties() (defined in TimelineWidget)TimelineWidgetprivateslot
paintEvent(QPaintEvent *) (defined in TimelineWidget)TimelineWidgetprotected
post_clips (defined in TimelineWidget)TimelineWidgetprivate
pre_clips (defined in TimelineWidget)TimelineWidgetprivate
rc_reveal_media (defined in TimelineWidget)TimelineWidgetprivate
rename_clip() (defined in TimelineWidget)TimelineWidgetprivateslot
resizeEvent(QResizeEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
reveal_media() (defined in TimelineWidget)TimelineWidgetprivateslot
scroll (defined in TimelineWidget)TimelineWidgetprivate
scrollBar (defined in TimelineWidget)TimelineWidget
selection_command (defined in TimelineWidget)TimelineWidgetprivate
self_created_sequence (defined in TimelineWidget)TimelineWidgetprivate
setScroll(int) (defined in TimelineWidget)TimelineWidgetslot
show_context_menu(const QPoint &pos) (defined in TimelineWidget)TimelineWidgetprivateslot
show_stabilizer_diag() (defined in TimelineWidget)TimelineWidgetprivateslot
TimelineWidget(QWidget *parent=0) (defined in TimelineWidget)TimelineWidgetexplicit
toggle_autoscale() (defined in TimelineWidget)TimelineWidgetprivateslot
tooltip_clip (defined in TimelineWidget)TimelineWidgetprivate
tooltip_timer (defined in TimelineWidget)TimelineWidgetprivate
tooltip_timer_timeout() (defined in TimelineWidget)TimelineWidgetprivateslot
track_resize_mouse_cache (defined in TimelineWidget)TimelineWidgetprivate
track_resize_old_value (defined in TimelineWidget)TimelineWidgetprivate
track_resizing (defined in TimelineWidget)TimelineWidgetprivate
track_target (defined in TimelineWidget)TimelineWidgetprivate
update_ghosts(const QPoint &mouse_pos, bool lock_frame) (defined in TimelineWidget)TimelineWidgetprivate
wheelEvent(QWheelEvent *event) (defined in TimelineWidget)TimelineWidgetprotected
+ + + + diff --git a/docs/html/class_timeline_widget.html b/docs/html/class_timeline_widget.html new file mode 100644 index 000000000..a3f3748ca --- /dev/null +++ b/docs/html/class_timeline_widget.html @@ -0,0 +1,240 @@ + + + + + + + +Olive: TimelineWidget Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for TimelineWidget:
+
+
+ +
+ + + + +

+Public Slots

+void setScroll (int)
 
+ + + +

+Public Member Functions

TimelineWidget (QWidget *parent=0)
 
+ + + + + +

+Public Attributes

+QScrollBar * scrollBar
 
+bool bottom_align
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Member Functions

+void paintEvent (QPaintEvent *)
 
+void resizeEvent (QResizeEvent *event)
 
+void mouseDoubleClickEvent (QMouseEvent *event)
 
+void mousePressEvent (QMouseEvent *event)
 
+void mouseReleaseEvent (QMouseEvent *event)
 
+void mouseMoveEvent (QMouseEvent *event)
 
+void leaveEvent (QEvent *event)
 
+void dragEnterEvent (QDragEnterEvent *event)
 
+void dragLeaveEvent (QDragLeaveEvent *event)
 
+void dropEvent (QDropEvent *event)
 
+void dragMoveEvent (QDragMoveEvent *event)
 
+void wheelEvent (QWheelEvent *event)
 
+ + + + + + + + + + + + + + + +

+Private Slots

+void reveal_media ()
 
+void show_context_menu (const QPoint &pos)
 
+void toggle_autoscale ()
 
+void tooltip_timer_timeout ()
 
+void rename_clip ()
 
+void show_stabilizer_diag ()
 
+void open_sequence_properties ()
 
+ + + + + + + + + + + + + +

+Private Member Functions

+void init_ghosts ()
 
+void update_ghosts (const QPoint &mouse_pos, bool lock_frame)
 
+bool is_track_visible (int track)
 
+int getTrackFromScreenPoint (int y)
 
+int getScreenPointFromTrack (int track)
 
+int getClipIndexFromCoords (long frame, int track)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+int track_resize_mouse_cache
 
+int track_resize_old_value
 
+bool track_resizing
 
+int track_target
 
+QVector< Clip * > pre_clips
 
+QVector< Clip * > post_clips
 
+Mediarc_reveal_media
 
+Sequenceself_created_sequence
 
+QTimer tooltip_timer
 
+int tooltip_clip
 
+int scroll
 
+SetSelectionsCommandselection_command
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_timeline_widget.png b/docs/html/class_timeline_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..a322ef4a116b49da3427ba3804b2bc9261aefef4 GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^2|ygc!3-oX+B7T&QW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;+Uy%x@J<_r_- zhiPgJ9=n!N41y^Q<2iXh^F}w^7s~H&zOc@x~u`wLD%D}MW7e8ZK z+QdT)k4%7Kb-WK`e#)#`Mj_I^ zO?8iNKGU_B-4vX2xDSXGGalch%_p^cqWtFI zUu$)>80F_WUUYpP;kjzJhUwkM<~s{z=P^Gq*MAhfCI9}980Hv=2fi}vhg#~%ELHpk Pj0*-&S3j3^P6 + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
ToneEffect Member List
+
+
+ +

This is the complete list of members for ToneEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
amount_val (defined in ToneEffect)ToneEffect
are_gizmos_enabled() (defined in Effect)Effect
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
freq_val (defined in ToneEffect)ToneEffect
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
mix_val (defined in ToneEffect)ToneEffect
name (defined in Effect)Effect
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in ToneEffect)ToneEffectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
refresh() (defined in Effect)Effectvirtual
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
sinX (defined in ToneEffect)ToneEffectprivate
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
ToneEffect(Clip *c, const EffectMeta *em) (defined in ToneEffect)ToneEffect
type_val (defined in ToneEffect)ToneEffect
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_tone_effect.html b/docs/html/class_tone_effect.html new file mode 100644 index 000000000..98547de5e --- /dev/null +++ b/docs/html/class_tone_effect.html @@ -0,0 +1,282 @@ + + + + + + + +Olive: ToneEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+
+Inheritance diagram for ToneEffect:
+
+
+ + +Effect + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

ToneEffect (Clip *c, const EffectMeta *em)
 
+void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual void refresh ()
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+EffectFieldtype_val
 
+EffectFieldfreq_val
 
+EffectFieldamount_val
 
+EffectFieldmix_val
 
- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
+ + + +

+Private Attributes

+int sinX
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Slots inherited from Effect
+void field_changed ()
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files:
    +
  • effects/internal/toneeffect.h
  • +
  • effects/internal/toneeffect.cpp
  • +
+
+ + + + diff --git a/docs/html/class_tone_effect.png b/docs/html/class_tone_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f9c37c9f4194a2383123fc281731d2729c0a1d GIT binary patch literal 543 zcmV+)0^t3LP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d00055NklQ*9M!q8c{ipD)2*lLyH2KO5pJ8- z#LQ!w74uf@KFU*li&}+Rh*!0H&VKTa8yEhC$+|9npK{LG#?>Su;sJok0^ow1X<58f zZl;IGN#$qy$=Zbp;09p=un7}@O_%^|!USLwCP*nI7f7nA4unZn)n;On@>e=fRJ9++ z@k`ULJ@5O#w8qt9D^sPZeO28bH)E>o8dcQ+BTpBmFY~k$e`^}kr>c77zvpSF-T4KJ zFIZLe9$`{dwRxCQO34ENlOOzVzARoUH`7Dpr1CTUWbMKPaDy-b*n|ndCQJY}VFIuT z6NreofB-lUCIFjeYWW8^v8}DA(?xZ>i)kKQTPZStftjh^yxzKvwxt$ZUu{ovG}Vpe zl0G`bw43g$Gt=1AJYAUPPj{iXh-sL<9n(d|kBT>*?vp(2s@02h%+pZ2_JYM13}6!` h0GskVAtLfU{{V<_IvmQ>_EZ1>002ovPDHLkV1n2h{e%Dj literal 0 HcmV?d00001 diff --git a/docs/html/class_transform_effect-members.html b/docs/html/class_transform_effect-members.html new file mode 100644 index 000000000..6b0c3901e --- /dev/null +++ b/docs/html/class_transform_effect-members.html @@ -0,0 +1,155 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
TransformEffect Member List
+
+
+ +

This is the complete list of members for TransformEffect, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
add_gizmo(int type) (defined in Effect)Effect
add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
anchor_gizmo (defined in TransformEffect)TransformEffectprivate
anchor_x_box (defined in TransformEffect)TransformEffectprivate
anchor_y_box (defined in TransformEffect)TransformEffectprivate
are_gizmos_enabled() (defined in Effect)Effect
blend_mode_box (defined in TransformEffect)TransformEffectprivate
bottom_center_gizmo (defined in TransformEffect)TransformEffectprivate
bottom_left_gizmo (defined in TransformEffect)TransformEffectprivate
bottom_right_gizmo (defined in TransformEffect)TransformEffectprivate
close() (defined in Effect)Effect
container (defined in Effect)Effect
copy(Clip *c) (defined in Effect)Effectvirtual
copy_field_keyframes(Effect *e) (defined in Effect)Effect
custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
enable_always_update (defined in Effect)Effectprotected
enable_coords (defined in Effect)Effect
enable_image (defined in Effect)Effect
enable_shader (defined in Effect)Effect
enable_superimpose (defined in Effect)Effect
endEffect() (defined in Effect)Effectvirtual
ffmpeg_filter (defined in Effect)Effect
field_changed() (defined in Effect)Effectslot
fragPath (defined in Effect)Effectprotected
getIterations() (defined in Effect)Effect
gizmo(int i) (defined in Effect)Effect
gizmo_count() (defined in Effect)Effect
gizmo_draw(double timecode, GLTextureCoords &coords) (defined in TransformEffect)TransformEffectvirtual
gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
gizmo_world_to_screen() (defined in Effect)Effect
glslProgram (defined in Effect)Effectprotected
id (defined in Effect)Effect
img (defined in Effect)Effectprotected
is_enabled() (defined in Effect)Effect
is_glsl_linked() (defined in Effect)Effect
is_open() (defined in Effect)Effect
left_center_gizmo (defined in TransformEffect)TransformEffectprivate
load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
load_from_string(const QByteArray &s) (defined in Effect)Effect
meta (defined in Effect)Effect
name (defined in Effect)Effect
opacity (defined in TransformEffect)TransformEffectprivate
open() (defined in Effect)Effect
parent_clip (defined in Effect)Effect
position_x (defined in TransformEffect)TransformEffectprivate
position_y (defined in TransformEffect)TransformEffectprivate
process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
process_coords(double timecode, GLTextureCoords &coords, int data) (defined in TransformEffect)TransformEffectvirtual
process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
process_superimpose(double timecode) (defined in Effect)Effectvirtual
rect_gizmo (defined in TransformEffect)TransformEffectprivate
refresh() (defined in TransformEffect)TransformEffectvirtual
right_center_gizmo (defined in TransformEffect)TransformEffectprivate
rotate_gizmo (defined in TransformEffect)TransformEffectprivate
rotation (defined in TransformEffect)TransformEffectprivate
row(int i) (defined in Effect)Effect
row_count() (defined in Effect)Effect
save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
save_to_string() (defined in Effect)Effect
scale_x (defined in TransformEffect)TransformEffectprivate
scale_y (defined in TransformEffect)TransformEffectprivate
set (defined in TransformEffect)TransformEffectprivate
set_enabled(bool b) (defined in Effect)Effect
setIterations(int i) (defined in Effect)Effect
startEffect() (defined in Effect)Effectvirtual
texture (defined in Effect)Effectprotected
toggle_uniform_scale(bool enabled) (defined in TransformEffect)TransformEffectslot
top_center_gizmo (defined in TransformEffect)TransformEffectprivate
top_left_gizmo (defined in TransformEffect)TransformEffectprivate
top_right_gizmo (defined in TransformEffect)TransformEffectprivate
TransformEffect(Clip *c, const EffectMeta *em) (defined in TransformEffect)TransformEffect
uniform_scale_field (defined in TransformEffect)TransformEffectprivate
vertPath (defined in Effect)Effectprotected
~Effect() (defined in Effect)Effect
+ + + + diff --git a/docs/html/class_transform_effect.html b/docs/html/class_transform_effect.html new file mode 100644 index 000000000..e2bb8f357 --- /dev/null +++ b/docs/html/class_transform_effect.html @@ -0,0 +1,336 @@ + + + + + + + +Olive: TransformEffect Class Reference + + + + + + + + + +
+
+ + + + + + +
+
Olive +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
+
TransformEffect Class Reference
+
+
+
+Inheritance diagram for TransformEffect:
+
+
+ + +Effect + +
+ + + + + + + +

+Public Slots

+void toggle_uniform_scale (bool enabled)
 
- Public Slots inherited from Effect
+void field_changed ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

TransformEffect (Clip *c, const EffectMeta *em)
 
+void refresh ()
 
+void process_coords (double timecode, GLTextureCoords &coords, int data)
 
+void gizmo_draw (double timecode, GLTextureCoords &coords)
 
- Public Member Functions inherited from Effect
Effect (Clip *c, const EffectMeta *em)
 
+EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
 
+EffectRowrow (int i)
 
+int row_count ()
 
+EffectGizmoadd_gizmo (int type)
 
+EffectGizmogizmo (int i)
 
+int gizmo_count ()
 
+bool is_enabled ()
 
+void set_enabled (bool b)
 
+virtual Effectcopy (Clip *c)
 
+void copy_field_keyframes (Effect *e)
 
+virtual void load (QXmlStreamReader &stream)
 
+virtual void custom_load (QXmlStreamReader &stream)
 
+virtual void save (QXmlStreamWriter &stream)
 
+void load_from_string (const QByteArray &s)
 
+QByteArray save_to_string ()
 
+bool is_open ()
 
+void open ()
 
+void close ()
 
+bool is_glsl_linked ()
 
+virtual void startEffect ()
 
+virtual void endEffect ()
 
+int getIterations ()
 
+void setIterations (int i)
 
+virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
 
+virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
 
+virtual GLuint process_superimpose (double timecode)
 
+virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
 
+void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
 
+void gizmo_world_to_screen ()
 
+bool are_gizmos_enabled ()
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Private Attributes

+EffectFieldposition_x
 
+EffectFieldposition_y
 
+EffectFieldscale_x
 
+EffectFieldscale_y
 
+EffectFielduniform_scale_field
 
+EffectFieldrotation
 
+EffectFieldanchor_x_box
 
+EffectFieldanchor_y_box
 
+EffectFieldopacity
 
+EffectFieldblend_mode_box
 
+EffectGizmotop_left_gizmo
 
+EffectGizmotop_center_gizmo
 
+EffectGizmotop_right_gizmo
 
+EffectGizmobottom_left_gizmo
 
+EffectGizmobottom_center_gizmo
 
+EffectGizmobottom_right_gizmo
 
+EffectGizmoleft_center_gizmo
 
+EffectGizmoright_center_gizmo
 
+EffectGizmoanchor_gizmo
 
+EffectGizmorotate_gizmo
 
+EffectGizmorect_gizmo
 
+bool set
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from Effect
+Clipparent_clip
 
+const EffectMetameta
 
+int id
 
+QString name
 
+CollapsibleWidgetcontainer
 
+bool enable_shader
 
+bool enable_coords
 
+bool enable_superimpose
 
+bool enable_image
 
+const char * ffmpeg_filter
 
- Protected Attributes inherited from Effect
+QOpenGLShaderProgram * glslProgram
 
+QString vertPath
 
+QString fragPath
 
+QImage img
 
+QOpenGLTexture * texture
 
+bool enable_always_update
 
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/docs/html/class_transform_effect.png b/docs/html/class_transform_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..bc028cad496457d8ccebf7fb66471cc2c1a87a39 GIT binary patch literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^X+Ye;!3-po{PPw8DTx4|5ZC|z{{xvX-h3_XKQsZz z0^SI)axk)<)`iWh4N>)WTF z-@i~(JAS@zpzo6(a%Y9M&b-+tZnARv`m4P&Zz`^LDPBwCG^Do*=DwI3x z`f_h%=KS-%_jHSG&mNQwjoOu!R(9lcJmdWh`qwSokJhsQZL0HAR=Om^ps(yu{VU_x z#_r|)&+cD3eA)AJ@>DS?2K|MM1wv8`>S&Z?TVe)(^Qx?Dr^TyYJ(+D{^w(FNGgSBZ zw)LxaJ+(Z$>aPE<%(KdiELXj}bmd8L=+)x5F15{BA))IFo<4K9Y-FyT9qc>TDD
  • FyYVeqrce%8cb@$AhrqYoc9S8IF^zZlbAT2;Q!a3+J+ zIg`t+d-m+vvE|H`2PKOCqy25)_P$zZ^u{CD?fK=W8cSwpUd~-SlYRO#i&;y + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Transition Member List
    +
    +
    + +

    This is the complete list of members for Transition, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    add_gizmo(int type) (defined in Effect)Effect
    add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
    are_gizmos_enabled() (defined in Effect)Effect
    close() (defined in Effect)Effect
    container (defined in Effect)Effect
    copy(Clip *c, Clip *s) (defined in Transition)Transition
    copy(Clip *c) (defined in Effect)Effectvirtual
    copy_field_keyframes(Effect *e) (defined in Effect)Effect
    custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
    enable_always_update (defined in Effect)Effectprotected
    enable_coords (defined in Effect)Effect
    enable_image (defined in Effect)Effect
    enable_shader (defined in Effect)Effect
    enable_superimpose (defined in Effect)Effect
    endEffect() (defined in Effect)Effectvirtual
    ffmpeg_filter (defined in Effect)Effect
    field_changed() (defined in Effect)Effectslot
    fragPath (defined in Effect)Effectprotected
    get_length() (defined in Transition)Transition
    get_true_length() (defined in Transition)Transition
    getIterations() (defined in Effect)Effect
    gizmo(int i) (defined in Effect)Effect
    gizmo_count() (defined in Effect)Effect
    gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
    gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
    gizmo_world_to_screen() (defined in Effect)Effect
    glslProgram (defined in Effect)Effectprotected
    id (defined in Effect)Effect
    img (defined in Effect)Effectprotected
    is_enabled() (defined in Effect)Effect
    is_glsl_linked() (defined in Effect)Effect
    is_open() (defined in Effect)Effect
    length (defined in Transition)Transitionprivate
    length_field (defined in Transition)Transitionprivate
    load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    load_from_string(const QByteArray &s) (defined in Effect)Effect
    meta (defined in Effect)Effect
    name (defined in Effect)Effect
    open() (defined in Effect)Effect
    parent_clip (defined in Effect)Effect
    process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
    process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
    process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
    process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
    process_superimpose(double timecode) (defined in Effect)Effectvirtual
    refresh() (defined in Effect)Effectvirtual
    row(int i) (defined in Effect)Effect
    row_count() (defined in Effect)Effect
    save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
    save_to_string() (defined in Effect)Effect
    secondary_clip (defined in Transition)Transition
    set_enabled(bool b) (defined in Effect)Effect
    set_length(long l) (defined in Transition)Transition
    set_length_from_slider() (defined in Transition)Transitionprivateslot
    setIterations(int i) (defined in Effect)Effect
    startEffect() (defined in Effect)Effectvirtual
    texture (defined in Effect)Effectprotected
    Transition(Clip *c, Clip *s, const EffectMeta *em) (defined in Transition)Transition
    vertPath (defined in Effect)Effectprotected
    ~Effect() (defined in Effect)Effect
    + + + + diff --git a/docs/html/class_transition.html b/docs/html/class_transition.html new file mode 100644 index 000000000..2d1adbc39 --- /dev/null +++ b/docs/html/class_transition.html @@ -0,0 +1,300 @@ + + + + + + + +Olive: Transition Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for Transition:
    +
    +
    + + +Effect +CrossDissolveTransition +CubeTransition +ExponentialFadeTransition +LinearFadeTransition +LogarithmicFadeTransition + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    Transition (Clip *c, Clip *s, const EffectMeta *em)
     
    +int copy (Clip *c, Clip *s)
     
    +void set_length (long l)
     
    +long get_true_length ()
     
    +long get_length ()
     
    - Public Member Functions inherited from Effect
    Effect (Clip *c, const EffectMeta *em)
     
    +EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
     
    +EffectRowrow (int i)
     
    +int row_count ()
     
    +EffectGizmoadd_gizmo (int type)
     
    +EffectGizmogizmo (int i)
     
    +int gizmo_count ()
     
    +bool is_enabled ()
     
    +void set_enabled (bool b)
     
    +virtual void refresh ()
     
    +virtual Effectcopy (Clip *c)
     
    +void copy_field_keyframes (Effect *e)
     
    +virtual void load (QXmlStreamReader &stream)
     
    +virtual void custom_load (QXmlStreamReader &stream)
     
    +virtual void save (QXmlStreamWriter &stream)
     
    +void load_from_string (const QByteArray &s)
     
    +QByteArray save_to_string ()
     
    +bool is_open ()
     
    +void open ()
     
    +void close ()
     
    +bool is_glsl_linked ()
     
    +virtual void startEffect ()
     
    +virtual void endEffect ()
     
    +int getIterations ()
     
    +void setIterations (int i)
     
    +virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
     
    +virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
     
    +virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
     
    +virtual GLuint process_superimpose (double timecode)
     
    +virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
     
    +virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
     
    +void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
     
    +void gizmo_world_to_screen ()
     
    +bool are_gizmos_enabled ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +Clipsecondary_clip
     
    - Public Attributes inherited from Effect
    +Clipparent_clip
     
    +const EffectMetameta
     
    +int id
     
    +QString name
     
    +CollapsibleWidgetcontainer
     
    +bool enable_shader
     
    +bool enable_coords
     
    +bool enable_superimpose
     
    +bool enable_image
     
    +const char * ffmpeg_filter
     
    + + + +

    +Private Slots

    +void set_length_from_slider ()
     
    + + + + + +

    +Private Attributes

    +long length
     
    +EffectFieldlength_field
     
    + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Slots inherited from Effect
    +void field_changed ()
     
    - Protected Attributes inherited from Effect
    +QOpenGLShaderProgram * glslProgram
     
    +QString vertPath
     
    +QString fragPath
     
    +QImage img
     
    +QOpenGLTexture * texture
     
    +bool enable_always_update
     
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/class_transition.png b/docs/html/class_transition.png new file mode 100644 index 0000000000000000000000000000000000000000..8968f070784f55dfb12707daae12112c475e1a94 GIT binary patch literal 2457 zcmcImYgAKL8U>|@wg@9@D8*{hse`q{LoI0*8eT;~1}>Dx#oS zBUTh>uuuj`;A8-KGrR(2Sq9|UkVd3QL=6E#43S3yfn?5&UH#$ohihg{*1Gx5Id`A^ zeRqFn-*vBk9N=TV!*+*}k&(IYiDSV=Mq3d$?lId6|CPHlF2P{)v47}syO%Vp&7;s(d32a{=1HkSMJ-= zrQh8;{GM^?zy6-hSWQ0j&49IUFPrjCTvZ~AjpXL!ASE-Ir9^vzXU}S-otfF}3B=NJ z>}wVt|J}O;PY(|t4tq}V8AFkkQYsUuHX85PnLX(CMubd9p4*W~^2HpAeqvM`&G8AiHM~U9N5PU5@(JhBrH!$k0yb7H%wxQ#t}5}VO9)ni-zpo@ zdt&9pLU7JC!+n^4%MrL{LiOi6pS3kH**HKqGc(Hw#vqqB-CR69dX}*J&Ykye-p1n} zC1N{hKkkA%V5R@5+iy|-Uw|5VT8D_j$K&JpX(+n85Yxx-ATMRBh~`r@E>SK3$dlEy5tIkgBO>k)@sS zD4J?$kc!SH)ItTb`!uYubdH^wW@}6^Kk-~UB?v`FeG$vMj7`=~_dLejd3jcHXAHV> z$I$oMYA}DvP{At*b-Hy*@uB&aExMboCMG7N1K7drW0qlU$i&)UD?at-087ioCajgN ziNCh;B?Vp_=vT=1KLa;h`OZj*sj+cM%SvDprkvkPwlY+~ajW60w(X_UXEQwfFcf{2 zzb@6A58^TRtdLndBgZ}|qIJ;Ploy^XJ{Znj`~d4oT{xfa-yg~0S`qsndum=7NmSz4 zIwG>C)F~0faxv1pDv_rBr|A+?^ppl=&?wdkqSrpCCqc?}Y=xG)^5uUt9fsr3U8deAFrlql8pzg#7zC94*Uyo692hl=m<;r>`SQ@!1Epz2_R_a)DU zVl0dYTfK23=#!?ecI19~2n!XJb~gJU@U7pQ4xGY*w;yuw1Oy&_|BV~>zJ%ecLRQ>$ z2#gQ4*_XE+3l4-{JOtjaI(Wj`3JdV)dqUtU$48_{>-c&V+Km|OJzS+9s_Fp1Jkl`% z6M*>o+C=IWsGY-zReoNF%MS4YigH3Tx(l2+=;pps>I1=*jH%xAhyi zJRdf=(*L-(o={U-Zs0BJR9cv>&Hf}J*LK?!rVwKWEyy%Yi{r`o<YWx5q^#xP*E5k(~RuyUI^JAzN!%6uT5mt1~^oZb%rZMIj-)Pz$O()V|F{Dty* zzZL0rlRB8$KoseekLkKUHll*(8gC@MK;$$>I~&^qVuelOnZm%k-TDhNf?y}_qvGZx za(yE^$O=VWmsR5BaD@Ao~h5AeBmUO5u&@T3!S7dm?(&Rz^!gBp1b}x7Ud7L zrb8lOlbdw&%ABrJhg)U8V<1UJ@<-bC%5&9;$rsC=q}5&3fW2FPC0>_+5DOSwwu;*x zGvrs2p6l?#+9RE`FTZ8DW0C`;hXDKj(%$ZK0j2?==*k#Jsnxa)y%_{|NYkZDkcjon zz0v8L8YnN39HGF)3YLFFyTXSAl=N=qX4gY=VZL~0N~bfXevY zl@Of!4^QlVkt?b$1xZgzRXgW#+=iJ9-}DMX%wQ2=Ptp0c16?Cb?KF-Qi8|z4gr%;i zI%_8tAB7=#r`HZK1^`q0ZUnl5%V0wb=zEB~MJ~`K@y?*crUru-CPGod!}Kr$0Yw>J zWB_axLG>nzT>*`ApN$`Q}&KDUL6m9 QM;ZAZ4>(r)QQXCU1N%{`ZU6uP literal 0 HcmV?d00001 diff --git a/docs/html/class_update_footage_tooltip-members.html b/docs/html/class_update_footage_tooltip-members.html new file mode 100644 index 000000000..d6dc8f784 --- /dev/null +++ b/docs/html/class_update_footage_tooltip-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    UpdateFootageTooltip Member List
    +
    +
    + +

    This is the complete list of members for UpdateFootageTooltip, including all inherited members.

    + + + + + + + + + +
    doRedo() override (defined in UpdateFootageTooltip)UpdateFootageTooltipvirtual
    doUndo() override (defined in UpdateFootageTooltip)UpdateFootageTooltipvirtual
    item (defined in UpdateFootageTooltip)UpdateFootageTooltipprivate
    OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
    redo() override (defined in OliveAction)OliveActionvirtual
    undo() override (defined in OliveAction)OliveActionvirtual
    UpdateFootageTooltip(Media *i) (defined in UpdateFootageTooltip)UpdateFootageTooltip
    ~OliveAction() override (defined in OliveAction)OliveActionvirtual
    + + + + diff --git a/docs/html/class_update_footage_tooltip.html b/docs/html/class_update_footage_tooltip.html new file mode 100644 index 000000000..6c65ac477 --- /dev/null +++ b/docs/html/class_update_footage_tooltip.html @@ -0,0 +1,122 @@ + + + + + + + +Olive: UpdateFootageTooltip Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    UpdateFootageTooltip Class Reference
    +
    +
    +
    +Inheritance diagram for UpdateFootageTooltip:
    +
    +
    + + +OliveAction + +
    + + + + + + + + + + + + + + + +

    +Public Member Functions

    UpdateFootageTooltip (Media *i)
     
    +virtual void doUndo () override
     
    +virtual void doRedo () override
     
    - Public Member Functions inherited from OliveAction
    OliveAction (bool iset_window_modified=true)
     
    +virtual void undo () override
     
    +virtual void redo () override
     
    + + + +

    +Private Attributes

    +Mediaitem
     
    +
    The documentation for this class was generated from the following files:
      +
    • project/undo.h
    • +
    • project/undo.cpp
    • +
    +
    + + + + diff --git a/docs/html/class_update_footage_tooltip.png b/docs/html/class_update_footage_tooltip.png new file mode 100644 index 0000000000000000000000000000000000000000..e1618b20f0b44a5a8fa2b7e5fc87282cb55d5fc5 GIT binary patch literal 780 zcmV+n1M~ceP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d0007;Nkl%W&CKkaLiat4y8AIkU^O#4(lZ$A;9PAR$$ao~{6e?%+T5+b&Zv!M@UzX# zI-SQT?bfPB7q|N^g`hT~*=Ay+m+#mww4l^BU(W)>+i zu8AQcGF$+!>IN`g*TA^lF2QjPjG5vJ92ddJOaWX;jKlzllo*Kt5GgSd10YgjBnCjF z#7GQ)NQv=JF{Wvn#*0Z+b+i&AF;rC}oy3s&x715fRqfP`?f9sw?&=)IhOo1~bmLDm zoW)odF2`ICyQqYyVl4gpqZ#M+8LU?@L{$UzKIdN1yD_|*_fb_n(62Dow{X9=T|EfH zTU+oyhS6n8ZFd9x&L6^f_-?q&Xc$|+&y;s!sH%QaiIEtps*w`oni$hGO~VE7s%`+| zbq$Q$?GhZ7bc!2o#BenbPy14D!{50qxHEQe{2 zw!nJI@Aht9_4m%p4vW*aRfthzwzgal-8o$MyWP!mkMGXTF^-0>`gd8*T%+;;7fe6I z@OvC%lwI5YyU}Q#p7u=`ebC+AICv@D9sD)M*t@X?HOiDSbdV|4Ue^9GQ&y)aQ-1yg z0G!g8F}jEW9O#1>^=$zBpd$=`zgJ=;20*0cUsptAu)Y9gMQMv$TRl<$0000< KMNUMnLSTYgEpOid literal 0 HcmV?d00001 diff --git a/docs/html/class_update_viewer-members.html b/docs/html/class_update_viewer-members.html new file mode 100644 index 000000000..cb5bffb42 --- /dev/null +++ b/docs/html/class_update_viewer-members.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    UpdateViewer Member List
    +
    +
    + +

    This is the complete list of members for UpdateViewer, including all inherited members.

    + + + + + + + +
    doRedo() override (defined in UpdateViewer)UpdateViewervirtual
    doUndo() override (defined in UpdateViewer)UpdateViewervirtual
    OliveAction(bool iset_window_modified=true) (defined in OliveAction)OliveAction
    redo() override (defined in OliveAction)OliveActionvirtual
    undo() override (defined in OliveAction)OliveActionvirtual
    ~OliveAction() override (defined in OliveAction)OliveActionvirtual
    + + + + diff --git a/docs/html/class_update_viewer.html b/docs/html/class_update_viewer.html new file mode 100644 index 000000000..9ab37047b --- /dev/null +++ b/docs/html/class_update_viewer.html @@ -0,0 +1,112 @@ + + + + + + + +Olive: UpdateViewer Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    UpdateViewer Class Reference
    +
    +
    +
    +Inheritance diagram for UpdateViewer:
    +
    +
    + + +OliveAction + +
    + + + + + + + + + + + + + +

    +Public Member Functions

    +virtual void doUndo () override
     
    +virtual void doRedo () override
     
    - Public Member Functions inherited from OliveAction
    OliveAction (bool iset_window_modified=true)
     
    +virtual void undo () override
     
    +virtual void redo () override
     
    +
    The documentation for this class was generated from the following files:
      +
    • project/undo.h
    • +
    • project/undo.cpp
    • +
    +
    + + + + diff --git a/docs/html/class_update_viewer.png b/docs/html/class_update_viewer.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b820bbbbd1a30a97972aaf0d32d6cb207dedeb GIT binary patch literal 696 zcmeAS@N?(olHy`uVBq!ia0vp^SwP&u!3-oViu-hclth3}i0l9V|AEXGZ@!lHADRGU zf$@O@2Ut7r$OE|?B|(0{3_wL7aP?G(5d#C0yQhm|NCo5Dxo?ZsDDXJ=KkBLcZ@y1U zYs2c$*=BFQ9DArC->95(=YB`Wk%k#FT_-0+jcbNmcvcA%I2k^s?pVRH-^7*u>S27`fBSoezV{6!?mXEEi(CC z6t3Rym#S84Ip^=PtV6P^CYg(``gXv6t<{{eiH&EI&dzBLG=6#d_nXD__Gh^ZYO91Q0r8IwAKdy{8q``vQC(H#AYWWIr!G|b+OZX@%I<`$ zRX2O?_5F`qsC5+osim)s3f7m){(Z%F^>+Eyl$g-mw|30)fmZFG7P4}cmB-XotC}OO z8t^!i?CwrrL@>C3ykoy2DvCX}ee27A4_xr8Id>`E`rCx- zOZ`Jq%hu-VI#iunTz18rVOG(;)p<{|MV)lt?peO-X??2goOcyj;l(_vPl{LlW4PV9 zHTzwJ)%FRuS9RZirFx&$;?ZIMiu-?~*`}@g`X}n4chI)C*8j!se~|xFzmj3!j1WeP fj?m7ImJj?>w1PbU2JQO>OlAz8u6{1-oD!M + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    VSTHost Member List
    +
    +
    + +

    This is the complete list of members for VSTHost, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    add_gizmo(int type) (defined in Effect)Effect
    add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
    are_gizmos_enabled() (defined in Effect)Effect
    canPluginDo(char *canDoString) (defined in VSTHost)VSTHostprivate
    change_plugin() (defined in VSTHost)VSTHostprivateslot
    close() (defined in Effect)Effect
    configurePluginCallbacks() (defined in VSTHost)VSTHostprivate
    container (defined in Effect)Effect
    copy(Clip *c) (defined in Effect)Effectvirtual
    copy_field_keyframes(Effect *e) (defined in Effect)Effect
    custom_load(QXmlStreamReader &stream) (defined in VSTHost)VSTHostvirtual
    data_cache (defined in VSTHost)VSTHostprivate
    dialog (defined in VSTHost)VSTHostprivate
    dispatcher (defined in VSTHost)VSTHostprivate
    Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
    enable_always_update (defined in Effect)Effectprotected
    enable_coords (defined in Effect)Effect
    enable_image (defined in Effect)Effect
    enable_shader (defined in Effect)Effect
    enable_superimpose (defined in Effect)Effect
    endEffect() (defined in Effect)Effectvirtual
    ffmpeg_filter (defined in Effect)Effect
    field_changed() (defined in Effect)Effectslot
    file_field (defined in VSTHost)VSTHostprivate
    fragPath (defined in Effect)Effectprotected
    freePlugin() (defined in VSTHost)VSTHostprivate
    getIterations() (defined in Effect)Effect
    gizmo(int i) (defined in Effect)Effect
    gizmo_count() (defined in Effect)Effect
    gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
    gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
    gizmo_world_to_screen() (defined in Effect)Effect
    glslProgram (defined in Effect)Effectprotected
    id (defined in Effect)Effect
    img (defined in Effect)Effectprotected
    inputs (defined in VSTHost)VSTHostprivate
    is_enabled() (defined in Effect)Effect
    is_glsl_linked() (defined in Effect)Effect
    is_open() (defined in Effect)Effect
    load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    load_from_string(const QByteArray &s) (defined in Effect)Effect
    loadPlugin() (defined in VSTHost)VSTHostprivate
    meta (defined in Effect)Effect
    modulePtr (defined in VSTHost)VSTHostprivate
    name (defined in Effect)Effect
    open() (defined in Effect)Effect
    outputs (defined in VSTHost)VSTHostprivate
    parent_clip (defined in Effect)Effect
    plugin (defined in VSTHost)VSTHostprivate
    process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in VSTHost)VSTHostvirtual
    process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
    process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
    process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
    process_superimpose(double timecode) (defined in Effect)Effectvirtual
    processAudio(long numFrames) (defined in VSTHost)VSTHostprivate
    refresh() (defined in Effect)Effectvirtual
    resumePlugin() (defined in VSTHost)VSTHostprivate
    row(int i) (defined in Effect)Effect
    row_count() (defined in Effect)Effect
    save(QXmlStreamWriter &stream) (defined in VSTHost)VSTHostvirtual
    save_to_string() (defined in Effect)Effect
    set_enabled(bool b) (defined in Effect)Effect
    setIterations(int i) (defined in Effect)Effect
    show_interface(bool show) (defined in VSTHost)VSTHostprivateslot
    show_interface_btn (defined in VSTHost)VSTHostprivate
    startEffect() (defined in Effect)Effectvirtual
    startPlugin() (defined in VSTHost)VSTHostprivate
    stopPlugin() (defined in VSTHost)VSTHostprivate
    suspendPlugin() (defined in VSTHost)VSTHostprivate
    texture (defined in Effect)Effectprotected
    uncheck_show_button() (defined in VSTHost)VSTHostprivateslot
    vertPath (defined in Effect)Effectprotected
    VSTHost(Clip *c, const EffectMeta *em) (defined in VSTHost)VSTHost
    ~Effect() (defined in Effect)Effect
    ~VSTHost() (defined in VSTHost)VSTHost
    + + + + diff --git a/docs/html/class_v_s_t_host.html b/docs/html/class_v_s_t_host.html new file mode 100644 index 000000000..76907506b --- /dev/null +++ b/docs/html/class_v_s_t_host.html @@ -0,0 +1,334 @@ + + + + + + + +Olive: VSTHost Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for VSTHost:
    +
    +
    + + +Effect + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    VSTHost (Clip *c, const EffectMeta *em)
     
    +void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
     
    +void custom_load (QXmlStreamReader &stream)
     
    +void save (QXmlStreamWriter &stream)
     
    - Public Member Functions inherited from Effect
    Effect (Clip *c, const EffectMeta *em)
     
    +EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
     
    +EffectRowrow (int i)
     
    +int row_count ()
     
    +EffectGizmoadd_gizmo (int type)
     
    +EffectGizmogizmo (int i)
     
    +int gizmo_count ()
     
    +bool is_enabled ()
     
    +void set_enabled (bool b)
     
    +virtual void refresh ()
     
    +virtual Effectcopy (Clip *c)
     
    +void copy_field_keyframes (Effect *e)
     
    +virtual void load (QXmlStreamReader &stream)
     
    +void load_from_string (const QByteArray &s)
     
    +QByteArray save_to_string ()
     
    +bool is_open ()
     
    +void open ()
     
    +void close ()
     
    +bool is_glsl_linked ()
     
    +virtual void startEffect ()
     
    +virtual void endEffect ()
     
    +int getIterations ()
     
    +void setIterations (int i)
     
    +virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
     
    +virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
     
    +virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
     
    +virtual GLuint process_superimpose (double timecode)
     
    +virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
     
    +void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
     
    +void gizmo_world_to_screen ()
     
    +bool are_gizmos_enabled ()
     
    + + + + + + + +

    +Private Slots

    +void show_interface (bool show)
     
    +void uncheck_show_button ()
     
    +void change_plugin ()
     
    + + + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    +void loadPlugin ()
     
    +void freePlugin ()
     
    +bool configurePluginCallbacks ()
     
    +void startPlugin ()
     
    +void stopPlugin ()
     
    +void resumePlugin ()
     
    +void suspendPlugin ()
     
    +bool canPluginDo (char *canDoString)
     
    +void processAudio (long numFrames)
     
    + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    +EffectFieldfile_field
     
    +dispatcherFuncPtr dispatcher
     
    +AEffectplugin
     
    +float ** inputs
     
    +float ** outputs
     
    +QDialog * dialog
     
    +QPushButton * show_interface_btn
     
    +QByteArray data_cache
     
    +ModulePtr modulePtr
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Slots inherited from Effect
    +void field_changed ()
     
    - Public Attributes inherited from Effect
    +Clipparent_clip
     
    +const EffectMetameta
     
    +int id
     
    +QString name
     
    +CollapsibleWidgetcontainer
     
    +bool enable_shader
     
    +bool enable_coords
     
    +bool enable_superimpose
     
    +bool enable_image
     
    +const char * ffmpeg_filter
     
    - Protected Attributes inherited from Effect
    +QOpenGLShaderProgram * glslProgram
     
    +QString vertPath
     
    +QString fragPath
     
    +QImage img
     
    +QOpenGLTexture * texture
     
    +bool enable_always_update
     
    +
    The documentation for this class was generated from the following files:
      +
    • effects/internal/vsthost.h
    • +
    • effects/internal/vsthost.cpp
    • +
    +
    + + + + diff --git a/docs/html/class_v_s_t_host.png b/docs/html/class_v_s_t_host.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6d2f5847a8aa7ca7380f6fd2c4f6b9eb2c89c7 GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^wm{s$!3-pmcMHn`DTx4|5ZC|z{{xvX-h3_XKQsZz z0^CQlc~kP61PbKkC8tsvlfou_lpf9ZHu zk$??MnYZS3Ct5Ran!|7U&(&o~bjQ|fWm%V2@0Z)T-GA-Yn>WOTtlruCZQZl3q-S!K z9{chMXVa4UzHgb|y7i7tXY7L2Gmp;|zh(Yu+C8qd$M@N_h}+i3lvkXpPX8X_W&3@# z|NX76rhUKsRrd4mZP#vvt=-b$v7RAs3qwhEN8B{QnvS@Kj5R&~GR~{>URdMFyd~=r z!`fLU4y*s^<@OlfJ+xvK&?yfE$}Nt2hd#DAyS^mp{F~&e?)}dnOq;{`@AD1E&dQ+j z#&;{McSiEh-R>MZ`Qx))o9E4sZ}>TN#j0(umS-mSyc9jqYxhGv3Srs1{q_#Ali4z^ zE@6x^&1?wsm0A#b->18ygq!ijm3sf`&2wY*zq?Od^E{%p?A*&QlfETx?p43Fbj!@c zx)f9^6uQp|A lb;%65zcQm-mW2OjcvEX&r19>|EMN>Vc)I$ztaD0e0stPN@Ol6M literal 0 HcmV?d00001 diff --git a/docs/html/class_viewer-members.html b/docs/html/class_viewer-members.html new file mode 100644 index 000000000..d2f387d8f --- /dev/null +++ b/docs/html/class_viewer-members.html @@ -0,0 +1,167 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Viewer Member List
    +
    +
    + +

    This is the complete list of members for Viewer, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    cached_end_frame (defined in Viewer)Viewerprivate
    clean_created_seq() (defined in Viewer)Viewerprivate
    clear_in() (defined in Viewer)Viewer
    clear_inout_point() (defined in Viewer)Viewer
    clear_out() (defined in Viewer)Viewer
    close_media() (defined in Viewer)Viewerslot
    compose() (defined in Viewer)Viewer
    created_sequence (defined in Viewer)Viewerprivate
    cue_recording(long start, long end, int track) (defined in Viewer)Viewer
    cue_recording_internal (defined in Viewer)Viewerprivate
    current_timecode_slider (defined in Viewer)Viewerprivate
    decrease_speed() (defined in Viewer)Viewerslot
    end_timecode (defined in Viewer)Viewerprivate
    get_playback_speed() (defined in Viewer)Viewer
    get_seq_in() (defined in Viewer)Viewerprivate
    get_seq_out() (defined in Viewer)Viewerprivate
    go_to_end() (defined in Viewer)Viewerslot
    go_to_end_frame (defined in Viewer)Viewerprivate
    go_to_in() (defined in Viewer)Viewerslot
    go_to_out() (defined in Viewer)Viewerslot
    go_to_start() (defined in Viewer)Viewerslot
    go_to_start_button (defined in Viewer)Viewerprivate
    headers (defined in Viewer)Viewer
    horizontal_bar (defined in Viewer)Viewerprivate
    increase_speed() (defined in Viewer)Viewerslot
    is_focused() (defined in Viewer)Viewer
    is_main_sequence() (defined in Viewer)Viewer
    is_recording_cued() (defined in Viewer)Viewer
    just_played (defined in Viewer)Viewer
    last_playhead (defined in Viewer)Viewerprivate
    main_sequence (defined in Viewer)Viewerprivate
    marker_ref (defined in Viewer)Viewer
    media (defined in Viewer)Viewer
    minimum_zoom (defined in Viewer)Viewerprivate
    next_frame() (defined in Viewer)Viewerslot
    next_frame_button (defined in Viewer)Viewerprivate
    panel_name (defined in Viewer)Viewerprivate
    pause() (defined in Viewer)Viewer
    play(bool in_to_out=false) (defined in Viewer)Viewer
    play_button (defined in Viewer)Viewerprivate
    play_wake() (defined in Viewer)Viewerslot
    playback_speed (defined in Viewer)Viewerprivate
    playback_updater (defined in Viewer)Viewer
    playhead_start (defined in Viewer)Viewer
    playIcon (defined in Viewer)Viewerprivate
    playing (defined in Viewer)Viewer
    playing_in_to_out (defined in Viewer)Viewerprivate
    prev_frame_button (defined in Viewer)Viewerprivate
    previous_frame() (defined in Viewer)Viewerslot
    previous_playhead (defined in Viewer)Viewerprivate
    recording_end (defined in Viewer)Viewer
    recording_flasher (defined in Viewer)Viewerprivate
    recording_flasher_update() (defined in Viewer)Viewerprivateslot
    recording_start (defined in Viewer)Viewer
    recording_track (defined in Viewer)Viewer
    reset_all_audio() (defined in Viewer)Viewer
    resize_move(double d) (defined in Viewer)Viewerprivateslot
    resizeEvent(QResizeEvent *event) (defined in Viewer)Viewer
    seek(long p) (defined in Viewer)Viewer
    seq (defined in Viewer)Viewer
    set_in_point() (defined in Viewer)Viewer
    set_main_sequence() (defined in Viewer)Viewer
    set_marker() (defined in Viewer)Viewer
    set_media(Media *m) (defined in Viewer)Viewer
    set_out_point() (defined in Viewer)Viewer
    set_panel_name(const QString &n) (defined in Viewer)Viewer
    set_playback_speed(int s) (defined in Viewer)Viewerprivate
    set_playpause_icon(bool play) (defined in Viewer)Viewer
    set_sb_max() (defined in Viewer)Viewerprivate
    set_sequence(bool main, Sequence *s) (defined in Viewer)Viewerprivate
    set_zoom(bool in) (defined in Viewer)Viewer
    set_zoom_value(double d) (defined in Viewer)Viewerprivate
    setup_ui() (defined in Viewer)Viewerprivate
    start_msecs (defined in Viewer)Viewer
    timer_update() (defined in Viewer)Viewerprivateslot
    toggle_play() (defined in Viewer)Viewerslot
    uncue_recording() (defined in Viewer)Viewer
    update_end_timecode() (defined in Viewer)Viewer
    update_header_zoom() (defined in Viewer)Viewer
    update_parents(bool reload_fx=false) (defined in Viewer)Viewer
    update_playhead() (defined in Viewer)Viewerprivateslot
    update_playhead_timecode(long p) (defined in Viewer)Viewer
    update_viewer() (defined in Viewer)Viewerslot
    update_window_title() (defined in Viewer)Viewerprivate
    Viewer(QWidget *parent=nullptr) (defined in Viewer)Viewerexplicit
    viewer_container (defined in Viewer)Viewerprivate
    viewer_widget (defined in Viewer)Viewer
    ~Viewer() (defined in Viewer)Viewer
    + + + + diff --git a/docs/html/class_viewer.html b/docs/html/class_viewer.html new file mode 100644 index 000000000..66797c023 --- /dev/null +++ b/docs/html/class_viewer.html @@ -0,0 +1,374 @@ + + + + + + + +Olive: Viewer Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for Viewer:
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Slots

    +void play_wake ()
     
    +void go_to_start ()
     
    +void go_to_in ()
     
    +void previous_frame ()
     
    +void toggle_play ()
     
    +void increase_speed ()
     
    +void decrease_speed ()
     
    +void next_frame ()
     
    +void go_to_out ()
     
    +void go_to_end ()
     
    +void close_media ()
     
    +void update_viewer ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    Viewer (QWidget *parent=nullptr)
     
    +bool is_focused ()
     
    +bool is_main_sequence ()
     
    +void set_main_sequence ()
     
    +void set_media (Media *m)
     
    +void compose ()
     
    +void set_playpause_icon (bool play)
     
    +void update_playhead_timecode (long p)
     
    +void update_end_timecode ()
     
    +void update_header_zoom ()
     
    +void clear_in ()
     
    +void clear_out ()
     
    +void clear_inout_point ()
     
    +void set_in_point ()
     
    +void set_out_point ()
     
    +void set_zoom (bool in)
     
    +void set_panel_name (const QString &n)
     
    +void seek (long p)
     
    +void play (bool in_to_out=false)
     
    +void pause ()
     
    +void cue_recording (long start, long end, int track)
     
    +void uncue_recording ()
     
    +bool is_recording_cued ()
     
    +void reset_all_audio ()
     
    +void update_parents (bool reload_fx=false)
     
    +int get_playback_speed ()
     
    +void set_marker ()
     
    +void resizeEvent (QResizeEvent *event)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +bool playing
     
    +long playhead_start
     
    +qint64 start_msecs
     
    +QTimer playback_updater
     
    +bool just_played
     
    +long recording_start
     
    +long recording_end
     
    +int recording_track
     
    +ViewerWidgetviewer_widget
     
    +Mediamedia
     
    +Sequenceseq
     
    +QVector< Marker > * marker_ref
     
    +TimelineHeaderheaders
     
    + + + + + + + + + +

    +Private Slots

    +void update_playhead ()
     
    +void timer_update ()
     
    +void recording_flasher_update ()
     
    +void resize_move (double d)
     
    + + + + + + + + + + + + + + + + + + + +

    +Private Member Functions

    +void update_window_title ()
     
    +void clean_created_seq ()
     
    +void set_sequence (bool main, Sequence *s)
     
    +void set_zoom_value (double d)
     
    +void set_sb_max ()
     
    +void set_playback_speed (int s)
     
    +long get_seq_in ()
     
    +long get_seq_out ()
     
    +void setup_ui ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    +bool main_sequence
     
    +bool created_sequence
     
    +long cached_end_frame
     
    +QString panel_name
     
    +double minimum_zoom
     
    +bool playing_in_to_out
     
    +long last_playhead
     
    +QIcon playIcon
     
    +ResizableScrollBarhorizontal_bar
     
    +ViewerContainerviewer_container
     
    +LabelSlidercurrent_timecode_slider
     
    +QLabel * end_timecode
     
    +QPushButton * go_to_start_button
     
    +QPushButton * prev_frame_button
     
    +QPushButton * play_button
     
    +QPushButton * next_frame_button
     
    +QPushButton * go_to_end_frame
     
    +bool cue_recording_internal
     
    +QTimer recording_flasher
     
    +long previous_playhead
     
    +int playback_speed
     
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/class_viewer.png b/docs/html/class_viewer.png new file mode 100644 index 0000000000000000000000000000000000000000..a31a4188cb81ef7d8bd903daa2c9113aace63df9 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^kw6^4!3-o_Z)t`CDTx4|5ZC|z{{xvX-h3_XKQsZz z0^coyzr^ zbrZk7I6G&%qWhEO#x{Q6wwkvUI!|9&d#-L>x6z)9)$a~Sr`~?|i_JayzT-RlxzX== zUt4uVe_=nNq$I~Q;~Mh;*Ssgk4|BhDi#y<#VgD(-O8JC?t|OmO!%_uy$pb+Xnt2jl zem|+Cr02u{bacIX_Tf)^%)awTKB%4h_SmhUEk8E%=DgPznyr)_%3SKi5S%|zFiVrk zpyXBWofX~ZZ%^#rci(YcqwWs=U0&~c)f-e9oF_kd)hd&7kCEr-UcnRw?|3gU!H*Z@ Y+a4P2*cu#E4-8%gPgg&ebxsLQ0GqhJKmY&$ literal 0 HcmV?d00001 diff --git a/docs/html/class_viewer_container-members.html b/docs/html/class_viewer_container-members.html new file mode 100644 index 000000000..1b9858835 --- /dev/null +++ b/docs/html/class_viewer_container-members.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewerContainer Member List
    +
    +
    + +

    This is the complete list of members for ViewerContainer, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + +
    adjust() (defined in ViewerContainer)ViewerContainer
    adjust_scrollbars() (defined in ViewerContainer)ViewerContainer
    child (defined in ViewerContainer)ViewerContainer
    drag_start_x (defined in ViewerContainer)ViewerContainerprivate
    drag_start_y (defined in ViewerContainer)ViewerContainerprivate
    dragScrollMove(const QPoint &) (defined in ViewerContainer)ViewerContainer
    dragScrollPress(const QPoint &) (defined in ViewerContainer)ViewerContainer
    fit (defined in ViewerContainer)ViewerContainer
    horiz_start (defined in ViewerContainer)ViewerContainerprivate
    horizontal_scrollbar (defined in ViewerContainer)ViewerContainerprivate
    parseWheelEvent(QWheelEvent *event) (defined in ViewerContainer)ViewerContainer
    resizeEvent(QResizeEvent *event) (defined in ViewerContainer)ViewerContainerprotected
    scroll_changed() (defined in ViewerContainer)ViewerContainerprivateslot
    vert_start (defined in ViewerContainer)ViewerContainerprivate
    vertical_scrollbar (defined in ViewerContainer)ViewerContainerprivate
    viewer (defined in ViewerContainer)ViewerContainer
    ViewerContainer(QWidget *parent=0) (defined in ViewerContainer)ViewerContainerexplicit
    zoom (defined in ViewerContainer)ViewerContainer
    ~ViewerContainer() (defined in ViewerContainer)ViewerContainer
    + + + + diff --git a/docs/html/class_viewer_container.html b/docs/html/class_viewer_container.html new file mode 100644 index 000000000..81dcf2424 --- /dev/null +++ b/docs/html/class_viewer_container.html @@ -0,0 +1,163 @@ + + + + + + + +Olive: ViewerContainer Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for ViewerContainer:
    +
    +
    + +
    + + + + + + + + + + + + + + +

    +Public Member Functions

    ViewerContainer (QWidget *parent=0)
     
    +void dragScrollPress (const QPoint &)
     
    +void dragScrollMove (const QPoint &)
     
    +void parseWheelEvent (QWheelEvent *event)
     
    +void adjust ()
     
    +void adjust_scrollbars ()
     
    + + + + + + + + + +

    +Public Attributes

    +bool fit
     
    +double zoom
     
    +Viewerviewer
     
    +ViewerWidgetchild
     
    + + + +

    +Protected Member Functions

    +void resizeEvent (QResizeEvent *event)
     
    + + + +

    +Private Slots

    +void scroll_changed ()
     
    + + + + + + + + + + + + + +

    +Private Attributes

    +int drag_start_x
     
    +int drag_start_y
     
    +int horiz_start
     
    +int vert_start
     
    +QScrollBar * horizontal_scrollbar
     
    +QScrollBar * vertical_scrollbar
     
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/class_viewer_container.png b/docs/html/class_viewer_container.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3e6a789db74f3a2857f78161fadacf583e7e2d GIT binary patch literal 499 zcmeAS@N?(olHy`uVBq!ia0vp^*+3k?!3-od?^Fi>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^CQlc~kP61PbMF?lD)6wGo7cVnf9xxJ z;{uWM4=$XOT$cASg~!{VqIc#^1p`m1LnWR;^8Zh7HN9Y`=5$JRvtj7v(5g+G_sf4>|2*l7T>Kj&V`=6C z&vh7@C0;~LE8Nt$F4WY=?9$h*wHC1qbA7}egTe~DWM4faW>`X literal 0 HcmV?d00001 diff --git a/docs/html/class_viewer_widget-members.html b/docs/html/class_viewer_widget-members.html new file mode 100644 index 000000000..d3ad0b7d7 --- /dev/null +++ b/docs/html/class_viewer_widget-members.html @@ -0,0 +1,127 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewerWidget Member List
    +
    +
    + +

    This is the complete list of members for ViewerWidget, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    close_window() (defined in ViewerWidget)ViewerWidget
    container (defined in ViewerWidget)ViewerWidget
    context_destroy() (defined in ViewerWidget)ViewerWidgetprivateslot
    delete_function() (defined in ViewerWidget)ViewerWidget
    drag_start_x (defined in ViewerWidget)ViewerWidgetprivate
    drag_start_y (defined in ViewerWidget)ViewerWidgetprivate
    dragging (defined in ViewerWidget)ViewerWidgetprivate
    draw_gizmos() (defined in ViewerWidget)ViewerWidgetprivate
    draw_title_safe_area() (defined in ViewerWidget)ViewerWidgetprivate
    draw_waveform_func() (defined in ViewerWidget)ViewerWidgetprivate
    frame_update() (defined in ViewerWidget)ViewerWidget
    fullscreen_menu_action(QAction *action) (defined in ViewerWidget)ViewerWidgetprivateslot
    get_gizmo_from_mouse(int x, int y) (defined in ViewerWidget)ViewerWidgetprivate
    get_renderer() (defined in ViewerWidget)ViewerWidget
    gizmo_x_mvmt (defined in ViewerWidget)ViewerWidgetprivate
    gizmo_y_mvmt (defined in ViewerWidget)ViewerWidgetprivate
    gizmos (defined in ViewerWidget)ViewerWidgetprivate
    initializeGL() (defined in ViewerWidget)ViewerWidget
    mouseMoveEvent(QMouseEvent *event) (defined in ViewerWidget)ViewerWidgetprotected
    mousePressEvent(QMouseEvent *event) (defined in ViewerWidget)ViewerWidgetprotected
    mouseReleaseEvent(QMouseEvent *event) (defined in ViewerWidget)ViewerWidgetprotected
    move_gizmos(QMouseEvent *event, bool done) (defined in ViewerWidget)ViewerWidgetprivate
    paintGL() (defined in ViewerWidget)ViewerWidget
    queue_repaint() (defined in ViewerWidget)ViewerWidgetprivateslot
    renderer (defined in ViewerWidget)ViewerWidgetprivate
    retry() (defined in ViewerWidget)ViewerWidgetprivateslot
    save_frame() (defined in ViewerWidget)ViewerWidgetprivateslot
    seek_from_click(int x) (defined in ViewerWidget)ViewerWidgetprivate
    selected_gizmo (defined in ViewerWidget)ViewerWidgetprivate
    set_custom_zoom() (defined in ViewerWidget)ViewerWidgetprivateslot
    set_fit_zoom() (defined in ViewerWidget)ViewerWidgetprivateslot
    set_fullscreen(int screen=0) (defined in ViewerWidget)ViewerWidgetslot
    set_menu_zoom(QAction *action) (defined in ViewerWidget)ViewerWidgetprivateslot
    set_scroll(double x, double y) (defined in ViewerWidget)ViewerWidget
    set_waveform_scroll(int s) (defined in ViewerWidget)ViewerWidgetslot
    show_context_menu() (defined in ViewerWidget)ViewerWidgetprivateslot
    viewer (defined in ViewerWidget)ViewerWidget
    ViewerWidget(QWidget *parent=nullptr) (defined in ViewerWidget)ViewerWidget
    waveform (defined in ViewerWidget)ViewerWidget
    waveform_clip (defined in ViewerWidget)ViewerWidget
    waveform_ms (defined in ViewerWidget)ViewerWidget
    waveform_scroll (defined in ViewerWidget)ViewerWidget
    waveform_zoom (defined in ViewerWidget)ViewerWidget
    wheelEvent(QWheelEvent *event) (defined in ViewerWidget)ViewerWidgetprotected
    window (defined in ViewerWidget)ViewerWidgetprivate
    x_scroll (defined in ViewerWidget)ViewerWidgetprivate
    y_scroll (defined in ViewerWidget)ViewerWidgetprivate
    ~ViewerWidget() (defined in ViewerWidget)ViewerWidget
    + + + + diff --git a/docs/html/class_viewer_widget.html b/docs/html/class_viewer_widget.html new file mode 100644 index 000000000..2344a4676 --- /dev/null +++ b/docs/html/class_viewer_widget.html @@ -0,0 +1,258 @@ + + + + + + + +Olive: ViewerWidget Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for ViewerWidget:
    +
    +
    + +
    + + + + + + +

    +Public Slots

    +void set_waveform_scroll (int s)
     
    +void set_fullscreen (int screen=0)
     
    + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    ViewerWidget (QWidget *parent=nullptr)
     
    +void delete_function ()
     
    +void close_window ()
     
    +void paintGL ()
     
    +void initializeGL ()
     
    +void frame_update ()
     
    +RenderThreadget_renderer ()
     
    +void set_scroll (double x, double y)
     
    + + + + + + + + + + + + + + + +

    +Public Attributes

    +Viewerviewer
     
    +ViewerContainercontainer
     
    +bool waveform
     
    +Clipwaveform_clip
     
    +const FootageStreamwaveform_ms
     
    +double waveform_zoom
     
    +int waveform_scroll
     
    + + + + + + + + + +

    +Protected Member Functions

    +void mousePressEvent (QMouseEvent *event)
     
    +void mouseMoveEvent (QMouseEvent *event)
     
    +void mouseReleaseEvent (QMouseEvent *event)
     
    +void wheelEvent (QWheelEvent *event)
     
    + + + + + + + + + + + + + + + + + + + +

    +Private Slots

    +void context_destroy ()
     
    +void retry ()
     
    +void show_context_menu ()
     
    +void save_frame ()
     
    +void queue_repaint ()
     
    +void fullscreen_menu_action (QAction *action)
     
    +void set_fit_zoom ()
     
    +void set_custom_zoom ()
     
    +void set_menu_zoom (QAction *action)
     
    + + + + + + + + + + + + + +

    +Private Member Functions

    +void draw_waveform_func ()
     
    +void draw_title_safe_area ()
     
    +void draw_gizmos ()
     
    +EffectGizmoget_gizmo_from_mouse (int x, int y)
     
    +void move_gizmos (QMouseEvent *event, bool done)
     
    +void seek_from_click (int x)
     
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Private Attributes

    +bool dragging
     
    +Effectgizmos
     
    +int drag_start_x
     
    +int drag_start_y
     
    +int gizmo_x_mvmt
     
    +int gizmo_y_mvmt
     
    +EffectGizmoselected_gizmo
     
    +RenderThreadrenderer
     
    +ViewerWindowwindow
     
    +double x_scroll
     
    +double y_scroll
     
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/class_viewer_widget.png b/docs/html/class_viewer_widget.png new file mode 100644 index 0000000000000000000000000000000000000000..a8a5b4ee3dd40c8100e63f502102ad93a3e2a360 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0y~yU}OTa12~w0s4+}@b6UdzRL0J`y;nWQ}T4s9++6&wf{Nmd%MVwEA_Uobo(&%Yl_&-8Rv87x?K9A&hk*V?%sW`*PiO{r-x4Z z@>-!u`IlWUhH8GfFZO?;!*WC-QRT?Em%$)LpFu)ZamF%jgNnUuMgmRdjobzm!V ziK()2k3*b-{si$8+%gAEd@olp9_U@VSp^jSD2U;JzG4L%lkw(2rUvee2R1DZ96m^be&>uFEMhJAAN0t^Y!5dTbfN=P&FVEC}~AEV9t{*GtGuL^+am%-E3 K&t;ucLK6TSQApAN literal 0 HcmV?d00001 diff --git a/docs/html/class_viewer_window-members.html b/docs/html/class_viewer_window-members.html new file mode 100644 index 000000000..54f66d96e --- /dev/null +++ b/docs/html/class_viewer_window-members.html @@ -0,0 +1,92 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ViewerWindow Member List
    +
    +
    + +

    This is the complete list of members for ViewerWindow, including all inherited members.

    + + + + + + + + + + + + + + +
    ar (defined in ViewerWindow)ViewerWindowprivate
    fullscreen_msg_rect (defined in ViewerWindow)ViewerWindowprivate
    fullscreen_msg_timeout() (defined in ViewerWindow)ViewerWindowprivateslot
    fullscreen_msg_timer (defined in ViewerWindow)ViewerWindowprivate
    keyPressEvent(QKeyEvent *) override (defined in ViewerWindow)ViewerWindowprotectedvirtual
    mouseMoveEvent(QMouseEvent *) override (defined in ViewerWindow)ViewerWindowprotectedvirtual
    mousePressEvent(QMouseEvent *) override (defined in ViewerWindow)ViewerWindowprotectedvirtual
    mutex (defined in ViewerWindow)ViewerWindowprivate
    paintGL() override (defined in ViewerWindow)ViewerWindowprotectedvirtual
    set_texture(GLuint t, double iar, QMutex *imutex) (defined in ViewerWindow)ViewerWindow
    show_fullscreen_msg (defined in ViewerWindow)ViewerWindowprivate
    texture (defined in ViewerWindow)ViewerWindowprivate
    ViewerWindow(QWidget *parent) (defined in ViewerWindow)ViewerWindow
    + + + + diff --git a/docs/html/class_viewer_window.html b/docs/html/class_viewer_window.html new file mode 100644 index 000000000..24c61a626 --- /dev/null +++ b/docs/html/class_viewer_window.html @@ -0,0 +1,144 @@ + + + + + + + +Olive: ViewerWindow Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +Inheritance diagram for ViewerWindow:
    +
    +
    + +
    + + + + + + +

    +Public Member Functions

    ViewerWindow (QWidget *parent)
     
    +void set_texture (GLuint t, double iar, QMutex *imutex)
     
    + + + + + + + + + +

    +Protected Member Functions

    +virtual void keyPressEvent (QKeyEvent *) override
     
    +virtual void mousePressEvent (QMouseEvent *) override
     
    +virtual void mouseMoveEvent (QMouseEvent *) override
     
    +virtual void paintGL () override
     
    + + + +

    +Private Slots

    +void fullscreen_msg_timeout ()
     
    + + + + + + + + + + + + + +

    +Private Attributes

    +GLuint texture
     
    +double ar
     
    +QMutex * mutex
     
    +QTimer fullscreen_msg_timer
     
    +bool show_fullscreen_msg
     
    +QRect fullscreen_msg_rect
     
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/docs/html/class_viewer_window.png b/docs/html/class_viewer_window.png new file mode 100644 index 0000000000000000000000000000000000000000..33396c24aa23d4413c2d7a6401964d646a103ac3 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^*+3k?!3-od?^Fi>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^`JOJ0Ar*{o=iZ&vtiaQ{|BlJ~|HoE; z5^hR(yW!GIzRhxi9zQzdc5UzI@DWSeP0MPyzAm*oRa8})Yq;)a`{U?cX{~WlC#&*)+nsoH=RxnT zD&Hs#mbU$`r_6e47AH34`nk*Ik<%(yz4pkw7CL)v-OQzlvu3`piKtzFi9>wN_xsv% zv!Cn^S@tv69T$f4VE2clDM42*ps=D;n|m9_H6>MBx?wiW-EoW?8DtagTe~DWM4fE@AIg literal 0 HcmV?d00001 diff --git a/docs/html/class_void_effect-members.html b/docs/html/class_void_effect-members.html new file mode 100644 index 000000000..0271e35ad --- /dev/null +++ b/docs/html/class_void_effect-members.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    VoidEffect Member List
    +
    +
    + +

    This is the complete list of members for VoidEffect, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    add_gizmo(int type) (defined in Effect)Effect
    add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
    are_gizmos_enabled() (defined in Effect)Effect
    bytes (defined in VoidEffect)VoidEffectprivate
    close() (defined in Effect)Effect
    container (defined in Effect)Effect
    copy(Clip *c) override (defined in VoidEffect)VoidEffectvirtual
    copy_field_keyframes(Effect *e) (defined in Effect)Effect
    custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
    enable_always_update (defined in Effect)Effectprotected
    enable_coords (defined in Effect)Effect
    enable_image (defined in Effect)Effect
    enable_shader (defined in Effect)Effect
    enable_superimpose (defined in Effect)Effect
    endEffect() (defined in Effect)Effectvirtual
    ffmpeg_filter (defined in Effect)Effect
    field_changed() (defined in Effect)Effectslot
    fragPath (defined in Effect)Effectprotected
    getIterations() (defined in Effect)Effect
    gizmo(int i) (defined in Effect)Effect
    gizmo_count() (defined in Effect)Effect
    gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
    gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
    gizmo_world_to_screen() (defined in Effect)Effect
    glslProgram (defined in Effect)Effectprotected
    id (defined in Effect)Effect
    img (defined in Effect)Effectprotected
    is_enabled() (defined in Effect)Effect
    is_glsl_linked() (defined in Effect)Effect
    is_open() (defined in Effect)Effect
    load(QXmlStreamReader &stream) override (defined in VoidEffect)VoidEffectvirtual
    load_from_string(const QByteArray &s) (defined in Effect)Effect
    meta (defined in Effect)Effect
    name (defined in Effect)Effect
    open() (defined in Effect)Effect
    parent_clip (defined in Effect)Effect
    process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in Effect)Effectvirtual
    process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
    process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
    process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
    process_superimpose(double timecode) (defined in Effect)Effectvirtual
    refresh() (defined in Effect)Effectvirtual
    row(int i) (defined in Effect)Effect
    row_count() (defined in Effect)Effect
    save(QXmlStreamWriter &stream) override (defined in VoidEffect)VoidEffectvirtual
    save_to_string() (defined in Effect)Effect
    set_enabled(bool b) (defined in Effect)Effect
    setIterations(int i) (defined in Effect)Effect
    startEffect() (defined in Effect)Effectvirtual
    texture (defined in Effect)Effectprotected
    vertPath (defined in Effect)Effectprotected
    void_meta (defined in VoidEffect)VoidEffectprivate
    VoidEffect(Clip *c, const QString &n) (defined in VoidEffect)VoidEffect
    ~Effect() (defined in Effect)Effect
    + + + + diff --git a/docs/html/class_void_effect.html b/docs/html/class_void_effect.html new file mode 100644 index 000000000..89ce00536 --- /dev/null +++ b/docs/html/class_void_effect.html @@ -0,0 +1,269 @@ + + + + + + + +Olive: VoidEffect Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    VoidEffect Class Reference
    +
    +
    +
    +Inheritance diagram for VoidEffect:
    +
    +
    + + +Effect + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    VoidEffect (Clip *c, const QString &n)
     
    +virtual Effectcopy (Clip *c) override
     
    +virtual void load (QXmlStreamReader &stream) override
     
    +virtual void save (QXmlStreamWriter &stream) override
     
    - Public Member Functions inherited from Effect
    Effect (Clip *c, const EffectMeta *em)
     
    +EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
     
    +EffectRowrow (int i)
     
    +int row_count ()
     
    +EffectGizmoadd_gizmo (int type)
     
    +EffectGizmogizmo (int i)
     
    +int gizmo_count ()
     
    +bool is_enabled ()
     
    +void set_enabled (bool b)
     
    +virtual void refresh ()
     
    +void copy_field_keyframes (Effect *e)
     
    +virtual void custom_load (QXmlStreamReader &stream)
     
    +void load_from_string (const QByteArray &s)
     
    +QByteArray save_to_string ()
     
    +bool is_open ()
     
    +void open ()
     
    +void close ()
     
    +bool is_glsl_linked ()
     
    +virtual void startEffect ()
     
    +virtual void endEffect ()
     
    +int getIterations ()
     
    +void setIterations (int i)
     
    +virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
     
    +virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
     
    +virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
     
    +virtual GLuint process_superimpose (double timecode)
     
    +virtual void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
     
    +virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
     
    +void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
     
    +void gizmo_world_to_screen ()
     
    +bool are_gizmos_enabled ()
     
    + + + + + +

    +Private Attributes

    +QByteArray bytes
     
    +EffectMeta void_meta
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Slots inherited from Effect
    +void field_changed ()
     
    - Public Attributes inherited from Effect
    +Clipparent_clip
     
    +const EffectMetameta
     
    +int id
     
    +QString name
     
    +CollapsibleWidgetcontainer
     
    +bool enable_shader
     
    +bool enable_coords
     
    +bool enable_superimpose
     
    +bool enable_image
     
    +const char * ffmpeg_filter
     
    - Protected Attributes inherited from Effect
    +QOpenGLShaderProgram * glslProgram
     
    +QString vertPath
     
    +QString fragPath
     
    +QImage img
     
    +QOpenGLTexture * texture
     
    +bool enable_always_update
     
    +
    The documentation for this class was generated from the following files:
      +
    • effects/internal/voideffect.h
    • +
    • effects/internal/voideffect.cpp
    • +
    +
    + + + + diff --git a/docs/html/class_void_effect.png b/docs/html/class_void_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..f5aa7f054598b7d91c8b897d89e21f92a245d5be GIT binary patch literal 542 zcmV+(0^$9MP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d00054Nkl-V%)KHaG65vU7>99Bj4|3=JZtXj z(S8|YtXeg3_LMuHUsk|9Pucr8N^vD}glqSV`?hDh%5!!1UOWxYjpr)&Ts&LqZ+g~* z*zp(zyi>1#jo%Q8na z$@9=m5zX>^UA^1`(7`H+7m(u6CkLn4&xqGRhza)(kBfzRJFA8 zb;on)uXnxeS!3GcN>i!JV^ux0d+}rrovK!?pPz+-na z$>i3Erz|+`()S$m)9|#OYad=c=Z%VX%yTa2`TUfUjpU~)OjWN_eyV!y2g-k^0507*qoM6N<$f~bK1ApigX literal 0 HcmV?d00001 diff --git a/docs/html/class_volume_effect-members.html b/docs/html/class_volume_effect-members.html new file mode 100644 index 000000000..47cce3210 --- /dev/null +++ b/docs/html/class_volume_effect-members.html @@ -0,0 +1,133 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    VolumeEffect Member List
    +
    +
    + +

    This is the complete list of members for VolumeEffect, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    add_gizmo(int type) (defined in Effect)Effect
    add_row(const QString &name, bool savable=true, bool keyframable=true) (defined in Effect)Effect
    are_gizmos_enabled() (defined in Effect)Effect
    close() (defined in Effect)Effect
    container (defined in Effect)Effect
    copy(Clip *c) (defined in Effect)Effectvirtual
    copy_field_keyframes(Effect *e) (defined in Effect)Effect
    custom_load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    Effect(Clip *c, const EffectMeta *em) (defined in Effect)Effect
    enable_always_update (defined in Effect)Effectprotected
    enable_coords (defined in Effect)Effect
    enable_image (defined in Effect)Effect
    enable_shader (defined in Effect)Effect
    enable_superimpose (defined in Effect)Effect
    endEffect() (defined in Effect)Effectvirtual
    ffmpeg_filter (defined in Effect)Effect
    field_changed() (defined in Effect)Effectslot
    fragPath (defined in Effect)Effectprotected
    getIterations() (defined in Effect)Effect
    gizmo(int i) (defined in Effect)Effect
    gizmo_count() (defined in Effect)Effect
    gizmo_draw(double timecode, GLTextureCoords &coords) (defined in Effect)Effectvirtual
    gizmo_move(EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done) (defined in Effect)Effect
    gizmo_world_to_screen() (defined in Effect)Effect
    glslProgram (defined in Effect)Effectprotected
    id (defined in Effect)Effect
    img (defined in Effect)Effectprotected
    is_enabled() (defined in Effect)Effect
    is_glsl_linked() (defined in Effect)Effect
    is_open() (defined in Effect)Effect
    load(QXmlStreamReader &stream) (defined in Effect)Effectvirtual
    load_from_string(const QByteArray &s) (defined in Effect)Effect
    meta (defined in Effect)Effect
    name (defined in Effect)Effect
    open() (defined in Effect)Effect
    parent_clip (defined in Effect)Effect
    process_audio(double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count) (defined in VolumeEffect)VolumeEffectvirtual
    process_coords(double timecode, GLTextureCoords &coords, int data) (defined in Effect)Effectvirtual
    process_image(double timecode, uint8_t *input, uint8_t *output, int size) (defined in Effect)Effectvirtual
    process_shader(double timecode, GLTextureCoords &, int iteration) (defined in Effect)Effectvirtual
    process_superimpose(double timecode) (defined in Effect)Effectvirtual
    refresh() (defined in Effect)Effectvirtual
    row(int i) (defined in Effect)Effect
    row_count() (defined in Effect)Effect
    save(QXmlStreamWriter &stream) (defined in Effect)Effectvirtual
    save_to_string() (defined in Effect)Effect
    set_enabled(bool b) (defined in Effect)Effect
    setIterations(int i) (defined in Effect)Effect
    startEffect() (defined in Effect)Effectvirtual
    texture (defined in Effect)Effectprotected
    vertPath (defined in Effect)Effectprotected
    volume_val (defined in VolumeEffect)VolumeEffect
    VolumeEffect(Clip *c, const EffectMeta *em) (defined in VolumeEffect)VolumeEffect
    ~Effect() (defined in Effect)Effect
    + + + + diff --git a/docs/html/class_volume_effect.html b/docs/html/class_volume_effect.html new file mode 100644 index 000000000..55b8b2017 --- /dev/null +++ b/docs/html/class_volume_effect.html @@ -0,0 +1,266 @@ + + + + + + + +Olive: VolumeEffect Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    VolumeEffect Class Reference
    +
    +
    +
    +Inheritance diagram for VolumeEffect:
    +
    +
    + + +Effect + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    VolumeEffect (Clip *c, const EffectMeta *em)
     
    +void process_audio (double timecode_start, double timecode_end, quint8 *samples, int nb_bytes, int channel_count)
     
    - Public Member Functions inherited from Effect
    Effect (Clip *c, const EffectMeta *em)
     
    +EffectRowadd_row (const QString &name, bool savable=true, bool keyframable=true)
     
    +EffectRowrow (int i)
     
    +int row_count ()
     
    +EffectGizmoadd_gizmo (int type)
     
    +EffectGizmogizmo (int i)
     
    +int gizmo_count ()
     
    +bool is_enabled ()
     
    +void set_enabled (bool b)
     
    +virtual void refresh ()
     
    +virtual Effectcopy (Clip *c)
     
    +void copy_field_keyframes (Effect *e)
     
    +virtual void load (QXmlStreamReader &stream)
     
    +virtual void custom_load (QXmlStreamReader &stream)
     
    +virtual void save (QXmlStreamWriter &stream)
     
    +void load_from_string (const QByteArray &s)
     
    +QByteArray save_to_string ()
     
    +bool is_open ()
     
    +void open ()
     
    +void close ()
     
    +bool is_glsl_linked ()
     
    +virtual void startEffect ()
     
    +virtual void endEffect ()
     
    +int getIterations ()
     
    +void setIterations (int i)
     
    +virtual void process_image (double timecode, uint8_t *input, uint8_t *output, int size)
     
    +virtual void process_shader (double timecode, GLTextureCoords &, int iteration)
     
    +virtual void process_coords (double timecode, GLTextureCoords &coords, int data)
     
    +virtual GLuint process_superimpose (double timecode)
     
    +virtual void gizmo_draw (double timecode, GLTextureCoords &coords)
     
    +void gizmo_move (EffectGizmo *sender, int x_movement, int y_movement, double timecode, bool done)
     
    +void gizmo_world_to_screen ()
     
    +bool are_gizmos_enabled ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +EffectFieldvolume_val
     
    - Public Attributes inherited from Effect
    +Clipparent_clip
     
    +const EffectMetameta
     
    +int id
     
    +QString name
     
    +CollapsibleWidgetcontainer
     
    +bool enable_shader
     
    +bool enable_coords
     
    +bool enable_superimpose
     
    +bool enable_image
     
    +const char * ffmpeg_filter
     
    + + + + + + + + + + + + + + + + + +

    +Additional Inherited Members

    - Public Slots inherited from Effect
    +void field_changed ()
     
    - Protected Attributes inherited from Effect
    +QOpenGLShaderProgram * glslProgram
     
    +QString vertPath
     
    +QString fragPath
     
    +QImage img
     
    +QOpenGLTexture * texture
     
    +bool enable_always_update
     
    +
    The documentation for this class was generated from the following files:
      +
    • effects/internal/volumeeffect.h
    • +
    • effects/internal/volumeeffect.cpp
    • +
    +
    + + + + diff --git a/docs/html/class_volume_effect.png b/docs/html/class_volume_effect.png new file mode 100644 index 0000000000000000000000000000000000000000..7f16344590411aea9acf5d530f0782ba9b4e52f4 GIT binary patch literal 546 zcmV+-0^R+IP)vTJkN^MxkN^Mxkifve1&Q1r00008bW%=J0RR90|NsC0)yh;d00058Nklx`zG#MQ|pzf zh#2bvj<`yC{v2IwgsZXD-WK}ys5E3)Nkv*zS7e>b4xrb7k9NpOi_7Tc2jX!&PYU*7wah zM=w-Q&v2V__WX9Zy*w267q0S5AZGarw_mqcVAH?a5> + + + + + + +Olive: Class Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Index
    +
    +
    +
    _ | a | c | d | e | f | g | k | l | m | n | o | p | q | r | s | t | u | v
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      _  
    +
    Crc32   GLTextureCoords   PlayButton   SetTimelineInOutCommand   
    CrossDissolveTransition   GraphEditor   PreferencesDialog   ShakeEffect   
    _AEffect   CubeTransition   GraphView   PreviewGenerator   SolidEffect   
    _VstEvent   
      d  
    +
      k  
    +
    Project   SourceIconView   
    _VstEvents   ProjectFilter   SourcesCommon   
    _VstMidiEvent   DebugDialog   KeyframeDelete   ProjectModel   SourceTable   
    _VstParameterProperties   DeleteClipAction   KeyframeFieldSet   ProxyDialog   SpeedDialog   
    _VstTimeInfo   DeleteMarkerAction   KeyframeNavigator   ProxyGenerator   StabilizerDialog   
      a  
    +
    DeleteMediaCommand   KeyframeView   ProxyInfo   
      t  
    +
    DeleteTransitionCommand   KeySequenceEditor   
      q  
    +
    AboutDialog   DemoNotice   
      l  
    +
    TextEditDialog   
    ActionSearch   
      e  
    +
    QPainterWrapper   TextEditEx   
    ActionSearchEntry   LabelSlider   
      r  
    +
    TextEffect   
    ActionSearchList   EditSequenceCommand   LinearFadeTransition   TimecodeEffect   
    AddClipCommand   Effect   LinkCommand   RefreshClips   Timeline   
    AddEffectCommand   EffectControls   LoadDialog   ReloadEffectsCommand   TimelineHeader   
    AddMarkerAction   EffectDeleteCommand   LoadThread   RemoveClipsFromClipboard   TimelineWidget   
    AddMediaCommand   EffectField   LogarithmicFadeTransition   RenameClipCommand   ToneEffect   
    AddTransitionCommand   EffectFieldUndo   
      m  
    +
    RenderThread   TransformEffect   
    AdvancedVideoDialog   EffectGizmo   ReplaceClipMediaCommand   Transition   
    AudioMonitor   EffectInit   MainWindow   ReplaceClipMediaDialog   TransitionData   
    AudioNoiseEffect   EffectKeyframe   Marker   ReplaceMediaCommand   
      u  
    +
    AudioSenderThread   EffectMeta   Media   ResizableScrollBar   
      c  
    +
    EffectRow   MediaMove   RippleAction   UpdateFootageTooltip   
    EffectsArea   MediaPropertiesDialog   RuntimeConfig   UpdateViewer   
    Cacher   EmbeddedFileChooser   MediaRename   
      s  
    +
      v  
    +
    ChangeSequenceAction   ExponentialFadeTransition   MediaThrobber   
    CheckboxCommand   ExportDialog   MenuHelper   ScrollArea   VideoCodecParams   
    CheckboxEx   ExportParams   ModifyTransitionCommand   Selection   Viewer   
    ClickableLabel   ExportThread   MoveClipAction   Sequence   ViewerContainer   
    Clip   
      f  
    +
    MoveEffectCommand   SetAutoscaleAction   ViewerWidget   
    CloseAllClipsCommand   MoveMarkerAction   SetBool   ViewerWindow   
    CollapsibleWidget   FillLeftRightEffect   
      n  
    +
    SetDouble   VoidEffect   
    CollapsibleWidgetHeader   FlowLayout   SetEffectData   VolumeEffect   
    ColorButton   FocusFilter   NewSequenceCommand   SetInt   VSTHost   
    ColorCommand   FontCombobox   NewSequenceDialog   SetKeyframing   VSTRect   
    ComboAction   Footage   
      o  
    +
    SetLong   
    ComboBoxEx   FootageStream   SetPointer   
    ComboBoxExCommand   Frei0rEffect   OliveAction   SetQVariant   
    ComposeSequenceParams   
      g  
    +
    OliveGlobal   SetSelectionsCommand   
    Config   OTreeView   SetSpeedAction   
    CornerPinEffect   Ghost   
      p  
    +
    SetString   
    PanEffect   
    +
    _ | a | c | d | e | f | g | k | l | m | n | o | p | q | r | s | t | u | v
    +
    + + + + diff --git a/docs/html/clickablelabel_8h_source.html b/docs/html/clickablelabel_8h_source.html new file mode 100644 index 000000000..532154f17 --- /dev/null +++ b/docs/html/clickablelabel_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/clickablelabel.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    clickablelabel.h
    +
    +
    +
    1 #ifndef CLICKABLELABEL_H
    2 #define CLICKABLELABEL_H
    3 
    4 #include <QLabel>
    5 
    6 class ClickableLabel : public QLabel {
    7  Q_OBJECT
    8 public:
    9  ClickableLabel(QWidget * parent = 0, Qt::WindowFlags f = 0);
    10  ClickableLabel(const QString & text, QWidget * parent = 0, Qt::WindowFlags f = 0);
    11  void mousePressEvent(QMouseEvent *ev);
    12 signals:
    13  void clicked();
    14 };
    15 
    16 #endif // CLICKABLELABEL_H
    Definition: clickablelabel.h:6
    +
    + + + + diff --git a/docs/html/clip_8h_source.html b/docs/html/clip_8h_source.html new file mode 100644 index 000000000..d38cd13d3 --- /dev/null +++ b/docs/html/clip_8h_source.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: project/clip.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    clip.h
    +
    +
    +
    1 #ifndef CLIP_H
    2 #define CLIP_H
    3 
    4 #include <QWaitCondition>
    5 #include <QMutex>
    6 #include <QVector>
    7 
    8 #include "marker.h"
    9 
    10 class Cacher;
    11 class Effect;
    12 class Transition;
    13 class QOpenGLFramebufferObject;
    14 class ComboAction;
    15 class Media;
    16 struct Sequence;
    17 struct Footage;
    18 struct FootageStream;
    19 
    20 struct AVFormatContext;
    21 struct AVStream;
    22 struct AVCodec;
    23 struct AVCodecContext;
    24 struct AVFrame;
    25 struct AVPacket;
    26 struct SwsContext;
    27 struct SwrContext;
    28 struct AVFilterGraph;
    29 struct AVFilterContext;
    30 struct AVDictionary;
    31 class QOpenGLTexture;
    32 
    33 class Clip {
    34 public:
    35  Clip(Sequence* s);
    36  ~Clip();
    37  Clip* copy(Sequence* s, bool duplicate_transitions = true);
    38  void reset_audio();
    39  void reset();
    40  void refresh();
    41  long get_clip_in_with_transition();
    42  long get_timeline_in_with_transition();
    43  long get_timeline_out_with_transition();
    44  long getLength();
    45  double getMediaFrameRate();
    46  long getMaximumLength();
    47  void recalculateMaxLength();
    48  int getWidth();
    49  int getHeight();
    50  void refactor_frame_rate(ComboAction* ca, double multiplier, bool change_timeline_points);
    51  Sequence* sequence;
    52 
    53  // queue functions
    54  void queue_clear();
    55  void queue_remove_earliest();
    56 
    57  // timeline variables (should be copied in copy())
    58  bool enabled;
    59  long clip_in;
    60  long timeline_in;
    61  long timeline_out;
    62  int track;
    63  QString name;
    64  quint8 color_r;
    65  quint8 color_g;
    66  quint8 color_b;
    67  Media* media;
    68  int media_stream;
    69  double speed;
    70  double cached_fr;
    71  bool reverse;
    72  bool maintain_audio_pitch;
    73  bool autoscale;
    74 
    75  // markers
    76  QVector<Marker>& get_markers();
    77 
    78  // other variables (should be deep copied/duplicated in copy())
    79  QList<Effect*> effects;
    80  QVector<int> linked;
    81  int opening_transition;
    82  Transition* get_opening_transition();
    83  int closing_transition;
    84  Transition* get_closing_transition();
    85 
    86  // media handling
    87  AVFormatContext* formatCtx;
    88  AVStream* stream;
    89  AVCodec* codec;
    90  AVCodecContext* codecCtx;
    91  AVPacket* pkt;
    92  AVFrame* frame;
    93  AVDictionary* opts;
    94  long calculated_length;
    95 
    96  // temporary variables
    97  int load_id;
    98  bool undeletable;
    99  bool reached_end;
    100  bool pkt_written;
    101  bool open;
    102  bool finished_opening;
    103  bool replaced;
    104  bool ignore_reverse;
    105  int pix_fmt;
    106 
    107  // caching functions
    108  bool use_existing_frame;
    109  bool multithreaded;
    110  Cacher* cacher;
    111  QWaitCondition can_cache;
    112  int max_queue_size;
    113  QVector<AVFrame*> queue;
    114  QMutex queue_lock;
    115  QMutex lock;
    116  QMutex open_lock;
    117  int64_t last_invalid_ts;
    118 
    119  // converters/filters
    120  AVFilterGraph* filter_graph;
    121  AVFilterContext* buffersink_ctx;
    122  AVFilterContext* buffersrc_ctx;
    123 
    124  // video playback variables
    125  QOpenGLFramebufferObject** fbo;
    126  QOpenGLTexture* texture;
    127  long texture_frame;
    128 
    129  // audio playback variables
    130  int64_t reverse_target;
    131  int frame_sample_index;
    132  qint64 audio_buffer_write;
    133  bool audio_reset;
    134  bool audio_just_reset;
    135  long audio_target_frame;
    136 private:
    137  QVector<Marker> markers;
    138 };
    139 
    140 #endif // CLIP_H
    Definition: sequence.h:13
    +
    Definition: undo.h:32
    +
    Definition: effect.h:146
    +
    Definition: cacher.h:9
    +
    Definition: media.h:20
    +
    Definition: footage.h:25
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/clipboard_8h_source.html b/docs/html/clipboard_8h_source.html new file mode 100644 index 000000000..204f454b7 --- /dev/null +++ b/docs/html/clipboard_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: io/clipboard.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    clipboard.h
    +
    +
    +
    1 #ifndef CLIPBOARD_H
    2 #define CLIPBOARD_H
    3 
    4 #include <QVector>
    5 
    6 class Transition;
    7 
    8 #define CLIPBOARD_TYPE_CLIP 0
    9 #define CLIPBOARD_TYPE_EFFECT 1
    10 
    11 extern int clipboard_type;
    12 extern QVector<Transition*> clipboard_transitions;
    13 extern QVector<void*> clipboard;
    14 void clear_clipboard();
    15 
    16 #endif // CLIPBOARD_H
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/closed.png b/docs/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/docs/html/collapsiblewidget_8h_source.html b/docs/html/collapsiblewidget_8h_source.html new file mode 100644 index 000000000..287a14711 --- /dev/null +++ b/docs/html/collapsiblewidget_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: ui/collapsiblewidget.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    collapsiblewidget.h
    +
    +
    +
    1 #ifndef COLLAPSIBLEWIDGET_H
    2 #define COLLAPSIBLEWIDGET_H
    3 
    4 #include <QWidget>
    5 class QLabel;
    6 class QCheckBox;
    7 class QHBoxLayout;
    8 class QVBoxLayout;
    9 class QPushButton;
    10 class QFrame;
    11 class CheckboxEx;
    12 
    13 class CollapsibleWidgetHeader : public QWidget {
    14  Q_OBJECT
    15 public:
    16  CollapsibleWidgetHeader(QWidget* parent = 0);
    17  bool selected;
    18 protected:
    19  void mousePressEvent(QMouseEvent* event);
    20  void paintEvent(QPaintEvent *event);
    21 signals:
    22  void select(bool, bool);
    23 };
    24 
    25 class CollapsibleWidget : public QWidget
    26 {
    27  Q_OBJECT
    28 public:
    29  CollapsibleWidget(QWidget* parent = 0);
    30  void setContents(QWidget* c);
    31  void setText(const QString &);
    32  bool is_focused();
    33  bool is_expanded();
    34 
    35  CheckboxEx* enabled_check;
    36  bool selected;
    37  QWidget* contents;
    38  CollapsibleWidgetHeader* title_bar;
    39 private:
    40  QLabel* header;
    41  QVBoxLayout* layout;
    42  QPushButton* collapse_button;
    43  QFrame* line;
    44  QHBoxLayout* title_bar_layout;
    45  void set_button_icon(bool open);
    46 
    47 signals:
    48  void deselect_others(QWidget*);
    49  void visibleChanged();
    50 
    51 private slots:
    52  void on_enabled_change(bool b);
    53  void on_visible_change();
    54 
    55 public slots:
    56  void header_click(bool s, bool deselect);
    57 };
    58 
    59 #endif // COLLAPSIBLEWIDGET_H
    Definition: collapsiblewidget.h:25
    +
    Definition: checkboxex.h:6
    +
    Definition: collapsiblewidget.h:13
    +
    + + + + diff --git a/docs/html/colorbutton_8h_source.html b/docs/html/colorbutton_8h_source.html new file mode 100644 index 000000000..57a583e29 --- /dev/null +++ b/docs/html/colorbutton_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: ui/colorbutton.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    colorbutton.h
    +
    +
    +
    1 #ifndef COLORBUTTON_H
    2 #define COLORBUTTON_H
    3 
    4 #include <QPushButton>
    5 #include <QColor>
    6 #include <QUndoCommand>
    7 
    8 class ColorButton : public QPushButton {
    9  Q_OBJECT
    10 public:
    11  ColorButton(QWidget* parent = 0);
    12  QColor get_color();
    13  void set_color(QColor c);
    14  const QColor& getPreviousValue();
    15 private:
    16  QColor color;
    17  QColor previousColor;
    18  void set_button_color();
    19 signals:
    20  void color_changed();
    21 private slots:
    22  void open_dialog();
    23 };
    24 
    25 class ColorCommand : public QUndoCommand {
    26 public:
    27  ColorCommand(ColorButton* s, QColor o, QColor n);
    28  void undo();
    29  void redo();
    30 private:
    31  ColorButton* sender;
    32  QColor old_color;
    33  QColor new_color;
    34 };
    35 
    36 #endif // COLORBUTTON_H
    Definition: colorbutton.h:25
    +
    Definition: colorbutton.h:8
    +
    + + + + diff --git a/docs/html/comboboxex_8h_source.html b/docs/html/comboboxex_8h_source.html new file mode 100644 index 000000000..f241421de --- /dev/null +++ b/docs/html/comboboxex_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/comboboxex.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    comboboxex.h
    +
    +
    +
    1 #ifndef COMBOBOXEX_H
    2 #define COMBOBOXEX_H
    3 
    4 #include <QComboBox>
    5 #include <QDebug>
    6 
    7 class ComboBoxEx : public QComboBox {
    8  Q_OBJECT
    9 public:
    10  ComboBoxEx(QWidget* parent = 0);
    11  void setCurrentIndexEx(int i);
    12  void setCurrentTextEx(const QString &text);
    13  int getPreviousIndex();
    14 private slots:
    15  void index_changed(int);
    16 private:
    17  int index;
    18  int previousIndex;
    19  void wheelEvent(QWheelEvent* e);
    20 };
    21 
    22 #endif // COMBOBOXEX_H
    Definition: comboboxex.h:7
    +
    + + + + diff --git a/docs/html/config_8h_source.html b/docs/html/config_8h_source.html new file mode 100644 index 000000000..205a4f81c --- /dev/null +++ b/docs/html/config_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: io/config.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    config.h
    +
    +
    +
    1 #ifndef CONFIG_H
    2 #define CONFIG_H
    3 
    4 #include <QString>
    5 
    6 #define SAVE_VERSION 190201 // YYMMDD
    7 #define MIN_SAVE_VERSION 190104 // lowest compatible project version
    8 
    9 #define TIMECODE_DROP 0
    10 #define TIMECODE_NONDROP 1
    11 #define TIMECODE_FRAMES 2
    12 #define TIMECODE_MILLISECONDS 3
    13 
    14 #define RECORD_MODE_MONO 1
    15 #define RECORD_MODE_STEREO 2
    16 
    17 #define AUTOSCROLL_NO_SCROLL 0
    18 #define AUTOSCROLL_PAGE_SCROLL 1
    19 #define AUTOSCROLL_SMOOTH_SCROLL 2
    20 
    21 #define PROJECT_VIEW_TREE 0
    22 #define PROJECT_VIEW_ICON 1
    23 
    24 #define FRAME_QUEUE_TYPE_FRAMES 0
    25 #define FRAME_QUEUE_TYPE_SECONDS 1
    26 
    27 struct Config {
    28  Config();
    29 
    30  bool saved_layout;
    31  bool show_track_lines;
    32  bool scroll_zooms;
    33  bool edit_tool_selects_links;
    34  bool edit_tool_also_seeks;
    35  bool select_also_seeks;
    36  bool paste_seeks;
    37  QString img_seq_formats;
    38  bool rectified_waveforms;
    39  int default_transition_length;
    40  int timecode_view;
    41  bool show_title_safe_area;
    42  bool use_custom_title_safe_ratio;
    43  double custom_title_safe_ratio;
    44  bool enable_drag_files_to_timeline;
    45  bool autoscale_by_default;
    46  int recording_mode;
    47  bool enable_seek_to_import;
    48  bool enable_audio_scrubbing;
    49  bool drop_on_media_to_replace;
    50  int autoscroll;
    51  int audio_rate;
    52  bool fast_seeking;
    53  bool hover_focus;
    54  int project_view_type;
    55  bool set_name_with_marker;
    56  bool show_project_toolbar;
    57  double previous_queue_size;
    58  int previous_queue_type;
    59  double upcoming_queue_size;
    60  int upcoming_queue_type;
    61  bool loop;
    62  bool seek_also_selects;
    63  QString css_path;
    64  int effect_textbox_lines;
    65  bool use_software_fallback;
    66  bool center_timeline_timecodes;
    67  QString preferred_audio_output;
    68  QString preferred_audio_input;
    69  QString language_file;
    70  int waveform_resolution;
    71  int thumbnail_resolution;
    72 
    73  void load(QString path);
    74  void save(QString path);
    75 };
    76 
    77 struct RuntimeConfig {
    78  RuntimeConfig();
    79 
    80  bool shaders_are_enabled;
    81  bool disable_blending;
    82  QString external_translation_file;
    83 };
    84 
    85 extern Config config;
    86 extern RuntimeConfig runtime_config;
    87 
    88 #endif // CONFIG_H
    Definition: config.h:77
    +
    Definition: config.h:27
    +
    + + + + diff --git a/docs/html/cornerpineffect_8h_source.html b/docs/html/cornerpineffect_8h_source.html new file mode 100644 index 000000000..5d39336e6 --- /dev/null +++ b/docs/html/cornerpineffect_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: effects/internal/cornerpineffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cornerpineffect.h
    +
    +
    +
    1 #ifndef CORNERPINEFFECT_H
    2 #define CORNERPINEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class CornerPinEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  CornerPinEffect(Clip* c, const EffectMeta* em);
    10  void process_coords(double timecode, GLTextureCoords& coords, int data);
    11  void process_shader(double timecode, GLTextureCoords& coords, int iterations);
    12  void gizmo_draw(double timecode, GLTextureCoords& coords);
    13 private:
    14  EffectField* top_left_x;
    15  EffectField* top_left_y;
    16  EffectField* top_right_x;
    17  EffectField* top_right_y;
    18  EffectField* bottom_left_x;
    19  EffectField* bottom_left_y;
    20  EffectField* bottom_right_x;
    21  EffectField* bottom_right_y;
    22  EffectField* perspective;
    23 
    24  EffectGizmo* top_left_gizmo;
    25  EffectGizmo* top_right_gizmo;
    26  EffectGizmo* bottom_left_gizmo;
    27  EffectGizmo* bottom_right_gizmo;
    28 };
    29 
    30 #endif // CORNERPINEFFECT_H
    Definition: effect.h:105
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: effectgizmo.h:21
    +
    Definition: cornerpineffect.h:6
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/crc32_8h_source.html b/docs/html/crc32_8h_source.html new file mode 100644 index 000000000..78f4f92ad --- /dev/null +++ b/docs/html/crc32_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: io/crc32.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    crc32.h
    +
    +
    +
    1 #ifndef CRC32_H
    2 #define CRC32_H
    3 
    4 /*
    5  * +-------------------------------------------------------------+
    6  * | Taken from github.com/nusov/qt-crc32 used under MIT license |
    7  * | |
    8  * | Copyright (c) Alexander Nusov 2015 |
    9  * +-------------------------------------------------------------+
    10  */
    11 
    12 #include <QtCore>
    13 #include <QString>
    14 #include <QMap>
    15 
    16 class Crc32
    17 {
    18 private:
    19  quint32 crc_table[256];
    20  QMap<int, quint32> instances;
    21 
    22 public:
    23  Crc32();
    24 
    25  quint32 calculateFromFile(QString filename);
    26 
    27  void initInstance(int i);
    28  void pushData(int i, char *data, int len);
    29  quint32 releaseInstance(int i);
    30 };
    31 
    32 #endif // CRC32_H
    Definition: crc32.h:16
    +
    + + + + diff --git a/docs/html/crossdissolvetransition_8h_source.html b/docs/html/crossdissolvetransition_8h_source.html new file mode 100644 index 000000000..9b07114d3 --- /dev/null +++ b/docs/html/crossdissolvetransition_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/crossdissolvetransition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    crossdissolvetransition.h
    +
    +
    +
    1 #ifndef CROSSDISSOLVETRANSITION_H
    2 #define CROSSDISSOLVETRANSITION_H
    3 
    4 #include "project/transition.h"
    5 
    7 public:
    8  CrossDissolveTransition(Clip* c, Clip* s, const EffectMeta* em);
    9  void process_coords(double timecode, GLTextureCoords &, int data);
    10 };
    11 
    12 #endif // CROSSDISSOLVETRANSITION_H
    Definition: effect.h:105
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: crossdissolvetransition.h:6
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/crossplatformlib_8h_source.html b/docs/html/crossplatformlib_8h_source.html new file mode 100644 index 000000000..b3334bf13 --- /dev/null +++ b/docs/html/crossplatformlib_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: io/crossplatformlib.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    crossplatformlib.h
    +
    +
    +
    1 #ifndef CROSSPLATFORMLIB_H
    2 #define CROSSPLATFORMLIB_H
    3 
    4 #include <QString>
    5 
    6 #ifdef _WIN32
    7  #include <Windows.h>
    8  #define LibAddress GetProcAddress
    9  #define LibClose FreeModule
    10  #define ModulePtr HMODULE
    11 #elif defined(__linux__) || defined(__APPLE__)
    12  #include <dlfcn.h>
    13  #define LibAddress dlsym
    14  #define LibClose dlclose
    15  #define ModulePtr void*
    16 #endif
    17 
    18 ModulePtr LibLoad(const QString& filename);
    19 QStringList LibFilter();
    20 
    21 #ifdef __APPLE__
    22 #include <CoreFoundation/CoreFoundation.h>
    23 class NSWindow;
    24 
    25 CFBundleRef BundleLoad(const QString& filename);
    26 void BundleClose(CFBundleRef bundle);
    27 #endif
    28 
    29 #endif // CROSSPLATFORMLIB_H
    + + + + diff --git a/docs/html/cubetransition_8h_source.html b/docs/html/cubetransition_8h_source.html new file mode 100644 index 000000000..93e6d1412 --- /dev/null +++ b/docs/html/cubetransition_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/cubetransition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cubetransition.h
    +
    +
    +
    1 #ifndef CUBETRANSITION_H
    2 #define CUBETRANSITION_H
    3 
    4 #include "project/transition.h"
    5 
    6 class CubeTransition : public Transition {
    7 public:
    8  CubeTransition(Clip* c, Clip* s, const EffectMeta* em);
    9  void process_coords(double timecode, GLTextureCoords &, int data);
    10 };
    11 
    12 #endif // CUBETRANSITION_H
    Definition: effect.h:105
    +
    Definition: effect.h:27
    +
    Definition: cubetransition.h:6
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/cursors_8h_source.html b/docs/html/cursors_8h_source.html new file mode 100644 index 000000000..2498fad1a --- /dev/null +++ b/docs/html/cursors_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: ui/cursors.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cursors.h
    +
    +
    +
    1 #ifndef CURSORS_H
    2 #define CURSORS_H
    3 
    4 #include <QCursor>
    5 
    6 void init_custom_cursors();
    7 
    8 namespace Olive{
    9  extern QCursor Cursor_LeftTrim;
    10  extern QCursor Cursor_RightTrim;
    11 }
    12 
    13 #endif // CURSORS_H
    + + + + diff --git a/docs/html/debug_8h_source.html b/docs/html/debug_8h_source.html new file mode 100644 index 000000000..4ba5bbc80 --- /dev/null +++ b/docs/html/debug_8h_source.html @@ -0,0 +1,76 @@ + + + + + + + +Olive: debug.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    debug.h
    +
    +
    +
    1 #ifndef DEBUG_H
    2 #define DEBUG_H
    3 
    4 #include <QDebug>
    5 
    6 void debug_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg);
    7 const QString& get_debug_str();
    8 void open_debug_file();
    9 void close_debug_file();
    10 
    11 #define dout qDebug()
    12 
    13 #endif // DEBUG_H
    + + + + diff --git a/docs/html/debugdialog_8h_source.html b/docs/html/debugdialog_8h_source.html new file mode 100644 index 000000000..f4fa8ed9d --- /dev/null +++ b/docs/html/debugdialog_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: dialogs/debugdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    debugdialog.h
    +
    +
    +
    1 #ifndef DEBUGDIALOG_H
    2 #define DEBUGDIALOG_H
    3 
    4 #include <QDialog>
    5 class QTextEdit;
    6 
    7 class DebugDialog : public QDialog {
    8  Q_OBJECT
    9 public:
    10  DebugDialog(QWidget* parent = 0);
    11 public slots:
    12  void update_log();
    13 protected:
    14  void showEvent(QShowEvent* event);
    15 private:
    16  QTextEdit* textEdit;
    17 };
    18 
    19 namespace Olive {
    20  extern DebugDialog* DebugDialog;
    21 }
    22 
    23 #endif // DEBUGDIALOG_H
    Definition: debugdialog.h:7
    +
    + + + + diff --git a/docs/html/demonotice_8h_source.html b/docs/html/demonotice_8h_source.html new file mode 100644 index 000000000..8e4dd928d --- /dev/null +++ b/docs/html/demonotice_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: dialogs/demonotice.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    demonotice.h
    +
    +
    +
    1 #ifndef DEMONOTICE_H
    2 #define DEMONOTICE_H
    3 
    4 #include <QDialog>
    5 
    6 class DemoNotice : public QDialog
    7 {
    8  Q_OBJECT
    9 public:
    10  explicit DemoNotice(QWidget *parent = 0);
    11 };
    12 
    13 #endif // DEMONOTICE_H
    Definition: demonotice.h:6
    +
    + + + + diff --git a/docs/html/dir_167790342fb55959539d550b874be046.html b/docs/html/dir_167790342fb55959539d550b874be046.html new file mode 100644 index 000000000..7fe143a20 --- /dev/null +++ b/docs/html/dir_167790342fb55959539d550b874be046.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: project Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    project Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html new file mode 100644 index 000000000..4caac3371 --- /dev/null +++ b/docs/html/dir_1788f8309b1a812dcb800a185471cf6c.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: ui Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ui Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_1e3623b91baed642ec07bb16fd2f1d1e.html b/docs/html/dir_1e3623b91baed642ec07bb16fd2f1d1e.html new file mode 100644 index 000000000..f723a68ed --- /dev/null +++ b/docs/html/dir_1e3623b91baed642ec07bb16fd2f1d1e.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: packaging/windows Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    windows Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_27557e0778820cd254ee4de672ad398a.html b/docs/html/dir_27557e0778820cd254ee4de672ad398a.html new file mode 100644 index 000000000..9a03866c0 --- /dev/null +++ b/docs/html/dir_27557e0778820cd254ee4de672ad398a.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: panels Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    panels Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_56b9387f66bbb1dccc82a920d3dbd989.html b/docs/html/dir_56b9387f66bbb1dccc82a920d3dbd989.html new file mode 100644 index 000000000..e6f2ca55c --- /dev/null +++ b/docs/html/dir_56b9387f66bbb1dccc82a920d3dbd989.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: dialogs Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    dialogs Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_63bb297c276a119495816091bcd678e9.html b/docs/html/dir_63bb297c276a119495816091bcd678e9.html new file mode 100644 index 000000000..2a41fed2f --- /dev/null +++ b/docs/html/dir_63bb297c276a119495816091bcd678e9.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effects Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/html/dir_6bd69bfe0c8411ea8cfb86495c1153f0.html b/docs/html/dir_6bd69bfe0c8411ea8cfb86495c1153f0.html new file mode 100644 index 000000000..2c9472d46 --- /dev/null +++ b/docs/html/dir_6bd69bfe0c8411ea8cfb86495c1153f0.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: effects/internal Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    internal Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_93d4afa98ce66159f3265f6d5a9de4f5.html b/docs/html/dir_93d4afa98ce66159f3265f6d5a9de4f5.html new file mode 100644 index 000000000..ffd98b54f --- /dev/null +++ b/docs/html/dir_93d4afa98ce66159f3265f6d5a9de4f5.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: playback Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    playback Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_bc161955dc3a3d2485839eba21420d01.html b/docs/html/dir_bc161955dc3a3d2485839eba21420d01.html new file mode 100644 index 000000000..1ab830c0b --- /dev/null +++ b/docs/html/dir_bc161955dc3a3d2485839eba21420d01.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: io Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    io Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..8a60f0789 --- /dev/null +++ b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    include Directory Reference
    +
    +
    +
    + + + + diff --git a/docs/html/dir_f2b58c5fe1af6bdc9904c8245e307f38.html b/docs/html/dir_f2b58c5fe1af6bdc9904c8245e307f38.html new file mode 100644 index 000000000..fe1c8ae50 --- /dev/null +++ b/docs/html/dir_f2b58c5fe1af6bdc9904c8245e307f38.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: packaging Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    packaging Directory Reference
    +
    +
    + + +

    +Directories

    +
    + + + + diff --git a/docs/html/doc.png b/docs/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css new file mode 100644 index 000000000..e2515926c --- /dev/null +++ b/docs/html/doxygen.css @@ -0,0 +1,1764 @@ +/* The standard CSS for doxygen 1.8.15 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/docs/html/doxygen.png b/docs/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js new file mode 100644 index 000000000..ea0a7b39a --- /dev/null +++ b/docs/html/dynsections.js @@ -0,0 +1,120 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +Olive: project/effect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effect.h
    +
    +
    +
    1 #ifndef EFFECT_H
    2 #define EFFECT_H
    3 
    4 #include <QObject>
    5 #include <QString>
    6 #include <QVector>
    7 #include <QColor>
    8 #include <QOpenGLFunctions>
    9 #include <QOpenGLShaderProgram>
    10 #include <QOpenGLTexture>
    11 #include <QMutex>
    12 #include <QThread>
    13 class QLabel;
    14 class QWidget;
    15 class CollapsibleWidget;
    16 class QGridLayout;
    17 class QPushButton;
    18 class QMouseEvent;
    19 
    20 class Clip;
    21 class QXmlStreamReader;
    22 class QXmlStreamWriter;
    23 class Effect;
    24 class EffectRow;
    25 class CheckboxEx;
    26 
    27 struct EffectMeta {
    28  QString name;
    29  QString category;
    30  QString filename;
    31  QString path;
    32  QString tooltip;
    33  int internal;
    34  int type;
    35  int subtype;
    36 };
    37 extern QVector<EffectMeta> effects;
    38 
    39 double log_volume(double linear);
    40 Effect* create_effect(Clip* c, const EffectMeta *em);
    41 const EffectMeta* get_internal_meta(int internal_id, int type);
    42 
    43 enum EffectType {
    44  EFFECT_TYPE_INVALID,
    45  EFFECT_TYPE_VIDEO,
    46  EFFECT_TYPE_AUDIO,
    47  EFFECT_TYPE_EFFECT,
    48  EFFECT_TYPE_TRANSITION
    49 };
    50 
    51 enum EffectKeyframeType {
    52  EFFECT_KEYFRAME_LINEAR,
    53  EFFECT_KEYFRAME_BEZIER,
    54  EFFECT_KEYFRAME_HOLD
    55 };
    56 
    57 enum EffectInternal {
    58  EFFECT_INTERNAL_TRANSFORM,
    59  EFFECT_INTERNAL_TEXT,
    60  EFFECT_INTERNAL_SOLID,
    61  EFFECT_INTERNAL_NOISE,
    62  EFFECT_INTERNAL_VOLUME,
    63  EFFECT_INTERNAL_PAN,
    64  EFFECT_INTERNAL_TONE,
    65  EFFECT_INTERNAL_SHAKE,
    66  EFFECT_INTERNAL_TIMECODE,
    67  EFFECT_INTERNAL_MASK,
    68  EFFECT_INTERNAL_FILLLEFTRIGHT,
    69  EFFECT_INTERNAL_VST,
    70  EFFECT_INTERNAL_CORNERPIN,
    71  EFFECT_INTERNAL_FREI0R,
    72  EFFECT_INTERNAL_COUNT
    73 };
    74 
    75 enum EffectBlendMode {
    76  BLEND_MODE_ADD,
    77  BLEND_MODE_AVERAGE,
    78  BLEND_MODE_COLORBURN,
    79  BLEND_MODE_COLORDODGE,
    80  BLEND_MODE_DARKEN,
    81  BLEND_MODE_DIFFERENCE,
    82  BLEND_MODE_EXCLUSION,
    83  BLEND_MODE_GLOW,
    84  BLEND_MODE_HARDLIGHT,
    85  BLEND_MODE_HARDMIX,
    86  BLEND_MODE_LIGHTEN,
    87  BLEND_MODE_LINEARBURN,
    88  BLEND_MODE_LINEARDODGE,
    89  BLEND_MODE_LINEARLIGHT,
    90  BLEND_MODE_MULTIPLY,
    91  BLEND_MODE_NEGATION,
    92  BLEND_MODE_NORMAL,
    93  BLEND_MODE_OVERLAY,
    94  BLEND_MODE_PHOENIX,
    95  BLEND_MODE_PINLIGHT,
    96  BLEND_MODE_REFLECT,
    97  BLEND_MODE_SCREEN,
    98  BLEND_MODE_SOFTLIGHT,
    99  BLEND_MODE_SUBSTRACT,
    100  BLEND_MODE_SUBTRACT,
    101  BLEND_MODE_VIVIDLIGHT,
    102  BLEND_MODE_COUNT
    103 };
    104 
    106  int grid_size;
    107 
    108  int vertexTopLeftX;
    109  int vertexTopLeftY;
    110  int vertexTopLeftZ;
    111  int vertexTopRightX;
    112  int vertexTopRightY;
    113  int vertexTopRightZ;
    114  int vertexBottomLeftX;
    115  int vertexBottomLeftY;
    116  int vertexBottomLeftZ;
    117  int vertexBottomRightX;
    118  int vertexBottomRightY;
    119  int vertexBottomRightZ;
    120 
    121  float textureTopLeftX;
    122  float textureTopLeftY;
    123  float textureTopLeftQ;
    124  float textureTopRightX;
    125  float textureTopRightY;
    126  float textureTopRightQ;
    127  float textureBottomRightX;
    128  float textureBottomRightY;
    129  float textureBottomRightQ;
    130  float textureBottomLeftX;
    131  float textureBottomLeftY;
    132  float textureBottomLeftQ;
    133 
    134  int blendmode;
    135  float opacity;
    136 };
    137 
    138 const EffectMeta* get_meta_from_name(const QString& input);
    139 
    140 qint16 mix_audio_sample(qint16 a, qint16 b);
    141 
    142 #include "effectfield.h"
    143 #include "effectrow.h"
    144 #include "effectgizmo.h"
    145 
    146 class Effect : public QObject {
    147  Q_OBJECT
    148 public:
    149  Effect(Clip* c, const EffectMeta* em);
    150  ~Effect();
    151  Clip* parent_clip;
    152  const EffectMeta* meta;
    153  int id;
    154  QString name;
    155  CollapsibleWidget* container;
    156 
    157  EffectRow* add_row(const QString &name, bool savable = true, bool keyframable = true);
    158  EffectRow* row(int i);
    159  int row_count();
    160 
    161  EffectGizmo* add_gizmo(int type);
    162  EffectGizmo* gizmo(int i);
    163  int gizmo_count();
    164 
    165  bool is_enabled();
    166  void set_enabled(bool b);
    167 
    168  virtual void refresh();
    169 
    170  virtual Effect* copy(Clip* c);
    171  void copy_field_keyframes(Effect *e);
    172 
    173  virtual void load(QXmlStreamReader& stream);
    174  virtual void custom_load(QXmlStreamReader& stream);
    175  virtual void save(QXmlStreamWriter& stream);
    176 
    177  void load_from_string(const QByteArray &s);
    178  QByteArray save_to_string();
    179 
    180  // glsl handling
    181  bool is_open();
    182  void open();
    183  void close();
    184  bool is_glsl_linked();
    185  virtual void startEffect();
    186  virtual void endEffect();
    187 
    188  bool enable_shader;
    189  bool enable_coords;
    190  bool enable_superimpose;
    191  bool enable_image;
    192 
    193  int getIterations();
    194  void setIterations(int i);
    195 
    196  const char* ffmpeg_filter;
    197 
    198  virtual void process_image(double timecode, uint8_t* input, uint8_t* output, int size);
    199  virtual void process_shader(double timecode, GLTextureCoords&, int iteration);
    200  virtual void process_coords(double timecode, GLTextureCoords& coords, int data);
    201  virtual GLuint process_superimpose(double timecode);
    202  virtual void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    203 
    204  virtual void gizmo_draw(double timecode, GLTextureCoords& coords);
    205  void gizmo_move(EffectGizmo* sender, int x_movement, int y_movement, double timecode, bool done);
    206  void gizmo_world_to_screen();
    207  bool are_gizmos_enabled();
    208 public slots:
    209  void field_changed();
    210 private slots:
    211  void show_context_menu(const QPoint&);
    212  void delete_self();
    213  void move_up();
    214  void move_down();
    215  void save_to_file();
    216  void load_from_file();
    217 protected:
    218  // glsl effect
    219  QOpenGLShaderProgram* glslProgram;
    220  QString vertPath;
    221  QString fragPath;
    222 
    223  // superimpose effect
    224  QImage img;
    225  QOpenGLTexture* texture;
    226 
    227  // enable effect to update constantly
    228  bool enable_always_update;
    229 private:
    230  // superimpose effect
    231  QString script;
    232 
    233  bool isOpen;
    234  QVector<EffectRow*> rows;
    235  QVector<EffectGizmo*> gizmos;
    236  QGridLayout* ui_layout;
    237  QWidget* ui;
    238  bool bound;
    239  int iterations;
    240 
    241  // superimpose functions
    242  virtual void redraw(double timecode);
    243  bool valueHasChanged(double timecode);
    244  QVector<QVariant> cachedValues;
    245  void delete_texture();
    246  int get_index_in_clip();
    247  void validate_meta_path();
    248 };
    249 
    250 class EffectInit : public QThread {
    251 public:
    252  EffectInit();
    253 protected:
    254  void run();
    255 };
    256 
    257 #endif // EFFECT_H
    Definition: effect.h:105
    +
    Definition: collapsiblewidget.h:25
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: checkboxex.h:6
    +
    Definition: effectrow.h:17
    +
    Definition: effectgizmo.h:21
    +
    Definition: effect.h:250
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/effectcontrols_8h_source.html b/docs/html/effectcontrols_8h_source.html new file mode 100644 index 000000000..295ab0df0 --- /dev/null +++ b/docs/html/effectcontrols_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: panels/effectcontrols.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effectcontrols.h
    +
    +
    +
    1 #ifndef EFFECTCONTROLS_H
    2 #define EFFECTCONTROLS_H
    3 
    4 #include <QDockWidget>
    5 #include <QUndoCommand>
    6 #include <QMutex>
    7 
    8 class Clip;
    9 class QMenu;
    10 class Effect;
    11 class TimelineHeader;
    12 class QScrollArea;
    13 class KeyframeView;
    14 class QVBoxLayout;
    15 class ResizableScrollBar;
    16 class QLabel;
    17 class KeyframeView;
    18 class QScrollBar;
    19 class QHBoxLayout;
    20 
    21 class EffectsArea : public QWidget {
    22  Q_OBJECT
    23 public:
    24  EffectsArea(QWidget* parent = 0);
    25  QScrollArea* parent_widget;
    26  KeyframeView* keyframe_area;
    27  TimelineHeader* header;
    28 public slots:
    29  void receive_wheel_event(QWheelEvent* e);
    30 };
    31 
    32 class EffectControls : public QDockWidget
    33 {
    34  Q_OBJECT
    35 public:
    36  explicit EffectControls(QWidget *parent = 0);
    37  ~EffectControls();
    38  int get_mode();
    39  void set_clips(QVector<int>& clips, int mode);
    40  void clear_effects(bool clear_cache);
    41  void delete_effects();
    42  bool is_focused();
    43  void reload_clips();
    44  void set_zoom(bool in);
    45  bool keyframe_focus();
    46  void delete_selected_keyframes();
    47  bool multiple;
    48  void scroll_to_frame(long frame);
    49 
    50  QVector<int> selected_clips;
    51 
    52  double zoom;
    53 
    54  ResizableScrollBar* horizontalScrollBar;
    55  QScrollBar* verticalScrollBar;
    56 
    57  QMutex effects_loaded;
    58 
    59  void add_effect_paste_action(QMenu* menu);
    60 public slots:
    61  void cut();
    62  void copy(bool del = false);
    63  void update_keyframes();
    64 private slots:
    65  void menu_select(QAction* q);
    66 
    67  void video_effect_click();
    68  void audio_effect_click();
    69  void video_transition_click();
    70  void audio_transition_click();
    71 
    72  void deselect_all_effects(QWidget*);
    73 
    74  void update_scrollbar();
    75  void queue_post_update();
    76 
    77  void effects_area_context_menu();
    78 protected:
    79  void resizeEvent(QResizeEvent *event);
    80 private:
    81  void show_effect_menu(int type, int subtype);
    82  void load_effects();
    83  void load_keyframes();
    84  void open_effect(QVBoxLayout* hlayout, Effect* e);
    85 
    86  void setup_ui();
    87 
    88  int effect_menu_type;
    89  int effect_menu_subtype;
    90  QString panel_name;
    91  int mode;
    92 
    93  TimelineHeader* headers;
    94  EffectsArea* effects_area;
    95  QScrollArea* scrollArea;
    96  QLabel* lblMultipleClipsSelected;
    97  KeyframeView* keyframeView;
    98  QWidget* video_effect_area;
    99  QWidget* audio_effect_area;
    100  QWidget* vcontainer;
    101  QWidget* acontainer;
    102 };
    103 
    104 #endif // EFFECTCONTROLS_H
    Definition: keyframeview.h:13
    +
    Definition: effectcontrols.h:21
    +
    Definition: effect.h:146
    +
    Definition: timelineheader.h:11
    +
    Definition: effectcontrols.h:32
    +
    Definition: resizablescrollbar.h:6
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/effectfield_8h_source.html b/docs/html/effectfield_8h_source.html new file mode 100644 index 000000000..a2b840980 --- /dev/null +++ b/docs/html/effectfield_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: project/effectfield.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effectfield.h
    +
    +
    +
    1 #ifndef EFFECTFIELD_H
    2 #define EFFECTFIELD_H
    3 
    4 enum EffectFieldType {
    5  EFFECT_FIELD_DOUBLE,
    6  EFFECT_FIELD_COLOR,
    7  EFFECT_FIELD_STRING,
    8  EFFECT_FIELD_BOOL,
    9  EFFECT_FIELD_COMBO,
    10  EFFECT_FIELD_FONT,
    11  EFFECT_FIELD_FILE
    12 };
    13 
    14 #include <QObject>
    15 #include <QVariant>
    16 #include <QVector>
    17 
    18 #include "keyframe.h"
    19 
    20 class EffectRow;
    21 class ComboAction;
    22 
    23 class EffectField : public QObject {
    24  Q_OBJECT
    25 public:
    26  EffectField(EffectRow* parent, int t, const QString& i);
    27  ~EffectField();
    28 
    29  EffectRow* parent_row;
    30  int type;
    31  QString id;
    32 
    33  double get_validated_keyframe_handle(int key, bool post);
    34 
    35  QVariant get_previous_data();
    36  QVariant get_current_data();
    37  double frameToTimecode(long frame);
    38  long timecodeToFrame(double timecode);
    39  void set_current_data(const QVariant&);
    40  void get_keyframe_data(double timecode, int& before, int& after, double& d);
    41  QVariant validate_keyframe_data(double timecode, bool async = false);
    42 
    43  double get_double_value(double timecode, bool async = false);
    44  void set_double_value(double v);
    45  void set_double_default_value(double v);
    46  void set_double_minimum_value(double v);
    47  void set_double_maximum_value(double v);
    48 
    49  QString get_string_value(double timecode, bool async = false);
    50  void set_string_value(const QString &s);
    51 
    52  void add_combo_item(const QString& name, const QVariant &data);
    53  int get_combo_index(double timecode, bool async = false);
    54  QVariant get_combo_data(double timecode);
    55  QString get_combo_string(double timecode);
    56  void set_combo_index(int index);
    57  void set_combo_string(const QString& s);
    58 
    59  bool get_bool_value(double timecode, bool async = false);
    60  void set_bool_value(bool b);
    61 
    62  QString get_font_name(double timecode, bool async = false);
    63  void set_font_name(const QString& s);
    64 
    65  QColor get_color_value(double timecode, bool async = false);
    66  void set_color_value(QColor color);
    67 
    68  QString get_filename(double timecode, bool async = false);
    69  void set_filename(const QString& s);
    70 
    71  QWidget* get_ui_element();
    72  bool is_enabled();
    73  void set_enabled(bool e);
    74  QVector<EffectKeyframe> keyframes;
    75  QWidget* ui_element;
    76 
    77  void make_key_from_change(ComboAction* ca);
    78 public slots:
    79  void ui_element_change();
    80 private:
    81  bool hasKeyframes();
    82 signals:
    83  void changed();
    84  void toggled(bool);
    85  void clicked();
    86 };
    87 
    88 #endif // EFFECTFIELD_H
    Definition: undo.h:32
    +
    Definition: effectrow.h:17
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/effectgizmo_8h_source.html b/docs/html/effectgizmo_8h_source.html new file mode 100644 index 000000000..6f6dd1a65 --- /dev/null +++ b/docs/html/effectgizmo_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: project/effectgizmo.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effectgizmo.h
    +
    +
    +
    1 #ifndef EFFECTGIZMO_H
    2 #define EFFECTGIZMO_H
    3 
    4 enum GizmoType {
    5  GIZMO_TYPE_DOT,
    6  GIZMO_TYPE_POLY,
    7  GIZMO_TYPE_TARGET
    8 };
    9 
    10 #define GIZMO_DOT_SIZE 2.5
    11 #define GIZMO_TARGET_SIZE 5.0
    12 
    13 #include <QString>
    14 #include <QRect>
    15 #include <QPoint>
    16 #include <QVector>
    17 #include <QColor>
    18 
    19 class EffectField;
    20 
    22 {
    23 public:
    24  EffectGizmo(int type);
    25 
    26  QVector<QPoint> world_pos;
    27  QVector<QPoint> screen_pos;
    28 
    29  EffectField* x_field1;
    30  double x_field_multi1;
    31  EffectField* y_field1;
    32  double y_field_multi1;
    33  EffectField* x_field2;
    34  double x_field_multi2;
    35  EffectField* y_field2;
    36  double y_field_multi2;
    37 
    38  void set_previous_value();
    39 
    40  QColor color;
    41  int get_point_count();
    42 
    43  int get_type();
    44 
    45  int get_cursor();
    46  void set_cursor(int c);
    47 private:
    48  int type;
    49  int cursor;
    50 };
    51 
    52 #endif // EFFECTGIZMO_H
    Definition: effectgizmo.h:21
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/effectloaders_8h_source.html b/docs/html/effectloaders_8h_source.html new file mode 100644 index 000000000..05fde3102 --- /dev/null +++ b/docs/html/effectloaders_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: project/effectloaders.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effectloaders.h
    +
    +
    +
    1 #ifndef EFFECTLOADERS_H
    2 #define EFFECTLOADERS_H
    3 
    4 #include <QList>
    5 
    6 void init_effects();
    7 
    8 #endif // EFFECTLOADERS_H
    + + + + diff --git a/docs/html/effectrow_8h_source.html b/docs/html/effectrow_8h_source.html new file mode 100644 index 000000000..6ab11a77c --- /dev/null +++ b/docs/html/effectrow_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: project/effectrow.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    effectrow.h
    +
    +
    +
    1 #ifndef EFFECTROW_H
    2 #define EFFECTROW_H
    3 
    4 #include <QObject>
    5 #include <QVector>
    6 
    7 class Effect;
    8 class QGridLayout;
    9 class EffectField;
    10 class QLabel;
    11 class QPushButton;
    12 class ComboAction;
    13 class QHBoxLayout;
    14 class KeyframeNavigator;
    15 class ClickableLabel;
    16 
    17 class EffectRow : public QObject {
    18  Q_OBJECT
    19 public:
    20  EffectRow(Effect* parent, bool save, QGridLayout* uilayout, const QString& n, int row, bool keyframable = true);
    21  ~EffectRow();
    22  EffectField* add_field(int type, const QString &id, int colspan = 1);
    23  void add_widget(QWidget *w);
    24  EffectField* field(int i);
    25  int fieldCount();
    26  void set_keyframe_now(ComboAction *ca);
    27  void delete_keyframe_at_time(ComboAction *ca, long time);
    28  ClickableLabel* label;
    29  Effect* parent_effect;
    30  bool savable;
    31  const QString& get_name();
    32 
    33  bool isKeyframing();
    34  void setKeyframing(bool);
    35 public slots:
    36  void goto_previous_key();
    37  void toggle_key();
    38  void goto_next_key();
    39  void focus_row();
    40 private slots:
    41  void set_keyframe_enabled(bool);
    42 private:
    43  bool keyframing;
    44  QGridLayout* ui;
    45  QString name;
    46  int ui_row;
    47  QVector<EffectField*> fields;
    48  QVector<QWidget*> widgets;
    49 
    50  KeyframeNavigator* keyframe_nav;
    51 
    52  bool just_made_unsafe_keyframe;
    53  QVector<int> unsafe_keys;
    54  QVector<QVariant> unsafe_old_data;
    55  QVector<bool> key_is_new;
    56 
    57  int column_count;
    58 };
    59 
    60 #endif // EFFECTROW_H
    Definition: keyframenavigator.h:9
    +
    Definition: clickablelabel.h:6
    +
    Definition: undo.h:32
    +
    Definition: effect.h:146
    +
    Definition: effectrow.h:17
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/embeddedfilechooser_8h_source.html b/docs/html/embeddedfilechooser_8h_source.html new file mode 100644 index 000000000..b48dc6f1f --- /dev/null +++ b/docs/html/embeddedfilechooser_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/embeddedfilechooser.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    embeddedfilechooser.h
    +
    +
    +
    1 #ifndef EMBEDDEDFILECHOOSER_H
    2 #define EMBEDDEDFILECHOOSER_H
    3 
    4 #include <QWidget>
    5 
    6 class QLabel;
    7 
    8 class EmbeddedFileChooser : public QWidget {
    9  Q_OBJECT
    10 public:
    11  EmbeddedFileChooser(QWidget* parent = 0);
    12 
    13  const QString& getFilename();
    14  const QString& getPreviousValue();
    15  void setFilename(const QString& s);
    16 signals:
    17  void changed();
    18 private:
    19  QLabel* file_label;
    20  QString filename;
    21  QString old_filename;
    22  void update_label();
    23 private slots:
    24  void browse();
    25 };
    26 
    27 #endif // EMBEDDEDFILECHOOSER_H
    Definition: embeddedfilechooser.h:8
    +
    + + + + diff --git a/docs/html/exponentialfadetransition_8h_source.html b/docs/html/exponentialfadetransition_8h_source.html new file mode 100644 index 000000000..4f646f3ad --- /dev/null +++ b/docs/html/exponentialfadetransition_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects/internal/exponentialfadetransition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    exponentialfadetransition.h
    +
    +
    +
    1 #ifndef EXPONENTIALFADETRANSITION_H
    2 #define EXPONENTIALFADETRANSITION_H
    3 
    4 #include "project/transition.h"
    5 
    7 public:
    9  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    10 };
    11 
    12 #endif // LINEARFADETRANSITION_H
    Definition: exponentialfadetransition.h:6
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/exportdialog_8h_source.html b/docs/html/exportdialog_8h_source.html new file mode 100644 index 000000000..a4e4e41cf --- /dev/null +++ b/docs/html/exportdialog_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: dialogs/exportdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    exportdialog.h
    +
    +
    +
    1 #ifndef EXPORTDIALOG_H
    2 #define EXPORTDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 struct Sequence;
    7 class ExportThread;
    8 class QComboBox;
    9 class QSpinBox;
    10 class QDoubleSpinBox;
    11 class QLabel;
    12 class QProgressBar;
    13 class QGroupBox;
    14 
    15 #include "io/exportthread.h"
    16 
    17 class ExportDialog : public QDialog
    18 {
    19  Q_OBJECT
    20 public:
    21  explicit ExportDialog(QWidget *parent = 0);
    22  ~ExportDialog();
    23  QString export_error;
    24 
    25 private slots:
    26  void format_changed(int index);
    27  void export_action();
    28  void update_progress_bar(int value, qint64 remaining_ms);
    29  void cancel_render();
    30  void render_thread_finished();
    31  void vcodec_changed(int index);
    32  void comp_type_changed(int index);
    33  void open_advanced_video_dialog();
    34 
    35 private:
    36  QVector<QString> format_strings;
    37  void setup_ui();
    38 
    39  ExportThread* et;
    40  void prep_ui_for_render(bool r);
    41  bool cancelled;
    42 
    43  void add_codec_to_combobox(QComboBox* box, enum AVCodecID codec);
    44 
    45  VideoCodecParams vcodec_params;
    46 
    47  QComboBox* rangeCombobox;
    48  QSpinBox* widthSpinbox;
    49  QDoubleSpinBox* videobitrateSpinbox;
    50  QLabel* videoBitrateLabel;
    51  QDoubleSpinBox* framerateSpinbox;
    52  QComboBox* vcodecCombobox;
    53  QComboBox* acodecCombobox;
    54  QSpinBox* samplingRateSpinbox;
    55  QSpinBox* audiobitrateSpinbox;
    56  QProgressBar* progressBar;
    57  QComboBox* formatCombobox;
    58  QSpinBox* heightSpinbox;
    59  QPushButton* export_button;
    60  QPushButton* cancel_button;
    61  QPushButton* renderCancel;
    62  QGroupBox* videoGroupbox;
    63  QGroupBox* audioGroupbox;
    64  QComboBox* compressionTypeCombobox;
    65 };
    66 
    67 #endif // EXPORTDIALOG_H
    Definition: sequence.h:13
    +
    Definition: exportthread.h:52
    +
    Definition: exportthread.h:48
    +
    Definition: exportdialog.h:17
    +
    + + + + diff --git a/docs/html/exportthread_8h_source.html b/docs/html/exportthread_8h_source.html new file mode 100644 index 000000000..efda38d51 --- /dev/null +++ b/docs/html/exportthread_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: io/exportthread.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    exportthread.h
    +
    +
    +
    1 #ifndef EXPORTTHREAD_H
    2 #define EXPORTTHREAD_H
    3 
    4 #include <QThread>
    5 #include <QOffscreenSurface>
    6 #include <QMutex>
    7 #include <QWaitCondition>
    8 
    9 class ExportDialog;
    10 struct AVFormatContext;
    11 struct AVCodecContext;
    12 struct AVFrame;
    13 struct AVPacket;
    14 struct AVStream;
    15 struct AVCodec;
    16 struct SwsContext;
    17 struct SwrContext;
    18 
    19 extern "C" {
    20  #include <libavcodec/avcodec.h>
    21 }
    22 
    23 #define COMPRESSION_TYPE_CBR 0
    24 #define COMPRESSION_TYPE_CFR 1
    25 #define COMPRESSION_TYPE_TARGETSIZE 2
    26 #define COMPRESSION_TYPE_TARGETBR 3
    27 
    28 // structs that store parameters passed from the export dialogs to this thread
    29 
    30 struct ExportParams {
    31  // export parameters
    32  QString filename;
    33  bool video_enabled;
    34  int video_codec;
    35  int video_width;
    36  int video_height;
    37  double video_frame_rate;
    38  int video_compression_type;
    39  double video_bitrate;
    40  bool audio_enabled;
    41  int audio_codec;
    42  int audio_sampling_rate;
    43  int audio_bitrate;
    44  long start_frame;
    45  long end_frame;
    46 };
    47 
    49  int pix_fmt;
    50 };
    51 
    52 class ExportThread : public QThread {
    53  Q_OBJECT
    54 public:
    55  ExportThread(const ExportParams& iparams, const VideoCodecParams& ivparams, QObject* parent = nullptr);
    56  void run();
    57 
    58  QOffscreenSurface surface;
    59 
    60  ExportDialog* ed;
    61 
    62  bool continueEncode;
    63 signals:
    64  void progress_changed(int value, qint64 remaining_ms);
    65 public slots:
    66  void wake();
    67 private:
    68  bool encode(AVFormatContext* ofmt_ctx, AVCodecContext* codec_ctx, AVFrame* frame, AVPacket* packet, AVStream* stream, bool rescale);
    69  bool setupVideo();
    70  bool setupAudio();
    71  bool setupContainer();
    72 
    73  // params imported from dialogs
    74  ExportParams params;
    75  VideoCodecParams vcodec_params;
    76 
    77  AVFormatContext* fmt_ctx;
    78  AVStream* video_stream;
    79  AVCodec* vcodec;
    80  AVCodecContext* vcodec_ctx;
    81  AVFrame* video_frame;
    82  AVFrame* sws_frame;
    83  SwsContext* sws_ctx;
    84  AVStream* audio_stream;
    85  AVCodec* acodec;
    86  AVFrame* audio_frame;
    87  AVFrame* swr_frame;
    88  AVCodecContext* acodec_ctx;
    89  AVPacket video_pkt;
    90  AVPacket audio_pkt;
    91  SwrContext* swr_ctx;
    92 
    93  bool vpkt_alloc;
    94  bool apkt_alloc;
    95 
    96  int aframe_bytes;
    97  int ret;
    98  char* c_filename;
    99 
    100  QMutex mutex;
    101  QWaitCondition waitCond;
    102 };
    103 
    104 #endif // EXPORTTHREAD_H
    Definition: exportthread.h:52
    +
    Definition: exportthread.h:30
    +
    Definition: exportthread.h:48
    +
    Definition: exportdialog.h:17
    +
    + + + + diff --git a/docs/html/files.html b/docs/html/files.html new file mode 100644 index 000000000..1c4405a39 --- /dev/null +++ b/docs/html/files.html @@ -0,0 +1,201 @@ + + + + + + + +Olive: File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 123]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      dialogs
      effects
      include
      io
      packaging
      panels
      playback
      project
      ui
     debug.h
     mainwindow.h
     oliveglobal.h
    +
    +
    + + + + diff --git a/docs/html/fillleftrighteffect_8h_source.html b/docs/html/fillleftrighteffect_8h_source.html new file mode 100644 index 000000000..0856e3bcc --- /dev/null +++ b/docs/html/fillleftrighteffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/fillleftrighteffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    fillleftrighteffect.h
    +
    +
    +
    1 #ifndef FILLLEFTRIGHTEFFECT_H
    2 #define FILLLEFTRIGHTEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class FillLeftRightEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  FillLeftRightEffect(Clip* c, const EffectMeta* em);
    10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    11 private:
    12  EffectField* fill_type;
    13 };
    14 
    15 #endif // FILLLEFTRIGHTEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: fillleftrighteffect.h:6
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/flowlayout_8h_source.html b/docs/html/flowlayout_8h_source.html new file mode 100644 index 000000000..15c477910 --- /dev/null +++ b/docs/html/flowlayout_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/flowlayout.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    flowlayout.h
    +
    +
    +
    1 /****************************************************************************
    2 **
    3 ** Copyright (C) 2016 The Qt Company Ltd.
    4 ** Contact: https://www.qt.io/licensing/
    5 **
    6 ** This file is part of the examples of the Qt Toolkit.
    7 **
    8 ** $QT_BEGIN_LICENSE:BSD$
    9 ** Commercial License Usage
    10 ** Licensees holding valid commercial Qt licenses may use this file in
    11 ** accordance with the commercial license agreement provided with the
    12 ** Software or, alternatively, in accordance with the terms contained in
    13 ** a written agreement between you and The Qt Company. For licensing terms
    14 ** and conditions see https://www.qt.io/terms-conditions. For further
    15 ** information use the contact form at https://www.qt.io/contact-us.
    16 **
    17 ** BSD License Usage
    18 ** Alternatively, you may use this file under the terms of the BSD license
    19 ** as follows:
    20 **
    21 ** "Redistribution and use in source and binary forms, with or without
    22 ** modification, are permitted provided that the following conditions are
    23 ** met:
    24 ** * Redistributions of source code must retain the above copyright
    25 ** notice, this list of conditions and the following disclaimer.
    26 ** * Redistributions in binary form must reproduce the above copyright
    27 ** notice, this list of conditions and the following disclaimer in
    28 ** the documentation and/or other materials provided with the
    29 ** distribution.
    30 ** * Neither the name of The Qt Company Ltd nor the names of its
    31 ** contributors may be used to endorse or promote products derived
    32 ** from this software without specific prior written permission.
    33 **
    34 **
    35 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    36 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    37 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    38 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    39 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    40 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    41 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    42 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    43 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    44 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    45 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    46 **
    47 ** $QT_END_LICENSE$
    48 **
    49 ****************************************************************************/
    50 
    51 
    52 #ifndef FLOWLAYOUT_H
    53 #define FLOWLAYOUT_H
    54 
    55 #include <QLayout>
    56 #include <QRect>
    57 #include <QStyle>
    58 class FlowLayout : public QLayout
    59 {
    60 public:
    61  explicit FlowLayout(QWidget *parent, int margin = -1, int hSpacing = -1, int vSpacing = -1);
    62  explicit FlowLayout(int margin = -1, int hSpacing = -1, int vSpacing = -1);
    63  ~FlowLayout();
    64 
    65  void addItem(QLayoutItem *item) override;
    66  int horizontalSpacing() const;
    67  int verticalSpacing() const;
    68  Qt::Orientations expandingDirections() const override;
    69  bool hasHeightForWidth() const override;
    70  int heightForWidth(int) const override;
    71  int count() const override;
    72  QLayoutItem *itemAt(int index) const override;
    73  QSize minimumSize() const override;
    74  void setGeometry(const QRect &rect) override;
    75  QSize sizeHint() const override;
    76  QLayoutItem *takeAt(int index) override;
    77 
    78 private:
    79  int doLayout(const QRect &rect, bool testOnly) const;
    80  int smartSpacing(QStyle::PixelMetric pm) const;
    81 
    82  QList<QLayoutItem *> itemList;
    83  int m_hSpace;
    84  int m_vSpace;
    85 };
    86 
    87 #endif // FLOWLAYOUT_H
    Definition: flowlayout.h:58
    +
    + + + + diff --git a/docs/html/focusfilter_8h_source.html b/docs/html/focusfilter_8h_source.html new file mode 100644 index 000000000..3db4457d7 --- /dev/null +++ b/docs/html/focusfilter_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Olive: ui/focusfilter.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    focusfilter.h
    +
    +
    +
    1 #ifndef FOCUSFILTER_H
    2 #define FOCUSFILTER_H
    3 
    4 #include <QObject>
    5 
    17 class FocusFilter : public QObject {
    18  Q_OBJECT
    19 public:
    25  FocusFilter();
    26 
    27 public slots:
    33  void cut();
    34 
    40  void copy();
    41 
    47  void duplicate();
    48 
    54  void go_to_in();
    55 
    61  void go_to_out();
    62 
    68  void go_to_start();
    69 
    75  void prev_frame();
    76 
    82  void play_in_to_out();
    83 
    89  void playpause();
    90 
    96  void pause();
    97 
    103  void increase_speed();
    104 
    110  void decrease_speed();
    111 
    117  void next_frame();
    118 
    124  void go_to_end();
    125 
    131  void set_viewer_fullscreen();
    132 
    138  void set_marker();
    139 
    145  void set_in_point();
    146 
    152  void set_out_point();
    153 
    159  void clear_in();
    160 
    166  void clear_out();
    167 
    173  void clear_inout();
    174 
    181  void delete_function();
    182 
    188  void select_all();
    189 
    196  void zoom_in();
    197 
    204  void zoom_out();
    205 };
    206 
    207 namespace Olive {
    208  extern FocusFilter FocusFilter;
    209 }
    210 
    211 #endif // FOCUSFILTER_H
    void cut()
    Cuts selected clips or selected effects (but not both).
    Definition: focusfilter.cpp:233
    +
    void decrease_speed()
    Decrease Speed/Shuttle Left.
    Definition: focusfilter.cpp:123
    +
    void pause()
    Pause/Shuttle Stop.
    Definition: focusfilter.cpp:105
    +
    void go_to_in()
    Go to In Point.
    Definition: focusfilter.cpp:11
    +
    void zoom_out()
    Zoom Out.
    Definition: focusfilter.cpp:220
    +
    void playpause()
    Toggle Play/Pause.
    Definition: focusfilter.cpp:96
    +
    void set_viewer_fullscreen()
    Set currently focused viewer to full screen.
    Definition: focusfilter.cpp:74
    +
    void go_to_end()
    Go to End.
    Definition: focusfilter.cpp:65
    +
    void set_marker()
    Set a marker at the current playhead.
    Definition: focusfilter.cpp:82
    +
    FocusFilter()
    FocusFilter Constructor.
    Definition: focusfilter.cpp:9
    +
    void clear_out()
    Clear out point.
    Definition: focusfilter.cpp:156
    +
    void zoom_in()
    Zoom In.
    Definition: focusfilter.cpp:207
    +
    void increase_speed()
    Increase Speed/Shuttle Right.
    Definition: focusfilter.cpp:114
    +
    void set_in_point()
    Set in point.
    Definition: focusfilter.cpp:132
    +
    void play_in_to_out()
    Play In Point to Out Point.
    Definition: focusfilter.cpp:47
    +
    void prev_frame()
    Go to Previous Frame.
    Definition: focusfilter.cpp:38
    +
    void clear_in()
    Clear in point.
    Definition: focusfilter.cpp:148
    +
    The FocusFilter class.
    Definition: focusfilter.h:17
    +
    void set_out_point()
    Set out point.
    Definition: focusfilter.cpp:140
    +
    void select_all()
    Select All.
    Definition: focusfilter.cpp:198
    +
    void go_to_out()
    Go to Out Point.
    Definition: focusfilter.cpp:20
    +
    void copy()
    Copies selected clips or selected effects (but not both).
    Definition: focusfilter.cpp:244
    +
    void duplicate()
    Duplicates currently selected items.
    Definition: focusfilter.cpp:192
    +
    void go_to_start()
    Go to Start.
    Definition: focusfilter.cpp:29
    +
    void next_frame()
    Go to Next Frame.
    Definition: focusfilter.cpp:56
    +
    void clear_inout()
    Clear in/out point.
    Definition: focusfilter.cpp:164
    +
    void delete_function()
    Delete.
    Definition: focusfilter.cpp:172
    +
    + + + + diff --git a/docs/html/folderclosed.png b/docs/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/docs/html/fontcombobox_8h_source.html b/docs/html/fontcombobox_8h_source.html new file mode 100644 index 000000000..c23b0a816 --- /dev/null +++ b/docs/html/fontcombobox_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: ui/fontcombobox.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    fontcombobox.h
    +
    +
    +
    1 #ifndef FONTCOMBOBOX_H
    2 #define FONTCOMBOBOX_H
    3 
    4 #include "comboboxex.h"
    5 
    6 class FontCombobox : public ComboBoxEx {
    7  Q_OBJECT
    8 public:
    9  FontCombobox(QWidget* parent = 0);
    10  const QString &getPreviousValue();
    11 private slots:
    12  void updateInternals();
    13 private:
    14  QString previousValue;
    15  QString value;
    16 };
    17 
    18 #endif // FONTCOMBOBOX_H
    Definition: fontcombobox.h:6
    +
    Definition: comboboxex.h:7
    +
    + + + + diff --git a/docs/html/footage_8h_source.html b/docs/html/footage_8h_source.html new file mode 100644 index 000000000..956d2cf27 --- /dev/null +++ b/docs/html/footage_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: project/footage.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    footage.h
    +
    +
    +
    1 #ifndef FOOTAGE_H
    2 #define FOOTAGE_H
    3 
    4 #include <QString>
    5 #include <QVector>
    6 #include <QMetaType>
    7 #include <QVariant>
    8 #include <QMutex>
    9 #include <QPixmap>
    10 #include <QIcon>
    11 
    12 #include "project/marker.h"
    13 
    14 enum VideoInterlacingMode {
    15  VIDEO_PROGRESSIVE,
    16  VIDEO_TOP_FIELD_FIRST,
    17  VIDEO_BOTTOM_FIELD_FIRST
    18 };
    19 
    20 struct Sequence;
    21 class Clip;
    22 class PreviewGenerator;
    23 class MediaThrobber;
    24 
    25 struct FootageStream {
    26  int file_index;
    27  int video_width;
    28  int video_height;
    29  bool infinite_length;
    30  double video_frame_rate;
    31  int video_interlacing;
    32  int video_auto_interlacing;
    33  int audio_channels;
    34  int audio_layout;
    35  int audio_frequency;
    36  bool enabled;
    37 
    38  // preview thumbnail/waveform
    39  bool preview_done;
    40  QImage video_preview;
    41  QIcon video_preview_square;
    42  QVector<char> audio_preview;
    43  void make_square_thumb();
    44 };
    45 
    46 struct Footage {
    47  Footage();
    48  ~Footage();
    49 
    50  // footage metadata
    51  QString url;
    52  QString name;
    53  int64_t length;
    54  QVector<FootageStream> video_tracks;
    55  QVector<FootageStream> audio_tracks;
    56  int save_id;
    57  bool ready;
    58  bool invalid;
    59  double speed;
    60  bool alpha_is_premultiplied;
    61 
    62  // proxy config
    63  bool proxy;
    64  QString proxy_path;
    65 
    66  // thumbnail/waveform generation
    67  PreviewGenerator* preview_gen;
    68  QMutex ready_lock;
    69 
    70  // in/out points
    71  bool using_inout;
    72  long in;
    73  long out;
    74 
    75  // markers
    76  QVector<Marker> markers;
    77 
    78  // functions
    79  long get_length_in_frames(double frame_rate);
    80  FootageStream *get_stream_from_file_index(bool video, int index);
    81  void reset();
    82 };
    83 
    84 #endif // FOOTAGE_H
    Definition: sequence.h:13
    +
    Definition: previewgenerator.h:19
    +
    Definition: project.h:111
    +
    Definition: footage.h:25
    +
    Definition: clip.h:33
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/frei0reffect_8h_source.html b/docs/html/frei0reffect_8h_source.html new file mode 100644 index 000000000..d21f60852 --- /dev/null +++ b/docs/html/frei0reffect_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects/internal/frei0reffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    frei0reffect.h
    +
    +
    +
    1 #ifndef FREI0REFFECT_H
    2 #define FREI0REFFECT_H
    3 
    4 #ifndef NOFREI0R
    5 
    6 #include "project/effect.h"
    7 
    8 #include <frei0r.h>
    9 
    10 #include "io/crossplatformlib.h"
    11 
    12 typedef void (*f0rGetParamInfo)(f0r_param_info_t * info,
    13  int param_index );
    14 
    15 class Frei0rEffect : public Effect {
    16  Q_OBJECT
    17 public:
    18  Frei0rEffect(Clip* c, const EffectMeta* em);
    19  ~Frei0rEffect();
    20 
    21  virtual void process_image(double timecode, uint8_t* input, uint8_t* output, int size);
    22 
    23  virtual void refresh();
    24 private:
    25  ModulePtr handle;
    26  f0r_instance_t instance;
    27  int param_count;
    28  f0rGetParamInfo get_param_info;
    29  void destruct_module();
    30  void construct_module();
    31  bool open;
    32 };
    33 
    34 #endif
    35 
    36 #endif // FREI0REFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: frei0reffect.h:15
    +
    + + + + diff --git a/docs/html/functions.html b/docs/html/functions.html new file mode 100644 index 000000000..9a7c52f2d --- /dev/null +++ b/docs/html/functions.html @@ -0,0 +1,472 @@ + + + + + + + +Olive: Class Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all documented class members with links to the class documentation for each member:
    + +

    - a -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

      +
    • windowMenu_About_To_Be_Shown() +: MainWindow +
    • +
    + + +

    - z -

    +
    + + + + diff --git a/docs/html/functions_func.html b/docs/html/functions_func.html new file mode 100644 index 000000000..08a61af4a --- /dev/null +++ b/docs/html/functions_func.html @@ -0,0 +1,450 @@ + + + + + + + +Olive: Class Members - Functions + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

      +
    • windowMenu_About_To_Be_Shown() +: MainWindow +
    • +
    + + +

    - z -

    +
    + + + + diff --git a/docs/html/functions_vars.html b/docs/html/functions_vars.html new file mode 100644 index 000000000..390430ef8 --- /dev/null +++ b/docs/html/functions_vars.html @@ -0,0 +1,92 @@ + + + + + + + +Olive: Class Members - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/docs/html/grapheditor_8h_source.html b/docs/html/grapheditor_8h_source.html new file mode 100644 index 000000000..03311d501 --- /dev/null +++ b/docs/html/grapheditor_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: panels/grapheditor.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    grapheditor.h
    +
    +
    +
    1 #ifndef GRAPHEDITOR_H
    2 #define GRAPHEDITOR_H
    3 
    4 #include <QDockWidget>
    5 
    6 class GraphView;
    7 class TimelineHeader;
    8 class QPushButton;
    9 class EffectRow;
    10 class QHBoxLayout;
    11 class LabelSlider;
    12 class QLabel;
    13 class KeyframeNavigator;
    14 
    15 class GraphEditor : public QDockWidget {
    16  Q_OBJECT
    17 public:
    18  GraphEditor(QWidget* parent = 0);
    19  void update_panel();
    20  void set_row(EffectRow* r);
    21  bool view_is_focused();
    22  bool view_is_under_mouse();
    23  void delete_selected_keys();
    24  void select_all();
    25 private:
    26  GraphView* view;
    27  TimelineHeader* header;
    28  QHBoxLayout* value_layout;
    29  QVector<LabelSlider*> slider_proxies;
    30  QVector<QPushButton*> slider_proxy_buttons;
    31  QVector<LabelSlider*> slider_proxy_sources;
    32  QLabel* current_row_desc;
    33  EffectRow* row;
    34  KeyframeNavigator* keyframe_nav;
    35  QPushButton* linear_button;
    36  QPushButton* bezier_button;
    37  QPushButton* hold_button;
    38 private slots:
    39  void set_key_button_enabled(bool e, int type);
    40  void passthrough_slider_value();
    41  void set_keyframe_type();
    42  void set_field_visibility(bool b);
    43 };
    44 
    45 #endif // GRAPHEDITOR_H
    Definition: keyframenavigator.h:9
    +
    Definition: timelineheader.h:11
    +
    Definition: effectrow.h:17
    +
    Definition: graphview.h:12
    +
    Definition: grapheditor.h:15
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    + + + + diff --git a/docs/html/graphview_8h_source.html b/docs/html/graphview_8h_source.html new file mode 100644 index 000000000..95f434e52 --- /dev/null +++ b/docs/html/graphview_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: ui/graphview.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    graphview.h
    +
    +
    +
    1 #ifndef GRAPHVIEW_H
    2 #define GRAPHVIEW_H
    3 
    4 #include <QWidget>
    5 #include <QVector>
    6 
    7 class EffectRow;
    8 class EffectField;
    9 
    10 QColor get_curve_color(int index, int length);
    11 
    12 class GraphView : public QWidget {
    13  Q_OBJECT
    14 public:
    15  GraphView(QWidget* parent = 0);
    16 
    17  void paintEvent(QPaintEvent *event);
    18  void mousePressEvent(QMouseEvent *event);
    19  void mouseMoveEvent(QMouseEvent *event);
    20  void mouseReleaseEvent(QMouseEvent *event);
    21  void wheelEvent(QWheelEvent *event);
    22 
    23  void set_row(EffectRow* r);
    24 
    25  void set_selected_keyframe_type(int type);
    26  void set_field_visibility(int field, bool b);
    27 
    28  void delete_selected_keys();
    29  void select_all();
    30 signals:
    31  void x_scroll_changed(int);
    32  void y_scroll_changed(int);
    33  void zoom_changed(double);
    34  void selection_changed(bool, int);
    35 private:
    36  int x_scroll;
    37  int y_scroll;
    38  bool mousedown;
    39  int start_x;
    40  int start_y;
    41  double zoom;
    42 
    43  void set_scroll_x(int s);
    44  void set_scroll_y(int s);
    45  void set_zoom(double z);
    46 
    47  int get_screen_x(double);
    48  int get_screen_y(double);
    49  long get_value_x(int);
    50  double get_value_y(int);
    51 
    52  void selection_update();
    53 
    54  QVector<bool> field_visibility;
    55 
    56  QVector<int> selected_keys;
    57  QVector<int> selected_keys_fields;
    58  QVector<long> selected_keys_old_vals;
    59  QVector<double> selected_keys_old_doubles;
    60 
    61  double old_pre_handle_x;
    62  double old_pre_handle_y;
    63  double old_post_handle_x;
    64  double old_post_handle_y;
    65 
    66  int handle_field;
    67  int handle_index;
    68 
    69  bool moved_keys;
    70 
    71  int current_handle;
    72 
    73  void draw_lines(QPainter &p, bool vert);
    74  void draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos);
    75 
    76  EffectRow* row;
    77 
    78  bool rect_select;
    79  int rect_select_x;
    80  int rect_select_y;
    81  int rect_select_w;
    82  int rect_select_h;
    83  int rect_select_offset;
    84 
    85  long visible_in;
    86 
    87  bool click_add;
    88  bool click_add_proc;
    89  EffectField* click_add_field;
    90  int click_add_key;
    91  int click_add_type;
    92 private slots:
    93  void show_context_menu(const QPoint& pos);
    94  void reset_view();
    95  void set_view_to_selection();
    96  void set_view_to_all();
    97  void set_view_to_rect(int x1, double y1, int x2, double y2);
    98 };
    99 
    100 #endif // GRAPHVIEW_H
    Definition: effectrow.h:17
    +
    Definition: graphview.h:12
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/hierarchy.html b/docs/html/hierarchy.html new file mode 100644 index 000000000..d6e41f611 --- /dev/null +++ b/docs/html/hierarchy.html @@ -0,0 +1,273 @@ + + + + + + + +Olive: Class Hierarchy + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Hierarchy
    +
    +
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    +
    [detail level 1234]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     C_AEffect
     C_VstEvent
     C_VstEvents
     C_VstMidiEvent
     C_VstParameterProperties
     C_VstTimeInfo
     CClip
     CComposeSequenceParams
     CConfig
     CCrc32
     CEffectGizmo
     CEffectKeyframe
     CEffectMeta
     CExportParams
     CFootage
     CFootageStream
     CGhost
     CGLTextureCoords
     CMarker
     CMedia
     CProxyInfo
     CQAbstractItemModel
     CQCheckBox
     CQComboBox
     CQDialog
     CQDockWidget
     CQKeySequenceEdit
     CQLabel
     CQLayout
     CQLineEdit
     CQListView
     CQListWidget
     CQMainWindow
     CQObject
     CQOpenGLFunctions
     CQOpenGLWidget
     CQPushButton
     CQScrollArea
     CQScrollBar
     CQSortFilterProxyModel
     CQTextEdit
     CQThread
     CQTreeView
     CQUndoCommand
     CQWidget
     CRuntimeConfig
     CSelection
     CSequence
     CTransitionData
     CVideoCodecParams
     CVSTRect
    +
    +
    + + + + diff --git a/docs/html/index.html b/docs/html/index.html new file mode 100644 index 000000000..02e0495d2 --- /dev/null +++ b/docs/html/index.html @@ -0,0 +1,76 @@ + + + + + + + +Olive: Main Page + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Olive Documentation
    +
    +
    +
    + + + + diff --git a/docs/html/jquery.js b/docs/html/jquery.js new file mode 100644 index 000000000..1ee895ca3 --- /dev/null +++ b/docs/html/jquery.js @@ -0,0 +1,87 @@ +/*! + * jQuery JavaScript Library v1.7.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Mar 21 12:46:34 2012 -0700 + */ +(function(bd,L){var av=bd.document,bu=bd.navigator,bm=bd.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bd.jQuery,bH=bd.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bd.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bd.attachEvent("onload",bF.ready);var b0=false;try{b0=bd.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0!=null&&b0==b0.window},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bd.JSON&&bd.JSON.parse){return bd.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){if(typeof b2!=="string"||!b2){return null}var b0,b1;try{if(bd.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bd.execScript||function(b1){bd["eval"].call(bd,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aK.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aK.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
    a";bH=bv.getElementsByTagName("*");bE=bv.getElementsByTagName("a")[0];if(!bH||!bH.length||!bE){return{}}bF=av.createElement("select");bx=bF.appendChild(av.createElement("option"));bD=bv.getElementsByTagName("input")[0];bI={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bE.getAttribute("style")),hrefNormalized:(bE.getAttribute("href")==="/a"),opacity:/^0.55/.test(bE.style.opacity),cssFloat:!!bE.style.cssFloat,checkOn:(bD.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true,pixelMargin:true};b.boxModel=bI.boxModel=(av.compatMode==="CSS1Compat");bD.checked=true;bI.noCloneChecked=bD.cloneNode(true).checked;bF.disabled=true;bI.optDisabled=!bx.disabled;try{delete bv.test}catch(bB){bI.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bI.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bD=av.createElement("input");bD.value="t";bD.setAttribute("type","radio");bI.radioValue=bD.value==="t";bD.setAttribute("checked","checked");bD.setAttribute("name","t");bv.appendChild(bD);bC=av.createDocumentFragment();bC.appendChild(bv.lastChild);bI.checkClone=bC.cloneNode(true).cloneNode(true).lastChild.checked;bI.appendChecked=bD.checked;bC.removeChild(bD);bC.appendChild(bv);if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bA="on"+by;bw=(bA in bv);if(!bw){bv.setAttribute(bA,"return;");bw=(typeof bv[bA]==="function")}bI[by+"Bubbles"]=bw}}bC.removeChild(bv);bC=bF=bx=bv=bD=null;b(function(){var bM,bV,bW,bU,bO,bP,bR,bL,bK,bQ,bN,e,bT,bS=av.getElementsByTagName("body")[0];if(!bS){return}bL=1;bT="padding:0;margin:0;border:";bN="position:absolute;top:0;left:0;width:1px;height:1px;";e=bT+"0;visibility:hidden;";bK="style='"+bN+bT+"5px solid #000;";bQ="
    ";bM=av.createElement("div");bM.style.cssText=e+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bS.insertBefore(bM,bS.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
    t
    ";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bI.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);if(bd.getComputedStyle){bv.innerHTML="";bR=av.createElement("div");bR.style.width="0";bR.style.marginRight="0";bv.style.width="2px";bv.appendChild(bR);bI.reliableMarginRight=(parseInt((bd.getComputedStyle(bR,null)||{marginRight:0}).marginRight,10)||0)===0}if(typeof bv.style.zoom!=="undefined"){bv.innerHTML="";bv.style.width=bv.style.padding="1px";bv.style.border=0;bv.style.overflow="hidden";bv.style.display="inline";bv.style.zoom=1;bI.inlineBlockNeedsLayout=(bv.offsetWidth===3);bv.style.display="block";bv.style.overflow="visible";bv.innerHTML="
    ";bI.shrinkWrapBlocks=(bv.offsetWidth!==3)}bv.style.cssText=bN+e;bv.innerHTML=bQ;bV=bv.firstChild;bW=bV.firstChild;bO=bV.nextSibling.firstChild.firstChild;bP={doesNotAddBorder:(bW.offsetTop!==5),doesAddBorderForTableAndCells:(bO.offsetTop===5)};bW.style.position="fixed";bW.style.top="20px";bP.fixedPosition=(bW.offsetTop===20||bW.offsetTop===15);bW.style.position=bW.style.top="";bV.style.overflow="hidden";bV.style.position="relative";bP.subtractsBorderForOverflowNotVisible=(bW.offsetTop===-5);bP.doesNotIncludeMarginInBodyOffset=(bS.offsetTop!==bL);if(bd.getComputedStyle){bv.style.marginTop="1%";bI.pixelMargin=(bd.getComputedStyle(bv,null)||{marginTop:0}).marginTop!=="1%"}if(typeof bM.style.zoom!=="undefined"){bM.style.zoom=1}bS.removeChild(bM);bR=bv=bM=null;b.extend(bI,bP)});return bI})();var aT=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA1,null,false)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function a6(bx,bw,by){if(by===L&&bx.nodeType===1){var bv="data-"+bw.replace(aA,"-$1").toLowerCase();by=bx.getAttribute(bv);if(typeof by==="string"){try{by=by==="true"?true:by==="false"?false:by==="null"?null:b.isNumeric(by)?+by:aT.test(by)?b.parseJSON(by):by}catch(bz){}b.data(bx,bw,by)}else{by=L}}return by}function S(bv){for(var e in bv){if(e==="data"&&b.isEmptyObject(bv[e])){continue}if(e!=="toJSON"){return false}}return true}function bj(by,bx,bA){var bw=bx+"defer",bv=bx+"queue",e=bx+"mark",bz=b._data(by,bw);if(bz&&(bA==="queue"||!b._data(by,bv))&&(bA==="mark"||!b._data(by,e))){setTimeout(function(){if(!b._data(by,bv)&&!b._data(by,e)){b.removeData(by,bw,true);bz.fire()}},0)}}b.extend({_mark:function(bv,e){if(bv){e=(e||"fx")+"mark";b._data(bv,e,(b._data(bv,e)||0)+1)}},_unmark:function(by,bx,bv){if(by!==true){bv=bx;bx=by;by=false}if(bx){bv=bv||"fx";var e=bv+"mark",bw=by?0:((b._data(bx,e)||1)-1);if(bw){b._data(bx,e,bw)}else{b.removeData(bx,e,true);bj(bx,bv,"mark")}}},queue:function(bv,e,bx){var bw;if(bv){e=(e||"fx")+"queue";bw=b._data(bv,e);if(bx){if(!bw||b.isArray(bx)){bw=b._data(bv,e,b.makeArray(bx))}else{bw.push(bx)}}return bw||[]}},dequeue:function(by,bx){bx=bx||"fx";var bv=b.queue(by,bx),bw=bv.shift(),e={};if(bw==="inprogress"){bw=bv.shift()}if(bw){if(bx==="fx"){bv.unshift("inprogress")}b._data(by,bx+".run",e);bw.call(by,function(){b.dequeue(by,bx)},e)}if(!bv.length){b.removeData(by,bx+"queue "+bx+".run",true);bj(by,bx,"queue")}}});b.fn.extend({queue:function(e,bv){var bw=2;if(typeof e!=="string"){bv=e;e="fx";bw--}if(arguments.length1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,bv){return b.access(this,b.prop,e,bv,arguments.length>1)},removeProp:function(e){e=b.propFix[e]||e;return this.each(function(){try{this[e]=L;delete this[e]}catch(bv){}})},addClass:function(by){var bA,bw,bv,bx,bz,bB,e;if(b.isFunction(by)){return this.each(function(bC){b(this).addClass(by.call(this,bC,this.className))})}if(by&&typeof by==="string"){bA=by.split(ag);for(bw=0,bv=this.length;bw-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.type]||b.valHooks[bw.nodeName.toLowerCase()];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aV,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aZ:bf)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(by,bA){var bz,bB,bw,e,bv,bx=0;if(bA&&by.nodeType===1){bB=bA.toLowerCase().split(ag);e=bB.length;for(;bx=0)}}})});var be=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/(?:^|\s)hover(\.\S+)?\b/,aP=/^key/,bg=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler;by=bv.selector}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bd,bI])}}for(bC=0;bCbC){bv.push({elem:this,matches:bD.slice(bC)})}for(bJ=0;bJ0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aP.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bg.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}bE.match.globalPOS=bD;var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

    ";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
    ";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(B(bx[0])||B(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||bb.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aH(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aS.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aS="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ah=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,v=/]","i"),o=/checked\s*(?:[^=]|=\s*.checked.)/i,bn=/\/(java|ecma)script/i,aO=/^\s*",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
    ","
    "]}b.fn.extend({text:function(e){return b.access(this,function(bv){return bv===L?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(bv))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(e){return b.access(this,function(by){var bx=this[0]||{},bw=0,bv=this.length;if(by===L){return bx.nodeType===1?bx.innerHTML.replace(ah,""):null}if(typeof by==="string"&&!ae.test(by)&&(b.support.leadingWhitespace||!ar.test(by))&&!ax[(d.exec(by)||["",""])[1].toLowerCase()]){by=by.replace(R,"<$1>");try{for(;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bh(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function D(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function am(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||b.isXMLDoc(by)||!ai.test("<"+by.nodeName+">")?by.cloneNode(true):am(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){aj(by,bz);e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){if(bv[bx]){aj(e[bx],bv[bx])}}}if(bA){s(by,bz);if(bw){e=bh(by);bv=bh(bz);for(bx=0;e[bx];++bx){s(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bI,bw,bv,bx){var bA,bH,bD,bJ=[];bw=bw||av;if(typeof bw.createElement==="undefined"){bw=bw.ownerDocument||bw[0]&&bw[0].ownerDocument||av}for(var bE=0,bG;(bG=bI[bE])!=null;bE++){if(typeof bG==="number"){bG+=""}if(!bG){continue}if(typeof bG==="string"){if(!W.test(bG)){bG=bw.createTextNode(bG)}else{bG=bG.replace(R,"<$1>");var bN=(d.exec(bG)||["",""])[1].toLowerCase(),bz=ax[bN]||ax._default,bK=bz[0],bB=bw.createElement("div"),bL=ac.childNodes,bM;if(bw===av){ac.appendChild(bB)}else{a(bw).appendChild(bB)}bB.innerHTML=bz[1]+bG+bz[2];while(bK--){bB=bB.lastChild}if(!b.support.tbody){var by=v.test(bG),e=bN==="table"&&!by?bB.firstChild&&bB.firstChild.childNodes:bz[1]===""&&!by?bB.childNodes:[];for(bD=e.length-1;bD>=0;--bD){if(b.nodeName(e[bD],"tbody")&&!e[bD].childNodes.length){e[bD].parentNode.removeChild(e[bD])}}}if(!b.support.leadingWhitespace&&ar.test(bG)){bB.insertBefore(bw.createTextNode(ar.exec(bG)[0]),bB.firstChild)}bG=bB.childNodes;if(bB){bB.parentNode.removeChild(bB);if(bL.length>0){bM=bL[bL.length-1];if(bM&&bM.parentNode){bM.parentNode.removeChild(bM)}}}}}var bF;if(!b.support.appendChecked){if(bG[0]&&typeof(bF=bG.length)==="number"){for(bD=0;bD1)};b.extend({cssHooks:{opacity:{get:function(bw,bv){if(bv){var e=Z(bw,"opacity");return e===""?"1":e}else{return bw.style.opacity}}}},cssNumber:{fillOpacity:true,fontWeight:true,lineHeight:true,opacity:true,orphans:true,widows:true,zIndex:true,zoom:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bx,bw,bD,by){if(!bx||bx.nodeType===3||bx.nodeType===8||!bx.style){return}var bB,bC,bz=b.camelCase(bw),bv=bx.style,bE=b.cssHooks[bz];bw=b.cssProps[bz]||bz;if(bD!==L){bC=typeof bD;if(bC==="string"&&(bB=I.exec(bD))){bD=(+(bB[1]+1)*+bB[2])+parseFloat(b.css(bx,bw));bC="number"}if(bD==null||bC==="number"&&isNaN(bD)){return}if(bC==="number"&&!b.cssNumber[bz]){bD+="px"}if(!bE||!("set" in bE)||(bD=bE.set(bx,bD))!==L){try{bv[bw]=bD}catch(bA){}}}else{if(bE&&"get" in bE&&(bB=bE.get(bx,false,by))!==L){return bB}return bv[bw]}},css:function(by,bx,bv){var bw,e;bx=b.camelCase(bx);e=b.cssHooks[bx];bx=b.cssProps[bx]||bx;if(bx==="cssFloat"){bx="float"}if(e&&"get" in e&&(bw=e.get(by,true,bv))!==L){return bw}else{if(Z){return Z(by,bx)}}},swap:function(by,bx,bz){var e={},bw,bv;for(bv in bx){e[bv]=by.style[bv];by.style[bv]=bx[bv]}bw=bz.call(by);for(bv in bx){by.style[bv]=e[bv]}return bw}});b.curCSS=b.css;if(av.defaultView&&av.defaultView.getComputedStyle){aJ=function(bA,bw){var bv,bz,e,by,bx=bA.style;bw=bw.replace(y,"-$1").toLowerCase();if((bz=bA.ownerDocument.defaultView)&&(e=bz.getComputedStyle(bA,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(bA.ownerDocument.documentElement,bA)){bv=b.style(bA,bw)}}if(!b.support.pixelMargin&&e&&aE.test(bw)&&a1.test(bv)){by=bx.width;bx.width=bv;bv=e.width;bx.width=by}return bv}}if(av.documentElement.currentStyle){aY=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv==null&&bx&&(by=bx[bw])){bv=by}if(a1.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":bv;bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aJ||aY;function af(by,bw,bv){var bz=bw==="width"?by.offsetWidth:by.offsetHeight,bx=bw==="width"?1:0,e=4;if(bz>0){if(bv!=="border"){for(;bx=1&&b.trim(bw.replace(al,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=al.test(bw)?bw.replace(al,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bv,e){return b.swap(bv,{display:"inline-block"},function(){if(e){return Z(bv,"margin-right")}else{return bv.style.marginRight}})}}}});if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bw){var bv=bw.offsetWidth,e=bw.offsetHeight;return(bv===0&&e===0)||(!b.support.reliableHiddenOffsets&&((bw.style&&bw.style.display)||b.css(bw,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}b.each({margin:"",padding:"",border:"Width"},function(e,bv){b.cssHooks[e+bv]={expand:function(by){var bx,bz=typeof by==="string"?by.split(" "):[by],bw={};for(bx=0;bx<4;bx++){bw[e+G[bx]+bv]=bz[bx]||bz[bx-2]||bz[0]}return bw}}});var k=/%20/g,ap=/\[\]$/,bs=/\r?\n/g,bq=/#.*$/,aD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,a0=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aN=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,aR=/^(?:GET|HEAD)$/,c=/^\/\//,M=/\?/,a7=/)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,z=b.fn.load,aa={},q={},aF,r,aW=["*/"]+["*"];try{aF=bm.href}catch(aw){aF=av.createElement("a");aF.href="";aF=aF.href}r=K.exec(aF.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
    ").append(bD.replace(a7,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||a0.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){an(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}an(bv,e);return bv},ajaxSettings:{url:aF,isLocal:aN.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bd.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(q),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bk(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=F(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,r[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=r[1]||bI[2]!=r[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aX(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aR.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aW+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aX(q,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){u(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function u(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{u(bw+"["+(typeof bz==="object"?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&b.type(by)==="object"){for(var e in by){u(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bk(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function F(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!ba){ba=av.createElement("iframe");ba.frameBorder=ba.width=ba.height=0}e.appendChild(ba);if(!m||!ba.createElement){m=(ba.contentWindow||ba.contentDocument).document;m.write((b.support.boxModel?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(ba)}Q[bx]=bw}return Q[bx]}var a8,V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){a8=function(by,bH,bw,bB){try{bB=by.getBoundingClientRect()}catch(bF){}if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aL(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{a8=function(bz,bE,bx){var bC,bw=bz.offsetParent,bv=bz,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.fn.offset=function(e){if(arguments.length){return e===L?this:this.each(function(bx){b.offset.setOffset(this,e,bx)})}var bv=this[0],bw=bv&&bv.ownerDocument;if(!bw){return null}if(bv===bw.body){return b.offset.bodyOffset(bv)}return a8(bv,bw,bw.documentElement)};b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(bw,bv){var e=/Y/.test(bv);b.fn[bw]=function(bx){return b.access(this,function(by,bB,bA){var bz=aL(by);if(bA===L){return bz?(bv in bz)?bz[bv]:b.support.boxModel&&bz.document.documentElement[bB]||bz.document.body[bB]:by[bB]}if(bz){bz.scrollTo(!e?bA:b(bz).scrollLeft(),e?bA:b(bz).scrollTop())}else{by[bB]=bA}},bw,bx,arguments.length,null)}});function aL(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each({Height:"height",Width:"width"},function(bw,bx){var bv="client"+bw,e="scroll"+bw,by="offset"+bw;b.fn["inner"+bw]=function(){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,"padding")):this[bx]():null};b.fn["outer"+bw]=function(bA){var bz=this[0];return bz?bz.style?parseFloat(b.css(bz,bx,bA?"margin":"border")):this[bx]():null};b.fn[bx]=function(bz){return b.access(this,function(bC,bB,bD){var bF,bE,bG,bA;if(b.isWindow(bC)){bF=bC.document;bE=bF.documentElement[bv];return b.support.boxModel&&bE||bF.body&&bF.body[bv]||bE}if(bC.nodeType===9){bF=bC.documentElement;if(bF[bv]>=bF[e]){return bF[bv]}return Math.max(bC.body[e],bF[e],bC.body[by],bF[by])}if(bD===L){bG=b.css(bC,bB);bA=parseFloat(bG);return b.isNumeric(bA)?bA:bG}b(bC).css(bB,bD)},bx,bz,arguments.length,null)}});bd.jQuery=bd.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/*! + * jQuery UI 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI + */ +(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/*! + * jQuery UI Widget 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ +(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/*! + * jQuery UI Mouse 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Mouse + * + * Depends: + * jquery.ui.widget.js + */ +(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
    ').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
    ');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/*! + * jQuery hashchange event - v1.3 - 7/21/2010 + * http://benalman.com/projects/jquery-hashchange-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' + + + + +
    +
    +
    keyframe.h
    +
    +
    +
    1 #ifndef KEYFRAME_H
    2 #define KEYFRAME_H
    3 
    4 #include <QVariant>
    5 
    6 class EffectField;
    7 
    9 public:
    11 
    12  long time;
    13  int type;
    14  QVariant data;
    15 
    16  // only for bezier type
    17  double pre_handle_x;
    18  double pre_handle_y;
    19  double post_handle_x;
    20  double post_handle_y;
    21 };
    22 
    23 void delete_keyframes(QVector<EffectField *> &selected_key_fields, QVector<int> &selected_keys);
    24 
    25 #endif // KEYFRAME_H
    Definition: keyframe.h:8
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/keyframedrawing_8h_source.html b/docs/html/keyframedrawing_8h_source.html new file mode 100644 index 000000000..001f2bf4c --- /dev/null +++ b/docs/html/keyframedrawing_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/keyframedrawing.h Source File + + + + + + + + + +
    +
    +
    + + + + + +
    +
    Olive +
    +
    + + + + + + + + + +
    +
    + + +
    + +
    + + + +
    +
    +
    keyframedrawing.h
    +
    +
    +
    1 #ifndef KEYFRAMEDRAWING_H
    2 #define KEYFRAMEDRAWING_H
    3 
    4 #include <QPainter>
    5 
    6 #define KEYFRAME_SIZE 6
    7 #define KEYFRAME_COLOR 160
    8 
    9 class EffectRow;
    10 
    11 void draw_keyframe(QPainter &p, int type, int x, int y, bool darker, int r = KEYFRAME_COLOR, int g = KEYFRAME_COLOR, int b = KEYFRAME_COLOR);
    12 long adjust_row_keyframe(EffectRow* row, long time, long visible_in);
    13 
    14 #endif // KEYFRAMEDRAWING_H
    Definition: effectrow.h:17
    +
    + + + + diff --git a/docs/html/keyframenavigator_8h_source.html b/docs/html/keyframenavigator_8h_source.html new file mode 100644 index 000000000..b2daab8ce --- /dev/null +++ b/docs/html/keyframenavigator_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/keyframenavigator.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    keyframenavigator.h
    +
    +
    +
    1 #ifndef KEYFRAMENAVIGATOR_H
    2 #define KEYFRAMENAVIGATOR_H
    3 
    4 #include <QWidget>
    5 
    6 class QHBoxLayout;
    7 class QPushButton;
    8 
    9 class KeyframeNavigator : public QWidget
    10 {
    11  Q_OBJECT
    12 public:
    13  KeyframeNavigator(QWidget* parent = 0, bool addLeftPad = true);
    15  void enable_keyframes(bool);
    16  void enable_keyframe_toggle(bool);
    17 signals:
    18  void goto_previous_key();
    19  void toggle_key();
    20  void goto_next_key();
    21  void keyframe_enabled_changed(bool);
    22  void clicked();
    23 private slots:
    24  void keyframe_ui_enabled(bool);
    25 private:
    26  QHBoxLayout* key_controls;
    27  QPushButton* left_key_nav;
    28  QPushButton* key_addremove;
    29  QPushButton* right_key_nav;
    30  QPushButton* keyframe_enable;
    31 };
    32 
    33 #endif // KEYFRAMENAVIGATOR_H
    Definition: keyframenavigator.h:9
    +
    + + + + diff --git a/docs/html/keyframeview_8h_source.html b/docs/html/keyframeview_8h_source.html new file mode 100644 index 000000000..07df8ac0d --- /dev/null +++ b/docs/html/keyframeview_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: ui/keyframeview.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    keyframeview.h
    +
    +
    +
    1 #ifndef KEYFRAMEVIEW_H
    2 #define KEYFRAMEVIEW_H
    3 
    4 #include <QWidget>
    5 #include <QPainter>
    6 
    7 class Clip;
    8 class Effect;
    9 class EffectRow;
    10 class EffectField;
    11 class TimelineHeader;
    12 
    13 class KeyframeView : public QWidget {
    14  Q_OBJECT
    15 public:
    16  KeyframeView(QWidget* parent = 0);
    17 
    18  void delete_selected_keyframes();
    19 
    20  TimelineHeader* header;
    21 
    22  long visible_in;
    23  long visible_out;
    24 signals:
    25  void wheel_event_signal(QWheelEvent*);
    26 public slots:
    27  void set_x_scroll(int);
    28  void set_y_scroll(int);
    29  void resize_move(double d);
    30 private:
    31  QVector<EffectField*> selected_fields;
    32  QVector<int> selected_keyframes;
    33  QVector<int> rowY;
    34  QVector<EffectRow*> rows;
    35  QVector<long> old_key_vals;
    36  void mousePressEvent(QMouseEvent* event);
    37  void mouseMoveEvent(QMouseEvent* event);
    38  void mouseReleaseEvent(QMouseEvent *event);
    39  void paintEvent(QPaintEvent *event);
    40  void wheelEvent(QWheelEvent* e);
    41  bool mousedown;
    42  bool dragging;
    43  bool keys_selected;
    44  bool select_rect;
    45  bool scroll_drag;
    46 
    47  bool keyframeIsSelected(EffectField *field, int keyframe);
    48 
    49  long drag_frame_start;
    50  long last_frame_diff;
    51  int rect_select_x;
    52  int rect_select_y;
    53  int rect_select_w;
    54  int rect_select_h;
    55  int rect_select_offset;
    56 
    57  int x_scroll;
    58  int y_scroll;
    59 
    60  void update_keys();
    61 private slots:
    62  void show_context_menu(const QPoint& pos);
    63  void menu_set_key_type(QAction*);
    64 };
    65 
    66 #endif // KEYFRAMEVIEW_H
    Definition: keyframeview.h:13
    +
    Definition: effect.h:146
    +
    Definition: timelineheader.h:11
    +
    Definition: effectrow.h:17
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/labelslider_8h_source.html b/docs/html/labelslider_8h_source.html new file mode 100644 index 000000000..0cf579c29 --- /dev/null +++ b/docs/html/labelslider_8h_source.html @@ -0,0 +1,99 @@ + + + + + + + +Olive: ui/labelslider.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    labelslider.h
    +
    +
    +
    1 #ifndef LABELSLIDER_H
    2 #define LABELSLIDER_H
    3 
    4 #include <QLabel>
    5 #include <QUndoCommand>
    6 
    7 enum LabelSliderDisplayType {
    8  LABELSLIDER_NORMAL,
    9  LABELSLIDER_FRAMENUMBER,
    10  LABELSLIDER_PERCENT,
    11  LABELSLIDER_DECIBEL
    12 };
    13 
    20 class LabelSlider : public QLabel
    21 {
    22  Q_OBJECT
    23 public:
    24  LabelSlider(QWidget* parent = nullptr);
    25 
    34  void set_frame_rate(double d);
    35 
    50  void set_display_type(int type);
    51 
    64  void set_value(double v, bool userSet);
    65 
    75  void set_default_value(double v);
    76 
    87  void set_minimum_value(double v);
    88 
    99  void set_maximum_value(double v);
    100 
    106  double value();
    107 
    119  bool is_set();
    120 
    125  bool is_dragging();
    126 
    131  QString valueToString();
    132 
    142  double getPreviousValue();
    143 
    150  void set_previous_value();
    151 
    158  void set_color(QString c = nullptr);
    159 
    166 protected:
    167  void mousePressEvent(QMouseEvent *ev);
    168  void mouseMoveEvent(QMouseEvent *ev);
    169  void mouseReleaseEvent(QMouseEvent *ev);
    170 private:
    171  double default_value;
    172  double internal_value;
    173  double drag_start_value;
    174  double previous_value;
    175 
    176  bool min_enabled;
    177  double min_value;
    178  bool max_enabled;
    179  double max_value;
    180 
    181  bool drag_start;
    182  bool drag_proc;
    183  int drag_start_x;
    184  int drag_start_y;
    185 
    186  bool set;
    187 
    188  int display_type;
    189 
    190  double frame_rate;
    191 
    195  void set_default_cursor();
    196 
    200  void set_active_cursor();
    201 signals:
    207  void valueChanged();
    208 
    214  void clicked();
    215 };
    216 
    217 #endif // LABELSLIDER_H
    void set_display_type(int type)
    Sets the way to display the value.
    Definition: labelslider.cpp:35
    +
    void set_maximum_value(double v)
    Set the maximum value.
    Definition: labelslider.cpp:126
    +
    void set_default_value(double v)
    Set the default value.
    Definition: labelslider.cpp:113
    +
    bool is_dragging()
    Returns whether the user is currently dragging.
    Definition: labelslider.cpp:60
    +
    void clicked()
    clicked signal
    +
    void set_minimum_value(double v)
    Set the minimum value.
    Definition: labelslider.cpp:121
    +
    void set_color(QString c=nullptr)
    Set the display color.
    Definition: labelslider.cpp:104
    +
    void set_value(double v, bool userSet)
    Set the value.
    Definition: labelslider.cpp:40
    +
    bool is_set()
    Returns whether a value has been set or not.
    Definition: labelslider.cpp:56
    +
    void set_previous_value()
    Updates previous value.
    Definition: labelslider.cpp:100
    +
    double getPreviousValue()
    Returns whatever value was set before the last set_value()
    Definition: labelslider.cpp:96
    +
    void set_frame_rate(double d)
    Set the display frame rate.
    Definition: labelslider.cpp:31
    +
    int decimal_places
    Set how many decimal places to show for a floating-point number.
    Definition: labelslider.h:165
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    void valueChanged()
    valueChanged signal
    +
    double value()
    Returns the internal value as a double.
    Definition: labelslider.cpp:109
    +
    void set_active_cursor()
    Internal function to set the cursor while dragging (usually NoCursor aka invisible)
    Definition: labelslider.cpp:319
    +
    void set_default_cursor()
    Internal function to set the standard cursor (usually SizeHorCursor)
    Definition: labelslider.cpp:315
    +
    QString valueToString()
    Convert the internal value to a displayed string according to display_type
    Definition: labelslider.cpp:64
    +
    + + + + diff --git a/docs/html/linearfadetransition_8h_source.html b/docs/html/linearfadetransition_8h_source.html new file mode 100644 index 000000000..c52c27293 --- /dev/null +++ b/docs/html/linearfadetransition_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects/internal/linearfadetransition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    linearfadetransition.h
    +
    +
    +
    1 #ifndef LINEARFADETRANSITION_H
    2 #define LINEARFADETRANSITION_H
    3 
    4 #include "project/transition.h"
    5 
    7 public:
    8  LinearFadeTransition(Clip* c, Clip* s, const EffectMeta* em);
    9  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    10 };
    11 
    12 #endif // LINEARFADETRANSITION_H
    Definition: linearfadetransition.h:6
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/loaddialog_8h_source.html b/docs/html/loaddialog_8h_source.html new file mode 100644 index 000000000..641e80b33 --- /dev/null +++ b/docs/html/loaddialog_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: dialogs/loaddialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    loaddialog.h
    +
    +
    +
    1 #ifndef LOADDIALOG_H
    2 #define LOADDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class QProgressBar;
    7 struct Sequence;
    8 class Media;
    9 struct Footage;
    10 class QHBoxLayout;
    11 class LoadThread;
    12 
    13 class LoadDialog : public QDialog
    14 {
    15  Q_OBJECT
    16 public:
    17  LoadDialog(QWidget* parent, bool autorecovery);
    18 private slots:
    19  void cancel();
    20  void die();
    21  void thread_done();
    22 private:
    23  QProgressBar* bar;
    24  QPushButton* cancel_button;
    25  QHBoxLayout* hboxLayout;
    26  LoadThread* lt;
    27 };
    28 
    29 #endif // LOADDIALOG_H
    Definition: loadthread.h:19
    +
    Definition: sequence.h:13
    +
    Definition: loaddialog.h:13
    +
    Definition: media.h:20
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/loadthread_8h_source.html b/docs/html/loadthread_8h_source.html new file mode 100644 index 000000000..00152864c --- /dev/null +++ b/docs/html/loadthread_8h_source.html @@ -0,0 +1,88 @@ + + + + + + + +Olive: io/loadthread.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    loadthread.h
    +
    +
    +
    1 #ifndef LOADTHREAD_H
    2 #define LOADTHREAD_H
    3 
    4 #include <QThread>
    5 #include <QDir>
    6 #include <QXmlStreamReader>
    7 #include <QMutex>
    8 #include <QWaitCondition>
    9 #include <QMessageBox>
    10 
    11 class Media;
    12 struct Footage;
    13 class Clip;
    14 struct Sequence;
    15 class LoadDialog;
    16 struct TransitionData;
    17 struct EffectMeta;
    18 
    19 class LoadThread : public QThread
    20 {
    21  Q_OBJECT
    22 public:
    23  LoadThread(LoadDialog* l, bool a);
    24  void run();
    25  void cancel();
    26 signals:
    27  void start_question(const QString &title, const QString &text, int buttons);
    28  void success();
    29  void error();
    30  void start_create_effect_ui(QXmlStreamReader* stream, Clip* c, int type, const QString *effect_name, const EffectMeta* meta, long effect_length, bool effect_enabled);
    31  void start_create_dual_transition(const TransitionData* td, Clip* primary, Clip* secondary, const EffectMeta* meta);
    32  void report_progress(int p);
    33 private slots:
    34  void question_func(const QString &title, const QString &text, int buttons);
    35  void error_func();
    36  void success_func();
    37  void create_effect_ui(QXmlStreamReader* stream, Clip* c, int type, const QString *effect_name, const EffectMeta* meta, long effect_length, bool effect_enabled);
    38  void create_dual_transition(const TransitionData* td, Clip* primary, Clip* secondary, const EffectMeta* meta);
    39 private:
    40  LoadDialog* ld;
    41  bool autorecovery;
    42 
    43  bool load_worker(QFile& f, QXmlStreamReader& stream, int type);
    44  void load_effect(QXmlStreamReader& stream, Clip* c);
    45 
    46  void read_next(QXmlStreamReader& stream);
    47  void read_next_start_element(QXmlStreamReader& stream);
    48  void update_current_element_count(QXmlStreamReader& stream);
    49 
    50  Sequence* open_seq;
    51  QVector<Media*> loaded_media_items;
    52  QDir proj_dir;
    53  QDir internal_proj_dir;
    54  QString internal_proj_url;
    55  bool show_err;
    56  QString error_str;
    57 
    58  bool is_element(QXmlStreamReader& stream);
    59 
    60  QVector<Media*> loaded_folders;
    61  QVector<Clip*> loaded_clips;
    62  QVector<Media*> loaded_sequences;
    63  Media* find_loaded_folder_by_id(int id);
    64 
    65  int current_element_count;
    66  int total_element_count;
    67 
    68  QMutex mutex;
    69  QWaitCondition waitCond;
    70 
    71  bool cancelled;
    72  bool xml_error;
    73 
    74  QMessageBox::StandardButton question_btn;
    75 };
    76 
    77 #endif // LOADTHREAD_H
    Definition: loadthread.h:19
    +
    Definition: sequence.h:13
    +
    Definition: effect.h:27
    +
    Definition: loadthread.cpp:21
    +
    Definition: loaddialog.h:13
    +
    Definition: media.h:20
    +
    Definition: clip.h:33
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/logarithmicfadetransition_8h_source.html b/docs/html/logarithmicfadetransition_8h_source.html new file mode 100644 index 000000000..09e2e3081 --- /dev/null +++ b/docs/html/logarithmicfadetransition_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects/internal/logarithmicfadetransition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    logarithmicfadetransition.h
    +
    +
    +
    1 #ifndef LOGARITHMICFADETRANSITION_H
    2 #define LOGARITHMICFADETRANSITION_H
    3 
    4 #include "project/transition.h"
    5 
    7 public:
    9  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    10 };
    11 
    12 #endif // LOGARITHMICFADETRANSITION_H
    Definition: effect.h:27
    +
    Definition: logarithmicfadetransition.h:6
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/mainwindow_8h_source.html b/docs/html/mainwindow_8h_source.html new file mode 100644 index 000000000..d992164c2 --- /dev/null +++ b/docs/html/mainwindow_8h_source.html @@ -0,0 +1,100 @@ + + + + + + + +Olive: mainwindow.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    mainwindow.h
    +
    +
    +
    1 #ifndef MAINWINDOW_H
    2 #define MAINWINDOW_H
    3 
    4 #include <QMainWindow>
    5 
    6 class Project;
    7 class EffectControls;
    8 class Viewer;
    9 class Timeline;
    10 
    11 class MainWindow : public QMainWindow {
    12  Q_OBJECT
    13 public:
    14  explicit MainWindow(QWidget *parent);
    15  virtual ~MainWindow() override;
    16 
    25  void updateTitle();
    26 
    37  void load_shortcuts(const QString &fn);
    38 
    48  void save_shortcuts(const QString &fn);
    49 
    57  void load_css_from_file(const QString& fn);
    58 
    59 public slots:
    65  void toggle_full_screen();
    66 
    67 signals:
    73  void finished_first_paint();
    74 
    75 protected:
    83  virtual void closeEvent(QCloseEvent *) override;
    84 
    90  virtual void paintEvent(QPaintEvent *) override;
    91 
    92 private slots:
    99  void maximize_panel();
    100 
    106  void reset_layout();
    107 
    114 
    121 
    128 
    135 
    143 
    150 
    158 
    159 private:
    171  void setup_layout(bool reset);
    172 
    179  void setup_menus();
    180 
    181  // menu bar menus
    182  QMenu* window_menu;
    183 
    184  // file menu actions
    185  QMenu* open_recent;
    186  QAction* clear_open_recent_action;
    187 
    188  // view menu actions
    189  QAction* track_lines;
    190  QAction* frames_action;
    191  QAction* drop_frame_action;
    192  QAction* nondrop_frame_action;
    193  QAction* milliseconds_action;
    194  QAction* no_autoscroll;
    195  QAction* page_autoscroll;
    196  QAction* smooth_autoscroll;
    197  QAction* title_safe_off;
    198  QAction* title_safe_default;
    199  QAction* title_safe_43;
    200  QAction* title_safe_169;
    201  QAction* title_safe_custom;
    202  QAction* full_screen;
    203  QAction* show_all;
    204 
    205  // tool menu actions
    206  QAction* pointer_tool_action;
    207  QAction* edit_tool_action;
    208  QAction* ripple_tool_action;
    209  QAction* razor_tool_action;
    210  QAction* slip_tool_action;
    211  QAction* slide_tool_action;
    212  QAction* hand_tool_action;
    213  QAction* transition_tool_action;
    214  QAction* snap_toggle;
    215  QAction* selecting_also_seeks;
    216  QAction* edit_tool_also_seeks;
    217  QAction* edit_tool_selects_links;
    218  QAction* seek_to_end_of_pastes;
    219  QAction* scroll_wheel_zooms;
    220  QAction* rectified_waveforms;
    221  QAction* enable_drag_files_to_timeline;
    222  QAction* autoscale_by_default;
    223  QAction* enable_seek_to_import;
    224  QAction* enable_audio_scrubbing;
    225  QAction* enable_drop_on_media_to_replace;
    226  QAction* enable_hover_focus;
    227  QAction* set_name_and_marker;
    228  QAction* loop_action;
    229  QAction* seek_also_selects;
    230 
    231  // edit menu actions
    232  QAction* undo_action;
    233  QAction* redo_action;
    234 
    235  // used to store the panel state when one panel is maximized
    236  QByteArray temp_panel_state;
    237 
    238  // used in paintEvent() to determine the first paintEvent() performed
    239  bool first_show;
    240 };
    241 
    242 namespace Olive {
    243  extern MainWindow* MainWindow;
    244 }
    245 
    246 #endif // MAINWINDOW_H
    void updateTitle()
    Update window title.
    Definition: mainwindow.cpp:733
    +
    void fileMenu_About_To_Be_Shown()
    Function to prepare File menu.
    Definition: mainwindow.cpp:914
    +
    void windowMenu_About_To_Be_Shown()
    Function to prepare Window menu.
    Definition: mainwindow.cpp:832
    +
    void toggle_full_screen()
    Toggles full screen mode.
    Definition: mainwindow.cpp:932
    +
    virtual void closeEvent(QCloseEvent *) override
    Close event.
    Definition: mainwindow.cpp:740
    +
    void load_shortcuts(const QString &fn)
    Load shortcut file.
    Definition: mainwindow.cpp:289
    +
    Definition: timeline.h:71
    +
    void finished_first_paint()
    Signal emitted once when the main window has finished initializing.
    +
    void load_css_from_file(const QString &fn)
    Load a CSS/QSS style from file to customize Olive's interface.
    Definition: mainwindow.cpp:320
    +
    void editMenu_About_To_Be_Shown()
    Function to prepare Edit menu.
    Definition: mainwindow.cpp:331
    +
    void viewMenu_About_To_Be_Shown()
    Function to prepare View menu.
    Definition: mainwindow.cpp:846
    +
    virtual void paintEvent(QPaintEvent *) override
    Paint event.
    Definition: mainwindow.cpp:789
    +
    Definition: effectcontrols.h:32
    +
    Definition: project.h:40
    +
    void setup_menus()
    Initialize menu bar menus and items.
    Definition: mainwindow.cpp:336
    +
    void toolMenu_About_To_Be_Shown()
    Function to prepare Tools menu.
    Definition: mainwindow.cpp:873
    +
    void toggle_panel_visibility()
    Toggle whether a panel is visible or not.
    Definition: mainwindow.cpp:904
    +
    void maximize_panel()
    Maximizes the currently hovered panel.
    Definition: mainwindow.cpp:804
    +
    void reset_layout()
    Reset panel layout to default.
    Definition: mainwindow.cpp:798
    +
    void playbackMenu_About_To_Be_Shown()
    Function to prepare Playback menu.
    Definition: mainwindow.cpp:842
    +
    Definition: viewer.h:25
    +
    void setup_layout(bool reset)
    Internal function for setting the panel layout to a predetermined preset.
    Definition: mainwindow.cpp:51
    +
    Definition: mainwindow.h:11
    +
    void save_shortcuts(const QString &fn)
    Save shortcut file.
    Definition: mainwindow.cpp:303
    +
    + + + + diff --git a/docs/html/marker_8h_source.html b/docs/html/marker_8h_source.html new file mode 100644 index 000000000..3e99d4e21 --- /dev/null +++ b/docs/html/marker_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: project/marker.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    marker.h
    +
    +
    +
    1 #ifndef MARKER_H
    2 #define MARKER_H
    3 
    4 #define MARKER_SIZE 4
    5 
    6 #include <QString>
    7 #include <QPainter>
    8 
    9 struct Sequence;
    10 
    11 struct Marker {
    12  long frame;
    13  QString name;
    14 };
    15 
    16 void draw_marker(QPainter& p, int x, int y, int bottom, bool selected);
    17 
    18 void set_marker_internal(Sequence* seq, const QVector<int>& clips);
    19 void set_marker_internal(Sequence* seq);
    20 
    21 #endif // MARKER_H
    Definition: sequence.h:13
    +
    Definition: marker.h:11
    +
    + + + + diff --git a/docs/html/math_8h_source.html b/docs/html/math_8h_source.html new file mode 100644 index 000000000..7f4f4f4e4 --- /dev/null +++ b/docs/html/math_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: io/math.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    math.h
    +
    +
    +
    1 #ifndef MATH_H
    2 #define MATH_H
    3 
    4 int lerp(int a, int b, double t);
    5 float float_lerp(float a, float b, float t);
    6 double double_lerp(double a, double b, double t);
    7 double quad_from_t(double a, double b, double c, double t);
    8 double quad_t_from_x(double x, double a, double b, double c);
    9 double cubic_from_t(double a, double b, double c, double d, double t);
    10 double cubic_t_from_x(double x_target, double a, double b, double c, double d);
    11 double solveCubicBezier(double p0, double p1, double p2, double p3, double x);
    12 
    13 // decibel conversion functions
    14 double amplitude_to_db(double amplitude);
    15 double db_to_amplitude(double db);
    16 
    17 #endif // MATH_H
    + + + + diff --git a/docs/html/md__r_e_a_d_m_e.html b/docs/html/md__r_e_a_d_m_e.html new file mode 100644 index 000000000..dc08abe6b --- /dev/null +++ b/docs/html/md__r_e_a_d_m_e.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: Olive Video Editor + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Olive Video Editor
    +
    +
    +

    Olive is a free non-linear video editor for Windows, macOS, and Linux.

    +

    Discover more and download binaries at: https://www.olivevideoeditor.org/

    +

    Please consider supporting Olive:

    +

    Become a Patron +

    +

    Compiling instructions for Windows, macOS, and Linux can be found on the main site.

    +
    +
    + + + + diff --git a/docs/html/media_8h_source.html b/docs/html/media_8h_source.html new file mode 100644 index 000000000..7ae6985d4 --- /dev/null +++ b/docs/html/media_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: project/media.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    media.h
    +
    +
    +
    1 #ifndef MEDIA_H
    2 #define MEDIA_H
    3 
    4 #include <QList>
    5 #include <QVariant>
    6 
    7 #include "project/marker.h"
    8 
    9 enum MediaType {
    10  MEDIA_TYPE_FOOTAGE,
    11  MEDIA_TYPE_SEQUENCE,
    12  MEDIA_TYPE_FOLDER
    13 };
    14 
    15 struct Footage;
    16 class MediaThrobber;
    17 struct Sequence;
    18 #include <QIcon>
    19 
    20 class Media
    21 {
    22 public:
    23  Media(Media* iparent);
    24  ~Media();
    25  Footage *to_footage();
    26  Sequence* to_sequence();
    27  void set_footage(Footage* f);
    28  void set_sequence(Sequence* s);
    29  void set_folder();
    30  void set_icon(const QIcon &ico);
    31  void set_parent(Media* p);
    32  void update_tooltip(const QString& error = 0);
    33  void *to_object();
    34  int get_type();
    35  const QString& get_name();
    36  void set_name(const QString& n);
    37  MediaThrobber* throbber;
    38 
    39  double get_frame_rate(int stream = -1);
    40  int get_sampling_rate(int stream = -1);
    41 
    42  // item functions
    43  void appendChild(Media *child);
    44  bool setData(int col, const QVariant &value);
    45  Media *child(int row);
    46  int childCount() const;
    47  int columnCount() const;
    48  QVariant data(int column, int role);
    49  int row() const;
    50  Media *parentItem();
    51  void removeChild(int i);
    52 
    53  // get markers from internal object
    54  QVector<Marker>& get_markers();
    55 
    56  bool root;
    57  int temp_id;
    58  int temp_id2;
    59 private:
    60  int type;
    61  void* object;
    62 
    63  // item functions
    64  QList<Media*> children;
    65  Media* parent;
    66  QString folder_name;
    67  QString tooltip;
    68  QIcon icon;
    69 };
    70 
    71 #endif // MEDIA_H
    Definition: sequence.h:13
    +
    Definition: media.h:20
    +
    Definition: project.h:111
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/mediapropertiesdialog_8h_source.html b/docs/html/mediapropertiesdialog_8h_source.html new file mode 100644 index 000000000..ca2163a28 --- /dev/null +++ b/docs/html/mediapropertiesdialog_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: dialogs/mediapropertiesdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    mediapropertiesdialog.h
    +
    +
    +
    1 #ifndef MEDIAPROPERTIESDIALOG_H
    2 #define MEDIAPROPERTIESDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 struct Footage;
    7 class QComboBox;
    8 class QLineEdit;
    9 class Media;
    10 class QListWidget;
    11 class QDoubleSpinBox;
    12 class QCheckBox;
    13 
    14 class MediaPropertiesDialog : public QDialog {
    15  Q_OBJECT
    16 public:
    17  MediaPropertiesDialog(QWidget *parent, Media* i);
    18 private:
    19  QComboBox* interlacing_box;
    20  QLineEdit* name_box;
    21  Media* item;
    22  QListWidget* track_list;
    23  QDoubleSpinBox* conform_fr;
    24  QCheckBox* premultiply_alpha_setting;
    25 private slots:
    26  void accept();
    27 };
    28 
    29 #endif // MEDIAPROPERTIESDIALOG_H
    Definition: mediapropertiesdialog.h:14
    +
    Definition: media.h:20
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/menu.js b/docs/html/menu.js new file mode 100644 index 000000000..433c15b8f --- /dev/null +++ b/docs/html/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/docs/html/menudata.js b/docs/html/menudata.js new file mode 100644 index 000000000..b39645ecd --- /dev/null +++ b/docs/html/menudata.js @@ -0,0 +1,73 @@ +/* +@ @licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2017 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}, +{text:"z",url:"functions.html#index_z"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"z",url:"functions_func.html#index_z"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/docs/html/menuhelper_8h_source.html b/docs/html/menuhelper_8h_source.html new file mode 100644 index 000000000..ec4b1ee7d --- /dev/null +++ b/docs/html/menuhelper_8h_source.html @@ -0,0 +1,94 @@ + + + + + + + +Olive: ui/menuhelper.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    menuhelper.h
    +
    +
    +
    1 #ifndef MENUHELPER_H
    2 #define MENUHELPER_H
    3 
    4 #include <QObject>
    5 #include <QMenu>
    6 
    7 class MenuHelper : public QObject {
    8  Q_OBJECT
    9 public:
    20  void make_new_menu(QMenu* parent);
    21 
    32  void make_inout_menu(QMenu* parent);
    33 
    47  void make_clip_functions_menu(QMenu* parent);
    48 
    56  void make_edit_functions_menu(QMenu* parent);
    57 
    69  void set_bool_action_checked(QAction* a);
    70 
    87  void set_int_action_checked(QAction* a, const int& i);
    88 
    97  void set_button_action_checked(QAction* a);
    98 
    99 public slots:
    100 
    107  void toggle_bool_action();
    108 
    121 
    128  void set_autoscroll();
    129 
    136  void menu_click_button();
    137 
    144  void set_timecode_view();
    145 
    152  void open_recent_from_menu();
    153 
    154 private slots:
    155 
    156 
    157 };
    158 
    159 namespace Olive {
    163  extern MenuHelper MenuHelper;
    164 }
    165 
    166 #endif // MENUHELPER_H
    void open_recent_from_menu()
    Calls open_recent() in Olive::Global using the index from a QAction.
    Definition: menuhelper.cpp:150
    +
    void set_bool_action_checked(QAction *a)
    Sets the checked state of a menu item based on a Boolean variable.
    Definition: menuhelper.cpp:52
    +
    void set_button_action_checked(QAction *a)
    Sets the checked state of a menu item based on a QPushButton.
    Definition: menuhelper.cpp:66
    +
    void set_int_action_checked(QAction *a, const int &i)
    Sets the checked state of a menu item based on an integer variable.
    Definition: menuhelper.cpp:59
    +
    void toggle_bool_action()
    Sets a QAction's Boolean reference to the opposite of its current value.
    Definition: menuhelper.cpp:70
    +
    void make_new_menu(QMenu *parent)
    Creates a menu of new items that can be created.
    Definition: menuhelper.cpp:18
    +
    void set_timecode_view()
    Sets the current timecode setting.
    Definition: menuhelper.cpp:144
    +
    void make_inout_menu(QMenu *parent)
    Creates a menu of options for working with in/out points.
    Definition: menuhelper.cpp:25
    +
    void make_edit_functions_menu(QMenu *parent)
    Creates standard edit menu (cut, copy, paste, etc.)
    Definition: menuhelper.cpp:41
    +
    void menu_click_button()
    Clicks a QPushButton referenced by a QAction when triggered.
    Definition: menuhelper.cpp:140
    +
    void set_autoscroll()
    Set Autoscroll setting from QAction.
    Definition: menuhelper.cpp:135
    +
    Definition: menuhelper.h:7
    +
    void make_clip_functions_menu(QMenu *parent)
    Creates a menu of clip functions.
    Definition: menuhelper.cpp:34
    +
    void set_titlesafe_from_menu()
    Set Title/Action Safe Area from QAction.
    Definition: menuhelper.cpp:77
    +
    + + + + diff --git a/docs/html/nav_f.png b/docs/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/docs/html/nav_g.png b/docs/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL + + + + + + +Olive: dialogs/newsequencedialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    newsequencedialog.h
    +
    +
    +
    1 #ifndef NEWSEQUENCEDIALOG_H
    2 #define NEWSEQUENCEDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class Project;
    7 class Media;
    8 class QComboBox;
    9 class QSpinBox;
    10 class QLineEdit;
    11 struct Sequence;
    12 
    13 class NewSequenceDialog : public QDialog
    14 {
    15  Q_OBJECT
    16 
    17 public:
    18  explicit NewSequenceDialog(QWidget *parent = 0, Media* existing = 0);
    20 
    21  void set_sequence_name(const QString& s);
    22 
    23 private slots:
    24  void create();
    25  void preset_changed(int index);
    26 
    27 private:
    28  Sequence* existing_sequence;
    29  Media* existing_item;
    30 
    31  void setup_ui();
    32 
    33  QComboBox* preset_combobox;
    34  QSpinBox* height_numeric;
    35  QSpinBox* width_numeric;
    36  QComboBox* par_combobox;
    37  QComboBox* interlacing_combobox;
    38  QComboBox* frame_rate_combobox;
    39  QComboBox* audio_frequency_combobox;
    40  QLineEdit* sequence_name_edit;
    41 };
    42 
    43 #endif // NEWSEQUENCEDIALOG_H
    Definition: sequence.h:13
    +
    Definition: newsequencedialog.h:13
    +
    Definition: media.h:20
    +
    Definition: project.h:40
    +
    + + + + diff --git a/docs/html/oliveglobal_8h_source.html b/docs/html/oliveglobal_8h_source.html new file mode 100644 index 000000000..32afe5e8c --- /dev/null +++ b/docs/html/oliveglobal_8h_source.html @@ -0,0 +1,107 @@ + + + + + + + +Olive: oliveglobal.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    oliveglobal.h
    +
    +
    +
    1 #ifndef OLIVEGLOBAL_H
    2 #define OLIVEGLOBAL_H
    3 
    4 #include "project/undo.h"
    5 
    6 #include <QTimer>
    7 #include <QFile>
    8 
    14 class OliveGlobal : public QObject {
    15  Q_OBJECT
    16 public:
    22  OliveGlobal();
    23 
    29  const QString& get_project_file_filter();
    30 
    44  void update_project_filename(const QString& s);
    45 
    54 
    71  void set_rendering_state(bool rendering);
    72 
    83  void load_project_on_launch(const QString& s);
    84 
    90 
    91 public slots:
    95  void undo();
    96 
    100  void redo();
    101 
    109  void paste();
    110 
    119  void paste_insert();
    120 
    127  void new_project();
    128 
    135  void open_project();
    136 
    146  void open_recent(int index);
    147 
    158  bool save_project_as();
    159 
    170  bool save_project();
    171 
    184  bool can_close_project();
    185 
    189  void open_export_dialog();
    190 
    194  void open_about_dialog();
    195 
    199  void open_debug_log();
    200 
    204  void open_speed_dialog();
    205 
    209  void open_action_search();
    210 
    216  void clear_undo_stack();
    217 
    224  void finished_initialize();
    225 
    232  void save_autorecovery_file();
    233 
    237  void open_preferences();
    238 
    239 private:
    256  void open_project_worker(const QString& fn, bool autorecovery);
    257 
    262 
    267 
    272 
    273 
    274 private slots:
    275 
    276 };
    277 
    278 namespace Olive {
    282  extern QSharedPointer<OliveGlobal> Global;
    283 
    290  extern QString ActiveProjectFilename;
    291 
    295  extern QString AppName;
    296 }
    297 
    298 #endif // OLIVEGLOBAL_H
    void open_debug_log()
    Open the Debug Log window.
    Definition: oliveglobal.cpp:259
    +
    bool save_project_as()
    Shows a save file dialog and saves the project as the resulting filename.
    Definition: oliveglobal.cpp:134
    +
    void check_for_autorecovery_file()
    Check whether an auto-recovery file exists and ask the user if they want to load it.
    Definition: oliveglobal.cpp:57
    +
    QTimer autorecovery_timer
    Regular interval to save an auto-recovery project.
    Definition: oliveglobal.h:266
    +
    void load_project_on_launch(const QString &s)
    Set a project to load just after launching.
    Definition: oliveglobal.cpp:83
    +
    void set_rendering_state(bool rendering)
    Set the application state depending on if the user is exporting a video.
    Definition: oliveglobal.cpp:74
    +
    void redo()
    Redo user's last action.
    Definition: oliveglobal.cpp:234
    +
    void save_autorecovery_file()
    Save an auto-recovery file of the current project.
    Definition: oliveglobal.cpp:204
    +
    void clear_undo_stack()
    Clears the current undo stack.
    Definition: oliveglobal.cpp:276
    +
    OliveGlobal()
    OliveGlobal Constructor.
    Definition: oliveglobal.cpp:30
    +
    void open_recent(int index)
    Open recent project from list.
    Definition: oliveglobal.cpp:118
    +
    void open_preferences()
    Opens the Preferences dialog.
    Definition: oliveglobal.cpp:211
    +
    void finished_initialize()
    Function called when Olive has finished starting up.
    Definition: oliveglobal.cpp:189
    +
    void paste_insert()
    Paste contents of clipboard, making space for it when possible.
    Definition: oliveglobal.cpp:248
    +
    QString get_recent_project_list_file()
    Retrieves the URL of the config file containing the autorecovery projects.
    Definition: oliveglobal.cpp:88
    +
    void open_action_search()
    Open the Action Search overlay.
    Definition: oliveglobal.cpp:280
    +
    void open_project()
    Open a project from file.
    Definition: oliveglobal.cpp:111
    +
    const QString & get_project_file_filter()
    Returns the file dialog filter used when interfacing with Olive project files.
    Definition: oliveglobal.cpp:45
    +
    void paste()
    Paste contents of clipboard.
    Definition: oliveglobal.cpp:242
    +
    bool can_close_project()
    Determine whether the current project can be closed.
    Definition: oliveglobal.cpp:156
    +
    void update_project_filename(const QString &s)
    Change the current active project filename.
    Definition: oliveglobal.cpp:49
    +
    bool save_project()
    Saves the current project to file.
    Definition: oliveglobal.cpp:147
    +
    bool enable_load_project_on_init
    Internal variable set to TRUE by main() if a project file was set as an argument.
    Definition: oliveglobal.h:271
    +
    The Olive Global class.
    Definition: oliveglobal.h:14
    +
    void open_export_dialog()
    Open the Export dialog to trigger an export of the current sequence.
    Definition: oliveglobal.cpp:177
    +
    void open_project_worker(const QString &fn, bool autorecovery)
    Internal function to handle loading a project from file.
    Definition: oliveglobal.cpp:220
    +
    void open_speed_dialog()
    Open the Speed/Duration dialog.
    Definition: oliveglobal.cpp:263
    +
    void new_project()
    Create new project.
    Definition: oliveglobal.cpp:92
    +
    QString project_file_filter
    File filter used for any file dialogs relating to Olive project files.
    Definition: oliveglobal.h:261
    +
    void undo()
    Undo user's last action.
    Definition: oliveglobal.cpp:226
    +
    void open_about_dialog()
    Open the About Olive dialog.
    Definition: oliveglobal.cpp:254
    +
    + + + + diff --git a/docs/html/open.png b/docs/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +Olive: ui/otreeview.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    otreeview.h
    +
    +
    +
    1 #ifndef OTREEVIEW_H
    2 #define OTREEVIEW_H
    3 
    4 #include <QTreeView>
    5 
    6 #include "ui/sourcetable.h"
    7 
    8 class OTreeView : public QTreeView {
    9  Q_OBJECT
    10 public:
    11  OTreeView(QWidget* parent = 0);
    12 private:
    13 
    14 };
    15 
    16 #endif // OTREEVIEW_H
    Definition: otreeview.h:8
    +
    + + + + diff --git a/docs/html/pages.html b/docs/html/pages.html new file mode 100644 index 000000000..63d2297d0 --- /dev/null +++ b/docs/html/pages.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: Related Pages + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    + + + + diff --git a/docs/html/paneffect_8h_source.html b/docs/html/paneffect_8h_source.html new file mode 100644 index 000000000..171c79d96 --- /dev/null +++ b/docs/html/paneffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/paneffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    paneffect.h
    +
    +
    +
    1 #ifndef PANEFFECT_H
    2 #define PANEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class PanEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  PanEffect(Clip* c, const EffectMeta* em);
    10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    11 
    12  EffectField* pan_val;
    13 };
    14 
    15 #endif // PANEFFECT_H
    Definition: paneffect.h:6
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/panels_8h_source.html b/docs/html/panels_8h_source.html new file mode 100644 index 000000000..c127f53e5 --- /dev/null +++ b/docs/html/panels_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: panels/panels.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    panels.h
    +
    +
    +
    1 #ifndef PANELS_H
    2 #define PANELS_H
    3 
    4 #include "timeline.h"
    5 #include "effectcontrols.h"
    6 #include "viewer.h"
    7 #include "grapheditor.h"
    8 #include "project.h"
    9 
    10 class QWidget;
    11 class QDockWidget;
    12 class QScrollBar;
    13 
    14 extern Project* panel_project;
    15 extern EffectControls* panel_effect_controls;
    16 extern Viewer* panel_sequence_viewer;
    17 extern Viewer* panel_footage_viewer;
    18 extern Timeline* panel_timeline;
    19 extern GraphEditor* panel_graph_editor;
    20 
    21 void update_ui(bool modified);
    22 QDockWidget* get_focused_panel(bool force_hover = false);
    23 void alloc_panels(QWidget *parent);
    24 void free_panels();
    25 void scroll_to_frame_internal(QScrollBar* bar, long frame, double zoom, int area_width);
    26 
    27 #endif // PANELS_H
    Definition: timeline.h:71
    +
    Definition: effectcontrols.h:32
    +
    Definition: project.h:40
    +
    Definition: grapheditor.h:15
    +
    Definition: viewer.h:25
    +
    + + + + diff --git a/docs/html/path_8h_source.html b/docs/html/path_8h_source.html new file mode 100644 index 000000000..54449f3a0 --- /dev/null +++ b/docs/html/path_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: io/path.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    path.h
    +
    +
    +
    1 #ifndef PATH_H
    2 #define PATH_H
    3 
    4 #include <QString>
    5 #include <QDir>
    6 
    7 QString get_app_path();
    8 QString get_data_path();
    9 QDir get_data_dir();
    10 QString get_config_path();
    11 QDir get_config_dir();
    12 QList<QString> get_effects_paths();
    13 QList<QString> get_language_paths();
    14 
    15 // generate hash algorithm used to uniquely identify files
    16 QString get_file_hash(const QString& filename);
    17 
    18 #endif // PATH_H
    + + + + diff --git a/docs/html/playback_8h_source.html b/docs/html/playback_8h_source.html new file mode 100644 index 000000000..d3db0512e --- /dev/null +++ b/docs/html/playback_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: playback/playback.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    playback.h
    +
    +
    +
    1 #ifndef PLAYBACK_H
    2 #define PLAYBACK_H
    3 
    4 #include <QVector>
    5 #include <QMutex>
    6 
    7 class Clip;
    8 struct ClipCache;
    9 struct Sequence;
    10 struct AVFrame;
    11 
    12 long refactor_frame_number(long framenumber, double source_frame_rate, double target_frame_rate);
    13 bool clip_uses_cacher(Clip* clip);
    14 void open_clip(Clip* clip, bool multithreaded);
    15 void cache_clip(Clip* clip, long playhead, bool reset, bool scrubbing, QVector<Clip *> &nests, int playback_speed);
    16 void close_clip(Clip* clip, bool wait);
    17 void handle_media(Sequence* sequence, long playhead, bool multithreaded);
    18 void reset_cache(Clip* c, long target_frame, int playback_speed);
    19 void get_clip_frame(Clip* c, long playhead, bool &texture_failed);
    20 double get_timecode(Clip* c, long playhead);
    21 
    22 long playhead_to_clip_frame(Clip* c, long playhead);
    23 double playhead_to_clip_seconds(Clip* c, long playhead);
    24 int64_t seconds_to_timestamp(Clip* c, double seconds);
    25 int64_t playhead_to_timestamp(Clip* c, long playhead);
    26 
    27 int retrieve_next_frame(Clip* c, AVFrame* f);
    28 bool is_clip_active(Clip* c, long playhead);
    29 void get_next_audio(Clip* c, bool mix);
    30 void set_sequence(Sequence* s);
    31 void closeActiveClips(Sequence* s);
    32 
    33 #endif // PLAYBACK_H
    Definition: sequence.h:13
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/playbutton_8h_source.html b/docs/html/playbutton_8h_source.html new file mode 100644 index 000000000..df7f399f8 --- /dev/null +++ b/docs/html/playbutton_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/playbutton.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    playbutton.h
    +
    +
    +
    1 #ifndef PLAYBUTTON_H
    2 #define PLAYBUTTON_H
    3 
    4 #include <QPushButton>
    5 
    6 class PlayButton : public QPushButton
    7 {
    8 public:
    9  PlayButton(QWidget* parent = 0);
    10 private:
    11  QString play_text;
    12  QString pause_text;
    13 };
    14 
    15 #endif // PLAYBUTTON_H
    Definition: playbutton.h:6
    +
    + + + + diff --git a/docs/html/preferencesdialog_8h_source.html b/docs/html/preferencesdialog_8h_source.html new file mode 100644 index 000000000..b22e8b0ad --- /dev/null +++ b/docs/html/preferencesdialog_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: dialogs/preferencesdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    preferencesdialog.h
    +
    +
    +
    1 #ifndef PREFERENCESDIALOG_H
    2 #define PREFERENCESDIALOG_H
    3 
    4 #include <QDialog>
    5 #include <QKeySequenceEdit>
    6 class QMenuBar;
    7 class QLineEdit;
    8 class QComboBox;
    9 class QRadioButton;
    10 class QTreeWidget;
    11 class QTreeWidgetItem;
    12 class QMenu;
    13 class QCheckBox;
    14 class QDoubleSpinBox;
    15 class QSpinBox;
    16 
    17 class KeySequenceEditor : public QKeySequenceEdit {
    18  Q_OBJECT
    19 public:
    20  KeySequenceEditor(QWidget *parent, QAction* a);
    21  void set_action_shortcut();
    22  void reset_to_default();
    23  QString action_name();
    24  QString export_shortcut();
    25 private:
    26  QAction* action;
    27 };
    28 
    29 class PreferencesDialog : public QDialog
    30 {
    31  Q_OBJECT
    32 
    33 public:
    34  explicit PreferencesDialog(QWidget *parent = nullptr);
    36 
    37  void setup_kbd_shortcuts(QMenuBar* menu);
    38 
    39 private slots:
    40  void save();
    41  void reset_default_shortcut();
    42  void reset_all_shortcuts();
    43  bool refine_shortcut_list(const QString &, QTreeWidgetItem* parent = nullptr);
    44  void load_shortcut_file();
    45  void save_shortcut_file();
    46  void browse_css_file();
    47  void delete_all_previews();
    48 
    49 private:
    50  void setup_ui();
    51  void setup_kbd_shortcut_worker(QMenu* menu, QTreeWidgetItem* parent);
    52 
    53  // used to delete previews
    54  // type can be: 't' for thumbnails, 'w' for waveforms, or 1 for all
    55  void delete_previews(char type);
    56 
    57  QLineEdit* custom_css_fn;
    58  QLineEdit* imgSeqFormatEdit;
    59  QComboBox* recordingComboBox;
    60  QRadioButton* accurateSeekButton;
    61  QRadioButton* fastSeekButton;
    62  QTreeWidget* keyboard_tree;
    63  QDoubleSpinBox* upcoming_queue_spinbox;
    64  QComboBox* upcoming_queue_type;
    65  QDoubleSpinBox* previous_queue_spinbox;
    66  QComboBox* previous_queue_type;
    67  QSpinBox* effect_textbox_lines_field;
    68  QCheckBox* use_software_fallbacks_checkbox;
    69  QComboBox* audio_output_devices;
    70  QComboBox* audio_input_devices;
    71  QComboBox* audio_sample_rate;
    72  QComboBox* language_combobox;
    73  QSpinBox* thumbnail_res_spinbox;
    74  QSpinBox* waveform_res_spinbox;
    75 
    76  QVector<QAction*> key_shortcut_actions;
    77  QVector<QTreeWidgetItem*> key_shortcut_items;
    78  QVector<KeySequenceEditor*> key_shortcut_fields;
    79 };
    80 
    81 #endif // PREFERENCESDIALOG_H
    Definition: preferencesdialog.h:17
    +
    Definition: preferencesdialog.h:29
    +
    + + + + diff --git a/docs/html/previewgenerator_8h_source.html b/docs/html/previewgenerator_8h_source.html new file mode 100644 index 000000000..f47de1729 --- /dev/null +++ b/docs/html/previewgenerator_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: io/previewgenerator.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    previewgenerator.h
    +
    +
    +
    1 #ifndef PREVIEWGENERATOR_H
    2 #define PREVIEWGENERATOR_H
    3 
    4 #include <QThread>
    5 #include <QSemaphore>
    6 
    7 enum IconType {
    8  ICON_TYPE_VIDEO,
    9  ICON_TYPE_AUDIO,
    10  ICON_TYPE_IMAGE,
    11  ICON_TYPE_ERROR
    12 };
    13 
    14 struct Footage;
    15 struct FootageStream;
    16 struct AVFormatContext;
    17 class Media;
    18 
    19 class PreviewGenerator : public QThread
    20 {
    21  Q_OBJECT
    22 public:
    23  PreviewGenerator(Media*, Footage*, bool);
    24  void run();
    25  void cancel();
    26 signals:
    27  void set_icon(int, bool);
    28 private:
    29  void parse_media();
    30  bool retrieve_preview(const QString &hash);
    31  void generate_waveform();
    32  void finalize_media();
    33  AVFormatContext* fmt_ctx;
    34  Media* media;
    35  Footage* footage;
    36  bool retrieve_duration;
    37  bool contains_still_image;
    38  bool replace;
    39  bool cancelled;
    40  QString data_path;
    41  QString get_thumbnail_path(const QString &hash, const FootageStream &ms);
    42  QString get_waveform_path(const QString& hash, const FootageStream &ms);
    43 };
    44 
    45 #endif // PREVIEWGENERATOR_H
    Definition: previewgenerator.h:19
    +
    Definition: media.h:20
    +
    Definition: footage.h:25
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/project_8h_source.html b/docs/html/project_8h_source.html new file mode 100644 index 000000000..1da2a225e --- /dev/null +++ b/docs/html/project_8h_source.html @@ -0,0 +1,94 @@ + + + + + + + +Olive: panels/project.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    project.h
    +
    +
    +
    1 #ifndef PROJECT_H
    2 #define PROJECT_H
    3 
    4 #include <QDockWidget>
    5 #include <QVector>
    6 #include <QTimer>
    7 #include <QDir>
    8 
    9 #include "project/projectmodel.h"
    10 #include "project/projectfilter.h"
    11 
    12 struct Footage;
    13 struct Sequence;
    14 class Clip;
    15 class Timeline;
    16 class Viewer;
    17 class SourceTable;
    18 class Media;
    19 class QXmlStreamWriter;
    20 class QXmlStreamReader;
    21 class QFile;
    22 class ProjectFilter;
    23 class ComboAction;
    24 class SourceIconView;
    25 class QPushButton;
    26 class SourcesCommon;
    27 
    28 #define LOAD_TYPE_VERSION 69
    29 #define LOAD_TYPE_URL 70
    30 
    31 extern QString autorecovery_filename;
    32 extern QStringList recent_projects;
    33 extern ProjectModel project_model;
    34 
    35 Sequence* create_sequence_from_media(QVector<Media *> &media_list);
    36 
    37 QString get_channel_layout_name(int channels, uint64_t layout);
    38 QString get_interlacing_name(int interlacing);
    39 
    40 class Project : public QDockWidget {
    41  Q_OBJECT
    42 public:
    43  explicit Project(QWidget *parent = 0);
    44  ~Project();
    45  bool is_focused();
    46  void clear();
    47  Media* create_sequence_internal(ComboAction *ca, Sequence* s, bool open, Media* parent);
    48  QString get_next_sequence_name(QString start = 0);
    49  void process_file_list(QStringList& files, bool recursive = false, Media* replace = nullptr, Media *parent = nullptr);
    50  void replace_media(Media* item, QString filename);
    51  Media *get_selected_folder();
    52  bool reveal_media(Media *media, QModelIndex parent = QModelIndex());
    53  void add_recent_project(QString url);
    54 
    55  void new_project();
    56  void load_project(bool autorecovery);
    57  void save_project(bool autorecovery);
    58 
    59  Media* create_folder_internal(QString name);
    60  Media* item_to_media(const QModelIndex& index);
    61 
    62  void save_recent_projects();
    63 
    64  QVector<Media*> list_all_project_sequences();
    65 
    66  SourceTable* tree_view;
    67  SourceIconView* icon_view;
    68  SourcesCommon* sources_common;
    69 
    70  ProjectFilter* sorter;
    71 
    72  QVector<Media*> last_imported_media;
    73 
    74  QModelIndexList get_current_selected();
    75 
    76  void start_preview_generator(Media* item, bool replacing);
    77  void get_all_media_from_table(QList<Media *> &items, QList<Media *> &list, int type = -1);
    78 
    79  QWidget* toolbar_widget;
    80 public slots:
    81  void import_dialog();
    82  void delete_selected_media();
    83  void duplicate_selected();
    84  void delete_clips_using_selected_media();
    85  void replace_selected_file();
    86  void replace_clip_media();
    87  void open_properties();
    88  void new_folder();
    89  void new_sequence();
    90 private:
    91  void save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only, const QModelIndex &parent = QModelIndex());
    92  int folder_id;
    93  int media_id;
    94  int sequence_id;
    95  void list_all_sequences_worker(QVector<Media *> *list, Media* parent);
    96  QString get_file_name_from_path(const QString &path);
    97  QDir proj_dir;
    98  QWidget* icon_view_container;
    99  QPushButton* directory_up;
    100 private slots:
    101  void update_view_type();
    102  void set_icon_view();
    103  void set_tree_view();
    104  void clear_recent_projects();
    105  void set_icon_view_size(int);
    106  void set_up_dir_enabled();
    107  void go_up_dir();
    108  void make_new_menu();
    109 };
    110 
    111 class MediaThrobber : public QObject {
    112  Q_OBJECT
    113 public:
    115 public slots:
    116  void start();
    117  void stop(int, bool replace);
    118 private slots:
    119  void animation_update();
    120 private:
    121  QPixmap pixmap;
    122  int animation;
    123  Media* item;
    124  QTimer* animator;
    125 };
    126 
    127 #endif // PROJECT_H
    Definition: sequence.h:13
    +
    Definition: projectmodel.h:8
    +
    Definition: sourcetable.h:11
    +
    Definition: undo.h:32
    +
    Definition: timeline.h:71
    +
    Definition: media.h:20
    +
    Definition: project.h:111
    +
    Definition: project.h:40
    +
    Definition: sourceiconview.h:8
    +
    Definition: sourcescommon.h:16
    +
    Definition: projectfilter.h:6
    +
    Definition: clip.h:33
    +
    Definition: viewer.h:25
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/projectelements_8h_source.html b/docs/html/projectelements_8h_source.html new file mode 100644 index 000000000..b2771ee30 --- /dev/null +++ b/docs/html/projectelements_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: project/projectelements.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    projectelements.h
    +
    +
    +
    1 #ifndef PROJECTELEMENTS_H
    2 #define PROJECTELEMENTS_H
    3 
    4 // includes elements the user can use in a project
    5 #include "media.h"
    6 #include "footage.h"
    7 #include "sequence.h"
    8 
    9 // includes elements the user can use in a sequence
    10 #include "clip.h"
    11 #include "transition.h"
    12 #include "marker.h"
    13 #include "effect.h"
    14 
    15 #endif // PROJECTELEMENTS_H
    + + + + diff --git a/docs/html/projectfilter_8h_source.html b/docs/html/projectfilter_8h_source.html new file mode 100644 index 000000000..f3be20c32 --- /dev/null +++ b/docs/html/projectfilter_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: project/projectfilter.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    projectfilter.h
    +
    +
    +
    1 #ifndef PROJECTFILTER_H
    2 #define PROJECTFILTER_H
    3 
    4 #include <QSortFilterProxyModel>
    5 
    6 class ProjectFilter : public QSortFilterProxyModel {
    7  Q_OBJECT
    8 public:
    9  ProjectFilter(QObject *parent = nullptr);
    10 
    11  // are sequences visible
    12  bool get_show_sequences();
    13 
    14 public slots:
    15 
    16  // set whether sequences are visible
    17  void set_show_sequences(bool b);
    18 
    19  // update search filter
    20  void update_search_filter(const QString& s);
    21 
    22 protected:
    23 
    24  // function that filters whether rows are displayed or not
    25  virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
    26 
    27 private:
    28 
    29  // internal variable for whether to show sequences
    30  bool show_sequences;
    31 
    32  // search filter variable
    33  QString search_filter;
    34 
    35 };
    36 
    37 #endif // PROJECTFILTER_H
    Definition: projectfilter.h:6
    +
    + + + + diff --git a/docs/html/projectmodel_8h_source.html b/docs/html/projectmodel_8h_source.html new file mode 100644 index 000000000..895586758 --- /dev/null +++ b/docs/html/projectmodel_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: project/projectmodel.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    projectmodel.h
    +
    +
    +
    1 #ifndef PROJECTMODEL_H
    2 #define PROJECTMODEL_H
    3 
    4 #include <QAbstractItemModel>
    5 
    6 class Media;
    7 
    8 class ProjectModel : public QAbstractItemModel
    9 {
    10  Q_OBJECT
    11 public:
    12  ProjectModel(QObject* parent = nullptr);
    13  ~ProjectModel() override;
    14 
    15  void make_root();
    16  void destroy_root();
    17  void clear();
    18  Media* get_root();
    19  QVariant data(const QModelIndex &index, int role) const override;
    20  Qt::ItemFlags flags(const QModelIndex &index) const override;
    21  QVariant headerData(int section, Qt::Orientation orientation,
    22  int role = Qt::DisplayRole) const override;
    23  QModelIndex index(int row, int column,
    24  const QModelIndex &parent = QModelIndex()) const override;
    25  QModelIndex create_index(int arow, int acolumn, void *aid);
    26  QModelIndex parent(const QModelIndex &index) const override;
    27  bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    28  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    29  int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    30  Media *getItem(const QModelIndex &index) const;
    31 
    32  void appendChild(Media* parent, Media* child);
    33  void moveChild(Media *child, Media *to);
    34  void removeChild(Media *parent, Media* m);
    35  Media *child(int i, Media* parent = nullptr);
    36  int childCount(Media* parent = nullptr);
    37  void set_icon(Media* m, const QIcon &ico);
    38 
    39 private:
    40  Media* root_item;
    41 };
    42 
    43 #endif // PROJECTMODEL_H
    Definition: projectmodel.h:8
    +
    Definition: media.h:20
    +
    + + + + diff --git a/docs/html/proxydialog_8h_source.html b/docs/html/proxydialog_8h_source.html new file mode 100644 index 000000000..a940d7ba4 --- /dev/null +++ b/docs/html/proxydialog_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: dialogs/proxydialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    proxydialog.h
    +
    +
    +
    1 #ifndef PROXYDIALOG_H
    2 #define PROXYDIALOG_H
    3 
    4 #include <QDialog>
    5 #include <QVector>
    6 #include <QComboBox>
    7 
    8 struct Footage;
    9 
    10 class ProxyDialog : public QDialog {
    11  Q_OBJECT
    12 public:
    13  ProxyDialog(QWidget* parent, const QVector<Footage*>& footage);
    14 public slots:
    15  // called if user clicks "OK" on the dialog
    16  virtual void accept() override;
    17 private:
    18  // user's desired dimensions
    19  QComboBox* size_combobox;
    20 
    21  // user's desired proxy format
    22  QComboBox* format_combobox;
    23 
    24  // allows users to set the location to store proxies
    25  QComboBox* location_combobox;
    26 
    27  // stores the custom location to store proxies if the user sets a custom location
    28  QString custom_location;
    29 
    30  // stores the subdirectory to be made next to the source (dependent on the user's language)
    31  QString proxy_folder_name;
    32 
    33  // list of footage to make proxies for
    34  QVector<Footage*> selected_footage;
    35 private slots:
    36  // triggered when the user changes the index in the location combobox
    37  void location_changed(int i);
    38 };
    39 
    40 #endif // PROXYDIALOG_H
    Definition: proxydialog.h:10
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/proxygenerator_8h_source.html b/docs/html/proxygenerator_8h_source.html new file mode 100644 index 000000000..4f5a8c5f6 --- /dev/null +++ b/docs/html/proxygenerator_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: io/proxygenerator.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    proxygenerator.h
    +
    +
    +
    1 #ifndef PROXYGENERATOR_H
    2 #define PROXYGENERATOR_H
    3 
    4 #include <QThread>
    5 #include <QVector>
    6 #include <QMutex>
    7 #include <QWaitCondition>
    8 
    9 struct Footage;
    10 
    11 struct ProxyInfo {
    12  Footage* footage;
    13  double size_multiplier;
    14  int codec_type;
    15  QString path;
    16 };
    17 
    18 class ProxyGenerator : public QThread {
    19  Q_OBJECT
    20 public:
    22  void run();
    23  void queue(const ProxyInfo& info);
    24  void cancel();
    25  double get_proxy_progress(Footage* f);
    26 private:
    27  // queue of footage to process proxies for
    28  QVector<ProxyInfo> proxy_queue;
    29 
    30  // threading objects
    31  QWaitCondition waitCond;
    32  QMutex mutex;
    33 
    34  // set to true if you want to permanently close ProxyGenerator
    35  bool cancelled;
    36 
    37  // set to true if you want to abort the footage currently being processed
    38  bool skip;
    39 
    40  // stores progress in percent of proxy currently being processed
    41  double current_progress;
    42 
    43  // function that performs the actual transcode
    44  void transcode(const ProxyInfo& info);
    45 };
    46 
    47 // proxy generator is a global omnipotent entity
    48 extern ProxyGenerator proxy_generator;
    49 
    50 #endif // PROXYGENERATOR_H
    Definition: proxygenerator.h:11
    +
    Definition: proxygenerator.h:18
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/qpainterwrapper_8h_source.html b/docs/html/qpainterwrapper_8h_source.html new file mode 100644 index 000000000..71f9da67a --- /dev/null +++ b/docs/html/qpainterwrapper_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: io/qpainterwrapper.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    qpainterwrapper.h
    +
    +
    +
    1 #ifndef QPAINTERWRAPPER_H
    2 #define QPAINTERWRAPPER_H
    3 
    4 #include <QObject>
    5 
    6 class QPainter;
    7 
    8 class QPainterWrapper : public QObject {
    9  Q_OBJECT
    10 public:
    12  QImage* img;
    13  QPainter* painter;
    14 public slots:
    15  void fill(const QString& color);
    16  void fillRect(int x, int y, int width, int height, const QString& brush);
    17  void drawRect(int x, int y, int width, int height);
    18  void setPen(const QString& pen);
    19  void setBrush(const QString& brush);
    20 };
    21 
    22 extern QPainterWrapper painter_wrapper;
    23 
    24 #endif // QPAINTERWRAPPER_H
    Definition: qpainterwrapper.h:8
    +
    + + + + diff --git a/docs/html/rectangleselect_8h_source.html b/docs/html/rectangleselect_8h_source.html new file mode 100644 index 000000000..1cb90424f --- /dev/null +++ b/docs/html/rectangleselect_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: ui/rectangleselect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    rectangleselect.h
    +
    +
    +
    1 #ifndef RECTANGLESELECT_H
    2 #define RECTANGLESELECT_H
    3 
    4 #include <QPainter>
    5 
    6 void draw_selection_rectangle(QPainter& painter, const QRect& rect);
    7 
    8 #endif // RECTANGLESELECT_H
    + + + + diff --git a/docs/html/renderfunctions_8h_source.html b/docs/html/renderfunctions_8h_source.html new file mode 100644 index 000000000..a9872d086 --- /dev/null +++ b/docs/html/renderfunctions_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: ui/renderfunctions.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    renderfunctions.h
    +
    +
    +
    1 #ifndef RENDERFUNCTIONS_H
    2 #define RENDERFUNCTIONS_H
    3 
    4 #include <QOpenGLContext>
    5 #include <QVector>
    6 
    7 class Effect;
    8 class Viewer;
    9 class QOpenGLShaderProgram;
    10 struct Sequence;
    11 class Clip;
    12 
    14  Viewer* viewer;
    15  QOpenGLContext* ctx;
    16  Sequence* seq;
    17  QVector<Clip*> nests;
    18  bool video;
    19  bool render_audio;
    20  Effect** gizmos;
    21  bool texture_failed;
    22  bool rendering;
    23  int playback_speed;
    24  QOpenGLShaderProgram* blend_mode_program;
    25  QOpenGLShaderProgram* premultiply_program;
    26  GLuint main_buffer;
    27  GLuint main_attachment;
    28  GLuint backend_buffer1;
    29  GLuint backend_attachment1;
    30  GLuint backend_buffer2;
    31  GLuint backend_attachment2;
    32 };
    33 
    34 GLuint compose_sequence(ComposeSequenceParams &params);
    35 
    36 void compose_audio(Viewer* viewer, Sequence* seq, bool render_audio, int playback_speed);
    37 
    38 void viewport_render();
    39 
    40 #endif // RENDERFUNCTIONS_H
    Definition: sequence.h:13
    +
    Definition: renderfunctions.h:13
    +
    Definition: effect.h:146
    +
    Definition: clip.h:33
    +
    Definition: viewer.h:25
    +
    + + + + diff --git a/docs/html/renderthread_8h_source.html b/docs/html/renderthread_8h_source.html new file mode 100644 index 000000000..bf5c80585 --- /dev/null +++ b/docs/html/renderthread_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: ui/renderthread.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    renderthread.h
    +
    +
    +
    1 #ifndef RENDERTHREAD_H
    2 #define RENDERTHREAD_H
    3 
    4 #include <QThread>
    5 #include <QMutex>
    6 #include <QWaitCondition>
    7 #include <QOffscreenSurface>
    8 #include <QOpenGLContext>
    9 #include <QOpenGLFramebufferObject>
    10 #include <QOpenGLShaderProgram>
    11 
    12 struct Sequence;
    13 class Effect;
    14 
    15 class RenderThread : public QThread {
    16  Q_OBJECT
    17 public:
    18  RenderThread();
    19  ~RenderThread();
    20  void run();
    21  QMutex mutex;
    22  GLuint front_buffer;
    23  GLuint front_texture;
    24  Effect* gizmos;
    25  void paint();
    26  void start_render(QOpenGLContext* share, Sequence* s, const QString &save = nullptr, GLvoid *pixels = nullptr, int pixel_linesize = 0, int idivider = 0);
    27  bool did_texture_fail();
    28  void cancel();
    29 
    30 public slots:
    31  // cleanup functions
    32  void delete_ctx();
    33 signals:
    34  void ready();
    35 private:
    36  // cleanup functions
    37  void delete_texture();
    38  void delete_fbo();
    39  void delete_shader_program();
    40 
    41  QWaitCondition waitCond;
    42  QOffscreenSurface surface;
    43  QOpenGLContext* share_ctx;
    44  QOpenGLContext* ctx;
    45  QOpenGLShaderProgram* blend_mode_program;
    46  QOpenGLShaderProgram* premultiply_program;
    47 
    48  GLuint back_buffer_1;
    49  GLuint back_buffer_2;
    50  GLuint back_texture_1;
    51  GLuint back_texture_2;
    52 
    53  Sequence* seq;
    54  int divider;
    55  int tex_width;
    56  int tex_height;
    57  bool queued;
    58  bool texture_failed;
    59  bool running;
    60  QString save_fn;
    61  GLvoid *pixel_buffer;
    62  int pixel_buffer_linesize;
    63 };
    64 
    65 #endif // RENDERTHREAD_H
    Definition: sequence.h:13
    +
    Definition: effect.h:146
    +
    Definition: renderthread.h:15
    +
    + + + + diff --git a/docs/html/replaceclipmediadialog_8h_source.html b/docs/html/replaceclipmediadialog_8h_source.html new file mode 100644 index 000000000..a2b9cbfa6 --- /dev/null +++ b/docs/html/replaceclipmediadialog_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: dialogs/replaceclipmediadialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    replaceclipmediadialog.h
    +
    +
    +
    1 #ifndef REPLACECLIPMEDIADIALOG_H
    2 #define REPLACECLIPMEDIADIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class SourceTable;
    7 class QTreeView;
    8 class Media;
    9 class QCheckBox;
    10 
    11 class ReplaceClipMediaDialog : public QDialog {
    12  Q_OBJECT
    13 public:
    14  ReplaceClipMediaDialog(QWidget* parent, Media *old_media);
    15 private slots:
    16  void replace();
    17 private:
    18  Media* media;
    19  QTreeView* tree;
    20  QCheckBox* use_same_media_in_points;
    21 };
    22 
    23 #endif // REPLACECLIPMEDIADIALOG_H
    Definition: sourcetable.h:11
    +
    Definition: media.h:20
    +
    Definition: replaceclipmediadialog.h:11
    +
    + + + + diff --git a/docs/html/resizablescrollbar_8h_source.html b/docs/html/resizablescrollbar_8h_source.html new file mode 100644 index 000000000..5fcc7b3ab --- /dev/null +++ b/docs/html/resizablescrollbar_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/resizablescrollbar.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    resizablescrollbar.h
    +
    +
    +
    1 #ifndef RESIZABLESCROLLBAR_H
    2 #define RESIZABLESCROLLBAR_H
    3 
    4 #include <QScrollBar>
    5 
    6 class ResizableScrollBar : public QScrollBar
    7 {
    8  Q_OBJECT
    9 public:
    10  ResizableScrollBar(QWidget * parent = 0);
    11  bool is_resizing();
    12 signals:
    13  void resize_move(double i);
    14 protected:
    15  void resizeEvent(QResizeEvent *event) override;
    16  void mousePressEvent(QMouseEvent *) override;
    17  void mouseMoveEvent(QMouseEvent *) override;
    18  void mouseReleaseEvent(QMouseEvent *) override;
    19 private:
    20  bool resize_init;
    21  bool resize_proc;
    22  int resize_start;
    23  bool resize_top;
    24 
    25  int resize_start_max;
    26  int resize_start_width;
    27 };
    28 
    29 #endif // RESIZABLESCROLLBAR_H
    Definition: resizablescrollbar.h:6
    +
    + + + + diff --git a/docs/html/scrollarea_8h_source.html b/docs/html/scrollarea_8h_source.html new file mode 100644 index 000000000..8dd4b876f --- /dev/null +++ b/docs/html/scrollarea_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/scrollarea.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    scrollarea.h
    +
    +
    +
    1 #ifndef SCROLLAREA_H
    2 #define SCROLLAREA_H
    3 
    4 #include <QScrollArea>
    5 
    6 class ScrollArea : public QScrollArea
    7 {
    8 public:
    9  ScrollArea(QWidget* parent = 0);
    10  void wheelEvent(QWheelEvent *);
    11 };
    12 
    13 #endif // SCROLLAREA_H
    Definition: scrollarea.h:6
    +
    + + + + diff --git a/docs/html/search/all_0.html b/docs/html/search/all_0.html new file mode 100644 index 000000000..5330204c2 --- /dev/null +++ b/docs/html/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js new file mode 100644 index 000000000..024724f9e --- /dev/null +++ b/docs/html/search/all_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['_5faeffect',['_AEffect',['../struct___a_effect.html',1,'']]], + ['_5fvstevent',['_VstEvent',['../struct___vst_event.html',1,'']]], + ['_5fvstevents',['_VstEvents',['../struct___vst_events.html',1,'']]], + ['_5fvstmidievent',['_VstMidiEvent',['../struct___vst_midi_event.html',1,'']]], + ['_5fvstparameterproperties',['_VstParameterProperties',['../struct___vst_parameter_properties.html',1,'']]], + ['_5fvsttimeinfo',['_VstTimeInfo',['../struct___vst_time_info.html',1,'']]] +]; diff --git a/docs/html/search/all_1.html b/docs/html/search/all_1.html new file mode 100644 index 000000000..2f4679366 --- /dev/null +++ b/docs/html/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js new file mode 100644 index 000000000..894cf6031 --- /dev/null +++ b/docs/html/search/all_1.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['aboutdialog',['AboutDialog',['../class_about_dialog.html',1,'']]], + ['actionsearch',['ActionSearch',['../class_action_search.html',1,'']]], + ['actionsearchentry',['ActionSearchEntry',['../class_action_search_entry.html',1,'']]], + ['actionsearchlist',['ActionSearchList',['../class_action_search_list.html',1,'']]], + ['addclipcommand',['AddClipCommand',['../class_add_clip_command.html',1,'']]], + ['addeffectcommand',['AddEffectCommand',['../class_add_effect_command.html',1,'']]], + ['addmarkeraction',['AddMarkerAction',['../class_add_marker_action.html',1,'']]], + ['addmediacommand',['AddMediaCommand',['../class_add_media_command.html',1,'']]], + ['addtransitioncommand',['AddTransitionCommand',['../class_add_transition_command.html',1,'']]], + ['advancedvideodialog',['AdvancedVideoDialog',['../class_advanced_video_dialog.html',1,'']]], + ['audiomonitor',['AudioMonitor',['../class_audio_monitor.html',1,'']]], + ['audionoiseeffect',['AudioNoiseEffect',['../class_audio_noise_effect.html',1,'']]], + ['audiosenderthread',['AudioSenderThread',['../class_audio_sender_thread.html',1,'']]], + ['autorecovery_5ftimer',['autorecovery_timer',['../class_olive_global.html#a78f108b6ed6a5a7f13a69f51038bb2b5',1,'OliveGlobal']]] +]; diff --git a/docs/html/search/all_10.html b/docs/html/search/all_10.html new file mode 100644 index 000000000..170dc09c6 --- /dev/null +++ b/docs/html/search/all_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_10.js b/docs/html/search/all_10.js new file mode 100644 index 000000000..7060bb933 --- /dev/null +++ b/docs/html/search/all_10.js @@ -0,0 +1,55 @@ +var searchData= +[ + ['save_5fautorecovery_5ffile',['save_autorecovery_file',['../class_olive_global.html#a683bdbe17929ce90db233a3cdff8fc30',1,'OliveGlobal']]], + ['save_5fproject',['save_project',['../class_olive_global.html#a465ffe390d9b615ed8216d2335039197',1,'OliveGlobal']]], + ['save_5fproject_5fas',['save_project_as',['../class_olive_global.html#ab3f5f0874214f7ecac66d7ab152a8141',1,'OliveGlobal']]], + ['save_5fshortcuts',['save_shortcuts',['../class_main_window.html#ade97fa7698ec0bd744ffef8808dfb24b',1,'MainWindow']]], + ['scrollarea',['ScrollArea',['../class_scroll_area.html',1,'']]], + ['select_5fall',['select_all',['../class_focus_filter.html#a4e91f2fe5798f054d53436247bb2f60d',1,'FocusFilter']]], + ['selection',['Selection',['../struct_selection.html',1,'']]], + ['sequence',['Sequence',['../struct_sequence.html',1,'']]], + ['set_5factive_5fcursor',['set_active_cursor',['../class_label_slider.html#a654943c90cc8d87a2dbc957a42252ef0',1,'LabelSlider']]], + ['set_5fautoscroll',['set_autoscroll',['../class_menu_helper.html#aefd8a07595d457e27aabe366cd4d2dbb',1,'MenuHelper']]], + ['set_5fbool_5faction_5fchecked',['set_bool_action_checked',['../class_menu_helper.html#a03f62557c81dbffab88ad0edaf522762',1,'MenuHelper']]], + ['set_5fbutton_5faction_5fchecked',['set_button_action_checked',['../class_menu_helper.html#a26de4da960087ca481b8520b129c7b7f',1,'MenuHelper']]], + ['set_5fcolor',['set_color',['../class_label_slider.html#abbbf055704231fd56978fac964518be6',1,'LabelSlider']]], + ['set_5fdefault_5fcursor',['set_default_cursor',['../class_label_slider.html#a9a5c67bed20e30581b7c0c503a93de8c',1,'LabelSlider']]], + ['set_5fdefault_5fvalue',['set_default_value',['../class_label_slider.html#a5c08c16c088f1846621bfe341fe875c7',1,'LabelSlider']]], + ['set_5fdisplay_5ftype',['set_display_type',['../class_label_slider.html#aa36f1ac8359e6ad956890c204601dc8e',1,'LabelSlider']]], + ['set_5fframe_5frate',['set_frame_rate',['../class_label_slider.html#ab304e6dfceb1678153047d8437be0ef5',1,'LabelSlider']]], + ['set_5fin_5fpoint',['set_in_point',['../class_focus_filter.html#ae92ec419038408bfe07ff359abf8a2f1',1,'FocusFilter']]], + ['set_5fint_5faction_5fchecked',['set_int_action_checked',['../class_menu_helper.html#ab152c4e0a116a10735a4ab8e3da91736',1,'MenuHelper']]], + ['set_5fmarker',['set_marker',['../class_focus_filter.html#a44ffefc5cf2559e7d08986d3cfa02c89',1,'FocusFilter']]], + ['set_5fmaximum_5fvalue',['set_maximum_value',['../class_label_slider.html#abe90995d780d3ae610358ec34b19ee48',1,'LabelSlider']]], + ['set_5fminimum_5fvalue',['set_minimum_value',['../class_label_slider.html#ad0915199716155c2f12c5b5292b9ecc9',1,'LabelSlider']]], + ['set_5fout_5fpoint',['set_out_point',['../class_focus_filter.html#a54d15c99741150d31a534ee057f36a9e',1,'FocusFilter']]], + ['set_5fprevious_5fvalue',['set_previous_value',['../class_label_slider.html#aa8e8edf8dc7ea4df8e0abb6f32c343ac',1,'LabelSlider']]], + ['set_5frendering_5fstate',['set_rendering_state',['../class_olive_global.html#a2763e87021f250965f67e175ee6c6e67',1,'OliveGlobal']]], + ['set_5ftimecode_5fview',['set_timecode_view',['../class_menu_helper.html#a9ec427f151cf31a821db32cf71d66ef0',1,'MenuHelper']]], + ['set_5ftitlesafe_5ffrom_5fmenu',['set_titlesafe_from_menu',['../class_menu_helper.html#a9c109452d8af3237cee07e9f53030e7c',1,'MenuHelper']]], + ['set_5fvalue',['set_value',['../class_label_slider.html#ae05af4cf1dce88261673ed2ec5ec5d41',1,'LabelSlider']]], + ['set_5fviewer_5ffullscreen',['set_viewer_fullscreen',['../class_focus_filter.html#a58f52ec833dc287619ddbd4595d15a65',1,'FocusFilter']]], + ['set_5fwindow_5fmodified',['set_window_modified',['../class_olive_action.html#a029f9d31c03e2ec38ad8c72ff1279746',1,'OliveAction']]], + ['setautoscaleaction',['SetAutoscaleAction',['../class_set_autoscale_action.html',1,'']]], + ['setbool',['SetBool',['../class_set_bool.html',1,'']]], + ['setdouble',['SetDouble',['../class_set_double.html',1,'']]], + ['seteffectdata',['SetEffectData',['../class_set_effect_data.html',1,'']]], + ['setint',['SetInt',['../class_set_int.html',1,'']]], + ['setkeyframing',['SetKeyframing',['../class_set_keyframing.html',1,'']]], + ['setlong',['SetLong',['../class_set_long.html',1,'']]], + ['setpointer',['SetPointer',['../class_set_pointer.html',1,'']]], + ['setqvariant',['SetQVariant',['../class_set_q_variant.html',1,'']]], + ['setselectionscommand',['SetSelectionsCommand',['../class_set_selections_command.html',1,'']]], + ['setspeedaction',['SetSpeedAction',['../class_set_speed_action.html',1,'']]], + ['setstring',['SetString',['../class_set_string.html',1,'']]], + ['settimelineinoutcommand',['SetTimelineInOutCommand',['../class_set_timeline_in_out_command.html',1,'']]], + ['setup_5flayout',['setup_layout',['../class_main_window.html#a549905e8c0d69bbd0a2ef13f1e645387',1,'MainWindow']]], + ['setup_5fmenus',['setup_menus',['../class_main_window.html#a8030447a20f462e4262b9ad5230d98c1',1,'MainWindow']]], + ['shakeeffect',['ShakeEffect',['../class_shake_effect.html',1,'']]], + ['solideffect',['SolidEffect',['../class_solid_effect.html',1,'']]], + ['sourceiconview',['SourceIconView',['../class_source_icon_view.html',1,'']]], + ['sourcescommon',['SourcesCommon',['../class_sources_common.html',1,'']]], + ['sourcetable',['SourceTable',['../class_source_table.html',1,'']]], + ['speeddialog',['SpeedDialog',['../class_speed_dialog.html',1,'']]], + ['stabilizerdialog',['StabilizerDialog',['../class_stabilizer_dialog.html',1,'']]] +]; diff --git a/docs/html/search/all_11.html b/docs/html/search/all_11.html new file mode 100644 index 000000000..10fcd0919 --- /dev/null +++ b/docs/html/search/all_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_11.js b/docs/html/search/all_11.js new file mode 100644 index 000000000..b08f10b0a --- /dev/null +++ b/docs/html/search/all_11.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['texteditdialog',['TextEditDialog',['../class_text_edit_dialog.html',1,'']]], + ['texteditex',['TextEditEx',['../class_text_edit_ex.html',1,'']]], + ['texteffect',['TextEffect',['../class_text_effect.html',1,'']]], + ['timecodeeffect',['TimecodeEffect',['../class_timecode_effect.html',1,'']]], + ['timeline',['Timeline',['../class_timeline.html',1,'']]], + ['timelineheader',['TimelineHeader',['../class_timeline_header.html',1,'']]], + ['timelinewidget',['TimelineWidget',['../class_timeline_widget.html',1,'']]], + ['toggle_5fbool_5faction',['toggle_bool_action',['../class_menu_helper.html#a89ebceb4b52b93ea82ec7fa7ac253718',1,'MenuHelper']]], + ['toggle_5ffull_5fscreen',['toggle_full_screen',['../class_main_window.html#a3eb037c22e6f684831e3a8eeec0101c4',1,'MainWindow']]], + ['toggle_5fpanel_5fvisibility',['toggle_panel_visibility',['../class_main_window.html#a3a8a0f75baca4ee12fc7ebfe6c05e45b',1,'MainWindow']]], + ['toneeffect',['ToneEffect',['../class_tone_effect.html',1,'']]], + ['toolmenu_5fabout_5fto_5fbe_5fshown',['toolMenu_About_To_Be_Shown',['../class_main_window.html#a2de6d447c7936ae2f9964c4b5b1ee1c6',1,'MainWindow']]], + ['transformeffect',['TransformEffect',['../class_transform_effect.html',1,'']]], + ['transition',['Transition',['../class_transition.html',1,'']]], + ['transitiondata',['TransitionData',['../struct_transition_data.html',1,'']]] +]; diff --git a/docs/html/search/all_12.html b/docs/html/search/all_12.html new file mode 100644 index 000000000..0876adf45 --- /dev/null +++ b/docs/html/search/all_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_12.js b/docs/html/search/all_12.js new file mode 100644 index 000000000..6072d289a --- /dev/null +++ b/docs/html/search/all_12.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['undo',['undo',['../class_olive_global.html#ac5c7fc8e77040c8260e2e817e3e7b165',1,'OliveGlobal']]], + ['update_5fproject_5ffilename',['update_project_filename',['../class_olive_global.html#af3ef4cb94078beb905eb916a160fe826',1,'OliveGlobal']]], + ['updatefootagetooltip',['UpdateFootageTooltip',['../class_update_footage_tooltip.html',1,'']]], + ['updatetitle',['updateTitle',['../class_main_window.html#ac62839f0a6f642f68f06729f351893e3',1,'MainWindow']]], + ['updateviewer',['UpdateViewer',['../class_update_viewer.html',1,'']]] +]; diff --git a/docs/html/search/all_13.html b/docs/html/search/all_13.html new file mode 100644 index 000000000..dc6c0496a --- /dev/null +++ b/docs/html/search/all_13.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_13.js b/docs/html/search/all_13.js new file mode 100644 index 000000000..3a36627d0 --- /dev/null +++ b/docs/html/search/all_13.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['value',['value',['../class_label_slider.html#a5736dbba98a0eb8958eed03046f77f8f',1,'LabelSlider']]], + ['valuechanged',['valueChanged',['../class_label_slider.html#a9be91d45b50e409325332d441f3edf7d',1,'LabelSlider']]], + ['valuetostring',['valueToString',['../class_label_slider.html#a8009482f1461ae35500fb5956e723f2c',1,'LabelSlider']]], + ['videocodecparams',['VideoCodecParams',['../struct_video_codec_params.html',1,'']]], + ['viewer',['Viewer',['../class_viewer.html',1,'']]], + ['viewercontainer',['ViewerContainer',['../class_viewer_container.html',1,'']]], + ['viewerwidget',['ViewerWidget',['../class_viewer_widget.html',1,'']]], + ['viewerwindow',['ViewerWindow',['../class_viewer_window.html',1,'']]], + ['viewmenu_5fabout_5fto_5fbe_5fshown',['viewMenu_About_To_Be_Shown',['../class_main_window.html#a2e4fd4ecc5e0487ca2d98735b01ccf41',1,'MainWindow']]], + ['voideffect',['VoidEffect',['../class_void_effect.html',1,'']]], + ['volumeeffect',['VolumeEffect',['../class_volume_effect.html',1,'']]], + ['vsthost',['VSTHost',['../class_v_s_t_host.html',1,'']]], + ['vstrect',['VSTRect',['../struct_v_s_t_rect.html',1,'']]] +]; diff --git a/docs/html/search/all_14.html b/docs/html/search/all_14.html new file mode 100644 index 000000000..7fe46634d --- /dev/null +++ b/docs/html/search/all_14.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_14.js b/docs/html/search/all_14.js new file mode 100644 index 000000000..e366e6517 --- /dev/null +++ b/docs/html/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['windowmenu_5fabout_5fto_5fbe_5fshown',['windowMenu_About_To_Be_Shown',['../class_main_window.html#a33a60acf2c71874faf766dabd446e071',1,'MainWindow']]] +]; diff --git a/docs/html/search/all_15.html b/docs/html/search/all_15.html new file mode 100644 index 000000000..c0fc0aab7 --- /dev/null +++ b/docs/html/search/all_15.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_15.js b/docs/html/search/all_15.js new file mode 100644 index 000000000..33bfb7520 --- /dev/null +++ b/docs/html/search/all_15.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['zoom_5fin',['zoom_in',['../class_focus_filter.html#a25c6fc709acf758f0c965420b3f10745',1,'FocusFilter']]], + ['zoom_5fout',['zoom_out',['../class_focus_filter.html#a723180d73f272ae21ab8b8001353f610',1,'FocusFilter']]] +]; diff --git a/docs/html/search/all_2.html b/docs/html/search/all_2.html new file mode 100644 index 000000000..4c33d8557 --- /dev/null +++ b/docs/html/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js new file mode 100644 index 000000000..63e821694 --- /dev/null +++ b/docs/html/search/all_2.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['cacher',['Cacher',['../class_cacher.html',1,'']]], + ['can_5fclose_5fproject',['can_close_project',['../class_olive_global.html#a634b935875324ef89ac8088b10a8707f',1,'OliveGlobal']]], + ['changesequenceaction',['ChangeSequenceAction',['../class_change_sequence_action.html',1,'']]], + ['check_5ffor_5fautorecovery_5ffile',['check_for_autorecovery_file',['../class_olive_global.html#aed575061a3669d27854f76b3af599846',1,'OliveGlobal']]], + ['checkboxcommand',['CheckboxCommand',['../class_checkbox_command.html',1,'']]], + ['checkboxex',['CheckboxEx',['../class_checkbox_ex.html',1,'']]], + ['clear_5fin',['clear_in',['../class_focus_filter.html#a64b5f3777c6e9419e13fe388ee2975ff',1,'FocusFilter']]], + ['clear_5finout',['clear_inout',['../class_focus_filter.html#a96eaaf8404de284edac0aa15de9c5dc4',1,'FocusFilter']]], + ['clear_5fout',['clear_out',['../class_focus_filter.html#a7357058d6bd8b1e9ca9d5e8b25c2432e',1,'FocusFilter']]], + ['clear_5fundo_5fstack',['clear_undo_stack',['../class_olive_global.html#a097586341c27234802fb42f7ee1d40c6',1,'OliveGlobal']]], + ['clickablelabel',['ClickableLabel',['../class_clickable_label.html',1,'']]], + ['clicked',['clicked',['../class_label_slider.html#a4b7301bbdad1d6dca30aa0e878818706',1,'LabelSlider']]], + ['clip',['Clip',['../class_clip.html',1,'']]], + ['closeallclipscommand',['CloseAllClipsCommand',['../class_close_all_clips_command.html',1,'']]], + ['closeevent',['closeEvent',['../class_main_window.html#a4aa386518569b0bbceb958df0ddc8f32',1,'MainWindow']]], + ['collapsiblewidget',['CollapsibleWidget',['../class_collapsible_widget.html',1,'']]], + ['collapsiblewidgetheader',['CollapsibleWidgetHeader',['../class_collapsible_widget_header.html',1,'']]], + ['colorbutton',['ColorButton',['../class_color_button.html',1,'']]], + ['colorcommand',['ColorCommand',['../class_color_command.html',1,'']]], + ['comboaction',['ComboAction',['../class_combo_action.html',1,'']]], + ['comboboxex',['ComboBoxEx',['../class_combo_box_ex.html',1,'']]], + ['comboboxexcommand',['ComboBoxExCommand',['../class_combo_box_ex_command.html',1,'']]], + ['composesequenceparams',['ComposeSequenceParams',['../struct_compose_sequence_params.html',1,'']]], + ['config',['Config',['../struct_config.html',1,'']]], + ['copy',['copy',['../class_focus_filter.html#a28498f9a8d44f649826431e53f57863c',1,'FocusFilter']]], + ['cornerpineffect',['CornerPinEffect',['../class_corner_pin_effect.html',1,'']]], + ['crc32',['Crc32',['../class_crc32.html',1,'']]], + ['crossdissolvetransition',['CrossDissolveTransition',['../class_cross_dissolve_transition.html',1,'']]], + ['cubetransition',['CubeTransition',['../class_cube_transition.html',1,'']]], + ['cut',['cut',['../class_focus_filter.html#a222ebf21b2aefbb43085839a8b95ae3e',1,'FocusFilter']]] +]; diff --git a/docs/html/search/all_3.html b/docs/html/search/all_3.html new file mode 100644 index 000000000..b634070bc --- /dev/null +++ b/docs/html/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js new file mode 100644 index 000000000..3e7638d37 --- /dev/null +++ b/docs/html/search/all_3.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['debugdialog',['DebugDialog',['../class_debug_dialog.html',1,'']]], + ['decimal_5fplaces',['decimal_places',['../class_label_slider.html#afc2a71530cff38dfe586e73dabe99be9',1,'LabelSlider']]], + ['decrease_5fspeed',['decrease_speed',['../class_focus_filter.html#a7df3eede8f25fde514142046b3352c09',1,'FocusFilter']]], + ['delete_5ffunction',['delete_function',['../class_focus_filter.html#a7d9dbfa4b9595a4e83b01c54f123b3a7',1,'FocusFilter']]], + ['deleteclipaction',['DeleteClipAction',['../class_delete_clip_action.html',1,'']]], + ['deletemarkeraction',['DeleteMarkerAction',['../class_delete_marker_action.html',1,'']]], + ['deletemediacommand',['DeleteMediaCommand',['../class_delete_media_command.html',1,'']]], + ['deletetransitioncommand',['DeleteTransitionCommand',['../class_delete_transition_command.html',1,'']]], + ['demonotice',['DemoNotice',['../class_demo_notice.html',1,'']]], + ['duplicate',['duplicate',['../class_focus_filter.html#a603997516bd2e5954e8cb49fa87c8bad',1,'FocusFilter']]] +]; diff --git a/docs/html/search/all_4.html b/docs/html/search/all_4.html new file mode 100644 index 000000000..dd062aeae --- /dev/null +++ b/docs/html/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js new file mode 100644 index 000000000..08bf30dd3 --- /dev/null +++ b/docs/html/search/all_4.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['editmenu_5fabout_5fto_5fbe_5fshown',['editMenu_About_To_Be_Shown',['../class_main_window.html#a5f23bbfaed3c23ea97640411e09cafc5',1,'MainWindow']]], + ['editsequencecommand',['EditSequenceCommand',['../class_edit_sequence_command.html',1,'']]], + ['effect',['Effect',['../class_effect.html',1,'']]], + ['effectcontrols',['EffectControls',['../class_effect_controls.html',1,'']]], + ['effectdeletecommand',['EffectDeleteCommand',['../class_effect_delete_command.html',1,'']]], + ['effectfield',['EffectField',['../class_effect_field.html',1,'']]], + ['effectfieldundo',['EffectFieldUndo',['../class_effect_field_undo.html',1,'']]], + ['effectgizmo',['EffectGizmo',['../class_effect_gizmo.html',1,'']]], + ['effectinit',['EffectInit',['../class_effect_init.html',1,'']]], + ['effectkeyframe',['EffectKeyframe',['../class_effect_keyframe.html',1,'']]], + ['effectmeta',['EffectMeta',['../struct_effect_meta.html',1,'']]], + ['effectrow',['EffectRow',['../class_effect_row.html',1,'']]], + ['effectsarea',['EffectsArea',['../class_effects_area.html',1,'']]], + ['embeddedfilechooser',['EmbeddedFileChooser',['../class_embedded_file_chooser.html',1,'']]], + ['enable_5fload_5fproject_5fon_5finit',['enable_load_project_on_init',['../class_olive_global.html#a41a11e816954dbc44e2b24c1d7fe0398',1,'OliveGlobal']]], + ['exponentialfadetransition',['ExponentialFadeTransition',['../class_exponential_fade_transition.html',1,'']]], + ['exportdialog',['ExportDialog',['../class_export_dialog.html',1,'']]], + ['exportparams',['ExportParams',['../struct_export_params.html',1,'']]], + ['exportthread',['ExportThread',['../class_export_thread.html',1,'']]] +]; diff --git a/docs/html/search/all_5.html b/docs/html/search/all_5.html new file mode 100644 index 000000000..f0780fdd3 --- /dev/null +++ b/docs/html/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js new file mode 100644 index 000000000..dc518bfdb --- /dev/null +++ b/docs/html/search/all_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['filemenu_5fabout_5fto_5fbe_5fshown',['fileMenu_About_To_Be_Shown',['../class_main_window.html#a20044854458738b479d85d5291257105',1,'MainWindow']]], + ['fillleftrighteffect',['FillLeftRightEffect',['../class_fill_left_right_effect.html',1,'']]], + ['finished_5ffirst_5fpaint',['finished_first_paint',['../class_main_window.html#ad87af70df9998f4a30b5c5bba7eace41',1,'MainWindow']]], + ['finished_5finitialize',['finished_initialize',['../class_olive_global.html#a60dbd750a5eedea296cbe40bc8d4051e',1,'OliveGlobal']]], + ['flowlayout',['FlowLayout',['../class_flow_layout.html',1,'']]], + ['focusfilter',['FocusFilter',['../class_focus_filter.html',1,'FocusFilter'],['../class_focus_filter.html#ac1b7def442c41825dd1fc31f5cbf9fe9',1,'FocusFilter::FocusFilter()']]], + ['fontcombobox',['FontCombobox',['../class_font_combobox.html',1,'']]], + ['footage',['Footage',['../struct_footage.html',1,'']]], + ['footagestream',['FootageStream',['../struct_footage_stream.html',1,'']]], + ['frei0reffect',['Frei0rEffect',['../class_frei0r_effect.html',1,'']]] +]; diff --git a/docs/html/search/all_6.html b/docs/html/search/all_6.html new file mode 100644 index 000000000..39b0f555c --- /dev/null +++ b/docs/html/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 000000000..5ca8a3dcc --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['get_5fproject_5ffile_5ffilter',['get_project_file_filter',['../class_olive_global.html#ac57ead290b6cf9895aa11a1200d7c397',1,'OliveGlobal']]], + ['get_5frecent_5fproject_5flist_5ffile',['get_recent_project_list_file',['../class_olive_global.html#acf4fdfadaf62290f28de49c12d58cb5b',1,'OliveGlobal']]], + ['getpreviousvalue',['getPreviousValue',['../class_label_slider.html#a4b807b5b784a7b7b9b9d0a7b3706a4e4',1,'LabelSlider']]], + ['ghost',['Ghost',['../struct_ghost.html',1,'']]], + ['gltexturecoords',['GLTextureCoords',['../struct_g_l_texture_coords.html',1,'']]], + ['go_5fto_5fend',['go_to_end',['../class_focus_filter.html#a508677d87d24280a9ed5012bfdb81d87',1,'FocusFilter']]], + ['go_5fto_5fin',['go_to_in',['../class_focus_filter.html#a095e3fb9f4f9258ff1d576f0172653d6',1,'FocusFilter']]], + ['go_5fto_5fout',['go_to_out',['../class_focus_filter.html#ad1433575afa3713fecae28ea2a00a026',1,'FocusFilter']]], + ['go_5fto_5fstart',['go_to_start',['../class_focus_filter.html#a8fb9425128c635829d6103f7478d8e51',1,'FocusFilter']]], + ['grapheditor',['GraphEditor',['../class_graph_editor.html',1,'']]], + ['graphview',['GraphView',['../class_graph_view.html',1,'']]] +]; diff --git a/docs/html/search/all_7.html b/docs/html/search/all_7.html new file mode 100644 index 000000000..9cd0196e7 --- /dev/null +++ b/docs/html/search/all_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 000000000..cfc29e00a --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['increase_5fspeed',['increase_speed',['../class_focus_filter.html#ab535fc8179e1eb6221fb8951ec0b8771',1,'FocusFilter']]], + ['is_5fdragging',['is_dragging',['../class_label_slider.html#ac51e4b18b54b182a6cb741093559b13e',1,'LabelSlider']]], + ['is_5fset',['is_set',['../class_label_slider.html#ac446ce259367ff1159935f812dd73f08',1,'LabelSlider']]] +]; diff --git a/docs/html/search/all_8.html b/docs/html/search/all_8.html new file mode 100644 index 000000000..1e8fb9ceb --- /dev/null +++ b/docs/html/search/all_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 000000000..d013a1010 --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['keyframedelete',['KeyframeDelete',['../class_keyframe_delete.html',1,'']]], + ['keyframefieldset',['KeyframeFieldSet',['../class_keyframe_field_set.html',1,'']]], + ['keyframenavigator',['KeyframeNavigator',['../class_keyframe_navigator.html',1,'']]], + ['keyframeview',['KeyframeView',['../class_keyframe_view.html',1,'']]], + ['keysequenceeditor',['KeySequenceEditor',['../class_key_sequence_editor.html',1,'']]] +]; diff --git a/docs/html/search/all_9.html b/docs/html/search/all_9.html new file mode 100644 index 000000000..27df366b2 --- /dev/null +++ b/docs/html/search/all_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 000000000..6928fb0b7 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['labelslider',['LabelSlider',['../class_label_slider.html',1,'']]], + ['linearfadetransition',['LinearFadeTransition',['../class_linear_fade_transition.html',1,'']]], + ['linkcommand',['LinkCommand',['../class_link_command.html',1,'']]], + ['load_5fcss_5ffrom_5ffile',['load_css_from_file',['../class_main_window.html#a281ed536e019361da2b5a780dd48e6b2',1,'MainWindow']]], + ['load_5fproject_5fon_5flaunch',['load_project_on_launch',['../class_olive_global.html#a457ad9d7f5d716b0f23a7aa01187da5d',1,'OliveGlobal']]], + ['load_5fshortcuts',['load_shortcuts',['../class_main_window.html#a9f173804b8c478a35eaad1938e289947',1,'MainWindow']]], + ['loaddialog',['LoadDialog',['../class_load_dialog.html',1,'']]], + ['loadthread',['LoadThread',['../class_load_thread.html',1,'']]], + ['logarithmicfadetransition',['LogarithmicFadeTransition',['../class_logarithmic_fade_transition.html',1,'']]] +]; diff --git a/docs/html/search/all_a.html b/docs/html/search/all_a.html new file mode 100644 index 000000000..63f9254d8 --- /dev/null +++ b/docs/html/search/all_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 000000000..57d333fc1 --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['mainwindow',['MainWindow',['../class_main_window.html',1,'']]], + ['make_5fclip_5ffunctions_5fmenu',['make_clip_functions_menu',['../class_menu_helper.html#ad7cc7086317b2ea8bb1774f2b749a9fd',1,'MenuHelper']]], + ['make_5fedit_5ffunctions_5fmenu',['make_edit_functions_menu',['../class_menu_helper.html#a0138f049061657ff93a41708e1e06718',1,'MenuHelper']]], + ['make_5finout_5fmenu',['make_inout_menu',['../class_menu_helper.html#aa6bb56c91cb0980a16e447dd34074fe2',1,'MenuHelper']]], + ['make_5fnew_5fmenu',['make_new_menu',['../class_menu_helper.html#ad4c34ddfd794f642f42ea08bf76124cc',1,'MenuHelper']]], + ['marker',['Marker',['../struct_marker.html',1,'']]], + ['maximize_5fpanel',['maximize_panel',['../class_main_window.html#af1779e3b578dd30f41e9dc59d7e0553f',1,'MainWindow']]], + ['media',['Media',['../class_media.html',1,'']]], + ['mediamove',['MediaMove',['../class_media_move.html',1,'']]], + ['mediapropertiesdialog',['MediaPropertiesDialog',['../class_media_properties_dialog.html',1,'']]], + ['mediarename',['MediaRename',['../class_media_rename.html',1,'']]], + ['mediathrobber',['MediaThrobber',['../class_media_throbber.html',1,'']]], + ['menu_5fclick_5fbutton',['menu_click_button',['../class_menu_helper.html#a508f997ac25f7c5830b03161fda1b25f',1,'MenuHelper']]], + ['menuhelper',['MenuHelper',['../class_menu_helper.html',1,'']]], + ['modifytransitioncommand',['ModifyTransitionCommand',['../class_modify_transition_command.html',1,'']]], + ['moveclipaction',['MoveClipAction',['../class_move_clip_action.html',1,'']]], + ['moveeffectcommand',['MoveEffectCommand',['../class_move_effect_command.html',1,'']]], + ['movemarkeraction',['MoveMarkerAction',['../class_move_marker_action.html',1,'']]] +]; diff --git a/docs/html/search/all_b.html b/docs/html/search/all_b.html new file mode 100644 index 000000000..44ae3e475 --- /dev/null +++ b/docs/html/search/all_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 000000000..e0811beb1 --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['new_5fproject',['new_project',['../class_olive_global.html#a96005523cb0a1ba0c4647ce2f2791331',1,'OliveGlobal']]], + ['newsequencecommand',['NewSequenceCommand',['../class_new_sequence_command.html',1,'']]], + ['newsequencedialog',['NewSequenceDialog',['../class_new_sequence_dialog.html',1,'']]], + ['next_5fframe',['next_frame',['../class_focus_filter.html#a65943730d91348720430b2c5ba10e21f',1,'FocusFilter']]] +]; diff --git a/docs/html/search/all_c.html b/docs/html/search/all_c.html new file mode 100644 index 000000000..3de15867d --- /dev/null +++ b/docs/html/search/all_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 000000000..43321ae76 --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['olive_20video_20editor',['Olive Video Editor',['../md__r_e_a_d_m_e.html',1,'']]], + ['old_5fwindow_5fmodified',['old_window_modified',['../class_olive_action.html#a2ad0d3899c37dce7caed1b9d22a6c892',1,'OliveAction']]], + ['oliveaction',['OliveAction',['../class_olive_action.html',1,'']]], + ['oliveglobal',['OliveGlobal',['../class_olive_global.html',1,'OliveGlobal'],['../class_olive_global.html#a8ee567e30178cd747396c6222970de1b',1,'OliveGlobal::OliveGlobal()']]], + ['open_5fabout_5fdialog',['open_about_dialog',['../class_olive_global.html#a161a4b6f88441f82f0e90331f39044fb',1,'OliveGlobal']]], + ['open_5faction_5fsearch',['open_action_search',['../class_olive_global.html#a9a255c3b943eca104abb777243d32dee',1,'OliveGlobal']]], + ['open_5fdebug_5flog',['open_debug_log',['../class_olive_global.html#a0c142bf5d9f0ab9753154b3926b08d37',1,'OliveGlobal']]], + ['open_5fexport_5fdialog',['open_export_dialog',['../class_olive_global.html#abb20f21708320f258d99a2737640129e',1,'OliveGlobal']]], + ['open_5fpreferences',['open_preferences',['../class_olive_global.html#a481765a0b424ca37c50326dbe97fb204',1,'OliveGlobal']]], + ['open_5fproject',['open_project',['../class_olive_global.html#aaa945027c0f85fe2b65ad7be5997e02f',1,'OliveGlobal']]], + ['open_5fproject_5fworker',['open_project_worker',['../class_olive_global.html#a59e4870f994af018fb71d3871872fd7e',1,'OliveGlobal']]], + ['open_5frecent',['open_recent',['../class_olive_global.html#a7eaad3e9ab9637f48f2a3cbcb1628a42',1,'OliveGlobal']]], + ['open_5frecent_5ffrom_5fmenu',['open_recent_from_menu',['../class_menu_helper.html#ae46d3ef4f566734c6d38512933cb353b',1,'MenuHelper']]], + ['open_5fspeed_5fdialog',['open_speed_dialog',['../class_olive_global.html#abc5fb406d67e5f62602b3806fcab04f2',1,'OliveGlobal']]], + ['otreeview',['OTreeView',['../class_o_tree_view.html',1,'']]] +]; diff --git a/docs/html/search/all_d.html b/docs/html/search/all_d.html new file mode 100644 index 000000000..a2d5bd7ed --- /dev/null +++ b/docs/html/search/all_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_d.js b/docs/html/search/all_d.js new file mode 100644 index 000000000..47baa8183 --- /dev/null +++ b/docs/html/search/all_d.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['paintevent',['paintEvent',['../class_main_window.html#a227c9fbd4c9757d4a98c333f8a905e17',1,'MainWindow']]], + ['paneffect',['PanEffect',['../class_pan_effect.html',1,'']]], + ['paste',['paste',['../class_olive_global.html#a8574a0c2c68978756671d0289ca9e8ff',1,'OliveGlobal']]], + ['paste_5finsert',['paste_insert',['../class_olive_global.html#a6f6f44ef9503d674851b761c927e8154',1,'OliveGlobal']]], + ['pause',['pause',['../class_focus_filter.html#ad19e5a72819075115ced232bc8031cc1',1,'FocusFilter']]], + ['play_5fin_5fto_5fout',['play_in_to_out',['../class_focus_filter.html#af0c6edcbcbffb186efb00b77081c8f7b',1,'FocusFilter']]], + ['playbackmenu_5fabout_5fto_5fbe_5fshown',['playbackMenu_About_To_Be_Shown',['../class_main_window.html#a6d6a492bfc20a7d9758d4570bced46e9',1,'MainWindow']]], + ['playbutton',['PlayButton',['../class_play_button.html',1,'']]], + ['playpause',['playpause',['../class_focus_filter.html#ae4862f15057c3af9b50798333bb5194e',1,'FocusFilter']]], + ['preferencesdialog',['PreferencesDialog',['../class_preferences_dialog.html',1,'']]], + ['prev_5fframe',['prev_frame',['../class_focus_filter.html#a27db0137e8ff818a04bf70448012a7dd',1,'FocusFilter']]], + ['previewgenerator',['PreviewGenerator',['../class_preview_generator.html',1,'']]], + ['project',['Project',['../class_project.html',1,'']]], + ['project_5ffile_5ffilter',['project_file_filter',['../class_olive_global.html#a053f4de79194655e0a51b538e0bb0d95',1,'OliveGlobal']]], + ['projectfilter',['ProjectFilter',['../class_project_filter.html',1,'']]], + ['projectmodel',['ProjectModel',['../class_project_model.html',1,'']]], + ['proxydialog',['ProxyDialog',['../class_proxy_dialog.html',1,'']]], + ['proxygenerator',['ProxyGenerator',['../class_proxy_generator.html',1,'']]], + ['proxyinfo',['ProxyInfo',['../struct_proxy_info.html',1,'']]] +]; diff --git a/docs/html/search/all_e.html b/docs/html/search/all_e.html new file mode 100644 index 000000000..f9a056dcd --- /dev/null +++ b/docs/html/search/all_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_e.js b/docs/html/search/all_e.js new file mode 100644 index 000000000..09ab9fd61 --- /dev/null +++ b/docs/html/search/all_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qpainterwrapper',['QPainterWrapper',['../class_q_painter_wrapper.html',1,'']]] +]; diff --git a/docs/html/search/all_f.html b/docs/html/search/all_f.html new file mode 100644 index 000000000..f6997fa5f --- /dev/null +++ b/docs/html/search/all_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/all_f.js b/docs/html/search/all_f.js new file mode 100644 index 000000000..5c6e315fc --- /dev/null +++ b/docs/html/search/all_f.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['redo',['redo',['../class_olive_global.html#a501c01aa8f27966ea6fc4c3b74ee8a17',1,'OliveGlobal']]], + ['refreshclips',['RefreshClips',['../class_refresh_clips.html',1,'']]], + ['reloadeffectscommand',['ReloadEffectsCommand',['../class_reload_effects_command.html',1,'']]], + ['removeclipsfromclipboard',['RemoveClipsFromClipboard',['../class_remove_clips_from_clipboard.html',1,'']]], + ['renameclipcommand',['RenameClipCommand',['../class_rename_clip_command.html',1,'']]], + ['renderthread',['RenderThread',['../class_render_thread.html',1,'']]], + ['replaceclipmediacommand',['ReplaceClipMediaCommand',['../class_replace_clip_media_command.html',1,'']]], + ['replaceclipmediadialog',['ReplaceClipMediaDialog',['../class_replace_clip_media_dialog.html',1,'']]], + ['replacemediacommand',['ReplaceMediaCommand',['../class_replace_media_command.html',1,'']]], + ['reset_5flayout',['reset_layout',['../class_main_window.html#a71cf1b26b6f2b58ea307bc2340bed64d',1,'MainWindow']]], + ['resizablescrollbar',['ResizableScrollBar',['../class_resizable_scroll_bar.html',1,'']]], + ['rippleaction',['RippleAction',['../class_ripple_action.html',1,'']]], + ['runtimeconfig',['RuntimeConfig',['../struct_runtime_config.html',1,'']]] +]; diff --git a/docs/html/search/classes_0.html b/docs/html/search/classes_0.html new file mode 100644 index 000000000..b3c6ec6af --- /dev/null +++ b/docs/html/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_0.js b/docs/html/search/classes_0.js new file mode 100644 index 000000000..024724f9e --- /dev/null +++ b/docs/html/search/classes_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['_5faeffect',['_AEffect',['../struct___a_effect.html',1,'']]], + ['_5fvstevent',['_VstEvent',['../struct___vst_event.html',1,'']]], + ['_5fvstevents',['_VstEvents',['../struct___vst_events.html',1,'']]], + ['_5fvstmidievent',['_VstMidiEvent',['../struct___vst_midi_event.html',1,'']]], + ['_5fvstparameterproperties',['_VstParameterProperties',['../struct___vst_parameter_properties.html',1,'']]], + ['_5fvsttimeinfo',['_VstTimeInfo',['../struct___vst_time_info.html',1,'']]] +]; diff --git a/docs/html/search/classes_1.html b/docs/html/search/classes_1.html new file mode 100644 index 000000000..b744c4d15 --- /dev/null +++ b/docs/html/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_1.js b/docs/html/search/classes_1.js new file mode 100644 index 000000000..7cf42b4ae --- /dev/null +++ b/docs/html/search/classes_1.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['aboutdialog',['AboutDialog',['../class_about_dialog.html',1,'']]], + ['actionsearch',['ActionSearch',['../class_action_search.html',1,'']]], + ['actionsearchentry',['ActionSearchEntry',['../class_action_search_entry.html',1,'']]], + ['actionsearchlist',['ActionSearchList',['../class_action_search_list.html',1,'']]], + ['addclipcommand',['AddClipCommand',['../class_add_clip_command.html',1,'']]], + ['addeffectcommand',['AddEffectCommand',['../class_add_effect_command.html',1,'']]], + ['addmarkeraction',['AddMarkerAction',['../class_add_marker_action.html',1,'']]], + ['addmediacommand',['AddMediaCommand',['../class_add_media_command.html',1,'']]], + ['addtransitioncommand',['AddTransitionCommand',['../class_add_transition_command.html',1,'']]], + ['advancedvideodialog',['AdvancedVideoDialog',['../class_advanced_video_dialog.html',1,'']]], + ['audiomonitor',['AudioMonitor',['../class_audio_monitor.html',1,'']]], + ['audionoiseeffect',['AudioNoiseEffect',['../class_audio_noise_effect.html',1,'']]], + ['audiosenderthread',['AudioSenderThread',['../class_audio_sender_thread.html',1,'']]] +]; diff --git a/docs/html/search/classes_10.html b/docs/html/search/classes_10.html new file mode 100644 index 000000000..269003271 --- /dev/null +++ b/docs/html/search/classes_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_10.js b/docs/html/search/classes_10.js new file mode 100644 index 000000000..c7f309fa3 --- /dev/null +++ b/docs/html/search/classes_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['texteditdialog',['TextEditDialog',['../class_text_edit_dialog.html',1,'']]], + ['texteditex',['TextEditEx',['../class_text_edit_ex.html',1,'']]], + ['texteffect',['TextEffect',['../class_text_effect.html',1,'']]], + ['timecodeeffect',['TimecodeEffect',['../class_timecode_effect.html',1,'']]], + ['timeline',['Timeline',['../class_timeline.html',1,'']]], + ['timelineheader',['TimelineHeader',['../class_timeline_header.html',1,'']]], + ['timelinewidget',['TimelineWidget',['../class_timeline_widget.html',1,'']]], + ['toneeffect',['ToneEffect',['../class_tone_effect.html',1,'']]], + ['transformeffect',['TransformEffect',['../class_transform_effect.html',1,'']]], + ['transition',['Transition',['../class_transition.html',1,'']]], + ['transitiondata',['TransitionData',['../struct_transition_data.html',1,'']]] +]; diff --git a/docs/html/search/classes_11.html b/docs/html/search/classes_11.html new file mode 100644 index 000000000..e9f8eabba --- /dev/null +++ b/docs/html/search/classes_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_11.js b/docs/html/search/classes_11.js new file mode 100644 index 000000000..f8d43b378 --- /dev/null +++ b/docs/html/search/classes_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['updatefootagetooltip',['UpdateFootageTooltip',['../class_update_footage_tooltip.html',1,'']]], + ['updateviewer',['UpdateViewer',['../class_update_viewer.html',1,'']]] +]; diff --git a/docs/html/search/classes_12.html b/docs/html/search/classes_12.html new file mode 100644 index 000000000..c20b92628 --- /dev/null +++ b/docs/html/search/classes_12.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_12.js b/docs/html/search/classes_12.js new file mode 100644 index 000000000..ff7e74412 --- /dev/null +++ b/docs/html/search/classes_12.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['videocodecparams',['VideoCodecParams',['../struct_video_codec_params.html',1,'']]], + ['viewer',['Viewer',['../class_viewer.html',1,'']]], + ['viewercontainer',['ViewerContainer',['../class_viewer_container.html',1,'']]], + ['viewerwidget',['ViewerWidget',['../class_viewer_widget.html',1,'']]], + ['viewerwindow',['ViewerWindow',['../class_viewer_window.html',1,'']]], + ['voideffect',['VoidEffect',['../class_void_effect.html',1,'']]], + ['volumeeffect',['VolumeEffect',['../class_volume_effect.html',1,'']]], + ['vsthost',['VSTHost',['../class_v_s_t_host.html',1,'']]], + ['vstrect',['VSTRect',['../struct_v_s_t_rect.html',1,'']]] +]; diff --git a/docs/html/search/classes_2.html b/docs/html/search/classes_2.html new file mode 100644 index 000000000..7878acb4f --- /dev/null +++ b/docs/html/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_2.js b/docs/html/search/classes_2.js new file mode 100644 index 000000000..7b75d95ed --- /dev/null +++ b/docs/html/search/classes_2.js @@ -0,0 +1,23 @@ +var searchData= +[ + ['cacher',['Cacher',['../class_cacher.html',1,'']]], + ['changesequenceaction',['ChangeSequenceAction',['../class_change_sequence_action.html',1,'']]], + ['checkboxcommand',['CheckboxCommand',['../class_checkbox_command.html',1,'']]], + ['checkboxex',['CheckboxEx',['../class_checkbox_ex.html',1,'']]], + ['clickablelabel',['ClickableLabel',['../class_clickable_label.html',1,'']]], + ['clip',['Clip',['../class_clip.html',1,'']]], + ['closeallclipscommand',['CloseAllClipsCommand',['../class_close_all_clips_command.html',1,'']]], + ['collapsiblewidget',['CollapsibleWidget',['../class_collapsible_widget.html',1,'']]], + ['collapsiblewidgetheader',['CollapsibleWidgetHeader',['../class_collapsible_widget_header.html',1,'']]], + ['colorbutton',['ColorButton',['../class_color_button.html',1,'']]], + ['colorcommand',['ColorCommand',['../class_color_command.html',1,'']]], + ['comboaction',['ComboAction',['../class_combo_action.html',1,'']]], + ['comboboxex',['ComboBoxEx',['../class_combo_box_ex.html',1,'']]], + ['comboboxexcommand',['ComboBoxExCommand',['../class_combo_box_ex_command.html',1,'']]], + ['composesequenceparams',['ComposeSequenceParams',['../struct_compose_sequence_params.html',1,'']]], + ['config',['Config',['../struct_config.html',1,'']]], + ['cornerpineffect',['CornerPinEffect',['../class_corner_pin_effect.html',1,'']]], + ['crc32',['Crc32',['../class_crc32.html',1,'']]], + ['crossdissolvetransition',['CrossDissolveTransition',['../class_cross_dissolve_transition.html',1,'']]], + ['cubetransition',['CubeTransition',['../class_cube_transition.html',1,'']]] +]; diff --git a/docs/html/search/classes_3.html b/docs/html/search/classes_3.html new file mode 100644 index 000000000..c231d86f0 --- /dev/null +++ b/docs/html/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_3.js b/docs/html/search/classes_3.js new file mode 100644 index 000000000..7013423f8 --- /dev/null +++ b/docs/html/search/classes_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['debugdialog',['DebugDialog',['../class_debug_dialog.html',1,'']]], + ['deleteclipaction',['DeleteClipAction',['../class_delete_clip_action.html',1,'']]], + ['deletemarkeraction',['DeleteMarkerAction',['../class_delete_marker_action.html',1,'']]], + ['deletemediacommand',['DeleteMediaCommand',['../class_delete_media_command.html',1,'']]], + ['deletetransitioncommand',['DeleteTransitionCommand',['../class_delete_transition_command.html',1,'']]], + ['demonotice',['DemoNotice',['../class_demo_notice.html',1,'']]] +]; diff --git a/docs/html/search/classes_4.html b/docs/html/search/classes_4.html new file mode 100644 index 000000000..86dd4384f --- /dev/null +++ b/docs/html/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_4.js b/docs/html/search/classes_4.js new file mode 100644 index 000000000..e12e8ee64 --- /dev/null +++ b/docs/html/search/classes_4.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['editsequencecommand',['EditSequenceCommand',['../class_edit_sequence_command.html',1,'']]], + ['effect',['Effect',['../class_effect.html',1,'']]], + ['effectcontrols',['EffectControls',['../class_effect_controls.html',1,'']]], + ['effectdeletecommand',['EffectDeleteCommand',['../class_effect_delete_command.html',1,'']]], + ['effectfield',['EffectField',['../class_effect_field.html',1,'']]], + ['effectfieldundo',['EffectFieldUndo',['../class_effect_field_undo.html',1,'']]], + ['effectgizmo',['EffectGizmo',['../class_effect_gizmo.html',1,'']]], + ['effectinit',['EffectInit',['../class_effect_init.html',1,'']]], + ['effectkeyframe',['EffectKeyframe',['../class_effect_keyframe.html',1,'']]], + ['effectmeta',['EffectMeta',['../struct_effect_meta.html',1,'']]], + ['effectrow',['EffectRow',['../class_effect_row.html',1,'']]], + ['effectsarea',['EffectsArea',['../class_effects_area.html',1,'']]], + ['embeddedfilechooser',['EmbeddedFileChooser',['../class_embedded_file_chooser.html',1,'']]], + ['exponentialfadetransition',['ExponentialFadeTransition',['../class_exponential_fade_transition.html',1,'']]], + ['exportdialog',['ExportDialog',['../class_export_dialog.html',1,'']]], + ['exportparams',['ExportParams',['../struct_export_params.html',1,'']]], + ['exportthread',['ExportThread',['../class_export_thread.html',1,'']]] +]; diff --git a/docs/html/search/classes_5.html b/docs/html/search/classes_5.html new file mode 100644 index 000000000..7aaef4df3 --- /dev/null +++ b/docs/html/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_5.js b/docs/html/search/classes_5.js new file mode 100644 index 000000000..5ff4eb170 --- /dev/null +++ b/docs/html/search/classes_5.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['fillleftrighteffect',['FillLeftRightEffect',['../class_fill_left_right_effect.html',1,'']]], + ['flowlayout',['FlowLayout',['../class_flow_layout.html',1,'']]], + ['focusfilter',['FocusFilter',['../class_focus_filter.html',1,'']]], + ['fontcombobox',['FontCombobox',['../class_font_combobox.html',1,'']]], + ['footage',['Footage',['../struct_footage.html',1,'']]], + ['footagestream',['FootageStream',['../struct_footage_stream.html',1,'']]], + ['frei0reffect',['Frei0rEffect',['../class_frei0r_effect.html',1,'']]] +]; diff --git a/docs/html/search/classes_6.html b/docs/html/search/classes_6.html new file mode 100644 index 000000000..aad7834e8 --- /dev/null +++ b/docs/html/search/classes_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_6.js b/docs/html/search/classes_6.js new file mode 100644 index 000000000..6c908c333 --- /dev/null +++ b/docs/html/search/classes_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ghost',['Ghost',['../struct_ghost.html',1,'']]], + ['gltexturecoords',['GLTextureCoords',['../struct_g_l_texture_coords.html',1,'']]], + ['grapheditor',['GraphEditor',['../class_graph_editor.html',1,'']]], + ['graphview',['GraphView',['../class_graph_view.html',1,'']]] +]; diff --git a/docs/html/search/classes_7.html b/docs/html/search/classes_7.html new file mode 100644 index 000000000..794e3948f --- /dev/null +++ b/docs/html/search/classes_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_7.js b/docs/html/search/classes_7.js new file mode 100644 index 000000000..d013a1010 --- /dev/null +++ b/docs/html/search/classes_7.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['keyframedelete',['KeyframeDelete',['../class_keyframe_delete.html',1,'']]], + ['keyframefieldset',['KeyframeFieldSet',['../class_keyframe_field_set.html',1,'']]], + ['keyframenavigator',['KeyframeNavigator',['../class_keyframe_navigator.html',1,'']]], + ['keyframeview',['KeyframeView',['../class_keyframe_view.html',1,'']]], + ['keysequenceeditor',['KeySequenceEditor',['../class_key_sequence_editor.html',1,'']]] +]; diff --git a/docs/html/search/classes_8.html b/docs/html/search/classes_8.html new file mode 100644 index 000000000..1ba60c903 --- /dev/null +++ b/docs/html/search/classes_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_8.js b/docs/html/search/classes_8.js new file mode 100644 index 000000000..7e529c6e7 --- /dev/null +++ b/docs/html/search/classes_8.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['labelslider',['LabelSlider',['../class_label_slider.html',1,'']]], + ['linearfadetransition',['LinearFadeTransition',['../class_linear_fade_transition.html',1,'']]], + ['linkcommand',['LinkCommand',['../class_link_command.html',1,'']]], + ['loaddialog',['LoadDialog',['../class_load_dialog.html',1,'']]], + ['loadthread',['LoadThread',['../class_load_thread.html',1,'']]], + ['logarithmicfadetransition',['LogarithmicFadeTransition',['../class_logarithmic_fade_transition.html',1,'']]] +]; diff --git a/docs/html/search/classes_9.html b/docs/html/search/classes_9.html new file mode 100644 index 000000000..565e7d7a0 --- /dev/null +++ b/docs/html/search/classes_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_9.js b/docs/html/search/classes_9.js new file mode 100644 index 000000000..733f5370d --- /dev/null +++ b/docs/html/search/classes_9.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['mainwindow',['MainWindow',['../class_main_window.html',1,'']]], + ['marker',['Marker',['../struct_marker.html',1,'']]], + ['media',['Media',['../class_media.html',1,'']]], + ['mediamove',['MediaMove',['../class_media_move.html',1,'']]], + ['mediapropertiesdialog',['MediaPropertiesDialog',['../class_media_properties_dialog.html',1,'']]], + ['mediarename',['MediaRename',['../class_media_rename.html',1,'']]], + ['mediathrobber',['MediaThrobber',['../class_media_throbber.html',1,'']]], + ['menuhelper',['MenuHelper',['../class_menu_helper.html',1,'']]], + ['modifytransitioncommand',['ModifyTransitionCommand',['../class_modify_transition_command.html',1,'']]], + ['moveclipaction',['MoveClipAction',['../class_move_clip_action.html',1,'']]], + ['moveeffectcommand',['MoveEffectCommand',['../class_move_effect_command.html',1,'']]], + ['movemarkeraction',['MoveMarkerAction',['../class_move_marker_action.html',1,'']]] +]; diff --git a/docs/html/search/classes_a.html b/docs/html/search/classes_a.html new file mode 100644 index 000000000..ca7479a3d --- /dev/null +++ b/docs/html/search/classes_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_a.js b/docs/html/search/classes_a.js new file mode 100644 index 000000000..0c059820a --- /dev/null +++ b/docs/html/search/classes_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['newsequencecommand',['NewSequenceCommand',['../class_new_sequence_command.html',1,'']]], + ['newsequencedialog',['NewSequenceDialog',['../class_new_sequence_dialog.html',1,'']]] +]; diff --git a/docs/html/search/classes_b.html b/docs/html/search/classes_b.html new file mode 100644 index 000000000..ef8480206 --- /dev/null +++ b/docs/html/search/classes_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_b.js b/docs/html/search/classes_b.js new file mode 100644 index 000000000..3a3de9fae --- /dev/null +++ b/docs/html/search/classes_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['oliveaction',['OliveAction',['../class_olive_action.html',1,'']]], + ['oliveglobal',['OliveGlobal',['../class_olive_global.html',1,'']]], + ['otreeview',['OTreeView',['../class_o_tree_view.html',1,'']]] +]; diff --git a/docs/html/search/classes_c.html b/docs/html/search/classes_c.html new file mode 100644 index 000000000..052ea3c79 --- /dev/null +++ b/docs/html/search/classes_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_c.js b/docs/html/search/classes_c.js new file mode 100644 index 000000000..16f9fb409 --- /dev/null +++ b/docs/html/search/classes_c.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['paneffect',['PanEffect',['../class_pan_effect.html',1,'']]], + ['playbutton',['PlayButton',['../class_play_button.html',1,'']]], + ['preferencesdialog',['PreferencesDialog',['../class_preferences_dialog.html',1,'']]], + ['previewgenerator',['PreviewGenerator',['../class_preview_generator.html',1,'']]], + ['project',['Project',['../class_project.html',1,'']]], + ['projectfilter',['ProjectFilter',['../class_project_filter.html',1,'']]], + ['projectmodel',['ProjectModel',['../class_project_model.html',1,'']]], + ['proxydialog',['ProxyDialog',['../class_proxy_dialog.html',1,'']]], + ['proxygenerator',['ProxyGenerator',['../class_proxy_generator.html',1,'']]], + ['proxyinfo',['ProxyInfo',['../struct_proxy_info.html',1,'']]] +]; diff --git a/docs/html/search/classes_d.html b/docs/html/search/classes_d.html new file mode 100644 index 000000000..de68b5ab8 --- /dev/null +++ b/docs/html/search/classes_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_d.js b/docs/html/search/classes_d.js new file mode 100644 index 000000000..09ab9fd61 --- /dev/null +++ b/docs/html/search/classes_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['qpainterwrapper',['QPainterWrapper',['../class_q_painter_wrapper.html',1,'']]] +]; diff --git a/docs/html/search/classes_e.html b/docs/html/search/classes_e.html new file mode 100644 index 000000000..4ba8b8292 --- /dev/null +++ b/docs/html/search/classes_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_e.js b/docs/html/search/classes_e.js new file mode 100644 index 000000000..66355c83f --- /dev/null +++ b/docs/html/search/classes_e.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['refreshclips',['RefreshClips',['../class_refresh_clips.html',1,'']]], + ['reloadeffectscommand',['ReloadEffectsCommand',['../class_reload_effects_command.html',1,'']]], + ['removeclipsfromclipboard',['RemoveClipsFromClipboard',['../class_remove_clips_from_clipboard.html',1,'']]], + ['renameclipcommand',['RenameClipCommand',['../class_rename_clip_command.html',1,'']]], + ['renderthread',['RenderThread',['../class_render_thread.html',1,'']]], + ['replaceclipmediacommand',['ReplaceClipMediaCommand',['../class_replace_clip_media_command.html',1,'']]], + ['replaceclipmediadialog',['ReplaceClipMediaDialog',['../class_replace_clip_media_dialog.html',1,'']]], + ['replacemediacommand',['ReplaceMediaCommand',['../class_replace_media_command.html',1,'']]], + ['resizablescrollbar',['ResizableScrollBar',['../class_resizable_scroll_bar.html',1,'']]], + ['rippleaction',['RippleAction',['../class_ripple_action.html',1,'']]], + ['runtimeconfig',['RuntimeConfig',['../struct_runtime_config.html',1,'']]] +]; diff --git a/docs/html/search/classes_f.html b/docs/html/search/classes_f.html new file mode 100644 index 000000000..e85049739 --- /dev/null +++ b/docs/html/search/classes_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/classes_f.js b/docs/html/search/classes_f.js new file mode 100644 index 000000000..d66ea6a3e --- /dev/null +++ b/docs/html/search/classes_f.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['scrollarea',['ScrollArea',['../class_scroll_area.html',1,'']]], + ['selection',['Selection',['../struct_selection.html',1,'']]], + ['sequence',['Sequence',['../struct_sequence.html',1,'']]], + ['setautoscaleaction',['SetAutoscaleAction',['../class_set_autoscale_action.html',1,'']]], + ['setbool',['SetBool',['../class_set_bool.html',1,'']]], + ['setdouble',['SetDouble',['../class_set_double.html',1,'']]], + ['seteffectdata',['SetEffectData',['../class_set_effect_data.html',1,'']]], + ['setint',['SetInt',['../class_set_int.html',1,'']]], + ['setkeyframing',['SetKeyframing',['../class_set_keyframing.html',1,'']]], + ['setlong',['SetLong',['../class_set_long.html',1,'']]], + ['setpointer',['SetPointer',['../class_set_pointer.html',1,'']]], + ['setqvariant',['SetQVariant',['../class_set_q_variant.html',1,'']]], + ['setselectionscommand',['SetSelectionsCommand',['../class_set_selections_command.html',1,'']]], + ['setspeedaction',['SetSpeedAction',['../class_set_speed_action.html',1,'']]], + ['setstring',['SetString',['../class_set_string.html',1,'']]], + ['settimelineinoutcommand',['SetTimelineInOutCommand',['../class_set_timeline_in_out_command.html',1,'']]], + ['shakeeffect',['ShakeEffect',['../class_shake_effect.html',1,'']]], + ['solideffect',['SolidEffect',['../class_solid_effect.html',1,'']]], + ['sourceiconview',['SourceIconView',['../class_source_icon_view.html',1,'']]], + ['sourcescommon',['SourcesCommon',['../class_sources_common.html',1,'']]], + ['sourcetable',['SourceTable',['../class_source_table.html',1,'']]], + ['speeddialog',['SpeedDialog',['../class_speed_dialog.html',1,'']]], + ['stabilizerdialog',['StabilizerDialog',['../class_stabilizer_dialog.html',1,'']]] +]; diff --git a/docs/html/search/close.png b/docs/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/docs/html/search/functions_0.html b/docs/html/search/functions_0.html new file mode 100644 index 000000000..bc73761f5 --- /dev/null +++ b/docs/html/search/functions_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_0.js b/docs/html/search/functions_0.js new file mode 100644 index 000000000..fec0fd631 --- /dev/null +++ b/docs/html/search/functions_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['can_5fclose_5fproject',['can_close_project',['../class_olive_global.html#a634b935875324ef89ac8088b10a8707f',1,'OliveGlobal']]], + ['check_5ffor_5fautorecovery_5ffile',['check_for_autorecovery_file',['../class_olive_global.html#aed575061a3669d27854f76b3af599846',1,'OliveGlobal']]], + ['clear_5fin',['clear_in',['../class_focus_filter.html#a64b5f3777c6e9419e13fe388ee2975ff',1,'FocusFilter']]], + ['clear_5finout',['clear_inout',['../class_focus_filter.html#a96eaaf8404de284edac0aa15de9c5dc4',1,'FocusFilter']]], + ['clear_5fout',['clear_out',['../class_focus_filter.html#a7357058d6bd8b1e9ca9d5e8b25c2432e',1,'FocusFilter']]], + ['clear_5fundo_5fstack',['clear_undo_stack',['../class_olive_global.html#a097586341c27234802fb42f7ee1d40c6',1,'OliveGlobal']]], + ['clicked',['clicked',['../class_label_slider.html#a4b7301bbdad1d6dca30aa0e878818706',1,'LabelSlider']]], + ['closeevent',['closeEvent',['../class_main_window.html#a4aa386518569b0bbceb958df0ddc8f32',1,'MainWindow']]], + ['copy',['copy',['../class_focus_filter.html#a28498f9a8d44f649826431e53f57863c',1,'FocusFilter']]], + ['cut',['cut',['../class_focus_filter.html#a222ebf21b2aefbb43085839a8b95ae3e',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_1.html b/docs/html/search/functions_1.html new file mode 100644 index 000000000..bfcf880be --- /dev/null +++ b/docs/html/search/functions_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_1.js b/docs/html/search/functions_1.js new file mode 100644 index 000000000..51828ef8f --- /dev/null +++ b/docs/html/search/functions_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['decrease_5fspeed',['decrease_speed',['../class_focus_filter.html#a7df3eede8f25fde514142046b3352c09',1,'FocusFilter']]], + ['delete_5ffunction',['delete_function',['../class_focus_filter.html#a7d9dbfa4b9595a4e83b01c54f123b3a7',1,'FocusFilter']]], + ['duplicate',['duplicate',['../class_focus_filter.html#a603997516bd2e5954e8cb49fa87c8bad',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_10.html b/docs/html/search/functions_10.html new file mode 100644 index 000000000..d69badf9e --- /dev/null +++ b/docs/html/search/functions_10.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_10.js b/docs/html/search/functions_10.js new file mode 100644 index 000000000..e366e6517 --- /dev/null +++ b/docs/html/search/functions_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['windowmenu_5fabout_5fto_5fbe_5fshown',['windowMenu_About_To_Be_Shown',['../class_main_window.html#a33a60acf2c71874faf766dabd446e071',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_11.html b/docs/html/search/functions_11.html new file mode 100644 index 000000000..2c143588e --- /dev/null +++ b/docs/html/search/functions_11.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_11.js b/docs/html/search/functions_11.js new file mode 100644 index 000000000..33bfb7520 --- /dev/null +++ b/docs/html/search/functions_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['zoom_5fin',['zoom_in',['../class_focus_filter.html#a25c6fc709acf758f0c965420b3f10745',1,'FocusFilter']]], + ['zoom_5fout',['zoom_out',['../class_focus_filter.html#a723180d73f272ae21ab8b8001353f610',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_2.html b/docs/html/search/functions_2.html new file mode 100644 index 000000000..2b44474ed --- /dev/null +++ b/docs/html/search/functions_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_2.js b/docs/html/search/functions_2.js new file mode 100644 index 000000000..0bfeac804 --- /dev/null +++ b/docs/html/search/functions_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['editmenu_5fabout_5fto_5fbe_5fshown',['editMenu_About_To_Be_Shown',['../class_main_window.html#a5f23bbfaed3c23ea97640411e09cafc5',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_3.html b/docs/html/search/functions_3.html new file mode 100644 index 000000000..3dca36715 --- /dev/null +++ b/docs/html/search/functions_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_3.js b/docs/html/search/functions_3.js new file mode 100644 index 000000000..905dd5270 --- /dev/null +++ b/docs/html/search/functions_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['filemenu_5fabout_5fto_5fbe_5fshown',['fileMenu_About_To_Be_Shown',['../class_main_window.html#a20044854458738b479d85d5291257105',1,'MainWindow']]], + ['finished_5ffirst_5fpaint',['finished_first_paint',['../class_main_window.html#ad87af70df9998f4a30b5c5bba7eace41',1,'MainWindow']]], + ['finished_5finitialize',['finished_initialize',['../class_olive_global.html#a60dbd750a5eedea296cbe40bc8d4051e',1,'OliveGlobal']]], + ['focusfilter',['FocusFilter',['../class_focus_filter.html#ac1b7def442c41825dd1fc31f5cbf9fe9',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_4.html b/docs/html/search/functions_4.html new file mode 100644 index 000000000..e713f2867 --- /dev/null +++ b/docs/html/search/functions_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_4.js b/docs/html/search/functions_4.js new file mode 100644 index 000000000..a36439a91 --- /dev/null +++ b/docs/html/search/functions_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['get_5fproject_5ffile_5ffilter',['get_project_file_filter',['../class_olive_global.html#ac57ead290b6cf9895aa11a1200d7c397',1,'OliveGlobal']]], + ['get_5frecent_5fproject_5flist_5ffile',['get_recent_project_list_file',['../class_olive_global.html#acf4fdfadaf62290f28de49c12d58cb5b',1,'OliveGlobal']]], + ['getpreviousvalue',['getPreviousValue',['../class_label_slider.html#a4b807b5b784a7b7b9b9d0a7b3706a4e4',1,'LabelSlider']]], + ['go_5fto_5fend',['go_to_end',['../class_focus_filter.html#a508677d87d24280a9ed5012bfdb81d87',1,'FocusFilter']]], + ['go_5fto_5fin',['go_to_in',['../class_focus_filter.html#a095e3fb9f4f9258ff1d576f0172653d6',1,'FocusFilter']]], + ['go_5fto_5fout',['go_to_out',['../class_focus_filter.html#ad1433575afa3713fecae28ea2a00a026',1,'FocusFilter']]], + ['go_5fto_5fstart',['go_to_start',['../class_focus_filter.html#a8fb9425128c635829d6103f7478d8e51',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_5.html b/docs/html/search/functions_5.html new file mode 100644 index 000000000..cfe6b17d9 --- /dev/null +++ b/docs/html/search/functions_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_5.js b/docs/html/search/functions_5.js new file mode 100644 index 000000000..cfc29e00a --- /dev/null +++ b/docs/html/search/functions_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['increase_5fspeed',['increase_speed',['../class_focus_filter.html#ab535fc8179e1eb6221fb8951ec0b8771',1,'FocusFilter']]], + ['is_5fdragging',['is_dragging',['../class_label_slider.html#ac51e4b18b54b182a6cb741093559b13e',1,'LabelSlider']]], + ['is_5fset',['is_set',['../class_label_slider.html#ac446ce259367ff1159935f812dd73f08',1,'LabelSlider']]] +]; diff --git a/docs/html/search/functions_6.html b/docs/html/search/functions_6.html new file mode 100644 index 000000000..a78ec13f1 --- /dev/null +++ b/docs/html/search/functions_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_6.js b/docs/html/search/functions_6.js new file mode 100644 index 000000000..4fab7fa26 --- /dev/null +++ b/docs/html/search/functions_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['load_5fcss_5ffrom_5ffile',['load_css_from_file',['../class_main_window.html#a281ed536e019361da2b5a780dd48e6b2',1,'MainWindow']]], + ['load_5fproject_5fon_5flaunch',['load_project_on_launch',['../class_olive_global.html#a457ad9d7f5d716b0f23a7aa01187da5d',1,'OliveGlobal']]], + ['load_5fshortcuts',['load_shortcuts',['../class_main_window.html#a9f173804b8c478a35eaad1938e289947',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_7.html b/docs/html/search/functions_7.html new file mode 100644 index 000000000..7842361ff --- /dev/null +++ b/docs/html/search/functions_7.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_7.js b/docs/html/search/functions_7.js new file mode 100644 index 000000000..8c59914b9 --- /dev/null +++ b/docs/html/search/functions_7.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['make_5fclip_5ffunctions_5fmenu',['make_clip_functions_menu',['../class_menu_helper.html#ad7cc7086317b2ea8bb1774f2b749a9fd',1,'MenuHelper']]], + ['make_5fedit_5ffunctions_5fmenu',['make_edit_functions_menu',['../class_menu_helper.html#a0138f049061657ff93a41708e1e06718',1,'MenuHelper']]], + ['make_5finout_5fmenu',['make_inout_menu',['../class_menu_helper.html#aa6bb56c91cb0980a16e447dd34074fe2',1,'MenuHelper']]], + ['make_5fnew_5fmenu',['make_new_menu',['../class_menu_helper.html#ad4c34ddfd794f642f42ea08bf76124cc',1,'MenuHelper']]], + ['maximize_5fpanel',['maximize_panel',['../class_main_window.html#af1779e3b578dd30f41e9dc59d7e0553f',1,'MainWindow']]], + ['menu_5fclick_5fbutton',['menu_click_button',['../class_menu_helper.html#a508f997ac25f7c5830b03161fda1b25f',1,'MenuHelper']]] +]; diff --git a/docs/html/search/functions_8.html b/docs/html/search/functions_8.html new file mode 100644 index 000000000..48feafe56 --- /dev/null +++ b/docs/html/search/functions_8.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_8.js b/docs/html/search/functions_8.js new file mode 100644 index 000000000..754c54538 --- /dev/null +++ b/docs/html/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['new_5fproject',['new_project',['../class_olive_global.html#a96005523cb0a1ba0c4647ce2f2791331',1,'OliveGlobal']]], + ['next_5fframe',['next_frame',['../class_focus_filter.html#a65943730d91348720430b2c5ba10e21f',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_9.html b/docs/html/search/functions_9.html new file mode 100644 index 000000000..0f05a8ba4 --- /dev/null +++ b/docs/html/search/functions_9.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_9.js b/docs/html/search/functions_9.js new file mode 100644 index 000000000..41f5709af --- /dev/null +++ b/docs/html/search/functions_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['oliveglobal',['OliveGlobal',['../class_olive_global.html#a8ee567e30178cd747396c6222970de1b',1,'OliveGlobal']]], + ['open_5fabout_5fdialog',['open_about_dialog',['../class_olive_global.html#a161a4b6f88441f82f0e90331f39044fb',1,'OliveGlobal']]], + ['open_5faction_5fsearch',['open_action_search',['../class_olive_global.html#a9a255c3b943eca104abb777243d32dee',1,'OliveGlobal']]], + ['open_5fdebug_5flog',['open_debug_log',['../class_olive_global.html#a0c142bf5d9f0ab9753154b3926b08d37',1,'OliveGlobal']]], + ['open_5fexport_5fdialog',['open_export_dialog',['../class_olive_global.html#abb20f21708320f258d99a2737640129e',1,'OliveGlobal']]], + ['open_5fpreferences',['open_preferences',['../class_olive_global.html#a481765a0b424ca37c50326dbe97fb204',1,'OliveGlobal']]], + ['open_5fproject',['open_project',['../class_olive_global.html#aaa945027c0f85fe2b65ad7be5997e02f',1,'OliveGlobal']]], + ['open_5fproject_5fworker',['open_project_worker',['../class_olive_global.html#a59e4870f994af018fb71d3871872fd7e',1,'OliveGlobal']]], + ['open_5frecent',['open_recent',['../class_olive_global.html#a7eaad3e9ab9637f48f2a3cbcb1628a42',1,'OliveGlobal']]], + ['open_5frecent_5ffrom_5fmenu',['open_recent_from_menu',['../class_menu_helper.html#ae46d3ef4f566734c6d38512933cb353b',1,'MenuHelper']]], + ['open_5fspeed_5fdialog',['open_speed_dialog',['../class_olive_global.html#abc5fb406d67e5f62602b3806fcab04f2',1,'OliveGlobal']]] +]; diff --git a/docs/html/search/functions_a.html b/docs/html/search/functions_a.html new file mode 100644 index 000000000..03faad22f --- /dev/null +++ b/docs/html/search/functions_a.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_a.js b/docs/html/search/functions_a.js new file mode 100644 index 000000000..ea9577c00 --- /dev/null +++ b/docs/html/search/functions_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['paintevent',['paintEvent',['../class_main_window.html#a227c9fbd4c9757d4a98c333f8a905e17',1,'MainWindow']]], + ['paste',['paste',['../class_olive_global.html#a8574a0c2c68978756671d0289ca9e8ff',1,'OliveGlobal']]], + ['paste_5finsert',['paste_insert',['../class_olive_global.html#a6f6f44ef9503d674851b761c927e8154',1,'OliveGlobal']]], + ['pause',['pause',['../class_focus_filter.html#ad19e5a72819075115ced232bc8031cc1',1,'FocusFilter']]], + ['play_5fin_5fto_5fout',['play_in_to_out',['../class_focus_filter.html#af0c6edcbcbffb186efb00b77081c8f7b',1,'FocusFilter']]], + ['playbackmenu_5fabout_5fto_5fbe_5fshown',['playbackMenu_About_To_Be_Shown',['../class_main_window.html#a6d6a492bfc20a7d9758d4570bced46e9',1,'MainWindow']]], + ['playpause',['playpause',['../class_focus_filter.html#ae4862f15057c3af9b50798333bb5194e',1,'FocusFilter']]], + ['prev_5fframe',['prev_frame',['../class_focus_filter.html#a27db0137e8ff818a04bf70448012a7dd',1,'FocusFilter']]] +]; diff --git a/docs/html/search/functions_b.html b/docs/html/search/functions_b.html new file mode 100644 index 000000000..c690013ae --- /dev/null +++ b/docs/html/search/functions_b.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_b.js b/docs/html/search/functions_b.js new file mode 100644 index 000000000..a01ba5be3 --- /dev/null +++ b/docs/html/search/functions_b.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['redo',['redo',['../class_olive_global.html#a501c01aa8f27966ea6fc4c3b74ee8a17',1,'OliveGlobal']]], + ['reset_5flayout',['reset_layout',['../class_main_window.html#a71cf1b26b6f2b58ea307bc2340bed64d',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_c.html b/docs/html/search/functions_c.html new file mode 100644 index 000000000..3b2976a04 --- /dev/null +++ b/docs/html/search/functions_c.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_c.js b/docs/html/search/functions_c.js new file mode 100644 index 000000000..9888bc257 --- /dev/null +++ b/docs/html/search/functions_c.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['save_5fautorecovery_5ffile',['save_autorecovery_file',['../class_olive_global.html#a683bdbe17929ce90db233a3cdff8fc30',1,'OliveGlobal']]], + ['save_5fproject',['save_project',['../class_olive_global.html#a465ffe390d9b615ed8216d2335039197',1,'OliveGlobal']]], + ['save_5fproject_5fas',['save_project_as',['../class_olive_global.html#ab3f5f0874214f7ecac66d7ab152a8141',1,'OliveGlobal']]], + ['save_5fshortcuts',['save_shortcuts',['../class_main_window.html#ade97fa7698ec0bd744ffef8808dfb24b',1,'MainWindow']]], + ['select_5fall',['select_all',['../class_focus_filter.html#a4e91f2fe5798f054d53436247bb2f60d',1,'FocusFilter']]], + ['set_5factive_5fcursor',['set_active_cursor',['../class_label_slider.html#a654943c90cc8d87a2dbc957a42252ef0',1,'LabelSlider']]], + ['set_5fautoscroll',['set_autoscroll',['../class_menu_helper.html#aefd8a07595d457e27aabe366cd4d2dbb',1,'MenuHelper']]], + ['set_5fbool_5faction_5fchecked',['set_bool_action_checked',['../class_menu_helper.html#a03f62557c81dbffab88ad0edaf522762',1,'MenuHelper']]], + ['set_5fbutton_5faction_5fchecked',['set_button_action_checked',['../class_menu_helper.html#a26de4da960087ca481b8520b129c7b7f',1,'MenuHelper']]], + ['set_5fcolor',['set_color',['../class_label_slider.html#abbbf055704231fd56978fac964518be6',1,'LabelSlider']]], + ['set_5fdefault_5fcursor',['set_default_cursor',['../class_label_slider.html#a9a5c67bed20e30581b7c0c503a93de8c',1,'LabelSlider']]], + ['set_5fdefault_5fvalue',['set_default_value',['../class_label_slider.html#a5c08c16c088f1846621bfe341fe875c7',1,'LabelSlider']]], + ['set_5fdisplay_5ftype',['set_display_type',['../class_label_slider.html#aa36f1ac8359e6ad956890c204601dc8e',1,'LabelSlider']]], + ['set_5fframe_5frate',['set_frame_rate',['../class_label_slider.html#ab304e6dfceb1678153047d8437be0ef5',1,'LabelSlider']]], + ['set_5fin_5fpoint',['set_in_point',['../class_focus_filter.html#ae92ec419038408bfe07ff359abf8a2f1',1,'FocusFilter']]], + ['set_5fint_5faction_5fchecked',['set_int_action_checked',['../class_menu_helper.html#ab152c4e0a116a10735a4ab8e3da91736',1,'MenuHelper']]], + ['set_5fmarker',['set_marker',['../class_focus_filter.html#a44ffefc5cf2559e7d08986d3cfa02c89',1,'FocusFilter']]], + ['set_5fmaximum_5fvalue',['set_maximum_value',['../class_label_slider.html#abe90995d780d3ae610358ec34b19ee48',1,'LabelSlider']]], + ['set_5fminimum_5fvalue',['set_minimum_value',['../class_label_slider.html#ad0915199716155c2f12c5b5292b9ecc9',1,'LabelSlider']]], + ['set_5fout_5fpoint',['set_out_point',['../class_focus_filter.html#a54d15c99741150d31a534ee057f36a9e',1,'FocusFilter']]], + ['set_5fprevious_5fvalue',['set_previous_value',['../class_label_slider.html#aa8e8edf8dc7ea4df8e0abb6f32c343ac',1,'LabelSlider']]], + ['set_5frendering_5fstate',['set_rendering_state',['../class_olive_global.html#a2763e87021f250965f67e175ee6c6e67',1,'OliveGlobal']]], + ['set_5ftimecode_5fview',['set_timecode_view',['../class_menu_helper.html#a9ec427f151cf31a821db32cf71d66ef0',1,'MenuHelper']]], + ['set_5ftitlesafe_5ffrom_5fmenu',['set_titlesafe_from_menu',['../class_menu_helper.html#a9c109452d8af3237cee07e9f53030e7c',1,'MenuHelper']]], + ['set_5fvalue',['set_value',['../class_label_slider.html#ae05af4cf1dce88261673ed2ec5ec5d41',1,'LabelSlider']]], + ['set_5fviewer_5ffullscreen',['set_viewer_fullscreen',['../class_focus_filter.html#a58f52ec833dc287619ddbd4595d15a65',1,'FocusFilter']]], + ['setup_5flayout',['setup_layout',['../class_main_window.html#a549905e8c0d69bbd0a2ef13f1e645387',1,'MainWindow']]], + ['setup_5fmenus',['setup_menus',['../class_main_window.html#a8030447a20f462e4262b9ad5230d98c1',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_d.html b/docs/html/search/functions_d.html new file mode 100644 index 000000000..0c542463f --- /dev/null +++ b/docs/html/search/functions_d.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_d.js b/docs/html/search/functions_d.js new file mode 100644 index 000000000..92bf45043 --- /dev/null +++ b/docs/html/search/functions_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['toggle_5fbool_5faction',['toggle_bool_action',['../class_menu_helper.html#a89ebceb4b52b93ea82ec7fa7ac253718',1,'MenuHelper']]], + ['toggle_5ffull_5fscreen',['toggle_full_screen',['../class_main_window.html#a3eb037c22e6f684831e3a8eeec0101c4',1,'MainWindow']]], + ['toggle_5fpanel_5fvisibility',['toggle_panel_visibility',['../class_main_window.html#a3a8a0f75baca4ee12fc7ebfe6c05e45b',1,'MainWindow']]], + ['toolmenu_5fabout_5fto_5fbe_5fshown',['toolMenu_About_To_Be_Shown',['../class_main_window.html#a2de6d447c7936ae2f9964c4b5b1ee1c6',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_e.html b/docs/html/search/functions_e.html new file mode 100644 index 000000000..c1bd8701e --- /dev/null +++ b/docs/html/search/functions_e.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_e.js b/docs/html/search/functions_e.js new file mode 100644 index 000000000..6574482b2 --- /dev/null +++ b/docs/html/search/functions_e.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['undo',['undo',['../class_olive_global.html#ac5c7fc8e77040c8260e2e817e3e7b165',1,'OliveGlobal']]], + ['update_5fproject_5ffilename',['update_project_filename',['../class_olive_global.html#af3ef4cb94078beb905eb916a160fe826',1,'OliveGlobal']]], + ['updatetitle',['updateTitle',['../class_main_window.html#ac62839f0a6f642f68f06729f351893e3',1,'MainWindow']]] +]; diff --git a/docs/html/search/functions_f.html b/docs/html/search/functions_f.html new file mode 100644 index 000000000..38b6e817c --- /dev/null +++ b/docs/html/search/functions_f.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/functions_f.js b/docs/html/search/functions_f.js new file mode 100644 index 000000000..ee6dbeb18 --- /dev/null +++ b/docs/html/search/functions_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['value',['value',['../class_label_slider.html#a5736dbba98a0eb8958eed03046f77f8f',1,'LabelSlider']]], + ['valuechanged',['valueChanged',['../class_label_slider.html#a9be91d45b50e409325332d441f3edf7d',1,'LabelSlider']]], + ['valuetostring',['valueToString',['../class_label_slider.html#a8009482f1461ae35500fb5956e723f2c',1,'LabelSlider']]], + ['viewmenu_5fabout_5fto_5fbe_5fshown',['viewMenu_About_To_Be_Shown',['../class_main_window.html#a2e4fd4ecc5e0487ca2d98735b01ccf41',1,'MainWindow']]] +]; diff --git a/docs/html/search/mag_sel.png b/docs/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/docs/html/search/nomatches.html b/docs/html/search/nomatches.html new file mode 100644 index 000000000..437732089 --- /dev/null +++ b/docs/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/docs/html/search/pages_0.html b/docs/html/search/pages_0.html new file mode 100644 index 000000000..3d06b0521 --- /dev/null +++ b/docs/html/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js new file mode 100644 index 000000000..98838e9e7 --- /dev/null +++ b/docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['olive_20video_20editor',['Olive Video Editor',['../md__r_e_a_d_m_e.html',1,'']]] +]; diff --git a/docs/html/search/search.css b/docs/html/search/search.css new file mode 100644 index 000000000..3cf9df94a --- /dev/null +++ b/docs/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/docs/html/search/search.js b/docs/html/search/search.js new file mode 100644 index 000000000..a554ab9cb --- /dev/null +++ b/docs/html/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/docs/html/search/search_r.png b/docs/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/docs/html/search/searchdata.js b/docs/html/search/searchdata.js new file mode 100644 index 000000000..6f0f67121 --- /dev/null +++ b/docs/html/search/searchdata.js @@ -0,0 +1,27 @@ +var indexSectionsWithContent = +{ + 0: "_acdefgiklmnopqrstuvwz", + 1: "_acdefgklmnopqrstuv", + 2: "cdefgilmnoprstuvwz", + 3: "adeops", + 4: "o" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "functions", + 3: "variables", + 4: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Functions", + 3: "Variables", + 4: "Pages" +}; + diff --git a/docs/html/search/variables_0.html b/docs/html/search/variables_0.html new file mode 100644 index 000000000..12104bcb5 --- /dev/null +++ b/docs/html/search/variables_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_0.js b/docs/html/search/variables_0.js new file mode 100644 index 000000000..22c532a22 --- /dev/null +++ b/docs/html/search/variables_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['autorecovery_5ftimer',['autorecovery_timer',['../class_olive_global.html#a78f108b6ed6a5a7f13a69f51038bb2b5',1,'OliveGlobal']]] +]; diff --git a/docs/html/search/variables_1.html b/docs/html/search/variables_1.html new file mode 100644 index 000000000..b784017a1 --- /dev/null +++ b/docs/html/search/variables_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_1.js b/docs/html/search/variables_1.js new file mode 100644 index 000000000..5ad355c8c --- /dev/null +++ b/docs/html/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['decimal_5fplaces',['decimal_places',['../class_label_slider.html#afc2a71530cff38dfe586e73dabe99be9',1,'LabelSlider']]] +]; diff --git a/docs/html/search/variables_2.html b/docs/html/search/variables_2.html new file mode 100644 index 000000000..0cb98d305 --- /dev/null +++ b/docs/html/search/variables_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_2.js b/docs/html/search/variables_2.js new file mode 100644 index 000000000..39357b3b0 --- /dev/null +++ b/docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['enable_5fload_5fproject_5fon_5finit',['enable_load_project_on_init',['../class_olive_global.html#a41a11e816954dbc44e2b24c1d7fe0398',1,'OliveGlobal']]] +]; diff --git a/docs/html/search/variables_3.html b/docs/html/search/variables_3.html new file mode 100644 index 000000000..1e83bf5a9 --- /dev/null +++ b/docs/html/search/variables_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_3.js b/docs/html/search/variables_3.js new file mode 100644 index 000000000..021cb0916 --- /dev/null +++ b/docs/html/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['old_5fwindow_5fmodified',['old_window_modified',['../class_olive_action.html#a2ad0d3899c37dce7caed1b9d22a6c892',1,'OliveAction']]] +]; diff --git a/docs/html/search/variables_4.html b/docs/html/search/variables_4.html new file mode 100644 index 000000000..39883bd60 --- /dev/null +++ b/docs/html/search/variables_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_4.js b/docs/html/search/variables_4.js new file mode 100644 index 000000000..2fce7e6a3 --- /dev/null +++ b/docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_5ffile_5ffilter',['project_file_filter',['../class_olive_global.html#a053f4de79194655e0a51b538e0bb0d95',1,'OliveGlobal']]] +]; diff --git a/docs/html/search/variables_5.html b/docs/html/search/variables_5.html new file mode 100644 index 000000000..f25879c02 --- /dev/null +++ b/docs/html/search/variables_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/docs/html/search/variables_5.js b/docs/html/search/variables_5.js new file mode 100644 index 000000000..9db823b9c --- /dev/null +++ b/docs/html/search/variables_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['set_5fwindow_5fmodified',['set_window_modified',['../class_olive_action.html#a029f9d31c03e2ec38ad8c72ff1279746',1,'OliveAction']]] +]; diff --git a/docs/html/selection_8h_source.html b/docs/html/selection_8h_source.html new file mode 100644 index 000000000..473a6571e --- /dev/null +++ b/docs/html/selection_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: project/selection.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    selection.h
    +
    +
    +
    1 #ifndef SELECTION_H
    2 #define SELECTION_H
    3 
    4 struct Selection {
    5  long in;
    6  long out;
    7  int track;
    8 
    9  long old_in;
    10  long old_out;
    11  int old_track;
    12 
    13  bool trim_in;
    14 };
    15 
    16 #endif // SELECTION_H
    Definition: selection.h:4
    +
    + + + + diff --git a/docs/html/sequence_8h_source.html b/docs/html/sequence_8h_source.html new file mode 100644 index 000000000..b69f70ca5 --- /dev/null +++ b/docs/html/sequence_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: project/sequence.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sequence.h
    +
    +
    +
    1 #ifndef SEQUENCE_H
    2 #define SEQUENCE_H
    3 
    4 #include <QVector>
    5 
    6 #include "project/marker.h"
    7 #include "project/selection.h"
    8 
    9 class Clip;
    10 class Transition;
    11 class Media;
    12 
    13 struct Sequence {
    14  Sequence();
    15  ~Sequence();
    16  Sequence* copy();
    17  QString name;
    18  void getTrackLimits(int* video_tracks, int* audio_tracks);
    19  long getEndFrame();
    20  void hard_delete_transition(Clip *c, int type);
    21  int width;
    22  int height;
    23  double frame_rate;
    24  int audio_frequency;
    25  int audio_layout;
    26 
    27  QVector<Selection> selections;
    28  long playhead;
    29 
    30  bool using_workarea;
    31  long workarea_in;
    32  long workarea_out;
    33 
    34  bool wrapper_sequence;
    35 
    36  int save_id;
    37 
    38  QVector<Marker> markers;
    39  QVector<Clip*> clips;
    40  QVector<Transition*> transitions;
    41 };
    42 
    43 // static variable for the currently active sequence
    44 namespace Olive {
    45  extern Sequence* ActiveSequence;
    46 }
    47 
    48 #endif // SEQUENCE_H
    Definition: sequence.h:13
    +
    Definition: media.h:20
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/shakeeffect_8h_source.html b/docs/html/shakeeffect_8h_source.html new file mode 100644 index 000000000..58f921e6e --- /dev/null +++ b/docs/html/shakeeffect_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: effects/internal/shakeeffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    shakeeffect.h
    +
    +
    +
    1 #ifndef SHAKEEFFECT_H
    2 #define SHAKEEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 #define RANDOM_VAL_SIZE 30
    7 
    8 class ShakeEffect : public Effect {
    9  Q_OBJECT
    10 public:
    11  ShakeEffect(Clip* c, const EffectMeta* em);
    12  void process_coords(double timecode, GLTextureCoords& coords, int data);
    13 
    14  EffectField* intensity_val;
    15  EffectField* rotation_val;
    16  EffectField* frequency_val;
    17 private:
    18  double random_vals[RANDOM_VAL_SIZE];
    19 };
    20 
    21 #endif // SHAKEEFFECT_H
    Definition: effect.h:105
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    Definition: shakeeffect.h:8
    +
    + + + + diff --git a/docs/html/solideffect_8h_source.html b/docs/html/solideffect_8h_source.html new file mode 100644 index 000000000..354efb3a2 --- /dev/null +++ b/docs/html/solideffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/solideffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    solideffect.h
    +
    +
    +
    1 #ifndef SOLIDEFFECT_H
    2 #define SOLIDEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class QOpenGLTexture;
    7 #include <QImage>
    8 
    9 class SolidEffect : public Effect {
    10  Q_OBJECT
    11 public:
    12  SolidEffect(Clip* c, const EffectMeta *em);
    13  void redraw(double timecode);
    14 private slots:
    15  void ui_update(int);
    16 private:
    17  EffectField* solid_type;
    18  EffectField* solid_color_field;
    19  EffectField* opacity_field;
    20  EffectField* checkerboard_size_field;
    21 };
    22 
    23 #endif // SOLIDEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: solideffect.h:9
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/sourceiconview_8h_source.html b/docs/html/sourceiconview_8h_source.html new file mode 100644 index 000000000..66a07f78d --- /dev/null +++ b/docs/html/sourceiconview_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: ui/sourceiconview.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sourceiconview.h
    +
    +
    +
    1 #ifndef SOURCEICONVIEW_H
    2 #define SOURCEICONVIEW_H
    3 
    4 #include <QListView>
    5 
    6 class Project;
    7 
    8 class SourceIconView : public QListView {
    9  Q_OBJECT
    10 public:
    11  SourceIconView(QWidget* parent = 0);
    12  Project* project_parent;
    13 
    14  void mousePressEvent(QMouseEvent* event);
    15  void mouseDoubleClickEvent(QMouseEvent *event);
    16  void dragEnterEvent(QDragEnterEvent *event);
    17  void dragMoveEvent(QDragMoveEvent *event);
    18  void dropEvent(QDropEvent* event);
    19 signals:
    20  void changed_root();
    21 private slots:
    22  void show_context_menu();
    23  void item_click(const QModelIndex& index);
    24 };
    25 
    26 #endif // SOURCEICONVIEW_H
    Definition: project.h:40
    +
    Definition: sourceiconview.h:8
    +
    + + + + diff --git a/docs/html/sourcescommon_8h_source.html b/docs/html/sourcescommon_8h_source.html new file mode 100644 index 000000000..7569dc47d --- /dev/null +++ b/docs/html/sourcescommon_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: project/sourcescommon.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sourcescommon.h
    +
    +
    +
    1 #ifndef SOURCESCOMMON_H
    2 #define SOURCESCOMMON_H
    3 
    4 #include <QModelIndexList>
    5 #include <QTimer>
    6 #include <QVector>
    7 
    8 class Project;
    9 class QMouseEvent;
    10 class Media;
    11 class QAbstractItemView;
    12 class QDropEvent;
    13 
    14 struct Footage;
    15 
    16 class SourcesCommon : public QObject {
    17  Q_OBJECT
    18 public:
    19  SourcesCommon(Project *parent);
    20  QAbstractItemView* view;
    21  void show_context_menu(QWidget* parent, const QModelIndexList &items);
    22 
    23  void mousePressEvent(QMouseEvent* e);
    24  void mouseDoubleClickEvent(QMouseEvent* e, const QModelIndexList& selected_items);
    25  void dropEvent(QWidget *parent, QDropEvent* e, const QModelIndex& drop_item, const QModelIndexList &items);
    26 
    27  void item_click(Media* m, const QModelIndex &index);
    28 private slots:
    29  void create_seq_from_selected();
    30  void reveal_in_browser();
    31  void rename_interval();
    32  void item_renamed(Media *item);
    33 
    34  // proxy functions
    35  void open_create_proxy_dialog();
    36  void clear_proxies_from_selected();
    37 private:
    38  Media* editing_item;
    39  QModelIndex editing_index;
    40  QModelIndexList selected_items;
    41  Project* project_parent;
    42  void stop_rename_timer();
    43  QTimer rename_timer;
    44 
    45  // we cache the selected footage items for open_create_proxy_dialog()
    46  QVector<Footage*> cached_selected_footage;
    47 };
    48 
    49 #endif // SOURCESCOMMON_H
    Definition: media.h:20
    +
    Definition: project.h:40
    +
    Definition: sourcescommon.h:16
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/sourcetable_8h_source.html b/docs/html/sourcetable_8h_source.html new file mode 100644 index 000000000..6dd61eddd --- /dev/null +++ b/docs/html/sourcetable_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: ui/sourcetable.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sourcetable.h
    +
    +
    +
    1 #ifndef SOURCETABLE_H
    2 #define SOURCETABLE_H
    3 
    4 #include <QTreeView>
    5 #include <QTimer>
    6 #include <QUndoCommand>
    7 
    8 class Project;
    9 class Media;
    10 
    11 class SourceTable : public QTreeView
    12 {
    13  Q_OBJECT
    14 public:
    15  SourceTable(QWidget* parent = 0);
    16  Project* project_parent;
    17 protected:
    18  void mousePressEvent(QMouseEvent*);
    19  void mouseDoubleClickEvent(QMouseEvent *);
    20  void dragEnterEvent(QDragEnterEvent *event);
    21  void dragMoveEvent(QDragMoveEvent *event);
    22  void dropEvent(QDropEvent *event);
    23 private slots:
    24  void item_click(const QModelIndex& index);
    25  void show_context_menu();
    26 };
    27 
    28 #endif // SOURCETABLE_H
    Definition: sourcetable.h:11
    +
    Definition: media.h:20
    +
    Definition: project.h:40
    +
    + + + + diff --git a/docs/html/speeddialog_8h_source.html b/docs/html/speeddialog_8h_source.html new file mode 100644 index 000000000..de538dca2 --- /dev/null +++ b/docs/html/speeddialog_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: dialogs/speeddialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    speeddialog.h
    +
    +
    +
    1 #ifndef SPEEDDIALOG_H
    2 #define SPEEDDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class Clip;
    7 class LabelSlider;
    8 class QCheckBox;
    9 
    10 class SpeedDialog : public QDialog
    11 {
    12  Q_OBJECT
    13 public:
    14  SpeedDialog(QWidget* parent = 0);
    15  QVector<Clip*> clips;
    16 
    17  void run();
    18 private slots:
    19  void percent_update();
    20  void duration_update();
    21  void frame_rate_update();
    22  void accept();
    23 private:
    24  LabelSlider* percent;
    25  LabelSlider* duration;
    26  LabelSlider* frame_rate;
    27 
    28  QCheckBox* reverse;
    29  QCheckBox* maintain_pitch;
    30  QCheckBox* ripple;
    31 
    32  double default_frame_rate;
    33  double current_frame_rate;
    34  double current_percent;
    35  long default_length;
    36  long current_length;
    37 };
    38 
    39 #endif // SPEEDDIALOG_H
    Definition: speeddialog.h:10
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/splitbar.png b/docs/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/docs/html/stabilizerdialog_8h_source.html b/docs/html/stabilizerdialog_8h_source.html new file mode 100644 index 000000000..c6a8cf684 --- /dev/null +++ b/docs/html/stabilizerdialog_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: dialogs/stabilizerdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    stabilizerdialog.h
    +
    +
    +
    1 #ifndef STABILIZERDIALOG_H
    2 #define STABILIZERDIALOG_H
    3 
    4 class QVBoxLayout;
    5 class QCheckBox;
    6 class QDialogButtonBox;
    7 class QGroupBox;
    8 class QGridLayout;
    9 class LabelSlider;
    10 
    11 #include <QDialog>
    12 
    13 class StabilizerDialog : public QDialog
    14 {
    15  Q_OBJECT
    16 public:
    17  StabilizerDialog(QWidget* parent = 0);
    18 private slots:
    19  void set_all_enabled(bool e);
    20 private:
    21  QVBoxLayout* layout;
    22  QCheckBox* enable_stab;
    23  QDialogButtonBox* buttons;
    24  QGroupBox* analysis;
    25  QGridLayout* analysis_layout;
    26  LabelSlider* shakiness_slider;
    27  LabelSlider* accuracy_slider;
    28  LabelSlider* stepsize_slider;
    29  LabelSlider* mincontrast_slider;
    30  QCheckBox* tripod_mode_box;
    31  QGroupBox* stabilization;
    32  QGridLayout* stabilization_layout;
    33  LabelSlider* smoothing_slider;
    34  QCheckBox* gaussian_motion;
    35 };
    36 
    37 #endif // STABILIZERDIALOG_H
    Definition: stabilizerdialog.h:13
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    + + + + diff --git a/docs/html/struct___a_effect-members.html b/docs/html/struct___a_effect-members.html new file mode 100644 index 000000000..b6fc23f03 --- /dev/null +++ b/docs/html/struct___a_effect-members.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _AEffect Member List
    +
    +
    + +

    This is the complete list of members for _AEffect, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + +
    dispatcher (defined in _AEffect)_AEffect
    empty3 (defined in _AEffect)_AEffect
    flags (defined in _AEffect)_AEffect
    getParameter (defined in _AEffect)_AEffect
    magic (defined in _AEffect)_AEffect
    numInputs (defined in _AEffect)_AEffect
    numOutputs (defined in _AEffect)_AEffect
    numParams (defined in _AEffect)_AEffect
    numPrograms (defined in _AEffect)_AEffect
    process (defined in _AEffect)_AEffect
    processReplacing (defined in _AEffect)_AEffect
    ptr1 (defined in _AEffect)_AEffect
    ptr2 (defined in _AEffect)_AEffect
    ptr3 (defined in _AEffect)_AEffect
    setParameter (defined in _AEffect)_AEffect
    uniqueID (defined in _AEffect)_AEffect
    unkown_float (defined in _AEffect)_AEffect
    user (defined in _AEffect)_AEffect
    version (defined in _AEffect)_AEffect
    + + + + diff --git a/docs/html/struct___a_effect.html b/docs/html/struct___a_effect.html new file mode 100644 index 000000000..b3f709f87 --- /dev/null +++ b/docs/html/struct___a_effect.html @@ -0,0 +1,143 @@ + + + + + + + +Olive: _AEffect Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _AEffect Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +int magic
     
    +intptr_t(* dispatcher )(struct _AEffect *, int, int, intptr_t, void *, float)
     
    +void(* process )(struct _AEffect *, float **, float **, int)
     
    +void(* setParameter )(struct _AEffect *, int, float)
     
    +float(* getParameter )(struct _AEffect *, int)
     
    +int numPrograms
     
    +int numParams
     
    +int numInputs
     
    +int numOutputs
     
    +int flags
     
    +void * ptr1
     
    +void * ptr2
     
    +char empty3 [4+4+4]
     
    +float unkown_float
     
    +void * ptr3
     
    +void * user
     
    +int32_t uniqueID
     
    +int32_t version
     
    +void(* processReplacing )(struct _AEffect *, float **, float **, int)
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct___vst_event-members.html b/docs/html/struct___vst_event-members.html new file mode 100644 index 000000000..a8dda2de0 --- /dev/null +++ b/docs/html/struct___vst_event-members.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _VstEvent Member List
    +
    +
    + +

    This is the complete list of members for _VstEvent, including all inherited members.

    + + +
    dump (defined in _VstEvent)_VstEvent
    + + + + diff --git a/docs/html/struct___vst_event.html b/docs/html/struct___vst_event.html new file mode 100644 index 000000000..70b319d36 --- /dev/null +++ b/docs/html/struct___vst_event.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: _VstEvent Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _VstEvent Struct Reference
    +
    +
    + + + + +

    +Public Attributes

    +char dump [sizeof(VstMidiEvent)]
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct___vst_events-members.html b/docs/html/struct___vst_events-members.html new file mode 100644 index 000000000..0e9e13d67 --- /dev/null +++ b/docs/html/struct___vst_events-members.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _VstEvents Member List
    +
    +
    + +

    This is the complete list of members for _VstEvents, including all inherited members.

    + + + + +
    events (defined in _VstEvents)_VstEvents
    numEvents (defined in _VstEvents)_VstEvents
    reserved (defined in _VstEvents)_VstEvents
    + + + + diff --git a/docs/html/struct___vst_events.html b/docs/html/struct___vst_events.html new file mode 100644 index 000000000..bc6dfd4da --- /dev/null +++ b/docs/html/struct___vst_events.html @@ -0,0 +1,95 @@ + + + + + + + +Olive: _VstEvents Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _VstEvents Struct Reference
    +
    +
    + + + + + + + + +

    +Public Attributes

    +int numEvents
     
    +void * reserved
     
    +VstEventevents []
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct___vst_midi_event-members.html b/docs/html/struct___vst_midi_event-members.html new file mode 100644 index 000000000..99fb0ac5e --- /dev/null +++ b/docs/html/struct___vst_midi_event-members.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _VstMidiEvent Member List
    +
    +
    + +

    This is the complete list of members for _VstMidiEvent, including all inherited members.

    + + + + + + + + + + + + +
    byteSize (defined in _VstMidiEvent)_VstMidiEvent
    deltaSamples (defined in _VstMidiEvent)_VstMidiEvent
    detune (defined in _VstMidiEvent)_VstMidiEvent
    flags (defined in _VstMidiEvent)_VstMidiEvent
    midiData (defined in _VstMidiEvent)_VstMidiEvent
    noteLength (defined in _VstMidiEvent)_VstMidiEvent
    noteOffset (defined in _VstMidiEvent)_VstMidiEvent
    noteOffVelocity (defined in _VstMidiEvent)_VstMidiEvent
    reserved1 (defined in _VstMidiEvent)_VstMidiEvent
    reserved2 (defined in _VstMidiEvent)_VstMidiEvent
    type (defined in _VstMidiEvent)_VstMidiEvent
    + + + + diff --git a/docs/html/struct___vst_midi_event.html b/docs/html/struct___vst_midi_event.html new file mode 100644 index 000000000..ea929f57f --- /dev/null +++ b/docs/html/struct___vst_midi_event.html @@ -0,0 +1,119 @@ + + + + + + + +Olive: _VstMidiEvent Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _VstMidiEvent Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +int type
     
    +int byteSize
     
    +int deltaSamples
     
    +int flags
     
    +int noteLength
     
    +int noteOffset
     
    +char midiData [4]
     
    +char detune
     
    +char noteOffVelocity
     
    +char reserved1
     
    +char reserved2
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct___vst_parameter_properties-members.html b/docs/html/struct___vst_parameter_properties-members.html new file mode 100644 index 000000000..e089867cb --- /dev/null +++ b/docs/html/struct___vst_parameter_properties-members.html @@ -0,0 +1,95 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _VstParameterProperties Member List
    +
    +
    + +

    This is the complete list of members for _VstParameterProperties, including all inherited members.

    + + + + + + + + + + + + + + + + + +
    category (defined in _VstParameterProperties)_VstParameterProperties
    categoryLabel (defined in _VstParameterProperties)_VstParameterProperties
    displayIndex (defined in _VstParameterProperties)_VstParameterProperties
    flags (defined in _VstParameterProperties)_VstParameterProperties
    future (defined in _VstParameterProperties)_VstParameterProperties
    label (defined in _VstParameterProperties)_VstParameterProperties
    largeStepFloat (defined in _VstParameterProperties)_VstParameterProperties
    largeStepInteger (defined in _VstParameterProperties)_VstParameterProperties
    maxInteger (defined in _VstParameterProperties)_VstParameterProperties
    minInteger (defined in _VstParameterProperties)_VstParameterProperties
    numParametersInCategory (defined in _VstParameterProperties)_VstParameterProperties
    reserved (defined in _VstParameterProperties)_VstParameterProperties
    shortLabel (defined in _VstParameterProperties)_VstParameterProperties
    smallStepFloat (defined in _VstParameterProperties)_VstParameterProperties
    stepFloat (defined in _VstParameterProperties)_VstParameterProperties
    stepInteger (defined in _VstParameterProperties)_VstParameterProperties
    + + + + diff --git a/docs/html/struct___vst_parameter_properties.html b/docs/html/struct___vst_parameter_properties.html new file mode 100644 index 000000000..474549688 --- /dev/null +++ b/docs/html/struct___vst_parameter_properties.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: _VstParameterProperties Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _VstParameterProperties Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +float stepFloat
     
    +float smallStepFloat
     
    +float largeStepFloat
     
    +char label [64]
     
    +int32_t flags
     
    +int32_t minInteger
     
    +int32_t maxInteger
     
    +int32_t stepInteger
     
    +int32_t largeStepInteger
     
    +char shortLabel [VestigeMaxShortLabelLen]
     
    +int16_t displayIndex
     
    +int16_t category
     
    +int16_t numParametersInCategory
     
    +int16_t reserved
     
    +char categoryLabel [VestigeMaxCategLabelLen]
     
    +char future [16]
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct___vst_time_info-members.html b/docs/html/struct___vst_time_info-members.html new file mode 100644 index 000000000..fa6dc4db4 --- /dev/null +++ b/docs/html/struct___vst_time_info-members.html @@ -0,0 +1,93 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    _VstTimeInfo Member List
    +
    +
    + +

    This is the complete list of members for _VstTimeInfo, including all inherited members.

    + + + + + + + + + + + + + + + +
    barStartPos (defined in _VstTimeInfo)_VstTimeInfo
    cycleEndPos (defined in _VstTimeInfo)_VstTimeInfo
    cycleStartPos (defined in _VstTimeInfo)_VstTimeInfo
    flags (defined in _VstTimeInfo)_VstTimeInfo
    nanoSeconds (defined in _VstTimeInfo)_VstTimeInfo
    ppqPos (defined in _VstTimeInfo)_VstTimeInfo
    samplePos (defined in _VstTimeInfo)_VstTimeInfo
    sampleRate (defined in _VstTimeInfo)_VstTimeInfo
    samplesToNextClock (defined in _VstTimeInfo)_VstTimeInfo
    smpteFrameRate (defined in _VstTimeInfo)_VstTimeInfo
    smpteOffset (defined in _VstTimeInfo)_VstTimeInfo
    tempo (defined in _VstTimeInfo)_VstTimeInfo
    timeSigDenominator (defined in _VstTimeInfo)_VstTimeInfo
    timeSigNumerator (defined in _VstTimeInfo)_VstTimeInfo
    + + + + diff --git a/docs/html/struct___vst_time_info.html b/docs/html/struct___vst_time_info.html new file mode 100644 index 000000000..1947930dc --- /dev/null +++ b/docs/html/struct___vst_time_info.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: _VstTimeInfo Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    _VstTimeInfo Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +double samplePos
     
    +double sampleRate
     
    +double nanoSeconds
     
    +double ppqPos
     
    +double tempo
     
    +double barStartPos
     
    +double cycleStartPos
     
    +double cycleEndPos
     
    +int32_t timeSigNumerator
     
    +int32_t timeSigDenominator
     
    +int32_t smpteOffset
     
    +int32_t smpteFrameRate
     
    +int32_t samplesToNextClock
     
    +int32_t flags
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_compose_sequence_params-members.html b/docs/html/struct_compose_sequence_params-members.html new file mode 100644 index 000000000..7d6a1a8ef --- /dev/null +++ b/docs/html/struct_compose_sequence_params-members.html @@ -0,0 +1,97 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ComposeSequenceParams Member List
    +
    +
    + +

    This is the complete list of members for ComposeSequenceParams, including all inherited members.

    + + + + + + + + + + + + + + + + + + + +
    backend_attachment1 (defined in ComposeSequenceParams)ComposeSequenceParams
    backend_attachment2 (defined in ComposeSequenceParams)ComposeSequenceParams
    backend_buffer1 (defined in ComposeSequenceParams)ComposeSequenceParams
    backend_buffer2 (defined in ComposeSequenceParams)ComposeSequenceParams
    blend_mode_program (defined in ComposeSequenceParams)ComposeSequenceParams
    ctx (defined in ComposeSequenceParams)ComposeSequenceParams
    gizmos (defined in ComposeSequenceParams)ComposeSequenceParams
    main_attachment (defined in ComposeSequenceParams)ComposeSequenceParams
    main_buffer (defined in ComposeSequenceParams)ComposeSequenceParams
    nests (defined in ComposeSequenceParams)ComposeSequenceParams
    playback_speed (defined in ComposeSequenceParams)ComposeSequenceParams
    premultiply_program (defined in ComposeSequenceParams)ComposeSequenceParams
    render_audio (defined in ComposeSequenceParams)ComposeSequenceParams
    rendering (defined in ComposeSequenceParams)ComposeSequenceParams
    seq (defined in ComposeSequenceParams)ComposeSequenceParams
    texture_failed (defined in ComposeSequenceParams)ComposeSequenceParams
    video (defined in ComposeSequenceParams)ComposeSequenceParams
    viewer (defined in ComposeSequenceParams)ComposeSequenceParams
    + + + + diff --git a/docs/html/struct_compose_sequence_params.html b/docs/html/struct_compose_sequence_params.html new file mode 100644 index 000000000..c75e7de41 --- /dev/null +++ b/docs/html/struct_compose_sequence_params.html @@ -0,0 +1,140 @@ + + + + + + + +Olive: ComposeSequenceParams Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    ComposeSequenceParams Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +Viewerviewer
     
    +QOpenGLContext * ctx
     
    +Sequenceseq
     
    +QVector< Clip * > nests
     
    +bool video
     
    +bool render_audio
     
    +Effect ** gizmos
     
    +bool texture_failed
     
    +bool rendering
     
    +int playback_speed
     
    +QOpenGLShaderProgram * blend_mode_program
     
    +QOpenGLShaderProgram * premultiply_program
     
    +GLuint main_buffer
     
    +GLuint main_attachment
     
    +GLuint backend_buffer1
     
    +GLuint backend_attachment1
     
    +GLuint backend_buffer2
     
    +GLuint backend_attachment2
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_config-members.html b/docs/html/struct_config-members.html new file mode 100644 index 000000000..6e4057fc8 --- /dev/null +++ b/docs/html/struct_config-members.html @@ -0,0 +1,124 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Config Member List
    +
    +
    + +

    This is the complete list of members for Config, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    audio_rate (defined in Config)Config
    autoscale_by_default (defined in Config)Config
    autoscroll (defined in Config)Config
    center_timeline_timecodes (defined in Config)Config
    Config() (defined in Config)Config
    css_path (defined in Config)Config
    custom_title_safe_ratio (defined in Config)Config
    default_transition_length (defined in Config)Config
    drop_on_media_to_replace (defined in Config)Config
    edit_tool_also_seeks (defined in Config)Config
    edit_tool_selects_links (defined in Config)Config
    effect_textbox_lines (defined in Config)Config
    enable_audio_scrubbing (defined in Config)Config
    enable_drag_files_to_timeline (defined in Config)Config
    enable_seek_to_import (defined in Config)Config
    fast_seeking (defined in Config)Config
    hover_focus (defined in Config)Config
    img_seq_formats (defined in Config)Config
    language_file (defined in Config)Config
    load(QString path) (defined in Config)Config
    loop (defined in Config)Config
    paste_seeks (defined in Config)Config
    preferred_audio_input (defined in Config)Config
    preferred_audio_output (defined in Config)Config
    previous_queue_size (defined in Config)Config
    previous_queue_type (defined in Config)Config
    project_view_type (defined in Config)Config
    recording_mode (defined in Config)Config
    rectified_waveforms (defined in Config)Config
    save(QString path) (defined in Config)Config
    saved_layout (defined in Config)Config
    scroll_zooms (defined in Config)Config
    seek_also_selects (defined in Config)Config
    select_also_seeks (defined in Config)Config
    set_name_with_marker (defined in Config)Config
    show_project_toolbar (defined in Config)Config
    show_title_safe_area (defined in Config)Config
    show_track_lines (defined in Config)Config
    thumbnail_resolution (defined in Config)Config
    timecode_view (defined in Config)Config
    upcoming_queue_size (defined in Config)Config
    upcoming_queue_type (defined in Config)Config
    use_custom_title_safe_ratio (defined in Config)Config
    use_software_fallback (defined in Config)Config
    waveform_resolution (defined in Config)Config
    + + + + diff --git a/docs/html/struct_config.html b/docs/html/struct_config.html new file mode 100644 index 000000000..969ec800c --- /dev/null +++ b/docs/html/struct_config.html @@ -0,0 +1,223 @@ + + + + + + + +Olive: Config Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Config Struct Reference
    +
    +
    + + + + + + +

    +Public Member Functions

    +void load (QString path)
     
    +void save (QString path)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +bool saved_layout
     
    +bool show_track_lines
     
    +bool scroll_zooms
     
    +bool edit_tool_selects_links
     
    +bool edit_tool_also_seeks
     
    +bool select_also_seeks
     
    +bool paste_seeks
     
    +QString img_seq_formats
     
    +bool rectified_waveforms
     
    +int default_transition_length
     
    +int timecode_view
     
    +bool show_title_safe_area
     
    +bool use_custom_title_safe_ratio
     
    +double custom_title_safe_ratio
     
    +bool enable_drag_files_to_timeline
     
    +bool autoscale_by_default
     
    +int recording_mode
     
    +bool enable_seek_to_import
     
    +bool enable_audio_scrubbing
     
    +bool drop_on_media_to_replace
     
    +int autoscroll
     
    +int audio_rate
     
    +bool fast_seeking
     
    +bool hover_focus
     
    +int project_view_type
     
    +bool set_name_with_marker
     
    +bool show_project_toolbar
     
    +double previous_queue_size
     
    +int previous_queue_type
     
    +double upcoming_queue_size
     
    +int upcoming_queue_type
     
    +bool loop
     
    +bool seek_also_selects
     
    +QString css_path
     
    +int effect_textbox_lines
     
    +bool use_software_fallback
     
    +bool center_timeline_timecodes
     
    +QString preferred_audio_output
     
    +QString preferred_audio_input
     
    +QString language_file
     
    +int waveform_resolution
     
    +int thumbnail_resolution
     
    +
    The documentation for this struct was generated from the following files: +
    + + + + diff --git a/docs/html/struct_effect_meta-members.html b/docs/html/struct_effect_meta-members.html new file mode 100644 index 000000000..04e221801 --- /dev/null +++ b/docs/html/struct_effect_meta-members.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    EffectMeta Member List
    +
    +
    + +

    This is the complete list of members for EffectMeta, including all inherited members.

    + + + + + + + + + +
    category (defined in EffectMeta)EffectMeta
    filename (defined in EffectMeta)EffectMeta
    internal (defined in EffectMeta)EffectMeta
    name (defined in EffectMeta)EffectMeta
    path (defined in EffectMeta)EffectMeta
    subtype (defined in EffectMeta)EffectMeta
    tooltip (defined in EffectMeta)EffectMeta
    type (defined in EffectMeta)EffectMeta
    + + + + diff --git a/docs/html/struct_effect_meta.html b/docs/html/struct_effect_meta.html new file mode 100644 index 000000000..50e38643f --- /dev/null +++ b/docs/html/struct_effect_meta.html @@ -0,0 +1,110 @@ + + + + + + + +Olive: EffectMeta Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    EffectMeta Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +QString name
     
    +QString category
     
    +QString filename
     
    +QString path
     
    +QString tooltip
     
    +int internal
     
    +int type
     
    +int subtype
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_export_params-members.html b/docs/html/struct_export_params-members.html new file mode 100644 index 000000000..29e0e9244 --- /dev/null +++ b/docs/html/struct_export_params-members.html @@ -0,0 +1,93 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ExportParams Member List
    +
    +
    + +

    This is the complete list of members for ExportParams, including all inherited members.

    + + + + + + + + + + + + + + + +
    audio_bitrate (defined in ExportParams)ExportParams
    audio_codec (defined in ExportParams)ExportParams
    audio_enabled (defined in ExportParams)ExportParams
    audio_sampling_rate (defined in ExportParams)ExportParams
    end_frame (defined in ExportParams)ExportParams
    filename (defined in ExportParams)ExportParams
    start_frame (defined in ExportParams)ExportParams
    video_bitrate (defined in ExportParams)ExportParams
    video_codec (defined in ExportParams)ExportParams
    video_compression_type (defined in ExportParams)ExportParams
    video_enabled (defined in ExportParams)ExportParams
    video_frame_rate (defined in ExportParams)ExportParams
    video_height (defined in ExportParams)ExportParams
    video_width (defined in ExportParams)ExportParams
    + + + + diff --git a/docs/html/struct_export_params.html b/docs/html/struct_export_params.html new file mode 100644 index 000000000..df9bf3a94 --- /dev/null +++ b/docs/html/struct_export_params.html @@ -0,0 +1,128 @@ + + + + + + + +Olive: ExportParams Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    ExportParams Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +QString filename
     
    +bool video_enabled
     
    +int video_codec
     
    +int video_width
     
    +int video_height
     
    +double video_frame_rate
     
    +int video_compression_type
     
    +double video_bitrate
     
    +bool audio_enabled
     
    +int audio_codec
     
    +int audio_sampling_rate
     
    +int audio_bitrate
     
    +long start_frame
     
    +long end_frame
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_footage-members.html b/docs/html/struct_footage-members.html new file mode 100644 index 000000000..4690053b3 --- /dev/null +++ b/docs/html/struct_footage-members.html @@ -0,0 +1,102 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Footage Member List
    +
    +
    + +

    This is the complete list of members for Footage, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + +
    alpha_is_premultiplied (defined in Footage)Footage
    audio_tracks (defined in Footage)Footage
    Footage() (defined in Footage)Footage
    get_length_in_frames(double frame_rate) (defined in Footage)Footage
    get_stream_from_file_index(bool video, int index) (defined in Footage)Footage
    in (defined in Footage)Footage
    invalid (defined in Footage)Footage
    length (defined in Footage)Footage
    markers (defined in Footage)Footage
    name (defined in Footage)Footage
    out (defined in Footage)Footage
    preview_gen (defined in Footage)Footage
    proxy (defined in Footage)Footage
    proxy_path (defined in Footage)Footage
    ready (defined in Footage)Footage
    ready_lock (defined in Footage)Footage
    reset() (defined in Footage)Footage
    save_id (defined in Footage)Footage
    speed (defined in Footage)Footage
    url (defined in Footage)Footage
    using_inout (defined in Footage)Footage
    video_tracks (defined in Footage)Footage
    ~Footage() (defined in Footage)Footage
    + + + + diff --git a/docs/html/struct_footage.html b/docs/html/struct_footage.html new file mode 100644 index 000000000..7b45a17d6 --- /dev/null +++ b/docs/html/struct_footage.html @@ -0,0 +1,154 @@ + + + + + + + +Olive: Footage Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Footage Struct Reference
    +
    +
    + + + + + + + + +

    +Public Member Functions

    +long get_length_in_frames (double frame_rate)
     
    +FootageStreamget_stream_from_file_index (bool video, int index)
     
    +void reset ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +QString url
     
    +QString name
     
    +int64_t length
     
    +QVector< FootageStreamvideo_tracks
     
    +QVector< FootageStreamaudio_tracks
     
    +int save_id
     
    +bool ready
     
    +bool invalid
     
    +double speed
     
    +bool alpha_is_premultiplied
     
    +bool proxy
     
    +QString proxy_path
     
    +PreviewGeneratorpreview_gen
     
    +QMutex ready_lock
     
    +bool using_inout
     
    +long in
     
    +long out
     
    +QVector< Markermarkers
     
    +
    The documentation for this struct was generated from the following files: +
    + + + + diff --git a/docs/html/struct_footage_stream-members.html b/docs/html/struct_footage_stream-members.html new file mode 100644 index 000000000..25179f53a --- /dev/null +++ b/docs/html/struct_footage_stream-members.html @@ -0,0 +1,95 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    FootageStream Member List
    +
    +
    + +

    This is the complete list of members for FootageStream, including all inherited members.

    + + + + + + + + + + + + + + + + + +
    audio_channels (defined in FootageStream)FootageStream
    audio_frequency (defined in FootageStream)FootageStream
    audio_layout (defined in FootageStream)FootageStream
    audio_preview (defined in FootageStream)FootageStream
    enabled (defined in FootageStream)FootageStream
    file_index (defined in FootageStream)FootageStream
    infinite_length (defined in FootageStream)FootageStream
    make_square_thumb() (defined in FootageStream)FootageStream
    preview_done (defined in FootageStream)FootageStream
    video_auto_interlacing (defined in FootageStream)FootageStream
    video_frame_rate (defined in FootageStream)FootageStream
    video_height (defined in FootageStream)FootageStream
    video_interlacing (defined in FootageStream)FootageStream
    video_preview (defined in FootageStream)FootageStream
    video_preview_square (defined in FootageStream)FootageStream
    video_width (defined in FootageStream)FootageStream
    + + + + diff --git a/docs/html/struct_footage_stream.html b/docs/html/struct_footage_stream.html new file mode 100644 index 000000000..a177bd814 --- /dev/null +++ b/docs/html/struct_footage_stream.html @@ -0,0 +1,139 @@ + + + + + + + +Olive: FootageStream Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    FootageStream Struct Reference
    +
    +
    + + + + +

    +Public Member Functions

    +void make_square_thumb ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +int file_index
     
    +int video_width
     
    +int video_height
     
    +bool infinite_length
     
    +double video_frame_rate
     
    +int video_interlacing
     
    +int video_auto_interlacing
     
    +int audio_channels
     
    +int audio_layout
     
    +int audio_frequency
     
    +bool enabled
     
    +bool preview_done
     
    +QImage video_preview
     
    +QIcon video_preview_square
     
    +QVector< char > audio_preview
     
    +
    The documentation for this struct was generated from the following files: +
    + + + + diff --git a/docs/html/struct_g_l_texture_coords-members.html b/docs/html/struct_g_l_texture_coords-members.html new file mode 100644 index 000000000..8113a5130 --- /dev/null +++ b/docs/html/struct_g_l_texture_coords-members.html @@ -0,0 +1,106 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    GLTextureCoords Member List
    +
    +
    + +

    This is the complete list of members for GLTextureCoords, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    blendmode (defined in GLTextureCoords)GLTextureCoords
    grid_size (defined in GLTextureCoords)GLTextureCoords
    opacity (defined in GLTextureCoords)GLTextureCoords
    textureBottomLeftQ (defined in GLTextureCoords)GLTextureCoords
    textureBottomLeftX (defined in GLTextureCoords)GLTextureCoords
    textureBottomLeftY (defined in GLTextureCoords)GLTextureCoords
    textureBottomRightQ (defined in GLTextureCoords)GLTextureCoords
    textureBottomRightX (defined in GLTextureCoords)GLTextureCoords
    textureBottomRightY (defined in GLTextureCoords)GLTextureCoords
    textureTopLeftQ (defined in GLTextureCoords)GLTextureCoords
    textureTopLeftX (defined in GLTextureCoords)GLTextureCoords
    textureTopLeftY (defined in GLTextureCoords)GLTextureCoords
    textureTopRightQ (defined in GLTextureCoords)GLTextureCoords
    textureTopRightX (defined in GLTextureCoords)GLTextureCoords
    textureTopRightY (defined in GLTextureCoords)GLTextureCoords
    vertexBottomLeftX (defined in GLTextureCoords)GLTextureCoords
    vertexBottomLeftY (defined in GLTextureCoords)GLTextureCoords
    vertexBottomLeftZ (defined in GLTextureCoords)GLTextureCoords
    vertexBottomRightX (defined in GLTextureCoords)GLTextureCoords
    vertexBottomRightY (defined in GLTextureCoords)GLTextureCoords
    vertexBottomRightZ (defined in GLTextureCoords)GLTextureCoords
    vertexTopLeftX (defined in GLTextureCoords)GLTextureCoords
    vertexTopLeftY (defined in GLTextureCoords)GLTextureCoords
    vertexTopLeftZ (defined in GLTextureCoords)GLTextureCoords
    vertexTopRightX (defined in GLTextureCoords)GLTextureCoords
    vertexTopRightY (defined in GLTextureCoords)GLTextureCoords
    vertexTopRightZ (defined in GLTextureCoords)GLTextureCoords
    + + + + diff --git a/docs/html/struct_g_l_texture_coords.html b/docs/html/struct_g_l_texture_coords.html new file mode 100644 index 000000000..362c8284a --- /dev/null +++ b/docs/html/struct_g_l_texture_coords.html @@ -0,0 +1,167 @@ + + + + + + + +Olive: GLTextureCoords Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    GLTextureCoords Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +int grid_size
     
    +int vertexTopLeftX
     
    +int vertexTopLeftY
     
    +int vertexTopLeftZ
     
    +int vertexTopRightX
     
    +int vertexTopRightY
     
    +int vertexTopRightZ
     
    +int vertexBottomLeftX
     
    +int vertexBottomLeftY
     
    +int vertexBottomLeftZ
     
    +int vertexBottomRightX
     
    +int vertexBottomRightY
     
    +int vertexBottomRightZ
     
    +float textureTopLeftX
     
    +float textureTopLeftY
     
    +float textureTopLeftQ
     
    +float textureTopRightX
     
    +float textureTopRightY
     
    +float textureTopRightQ
     
    +float textureBottomRightX
     
    +float textureBottomRightY
     
    +float textureBottomRightQ
     
    +float textureBottomLeftX
     
    +float textureBottomLeftY
     
    +float textureBottomLeftQ
     
    +int blendmode
     
    +float opacity
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_ghost-members.html b/docs/html/struct_ghost-members.html new file mode 100644 index 000000000..c1e87daf9 --- /dev/null +++ b/docs/html/struct_ghost-members.html @@ -0,0 +1,95 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Ghost Member List
    +
    +
    + +

    This is the complete list of members for Ghost, including all inherited members.

    + + + + + + + + + + + + + + + + + +
    clip (defined in Ghost)Ghost
    clip_in (defined in Ghost)Ghost
    ghost_length (defined in Ghost)Ghost
    in (defined in Ghost)Ghost
    media (defined in Ghost)Ghost
    media_length (defined in Ghost)Ghost
    media_stream (defined in Ghost)Ghost
    old_clip_in (defined in Ghost)Ghost
    old_in (defined in Ghost)Ghost
    old_out (defined in Ghost)Ghost
    old_track (defined in Ghost)Ghost
    out (defined in Ghost)Ghost
    track (defined in Ghost)Ghost
    transition (defined in Ghost)Ghost
    trim_in (defined in Ghost)Ghost
    trimming (defined in Ghost)Ghost
    + + + + diff --git a/docs/html/struct_ghost.html b/docs/html/struct_ghost.html new file mode 100644 index 000000000..c6762af8f --- /dev/null +++ b/docs/html/struct_ghost.html @@ -0,0 +1,134 @@ + + + + + + + +Olive: Ghost Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Ghost Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +int clip
     
    +long in
     
    +long out
     
    +int track
     
    +long clip_in
     
    +long old_in
     
    +long old_out
     
    +int old_track
     
    +long old_clip_in
     
    +Mediamedia
     
    +int media_stream
     
    +long ghost_length
     
    +long media_length
     
    +bool trim_in
     
    +bool trimming
     
    +Transitiontransition
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_marker-members.html b/docs/html/struct_marker-members.html new file mode 100644 index 000000000..13764b82f --- /dev/null +++ b/docs/html/struct_marker-members.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Marker Member List
    +
    +
    + +

    This is the complete list of members for Marker, including all inherited members.

    + + + +
    frame (defined in Marker)Marker
    name (defined in Marker)Marker
    + + + + diff --git a/docs/html/struct_marker.html b/docs/html/struct_marker.html new file mode 100644 index 000000000..6d6d42fbe --- /dev/null +++ b/docs/html/struct_marker.html @@ -0,0 +1,92 @@ + + + + + + + +Olive: Marker Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Marker Struct Reference
    +
    +
    + + + + + + +

    +Public Attributes

    +long frame
     
    +QString name
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_proxy_info-members.html b/docs/html/struct_proxy_info-members.html new file mode 100644 index 000000000..bd007f6cf --- /dev/null +++ b/docs/html/struct_proxy_info-members.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    ProxyInfo Member List
    +
    +
    + +

    This is the complete list of members for ProxyInfo, including all inherited members.

    + + + + + +
    codec_type (defined in ProxyInfo)ProxyInfo
    footage (defined in ProxyInfo)ProxyInfo
    path (defined in ProxyInfo)ProxyInfo
    size_multiplier (defined in ProxyInfo)ProxyInfo
    + + + + diff --git a/docs/html/struct_proxy_info.html b/docs/html/struct_proxy_info.html new file mode 100644 index 000000000..feccb897c --- /dev/null +++ b/docs/html/struct_proxy_info.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: ProxyInfo Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    ProxyInfo Struct Reference
    +
    +
    + + + + + + + + + + +

    +Public Attributes

    +Footagefootage
     
    +double size_multiplier
     
    +int codec_type
     
    +QString path
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_runtime_config-members.html b/docs/html/struct_runtime_config-members.html new file mode 100644 index 000000000..2ab0e2d07 --- /dev/null +++ b/docs/html/struct_runtime_config-members.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    RuntimeConfig Member List
    +
    +
    + +

    This is the complete list of members for RuntimeConfig, including all inherited members.

    + + + + + +
    disable_blending (defined in RuntimeConfig)RuntimeConfig
    external_translation_file (defined in RuntimeConfig)RuntimeConfig
    RuntimeConfig() (defined in RuntimeConfig)RuntimeConfig
    shaders_are_enabled (defined in RuntimeConfig)RuntimeConfig
    + + + + diff --git a/docs/html/struct_runtime_config.html b/docs/html/struct_runtime_config.html new file mode 100644 index 000000000..0968ec049 --- /dev/null +++ b/docs/html/struct_runtime_config.html @@ -0,0 +1,96 @@ + + + + + + + +Olive: RuntimeConfig Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    RuntimeConfig Struct Reference
    +
    +
    + + + + + + + + +

    +Public Attributes

    +bool shaders_are_enabled
     
    +bool disable_blending
     
    +QString external_translation_file
     
    +
    The documentation for this struct was generated from the following files: +
    + + + + diff --git a/docs/html/struct_selection-members.html b/docs/html/struct_selection-members.html new file mode 100644 index 000000000..0545aa401 --- /dev/null +++ b/docs/html/struct_selection-members.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Selection Member List
    +
    +
    + +

    This is the complete list of members for Selection, including all inherited members.

    + + + + + + + + +
    in (defined in Selection)Selection
    old_in (defined in Selection)Selection
    old_out (defined in Selection)Selection
    old_track (defined in Selection)Selection
    out (defined in Selection)Selection
    track (defined in Selection)Selection
    trim_in (defined in Selection)Selection
    + + + + diff --git a/docs/html/struct_selection.html b/docs/html/struct_selection.html new file mode 100644 index 000000000..9a8ec407c --- /dev/null +++ b/docs/html/struct_selection.html @@ -0,0 +1,107 @@ + + + + + + + +Olive: Selection Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Selection Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + +

    +Public Attributes

    +long in
     
    +long out
     
    +int track
     
    +long old_in
     
    +long old_out
     
    +int old_track
     
    +bool trim_in
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/struct_sequence-members.html b/docs/html/struct_sequence-members.html new file mode 100644 index 000000000..db4b6e184 --- /dev/null +++ b/docs/html/struct_sequence-members.html @@ -0,0 +1,101 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Sequence Member List
    +
    +
    + +

    This is the complete list of members for Sequence, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + +
    audio_frequency (defined in Sequence)Sequence
    audio_layout (defined in Sequence)Sequence
    clips (defined in Sequence)Sequence
    copy() (defined in Sequence)Sequence
    frame_rate (defined in Sequence)Sequence
    getEndFrame() (defined in Sequence)Sequence
    getTrackLimits(int *video_tracks, int *audio_tracks) (defined in Sequence)Sequence
    hard_delete_transition(Clip *c, int type) (defined in Sequence)Sequence
    height (defined in Sequence)Sequence
    markers (defined in Sequence)Sequence
    name (defined in Sequence)Sequence
    playhead (defined in Sequence)Sequence
    save_id (defined in Sequence)Sequence
    selections (defined in Sequence)Sequence
    Sequence() (defined in Sequence)Sequence
    transitions (defined in Sequence)Sequence
    using_workarea (defined in Sequence)Sequence
    width (defined in Sequence)Sequence
    workarea_in (defined in Sequence)Sequence
    workarea_out (defined in Sequence)Sequence
    wrapper_sequence (defined in Sequence)Sequence
    ~Sequence() (defined in Sequence)Sequence
    + + + + diff --git a/docs/html/struct_sequence.html b/docs/html/struct_sequence.html new file mode 100644 index 000000000..2e444d932 --- /dev/null +++ b/docs/html/struct_sequence.html @@ -0,0 +1,151 @@ + + + + + + + +Olive: Sequence Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Sequence Struct Reference
    +
    +
    + + + + + + + + + + +

    +Public Member Functions

    +Sequencecopy ()
     
    +void getTrackLimits (int *video_tracks, int *audio_tracks)
     
    +long getEndFrame ()
     
    +void hard_delete_transition (Clip *c, int type)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +QString name
     
    +int width
     
    +int height
     
    +double frame_rate
     
    +int audio_frequency
     
    +int audio_layout
     
    +QVector< Selectionselections
     
    +long playhead
     
    +bool using_workarea
     
    +long workarea_in
     
    +long workarea_out
     
    +bool wrapper_sequence
     
    +int save_id
     
    +QVector< Markermarkers
     
    +QVector< Clip * > clips
     
    +QVector< Transition * > transitions
     
    +
    The documentation for this struct was generated from the following files: +
    + + + + diff --git a/docs/html/struct_transition_data-members.html b/docs/html/struct_transition_data-members.html new file mode 100644 index 000000000..06a278f73 --- /dev/null +++ b/docs/html/struct_transition_data-members.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    TransitionData Member List
    +
    +
    + +

    This is the complete list of members for TransitionData, including all inherited members.

    + + + + + + +
    ctc (defined in TransitionData)TransitionData
    id (defined in TransitionData)TransitionData
    length (defined in TransitionData)TransitionData
    name (defined in TransitionData)TransitionData
    otc (defined in TransitionData)TransitionData
    + + + + diff --git a/docs/html/struct_transition_data.html b/docs/html/struct_transition_data.html new file mode 100644 index 000000000..595969667 --- /dev/null +++ b/docs/html/struct_transition_data.html @@ -0,0 +1,101 @@ + + + + + + + +Olive: TransitionData Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    TransitionData Struct Reference
    +
    +
    + + + + + + + + + + + + +

    +Public Attributes

    +int id
     
    +QString name
     
    +long length
     
    +Clipotc
     
    +Clipctc
     
    +
    The documentation for this struct was generated from the following file:
      +
    • io/loadthread.cpp
    • +
    +
    + + + + diff --git a/docs/html/struct_v_s_t_rect-members.html b/docs/html/struct_v_s_t_rect-members.html new file mode 100644 index 000000000..2cbd1e881 --- /dev/null +++ b/docs/html/struct_v_s_t_rect-members.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    VSTRect Member List
    +
    +
    + +

    This is the complete list of members for VSTRect, including all inherited members.

    + + + + + +
    bottom (defined in VSTRect)VSTRect
    left (defined in VSTRect)VSTRect
    right (defined in VSTRect)VSTRect
    top (defined in VSTRect)VSTRect
    + + + + diff --git a/docs/html/struct_v_s_t_rect.html b/docs/html/struct_v_s_t_rect.html new file mode 100644 index 000000000..bda287358 --- /dev/null +++ b/docs/html/struct_v_s_t_rect.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: VSTRect Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    VSTRect Struct Reference
    +
    +
    + + + + + + + + + + +

    +Public Attributes

    +int16_t top
     
    +int16_t left
     
    +int16_t bottom
     
    +int16_t right
     
    +
    The documentation for this struct was generated from the following file:
      +
    • effects/internal/vsthost.cpp
    • +
    +
    + + + + diff --git a/docs/html/struct_video_codec_params-members.html b/docs/html/struct_video_codec_params-members.html new file mode 100644 index 000000000..c7782bd8f --- /dev/null +++ b/docs/html/struct_video_codec_params-members.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    VideoCodecParams Member List
    +
    +
    + +

    This is the complete list of members for VideoCodecParams, including all inherited members.

    + + +
    pix_fmt (defined in VideoCodecParams)VideoCodecParams
    + + + + diff --git a/docs/html/struct_video_codec_params.html b/docs/html/struct_video_codec_params.html new file mode 100644 index 000000000..acced8e12 --- /dev/null +++ b/docs/html/struct_video_codec_params.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: VideoCodecParams Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    VideoCodecParams Struct Reference
    +
    +
    + + + + +

    +Public Attributes

    +int pix_fmt
     
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/docs/html/sync_off.png b/docs/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/docs/html/sync_on.png b/docs/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/docs/html/tab_a.png b/docs/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/docs/html/tab_b.png b/docs/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/docs/html/tabs.css b/docs/html/tabs.css new file mode 100644 index 000000000..8ea7d5496 --- /dev/null +++ b/docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/docs/html/texteditdialog_8h_source.html b/docs/html/texteditdialog_8h_source.html new file mode 100644 index 000000000..7d4ecc687 --- /dev/null +++ b/docs/html/texteditdialog_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: dialogs/texteditdialog.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    texteditdialog.h
    +
    +
    +
    1 #ifndef TEXTEDITDIALOG_H
    2 #define TEXTEDITDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class QPlainTextEdit;
    7 
    8 class TextEditDialog : public QDialog {
    9  Q_OBJECT
    10 public:
    11  TextEditDialog(QWidget* parent = 0, const QString& s = 0);
    12  const QString& get_string();
    13 private slots:
    14  void save();
    15  void cancel();
    16 private:
    17  QString result_str;
    18  QPlainTextEdit* textEdit;
    19 };
    20 
    21 #endif // TEXTEDITDIALOG_H
    Definition: texteditdialog.h:8
    +
    + + + + diff --git a/docs/html/texteditex_8h_source.html b/docs/html/texteditex_8h_source.html new file mode 100644 index 000000000..250e23113 --- /dev/null +++ b/docs/html/texteditex_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/texteditex.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    texteditex.h
    +
    +
    +
    1 #ifndef TEXTEDITEX_H
    2 #define TEXTEDITEX_H
    3 
    4 #include <QTextEdit>
    5 
    6 class TextEditEx : public QTextEdit {
    7  Q_OBJECT
    8 public:
    9  TextEditEx(QWidget* parent = 0);
    10  void setPlainTextEx(const QString &text);
    11  const QString& getPreviousValue();
    12  const QString& getPlainTextEx();
    13 signals:
    14  void updateSelf();
    15 private slots:
    16  void updateInternals();
    17  void updateText();
    18 private:
    19  QString previousText;
    20  QString text;
    21 };
    22 
    23 #endif // TEXTEDITEX_H
    Definition: texteditex.h:6
    +
    + + + + diff --git a/docs/html/texteffect_8h_source.html b/docs/html/texteffect_8h_source.html new file mode 100644 index 000000000..de1285c4a --- /dev/null +++ b/docs/html/texteffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/texteffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    texteffect.h
    +
    +
    +
    1 #ifndef TEXTEFFECT_H
    2 #define TEXTEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 #include <QFont>
    7 #include <QImage>
    8 class QOpenGLTexture;
    9 
    10 class TextEffect : public Effect {
    11  Q_OBJECT
    12 public:
    13  TextEffect(Clip* c, const EffectMeta *em);
    14  void redraw(double timecode);
    15 
    16  EffectField* text_val;
    17  EffectField* size_val;
    18  EffectField* set_color_button;
    19  EffectField* set_font_combobox;
    20  EffectField* halign_field;
    21  EffectField* valign_field;
    22  EffectField* word_wrap_field;
    23 
    24  EffectField* outline_bool;
    25  EffectField* outline_width;
    26  EffectField* outline_color;
    27 
    28  EffectField* shadow_bool;
    29  EffectField* shadow_distance;
    30  EffectField* shadow_color;
    31  EffectField* shadow_softness;
    32  EffectField* shadow_opacity;
    33 private slots:
    34  void outline_enable(bool);
    35  void shadow_enable(bool);
    36  void text_edit_menu();
    37  void open_text_edit();
    38 private:
    39  QFont font;
    40 };
    41 
    42 #endif // TEXTEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: texteffect.h:10
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/timecodeeffect_8h_source.html b/docs/html/timecodeeffect_8h_source.html new file mode 100644 index 000000000..910577ca4 --- /dev/null +++ b/docs/html/timecodeeffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/timecodeeffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timecodeeffect.h
    +
    +
    +
    1 #ifndef TIMECODEEFFECT_H
    2 #define TIMECODEEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 #include <QFont>
    7 #include <QImage>
    8 class QOpenGLTexture;
    9 
    10 class TimecodeEffect : public Effect {
    11  Q_OBJECT
    12 public:
    13  TimecodeEffect(Clip* c, const EffectMeta *em);
    14  void redraw(double timecode);
    15  EffectField * scale_val;
    16  EffectField * color_val;
    17  EffectField * color_bg_val;
    18  EffectField * bg_alpha;
    19  EffectField * offset_x_val;
    20  EffectField * offset_y_val;
    21  EffectField * prepend_text;
    22  EffectField * tc_select;
    23 
    24 private:
    25  QFont font;
    26  QString display_timecode;
    27 };
    28 
    29 #endif // TIMECODEEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: timecodeeffect.h:10
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/timeline_8h_source.html b/docs/html/timeline_8h_source.html new file mode 100644 index 000000000..be79d8f6b --- /dev/null +++ b/docs/html/timeline_8h_source.html @@ -0,0 +1,98 @@ + + + + + + + +Olive: panels/timeline.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timeline.h
    +
    +
    +
    1 #ifndef TIMELINE_H
    2 #define TIMELINE_H
    3 
    4 #include "ui/timelinetools.h"
    5 #include "project/selection.h"
    6 
    7 #include <QDockWidget>
    8 #include <QVector>
    9 #include <QTime>
    10 
    11 #define TRACK_DEFAULT_HEIGHT 40
    12 
    13 #define ADD_OBJ_TITLE 0
    14 #define ADD_OBJ_SOLID 1
    15 #define ADD_OBJ_BARS 2
    16 #define ADD_OBJ_TONE 3
    17 #define ADD_OBJ_NOISE 4
    18 #define ADD_OBJ_AUDIO 5
    19 
    20 class QPushButton;
    21 class SourceTable;
    22 class ViewerWidget;
    23 class ComboAction;
    24 class Effect;
    25 class Media;
    26 class Transition;
    27 class TimelineHeader;
    28 class TimelineWidget;
    29 class ResizableScrollBar;
    30 class AudioMonitor;
    31 class QScrollBar;
    32 struct EffectMeta;
    33 struct Sequence;
    34 class Clip;
    35 struct Footage;
    36 struct FootageStream;
    37 
    38 bool is_clip_selected(Clip* clip, bool containing);
    39 int getScreenPointFromFrame(double zoom, long frame);
    40 long getFrameFromScreenPoint(double zoom, int x);
    41 bool selection_contains_transition(const Selection& s, Clip* c, int type);
    42 void move_clip(ComboAction *ca, Clip *c, long iin, long iout, long iclip_in, int itrack, bool verify_transitions = true, bool relative = false);
    43 void ripple_clips(ComboAction *ca, Sequence* s, long point, long length, const QVector<int>& ignore = QVector<int>());
    44 
    45 struct Ghost {
    46  int clip;
    47  long in;
    48  long out;
    49  int track;
    50  long clip_in;
    51 
    52  long old_in;
    53  long old_out;
    54  int old_track;
    55  long old_clip_in;
    56 
    57  // importing variables
    58  Media* media;
    59  int media_stream;
    60 
    61  // other variables
    62  long ghost_length;
    63  long media_length;
    64  bool trim_in;
    65  bool trimming;
    66 
    67  // transition trimming
    68  Transition* transition;
    69 };
    70 
    71 class Timeline : public QDockWidget
    72 {
    73  Q_OBJECT
    74 public:
    75  explicit Timeline(QWidget *parent = nullptr);
    76  ~Timeline();
    77 
    78  bool focused();
    79  void set_zoom(bool in);
    80  void copy(bool del);
    81  Clip* split_clip(ComboAction* ca, bool transitions, int p, long frame);
    82  Clip* split_clip(ComboAction* ca, bool transitions, int p, long frame, long post_in);
    83  bool split_selection(ComboAction* ca);
    84  bool split_all_clips_at_point(ComboAction *ca, long point);
    85  bool split_clip_and_relink(ComboAction* ca, int clip, long frame, bool relink);
    86  void clean_up_selections(QVector<Selection>& areas);
    87  void deselect_area(long in, long out, int track);
    88  void delete_areas_and_relink(ComboAction *ca, QVector<Selection>& areas, bool deselect_areas);
    89  void relink_clips_using_ids(QVector<int>& old_clips, QVector<Clip*>& new_clips);
    90  void update_sequence();
    91 
    92  QVector<int> get_tracks_of_linked_clips(int i);
    93  bool has_clip_been_split(int c);
    94  void edit_to_point_internal(bool in, bool ripple);
    95  void delete_in_out_internal(bool ripple);
    96 
    97  void create_ghosts_from_media(Sequence *seq, long entry_point, QVector<Media *> &media_list);
    98  void add_clips_from_ghosts(ComboAction *ca, Sequence *s);
    99 
    100  int getTimelineScreenPointFromFrame(long frame);
    101  long getTimelineFrameFromScreenPoint(int x);
    102  int getDisplayScreenPointFromFrame(long frame);
    103  long getDisplayFrameFromScreenPoint(int x);
    104 
    105  int get_snap_range();
    106  bool snap_to_point(long point, long* l);
    107  bool snap_to_timeline(long* l, bool use_playhead, bool use_markers, bool use_workarea);
    108  void set_marker();
    109 
    110  // shared information
    111  int tool;
    112  long cursor_frame;
    113  int cursor_track;
    114  double zoom;
    115  bool zoom_just_changed;
    116  long drag_frame_start;
    117  int drag_track_start;
    118  void update_effect_controls();
    119  bool showing_all;
    120  double old_zoom;
    121 
    122  QVector<int> video_track_heights;
    123  QVector<int> audio_track_heights;
    124  int get_track_height_size(bool video);
    125  int calculate_track_height(int track, int height);
    126 
    127  // snapping
    128  bool snapping;
    129  bool snapped;
    130  long snap_point;
    131 
    132  // selecting functions
    133  bool selecting;
    134  int selection_offset;
    135  void delete_selection(QVector<Selection> &selections, bool ripple);
    136  void select_all();
    137  bool rect_select_init;
    138  bool rect_select_proc;
    139  int rect_select_x;
    140  int rect_select_y;
    141  int rect_select_w;
    142  int rect_select_h;
    143 
    144  // moving
    145  bool moving_init;
    146  bool moving_proc;
    147  QVector<Ghost> ghosts;
    148  bool video_ghosts;
    149  bool audio_ghosts;
    150  bool move_insert;
    151 
    152  // trimming
    153  int trim_target;
    154  bool trim_in_point;
    155  int transition_select;
    156 
    157  // splitting
    158  bool splitting;
    159  QVector<int> split_tracks;
    160  QVector<int> split_cache;
    161 
    162  // importing
    163  bool importing;
    164  bool importing_files;
    165 
    166  // creating variables
    167  bool creating;
    168  int creating_object;
    169 
    170  // transition variables
    171  bool transition_tool_init;
    172  bool transition_tool_proc;
    173  int transition_tool_pre_clip;
    174  int transition_tool_post_clip;
    175  int transition_tool_type;
    176  const EffectMeta* transition_tool_meta;
    177  int transition_tool_side;
    178 
    179  // hand tool variables
    180  bool hand_moving;
    181  int drag_x_start;
    182  int drag_y_start;
    183 
    184  bool block_repaints;
    185 
    186  TimelineHeader* headers;
    187  AudioMonitor* audio_monitor;
    188  ResizableScrollBar* horizontalScrollBar;
    189 
    190  QPushButton* toolArrowButton;
    191  QPushButton* toolEditButton;
    192  QPushButton* toolRippleButton;
    193  QPushButton* toolRazorButton;
    194  QPushButton* toolSlipButton;
    195  QPushButton* toolSlideButton;
    196  QPushButton* toolHandButton;
    197  QPushButton* toolTransitionButton;
    198  QPushButton* snappingButton;
    199 
    200  void scroll_to_frame(long frame);
    201  void select_from_playhead();
    202 
    203  bool can_ripple_empty_space(long frame, int track);
    204 
    205  void resizeEvent(QResizeEvent *event);
    206 public slots:
    207  void paste(bool insert = false);
    208  void repaint_timeline();
    209  void toggle_show_all();
    210  void deselect();
    211  void toggle_links();
    212  void split_at_playhead();
    213  void ripple_delete();
    214  void ripple_delete_empty_space();
    215  void toggle_enable_on_selected_clips();
    216 
    217  void delete_inout();
    218  void ripple_delete_inout();
    219 
    220  void ripple_to_in_point();
    221  void ripple_to_out_point();
    222  void edit_to_in_point();
    223  void edit_to_out_point();
    224 
    225  void increase_track_height();
    226  void decrease_track_height();
    227 
    228  void previous_cut();
    229  void next_cut();
    230 
    231  void add_transition();
    232 
    233  void nest();
    234 
    235 private slots:
    236  void zoom_in();
    237  void zoom_out();
    238  void snapping_clicked(bool checked);
    239  void add_btn_click();
    240  void add_menu_item(QAction*);
    241  void setScroll(int);
    242  void record_btn_click();
    243  void transition_tool_click();
    244  void transition_menu_select(QAction*);
    245  void resize_move(double d);
    246  void set_tool();
    247 
    248 private:
    249  void set_zoom_value(double v);
    250  QVector<QPushButton*> tool_buttons;
    251  void decheck_tool_buttons(QObject* sender);
    252  void set_tool(int tool);
    253  int scroll;
    254  void set_sb_max();
    255 
    256  void setup_ui();
    257 
    258  int default_track_height;
    259 
    260  // ripple delete empty space variables
    261  long rc_ripple_min;
    262  long rc_ripple_max;
    263 
    264  QWidget* timeline_area;
    265  TimelineWidget* video_area;
    266  TimelineWidget* audio_area;
    267  QWidget* editAreas;
    268  QScrollBar* videoScrollbar;
    269  QScrollBar* audioScrollbar;
    270  QPushButton* zoomInButton;
    271  QPushButton* zoomOutButton;
    272  QPushButton* recordButton;
    273  QPushButton* addButton;
    274  QWidget* tool_button_widget;
    275 };
    276 
    277 #endif // TIMELINE_H
    Definition: sequence.h:13
    +
    Definition: selection.h:4
    +
    Definition: sourcetable.h:11
    +
    Definition: undo.h:32
    +
    Definition: audiomonitor.h:7
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: timelinewidget.h:27
    +
    Definition: timeline.h:71
    +
    Definition: timelineheader.h:11
    +
    Definition: media.h:20
    +
    Definition: footage.h:25
    +
    Definition: viewerwidget.h:24
    +
    Definition: resizablescrollbar.h:6
    +
    Definition: timeline.h:45
    +
    Definition: clip.h:33
    +
    Definition: transition.h:19
    +
    Definition: footage.h:46
    +
    + + + + diff --git a/docs/html/timelineheader_8h_source.html b/docs/html/timelineheader_8h_source.html new file mode 100644 index 000000000..0921cf854 --- /dev/null +++ b/docs/html/timelineheader_8h_source.html @@ -0,0 +1,82 @@ + + + + + + + +Olive: ui/timelineheader.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timelineheader.h
    +
    +
    +
    1 #ifndef TIMELINEHEADER_H
    2 #define TIMELINEHEADER_H
    3 
    4 #include <QWidget>
    5 #include <QFontMetrics>
    6 class Viewer;
    7 class QScrollBar;
    8 
    9 bool center_scroll_to_playhead(QScrollBar* bar, double zoom, long playhead);
    10 
    11 class TimelineHeader : public QWidget
    12 {
    13  Q_OBJECT
    14 public:
    15  explicit TimelineHeader(QWidget *parent = 0);
    16  void set_in_point(long p);
    17  void set_out_point(long p);
    18 
    19  Viewer* viewer;
    20 
    21  bool snapping;
    22 
    23  void show_text(bool enable);
    24  double get_zoom();
    25  void delete_markers();
    26  void set_scrollbar_max(QScrollBar* bar, long sequence_end_frame, int offset);
    27 
    28 public slots:
    29  void update_zoom(double z);
    30  void set_scroll(int);
    31  void set_visible_in(long i);
    32  void show_context_menu(const QPoint &pos);
    33  void resized_scroll_listener(double d);
    34 
    35 protected:
    36  void paintEvent(QPaintEvent*);
    37  void mousePressEvent(QMouseEvent*);
    38  void mouseMoveEvent(QMouseEvent*);
    39  void mouseReleaseEvent(QMouseEvent*);
    40  void focusOutEvent(QFocusEvent*);
    41 
    42 private:
    43  void update_parents();
    44 
    45  bool dragging;
    46 
    47  bool resizing_workarea;
    48  bool resizing_workarea_in;
    49  long temp_workarea_in;
    50  long temp_workarea_out;
    51  long sequence_end;
    52 
    53  double zoom;
    54 
    55  long in_visible;
    56 
    57  void set_playhead(int mouse_x);
    58 
    59  int get_marker_offset();
    60 
    61  QFontMetrics fm;
    62 
    63  int drag_start;
    64  bool dragging_markers;
    65  QVector<int> selected_markers;
    66  QVector<long> selected_marker_original_times;
    67 
    68  long getHeaderFrameFromScreenPoint(int x);
    69  int getHeaderScreenPointFromFrame(long frame);
    70 
    71  int scroll;
    72 
    73  int height_actual;
    74  bool text_enabled;
    75 
    76 signals:
    77 };
    78 
    79 #endif // TIMELINEHEADER_H
    Definition: timelineheader.h:11
    +
    Definition: viewer.h:25
    +
    + + + + diff --git a/docs/html/timelinetools_8h_source.html b/docs/html/timelinetools_8h_source.html new file mode 100644 index 000000000..c5187bcd2 --- /dev/null +++ b/docs/html/timelinetools_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: ui/timelinetools.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timelinetools.h
    +
    +
    +
    1 #ifndef TIMELINETOOLS_H
    2 #define TIMELINETOOLS_H
    3 
    4 #define TIMELINE_TOOL_POINTER 0
    5 #define TIMELINE_TOOL_EDIT 1
    6 #define TIMELINE_TOOL_RAZOR 2
    7 #define TIMELINE_TOOL_RIPPLE 3
    8 #define TIMELINE_TOOL_ROLLING 4
    9 #define TIMELINE_TOOL_SLIP 5
    10 #define TIMELINE_TOOL_SLIDE 6
    11 #define TIMELINE_TOOL_HAND 7
    12 #define TIMELINE_TOOL_ZOOM 8
    13 #define TIMELINE_TOOL_MENU 9
    14 #define TIMELINE_TOOL_TRANSITION 10
    15 
    16 #endif // TIMELINETOOLS_H
    + + + + diff --git a/docs/html/timelinewidget_8h_source.html b/docs/html/timelinewidget_8h_source.html new file mode 100644 index 000000000..99bd7b9f0 --- /dev/null +++ b/docs/html/timelinewidget_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: ui/timelinewidget.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    timelinewidget.h
    +
    +
    +
    1 #ifndef TIMELINEWIDGET_H
    2 #define TIMELINEWIDGET_H
    3 
    4 #include <QTimer>
    5 #include <QWidget>
    6 #include "timelinetools.h"
    7 
    8 #define GHOST_THICKNESS 2 // thiccccc
    9 #define CLIP_TEXT_PADDING 3
    10 
    11 #define TRACK_MIN_HEIGHT 30
    12 #define TRACK_HEIGHT_INCREMENT 10
    13 
    14 struct Sequence;
    15 class Clip;
    16 struct FootageStream;
    17 class Timeline;
    18 class TimelineAction;
    19 class QScrollBar;
    21 class QPainter;
    22 class Media;
    23 
    24 bool same_sign(int a, int b);
    25 void draw_waveform(Clip* clip, const FootageStream *ms, long media_length, QPainter* p, const QRect& clip_rect, int waveform_start, int waveform_limit, double zoom);
    26 
    27 class TimelineWidget : public QWidget {
    28  Q_OBJECT
    29 public:
    30  explicit TimelineWidget(QWidget *parent = 0);
    31  QScrollBar* scrollBar;
    32  bool bottom_align;
    33 protected:
    34  void paintEvent(QPaintEvent*);
    35 
    36  void resizeEvent(QResizeEvent *event);
    37 
    38  void mouseDoubleClickEvent(QMouseEvent *event);
    39  void mousePressEvent(QMouseEvent *event);
    40  void mouseReleaseEvent(QMouseEvent *event);
    41  void mouseMoveEvent(QMouseEvent *event);
    42  void leaveEvent(QEvent *event);
    43 
    44  void dragEnterEvent(QDragEnterEvent *event);
    45  void dragLeaveEvent(QDragLeaveEvent *event);
    46  void dropEvent(QDropEvent* event);
    47  void dragMoveEvent(QDragMoveEvent *event);
    48 
    49  void wheelEvent(QWheelEvent *event);
    50 private:
    51  void init_ghosts();
    52  void update_ghosts(const QPoint& mouse_pos, bool lock_frame);
    53  bool is_track_visible(int track);
    54  int getTrackFromScreenPoint(int y);
    55  int getScreenPointFromTrack(int track);
    56  int getClipIndexFromCoords(long frame, int track);
    57 
    58  int track_resize_mouse_cache;
    59  int track_resize_old_value;
    60  bool track_resizing;
    61  int track_target;
    62 
    63  QVector<Clip*> pre_clips;
    64  QVector<Clip*> post_clips;
    65 
    66  Media* rc_reveal_media;
    67 
    68  Sequence* self_created_sequence;
    69 
    70  QTimer tooltip_timer;
    71  int tooltip_clip;
    72 
    73  int scroll;
    74 
    75  SetSelectionsCommand* selection_command;
    76 signals:
    77 
    78 public slots:
    79  void setScroll(int);
    80 
    81 private slots:
    82  void reveal_media();
    83  void show_context_menu(const QPoint& pos);
    84  void toggle_autoscale();
    85  void tooltip_timer_timeout();
    86  void rename_clip();
    87  void show_stabilizer_diag();
    88  void open_sequence_properties();
    89 };
    90 
    91 #endif // TIMELINEWIDGET_H
    Definition: sequence.h:13
    +
    Definition: timelinewidget.h:27
    +
    Definition: timeline.h:71
    +
    Definition: media.h:20
    +
    Definition: undo.h:439
    +
    Definition: footage.h:25
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/toneeffect_8h_source.html b/docs/html/toneeffect_8h_source.html new file mode 100644 index 000000000..0a06d8927 --- /dev/null +++ b/docs/html/toneeffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/toneeffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    toneeffect.h
    +
    +
    +
    1 #ifndef TONEEFFECT_H
    2 #define TONEEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class ToneEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  ToneEffect(Clip *c, const EffectMeta* em);
    10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    11 
    12  EffectField* type_val;
    13  EffectField* freq_val;
    14  EffectField* amount_val;
    15  EffectField* mix_val;
    16 private:
    17  int sinX;
    18 };
    19 
    20 #endif // TONEEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: toneeffect.h:6
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/transformeffect_8h_source.html b/docs/html/transformeffect_8h_source.html new file mode 100644 index 000000000..f3ed788c9 --- /dev/null +++ b/docs/html/transformeffect_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +Olive: effects/internal/transformeffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    transformeffect.h
    +
    +
    +
    1 #ifndef TRANSFORMEFFECT_H
    2 #define TRANSFORMEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class TransformEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  TransformEffect(Clip* c, const EffectMeta* em);
    10  void refresh();
    11  void process_coords(double timecode, GLTextureCoords& coords, int data);
    12 
    13  void gizmo_draw(double timecode, GLTextureCoords& coords);
    14 public slots:
    15  void toggle_uniform_scale(bool enabled);
    16 private:
    17  EffectField* position_x;
    18  EffectField* position_y;
    19  EffectField* scale_x;
    20  EffectField* scale_y;
    21  EffectField* uniform_scale_field;
    22  EffectField* rotation;
    23  EffectField* anchor_x_box;
    24  EffectField* anchor_y_box;
    25  EffectField* opacity;
    26  EffectField* blend_mode_box;
    27 
    28  EffectGizmo* top_left_gizmo;
    29  EffectGizmo* top_center_gizmo;
    30  EffectGizmo* top_right_gizmo;
    31  EffectGizmo* bottom_left_gizmo;
    32  EffectGizmo* bottom_center_gizmo;
    33  EffectGizmo* bottom_right_gizmo;
    34  EffectGizmo* left_center_gizmo;
    35  EffectGizmo* right_center_gizmo;
    36  EffectGizmo* anchor_gizmo;
    37  EffectGizmo* rotate_gizmo;
    38  EffectGizmo* rect_gizmo;
    39 
    40  bool set;
    41 };
    42 
    43 #endif // TRANSFORMEFFECT_H
    Definition: effect.h:105
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: transformeffect.h:6
    +
    Definition: effectgizmo.h:21
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/transition_8h_source.html b/docs/html/transition_8h_source.html new file mode 100644 index 000000000..7eb0bfeea --- /dev/null +++ b/docs/html/transition_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: project/transition.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    transition.h
    +
    +
    +
    1 #ifndef TRANSITION_H
    2 #define TRANSITION_H
    3 
    4 #include "effect.h"
    5 
    6 #define TA_NO_TRANSITION 0
    7 #define TA_OPENING_TRANSITION 1
    8 #define TA_CLOSING_TRANSITION 2
    9 
    10 #define TRANSITION_INTERNAL_CROSSDISSOLVE 0
    11 #define TRANSITION_INTERNAL_LINEARFADE 1
    12 #define TRANSITION_INTERNAL_EXPONENTIALFADE 2
    13 #define TRANSITION_INTERNAL_LOGARITHMICFADE 3
    14 #define TRANSITION_INTERNAL_CUBE 4
    15 #define TRANSITION_INTERNAL_COUNT 5
    16 
    17 int create_transition(Clip* c, Clip* s, const EffectMeta* em, long length = -1);
    18 
    19 class Transition : public Effect {
    20  Q_OBJECT
    21 public:
    22  Transition(Clip* c, Clip* s, const EffectMeta* em);
    23  int copy(Clip* c, Clip* s);
    24  Clip* secondary_clip;
    25  void set_length(long l);
    26  long get_true_length();
    27  long get_length();
    28 private slots:
    29  void set_length_from_slider();
    30 private:
    31  long length; // used only for transitions
    32  EffectField* length_field;
    33 };
    34 
    35 #endif // TRANSITION_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    Definition: transition.h:19
    +
    + + + + diff --git a/docs/html/undo_8h_source.html b/docs/html/undo_8h_source.html new file mode 100644 index 000000000..833c47049 --- /dev/null +++ b/docs/html/undo_8h_source.html @@ -0,0 +1,145 @@ + + + + + + + +Olive: project/undo.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    undo.h
    +
    +
    +
    1 #ifndef UNDO_H
    2 #define UNDO_H
    3 
    4 class Media;
    5 class QCheckBox;
    6 class LabelSlider;
    7 class Effect;
    8 class SourceTable;
    9 class EffectRow;
    10 class EffectField;
    11 class Transition;
    12 class EffectGizmo;
    13 class Clip;
    14 struct Sequence;
    15 struct Footage;
    16 struct EffectMeta;
    17 
    18 #include "project/marker.h"
    19 #include "project/selection.h"
    20 #include "project/effectfield.h"
    21 
    22 #include <QUndoStack>
    23 #include <QUndoCommand>
    24 #include <QVector>
    25 #include <QVariant>
    26 #include <QModelIndex>
    27 
    28 namespace Olive {
    29  extern QUndoStack UndoStack;
    30 }
    31 
    32 class ComboAction : public QUndoCommand {
    33 public:
    34  ComboAction();
    35  virtual ~ComboAction() override;
    36  virtual void undo() override;
    37  virtual void redo() override;
    38  void append(QUndoCommand* u);
    39  void appendPost(QUndoCommand* u);
    40 private:
    41  QVector<QUndoCommand*> commands;
    42  QVector<QUndoCommand*> post_commands;
    43 };
    44 
    45 class OliveAction : public QUndoCommand {
    46 public:
    47  OliveAction(bool iset_window_modified = true);
    48  virtual ~OliveAction() override;
    49 
    50  virtual void undo() override;
    51  virtual void redo() override;
    52 
    53  virtual void doUndo() = 0;
    54  virtual void doRedo() = 0;
    55 private:
    60 
    65 };
    66 
    67 class MoveClipAction : public OliveAction {
    68 public:
    69  MoveClipAction(Clip* c, long iin, long iout, long iclip_in, int itrack, bool irelative);
    70  virtual void doUndo() override;
    71  virtual void doRedo() override;
    72 private:
    73  Clip* clip;
    74 
    75  long old_in;
    76  long old_out;
    77  long old_clip_in;
    78  int old_track;
    79 
    80  long new_in;
    81  long new_out;
    82  long new_clip_in;
    83  int new_track;
    84 
    85  bool relative;
    86 };
    87 
    88 class RippleAction : public OliveAction {
    89 public:
    90  RippleAction(Sequence *is, long ipoint, long ilength, const QVector<int>& iignore);
    91  virtual void doUndo() override;
    92  virtual void doRedo() override;
    93 private:
    94  Sequence *s;
    95  long point;
    96  long length;
    97  QVector<int> ignore;
    98  ComboAction* ca;
    99 };
    100 
    102 public:
    103  DeleteClipAction(Sequence* s, int clip);
    104  virtual ~DeleteClipAction() override;
    105  virtual void doUndo() override;
    106  virtual void doRedo() override;
    107 private:
    108  Sequence* seq;
    109  Clip* ref;
    110  int index;
    111 
    112  int opening_transition;
    113  int closing_transition;
    114 
    115  QVector<int> linkClipIndex;
    116  QVector<int> linkLinkIndex;
    117 };
    118 
    120 public:
    122  virtual void doUndo() override;
    123  virtual void doRedo() override;
    124 private:
    125  Sequence* old_sequence;
    126  Sequence* new_sequence;
    127 };
    128 
    130 public:
    131  AddEffectCommand(Clip* c, Effect *e, const EffectMeta* m, int insert_pos = -1);
    132  virtual ~AddEffectCommand() override;
    133  virtual void doUndo() override;
    134  virtual void doRedo() override;
    135 private:
    136  Clip* clip;
    137  const EffectMeta* meta;
    138  Effect* ref;
    139  int pos;
    140  bool done;
    141 };
    142 
    144 public:
    145  AddTransitionCommand(Clip* c, Clip* s, Transition *copy, const EffectMeta* itransition, int itype, int ilength);
    146  virtual void doUndo() override;
    147  virtual void doRedo() override;
    148 private:
    149  Clip* clip;
    150  Clip* secondary;
    151  Transition* transition_to_copy;
    152  const EffectMeta* transition;
    153  int type;
    154  int length;
    155  int old_ptransition;
    156  int old_stransition;
    157 };
    158 
    160 public:
    161  ModifyTransitionCommand(Clip* c, int itype, long ilength);
    162  virtual void doUndo() override;
    163  virtual void doRedo() override;
    164 private:
    165  Clip* clip;
    166  int type;
    167  long new_length;
    168  long old_length;
    169 };
    170 
    172 public:
    173  DeleteTransitionCommand(Sequence* s, int transition_index);
    174  virtual ~DeleteTransitionCommand() override;
    175  virtual void doUndo() override;
    176  virtual void doRedo() override;
    177 private:
    178  Sequence* seq;
    179  int index;
    180  Transition* transition;
    181  Clip* otc;
    182  Clip* ctc;
    183 };
    184 
    186 public:
    187  SetTimelineInOutCommand(Sequence* s, bool enabled, long in, long out);
    188  virtual void doUndo() override;
    189  virtual void doRedo() override;
    190 private:
    191  Sequence* seq;
    192 
    193  bool old_enabled;
    194  long old_in;
    195  long old_out;
    196 
    197  bool new_enabled;
    198  long new_in;
    199  long new_out;
    200 };
    201 
    203 public:
    204  NewSequenceCommand(Media *s, Media* iparent);
    205  virtual ~NewSequenceCommand() override;
    206  virtual void doUndo() override;
    207  virtual void doRedo() override;
    208 private:
    209  Media* seq;
    210  Media* parent;
    211  bool done;
    212 };
    213 
    214 class AddMediaCommand : public OliveAction {
    215 public:
    216  AddMediaCommand(Media* iitem, Media* iparent);
    217  virtual ~AddMediaCommand() override;
    218  virtual void doUndo() override;
    219  virtual void doRedo() override;
    220 private:
    221  Media* item;
    222  Media* parent;
    223  bool done;
    224 };
    225 
    227 public:
    229  virtual ~DeleteMediaCommand() override;
    230  virtual void doUndo() override;
    231  virtual void doRedo() override;
    232 private:
    233  Media* item;
    234  Media* parent;
    235  bool done;
    236 };
    237 
    238 class AddClipCommand : public OliveAction {
    239 public:
    240  AddClipCommand(Sequence* s, QVector<Clip*>& add);
    241  virtual ~AddClipCommand() override;
    242  virtual void doUndo() override;
    243  virtual void doRedo() override;
    244 private:
    245  Sequence* seq;
    246  QVector<Clip*> clips;
    247  QVector<Clip*> undone_clips;
    248 };
    249 
    250 class LinkCommand : public OliveAction {
    251 public:
    252  LinkCommand();
    253  virtual void doUndo() override;
    254  virtual void doRedo() override;
    255  Sequence* s;
    256  QVector<int> clips;
    257  bool link;
    258 private:
    259  QVector< QVector<int> > old_links;
    260 };
    261 
    262 class CheckboxCommand : public OliveAction {
    263 public:
    264  CheckboxCommand(QCheckBox* b);
    265  virtual ~CheckboxCommand() override;
    266  virtual void doUndo() override;
    267  virtual void doRedo() override;
    268 private:
    269  QCheckBox* box;
    270  bool checked;
    271  bool done;
    272 };
    273 
    275 public:
    276  ReplaceMediaCommand(Media*, QString);
    277  virtual void doUndo() override;
    278  virtual void doRedo() override;
    279 private:
    280  Media *item;
    281  QString old_filename;
    282  QString new_filename;
    283  void replace(QString& filename);
    284 };
    285 
    287 public:
    288  ReplaceClipMediaCommand(Media *, Media *, bool);
    289  virtual void doUndo() override;
    290  virtual void doRedo() override;
    291  QVector<Clip*> clips;
    292 private:
    293  Media* old_media;
    294  Media* new_media;
    295  bool preserve_clip_ins;
    296  QVector<int> old_clip_ins;
    297  void replace(bool undo);
    298 };
    299 
    301 public:
    303  virtual ~EffectDeleteCommand() override;
    304  virtual void doUndo() override;
    305  virtual void doRedo() override;
    306  QVector<Clip*> clips;
    307  QVector<int> fx;
    308 private:
    309  bool done;
    310  QVector<Effect*> deleted_objects;
    311 };
    312 
    313 class MediaMove : public OliveAction {
    314 public:
    315  MediaMove();
    316  QVector<Media*> items;
    317  Media* to;
    318  virtual void doUndo() override;
    319  virtual void doRedo() override;
    320 private:
    321  QVector<Media*> froms;
    322 };
    323 
    324 class MediaRename : public OliveAction {
    325 public:
    326  MediaRename(Media* iitem, QString to);
    327  virtual void doUndo() override;
    328  virtual void doRedo() override;
    329 private:
    330  Media* item;
    331  QString from;
    332  QString to;
    333 };
    334 
    335 class KeyframeDelete : public OliveAction {
    336 public:
    337  KeyframeDelete(EffectField* ifield, int iindex);
    338  virtual void doUndo() override;
    339  virtual void doRedo() override;
    340 private:
    341  EffectField* field;
    342  int index;
    343  bool done;
    344  EffectKeyframe deleted_key;
    345 };
    346 
    347 // a more modern version of the above, could probably replace it
    348 // assumes the keyframe already exists
    350 public:
    351  KeyframeFieldSet(EffectField* ifield, int ii);
    352  virtual void doUndo() override;
    353  virtual void doRedo() override;
    354 private:
    355  EffectField* field;
    356  int index;
    357  EffectKeyframe key;
    358  bool done;
    359 };
    360 
    361 class EffectFieldUndo : public OliveAction {
    362 public:
    364  virtual void doUndo() override;
    365  virtual void doRedo() override;
    366 private:
    367  EffectField* field;
    368  QVariant old_val;
    369  QVariant new_val;
    370  bool done;
    371 };
    372 
    374 public:
    376  virtual void doUndo() override;
    377  virtual void doRedo() override;
    378  QVector<Clip*> clips;
    379 };
    380 
    381 class AddMarkerAction : public OliveAction {
    382 public:
    383  AddMarkerAction(QVector<Marker>* m, long t, QString n);
    384  virtual void doUndo() override;
    385  virtual void doRedo() override;
    386 private:
    387  QVector<Marker>* active_array;
    388  long time;
    389  QString name;
    390  QString old_name;
    391  int index;
    392 };
    393 
    395 public:
    396  MoveMarkerAction(Marker* m, long o, long n);
    397  virtual void doUndo() override;
    398  virtual void doRedo() override;
    399 private:
    400  Marker* marker;
    401  long old_time;
    402  long new_time;
    403 };
    404 
    406 public:
    407  DeleteMarkerAction(QVector<Marker>* m);
    408  virtual void doUndo() override;
    409  virtual void doRedo() override;
    410  QVector<int> markers;
    411 private:
    412  QVector<Marker>* active_array;
    413  QVector<Marker> copies;
    414  bool sorted;
    415 };
    416 
    417 class SetSpeedAction : public OliveAction {
    418 public:
    419  SetSpeedAction(Clip* c, double speed);
    420  virtual void doUndo() override;
    421  virtual void doRedo() override;
    422 private:
    423  Clip* clip;
    424  double old_speed;
    425  double new_speed;
    426 };
    427 
    428 class SetBool : public OliveAction {
    429 public:
    430  SetBool(bool* b, bool setting);
    431  virtual void doUndo() override;
    432  virtual void doRedo() override;
    433 private:
    434  bool* boolean;
    435  bool old_setting;
    436  bool new_setting;
    437 };
    438 
    440 public:
    442  virtual void doUndo() override;
    443  virtual void doRedo() override;
    444  QVector<Selection> old_data;
    445  QVector<Selection> new_data;
    446 private:
    447  Sequence* seq;
    448  bool done;
    449 };
    450 
    452 public:
    454  virtual void doUndo() override;
    455  virtual void doRedo() override;
    456  void update();
    457 
    458  QString name;
    459  int width;
    460  int height;
    461  double frame_rate;
    462  int audio_frequency;
    463  int audio_layout;
    464 private:
    465  Media* item;
    466  Sequence* seq;
    467 
    468  QString old_name;
    469  int old_width;
    470  int old_height;
    471  double old_frame_rate;
    472  int old_audio_frequency;
    473  int old_audio_layout;
    474 };
    475 
    476 class SetInt : public OliveAction {
    477 public:
    478  SetInt(int* pointer, int new_value);
    479  virtual void doUndo() override;
    480  virtual void doRedo() override;
    481 private:
    482  int* p;
    483  int oldval;
    484  int newval;
    485 };
    486 
    487 class SetLong : public OliveAction {
    488 public:
    489  SetLong(long* pointer, long old_value, long new_value);
    490  virtual void doUndo() override;
    491  virtual void doRedo() override;
    492 private:
    493  long* p;
    494  long oldval;
    495  long newval;
    496 };
    497 
    498 class SetDouble : public OliveAction {
    499 public:
    500  SetDouble(double* pointer, double old_value, double new_value);
    501  virtual void doUndo() override;
    502  virtual void doRedo() override;
    503 private:
    504  double* p;
    505  double oldval;
    506  double newval;
    507 };
    508 
    509 class SetString : public OliveAction {
    510 public:
    511  SetString(QString* pointer, QString new_value);
    512  virtual void doUndo() override;
    513  virtual void doRedo() override;
    514 private:
    515  QString* p;
    516  QString oldval;
    517  QString newval;
    518 };
    519 
    521 public:
    522  virtual void doUndo() override;
    523  virtual void doRedo() override;
    524 };
    525 
    527 public:
    529  virtual void doUndo() override;
    530  virtual void doRedo() override;
    531 private:
    532  Media* item;
    533 };
    534 
    536 public:
    538  virtual void doUndo() override;
    539  virtual void doRedo() override;
    540  Clip* clip;
    541  int from;
    542  int to;
    543 };
    544 
    546 public:
    547  RemoveClipsFromClipboard(int index);
    548  virtual ~RemoveClipsFromClipboard() override;
    549  virtual void doUndo() override;
    550  virtual void doRedo() override;
    551 private:
    552  int pos;
    553  Clip* clip;
    554  bool done;
    555 };
    556 
    558 public:
    560  QVector<Clip*> clips;
    561  QString new_name;
    562  virtual void doUndo() override;
    563  virtual void doRedo() override;
    564 private:
    565  QVector<QString> old_names;
    566 };
    567 
    568 class SetPointer : public OliveAction {
    569 public:
    570  SetPointer(void** pointer, void* data);
    571  virtual void doUndo() override;
    572  virtual void doRedo() override;
    573 private:
    574  bool old_changed;
    575  void** p;
    576  void* new_data;
    577  void* old_data;
    578 };
    579 
    581 public:
    582  virtual void doUndo() override;
    583  virtual void doRedo() override;
    584 };
    585 
    586 class SetQVariant : public OliveAction {
    587 public:
    588  SetQVariant(QVariant* itarget, const QVariant& iold, const QVariant& inew);
    589  virtual void doUndo() override;
    590  virtual void doRedo() override;
    591 private:
    592  QVariant* target;
    593  QVariant old_val;
    594  QVariant new_val;
    595 };
    596 
    597 class SetKeyframing : public OliveAction {
    598 public:
    599  SetKeyframing(EffectRow* irow, bool ib);
    600  virtual void doUndo() override;
    601  virtual void doRedo() override;
    602 private:
    603  EffectRow* row;
    604  bool b;
    605 };
    606 
    607 class RefreshClips : public OliveAction {
    608 public:
    609  RefreshClips(Media* m);
    610  virtual void doUndo() override;
    611  virtual void doRedo() override;
    612 private:
    613  Media* media;
    614 };
    615 
    616 class UpdateViewer : public OliveAction {
    617 public:
    618  virtual void doUndo() override;
    619  virtual void doRedo() override;
    620 };
    621 
    622 class SetEffectData : public OliveAction {
    623 public:
    624  SetEffectData(Effect* e, const QByteArray &s);
    625  virtual void doUndo() override;
    626  virtual void doRedo() override;
    627 private:
    628  Effect* effect;
    629  QByteArray data;
    630  QByteArray old_data;
    631 };
    632 
    633 #endif // UNDO_H
    Definition: undo.h:535
    +
    Definition: undo.h:313
    +
    Definition: undo.h:498
    +
    Definition: sequence.h:13
    +
    Definition: undo.h:274
    +
    Definition: undo.h:214
    +
    Definition: undo.h:509
    +
    Definition: undo.h:586
    +
    Definition: undo.h:171
    +
    bool set_window_modified
    Setting whether to change the windowModified state of MainWindow.
    Definition: undo.h:59
    +
    Definition: marker.h:11
    +
    Definition: undo.h:405
    +
    Definition: undo.h:67
    +
    Definition: undo.h:417
    +
    Definition: undo.h:545
    +
    Definition: undo.h:324
    +
    Definition: undo.h:143
    +
    Definition: sourcetable.h:11
    +
    Definition: undo.h:129
    +
    Definition: undo.h:45
    +
    Definition: undo.h:616
    +
    Definition: undo.h:394
    +
    Definition: undo.h:32
    + +
    Definition: undo.h:607
    +
    Definition: effect.h:146
    +
    Definition: undo.h:159
    +
    Definition: effect.h:27
    +
    Definition: undo.h:381
    +
    Definition: undo.h:262
    +
    Definition: undo.h:101
    +
    Definition: effectrow.h:17
    +
    Definition: undo.h:88
    +
    Definition: undo.h:286
    +
    Definition: media.h:20
    +
    bool old_window_modified
    Cache previous window modified value to return to if the user undoes this action.
    Definition: undo.h:64
    +
    Definition: undo.h:361
    +
    Definition: undo.h:428
    +
    Definition: undo.h:119
    +
    Definition: undo.h:439
    +
    Definition: undo.h:300
    +
    Definition: undo.h:580
    +
    Definition: undo.h:185
    +
    Definition: undo.h:597
    +
    Definition: effectgizmo.h:21
    +
    Definition: keyframe.h:8
    +
    Definition: undo.h:335
    +
    Definition: undo.h:451
    +
    Definition: undo.h:622
    +
    Definition: undo.h:202
    +
    Definition: undo.h:568
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    Definition: undo.h:520
    +
    Definition: undo.h:487
    +
    Definition: clip.h:33
    +
    Definition: undo.h:557
    +
    Definition: effectfield.h:23
    +
    Definition: undo.h:226
    +
    Definition: undo.h:238
    +
    Definition: undo.h:373
    +
    Definition: transition.h:19
    +
    Definition: undo.h:476
    +
    Definition: undo.h:349
    +
    Definition: footage.h:46
    +
    Definition: undo.h:526
    +
    + + + + diff --git a/docs/html/version_8h_source.html b/docs/html/version_8h_source.html new file mode 100644 index 000000000..6eb2c79b0 --- /dev/null +++ b/docs/html/version_8h_source.html @@ -0,0 +1,80 @@ + + + + + + + +Olive: packaging/windows/version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    version.h
    +
    +
    +
    1 #ifndef VERSION_H
    2 #define VERSION_H
    3 
    4 #define VER_FILEVERSION 1,0,0,0
    5 #define VER_FILEVERSION_STR "1.0.0.0\0"
    6 
    7 #define VER_PRODUCTVERSION 1,0,0,0
    8 #define VER_PRODUCTVERSION_STR "1.0\0"
    9 
    10 #define VER_COMPANYNAME_STR "Olive Team"
    11 #define VER_FILEDESCRIPTION_STR "Olive"
    12 #define VER_INTERNALNAME_STR "Olive"
    13 #define VER_LEGALCOPYRIGHT_STR "Copyright © 2018 Olive Team"
    14 #define VER_LEGALTRADEMARKS1_STR "All Rights Reserved"
    15 #define VER_LEGALTRADEMARKS2_STR VER_LEGALTRADEMARKS1_STR
    16 #define VER_ORIGINALFILENAME_STR "Olive.exe"
    17 #define VER_PRODUCTNAME_STR "Olive"
    18 
    19 #define VER_COMPANYDOMAIN_STR "www.olivevideoeditor.org"
    20 
    21 #endif // VERSION_H
    + + + + diff --git a/docs/html/vestige_8h_source.html b/docs/html/vestige_8h_source.html new file mode 100644 index 000000000..7fedf6e16 --- /dev/null +++ b/docs/html/vestige_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: include/vestige.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    vestige.h
    +
    +
    +
    1 /*
    2  * vestige.h - simple header to allow VeSTige compilation and eventually work
    3  *
    4  * Copyright (c) 2006 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
    5  *
    6  * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
    7  *
    8  * This program is free software; you can redistribute it and/or
    9  * modify it under the terms of the GNU General Public
    10  * License as published by the Free Software Foundation; either
    11  * version 2 of the License, or (at your option) any later version.
    12  *
    13  * This program is distributed in the hope that it will be useful,
    14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    16  * General Public License for more details.
    17  *
    18  * You should have received a copy of the GNU General Public
    19  * License along with this program (see COPYING); if not, write to the
    20  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    21  * Boston, MA 02110-1301 USA.
    22  *
    23  * This VeSTige header is included in this package in the good-faith
    24  * belief that it has been cleanly and legally reverse engineered
    25  * without reference to the official VST SDK and without its
    26  * developer(s) having agreed to the VST SDK license agreement.
    27  */
    28 
    29 #include <stdint.h>
    30 #ifndef _VESTIGE_H
    31 #define _VESTIGE_H
    32 
    33 #define CCONST(a, b, c, d)( ( ( (int) a ) << 24 ) | \
    34  ( ( (int) b ) << 16 ) | \
    35  ( ( (int) c ) << 8 ) | \
    36  ( ( (int) d ) << 0 ) )
    37 
    38 #define audioMasterAutomate 0
    39 #define audioMasterVersion 1
    40 #define audioMasterCurrentId 2
    41 #define audioMasterIdle 3
    42 #define audioMasterPinConnected 4
    43 // unsupported? 5
    44 #define audioMasterWantMidi 6
    45 #define audioMasterGetTime 7
    46 #define audioMasterProcessEvents 8
    47 #define audioMasterSetTime 9
    48 #define audioMasterTempoAt 10
    49 #define audioMasterGetNumAutomatableParameters 11
    50 #define audioMasterGetParameterQuantization 12
    51 #define audioMasterIOChanged 13
    52 #define audioMasterNeedIdle 14
    53 #define audioMasterSizeWindow 15
    54 #define audioMasterGetSampleRate 16
    55 #define audioMasterGetBlockSize 17
    56 #define audioMasterGetInputLatency 18
    57 #define audioMasterGetOutputLatency 19
    58 #define audioMasterGetPreviousPlug 20
    59 #define audioMasterGetNextPlug 21
    60 #define audioMasterWillReplaceOrAccumulate 22
    61 #define audioMasterGetCurrentProcessLevel 23
    62 #define audioMasterGetAutomationState 24
    63 #define audioMasterOfflineStart 25
    64 #define audioMasterOfflineRead 26
    65 #define audioMasterOfflineWrite 27
    66 #define audioMasterOfflineGetCurrentPass 28
    67 #define audioMasterOfflineGetCurrentMetaPass 29
    68 #define audioMasterSetOutputSampleRate 30
    69 // unsupported? 31
    70 #define audioMasterGetSpeakerArrangement 31 // deprecated in 2.4?
    71 #define audioMasterGetVendorString 32
    72 #define audioMasterGetProductString 33
    73 #define audioMasterGetVendorVersion 34
    74 #define audioMasterVendorSpecific 35
    75 #define audioMasterSetIcon 36
    76 #define audioMasterCanDo 37
    77 #define audioMasterGetLanguage 38
    78 #define audioMasterOpenWindow 39
    79 #define audioMasterCloseWindow 40
    80 #define audioMasterGetDirectory 41
    81 #define audioMasterUpdateDisplay 42
    82 #define audioMasterBeginEdit 43 //BeginGesture
    83 #define audioMasterEndEdit 44 //EndGesture
    84 #define audioMasterOpenFileSelector 45
    85 #define audioMasterCloseFileSelector 46 // currently unused
    86 #define audioMasterEditFile 47 // currently unused
    87 #define audioMasterGetChunkFile 48 // currently unused
    88 #define audioMasterGetInputSpeakerArrangement 49 // currently unused
    89 
    90 #define effFlagsHasEditor 1
    91 #define effFlagsCanReplacing (1 << 4) // very likely
    92 #define effFlagsIsSynth (1 << 8) // currently unused
    93 
    94 #define effOpen 0
    95 #define effClose 1 // currently unused
    96 #define effSetProgram 2 // currently unused
    97 #define effGetProgram 3 // currently unused
    98 #define effGetProgramName 5 // currently unused
    99 #define effGetParamName 8 // currently unused
    100 #define effSetSampleRate 10
    101 #define effSetBlockSize 11
    102 #define effMainsChanged 12
    103 #define effEditGetRect 13
    104 #define effEditOpen 14
    105 #define effEditClose 15
    106 #define effEditIdle 19
    107 #define effEditTop 20
    108 #define effProcessEvents 25
    109 // the next one from http://asseca.com/vst-24-specs/index.html
    110 #define effGetPlugCategory 35
    111 #define effGetEffectName 45
    112 #define effGetVendorString 47
    113 #define effGetProductString 48
    114 #define effGetVendorVersion 49
    115 #define effCanDo 51 // currently unused
    116 /* from http://asseca.com/vst-24-specs/efIdle.html */
    117 #define effIdle 53
    118 /* from http://asseca.com/vst-24-specs/efGetParameterProperties.html */
    119 #define effGetParameterProperties 56
    120 #define effGetVstVersion 58 // currently unused
    121 /* http://asseca.com/vst-24-specs/efShellGetNextPlugin.html */
    122 #define effShellGetNextPlugin 70
    123 /* The next two were gleaned from http://www.kvraudio.com/forum/printview.php?t=143587&start=0 */
    124 #define effStartProcess 71
    125 #define effStopProcess 72
    126 
    127 #define effBeginSetProgram 67
    128 #define effEndSetProgram 68
    129 
    130 #ifdef WORDS_BIGENDIAN
    131 // "VstP"
    132 #define kEffectMagic 0x50747356
    133 #else
    134 // "PtsV"
    135 #define kEffectMagic 0x56737450
    136 #endif
    137 
    138 #define kVstLangEnglish 1
    139 #define kVstMidiType 1
    140 
    141 struct RemoteVstPlugin;
    142 
    143 #define kVstTransportChanged 1
    144 #define kVstTransportPlaying (1 << 1)
    145 #define kVstTransportCycleActive (1 << 2)
    146 #define kVstTransportRecording (1 << 3)
    147 
    148 #define kVstAutomationWriting (1 << 6)
    149 #define kVstAutomationReading (1 << 7)
    150 
    151 #define kVstNanosValid (1 << 8)
    152 #define kVstPpqPosValid (1 << 9)
    153 #define kVstTempoValid (1 << 10)
    154 #define kVstBarsValid (1 << 11)
    155 #define kVstCyclePosValid (1 << 12)
    156 #define kVstTimeSigValid (1 << 13)
    157 #define kVstSmpteValid (1 << 14)
    158 #define kVstClockValid (1 << 15)
    159 
    161 {
    162  // 00
    163  int type;
    164  // 04
    165  int byteSize;
    166  // 08
    167  int deltaSamples;
    168  // 0c?
    169  int flags;
    170  // 10?
    171  int noteLength;
    172  // 14?
    173  int noteOffset;
    174  // 18
    175  char midiData[4];
    176  // 1c?
    177  char detune;
    178  // 1d?
    179  char noteOffVelocity;
    180  // 1e?
    181  char reserved1;
    182  // 1f?
    183  char reserved2;
    184 };
    185 
    186 typedef struct _VstMidiEvent VstMidiEvent;
    187 
    188 
    189 struct _VstEvent
    190 {
    191  char dump[sizeof (VstMidiEvent)];
    192 
    193 };
    194 
    195 typedef struct _VstEvent VstEvent;
    196 
    198 {
    199  // 00
    200  int numEvents;
    201  // 04
    202  void *reserved;
    203  // 08
    204  VstEvent * events[];
    205 };
    206 
    207 /* constants from http://www.rawmaterialsoftware.com/juceforum/viewtopic.php?t=3740&sid=183f74631fee71a493316735e2b9f28b */
    208 
    209 enum Vestige2StringConstants
    210 {
    211  VestigeMaxNameLen = 64,
    212  VestigeMaxLabelLen = 128,
    213  VestigeMaxShortLabelLen = 8,
    214  VestigeMaxCategLabelLen = 24,
    215  VestigeMaxFileNameLen = 100
    216 };
    217 
    218 
    219 /* constants from http://asseca.com/vst-24-specs/efGetPlugCategory.html */
    220 
    221 enum VstPlugCategory
    222 {
    223  kPlugCategUnknown = 0,
    224  kPlugCategEffect,
    225  kPlugCategSynth,
    226  kPlugCategAnalysis,
    227  kPlugCategMastering,
    228  kPlugCategSpacializer,
    229  kPlugCategRoomFx,
    230  kPlugSurroundFx,
    231  kPlugCategRestoration,
    232  kPlugCategOfflineProcess,
    233  kPlugCategShell,
    234  kPlugCategGenerator,
    235  kPlugCategMaxCount
    236 };
    237 
    238 typedef struct _VstEvents VstEvents;
    239 
    240 /* this struct taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */
    242 {
    243  float stepFloat; /* float step */
    244  float smallStepFloat; /* small float step */
    245  float largeStepFloat; /* large float step */
    246  char label[64]; /* parameter label */
    247  int32_t flags; /* @see VstParameterFlags */
    248  int32_t minInteger; /* integer minimum */
    249  int32_t maxInteger; /* integer maximum */
    250  int32_t stepInteger; /* integer step */
    251  int32_t largeStepInteger; /* large integer step */
    252  char shortLabel[VestigeMaxShortLabelLen]; /* short label, recommended: 6 + delimiter */
    253  int16_t displayIndex; /* index where this parameter should be displayed (starting with 0) */
    254  int16_t category; /* 0: no category, else group index + 1 */
    255  int16_t numParametersInCategory; /* number of parameters in category */
    256  int16_t reserved; /* zero */
    257  char categoryLabel[VestigeMaxCategLabelLen]; /* category label, e.g. "Osc 1" */
    258  char future[16]; /* reserved for future use */
    259 };
    260 
    262 
    263 /* this enum taken from http://asseca.com/vst-24-specs/efGetParameterProperties.html */
    264 enum VstParameterFlags
    265 {
    266  kVstParameterIsSwitch = 1 << 0, /* parameter is a switch (on/off) */
    267  kVstParameterUsesIntegerMinMax = 1 << 1, /* minInteger, maxInteger valid */
    268  kVstParameterUsesFloatStep = 1 << 2, /* stepFloat, smallStepFloat, largeStepFloat valid */
    269  kVstParameterUsesIntStep = 1 << 3, /* stepInteger, largeStepInteger valid */
    270  kVstParameterSupportsDisplayIndex = 1 << 4, /* displayIndex valid */
    271  kVstParameterSupportsDisplayCategory = 1 << 5, /* category, etc. valid */
    272  kVstParameterCanRamp = 1 << 6 /* set if parameter value can ramp up/down */
    273 };
    274 
    275 struct _AEffect
    276 {
    277  // Never use virtual functions!!!
    278  // 00-03
    279  int magic;
    280  // dispatcher 04-07
    281  intptr_t (* dispatcher) (struct _AEffect *, int, int, intptr_t, void *, float);
    282  // process, quite sure 08-0b
    283  void (* process) (struct _AEffect *, float **, float **, int);
    284  // setParameter 0c-0f
    285  void (* setParameter) (struct _AEffect *, int, float);
    286  // getParameter 10-13
    287  float (* getParameter) (struct _AEffect *, int);
    288  // programs 14-17
    289  int numPrograms;
    290  // Params 18-1b
    291  int numParams;
    292  // Input 1c-1f
    293  int numInputs;
    294  // Output 20-23
    295  int numOutputs;
    296  // flags 24-27
    297  int flags;
    298  // Fill somewhere 28-2b
    299  void *ptr1;
    300  void *ptr2;
    301  // Zeroes 2c-2f 30-33 34-37 38-3b
    302  char empty3[4 + 4 + 4];
    303  // 1.0f 3c-3f
    304  float unkown_float;
    305  // An object? pointer 40-43
    306  void *ptr3;
    307  // Zeroes 44-47
    308  void *user;
    309  // Id 48-4b
    310  int32_t uniqueID;
    311  // Version 4c-4f
    312  int32_t version;
    313  // processReplacing 50-53
    314  void (* processReplacing) (struct _AEffect *, float **, float **, int);
    315 };
    316 
    317 typedef struct _AEffect AEffect;
    318 
    319 typedef struct _VstTimeInfo
    320 {
    321  /* info from online documentation of VST provided by Steinberg */
    322 
    323  double samplePos;
    324  double sampleRate;
    325  double nanoSeconds;
    326  double ppqPos;
    327  double tempo;
    328  double barStartPos;
    329  double cycleStartPos;
    330  double cycleEndPos;
    331  int32_t timeSigNumerator;
    332  int32_t timeSigDenominator;
    333  int32_t smpteOffset;
    334  int32_t smpteFrameRate;
    335  int32_t samplesToNextClock;
    336  int32_t flags;
    337 
    338 } VstTimeInfo;
    339 
    340 typedef intptr_t (* audioMasterCallback) (AEffect *, int32_t, int32_t, intptr_t, void *, float);
    341 
    342 #endif
    Definition: vestige.h:319
    +
    Definition: vestige.h:197
    +
    Definition: vestige.h:275
    +
    Definition: vestige.h:189
    +
    Definition: vestige.h:241
    +
    Definition: vestige.h:160
    +
    + + + + diff --git a/docs/html/viewer_8h_source.html b/docs/html/viewer_8h_source.html new file mode 100644 index 000000000..c7c123bfb --- /dev/null +++ b/docs/html/viewer_8h_source.html @@ -0,0 +1,89 @@ + + + + + + + +Olive: panels/viewer.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    viewer.h
    +
    +
    +
    1 #ifndef VIEWER_H
    2 #define VIEWER_H
    3 
    4 #include <QDockWidget>
    5 #include <QTimer>
    6 #include <QIcon>
    7 
    8 class Timeline;
    9 class Media;
    10 struct Sequence;
    11 class TimelineHeader;
    12 class ResizableScrollBar;
    13 class ViewerContainer;
    14 class LabelSlider;
    15 class QPushButton;
    16 class QLabel;
    17 
    18 #include "project/marker.h"
    19 #include "ui/viewerwidget.h"
    20 
    21 bool frame_rate_is_droppable(float rate);
    22 long timecode_to_frame(const QString& s, int view, double frame_rate);
    23 QString frame_to_timecode(long f, int view, double frame_rate);
    24 
    25 class Viewer : public QDockWidget
    26 {
    27  Q_OBJECT
    28 
    29 public:
    30  explicit Viewer(QWidget *parent = nullptr);
    31  ~Viewer();
    32 
    33  bool is_focused();
    34  bool is_main_sequence();
    35  void set_main_sequence();
    36  void set_media(Media *m);
    37  void compose();
    38  void set_playpause_icon(bool play);
    39  void update_playhead_timecode(long p);
    40  void update_end_timecode();
    41  void update_header_zoom();
    42  void clear_in();
    43  void clear_out();
    44  void clear_inout_point();
    45  void set_in_point();
    46  void set_out_point();
    47  void set_zoom(bool in);
    48  void set_panel_name(const QString& n);
    49 
    50  // playback functions
    51  void seek(long p);
    52  void play(bool in_to_out = false);
    53  void pause();
    54  bool playing;
    55  long playhead_start;
    56  qint64 start_msecs;
    57  QTimer playback_updater;
    58  bool just_played;
    59 
    60  void cue_recording(long start, long end, int track);
    61  void uncue_recording();
    62  bool is_recording_cued();
    63  long recording_start;
    64  long recording_end;
    65  int recording_track;
    66 
    67  void reset_all_audio();
    68  void update_parents(bool reload_fx = false);
    69 
    70  int get_playback_speed();
    71 
    72  ViewerWidget* viewer_widget;
    73 
    74  Media* media;
    75  Sequence* seq;
    76  QVector<Marker>* marker_ref;
    77 
    78  void set_marker();
    79 
    80  TimelineHeader* headers;
    81 
    82  void resizeEvent(QResizeEvent *event);
    83 
    84 public slots:
    85  void play_wake();
    86  void go_to_start();
    87  void go_to_in();
    88  void previous_frame();
    89  void toggle_play();
    90  void increase_speed();
    91  void decrease_speed();
    92  void next_frame();
    93  void go_to_out();
    94  void go_to_end();
    95  void close_media();
    96  void update_viewer();
    97 
    98 private slots:
    99  void update_playhead();
    100  void timer_update();
    101  void recording_flasher_update();
    102  void resize_move(double d);
    103 
    104 private:
    105  void update_window_title();
    106  void clean_created_seq();
    107  void set_sequence(bool main, Sequence* s);
    108  bool main_sequence;
    109  bool created_sequence;
    110  long cached_end_frame;
    111  QString panel_name;
    112  double minimum_zoom;
    113  bool playing_in_to_out;
    114  long last_playhead;
    115  void set_zoom_value(double d);
    116  void set_sb_max();
    117  void set_playback_speed(int s);
    118 
    119  long get_seq_in();
    120  long get_seq_out();
    121 
    122  QIcon playIcon;
    123 
    124  void setup_ui();
    125 
    126  ResizableScrollBar* horizontal_bar;
    127  ViewerContainer* viewer_container;
    128  LabelSlider* current_timecode_slider;
    129  QLabel* end_timecode;
    130 
    131  QPushButton* go_to_start_button;
    132  QPushButton* prev_frame_button;
    133  QPushButton* play_button;
    134  QPushButton* next_frame_button;
    135  QPushButton* go_to_end_frame;
    136 
    137  bool cue_recording_internal;
    138  QTimer recording_flasher;
    139 
    140  long previous_playhead;
    141  int playback_speed;
    142 };
    143 
    144 #endif // VIEWER_H
    Definition: sequence.h:13
    +
    Definition: viewercontainer.h:9
    +
    Definition: timeline.h:71
    +
    Definition: timelineheader.h:11
    +
    Definition: media.h:20
    +
    Definition: viewerwidget.h:24
    +
    The LabelSlider class.
    Definition: labelslider.h:20
    +
    Definition: resizablescrollbar.h:6
    +
    Definition: viewer.h:25
    +
    + + + + diff --git a/docs/html/viewercontainer_8h_source.html b/docs/html/viewercontainer_8h_source.html new file mode 100644 index 000000000..e9f304460 --- /dev/null +++ b/docs/html/viewercontainer_8h_source.html @@ -0,0 +1,83 @@ + + + + + + + +Olive: ui/viewercontainer.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    viewercontainer.h
    +
    +
    +
    1 #ifndef VIEWERCONTAINER_H
    2 #define VIEWERCONTAINER_H
    3 
    4 #include <QWidget>
    5 class Viewer;
    6 class ViewerWidget;
    7 class QScrollBar;
    8 
    9 class ViewerContainer : public QWidget
    10 {
    11  Q_OBJECT
    12 public:
    13  explicit ViewerContainer(QWidget *parent = 0);
    14  ~ViewerContainer();
    15 
    16  bool fit;
    17  double zoom;
    18 
    19  void dragScrollPress(const QPoint&);
    20  void dragScrollMove(const QPoint&);
    21  void parseWheelEvent(QWheelEvent* event);
    22 
    23  Viewer* viewer;
    24  ViewerWidget* child;
    25  void adjust();
    26 
    27  // manually moves scrollbars into the correct position
    28  void adjust_scrollbars();
    29 
    30 protected:
    31  void resizeEvent(QResizeEvent *event);
    32 
    33 signals:
    34 
    35 public slots:
    36 
    37 private slots:
    38  void scroll_changed();
    39 
    40 private:
    41  int drag_start_x;
    42  int drag_start_y;
    43  int horiz_start;
    44  int vert_start;
    45  QScrollBar* horizontal_scrollbar;
    46  QScrollBar* vertical_scrollbar;
    47 };
    48 
    49 #endif // VIEWERCONTAINER_H
    Definition: viewercontainer.h:9
    +
    Definition: viewerwidget.h:24
    +
    Definition: viewer.h:25
    +
    + + + + diff --git a/docs/html/viewerwidget_8h_source.html b/docs/html/viewerwidget_8h_source.html new file mode 100644 index 000000000..903869cdf --- /dev/null +++ b/docs/html/viewerwidget_8h_source.html @@ -0,0 +1,90 @@ + + + + + + + +Olive: ui/viewerwidget.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    viewerwidget.h
    +
    +
    +
    1 #ifndef VIEWERWIDGET_H
    2 #define VIEWERWIDGET_H
    3 
    4 #include <QOpenGLWidget>
    5 #include <QMatrix4x4>
    6 #include <QOpenGLTexture>
    7 #include <QTimer>
    8 #include <QThread>
    9 #include <QMutex>
    10 #include <QWaitCondition>
    11 #include <QOpenGLFunctions>
    12 
    13 class Viewer;
    14 class Clip;
    15 struct FootageStream;
    16 class QOpenGLFramebufferObject;
    17 class Effect;
    18 class EffectGizmo;
    19 class ViewerContainer;
    20 struct GLTextureCoords;
    21 class RenderThread;
    22 class ViewerWindow;
    23 
    24 class ViewerWidget : public QOpenGLWidget, QOpenGLFunctions
    25 {
    26  Q_OBJECT
    27 public:
    28  ViewerWidget(QWidget *parent = nullptr);
    29  ~ViewerWidget();
    30 
    31  void delete_function();
    32  void close_window();
    33 
    34  void paintGL();
    35  void initializeGL();
    36  Viewer* viewer;
    37  ViewerContainer* container;
    38 
    39  bool waveform;
    40  Clip* waveform_clip;
    41  const FootageStream* waveform_ms;
    42  double waveform_zoom;
    43  int waveform_scroll;
    44 
    45  void frame_update();
    46  RenderThread* get_renderer();
    47  void set_scroll(double x, double y);
    48 public slots:
    49  void set_waveform_scroll(int s);
    50  void set_fullscreen(int screen = 0);
    51 protected:
    52  void mousePressEvent(QMouseEvent *event);
    53  void mouseMoveEvent(QMouseEvent *event);
    54  void mouseReleaseEvent(QMouseEvent *event);
    55  void wheelEvent(QWheelEvent* event);
    56 private:
    57  void draw_waveform_func();
    58  void draw_title_safe_area();
    59  void draw_gizmos();
    60  EffectGizmo* get_gizmo_from_mouse(int x, int y);
    61  void move_gizmos(QMouseEvent *event, bool done);
    62  bool dragging;
    63  void seek_from_click(int x);
    64  Effect* gizmos;
    65  int drag_start_x;
    66  int drag_start_y;
    67  int gizmo_x_mvmt;
    68  int gizmo_y_mvmt;
    69  EffectGizmo* selected_gizmo;
    70  RenderThread* renderer;
    71  ViewerWindow* window;
    72  double x_scroll;
    73  double y_scroll;
    74 private slots:
    75  void context_destroy();
    76  void retry();
    77  void show_context_menu();
    78  void save_frame();
    79  void queue_repaint();
    80  void fullscreen_menu_action(QAction* action);
    81  void set_fit_zoom();
    82  void set_custom_zoom();
    83  void set_menu_zoom(QAction *action);
    84 };
    85 
    86 #endif // VIEWERWIDGET_H
    Definition: viewercontainer.h:9
    +
    Definition: effect.h:105
    +
    Definition: viewerwindow.h:11
    +
    Definition: effect.h:146
    +
    Definition: effectgizmo.h:21
    +
    Definition: footage.h:25
    +
    Definition: viewerwidget.h:24
    +
    Definition: clip.h:33
    +
    Definition: viewer.h:25
    +
    Definition: renderthread.h:15
    +
    + + + + diff --git a/docs/html/viewerwindow_8h_source.html b/docs/html/viewerwindow_8h_source.html new file mode 100644 index 000000000..4de707726 --- /dev/null +++ b/docs/html/viewerwindow_8h_source.html @@ -0,0 +1,81 @@ + + + + + + + +Olive: ui/viewerwindow.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    viewerwindow.h
    +
    +
    +
    1 #ifndef VIEWERWINDOW_H
    2 #define VIEWERWINDOW_H
    3 
    4 #include <QOpenGLWidget>
    5 #include <QTimer>
    6 
    7 class QMutex;
    8 class QMenu;
    9 class QShortcut;
    10 
    11 class ViewerWindow : public QOpenGLWidget {
    12  Q_OBJECT
    13 public:
    14  ViewerWindow(QWidget *parent);
    15  void set_texture(GLuint t, double iar, QMutex *imutex);
    16 protected:
    17  virtual void keyPressEvent(QKeyEvent*) override;
    18  virtual void mousePressEvent(QMouseEvent*) override;
    19  virtual void mouseMoveEvent(QMouseEvent*) override;
    20 
    21  virtual void paintGL() override;
    22 private:
    23  GLuint texture;
    24  double ar;
    25  QMutex* mutex;
    26 
    27  // exit full screen message
    28  QTimer fullscreen_msg_timer;
    29  bool show_fullscreen_msg;
    30  QRect fullscreen_msg_rect;
    31 private slots:
    32  void fullscreen_msg_timeout();
    33 };
    34 
    35 #endif // VIEWERWINDOW_H
    Definition: viewerwindow.h:11
    +
    + + + + diff --git a/docs/html/voideffect_8h_source.html b/docs/html/voideffect_8h_source.html new file mode 100644 index 000000000..da154bef5 --- /dev/null +++ b/docs/html/voideffect_8h_source.html @@ -0,0 +1,84 @@ + + + + + + + +Olive: effects/internal/voideffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    voideffect.h
    +
    +
    +
    1 #ifndef VOIDEFFECT_H
    2 #define VOIDEFFECT_H
    3 
    4 /* VoidEffect is a placeholder used when Olive is unable to find an effect
    5  * requested by a loaded project. It displays a missing effect so the user knows
    6  * an effect is missing, and stores the XML project data verbatim so that it
    7  * isn't lost if the user saves over the project.
    8  */
    9 
    10 #include "project/effect.h"
    11 
    12 class VoidEffect : public Effect {
    13  Q_OBJECT
    14 public:
    15  VoidEffect(Clip* c, const QString& n);
    16 
    17  virtual Effect* copy(Clip* c) override;
    18  virtual void load(QXmlStreamReader &stream) override;
    19  virtual void save(QXmlStreamWriter &stream) override;
    20 private:
    21  QByteArray bytes;
    22  EffectMeta void_meta;
    23 };
    24 
    25 #endif // VOIDEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: voideffect.h:12
    +
    Definition: clip.h:33
    +
    + + + + diff --git a/docs/html/volumeeffect_8h_source.html b/docs/html/volumeeffect_8h_source.html new file mode 100644 index 000000000..718957fc5 --- /dev/null +++ b/docs/html/volumeeffect_8h_source.html @@ -0,0 +1,85 @@ + + + + + + + +Olive: effects/internal/volumeeffect.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    volumeeffect.h
    +
    +
    +
    1 #ifndef VOLUMEEFFECT_H
    2 #define VOLUMEEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class VolumeEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  VolumeEffect(Clip* c, const EffectMeta* em);
    10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    11 
    12  EffectField* volume_val;
    13 };
    14 
    15 #endif // VOLUMEEFFECT_H
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: volumeeffect.h:6
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/docs/html/vsthost_8h_source.html b/docs/html/vsthost_8h_source.html new file mode 100644 index 000000000..f20f219d7 --- /dev/null +++ b/docs/html/vsthost_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Olive: effects/internal/vsthost.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Olive +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    vsthost.h
    +
    +
    +
    1 #ifndef VSTHOSTWIN_H
    2 #define VSTHOSTWIN_H
    3 
    4 #ifndef NOVST
    5 
    6 #include "project/effect.h"
    7 
    8 #include "io/crossplatformlib.h"
    9 
    10 #include "include/vestige.h"
    11 
    12 // Plugin's dispatcher function
    13 typedef intptr_t (*dispatcherFuncPtr)(AEffect *effect, int32_t opCode, int32_t index, int32_t value, void *ptr, float opt);
    14 
    15 class QDialog;
    16 
    17 class VSTHost : public Effect {
    18  Q_OBJECT
    19 public:
    20  VSTHost(Clip* c, const EffectMeta* em);
    21  ~VSTHost();
    22  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    23 
    24  void custom_load(QXmlStreamReader& stream);
    25  void save(QXmlStreamWriter& stream);
    26 private slots:
    27  void show_interface(bool show);
    28  void uncheck_show_button();
    29  void change_plugin();
    30 private:
    31  EffectField* file_field;
    32 
    33  void loadPlugin();
    34  void freePlugin();
    35  dispatcherFuncPtr dispatcher;
    36  AEffect* plugin;
    37  bool configurePluginCallbacks();
    38  void startPlugin();
    39  void stopPlugin();
    40  void resumePlugin();
    41  void suspendPlugin();
    42  bool canPluginDo(char *canDoString);
    43  void processAudio(long numFrames);
    44  float** inputs;
    45  float** outputs;
    46  QDialog* dialog;
    47  QPushButton* show_interface_btn;
    48  QByteArray data_cache;
    49 
    50 #if defined(__APPLE__)
    51  CFBundleRef bundle;
    52 #else
    53  ModulePtr modulePtr;
    54 #endif
    55 };
    56 
    57 #endif
    58 
    59 #endif // VSTHOSTWIN_H
    Definition: vsthost.h:17
    +
    Definition: effect.h:146
    +
    Definition: effect.h:27
    +
    Definition: vestige.h:275
    +
    Definition: clip.h:33
    +
    Definition: effectfield.h:23
    +
    + + + + diff --git a/effects/internal/audionoiseeffect.cpp b/effects/internal/audionoiseeffect.cpp index 0ec1f8a45..d43fd5545 100644 --- a/effects/internal/audionoiseeffect.cpp +++ b/effects/internal/audionoiseeffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "audionoiseeffect.h" #include diff --git a/effects/internal/audionoiseeffect.h b/effects/internal/audionoiseeffect.h index 0a1103fae..e06789213 100644 --- a/effects/internal/audionoiseeffect.h +++ b/effects/internal/audionoiseeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef AUDIONOISEEFFECT_H #define AUDIONOISEEFFECT_H diff --git a/effects/internal/cornerpineffect.cpp b/effects/internal/cornerpineffect.cpp index 883dcbdb8..c076e2313 100644 --- a/effects/internal/cornerpineffect.cpp +++ b/effects/internal/cornerpineffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "cornerpineffect.h" #include "io/path.h" diff --git a/effects/internal/cornerpineffect.h b/effects/internal/cornerpineffect.h index 882a19c5c..61b38fef2 100644 --- a/effects/internal/cornerpineffect.h +++ b/effects/internal/cornerpineffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CORNERPINEFFECT_H #define CORNERPINEFFECT_H diff --git a/effects/internal/crossdissolvetransition.cpp b/effects/internal/crossdissolvetransition.cpp index 8cc93fe16..92e74f510 100644 --- a/effects/internal/crossdissolvetransition.cpp +++ b/effects/internal/crossdissolvetransition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "crossdissolvetransition.h" #include diff --git a/effects/internal/crossdissolvetransition.h b/effects/internal/crossdissolvetransition.h index 61bd483ca..3dd8e6e44 100644 --- a/effects/internal/crossdissolvetransition.h +++ b/effects/internal/crossdissolvetransition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CROSSDISSOLVETRANSITION_H #define CROSSDISSOLVETRANSITION_H diff --git a/effects/internal/cubetransition.cpp b/effects/internal/cubetransition.cpp index a2058e230..829ad820d 100644 --- a/effects/internal/cubetransition.cpp +++ b/effects/internal/cubetransition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "cubetransition.h" #include "debug.h" diff --git a/effects/internal/cubetransition.h b/effects/internal/cubetransition.h index 0996beccf..82519ad03 100644 --- a/effects/internal/cubetransition.h +++ b/effects/internal/cubetransition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CUBETRANSITION_H #define CUBETRANSITION_H diff --git a/effects/internal/exponentialfadetransition.cpp b/effects/internal/exponentialfadetransition.cpp index 7146d6fe4..7c71d5bfc 100644 --- a/effects/internal/exponentialfadetransition.cpp +++ b/effects/internal/exponentialfadetransition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "exponentialfadetransition.h" #include diff --git a/effects/internal/exponentialfadetransition.h b/effects/internal/exponentialfadetransition.h index 1259db15a..36ec7f6f1 100644 --- a/effects/internal/exponentialfadetransition.h +++ b/effects/internal/exponentialfadetransition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EXPONENTIALFADETRANSITION_H #define EXPONENTIALFADETRANSITION_H diff --git a/effects/internal/fillleftrighteffect.cpp b/effects/internal/fillleftrighteffect.cpp index 15ed2a4bd..e6e687839 100644 --- a/effects/internal/fillleftrighteffect.cpp +++ b/effects/internal/fillleftrighteffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "fillleftrighteffect.h" #define FILL_TYPE_LEFT 0 diff --git a/effects/internal/fillleftrighteffect.h b/effects/internal/fillleftrighteffect.h index e8e538c6a..49e72c44a 100644 --- a/effects/internal/fillleftrighteffect.h +++ b/effects/internal/fillleftrighteffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef FILLLEFTRIGHTEFFECT_H #define FILLLEFTRIGHTEFFECT_H diff --git a/effects/internal/frei0reffect.cpp b/effects/internal/frei0reffect.cpp index a45efcf36..efa393bb0 100644 --- a/effects/internal/frei0reffect.cpp +++ b/effects/internal/frei0reffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "frei0reffect.h" #ifndef NOFREI0R diff --git a/effects/internal/frei0reffect.h b/effects/internal/frei0reffect.h index 413baf676..daa546622 100644 --- a/effects/internal/frei0reffect.h +++ b/effects/internal/frei0reffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef FREI0REFFECT_H #define FREI0REFFECT_H diff --git a/effects/internal/linearfadetransition.cpp b/effects/internal/linearfadetransition.cpp index f82821c56..73ab8a44b 100644 --- a/effects/internal/linearfadetransition.cpp +++ b/effects/internal/linearfadetransition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "linearfadetransition.h" LinearFadeTransition::LinearFadeTransition(Clip* c, Clip* s, const EffectMeta* em) : Transition(c, s, em) {} diff --git a/effects/internal/linearfadetransition.h b/effects/internal/linearfadetransition.h index 0542ce3f9..f3716753a 100644 --- a/effects/internal/linearfadetransition.h +++ b/effects/internal/linearfadetransition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef LINEARFADETRANSITION_H #define LINEARFADETRANSITION_H diff --git a/effects/internal/logarithmicfadetransition.cpp b/effects/internal/logarithmicfadetransition.cpp index b4267644b..53cd4934c 100644 --- a/effects/internal/logarithmicfadetransition.cpp +++ b/effects/internal/logarithmicfadetransition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "logarithmicfadetransition.h" #include diff --git a/effects/internal/logarithmicfadetransition.h b/effects/internal/logarithmicfadetransition.h index d2a887d7c..a476351d1 100644 --- a/effects/internal/logarithmicfadetransition.h +++ b/effects/internal/logarithmicfadetransition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef LOGARITHMICFADETRANSITION_H #define LOGARITHMICFADETRANSITION_H diff --git a/effects/internal/paneffect.cpp b/effects/internal/paneffect.cpp index e76649601..babb0b01b 100644 --- a/effects/internal/paneffect.cpp +++ b/effects/internal/paneffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "paneffect.h" #include diff --git a/effects/internal/paneffect.h b/effects/internal/paneffect.h index 8d8fb857f..f5cee94e0 100644 --- a/effects/internal/paneffect.h +++ b/effects/internal/paneffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PANEFFECT_H #define PANEFFECT_H diff --git a/effects/internal/shakeeffect.cpp b/effects/internal/shakeeffect.cpp index c5e6c78ac..0960a0e74 100644 --- a/effects/internal/shakeeffect.cpp +++ b/effects/internal/shakeeffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "shakeeffect.h" #include diff --git a/effects/internal/shakeeffect.h b/effects/internal/shakeeffect.h index 6df5692a4..ff969754a 100644 --- a/effects/internal/shakeeffect.h +++ b/effects/internal/shakeeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SHAKEEFFECT_H #define SHAKEEFFECT_H diff --git a/effects/internal/solideffect.cpp b/effects/internal/solideffect.cpp index 41522adaf..a3077852b 100644 --- a/effects/internal/solideffect.cpp +++ b/effects/internal/solideffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "solideffect.h" #include diff --git a/effects/internal/solideffect.h b/effects/internal/solideffect.h index 61a4f29fb..c05e5b196 100644 --- a/effects/internal/solideffect.h +++ b/effects/internal/solideffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SOLIDEFFECT_H #define SOLIDEFFECT_H diff --git a/effects/internal/texteffect.cpp b/effects/internal/texteffect.cpp index 4fd0abb02..f64595e30 100644 --- a/effects/internal/texteffect.cpp +++ b/effects/internal/texteffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "texteffect.h" #include diff --git a/effects/internal/texteffect.h b/effects/internal/texteffect.h index c7c32dd86..02f83964f 100644 --- a/effects/internal/texteffect.h +++ b/effects/internal/texteffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TEXTEFFECT_H #define TEXTEFFECT_H diff --git a/effects/internal/timecodeeffect.cpp b/effects/internal/timecodeeffect.cpp index 0d0aae920..acbf5b333 100644 --- a/effects/internal/timecodeeffect.cpp +++ b/effects/internal/timecodeeffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "timecodeeffect.h" #include diff --git a/effects/internal/timecodeeffect.h b/effects/internal/timecodeeffect.h index 60f6260dd..6ec709c28 100644 --- a/effects/internal/timecodeeffect.h +++ b/effects/internal/timecodeeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TIMECODEEFFECT_H #define TIMECODEEFFECT_H diff --git a/effects/internal/toneeffect.cpp b/effects/internal/toneeffect.cpp index 379f94deb..777c3e878 100644 --- a/effects/internal/toneeffect.cpp +++ b/effects/internal/toneeffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "toneeffect.h" #include diff --git a/effects/internal/toneeffect.h b/effects/internal/toneeffect.h index 43844595d..fecef2c97 100644 --- a/effects/internal/toneeffect.h +++ b/effects/internal/toneeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TONEEFFECT_H #define TONEEFFECT_H diff --git a/effects/internal/transformeffect.cpp b/effects/internal/transformeffect.cpp index 695b7a48c..07dd08d3f 100644 --- a/effects/internal/transformeffect.cpp +++ b/effects/internal/transformeffect.cpp @@ -1,4 +1,24 @@ -#include "transformeffect.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "transformeffect.h" #include #include diff --git a/effects/internal/transformeffect.h b/effects/internal/transformeffect.h index feb875ac6..6a7d483f9 100644 --- a/effects/internal/transformeffect.h +++ b/effects/internal/transformeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TRANSFORMEFFECT_H #define TRANSFORMEFFECT_H diff --git a/effects/internal/voideffect.cpp b/effects/internal/voideffect.cpp index 867c08bc5..86a229b9e 100644 --- a/effects/internal/voideffect.cpp +++ b/effects/internal/voideffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "voideffect.h" #include diff --git a/effects/internal/voideffect.h b/effects/internal/voideffect.h index 6dd255c4d..668713740 100644 --- a/effects/internal/voideffect.h +++ b/effects/internal/voideffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VOIDEFFECT_H #define VOIDEFFECT_H diff --git a/effects/internal/volumeeffect.cpp b/effects/internal/volumeeffect.cpp index ec943c13d..23cf1a45f 100644 --- a/effects/internal/volumeeffect.cpp +++ b/effects/internal/volumeeffect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "volumeeffect.h" #include diff --git a/effects/internal/volumeeffect.h b/effects/internal/volumeeffect.h index 4ae7b8e9f..c5ca0ae93 100644 --- a/effects/internal/volumeeffect.h +++ b/effects/internal/volumeeffect.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VOLUMEEFFECT_H #define VOLUMEEFFECT_H diff --git a/effects/internal/vsthost.cpp b/effects/internal/vsthost.cpp index 710dc6e6b..3e74635e6 100644 --- a/effects/internal/vsthost.cpp +++ b/effects/internal/vsthost.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "vsthost.h" #ifndef NOVST diff --git a/effects/internal/vsthost.h b/effects/internal/vsthost.h index 9fe6c0faf..ef0ddce50 100644 --- a/effects/internal/vsthost.h +++ b/effects/internal/vsthost.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VSTHOSTWIN_H #define VSTHOSTWIN_H diff --git a/io/clipboard.cpp b/io/clipboard.cpp index 344a4d6ce..3af4db829 100644 --- a/io/clipboard.cpp +++ b/io/clipboard.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "clipboard.h" #include "project/clip.h" diff --git a/io/clipboard.h b/io/clipboard.h index 700841e95..3c96d5e66 100644 --- a/io/clipboard.h +++ b/io/clipboard.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CLIPBOARD_H #define CLIPBOARD_H diff --git a/io/config.cpp b/io/config.cpp index e33a6ea91..df2c97d1e 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "config.h" #include diff --git a/io/config.h b/io/config.h index 11466c653..730261ca6 100644 --- a/io/config.h +++ b/io/config.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CONFIG_H #define CONFIG_H diff --git a/io/crc32.cpp b/io/crc32.cpp deleted file mode 100644 index 063a74780..000000000 --- a/io/crc32.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include "crc32.h" - -#include - -Crc32::Crc32() -{ - quint32 crc; - - // initialize CRC table - for (int i = 0; i < 256; i++) - { - crc = i; - for (int j = 0; j < 8; j++) - crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1; - - crc_table[i] = crc; - } -} - -quint32 Crc32::calculateFromFile(QString filename) -{ - quint32 crc; - QFile file; - - char buffer[16000]; - int len, i; - - crc = 0xFFFFFFFFUL; - - file.setFileName(filename); - if (file.open(QIODevice::ReadOnly)) - { - while (!file.atEnd()) - { - len = file.read(buffer, 16000); - for (i = 0; i < len; i++) - crc = crc_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8); - } - - file.close(); - } - - return crc ^ 0xFFFFFFFFUL; -} - -void Crc32::initInstance(int i) -{ - instances[i] = 0xFFFFFFFFUL; -} - -void Crc32::pushData(int i, char *data, int len) -{ - quint32 crc = instances[i]; - if (crc) - { - for (int j = 0; j < len; j++) - crc = crc_table[(crc ^ data[j]) & 0xFF] ^ (crc >> 8); - - instances[i] = crc; - } -} - -quint32 Crc32::releaseInstance(int i) -{ - quint32 crc32 = instances[i]; - if (crc32) { - instances.remove(i); - return crc32 ^ 0xFFFFFFFFUL; - } - else { - return 0; - } -} diff --git a/io/crc32.h b/io/crc32.h deleted file mode 100644 index 0814238b3..000000000 --- a/io/crc32.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef CRC32_H -#define CRC32_H - -/* - * +-------------------------------------------------------------+ - * | Taken from github.com/nusov/qt-crc32 used under MIT license | - * | | - * | Copyright (c) Alexander Nusov 2015 | - * +-------------------------------------------------------------+ - */ - -#include -#include -#include - -class Crc32 -{ -private: - quint32 crc_table[256]; - QMap instances; - -public: - Crc32(); - - quint32 calculateFromFile(QString filename); - - void initInstance(int i); - void pushData(int i, char *data, int len); - quint32 releaseInstance(int i); -}; - -#endif // CRC32_H diff --git a/io/crossplatformlib.cpp b/io/crossplatformlib.cpp index 8b4f45fe9..b669a7b21 100644 --- a/io/crossplatformlib.cpp +++ b/io/crossplatformlib.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "crossplatformlib.h" #include diff --git a/io/crossplatformlib.h b/io/crossplatformlib.h index d6c97c309..387d16691 100644 --- a/io/crossplatformlib.h +++ b/io/crossplatformlib.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CROSSPLATFORMLIB_H #define CROSSPLATFORMLIB_H diff --git a/io/exportthread.cpp b/io/exportthread.cpp index 48708a143..84c206e80 100644 --- a/io/exportthread.cpp +++ b/io/exportthread.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "exportthread.h" #include "oliveglobal.h" diff --git a/io/exportthread.h b/io/exportthread.h index d2ef05486..8c0a0c075 100644 --- a/io/exportthread.h +++ b/io/exportthread.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EXPORTTHREAD_H #define EXPORTTHREAD_H diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 09d8016b0..d8e720cf5 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "loadthread.h" #include "oliveglobal.h" diff --git a/io/loadthread.h b/io/loadthread.h index 573f27d2b..6d660773f 100644 --- a/io/loadthread.h +++ b/io/loadthread.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef LOADTHREAD_H #define LOADTHREAD_H diff --git a/io/math.cpp b/io/math.cpp index 32e03f6e8..31c630d01 100644 --- a/io/math.cpp +++ b/io/math.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "math.h" #include diff --git a/io/math.h b/io/math.h index a4f2adb4c..9e6a7a45a 100644 --- a/io/math.h +++ b/io/math.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef MATH_H #define MATH_H diff --git a/io/path.cpp b/io/path.cpp index 5bca2b4f4..b3fea31dd 100644 --- a/io/path.cpp +++ b/io/path.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "path.h" #include diff --git a/io/path.h b/io/path.h index 9cd3f3b2f..09313ec11 100644 --- a/io/path.h +++ b/io/path.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PATH_H #define PATH_H diff --git a/io/previewgenerator.cpp b/io/previewgenerator.cpp index 8b2255465..cdf1df2ae 100644 --- a/io/previewgenerator.cpp +++ b/io/previewgenerator.cpp @@ -1,4 +1,24 @@ -#include "previewgenerator.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "previewgenerator.h" #include "project/media.h" #include "project/footage.h" diff --git a/io/previewgenerator.h b/io/previewgenerator.h index 76327c40d..28ac5bd8d 100644 --- a/io/previewgenerator.h +++ b/io/previewgenerator.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PREVIEWGENERATOR_H #define PREVIEWGENERATOR_H diff --git a/io/proxygenerator.cpp b/io/proxygenerator.cpp index 3fc7effde..22d2e4ba5 100644 --- a/io/proxygenerator.cpp +++ b/io/proxygenerator.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "proxygenerator.h" #include "project/footage.h" diff --git a/io/proxygenerator.h b/io/proxygenerator.h index 357d9c66c..4458cd718 100644 --- a/io/proxygenerator.h +++ b/io/proxygenerator.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PROXYGENERATOR_H #define PROXYGENERATOR_H diff --git a/io/qpainterwrapper.cpp b/io/qpainterwrapper.cpp index b86a05441..a3f892fd1 100644 --- a/io/qpainterwrapper.cpp +++ b/io/qpainterwrapper.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "qpainterwrapper.h" #include diff --git a/io/qpainterwrapper.h b/io/qpainterwrapper.h index c8700294b..1f217ef95 100644 --- a/io/qpainterwrapper.h +++ b/io/qpainterwrapper.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef QPAINTERWRAPPER_H #define QPAINTERWRAPPER_H diff --git a/main.cpp b/main.cpp index 4f748ab18..3a8714a08 100644 --- a/main.cpp +++ b/main.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "mainwindow.h" #include diff --git a/mainwindow.cpp b/mainwindow.cpp index 1ba325b3e..b50556672 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,4 +1,24 @@ -#include "mainwindow.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "mainwindow.h" #include "oliveglobal.h" diff --git a/mainwindow.h b/mainwindow.h index b79ea0293..566e3fdb9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef MAINWINDOW_H #define MAINWINDOW_H diff --git a/olive.pro b/olive.pro index 44ccc6861..7e38dae4e 100644 --- a/olive.pro +++ b/olive.pro @@ -89,7 +89,6 @@ SOURCES += \ project/marker.cpp \ dialogs/speeddialog.cpp \ dialogs/mediapropertiesdialog.cpp \ - io/crc32.cpp \ project/projectmodel.cpp \ io/loadthread.cpp \ dialogs/loaddialog.cpp \ @@ -196,7 +195,6 @@ HEADERS += \ project/selection.h \ dialogs/speeddialog.h \ dialogs/mediapropertiesdialog.h \ - io/crc32.h \ project/projectmodel.h \ io/loadthread.h \ dialogs/loaddialog.h \ diff --git a/oliveglobal.cpp b/oliveglobal.cpp index 2a1036b39..a3b31bc02 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "oliveglobal.h" #include "mainwindow.h" diff --git a/oliveglobal.h b/oliveglobal.h index 0fc345e6a..ca3de2520 100644 --- a/oliveglobal.h +++ b/oliveglobal.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef OLIVEGLOBAL_H #define OLIVEGLOBAL_H diff --git a/panels/effectcontrols.cpp b/panels/effectcontrols.cpp index 76dde43c1..9339070fa 100644 --- a/panels/effectcontrols.cpp +++ b/panels/effectcontrols.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effectcontrols.h" #include diff --git a/panels/effectcontrols.h b/panels/effectcontrols.h index 9ca830a9e..674604547 100644 --- a/panels/effectcontrols.h +++ b/panels/effectcontrols.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EFFECTCONTROLS_H #define EFFECTCONTROLS_H diff --git a/panels/grapheditor.cpp b/panels/grapheditor.cpp index 370576465..9ee0efd4e 100644 --- a/panels/grapheditor.cpp +++ b/panels/grapheditor.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "grapheditor.h" #include diff --git a/panels/grapheditor.h b/panels/grapheditor.h index 4617823fd..759886fd3 100644 --- a/panels/grapheditor.h +++ b/panels/grapheditor.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef GRAPHEDITOR_H #define GRAPHEDITOR_H diff --git a/panels/panels.cpp b/panels/panels.cpp index d06c5b0ad..7e1dce1d8 100644 --- a/panels/panels.cpp +++ b/panels/panels.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "panels.h" #include "project/sequence.h" diff --git a/panels/panels.h b/panels/panels.h index 4f90bd4d5..62831b5c5 100644 --- a/panels/panels.h +++ b/panels/panels.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PANELS_H #define PANELS_H diff --git a/panels/project.cpp b/panels/project.cpp index 9eb9374cd..5e0d02962 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -1,4 +1,24 @@ -#include "project.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "project.h" #include "oliveglobal.h" diff --git a/panels/project.h b/panels/project.h index 856902d14..33f0b7fe7 100644 --- a/panels/project.h +++ b/panels/project.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PROJECT_H #define PROJECT_H diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 7ba0a335c..ac764cbe4 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "timeline.h" #include "oliveglobal.h" diff --git a/panels/timeline.h b/panels/timeline.h index 1270afbd9..a9c77f780 100644 --- a/panels/timeline.h +++ b/panels/timeline.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TIMELINE_H #define TIMELINE_H diff --git a/panels/viewer.cpp b/panels/viewer.cpp index e60e807b4..a12a4c24e 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "viewer.h" #include "playback/audio.h" diff --git a/panels/viewer.h b/panels/viewer.h index c7c9a74c0..08c049d4a 100644 --- a/panels/viewer.h +++ b/panels/viewer.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VIEWER_H #define VIEWER_H diff --git a/playback/audio.cpp b/playback/audio.cpp index 89c12f5ec..86c446bd4 100644 --- a/playback/audio.cpp +++ b/playback/audio.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "audio.h" #include "oliveglobal.h" diff --git a/playback/audio.h b/playback/audio.h index fdb7ee3eb..55cafbcca 100644 --- a/playback/audio.h +++ b/playback/audio.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef AUDIO_H #define AUDIO_H diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 37e391d4f..885526bc1 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "cacher.h" #include "project/clip.h" diff --git a/playback/cacher.h b/playback/cacher.h index 8b1043da1..d6fc01e76 100644 --- a/playback/cacher.h +++ b/playback/cacher.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CACHER_H #define CACHER_H diff --git a/playback/playback.cpp b/playback/playback.cpp index babbaf094..843d58f72 100644 --- a/playback/playback.cpp +++ b/playback/playback.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "playback.h" #include "project/clip.h" diff --git a/playback/playback.h b/playback/playback.h index 591978419..7c1d1c0bc 100644 --- a/playback/playback.h +++ b/playback/playback.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PLAYBACK_H #define PLAYBACK_H diff --git a/project/clip.cpp b/project/clip.cpp index 9e7663a58..e16007642 100644 --- a/project/clip.cpp +++ b/project/clip.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "clip.h" #include "project/effect.h" diff --git a/project/clip.h b/project/clip.h index 343ef181b..620542092 100644 --- a/project/clip.h +++ b/project/clip.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CLIP_H #define CLIP_H diff --git a/project/effect.cpp b/project/effect.cpp index f32622d69..e691b187b 100644 --- a/project/effect.cpp +++ b/project/effect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effect.h" #include "panels/panels.h" diff --git a/project/effect.h b/project/effect.h index 555146eea..e27e99fbb 100644 --- a/project/effect.h +++ b/project/effect.h @@ -1,4 +1,24 @@ -#ifndef EFFECT_H +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef EFFECT_H #define EFFECT_H #include diff --git a/project/effectfield.cpp b/project/effectfield.cpp index b1569169e..fe36e7db7 100644 --- a/project/effectfield.cpp +++ b/project/effectfield.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effectfield.h" #include "ui/labelslider.h" diff --git a/project/effectfield.h b/project/effectfield.h index d485e4c9b..4818d5538 100644 --- a/project/effectfield.h +++ b/project/effectfield.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EFFECTFIELD_H #define EFFECTFIELD_H diff --git a/project/effectgizmo.cpp b/project/effectgizmo.cpp index 8b21eb771..047903259 100644 --- a/project/effectgizmo.cpp +++ b/project/effectgizmo.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effectgizmo.h" #include "ui/labelslider.h" diff --git a/project/effectgizmo.h b/project/effectgizmo.h index 0b4ed02f9..2f2dfbdfb 100644 --- a/project/effectgizmo.h +++ b/project/effectgizmo.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EFFECTGIZMO_H #define EFFECTGIZMO_H diff --git a/project/effectloaders.cpp b/project/effectloaders.cpp index f5822a0f9..d34b5b25c 100644 --- a/project/effectloaders.cpp +++ b/project/effectloaders.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effectloaders.h" #include "project/effect.h" diff --git a/project/effectloaders.h b/project/effectloaders.h index 3d88cf64e..9a4c2a86e 100644 --- a/project/effectloaders.h +++ b/project/effectloaders.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EFFECTLOADERS_H #define EFFECTLOADERS_H diff --git a/project/effectrow.cpp b/project/effectrow.cpp index 464ae55fa..bef7fd363 100644 --- a/project/effectrow.cpp +++ b/project/effectrow.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "effectrow.h" #include diff --git a/project/effectrow.h b/project/effectrow.h index 1d71a07a4..845286d6e 100644 --- a/project/effectrow.h +++ b/project/effectrow.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EFFECTROW_H #define EFFECTROW_H diff --git a/project/footage.cpp b/project/footage.cpp index 9aa00da3f..64eee2da5 100644 --- a/project/footage.cpp +++ b/project/footage.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "footage.h" #include diff --git a/project/footage.h b/project/footage.h index e42fc65f8..30db89b2b 100644 --- a/project/footage.h +++ b/project/footage.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef FOOTAGE_H #define FOOTAGE_H diff --git a/project/keyframe.cpp b/project/keyframe.cpp index 6bc5a941c..08e6ba162 100644 --- a/project/keyframe.cpp +++ b/project/keyframe.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "keyframe.h" #include diff --git a/project/keyframe.h b/project/keyframe.h index fd7e4ac0f..9602a670e 100644 --- a/project/keyframe.h +++ b/project/keyframe.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef KEYFRAME_H #define KEYFRAME_H diff --git a/project/marker.cpp b/project/marker.cpp index 02fc18ee4..ba93829a8 100644 --- a/project/marker.cpp +++ b/project/marker.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "marker.h" #include "io/config.h" diff --git a/project/marker.h b/project/marker.h index 9e6897871..59de65f3e 100644 --- a/project/marker.h +++ b/project/marker.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef MARKER_H #define MARKER_H diff --git a/project/media.cpp b/project/media.cpp index 1302e34cf..31292dee6 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "media.h" #include "footage.h" diff --git a/project/media.h b/project/media.h index ff7ea236f..ed99c2ad5 100644 --- a/project/media.h +++ b/project/media.h @@ -1,4 +1,24 @@ -#ifndef MEDIA_H +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef MEDIA_H #define MEDIA_H #include diff --git a/project/projectelements.h b/project/projectelements.h index e41e27aa5..217a398f6 100644 --- a/project/projectelements.h +++ b/project/projectelements.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PROJECTELEMENTS_H #define PROJECTELEMENTS_H diff --git a/project/projectfilter.cpp b/project/projectfilter.cpp index f6a4e58d6..72000a046 100644 --- a/project/projectfilter.cpp +++ b/project/projectfilter.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "projectfilter.h" #include "project/media.h" diff --git a/project/projectfilter.h b/project/projectfilter.h index 848acbffd..b03865cc8 100644 --- a/project/projectfilter.h +++ b/project/projectfilter.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef PROJECTFILTER_H #define PROJECTFILTER_H diff --git a/project/projectmodel.cpp b/project/projectmodel.cpp index 564498214..5fdae2184 100644 --- a/project/projectmodel.cpp +++ b/project/projectmodel.cpp @@ -1,4 +1,24 @@ -#include "projectmodel.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "projectmodel.h" #include "panels/panels.h" #include "panels/viewer.h" diff --git a/project/projectmodel.h b/project/projectmodel.h index 349080b7a..08788d08f 100644 --- a/project/projectmodel.h +++ b/project/projectmodel.h @@ -1,4 +1,24 @@ -#ifndef PROJECTMODEL_H +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef PROJECTMODEL_H #define PROJECTMODEL_H #include diff --git a/project/selection.h b/project/selection.h index 104aa1df0..79c3a79cb 100644 --- a/project/selection.h +++ b/project/selection.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SELECTION_H #define SELECTION_H diff --git a/project/sequence.cpp b/project/sequence.cpp index bd9eec73b..d8d1f4fa5 100644 --- a/project/sequence.cpp +++ b/project/sequence.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "sequence.h" #include "clip.h" diff --git a/project/sequence.h b/project/sequence.h index 0e69b6d97..faa899bce 100644 --- a/project/sequence.h +++ b/project/sequence.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SEQUENCE_H #define SEQUENCE_H diff --git a/project/sourcescommon.cpp b/project/sourcescommon.cpp index 56047899d..a6f23e282 100644 --- a/project/sourcescommon.cpp +++ b/project/sourcescommon.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "sourcescommon.h" #include "panels/panels.h" diff --git a/project/sourcescommon.h b/project/sourcescommon.h index 1eb816129..0fa1c015a 100644 --- a/project/sourcescommon.h +++ b/project/sourcescommon.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SOURCESCOMMON_H #define SOURCESCOMMON_H diff --git a/project/transition.cpp b/project/transition.cpp index 5a3123b6f..ec1536f8e 100644 --- a/project/transition.cpp +++ b/project/transition.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "transition.h" #include "mainwindow.h" diff --git a/project/transition.h b/project/transition.h index 29e2e2493..bd8c4ffa7 100644 --- a/project/transition.h +++ b/project/transition.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TRANSITION_H #define TRANSITION_H diff --git a/project/undo.cpp b/project/undo.cpp index dba77b36c..bb72f281b 100644 --- a/project/undo.cpp +++ b/project/undo.cpp @@ -1,4 +1,24 @@ -#include "undo.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "undo.h" #include #include diff --git a/project/undo.h b/project/undo.h index 3b539220d..0ae6d489c 100644 --- a/project/undo.h +++ b/project/undo.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef UNDO_H #define UNDO_H diff --git a/ui/audiomonitor.cpp b/ui/audiomonitor.cpp index de511478a..c1794e78a 100644 --- a/ui/audiomonitor.cpp +++ b/ui/audiomonitor.cpp @@ -1,4 +1,24 @@ -#include "audiomonitor.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "audiomonitor.h" #include "project/sequence.h" #include "playback/audio.h" diff --git a/ui/audiomonitor.h b/ui/audiomonitor.h index f0da1dc1c..b2e72c1d6 100644 --- a/ui/audiomonitor.h +++ b/ui/audiomonitor.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef AUDIOMONITOR_H #define AUDIOMONITOR_H diff --git a/ui/checkboxex.cpp b/ui/checkboxex.cpp index 0b3f7bec1..d98e4fecb 100644 --- a/ui/checkboxex.cpp +++ b/ui/checkboxex.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "checkboxex.h" #include "project/undo.h" diff --git a/ui/checkboxex.h b/ui/checkboxex.h index 1a05e9cdd..eb3db0f01 100644 --- a/ui/checkboxex.h +++ b/ui/checkboxex.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CHECKBOXEX_H #define CHECKBOXEX_H diff --git a/ui/clickablelabel.cpp b/ui/clickablelabel.cpp index b5afb2327..86f7f7de2 100644 --- a/ui/clickablelabel.cpp +++ b/ui/clickablelabel.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "clickablelabel.h" ClickableLabel::ClickableLabel(QWidget *parent, Qt::WindowFlags f) : diff --git a/ui/clickablelabel.h b/ui/clickablelabel.h index 785c4c7c6..a1dd67786 100644 --- a/ui/clickablelabel.h +++ b/ui/clickablelabel.h @@ -1,8 +1,33 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CLICKABLELABEL_H #define CLICKABLELABEL_H #include +/** + * @brief The ClickableLabel class + * + * Simple QLabel-derived class that emits a clicked() signal when the widget receives a mouse press event. + */ class ClickableLabel : public QLabel { Q_OBJECT public: diff --git a/ui/collapsiblewidget.cpp b/ui/collapsiblewidget.cpp index 2b17ce57b..fffd815b4 100644 --- a/ui/collapsiblewidget.cpp +++ b/ui/collapsiblewidget.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "collapsiblewidget.h" #include "ui/checkboxex.h" diff --git a/ui/collapsiblewidget.h b/ui/collapsiblewidget.h index 148080b03..85fcbe824 100644 --- a/ui/collapsiblewidget.h +++ b/ui/collapsiblewidget.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef COLLAPSIBLEWIDGET_H #define COLLAPSIBLEWIDGET_H diff --git a/ui/colorbutton.cpp b/ui/colorbutton.cpp index ca15dbd39..4489b47db 100644 --- a/ui/colorbutton.cpp +++ b/ui/colorbutton.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "colorbutton.h" #include "project/undo.h" diff --git a/ui/colorbutton.h b/ui/colorbutton.h index 512f92c8d..d4593549f 100644 --- a/ui/colorbutton.h +++ b/ui/colorbutton.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef COLORBUTTON_H #define COLORBUTTON_H diff --git a/ui/comboboxex.cpp b/ui/comboboxex.cpp index e961a4183..9d689d916 100644 --- a/ui/comboboxex.cpp +++ b/ui/comboboxex.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "comboboxex.h" #include "project/undo.h" diff --git a/ui/comboboxex.h b/ui/comboboxex.h index 3fa74cdb9..28c04d380 100644 --- a/ui/comboboxex.h +++ b/ui/comboboxex.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef COMBOBOXEX_H #define COMBOBOXEX_H diff --git a/ui/cursors.cpp b/ui/cursors.cpp index 5b6056748..3eb0973a9 100644 --- a/ui/cursors.cpp +++ b/ui/cursors.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "cursors.h" #include diff --git a/ui/cursors.h b/ui/cursors.h index f12f94868..3f9196fb6 100644 --- a/ui/cursors.h +++ b/ui/cursors.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef CURSORS_H #define CURSORS_H diff --git a/ui/embeddedfilechooser.cpp b/ui/embeddedfilechooser.cpp index 2de15500f..c5ca542d1 100644 --- a/ui/embeddedfilechooser.cpp +++ b/ui/embeddedfilechooser.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "embeddedfilechooser.h" #include diff --git a/ui/embeddedfilechooser.h b/ui/embeddedfilechooser.h index 9a01fa31d..3808bec6f 100644 --- a/ui/embeddedfilechooser.h +++ b/ui/embeddedfilechooser.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef EMBEDDEDFILECHOOSER_H #define EMBEDDEDFILECHOOSER_H diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp index 7548ed82a..3fcb9f131 100644 --- a/ui/focusfilter.cpp +++ b/ui/focusfilter.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "focusfilter.h" #include "panels/panels.h" diff --git a/ui/focusfilter.h b/ui/focusfilter.h index 9c780622e..37df333bc 100644 --- a/ui/focusfilter.h +++ b/ui/focusfilter.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef FOCUSFILTER_H #define FOCUSFILTER_H diff --git a/ui/fontcombobox.cpp b/ui/fontcombobox.cpp index 5c2c98e19..349625847 100644 --- a/ui/fontcombobox.cpp +++ b/ui/fontcombobox.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "fontcombobox.h" #include diff --git a/ui/fontcombobox.h b/ui/fontcombobox.h index fd9ebd2c5..f6ad2d5dd 100644 --- a/ui/fontcombobox.h +++ b/ui/fontcombobox.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef FONTCOMBOBOX_H #define FONTCOMBOBOX_H diff --git a/ui/graphview.cpp b/ui/graphview.cpp index 867d49765..b8f8d48a9 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "graphview.h" #include diff --git a/ui/graphview.h b/ui/graphview.h index 29d4f6f91..02dc27216 100644 --- a/ui/graphview.h +++ b/ui/graphview.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef GRAPHVIEW_H #define GRAPHVIEW_H diff --git a/ui/keyframedrawing.cpp b/ui/keyframedrawing.cpp index 3e33b28d4..8fa773bcf 100644 --- a/ui/keyframedrawing.cpp +++ b/ui/keyframedrawing.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "keyframedrawing.h" #include "project/effect.h" diff --git a/ui/keyframedrawing.h b/ui/keyframedrawing.h index ae1ff7717..2c15e893f 100644 --- a/ui/keyframedrawing.h +++ b/ui/keyframedrawing.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef KEYFRAMEDRAWING_H #define KEYFRAMEDRAWING_H diff --git a/ui/keyframenavigator.cpp b/ui/keyframenavigator.cpp index c6c726cf1..91113254e 100644 --- a/ui/keyframenavigator.cpp +++ b/ui/keyframenavigator.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "keyframenavigator.h" #include diff --git a/ui/keyframenavigator.h b/ui/keyframenavigator.h index ec2b645b8..c82b7344d 100644 --- a/ui/keyframenavigator.h +++ b/ui/keyframenavigator.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef KEYFRAMENAVIGATOR_H #define KEYFRAMENAVIGATOR_H diff --git a/ui/keyframeview.cpp b/ui/keyframeview.cpp index ce47ee95f..93c3c50f3 100644 --- a/ui/keyframeview.cpp +++ b/ui/keyframeview.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "keyframeview.h" #include "project/effect.h" diff --git a/ui/keyframeview.h b/ui/keyframeview.h index dc0719b88..b704aa1d1 100644 --- a/ui/keyframeview.h +++ b/ui/keyframeview.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef KEYFRAMEVIEW_H #define KEYFRAMEVIEW_H diff --git a/ui/labelslider.cpp b/ui/labelslider.cpp index ad5ac4c65..f7ef71813 100644 --- a/ui/labelslider.cpp +++ b/ui/labelslider.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "labelslider.h" #include "project/undo.h" diff --git a/ui/labelslider.h b/ui/labelslider.h index ebc98ea28..db0d68e21 100644 --- a/ui/labelslider.h +++ b/ui/labelslider.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef LABELSLIDER_H #define LABELSLIDER_H diff --git a/ui/menuhelper.cpp b/ui/menuhelper.cpp index b2f03f438..05dd5370a 100644 --- a/ui/menuhelper.cpp +++ b/ui/menuhelper.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "menuhelper.h" #include "oliveglobal.h" diff --git a/ui/menuhelper.h b/ui/menuhelper.h index 4d904d394..719746b57 100644 --- a/ui/menuhelper.h +++ b/ui/menuhelper.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef MENUHELPER_H #define MENUHELPER_H diff --git a/ui/rectangleselect.cpp b/ui/rectangleselect.cpp index b4a9348ce..033c9c47d 100644 --- a/ui/rectangleselect.cpp +++ b/ui/rectangleselect.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "rectangleselect.h" void draw_selection_rectangle(QPainter& painter, const QRect& rect) { diff --git a/ui/rectangleselect.h b/ui/rectangleselect.h index 40eee2aeb..9cc11f078 100644 --- a/ui/rectangleselect.h +++ b/ui/rectangleselect.h @@ -1,8 +1,39 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef RECTANGLESELECT_H #define RECTANGLESELECT_H #include +/** + * @brief Routine for drawing a drag selection rectangle for any given QPainter + * + * @param painter + * + * QPainter object to use for drawing + * + * @param rect + * + * Rectangle to draw + */ void draw_selection_rectangle(QPainter& painter, const QRect& rect); #endif // RECTANGLESELECT_H diff --git a/ui/renderfunctions.cpp b/ui/renderfunctions.cpp index 6b8c35d0e..aceb622b7 100644 --- a/ui/renderfunctions.cpp +++ b/ui/renderfunctions.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "renderfunctions.h" #include diff --git a/ui/renderfunctions.h b/ui/renderfunctions.h index 176ebd563..c2ed68425 100644 --- a/ui/renderfunctions.h +++ b/ui/renderfunctions.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef RENDERFUNCTIONS_H #define RENDERFUNCTIONS_H diff --git a/ui/renderthread.cpp b/ui/renderthread.cpp index cdf72326b..e95f8c076 100644 --- a/ui/renderthread.cpp +++ b/ui/renderthread.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "renderthread.h" #include diff --git a/ui/renderthread.h b/ui/renderthread.h index 3b1e1e1cb..de67edd83 100644 --- a/ui/renderthread.h +++ b/ui/renderthread.h @@ -1,4 +1,24 @@ -#ifndef RENDERTHREAD_H +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef RENDERTHREAD_H #define RENDERTHREAD_H #include diff --git a/ui/resizablescrollbar.cpp b/ui/resizablescrollbar.cpp index f08bba77e..284a04073 100644 --- a/ui/resizablescrollbar.cpp +++ b/ui/resizablescrollbar.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "resizablescrollbar.h" #include diff --git a/ui/resizablescrollbar.h b/ui/resizablescrollbar.h index 70e4094d7..ef1453bc2 100644 --- a/ui/resizablescrollbar.h +++ b/ui/resizablescrollbar.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef RESIZABLESCROLLBAR_H #define RESIZABLESCROLLBAR_H diff --git a/ui/scrollarea.cpp b/ui/scrollarea.cpp index 04b45407b..f2c512208 100644 --- a/ui/scrollarea.cpp +++ b/ui/scrollarea.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "scrollarea.h" #include diff --git a/ui/scrollarea.h b/ui/scrollarea.h index e7facf07a..667fe53d1 100644 --- a/ui/scrollarea.h +++ b/ui/scrollarea.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SCROLLAREA_H #define SCROLLAREA_H diff --git a/ui/sourceiconview.cpp b/ui/sourceiconview.cpp index 83aed6176..d3f44d49d 100644 --- a/ui/sourceiconview.cpp +++ b/ui/sourceiconview.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "sourceiconview.h" #include diff --git a/ui/sourceiconview.h b/ui/sourceiconview.h index 9320a1628..e561a7a6f 100644 --- a/ui/sourceiconview.h +++ b/ui/sourceiconview.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SOURCEICONVIEW_H #define SOURCEICONVIEW_H diff --git a/ui/sourcetable.cpp b/ui/sourcetable.cpp index d439c0f04..9bf40a1f7 100644 --- a/ui/sourcetable.cpp +++ b/ui/sourcetable.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "sourcetable.h" #include "panels/project.h" diff --git a/ui/sourcetable.h b/ui/sourcetable.h index aa19a5449..94868decc 100644 --- a/ui/sourcetable.h +++ b/ui/sourcetable.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef SOURCETABLE_H #define SOURCETABLE_H diff --git a/ui/texteditex.cpp b/ui/texteditex.cpp index 7c29db865..7d6461ed4 100644 --- a/ui/texteditex.cpp +++ b/ui/texteditex.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "texteditex.h" #include diff --git a/ui/texteditex.h b/ui/texteditex.h index 564da3723..b345859a6 100644 --- a/ui/texteditex.h +++ b/ui/texteditex.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TEXTEDITEX_H #define TEXTEDITEX_H diff --git a/ui/timelineheader.cpp b/ui/timelineheader.cpp index 206213b10..54eb1b218 100644 --- a/ui/timelineheader.cpp +++ b/ui/timelineheader.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "timelineheader.h" #include "mainwindow.h" diff --git a/ui/timelineheader.h b/ui/timelineheader.h index 6a2a11a47..780a05d97 100644 --- a/ui/timelineheader.h +++ b/ui/timelineheader.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TIMELINEHEADER_H #define TIMELINEHEADER_H diff --git a/ui/timelinetools.h b/ui/timelinetools.h index ba23ad621..bcc10bab6 100644 --- a/ui/timelinetools.h +++ b/ui/timelinetools.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TIMELINETOOLS_H #define TIMELINETOOLS_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index cbbd6d9a7..cb10ca7de 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "timelinewidget.h" #include "oliveglobal.h" diff --git a/ui/timelinewidget.h b/ui/timelinewidget.h index 4c94a9087..e4a6f49bb 100644 --- a/ui/timelinewidget.h +++ b/ui/timelinewidget.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef TIMELINEWIDGET_H #define TIMELINEWIDGET_H diff --git a/ui/viewercontainer.cpp b/ui/viewercontainer.cpp index d83f799a9..c247ae0f6 100644 --- a/ui/viewercontainer.cpp +++ b/ui/viewercontainer.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "viewercontainer.h" #include diff --git a/ui/viewercontainer.h b/ui/viewercontainer.h index 00dfc8fdd..1724c1d16 100644 --- a/ui/viewercontainer.h +++ b/ui/viewercontainer.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VIEWERCONTAINER_H #define VIEWERCONTAINER_H diff --git a/ui/viewerwidget.cpp b/ui/viewerwidget.cpp index 2ae3ac687..1678a9802 100644 --- a/ui/viewerwidget.cpp +++ b/ui/viewerwidget.cpp @@ -1,4 +1,24 @@ -#include "viewerwidget.h" +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#include "viewerwidget.h" #include "panels/panels.h" #include "panels/viewer.h" diff --git a/ui/viewerwidget.h b/ui/viewerwidget.h index 90327019f..8af8c91a0 100644 --- a/ui/viewerwidget.h +++ b/ui/viewerwidget.h @@ -1,4 +1,24 @@ -#ifndef VIEWERWIDGET_H +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + +#ifndef VIEWERWIDGET_H #define VIEWERWIDGET_H #include diff --git a/ui/viewerwindow.cpp b/ui/viewerwindow.cpp index 317c8983a..77178b70b 100644 --- a/ui/viewerwindow.cpp +++ b/ui/viewerwindow.cpp @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #include "viewerwindow.h" #include diff --git a/ui/viewerwindow.h b/ui/viewerwindow.h index b1b491173..ccba77452 100644 --- a/ui/viewerwindow.h +++ b/ui/viewerwindow.h @@ -1,3 +1,23 @@ +/*** + + Olive - Non-Linear Video Editor + Copyright (C) 2019 Olive Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +***/ + #ifndef VIEWERWINDOW_H #define VIEWERWINDOW_H From 78018a79c562f65d7f637e016786f7828d6f7763 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 05:04:10 -0800 Subject: [PATCH 188/202] nullptr checks to prevent crashes with no active sequence --- panels/timeline.cpp | 63 ++++++++++++++++++++++++++++----------------- panels/viewer.cpp | 21 ++++++++++----- playback/cacher.cpp | 4 ++- 3 files changed, 57 insertions(+), 31 deletions(-) diff --git a/panels/timeline.cpp b/panels/timeline.cpp index ac764cbe4..28b17f948 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -118,7 +118,8 @@ Timeline::Timeline(QWidget *parent) : Timeline::~Timeline() {} void Timeline::previous_cut() { - if (Olive::ActiveSequence->playhead > 0) { + if (Olive::ActiveSequence != nullptr + && Olive::ActiveSequence->playhead > 0) { long p_cut = 0; for (int i=0;iclips.size();i++) { Clip* c = Olive::ActiveSequence->clips.at(i); @@ -135,21 +136,23 @@ void Timeline::previous_cut() { } void Timeline::next_cut() { - bool seek_enabled = false; - long n_cut = LONG_MAX; - for (int i=0;iclips.size();i++) { - Clip* c = Olive::ActiveSequence->clips.at(i); - if (c != nullptr) { - if (c->timeline_in < n_cut && c->timeline_in > Olive::ActiveSequence->playhead) { - n_cut = c->timeline_in; - seek_enabled = true; - } else if (c->timeline_out < n_cut && c->timeline_out > Olive::ActiveSequence->playhead) { - n_cut = c->timeline_out; - seek_enabled = true; - } - } - } - if (seek_enabled) panel_sequence_viewer->seek(n_cut); + if (Olive::ActiveSequence != nullptr) { + bool seek_enabled = false; + long n_cut = LONG_MAX; + for (int i=0;iclips.size();i++) { + Clip* c = Olive::ActiveSequence->clips.at(i); + if (c != nullptr) { + if (c->timeline_in < n_cut && c->timeline_in > Olive::ActiveSequence->playhead) { + n_cut = c->timeline_in; + seek_enabled = true; + } else if (c->timeline_out < n_cut && c->timeline_out > Olive::ActiveSequence->playhead) { + n_cut = c->timeline_out; + seek_enabled = true; + } + } + } + if (seek_enabled) panel_sequence_viewer->seek(n_cut); + } } void ripple_clips(ComboAction* ca, Sequence *s, long point, long length, const QVector& ignore) { @@ -512,17 +515,18 @@ void Timeline::repaint_timeline() { } } - zoom_just_changed = false; - if (draw) { headers->update(); video_area->update(); audio_area->update(); - if (Olive::ActiveSequence != nullptr) { + if (Olive::ActiveSequence != nullptr + && !zoom_just_changed) { set_sb_max(); } } + + zoom_just_changed = false; } } @@ -740,15 +744,26 @@ void Timeline::delete_selection(QVector& selections, bool ripple_dele } void Timeline::set_zoom_value(double v) { + // set zoom value zoom = v; - zoom_just_changed = true; - headers->update_zoom(zoom); - repaint_timeline(); + // update header zoom to match + headers->update_zoom(zoom); + + // set flag that zoom has just changed to prevent auto-scrolling since we change the scroll below + zoom_just_changed = true; + + // set scrollbar to center the playhead + if (Olive::ActiveSequence != nullptr + && !horizontalScrollBar->is_resizing()) { + // update scrollbar maximum value for new zoom + set_sb_max(); - // TODO find a way to gradually move towards target_scroll instead of just centering it? - if (!horizontalScrollBar->is_resizing()) center_scroll_to_playhead(horizontalScrollBar, zoom, Olive::ActiveSequence->playhead); + } + + // repaint the timeline for the new zoom/location + repaint_timeline(); } void Timeline::multiply_zoom(double m) { diff --git a/panels/viewer.cpp b/panels/viewer.cpp index a12a4c24e..8dd2acfce 100644 --- a/panels/viewer.cpp +++ b/panels/viewer.cpp @@ -514,37 +514,46 @@ void Viewer::resizeEvent(QResizeEvent *e) { void Viewer::update_viewer() { update_header_zoom(); viewer_widget->frame_update(); - if (seq != nullptr) update_playhead_timecode(seq->playhead); + if (seq != nullptr) { + update_playhead_timecode(seq->playhead); + } update_end_timecode(); } void Viewer::clear_in() { - if (seq->using_workarea) { + if (seq != nullptr + && seq->using_workarea) { Olive::UndoStack.push(new SetTimelineInOutCommand(seq, true, 0, seq->workarea_out)); update_parents(); } } void Viewer::clear_out() { - if (seq->using_workarea) { + if (seq != nullptr + && seq->using_workarea) { Olive::UndoStack.push(new SetTimelineInOutCommand(seq, true, seq->workarea_in, seq->getEndFrame())); update_parents(); } } void Viewer::clear_inout_point() { - if (seq->using_workarea) { + if (seq != nullptr + && seq->using_workarea) { Olive::UndoStack.push(new SetTimelineInOutCommand(seq, false, 0, 0)); update_parents(); } } void Viewer::set_in_point() { - headers->set_in_point(seq->playhead); + if (seq != nullptr) { + headers->set_in_point(seq->playhead); + } } void Viewer::set_out_point() { - headers->set_out_point(seq->playhead); + if (seq != nullptr) { + headers->set_out_point(seq->playhead); + } } void Viewer::set_zoom(bool in) { diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 885526bc1..29ae8c029 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -676,6 +676,8 @@ Cacher::Cacher(Clip* c) : clip(c) {} AVSampleFormat sample_format = AV_SAMPLE_FMT_S16; void open_clip_worker(Clip* clip) { + qint64 time_start = QDateTime::currentMSecsSinceEpoch(); + if (clip->media == nullptr) { if (clip->track >= 0) { clip->frame = av_frame_alloc(); @@ -942,7 +944,7 @@ void open_clip_worker(Clip* clip) { clip->finished_opening = true; - qInfo() << "Clip opened on track" << clip->track; + qInfo() << "Clip opened on track" << clip->track << "(took" << (QDateTime::currentMSecsSinceEpoch() - time_start) << "ms)"; } void cache_clip_worker(Clip* clip, long playhead, bool reset, bool scrubbing, QVector nests, int playback_speed) { From c29f0a12c19647352edf6dfa36cfce7f087a37d8 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 16:10:09 -0800 Subject: [PATCH 189/202] fixed #502 --- dialogs/preferencesdialog.cpp | 91 +++++++++++++++++++++++------------ dialogs/preferencesdialog.h | 1 + io/config.cpp | 11 +++-- io/config.h | 1 + panels/timeline.cpp | 18 ++++--- ui/timelinewidget.cpp | 5 +- 6 files changed, 81 insertions(+), 46 deletions(-) diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index fa2d47aed..5e9f3adc5 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -20,6 +20,7 @@ #include "preferencesdialog.h" +#include "oliveglobal.h" #include "io/config.h" #include "io/path.h" #include "playback/audio.h" @@ -168,6 +169,10 @@ void PreferencesDialog::setup_kbd_shortcuts(QMenuBar* menubar) { } void PreferencesDialog::save() { + bool restart_after_saving = false; + bool reinit_audio = false; + + // Validate whether the specified CSS file exists if (!custom_css_fn->text().isEmpty() && !QFileInfo::exists(custom_css_fn->text())) { QMessageBox::critical( this, @@ -177,10 +182,48 @@ void PreferencesDialog::save() { return; } - // save settings from UI to backend + // Check if any settings will require a restart of Olive + if (config.effect_textbox_lines != effect_textbox_lines_field->value() + || config.use_software_fallback != use_software_fallbacks_checkbox->isChecked() + || config.language_file != language_combobox->currentData().toString() + || config.thumbnail_resolution != thumbnail_res_spinbox->value() + || config.waveform_resolution != waveform_res_spinbox->value()) { + // any changes to these settings will require a restart - ask the user if we should do one now or later + + int ret = QMessageBox::question(this, + "Restart Required", + "Some of the changed settings will require a restart of Olive. Would you like to" + "restart now?", + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + + if (ret == QMessageBox::Cancel) { + // Return to Preferences dialog without saving any settings + return; + } else if (ret == QMessageBox::Yes) { + + // Check if we can close the current project. If not, we'll treat it as if the user clicked "Cancel". + if (Olive::Global->can_close_project()) { + restart_after_saving = true; + } else { + return; + } + } + // Selecting "No" will save the settings and not restart. They will become active next time Olive opens. + + } + + // Audio settings may require the audio device to be re-initiated. + if (config.preferred_audio_output != audio_output_devices->currentData().toString() + || config.preferred_audio_input != audio_input_devices->currentData().toString() + || config.audio_rate != audio_sample_rate->currentData().toInt()) { + reinit_audio = true; + } + + // save settings from UI to backend config.css_path = custom_css_fn->text(); Olive::MainWindow->load_css_from_file(config.css_path); + config.recording_mode = recordingComboBox->currentIndex() + 1; config.img_seq_formats = imgSeqFormatEdit->text(); config.fast_seeking = fastSeekButton->isChecked(); @@ -188,38 +231,19 @@ void PreferencesDialog::save() { config.upcoming_queue_type = upcoming_queue_type->currentIndex(); config.previous_queue_size = previous_queue_spinbox->value(); config.previous_queue_type = previous_queue_type->currentIndex(); + config.add_default_effects_to_clips = add_default_effects_to_clips->isChecked(); - // audio preferences - bool reset_audio_required = (config.preferred_audio_output != audio_output_devices->currentData().toString() - || config.preferred_audio_input != audio_input_devices->currentData().toString()); config.preferred_audio_output = audio_output_devices->currentData().toString(); config.preferred_audio_input = audio_input_devices->currentData().toString(); config.audio_rate = audio_sample_rate->currentData().toInt(); - // the following settings may require a restart of Olive to take effect: - - bool needs_restart = false; - - if (config.effect_textbox_lines != effect_textbox_lines_field->value()) { - needs_restart = true; - config.effect_textbox_lines = effect_textbox_lines_field->value(); - } - - if (config.use_software_fallback != use_software_fallbacks_checkbox->isChecked()) { - needs_restart = true; - config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); - } - - if (config.language_file != language_combobox->currentData().toString()) { - needs_restart = true; - config.language_file = language_combobox->currentData().toString(); - } + config.effect_textbox_lines = effect_textbox_lines_field->value(); + config.use_software_fallback = use_software_fallbacks_checkbox->isChecked(); + config.language_file = language_combobox->currentData().toString(); if (config.thumbnail_resolution != thumbnail_res_spinbox->value() || config.waveform_resolution != waveform_res_spinbox->value()) { - // we're changing the size of thumbnails and waveforms, so let's delete them and regenerate them next start - - needs_restart = true; + // we're changing the size of thumbnails and waveforms, so let's delete them and regenerate them next start // delete nothing char delete_match = 0; @@ -249,18 +273,15 @@ void PreferencesDialog::save() { delete_previews(delete_match); } - // save keyboard shortcuts + // Save keyboard shortcuts for (int i=0;iset_action_shortcut(); } - if (reset_audio_required) { + // Audio settings may require the audio device to be re-initiated. + if (reinit_audio) { init_audio(); - } - - if (needs_restart) { - QMessageBox::information(this, tr("Warning"), tr("Some changed settings will require restarting Olive to take effect")); - } + } accept(); } @@ -525,6 +546,12 @@ void PreferencesDialog::setup_ui() { QWidget* behavior_tab = new QWidget(this); tabWidget->addTab(behavior_tab, tr("Behavior")); + QVBoxLayout* behavior_tab_layout = new QVBoxLayout(behavior_tab); + + add_default_effects_to_clips = new QCheckBox("Add Default Effects to New Clips"); + add_default_effects_to_clips->setChecked(config.add_default_effects_to_clips); + behavior_tab_layout->addWidget(add_default_effects_to_clips); + // Playback QWidget* playback_tab = new QWidget(this); QVBoxLayout* playback_tab_layout = new QVBoxLayout(playback_tab); diff --git a/dialogs/preferencesdialog.h b/dialogs/preferencesdialog.h index 24042dffb..5469ce8a6 100644 --- a/dialogs/preferencesdialog.h +++ b/dialogs/preferencesdialog.h @@ -92,6 +92,7 @@ private: QComboBox* language_combobox; QSpinBox* thumbnail_res_spinbox; QSpinBox* waveform_res_spinbox; + QCheckBox* add_default_effects_to_clips; QVector key_shortcut_actions; QVector key_shortcut_items; diff --git a/io/config.cpp b/io/config.cpp index df2c97d1e..01836bf80 100644 --- a/io/config.cpp +++ b/io/config.cpp @@ -70,7 +70,8 @@ Config::Config() use_software_fallback(false), center_timeline_timecodes(true), waveform_resolution(64), - thumbnail_resolution(120) + thumbnail_resolution(120), + add_default_effects_to_clips(true) {} void Config::load(QString path) { @@ -207,7 +208,10 @@ void Config::load(QString path) { } else if (stream.name() == "WaveformResolution") { stream.readNext(); waveform_resolution = stream.text().toInt(); - } + } else if (stream.name() == "AddDefaultEffectsToClips") { + stream.readNext(); + add_default_effects_to_clips = (stream.text() == "1"); + } } } if (stream.hasError()) { @@ -272,7 +276,8 @@ void Config::save(QString path) { stream.writeTextElement("PreferredAudioInput", preferred_audio_input); stream.writeTextElement("LanguageFile", language_file); stream.writeTextElement("ThumbnailResolution", QString::number(thumbnail_resolution)); - stream.writeTextElement("WaveformResolution", QString::number(waveform_resolution)); + stream.writeTextElement("WaveformResolution", QString::number(waveform_resolution)); + stream.writeTextElement("AddDefaultEffectsToClips", QString::number(add_default_effects_to_clips)); stream.writeEndElement(); // configuration stream.writeEndDocument(); // doc diff --git a/io/config.h b/io/config.h index 730261ca6..c79fed787 100644 --- a/io/config.h +++ b/io/config.h @@ -89,6 +89,7 @@ struct Config { QString language_file; int waveform_resolution; int thumbnail_resolution; + bool add_default_effects_to_clips; void load(QString path); void save(QString path); diff --git a/panels/timeline.cpp b/panels/timeline.cpp index 28b17f948..d225e38c1 100644 --- a/panels/timeline.cpp +++ b/panels/timeline.cpp @@ -335,14 +335,16 @@ void Timeline::add_clips_from_ghosts(ComboAction* ca, Sequence* s) { } } - if (c->track < 0) { - // add default video effects - c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_TRANSFORM, EFFECT_TYPE_EFFECT))); - } else { - // add default audio effects - c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_VOLUME, EFFECT_TYPE_EFFECT))); - c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_PAN, EFFECT_TYPE_EFFECT))); - } + if (config.add_default_effects_to_clips) { + if (c->track < 0) { + // add default video effects + c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_TRANSFORM, EFFECT_TYPE_EFFECT))); + } else { + // add default audio effects + c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_VOLUME, EFFECT_TYPE_EFFECT))); + c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_PAN, EFFECT_TYPE_EFFECT))); + } + } } if (config.enable_seek_to_import) { panel_sequence_viewer->seek(earliest_point); diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index cb10ca7de..93ac84a44 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -840,10 +840,9 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { add.append(c); ca->append(new AddClipCommand(Olive::ActiveSequence, add)); - if (c->track < 0) { + if (c->track < 0 && config.add_default_effects_to_clips) { // default video effects (before custom effects) c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_TRANSFORM, EFFECT_TYPE_EFFECT))); - //c->media_type = MEDIA_TYPE_SOLID; } switch (panel_timeline->creating_object) { @@ -873,7 +872,7 @@ void TimelineWidget::mouseReleaseEvent(QMouseEvent *event) { break; } - if (c->track >= 0) { + if (c->track >= 0 && config.add_default_effects_to_clips) { // default audio effects (after custom effects) c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_VOLUME, EFFECT_TYPE_EFFECT))); c->effects.append(create_effect(c, get_internal_meta(EFFECT_INTERNAL_PAN, EFFECT_TYPE_EFFECT))); From 09644b70b48f895cf2d6c0645d3cfaafd80f6cc5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 16:20:24 -0800 Subject: [PATCH 190/202] testing gtk plugin for qt, updated error_str in loading --- .travis/install.sh | 15 +++++++++++++-- .travis/script.sh | 16 +++++++++++++++- io/loadthread.cpp | 5 ++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.travis/install.sh b/.travis/install.sh index 3983d60dd..52ae8375e 100644 --- a/.travis/install.sh +++ b/.travis/install.sh @@ -1,16 +1,27 @@ #!/bin/bash if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew install ffmpeg qt5 python@2 export PATH="/usr/local/opt/qt/bin:/usr/local/opt/python@2/libexec/bin:$PATH" + elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - if [ "$ARCH" == "x86_64" ]; then sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse; fi - if [ "$ARCH" == "i386" ]; then sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386; fi + + if [ "$ARCH" == "x86_64" ]; then + sudo apt-get -y install qt59base qt59multimedia libavformat-dev libavcodec-dev libavfilter-dev libavutil-dev libswscale-dev libswresample-dev frei0r-plugins-dev frei0r-plugins fuse libgtk2.0-dev + fi + + if [ "$ARCH" == "i386" ]; then + sudo apt-get -y install gcc-multilib g++-multilib qt59base:i386 qt59multimedia:i386 libavformat-dev:i386 libavcodec-dev:i386 libavfilter-dev:i386 libavutil-dev:i386 libswscale-dev:i386 libswresample-dev:i386 frei0r-plugins-dev:i386 frei0r-plugins:i386 pkg-config:i386 libgl1-mesa-dev:i386 fuse:i386 libgtk2.0-dev:i386 + fi source /opt/qt*/bin/qt*-env.sh + elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + #/c/msys64/usr/bin/bash -l -c "pacman -Syu --noconfirm" # install build tools /c/msys64/usr/bin/bash -l -c "pacman -S --noconfirm mingw-w64-x86_64-toolchain mingw-w64-x86_64-ffmpeg mingw-w64-x86_64-qt5" + fi diff --git a/.travis/script.sh b/.travis/script.sh index 46ae8084e..075f5ae5f 100644 --- a/.travis/script.sh +++ b/.travis/script.sh @@ -1,6 +1,7 @@ #!/bin/bash if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + # generate translation files lrelease olive.pro @@ -27,7 +28,17 @@ if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then # distribute in zip zip -r Olive-$(git rev-parse --short HEAD)-macOS.zip Olive.app + elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + + # get, compile, and install GTK style plugin + git clone http://code.qt.io/qt/qtstyleplugins.git + cd qtstyleplugins + qmake + make -j$(nproc) + make install + cd - + # generate translation files lrelease olive.pro @@ -55,7 +66,7 @@ elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export VERSION=$(git rev-parse --short HEAD) # use linuxdeployqt to set up dependencies - ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage + ./linuxdeployqt-continuous-x86_64.AppImage appdir/usr/share/applications/*.desktop -appimage -extra-plugins=platformthemes/libqgtk2.so,styles/libqgtk2style.so # 64-bit linuxdeployqt can only generate a 64-bit AppImage # to generate a 32-bit one, we need to download and run 32-bit AppImageTool @@ -65,11 +76,14 @@ elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then chmod a+x appimagetool-i686.AppImage ./appimagetool-i686.AppImage "appdir" -n -g fi + elif [[ "$TRAVIS_OS_NAME" == "windows" ]]; then + /c/msys64/mingw64/bin/qmake CONFIG+=release /c/msys64/mingw64/bin/mingw32-make -f Makefile.Debug mkdir olive-editor mv olive-editor.exe olive-editor/ /c/msys64/mingw64/bin/windeployqt olive-editor/olive-editor.exe 7z a Olive-$(git rev-parse --short HEAD)-w64p.zip olive-editor + fi diff --git a/io/loadthread.cpp b/io/loadthread.cpp index d8e720cf5..fb663212f 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -698,7 +698,10 @@ void LoadThread::run() { panel_project->start_preview_generator(loaded_media_items.at(i), true); } } else { - error_str = tr("User aborted loading"); + if (error_str.isEmpty()) { + error_str = tr("User aborted loading"); + } + emit error(); } From c477e0dd80cb754164db1c3a5db35497ea7a3eec Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 19:51:33 -0800 Subject: [PATCH 191/202] added helper script for deb package's git hash --- debian/changelog | 10 +++------- debian/gitfromlog.sh | 3 +++ olive.pro | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) create mode 100644 debian/gitfromlog.sh diff --git a/debian/changelog b/debian/changelog index cb91265e6..0f9a79b8e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,9 +1,5 @@ -olive-editor (18.11.13bionic1-1) bionic; urgency=low +olive-editor (201902160026-0ac9dd9+805~ubuntu19.04.1) disco; urgency=low - * Initial Release - * Included missing dep - * Included another missing dep - * Updated source to dd55b97 - * Updated source to 6a38cd0 + * Auto build. - -- Olive Team Fri, 13 Nov 2018 10:04:05 +1100 + -- Launchpad Package Builder Sat, 16 Feb 2019 00:26:45 +0000 \ No newline at end of file diff --git a/debian/gitfromlog.sh b/debian/gitfromlog.sh new file mode 100644 index 000000000..90c0175fa --- /dev/null +++ b/debian/gitfromlog.sh @@ -0,0 +1,3 @@ +# A simple script to extract the Git hash from an auto-generated debian/changelog + +grep -Po '(?<=-)(([a-z0-9])\w+)(?=\+)' $1 \ No newline at end of file diff --git a/olive.pro b/olive.pro index 7e38dae4e..6b47a5db6 100644 --- a/olive.pro +++ b/olive.pro @@ -34,7 +34,7 @@ system("which git") { # Fallback for Ubuntu/Launchpad (extracts Git hash from debian/changelog rather than Git repo) # (see https://answers.launchpad.net/launchpad/+question/678556) isEmpty(GITHASHVAR) { - GITHASHVAR = $$system(grep -Po '(?<=-)(([a-z0-9])\w+)(?=\+)' debian/changelog) + GITHASHVAR = $$system(sh $$PWD/debian/gitfromlog.sh $$PWD/debian/changelog) } DEFINES += GITHASH=\\"\"$$GITHASHVAR\\"\" From eb792d8cd6825afea3c385b3e857f9f6141454d6 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 20:45:54 -0800 Subject: [PATCH 192/202] fixed #512 --- debian/gitfromlog.sh | 2 +- dialogs/preferencesdialog.cpp | 16 +++++++++++++--- mainwindow.cpp | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/debian/gitfromlog.sh b/debian/gitfromlog.sh index 90c0175fa..726fd4e95 100644 --- a/debian/gitfromlog.sh +++ b/debian/gitfromlog.sh @@ -1,3 +1,3 @@ # A simple script to extract the Git hash from an auto-generated debian/changelog -grep -Po '(?<=-)(([a-z0-9])\w+)(?=\+)' $1 \ No newline at end of file +grep -Po '(?<=-)(([a-z0-9])\w+)(?=\+)' -m 1 $1 \ No newline at end of file diff --git a/dialogs/preferencesdialog.cpp b/dialogs/preferencesdialog.cpp index 5e9f3adc5..9a02a5a7a 100644 --- a/dialogs/preferencesdialog.cpp +++ b/dialogs/preferencesdialog.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include KeySequenceEditor::KeySequenceEditor(QWidget* parent, QAction* a) @@ -193,8 +194,8 @@ void PreferencesDialog::save() { int ret = QMessageBox::question(this, "Restart Required", - "Some of the changed settings will require a restart of Olive. Would you like to" - "restart now?", + "Some of the changed settings will require a restart of Olive. Would you like " + "to restart now?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); if (ret == QMessageBox::Cancel) { @@ -283,7 +284,16 @@ void PreferencesDialog::save() { init_audio(); } - accept(); + accept(); + + if (restart_after_saving) { + // since we already ran can_close_project(), bypass checking again by running setWindowModified(false) + Olive::MainWindow->setWindowModified(false); + + Olive::MainWindow->close(); + + QProcess::startDetached(QApplication::applicationFilePath(), { Olive::ActiveProjectFilename }); + } } void PreferencesDialog::reset_default_shortcut() { diff --git a/mainwindow.cpp b/mainwindow.cpp index b50556672..eb6511e29 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -810,8 +810,8 @@ void MainWindow::paintEvent(QPaintEvent *event) { QMainWindow::paintEvent(event); if (first_show) { - emit finished_first_paint(); first_show = false; + emit finished_first_paint(); } } From 7b5921f7e6a17791c5c73dcef0f5a6eb97cedaa1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 23:00:25 -0800 Subject: [PATCH 193/202] fixed load on launch issues --- mainwindow.cpp | 2 +- oliveglobal.cpp | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index eb6511e29..c78828fe6 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -807,7 +807,7 @@ void MainWindow::closeEvent(QCloseEvent *e) { } void MainWindow::paintEvent(QPaintEvent *event) { - QMainWindow::paintEvent(event); + QMainWindow::paintEvent(event); if (first_show) { first_show = false; diff --git a/oliveglobal.cpp b/oliveglobal.cpp index a3b31bc02..910c6c687 100644 --- a/oliveglobal.cpp +++ b/oliveglobal.cpp @@ -207,10 +207,21 @@ void OliveGlobal::open_export_dialog() { } void OliveGlobal::finished_initialize() { - // if a project was set as a command line argument, we load it here if (enable_load_project_on_init) { - open_project_worker(Olive::ActiveProjectFilename, false); + + // if a project was set as a command line argument, we load it here + if (QFileInfo::exists(Olive::ActiveProjectFilename)) { + open_project_worker(Olive::ActiveProjectFilename, false); + } else { + QMessageBox::critical(Olive::MainWindow, + tr("Missing Project File"), + tr("Specified project '%1' does not exist.").arg(Olive::ActiveProjectFilename), + QMessageBox::Ok); + update_project_filename(nullptr); + } + enable_load_project_on_init = false; + } else { // if we are not loading a project on launch and are running a release build, open the demo notice dialog #ifndef QT_DEBUG From 1e84682b5c437857e0a1483d007f1c0d0651c987 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 23:24:03 -0800 Subject: [PATCH 194/202] better thread syncing in loading --- io/loadthread.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/io/loadthread.cpp b/io/loadthread.cpp index fb663212f..1c50389fa 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -716,11 +716,13 @@ void LoadThread::cancel() { } void LoadThread::question_func(const QString &title, const QString &text, int buttons) { + mutex.lock(); question_btn = QMessageBox::warning( Olive::MainWindow, title, text, static_cast(buttons)); + mutex.unlock(); waitCond.wakeAll(); } @@ -795,6 +797,9 @@ void LoadThread::create_effect_ui( * Sorry. I'll fix it one day. */ + // lock mutex - ensures the load thread is suspended while this happens + mutex.lock(); + if (cancelled) return; if (type == TA_NO_TRANSITION) { if (meta == nullptr) { @@ -824,13 +829,22 @@ void LoadThread::create_effect_ui( } } + mutex.unlock(); + waitCond.wakeAll(); } void LoadThread::create_dual_transition(const TransitionData* td, Clip* primary, Clip* secondary, const EffectMeta* meta) { + // lock mutex - ensures the load thread is suspended while this happens + mutex.lock(); + int transition_index = create_transition(primary, secondary, meta); primary->sequence->transitions.at(transition_index)->set_length(td->length); if (td->otc != nullptr) td->otc->opening_transition = transition_index; if (td->ctc != nullptr) td->ctc->closing_transition = transition_index; + + mutex.unlock(); + + // resume load thread waitCond.wakeAll(); } From c810f27c474441ad56319dda01fcb7626ee05eaf Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 15 Feb 2019 23:24:23 -0800 Subject: [PATCH 195/202] fixed #501 --- ui/graphview.cpp | 109 ++++++++++++++++++++++++++++------------------- ui/graphview.h | 8 ++-- 2 files changed, 70 insertions(+), 47 deletions(-) diff --git a/ui/graphview.cpp b/ui/graphview.cpp index b8f8d48a9..b42eb9bf2 100644 --- a/ui/graphview.cpp +++ b/ui/graphview.cpp @@ -61,7 +61,8 @@ GraphView::GraphView(QWidget* parent) : x_scroll(0), y_scroll(0), mousedown(false), - zoom(1.0), + x_zoom(1.0), + y_zoom(1.0), row(nullptr), moved_keys(false), current_handle(BEZIER_HANDLE_NONE), @@ -105,10 +106,11 @@ void GraphView::show_context_menu(const QPoint& pos) { } void GraphView::reset_view() { - zoom = 1.0; + x_zoom = 1.0; + y_zoom = 1.0; set_scroll_x(0); set_scroll_y(0); - emit zoom_changed(zoom); + emit zoom_changed(x_zoom, y_zoom); update(); } @@ -166,10 +168,10 @@ void GraphView::set_view_to_rect(int x1, double y1, int x2, double y2) { double y_diff = (y2 - y1); double x_diff_padded = (x_diff+10)*padding; double y_diff_padded = (y_diff+10)*padding; - set_zoom(qMin(double(width()) / x_diff_padded, double(height()) / y_diff_padded)); + set_zoom(double(width()) / x_diff_padded, double(height()) / y_diff_padded); - set_scroll_x(qRound((double(x1) - ((x_diff_padded-x_diff)/2))*zoom)); - set_scroll_y(qRound((double(y1) - ((y_diff_padded-y_diff)/2))*zoom)); + set_scroll_x(qRound((double(x1) - ((x_diff_padded-x_diff)/2))*x_zoom)); + set_scroll_y(qRound((double(y1) - ((y_diff_padded-y_diff)/2))*y_zoom)); } void GraphView::draw_line_text(QPainter &p, bool vert, int line_no, int line_pos, int next_line_pos) { @@ -189,7 +191,7 @@ void GraphView::draw_lines(QPainter& p, bool vert) { int scroll = vert ? y_scroll : x_scroll; for (int i=0;iseq->playhead - visible_in)*zoom) - x_scroll); + int playhead_x = qRound((double(panel_sequence_viewer->seq->playhead - visible_in)*x_zoom) - x_scroll); p.drawLine(playhead_x, 0, playhead_x, height()); if (rect_select) { @@ -400,8 +402,8 @@ void GraphView::mousePressEvent(QMouseEvent *event) { break; } else { // selecting a handle - QPointF pre_point(key_x + key.pre_handle_x*zoom, key_y - key.pre_handle_y*zoom); - QPointF post_point(key_x + key.post_handle_x*zoom, key_y - key.post_handle_y*zoom); + QPointF pre_point(key_x + key.pre_handle_x*x_zoom, key_y - key.pre_handle_y*y_zoom); + QPointF post_point(key_x + key.post_handle_x*x_zoom, key_y - key.post_handle_y*y_zoom); if (event->pos().x() > pre_point.x()-BEZIER_HANDLE_SIZE && event->pos().x() < pre_point.x()+BEZIER_HANDLE_SIZE && event->pos().y() > pre_point.y()-BEZIER_HANDLE_SIZE @@ -513,11 +515,11 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { switch (current_handle) { case BEZIER_HANDLE_NONE: for (int i=0;ifield(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].time = qRound(selected_keys_old_vals.at(i) + (double(event->pos().x() - start_x)/zoom)); + row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].time = qRound(selected_keys_old_vals.at(i) + (double(event->pos().x() - start_x)/x_zoom)); if (event->modifiers() & Qt::ShiftModifier) { row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = selected_keys_old_doubles.at(i); } else { - row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = qRound(selected_keys_old_doubles.at(i) + (double(start_y - event->pos().y())/zoom)); + row->field(selected_keys_fields.at(i))->keyframes[selected_keys.at(i)].data = qRound(selected_keys_old_doubles.at(i) + (double(start_y - event->pos().y())/y_zoom)); } } moved_keys = true; @@ -531,8 +533,8 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { double new_post_handle_x = old_post_handle_x; double new_post_handle_y = old_post_handle_y; - double x_diff = double(event->pos().x() - start_x)/zoom; - double y_diff = double(start_y - event->pos().y())/zoom; + double x_diff = double(event->pos().x() - start_x)/x_zoom; + double y_diff = double(start_y - event->pos().y())/y_zoom; if (current_handle == BEZIER_HANDLE_PRE) { new_pre_handle_x += x_diff; @@ -580,14 +582,14 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { KEYFRAME_SIZE+KEYFRAME_SIZE ); QRect pre_rect( - qRound(key_x + key.pre_handle_x*zoom - BEZIER_HANDLE_SIZE), - qRound(key_y + key.pre_handle_y*zoom - BEZIER_HANDLE_SIZE), + qRound(key_x + key.pre_handle_x*x_zoom - BEZIER_HANDLE_SIZE), + qRound(key_y + key.pre_handle_y*y_zoom - BEZIER_HANDLE_SIZE), BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE ); QRect post_rect( - qRound(key_x + key.post_handle_x*zoom - BEZIER_HANDLE_SIZE), - qRound(key_y + key.post_handle_y*zoom - BEZIER_HANDLE_SIZE), + qRound(key_x + key.post_handle_x*x_zoom - BEZIER_HANDLE_SIZE), + qRound(key_y + key.post_handle_y*y_zoom - BEZIER_HANDLE_SIZE), BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE, BEZIER_HANDLE_SIZE+BEZIER_HANDLE_SIZE ); @@ -652,20 +654,20 @@ void GraphView::mouseMoveEvent(QMouseEvent *event) { if (last_key.type == EFFECT_KEYFRAME_BEZIER && key.type == EFFECT_KEYFRAME_BEZIER) { // cubic bezier bezier_path.cubicTo( - QPointF(last_key_x+last_key.post_handle_x*zoom, last_key_y-last_key.post_handle_y*zoom), - QPointF(key_x+key.pre_handle_x*zoom, key_y-key.pre_handle_y*zoom), + QPointF(last_key_x+last_key.post_handle_x*x_zoom, last_key_y-last_key.post_handle_y*y_zoom), + QPointF(key_x+key.pre_handle_x*x_zoom, key_y-key.pre_handle_y*y_zoom), QPointF(key_x, key_y) ); } else if (key.type == EFFECT_KEYFRAME_LINEAR) { // quadratic bezier // last keyframe is the bezier one bezier_path.quadTo( - QPointF(last_key_x+last_key.post_handle_x*zoom, last_key_y-last_key.post_handle_y*zoom), + QPointF(last_key_x+last_key.post_handle_x*x_zoom, last_key_y-last_key.post_handle_y*y_zoom), QPointF(key_x, key_y) ); } else { // this keyframe is the bezier one bezier_path.quadTo( - QPointF(key_x+key.pre_handle_x*zoom, key_y-key.pre_handle_y*zoom), + QPointF(key_x+key.pre_handle_x*x_zoom, key_y-key.pre_handle_y*y_zoom), QPointF(key_x, key_y) ); } @@ -745,18 +747,36 @@ void GraphView::wheelEvent(QWheelEvent *event) { redraw = true; } else { // set zoom - if (event->angleDelta().y() != 0) { - double zoom_diff = (GRAPH_ZOOM_SPEED*zoom); - double new_zoom = (event->angleDelta().y() < 0) ? zoom - zoom_diff : zoom + zoom_diff; + double new_x_zoom = x_zoom; + double new_y_zoom = y_zoom; - // center zoom on screen - set_scroll_x(qRound((double(x_scroll)/zoom*new_zoom) + double(event->pos().x())*new_zoom - double(event->pos().x())*zoom)); - set_scroll_y(qRound((double(y_scroll)/zoom*new_zoom) + double(height()-event->pos().y())*new_zoom - double(height()-event->pos().y())*zoom)); + int y_delta = event->angleDelta().y(); - set_zoom(new_zoom); + // holding CONTROL will zoom horizontal and vertical axes separately + int x_delta = (event->modifiers() & Qt::ControlModifier) ? event->angleDelta().x() : y_delta; - redraw = true; - } + if (y_delta != 0) { + double zoom_diff = (GRAPH_ZOOM_SPEED*y_zoom); + new_y_zoom = (y_delta < 0) ? y_zoom - zoom_diff : y_zoom + zoom_diff; + + // center zoom on screen + set_scroll_y(qRound((double(y_scroll)/y_zoom*new_y_zoom) + double(height()-event->pos().y())*new_y_zoom - double(height()-event->pos().y())*y_zoom)); + + redraw = true; + } + + if (x_delta != 0) { + double zoom_diff = (GRAPH_ZOOM_SPEED*x_zoom); + new_x_zoom = (x_delta < 0) ? x_zoom - zoom_diff : x_zoom + zoom_diff; + + set_scroll_x(qRound((double(x_scroll)/x_zoom*new_x_zoom) + double(event->pos().x())*new_x_zoom - double(event->pos().x())*x_zoom)); + + redraw = true; + } + + if (redraw) { + set_zoom(new_x_zoom, new_y_zoom); + } } if (redraw) { @@ -837,24 +857,25 @@ void GraphView::set_scroll_y(int s) { emit y_scroll_changed(y_scroll); } -void GraphView::set_zoom(double z) { - zoom = z; - emit zoom_changed(zoom); +void GraphView::set_zoom(double xz, double yz) { + x_zoom = xz; + y_zoom = yz; + emit zoom_changed(x_zoom, y_zoom); } int GraphView::get_screen_x(double d) { if (row != nullptr) { d -= row->parent_effect->parent_clip->clip_in; } - return qRound((d*zoom) - x_scroll); + return qRound((d*x_zoom) - x_scroll); } int GraphView::get_screen_y(double d) { - return qRound(height() + y_scroll - d*zoom); + return qRound(height() + y_scroll - d*y_zoom); } long GraphView::get_value_x(int i) { - long frame = qRound((i + x_scroll)/zoom); + long frame = qRound((i + x_scroll)/x_zoom); if (row != nullptr) { frame += row->parent_effect->parent_clip->clip_in; } @@ -862,7 +883,7 @@ long GraphView::get_value_x(int i) { } double GraphView::get_value_y(int i) { - return double(height() + y_scroll - i)/zoom; + return double(height() + y_scroll - i)/y_zoom; } void GraphView::selection_update() { diff --git a/ui/graphview.h b/ui/graphview.h index 02dc27216..19247a2a1 100644 --- a/ui/graphview.h +++ b/ui/graphview.h @@ -50,7 +50,7 @@ public: signals: void x_scroll_changed(int); void y_scroll_changed(int); - void zoom_changed(double); + void zoom_changed(double, double); void selection_changed(bool, int); private: int x_scroll; @@ -58,11 +58,13 @@ private: bool mousedown; int start_x; int start_y; - double zoom; + + double x_zoom; + double y_zoom; void set_scroll_x(int s); void set_scroll_y(int s); - void set_zoom(double z); + void set_zoom(double xz, double yz); int get_screen_x(double); int get_screen_y(double); From 6bccd0c6607af6d3a135f0db84915a64e98a08f0 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 16 Feb 2019 02:18:32 -0800 Subject: [PATCH 196/202] minor cleanup and documentation of render functions --- Doxyfile | 3 +- docs/html/aboutdialog_8h_source.html | 2 +- docs/html/actionsearch_8h_source.html | 6 +- docs/html/advancedvideodialog_8h_source.html | 4 +- docs/html/annotated.html | 267 ++++++------ docs/html/audio_8h_source.html | 4 +- docs/html/audiomonitor_8h_source.html | 2 +- docs/html/audionoiseeffect_8h_source.html | 10 +- docs/html/cacher_8h_source.html | 4 +- docs/html/checkboxex_8h_source.html | 2 +- docs/html/class_clickable_label.html | 10 +- docs/html/class_graph_view-members.html | 11 +- docs/html/class_graph_view.html | 21 +- .../class_preferences_dialog-members.html | 69 ++-- docs/html/class_preferences_dialog.html | 3 + docs/html/class_timeline-members.html | 74 ++-- docs/html/class_timeline.html | 18 +- docs/html/classes.html | 98 +++-- docs/html/clickablelabel_8h_source.html | 2 +- docs/html/clip_8h_source.html | 18 +- docs/html/clipboard_8h_source.html | 2 +- docs/html/collapsiblewidget_8h_source.html | 6 +- docs/html/colorbutton_8h_source.html | 4 +- docs/html/comboboxex_8h_source.html | 2 +- docs/html/config_8h_source.html | 4 +- docs/html/cornerpineffect_8h_source.html | 14 +- .../crossdissolvetransition_8h_source.html | 10 +- docs/html/crossplatformlib_8h_source.html | 2 +- docs/html/cubetransition_8h_source.html | 10 +- docs/html/cursors_8h_source.html | 2 +- docs/html/debug_8h_source.html | 2 +- docs/html/debugdialog_8h_source.html | 2 +- docs/html/demonotice_8h_source.html | 2 +- docs/html/effect_8h_source.html | 18 +- docs/html/effectcontrols_8h_source.html | 14 +- docs/html/effectfield_8h_source.html | 6 +- docs/html/effectgizmo_8h_source.html | 4 +- docs/html/effectloaders_8h_source.html | 2 +- docs/html/effectrow_8h_source.html | 12 +- docs/html/embeddedfilechooser_8h_source.html | 2 +- .../exponentialfadetransition_8h_source.html | 8 +- docs/html/exportdialog_8h_source.html | 8 +- docs/html/exportthread_8h_source.html | 8 +- docs/html/files.html | 195 +++++---- docs/html/fillleftrighteffect_8h_source.html | 10 +- docs/html/focusfilter_8h_source.html | 54 +-- docs/html/fontcombobox_8h_source.html | 4 +- docs/html/footage_8h_source.html | 12 +- docs/html/frei0reffect_8h_source.html | 8 +- docs/html/functions.html | 55 +++ docs/html/functions_vars.html | 51 +++ docs/html/grapheditor_8h_source.html | 12 +- docs/html/graphview_8h_source.html | 6 +- docs/html/hierarchy.html | 367 +++++++++-------- docs/html/keyframe_8h_source.html | 4 +- docs/html/keyframedrawing_8h_source.html | 2 +- docs/html/keyframenavigator_8h_source.html | 2 +- docs/html/keyframeview_8h_source.html | 12 +- docs/html/labelslider_8h_source.html | 34 +- docs/html/linearfadetransition_8h_source.html | 8 +- docs/html/loaddialog_8h_source.html | 10 +- docs/html/loadthread_8h_source.html | 16 +- .../logarithmicfadetransition_8h_source.html | 8 +- docs/html/mainwindow_8h_source.html | 46 +-- docs/html/marker_8h_source.html | 4 +- docs/html/math_8h_source.html | 2 +- docs/html/md__i_s_s_u_e__t_e_m_p_l_a_t_e.html | 94 +++++ docs/html/media_8h_source.html | 8 +- .../html/mediapropertiesdialog_8h_source.html | 6 +- docs/html/menudata.js | 1 + docs/html/menuhelper_8h_source.html | 28 +- docs/html/newsequencedialog_8h_source.html | 8 +- docs/html/oliveglobal_8h_source.html | 62 +-- docs/html/pages.html | 3 +- docs/html/paneffect_8h_source.html | 10 +- docs/html/panels_8h_source.html | 10 +- docs/html/path_8h_source.html | 2 +- docs/html/playback_8h_source.html | 4 +- docs/html/preferencesdialog_8h_source.html | 4 +- docs/html/previewgenerator_8h_source.html | 8 +- docs/html/project_8h_source.html | 28 +- docs/html/projectelements_8h_source.html | 2 +- docs/html/projectfilter_8h_source.html | 2 +- docs/html/projectmodel_8h_source.html | 4 +- docs/html/proxydialog_8h_source.html | 4 +- docs/html/proxygenerator_8h_source.html | 6 +- docs/html/qpainterwrapper_8h_source.html | 2 +- docs/html/rectangleselect_8h_source.html | 2 +- docs/html/renderfunctions_8h_source.html | 27 +- docs/html/renderthread_8h_source.html | 6 +- .../replaceclipmediadialog_8h_source.html | 6 +- docs/html/resizablescrollbar_8h_source.html | 2 +- docs/html/scrollarea_8h_source.html | 2 +- docs/html/search/all_10.js | 65 +-- docs/html/search/all_11.js | 69 +++- docs/html/search/all_12.js | 21 +- docs/html/search/all_13.js | 18 +- docs/html/search/all_14.js | 15 +- docs/html/search/all_15.js | 3 +- docs/html/search/all_16.html | 30 ++ docs/html/search/all_16.js | 5 + docs/html/search/all_2.js | 35 +- docs/html/search/all_3.js | 40 +- docs/html/search/all_4.js | 29 +- docs/html/search/all_5.js | 29 +- docs/html/search/all_6.js | 21 +- docs/html/search/all_7.js | 15 +- docs/html/search/all_8.js | 9 +- docs/html/search/all_9.js | 14 +- docs/html/search/all_a.js | 27 +- docs/html/search/all_b.js | 24 +- docs/html/search/all_c.js | 20 +- docs/html/search/all_d.js | 34 +- docs/html/search/all_e.js | 22 +- docs/html/search/all_f.js | 14 +- docs/html/search/classes_2.js | 1 - docs/html/search/pages_0.js | 2 +- docs/html/search/pages_1.html | 30 ++ docs/html/search/pages_1.js | 4 + docs/html/search/searchdata.js | 6 +- docs/html/search/variables_1.js | 6 +- docs/html/search/variables_2.js | 2 +- docs/html/search/variables_3.js | 2 +- docs/html/search/variables_4.js | 2 +- docs/html/search/variables_5.js | 2 +- docs/html/search/variables_6.html | 30 ++ docs/html/search/variables_6.js | 5 + docs/html/search/variables_7.html | 30 ++ docs/html/search/variables_7.js | 4 + docs/html/search/variables_8.html | 30 ++ docs/html/search/variables_8.js | 4 + docs/html/search/variables_9.html | 30 ++ docs/html/search/variables_9.js | 6 + docs/html/search/variables_a.html | 30 ++ docs/html/search/variables_a.js | 6 + docs/html/search/variables_b.html | 30 ++ docs/html/search/variables_b.js | 4 + docs/html/search/variables_c.html | 30 ++ docs/html/search/variables_c.js | 5 + docs/html/selection_8h_source.html | 2 +- docs/html/sequence_8h_source.html | 8 +- docs/html/shakeeffect_8h_source.html | 12 +- docs/html/solideffect_8h_source.html | 10 +- docs/html/sourceiconview_8h_source.html | 4 +- docs/html/sourcescommon_8h_source.html | 8 +- docs/html/sourcetable_8h_source.html | 6 +- docs/html/speeddialog_8h_source.html | 6 +- docs/html/stabilizerdialog_8h_source.html | 4 +- ...truct_compose_sequence_params-members.html | 35 +- docs/html/struct_compose_sequence_params.html | 382 ++++++++++++++++-- docs/html/struct_config-members.html | 91 ++--- docs/html/struct_config.html | 3 + docs/html/texteditdialog_8h_source.html | 2 +- docs/html/texteditex_8h_source.html | 2 +- docs/html/texteffect_8h_source.html | 10 +- docs/html/timecodeeffect_8h_source.html | 10 +- docs/html/timeline_8h_source.html | 36 +- docs/html/timelineheader_8h_source.html | 4 +- docs/html/timelinetools_8h_source.html | 2 +- docs/html/timelinewidget_8h_source.html | 14 +- docs/html/toneeffect_8h_source.html | 10 +- docs/html/transformeffect_8h_source.html | 14 +- docs/html/transition_8h_source.html | 10 +- docs/html/undo_8h_source.html | 130 +++--- docs/html/viewer_8h_source.html | 18 +- docs/html/viewercontainer_8h_source.html | 6 +- docs/html/viewerwidget_8h_source.html | 20 +- docs/html/viewerwindow_8h_source.html | 2 +- docs/html/voideffect_8h_source.html | 8 +- docs/html/volumeeffect_8h_source.html | 10 +- docs/html/vsthost_8h_source.html | 10 +- io/exportthread.cpp | 11 +- ui/renderfunctions.cpp | 36 +- ui/renderfunctions.h | 207 +++++++++- ui/renderthread.cpp | 5 +- ui/timelinewidget.cpp | 8 +- ui/viewerwidget.cpp | 8 +- 177 files changed, 2562 insertions(+), 1497 deletions(-) create mode 100644 docs/html/md__i_s_s_u_e__t_e_m_p_l_a_t_e.html create mode 100644 docs/html/search/all_16.html create mode 100644 docs/html/search/all_16.js create mode 100644 docs/html/search/pages_1.html create mode 100644 docs/html/search/pages_1.js create mode 100644 docs/html/search/variables_6.html create mode 100644 docs/html/search/variables_6.js create mode 100644 docs/html/search/variables_7.html create mode 100644 docs/html/search/variables_7.js create mode 100644 docs/html/search/variables_8.html create mode 100644 docs/html/search/variables_8.js create mode 100644 docs/html/search/variables_9.html create mode 100644 docs/html/search/variables_9.js create mode 100644 docs/html/search/variables_a.html create mode 100644 docs/html/search/variables_a.js create mode 100644 docs/html/search/variables_b.html create mode 100644 docs/html/search/variables_b.js create mode 100644 docs/html/search/variables_c.html create mode 100644 docs/html/search/variables_c.js diff --git a/Doxyfile b/Doxyfile index 132db714e..bddbd4e1c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -897,7 +897,8 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = docs\ + .git # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/docs/html/aboutdialog_8h_source.html b/docs/html/aboutdialog_8h_source.html index 9fb075a5f..1311a3b4b 100644 --- a/docs/html/aboutdialog_8h_source.html +++ b/docs/html/aboutdialog_8h_source.html @@ -69,7 +69,7 @@ $(function() {
    aboutdialog.h
    -
    1 #ifndef ABOUTDIALOG_H
    2 #define ABOUTDIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 class AboutDialog : public QDialog
    7 {
    8  Q_OBJECT
    9 
    10 public:
    11  explicit AboutDialog(QWidget *parent = 0);
    12 };
    13 
    14 #endif // ABOUTDIALOG_H
    Definition: aboutdialog.h:6
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef ABOUTDIALOG_H
    22 #define ABOUTDIALOG_H
    23 
    24 #include <QDialog>
    25 
    26 class AboutDialog : public QDialog
    27 {
    28  Q_OBJECT
    29 
    30 public:
    31  explicit AboutDialog(QWidget *parent = 0);
    32 };
    33 
    34 #endif // ABOUTDIALOG_H
    Definition: aboutdialog.h:26
    -
    1 #ifndef ACTIONSEARCH_H
    2 #define ACTIONSEARCH_H
    3 
    4 #include <QDialog>
    5 #include <QLineEdit>
    6 #include <QListWidget>
    7 
    8 class QListWidget;
    9 class QMenu;
    10 
    11 class ActionSearchList : public QListWidget {
    12  Q_OBJECT
    13 public:
    14  ActionSearchList(QWidget* parent);
    15 protected:
    16  void mouseDoubleClickEvent(QMouseEvent *event);
    17 signals:
    18  void dbl_click();
    19 };
    20 
    21 class ActionSearch : public QDialog
    22 {
    23  Q_OBJECT
    24 public:
    25  ActionSearch(QWidget* parent = nullptr);
    26 private slots:
    27  void search_update(const QString& s, const QString &p = nullptr, QMenu *parent = nullptr);
    28  void perform_action();
    29  void move_selection_up();
    30  void move_selection_down();
    31 private:
    32  ActionSearchList* list_widget;
    33 };
    34 
    35 class ActionSearchEntry : public QLineEdit {
    36  Q_OBJECT
    37 public:
    38  ActionSearchEntry(QWidget* parent);
    39 protected:
    40  void keyPressEvent(QKeyEvent * event);
    41 signals:
    42  void moveSelectionUp();
    43  void moveSelectionDown();
    44 };
    45 
    46 #endif // ACTIONSEARCH_H
    Definition: actionsearch.h:11
    -
    Definition: actionsearch.h:21
    -
    Definition: actionsearch.h:35
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef ACTIONSEARCH_H
    22 #define ACTIONSEARCH_H
    23 
    24 #include <QDialog>
    25 #include <QLineEdit>
    26 #include <QListWidget>
    27 
    28 class QListWidget;
    29 class QMenu;
    30 
    31 class ActionSearchList : public QListWidget {
    32  Q_OBJECT
    33 public:
    34  ActionSearchList(QWidget* parent);
    35 protected:
    36  void mouseDoubleClickEvent(QMouseEvent *event);
    37 signals:
    38  void dbl_click();
    39 };
    40 
    41 class ActionSearch : public QDialog
    42 {
    43  Q_OBJECT
    44 public:
    45  ActionSearch(QWidget* parent = nullptr);
    46 private slots:
    47  void search_update(const QString& s, const QString &p = nullptr, QMenu *parent = nullptr);
    48  void perform_action();
    49  void move_selection_up();
    50  void move_selection_down();
    51 private:
    52  ActionSearchList* list_widget;
    53 };
    54 
    55 class ActionSearchEntry : public QLineEdit {
    56  Q_OBJECT
    57 public:
    58  ActionSearchEntry(QWidget* parent);
    59 protected:
    60  void keyPressEvent(QKeyEvent * event);
    61 signals:
    62  void moveSelectionUp();
    63  void moveSelectionDown();
    64 };
    65 
    66 #endif // ACTIONSEARCH_H
    Definition: actionsearch.h:31
    +
    Definition: actionsearch.h:41
    +
    Definition: actionsearch.h:55
    -
    1 #ifndef ADVANCEDVIDEODIALOG_H
    2 #define ADVANCEDVIDEODIALOG_H
    3 
    4 #include <QDialog>
    5 
    6 #include "io/exportthread.h"
    7 
    8 class QComboBox;
    9 
    10 class AdvancedVideoDialog : public QDialog {
    11  Q_OBJECT
    12 public:
    13  AdvancedVideoDialog(QWidget* parent,
    14  int encoding_codec,
    15  VideoCodecParams& iparams);
    16 
    17 public slots:
    18  virtual void accept() override;
    19 private:
    20  VideoCodecParams& params;
    21 
    22  QComboBox* pix_fmt_combo;
    23 };
    24 
    25 #endif // ADVANCEDVIDEODIALOG_H
    Definition: advancedvideodialog.h:10
    -
    Definition: exportthread.h:48
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef ADVANCEDVIDEODIALOG_H
    22 #define ADVANCEDVIDEODIALOG_H
    23 
    24 #include <QDialog>
    25 
    26 #include "io/exportthread.h"
    27 
    28 class QComboBox;
    29 
    30 class AdvancedVideoDialog : public QDialog {
    31  Q_OBJECT
    32 public:
    33  AdvancedVideoDialog(QWidget* parent,
    34  int encoding_codec,
    35  VideoCodecParams& iparams);
    36 
    37 public slots:
    38  virtual void accept() override;
    39 private:
    40  VideoCodecParams& params;
    41 
    42  QComboBox* pix_fmt_combo;
    43 };
    44 
    45 #endif // ADVANCEDVIDEODIALOG_H
    Definition: advancedvideodialog.h:30
    +
    Definition: exportthread.h:68
    diff --git a/docs/html/audio_8h_source.html b/docs/html/audio_8h_source.html index 0322aeb92..5a9a4395f 100644 --- a/docs/html/audio_8h_source.html +++ b/docs/html/audio_8h_source.html @@ -69,8 +69,8 @@ $(function() {
    audio.h
    -
    1 #ifndef AUDIO_H
    2 #define AUDIO_H
    3 
    4 #include <QVector>
    5 #include <QThread>
    6 #include <QWaitCondition>
    7 #include <QMutex>
    8 
    9 //#define INT16_MAX 0x7fff
    10 //#define INT16_MIN (-INT16_MAX-1)
    11 
    12 class QIODevice;
    13 class QAudioOutput;
    14 class QComboBox;
    15 
    16 struct Sequence;
    17 
    18 class AudioSenderThread : public QThread {
    19  Q_OBJECT
    20 public:
    22  void run();
    23  void stop();
    24  QWaitCondition cond;
    25  bool close;
    26  QMutex lock;
    27 public slots:
    28  void notifyReceiver();
    29 private:
    30  QVector<qint16> samples;
    31  int send_audio_to_output(qint64 offset, int max);
    32 };
    33 
    34 double log_volume(double linear);
    35 
    36 extern QAudioOutput* audio_output;
    37 extern QIODevice* audio_io_device;
    38 extern AudioSenderThread* audio_thread;
    39 extern QMutex audio_write_lock;
    40 
    41 #define audio_ibuffer_size 192000
    42 extern qint8 audio_ibuffer[audio_ibuffer_size];
    43 extern qint64 audio_ibuffer_read;
    44 extern long audio_ibuffer_frame;
    45 extern double audio_ibuffer_timecode;
    46 extern bool audio_scrub;
    47 extern bool recording;
    48 extern bool audio_rendering;
    49 void clear_audio_ibuffer();
    50 
    51 int current_audio_freq();
    52 
    53 bool is_audio_device_set();
    54 
    55 void init_audio();
    56 void stop_audio();
    57 qint64 get_buffer_offset_from_frame(double framerate, long frame);
    58 
    59 bool start_recording();
    60 void stop_recording();
    61 QString get_recorded_audio_filename();
    62 
    63 void combobox_audio_sample_rates(QComboBox* combobox);
    64 
    65 #endif // AUDIO_H
    Definition: sequence.h:13
    -
    Definition: audio.h:18
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef AUDIO_H
    22 #define AUDIO_H
    23 
    24 #include <QVector>
    25 #include <QThread>
    26 #include <QWaitCondition>
    27 #include <QMutex>
    28 
    29 //#define INT16_MAX 0x7fff
    30 //#define INT16_MIN (-INT16_MAX-1)
    31 
    32 class QIODevice;
    33 class QAudioOutput;
    34 class QComboBox;
    35 
    36 struct Sequence;
    37 
    38 class AudioSenderThread : public QThread {
    39  Q_OBJECT
    40 public:
    42  void run();
    43  void stop();
    44  QWaitCondition cond;
    45  bool close;
    46  QMutex lock;
    47 public slots:
    48  void notifyReceiver();
    49 private:
    50  QVector<qint16> samples;
    51  int send_audio_to_output(qint64 offset, int max);
    52 };
    53 
    54 double log_volume(double linear);
    55 
    56 extern QAudioOutput* audio_output;
    57 extern QIODevice* audio_io_device;
    58 extern AudioSenderThread* audio_thread;
    59 extern QMutex audio_write_lock;
    60 
    61 #define audio_ibuffer_size 192000
    62 extern qint8 audio_ibuffer[audio_ibuffer_size];
    63 extern qint64 audio_ibuffer_read;
    64 extern long audio_ibuffer_frame;
    65 extern double audio_ibuffer_timecode;
    66 extern bool audio_scrub;
    67 extern bool recording;
    68 extern bool audio_rendering;
    69 void clear_audio_ibuffer();
    70 
    71 int current_audio_freq();
    72 
    73 bool is_audio_device_set();
    74 
    75 void init_audio();
    76 void stop_audio();
    77 qint64 get_buffer_offset_from_frame(double framerate, long frame);
    78 
    79 bool start_recording();
    80 void stop_recording();
    81 QString get_recorded_audio_filename();
    82 
    83 void combobox_audio_sample_rates(QComboBox* combobox);
    84 
    85 #endif // AUDIO_H
    Definition: sequence.h:33
    +
    Definition: audio.h:38
    -
    1 #ifndef AUDIOMONITOR_H
    2 #define AUDIOMONITOR_H
    3 
    4 #include <QWidget>
    5 #include <QTimer>
    6 
    7 class AudioMonitor : public QWidget
    8 {
    9  Q_OBJECT
    10 public:
    11  explicit AudioMonitor(QWidget *parent = 0);
    12  void set_value(const QVector<double>& values);
    13 
    14 protected:
    15  void paintEvent(QPaintEvent *);
    16  void resizeEvent(QResizeEvent *);
    17 
    18 signals:
    19 
    20 public slots:
    21 
    22 private:
    23  QLinearGradient gradient;
    24  QVector<double> values;
    25  QTimer clear_timer;
    26 
    27 private slots:
    28  void clear();
    29 };
    30 
    31 #endif // AUDIOMONITOR_H
    Definition: audiomonitor.h:7
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef AUDIOMONITOR_H
    22 #define AUDIOMONITOR_H
    23 
    24 #include <QWidget>
    25 #include <QTimer>
    26 
    27 class AudioMonitor : public QWidget
    28 {
    29  Q_OBJECT
    30 public:
    31  explicit AudioMonitor(QWidget *parent = 0);
    32  void set_value(const QVector<double>& values);
    33 
    34 protected:
    35  void paintEvent(QPaintEvent *);
    36  void resizeEvent(QResizeEvent *);
    37 
    38 signals:
    39 
    40 public slots:
    41 
    42 private:
    43  QLinearGradient gradient;
    44  QVector<double> values;
    45  QTimer clear_timer;
    46 
    47 private slots:
    48  void clear();
    49 };
    50 
    51 #endif // AUDIOMONITOR_H
    Definition: audiomonitor.h:27
    -
    1 #ifndef AUDIONOISEEFFECT_H
    2 #define AUDIONOISEEFFECT_H
    3 
    4 #include "project/effect.h"
    5 
    6 class AudioNoiseEffect : public Effect {
    7  Q_OBJECT
    8 public:
    9  AudioNoiseEffect(Clip* c, const EffectMeta* em);
    10  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    11 
    12  EffectField* amount_val;
    13  EffectField* mix_val;
    14 };
    15 
    16 #endif // AUDIONOISEEFFECT_H
    Definition: effect.h:146
    -
    Definition: effect.h:27
    -
    Definition: audionoiseeffect.h:6
    -
    Definition: clip.h:33
    -
    Definition: effectfield.h:23
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef AUDIONOISEEFFECT_H
    22 #define AUDIONOISEEFFECT_H
    23 
    24 #include "project/effect.h"
    25 
    26 class AudioNoiseEffect : public Effect {
    27  Q_OBJECT
    28 public:
    29  AudioNoiseEffect(Clip* c, const EffectMeta* em);
    30  void process_audio(double timecode_start, double timecode_end, quint8* samples, int nb_bytes, int channel_count);
    31 
    32  EffectField* amount_val;
    33  EffectField* mix_val;
    34 };
    35 
    36 #endif // AUDIONOISEEFFECT_H
    Definition: effect.h:166
    +
    Definition: effect.h:47
    +
    Definition: audionoiseeffect.h:26
    +
    Definition: clip.h:53
    +
    Definition: effectfield.h:43
    -
    1 #ifndef CACHER_H
    2 #define CACHER_H
    3 
    4 #include <QThread>
    5 #include <QVector>
    6 
    7 class Clip;
    8 
    9 class Cacher : public QThread
    10 {
    11 // Q_OBJECT
    12 public:
    13  Cacher(Clip* c);
    14  void run();
    15 
    16  bool caching;
    17 
    18  // must be set before caching
    19  long playhead;
    20  bool reset;
    21  bool scrubbing;
    22  bool interrupt;
    23  bool queued;
    24  int playback_speed;
    25  QVector<Clip*> nests;
    26 
    27 private:
    28  Clip* clip;
    29 };
    30 
    31 void open_clip_worker(Clip* clip);
    32 void cache_clip_worker(Clip* clip, long playhead, bool reset, bool scrubbing, QVector<Clip *> nest, int playback_speed);
    33 void close_clip_worker(Clip* clip);
    34 
    35 #endif // CACHER_H
    Definition: cacher.h:9
    -
    Definition: clip.h:33
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef CACHER_H
    22 #define CACHER_H
    23 
    24 #include <QThread>
    25 #include <QVector>
    26 
    27 class Clip;
    28 
    29 class Cacher : public QThread
    30 {
    31 // Q_OBJECT
    32 public:
    33  Cacher(Clip* c);
    34  void run();
    35 
    36  bool caching;
    37 
    38  // must be set before caching
    39  long playhead;
    40  bool reset;
    41  bool scrubbing;
    42  bool interrupt;
    43  bool queued;
    44  int playback_speed;
    45  QVector<Clip*> nests;
    46 
    47 private:
    48  Clip* clip;
    49 };
    50 
    51 void open_clip_worker(Clip* clip);
    52 void cache_clip_worker(Clip* clip, long playhead, bool reset, bool scrubbing, QVector<Clip *> nest, int playback_speed);
    53 void close_clip_worker(Clip* clip);
    54 
    55 #endif // CACHER_H
    Definition: cacher.h:29
    +
    Definition: clip.h:53
    -
    1 #ifndef CHECKBOXEX_H
    2 #define CHECKBOXEX_H
    3 
    4 #include <QCheckBox>
    5 
    6 class CheckboxEx : public QCheckBox
    7 {
    8  Q_OBJECT
    9 public:
    10  CheckboxEx(QWidget* parent = 0);
    11 private slots:
    12  void checkbox_command();
    13 };
    14 
    15 #endif // CHECKBOXEX_H
    Definition: checkboxex.h:6
    +
    1 /***
    2 
    3  Olive - Non-Linear Video Editor
    4  Copyright (C) 2019 Olive Team
    5 
    6  This program is free software: you can redistribute it and/or modify
    7  it under the terms of the GNU General Public License as published by
    8  the Free Software Foundation, either version 3 of the License, or
    9  (at your option) any later version.
    10 
    11  This program is distributed in the hope that it will be useful,
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    14  GNU General Public License for more details.
    15 
    16  You should have received a copy of the GNU General Public License
    17  along with this program. If not, see <http://www.gnu.org/licenses/>.
    18 
    19 ***/
    20 
    21 #ifndef CHECKBOXEX_H
    22 #define CHECKBOXEX_H
    23 
    24 #include <QCheckBox>
    25 
    26 class CheckboxEx : public QCheckBox
    27 {
    28  Q_OBJECT
    29 public:
    30  CheckboxEx(QWidget* parent = 0);
    31 private slots:
    32  void checkbox_command();
    33 };
    34 
    35 #endif // CHECKBOXEX_H
    Definition: checkboxex.h:26
    + +

    The ClickableLabel class. + More...

    + +

    #include <clickablelabel.h>

    Inheritance diagram for ClickableLabel:
    @@ -94,7 +99,10 @@ Public Member Functions void mousePressEvent (QMouseEvent *ev)   -
    The documentation for this class was generated from the following files: