mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-23 03:10:01 +08:00
Add gauge and frame.
This commit is contained in:
parent
e577d67f2a
commit
dd92b89611
@ -1,3 +1,4 @@
|
|||||||
|
add_subdirectory(frame)
|
||||||
add_subdirectory(gauge)
|
add_subdirectory(gauge)
|
||||||
add_subdirectory(separator)
|
add_subdirectory(separator)
|
||||||
add_subdirectory(vbox_hbox)
|
add_subdirectory(vbox_hbox)
|
||||||
|
4
examples/frame/CMakeLists.txt
Normal file
4
examples/frame/CMakeLists.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
add_executable(frame_example
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
target_link_libraries(frame_example PRIVATE ftxui)
|
35
examples/frame/main.cpp
Normal file
35
examples/frame/main.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "ftxui/core/screen.hpp"
|
||||||
|
#include "ftxui/core/dom/elements.hpp"
|
||||||
|
|
||||||
|
int main(int argc, const char *argv[])
|
||||||
|
{
|
||||||
|
using namespace ftxui::dom;
|
||||||
|
auto document =
|
||||||
|
hbox(
|
||||||
|
frame(
|
||||||
|
vbox(
|
||||||
|
text(L"Line 1"),
|
||||||
|
text(L"Line 2"),
|
||||||
|
text(L"Line 3"),
|
||||||
|
frame(
|
||||||
|
vbox(
|
||||||
|
text(L"Line 4"),
|
||||||
|
text(L"Line 5"),
|
||||||
|
text(L"Line 6")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
text(L"Line 7"),
|
||||||
|
text(L"Line 8"),
|
||||||
|
text(L"Line 9")
|
||||||
|
)
|
||||||
|
),
|
||||||
|
flex()
|
||||||
|
);
|
||||||
|
auto screen = ftxui::Screen::TerminalOutput(document);
|
||||||
|
Render(screen, document.get());
|
||||||
|
std::cout << screen.ToString() << std::endl;
|
||||||
|
}
|
@ -1,30 +1,22 @@
|
|||||||
|
#include <chrono>
|
||||||
|
#include <iostream>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#include "ftxui/core/screen.hpp"
|
#include "ftxui/core/screen.hpp"
|
||||||
#include "ftxui/core/dom/elements.hpp"
|
#include "ftxui/core/dom/elements.hpp"
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main(int argc, const char *argv[])
|
int main(int argc, const char *argv[])
|
||||||
{
|
{
|
||||||
|
for(float percentage = 0; percentage <= 1.0; percentage+=0.001) {
|
||||||
using namespace ftxui::dom;
|
using namespace ftxui::dom;
|
||||||
auto document =
|
auto document =
|
||||||
hbox(
|
hbox(text(L"gauge = -"), flex(gauge(percentage)), text(L"-"));
|
||||||
flex(vbox(
|
auto screen = ftxui::Screen(100, 1);
|
||||||
gauge(0.1),
|
|
||||||
gauge(0.2),
|
|
||||||
gauge(0.3)
|
|
||||||
)),
|
|
||||||
flex(vbox(
|
|
||||||
gauge(0.1),
|
|
||||||
gauge(0.8),
|
|
||||||
gauge(0.3)
|
|
||||||
))
|
|
||||||
);
|
|
||||||
//auto screen = ftxui::Screen::WholeTerminal();
|
|
||||||
auto screen = ftxui::Screen::TerminalOutput(document);
|
|
||||||
Render(screen, document.get());
|
Render(screen, document.get());
|
||||||
|
std::cout << '\r' << screen.ToString() << std::flush;
|
||||||
|
|
||||||
std::cout << screen.ToString();
|
using namespace std::chrono_literals;
|
||||||
|
std::this_thread::sleep_for(0.01s);
|
||||||
getchar();
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
@ -3,14 +3,16 @@ project(ftxui)
|
|||||||
|
|
||||||
add_library(ftxui
|
add_library(ftxui
|
||||||
src/ftxui/core/component.cpp
|
src/ftxui/core/component.cpp
|
||||||
|
src/ftxui/core/dom/frame.cpp
|
||||||
|
src/ftxui/core/dom/centered.cpp
|
||||||
src/ftxui/core/dom/flex.cpp
|
src/ftxui/core/dom/flex.cpp
|
||||||
|
src/ftxui/core/dom/frame.cpp
|
||||||
|
src/ftxui/core/dom/gauge.cpp
|
||||||
src/ftxui/core/dom/hbox.cpp
|
src/ftxui/core/dom/hbox.cpp
|
||||||
src/ftxui/core/dom/node.cpp
|
src/ftxui/core/dom/node.cpp
|
||||||
src/ftxui/core/dom/separator.cpp
|
src/ftxui/core/dom/separator.cpp
|
||||||
src/ftxui/core/dom/text.cpp
|
src/ftxui/core/dom/text.cpp
|
||||||
src/ftxui/core/dom/centered.cpp
|
|
||||||
src/ftxui/core/dom/vbox.cpp
|
src/ftxui/core/dom/vbox.cpp
|
||||||
src/ftxui/core/dom/gauge.cpp
|
|
||||||
src/ftxui/core/screen.cpp
|
src/ftxui/core/screen.cpp
|
||||||
src/ftxui/core/terminal.cpp
|
src/ftxui/core/terminal.cpp
|
||||||
src/ftxui/util/string.cpp
|
src/ftxui/util/string.cpp
|
||||||
|
@ -8,24 +8,27 @@ namespace ftxui {
|
|||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
using Element = std::unique_ptr<Node>;
|
using Element = std::unique_ptr<Node>;
|
||||||
|
using Child = std::unique_ptr<Node>;
|
||||||
using Children = std::vector<std::unique_ptr<Node>>;
|
using Children = std::vector<std::unique_ptr<Node>>;
|
||||||
|
|
||||||
|
|
||||||
// --- Layout ----
|
// --- Layout ----
|
||||||
std::unique_ptr<Node> vbox(Children);
|
Element vbox(Children);
|
||||||
std::unique_ptr<Node> hbox(Children);
|
Element hbox(Children);
|
||||||
std::unique_ptr<Node> flex();
|
Element flex();
|
||||||
std::unique_ptr<Node> flex(Element);
|
|
||||||
|
|
||||||
// --- Widget --
|
// --- Widget --
|
||||||
std::unique_ptr<Node> text(std::wstring text);
|
Element text(std::wstring text);
|
||||||
std::unique_ptr<Node> separator();
|
Element separator();
|
||||||
std::unique_ptr<Node> gauge(float ratio);
|
Element gauge(float ratio);
|
||||||
|
Element frame(Child);
|
||||||
|
Element frame(std::wstring title, Child);
|
||||||
|
|
||||||
// --- Decorator ---
|
// --- Decorator ---
|
||||||
std::unique_ptr<Node> hcenter(Element);
|
Element hcenter(Element);
|
||||||
std::unique_ptr<Node> vcenter(Element);
|
Element vcenter(Element);
|
||||||
std::unique_ptr<Node> center(Element);
|
Element center(Element);
|
||||||
|
Element flex(Element);
|
||||||
|
|
||||||
template <class... Args>
|
template <class... Args>
|
||||||
std::vector<Element> unpack(Args... args) {
|
std::vector<Element> unpack(Args... args) {
|
||||||
|
57
ftxui/src/ftxui/core/dom/frame.cpp
Normal file
57
ftxui/src/ftxui/core/dom/frame.cpp
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
#include "ftxui/core/dom/node.hpp"
|
||||||
|
#include "ftxui/core/dom/elements.hpp"
|
||||||
|
|
||||||
|
namespace ftxui {
|
||||||
|
namespace dom {
|
||||||
|
|
||||||
|
static wchar_t charset[] = L"┌┐└┘─│";
|
||||||
|
|
||||||
|
class Frame : public Node {
|
||||||
|
public:
|
||||||
|
Frame(Child child) : Node(unpack(std::move(child))) {}
|
||||||
|
~Frame() override {}
|
||||||
|
|
||||||
|
void ComputeRequirement() override {
|
||||||
|
children[0]->ComputeRequirement();
|
||||||
|
requirement_ = children[0]->requirement();
|
||||||
|
requirement_.min.x += 2;
|
||||||
|
requirement_.min.y += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetBox(Box box) override {
|
||||||
|
Node::SetBox(box);
|
||||||
|
box.left++;
|
||||||
|
box.right--;
|
||||||
|
box.top++;
|
||||||
|
box.bottom--;
|
||||||
|
children[0]->SetBox(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Render(Screen& screen) override {
|
||||||
|
if (box_.left >= box_.right || box_.top >= box_.bottom)
|
||||||
|
return;
|
||||||
|
|
||||||
|
screen.at(box_.left, box_.top) = charset[0];
|
||||||
|
screen.at(box_.right, box_.top) = charset[1];
|
||||||
|
screen.at(box_.left, box_.bottom) = charset[2];
|
||||||
|
screen.at(box_.right, box_.bottom) = charset[3];
|
||||||
|
for(float x = box_.left + 1; x<box_.right; ++x) {
|
||||||
|
screen.at(x, box_.top) = charset[4];
|
||||||
|
screen.at(x, box_.bottom) = charset[4];
|
||||||
|
}
|
||||||
|
for(float y = box_.top + 1; y<box_.bottom; ++y) {
|
||||||
|
screen.at(box_.left, y) = charset[5];
|
||||||
|
screen.at(box_.right,y) = charset[5];
|
||||||
|
}
|
||||||
|
children[0]->Render(screen);
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
float progress_;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::unique_ptr<Node> frame(Child child) {
|
||||||
|
return std::make_unique<Frame>(std::move(child));
|
||||||
|
}
|
||||||
|
|
||||||
|
}; // namespace dom
|
||||||
|
}; // namespace ftxui
|
@ -4,10 +4,12 @@
|
|||||||
namespace ftxui {
|
namespace ftxui {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
|
||||||
|
static wchar_t charset[] = L" ▏▎▍▌▋▊▉█";
|
||||||
|
|
||||||
class Gauge : public Node {
|
class Gauge : public Node {
|
||||||
public:
|
public:
|
||||||
Gauge(float progress) : progress_(progress) {}
|
Gauge(float progress) : progress_(progress) {}
|
||||||
~Gauge() {}
|
~Gauge() override {}
|
||||||
|
|
||||||
void ComputeRequirement() override {
|
void ComputeRequirement() override {
|
||||||
requirement_.flex.x = 1;
|
requirement_.flex.x = 1;
|
||||||
@ -16,9 +18,14 @@ class Gauge : public Node {
|
|||||||
|
|
||||||
void Render(Screen& screen) override {
|
void Render(Screen& screen) override {
|
||||||
float y = box_.top;
|
float y = box_.top;
|
||||||
int limit = box_.left + progress_ * (box_.right - box_.left);
|
float limit = box_.left + progress_ * (box_.right - box_.left + 1);
|
||||||
for(int i = box_.left; i<=limit; ++i)
|
int limit_int = limit;
|
||||||
screen.at(i, y) = 'X';
|
int x = box_.left;
|
||||||
|
while (x < limit_int)
|
||||||
|
screen.at(x++, y) = charset[9];
|
||||||
|
screen.at(x++, y) = charset[int(9*(limit-limit_int))];
|
||||||
|
while (x <= box_.right)
|
||||||
|
screen.at(x++, y) = charset[0];
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
float progress_;
|
float progress_;
|
||||||
|
@ -37,7 +37,7 @@ class VBox : public Node {
|
|||||||
|
|
||||||
int y = box.top;
|
int y = box.top;
|
||||||
for (auto& child : children) {
|
for (auto& child : children) {
|
||||||
if (y > box.right)
|
if (y > box.bottom)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
Box child_box = box;
|
Box child_box = box;
|
||||||
|
Loading…
Reference in New Issue
Block a user