From 94bb4103f83e8f8f9810b9ac30a183df8c8abb70 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sat, 15 Apr 2017 11:08:13 +0800 Subject: [PATCH] add new method for place.splitter renderer --- include/nana/gui/place.hpp | 7 ++++ source/gui/place.cpp | 32 ++++++++++++++++-- source/gui/place_parts.hpp | 67 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 100 insertions(+), 6 deletions(-) diff --git a/include/nana/gui/place.hpp b/include/nana/gui/place.hpp index 176c7bd4..6ead606d 100644 --- a/include/nana/gui/place.hpp +++ b/include/nana/gui/place.hpp @@ -22,6 +22,11 @@ namespace nana { + namespace paint + { + class graphics; + } + class widget; namespace detail { @@ -111,6 +116,8 @@ namespace nana */ void bind(window handle); window window_handle() const; + + void splitter_renderer(std::function fn); void div(const char* s); ///< Divides the attached widget into fields. const std::string& div() const noexcept; ///< Returns div-text that depends on fields status. diff --git a/source/gui/place.cpp b/source/gui/place.cpp index 102c4208..523a0c2c 100644 --- a/source/gui/place.cpp +++ b/source/gui/place.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -582,6 +583,9 @@ namespace nana std::map docks; std::map dock_factoris; + std::function split_renderer; + std::set splitters; + //A temporary pointer used to refer to a specified div object which //will be deleted in modification process. std::unique_ptr tmp_replaced; @@ -1601,9 +1605,24 @@ namespace nana impl_(impl), init_weight_(init_weight) { + impl->splitters.insert(this); + this->splitter_.set_renderer(impl_->split_renderer); + this->weight.assign(splitter_px); } + ~div_splitter() + { + impl_->splitters.erase(this); + } + + void set_renderer(const std::function & fn, bool update) + { + this->splitter_.set_renderer(fn); + if (update && this->splitter_.handle()) + API::refresh_window(this->splitter_); + } + void direction(bool horizontal) noexcept { splitter_cursor_ = (horizontal ? cursor::size_we : cursor::size_ns); @@ -1943,7 +1962,7 @@ namespace nana private: implement* const impl_; nana::cursor splitter_cursor_{nana::cursor::arrow}; - place_parts::splitter splitter_; + place_parts::splitter splitter_; nana::point begin_point_; int left_pos_, right_pos_; unsigned left_pixels_, right_pixels_; @@ -2510,8 +2529,7 @@ namespace nana } } - for (auto & el : field.second->elements) - API::show_window(el.handle, is_show); + field.second->visible(is_show); } } } @@ -3009,6 +3027,14 @@ namespace nana return impl_->window_handle; } + void place::splitter_renderer(std::function fn) + { + impl_->split_renderer.swap(fn); + + for (auto sp : impl_->splitters) + sp->set_renderer(impl_->split_renderer, true); + } + void place::div(const char* s) { place_parts::tokenizer tknizer(s); diff --git a/source/gui/place_parts.hpp b/source/gui/place_parts.hpp index a3f5c8ae..d7dd0607 100644 --- a/source/gui/place_parts.hpp +++ b/source/gui/place_parts.hpp @@ -29,16 +29,77 @@ namespace nana virtual ~splitter_interface(){} }; - template + class drawer_splitter + : public drawer_trigger + { + public: + void set_renderer(const std::function& rd) + { + renderer_ = rd; + } + private: + void attached(widget_reference wdg, graph_reference) override + { + window_handle_ = wdg; + } + + void refresh(graph_reference graph) override + { + API::dev::copy_transparent_background(window_handle_, graph); + if (renderer_) + renderer_(window_handle_, graph, API::mouse_action(window_handle_)); + } + + void mouse_enter(graph_reference graph, const arg_mouse&) override + { + refresh(graph); + API::dev::lazy_refresh(); + } + + void mouse_move(graph_reference graph, const arg_mouse&) override + { + refresh(graph); + API::dev::lazy_refresh(); + } + + void mouse_leave(graph_reference graph, const arg_mouse&) override + { + refresh(graph); + API::dev::lazy_refresh(); + } + + void mouse_down(graph_reference graph, const arg_mouse&) + { + refresh(graph); + API::dev::lazy_refresh(); + } + + void mouse_up(graph_reference graph, const arg_mouse&) + { + refresh(graph); + API::dev::lazy_refresh(); + } + private: + window window_handle_{nullptr}; + std::function renderer_; + }; + class splitter - : public widget_object ::type, drawer_trigger>, + : public widget_object, public splitter_interface { + public: + void set_renderer(const std::function& rd) + { + get_drawer_trigger().set_renderer(rd); + } private: void _m_complete_creation() override { this->caption("place-splitter"); - widget_object ::type, drawer_trigger>::_m_complete_creation(); + widget_object::_m_complete_creation(); + + API::effects_bground(*this, effects::bground_transparent(0), 0); } };