FTXUI/include/ftxui/screen/screen.hpp

134 lines
3.3 KiB
C++
Raw Normal View History

2022-03-31 08:17:43 +08:00
#ifndef FTXUI_SCREEN_SCREEN_HPP
#define FTXUI_SCREEN_SCREEN_HPP
#include <cstdint> // for uint8_t
#include <memory>
#include <string> // for string, basic_string, allocator
2021-08-07 02:32:33 +08:00
#include <vector> // for vector
2021-08-07 02:32:33 +08:00
#include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/color.hpp" // for Color, Color::Default
#include "ftxui/screen/terminal.hpp" // for Dimensions
2018-10-12 15:23:37 +08:00
namespace ftxui {
2020-05-25 07:34:13 +08:00
/// @brief A unicode character and its associated style.
/// @ingroup screen
struct Pixel {
2022-03-31 08:17:43 +08:00
bool operator==(const Pixel& other) const;
// The graphemes stored into the pixel. To support combining characters,
2023-06-06 06:13:36 +08:00
// like: a⃦, this can potentially contain multiple codepoints.
std::string character = " ";
// The hyperlink associated with the pixel.
// 0 is the default value, meaning no hyperlink.
uint8_t hyperlink = 0;
// Colors:
2018-10-12 15:23:37 +08:00
Color background_color = Color::Default;
Color foreground_color = Color::Default;
// A bit field representing the style:
bool blink : 1;
bool bold : 1;
bool dim : 1;
bool inverted : 1;
bool underlined : 1;
bool underlined_double : 1;
bool strikethrough : 1;
bool automerge : 1;
Pixel()
: blink(false),
bold(false),
dim(false),
inverted(false),
underlined(false),
underlined_double(false),
strikethrough(false),
automerge(false) {}
};
2020-05-25 07:34:13 +08:00
/// @brief Define how the Screen's dimensions should look like.
/// @ingroup screen
namespace Dimension {
Dimensions Fixed(int);
Dimensions Full();
} // namespace Dimension
2019-01-27 04:52:55 +08:00
2020-05-25 07:34:13 +08:00
/// @brief A rectangular grid of Pixel.
/// @ingroup screen
class Screen {
public:
2020-05-25 07:34:13 +08:00
// Constructors:
2019-01-27 04:52:55 +08:00
Screen(int dimx, int dimy);
static Screen Create(Dimensions dimension);
static Screen Create(Dimensions width, Dimensions height);
// Access a character in the grid at a given position.
std::string& at(int x, int y);
const std::string& at(int x, int y) const;
// Access a cell (Pixel) in the grid at a given position.
2019-01-27 04:52:55 +08:00
Pixel& PixelAt(int x, int y);
const Pixel& PixelAt(int x, int y) const;
std::string ToString() const;
// Print the Screen on to the terminal.
void Print() const;
// Get screen dimensions.
int dimx() const { return dimx_; }
int dimy() const { return dimy_; }
// Move the terminal cursor n-lines up with n = dimy().
2022-03-31 08:17:43 +08:00
std::string ResetPosition(bool clear = false) const;
// Fill the screen with space.
void Clear();
2019-01-19 07:20:29 +08:00
void ApplyShader();
struct Cursor {
2019-07-01 06:43:00 +08:00
int x = 0;
int y = 0;
enum Shape {
Hidden = 0,
BlockBlinking = 1,
Block = 2,
UnderlineBlinking = 3,
Underline = 4,
2022-12-28 20:17:56 +08:00
BarBlinking = 5,
Bar = 6,
};
Shape shape;
};
Cursor cursor() const { return cursor_; }
void SetCursor(Cursor cursor) { cursor_ = cursor; }
// Store an hyperlink in the screen. Return the id of the hyperlink. The id is
// used to identify the hyperlink when the user click on it.
uint8_t RegisterHyperlink(const std::string& link);
const std::string& Hyperlink(uint8_t id) const;
2022-03-31 08:17:43 +08:00
Box stencil;
protected:
2019-01-27 04:52:55 +08:00
int dimx_;
int dimy_;
std::vector<std::vector<Pixel>> pixels_;
Cursor cursor_;
std::vector<std::string> hyperlinks_ = {""};
};
2020-02-12 04:44:55 +08:00
} // namespace ftxui
2022-03-31 08:17:43 +08:00
#endif // FTXUI_SCREEN_SCREEN_HPP
// Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.