Resolves tdf#127400 - Allow to show tip of the day again

* UNO command TipOfTheDay and slot SID_TIPOFTHEDAY
  introduced and added to help menus
* Tip ID introduced to keep the current tip over the day
* Tip ID updates after 24h
* Randomization of tips replaced by sequential order
* Tip ID added to the dialog title

Change-Id: I69b72b80d6d6afa25a1c4f01fa05bc60b5741db8
Reviewed-on: https://gerrit.libreoffice.org/78693
Tested-by: Jenkins
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
This commit is contained in:
Heiko Tietze 2019-09-06 10:34:54 +02:00 committed by Heiko Tietze
parent c8e2675ebd
commit 97bcd0e416
30 changed files with 95 additions and 25 deletions

View file

@ -159,6 +159,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -160,6 +160,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -263,6 +263,7 @@ const std::tuple<const char*, OUString, OUString> TIPOFTHEDAY_STRINGARRAY[] =
#define STR_HELP_LINK NC_("STR_HELP_LINK", "%PRODUCTNAME Help")
#define STR_MORE_LINK NC_("STR_MORE_LINK", "More info")
#define STR_TITLE NC_("STR_TITLE", "Tip of the Day")
#endif //INCLUDED_CUI_INC_TIPOFTHEDAY_HRC

View file

@ -28,7 +28,6 @@
#include <vcl/help.hxx>
#include <vcl/virdev.hxx>
#include <vcl/svapp.hxx>
#include <comphelper/random.hxx>
TipOfTheDayDialog::TipOfTheDayDialog(weld::Window* pParent)
: GenericDialogController(pParent, "cui/ui/tipofthedaydialog.ui", "TipOfTheDayDialog")
@ -38,11 +37,17 @@ TipOfTheDayDialog::TipOfTheDayDialog(weld::Window* pParent)
, m_pNext(m_xBuilder->weld_button("btnNext"))
, m_pLink(m_xBuilder->weld_link_button("btnLink"))
{
m_pShowTip->connect_toggled(LINK(this, TipOfTheDayDialog, OnShowTipToggled));
m_pShowTip->set_active(officecfg::Office::Common::Misc::ShowTipOfTheDay::get());
m_pNext->connect_clicked(LINK(this, TipOfTheDayDialog, OnNextClick));
nNumberOfTips = SAL_N_ELEMENTS(TIPOFTHEDAY_STRINGARRAY);
nCurrentTip = comphelper::rng::uniform_int_distribution(0, nNumberOfTips - 1);
nCurrentTip = officecfg::Office::Common::Misc::LastTipOfTheDayID::get();
const auto t0 = std::chrono::system_clock::now().time_since_epoch();
nDay = std::chrono::duration_cast<std::chrono::hours>(t0).count() / 24; //days since 1970-01-01
if (nDay > officecfg::Office::Common::Misc::LastTipOfTheDayShown::get())
nCurrentTip++;
UpdateTip();
}
@ -50,10 +55,9 @@ TipOfTheDayDialog::~TipOfTheDayDialog()
{
std::shared_ptr<comphelper::ConfigurationChanges> xChanges(
comphelper::ConfigurationChanges::create());
const auto t0 = std::chrono::system_clock::now().time_since_epoch();
const sal_Int32 nDay
= std::chrono::duration_cast<std::chrono::hours>(t0).count() / 24; // days since 1970-01-01
officecfg::Office::Common::Misc::LastTipOfTheDayShown::set(nDay, xChanges);
officecfg::Office::Common::Misc::LastTipOfTheDayID::set(nCurrentTip, xChanges);
officecfg::Office::Common::Misc::ShowTipOfTheDay::set(m_pShowTip->get_active(), xChanges);
xChanges->commit();
}
@ -65,6 +69,11 @@ static bool file_exists(const OUString& fileName)
void TipOfTheDayDialog::UpdateTip()
{
if ((nCurrentTip + 1 > nNumberOfTips) || (nCurrentTip < 0))
nCurrentTip = 0;
m_xDialog->set_title(CuiResId(STR_TITLE) + ": " + OUString::number(nCurrentTip + 1) + "/"
+ OUString::number(nNumberOfTips));
// text
OUString aText = CuiResId(std::get<0>(TIPOFTHEDAY_STRINGARRAY[nCurrentTip]));
m_pText->set_label(aText);
@ -110,14 +119,6 @@ void TipOfTheDayDialog::UpdateTip()
}
}
IMPL_STATIC_LINK(TipOfTheDayDialog, OnShowTipToggled, weld::ToggleButton&, rButton, void)
{
std::shared_ptr<comphelper::ConfigurationChanges> xChanges(
comphelper::ConfigurationChanges::create());
officecfg::Office::Common::Misc::ShowTipOfTheDay::set(rButton.get_active(), xChanges);
xChanges->commit();
}
IMPL_LINK_NOARG(TipOfTheDayDialog, OnLinkClick, weld::LinkButton&, void)
{
Application::GetHelp()->Start(aLink, static_cast<weld::Widget*>(nullptr));
@ -125,7 +126,7 @@ IMPL_LINK_NOARG(TipOfTheDayDialog, OnLinkClick, weld::LinkButton&, void)
IMPL_LINK_NOARG(TipOfTheDayDialog, OnNextClick, weld::Button&, void)
{
nCurrentTip = (nCurrentTip + 1) % nNumberOfTips;
nCurrentTip++; //zeroed at updatetip when out of range
UpdateTip();
}

View file

@ -30,11 +30,11 @@ private:
std::unique_ptr<weld::Button> m_pNext;
std::unique_ptr<weld::LinkButton> m_pLink;
sal_uInt32 nCurrentTip;
sal_uInt32 nNumberOfTips;
sal_Int32 nCurrentTip;
sal_Int32 nNumberOfTips;
sal_Int32 nDay;
OUString aLink;
void UpdateTip();
DECL_STATIC_LINK(TipOfTheDayDialog, OnShowTipToggled, weld::ToggleButton&, void);
DECL_LINK(OnNextClick, weld::Button&, void);
DECL_LINK(OnLinkClick, weld::LinkButton&, void);

View file

@ -147,6 +147,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -102,6 +102,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -86,6 +86,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -86,6 +86,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -111,6 +111,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -60,6 +60,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -61,6 +61,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -88,6 +88,8 @@ class SvxSearchItem;
#define SID_HELPTIPS (SID_SFX_START + 404)
#define SID_EMOJI_CONTROL (SID_SFX_START + 405)
#define SID_CHARMAP_CONTROL (SID_SFX_START + 406)
#define SID_TIPOFTHEDAY (SID_SFX_START + 407)
// free (SID_SFX_START + 410)
#define SID_SEND_FEEDBACK (SID_SFX_START + 421)
#define SID_Q_AND_A (SID_SFX_START + 422)

View file

@ -4985,6 +4985,20 @@
<value>1</value>
</prop>
</node>
<node oor:name=".uno:TipOfTheDay" oor:op="replace">
<prop oor:name="Label" oor:type="xs:string">
<value xml:lang="en-US">~Tip of the day</value>
</prop>
<prop oor:name="ContextLabel" oor:type="xs:string">
<value xml:lang="en-US">Show Tip-Of-The-Day</value>
</prop>
<prop oor:name="TooltipLabel" oor:type="xs:string">
<value xml:lang="en-US">Show the Tip-Of-The-Day dialog</value>
</prop>
<prop oor:name="Properties" oor:type="xs:int">
<value>1</value>
</prop>
</node>
<node oor:name=".uno:ViewDataSourceBrowser" oor:op="replace">
<prop oor:name="Label" oor:type="xs:string">
<value xml:lang="en-US">~Data Sources</value>

View file

@ -5513,6 +5513,12 @@
<info>
<desc>The last time when the Tip-of-the-day dialog was shown.</desc>
</info>
<value>-1</value> <!-- +1 every 24h -->
</prop>
<prop oor:name="LastTipOfTheDayID" oor:type="xs:int" oor:nillable="false">
<info>
<desc>The last shown Tip-of-the-day.</desc>
</info>
<value>0</value>
</prop>
<prop oor:name="UseOpenCL" oor:type="xs:boolean" oor:nillable="false">

View file

@ -277,6 +277,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -774,6 +774,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -631,6 +631,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -671,6 +671,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -56,6 +56,10 @@ interface Application
ExecMethod = MiscExec_Impl ;
StateMethod = MiscState_Impl ;
]
SID_TIPOFTHEDAY // ole(no) api(final/play/rec)
[
ExecMethod = MiscExec_Impl ;
]
SID_CONFIG // ole(no) api(final/play/rec)
[
ExecMethod = MiscExec_Impl ;

View file

@ -1889,6 +1889,23 @@ SfxBoolItem HelpTip SID_HELPTIPS
GroupId = SfxGroupId::Application;
]
SfxVoidItem TipOfTheDay SID_TIPOFTHEDAY
[
AutoUpdate = FALSE,
FastCall = FALSE,
ReadOnlyDoc = FALSE,
Toggle = FALSE,
Container = FALSE,
RecordAbsolute = FALSE,
RecordPerSet;
AccelConfig = TRUE,
MenuConfig = TRUE,
ToolBoxConfig = TRUE,
GroupId = SfxGroupId::Application;
]
SfxVoidItem EmojiControl SID_EMOJI_CONTROL

View file

@ -665,6 +665,15 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
rReq.AppendItem( SfxBoolItem( SID_HELPBALLOONS, bOn) );
break;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
case SID_TIPOFTHEDAY:
{
VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
ScopedVclPtr<VclAbstractDialog> pDlg(pFact->CreateTipOfTheDayDialog(rReq.GetFrameWeld()));
pDlg->Execute();
bDone = true;
break;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
case SID_ABOUT:

View file

@ -1315,13 +1315,9 @@ void SfxViewFrame::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
if (bShowTipOfTheDay && !Application::IsHeadlessModeEnabled() && !bIsUITest) {
const sal_Int32 nLastTipOfTheDay = officecfg::Office::Common::Misc::LastTipOfTheDayShown::get();
const sal_Int32 nDay = std::chrono::duration_cast<std::chrono::hours>(t0).count()/24; // days since 1970-01-01
if (nDay-nLastTipOfTheDay > 0) { //only once per day
VclAbstractDialogFactory* pFact = VclAbstractDialogFactory::Create();
ScopedVclPtr<VclAbstractDialog> pDlg(
pFact->CreateTipOfTheDayDialog(GetWindow().GetFrameWeld()));
pDlg->Execute();
}
}
if (nDay-nLastTipOfTheDay > 0) //only once per day
GetDispatcher()->Execute(SID_TIPOFTHEDAY);
} //bShowTipOfTheDay
// inform about the community involvement
const sal_Int64 nLastGetInvolvedShown = officecfg::Setup::Product::LastTimeGetInvolvedShown::get();

View file

@ -153,6 +153,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -780,6 +780,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -651,6 +651,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -732,6 +732,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -691,6 +691,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -786,6 +786,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>

View file

@ -779,6 +779,7 @@
<menu:menuitem menu:id=".uno:HelpIndex"/>
<menu:menuitem menu:id=".uno:ExtendedHelp"/>
<menu:menuitem menu:id=".uno:Documentation"/>
<menu:menuitem menu:id=".uno:TipOfTheDay"/>
<menu:menuseparator/>
<menu:menuitem menu:id=".uno:QuestionAnswers"/>
<menu:menuitem menu:id=".uno:SendFeedback"/>