Merge branch 'hotfix-1.5.5' into develop
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include <nana/gui/widgets/scroll.hpp>
|
||||
|
||||
#include <nana/gui/layout_utility.hpp>
|
||||
#include <nana/gui/screen.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@@ -198,16 +199,14 @@ namespace nana
|
||||
return widget_;
|
||||
}
|
||||
|
||||
void attach(widget* wd, nana::paint::graphics* graph)
|
||||
void attach(widget& wd, nana::paint::graphics& graph)
|
||||
{
|
||||
if(wd)
|
||||
{
|
||||
widget_ = wd;
|
||||
wd->events().mouse_wheel.connect_unignorable([this](const arg_wheel& arg){
|
||||
scroll_items(arg.upwards);
|
||||
});
|
||||
}
|
||||
if(graph) graph_ = graph;
|
||||
widget_ = &wd;
|
||||
wd.events().mouse_wheel.connect_unignorable([this](const arg_wheel& arg){
|
||||
scroll_items(arg.upwards);
|
||||
});
|
||||
|
||||
graph_ = &graph;
|
||||
}
|
||||
|
||||
void detach()
|
||||
@@ -219,9 +218,46 @@ namespace nana
|
||||
{
|
||||
if(module_)
|
||||
{
|
||||
std::size_t items = (module_->max_items <= module_->items.size() ? module_->max_items : module_->items.size());
|
||||
std::size_t h = items * state_.renderer->item_pixels(*graph_);
|
||||
widget_->size(size{ widget_->size().width, static_cast<unsigned>(h + 4) });
|
||||
|
||||
auto const items = (module_->max_items <= module_->items.size() ? module_->max_items : module_->items.size());
|
||||
|
||||
rectangle list_r{
|
||||
0, 0,
|
||||
widget_->size().width,
|
||||
static_cast<unsigned>(items * state_.renderer->item_pixels(*graph_)) + 4
|
||||
};
|
||||
|
||||
//Test if the listbox excesses the screen
|
||||
|
||||
screen scr;
|
||||
auto & disp = scr.from_window(*widget_);
|
||||
|
||||
auto disp_r = disp.area();
|
||||
|
||||
point pos;
|
||||
API::calc_screen_point(*widget_, pos);
|
||||
list_r.position(pos);
|
||||
|
||||
if (widget_->size().width >= disp_r.width)
|
||||
{
|
||||
pos.x = 0;
|
||||
list_r.width = disp_r.width;
|
||||
}
|
||||
else if (list_r.right() > disp_r.right())
|
||||
pos.x = disp_r.right() - static_cast<int>(list_r.width);
|
||||
|
||||
if (list_r.height >= disp_r.height)
|
||||
{
|
||||
pos.y = 0;
|
||||
list_r.height = disp_r.height;
|
||||
}
|
||||
else if (list_r.bottom() > disp_r.bottom())
|
||||
pos.y = disp_r.bottom() - static_cast<int>(list_r.height);
|
||||
|
||||
API::calc_window_point(API::get_owner_window(*widget_), pos);
|
||||
list_r.position(pos);
|
||||
|
||||
widget_->move(list_r);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -312,36 +348,37 @@ namespace nana
|
||||
|
||||
void _m_open_scrollbar(widget_reference wd, bool v)
|
||||
{
|
||||
if(v)
|
||||
if (!v)
|
||||
{
|
||||
if(scrollbar_.empty() && module_)
|
||||
{
|
||||
scrollbar_.create(wd, rectangle(static_cast<int>(wd.size().width - 18), 2, 16, wd.size().height - 4));
|
||||
scrollbar_.amount(module_->items.size());
|
||||
scrollbar_.range(module_->max_items);
|
||||
scrollbar_.value(state_.offset_y);
|
||||
|
||||
auto & events = scrollbar_.events();
|
||||
events.mouse_wheel.connect([this](const arg_wheel& arg)
|
||||
{
|
||||
scroll_items(arg.upwards);
|
||||
});
|
||||
|
||||
auto fn = [this](const arg_mouse& arg)
|
||||
{
|
||||
if (arg.is_left_button() && (scrollbar_.value() != state_.offset_y))
|
||||
{
|
||||
state_.offset_y = static_cast<unsigned>(scrollbar_.value());
|
||||
draw();
|
||||
API::update_window(*widget_);
|
||||
}
|
||||
};
|
||||
events.mouse_move.connect(fn);
|
||||
events.mouse_up.connect(fn);
|
||||
}
|
||||
}
|
||||
else
|
||||
scrollbar_.close();
|
||||
return;
|
||||
}
|
||||
|
||||
if(scrollbar_.empty() && module_)
|
||||
{
|
||||
scrollbar_.create(wd, rectangle(static_cast<int>(wd.size().width - 18), 2, 16, wd.size().height - 4));
|
||||
scrollbar_.amount(module_->items.size());
|
||||
scrollbar_.range(module_->max_items);
|
||||
scrollbar_.value(state_.offset_y);
|
||||
|
||||
auto & events = scrollbar_.events();
|
||||
events.mouse_wheel.connect([this](const arg_wheel& arg)
|
||||
{
|
||||
scroll_items(arg.upwards);
|
||||
});
|
||||
|
||||
auto fn = [this](const arg_mouse& arg)
|
||||
{
|
||||
if (arg.is_left_button() && (scrollbar_.value() != state_.offset_y))
|
||||
{
|
||||
state_.offset_y = static_cast<unsigned>(scrollbar_.value());
|
||||
draw();
|
||||
API::update_window(*widget_);
|
||||
}
|
||||
};
|
||||
events.mouse_move.connect(fn);
|
||||
events.mouse_up.connect(fn);
|
||||
}
|
||||
}
|
||||
private:
|
||||
widget * widget_{nullptr};
|
||||
@@ -393,7 +430,7 @@ namespace nana
|
||||
|
||||
void trigger::attached(widget_reference widget, graph_reference graph)
|
||||
{
|
||||
drawer_->attach(&widget, &graph);
|
||||
drawer_->attach(widget, graph);
|
||||
}
|
||||
|
||||
void trigger::detached()
|
||||
|
||||
@@ -3931,6 +3931,11 @@ namespace nana
|
||||
essence_->content_view.reset(new widgets::skeletons::content_view{ widget.handle() });
|
||||
essence_->resize_disp_area();
|
||||
|
||||
//Set the content_view wheel speed with the listbox scheme.
|
||||
essence_->content_view->set_wheel_speed([this] {
|
||||
return essence_->scheme_ptr->mouse_wheel.lines;
|
||||
});
|
||||
|
||||
essence_->content_view->events().hover_outside = [this](const point& cur_pos) {
|
||||
essence_->update_mouse_selection(cur_pos);
|
||||
};
|
||||
@@ -4166,16 +4171,17 @@ namespace nana
|
||||
{
|
||||
if (item_ptr->flags.selected != sel)
|
||||
{
|
||||
item_ptr->flags.selected = sel;
|
||||
lister.emit_cs(abs_item_pos, true);
|
||||
|
||||
if (item_ptr->flags.selected)
|
||||
if (sel)
|
||||
{
|
||||
//Deselects the previously selected item.
|
||||
lister.cancel_others_if_single_enabled(true, abs_item_pos);
|
||||
essence_->lister.latest_selected_abs = abs_item_pos;
|
||||
}
|
||||
else if (essence_->lister.latest_selected_abs == abs_item_pos)
|
||||
essence_->lister.latest_selected_abs.set_both(npos);
|
||||
|
||||
item_ptr->flags.selected = sel;
|
||||
lister.emit_cs(abs_item_pos, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -29,7 +29,6 @@ namespace nana
|
||||
struct implement
|
||||
{
|
||||
widget* wdg_ptr{nullptr};
|
||||
paint::graphics* graph_ptr{nullptr};
|
||||
std::unique_ptr<content_measurer> measurer;
|
||||
|
||||
struct gradual_bground_tag
|
||||
@@ -48,6 +47,23 @@ namespace nana
|
||||
std::unique_ptr<element::bground> bground; //If it is not a null ptr, the widget is stretchable mode
|
||||
bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio.
|
||||
}backimg;
|
||||
|
||||
void draw_background(paint::graphics& graph, const size& dimension)
|
||||
{
|
||||
if (!API::dev::copy_transparent_background(*wdg_ptr, graph))
|
||||
{
|
||||
auto const graph_size = graph.size();
|
||||
if (dimension.width < graph_size.width || dimension.height < graph_size.height || backimg.image.alpha())
|
||||
{
|
||||
if (gradual_bground.gradual_from.invisible() || gradual_bground.gradual_to.invisible())
|
||||
graph.rectangle(true, wdg_ptr->bgcolor());
|
||||
else if (gradual_bground.gradual_from == gradual_bground.gradual_to)
|
||||
graph.rectangle(true, gradual_bground.gradual_from);
|
||||
else
|
||||
graph.gradual_rectangle(::nana::rectangle{graph_size }, gradual_bground.gradual_from, gradual_bground.gradual_to, !gradual_bground.horizontal);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class content_measurer
|
||||
@@ -88,32 +104,36 @@ namespace nana
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
void drawer::attached(widget_reference& wdg, graph_reference graph)
|
||||
void drawer::attached(widget_reference& wdg, graph_reference)
|
||||
{
|
||||
impl_->wdg_ptr = &wdg;
|
||||
impl_->graph_ptr = &graph;
|
||||
API::dev::set_measurer(wdg, impl_->measurer.get());
|
||||
}
|
||||
|
||||
void drawer::refresh(graph_reference graph)
|
||||
{
|
||||
if (!graph.changed())
|
||||
return;
|
||||
|
||||
auto graphsize = graph.size();
|
||||
auto const graphsize = graph.size();
|
||||
|
||||
auto & backimg = impl_->backimg;
|
||||
|
||||
if (!backimg.bground)
|
||||
{
|
||||
if (backimg.image.empty())
|
||||
{
|
||||
impl_->draw_background(graph, {});
|
||||
return;
|
||||
}
|
||||
|
||||
auto valid_area = backimg.valid_area;
|
||||
if (valid_area.empty())
|
||||
valid_area.dimension(backimg.image.size());
|
||||
|
||||
//The position where the image to be drawn.
|
||||
::nana::point pos;
|
||||
|
||||
if (backimg.stretchable)
|
||||
{
|
||||
auto fit_size = fit_zoom({ valid_area.width, valid_area.height }, graphsize);
|
||||
::nana::point pos;
|
||||
auto fit_size = fit_zoom(valid_area.dimension(), graphsize);
|
||||
|
||||
if (fit_size.width != graphsize.width)
|
||||
{
|
||||
@@ -142,15 +162,12 @@ namespace nana
|
||||
}
|
||||
}
|
||||
|
||||
_m_draw_background(fit_size.width, fit_size.height);
|
||||
impl_->draw_background(graph, fit_size);
|
||||
|
||||
backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size });
|
||||
}
|
||||
else
|
||||
{
|
||||
//The point in which position the image to be drawn.
|
||||
::nana::point pos;
|
||||
|
||||
switch (backimg.align_horz)
|
||||
{
|
||||
case ::nana::align::left: break;
|
||||
@@ -173,15 +190,14 @@ namespace nana
|
||||
break;
|
||||
}
|
||||
|
||||
_m_draw_background(valid_area.width, valid_area.height);
|
||||
impl_->draw_background(graph, valid_area.dimension());
|
||||
|
||||
if ( ! backimg.image.empty())
|
||||
backimg.image.paste(valid_area, graph, pos);
|
||||
backimg.image.paste(valid_area, graph, pos);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_m_draw_background(graphsize.width, graphsize.height);
|
||||
impl_->draw_background(graph, graphsize);
|
||||
|
||||
color invalid_clr_for_call;
|
||||
backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal);
|
||||
@@ -189,25 +205,6 @@ namespace nana
|
||||
|
||||
graph.setsta();
|
||||
}
|
||||
|
||||
void drawer::_m_draw_background(unsigned w, unsigned h)
|
||||
{
|
||||
auto graph = impl_->graph_ptr;
|
||||
|
||||
if (graph && (!API::dev::copy_transparent_background(*impl_->wdg_ptr, *graph)))
|
||||
{
|
||||
if (w < graph->size().width || h < graph->size().height || impl_->backimg.image.alpha())
|
||||
{
|
||||
auto & bground = impl_->gradual_bground;
|
||||
if (bground.gradual_from.invisible() || bground.gradual_to.invisible())
|
||||
graph->rectangle(true, impl_->wdg_ptr->bgcolor());
|
||||
else if (bground.gradual_from == bground.gradual_to)
|
||||
graph->rectangle(true, bground.gradual_from);
|
||||
else
|
||||
graph->gradual_rectangle(::nana::rectangle{ graph->size() }, bground.gradual_from, bground.gradual_to, !bground.horizontal);
|
||||
}
|
||||
}
|
||||
}
|
||||
//end class drawer
|
||||
}//end namespace picture
|
||||
}//end namespace drawerbase
|
||||
@@ -233,11 +230,7 @@ namespace nana
|
||||
if (backimg.bground)
|
||||
backimg.bground->image(backimg.image, true, valid_area);
|
||||
|
||||
if (handle())
|
||||
{
|
||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
void picture::align(::nana::align horz, align_v vert)
|
||||
@@ -252,18 +245,11 @@ namespace nana
|
||||
backimg.align_horz = horz;
|
||||
backimg.align_vert = vert;
|
||||
|
||||
if (handle())
|
||||
{
|
||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
void picture::stretchable(unsigned left, unsigned top, unsigned right, unsigned bottom)
|
||||
{
|
||||
if (!handle())
|
||||
return;
|
||||
|
||||
internal_scope_guard lock;
|
||||
auto & backimg = get_drawer_trigger().impl_->backimg;
|
||||
if (!backimg.bground)
|
||||
@@ -275,11 +261,8 @@ namespace nana
|
||||
|
||||
backimg.bground->stretch_parts(left, top, right, bottom);
|
||||
backimg.stretchable = false;
|
||||
if (handle())
|
||||
{
|
||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
void picture::stretchable(bool enables)
|
||||
@@ -290,11 +273,7 @@ namespace nana
|
||||
backimg.bground.reset();
|
||||
|
||||
backimg.stretchable = enables;
|
||||
if (handle())
|
||||
{
|
||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
void picture::set_gradual_background(const ::nana::color& from, const ::nana::color& to, bool horizontal)
|
||||
@@ -303,11 +282,8 @@ namespace nana
|
||||
bground.gradual_from = from;
|
||||
bground.gradual_to = to;
|
||||
bground.horizontal = horizontal;
|
||||
if (handle())
|
||||
{
|
||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
API::refresh_window(*this);
|
||||
}
|
||||
|
||||
void picture::transparent(bool enabled)
|
||||
|
||||
@@ -91,19 +91,26 @@ namespace nana
|
||||
{
|
||||
return value_px_;
|
||||
}
|
||||
|
||||
bool value_px_sync()
|
||||
{
|
||||
if (widget_)
|
||||
{
|
||||
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_;
|
||||
|
||||
if (value_px != value_px_)
|
||||
{
|
||||
value_px_ = value_px;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
private:
|
||||
void _m_try_refresh()
|
||||
{
|
||||
if (nullptr == widget_)
|
||||
return;
|
||||
|
||||
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_;
|
||||
|
||||
if (value_px != value_px_)
|
||||
{
|
||||
value_px_ = value_px;
|
||||
if (value_px_sync())
|
||||
API::refresh_window(*widget_);
|
||||
}
|
||||
}
|
||||
private:
|
||||
nana::progress * widget_{ nullptr };
|
||||
@@ -144,6 +151,9 @@ namespace nana
|
||||
auto rt_bground = rt_val;
|
||||
if (false == progress_->unknown(nullptr))
|
||||
{
|
||||
//Sync the value_px otherwise the progress is incorrect when it is resized.
|
||||
progress_->value_px_sync();
|
||||
|
||||
rt_bground.x = static_cast<int>(progress_->value_px()) + static_cast<int>(border_px);
|
||||
rt_bground.width -= progress_->value_px();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user