summaryrefslogtreecommitdiff
path: root/Libraries/LibGUI/GCheckBox.cpp
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-07-04 16:16:50 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-07-04 16:16:50 +0200
commit04b9dc2d30cfc9b383029f6a4b02e2725108b0ae (patch)
treee117a998173b767f9fd009d49c4f8573d8b85432 /Libraries/LibGUI/GCheckBox.cpp
parent63814ffebf16291419745cd8ba29a4d2fd888563 (diff)
downloadserenity-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.cpp77
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());
+}