diff options
author | Srijan Bhatia <srijanbhatiasun@gmail.com> | 2020-06-09 20:42:05 +0530 |
---|---|---|
committer | Heiko Tietze <heiko.tietze@documentfoundation.org> | 2020-06-18 10:17:13 +0200 |
commit | 41d75ee814d71513922a12fae82f2e7eecbcd5f5 (patch) | |
tree | 3a307d8b458a451bdd8d81cb26ab2aeb810db95a /sdext | |
parent | 310271df2e4dc67d223dbec4b23e39ea4a67c042 (diff) |
tdf#128964 Add time pause/resume button to Impress Presenter console
Change-Id: I7263c3a8000b4d5930692cd2e32e84a22893dd66
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95955
Tested-by: Jenkins
Tested-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Diffstat (limited to 'sdext')
-rw-r--r-- | sdext/source/presenter/PresenterController.hxx | 2 | ||||
-rw-r--r-- | sdext/source/presenter/PresenterProtocolHandler.cxx | 75 | ||||
-rw-r--r-- | sdext/source/presenter/PresenterToolBar.cxx | 105 | ||||
-rw-r--r-- | sdext/source/presenter/PresenterWindowManager.cxx | 11 | ||||
-rw-r--r-- | sdext/source/presenter/PresenterWindowManager.hxx | 2 |
5 files changed, 185 insertions, 10 deletions
diff --git a/sdext/source/presenter/PresenterController.hxx b/sdext/source/presenter/PresenterController.hxx index e860ce747fa3..400fb9174f11 100644 --- a/sdext/source/presenter/PresenterController.hxx +++ b/sdext/source/presenter/PresenterController.hxx @@ -63,6 +63,8 @@ class IPresentationTime { public: virtual void restart() = 0; + virtual bool isPaused() = 0; + virtual void setPauseStatus(const bool pauseStatus) = 0; virtual ~IPresentationTime(); }; diff --git a/sdext/source/presenter/PresenterProtocolHandler.cxx b/sdext/source/presenter/PresenterProtocolHandler.cxx index cb8cb6db2d27..029365e3b21d 100644 --- a/sdext/source/presenter/PresenterProtocolHandler.cxx +++ b/sdext/source/presenter/PresenterProtocolHandler.cxx @@ -90,6 +90,16 @@ namespace { rtl::Reference<PresenterController> mpPresenterController; }; + class PauseResumeCommand : public Command + { + public: + explicit PauseResumeCommand(const rtl::Reference<PresenterController>& rpPresenterController); + virtual void Execute() override; + virtual Any GetState() const override; + private: + rtl::Reference<PresenterController> mpPresenterController; + }; + /// This command restarts the presentation timer. class RestartTimerCommand : public Command { @@ -376,6 +386,8 @@ Command* PresenterProtocolHandler::Dispatch::CreateCommand ( return new GotoPreviousSlideCommand(rpPresenterController); if (rsURLPath == "SwitchMonitor") return new SwitchMonitorCommand(rpPresenterController); + if (rsURLPath == "PauseResumeTimer") + return new PauseResumeCommand(rpPresenterController); if (rsURLPath == "RestartTimer") return new RestartTimerCommand(rpPresenterController); if (rsURLPath == "ShowNotes") @@ -572,6 +584,56 @@ void SwitchMonitorCommand::Execute() mpPresenterController->SwitchMonitors(); } +//===== PauseResumeCommand ============================================== + +PauseResumeCommand::PauseResumeCommand (const rtl::Reference<PresenterController>& rpPresenterController) +: mpPresenterController(rpPresenterController) +{ +} + +void PauseResumeCommand::Execute() +{ + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference<PresenterWindowManager> pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + + if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime()) + { + if(pPresentationTime->isPaused()) + { + pPresentationTime->setPauseStatus(false); + pWindowManager->SetPauseState(false); + } + else + { + pPresentationTime->setPauseStatus(true); + pWindowManager->SetPauseState(true); + } + } +} + +Any PauseResumeCommand::GetState() const +{ + if ( ! mpPresenterController.is()) + return Any(false); + + ::rtl::Reference<PresenterWindowManager> pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return Any(false); + + if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime()) + { + return Any(pPresentationTime->isPaused()); + } + else + return Any(false); +} + RestartTimerCommand::RestartTimerCommand (const rtl::Reference<PresenterController>& rpPresenterController) : mpPresenterController(rpPresenterController) { @@ -579,8 +641,21 @@ RestartTimerCommand::RestartTimerCommand (const rtl::Reference<PresenterControll void RestartTimerCommand::Execute() { + if ( ! mpPresenterController.is()) + return; + + ::rtl::Reference<PresenterWindowManager> pWindowManager ( + mpPresenterController->GetWindowManager()); + if ( ! pWindowManager.is()) + return; + if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime()) + { + //Resets the pause status and restarts the timer + pPresentationTime->setPauseStatus(false); + pWindowManager->SetPauseState(false); pPresentationTime->restart(); + } } //===== SetNotesViewCommand =================================================== diff --git a/sdext/source/presenter/PresenterToolBar.cxx b/sdext/source/presenter/PresenterToolBar.cxx index a21cf2a1c5cb..a0a57c6d8b44 100644 --- a/sdext/source/presenter/PresenterToolBar.cxx +++ b/sdext/source/presenter/PresenterToolBar.cxx @@ -130,7 +130,8 @@ namespace { const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode); + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode); void CurrentSlideHasChanged(); void SetLocation (const awt::Point& rLocation); void SetSize (const geometry::RealSize2D& rSize); @@ -166,6 +167,7 @@ namespace { SharedElementMode mpMouseOver; SharedElementMode mpSelected; SharedElementMode mpDisabled; + SharedElementMode mpMouseOverSelected; SharedElementMode mpMode; bool mbIsOver; bool mbIsPressed; @@ -281,7 +283,8 @@ namespace { const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode) override; + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) override; private: CurrentTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar); virtual ~CurrentTimeLabel() override; @@ -297,11 +300,18 @@ namespace { const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode) override; + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) override; virtual void restart() override; + virtual bool isPaused() override; + virtual void setPauseStatus(const bool pauseStatus) override; + virtual TimeValue getPauseTimeValue(); + virtual void setPauseTimeValue(const TimeValue pauseTime); private: TimeValue maStartTimeValue; + TimeValue pauseTimeValue; PresentationTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar); + bool paused; virtual ~PresentationTimeLabel() override; virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override; }; @@ -628,10 +638,12 @@ void PresenterToolBar::ProcessEntry ( SharedElementMode pMouseOverMode = std::make_shared<ElementMode>(); SharedElementMode pSelectedMode = std::make_shared<ElementMode>(); SharedElementMode pDisabledMode = std::make_shared<ElementMode>(); + SharedElementMode pMouseOverSelectedMode = std::make_shared<ElementMode>(); pNormalMode->ReadElementMode(rxProperties, "Normal", pNormalMode, rContext); pMouseOverMode->ReadElementMode(rxProperties, "MouseOver", pNormalMode, rContext); pSelectedMode->ReadElementMode(rxProperties, "Selected", pNormalMode, rContext); pDisabledMode->ReadElementMode(rxProperties, "Disabled", pNormalMode, rContext); + pMouseOverSelectedMode->ReadElementMode(rxProperties, "MouseOverSelected", pSelectedMode, rContext); // Create new element. ::rtl::Reference<Element> pElement; @@ -655,7 +667,7 @@ void PresenterToolBar::ProcessEntry ( } if (pElement.is()) { - pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode); + pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode); pElement->UpdateState(); if (mpCurrentContainerPart) mpCurrentContainerPart->push_back(pElement); @@ -1130,6 +1142,7 @@ Element::Element ( mpMouseOver(), mpSelected(), mpDisabled(), + mpMouseOverSelected(), mpMode(), mbIsOver(false), mbIsPressed(false), @@ -1147,12 +1160,14 @@ void Element::SetModes ( const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode) + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) { mpNormal = rpNormalMode; mpMouseOver = rpMouseOverMode; mpSelected = rpSelectedMode; mpDisabled = rpDisabledMode; + mpMouseOverSelected = rpMouseOverSelectedMode; mpMode = rpNormalMode; } @@ -1201,6 +1216,8 @@ bool Element::SetState ( // When the element is selected then ignore mouse over. if ( ! mbIsEnabled) mpMode = mpDisabled; + else if (mbIsSelected && mbIsOver) + mpMode = mpMouseOverSelected; else if (mbIsSelected) mpMode = mpSelected; else if (mbIsOver) @@ -1751,9 +1768,10 @@ void CurrentTimeLabel::SetModes ( const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode) + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) { - TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode); + TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode); SetText(TimeFormatter::FormatTime(PresenterClockTimer::GetCurrentTime())); } @@ -1778,15 +1796,41 @@ PresentationTimeLabel::PresentationTimeLabel ( maStartTimeValue() { restart(); + setPauseStatus(false); + TimeValue pauseTime(0,0); + setPauseTimeValue(pauseTime); mpToolBar->GetPresenterController()->SetPresentationTime(this); } void PresentationTimeLabel::restart() { + TimeValue pauseTime(0, 0); + setPauseTimeValue(pauseTime); maStartTimeValue.Seconds = 0; maStartTimeValue.Nanosec = 0; } +bool PresentationTimeLabel::isPaused() +{ + return paused; +} + +void PresentationTimeLabel::setPauseStatus(const bool pauseStatus) +{ + paused = pauseStatus; +} + +TimeValue PresentationTimeLabel::getPauseTimeValue() +{ + return pauseTimeValue; +} + +void PresentationTimeLabel::setPauseTimeValue(const TimeValue pauseTime) +{ + //store the time at which the presentation was paused + pauseTimeValue = pauseTime; +} + void PresentationTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime) { TimeValue aCurrentTimeValue; @@ -1804,12 +1848,52 @@ void PresentationTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime) maStartTimeValue.Nanosec = 0; } + //The start time value is incremented by the amount of time + //the presentation was paused for in order to continue the + //timer from the same position + if(!isPaused()) + { + TimeValue pauseTime = getPauseTimeValue(); + if(pauseTime.Seconds != 0 || pauseTime.Nanosec != 0) + { + TimeValue incrementValue(0, 0); + incrementValue.Seconds = aCurrentTimeValue.Seconds - pauseTime.Seconds; + if(pauseTime.Nanosec > aCurrentTimeValue.Nanosec) + { + incrementValue.Nanosec = 1000000000 + aCurrentTimeValue.Nanosec - pauseTime.Nanosec; + } + else + { + incrementValue.Nanosec = aCurrentTimeValue.Nanosec - pauseTime.Nanosec; + } + + maStartTimeValue.Seconds += incrementValue.Seconds; + maStartTimeValue.Nanosec += incrementValue.Nanosec; + if(maStartTimeValue.Nanosec >= 1000000000) + { + maStartTimeValue.Seconds += 1; + maStartTimeValue.Nanosec -= 1000000000; + } + + TimeValue pauseTime_(0, 0); + setPauseTimeValue(pauseTime_); + } + } + else + { + TimeValue pauseTime = getPauseTimeValue(); + if(pauseTime.Seconds == 0 && pauseTime.Nanosec == 0) + { + setPauseTimeValue(aCurrentTimeValue); + } + } + TimeValue aElapsedTimeValue; aElapsedTimeValue.Seconds = aCurrentTimeValue.Seconds - maStartTimeValue.Seconds; aElapsedTimeValue.Nanosec = aCurrentTimeValue.Nanosec - maStartTimeValue.Nanosec; oslDateTime aElapsedDateTime; - if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime)) + if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime) && !isPaused()) { SetText(TimeFormatter::FormatTime(aElapsedDateTime)); Invalidate(false); @@ -1820,9 +1904,10 @@ void PresentationTimeLabel::SetModes ( const SharedElementMode& rpNormalMode, const SharedElementMode& rpMouseOverMode, const SharedElementMode& rpSelectedMode, - const SharedElementMode& rpDisabledMode) + const SharedElementMode& rpDisabledMode, + const SharedElementMode& rpMouseOverSelectedMode) { - TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode); + TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode); oslDateTime aStartDateTime; if (osl_getDateTimeFromTimeValue(&maStartTimeValue, &aStartDateTime)) diff --git a/sdext/source/presenter/PresenterWindowManager.cxx b/sdext/source/presenter/PresenterWindowManager.cxx index 713a14e15959..5f89cdfccc29 100644 --- a/sdext/source/presenter/PresenterWindowManager.cxx +++ b/sdext/source/presenter/PresenterWindowManager.cxx @@ -67,6 +67,7 @@ PresenterWindowManager::PresenterWindowManager ( meLayoutMode(LM_Generic), mbIsSlideSorterActive(false), mbIsHelpViewActive(false), + mbisPaused(false), maLayoutListeners(), mbIsMouseClickPending(false) { @@ -412,6 +413,16 @@ void PresenterWindowManager::SetHelpViewState (bool bIsActive) NotifyLayoutModeChange(); } +void PresenterWindowManager::SetPauseState (bool bIsPaused) +{ + if (mbisPaused == bIsPaused) + return; + + mbisPaused = bIsPaused; + + NotifyLayoutModeChange(); +} + void PresenterWindowManager::SetViewMode (const ViewMode eMode) { switch (eMode) diff --git a/sdext/source/presenter/PresenterWindowManager.hxx b/sdext/source/presenter/PresenterWindowManager.hxx index 0886f3538e81..9c032e6df433 100644 --- a/sdext/source/presenter/PresenterWindowManager.hxx +++ b/sdext/source/presenter/PresenterWindowManager.hxx @@ -83,6 +83,7 @@ public: void SetSlideSorterState (bool bIsActive); void SetHelpViewState (bool bIsActive); + void SetPauseState (bool bIsPaused); enum LayoutMode { LM_Standard, LM_Notes, LM_Generic }; private: @@ -163,6 +164,7 @@ private: LayoutMode meLayoutMode; bool mbIsSlideSorterActive; bool mbIsHelpViewActive; + bool mbisPaused; typedef ::std::vector<css::uno::Reference<css::document::XEventListener> > LayoutListenerContainer; LayoutListenerContainer maLayoutListeners; |