diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index e948da348..71aa33deb 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -25,7 +25,6 @@ #include #endif -#include #include "config/config.h" diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index 7d672f0fd..61a244e3f 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include "common/oiioutils.h" #include "render/renderer.h" diff --git a/app/common/crashpadinterface.cpp b/app/common/crashpadinterface.cpp index c7b43e0a2..8bca8e396 100644 --- a/app/common/crashpadinterface.cpp +++ b/app/common/crashpadinterface.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include "crashpadutils.h" diff --git a/app/common/dropworkflowbehavior.h b/app/common/dropworkflowbehavior.h new file mode 100644 index 000000000..92a0ce3b1 --- /dev/null +++ b/app/common/dropworkflowbehavior.h @@ -0,0 +1,43 @@ +/*** + + Oak - Non-Linear Video Editor + Copyright (C) 2026 Oak 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 OAK_DROPWORKFLOWBEHAVIOR_H +#define OAK_DROPWORKFLOWBEHAVIOR_H + +namespace olive +{ + +/** + * @brief Behavior when media is dropped onto a timeline without a sequence + * + * Shared by the config defaults (engine layer) and the timeline import + * tool (UI layer). Enumerator order matches the previous + * ImportTool::DropWithoutSequenceBehavior. + */ +enum DropWithoutSequenceBehavior { + k_dws_ask, + k_dws_auto, + k_dws_manual, + k_dws_disable +}; + +} + +#endif // OAK_DROPWORKFLOWBEHAVIOR_H diff --git a/app/config/config.cpp b/app/config/config.cpp index 5848aaafa..6940b4a71 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -24,26 +24,39 @@ #include #include #include -#include #include #include #include "codec/exportformat.h" #include "common/autoscroll.h" +#include "common/dropworkflowbehavior.h" #include "common/filefunctions.h" #include "common/xmlutils.h" #include "core.h" #include "timeline/timelinecommon.h" #include "ui/colorcoding.h" -#include "ui/style/style.h" -#include "widget/timelinewidget/tool/import.h" -#include "window/mainwindow/mainwindow.h" namespace olive { Config Config::current_config; +Config::ErrorHandler Config::error_handler_ = nullptr; + +void Config::set_error_handler(ErrorHandler handler) +{ + error_handler_ = handler; +} + +void Config::report_error(const QString &title, const QString &message) +{ + if (error_handler_) { + error_handler_(title, message); + } else { + qWarning() << title << "-" << message; + } +} + Config::Config() { set_defaults(); @@ -69,8 +82,10 @@ Config &Config::current() void Config::set_defaults() { config_map_.clear(); + // Default style name; the style itself lives in the UI layer + // (ui/style), which owns the definitive list set_entry_internal(QStringLiteral("Style"), NodeValue::k_text, - StyleManager::k_default_style); + QStringLiteral("olive-dark")); set_entry_internal(QStringLiteral("TimecodeDisplay"), NodeValue::k_int, Timecode::k_timecode_drop_frame); set_entry_internal(QStringLiteral("DefaultStillLength"), NodeValue::k_rational, @@ -124,7 +139,7 @@ void Config::set_defaults() set_entry_internal(QStringLiteral("RectifiedWaveforms"), NodeValue::k_boolean, true); set_entry_internal(QStringLiteral("DropWithoutSequenceBehavior"), - NodeValue::k_int, ImportTool::k_dws_ask); + NodeValue::k_int, k_dws_ask); set_entry_internal(QStringLiteral("Loop"), NodeValue::k_boolean, false); set_entry_internal(QStringLiteral("SplitClipsCopyNodes"), NodeValue::k_boolean, true); @@ -356,20 +371,13 @@ void Config::load() } if (reader.hasError()) { - // Config::Load() is called before Core (and therefore the main window) - // is constructed, so we cannot use Core::instance()->main_window() as - // the message box parent. Passing nullptr creates a top-level dialog. - QWidget *parent = Core::instance() ? Core::instance()->main_window() : - nullptr; - QMessageBox::critical( - parent, + report_error( QCoreApplication::translate("Config", "Error loading settings"), QCoreApplication::translate( "Config", "Failed to load application settings. This session will " "use defaults.\n\n%1") - .arg(reader.errorString()), - QMessageBox::Ok); + .arg(reader.errorString())); current_config.set_defaults(); } @@ -385,14 +393,12 @@ void Config::save() QFile config_file(temp_filename); if (!config_file.open(QFile::WriteOnly)) { - QMessageBox::critical( - Core::instance()->main_window(), + report_error( QCoreApplication::translate("Config", "Error saving settings"), QCoreApplication::translate( "Config", "Failed to save application settings. The application " - "may lack write permissions for this location."), - QMessageBox::Ok); + "may lack write permissions for this location.")); return; } diff --git a/app/config/config.h b/app/config/config.h index ef17644a3..0db3226d8 100644 --- a/app/config/config.h +++ b/app/config/config.h @@ -44,6 +44,18 @@ public: static void save(); + /** + * @brief Handler for configuration errors that should be shown to the user + * + * The engine layer cannot show dialogs itself. The UI registers a + * handler (e.g. QMessageBox-based) at startup; without one, errors go + * to the log instead. + */ + using ErrorHandler = void (*)(const QString &title, + const QString &message); + + static void set_error_handler(ErrorHandler handler); + QVariant operator[](const QString &) const; QVariant &operator[](const QString &); @@ -65,6 +77,10 @@ private: static Config current_config; + static ErrorHandler error_handler_; + + static void report_error(const QString &title, const QString &message); + static QString get_config_file_path(); }; diff --git a/app/core.cpp b/app/core.cpp index 4c60669ce..a033083d7 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -71,7 +71,7 @@ #include "task/project/saveotio/saveotio.h" #endif #include "task/project/import/import.h" -#include "task/project/import/importerrordialog.h" +#include "dialog/projectimport/projectimporterrordialog.h" #include "task/project/load/load.h" #include "task/project/save/save.h" #include "task/taskmanager.h" diff --git a/app/core.h b/app/core.h index d28f0cc17..1675e356a 100644 --- a/app/core.h +++ b/app/core.h @@ -34,7 +34,6 @@ #include "task/task.h" #include "tool/tool.h" #include "undo/undostack.h" -#include "widget/projectexplorer/projectviewmodel.h" namespace olive { diff --git a/app/dialog/CMakeLists.txt b/app/dialog/CMakeLists.txt index b4990d624..c3cab7449 100644 --- a/app/dialog/CMakeLists.txt +++ b/app/dialog/CMakeLists.txt @@ -30,6 +30,7 @@ if (OpenTimelineIO_FOUND) endif () add_subdirectory(preferences) add_subdirectory(progress) +add_subdirectory(projectimport) add_subdirectory(proxy) add_subdirectory(projectproperties) add_subdirectory(rendercancel) diff --git a/app/dialog/export/codec/imagesection.cpp b/app/dialog/export/codec/imagesection.cpp index bfeeab957..14d2e60cd 100644 --- a/app/dialog/export/codec/imagesection.cpp +++ b/app/dialog/export/codec/imagesection.cpp @@ -49,7 +49,7 @@ ImageSection::ImageSection(QWidget *parent) frame_slider_ = new RationalSlider(); frame_slider_->set_minimum(0); frame_slider_->set_value(0); - frame_slider_->set_display_type(RationalSlider::k_time); + frame_slider_->set_display_type(slider::k_time); connect(frame_slider_, &RationalSlider::value_changed, this, &ImageSection::time_changed); layout->addWidget(frame_slider_, row, 1); diff --git a/app/dialog/keyframeproperties/keyframeproperties.cpp b/app/dialog/keyframeproperties/keyframeproperties.cpp index 912625514..cfbad8689 100644 --- a/app/dialog/keyframeproperties/keyframeproperties.cpp +++ b/app/dialog/keyframeproperties/keyframeproperties.cpp @@ -47,7 +47,7 @@ KeyframePropertiesDialog::KeyframePropertiesDialog( layout->addWidget(new QLabel("Time:"), row, 0); time_slider_ = new RationalSlider(); - time_slider_->set_display_type(RationalSlider::k_time); + time_slider_->set_display_type(slider::k_time); time_slider_->set_timebase(timebase_); layout->addWidget(time_slider_, row, 1); diff --git a/app/dialog/markerproperties/markerpropertiesdialog.cpp b/app/dialog/markerproperties/markerpropertiesdialog.cpp index 3482395d5..4c5014a81 100644 --- a/app/dialog/markerproperties/markerpropertiesdialog.cpp +++ b/app/dialog/markerproperties/markerpropertiesdialog.cpp @@ -65,10 +65,10 @@ MarkerPropertiesDialog::MarkerPropertiesDialog( if (markers.size() == 1) { in_slider_->set_value(markers.front()->time().in()); - in_slider_->set_display_type(RationalSlider::k_time); + in_slider_->set_display_type(slider::k_time); in_slider_->set_timebase(timebase); out_slider_->set_value(markers.front()->time().out()); - out_slider_->set_display_type(RationalSlider::k_time); + out_slider_->set_display_type(slider::k_time); out_slider_->set_timebase(timebase); } else { // Markers cannot be on the same time, so we disable setting time if multiple markers are selected diff --git a/app/dialog/projectimport/CMakeLists.txt b/app/dialog/projectimport/CMakeLists.txt new file mode 100644 index 000000000..2c31c121d --- /dev/null +++ b/app/dialog/projectimport/CMakeLists.txt @@ -0,0 +1,23 @@ +# Olive - Non-Linear Video Editor +# Copyright (C) 2022 Olive Team +# Modifications Copyright (C) 2026 Oak 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 . + +set(OLIVE_SOURCES + ${OLIVE_SOURCES} + dialog/projectimport/projectimporterrordialog.cpp + dialog/projectimport/projectimporterrordialog.h + PARENT_SCOPE +) diff --git a/app/task/project/import/importerrordialog.cpp b/app/dialog/projectimport/projectimporterrordialog.cpp similarity index 97% rename from app/task/project/import/importerrordialog.cpp rename to app/dialog/projectimport/projectimporterrordialog.cpp index 315dd3950..cc5113e79 100644 --- a/app/task/project/import/importerrordialog.cpp +++ b/app/dialog/projectimport/projectimporterrordialog.cpp @@ -19,7 +19,7 @@ ***/ -#include "importerrordialog.h" +#include "projectimporterrordialog.h" #include #include diff --git a/app/task/project/import/importerrordialog.h b/app/dialog/projectimport/projectimporterrordialog.h similarity index 100% rename from app/task/project/import/importerrordialog.h rename to app/dialog/projectimport/projectimporterrordialog.h diff --git a/app/dialog/speedduration/speeddurationdialog.cpp b/app/dialog/speedduration/speeddurationdialog.cpp index e19fbcd0f..964b6303d 100644 --- a/app/dialog/speedduration/speeddurationdialog.cpp +++ b/app/dialog/speedduration/speeddurationdialog.cpp @@ -57,7 +57,7 @@ SpeedDurationDialog::SpeedDurationDialog(const QVector &clips, speed_layout->addWidget(new QLabel(tr("Speed:")), row, 0); speed_slider_ = new FloatSlider(); - speed_slider_->set_display_type(FloatSlider::k_percentage); + speed_slider_->set_display_type(slider::k_percentage); connect(speed_slider_, &FloatSlider::value_changed, this, &SpeedDurationDialog::speed_changed); speed_layout->addWidget(speed_slider_, row, 1); @@ -68,7 +68,7 @@ SpeedDurationDialog::SpeedDurationDialog(const QVector &clips, dur_slider_ = new RationalSlider(); dur_slider_->set_timebase(timebase); - dur_slider_->set_display_type(RationalSlider::k_time); + dur_slider_->set_display_type(slider::k_time); connect(dur_slider_, &RationalSlider::value_changed, this, &SpeedDurationDialog::duration_changed); speed_layout->addWidget(dur_slider_, row, 1); diff --git a/app/main.cpp b/app/main.cpp index 8b060c983..579ad32d9 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -341,6 +341,16 @@ int main(int argc, char *argv[]) a.reset(new QCoreApplication(argc, argv)); } + // Configuration errors are reported through a UI handler so the engine + // layer (config) never has to know about dialogs + olive::Config::set_error_handler( + [](const QString &title, const QString &message) { + QWidget *parent = + olive::Core::instance() ? olive::Core::instance()->main_window() : + nullptr; + QMessageBox::critical(parent, title, message, QMessageBox::Ok); + }); + olive::Config::load(); const QString graphics_backend = olive::Config::current()[QStringLiteral("GraphicsBackend")] diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index 7e7b162e3..a57194c49 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -21,7 +21,7 @@ #include "pan.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -40,7 +40,7 @@ PanNode::PanNode() set_input_property(k_panning_input, QStringLiteral("min"), -1.0); set_input_property(k_panning_input, QStringLiteral("max"), 1.0); set_input_property(k_panning_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_flag(k_audio_effect); set_effect_input(k_samples_input); diff --git a/app/node/audio/volume/volume.cpp b/app/node/audio/volume/volume.cpp index ea835910d..1943528da 100644 --- a/app/node/audio/volume/volume.cpp +++ b/app/node/audio/volume/volume.cpp @@ -21,7 +21,7 @@ #include "volume.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -39,7 +39,7 @@ VolumeNode::VolumeNode() add_input(k_volume_input, NodeValue::k_float, 1.0); set_input_property(k_volume_input, QStringLiteral("min"), 0.0); set_input_property(k_volume_input, QStringLiteral("view"), - FloatSlider::k_decibel); + slider::k_decibel); set_flag(k_audio_effect); set_effect_input(k_samples_input); diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index fb8d89be9..d0df06062 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -24,7 +24,7 @@ #include #include "node/inputdragger.h" -#include "widget/slider/rationalslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -44,7 +44,7 @@ Block::Block() set_input_property(k_length_input, QStringLiteral("min"), QVariant::fromValue(Rational(0, 1))); set_input_property(k_length_input, QStringLiteral("view"), - RationalSlider::k_time); + slider::k_time); set_input_property(k_length_input, QStringLiteral("viewlock"), true); set_input_flag(k_enabled_input, k_input_flag_not_connectable); diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 68375286a..83337a8bd 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -26,8 +26,8 @@ #include "node/output/track/track.h" #include "node/output/viewer/viewer.h" #include "node/project/sequence/sequence.h" -#include "widget/slider/floatslider.h" -#include "widget/slider/rationalslider.h" +#include "node/sliderdisplaytype.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -51,13 +51,13 @@ ClipBlock::ClipBlock() add_input(k_media_in_input, NodeValue::k_rational, InputFlags(k_input_flag_not_connectable | k_input_flag_not_keyframable)); set_input_property(k_media_in_input, QStringLiteral("view"), - RationalSlider::k_time); + slider::k_time); set_input_property(k_media_in_input, QStringLiteral("viewlock"), true); add_input(k_speed_input, NodeValue::k_float, 1.0, InputFlags(k_input_flag_not_connectable | k_input_flag_not_keyframable)); set_input_property(k_speed_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_speed_input, QStringLiteral("min"), 0.0); add_input(k_reverse_input, NodeValue::k_boolean, false, diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index e4e8fd6c3..6e4e8c27b 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -23,7 +23,7 @@ #include "node/block/clip/clip.h" #include "node/output/track/track.h" -#include "widget/slider/rationalslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -51,7 +51,7 @@ TransitionBlock::TransitionBlock() add_input(k_center_input, NodeValue::k_rational, InputFlags(k_input_flag_not_keyframable | k_input_flag_not_connectable)); set_input_property(k_center_input, QStringLiteral("view"), - RationalSlider::k_time); + slider::k_time); set_input_property(k_center_input, QStringLiteral("viewlock"), true); set_flag(k_dont_show_in_param_view, false); diff --git a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp index 92a9a5c93..c944f75d6 100644 --- a/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp +++ b/app/node/color/ociogradingtransformlinear/ociogradingtransformlinear.cpp @@ -26,7 +26,7 @@ #include "common/ocioutils.h" #include "node/project.h" #include "render/colorprocessor.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -71,7 +71,7 @@ OCIOGradingTransformLinearNode::OCIOGradingTransformLinearNode() add_input(k_saturation_input, NodeValue::k_float, 1.0); set_input_property(k_saturation_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_saturation_input, QStringLiteral("min"), 0.0); add_input(k_pivot_input, NodeValue::k_float, diff --git a/app/node/color/ociogradingtransformlog/ociogradingtransformlog.cpp b/app/node/color/ociogradingtransformlog/ociogradingtransformlog.cpp index 432a9c3e3..be994d28b 100644 --- a/app/node/color/ociogradingtransformlog/ociogradingtransformlog.cpp +++ b/app/node/color/ociogradingtransformlog/ociogradingtransformlog.cpp @@ -26,7 +26,7 @@ #include "common/ocioutils.h" #include "node/project.h" #include "render/colorprocessor.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -71,7 +71,7 @@ OCIOGradingTransformLogNode::OCIOGradingTransformLogNode() add_input(k_saturation_input, NodeValue::k_float, 1.0); set_input_property(k_saturation_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_saturation_input, QStringLiteral("min"), 0.0); add_input(k_pivot_input, NodeValue::k_float, diff --git a/app/node/color/ociolut/ociolut.cpp b/app/node/color/ociolut/ociolut.cpp index 8bcf35347..e96b89ba0 100644 --- a/app/node/color/ociolut/ociolut.cpp +++ b/app/node/color/ociolut/ociolut.cpp @@ -20,10 +20,10 @@ #include "ociolut.h" +#include #include #include -#include #include "core.h" #include "node/color/colormanager/colormanager.h" diff --git a/app/node/color/threewaycolor/threewaycolor.cpp b/app/node/color/threewaycolor/threewaycolor.cpp index e5201a703..f473ad765 100644 --- a/app/node/color/threewaycolor/threewaycolor.cpp +++ b/app/node/color/threewaycolor/threewaycolor.cpp @@ -24,7 +24,7 @@ #include #include "node/project.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -66,9 +66,9 @@ ThreeWayColorNode::ThreeWayColorNode() set_input_property(k_shadows_amount_input, min, 0.0); set_input_property(k_midtones_amount_input, min, 0.0); set_input_property(k_highlights_amount_input, min, 0.0); - set_input_property(k_shadows_amount_input, view, FloatSlider::k_percentage); - set_input_property(k_midtones_amount_input, view, FloatSlider::k_percentage); - set_input_property(k_highlights_amount_input, view, FloatSlider::k_percentage); + set_input_property(k_shadows_amount_input, view, slider::k_percentage); + set_input_property(k_midtones_amount_input, view, slider::k_percentage); + set_input_property(k_highlights_amount_input, view, slider::k_percentage); set_effect_input(k_texture_input); set_flag(k_video_effect); diff --git a/app/node/color/whitebalance/whitebalance.cpp b/app/node/color/whitebalance/whitebalance.cpp index 90e3e7e10..7094182ac 100644 --- a/app/node/color/whitebalance/whitebalance.cpp +++ b/app/node/color/whitebalance/whitebalance.cpp @@ -25,7 +25,7 @@ #include "common/filefunctions.h" #include "render/job/shaderjob.h" #include "render/texture.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -47,7 +47,7 @@ WhiteBalanceNode::WhiteBalanceNode() set_input_property(k_temperature_input, QStringLiteral("min"), 1000.0); set_input_property(k_temperature_input, QStringLiteral("max"), 40000.0); set_input_property(k_temperature_input, QStringLiteral("view"), - FloatSlider::k_normal); + slider::k_normal); add_input(k_tint_input, NodeValue::k_float, 0.0); set_input_property(k_tint_input, QStringLiteral("min"), -1.0); diff --git a/app/node/distort/cornerpin/cornerpindistortnode.cpp b/app/node/distort/cornerpin/cornerpindistortnode.cpp index d725fced7..32faba763 100644 --- a/app/node/distort/cornerpin/cornerpindistortnode.cpp +++ b/app/node/distort/cornerpin/cornerpindistortnode.cpp @@ -23,7 +23,6 @@ #include "common/lerp.h" #include "core.h" -#include "widget/slider/floatslider.h" namespace olive { diff --git a/app/node/distort/crop/cropdistortnode.cpp b/app/node/distort/crop/cropdistortnode.cpp index 0af40ab0c..0fb5e28da 100644 --- a/app/node/distort/crop/cropdistortnode.cpp +++ b/app/node/distort/crop/cropdistortnode.cpp @@ -23,7 +23,7 @@ #include "common/util.h" #include "core.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -183,7 +183,7 @@ void CropDistortNode::create_crop_side_input(const QString &id) add_input(id, NodeValue::k_float, 0.0); set_input_property(id, QStringLiteral("min"), 0.0); set_input_property(id, QStringLiteral("max"), 1.0); - set_input_property(id, QStringLiteral("view"), FloatSlider::k_percentage); + set_input_property(id, QStringLiteral("view"), slider::k_percentage); } } diff --git a/app/node/distort/tile/tiledistortnode.cpp b/app/node/distort/tile/tiledistortnode.cpp index 014530dd2..3e8c0e498 100644 --- a/app/node/distort/tile/tiledistortnode.cpp +++ b/app/node/distort/tile/tiledistortnode.cpp @@ -21,7 +21,7 @@ #include "tiledistortnode.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -43,7 +43,7 @@ TileDistortNode::TileDistortNode() add_input(k_scale_input, NodeValue::k_float, 0.5); set_input_property(k_scale_input, QStringLiteral("min"), 0); set_input_property(k_scale_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); add_input(k_position_input, NodeValue::k_vec2, QVector2D(0, 0)); diff --git a/app/node/effect/opacity/opacityeffect.cpp b/app/node/effect/opacity/opacityeffect.cpp index 0f16cce14..bee8744d7 100644 --- a/app/node/effect/opacity/opacityeffect.cpp +++ b/app/node/effect/opacity/opacityeffect.cpp @@ -19,7 +19,7 @@ #include "opacityeffect.h" #include "node/math/math/math.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -43,7 +43,7 @@ OpacityEffect::OpacityEffect() add_input(k_value_input, NodeValue::k_float, 1.0); set_input_property(k_value_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_value_input, QStringLiteral("min"), 0.0); set_input_property(k_value_input, QStringLiteral("max"), 1.0); diff --git a/app/node/filter/dropshadow/dropshadowfilter.cpp b/app/node/filter/dropshadow/dropshadowfilter.cpp index 6f66fe29e..99a59d914 100644 --- a/app/node/filter/dropshadow/dropshadowfilter.cpp +++ b/app/node/filter/dropshadow/dropshadowfilter.cpp @@ -21,7 +21,7 @@ #include "dropshadowfilter.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -54,7 +54,7 @@ DropShadowFilter::DropShadowFilter() add_input(k_opacity_input, NodeValue::k_float, 1.0); set_input_property(k_opacity_input, QStringLiteral("min"), 0.0); set_input_property(k_opacity_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); add_input(k_fast_input, NodeValue::k_boolean, false); diff --git a/app/node/filter/stroke/stroke.cpp b/app/node/filter/stroke/stroke.cpp index 2212dcc9d..e9d170b87 100644 --- a/app/node/filter/stroke/stroke.cpp +++ b/app/node/filter/stroke/stroke.cpp @@ -21,7 +21,7 @@ #include "stroke.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -47,7 +47,7 @@ StrokeFilterNode::StrokeFilterNode() add_input(k_opacity_input, NodeValue::k_float, 1.0f); set_input_property(k_opacity_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_opacity_input, QStringLiteral("min"), 0.0f); set_input_property(k_opacity_input, QStringLiteral("max"), 1.0f); diff --git a/app/node/generator/matrix/matrix.cpp b/app/node/generator/matrix/matrix.cpp index f4b263e22..c2cde309d 100644 --- a/app/node/generator/matrix/matrix.cpp +++ b/app/node/generator/matrix/matrix.cpp @@ -24,7 +24,7 @@ #include #include -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -47,7 +47,7 @@ MatrixGenerator::MatrixGenerator() add_input(k_scale_input, NodeValue::k_vec2, QVector2D(1.0f, 1.0f)); set_input_property(k_scale_input, QStringLiteral("min"), QVector2D(0, 0)); set_input_property(k_scale_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_scale_input, QStringLiteral("disable1"), true); add_input(k_uniform_scale_input, NodeValue::k_boolean, true, diff --git a/app/node/generator/noise/noise.cpp b/app/node/generator/noise/noise.cpp index 30c8a3601..91b8d80dc 100644 --- a/app/node/generator/noise/noise.cpp +++ b/app/node/generator/noise/noise.cpp @@ -21,7 +21,7 @@ #include "noise.h" -#include "widget/slider/floatslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -40,7 +40,7 @@ NoiseGeneratorNode::NoiseGeneratorNode() add_input(k_strength_input, NodeValue::k_float, 0.2); set_input_property(k_strength_input, QStringLiteral("view"), - FloatSlider::k_percentage); + slider::k_percentage); set_input_property(k_strength_input, QStringLiteral("min"), 0); add_input(k_color_input, NodeValue::k_boolean, false); diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 8335de079..f4c239c28 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -21,7 +21,6 @@ #include "track.h" -#include #include #include diff --git a/app/node/project.cpp b/app/node/project.cpp index a5893a4a3..74cad39f8 100644 --- a/app/node/project.cpp +++ b/app/node/project.cpp @@ -28,14 +28,14 @@ #include "common/qtutils.h" #include "common/xmlutils.h" #include "core.h" -#include "dialog/progress/progress.h" #include "node/color/ociobase/ociobase.h" #include "node/factory.h" +#include "node/group/group.h" +#include "node/project/folder/folder.h" #include "node/serializeddata.h" #include "pluginSupport/olivehost.h" #include "ofxhPluginCache.h" #include "render/diskmanager.h" -#include "window/mainwindow/mainwindow.h" namespace olive { diff --git a/app/node/project.h b/app/node/project.h index 71715f895..07489bc2b 100644 --- a/app/node/project.h +++ b/app/node/project.h @@ -27,9 +27,10 @@ #include #include "node/output/viewer/viewer.h" +#include "node/project/folder/folder.h" #include "node/project/footage/footage.h" +#include "node/project/sequence/sequence.h" #include "node/color/colormanager/colormanager.h" -#include "window/mainwindow/mainwindowlayoutinfo.h" namespace olive { diff --git a/app/node/project/sequence/sequence.cpp b/app/node/project/sequence/sequence.cpp index 1cb2a7c13..1decc43f2 100644 --- a/app/node/project/sequence/sequence.cpp +++ b/app/node/project/sequence/sequence.cpp @@ -23,7 +23,6 @@ #include -#include "panel/timeline/timeline.h" #include "ui/icons/icons.h" #include "timeline/timelineundogeneral.h" diff --git a/app/node/project/serializer/CMakeLists.txt b/app/node/project/serializer/CMakeLists.txt index 8b5ae03f5..2841661d7 100644 --- a/app/node/project/serializer/CMakeLists.txt +++ b/app/node/project/serializer/CMakeLists.txt @@ -33,6 +33,9 @@ set(OLIVE_SOURCES node/project/serializer/serializer230220.h + node/project/serializer/mainwindowlayoutinfo.cpp + node/project/serializer/mainwindowlayoutinfo.h + node/project/serializer/typeserializer.cpp node/project/serializer/typeserializer.h diff --git a/app/window/mainwindow/mainwindowlayoutinfo.cpp b/app/node/project/serializer/mainwindowlayoutinfo.cpp similarity index 97% rename from app/window/mainwindow/mainwindowlayoutinfo.cpp rename to app/node/project/serializer/mainwindowlayoutinfo.cpp index a72b3fe82..274f53612 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.cpp +++ b/app/node/project/serializer/mainwindowlayoutinfo.cpp @@ -63,7 +63,7 @@ void MainWindowLayoutInfo::to_xml(QXmlStreamWriter *writer) const writer->writeAttribute(QStringLiteral("id"), it->first); - const PanelWidget::Info &info = it->second; + const PanelLayoutInfo &info = it->second; for (auto jt = info.cbegin(); jt != info.cend(); jt++) { writer->writeStartElement(QStringLiteral("option")); @@ -158,7 +158,7 @@ MainWindowLayoutInfo::from_xml(QXmlStreamReader *reader, } if (!id.isEmpty()) { - PanelWidget::Info i; + PanelLayoutInfo i; while (xml_read_next_start_element(reader)) { if (reader->name() == QStringLiteral("option")) { @@ -211,7 +211,7 @@ void MainWindowLayoutInfo::add_viewer(ViewerOutput *viewer) } void MainWindowLayoutInfo::set_panel_data(const QString &id, - const PanelWidget::Info &data) + const PanelLayoutInfo &data) { panel_data_[id] = data; } @@ -219,7 +219,7 @@ void MainWindowLayoutInfo::set_panel_data(const QString &id, void MainWindowLayoutInfo::move_panel_data(const QString &old, const QString &now) { - PanelWidget::Info tmp = panel_data_.at(old); + PanelLayoutInfo tmp = panel_data_.at(old); panel_data_.erase(old); panel_data_[now] = tmp; } diff --git a/app/window/mainwindow/mainwindowlayoutinfo.h b/app/node/project/serializer/mainwindowlayoutinfo.h similarity index 81% rename from app/window/mainwindow/mainwindowlayoutinfo.h rename to app/node/project/serializer/mainwindowlayoutinfo.h index 14aa7d1c1..16cde1dd3 100644 --- a/app/window/mainwindow/mainwindowlayoutinfo.h +++ b/app/node/project/serializer/mainwindowlayoutinfo.h @@ -19,13 +19,22 @@ #ifndef OAK_MAINWINDOWLAYOUTINFO_H #define OAK_MAINWINDOWLAYOUTINFO_H +#include + #include "node/project/folder/folder.h" #include "node/project/sequence/sequence.h" -#include "panel/panel.h" namespace olive { +/** + * @brief Per-panel layout data (key/value pairs) + * + * Identical to PanelWidget::Info in the UI layer; defined here so the + * engine-side layout data structure does not depend on widget headers. + */ +using PanelLayoutInfo = std::map; + class MainWindowLayoutInfo { public: MainWindowLayoutInfo() = default; @@ -41,7 +50,7 @@ public: void add_viewer(ViewerOutput *viewer); - void set_panel_data(const QString &id, const PanelWidget::Info &data); + void set_panel_data(const QString &id, const PanelLayoutInfo &data); void move_panel_data(const QString &old, const QString &now); @@ -62,7 +71,7 @@ public: return open_viewers_; } - const std::map &panel_data() const + const std::map &panel_data() const { return panel_data_; } @@ -81,7 +90,7 @@ private: std::vector open_viewers_; - std::map panel_data_; + std::map panel_data_; static const unsigned int k_version = 1; }; diff --git a/app/node/project/serializer/serializer.h b/app/node/project/serializer/serializer.h index 960e1319e..d731fc208 100644 --- a/app/node/project/serializer/serializer.h +++ b/app/node/project/serializer/serializer.h @@ -26,6 +26,7 @@ #include "common/define.h" #include "node/project.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" #include "typeserializer.h" namespace olive diff --git a/app/node/sliderdisplaytype.h b/app/node/sliderdisplaytype.h new file mode 100644 index 000000000..1cf0a9649 --- /dev/null +++ b/app/node/sliderdisplaytype.h @@ -0,0 +1,47 @@ +/*** + + Oak - Non-Linear Video Editor + Copyright (C) 2026 Oak 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 OAK_SLIDERDISPLAYTYPE_H +#define OAK_SLIDERDISPLAYTYPE_H + +namespace olive +{ + +/** + * @brief Slider display type enums shared by nodes and widgets + * + * Nodes reference these enums in their input properties ("view"); the + * slider widgets in app/widget/slider use the same values to render. The + * definitions live in the engine layer so nodes do not depend on widget + * headers. Enumerator order is ABI/feature compatible with the previous + * FloatSlider::DisplayType and RationalSlider::DisplayType. + */ +namespace slider +{ + +enum FloatDisplayType { k_normal, k_decibel, k_percentage }; + +enum RationalDisplayType { k_time, k_float, k_rational }; + +} // namespace slider + +} // namespace olive + +#endif // OAK_SLIDERDISPLAYTYPE_H diff --git a/app/node/time/timeoffset/timeoffsetnode.cpp b/app/node/time/timeoffset/timeoffsetnode.cpp index 8e709b27f..8e651af7e 100644 --- a/app/node/time/timeoffset/timeoffsetnode.cpp +++ b/app/node/time/timeoffset/timeoffsetnode.cpp @@ -21,7 +21,7 @@ #include "timeoffsetnode.h" -#include "widget/slider/rationalslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -35,7 +35,7 @@ TimeOffsetNode::TimeOffsetNode() { add_input(k_time_input, NodeValue::k_rational, QVariant::fromValue(Rational(0)), InputFlags(k_input_flag_not_connectable)); - set_input_property(k_time_input, QStringLiteral("view"), RationalSlider::k_time); + set_input_property(k_time_input, QStringLiteral("view"), slider::k_time); set_input_property(k_time_input, QStringLiteral("viewlock"), true); add_input(k_input_input, NodeValue::k_none, diff --git a/app/node/time/timeremap/timeremap.cpp b/app/node/time/timeremap/timeremap.cpp index 0d973df1d..92913dd72 100644 --- a/app/node/time/timeremap/timeremap.cpp +++ b/app/node/time/timeremap/timeremap.cpp @@ -21,7 +21,7 @@ #include "timeremap.h" -#include "widget/slider/rationalslider.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -35,7 +35,7 @@ TimeRemapNode::TimeRemapNode() { add_input(k_time_input, NodeValue::k_rational, QVariant::fromValue(Rational(0)), InputFlags(k_input_flag_not_connectable)); - set_input_property(k_time_input, QStringLiteral("view"), RationalSlider::k_time); + set_input_property(k_time_input, QStringLiteral("view"), slider::k_time); set_input_property(k_time_input, QStringLiteral("viewlock"), true); add_input(k_input_input, NodeValue::k_none, diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 61a6290d4..e0e8f2604 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -21,7 +21,6 @@ #include "previewautocacher.h" -#include #include #include diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index f2d8cdea6..12b26ee3e 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -21,7 +21,6 @@ #include "rendermanager.h" -#include #include #include @@ -35,7 +34,6 @@ #include "renderworkerpool.h" #include "task/conform/conform.h" #include "task/taskmanager.h" -#include "window/mainwindow/mainwindow.h" namespace olive { diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 2d1530e56..da92be411 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -26,7 +26,6 @@ #include "config/config.h" #include "colorprocessorcache.h" -#include "dialog/rendercancel/rendercancel.h" #include "node/output/viewer/viewer.h" #include "node/project.h" #include "node/traverser.h" diff --git a/app/task/project/import/CMakeLists.txt b/app/task/project/import/CMakeLists.txt index 5042d5b39..bf1d5102d 100644 --- a/app/task/project/import/CMakeLists.txt +++ b/app/task/project/import/CMakeLists.txt @@ -18,7 +18,5 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} task/project/import/import.h task/project/import/import.cpp - task/project/import/importerrordialog.h - task/project/import/importerrordialog.cpp PARENT_SCOPE ) diff --git a/app/task/project/import/import.h b/app/task/project/import/import.h index e665760b4..0f49bc5af 100644 --- a/app/task/project/import/import.h +++ b/app/task/project/import/import.h @@ -26,8 +26,9 @@ #include #include "codec/decoder.h" +#include "node/project/footage/footage.h" +#include "node/project/folder/folder.h" #include "task/task.h" -#include "widget/projectexplorer/projectviewmodel.h" namespace olive { diff --git a/app/task/project/load/load.h b/app/task/project/load/load.h index 495301714..316558cf1 100644 --- a/app/task/project/load/load.h +++ b/app/task/project/load/load.h @@ -23,7 +23,7 @@ #define OAK_PROJECTLOADMANAGER_H #include "loadbasetask.h" -#include "window/mainwindow/mainwindowlayoutinfo.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" namespace olive { diff --git a/app/task/project/load/loadbasetask.h b/app/task/project/load/loadbasetask.h index 0f2e5afec..638d1e861 100644 --- a/app/task/project/load/loadbasetask.h +++ b/app/task/project/load/loadbasetask.h @@ -23,6 +23,7 @@ #define OAK_PROJECTLOADBASETASK_H #include "node/project.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" #include "task/task.h" namespace olive diff --git a/app/task/project/save/save.h b/app/task/project/save/save.h index 06b1c4909..904e113eb 100644 --- a/app/task/project/save/save.h +++ b/app/task/project/save/save.h @@ -23,6 +23,7 @@ #define OAK_PROJECTSAVEMANAGER_H #include "node/project.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" #include "task/task.h" namespace olive diff --git a/app/widget/curvewidget/curveview.cpp b/app/widget/curvewidget/curveview.cpp index f599a0120..9ced144fe 100644 --- a/app/widget/curvewidget/curveview.cpp +++ b/app/widget/curvewidget/curveview.cpp @@ -664,7 +664,7 @@ CurveView::get_float_display_type_from_keyframe(NodeKeyframe *key) } // Fallback to normal - return FloatSlider::k_normal; + return slider::k_normal; } double CurveView::get_offset_from_keyframe(NodeKeyframe *key) diff --git a/app/widget/playbackcontrols/playbackcontrols.cpp b/app/widget/playbackcontrols/playbackcontrols.cpp index 52d18d3e7..8f4fff041 100644 --- a/app/widget/playbackcontrols/playbackcontrols.cpp +++ b/app/widget/playbackcontrols/playbackcontrols.cpp @@ -57,7 +57,7 @@ PlaybackControls::PlaybackControls(QWidget *parent) lower_left_layout->setContentsMargins(0, 0, 0, 0); cur_tc_lbl_ = new RationalSlider(); - cur_tc_lbl_->set_display_type(RationalSlider::k_time); + cur_tc_lbl_->set_display_type(slider::k_time); cur_tc_lbl_->set_minimum(0); connect(cur_tc_lbl_, &RationalSlider::value_changed, this, &PlaybackControls::time_changed); diff --git a/app/widget/slider/floatslider.cpp b/app/widget/slider/floatslider.cpp index 909932d80..dfa08f219 100644 --- a/app/widget/slider/floatslider.cpp +++ b/app/widget/slider/floatslider.cpp @@ -33,7 +33,7 @@ namespace olive FloatSlider::FloatSlider(QWidget *parent) : super(parent) - , display_type_(k_normal) + , display_type_(slider::k_normal) { set_value(0.0); } @@ -68,13 +68,13 @@ void FloatSlider::set_display_type(const FloatSlider::DisplayType &type) display_type_ = type; switch (display_type_) { - case k_normal: + case slider::k_normal: clear_format(); break; - case k_decibel: + case slider::k_decibel: set_format(tr("%1 dB")); break; - case k_percentage: + case slider::k_percentage: set_format(tr("%1%")); break; } @@ -83,12 +83,12 @@ void FloatSlider::set_display_type(const FloatSlider::DisplayType &type) double FloatSlider::transform_value_to_display(double val, DisplayType display) { switch (display) { - case k_normal: + case slider::k_normal: break; - case k_decibel: + case slider::k_decibel: val = Decibel::from_linear(val); break; - case k_percentage: + case slider::k_percentage: val *= 100.0; break; } @@ -99,12 +99,12 @@ double FloatSlider::transform_value_to_display(double val, DisplayType display) double FloatSlider::transform_display_to_value(double val, DisplayType display) { switch (display) { - case k_normal: + case slider::k_normal: break; - case k_decibel: + case slider::k_decibel: val = Decibel::to_linear(val); break; - case k_percentage: + case slider::k_percentage: val *= 0.01; break; } @@ -117,7 +117,7 @@ QString FloatSlider::value_to_string(double val, FloatSlider::DisplayType displa bool autotrim_decimal_places) { // Return negative infinity for zero volume - if (display == k_decibel && qIsNull(val)) { + if (display == slider::k_decibel && qIsNull(val)) { return tr("\xE2\x88\x9E"); } @@ -154,17 +154,17 @@ QVariant FloatSlider::adjust_drag_distance_internal(const QVariant &start, const double &drag) const { switch (display_type_) { - case k_normal: + case slider::k_normal: // No change here break; - case k_decibel: { + case slider::k_decibel: { double current_db = Decibel::from_linear(start.toDouble()); current_db += drag; double adjusted_linear = Decibel::to_linear(current_db); return adjusted_linear; } - case k_percentage: + case slider::k_percentage: return super::adjust_drag_distance_internal(start, drag * 0.01); } diff --git a/app/widget/slider/floatslider.h b/app/widget/slider/floatslider.h index 3b8b7f13e..3a210286f 100644 --- a/app/widget/slider/floatslider.h +++ b/app/widget/slider/floatslider.h @@ -23,6 +23,7 @@ #define OAK_FLOATSLIDER_H #include "base/decimalsliderbase.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -32,7 +33,10 @@ class FloatSlider : public DecimalSliderBase { public: FloatSlider(QWidget *parent = nullptr); - enum DisplayType { k_normal, k_decibel, k_percentage }; + // The canonical definition lives in the engine layer + // (node/sliderdisplaytype.h); this alias keeps existing call sites + // source-compatible. Use slider::k_normal etc. for the enumerators. + using DisplayType = slider::FloatDisplayType; double get_value() const; diff --git a/app/widget/slider/rationalslider.cpp b/app/widget/slider/rationalslider.cpp index b4e1ef11d..fa079b9e3 100644 --- a/app/widget/slider/rationalslider.cpp +++ b/app/widget/slider/rationalslider.cpp @@ -39,7 +39,7 @@ RationalSlider::RationalSlider(QWidget *parent) connect(SliderBase::label(), &SliderLabel::customContextMenuRequested, this, &RationalSlider::show_display_type_menu); - set_display_type(k_float); + set_display_type(slider::k_float); set_value(Rational(0, 0)); } @@ -109,13 +109,13 @@ QString RationalSlider::value_to_string(const QVariant &v) const double val = r.to_double() + get_offset().value().to_double(); switch (display_type_) { - case k_time: + case slider::k_time: return QString::fromStdString(Timecode::time_to_timecode( r, timebase_, Core::instance()->get_timecode_display())); - case k_float: + case slider::k_float: return float_to_string(val, get_decimal_places(), get_auto_trim_decimal_places()); - case k_rational: + case slider::k_rational: return QString::fromStdString(v.value().to_string()); } @@ -129,13 +129,13 @@ QVariant RationalSlider::string_to_value(const QString &s, bool *ok) const *ok = false; switch (display_type_) { - case k_time: { + case slider::k_time: { r = Timecode::timecode_to_time(s.toStdString(), timebase_, Core::instance()->get_timecode_display(), ok); break; } - case k_float: { + case slider::k_float: { // First, convert to a double double d = s.toDouble(ok); if (!(*ok)) { @@ -146,7 +146,7 @@ QVariant RationalSlider::string_to_value(const QString &s, bool *ok) const r = Rational::from_double(d, ok); break; } - case k_rational: + case slider::k_rational: r = Rational::from_string(s.toStdString(), ok); break; } @@ -185,29 +185,29 @@ void RationalSlider::show_display_type_menu() Menu m(this); if (!get_lock_display_type()) { - if (!disabled_.contains(k_float)) { + if (!disabled_.contains(slider::k_float)) { QAction *float_action = m.addAction(tr("Float")); - float_action->setData(k_float); + float_action->setData(slider::k_float); connect(float_action, &QAction::triggered, this, &RationalSlider::set_display_type_from_menu); } - if (!disabled_.contains(k_rational)) { + if (!disabled_.contains(slider::k_rational)) { QAction *rational_action = m.addAction(tr("Rational")); - rational_action->setData(k_rational); + rational_action->setData(slider::k_rational); connect(rational_action, &QAction::triggered, this, &RationalSlider::set_display_type_from_menu); } - if (!disabled_.contains(k_time)) { + if (!disabled_.contains(slider::k_time)) { QAction *time_action = m.addAction(tr("Time")); - time_action->setData(k_time); + time_action->setData(slider::k_time); connect(time_action, &QAction::triggered, this, &RationalSlider::set_display_type_from_menu); } } - if (display_type_ == k_time) { + if (display_type_ == slider::k_time) { if (!m.actions().isEmpty()) { m.addSeparator(); } diff --git a/app/widget/slider/rationalslider.h b/app/widget/slider/rationalslider.h index 3eb305e9f..b5edef320 100644 --- a/app/widget/slider/rationalslider.h +++ b/app/widget/slider/rationalslider.h @@ -26,6 +26,7 @@ #include #include "base/decimalsliderbase.h" +#include "node/sliderdisplaytype.h" namespace olive { @@ -43,8 +44,12 @@ class RationalSlider : public DecimalSliderBase { public: /** * @brief enum containing the possibly display types + * + * The canonical definition lives in the engine layer + * (node/sliderdisplaytype.h); this alias keeps existing call sites + * source-compatible. Use slider::k_time etc. for the enumerators. */ - enum DisplayType { k_time, k_float, k_rational }; + using DisplayType = slider::RationalDisplayType; RationalSlider(QWidget *parent = nullptr); diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 3bb32c0a6..4c9fb32d6 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -161,7 +161,7 @@ TimelineWidget::TimelineWidget(QWidget *parent) timecode_label_ = new RationalSlider(); timecode_label_->set_alignment(Qt::AlignCenter); - timecode_label_->set_display_type(RationalSlider::k_time); + timecode_label_->set_display_type(slider::k_time); timecode_label_->setVisible(false); timecode_label_->set_minimum(0); ruler_and_time_layout->addWidget(timecode_label_); diff --git a/app/widget/timelinewidget/tool/import.h b/app/widget/timelinewidget/tool/import.h index 6adcf9336..fd7529df3 100644 --- a/app/widget/timelinewidget/tool/import.h +++ b/app/widget/timelinewidget/tool/import.h @@ -22,6 +22,7 @@ #ifndef OAK_IMPORTTIMELINETOOL_H #define OAK_IMPORTTIMELINETOOL_H +#include "common/dropworkflowbehavior.h" #include "tool.h" namespace olive @@ -46,12 +47,12 @@ public: bool insert, MultiUndoCommand *command, int track_offset = 0, bool jump_to_end = false); - enum DropWithoutSequenceBehavior { - k_dws_ask, - k_dws_auto, - k_dws_manual, - k_dws_disable - }; + // The canonical definition lives in the engine layer + // (common/dropworkflowbehavior.h); this alias keeps existing call + // sites source-compatible. Use olive::k_dws_ask etc. for the + // enumerators (visible unqualified inside namespace olive). + using DropWithoutSequenceBehavior = + olive::DropWithoutSequenceBehavior; private: void footage_to_ghosts(Rational ghost_start, diff --git a/app/window/mainwindow/CMakeLists.txt b/app/window/mainwindow/CMakeLists.txt index a327410b1..e3218cc4f 100644 --- a/app/window/mainwindow/CMakeLists.txt +++ b/app/window/mainwindow/CMakeLists.txt @@ -22,8 +22,6 @@ set(OLIVE_SOURCES window/mainwindow/mainstatusbar.cpp window/mainwindow/mainwindow.h window/mainwindow/mainwindow.cpp - window/mainwindow/mainwindowlayoutinfo.h - window/mainwindow/mainwindowlayoutinfo.cpp window/mainwindow/mainwindowundo.h window/mainwindow/mainwindowundo.cpp PARENT_SCOPE diff --git a/app/window/mainwindow/mainwindow.h b/app/window/mainwindow/mainwindow.h index da4485b17..295be4bb5 100644 --- a/app/window/mainwindow/mainwindow.h +++ b/app/window/mainwindow/mainwindow.h @@ -25,7 +25,7 @@ #include #include -#include "mainwindowlayoutinfo.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" #include "node/project.h" #include "panel/multicam/multicampanel.h" #include "panel/panelmanager.h" diff --git a/tests/gtest/mainwindow_test.cpp b/tests/gtest/mainwindow_test.cpp index eda517ca2..40c709695 100644 --- a/tests/gtest/mainwindow_test.cpp +++ b/tests/gtest/mainwindow_test.cpp @@ -24,7 +24,7 @@ #include "widget/menu/menushared.h" #include "window/mainwindow/mainstatusbar.h" #include "window/mainwindow/mainwindow.h" -#include "window/mainwindow/mainwindowlayoutinfo.h" +#include "node/project/serializer/mainwindowlayoutinfo.h" using namespace olive; diff --git a/tests/gtest/node_audio_test.cpp b/tests/gtest/node_audio_test.cpp index 9c5e8f288..c2b7e3431 100644 --- a/tests/gtest/node_audio_test.cpp +++ b/tests/gtest/node_audio_test.cpp @@ -227,7 +227,7 @@ TEST(PanNode, InputDefaults) EXPECT_EQ(int(pan.get_input_property(olive::PanNode::k_panning_input, QStringLiteral("view")) .toInt()), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); } TEST(PanNode, RetranslateSetsInputNames) @@ -489,7 +489,7 @@ TEST(VolumeNode, InputDefaults) EXPECT_EQ(int(volume.get_input_property(olive::VolumeNode::k_volume_input, QStringLiteral("view")) .toInt()), - int(olive::FloatSlider::k_decibel)); + int(olive::slider::k_decibel)); } TEST(VolumeNode, RetranslateSetsInputNames) diff --git a/tests/gtest/node_distort_test.cpp b/tests/gtest/node_distort_test.cpp index 603b4bd59..4b0f28f24 100644 --- a/tests/gtest/node_distort_test.cpp +++ b/tests/gtest/node_distort_test.cpp @@ -533,7 +533,7 @@ TEST(CropDistortNode, InputDefinitionsAndDefaults) EXPECT_DOUBLE_EQ( node.get_input_property(side, QStringLiteral("max")).toDouble(), 1.0); EXPECT_EQ(node.get_input_property(side, QStringLiteral("view")).toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); } EXPECT_DOUBLE_EQ( @@ -1521,7 +1521,7 @@ TEST(TileDistortNode, InputDefaults) EXPECT_EQ(node.get_input_property(olive::TileDistortNode::k_scale_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); EXPECT_EQ(node.get_standard_value(olive::TileDistortNode::k_position_input) .value(), diff --git a/tests/gtest/node_filter_keying_test.cpp b/tests/gtest/node_filter_keying_test.cpp index 5cce133b8..453c49d98 100644 --- a/tests/gtest/node_filter_keying_test.cpp +++ b/tests/gtest/node_filter_keying_test.cpp @@ -103,7 +103,7 @@ TEST(OpacityEffect, InputDefinitionsAndDefaults) EXPECT_EQ(node.get_input_property(olive::OpacityEffect::k_value_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); } TEST(OpacityEffect, Identity) @@ -616,7 +616,7 @@ TEST(DropShadowFilter, InputDefinitionsAndDefaults) EXPECT_EQ(node.get_input_property(olive::DropShadowFilter::k_opacity_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); EXPECT_FALSE( node.get_standard_value(olive::DropShadowFilter::k_fast_input).toBool()); } @@ -933,7 +933,7 @@ TEST(StrokeFilterNode, InputDefinitionsAndDefaults) EXPECT_EQ(node.get_input_property(olive::StrokeFilterNode::k_opacity_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); EXPECT_FALSE( node.get_standard_value(olive::StrokeFilterNode::k_inner_input).toBool()); } diff --git a/tests/gtest/node_generator_test.cpp b/tests/gtest/node_generator_test.cpp index f3d91ccf9..9d489c1d3 100644 --- a/tests/gtest/node_generator_test.cpp +++ b/tests/gtest/node_generator_test.cpp @@ -171,7 +171,7 @@ TEST(MatrixGenerator, InputDefaultsAndProperties) EXPECT_EQ(node->get_input_property(olive::MatrixGenerator::k_scale_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); EXPECT_EQ(node->get_input_property(olive::MatrixGenerator::k_scale_input, QStringLiteral("min")) .value(), @@ -676,7 +676,7 @@ TEST(NoiseGenerator, InputDefaults) EXPECT_EQ(node->get_input_property(olive::NoiseGeneratorNode::k_strength_input, QStringLiteral("view")) .toInt(), - int(olive::FloatSlider::k_percentage)); + int(olive::slider::k_percentage)); EXPECT_EQ(int(node->get_input_data_type(olive::NoiseGeneratorNode::k_color_input)), int(olive::NodeValue::k_boolean)); diff --git a/tests/gtest/task_project_test.cpp b/tests/gtest/task_project_test.cpp index ac8cadb5c..11fe04ccb 100644 --- a/tests/gtest/task_project_test.cpp +++ b/tests/gtest/task_project_test.cpp @@ -19,7 +19,7 @@ #include "node/project/serializer/serializer.h" #include "render/diskmanager.h" #include "task/project/import/import.h" -#include "task/project/import/importerrordialog.h" +#include "dialog/projectimport/projectimporterrordialog.h" #include "task/project/load/load.h" #include "undo/undocommand.h" diff --git a/tests/gtest/widget_slider_test.cpp b/tests/gtest/widget_slider_test.cpp index dd199062d..58a1b4f85 100644 --- a/tests/gtest/widget_slider_test.cpp +++ b/tests/gtest/widget_slider_test.cpp @@ -105,43 +105,43 @@ TEST(WidgetSlider, FloatRangeChangeClampsExistingValue) TEST(WidgetSlider, FloatDisplayTransformRoundTrips) { EXPECT_DOUBLE_EQ( - olive::FloatSlider::transform_value_to_display(0.5, olive::FloatSlider::k_percentage), + olive::FloatSlider::transform_value_to_display(0.5, olive::slider::k_percentage), 50.0); EXPECT_DOUBLE_EQ( - olive::FloatSlider::transform_display_to_value(50.0, olive::FloatSlider::k_percentage), + olive::FloatSlider::transform_display_to_value(50.0, olive::slider::k_percentage), 0.5); EXPECT_DOUBLE_EQ( - olive::FloatSlider::transform_value_to_display(1.0, olive::FloatSlider::k_decibel), + olive::FloatSlider::transform_value_to_display(1.0, olive::slider::k_decibel), 0.0); EXPECT_NEAR( - olive::FloatSlider::transform_value_to_display(0.5, olive::FloatSlider::k_decibel), + olive::FloatSlider::transform_value_to_display(0.5, olive::slider::k_decibel), -6.0206, 0.001); EXPECT_NEAR( olive::FloatSlider::transform_display_to_value( - olive::FloatSlider::transform_value_to_display(0.75, olive::FloatSlider::k_decibel), - olive::FloatSlider::k_decibel), + olive::FloatSlider::transform_value_to_display(0.75, olive::slider::k_decibel), + olive::slider::k_decibel), 0.75, 1e-12); EXPECT_DOUBLE_EQ( - olive::FloatSlider::transform_value_to_display(3.5, olive::FloatSlider::k_normal), + olive::FloatSlider::transform_value_to_display(3.5, olive::slider::k_normal), 3.5); EXPECT_DOUBLE_EQ( - olive::FloatSlider::transform_display_to_value(3.5, olive::FloatSlider::k_normal), + olive::FloatSlider::transform_display_to_value(3.5, olive::slider::k_normal), 3.5); } TEST(WidgetSlider, FloatStaticValueToStringRespectsDisplayType) { // Zero volume in decibel mode displays as an infinity symbol (U+221E) - EXPECT_EQ(olive::FloatSlider::value_to_string(0.0, olive::FloatSlider::k_decibel, 2, + EXPECT_EQ(olive::FloatSlider::value_to_string(0.0, olive::slider::k_decibel, 2, false), QString(QChar(0x221E))); - EXPECT_EQ(olive::FloatSlider::value_to_string(0.5, olive::FloatSlider::k_percentage, + EXPECT_EQ(olive::FloatSlider::value_to_string(0.5, olive::slider::k_percentage, 1, false), QStringLiteral("50.0")); - EXPECT_EQ(olive::FloatSlider::value_to_string(1.234, olive::FloatSlider::k_normal, + EXPECT_EQ(olive::FloatSlider::value_to_string(1.234, olive::slider::k_normal, 2, false), QStringLiteral("1.23")); } @@ -155,14 +155,14 @@ TEST(WidgetSlider, FloatLabelShowsFormattedValue) s.set_value(0.5); EXPECT_EQ(label->text(), QStringLiteral("0.50")); - s.set_display_type(olive::FloatSlider::k_percentage); + s.set_display_type(olive::slider::k_percentage); EXPECT_EQ(label->text(), QStringLiteral("50.00%")); s.set_format(QStringLiteral("%1 px")); EXPECT_EQ(label->text(), QStringLiteral("50.00 px")); s.clear_format(); - s.set_display_type(olive::FloatSlider::k_normal); + s.set_display_type(olive::slider::k_normal); EXPECT_EQ(label->text(), QStringLiteral("0.50")); } @@ -191,7 +191,7 @@ TEST(WidgetSlider, FloatStringToValueRejectsGarbage) TEST(WidgetSlider, FloatStringToValueRespectsDisplayType) { ExposedFloatSlider s; - s.set_display_type(olive::FloatSlider::k_percentage); + s.set_display_type(olive::slider::k_percentage); bool ok = false; QVariant v = s.string_to_value_public(QStringLiteral("50"), &ok); @@ -207,11 +207,11 @@ TEST(WidgetSlider, FloatDragDistanceRespectsDisplayType) EXPECT_DOUBLE_EQ(s.adjust_drag_public(1.0, 2.5).toDouble(), 3.5); // Percentage: drag is scaled by 1/100 - s.set_display_type(olive::FloatSlider::k_percentage); + s.set_display_type(olive::slider::k_percentage); EXPECT_DOUBLE_EQ(s.adjust_drag_public(0.5, 10.0).toDouble(), 0.6); // Decibel: drag happens in dB space - s.set_display_type(olive::FloatSlider::k_decibel); + s.set_display_type(olive::slider::k_decibel); const double expected = olive::Decibel::to_linear(olive::Decibel::from_linear(1.0) + 6.0); EXPECT_DOUBLE_EQ(s.adjust_drag_public(1.0, 6.0).toDouble(), expected);