From 0e94346fc16c3e098eb5d6c169c1e0f22b570dc4 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 12 Apr 2017 06:40:06 +0800 Subject: [PATCH] add query of range for spinbox --- include/nana/gui/widgets/spinbox.hpp | 7 +++- source/gui/widgets/spinbox.cpp | 55 ++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 17 deletions(-) diff --git a/include/nana/gui/widgets/spinbox.hpp b/include/nana/gui/widgets/spinbox.hpp index 5b9b5a02..567a219c 100644 --- a/include/nana/gui/widgets/spinbox.hpp +++ b/include/nana/gui/widgets/spinbox.hpp @@ -95,8 +95,11 @@ namespace nana void range(double begin, double last, double step); /// Sets the string spin values. - void range(std::initializer_list values_utf8); - void range(std::initializer_list values); + void range(std::vector values_utf8); + + std::vector range_string() const; + std::pair range_int() const; + std::pair range_double() const; /// Gets the spined value ::std::string value() const; diff --git a/source/gui/widgets/spinbox.cpp b/source/gui/widgets/spinbox.cpp index c7262f37..d1751d17 100644 --- a/source/gui/widgets/spinbox.cpp +++ b/source/gui/widgets/spinbox.cpp @@ -54,6 +54,11 @@ namespace nana : begin_{ vbegin }, last_{ vlast }, step_{ step }, value_{ vbegin } {} + std::pair range() const + { + return std::make_pair(begin_, last_); + } + std::string value() const override { return std::to_string(value_); @@ -139,19 +144,14 @@ namespace nana : public range_interface { public: - range_text(std::initializer_list & initlist) - : texts_(initlist) + range_text(std::vector&& texts): + texts_(std::move(texts)) { - for (auto & s : initlist) - { - texts_.emplace_back(std::string{ s }); - } } - range_text(std::initializer_list& initlist) + const std::vector& range() const { - for (auto & s : initlist) - texts_.emplace_back(to_utf8(s)); + return texts_; } std::string value() const override @@ -318,6 +318,11 @@ namespace nana reset_text(); } + const range_interface* range() const + { + return range_.get(); + } + void modifier(std::string&& prefix, std::string&& suffix) { modifier_.prefix = std::move(prefix); @@ -637,18 +642,38 @@ namespace nana API::refresh_window(handle()); } - void spinbox::range(std::initializer_list steps_utf8) + void spinbox::range(std::vector values) { using namespace drawerbase::spinbox; - get_drawer_trigger().impl()->set_range(std::unique_ptr(new range_text(steps_utf8))); + get_drawer_trigger().impl()->set_range(std::unique_ptr(new range_text(std::move(values)))); API::refresh_window(handle()); } - void spinbox::range(std::initializer_list steps) + std::vector spinbox::range_string() const { - using namespace drawerbase::spinbox; - get_drawer_trigger().impl()->set_range(std::unique_ptr(new range_text(steps))); - API::refresh_window(handle()); + auto range = dynamic_cast(get_drawer_trigger().impl()->range()); + if (nullptr == range) + throw std::runtime_error("the type of spinbox range is not string"); + + return range->range(); + } + + std::pair spinbox::range_int() const + { + auto range = dynamic_cast*>(get_drawer_trigger().impl()->range()); + if (nullptr == range) + throw std::runtime_error("the type of spinbox range is not integer"); + + return range->range(); + } + + std::pair spinbox::range_double() const + { + auto range = dynamic_cast*>(get_drawer_trigger().impl()->range()); + if (nullptr == range) + throw std::runtime_error("the type of spinbox range is not double"); + + return range->range(); } ::std::string spinbox::value() const