From be031e9b7f9196af5f971f7fcf2742d606e24ac9 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Fri, 17 Jul 2015 01:41:03 +0800 Subject: [PATCH] modify group methods, fix a compiling-error --- include/nana/gui/detail/general_events.hpp | 32 ++--- include/nana/gui/widgets/group.hpp | 27 ++-- source/gui/detail/native_window_interface.cpp | 2 +- source/gui/widgets/group.cpp | 135 +++++++++++------- 4 files changed, 116 insertions(+), 80 deletions(-) diff --git a/include/nana/gui/detail/general_events.hpp b/include/nana/gui/detail/general_events.hpp index 618115dc..9ea5140e 100644 --- a/include/nana/gui/detail/general_events.hpp +++ b/include/nana/gui/detail/general_events.hpp @@ -514,27 +514,27 @@ namespace nana struct general_events { virtual ~general_events(){} - basic_event mouse_enter; ///< the cursor enters the window - basic_event mouse_move; ///< the cursor moves on the window - basic_event mouse_leave; ///< the cursor leaves the window - basic_event mouse_down; ///< the user presses the mouse button - basic_event mouse_up; ///< the user presses the mouse button - basic_event click; ///< the window is clicked, but occurs after mouse_down and before mouse_up - basic_event dbl_click; ///< the window is double clicked - basic_event mouse_wheel; ///< the mouse wheel rotates while the window has focus + basic_event mouse_enter; ///< the cursor enters the window + basic_event mouse_move; ///< the cursor moves on the window + basic_event mouse_leave; ///< the cursor leaves the window + basic_event mouse_down; ///< the user presses the mouse button + basic_event mouse_up; ///< the user presses the mouse button + basic_event click; ///< the window is clicked, but occurs after mouse_down and before mouse_up + basic_event dbl_click; ///< the window is double clicked + basic_event mouse_wheel; ///< the mouse wheel rotates while the window has focus basic_event mouse_dropfiles; ///< the mouse drops some external data while the window enable accepting files - basic_event expose; ///< the visibility changes - basic_event focus; ///< the window receives or loses keyboard focus + basic_event expose; ///< the visibility changes + basic_event focus; ///< the window receives or loses keyboard focus basic_event key_press; ///< a key is pressed while the window has focus. event code is event_code::key_press basic_event key_release; ///< a key is released while the window has focus. event code is event_code::key_release - basic_event key_char; ///< a character, whitespace or backspace is pressed. event code is event_code::key_char - basic_event shortkey; ///< a defined short key is pressed. event code is event_code::shortkey + basic_event key_char; ///< a character, whitespace or backspace is pressed. event code is event_code::key_char + basic_event shortkey; ///< a defined short key is pressed. event code is event_code::shortkey - basic_event move; ///< the window changes position - basic_event resizing; ///< the window is changing its size - basic_event resized; ///< the window is changing its size + basic_event move; ///< the window changes position + basic_event resizing; ///< the window is changing its size + basic_event resized; ///< the window is changing its size - basic_event destroy; ///< the window is destroyed, but occurs when all children have been destroyed + basic_event destroy; ///< the window is destroyed, but occurs when all children have been destroyed }; namespace detail diff --git a/include/nana/gui/widgets/group.hpp b/include/nana/gui/widgets/group.hpp index cff1f21e..77abd8cc 100644 --- a/include/nana/gui/widgets/group.hpp +++ b/include/nana/gui/widgets/group.hpp @@ -26,29 +26,38 @@ namespace nana{ { struct implement; public: - group( window parent, ///< - std::wstring titel_ ={STR("")}, ///< - bool format =false, ///< Use a formated label? - unsigned gap =2, ///< betwen the content and the external limit - rectangle r ={} ///< - ); + using field_reference = place::field_reference; + /// The default construction + group(); + + /// The construction that creates the widget + group(window parent, const rectangle& = {}, bool visible = true); + + /// The destruction ~group(); + group& enable_format_caption(bool format); + + place& get_place(); + + void collocate(); + void div(const char* div_str); + field_reference operator[](const char* field); + template Widget* create_child(const char* field, Args && ... args) { - auto wdg = new Widget(inner(), std::forward(args)...); + auto wdg = new Widget(handle(), std::forward(args)...); _m_add_child(field, wdg); return wdg; } - - window inner(); private: void _m_add_child(const char* field, widget*); + void _m_complete_creation() override; ::nana::string _m_caption() const override; void _m_caption(::nana::string&&) override; private: diff --git a/source/gui/detail/native_window_interface.cpp b/source/gui/detail/native_window_interface.cpp index 8d33f2b1..cc6f8802 100644 --- a/source/gui/detail/native_window_interface.cpp +++ b/source/gui/detail/native_window_interface.cpp @@ -21,7 +21,7 @@ #include #endif #include - #include + #include "../../paint/detail/image_ico.hpp" #elif defined(NANA_X11) #include #include diff --git a/source/gui/widgets/group.cpp b/source/gui/widgets/group.cpp index 5b61a9e3..71d8cc58 100644 --- a/source/gui/widgets/group.cpp +++ b/source/gui/widgets/group.cpp @@ -23,76 +23,67 @@ namespace nana{ struct group::implement { - label caption; - panel content; - place place_outter; - place place_content; + label caption; + place place_content; - implement(group* host): - caption(*host), - content(*host), - place_outter(*host), - place_content(content) - {} + unsigned gap{2}; + + void create(window pnl) + { + caption.create(pnl); + place_content.bind(pnl); + } }; - group::group( window parent, ///< - std::wstring titel_ /*={}*/, ///< - bool format /*=false*/, ///< - unsigned gap /*=2*/, ///< - rectangle r /*={} */ ///< - ) - : panel (parent, r), - impl_(new implement(this)) + group::group() + : impl_(new implement) { - impl_->caption.format(format); - ::nana::size sz = impl_->caption.measure(1000); - std::stringstream ft; - - ft << "vert margin=[0," << gap << ","< >" - << " "; - - auto & outter = impl_->place_outter; - - outter.div(ft.str().c_str()); - - outter["titel"] << impl_->caption; - outter["content"] << impl_->content; - outter.collocate(); - - color pbg = API::bgcolor( parent); - impl_->caption.bgcolor(pbg.blend(colors::black, 0.975) ); - color bg=pbg.blend(colors::black, 0.950 ); - - bgcolor(pbg); - impl_->content.bgcolor(bg); - - drawing dw(*this); - - // This drawing function is owner by the onwer of dw (the outer panel of the group widget), not by dw !! - dw.draw([gap, sz, bg, pbg](paint::graphics& graph) - { - graph.rectangle(true, pbg); - graph.round_rectangle(rectangle(point(gap - 1, sz.height / 2), - nana::size(graph.width() - 2 * (gap - 1), graph.height() - sz.height / 2 - (gap - 1)) - ), - 3, 3, colors::gray_border, true, bg); - }); } + group::group(window parent, const rectangle& r, bool vsb) + : group() + { + create(parent, r, vsb); + } + + group::~group() { } + group& group::enable_format_caption(bool format) + { + impl_->caption.format(format); + return *this; + } + place& group::get_place() { return impl_->place_content; } - window group::inner() + + void group::collocate() { - return impl_->content; + impl_->place_content.collocate(); + } + + void group::div(const char* div_str) + { + ::nana::size sz = impl_->caption.measure(1000); + + std::stringstream ss; + ss << "vert margin=[0," << impl_->gap << "," << impl_->gap << "," << impl_->gap << "]" + << " >" + << " <"<<(div_str ? div_str : "")<<">"; + + impl_->place_content.div(ss.str().c_str()); + + } + + group::field_reference group::operator[](const char* field) + { + return impl_->place_content.field(field); } void group::_m_add_child(const char* field, widget* wdg) @@ -100,6 +91,42 @@ namespace nana{ impl_->place_content[field] << wdg->handle(); } + void group::_m_complete_creation() + { + panel::_m_complete_creation(); + + impl_->create(handle()); + + this->div(nullptr); + + auto & outter = impl_->place_content; + + outter["nanaGroupTitle2015"] << impl_->caption; + outter.collocate(); + + color pbg = API::bgcolor(this->parent()); + impl_->caption.bgcolor(pbg.blend(colors::black, 0.975)); + color bg = pbg.blend(colors::black, 0.950); + + bgcolor(pbg); + + drawing dw(*this); + + ::nana::size sz = impl_->caption.measure(1000); + + // This drawing function is owner by the onwer of dw (the outer panel of the group widget), not by dw !! + dw.draw([this, sz, bg, pbg](paint::graphics& graph) + { + auto gap_px = impl_->gap - 1; + + graph.rectangle(true, pbg); + graph.round_rectangle(rectangle(point(gap_px, sz.height / 2), + nana::size(graph.width() - 2 * gap_px, graph.height() - sz.height / 2 - gap_px) + ), + 3, 3, colors::gray_border, true, bg); + }); + } + ::nana::string group::_m_caption() const { return impl_->caption.caption();