diff --git a/include/nana/gui/widgets/listbox.hpp b/include/nana/gui/widgets/listbox.hpp index b5781ad2..ccd03e35 100644 --- a/include/nana/gui/widgets/listbox.hpp +++ b/include/nana/gui/widgets/listbox.hpp @@ -502,7 +502,7 @@ namespace nana /// Determines whether expension/shrink of category is blocked bool category_change_blocked() const noexcept; - arg_category(const drawerbase::listbox::cat_proxy&) noexcept; + arg_category(const drawerbase::listbox::cat_proxy&) noexcept; private: mutable bool block_change_; }; diff --git a/source/gui/widgets/combox.cpp b/source/gui/widgets/combox.cpp index a4631668..a5bed1fa 100644 --- a/source/gui/widgets/combox.cpp +++ b/source/gui/widgets/combox.cpp @@ -171,7 +171,7 @@ namespace nana if(editor_) { editor_->editable(enb); - + editor_->show_caret(enb); if (!enb) { editor_->ext_renderer().background = [this](graph_reference graph, const ::nana::rectangle&, const ::nana::color&) @@ -245,22 +245,23 @@ namespace nana void open_lister_if_push_button_positioned() { - if((nullptr == state_.lister) && !items_.empty() && (parts::push_button == state_.pointer_where)) - { - module_.items.clear(); - std::copy(items_.cbegin(), items_.cend(), std::back_inserter(module_.items)); - state_.lister = &form_loader()(widget_->handle(), nana::rectangle(0, widget_->size().height, widget_->size().width, 10), true); - state_.lister->renderer(item_renderer_); - state_.lister->set_module(module_, image_pixels_); - state_.item_index_before_selection = module_.index; - //The lister window closes by itself. I just take care about the destroy event. - //The event should be destroy rather than unload. Because the unload event is invoked while - //the lister is not closed, if popuping a message box, the lister will cover the message box. - state_.lister->events().destroy.connect_unignorable([this] + if(nullptr == state_.lister && !items_.empty()) + if((parts::push_button == state_.pointer_where && editor_->attr().editable) || !editor_->attr().editable) { - _m_lister_close_sig(); - }); - } + module_.items.clear(); + std::copy(items_.cbegin(), items_.cend(), std::back_inserter(module_.items)); + state_.lister = &form_loader()(widget_->handle(), nana::rectangle(0, widget_->size().height, widget_->size().width, 10), true); + state_.lister->renderer(item_renderer_); + state_.lister->set_module(module_, image_pixels_); + state_.item_index_before_selection = module_.index; + //The lister window closes by itself. I just take care about the destroy event. + //The event should be destroy rather than unload. Because the unload event is invoked while + //the lister is not closed, if popuping a message box, the lister will cover the message box. + state_.lister->events().destroy.connect_unignorable([this] + { + _m_lister_close_sig(); + }); + } } void scroll_items(bool upwards) @@ -622,8 +623,8 @@ namespace nana if(drawer_->widget_ptr()->enabled()) { auto * editor = drawer_->editor(); - if (!editor->mouse_pressed(arg)) - drawer_->open_lister_if_push_button_positioned(); + editor->mouse_pressed(arg); + drawer_->open_lister_if_push_button_positioned(); drawer_->draw(); if(editor->attr().editable) diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index bf1260cc..f58ac172 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -4360,18 +4360,17 @@ namespace nana //Implementation of arg_category //Contributed by leobackes(pr#97) - arg_category::arg_category ( const nana::drawerbase::listbox::cat_proxy& cat ) noexcept : category(cat), block_change_(false) { } - void arg_category::block_category_change() const noexcept + void arg_category::block_category_change() const noexcept { block_change_ = true; } - bool arg_category::category_change_blocked() const noexcept + bool arg_category::category_change_blocked() const noexcept { return block_change_; } diff --git a/source/gui/widgets/skeletons/text_editor.cpp b/source/gui/widgets/skeletons/text_editor.cpp index 0c8cf46a..c31f23aa 100644 --- a/source/gui/widgets/skeletons/text_editor.cpp +++ b/source/gui/widgets/skeletons/text_editor.cpp @@ -1635,11 +1635,14 @@ namespace nana{ namespace widgets bool text_editor::mouse_move(bool left_button, const point& scrpos) { cursor cur = cursor::iterm; - if ((!hit_text_area(scrpos)) && (!text_area_.captured)) + if(((!hit_text_area(scrpos)) && (!text_area_.captured)) || !attributes_.editable || !API::window_enabled(window_)) cur = cursor::arrow; API::window_cursor(window_, cur); + if(!attributes_.editable) + return false; + if(left_button) { mouse_caret(scrpos); @@ -1655,6 +1658,9 @@ namespace nana{ namespace widgets bool text_editor::mouse_pressed(const arg_mouse& arg) { + if(!attributes_.editable) + return false; + if (event_code::mouse_down == arg.evt_code) { if (!hit_text_area(arg.pos)) @@ -1790,6 +1796,9 @@ namespace nana{ namespace widgets reset_caret_pixels(); } + if(!attributes_.editable) + visible = false; + API::caret_visible(window_, visible); if(visible) @@ -3078,7 +3087,7 @@ namespace nana{ namespace widgets graph_.palette(false, scheme_->selection.get_color()); //The text is not selected or the whole line text is selected - if (!focused || (!_m_get_sort_select_points(a, b)) || (select_.a.y != str_pos.y && select_.b.y != str_pos.y)) + if(!focused || (!_m_get_sort_select_points(a, b)) || (select_.a.y != str_pos.y && select_.b.y != str_pos.y) || !attributes_.editable) { bool selected = (a.y < str_pos.y && str_pos.y < b.y); for (auto & ent : reordered)