refine the label

This commit is contained in:
Jinhao 2018-08-31 06:27:47 +08:00
parent 93bbdb4a88
commit 745a228dae
2 changed files with 28 additions and 42 deletions

View File

@ -682,7 +682,6 @@ namespace nana{ namespace widgets{ namespace skeletons
{ {
return lines_.end(); return lines_.end();
} }
private: private:
void _m_parse_format(tokenizer & tknizer, std::stack<fblock*> & fbstack) void _m_parse_format(tokenizer & tknizer, std::stack<fblock*> & fbstack)
{ {

View File

@ -20,6 +20,7 @@
#include <stdexcept> #include <stdexcept>
#include <sstream> #include <sstream>
namespace nana namespace nana
{ {
namespace drawerbase namespace drawerbase
@ -104,12 +105,10 @@ namespace nana
#endif #endif
font_ = pre_font; font_ = pre_font;
fblock_ = nullptr; current_fblock_ = nullptr;
_m_set_default(pre_font, fgcolor); _m_set_default(pre_font, fgcolor);
_m_measure(graph);
render_status rs; render_status rs;
rs.allowed_width = graph.size().width; rs.allowed_width = graph.size().width;
@ -144,15 +143,10 @@ namespace nana
else else
rs.pos.y = 0; rs.pos.y = 0;
auto vsline_iterator = content_lines.begin(); for (auto & line : content_lines)
for (auto & line : dstream_)
{ {
if (rs.pos.y >= static_cast<int>(graph.height()))
break;
rs.index = 0; rs.index = 0;
rs.vslines.clear(); rs.vslines.swap(line);
rs.vslines.swap(*vsline_iterator++);
rs.pos.x = rs.vslines.front().x_base; rs.pos.x = rs.vslines.front().x_base;
if (!_m_foreach_visual_line(graph, rs)) if (!_m_foreach_visual_line(graph, rs))
@ -161,7 +155,12 @@ namespace nana
rs.pos.y += static_cast<int>(rs.vslines.back().extent_height_px); rs.pos.y += static_cast<int>(rs.vslines.back().extent_height_px);
} }
graph.typeface(pre_font); if (font_ != pre_font)
{
graph.typeface(pre_font);
font_.release();
current_fblock_ = nullptr;
}
} }
bool find(int x, int y, std::wstring& target, std::wstring& url) const noexcept bool find(int x, int y, std::wstring& target, std::wstring& url) const noexcept
@ -183,7 +182,7 @@ namespace nana
{ {
::nana::size retsize; ::nana::size retsize;
auto ft = graph.typeface(); //used for restoring the font auto pre_font = graph.typeface(); //used for restoring the font
#ifdef _nana_std_has_string_view #ifdef _nana_std_has_string_view
const unsigned def_line_pixels = graph.text_extent_size(std::wstring_view(L" ", 1)).height; const unsigned def_line_pixels = graph.text_extent_size(std::wstring_view(L" ", 1)).height;
@ -191,11 +190,10 @@ namespace nana
const unsigned def_line_pixels = graph.text_extent_size(L" ", 1).height; const unsigned def_line_pixels = graph.text_extent_size(L" ", 1).height;
#endif #endif
font_ = ft; font_ = pre_font;
fblock_ = nullptr; current_fblock_ = nullptr;
_m_set_default(ft, colors::black); _m_set_default(pre_font, colors::black);
_m_measure(graph);
render_status rs; render_status rs;
@ -218,6 +216,12 @@ namespace nana
retsize.height += static_cast<unsigned>(vsline.extent_height_px); retsize.height += static_cast<unsigned>(vsline.extent_height_px);
} }
if (font_ != pre_font)
{
graph.typeface(pre_font);
font_.release();
current_fblock_ = nullptr;
}
return retsize; return retsize;
} }
private: private:
@ -294,7 +298,7 @@ namespace nana
void _m_change_font(graph_reference graph, nana::widgets::skeletons::fblock* fp) void _m_change_font(graph_reference graph, nana::widgets::skeletons::fblock* fp)
{ {
if(fp != fblock_) if (fp != current_fblock_)
{ {
auto& name = _m_fontname(fp); auto& name = _m_fontname(fp);
auto fontsize = _m_font_size(fp); auto fontsize = _m_font_size(fp);
@ -307,26 +311,7 @@ namespace nana
font_ = paint::font{ name, fontsize, fs }; font_ = paint::font{ name, fontsize, fs };
graph.typeface(font_); graph.typeface(font_);
} }
fblock_ = fp; current_fblock_ = fp;
}
}
void _m_measure(graph_reference graph)
{
nana::paint::font ft = font_;
for (auto & line : dstream_)
{
for (auto & value : line)
{
_m_change_font(graph, value.fblock_ptr);
value.data_ptr->measure(graph);
}
}
if(font_ != ft)
{
font_ = ft;
graph.typeface(ft);
fblock_ = nullptr;
} }
} }
@ -379,7 +364,10 @@ namespace nana
for (auto i = line.cbegin(); i != line.cend(); ++i) for (auto i = line.cbegin(); i != line.cend(); ++i)
{ {
auto const data = i->data_ptr; auto const data = i->data_ptr;
auto fblock = i->fblock_ptr; auto const fblock = i->fblock_ptr;
_m_change_font(graph, fblock);
data->measure(graph);
abs_text_px += data->size().width; abs_text_px += data->size().width;
@ -457,9 +445,7 @@ namespace nana
if (data->is_text()) if (data->is_text())
{ {
_m_change_font(graph, fblock);
//Split a text into multiple lines //Split a text into multiple lines
auto rest_extent_size = extent_size.width;
std::size_t text_begin = 0; std::size_t text_begin = 0;
while (text_begin < data->text().size()) while (text_begin < data->text().size())
{ {
@ -643,7 +629,8 @@ namespace nana
private: private:
dstream dstream_; dstream dstream_;
bool format_enabled_ = false; bool format_enabled_ = false;
::nana::widgets::skeletons::fblock * fblock_ = nullptr;
::nana::widgets::skeletons::fblock * current_fblock_{ nullptr };
::std::deque<traceable> traceable_; ::std::deque<traceable> traceable_;
::nana::paint::font font_; ::nana::paint::font font_;