fix mask textbox highlight with mask
This commit is contained in:
parent
ed462870e0
commit
53c36b7363
@ -314,7 +314,13 @@ namespace nana{ namespace widgets
|
|||||||
if (pos.y > static_cast<unsigned>(textbase.lines()))
|
if (pos.y > static_cast<unsigned>(textbase.lines()))
|
||||||
pos.y = static_cast<unsigned>(textbase.lines());
|
pos.y = static_cast<unsigned>(textbase.lines());
|
||||||
|
|
||||||
pos.x = editor_._m_pixels_by_char(textbase.getline(pos.y), pos.x) + editor_.text_area_.area.x;
|
std::unique_ptr<nana::string> mask_str;
|
||||||
|
if (editor_.mask_char_)
|
||||||
|
mask_str.reset(new nana::string(textbase.getline(pos.y).size(), editor_.mask_char_));
|
||||||
|
|
||||||
|
auto & lnstr = editor_.mask_char_ ? *mask_str : textbase.getline(pos.y);
|
||||||
|
|
||||||
|
pos.x = editor_._m_pixels_by_char(lnstr, pos.x) + editor_.text_area_.area.x;
|
||||||
|
|
||||||
int pos_y = static_cast<int>((pos.y - editor_.points_.offset.y) * editor_.line_height() + editor_._m_text_top_base());
|
int pos_y = static_cast<int>((pos.y - editor_.points_.offset.y) * editor_.line_height() + editor_._m_text_top_base());
|
||||||
int pos_x = static_cast<int>(pos.x - editor_.points_.offset.x);
|
int pos_x = static_cast<int>(pos.x - editor_.points_.offset.x);
|
||||||
@ -327,7 +333,13 @@ namespace nana{ namespace widgets
|
|||||||
nana::upoint res{ 0, static_cast<unsigned>(_m_textline_from_screen(scrpos.y)) };
|
nana::upoint res{ 0, static_cast<unsigned>(_m_textline_from_screen(scrpos.y)) };
|
||||||
|
|
||||||
//Convert the screen point to text caret point
|
//Convert the screen point to text caret point
|
||||||
const string_type& lnstr = editor_.textbase_.getline(res.y);
|
const string_type& real_str = editor_.textbase_.getline(res.y);
|
||||||
|
|
||||||
|
std::unique_ptr<nana::string> mask_str;
|
||||||
|
if (editor_.mask_char_)
|
||||||
|
mask_str.reset(new nana::string(real_str.size(), editor_.mask_char_));
|
||||||
|
|
||||||
|
auto & lnstr = (editor_.mask_char_ ? *mask_str : real_str);
|
||||||
if (lnstr.size() > 0)
|
if (lnstr.size() > 0)
|
||||||
{
|
{
|
||||||
scrpos.x += (editor_.points_.offset.x - editor_.text_area_.area.x);
|
scrpos.x += (editor_.points_.offset.x - editor_.text_area_.area.x);
|
||||||
@ -737,17 +749,24 @@ namespace nana{ namespace widgets
|
|||||||
nana::point scrpos;
|
nana::point scrpos;
|
||||||
if (0 != pos.x)
|
if (0 != pos.x)
|
||||||
{
|
{
|
||||||
|
nana::string str;
|
||||||
for (auto & sec : mtr.line_sections)
|
for (auto & sec : mtr.line_sections)
|
||||||
{
|
{
|
||||||
std::size_t chsize = sec.end - sec.begin;
|
std::size_t chsize = sec.end - sec.begin;
|
||||||
|
str.clear();
|
||||||
|
if (editor_.mask_char_)
|
||||||
|
str.append(chsize, editor_.mask_char_);
|
||||||
|
else
|
||||||
|
str.append(sec.begin, sec.end);
|
||||||
|
|
||||||
if (pos.x < chsize)
|
if (pos.x < chsize)
|
||||||
{
|
{
|
||||||
scrpos.x = editor_._m_pixels_by_char(nana::string(sec.begin, sec.end), pos.x);
|
scrpos.x = editor_._m_pixels_by_char(str, pos.x);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (pos.x == chsize)
|
else if (pos.x == chsize)
|
||||||
{
|
{
|
||||||
scrpos.x = editor_._m_text_extent_size(nana::string(sec.begin, sec.end).data(), sec.end - sec.begin).width;
|
scrpos.x = editor_._m_text_extent_size(str.data(), sec.end - sec.begin).width;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -773,13 +792,19 @@ namespace nana{ namespace widgets
|
|||||||
return{ 0, static_cast<unsigned>(primary) };
|
return{ 0, static_cast<unsigned>(primary) };
|
||||||
|
|
||||||
//First of all, find the text of secondary.
|
//First of all, find the text of secondary.
|
||||||
auto str = mtr.line_sections[secondary];
|
auto real_str = mtr.line_sections[secondary];
|
||||||
|
|
||||||
|
std::unique_ptr<nana::string> mask_str;
|
||||||
|
if (editor_.mask_char_)
|
||||||
|
mask_str.reset(new nana::string(real_str.end - real_str.begin, editor_.mask_char_));
|
||||||
|
|
||||||
|
const ::nana::char_t * str = (editor_.mask_char_ ? mask_str->data() : real_str.begin);
|
||||||
|
|
||||||
std::vector<unicode_bidi::entity> reordered;
|
std::vector<unicode_bidi::entity> reordered;
|
||||||
unicode_bidi bidi;
|
unicode_bidi bidi;
|
||||||
bidi.linestr(str.begin, str.end - str.begin, reordered);
|
bidi.linestr(str, real_str.end - real_str.begin, reordered);
|
||||||
|
|
||||||
nana::upoint res(static_cast<unsigned>(str.begin - mtr.line_sections.front().begin), static_cast<unsigned>(primary));
|
nana::upoint res(static_cast<unsigned>(real_str.begin - mtr.line_sections.front().begin), static_cast<unsigned>(primary));
|
||||||
scrpos.x -= editor_.text_area_.area.x;
|
scrpos.x -= editor_.text_area_.area.x;
|
||||||
if (scrpos.x < 0)
|
if (scrpos.x < 0)
|
||||||
scrpos.x = 0;
|
scrpos.x = 0;
|
||||||
@ -793,7 +818,7 @@ namespace nana{ namespace widgets
|
|||||||
std::unique_ptr<unsigned[]> pxbuf(new unsigned[len]);
|
std::unique_ptr<unsigned[]> pxbuf(new unsigned[len]);
|
||||||
|
|
||||||
res.x += editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, _m_is_right_text(ent));
|
res.x += editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, _m_is_right_text(ent));
|
||||||
res.x += static_cast<unsigned>(ent.begin - str.begin);
|
res.x += static_cast<unsigned>(ent.begin - str);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
scrpos.x -= str_px;
|
scrpos.x -= str_px;
|
||||||
@ -2760,18 +2785,17 @@ namespace nana{ namespace widgets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& linestr, bool if_mask) const
|
void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& str, bool if_mask) const
|
||||||
{
|
{
|
||||||
::nana::point text_pos{ text_area_.area.x - points_.offset.x, top };
|
::nana::point text_pos{ text_area_.area.x - points_.offset.x, top };
|
||||||
const int xend = text_area_.area.x + static_cast<int>(text_area_.area.width);
|
const int xend = text_area_.area.x + static_cast<int>(text_area_.area.width);
|
||||||
|
|
||||||
|
std::unique_ptr<nana::string> mask_str;
|
||||||
if (if_mask && mask_char_)
|
if (if_mask && mask_char_)
|
||||||
{
|
mask_str.reset(new nana::string(str.size(), mask_char_));
|
||||||
nana::string maskstr;
|
|
||||||
maskstr.append(linestr.size(), mask_char_);
|
|
||||||
graph_.string(text_pos, maskstr, clr);
|
auto & linestr = (if_mask && mask_char_ ? *mask_str : str);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unicode_bidi bidi;
|
unicode_bidi bidi;
|
||||||
std::vector<unicode_bidi::entity> reordered;
|
std::vector<unicode_bidi::entity> reordered;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user