summaryrefslogtreecommitdiff
path: root/Userland/Applications/FontEditor/FontEditor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Applications/FontEditor/FontEditor.cpp')
-rw-r--r--Userland/Applications/FontEditor/FontEditor.cpp50
1 files changed, 21 insertions, 29 deletions
diff --git a/Userland/Applications/FontEditor/FontEditor.cpp b/Userland/Applications/FontEditor/FontEditor.cpp
index 041c4aa7de..fb46d65604 100644
--- a/Userland/Applications/FontEditor/FontEditor.cpp
+++ b/Userland/Applications/FontEditor/FontEditor.cpp
@@ -348,12 +348,15 @@ FontEditorWidget::FontEditorWidget()
};
m_glyph_editor_widget->on_undo_event = [this] {
- m_undo_stack->push(make<GlyphUndoCommand>(*m_undo_glyph));
+ m_undo_stack->push(make<SelectionUndoCommand>(*m_undo_selection));
};
m_glyph_map_widget->on_active_glyph_changed = [this](int glyph) {
- if (m_undo_glyph)
- m_undo_glyph->set_code_point(glyph);
+ if (m_undo_selection) {
+ auto selection = m_glyph_map_widget->selection().normalized();
+ m_undo_selection->set_start(selection.start());
+ m_undo_selection->set_size(selection.size());
+ }
m_glyph_editor_widget->set_glyph(glyph);
auto glyph_width = m_edited_font->raw_glyph_width(glyph);
if (m_edited_font->is_fixed_width())
@@ -386,7 +389,7 @@ FontEditorWidget::FontEditorWidget()
};
m_glyph_editor_width_spinbox->on_change = [this](int value) {
- m_undo_stack->push(make<GlyphUndoCommand>(*m_undo_glyph));
+ m_undo_stack->push(make<SelectionUndoCommand>(*m_undo_selection));
m_edited_font->set_glyph_width(m_glyph_map_widget->active_glyph(), value);
m_glyph_editor_widget->update();
m_glyph_map_widget->update_glyph(m_glyph_map_widget->active_glyph());
@@ -396,7 +399,7 @@ FontEditorWidget::FontEditorWidget()
};
m_glyph_editor_present_checkbox->on_checked = [this](bool checked) {
- m_undo_stack->push(make<GlyphUndoCommand>(*m_undo_glyph));
+ m_undo_stack->push(make<SelectionUndoCommand>(*m_undo_selection));
m_edited_font->set_glyph_width(m_glyph_map_widget->active_glyph(), checked ? m_edited_font->glyph_fixed_width() : 0);
m_glyph_editor_widget->update();
m_glyph_map_widget->update_glyph(m_glyph_map_widget->active_glyph());
@@ -559,7 +562,7 @@ void FontEditorWidget::initialize(String const& path, RefPtr<Gfx::BitmapFont>&&
});
m_undo_stack = make<GUI::UndoStack>();
- m_undo_glyph = adopt_ref(*new UndoGlyph(m_glyph_map_widget->active_glyph(), *m_edited_font));
+ m_undo_selection = adopt_ref(*new UndoSelection(m_glyph_map_widget->selection().start(), m_glyph_map_widget->selection().size(), *m_edited_font));
m_undo_stack->on_state_change = [this] {
m_undo_action->set_enabled(m_undo_stack->can_undo());
@@ -672,8 +675,8 @@ void FontEditorWidget::undo()
if (!m_undo_stack->can_undo())
return;
m_undo_stack->undo();
- auto glyph = m_undo_glyph->restored_code_point();
- auto glyph_width = m_undo_glyph->restored_width();
+ auto glyph = m_undo_selection->previous_active_glyph();
+ auto glyph_width = edited_font().raw_glyph_width(glyph);
m_glyph_map_widget->set_active_glyph(glyph);
m_glyph_map_widget->scroll_to_glyph(glyph);
if (m_edited_font->is_fixed_width()) {
@@ -681,9 +684,8 @@ void FontEditorWidget::undo()
} else {
m_glyph_editor_width_spinbox->set_value(glyph_width, GUI::AllowCallback::No);
}
- m_edited_font->set_glyph_width(m_glyph_map_widget->active_glyph(), glyph_width);
m_glyph_editor_widget->update();
- m_glyph_map_widget->update_glyph(glyph);
+ m_glyph_map_widget->update();
update_preview();
update_statusbar();
}
@@ -693,8 +695,8 @@ void FontEditorWidget::redo()
if (!m_undo_stack->can_redo())
return;
m_undo_stack->redo();
- auto glyph = m_undo_glyph->restored_code_point();
- auto glyph_width = m_undo_glyph->restored_width();
+ auto glyph = m_undo_selection->previous_active_glyph();
+ auto glyph_width = edited_font().raw_glyph_width(glyph);
m_glyph_map_widget->set_active_glyph(glyph);
m_glyph_map_widget->scroll_to_glyph(glyph);
if (m_edited_font->is_fixed_width()) {
@@ -702,9 +704,8 @@ void FontEditorWidget::redo()
} else {
m_glyph_editor_width_spinbox->set_value(glyph_width, GUI::AllowCallback::No);
}
- m_edited_font->set_glyph_width(m_glyph_map_widget->active_glyph(), glyph_width);
m_glyph_editor_widget->update();
- m_glyph_map_widget->update_glyph(glyph);
+ m_glyph_map_widget->update();
update_preview();
update_statusbar();
}
@@ -857,15 +858,11 @@ void FontEditorWidget::paste_glyphs()
if (!height)
return;
- // FIXME: This is a hack to avoid regression and still doesn't support
- // multiple glyphs. It should have done proper undo stack integration.
- if (glyph_count == 1) {
- if (m_glyph_editor_widget->on_undo_event)
- m_glyph_editor_widget->on_undo_event();
- }
-
auto selection = m_glyph_map_widget->selection().normalized();
auto range_bound_glyph_count = min(glyph_count, 1 + m_range.last - selection.start());
+ m_undo_selection->set_size(range_bound_glyph_count);
+ if (m_glyph_editor_widget->on_undo_event)
+ m_glyph_editor_widget->on_undo_event();
size_t bytes_per_glyph = Gfx::GlyphBitmap::bytes_per_row() * edited_font().glyph_height();
size_t bytes_per_copied_glyph = Gfx::GlyphBitmap::bytes_per_row() * height;
@@ -893,15 +890,10 @@ void FontEditorWidget::paste_glyphs()
void FontEditorWidget::delete_selected_glyphs()
{
- auto selection = m_glyph_map_widget->selection().normalized();
-
- // FIXME: This is a hack to avoid regression and still doesn't support
- // multiple glyphs. It should have done proper undo stack integration.
- if (selection.size() == 1) {
- if (m_glyph_editor_widget->on_undo_event)
- m_glyph_editor_widget->on_undo_event();
- }
+ if (m_glyph_editor_widget->on_undo_event)
+ m_glyph_editor_widget->on_undo_event();
+ auto selection = m_glyph_map_widget->selection().normalized();
size_t bytes_per_glyph = Gfx::GlyphBitmap::bytes_per_row() * m_edited_font->glyph_height();
auto* rows = m_edited_font->rows() + selection.start() * bytes_per_glyph;
auto* widths = m_edited_font->widths() + selection.start();