summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorIdan Horowitz <idan.horowitz@gmail.com>2021-04-18 21:12:52 +0300
committerAndreas Kling <kling@serenityos.org>2021-04-18 22:10:25 +0200
commit18ae37439a4fdd65d98b94c75c5d64480a827289 (patch)
tree308d043fb13d07776308556f77cfd68f19f33a3a /Userland
parent08d1b16a8d1e43014f8252b74e5b3605cdb310f9 (diff)
downloadserenity-18ae37439a4fdd65d98b94c75c5d64480a827289.zip
FontEditor+LibGfx: Allow user to specify if a specific glyph is present
This replaces the glyph width spinbox in the font editor with a checkbox when editing fixed width fonts that indicates if the currently selected character's glyph is present in the edited font (For variable width fonts a non zero width implies presence) This commit also changes the background color of glyphs in the glyph map based on the presence of each specific glyph in the font.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Applications/FontEditor/FontEditor.cpp28
-rw-r--r--Userland/Applications/FontEditor/FontEditor.h1
-rw-r--r--Userland/Applications/FontEditor/FontEditorWindow.gml5
-rw-r--r--Userland/Applications/FontEditor/GlyphMapWidget.cpp5
-rw-r--r--Userland/Libraries/LibGfx/BitmapFont.h2
5 files changed, 33 insertions, 8 deletions
diff --git a/Userland/Applications/FontEditor/FontEditor.cpp b/Userland/Applications/FontEditor/FontEditor.cpp
index 5887d93199..69bae932e0 100644
--- a/Userland/Applications/FontEditor/FontEditor.cpp
+++ b/Userland/Applications/FontEditor/FontEditor.cpp
@@ -105,6 +105,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
m_glyph_editor_container = *find_descendant_of_type_named<GUI::Widget>("glyph_editor_container");
m_left_column_container = *find_descendant_of_type_named<GUI::Widget>("left_column_container");
m_glyph_editor_width_spinbox = *find_descendant_of_type_named<GUI::SpinBox>("glyph_editor_width_spinbox");
+ m_glyph_editor_present_checkbox = *find_descendant_of_type_named<GUI::CheckBox>("glyph_editor_present_checkbox");
m_name_textbox = *find_descendant_of_type_named<GUI::TextBox>("name_textbox");
m_family_textbox = *find_descendant_of_type_named<GUI::TextBox>("family_textbox");
m_presentation_spinbox = *find_descendant_of_type_named<GUI::SpinBox>("presentation_spinbox");
@@ -206,7 +207,9 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
m_edited_font->set_glyph_width(m_glyph_map_widget->selected_glyph(), m_edited_font->max_glyph_width());
m_glyph_editor_widget->delete_glyph();
m_glyph_map_widget->update_glyph(m_glyph_map_widget->selected_glyph());
- m_glyph_editor_width_spinbox->set_value(m_edited_font->glyph_width(m_glyph_map_widget->selected_glyph()));
+ auto glyph_width = m_edited_font->raw_glyph_width(m_glyph_map_widget->selected_glyph());
+ m_glyph_editor_width_spinbox->set_value(glyph_width);
+ m_glyph_editor_present_checkbox->set_checked(glyph_width > 0);
});
m_open_preview_action = GUI::Action::create("Preview Font", Gfx::Bitmap::load_from_file("/res/icons/16x16/find.png"), [&](auto&) {
if (!m_font_preview_window)
@@ -242,7 +245,9 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
m_glyph_map_widget->on_glyph_selected = [&](int glyph) {
m_glyph_editor_widget->set_glyph(glyph);
- m_glyph_editor_width_spinbox->set_value(m_edited_font->glyph_width(m_glyph_map_widget->selected_glyph()));
+ auto glyph_width = m_edited_font->raw_glyph_width(m_glyph_map_widget->selected_glyph());
+ m_glyph_editor_width_spinbox->set_value(glyph_width);
+ m_glyph_editor_present_checkbox->set_checked(glyph_width > 0);
StringBuilder builder;
builder.appendff("{:#02x} (", glyph);
if (glyph < 128) {
@@ -255,7 +260,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
builder.append(128 | (glyph % 64));
}
builder.append(") ");
- builder.appendff("[{}x{}]", m_edited_font->glyph_width(glyph), m_edited_font->glyph_height());
+ builder.appendff("[{}x{}]", m_edited_font->raw_glyph_width(glyph), m_edited_font->glyph_height());
statusbar.set_text(builder.to_string());
};
@@ -269,8 +274,11 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
m_fixed_width_checkbox->on_checked = [&, update_demo](bool checked) {
m_edited_font->set_fixed_width(checked);
- m_glyph_editor_width_spinbox->set_enabled(!m_edited_font->is_fixed_width());
- m_glyph_editor_width_spinbox->set_value(m_edited_font->glyph_width(m_glyph_map_widget->selected_glyph()));
+ auto glyph_width = m_edited_font->raw_glyph_width(m_glyph_map_widget->selected_glyph());
+ m_glyph_editor_width_spinbox->set_visible(!checked);
+ m_glyph_editor_width_spinbox->set_value(glyph_width);
+ m_glyph_editor_present_checkbox->set_visible(checked);
+ m_glyph_editor_present_checkbox->set_checked(glyph_width > 0);
m_glyph_editor_widget->update();
update_demo();
};
@@ -282,6 +290,13 @@ FontEditorWidget::FontEditorWidget(const String& path, RefPtr<Gfx::BitmapFont>&&
update_demo();
};
+ m_glyph_editor_present_checkbox->on_checked = [this, update_demo](bool checked) {
+ m_edited_font->set_glyph_width(m_glyph_map_widget->selected_glyph(), checked ? m_edited_font->glyph_fixed_width() : 0);
+ m_glyph_editor_widget->update();
+ m_glyph_map_widget->update_glyph(m_glyph_map_widget->selected_glyph());
+ update_demo();
+ };
+
m_weight_combobox->on_change = [this]() {
m_edited_font->set_weight(GUI::name_to_weight(m_weight_combobox->text()));
};
@@ -332,8 +347,9 @@ void FontEditorWidget::initialize(const String& path, RefPtr<Gfx::BitmapFont>&&
m_glyph_editor_container->set_fixed_size(m_glyph_editor_widget->preferred_width(), m_glyph_editor_widget->preferred_height());
m_left_column_container->set_fixed_width(m_glyph_editor_widget->preferred_width());
- m_glyph_editor_width_spinbox->set_enabled(!m_edited_font->is_fixed_width());
+ m_glyph_editor_width_spinbox->set_visible(!m_edited_font->is_fixed_width());
m_glyph_editor_width_spinbox->set_max(m_edited_font->max_glyph_width());
+ m_glyph_editor_present_checkbox->set_visible(m_edited_font->is_fixed_width());
m_name_textbox->set_text(m_edited_font->name());
m_family_textbox->set_text(m_edited_font->family());
diff --git a/Userland/Applications/FontEditor/FontEditor.h b/Userland/Applications/FontEditor/FontEditor.h
index ec3a2cce49..5bc64e19d6 100644
--- a/Userland/Applications/FontEditor/FontEditor.h
+++ b/Userland/Applications/FontEditor/FontEditor.h
@@ -79,6 +79,7 @@ private:
RefPtr<GUI::SpinBox> m_mean_line_spinbox;
RefPtr<GUI::SpinBox> m_presentation_spinbox;
RefPtr<GUI::SpinBox> m_glyph_editor_width_spinbox;
+ RefPtr<GUI::CheckBox> m_glyph_editor_present_checkbox;
RefPtr<GUI::TextBox> m_name_textbox;
RefPtr<GUI::TextBox> m_family_textbox;
RefPtr<GUI::CheckBox> m_fixed_width_checkbox;
diff --git a/Userland/Applications/FontEditor/FontEditorWindow.gml b/Userland/Applications/FontEditor/FontEditorWindow.gml
index 37969dc29c..7c9e7a0dc8 100644
--- a/Userland/Applications/FontEditor/FontEditorWindow.gml
+++ b/Userland/Applications/FontEditor/FontEditorWindow.gml
@@ -34,6 +34,11 @@
@GUI::SpinBox {
name: "glyph_editor_width_spinbox"
}
+
+ @GUI::CheckBox {
+ name: "glyph_editor_present_checkbox"
+ text: "Glyph Present"
+ }
}
@GUI::Widget {
diff --git a/Userland/Applications/FontEditor/GlyphMapWidget.cpp b/Userland/Applications/FontEditor/GlyphMapWidget.cpp
index c03302f93e..3ed04e3529 100644
--- a/Userland/Applications/FontEditor/GlyphMapWidget.cpp
+++ b/Userland/Applications/FontEditor/GlyphMapWidget.cpp
@@ -107,7 +107,7 @@ void GlyphMapWidget::paint_event(GUI::PaintEvent& event)
painter.add_clip_rect(event.rect());
painter.set_font(font());
- painter.fill_rect(widget_inner_rect(), palette().base());
+ painter.fill_rect(widget_inner_rect(), palette().inactive_window_title());
for (int glyph = 0; glyph < m_glyph_count; ++glyph) {
Gfx::IntRect outer_rect = get_outer_rect(glyph);
@@ -119,7 +119,8 @@ void GlyphMapWidget::paint_event(GUI::PaintEvent& event)
if (glyph == m_selected_glyph) {
painter.fill_rect(outer_rect, is_focused() ? palette().selection() : palette().inactive_selection());
painter.draw_glyph(inner_rect.location(), glyph, is_focused() ? palette().selection_text() : palette().inactive_selection_text());
- } else {
+ } else if (m_font->contains_glyph(glyph)) {
+ painter.fill_rect(outer_rect, palette().base());
painter.draw_glyph(inner_rect.location(), glyph, palette().base_text());
}
}
diff --git a/Userland/Libraries/LibGfx/BitmapFont.h b/Userland/Libraries/LibGfx/BitmapFont.h
index 4fab8edc27..67f7354e9c 100644
--- a/Userland/Libraries/LibGfx/BitmapFont.h
+++ b/Userland/Libraries/LibGfx/BitmapFont.h
@@ -70,6 +70,8 @@ public:
u8 glyph_height() const { return m_glyph_height; }
int x_height() const { return m_x_height; }
+ u8 raw_glyph_width(size_t ch) const { return m_glyph_widths[ch]; }
+
u8 min_glyph_width() const { return m_min_glyph_width; }
u8 max_glyph_width() const { return m_max_glyph_width; }
u8 glyph_fixed_width() const { return m_glyph_width; }