refactor picture widget

This commit is contained in:
Jinhao 2017-11-06 05:56:08 +08:00
parent 3dc7e3ae5b
commit 60c85cff52

View File

@ -29,7 +29,6 @@ namespace nana
struct implement struct implement
{ {
widget* wdg_ptr{nullptr}; widget* wdg_ptr{nullptr};
paint::graphics* graph_ptr{nullptr};
std::unique_ptr<content_measurer> measurer; std::unique_ptr<content_measurer> measurer;
struct gradual_bground_tag struct gradual_bground_tag
@ -49,18 +48,19 @@ namespace nana
bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio. bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio.
}backimg; }backimg;
void draw_background(const size& dimension) void draw_background(paint::graphics& graph, const size& dimension)
{ {
if (graph_ptr && (!API::dev::copy_transparent_background(*wdg_ptr, *graph_ptr))) if (!API::dev::copy_transparent_background(*wdg_ptr, graph))
{ {
if (dimension.width < graph_ptr->size().width || dimension.height < graph_ptr->size().height || backimg.image.alpha()) 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()) if (gradual_bground.gradual_from.invisible() || gradual_bground.gradual_to.invisible())
graph_ptr->rectangle(true, wdg_ptr->bgcolor()); graph.rectangle(true, wdg_ptr->bgcolor());
else if (gradual_bground.gradual_from == gradual_bground.gradual_to) else if (gradual_bground.gradual_from == gradual_bground.gradual_to)
graph_ptr->rectangle(true, gradual_bground.gradual_from); graph.rectangle(true, gradual_bground.gradual_from);
else else
graph_ptr->gradual_rectangle(::nana::rectangle{ graph_ptr->size() }, gradual_bground.gradual_from, gradual_bground.gradual_to, !gradual_bground.horizontal); graph.gradual_rectangle(::nana::rectangle{graph_size }, gradual_bground.gradual_from, gradual_bground.gradual_to, !gradual_bground.horizontal);
} }
} }
} }
@ -104,19 +104,15 @@ namespace nana
delete impl_; delete impl_;
} }
void drawer::attached(widget_reference& wdg, graph_reference graph) void drawer::attached(widget_reference& wdg, graph_reference)
{ {
impl_->wdg_ptr = &wdg; impl_->wdg_ptr = &wdg;
impl_->graph_ptr = &graph;
API::dev::set_measurer(wdg, impl_->measurer.get()); API::dev::set_measurer(wdg, impl_->measurer.get());
} }
void drawer::refresh(graph_reference graph) void drawer::refresh(graph_reference graph)
{ {
if (!graph.changed()) auto const graphsize = graph.size();
return;
auto graphsize = graph.size();
auto & backimg = impl_->backimg; auto & backimg = impl_->backimg;
@ -124,8 +120,7 @@ namespace nana
{ {
if (backimg.image.empty()) if (backimg.image.empty())
{ {
impl_->draw_background({}); impl_->draw_background(graph, {});
graph.setsta();
return; return;
} }
@ -133,10 +128,12 @@ namespace nana
if (valid_area.empty()) if (valid_area.empty())
valid_area.dimension(backimg.image.size()); valid_area.dimension(backimg.image.size());
//The position where the image to be drawn.
::nana::point pos;
if (backimg.stretchable) if (backimg.stretchable)
{ {
auto fit_size = fit_zoom({ valid_area.width, valid_area.height }, graphsize); auto fit_size = fit_zoom(valid_area.dimension(), graphsize);
::nana::point pos;
if (fit_size.width != graphsize.width) if (fit_size.width != graphsize.width)
{ {
@ -165,15 +162,12 @@ namespace nana
} }
} }
impl_->draw_background(fit_size); impl_->draw_background(graph, fit_size);
backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size }); backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size });
} }
else else
{ {
//The point in which position the image to be drawn.
::nana::point pos;
switch (backimg.align_horz) switch (backimg.align_horz)
{ {
case ::nana::align::left: break; case ::nana::align::left: break;
@ -196,15 +190,14 @@ namespace nana
break; break;
} }
impl_->draw_background(valid_area.dimension()); 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 else
{ {
impl_->draw_background(graphsize); impl_->draw_background(graph, graphsize);
color invalid_clr_for_call; color invalid_clr_for_call;
backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal); backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal);
@ -237,11 +230,7 @@ namespace nana
if (backimg.bground) if (backimg.bground)
backimg.bground->image(backimg.image, true, valid_area); backimg.bground->image(backimg.image, true, valid_area);
if (handle()) API::refresh_window(*this);
{
get_drawer_trigger().impl_->graph_ptr->set_changed();
API::refresh_window(*this);
}
} }
void picture::align(::nana::align horz, align_v vert) void picture::align(::nana::align horz, align_v vert)
@ -256,18 +245,11 @@ namespace nana
backimg.align_horz = horz; backimg.align_horz = horz;
backimg.align_vert = vert; backimg.align_vert = vert;
if (handle()) API::refresh_window(*this);
{
get_drawer_trigger().impl_->graph_ptr->set_changed();
API::refresh_window(*this);
}
} }
void picture::stretchable(unsigned left, unsigned top, unsigned right, unsigned bottom) void picture::stretchable(unsigned left, unsigned top, unsigned right, unsigned bottom)
{ {
if (!handle())
return;
internal_scope_guard lock; internal_scope_guard lock;
auto & backimg = get_drawer_trigger().impl_->backimg; auto & backimg = get_drawer_trigger().impl_->backimg;
if (!backimg.bground) if (!backimg.bground)
@ -279,11 +261,8 @@ namespace nana
backimg.bground->stretch_parts(left, top, right, bottom); backimg.bground->stretch_parts(left, top, right, bottom);
backimg.stretchable = false; backimg.stretchable = false;
if (handle())
{ API::refresh_window(*this);
get_drawer_trigger().impl_->graph_ptr->set_changed();
API::refresh_window(*this);
}
} }
void picture::stretchable(bool enables) void picture::stretchable(bool enables)
@ -294,11 +273,7 @@ namespace nana
backimg.bground.reset(); backimg.bground.reset();
backimg.stretchable = enables; backimg.stretchable = enables;
if (handle()) API::refresh_window(*this);
{
get_drawer_trigger().impl_->graph_ptr->set_changed();
API::refresh_window(*this);
}
} }
void picture::set_gradual_background(const ::nana::color& from, const ::nana::color& to, bool horizontal) void picture::set_gradual_background(const ::nana::color& from, const ::nana::color& to, bool horizontal)
@ -307,11 +282,8 @@ namespace nana
bground.gradual_from = from; bground.gradual_from = from;
bground.gradual_to = to; bground.gradual_to = to;
bground.horizontal = horizontal; bground.horizontal = horizontal;
if (handle())
{ API::refresh_window(*this);
get_drawer_trigger().impl_->graph_ptr->set_changed();
API::refresh_window(*this);
}
} }
void picture::transparent(bool enabled) void picture::transparent(bool enabled)