diff options
author | Andreas Kling <kling@serenityos.org> | 2020-08-21 19:36:20 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-21 21:16:13 +0200 |
commit | dfe8adde3fc9d914b4c47be831a972d9e1f8db13 (patch) | |
tree | 6844397145b1140e11dc34f20d2473862d5c54b4 /Applications/ThemeEditor | |
parent | 80a9896e83142fb6def8c287159a36717c1f94d5 (diff) | |
download | serenity-dfe8adde3fc9d914b4c47be831a972d9e1f8db13.zip |
ThemeEditor: Start working on a window theme editor :^)
Diffstat (limited to 'Applications/ThemeEditor')
-rw-r--r-- | Applications/ThemeEditor/CMakeLists.txt | 7 | ||||
-rw-r--r-- | Applications/ThemeEditor/PreviewWidget.cpp | 86 | ||||
-rw-r--r-- | Applications/ThemeEditor/PreviewWidget.h | 54 | ||||
-rw-r--r-- | Applications/ThemeEditor/main.cpp | 22 |
4 files changed, 169 insertions, 0 deletions
diff --git a/Applications/ThemeEditor/CMakeLists.txt b/Applications/ThemeEditor/CMakeLists.txt new file mode 100644 index 0000000000..e66d652f0a --- /dev/null +++ b/Applications/ThemeEditor/CMakeLists.txt @@ -0,0 +1,7 @@ +set(SOURCES + PreviewWidget.cpp + main.cpp +) + +serenity_bin(ThemeEditor) +target_link_libraries(ThemeEditor LibGUI) diff --git a/Applications/ThemeEditor/PreviewWidget.cpp b/Applications/ThemeEditor/PreviewWidget.cpp new file mode 100644 index 0000000000..c00cf683bf --- /dev/null +++ b/Applications/ThemeEditor/PreviewWidget.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * 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 "PreviewWidget.h" +#include <LibGUI/Painter.h> +#include <LibGfx/Bitmap.h> +#include <LibGfx/WindowTheme.h> + +namespace ThemeEditor { + +PreviewWidget::PreviewWidget(const Gfx::Palette& preview_palette) + : m_preview_palette(preview_palette) +{ + m_active_window_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window.png"); + m_inactive_window_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/window.png"); +} + +PreviewWidget::~PreviewWidget() +{ +} + +void PreviewWidget::set_preview_palette(const Gfx::Palette& palette) +{ + m_preview_palette = palette; + update(); +} + +void PreviewWidget::paint_event(GUI::PaintEvent& event) +{ + GUI::Frame::paint_event(event); + GUI::Painter painter(*this); + + painter.add_clip_rect(event.rect()); + painter.add_clip_rect(frame_inner_rect()); + + painter.fill_rect(frame_inner_rect(), m_preview_palette.desktop_background()); + + auto paint_window = [&](auto& title, const Gfx::IntRect& rect, auto state) { + Gfx::IntRect leftmost_button_rect { 300, 4, 16, 16 }; + + { + Gfx::PainterStateSaver saver(painter); + auto frame_rect = Gfx::WindowTheme::current().frame_rect_for_window(Gfx::WindowTheme::WindowType::Normal, rect, m_preview_palette); + painter.translate(frame_rect.location()); + Gfx::WindowTheme::current().paint_normal_frame(painter, state, rect, title, *m_active_window_icon, m_preview_palette, leftmost_button_rect); + } + + painter.fill_rect(rect, m_preview_palette.window()); + + Gfx::IntRect button_rect { 0, 0, 100, 20 }; + button_rect.center_within(rect); + Gfx::StylePainter::current().paint_button(painter, button_rect, m_preview_palette, Gfx::ButtonStyle::Normal, false); + }; + + Gfx::IntRect active_rect { 0, 0, 320, 240 }; + active_rect.center_within(frame_inner_rect()); + Gfx::IntRect inactive_rect = active_rect.translated(-20, -20); + + paint_window("Inactive window", inactive_rect, Gfx::WindowTheme::WindowState::Inactive); + paint_window("Active window", active_rect, Gfx::WindowTheme::WindowState::Active); +} + +} diff --git a/Applications/ThemeEditor/PreviewWidget.h b/Applications/ThemeEditor/PreviewWidget.h new file mode 100644 index 0000000000..2c0fe51b29 --- /dev/null +++ b/Applications/ThemeEditor/PreviewWidget.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> + * 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/Frame.h> +#include <LibGfx/Palette.h> + +namespace ThemeEditor { + +class PreviewWidget final : public GUI::Frame { + C_OBJECT(PreviewWidget); + +public: + virtual ~PreviewWidget() override; + + const Gfx::Palette& preview_palette() const { return m_preview_palette; } + void set_preview_palette(const Gfx::Palette&); + +private: + explicit PreviewWidget(const Gfx::Palette&); + + virtual void paint_event(GUI::PaintEvent&) override; + + Gfx::Palette m_preview_palette; + + RefPtr<Gfx::Bitmap> m_active_window_icon; + RefPtr<Gfx::Bitmap> m_inactive_window_icon; +}; + +} diff --git a/Applications/ThemeEditor/main.cpp b/Applications/ThemeEditor/main.cpp new file mode 100644 index 0000000000..bf469286d3 --- /dev/null +++ b/Applications/ThemeEditor/main.cpp @@ -0,0 +1,22 @@ +#include "PreviewWidget.h" +#include <LibGUI/Application.h> +#include <LibGUI/BoxLayout.h> +#include <LibGUI/Window.h> + +int main(int argc, char** argv) +{ + auto app = GUI::Application::construct(argc, argv); + + auto window = GUI::Window::construct(); + auto& main_widget = window->set_main_widget<GUI::Widget>(); + main_widget.set_fill_with_background_color(true); + main_widget.set_layout<GUI::VerticalBoxLayout>(); + + auto& preview_widget = main_widget.add<ThemeEditor::PreviewWidget>(app->palette()); + preview_widget.set_preferred_size(480, 360); + preview_widget.set_size_policy(GUI::SizePolicy::Fixed, GUI::SizePolicy::Fixed); + + window->resize(500, 400); + window->show(); + return app->exec(); +} |