1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 20:08:13 +00:00

HexEditor: Only mark window as modified when document is actually dirty

This commit is contained in:
kamp 2022-09-05 23:49:35 +02:00 committed by Linus Groh
parent e44ccddba3
commit 24f729d0ef
5 changed files with 37 additions and 10 deletions

View file

@ -8,7 +8,13 @@
void HexDocument::set(size_t position, u8 value)
{
m_changes.set(position, value);
auto unchanged_value = get_unchanged(position);
if (value == unchanged_value) {
m_changes.remove(position);
} else {
m_changes.set(position, value);
}
}
bool HexDocument::is_dirty() const
@ -31,6 +37,11 @@ HexDocument::Cell HexDocumentMemory::get(size_t position)
}
}
u8 HexDocumentMemory::get_unchanged(size_t position)
{
return m_buffer[position];
}
size_t HexDocumentMemory::size() const
{
return m_buffer.size();
@ -108,14 +119,16 @@ HexDocument::Cell HexDocumentFile::get(size_t position)
return Cell { tracked_change.value(), true };
}
if (position < m_buffer_file_pos || position >= m_buffer_file_pos + m_buffer.size()) {
m_file->seek(position, Core::SeekMode::SetPosition);
m_file->read(m_buffer.data(), m_buffer.size());
m_buffer_file_pos = position;
}
ensure_position_in_buffer(position);
return { m_buffer[position - m_buffer_file_pos], false };
}
u8 HexDocumentFile::get_unchanged(size_t position)
{
ensure_position_in_buffer(position);
return m_buffer[position - m_buffer_file_pos];
}
size_t HexDocumentFile::size() const
{
return m_file_size;
@ -152,3 +165,12 @@ NonnullRefPtr<Core::File> HexDocumentFile::file() const
{
return m_file;
}
void HexDocumentFile::ensure_position_in_buffer(size_t position)
{
if (position < m_buffer_file_pos || position >= m_buffer_file_pos + m_buffer.size()) {
m_file->seek(position, Core::SeekMode::SetPosition);
m_file->read(m_buffer.data(), m_buffer.size());
m_buffer_file_pos = position;
}
}