From f697f4c3389158577168899cbf5010f020342dae Mon Sep 17 00:00:00 2001 From: Jinhao Date: Tue, 16 Apr 2019 03:54:16 +0800 Subject: [PATCH] uses std::chrono --- include/nana/gui/notifier.hpp | 6 ++++- include/nana/gui/timer.hpp | 24 +++++++++++++++---- include/nana/gui/widgets/scroll.hpp | 6 ++--- source/gui/notifier.cpp | 11 +++++---- source/gui/timer.cpp | 18 +++++++++----- source/gui/tooltip.cpp | 4 ++-- source/gui/widgets/menu.cpp | 4 ++-- source/gui/widgets/skeletons/content_view.cpp | 4 ++-- source/gui/widgets/spinbox.cpp | 6 ++--- source/gui/widgets/treebox.cpp | 2 +- 10 files changed, 55 insertions(+), 30 deletions(-) diff --git a/include/nana/gui/notifier.hpp b/include/nana/gui/notifier.hpp index 3e136cdb..31cf28f1 100644 --- a/include/nana/gui/notifier.hpp +++ b/include/nana/gui/notifier.hpp @@ -1,7 +1,7 @@ /* * Definition of Notifier * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -59,7 +59,11 @@ namespace nana void text(const ::std::string&); void icon(const ::std::string& icon_file); void insert_icon(const ::std::string& icon_file); +#if 0 //deprecated void period(unsigned millisecond); +#else + void period(std::chrono::milliseconds time); +#endif detail::notifier_events& events(); window handle() const; private: diff --git a/include/nana/gui/timer.hpp b/include/nana/gui/timer.hpp index 32e3f2a5..68ccfe08 100644 --- a/include/nana/gui/timer.hpp +++ b/include/nana/gui/timer.hpp @@ -1,6 +1,6 @@ /* * A Timer Implementation - * Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -11,6 +11,8 @@ * A timer can repeatedly call a piece of code. The duration between * calls is specified in milliseconds. Timer is defferent from other graphics * controls, it has no graphics interface. + * + * @contributors: rbrugo(#417) */ #ifndef NANA_GUI_TIMER_HPP @@ -38,12 +40,16 @@ namespace nana timer& operator=(timer&&) = delete; public: timer(); +#if 0 //deprecated [[deprecated("prefer a std::chrono::duration (like std::chrono::milliseconds) over " "raw integers for durations")]] timer(unsigned int ms) : timer{} { interval_(ms); } /// Accepts an initial interval in ms + template /// Accepts an initial interval in any chrono unit explicit timer(std::chrono::duration const & time) : timer{} { interval(time); } - +#else + explicit timer(std::chrono::milliseconds ms); +#endif ~timer(); template @@ -57,22 +63,30 @@ namespace nana bool started() const; void stop(); +#if 0 //deprecated [[deprecated("prefer a std::chrono::duration (like std::chrono::milliseconds) over " "raw integers for durations")]] inline void interval(unsigned milliseconds) { interval_(milliseconds); } + template inline void interval(std::chrono::duration const & time_interval) ///< Set the duration between calls, accepts std::chrono { - interval_(std::chrono::duration_cast(time_interval).count()); + _m_interval(static_cast(std::chrono::duration_cast(time_interval).count())); } +#else + void interval(std::chrono::milliseconds ms); +#endif + +#if 0 //deprecated unsigned interval() const; +#endif template inline Duration interval() const { - return std::chrono::duration_cast(std::chrono::milliseconds(interval)); + return std::chrono::duration_cast(std::chrono::milliseconds{ _m_interval() }); } private: - void interval_(unsigned milliseconds); ///< Set the duration between calls (millisec ??) + unsigned _m_interval() const; private: nana::basic_event elapse_; implement * const impl_; diff --git a/include/nana/gui/widgets/scroll.hpp b/include/nana/gui/widgets/scroll.hpp index 350e2e62..10bacf82 100644 --- a/include/nana/gui/widgets/scroll.hpp +++ b/include/nana/gui/widgets/scroll.hpp @@ -1,7 +1,7 @@ /** * A Scroll Implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -258,7 +258,7 @@ namespace nana case buttons::first: case buttons::second: make_step(drawer_.metrics.what == buttons::second, 1); - timer_.interval(1000); + timer_.interval(std::chrono::seconds{1}); timer_.start(); break; case buttons::scroll: @@ -321,7 +321,7 @@ namespace nana { make_step(drawer_.metrics.what == buttons::second, 1); API::refresh_window(widget_->handle()); - timer_.interval(100); + timer_.interval(std::chrono::milliseconds{ 100 }); } private: ::nana::scroll * widget_; diff --git a/source/gui/notifier.cpp b/source/gui/notifier.cpp index 356d90f8..ddb9b3d6 100644 --- a/source/gui/notifier.cpp +++ b/source/gui/notifier.cpp @@ -1,7 +1,7 @@ /* * Implementation of Notifier * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -351,13 +351,14 @@ namespace nana #endif } - void notifier::period(unsigned ms) + void notifier::period(std::chrono::milliseconds ms) { #if defined(NANA_WINDOWS) - if (ms && impl_->icons.size()) + if (ms.count() && impl_->icons.size()) { - ms /= static_cast(impl_->icons.size()); - impl_->ani_timer.interval(ms < 16 ? 16 : ms); + auto frame_ms = (std::max)(ms.count() / static_cast(impl_->icons.size()), static_cast(16)); + + impl_->ani_timer.interval(std::chrono::milliseconds{frame_ms}); impl_->ani_timer.start(); } else diff --git a/source/gui/timer.cpp b/source/gui/timer.cpp index 4fe9abf4..fa76a930 100644 --- a/source/gui/timer.cpp +++ b/source/gui/timer.cpp @@ -1,7 +1,7 @@ /* * A Timer Implementation * Nana C++ Library(http://www.nanapro.org) - * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com) + * Copyright(C) 2003-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -174,6 +174,12 @@ namespace nana : impl_(new implement) { } + + timer::timer(std::chrono::milliseconds ms): + timer() + { + this->interval(ms); + } timer::~timer() { @@ -220,17 +226,17 @@ namespace nana timer_driver::instance().destroy(tmid); } - void timer::interval_(unsigned ms) + void timer::interval(std::chrono::milliseconds ms) { - if (ms != impl_->interval) + if (ms.count() != static_cast(impl_->interval)) { - impl_->interval = ms; + impl_->interval = static_cast(ms.count()); if (impl_->tm_core) - impl_->tm_core->interval(ms); + impl_->tm_core->interval(impl_->interval); } } - unsigned timer::interval() const + unsigned timer::_m_interval() const { return impl_->interval; } diff --git a/source/gui/tooltip.cpp b/source/gui/tooltip.cpp index 34692036..429c2cc4 100644 --- a/source/gui/tooltip.cpp +++ b/source/gui/tooltip.cpp @@ -86,12 +86,12 @@ namespace nana timer_.reset(); if (duration_) { - timer_.interval(static_cast(duration_)); + timer_.interval(std::chrono::milliseconds{ duration_ }); timer_.elapse(std::bind(&tip_form::_m_tick_duration, this)); } else { - timer_.interval(500); + timer_.interval(std::chrono::milliseconds{ 500 }); timer_.elapse(std::bind(&tip_form::_m_tick, this)); } timer_.start(); diff --git a/source/gui/widgets/menu.cpp b/source/gui/widgets/menu.cpp index 26b21812..521f0828 100644 --- a/source/gui/widgets/menu.cpp +++ b/source/gui/widgets/menu.cpp @@ -1,7 +1,7 @@ /* * A Menu implementation * Nana C++ Library(http://www.nanapro.org) -* Copyright(C) 2009-2017 Jinhao(cnjinhao@hotmail.com) +* Copyright(C) 2009-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -819,7 +819,7 @@ namespace nana events.mouse_down.connect_unignorable(fn); events.mouse_up.connect_unignorable(fn); - timer_.interval(100); + timer_.interval(std::chrono::milliseconds{ 100 }); timer_.elapse([this]{ this->_m_open_sub(500); //Try to open submenu }); diff --git a/source/gui/widgets/skeletons/content_view.cpp b/source/gui/widgets/skeletons/content_view.cpp index 62c92ce9..c0b3a002 100644 --- a/source/gui/widgets/skeletons/content_view.cpp +++ b/source/gui/widgets/skeletons/content_view.cpp @@ -1,7 +1,7 @@ /* * A Content View Implementation * Nana C++ Library(http://www.nanapro.org) -* Copyright(C) 2017-2018 Jinhao(cnjinhao@hotmail.com) +* Copyright(C) 2017-2019 Jinhao(cnjinhao@hotmail.com) * * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at @@ -132,7 +132,7 @@ namespace nana { } else if (this->drag_view_move && this->drive(arg.pos)) { - tmr.interval(16); + tmr.interval(std::chrono::milliseconds{ 16 }); tmr.start(); } } diff --git a/source/gui/widgets/spinbox.cpp b/source/gui/widgets/spinbox.cpp index 4a631c2c..74169085 100644 --- a/source/gui/widgets/spinbox.cpp +++ b/source/gui/widgets/spinbox.cpp @@ -275,11 +275,11 @@ namespace nana API::update_window(editor_->window_handle()); auto intv = timer_.interval(); - if (intv > 50) + if (intv.count() > 50) timer_.interval(intv / 2); }); - timer_.interval(600); + timer_.interval(std::chrono::milliseconds{ 600 }); } void attach(::nana::widget& wdg, ::nana::paint::graphics& graph) @@ -396,7 +396,7 @@ namespace nana API::release_capture(editor_->window_handle()); timer_.stop(); - timer_.interval(600); + timer_.interval(std::chrono::milliseconds{ 600 }); } if (buttons::none != spin_stated_) diff --git a/source/gui/widgets/treebox.cpp b/source/gui/widgets/treebox.cpp index 1d1a6c13..be8957a8 100644 --- a/source/gui/widgets/treebox.cpp +++ b/source/gui/widgets/treebox.cpp @@ -1735,7 +1735,7 @@ namespace nana } }); - impl_->adjust.timer.interval(16); + impl_->adjust.timer.interval(std::chrono::milliseconds{ 16 }); impl_->adjust.timer.start(); }