mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2024-11-22 18:59:59 +08:00
6039474a26
Add the `automerge` attribute to the Pixel bit field. It controls whether two pixels must be automerged. Defining this allows two mergeable characters not to be merged. This was requested by: https://github.com/ArthurSonzogni/FTXUI/issues/285
100 lines
2.4 KiB
C++
100 lines
2.4 KiB
C++
#ifndef FTXUI_SCREEN_SCREEN
|
|
#define FTXUI_SCREEN_SCREEN
|
|
|
|
#include <memory>
|
|
#include <string> // for string, allocator, basic_string
|
|
#include <vector> // for vector
|
|
|
|
#include "ftxui/screen/box.hpp" // for Box
|
|
#include "ftxui/screen/color.hpp" // for Color, Color::Default
|
|
#include "ftxui/screen/terminal.hpp" // for Dimensions
|
|
|
|
namespace ftxui {
|
|
|
|
/// @brief A unicode character and its associated style.
|
|
/// @ingroup screen
|
|
struct Pixel {
|
|
// The graphemes stored into the pixel. To support combining characters,
|
|
// like: a⃦, this can potentially contains multiple codepoitns.
|
|
std::string character = " ";
|
|
|
|
// Colors:
|
|
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 automerge : 1;
|
|
|
|
Pixel()
|
|
: blink(false),
|
|
bold(false),
|
|
dim(false),
|
|
inverted(false),
|
|
underlined(false),
|
|
automerge(false) {}
|
|
};
|
|
|
|
/// @brief Define how the Screen's dimensions should look like.
|
|
/// @ingroup screen
|
|
namespace Dimension {
|
|
Dimensions Fixed(int);
|
|
Dimensions Full();
|
|
} // namespace Dimension
|
|
|
|
/// @brief A rectangular grid of Pixel.
|
|
/// @ingroup screen
|
|
class Screen {
|
|
public:
|
|
// Constructors:
|
|
Screen(int dimx, int dimy);
|
|
static Screen Create(Dimensions dimension);
|
|
static Screen Create(Dimensions width, Dimensions height);
|
|
|
|
// Node write into the screen using Screen::at.
|
|
std::string& at(int x, int y);
|
|
Pixel& PixelAt(int x, int y);
|
|
|
|
// Convert the screen into a printable string in the terminal.
|
|
std::string ToString();
|
|
void Print();
|
|
|
|
// Get screen dimensions.
|
|
int dimx() const { return dimx_; }
|
|
int dimy() const { return dimy_; }
|
|
|
|
// Move the terminal cursor n-lines up with n = dimy().
|
|
std::string ResetPosition(bool clear = false);
|
|
|
|
// Fill with space.
|
|
void Clear();
|
|
|
|
void ApplyShader();
|
|
Box stencil;
|
|
|
|
struct Cursor {
|
|
int x = 0;
|
|
int y = 0;
|
|
};
|
|
Cursor cursor() const { return cursor_; }
|
|
void SetCursor(Cursor cursor) { cursor_ = cursor; }
|
|
|
|
protected:
|
|
int dimx_;
|
|
int dimy_;
|
|
std::vector<std::vector<Pixel>> pixels_;
|
|
Cursor cursor_;
|
|
};
|
|
|
|
} // namespace ftxui
|
|
|
|
#endif /* end of include guard: FTXUI_SCREEN_SCREEN */
|
|
|
|
// 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.
|