some dom stuff
This commit is contained in:
parent
556b064e1d
commit
a4ac73529e
1
.clangd
1
.clangd
@ -19,6 +19,7 @@ Diagnostics:
|
|||||||
|
|
||||||
CheckOptions:
|
CheckOptions:
|
||||||
UnusedIncludes: Strict
|
UnusedIncludes: Strict
|
||||||
|
cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor: true
|
||||||
|
|
||||||
# typecase rules
|
# typecase rules
|
||||||
readability-identifier-naming.ClassCase: CamelCase
|
readability-identifier-naming.ClassCase: CamelCase
|
||||||
|
@ -17,10 +17,10 @@ add_project_arguments(
|
|||||||
)
|
)
|
||||||
|
|
||||||
sources = []
|
sources = []
|
||||||
subdir('browser')
|
subdir('src')
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
'web-browser',
|
'browser',
|
||||||
sources,
|
sources,
|
||||||
win_subsystem: 'console',
|
win_subsystem: 'console',
|
||||||
include_directories: [],
|
include_directories: [],
|
||||||
|
30
src/dom.cpp
Normal file
30
src/dom.cpp
Normal 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
92
src/dom.hpp
Normal 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 };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
13
src/main.cpp
13
src/main.cpp
@ -3,8 +3,7 @@
|
|||||||
#include "SDL_rect.h"
|
#include "SDL_rect.h"
|
||||||
#include "SDL_render.h"
|
#include "SDL_render.h"
|
||||||
#include "SDL_video.h"
|
#include "SDL_video.h"
|
||||||
#include "scriptlang/parser.hpp"
|
#include "utils.hpp"
|
||||||
#include "utils/all.hpp"
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <fmt/core.h>
|
#include <fmt/core.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
@ -70,16 +69,6 @@ private:
|
|||||||
auto main() -> int
|
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
|
// test
|
||||||
fmt::print("browser: hello world!\n");
|
fmt::print("browser: hello world!\n");
|
||||||
auto gui = GUI::create().unwrap();
|
auto gui = GUI::create().unwrap();
|
||||||
|
Loading…
Reference in New Issue
Block a user