Skip to content

Commit cc3198b

Browse files
committed
add console toolkit
1 parent b01961d commit cc3198b

20 files changed

+613
-135
lines changed

examples/17-console.cc

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,32 +41,33 @@ int main()
4141
rich_style.set_style("gf", { gf::Orange, gf::Azure });
4242
rich_style.set_style("warn", { gf::Black, gf::Yellow });
4343

44-
gf::ConsoleBuffer console_buffer({ 80, 50 });
44+
gf::Console console({ 80, 50 });
4545

46-
console_buffer.put_character({ 40, 25 }, '@', style);
47-
console_buffer.put_character({ 42, 25 }, gf::ConsoleChar::WhiteSmilingFace, style);
46+
console.put_character({ 40, 25 }, '@', style);
47+
console.put_character({ 42, 25 }, gf::ConsoleChar::WhiteSmilingFace, style);
4848

49-
console_buffer.print({ 1, 1 }, gf::ConsoleAlignment::Left, rich_style, "String with a <style=red>red</> word.");
49+
console.print({ 1, 1 }, gf::ConsoleAlignment::Left, rich_style, "String with a <style=red>red</> word.");
5050

51-
console_buffer.print(console_buffer.cells.size() - 2, gf::ConsoleAlignment::Right, rich_style, "Made with <style=gf>gf</>!");
51+
console.print(console.size() - 2, gf::ConsoleAlignment::Right, rich_style, "Made with <style=gf>gf</>!");
5252

5353
const std::string_view text = "This is a simple but long text with <style=warn>multiple</> lines.";
5454

55-
console_buffer.print_area(rect({ 2, 5 }, { 16, 5 }), gf::ConsoleAlignment::Left, rich_style, text);
56-
console_buffer.print_area(rect({ 2, 15 }, { 16, 5 }), gf::ConsoleAlignment::Center, rich_style, text);
57-
console_buffer.print_area(rect({ 2, 25 }, { 16, 5 }), gf::ConsoleAlignment::Right, rich_style, text);
55+
console.print_area(rect({ 2, 5 }, { 16, 5 }), gf::ConsoleAlignment::Left, rich_style, text);
56+
console.print_area(rect({ 2, 15 }, { 16, 5 }), gf::ConsoleAlignment::Center, rich_style, text);
57+
console.print_area(rect({ 2, 25 }, { 16, 5 }), gf::ConsoleAlignment::Right, rich_style, text);
5858

59-
console_buffer.clear(rect({ 30, 5 }, { 16, 5 }), style);
60-
console_buffer.draw_frame(rect({ 30, 5 }, { 16, 5 }), style);
61-
console_buffer.draw_frame(rect({ 30, 15 }, { 16, 5 }), style, "Frame title");
59+
console.clear(rect({ 30, 5 }, { 16, 5 }), style);
60+
console.draw_frame(rect({ 30, 5 }, { 16, 5 }), style);
61+
console.draw_frame(rect({ 30, 15 }, { 16, 5 }), style, "Frame title");
6262

63-
gf::ConsoleEntity console_entity(&console_font, console_buffer, scene_manager.render_manager());
63+
gf::ConsoleEntity console_entity(&console_font);
64+
console_entity.graphics().update(console, scene_manager.render_manager());
6465
console_entity.set_location({ 1000.0f, 1000.0f });
6566
console_entity.set_origin({ 0.5f, 0.5f });
6667

6768
gf::Scene scene;
6869
scene.set_world_center({ 1000.0f, 1000.0f });
69-
scene.set_world_size(console_buffer.cells.size() * console_font.character_size());
70+
scene.set_world_size(console.size() * console_font.character_size());
7071

7172
scene.add_world_entity(&console_entity);
7273

include/gf2/core/ConsoleBuffer.h renamed to include/gf2/core/Console.h

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: Zlib
22
// Copyright (c) 2023-2025 Julien Bernard
3-
#ifndef GF_CONSOLE_BUFFER_H
4-
#define GF_CONSOLE_BUFFER_H
3+
#ifndef GF_CONSOLE_H
4+
#define GF_CONSOLE_H
55

66
#include <cstdint>
77

@@ -31,12 +31,16 @@ namespace gf {
3131
return ar | cell.foreground | cell.background | cell.character;
3232
}
3333

34-
struct GF_CORE_API ConsoleBuffer {
35-
Array2D<ConsoleCell> cells;
34+
class GF_CORE_API Console {
35+
public:
36+
Console(Vec2I size = { 0, 0 })
37+
: m_cells(size)
38+
{
39+
}
3640

37-
ConsoleBuffer(Vec2I size = { 0, 0 })
38-
: cells(size)
41+
Vec2I size() const
3942
{
43+
return m_cells.size();
4044
}
4145

4246
void clear(const ConsoleStyle& style = ConsoleStyle());
@@ -119,7 +123,10 @@ namespace gf {
119123
raw_draw_frame(area, style, actual_title);
120124
}
121125

122-
void blit_to(ConsoleBuffer& console, RectI source, Vec2I destination, float foreground_alpha = 1.0f, float background_alpha = 1.0f) const;
126+
void blit_to(Console& console, RectI source, Vec2I destination, float foreground_alpha = 1.0f, float background_alpha = 1.0f) const;
127+
128+
Array2D<ConsoleCell>& raw();
129+
const Array2D<ConsoleCell>& raw() const;
123130

124131
private:
125132
static constexpr uint8_t PrintSplit = 0x01;
@@ -130,25 +137,27 @@ namespace gf {
130137
int raw_print(RectI area, const std::string& message, ConsoleAlignment alignment, const ConsoleRichStyle& style, uint8_t flags = 0x00);
131138
int raw_print_multiline(RectI area, const std::string& message, ConsoleAlignment alignment, const ConsoleRichStyle& style, uint8_t flags = 0x00);
132139
void raw_draw_frame(RectI area, const ConsoleStyle& style, std::string_view title);
140+
141+
Array2D<ConsoleCell> m_cells;
133142
};
134143

135144
template<typename Archive>
136-
Archive& operator|(Archive& ar, MaybeConst<ConsoleBuffer, Archive>& buffer)
145+
Archive& operator|(Archive& ar, MaybeConst<Console, Archive>& buffer)
137146
{
138-
return ar | buffer.cells;
147+
return ar | buffer.raw();
139148
}
140149

141150
struct GF_CORE_API ConsoleResource {
142151
std::filesystem::path console_font;
143-
ConsoleBuffer buffer;
152+
Vec2I size;
144153
};
145154

146155
template<typename Archive>
147156
Archive& operator|(Archive& ar, MaybeConst<ConsoleResource, Archive>& resource)
148157
{
149-
return ar | resource.console_font | resource.buffer;
158+
return ar | resource.console_font | resource.size;
150159
}
151160

152161
}
153162

154-
#endif // GF_CONSOLE_BUFFER_H
163+
#endif // GF_CONSOLE_H

include/gf2/core/ConsoleElement.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_CONSOLE_ELEMENT_H
4+
#define GF_CONSOLE_ELEMENT_H
5+
6+
#include "CoreApi.h"
7+
8+
namespace gf {
9+
class Console;
10+
11+
class GF_CORE_API ConsoleElement {
12+
public:
13+
ConsoleElement() = default;
14+
ConsoleElement(const ConsoleElement&) = delete;
15+
ConsoleElement(ConsoleElement&&) noexcept = default;
16+
virtual ~ConsoleElement();
17+
18+
ConsoleElement& operator=(const ConsoleElement&) = delete;
19+
ConsoleElement& operator=(ConsoleElement&&) noexcept = default;
20+
21+
virtual void update();
22+
virtual void render(Console& buffer);
23+
};
24+
25+
}
26+
27+
#endif // GF_CONSOLE_ELEMENT_H
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_CONSOLE_ELEMENT_CONTAINER_H
4+
#define GF_CONSOLE_ELEMENT_CONTAINER_H
5+
6+
#include <vector>
7+
8+
#include "ConsoleElement.h"
9+
#include "CoreApi.h"
10+
11+
namespace gf {
12+
class Console;
13+
14+
class GF_CORE_API ConsoleElementContainer {
15+
public:
16+
17+
void add_element(ConsoleElement* element);
18+
19+
void update();
20+
void render(Console& buffer);
21+
22+
private:
23+
std::vector<ConsoleElement*> m_elements;
24+
};
25+
26+
}
27+
28+
#endif // GF_CONSOLE_ELEMENT_CONTAINER_H

include/gf2/core/ConsoleScene.h

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_CONSOLE_SCENE_H
4+
#define GF_CONSOLE_SCENE_H
5+
6+
#include "ConsoleElementContainer.h"
7+
#include "CoreApi.h"
8+
#include "SceneTypes.h"
9+
10+
namespace gf {
11+
class Console;
12+
class Event;
13+
14+
class GF_CORE_API ConsoleScene {
15+
public:
16+
ConsoleScene() = default;
17+
ConsoleScene(const ConsoleScene&) = delete;
18+
ConsoleScene(ConsoleScene&&) noexcept = default;
19+
virtual ~ConsoleScene();
20+
21+
ConsoleScene& operator=(const ConsoleScene&) = delete;
22+
ConsoleScene& operator=(ConsoleScene&&) noexcept = default;
23+
24+
void set_rank(SceneRank rank);
25+
SceneRank rank() const;
26+
27+
void pause();
28+
void resume();
29+
bool paused() const;
30+
31+
void hide();
32+
void show();
33+
bool hidden() const;
34+
35+
void add_element(ConsoleElement* element);
36+
37+
virtual void process_event(const Event& event);
38+
virtual void handle_actions();
39+
virtual void update();
40+
virtual void render(Console& buffer);
41+
42+
protected:
43+
void update_elements();
44+
void render_elements(Console& buffer);
45+
46+
private:
47+
SceneRank m_rank = SceneRank::None;
48+
SceneStatus m_status = SceneStatus::Resumed;
49+
SceneVisibility m_visibility = SceneVisibility::Shown;
50+
51+
ConsoleElementContainer m_elements;
52+
};
53+
54+
}
55+
56+
#endif // GF_CONSOLE_SCENE_H
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_CONSOLE_SCENE_MANAGER_H
4+
#define GF_CONSOLE_SCENE_MANAGER_H
5+
6+
#include <vector>
7+
8+
#include "Console.h"
9+
#include "ConsoleScene.h"
10+
#include "CoreApi.h"
11+
#include "Vec2.h"
12+
13+
namespace gf {
14+
15+
class GF_CORE_API ConsoleSceneManager {
16+
public:
17+
ConsoleSceneManager(Vec2I size);
18+
19+
void push_scene(ConsoleScene* scene);
20+
21+
void pop_scene();
22+
void pop_all_scenes();
23+
24+
void replace_scene(ConsoleScene* scene);
25+
26+
void process_event(const Event& event);
27+
void handle_actions();
28+
void update();
29+
void render();
30+
31+
Console& console();
32+
33+
private:
34+
Console m_console;
35+
std::vector<ConsoleScene*> m_scenes;
36+
};
37+
38+
}
39+
40+
#endif // GF_CONSOLE_SCENE_MANAGER_H

include/gf2/core/SceneTypes.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_SCENE_TYPES_H
4+
#define GF_SCENE_TYPES_H
5+
6+
#include <cstdint>
7+
8+
namespace gf {
9+
10+
enum class SceneRank : uint8_t {
11+
None,
12+
Active,
13+
Top,
14+
};
15+
16+
enum class SceneStatus : uint8_t {
17+
Resumed,
18+
Paused,
19+
};
20+
21+
enum class SceneVisibility : uint8_t {
22+
Shown,
23+
Hidden,
24+
};
25+
26+
}
27+
28+
#endif // GF_SCENE_TYPES_H
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// SPDX-License-Identifier: Zlib
2+
// Copyright (c) 2023-2025 Julien Bernard
3+
#ifndef GF_CONSOLE_SYSTEM_H
4+
#define GF_CONSOLE_SYSTEM_H
5+
6+
#include <gf2/core/ConsoleSceneManager.h>
7+
8+
#include <gf2/graphics/Scene.h>
9+
#include <gf2/graphics/ConsoleEntity.h>
10+
11+
#include "FrameworkApi.h"
12+
13+
namespace gf {
14+
15+
class GF_FRAMEWORK_API ConsoleSystem : public Scene {
16+
public:
17+
ConsoleSystem(Vec2I size, const ConsoleFont* font, RenderManager* render_manager);
18+
19+
20+
ConsoleSceneManager* console_scene_manager()
21+
{
22+
return &m_console_scene_manager;
23+
}
24+
25+
private:
26+
void do_process_event(const Event& event) override;
27+
void do_handle_actions() override;
28+
void do_update(Time time) override;
29+
30+
RenderManager* m_render_manager = nullptr;
31+
ConsoleSceneManager m_console_scene_manager;
32+
ConsoleEntity m_console_entity;
33+
};
34+
35+
}
36+
37+
#endif // GF_CONSOLE_SYSTEM_H

include/gf2/graphics/ConsoleEntity.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#ifndef GF_CONSOLE_ENTITY_H
44
#define GF_CONSOLE_ENTITY_H
55

6-
#include "Console.h"
6+
#include "ConsoleGraphics.h"
77
#include "GraphicsApi.h"
88
#include "TransformableEntity.h"
99

@@ -12,18 +12,18 @@ namespace gf {
1212
class GF_GRAPHICS_API ConsoleEntity : public TransformableEntity {
1313
public:
1414
ConsoleEntity() = default;
15-
ConsoleEntity(const ConsoleFont* font, const ConsoleBuffer& buffer, RenderManager* render_manager);
16-
ConsoleEntity(const ConsoleResource& resource, RenderManager* render_manager, ResourceManager* resource_manager);
15+
ConsoleEntity(const ConsoleFont* font);
16+
ConsoleEntity(const ConsoleResource& resource, ResourceManager* resource_manager);
1717

18-
Console& console()
18+
ConsoleGraphics& graphics()
1919
{
2020
return m_console;
2121
}
2222

2323
void render(RenderRecorder& recorder) override;
2424

2525
private:
26-
Console m_console;
26+
ConsoleGraphics m_console;
2727
};
2828

2929
}

0 commit comments

Comments
 (0)