DisplayAtom: support empty replacement
This commit is contained in:
parent
603cfd3108
commit
d7e1cab116
|
@ -8,10 +8,15 @@ namespace Kakoune
|
||||||
|
|
||||||
String DisplayAtom::content() const
|
String DisplayAtom::content() const
|
||||||
{
|
{
|
||||||
if (m_replacement_text.empty())
|
switch (m_content_mode)
|
||||||
|
{
|
||||||
|
case BufferText:
|
||||||
return m_begin.buffer().string(m_begin, m_end);
|
return m_begin.buffer().string(m_begin, m_end);
|
||||||
else
|
case ReplacementText:
|
||||||
return m_replacement_text;
|
return m_replacement_text;
|
||||||
|
}
|
||||||
|
assert(false);
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
static DisplayCoord advance_coord(const DisplayCoord& pos,
|
static DisplayCoord advance_coord(const DisplayCoord& pos,
|
||||||
|
@ -40,17 +45,23 @@ static DisplayCoord advance_coord(const DisplayCoord& pos,
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayCoord DisplayAtom::end_coord() const
|
DisplayCoord DisplayAtom::end_coord() const
|
||||||
{
|
{
|
||||||
if (m_replacement_text.empty())
|
switch (m_content_mode)
|
||||||
|
{
|
||||||
|
case BufferText:
|
||||||
return advance_coord(m_coord, m_begin, m_end);
|
return advance_coord(m_coord, m_begin, m_end);
|
||||||
else
|
case ReplacementText:
|
||||||
return advance_coord(m_coord, m_replacement_text);
|
return advance_coord(m_coord, m_replacement_text);
|
||||||
|
}
|
||||||
|
assert(false);
|
||||||
|
return { 0, 0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
BufferIterator DisplayAtom::iterator_at(const DisplayCoord& coord) const
|
BufferIterator DisplayAtom::iterator_at(const DisplayCoord& coord) const
|
||||||
{
|
{
|
||||||
if (not m_replacement_text.empty() or coord <= m_coord)
|
if (m_content_mode != BufferText or coord <= m_coord)
|
||||||
return m_begin;
|
return m_begin;
|
||||||
|
|
||||||
DisplayCoord pos = m_coord;
|
DisplayCoord pos = m_coord;
|
||||||
|
@ -74,7 +85,7 @@ DisplayCoord DisplayAtom::line_and_column_at(const BufferIterator& iterator) con
|
||||||
{
|
{
|
||||||
assert(iterator >= m_begin and iterator < m_end);
|
assert(iterator >= m_begin and iterator < m_end);
|
||||||
|
|
||||||
if (not m_replacement_text.empty())
|
if (m_content_mode != BufferText)
|
||||||
return m_coord;
|
return m_coord;
|
||||||
|
|
||||||
return advance_coord(m_coord, m_begin, iterator);
|
return advance_coord(m_coord, m_begin, iterator);
|
||||||
|
@ -140,6 +151,7 @@ void DisplayBuffer::check_invariant() const
|
||||||
void DisplayBuffer::replace_atom_content(iterator atom,
|
void DisplayBuffer::replace_atom_content(iterator atom,
|
||||||
const String& replacement)
|
const String& replacement)
|
||||||
{
|
{
|
||||||
|
atom->m_content_mode = DisplayAtom::ReplacementText;
|
||||||
atom->m_replacement_text = replacement;
|
atom->m_replacement_text = replacement;
|
||||||
|
|
||||||
// update coordinates of subsequents atoms
|
// update coordinates of subsequents atoms
|
||||||
|
|
|
@ -57,7 +57,8 @@ struct DisplayAtom
|
||||||
Color fg_color = Color::Default,
|
Color fg_color = Color::Default,
|
||||||
Color bg_color = Color::Default,
|
Color bg_color = Color::Default,
|
||||||
Attribute attribute = Attributes::Normal)
|
Attribute attribute = Attributes::Normal)
|
||||||
: m_coord(coord),
|
: m_content_mode(BufferText),
|
||||||
|
m_coord(coord),
|
||||||
m_begin(begin), m_end(end),
|
m_begin(begin), m_end(end),
|
||||||
m_fg_color(fg_color),
|
m_fg_color(fg_color),
|
||||||
m_bg_color(bg_color),
|
m_bg_color(bg_color),
|
||||||
|
@ -86,6 +87,13 @@ struct DisplayAtom
|
||||||
private:
|
private:
|
||||||
friend class DisplayBuffer;
|
friend class DisplayBuffer;
|
||||||
|
|
||||||
|
enum ContentMode
|
||||||
|
{
|
||||||
|
BufferText,
|
||||||
|
ReplacementText
|
||||||
|
};
|
||||||
|
ContentMode m_content_mode;
|
||||||
|
|
||||||
DisplayCoord m_coord;
|
DisplayCoord m_coord;
|
||||||
BufferIterator m_begin;
|
BufferIterator m_begin;
|
||||||
BufferIterator m_end;
|
BufferIterator m_end;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user