summaryrefslogtreecommitdiff
path: root/sdext/source/presenter
diff options
context:
space:
mode:
authorSrijan Bhatia <srijanbhatiasun@gmail.com>2020-06-09 20:42:05 +0530
committerHeiko Tietze <heiko.tietze@documentfoundation.org>2020-06-18 10:17:13 +0200
commit41d75ee814d71513922a12fae82f2e7eecbcd5f5 (patch)
tree3a307d8b458a451bdd8d81cb26ab2aeb810db95a /sdext/source/presenter
parent310271df2e4dc67d223dbec4b23e39ea4a67c042 (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/source/presenter')
-rw-r--r--sdext/source/presenter/PresenterController.hxx2
-rw-r--r--sdext/source/presenter/PresenterProtocolHandler.cxx75
-rw-r--r--sdext/source/presenter/PresenterToolBar.cxx105
-rw-r--r--sdext/source/presenter/PresenterWindowManager.cxx11
-rw-r--r--sdext/source/presenter/PresenterWindowManager.hxx2
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;