add "ListLayout" and remove columnlayout and rowlayout
This commit is contained in:
parent
cd96edba8b
commit
dfa13dc46d
8 changed files with 100 additions and 141 deletions
|
@ -33,9 +33,8 @@ raven_source_files = [
|
||||||
'./src/ScrollContainer.cpp',
|
'./src/ScrollContainer.cpp',
|
||||||
'./src/Button.cpp',
|
'./src/Button.cpp',
|
||||||
'./src/DocumentLayout.cpp',
|
'./src/DocumentLayout.cpp',
|
||||||
'./src/RowLayout.cpp',
|
|
||||||
'./src/ColumnLayout.cpp',
|
|
||||||
'./src/BoxLayout.cpp',
|
'./src/BoxLayout.cpp',
|
||||||
|
'./src/ListLayout.cpp',
|
||||||
'./src/Label.cpp',
|
'./src/Label.cpp',
|
||||||
'./src/ListView.cpp',
|
'./src/ListView.cpp',
|
||||||
'./src/TextInput.cpp',
|
'./src/TextInput.cpp',
|
||||||
|
@ -47,7 +46,6 @@ raven_header_files = [
|
||||||
'./src/Box.hpp',
|
'./src/Box.hpp',
|
||||||
'./src/BoxLayout.hpp',
|
'./src/BoxLayout.hpp',
|
||||||
'./src/Button.hpp',
|
'./src/Button.hpp',
|
||||||
'./src/ColumnLayout.hpp',
|
|
||||||
'./src/DocumentLayout.hpp',
|
'./src/DocumentLayout.hpp',
|
||||||
'./src/Events.hpp',
|
'./src/Events.hpp',
|
||||||
'./src/Forward.hpp',
|
'./src/Forward.hpp',
|
||||||
|
@ -57,8 +55,8 @@ raven_header_files = [
|
||||||
'./src/Painter.hpp',
|
'./src/Painter.hpp',
|
||||||
'./src/Point.hpp',
|
'./src/Point.hpp',
|
||||||
'./src/RGB.hpp',
|
'./src/RGB.hpp',
|
||||||
'./src/RowLayout.hpp',
|
|
||||||
'./src/ScrollContainer.hpp',
|
'./src/ScrollContainer.hpp',
|
||||||
|
'./src/ListLayout.hpp',
|
||||||
'./src/Styles.hpp',
|
'./src/Styles.hpp',
|
||||||
'./src/Widget.hpp',
|
'./src/Widget.hpp',
|
||||||
'./src/SvgWidget.hpp',
|
'./src/SvgWidget.hpp',
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
#include "ColumnLayout.hpp"
|
|
||||||
#include "Point.hpp"
|
|
||||||
#include "Widget.hpp"
|
|
||||||
|
|
||||||
namespace Raven {
|
|
||||||
|
|
||||||
bool ColumnLayout::run() {
|
|
||||||
if (!m_target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Point current_point { m_margin, m_margin };
|
|
||||||
double max_width_so_far = 0;
|
|
||||||
double requested_height = 0;
|
|
||||||
|
|
||||||
auto& children = m_target->children();
|
|
||||||
for (auto child : children) {
|
|
||||||
if (child->absolute()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child->rect().width() > max_width_so_far) {
|
|
||||||
max_width_so_far = child->rect().width();
|
|
||||||
}
|
|
||||||
|
|
||||||
requested_height += child->rect().height() + m_margin;
|
|
||||||
|
|
||||||
child->rect().set_x(current_point.x());
|
|
||||||
child->rect().set_y(current_point.y());
|
|
||||||
|
|
||||||
current_point.add(0, child->rect().height() + m_margin);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_target->rect().set_height(requested_height + m_margin);
|
|
||||||
m_target->rect().set_width(max_width_so_far + m_margin * 2);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Layout.hpp"
|
|
||||||
|
|
||||||
namespace Raven {
|
|
||||||
|
|
||||||
class ColumnLayout : public Layout {
|
|
||||||
private:
|
|
||||||
double m_margin { 0.0 };
|
|
||||||
public:
|
|
||||||
ColumnLayout()
|
|
||||||
: Layout() {}
|
|
||||||
|
|
||||||
ColumnLayout(double margin)
|
|
||||||
: Layout()
|
|
||||||
, m_margin(margin) {}
|
|
||||||
|
|
||||||
bool run() override;
|
|
||||||
|
|
||||||
double margin() { return m_margin; }
|
|
||||||
void set_margin(double margin) { m_margin = margin; run(); }
|
|
||||||
|
|
||||||
virtual ~ColumnLayout() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
57
src/ListLayout.cpp
Normal file
57
src/ListLayout.cpp
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#include "ListLayout.hpp"
|
||||||
|
#include "Widget.hpp"
|
||||||
|
#include "Box.hpp"
|
||||||
|
#include "src/Events.hpp"
|
||||||
|
|
||||||
|
namespace Raven {
|
||||||
|
|
||||||
|
bool ListLayout::run() {
|
||||||
|
if (!m_target) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
double current_position = m_margin;
|
||||||
|
double maximum_secondary_dimension = m_margin;
|
||||||
|
|
||||||
|
if (m_direction == Direction::Horizontal) {
|
||||||
|
for (auto &child : m_target->children()) {
|
||||||
|
if (child->layout() && child->layout()->dynamically_sizes_target()) {
|
||||||
|
auto event = RelayoutSubtreeEvent();
|
||||||
|
child->dispatch_event(event);
|
||||||
|
}
|
||||||
|
child->rect().set_x(current_position);
|
||||||
|
child->rect().set_y(m_margin);
|
||||||
|
current_position += child->rect().width() + m_spacing;
|
||||||
|
if (child->rect().height() > maximum_secondary_dimension) {
|
||||||
|
maximum_secondary_dimension = child->rect().height();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_target->rect().set_width(current_position + m_margin);
|
||||||
|
m_target->rect().set_height(maximum_secondary_dimension + m_margin * 2);
|
||||||
|
} else {
|
||||||
|
for (auto &child : m_target->children()) {
|
||||||
|
if (child->layout() && child->layout()->dynamically_sizes_target()) {
|
||||||
|
auto event = RelayoutSubtreeEvent();
|
||||||
|
child->dispatch_event(event);
|
||||||
|
}
|
||||||
|
child->rect().set_y(current_position);
|
||||||
|
child->rect().set_x(m_margin);
|
||||||
|
current_position += child->rect().height() + m_spacing;
|
||||||
|
if (child->rect().width() > maximum_secondary_dimension) {
|
||||||
|
maximum_secondary_dimension = child->rect().width();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_target->rect().set_width(maximum_secondary_dimension + m_margin * 2);
|
||||||
|
m_target->rect().set_height(current_position + m_margin);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &child : m_target->children()) {
|
||||||
|
auto event = RelayoutSubtreeEvent();
|
||||||
|
child->dispatch_event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
28
src/ListLayout.hpp
Normal file
28
src/ListLayout.hpp
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Layout.hpp"
|
||||||
|
#include "Box.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Raven {
|
||||||
|
|
||||||
|
class ListLayout : public Layout {
|
||||||
|
public:
|
||||||
|
ListLayout(Direction direction)
|
||||||
|
: Layout()
|
||||||
|
, m_direction(direction) {}
|
||||||
|
|
||||||
|
bool run();
|
||||||
|
|
||||||
|
double margin() { return m_margin; }
|
||||||
|
void set_margin(double margin) { m_margin = margin; run(); }
|
||||||
|
|
||||||
|
double spacing() { return m_spacing; }
|
||||||
|
void set_spacing(double spacing) { m_spacing = spacing; run(); }
|
||||||
|
private:
|
||||||
|
double m_margin { 0.0 };
|
||||||
|
double m_spacing { 0.0 };
|
||||||
|
Direction m_direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -1,41 +0,0 @@
|
||||||
#include "RowLayout.hpp"
|
|
||||||
#include "Point.hpp"
|
|
||||||
#include "Widget.hpp"
|
|
||||||
|
|
||||||
namespace Raven {
|
|
||||||
|
|
||||||
bool RowLayout::run() {
|
|
||||||
if (!m_target) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Point current_point { m_margin, m_margin };
|
|
||||||
double max_height_so_far = 0;
|
|
||||||
double requested_width = 0;
|
|
||||||
|
|
||||||
auto& children = m_target->children();
|
|
||||||
for (auto child : children) {
|
|
||||||
if (child->absolute()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child->rect().height() > max_height_so_far) {
|
|
||||||
max_height_so_far = child->rect().height();
|
|
||||||
}
|
|
||||||
|
|
||||||
requested_width += child->rect().width() + m_margin;
|
|
||||||
|
|
||||||
child->rect().set_x(current_point.x());
|
|
||||||
child->rect().set_y(current_point.y());
|
|
||||||
|
|
||||||
current_point.add(child->rect().width() + m_margin, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_target->rect().set_width(requested_width + m_margin);
|
|
||||||
m_target->rect().set_height(max_height_so_far + m_margin * 2);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "Layout.hpp"
|
|
||||||
|
|
||||||
namespace Raven {
|
|
||||||
|
|
||||||
class RowLayout : public Layout {
|
|
||||||
private:
|
|
||||||
double m_margin { 0.0 };
|
|
||||||
public:
|
|
||||||
RowLayout()
|
|
||||||
: Layout() {}
|
|
||||||
|
|
||||||
RowLayout(double margin)
|
|
||||||
: Layout()
|
|
||||||
, m_margin(margin) {}
|
|
||||||
|
|
||||||
bool run() override;
|
|
||||||
|
|
||||||
double margin() { return m_margin; }
|
|
||||||
void set_margin(double margin) { m_margin = margin; run(); }
|
|
||||||
|
|
||||||
virtual ~RowLayout() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
14
src/main.cpp
14
src/main.cpp
|
@ -1,6 +1,6 @@
|
||||||
#include "Label.hpp"
|
#include "Label.hpp"
|
||||||
#include "Application.hpp"
|
#include "Application.hpp"
|
||||||
#include "ColumnLayout.hpp"
|
#include "ListLayout.hpp"
|
||||||
#include "ListView.hpp"
|
#include "ListView.hpp"
|
||||||
#include "TextInput.hpp"
|
#include "TextInput.hpp"
|
||||||
#include "Window.hpp"
|
#include "Window.hpp"
|
||||||
|
@ -24,8 +24,20 @@ int main() {
|
||||||
Raven::Application application {};
|
Raven::Application application {};
|
||||||
|
|
||||||
auto window = application.add_window();
|
auto window = application.add_window();
|
||||||
|
auto test_window = application.add_window();
|
||||||
|
|
||||||
window->spawn_window();
|
window->spawn_window();
|
||||||
|
test_window->spawn_window();
|
||||||
|
|
||||||
|
auto test_container = test_window->set_main_widget<Raven::ScrollContainer>();
|
||||||
|
auto test_widget = test_container->make_target();
|
||||||
|
auto test_layout = test_widget->set_layout<Raven::ListLayout>(Raven::Direction::Vertical);
|
||||||
|
test_layout->set_margin(69);
|
||||||
|
test_layout->set_spacing(10);
|
||||||
|
|
||||||
|
for (int i = 0; i < 1000; i++) {
|
||||||
|
test_widget->add<Raven::Button>("Hello: " + std::to_string(i));
|
||||||
|
}
|
||||||
|
|
||||||
auto main_widget = window->set_main_widget<Raven::Widget>();
|
auto main_widget = window->set_main_widget<Raven::Widget>();
|
||||||
auto main_widget_layout = main_widget->set_layout<Raven::BoxLayout>(Raven::Direction::Horizontal);
|
auto main_widget_layout = main_widget->set_layout<Raven::BoxLayout>(Raven::Direction::Horizontal);
|
||||||
|
|
Loading…
Reference in a new issue