some dom stuff

This commit is contained in:
SimonFJ20 2023-01-15 20:45:52 +01:00
parent 556b064e1d
commit a4ac73529e
6 changed files with 126 additions and 14 deletions

View File

@ -19,6 +19,7 @@ Diagnostics:
CheckOptions:
UnusedIncludes: Strict
cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor: true
# typecase rules
readability-identifier-naming.ClassCase: CamelCase

View File

@ -17,10 +17,10 @@ add_project_arguments(
)
sources = []
subdir('browser')
subdir('src')
executable(
'web-browser',
'browser',
sources,
win_subsystem: 'console',
include_directories: [],

30
src/dom.cpp Normal file
View File

@ -0,0 +1,30 @@
#include "dom.hpp"
namespace dom {
auto Box::size() const noexcept -> Size
{
auto new_size = Size {};
for (const auto& child : children)
new_size += child->size() + Size { 5, 5 };
new_size += { 5, 5 };
return new_size;
}
auto Box::render(Renderer& renderer, Position position) const noexcept -> void
{
renderer.draw_rectangle(position, size(), color);
auto child_position = position + Position { 5, 5 };
for (const auto& child : children) {
child->render(renderer, child_position);
child_position.y += child->size().height + 5;
}
}
auto Rectangle::render(Renderer& renderer, Position position) const noexcept
-> void
{
renderer.draw_rectangle(position, size(), color);
}
}

92
src/dom.hpp Normal file
View File

@ -0,0 +1,92 @@
#pragma once
#include <cstdint>
#include <memory>
#include <vector>
namespace dom {
template <typename T> using Ref = std::shared_ptr<T>;
struct Position {
auto operator+=(const Position& other) noexcept -> Position&
{
x += other.x;
y += other.y;
return *this;
}
int x, y;
};
auto operator+(const Position& a, const Position& b) noexcept -> Position
{
return { a.x + b.x, a.y + b.y };
}
struct Size {
auto operator+=(const Size& other) noexcept -> Size&
{
width += other.width;
height += other.height;
return *this;
}
friend auto operator+(const Size& a, const Size& b) noexcept -> Size;
int width, height;
};
auto operator+(const Size& a, const Size& b) noexcept -> Size
{
return { a.width + b.width, a.height + b.height };
}
struct Color {
static const auto opaque = uint8_t { 255 };
static const auto transparent = uint8_t { 0 };
uint8_t red, green, blue, alpha { opaque };
};
struct Renderer {
Renderer() = default;
virtual ~Renderer() = default;
virtual auto draw_rectangle(
Position position, Size size, Color color) const noexcept -> void
= 0;
};
struct Element {
Element() = default;
virtual ~Element() = default;
[[nodiscard]] virtual auto size() const noexcept -> Size = 0;
virtual auto render(Renderer& renderer, Position position) const noexcept
-> void
= 0;
};
struct Box final : public Element {
[[nodiscard]] auto size() const noexcept -> Size override;
auto render(Renderer& renderer, Position position) const noexcept
-> void override;
auto add_child(Ref<Element> element) noexcept
{
children.push_back(element);
}
std::vector<Ref<Element>> children;
Color color {};
};
struct Rectangle final : public Element {
Rectangle(Size size)
: m_size { size }
{ }
[[nodiscard]] auto size() const noexcept -> Size override { return m_size; }
auto render(Renderer& renderer, Position position) const noexcept
-> void override;
Color color {};
Size m_size { 50, 50 };
};
}

View File

@ -3,8 +3,7 @@
#include "SDL_rect.h"
#include "SDL_render.h"
#include "SDL_video.h"
#include "scriptlang/parser.hpp"
#include "utils/all.hpp"
#include "utils.hpp"
#include <SDL.h>
#include <fmt/core.h>
#include <memory>
@ -70,16 +69,6 @@ private:
auto main() -> int
{
const auto* text = "{name: \"test\", value: [true, false, 123, \"bruh\"], "
"int: 123, float: 3.14}";
auto ast = scriptlang::Parser(text).parse_expression(true);
if (!ast)
fmt::print("parser error at {}:{}: {}\n\t\n",
ast.unwrap_error().span.from.line,
ast.unwrap_error().span.from.column, ast.unwrap_error().message);
else
fmt::print("ast = {}\n", ast.unwrap()->to_string());
// test
fmt::print("browser: hello world!\n");
auto gui = GUI::create().unwrap();