srctree

Robin Linden parent a30458ee e776efd6
engine: Accept options as an argument instead of via setters

We're going to be adding a bunch more things here for e.g. media-querystuff, and this feels easier to extend without making a mess.

inlinesplit
browser/gui/app.cpp added: 27, removed: 24, total 3
@@ -7,6 +7,7 @@
#include "css/rule.h"
#include "css/style_sheet.h"
#include "dom/dom.h"
#include "engine/engine.h"
#include "geom/geom.h"
#include "gfx/color.h"
#include "gfx/opengl_canvas.h"
@@ -250,8 +251,6 @@ App::App(std::string browser_title, std::string start_page_hint, bool load_start
 
canvas_->set_viewport_size(window_.getSize().x, window_.getSize().y);
 
engine_.set_layout_width(window_.getSize().x / scale_);
 
if (load_start_page) {
ensure_has_scheme(url_buf_);
navigate();
@@ -273,8 +272,6 @@ void App::set_scale(unsigned scale) {
window_.setSize({kDefaultResolutionX * scale_, kDefaultResolutionY * scale_});
canvas_->set_viewport_size(window_.getSize().x, window_.getSize().y);
}
 
engine_.set_layout_width(window_size.x / scale_);
}
 
void App::step() {
@@ -293,9 +290,8 @@ void App::step() {
}
case sf::Event::Resized: {
canvas_->set_viewport_size(event.size.width, event.size.height);
engine_.set_layout_width(event.size.width / scale_);
if (maybe_page_) {
engine_.relayout(**maybe_page_, event.size.width / scale_);
engine_.relayout(**maybe_page_, make_options());
on_layout_updated();
}
break;
@@ -480,7 +476,7 @@ void App::navigate() {
}
 
browse_history_.push(*uri);
maybe_page_ = engine_.navigate(*std::move(uri));
maybe_page_ = engine_.navigate(*std::move(uri), make_options());
 
// Make sure the displayed url is still correct if we followed any redirects.
if (maybe_page_) {
@@ -779,4 +775,8 @@ void App::switch_canvas() {
canvas_->set_viewport_size(width, height);
}
 
engine::Options App::make_options() const {
return {.layout_width = static_cast<int>(window_.getSize().x / scale_)};
}
 
} // namespace browser::gui
 
browser/gui/app.h added: 27, removed: 24, total 3
@@ -108,6 +108,8 @@ private:
void show_render_surface();
 
void switch_canvas();
 
engine::Options make_options() const;
};
 
} // namespace browser::gui
 
engine/engine.cpp added: 27, removed: 24, total 3
@@ -29,7 +29,7 @@ using namespace std::literals;
 
namespace engine {
 
tl::expected<std::unique_ptr<PageState>, NavigationError> Engine::navigate(uri::Uri uri) {
tl::expected<std::unique_ptr<PageState>, NavigationError> Engine::navigate(uri::Uri uri, Options opts) {
auto result = load(std::move(uri));
 
if (!result.response.has_value()) {
@@ -125,15 +125,15 @@ tl::expected<std::unique_ptr<PageState>, NavigationError> Engine::navigate(uri::
}
 
spdlog::info("Styling dom w/ {} rules", state->stylesheet.rules.size());
state->layout_width = layout_width_;
state->layout_width = opts.layout_width;
state->styled = style::style_tree(state->dom.html_node, state->stylesheet, {.window_width = state->layout_width});
state->layout = layout::create_layout(*state->styled, state->layout_width, *type_);
 
return state;
}
 
void Engine::relayout(PageState &state, int width) {
state.layout_width = width;
void Engine::relayout(PageState &state, Options opts) {
state.layout_width = opts.layout_width;
state.styled = style::style_tree(state.dom.html_node, state.stylesheet, {.window_width = state.layout_width});
state.layout = layout::create_layout(*state.styled, state.layout_width, *type_);
}
 
engine/engine.h added: 27, removed: 24, total 3
@@ -24,6 +24,11 @@
 
namespace engine {
 
struct Options {
// Default chosen by rolling 1d600.
int layout_width{600};
};
 
struct PageState {
uri::Uri uri{};
protocol::Response response{};
@@ -45,11 +50,9 @@ public:
std::unique_ptr<type::IType> type = std::make_unique<type::NaiveType>())
: protocol_handler_{std::move(protocol_handler)}, type_{std::move(type)} {}
 
void set_layout_width(int layout_width) { layout_width_ = layout_width; }
[[nodiscard]] tl::expected<std::unique_ptr<PageState>, NavigationError> navigate(uri::Uri, Options = {});
 
[[nodiscard]] tl::expected<std::unique_ptr<PageState>, NavigationError> navigate(uri::Uri);
 
void relayout(PageState &, int layout_width);
void relayout(PageState &, Options);
 
struct [[nodiscard]] LoadResult {
tl::expected<protocol::Response, protocol::Error> response;
@@ -62,7 +65,6 @@ public:
private:
std::unique_ptr<protocol::IProtocolHandler> protocol_handler_{};
std::unique_ptr<type::IType> type_{};
int layout_width_{600}; // Default chosen by rolling 1d600.
};
 
} // namespace engine
 
engine/engine_test.cpp added: 27, removed: 24, total 3
@@ -94,12 +94,11 @@ int main() {
engine::Engine e{std::make_unique<FakeProtocolHandler>(Responses{
std::pair{"hax://example.com"s, Response{}},
})};
e.set_layout_width(123);
 
auto page = e.navigate(uri::Uri::parse("hax://example.com").value()).value();
auto page = e.navigate(uri::Uri::parse("hax://example.com").value(), {.layout_width = 123}).value();
expect_eq(page->layout_width, 123);
 
e.relayout(*page, 100);
e.relayout(*page, {.layout_width = 100});
expect_eq(page->layout_width, 100);
});