diff --git a/include/nana/gui/widgets/tabbar.hpp b/include/nana/gui/widgets/tabbar.hpp index f0bcb3b2..8236f639 100644 --- a/include/nana/gui/widgets/tabbar.hpp +++ b/include/nana/gui/widgets/tabbar.hpp @@ -287,12 +287,12 @@ namespace nana tabbar& append(std::wstring text, window attach_wd, value_type value = {}) { + if (attach_wd && API::empty_window(attach_wd)) + throw std::invalid_argument("tabbar.attach: invalid window handle"); + this->get_drawer_trigger().insert(::nana::npos, std::move(text), std::move(value)); if (attach_wd) - { - auto pos = this->get_drawer_trigger().length(); - relate(pos, attach_wd); - } + this->attach(this->get_drawer_trigger().length() - 1, attach_wd); API::update_window(*this); return *this; @@ -324,9 +324,12 @@ namespace nana this->get_drawer_trigger().attach(pos, wd); } - void attach(std::size_t pos, window wd) + void attach(std::size_t pos, window attach_wd) { - this->get_drawer_trigger().attach(pos, wd); + if (attach_wd && API::empty_window(attach_wd)) + throw std::invalid_argument("tabbar.attach: invalid window handle"); + + this->get_drawer_trigger().attach(pos, attach_wd); } void erase(std::size_t pos) diff --git a/source/gui/detail/window_layout.cpp b/source/gui/detail/window_layout.cpp index c2edb173..9f0e779e 100644 --- a/source/gui/detail/window_layout.cpp +++ b/source/gui/detail/window_layout.cpp @@ -24,12 +24,12 @@ namespace nana //class window_layout void window_layout::paint(core_window_t* wd, bool is_redraw, bool is_child_refreshed) { - if (wd->flags.refreshing || wd->drawer.graphics.empty()) + if (wd->flags.refreshing) return; if (nullptr == wd->effect.bground) { - if (is_redraw) + if (is_redraw && (!wd->drawer.graphics.empty())) { wd->flags.refreshing = true; wd->drawer.refresh(); @@ -305,7 +305,10 @@ namespace nana void window_layout::_m_paint_glass_window(core_window_t* wd, bool is_redraw, bool is_child_refreshed, bool called_by_notify, bool notify_other) { - if (wd->flags.refreshing && is_redraw) return; + //A window which has an empty graphics(and lite-widget) does not notify + //glass windows for updating their background. + if ((wd->flags.refreshing && is_redraw) || wd->drawer.graphics.empty()) + return; nana::rectangle vr; if (read_visual_rectangle(wd, vr)) diff --git a/source/gui/widgets/listbox.cpp b/source/gui/widgets/listbox.cpp index cb748b0d..ef8b18a0 100644 --- a/source/gui/widgets/listbox.cpp +++ b/source/gui/widgets/listbox.cpp @@ -2006,23 +2006,50 @@ namespace nana void adjust_scroll_value() { + const auto graph_size = graph->size(); if(scroll.h.empty() == false) { - unsigned width = 4 + (scroll.v.empty() ? 0 : scroll.scale - 1); - if(width >= graph->width()) return; - scroll.h.amount(header.pixels()); - scroll.h.range(graph->width() - width); + const auto ext_px = (4 + (scroll.v.empty() ? 0 : scroll.scale - 1)); + if (ext_px > graph_size.width) + return; + + const auto header_px = header.pixels(); + const unsigned window_px = graph_size.width - (4 + (scroll.v.empty() ? 0 : scroll.scale - 1)); + + if (header_px < window_px + scroll.offset_x) + { + scroll.offset_x = header_px - window_px; + } + + scroll.h.amount(header_px); + scroll.h.range(window_px); scroll.h.value(scroll.offset_x); scroll.h.step(graph->text_extent_size(L"W").width); } if(scroll.v.empty() == false) { - unsigned height = 2 + (scroll.h.empty() ? 0 : scroll.scale); - if(height >= graph->height()) return; + const auto ext_px = 2 + (scroll.h.empty() ? 0 : scroll.scale); + if (ext_px >= graph_size.height) + return; + + const auto items = lister.the_number_of_expanded(); + const auto disp_items = number_of_lister_items(false); + + size_type off = lister.distance({ 0, 0 }, scroll.offset_y_dpl); + + if (items < disp_items + off) + { + index_pair pos; + if (lister.forward({ 0, 0 }, items - disp_items, pos)) + { + off = items - disp_items; + set_scroll_y_dpl(pos); + } + } + scroll.v.amount(lister.the_number_of_expanded()); scroll.v.range(number_of_lister_items(false)); - size_type off = lister.distance({0,0}, scroll.offset_y_dpl ); scroll.v.value(off); } } @@ -3139,7 +3166,7 @@ namespace nana graph->set_text_color(cell_txtcolor); graph->string(point{ item_xpos + content_pos, y + txtoff }, m_cell.text); // draw full text of the cell index (column) - if (ts.width + static_cast(content_pos) > header.pixels) // it was an excess + if (static_cast(ts.width) > static_cast(header.pixels) - (content_pos + item_xpos)) // it was an excess { //The text is painted over the next subitem // here beging the ... int xpos = item_xpos + static_cast(header.pixels) - static_cast(essence_->suspension_width); @@ -3148,8 +3175,8 @@ namespace nana graph->rectangle(rectangle{ xpos, y + 2, essence_->suspension_width, essence_->item_size - 4 }, true); graph->string(point{ xpos, y + 2 }, STR("...")); - //Erase the part that over the next subitem. - if (display_order + 1 < seqs.size()) // this is not the last column + //Erase the part that over the next subitem only if the right of column is less than right of listbox + if (item_xpos + content_pos < content_r.right() - static_cast(header.pixels)) { graph->set_color(bgcolor); // we need to erase the excess, because some cell may not draw text over graph->rectangle(rectangle{ item_xpos + static_cast(header.pixels), y + 2, diff --git a/source/gui/widgets/tabbar.cpp b/source/gui/widgets/tabbar.cpp index 19d18391..55757a05 100644 --- a/source/gui/widgets/tabbar.cpp +++ b/source/gui/widgets/tabbar.cpp @@ -608,6 +608,7 @@ namespace nana if (pos >= list_.size()) throw std::out_of_range("tabbar: invalid position"); + iterator_at(pos)->relative = wd; API::show_window(wd, basis_.active == pos); }