mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-26 04:31:34 +08:00
Add Graph.
This commit is contained in:
parent
1e92db7ec0
commit
9117166541
@ -73,7 +73,7 @@ class MyComponent : public Component {
|
||||
separator(),
|
||||
Render(L"radiobox", radiobox),
|
||||
separator(),
|
||||
Render(L"input", input) | size(WIDTH, EQUAL, 20)
|
||||
Render(L"input", input) | size(WIDTH, LESS_THAN, 30)
|
||||
) | border;
|
||||
}
|
||||
};
|
||||
|
@ -8,6 +8,7 @@ example(border)
|
||||
example(gauge)
|
||||
example(package_manager)
|
||||
example(separator)
|
||||
example(graph)
|
||||
example(spinner)
|
||||
example(style_blink)
|
||||
example(style_bold)
|
||||
|
@ -41,7 +41,7 @@ int main(int argc, const char *argv[])
|
||||
),
|
||||
filler()
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << screen.ToString() << std::endl;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ int main(int argc, const char *argv[])
|
||||
) | border,
|
||||
text(L"overlay") | border | center
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
65
examples/dom/graph.cpp
Normal file
65
examples/dom/graph.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include "ftxui/dom/elements.hpp"
|
||||
#include "ftxui/dom/graph.hpp"
|
||||
#include "ftxui/screen/screen.hpp"
|
||||
#include "ftxui/screen/string.hpp"
|
||||
#include <chrono>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
|
||||
class Graph : public ftxui::GraphFunction {
|
||||
public:
|
||||
std::vector<int> operator()(int width, int height) {
|
||||
std::vector<int> output(width);
|
||||
for (int i = 0; i < width; ++i) {
|
||||
float v = 0;
|
||||
v += 0.1 * sin((i + shift) * 0.1);
|
||||
v += 0.2 * sin((i + shift+10) * 0.15);
|
||||
v += 0.1 * sin((i + shift) * 0.03);
|
||||
// v += 0.2*sin((i+shift)*0.3);
|
||||
// v += 0.1*sin((i+shift)*0.9);
|
||||
v *= height;
|
||||
v += 0.5 * height;
|
||||
output[i] = v;
|
||||
}
|
||||
return output;
|
||||
}
|
||||
int shift = 0;
|
||||
};
|
||||
|
||||
int main(int argc, const char* argv[]) {
|
||||
using namespace ftxui;
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
Graph my_graph;
|
||||
|
||||
std::string reset_position;
|
||||
for (int i = 0;; ++i) {
|
||||
auto document =
|
||||
window(text(L"Your graphs"),
|
||||
hbox(
|
||||
vbox(
|
||||
graph(my_graph), separator(),
|
||||
graph(my_graph) | inverted
|
||||
) | flex,
|
||||
separator(),
|
||||
vbox(
|
||||
graph(my_graph) | color(Color::BlueLight), separator(),
|
||||
graph(my_graph) | color(Color::RedLight), separator(),
|
||||
graph(my_graph) | color(Color::YellowLight)
|
||||
) | flex
|
||||
)
|
||||
) | size(HEIGHT, GREATER_THAN, 40);
|
||||
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << reset_position << screen.ToString() << std::flush;
|
||||
|
||||
reset_position = screen.ResetPosition();
|
||||
|
||||
std::this_thread::sleep_for(0.03s);
|
||||
my_graph.shift++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -43,7 +43,7 @@ int main(int argc, const char *argv[])
|
||||
| size(WIDTH, LESS_THAN, 50)
|
||||
;
|
||||
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << screen.ToString() << std::endl;
|
||||
|
||||
|
@ -39,7 +39,7 @@ int main(int argc, const char* argv[]) {
|
||||
paragraph(L" A spinner "), spinner(6, i / 10)) |
|
||||
border;
|
||||
|
||||
auto screen = Screen::TerminalFullscreen();
|
||||
auto screen = Screen::Create(Dimension::Full());
|
||||
Render(screen, document.get());
|
||||
std::cout << reset_position << screen.ToString() << std::flush;
|
||||
|
||||
|
@ -115,7 +115,7 @@ int main(int argc, const char *argv[])
|
||||
|
||||
// Draw.
|
||||
auto document = render();
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << reset_position << screen.ToString() << std::flush;
|
||||
reset_position = screen.ResetPosition();
|
||||
|
@ -24,7 +24,7 @@ int main(int argc, const char *argv[])
|
||||
) | flex
|
||||
);
|
||||
|
||||
auto screen = Screen::TerminalFullscreen();
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << screen.ToString();
|
||||
getchar();
|
||||
|
@ -9,17 +9,18 @@ int main(int argc, const char *argv[])
|
||||
hbox(
|
||||
text(L"left-column"),
|
||||
separator(),
|
||||
flex(vbox(
|
||||
center(text(L"right-column")) | flex,
|
||||
vbox(
|
||||
center(text(L"right-top")) | flex,
|
||||
separator(),
|
||||
center(text(L"bottom-column"))
|
||||
))
|
||||
);
|
||||
auto screen = Screen::TerminalFullscreen();
|
||||
center(text(L"bottom-bottom"))
|
||||
) | flex,
|
||||
separator(),
|
||||
text(L"right-column")
|
||||
) | border;
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
getchar();
|
||||
std::cout << screen.ToString() << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ int main(int argc, const char *argv[])
|
||||
);
|
||||
}
|
||||
auto document = hbox(std::move(content));
|
||||
auto screen = Screen::FitDocument(document);
|
||||
auto screen = Screen::Create(Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << screen.ToString() << std::endl;
|
||||
|
||||
|
@ -26,7 +26,7 @@ int main(int argc, const char *argv[])
|
||||
);
|
||||
}
|
||||
auto document = hbox(vbox(std::move(entries)) | border, filler());
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
std::cout << reset_position << screen.ToString() << std::flush;
|
||||
reset_position = screen.ResetPosition();
|
||||
|
@ -11,7 +11,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"blink") | blink,
|
||||
text(L". Do you like it?")
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -11,7 +11,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"bold") | bold,
|
||||
text(L". Do you like it?")
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -48,7 +48,7 @@ int main(int argc, const char *argv[])
|
||||
filler()
|
||||
);
|
||||
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -11,7 +11,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"dim") | dim,
|
||||
text(L". Do you like it?")
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -16,7 +16,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"color") | color(Color::Blue) , text(L" ") ,
|
||||
text(L"bgcolor") | bgcolor(Color::Blue)
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -11,7 +11,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"inverted") | inverted,
|
||||
text(L". Do you like it?")
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -11,7 +11,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"underlined") | underlined,
|
||||
text(L". Do you like it?")
|
||||
);
|
||||
auto screen = Screen::TerminalOutput(document);
|
||||
auto screen = Screen::Create(Dimension::Full(), Dimension::Fit(document));
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -28,7 +28,7 @@ int main(int argc, const char *argv[])
|
||||
text(L"south-east")
|
||||
)
|
||||
);
|
||||
auto screen = Screen::TerminalFullscreen();
|
||||
auto screen = Screen::Create(Dimension::Full());
|
||||
Render(screen, document.get());
|
||||
|
||||
std::cout << screen.ToString();
|
||||
|
@ -18,6 +18,7 @@ add_library(dom
|
||||
src/ftxui/dom/flex.cpp
|
||||
src/ftxui/dom/frame.cpp
|
||||
src/ftxui/dom/gauge.cpp
|
||||
src/ftxui/dom/graph.cpp
|
||||
src/ftxui/dom/hbox.cpp
|
||||
src/ftxui/dom/hflow.cpp
|
||||
src/ftxui/dom/inverted.cpp
|
||||
|
@ -17,7 +17,7 @@ class CheckBox : public Component {
|
||||
|
||||
//std::wstring checked = L"[X] ";
|
||||
//std::wstring unchecked = L"[ ] ";
|
||||
std::wstring checked = L"☑ ";
|
||||
std::wstring checked = L"▣ ";
|
||||
std::wstring unchecked = L"☐ ";
|
||||
|
||||
Decorator focused_style = inverted;
|
||||
|
@ -10,7 +10,7 @@ class Component;
|
||||
|
||||
class ScreenInteractive : public Screen {
|
||||
public:
|
||||
static ScreenInteractive FixedSize(size_t dimx, size_t dimy);
|
||||
static ScreenInteractive FixedSize(int dimx, int dimy);
|
||||
static ScreenInteractive Fullscreen();
|
||||
static ScreenInteractive FitComponent();
|
||||
static ScreenInteractive TerminalOutput();
|
||||
@ -30,7 +30,7 @@ class ScreenInteractive : public Screen {
|
||||
TerminalOutput,
|
||||
};
|
||||
Dimension dimension_ = Dimension::Fixed;
|
||||
ScreenInteractive(size_t dimx, size_t dimy, Dimension dimension);
|
||||
ScreenInteractive(int dimx, int dimy, Dimension dimension);
|
||||
};
|
||||
|
||||
} // namespace ftxui
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include "ftxui/dom/graph.hpp"
|
||||
#include "ftxui/dom/node.hpp"
|
||||
#include "ftxui/screen/color.hpp"
|
||||
|
||||
@ -20,6 +21,7 @@ Element border(Element);
|
||||
Element window(Element title, Element content);
|
||||
Element spinner(int charset_index, size_t image_index);
|
||||
Elements paragraph(std::wstring text); // Use inside hflow(). Split by space.
|
||||
Element graph(GraphFunction&); // See graph.hpp
|
||||
|
||||
// -- Decorator ---
|
||||
Element bold(Element);
|
||||
@ -68,6 +70,7 @@ Element nothing(Element element);
|
||||
// Pipe elements into decorator togethers.
|
||||
// Examples: text("ftxui") | bold | underlined;
|
||||
Element operator|(Element, Decorator);
|
||||
Elements operator|(Elements, Decorator);
|
||||
Decorator operator|(Decorator, Decorator);
|
||||
|
||||
// Make container able to take any number of children as input.
|
||||
|
15
ftxui/include/ftxui/dom/graph.hpp
Normal file
15
ftxui/include/ftxui/dom/graph.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef FTXUI_DOM_GRAPH_HPP
|
||||
#define FTXUI_DOM_GRAPH_HPP
|
||||
|
||||
#include "ftxui/dom/elements.hpp"
|
||||
|
||||
namespace ftxui {
|
||||
|
||||
class GraphFunction {
|
||||
public:
|
||||
virtual std::vector<int> operator()(int width, int height) = 0;
|
||||
};
|
||||
|
||||
} // namespace ftxui
|
||||
|
||||
#endif /* end of include guard: FTXUI_DOM_GRAPH_HPP */
|
@ -25,26 +25,32 @@ struct Pixel {
|
||||
Color foreground_color = Color::Default;
|
||||
};
|
||||
|
||||
struct Dimension {
|
||||
static Dimension Fixed(int);
|
||||
static Dimension Fit(std::unique_ptr<Node>&);
|
||||
static Dimension Full();
|
||||
|
||||
int dimx;
|
||||
int dimy;
|
||||
};
|
||||
|
||||
class Screen {
|
||||
public:
|
||||
// Constructor.
|
||||
Screen(size_t dimx, size_t dimy);
|
||||
|
||||
// Constructor using the terminal.
|
||||
static Screen TerminalFullscreen();
|
||||
static Screen TerminalOutput(std::unique_ptr<Node>& element);
|
||||
static Screen FitDocument(std::unique_ptr<Node>& element);
|
||||
Screen(int dimx, int dimy);
|
||||
static Screen Create(Dimension dimension);
|
||||
static Screen Create(Dimension width, Dimension height);
|
||||
|
||||
// Node write into the screen using Screen::at.
|
||||
wchar_t& at(size_t x, size_t y);
|
||||
Pixel& PixelAt(size_t x, size_t y);
|
||||
wchar_t& at(int x, int y);
|
||||
Pixel& PixelAt(int x, int y);
|
||||
|
||||
// Convert the screen into a printable string in the terminal.
|
||||
std::string ToString();
|
||||
|
||||
// Get screen dimensions.
|
||||
size_t dimx() { return dimx_;}
|
||||
size_t dimy() { return dimy_;}
|
||||
int dimx() { return dimx_;}
|
||||
int dimy() { return dimy_;}
|
||||
|
||||
// Move the terminal cursor n-lines up with n = dimy().
|
||||
std::string ResetPosition();
|
||||
@ -56,8 +62,8 @@ class Screen {
|
||||
Box stencil;
|
||||
|
||||
protected:
|
||||
size_t dimx_;
|
||||
size_t dimy_;
|
||||
int dimx_;
|
||||
int dimy_;
|
||||
std::vector<std::vector<Pixel>> pixels_;
|
||||
};
|
||||
|
||||
|
@ -44,14 +44,14 @@ Event GetEvent() {
|
||||
|
||||
}; // namespace
|
||||
|
||||
ScreenInteractive::ScreenInteractive(size_t dimx,
|
||||
size_t dimy,
|
||||
ScreenInteractive::ScreenInteractive(int dimx,
|
||||
int dimy,
|
||||
Dimension dimension)
|
||||
: Screen(dimx, dimy), dimension_(dimension) {}
|
||||
ScreenInteractive::~ScreenInteractive() {}
|
||||
|
||||
// static
|
||||
ScreenInteractive ScreenInteractive::FixedSize(size_t dimx, size_t dimy) {
|
||||
ScreenInteractive ScreenInteractive::FixedSize(int dimx, int dimy) {
|
||||
return ScreenInteractive(dimx, dimy, Dimension::Fixed);
|
||||
}
|
||||
|
||||
@ -106,8 +106,8 @@ void ScreenInteractive::Loop(Component* component) {
|
||||
|
||||
void ScreenInteractive::Draw(Component* component) {
|
||||
auto document = component->Render();
|
||||
size_t dimx;
|
||||
size_t dimy;
|
||||
int dimx;
|
||||
int dimy;
|
||||
switch (dimension_) {
|
||||
case Dimension::Fixed:
|
||||
dimx = dimx_;
|
||||
|
45
ftxui/src/ftxui/dom/graph.cpp
Normal file
45
ftxui/src/ftxui/dom/graph.cpp
Normal file
@ -0,0 +1,45 @@
|
||||
#include "ftxui/dom/elements.hpp"
|
||||
|
||||
namespace ftxui {
|
||||
|
||||
const wchar_t charset[] = L" ▗▐▖▄▟▌▙█";
|
||||
|
||||
class Graph : public Node {
|
||||
public:
|
||||
Graph(GraphFunction& graph_function) : graph_function_(graph_function) {}
|
||||
~Graph() override {}
|
||||
|
||||
void ComputeRequirement() override {
|
||||
requirement_.flex.x = 1;
|
||||
requirement_.flex.y = 1;
|
||||
requirement_.min.x = 1;
|
||||
requirement_.min.y = 1;
|
||||
}
|
||||
|
||||
void Render(Screen& screen) override {
|
||||
int width = (box_.x_max - box_.x_min + 1) * 2;
|
||||
int height = (box_.y_max - box_.y_min + 1) * 2;
|
||||
auto data = graph_function_(width, height);
|
||||
int i = 0;
|
||||
for (int x = box_.x_min; x <= box_.x_max; ++x) {
|
||||
int height_1 = 2 * box_.y_max - data[i++];
|
||||
int height_2 = 2 * box_.y_max - data[i++];
|
||||
for (int y = box_.y_min; y <= box_.y_max; ++y) {
|
||||
int yy = 2 * y;
|
||||
int i_1 = yy < height_1 ? 0 : yy == height_1 ? 3 : 6;
|
||||
int i_2 = yy < height_2 ? 0 : yy == height_2 ? 1 : 2;
|
||||
wchar_t pix = charset[i_1 + i_2];
|
||||
screen.at(x, y) = pix;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
GraphFunction& graph_function_;
|
||||
};
|
||||
|
||||
std::unique_ptr<Node> graph(GraphFunction& graph_function) {
|
||||
return std::make_unique<Graph>(graph_function);
|
||||
}
|
||||
|
||||
}; // namespace ftxui
|
@ -12,7 +12,7 @@ class HFlow : public Node {
|
||||
requirement_.min.x = 0;
|
||||
requirement_.min.y = 0;
|
||||
requirement_.flex.x = 1;
|
||||
requirement_.flex.y = 0;
|
||||
requirement_.flex.y = 1;
|
||||
for(auto& child : children)
|
||||
child->ComputeRequirement();
|
||||
}
|
||||
|
@ -19,6 +19,13 @@ Decorator operator|(Decorator a, Decorator b) {
|
||||
return compose(a, b);
|
||||
}
|
||||
|
||||
Elements operator|(Elements es, Decorator d) {
|
||||
Elements output;
|
||||
for (auto& it : es)
|
||||
output.push_back(std::move(it) | d);
|
||||
return output;
|
||||
}
|
||||
|
||||
Element operator|(Element e, Decorator d) {
|
||||
return d(std::move(e));
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include "ftxui/dom/node.hpp"
|
||||
#include "ftxui/screen/screen.hpp"
|
||||
#include "ftxui/dom/node.hpp"
|
||||
#include "ftxui/screen/string.hpp"
|
||||
#include "ftxui/screen/terminal.hpp"
|
||||
|
||||
@ -36,8 +36,34 @@ Pixel dev_null_pixel;
|
||||
|
||||
} // namespace
|
||||
|
||||
Screen::Screen(size_t dimx, size_t dimy)
|
||||
: stencil({0, int(dimx) - 1, 0, int(dimy) - 1}),
|
||||
Dimension Dimension::Fixed(int v) {
|
||||
return Dimension{v, v};
|
||||
}
|
||||
|
||||
Dimension Dimension::Fit(std::unique_ptr<Node>& e) {
|
||||
e->ComputeRequirement();
|
||||
Terminal::Dimensions size = Terminal::Size();
|
||||
return Dimension{std::min(e->requirement().min.x, size.dimx),
|
||||
std::min(e->requirement().min.y, size.dimy)};
|
||||
}
|
||||
|
||||
Dimension Dimension::Full() {
|
||||
Terminal::Dimensions size = Terminal::Size();
|
||||
return Dimension{size.dimx, size.dimy};
|
||||
}
|
||||
|
||||
// static
|
||||
Screen Screen::Create(Dimension width, Dimension height) {
|
||||
return Screen(width.dimx, height.dimy);
|
||||
}
|
||||
|
||||
// static
|
||||
Screen Screen::Create(Dimension dimension) {
|
||||
return Screen(dimension.dimx, dimension.dimy);
|
||||
}
|
||||
|
||||
Screen::Screen(int dimx, int dimy)
|
||||
: stencil({0, dimx - 1, 0, dimy - 1}),
|
||||
dimx_(dimx),
|
||||
dimy_(dimy),
|
||||
pixels_(dimy, std::vector<Pixel>(dimx)) {}
|
||||
@ -72,10 +98,10 @@ std::string Screen::ToString() {
|
||||
|
||||
Pixel previous_pixel;
|
||||
|
||||
for (size_t y = 0; y < dimy_; ++y) {
|
||||
for (int y = 0; y < dimy_; ++y) {
|
||||
if (y != 0)
|
||||
ss << '\n';
|
||||
for (size_t x = 0; x < dimx_; ++x) {
|
||||
for (int x = 0; x < dimx_; ++x) {
|
||||
UpdatePixelStyle(ss, previous_pixel, pixels_[y][x]);
|
||||
ss << pixels_[y][x].character;
|
||||
}
|
||||
@ -88,42 +114,18 @@ std::string Screen::ToString() {
|
||||
return to_string(ss.str());
|
||||
}
|
||||
|
||||
wchar_t& Screen::at(size_t x, size_t y) {
|
||||
wchar_t& Screen::at(int x, int y) {
|
||||
return PixelAt(x,y).character;
|
||||
}
|
||||
|
||||
Pixel& Screen::PixelAt(size_t x, size_t y) {
|
||||
Pixel& Screen::PixelAt(int x, int y) {
|
||||
return In(stencil, x, y) ? pixels_[y][x] : dev_null_pixel;
|
||||
}
|
||||
|
||||
// static
|
||||
Screen Screen::TerminalFullscreen() {
|
||||
Terminal::Dimensions size = Terminal::Size();
|
||||
return Screen(size.dimx, size.dimy);
|
||||
}
|
||||
|
||||
// static
|
||||
Screen Screen::TerminalOutput(std::unique_ptr<Node>& element) {
|
||||
element->ComputeRequirement();
|
||||
Terminal::Dimensions size = Terminal::Size();
|
||||
return Screen(size.dimx, element->requirement().min.y);
|
||||
}
|
||||
|
||||
// static
|
||||
Screen Screen::FitDocument(std::unique_ptr<Node>& element) {
|
||||
element->ComputeRequirement();
|
||||
Terminal::Dimensions size = Terminal::Size();
|
||||
return
|
||||
Screen(
|
||||
std::min(size.dimx, element->requirement().min.x),
|
||||
std::min(size.dimy, element->requirement().min.y)
|
||||
);
|
||||
}
|
||||
|
||||
std::string Screen::ResetPosition() {
|
||||
std::stringstream ss;
|
||||
ss << MOVE_LEFT << CLEAR_LINE;
|
||||
for (size_t y = 1; y < dimy_; ++y) {
|
||||
for (int y = 1; y < dimy_; ++y) {
|
||||
ss << MOVE_UP << CLEAR_LINE;
|
||||
}
|
||||
return ss.str();
|
||||
@ -137,8 +139,8 @@ void Screen::Clear() {
|
||||
void Screen::ApplyShader() {
|
||||
|
||||
// Merge box characters togethers.
|
||||
for(size_t y = 1; y<dimy_; ++y) {
|
||||
for(size_t x = 1; x<dimx_; ++x) {
|
||||
for(int y = 1; y<dimy_; ++y) {
|
||||
for(int x = 1; x<dimx_; ++x) {
|
||||
wchar_t& left = at(x - 1, y);
|
||||
wchar_t& top = at(x, y - 1);
|
||||
wchar_t& cur = at(x, y);
|
||||
|
Loading…
Reference in New Issue
Block a user