From 011b9a1426c7764638348501d45649b599572d85 Mon Sep 17 00:00:00 2001 From: Clement Roblot Date: Thu, 31 Oct 2024 20:57:45 +0700 Subject: [PATCH] Make use of Box instead of my custom Region struct --- .../ftxui/component/screen_interactive.hpp | 12 ------- include/ftxui/screen/screen.hpp | 6 ++++ src/ftxui/component/screen_interactive.cpp | 31 +++++++++---------- src/ftxui/screen/screen.cpp | 4 ++- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/include/ftxui/component/screen_interactive.hpp b/include/ftxui/component/screen_interactive.hpp index 49f18377..6fd61c23 100644 --- a/include/ftxui/component/screen_interactive.hpp +++ b/include/ftxui/component/screen_interactive.hpp @@ -26,13 +26,6 @@ struct Event; using Component = std::shared_ptr; class ScreenInteractivePrivate; -typedef struct { - uint16_t startx = 0; - uint16_t endx = 0; - uint16_t starty = 0; - uint16_t endy = 0; -} Region; - class ScreenInteractive : public Screen { public: // Constructors: @@ -137,11 +130,6 @@ class ScreenInteractive : public Screen { bool force_handle_ctrl_c_ = true; bool force_handle_ctrl_z_ = true; - bool selection_enabled = false; - CapturedMouse selection_pending; - Region selection_region; - std::string selection_text; - // The style of the cursor to restore on exit. int cursor_reset_shape_ = 1; diff --git a/include/ftxui/screen/screen.hpp b/include/ftxui/screen/screen.hpp index 51b83a03..211ed594 100644 --- a/include/ftxui/screen/screen.hpp +++ b/include/ftxui/screen/screen.hpp @@ -10,6 +10,7 @@ #include "ftxui/screen/image.hpp" // for Pixel, Image #include "ftxui/screen/terminal.hpp" // for Dimensions +#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse namespace ftxui { @@ -62,6 +63,11 @@ class Screen : public Image { Cursor cursor() const { return cursor_; } void SetCursor(Cursor cursor) { cursor_ = cursor; } + bool selection_enabled = false; + CapturedMouse selection_pending; + Box selection_region; + std::string selection_text; + // 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); diff --git a/src/ftxui/component/screen_interactive.cpp b/src/ftxui/component/screen_interactive.cpp index 998e5393..93bc56d2 100644 --- a/src/ftxui/component/screen_interactive.cpp +++ b/src/ftxui/component/screen_interactive.cpp @@ -351,8 +351,7 @@ ScreenInteractive::ScreenInteractive(int dimx, bool use_alternative_screen) : Screen(dimx, dimy), dimension_(dimension), - use_alternative_screen_(use_alternative_screen), - selection_text("") { + use_alternative_screen_(use_alternative_screen) { task_receiver_ = MakeReceiver(); } @@ -844,10 +843,10 @@ bool ScreenInteractive::HandleSelection(Event event) { return false; } selection_enabled = true; - selection_region.startx = mouse.x; - selection_region.starty = mouse.y; - selection_region.endx = mouse.x; - selection_region.endy = mouse.y; + selection_region.x_min = mouse.x; + selection_region.y_min = mouse.y; + selection_region.x_max = mouse.x; + selection_region.y_max = mouse.y; return true; } @@ -856,18 +855,18 @@ bool ScreenInteractive::HandleSelection(Event event) { } if (mouse.motion == Mouse::Moved) { - selection_region.endx = mouse.x; - selection_region.endy = mouse.y; + selection_region.x_max = mouse.x; + selection_region.y_max = mouse.y; return true; } if (mouse.motion == Mouse::Released) { - selection_region.endx = mouse.x; - selection_region.endy = mouse.y; + selection_region.x_max = mouse.x; + selection_region.y_max = mouse.y; selection_pending = nullptr; - if (selection_region.startx == selection_region.endx && - selection_region.starty == selection_region.endy) { + if (selection_region.x_min == selection_region.x_max && + selection_region.y_min == selection_region.y_max) { selection_enabled = false; return true; } @@ -884,10 +883,10 @@ void ScreenInteractive::RefreshSelection() { } selection_text = ""; - for (int y = std::min(selection_region.starty, selection_region.endy); - y <= std::max(selection_region.starty, selection_region.endy); ++y) { - for (int x = std::min(selection_region.startx, selection_region.endx); - x <= std::max(selection_region.startx, selection_region.endx) - 1; + for (int y = std::min(selection_region.y_min, selection_region.y_max); + y <= std::max(selection_region.y_min, selection_region.y_max); ++y) { + for (int x = std::min(selection_region.x_min, selection_region.x_max); + x <= std::max(selection_region.x_min, selection_region.x_max) - 1; ++x) { if (PixelAt(x, y).selectable == true) { PixelAt(x, y).inverted ^= true; diff --git a/src/ftxui/screen/screen.cpp b/src/ftxui/screen/screen.cpp index 7bd64e29..b1c0945f 100644 --- a/src/ftxui/screen/screen.cpp +++ b/src/ftxui/screen/screen.cpp @@ -389,7 +389,9 @@ Screen Screen::Create(Dimensions dimension) { return {dimension.dimx, dimension.dimy}; } -Screen::Screen(int dimx, int dimy) : Image{dimx, dimy} { +Screen::Screen(int dimx, int dimy) : + Image{dimx, dimy}, + selection_text("") { #if defined(_WIN32) // The placement of this call is a bit weird, however we can assume that // anybody who instantiates a Screen object eventually wants to output