diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-07-04 16:16:50 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-07-04 16:16:50 +0200 |
commit | 04b9dc2d30cfc9b383029f6a4b02e2725108b0ae (patch) | |
tree | e117a998173b767f9fd009d49c4f8573d8b85432 /Libraries/LibGUI/GCheckBox.cpp | |
parent | 63814ffebf16291419745cd8ba29a4d2fd888563 (diff) | |
download | serenity-04b9dc2d30cfc9b383029f6a4b02e2725108b0ae.zip |
Libraries: Create top level directory for libraries.
Things were getting a little crowded in the project root, so this patch
moves the Lib*/ directories into Libraries/.
Diffstat (limited to 'Libraries/LibGUI/GCheckBox.cpp')
-rw-r--r-- | Libraries/LibGUI/GCheckBox.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Libraries/LibGUI/GCheckBox.cpp b/Libraries/LibGUI/GCheckBox.cpp new file mode 100644 index 0000000000..2bd5067bc9 --- /dev/null +++ b/Libraries/LibGUI/GCheckBox.cpp @@ -0,0 +1,77 @@ +#include <Kernel/KeyCode.h> +#include <LibGUI/GCheckBox.h> +#include <LibGUI/GPainter.h> +#include <SharedGraphics/CharacterBitmap.h> +#include <SharedGraphics/StylePainter.h> + +static const char* s_checked_bitmap_data = { + " " + " # " + " ## " + " ### " + " ## ### " + " ##### " + " ### " + " # " + " " +}; + +static CharacterBitmap* s_checked_bitmap; +static const int s_checked_bitmap_width = 9; +static const int s_checked_bitmap_height = 9; +static const int s_box_width = 13; +static const int s_box_height = 13; + +GCheckBox::GCheckBox(GWidget* parent) + : GAbstractButton(parent) +{ +} + +GCheckBox::GCheckBox(const StringView& text, GWidget* parent) + : GAbstractButton(text, parent) +{ +} + +GCheckBox::~GCheckBox() +{ +} + +void GCheckBox::paint_event(GPaintEvent& event) +{ + GPainter painter(*this); + painter.add_clip_rect(event.rect()); + + auto text_rect = rect(); + text_rect.set_left(s_box_width + 4); + text_rect.set_width(font().width(text())); + text_rect.set_top(height() / 2 - font().glyph_height() / 2); + text_rect.set_height(font().glyph_height()); + + if (fill_with_background_color()) + painter.fill_rect(rect(), background_color()); + + Rect box_rect { + 0, height() / 2 - s_box_height / 2 - 1, + s_box_width, s_box_height + }; + painter.fill_rect(box_rect, Color::White); + StylePainter::paint_frame(painter, box_rect, FrameShape::Container, FrameShadow::Sunken, 2); + + if (is_being_pressed()) + painter.draw_rect(box_rect.shrunken(4, 4), Color::MidGray); + + if (is_checked()) { + if (!s_checked_bitmap) + s_checked_bitmap = &CharacterBitmap::create_from_ascii(s_checked_bitmap_data, s_checked_bitmap_width, s_checked_bitmap_height).leak_ref(); + painter.draw_bitmap(box_rect.shrunken(4, 4).location(), *s_checked_bitmap, foreground_color()); + } + + paint_text(painter, text_rect, font(), TextAlignment::TopLeft); +} + +void GCheckBox::click() +{ + if (!is_enabled()) + return; + set_checked(!is_checked()); +} |