summaryrefslogtreecommitdiff
path: root/Applications/ThemeEditor
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-08-21 19:36:20 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-21 21:16:13 +0200
commitdfe8adde3fc9d914b4c47be831a972d9e1f8db13 (patch)
tree6844397145b1140e11dc34f20d2473862d5c54b4 /Applications/ThemeEditor
parent80a9896e83142fb6def8c287159a36717c1f94d5 (diff)
downloadserenity-dfe8adde3fc9d914b4c47be831a972d9e1f8db13.zip
ThemeEditor: Start working on a window theme editor :^)
Diffstat (limited to 'Applications/ThemeEditor')
-rw-r--r--Applications/ThemeEditor/CMakeLists.txt7
-rw-r--r--Applications/ThemeEditor/PreviewWidget.cpp86
-rw-r--r--Applications/ThemeEditor/PreviewWidget.h54
-rw-r--r--Applications/ThemeEditor/main.cpp22
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();
+}