Fix text insertion point not following cursor
Always supply iterator position when inserting code points
This commit is contained in:
parent
314b39b81a
commit
a8b39f8884
@ -153,13 +153,8 @@ bool Buffer::write_to_file(const char * filename)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Buffer::enter_insert_mode(const Buffer::Iterator & position)
|
void Buffer::enter_insert_mode()
|
||||||
{
|
{
|
||||||
m_insert_position = position.offset();
|
|
||||||
if (m_insert_position > m_gap_buffer->size())
|
|
||||||
{
|
|
||||||
m_insert_position = 0;
|
|
||||||
}
|
|
||||||
m_insert_mode = true;
|
m_insert_mode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,28 +163,28 @@ void Buffer::exit_insert_mode()
|
|||||||
m_insert_mode = false;
|
m_insert_mode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Buffer::insert_code_point(uint32_t code_point, bool adjust_iterators)
|
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators)
|
||||||
{
|
{
|
||||||
if (m_insert_mode)
|
if (m_insert_mode)
|
||||||
{
|
{
|
||||||
|
Buffer::Iterator local_position = position;
|
||||||
if ((code_point != '\n') && (size() == 0u))
|
if ((code_point != '\n') && (size() == 0u))
|
||||||
{
|
{
|
||||||
insert_code_point('\n', false);
|
insert_code_point(position, '\n', false);
|
||||||
}
|
}
|
||||||
uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE];
|
uint8_t encoded[Encoding::MAX_CODE_POINT_SIZE];
|
||||||
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
|
uint8_t bytes = Encoding::encode(code_point, m_encoding, encoded);
|
||||||
m_gap_buffer->insert(m_insert_position, encoded, bytes);
|
m_gap_buffer->insert(local_position.offset(), encoded, bytes);
|
||||||
ssize_t lines = (code_point == '\n') ? 1 : 0;
|
ssize_t lines = (code_point == '\n') ? 1 : 0;
|
||||||
if (adjust_iterators)
|
if (adjust_iterators)
|
||||||
{
|
{
|
||||||
for (auto iterator : m_iterators)
|
for (auto iterator : m_iterators)
|
||||||
{
|
{
|
||||||
if (iterator->offset() >= m_insert_position)
|
if (*iterator >= local_position)
|
||||||
{
|
{
|
||||||
iterator->warp(bytes, lines);
|
iterator->warp(bytes, lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_insert_position += bytes;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,20 +193,17 @@ void Buffer::erase_code_point(const Buffer::Iterator & position)
|
|||||||
{
|
{
|
||||||
if (position.valid())
|
if (position.valid())
|
||||||
{
|
{
|
||||||
|
Buffer::Iterator local_position = position;
|
||||||
uint8_t bytes = 0u;
|
uint8_t bytes = 0u;
|
||||||
uint32_t code_point = Encoding::decode(m_encoding, position.address(), &bytes);
|
uint32_t code_point = Encoding::decode(m_encoding, local_position.address(), &bytes);
|
||||||
m_gap_buffer->erase(position.offset(), bytes);
|
m_gap_buffer->erase(local_position.offset(), bytes);
|
||||||
ssize_t lines = (code_point == '\n') ? -1 : 0;
|
ssize_t lines = (code_point == '\n') ? -1 : 0;
|
||||||
for (auto iterator : m_iterators)
|
for (auto iterator : m_iterators)
|
||||||
{
|
{
|
||||||
if (*iterator > position)
|
if (*iterator > local_position)
|
||||||
{
|
{
|
||||||
iterator->warp(-(ssize_t)bytes, lines);
|
iterator->warp(-(ssize_t)bytes, lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_insert_position > position.offset())
|
|
||||||
{
|
|
||||||
m_insert_position -= bytes;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,10 +108,10 @@ public:
|
|||||||
uint8_t * address(size_t offset) const { return m_gap_buffer->address(offset); }
|
uint8_t * address(size_t offset) const { return m_gap_buffer->address(offset); }
|
||||||
Encoding::Type encoding() const { return m_encoding; }
|
Encoding::Type encoding() const { return m_encoding; }
|
||||||
uint8_t tabstop() const { return m_tabstop; }
|
uint8_t tabstop() const { return m_tabstop; }
|
||||||
void enter_insert_mode(const Buffer::Iterator & position);
|
void enter_insert_mode();
|
||||||
void exit_insert_mode();
|
void exit_insert_mode();
|
||||||
bool insert_mode() const { return m_insert_mode; }
|
bool insert_mode() const { return m_insert_mode; }
|
||||||
void insert_code_point(uint32_t code_point, bool adjust_iterators = true);
|
void insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators = true);
|
||||||
void erase_code_point(const Buffer::Iterator & position);
|
void erase_code_point(const Buffer::Iterator & position);
|
||||||
std::string filename() const { return m_filename; }
|
std::string filename() const { return m_filename; }
|
||||||
Iterator begin() const { return Iterator(this); }
|
Iterator begin() const { return Iterator(this); }
|
||||||
@ -124,7 +124,6 @@ protected:
|
|||||||
Encoding::Type m_encoding;
|
Encoding::Type m_encoding;
|
||||||
uint8_t m_tabstop;
|
uint8_t m_tabstop;
|
||||||
bool m_insert_mode;
|
bool m_insert_mode;
|
||||||
size_t m_insert_position;
|
|
||||||
std::list<std::shared_ptr<Iterator>> m_iterators;
|
std::list<std::shared_ptr<Iterator>> m_iterators;
|
||||||
std::shared_ptr<Iterator> m_eof_iterator;
|
std::shared_ptr<Iterator> m_eof_iterator;
|
||||||
std::string m_filename;
|
std::string m_filename;
|
||||||
|
@ -431,7 +431,7 @@ void BufferPane::insert_code_point(uint32_t code_point)
|
|||||||
code_point = '\n';
|
code_point = '\n';
|
||||||
m_cursor_screen_row++;
|
m_cursor_screen_row++;
|
||||||
}
|
}
|
||||||
m_buffer->insert_code_point(code_point);
|
m_buffer->insert_code_point(*m_iterator, code_point);
|
||||||
}
|
}
|
||||||
m_window->request_redraw();
|
m_window->request_redraw();
|
||||||
}
|
}
|
||||||
@ -573,14 +573,14 @@ void BufferPane::enter_insert_mode(Window::EnterInsertModeMode which)
|
|||||||
switch (which)
|
switch (which)
|
||||||
{
|
{
|
||||||
case Window::EnterInsertModeMode::START_OF_CHAR:
|
case Window::EnterInsertModeMode::START_OF_CHAR:
|
||||||
m_buffer->enter_insert_mode(*m_iterator);
|
m_buffer->enter_insert_mode();
|
||||||
break;
|
break;
|
||||||
case Window::EnterInsertModeMode::END_OF_CHAR:
|
case Window::EnterInsertModeMode::END_OF_CHAR:
|
||||||
if (**m_iterator != '\n')
|
if (**m_iterator != '\n')
|
||||||
{
|
{
|
||||||
m_iterator->go_forward();
|
m_iterator->go_forward();
|
||||||
}
|
}
|
||||||
m_buffer->enter_insert_mode(*m_iterator);
|
m_buffer->enter_insert_mode();
|
||||||
break;
|
break;
|
||||||
case Window::EnterInsertModeMode::START_OF_LINE:
|
case Window::EnterInsertModeMode::START_OF_LINE:
|
||||||
m_iterator->go_start_of_line();
|
m_iterator->go_start_of_line();
|
||||||
@ -592,16 +592,16 @@ void BufferPane::enter_insert_mode(Window::EnterInsertModeMode which)
|
|||||||
break;
|
break;
|
||||||
case Window::EnterInsertModeMode::NEW_LINE_BEFORE:
|
case Window::EnterInsertModeMode::NEW_LINE_BEFORE:
|
||||||
m_iterator->go_start_of_line();
|
m_iterator->go_start_of_line();
|
||||||
m_buffer->enter_insert_mode(*m_iterator);
|
m_buffer->enter_insert_mode();
|
||||||
m_buffer->insert_code_point('\n');
|
m_buffer->insert_code_point(*m_iterator, '\n');
|
||||||
m_buffer->exit_insert_mode();
|
m_buffer->exit_insert_mode();
|
||||||
cursor_move(Window::CursorMovement::UP);
|
cursor_move(Window::CursorMovement::UP);
|
||||||
enter_insert_mode(Window::EnterInsertModeMode::START_OF_CHAR);
|
enter_insert_mode(Window::EnterInsertModeMode::START_OF_CHAR);
|
||||||
break;
|
break;
|
||||||
case Window::EnterInsertModeMode::NEW_LINE_AFTER:
|
case Window::EnterInsertModeMode::NEW_LINE_AFTER:
|
||||||
m_iterator->go_end_of_line(true);
|
m_iterator->go_end_of_line(true);
|
||||||
m_buffer->enter_insert_mode(*m_iterator);
|
m_buffer->enter_insert_mode();
|
||||||
m_buffer->insert_code_point('\n');
|
m_buffer->insert_code_point(*m_iterator, '\n');
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user