mirror of
				https://github.com/ArthurSonzogni/FTXUI.git
				synced 2025-11-04 13:38:14 +08:00 
			
		
		
		
	Feature: strikethrough and underlinedDouble decorator. (#561)
				
					
				
			This resolves: https://github.com/ArthurSonzogni/FTXUI/issues/560
This commit is contained in:
		
							
								
								
									
										36
									
								
								src/ftxui/dom/strikethrough.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/ftxui/dom/strikethrough.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#include <memory>   // for make_shared
 | 
			
		||||
#include <utility>  // for move
 | 
			
		||||
 | 
			
		||||
#include "ftxui/dom/elements.hpp"        // for Element, strikethrough
 | 
			
		||||
#include "ftxui/dom/node.hpp"            // for Node
 | 
			
		||||
#include "ftxui/dom/node_decorator.hpp"  // for NodeDecorator
 | 
			
		||||
#include "ftxui/screen/box.hpp"          // for Box
 | 
			
		||||
#include "ftxui/screen/screen.hpp"       // for Pixel, Screen
 | 
			
		||||
 | 
			
		||||
namespace ftxui {
 | 
			
		||||
 | 
			
		||||
/// @brief Apply a strikethrough to text.
 | 
			
		||||
/// @ingroup dom
 | 
			
		||||
Element strikethrough(Element child) {
 | 
			
		||||
  class Impl : public NodeDecorator {
 | 
			
		||||
   public:
 | 
			
		||||
    using NodeDecorator::NodeDecorator;
 | 
			
		||||
 | 
			
		||||
    void Render(Screen& screen) override {
 | 
			
		||||
      for (int y = box_.y_min; y <= box_.y_max; ++y) {
 | 
			
		||||
        for (int x = box_.x_min; x <= box_.x_max; ++x) {
 | 
			
		||||
          screen.PixelAt(x, y).strikethrough = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      Node::Render(screen);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return std::make_shared<Impl>(std::move(child));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace ftxui
 | 
			
		||||
 | 
			
		||||
// Copyright 2023 Arthur Sonzogni. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by the MIT license that can be found in
 | 
			
		||||
// the LICENSE file.
 | 
			
		||||
							
								
								
									
										36
									
								
								src/ftxui/dom/underlined_double.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/ftxui/dom/underlined_double.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
#include <memory>   // for make_shared
 | 
			
		||||
#include <utility>  // for move
 | 
			
		||||
 | 
			
		||||
#include "ftxui/dom/elements.hpp"        // for Element, underlinedDouble
 | 
			
		||||
#include "ftxui/dom/node.hpp"            // for Node
 | 
			
		||||
#include "ftxui/dom/node_decorator.hpp"  // for NodeDecorator
 | 
			
		||||
#include "ftxui/screen/box.hpp"          // for Box
 | 
			
		||||
#include "ftxui/screen/screen.hpp"       // for Pixel, Screen
 | 
			
		||||
 | 
			
		||||
namespace ftxui {
 | 
			
		||||
 | 
			
		||||
/// @brief Apply a underlinedDouble to text.
 | 
			
		||||
/// @ingroup dom
 | 
			
		||||
Element underlinedDouble(Element child) {
 | 
			
		||||
  class Impl : public NodeDecorator {
 | 
			
		||||
   public:
 | 
			
		||||
    using NodeDecorator::NodeDecorator;
 | 
			
		||||
 | 
			
		||||
    void Render(Screen& screen) override {
 | 
			
		||||
      for (int y = box_.y_min; y <= box_.y_max; ++y) {
 | 
			
		||||
        for (int x = box_.x_min; x <= box_.x_max; ++x) {
 | 
			
		||||
          screen.PixelAt(x, y).underlined_double = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      Node::Render(screen);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return std::make_shared<Impl>(std::move(child));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace ftxui
 | 
			
		||||
 | 
			
		||||
// Copyright 2023 Arthur Sonzogni. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by the MIT license that can be found in
 | 
			
		||||
// the LICENSE file.
 | 
			
		||||
@@ -66,6 +66,16 @@ void UpdatePixelStyle(std::stringstream& ss,
 | 
			
		||||
    previous.dim = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ((!next.underlined && previous.underlined) ||
 | 
			
		||||
      (!next.underlined_double && previous.underlined_double)) {
 | 
			
		||||
    // We might have wrongfully reset underlined or underlinedbold because they
 | 
			
		||||
    // share the same resetter. Take it into account so that the side effect
 | 
			
		||||
    // will cause it to be set again below.
 | 
			
		||||
    ss << "\x1B[24m";  // UNDERLINED_RESET
 | 
			
		||||
    previous.underlined = false;
 | 
			
		||||
    previous.underlined_double = false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (next.bold && !previous.bold) {
 | 
			
		||||
    ss << "\x1B[1m";  // BOLD_SET
 | 
			
		||||
  }
 | 
			
		||||
@@ -78,10 +88,6 @@ void UpdatePixelStyle(std::stringstream& ss,
 | 
			
		||||
    ss << "\x1B[4m";  // UNDERLINED_SET
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!next.underlined && previous.underlined) {
 | 
			
		||||
    ss << "\x1B[24m";  // UNDERLINED_RESET
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (next.blink && !previous.blink) {
 | 
			
		||||
    ss << "\x1B[5m";  // BLINK_SET
 | 
			
		||||
  }
 | 
			
		||||
@@ -98,6 +104,18 @@ void UpdatePixelStyle(std::stringstream& ss,
 | 
			
		||||
    ss << "\x1B[27m";  // INVERTED_RESET
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (next.strikethrough && !previous.strikethrough) {
 | 
			
		||||
    ss << "\x1B[9m";  // CROSSED_OUT
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!next.strikethrough && previous.strikethrough) {
 | 
			
		||||
    ss << "\x1B[29m";  // CROSSED_OUT_RESET
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (next.underlined_double && !previous.underlined_double) {
 | 
			
		||||
    ss << "\x1B[21m";  // DOUBLE_UNDERLINED_SET
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (next.foreground_color != previous.foreground_color ||
 | 
			
		||||
      next.background_color != previous.background_color) {
 | 
			
		||||
    ss << "\x1B[" + next.foreground_color.Print(false) + "m";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user