new docker-place branch

This commit is contained in:
Jinhao
2015-08-14 04:09:35 +08:00
parent 42dd27b68f
commit 658ab3fb7f
8 changed files with 1210 additions and 493 deletions

View File

@@ -141,7 +141,7 @@ namespace nana
}
else
{
::nana::color highlighted(static_cast<color_rgb>(0x5eb6f7));
::nana::color highlighted(0x5e, 0xb6, 0xf7);
auto bld_bgcolor = bgcolor;
auto bld_fgcolor = fgcolor;
switch(es)
@@ -156,7 +156,7 @@ namespace nana
bld_fgcolor = fgcolor.blend(highlighted, 0.4);
break;
case element_state::disabled:
bld_bgcolor = bld_fgcolor.from_rgb(0xb2, 0xb7, 0xbc);
bld_bgcolor = bld_fgcolor = nana::color(0xb2, 0xb7, 0xbc);
break;
default:
//Leave things as they are
@@ -264,7 +264,7 @@ namespace nana
bool draw(graph_reference graph, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state estate, unsigned weight)
{
graph.rectangle(r, false, static_cast<color_rgb>((element_state::focus_hovered == estate || element_state::focus_normal == estate) ? 0x0595E2 : 0x999A9E));
graph.rectangle(::nana::rectangle(r).pare_off(1), false, bgcolor);
graph.rectangle(::nana::rectangle{r}.pare_off(1), false, bgcolor);
return true;
}
};
@@ -529,6 +529,63 @@ namespace nana
return true;
}
};//end class annex_button
class x_icon
: public element_interface
{
bool draw(graph_reference graph, const ::nana::color&, const ::nana::color& fgcolor, const rectangle& r, element_state estate) override
{
auto clr = fgcolor;
switch (estate)
{
case element_state::hovered:
case element_state::pressed:
clr = clr.blend(colors::black, 0.8);
break;
case element_state::disabled:
clr = colors::dark_gray;
default:
break;
}
graph.set_color(clr);
const int x = r.x + 4;
const int y = r.y + 4;
point p1{ x, y }, p2{ x + 7, y + 7 };
graph.line(p1, p2);
++p1.x;
--p2.y;
graph.line(p1, p2);
p1.x = x;
++p1.y;
p2.x = x + 6;
p2.y = y + 7;
graph.line(p1, p2);
p1.x += 7;
p1.y = y;
p2.x = x;
graph.line(p1, p2);
p1.x = x + 6;
p2.y = y + 6;
graph.line(p1, p2);
++p1.x;
++p1.y;
++p2.x;
++p2.y;
graph.line(p1, p2);
return true;
}
};
}//end namespace element
template<typename ElementInterface>
@@ -567,7 +624,7 @@ namespace nana
spare_.emplace_back(keep_e, keep_f);
}
element_t * const * keeper() const
element_t * const * cite() const
{
return &element_ptr_;
}
@@ -580,6 +637,9 @@ namespace nana
class element_manager
: nana::noncopyable, nana::nonmovable
{
//VC2012 does not support alias declaration.
//template<typename E> using factory_interface = element::provider::factory_interface<E>;
template<typename ElementInterface>
struct item
{
@@ -613,6 +673,8 @@ namespace nana
element::add_arrow<element::arrow_hollow_triangle>("hollow_triangle");
element::add_button<element::annex_button>(""); //"annex" in default
element::add_x_icon<element::x_icon>("");
}
return obj;
}
@@ -624,7 +686,17 @@ namespace nana
element::crook_interface * const * crook(const std::string& name) const
{
return _m_get(name, crook_).keeper();
return _m_get(name, crook_).cite();
}
void cross(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
{
_m_add(name, cross_, factory);
}
element::element_interface* const * cross(const std::string& name) const
{
return _m_get(name, cross_).cite();
}
void border(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::border_interface>>& factory)
@@ -634,7 +706,7 @@ namespace nana
element::border_interface * const * border(const std::string& name) const
{
return _m_get(name, border_).keeper();
return _m_get(name, border_).cite();
}
void arrow(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::arrow_interface>>& factory)
@@ -644,7 +716,7 @@ namespace nana
element::arrow_interface * const * arrow(const std::string& name) const
{
return _m_get((name.empty() ? "arrowhead" : name), arrow_).keeper();
return _m_get((name.empty() ? "arrowhead" : name), arrow_).cite();
}
void button(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
@@ -654,7 +726,17 @@ namespace nana
element::element_interface * const * button(const std::string& name) const
{
return _m_get((name.empty() ? "annex" : name), button_).keeper();
return _m_get((name.empty() ? "annex" : name), button_).cite();
}
void x_icon(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
{
_m_add(name, x_icon_, factory);
}
element::element_interface * const * x_icon(const std::string& name) const
{
return _m_get(name, x_icon_).cite();
}
private:
using lock_guard = std::lock_guard<std::recursive_mutex>;
@@ -689,9 +771,11 @@ namespace nana
private:
mutable std::recursive_mutex mutex_;
item<element::crook_interface> crook_;
item<element::element_interface> cross_;
item<element::border_interface> border_;
item<element::arrow_interface> arrow_;
item<element::element_interface> button_;
item<element::element_interface> x_icon_;
};
namespace element
@@ -702,17 +786,27 @@ namespace nana
element_manager::instance().crook(name, factory);
}
crook_interface* const * provider::keeper_crook(const std::string& name)
crook_interface* const * provider::cite_crook(const std::string& name)
{
return element_manager::instance().crook(name);
}
void provider::add_cross(const std::string& name, const pat::cloneable<factory_interface<element_interface>>& factory)
{
element_manager::instance().cross(name, factory);
}
element_interface* const* provider::cite_cross(const std::string& name)
{
return element_manager::instance().cross(name);
}
void provider::add_border(const std::string& name, const pat::cloneable<factory_interface<border_interface>>& factory)
{
element_manager::instance().border(name, factory);
}
border_interface* const * provider::keeper_border(const std::string& name)
border_interface* const * provider::cite_border(const std::string& name)
{
return element_manager::instance().border(name);
}
@@ -722,7 +816,7 @@ namespace nana
element_manager::instance().arrow(name, factory);
}
arrow_interface* const * provider::keeper_arrow(const std::string& name)
arrow_interface* const * provider::cite_arrow(const std::string& name)
{
return element_manager::instance().arrow(name);
}
@@ -732,16 +826,26 @@ namespace nana
element_manager::instance().button(name, factory);
}
element_interface* const* provider::keeper_button(const std::string& name)
element_interface* const* provider::cite_button(const std::string& name)
{
return element_manager::instance().button(name);
}
void provider::add_x_icon(const std::string& name, const pat::cloneable<factory_interface<element_interface>>& factory)
{
element_manager::instance().x_icon(name, factory);
}
element_interface* const* provider::cite_x_icon(const std::string& name)
{
return element_manager::instance().x_icon(name);
}
}//end namespace element
//facades
//template<> class facade<element::crook>
facade<element::crook>::facade(const char* name)
: keeper_(element::provider().keeper_crook(name ? name : ""))
: cite_(element::provider().cite_crook(name ? name : ""))
{
data_.check_state = state::unchecked;
data_.radio = false;
@@ -777,40 +881,120 @@ namespace nana
void facade<element::crook>::switch_to(const char* name)
{
keeper_ = element::provider().keeper_crook(name ? name : "");
cite_ = element::provider().cite_crook(name ? name : "");
}
bool facade<element::crook>::draw(graph_reference graph, const ::nana::color& bgcol, const ::nana::color& fgcol, const nana::rectangle& r, element_state es)
{
return (*keeper_)->draw(graph, bgcol, fgcol, r, es, data_);
return (*cite_)->draw(graph, bgcol, fgcol, r, es, data_);
}
//end class facade<element::crook>
//class facade<element::cross>
facade<element::cross>::facade(const char* name)
: cite_(element::provider().cite_cross(name ? name : ""))
{
}
void facade<element::cross>::switch_to(const char* name)
{
cite_ = element::provider().cite_cross(name ? name : "");
}
void facade<element::cross>::thickness(unsigned thk)
{
thickness_ = thk;
}
void facade<element::cross>::size(unsigned size_px)
{
size_ = size_px;
}
//Implement element_interface
bool facade<element::cross>::draw(graph_reference graph, const ::nana::color&, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state)
{
if (thickness_ + 2 <= size_)
{
int gap = (static_cast<int>(size_) - static_cast<int>(thickness_)) / 2;
nana::point ps[12];
ps[0].x = r.x + gap;
ps[1].x = ps[0].x + static_cast<int>(thickness_) - 1;
ps[1].y = ps[0].y = r.y;
ps[2].x = ps[1].x;
ps[2].y = r.y + gap;
ps[3].x = ps[2].x + gap;
ps[3].y = ps[2].y;
ps[4].x = ps[3].x;
ps[4].y = ps[3].y + static_cast<int>(thickness_)-1;
ps[5].x = ps[1].x;
ps[5].y = ps[4].y;
ps[6].x = ps[5].x;
ps[6].y = ps[5].y + gap;
ps[7].x = r.x + gap;
ps[7].y = ps[6].y;
ps[8].x = ps[7].x;
ps[8].y = ps[4].y;
ps[9].x = r.x;
ps[9].y = ps[4].y;
ps[10].x = r.x;
ps[10].y = r.y + gap;
ps[11].x = r.x + gap;
ps[11].y = r.y + gap;
graph.set_color(fgcolor.blend(colors::black, true));
for (int i = 0; i < 11; ++i)
graph.line(ps[i], ps[i + 1]);
graph.line(ps[11], ps[0]);
graph.set_color(fgcolor);
unsigned thk_minus_2 = thickness_ - 2;
graph.rectangle(rectangle{ ps[10].x + 1, ps[10].y + 1, (gap << 1) + thk_minus_2, thk_minus_2 }, true);
graph.rectangle(rectangle{ ps[0].x + 1, ps[0].y + 1, thk_minus_2, (gap << 1) + thk_minus_2 }, true);
}
return true;
}
//end class facade<element::cross>
//class facade<element::border>
facade<element::border>::facade(const char* name)
: keeper_(element::provider().keeper_border(name ? name : ""))
: cite_(element::provider().cite_border(name ? name : ""))
{}
void facade<element::border>::switch_to(const char* name)
{
keeper_ = element::provider().keeper_border(name ? name : "");
cite_ = element::provider().cite_border(name ? name : "");
}
bool facade<element::border>::draw(graph_reference graph, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle& r, element_state es)
{
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, es, 2);
return (*cite_)->draw(graph, bgcolor, fgcolor, r, es, 2);
}
//end class facade<element::border>
//class facade<element::arrow>
facade<element::arrow>::facade(const char* name)
: keeper_(element::provider().keeper_arrow(name ? name : ""))
: cite_(element::provider().cite_arrow(name ? name : ""))
{
}
void facade<element::arrow>::switch_to(const char* name)
{
keeper_ = element::provider().keeper_arrow(name ? name : "");
cite_ = element::provider().cite_arrow(name ? name : "");
}
void facade<element::arrow>::direction(::nana::direction dir)
@@ -822,27 +1006,45 @@ namespace nana
bool facade<element::arrow>::draw(graph_reference graph, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle& r, element_state estate)
{
graph.set_color(fgcolor);
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, estate, dir_);
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate, dir_);
}
//end class facade<element::arrow>
//class facade<element::button>::
facade<element::button>::facade(const char* name)
: keeper_(element::provider().keeper_button(name ? name : ""))
: cite_(element::provider().cite_button(name ? name : ""))
{}
void facade<element::button>::switch_to(const char* name)
{
keeper_ = element::provider().keeper_button(name ? name : "");
cite_ = element::provider().cite_button(name ? name : "");
}
//Implement element_interface
bool facade<element::button>::draw(graph_reference graph, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state estate)
{
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, estate);
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate);
}
//end class facade<element::button>
//class facade<element::x_icon>
facade<element::x_icon>::facade(const char* name)
: cite_(element::provider().cite_x_icon(name ? name : ""))
{}
void facade<element::x_icon>::switch_to(const char* name)
{
cite_ = element::provider().cite_x_icon(name ? name : "");
}
//Implement element_interface
bool facade<element::x_icon>::draw(graph_reference graph, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state estate)
{
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate);
}
//end class facade<element::x_icon>
namespace element
{
void set_bground(const char* name, const pat::cloneable<element_interface>& obj)