diff --git a/src/Mara/Gui/MainWindow.cpp b/src/Mara/Gui/MainWindow.cpp index a8685e7369c39c5a0138383454b7642d903ac9f6..7036622d838723f172427cae20c64219a5841cea 100644 --- a/src/Mara/Gui/MainWindow.cpp +++ b/src/Mara/Gui/MainWindow.cpp @@ -9,6 +9,7 @@ #include <QToolBar> #include <Gui/SelectionManager/SelectionManager.hpp> +#include <Gui/Timeline/Timeline.hpp> #include <Gui/Viewer/CameraManipulator.hpp> #include <Gui/Viewer/Gizmo/GizmoManager.hpp> #include <Gui/Viewer/Viewer.hpp> @@ -75,6 +76,52 @@ void MainWindow::cleanup() { m_viewer.reset( nullptr ); } +void MainWindow::addTimelineToolBar() { + auto timelineToolbar = new QToolBar( "Timeline", this ); + timelineToolbar->setAllowedAreas( Qt::BottomToolBarArea ); + timelineToolbar->setVisible( false ); + + // Add and connect timeline + m_timeline = new Ra::Gui::Timeline( this ); + m_timeline->onChangeEnd( Ra::Engine::RadiumEngine::getInstance()->getEndTime() ); + // Timeline setup + connect( m_timeline, &Ra::Gui::Timeline::playClicked, this, &MainWindow::timelinePlay ); + connect( + m_timeline, &Ra::Gui::Timeline::cursorChanged, this, &MainWindow::timelineGoTo ); + connect( m_timeline, + &Ra::Gui::Timeline::startChanged, + this, + &MainWindow::timelineStartChanged ); + connect( + m_timeline, &Ra::Gui::Timeline::endChanged, this, &MainWindow::timelineEndChanged ); + connect( m_timeline, + &Ra::Gui::Timeline::setPingPong, + this, + &MainWindow::timelineSetPingPong ); + connect( m_timeline, &Ra::Gui::Timeline::keyFrameChanged, [=]( Scalar ) { + emit frameUpdate(); + } ); + timelineToolbar->addWidget( m_timeline ); + + this->addToolBar( Qt::BottomToolBarArea, timelineToolbar ); + + auto showTimelineToolbar = new QAction( this ); + showTimelineToolbar->setObjectName( QString::fromUtf8( "showTimelineToolbar" ) ); + showTimelineToolbar->setCheckable( true ); + showTimelineToolbar->setChecked( false ); + showTimelineToolbar->setText( + QCoreApplication::translate( "MainWindow", "Timeline toolbar", nullptr ) ); + showTimelineToolbar->setToolTip( + QCoreApplication::translate( "MainWindow", "Show/hide the timeline toolbar", nullptr ) ); + + connect( showTimelineToolbar, &QAction::triggered, timelineToolbar, &QToolBar::setVisible ); + connect( timelineToolbar, &QToolBar::visibilityChanged, [showTimelineToolbar]( bool b ) { + showTimelineToolbar->setChecked( b ); + } ); + + menuToolbars->addAction( showTimelineToolbar ); +} + void MainWindow::addSelectionToolBar() { auto selectionToolBar = new QToolBar( "Selection toolbar", this ); @@ -175,6 +222,7 @@ void MainWindow::addSelectionToolBar() { void MainWindow::postOpenGLInitializations() { addSelectionToolBar(); + addTimelineToolBar(); } void MainWindow::createConnections() { @@ -233,7 +281,17 @@ Viewer* MainWindow::getViewer() { return m_viewer.get(); } -void MainWindow::onFrameComplete() {} +void MainWindow::onFrameComplete() { + // update timeline only if time changed, to allow manipulation of keyframed objects + auto engine = Ra::Engine::RadiumEngine::getInstance(); + if ( !Ra::Core::Math::areApproxEqual( m_timeline->getTime(), engine->getTime() ) ) + { + m_lockTimeSystem = true; + m_timeline->onChangeCursor( engine->getTime() ); + m_lockTimeSystem = false; + } + +} void MainWindow::activateCamera( const std::string& sceneName ) { // If a camera is in the given scene, use it, else, use default @@ -365,7 +423,7 @@ Ra::Gui::SelectionManager* MainWindow::getSelectionManager() { Ra::Gui::Timeline* MainWindow::getTimeline() { // mus return not null ? - return nullptr; + return m_timeline; } void MainWindow::ItemAdded( const ItemEntry& ent ) { @@ -438,4 +496,41 @@ void MainWindow::onSelectionChanged( const QItemSelection& /*selected*/, { emit selectedItem( ItemEntry() ); } } + +void MainWindow::timelinePlay( bool play ) { + actionPlay->setChecked( play ); + if ( !m_lockTimeSystem ) { + Ra::Engine::RadiumEngine::getInstance()->play( play ); + // mainApp->setContinuousUpdate( play ); + } +} + +void MainWindow::timelineGoTo( double t ) { + if ( !m_lockTimeSystem ) { + Ra::Engine::RadiumEngine::getInstance()->setTime( Scalar( t ) ); + emit frameUpdate(); + } +} + +void MainWindow::timelineStartChanged( double t ) { + if ( !m_lockTimeSystem ) { + Ra::Engine::RadiumEngine::getInstance()->setStartTime( Scalar( t ) ); + emit frameUpdate(); + } +} + +void MainWindow::timelineEndChanged( double t ) { + if ( !m_lockTimeSystem ) { + Ra::Engine::RadiumEngine::getInstance()->setEndTime( Scalar( t ) ); + emit frameUpdate(); + } +} + +void MainWindow::timelineSetPingPong( bool status ) { + if ( !m_lockTimeSystem ) { + Ra::Engine::RadiumEngine::getInstance()->setForwardBackward( status ); + emit frameUpdate(); + } +} + } // namespace Mara diff --git a/src/Mara/Gui/MainWindow.hpp b/src/Mara/Gui/MainWindow.hpp index ad25425cd5c22270758da779ee2a5e7fce3d34e0..791c3971af0d7180c77dbb804f4cd95f45cc20a3 100644 --- a/src/Mara/Gui/MainWindow.hpp +++ b/src/Mara/Gui/MainWindow.hpp @@ -154,10 +154,30 @@ class MainWindow : public Ra::Gui::MainWindowInterface, private Ui::MainWindow /// Slot to init renderers once gl is ready void postOpenGLInitializations(); + /// Slot for the user requesting to play/pause time through the timeline. + void timelinePlay( bool play ); + + /// Slot for the user requesting to change the current time through the timeline. + void timelineGoTo( double t ); + + /// Slot for the user requesting to change the start time through the timeline. + void timelineStartChanged( double t ); + + /// Slot for the user requesting to change the end time through the timeline. + void timelineEndChanged( double t ); + + /// Slot for the user requesting to change the time play mode through the timeline. + void timelineSetPingPong( bool status ); + private: /// add the selection toolbar void addSelectionToolBar(); + /// add the selection toolbar + void addTimelineToolBar(); + + bool m_lockTimeSystem{false}; + /// create the UI connections void createConnections(); @@ -181,6 +201,9 @@ class MainWindow : public Ra::Gui::MainWindowInterface, private Ui::MainWindow /// Stores the internal model of engine objects for selection and visibility. Ra::Gui::ItemModel* m_sceneModel; + /// Timeline gui + Ra::Gui::Timeline* m_timeline{nullptr}; + #ifdef SHOWTREEVIEW /// QTreeview of the scene QTreeView* m_sceneTreeView;