diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2020-07-19 10:09:51 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-20 21:03:48 +0200 |
commit | bf59cd7ca5304e353f2d8ae35fec6b1db7b3097a (patch) | |
tree | fda01c4a71ce17d2712d4abec41d74d4db556579 | |
parent | 76523a3d2d5c3f5af019017b1a089d65da7e6c97 (diff) | |
download | serenity-bf59cd7ca5304e353f2d8ae35fec6b1db7b3097a.zip |
LibGUI: Add ControlBoxButton to LibGUI
ControlBoxButton consolidates the paint_event for buttons
used in composite box widgets like ComboBox and SpinBox. Its
button bitmaps are built with create_from_ascii like WindowFrame
and ScrollBar controls, making theming more uniform.
-rw-r--r-- | Libraries/LibGUI/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Libraries/LibGUI/ControlBoxButton.cpp | 89 | ||||
-rw-r--r-- | Libraries/LibGUI/ControlBoxButton.h | 52 |
3 files changed, 142 insertions, 0 deletions
diff --git a/Libraries/LibGUI/CMakeLists.txt b/Libraries/LibGUI/CMakeLists.txt index de933a5a15..57800506f0 100644 --- a/Libraries/LibGUI/CMakeLists.txt +++ b/Libraries/LibGUI/CMakeLists.txt @@ -15,6 +15,7 @@ set(SOURCES ColumnsView.cpp ComboBox.cpp Command.cpp + ControlBoxButton.cpp CppLexer.cpp CppSyntaxHighlighter.cpp Desktop.cpp diff --git a/Libraries/LibGUI/ControlBoxButton.cpp b/Libraries/LibGUI/ControlBoxButton.cpp new file mode 100644 index 0000000000..b6f0ebcb75 --- /dev/null +++ b/Libraries/LibGUI/ControlBoxButton.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2020, Charles Chaucer <thankyouverycool@github> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <LibGUI/ControlBoxButton.h> +#include <LibGUI/Painter.h> +#include <LibGfx/CharacterBitmap.h> +#include <LibGfx/Palette.h> + +namespace GUI { + +static const char* s_up_arrow_bitmap_data = { + " " + " # " + " ### " + " ##### " + " ####### " + " " +}; + +static const char* s_down_arrow_bitmap_data = { + " " + " ####### " + " ##### " + " ### " + " # " + " " +}; + +static Gfx::CharacterBitmap* s_up_arrow_bitmap; +static Gfx::CharacterBitmap* s_down_arrow_bitmap; +static const int s_bitmap_width = 9; +static const int s_bitmap_height = 6; + +ControlBoxButton::ControlBoxButton(Type type) + : m_type(type) +{ +} + +ControlBoxButton::~ControlBoxButton() +{ +} + +void ControlBoxButton::paint_event(PaintEvent& event) +{ + Painter painter(*this); + painter.add_clip_rect(event.rect()); + + Gfx::StylePainter::paint_button(painter, rect(), palette(), Gfx::ButtonStyle::Normal, is_being_pressed(), is_hovered(), is_checked(), is_enabled()); + + auto button_location = rect().location().translated((width() - s_bitmap_width) / 2, (height() - s_bitmap_height) / 2); + + if (is_being_pressed()) + button_location.move_by(1, 1); + + if (type() == UpArrow) { + if (!s_up_arrow_bitmap) + s_up_arrow_bitmap = &Gfx::CharacterBitmap::create_from_ascii(s_up_arrow_bitmap_data, s_bitmap_width, s_bitmap_height).leak_ref(); + painter.draw_bitmap(button_location, *s_up_arrow_bitmap, is_enabled() ? palette().button_text() : palette().threed_shadow1()); + } else { + if (!s_down_arrow_bitmap) + s_down_arrow_bitmap = &Gfx::CharacterBitmap::create_from_ascii(s_down_arrow_bitmap_data, s_bitmap_width, s_bitmap_height).leak_ref(); + painter.draw_bitmap(button_location, *s_down_arrow_bitmap, is_enabled() ? palette().button_text() : palette().threed_shadow1()); + } +} + +} diff --git a/Libraries/LibGUI/ControlBoxButton.h b/Libraries/LibGUI/ControlBoxButton.h new file mode 100644 index 0000000000..7399010ee8 --- /dev/null +++ b/Libraries/LibGUI/ControlBoxButton.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020, Charles Chaucer <thankyouverycool@github> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include <LibGUI/Button.h> + +namespace GUI { + +class ControlBoxButton final : public Button { + C_OBJECT(ControlBoxButton); + +public: + enum Type { + UpArrow, + DownArrow + }; + + virtual ~ControlBoxButton() override; + +private: + explicit ControlBoxButton(const Type type); + virtual void paint_event(PaintEvent& event) override; + + Type m_type { DownArrow }; + Type type() const { return m_type; } +}; + +} |