diff --git a/io/loadthread.cpp b/io/loadthread.cpp index 8130fdd18..f68ea51ea 100644 --- a/io/loadthread.cpp +++ b/io/loadthread.cpp @@ -44,16 +44,19 @@ LoadThread::LoadThread(const QString& filename, bool autorecovery, bool clear) : cancelled_(false) { connect(this, SIGNAL(finished()), this, SLOT(deleteLater())); - connect(this, SIGNAL(success()), this, SLOT(success_func())); - connect(this, SIGNAL(error()), this, SLOT(error_func())); + + connect(this, SIGNAL(success()), this, SLOT(success_func()), Qt::QueuedConnection); + connect(this, SIGNAL(error()), this, SLOT(error_func()), Qt::QueuedConnection); connect(this, SIGNAL(start_create_effect_ui(QXmlStreamReader*, Clip*, int, const QString*, const EffectMeta*, long, bool)), this, - SLOT(create_effect_ui(QXmlStreamReader*, Clip*, int, const QString*, const EffectMeta*, long, bool))); + SLOT(create_effect_ui(QXmlStreamReader*, Clip*, int, const QString*, const EffectMeta*, long, bool)), + Qt::QueuedConnection); connect(this, SIGNAL(start_question(const QString&, const QString &, int)), this, - SLOT(question_func(const QString &, const QString &, int))); + SLOT(question_func(const QString &, const QString &, int)), + Qt::QueuedConnection); } void LoadThread::load_effect(QXmlStreamReader& stream, Clip* c) { @@ -337,7 +340,7 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) { case MEDIA_TYPE_SEQUENCE: { Media* parent = nullptr; - SequencePtr s(new Sequence()); + SequencePtr s = std::make_shared(); // load attributes about sequence for (int j=0;jset_sequence(open_seq); } - update_ui(false); } void LoadThread::create_effect_ui( diff --git a/panels/project.cpp b/panels/project.cpp index 891b2f31d..9b66494d4 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -434,7 +434,7 @@ Media* Project::create_sequence_internal(ComboAction *ca, SequencePtr s, bool op parent = olive::project_model.get_root(); } - Media* item(new Media(parent)); + Media* item = new Media(parent); item->set_sequence(s); if (ca != nullptr) { diff --git a/project/media.cpp b/project/media.cpp index fd6c265c2..86278963e 100644 --- a/project/media.cpp +++ b/project/media.cpp @@ -86,7 +86,8 @@ void Media::set_footage(FootagePtr f) { } void Media::set_sequence(SequencePtr s) { - set_icon(QIcon(":/icons/sequence.svg")); + // ensure icon setting occurs in a separate thread + set_icon(":/icons/sequence.svg"); type = MEDIA_TYPE_SEQUENCE; object = VoidPtr(s); if (s != nullptr) update_tooltip(); @@ -94,11 +95,16 @@ void Media::set_sequence(SequencePtr s) { void Media::set_folder() { if (folder_name.isEmpty()) folder_name = QCoreApplication::translate("Media", "New Folder"); - set_icon(QIcon(":/icons/folder.svg")); + set_icon(":/icons/folder.svg"); type = MEDIA_TYPE_FOLDER; object = nullptr; } +void Media::set_icon(const QString &str) +{ + set_icon(QIcon(str)); +} + void Media::set_icon(const QIcon &ico) { icon = ico; } diff --git a/project/media.h b/project/media.h index 0328d9ef8..014aab03a 100644 --- a/project/media.h +++ b/project/media.h @@ -46,12 +46,13 @@ public: ~Media(); FootagePtr to_footage(); SequencePtr to_sequence(); + void set_icon(const QString& str); + void set_icon(const QIcon &ico); void set_footage(FootagePtr f); void set_sequence(SequencePtr s); void set_folder(); - void set_icon(const QIcon &ico); void set_parent(Media* p); - void update_tooltip(const QString& error = 0); + void update_tooltip(const QString& error = nullptr); VoidPtr to_object(); int get_type(); const QString& get_name(); @@ -77,6 +78,7 @@ public: bool root; int temp_id; int temp_id2; + private: int type; VoidPtr object; diff --git a/project/projectmodel.cpp b/project/projectmodel.cpp index 35fbb9633..1415e0065 100644 --- a/project/projectmodel.cpp +++ b/project/projectmodel.cpp @@ -165,7 +165,6 @@ void ProjectModel::set_icon(Media* m, const QIcon &ico) { QModelIndex index = createIndex(m->row(), 0, m); m->set_icon(ico); emit dataChanged(index, index); - } void ProjectModel::appendChild(Media *parent, Media *child) { diff --git a/ui/focusfilter.cpp b/ui/focusfilter.cpp index 4dfed52a7..ae280ad04 100644 --- a/ui/focusfilter.cpp +++ b/ui/focusfilter.cpp @@ -29,245 +29,245 @@ 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(); - } + 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(); - } + 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(); - } + 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(); - } + 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); - } + 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(); - } + 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(); - } + 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::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(); - } + 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 (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(); - } + 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) { - panel_footage_viewer->toggle_play(); - } else { - panel_sequence_viewer->toggle_play(); - } + 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(); - } + 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(); - } + 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(); - } + QDockWidget* focused_panel = get_focused_panel(); + if (focused_panel == panel_footage_viewer) { + panel_footage_viewer->decrease_speed(); + } else { + 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(); - } + 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(); - } + 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(); - } + 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(); - } + 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(); - } + 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); - } + 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(); - } + 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(); - } + 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->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->zoom_in(); + } } 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->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->zoom_out(); + } } 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); - } + 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); - } + 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 c907532c4..645553860 100644 --- a/ui/focusfilter.h +++ b/ui/focusfilter.h @@ -35,197 +35,197 @@ * **TRUE**, the focused panel will be whichever panel has the cursor currently hovering over it. */ class FocusFilter : public QObject { - Q_OBJECT + Q_OBJECT public: - /** + /** * @brief FocusFilter Constructor * * Currently empty. */ - FocusFilter(); + 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(); + 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(); + void copy(); - /** + /** * @brief Duplicates currently selected items * * Currently this only duplicates Sequences in the project panel. */ - void duplicate(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + void playpause(); - /** + /** * @brief Pause/Shuttle Stop. * * Calls pause() on Media Viewer it's focused. Otherwise calls it on Sequence Viewer. */ - void pause(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + 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(); + void delete_function(); - /** + /** * @brief Select All * * Calls select_all() on Graph Editor if its focused or Timeline if it's not. */ - void select_all(); + 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(); + 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(); + void zoom_out(); }; namespace olive { - extern FocusFilter FocusFilter; +extern FocusFilter FocusFilter; } #endif // FOCUSFILTER_H diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 50fdc8215..4b14606cb 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1836,7 +1836,11 @@ void TimelineWidget::update_ghosts(const QPoint& mouse_pos, bool lock_frame) { } } } - if (temp_frame_diff != frame_diff) panel_timeline->snapped = false; + + // if the above validation changed the frame movement, it's unlikely we're still snapped + if (temp_frame_diff != frame_diff) { + panel_timeline->snapped = false; + } // apply changes to ghosts for (int i=0;ighosts.size();i++) {