Save change operations

This commit is contained in:
Josh Holtrop 2017-01-07 13:56:10 -05:00
parent 348d11e992
commit 38a734b5c1
2 changed files with 42 additions and 0 deletions

View File

@ -39,6 +39,8 @@ void Buffer::common_initialization()
m_eof_iterator->go_forward(); m_eof_iterator->go_forward();
} }
m_change_buffer = std::make_shared<GapBuffer>(); m_change_buffer = std::make_shared<GapBuffer>();
m_operation_level = 0;
m_current_operation_index = 0u;
} }
void Buffer::load_empty_buffer() void Buffer::load_empty_buffer()
@ -157,15 +159,18 @@ bool Buffer::write_to_file(const char * filename)
void Buffer::enter_insert_mode() void Buffer::enter_insert_mode()
{ {
m_insert_mode = true; m_insert_mode = true;
push_operation();
} }
void Buffer::exit_insert_mode() void Buffer::exit_insert_mode()
{ {
m_insert_mode = false; m_insert_mode = false;
pop_operation();
} }
void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators) void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_point, bool adjust_iterators)
{ {
push_operation();
Buffer::Iterator local_position = position; Buffer::Iterator local_position = position;
if ((code_point != '\n') && (size() == 0u)) if ((code_point != '\n') && (size() == 0u))
{ {
@ -186,12 +191,14 @@ void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_
} }
} }
} }
pop_operation();
} }
void Buffer::erase_code_point(const Buffer::Iterator & position) void Buffer::erase_code_point(const Buffer::Iterator & position)
{ {
if (position.valid()) if (position.valid())
{ {
push_operation();
Buffer::Iterator local_position = position; Buffer::Iterator local_position = position;
uint8_t bytes = 0u; uint8_t bytes = 0u;
uint32_t code_point = Encoding::decode(m_encoding, local_position.address(), &bytes); uint32_t code_point = Encoding::decode(m_encoding, local_position.address(), &bytes);
@ -205,6 +212,19 @@ void Buffer::erase_code_point(const Buffer::Iterator & position)
iterator->warp(-(ssize_t)bytes, lines); iterator->warp(-(ssize_t)bytes, lines);
} }
} }
pop_operation();
}
}
void Buffer::pop_operation()
{
if (m_operation_level > 0)
{
m_operation_level--;
if (m_operation_level == 0)
{
save_current_operation();
}
} }
} }
@ -276,3 +296,18 @@ void Buffer::record_change(uint8_t data[], size_t length, size_t buffer_position
cu.insert = insert; cu.insert = insert;
m_current_change_operation->changes.push_back(cu); m_current_change_operation->changes.push_back(cu);
} }
void Buffer::save_current_operation()
{
if (m_current_change_operation)
{
size_t new_change_operation_index = m_change_operations.size();
if (m_current_operation_index < new_change_operation_index)
{
m_change_operations[m_current_operation_index]->children.push_back(new_change_operation_index);
}
m_change_operations.push_back(m_current_change_operation);
m_current_change_operation = nullptr;
m_current_operation_index = new_change_operation_index;
}
}

View File

@ -8,6 +8,7 @@
#include "GapBuffer.h" #include "GapBuffer.h"
#include <string> #include <string>
#include "ChangeOperation.h" #include "ChangeOperation.h"
#include <vector>
class Buffer class Buffer
{ {
@ -117,6 +118,8 @@ public:
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); }
Iterator end() const { return *m_eof_iterator; } Iterator end() const { return *m_eof_iterator; }
void push_operation() { m_operation_level++; }
void pop_operation();
protected: protected:
bool m_eol_at_eof; bool m_eol_at_eof;
@ -130,6 +133,9 @@ protected:
std::shared_ptr<Iterator> m_eof_iterator; std::shared_ptr<Iterator> m_eof_iterator;
std::string m_filename; std::string m_filename;
std::shared_ptr<ChangeOperation> m_current_change_operation; std::shared_ptr<ChangeOperation> m_current_change_operation;
int m_operation_level;
size_t m_current_operation_index;
std::vector<std::shared_ptr<ChangeOperation>> m_change_operations;
void common_initialization(); void common_initialization();
bool load_from_file(const char * filename); bool load_from_file(const char * filename);
@ -137,6 +143,7 @@ protected:
bool load_from_memory(const uint8_t * data, size_t data_length); bool load_from_memory(const uint8_t * data, size_t data_length);
void load_text_in_buffer(uint8_t * buffer, size_t buffer_size, size_t data_length); void load_text_in_buffer(uint8_t * buffer, size_t buffer_size, size_t data_length);
void record_change(uint8_t data[], size_t length, size_t buffer_position, bool insert); void record_change(uint8_t data[], size_t length, size_t buffer_position, bool insert);
void save_current_operation();
}; };
#endif #endif