Compare commits

...

7 Commits

Author SHA1 Message Date
Alex
0b74a6822b
Merge baa5973128 into c5357acbaa 2024-08-22 07:34:56 +02:00
ArthurSonzogni
c5357acbaa
Add scrollbar example.
Some checks failed
Build / Tests (gcc, gcov, Linux GCC, ubuntu-latest) (push) Failing after 3m59s
Build / Tests (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Failing after 4m4s
Build / documentation (push) Failing after 3m58s
Build / Tests (cl, Windows MSVC, windows-latest) (push) Has been cancelled
Build / Create release (push) Has been cancelled
Build / Build packages (build/ftxui*Darwin*, macos-latest) (push) Has been cancelled
Build / Build packages (build/ftxui*Linux*, ubuntu-latest) (push) Has been cancelled
Build / Build packages (build/ftxui*Win64*, windows-latest) (push) Has been cancelled
CodeQL / Analyze (cpp) (push) Failing after 31s
2024-08-18 10:46:41 +02:00
ArthurSonzogni
fbd56cdf43
Fix CQ failures.
Some checks failed
Build / Tests (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / Create release (push) Blocked by required conditions
Build / Build packages (build/ftxui*Darwin*, macos-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Linux*, ubuntu-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Win64*, windows-latest) (push) Blocked by required conditions
Build / Tests (gcc, gcov, Linux GCC, ubuntu-latest) (push) Failing after 6m44s
Build / Tests (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Successful in 6m31s
Build / documentation (push) Failing after 1m33s
CodeQL / Analyze (cpp) (push) Failing after 11s
2024-08-17 12:01:43 +02:00
ArthurSonzogni
66d1c1f61f
Quickfix
Some checks failed
Build / Tests (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / Tests (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Waiting to run
Build / Create release (push) Blocked by required conditions
Build / Build packages (build/ftxui*Darwin*, macos-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Linux*, ubuntu-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Win64*, windows-latest) (push) Blocked by required conditions
Build / Tests (gcc, gcov, Linux GCC, ubuntu-latest) (push) Failing after 54s
Build / Tests (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Failing after 6m7s
Build / documentation (push) Failing after 1m17s
CodeQL / Analyze (cpp) (push) Failing after 13s
2024-08-16 11:47:01 +02:00
Arthur Sonzogni
f5d8c7deb5
Apply Clang-tidy (#918)
Some checks failed
Build / Tests (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / Tests (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Waiting to run
Build / Create release (push) Blocked by required conditions
Build / Build packages (build/ftxui*Darwin*, macos-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Linux*, ubuntu-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Win64*, windows-latest) (push) Blocked by required conditions
Build / Tests (gcc, gcov, Linux GCC, ubuntu-latest) (push) Failing after 1m27s
Build / Tests (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Failing after 2m18s
Build / documentation (push) Failing after 49s
CodeQL / Analyze (cpp) (push) Failing after 30s
2024-08-16 11:19:51 +02:00
Sergey Latu
535290bb3b
My project added to readme (#916)
Some checks failed
Build / Tests (cl, Windows MSVC, windows-latest) (push) Waiting to run
Build / Tests (llvm, llvm-cov gcov, MacOS clang, macos-latest) (push) Waiting to run
Build / Create release (push) Blocked by required conditions
Build / Build packages (build/ftxui*Darwin*, macos-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Linux*, ubuntu-latest) (push) Blocked by required conditions
Build / Build packages (build/ftxui*Win64*, windows-latest) (push) Blocked by required conditions
Build / Tests (gcc, gcov, Linux GCC, ubuntu-latest) (push) Failing after 7m46s
Build / Tests (llvm, llvm-cov gcov, Linux Clang, ubuntu-latest) (push) Failing after 6m6s
Build / documentation (push) Failing after 5s
CodeQL / Analyze (cpp) (push) Failing after 5s
2024-08-15 16:08:32 +02:00
alexv-ds
baa5973128
msvc getenv deprecation warn fix 2024-07-18 18:34:34 +03:00
37 changed files with 310 additions and 128 deletions

View File

@ -27,6 +27,7 @@ Checks: "*,
-readability-simplify-boolean-expr, -readability-simplify-boolean-expr,
-readability-static-accessed-through-instance, -readability-static-accessed-through-instance,
-readability-use-anyofallof, -readability-use-anyofallof,
-readability-avoid-nested-conditional-operator,
-zircon-*, -zircon-*,
" "
WarningsAsErrors: '' WarningsAsErrors: ''

View File

@ -2,8 +2,6 @@ name: Build
on: on:
create: create:
tags:
-v*
push: push:
branches: branches:
- main - main
@ -28,10 +26,11 @@ jobs:
compiler: llvm compiler: llvm
gcov_executable: "llvm-cov gcov" gcov_executable: "llvm-cov gcov"
- name: MacOS clang # https://github.com/aminya/setup-cpp/issues/246
os: macos-latest #- name: MacOS clang
compiler: llvm #os: macos-latest
gcov_executable: "llvm-cov gcov" #compiler: llvm
#gcov_executable: "llvm-cov gcov"
- name: Windows MSVC - name: Windows MSVC
os: windows-latest os: windows-latest
@ -44,7 +43,7 @@ jobs:
id: cpu-cores id: cpu-cores
- name: "Checkout repository" - name: "Checkout repository"
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: "Setup Cpp" - name: "Setup Cpp"
uses: aminya/setup-cpp@v1 uses: aminya/setup-cpp@v1
@ -79,11 +78,16 @@ jobs:
cmake cmake
--build ./build --build ./build
- name: Unix - Test and coverage - name: Unix - Test
if: runner.os != 'Windows' if: runner.os != 'Windows'
working-directory: ./build working-directory: ./build
run: > run: >
ctest -C Debug --rerun-failed --output-on-failure; ctest -C Debug --rerun-failed --output-on-failure;
- name: Unix - coverage
if: runner.os != 'Windows'
working-directory: ./build
run: >
gcovr gcovr
-j ${{env.nproc}} -j ${{env.nproc}}
--delete --delete
@ -155,7 +159,7 @@ jobs:
id: cpu-cores id: cpu-cores
- name: "Checkout repository" - name: "Checkout repository"
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: "Install cmake" - name: "Install cmake"
uses: lukka/get-cmake@latest uses: lukka/get-cmake@latest
@ -186,7 +190,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: "Checkout repository" - name: "Checkout repository"
uses: actions/checkout@v2 uses: actions/checkout@v3
- name: "Install cmake" - name: "Install cmake"
uses: lukka/get-cmake@latest uses: lukka/get-cmake@latest

View File

@ -334,6 +334,7 @@ Feel free to add your projects here:
- [Caravan](https://github.com/r3w0p/caravan) - [Caravan](https://github.com/r3w0p/caravan)
- [Step-Writer](https://github.com/BrianAnakPintar/step-writer) - [Step-Writer](https://github.com/BrianAnakPintar/step-writer)
- [XJ music](https://github.com/xjmusic/xjmusic) - [XJ music](https://github.com/xjmusic/xjmusic)
- [UDP chat](https://github.com/Sergeydigl3/udp-chat-tui)
### [cpp-best-practices/game_jam](https://github.com/cpp-best-practices/game_jam) ### [cpp-best-practices/game_jam](https://github.com/cpp-best-practices/game_jam)

View File

@ -38,6 +38,7 @@ example(radiobox)
example(radiobox_in_frame) example(radiobox_in_frame)
example(renderer) example(renderer)
example(resizable_split) example(resizable_split)
example(scrollbar)
example(slider) example(slider)
example(slider_direction) example(slider_direction)
example(slider_rgb) example(slider_rgb)

View File

@ -490,8 +490,8 @@ int main() {
}, },
&tab_index); &tab_index);
auto exit_button = Button( auto exit_button =
"Exit", [&] { screen.Exit(); }, ButtonOption::Animated()); Button("Exit", [&] { screen.Exit(); }, ButtonOption::Animated());
auto main_container = Container::Vertical({ auto main_container = Container::Vertical({
Container::Horizontal({ Container::Horizontal({

View File

@ -0,0 +1,112 @@
// 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.
#include <ftxui/component/component.hpp>
#include <ftxui/component/screen_interactive.hpp>
using namespace ftxui;
Component DummyWindowContent() {
class Impl : public ComponentBase {
private:
float scroll_x = 0.1;
float scroll_y = 0.1;
public:
Impl() {
auto content = Renderer([=] {
const std::string lorem =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed "
"do eiusmod tempor incididunt ut labore et dolore magna "
"aliqua. Ut enim ad minim veniam, quis nostrud exercitation "
"ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis "
"aute irure dolor in reprehenderit in voluptate velit esse "
"cillum dolore eu fugiat nulla pariatur. Excepteur sint "
"occaecat cupidatat non proident, sunt in culpa qui officia "
"deserunt mollit anim id est laborum.";
return vbox({
text(lorem.substr(0, -1)), text(lorem.substr(5, -1)), text(""),
text(lorem.substr(10, -1)), text(lorem.substr(15, -1)), text(""),
text(lorem.substr(20, -1)), text(lorem.substr(25, -1)), text(""),
text(lorem.substr(30, -1)), text(lorem.substr(35, -1)), text(""),
text(lorem.substr(40, -1)), text(lorem.substr(45, -1)), text(""),
text(lorem.substr(50, -1)), text(lorem.substr(55, -1)), text(""),
text(lorem.substr(60, -1)), text(lorem.substr(65, -1)), text(""),
text(lorem.substr(70, -1)), text(lorem.substr(75, -1)), text(""),
text(lorem.substr(80, -1)), text(lorem.substr(85, -1)), text(""),
text(lorem.substr(90, -1)), text(lorem.substr(95, -1)), text(""),
text(lorem.substr(100, -1)), text(lorem.substr(105, -1)), text(""),
text(lorem.substr(110, -1)), text(lorem.substr(115, -1)), text(""),
text(lorem.substr(120, -1)), text(lorem.substr(125, -1)), text(""),
text(lorem.substr(130, -1)), text(lorem.substr(135, -1)), text(""),
text(lorem.substr(140, -1)),
});
});
auto scrollable_content = Renderer(content, [&, content] {
return content->Render() | focusPositionRelative(scroll_x, scroll_y) |
frame | flex;
});
SliderOption<float> option_x;
option_x.value = &scroll_x;
option_x.min = 0.f;
option_x.max = 1.f;
option_x.increment = 0.1f;
option_x.direction = Direction::Right;
option_x.color_active = Color::Blue;
option_x.color_inactive = Color::BlueLight;
auto scrollbar_x = Slider(option_x);
SliderOption<float> option_y;
option_y.value = &scroll_y;
option_y.min = 0.f;
option_y.max = 1.f;
option_y.increment = 0.1f;
option_y.direction = Direction::Down;
option_y.color_active = Color::Yellow;
option_y.color_inactive = Color::YellowLight;
auto scrollbar_y = Slider(option_y);
Add(Container::Vertical({
Container::Horizontal({
scrollable_content,
scrollbar_y,
}) | flex,
Container::Horizontal({
scrollbar_x,
Renderer([] { return text(L"x"); }),
}),
}));
}
};
return Make<Impl>();
}
int main() {
auto window_1 = Window({
.inner = DummyWindowContent(),
.title = "First window",
.width = 80,
.height = 30,
});
auto window_2 = Window({
.inner = DummyWindowContent(),
.title = "My window",
.left = 40,
.top = 20,
.width = 80,
.height = 30,
});
auto window_container = Container::Stacked({
window_1,
window_2,
});
auto screen = ScreenInteractive::Fullscreen();
screen.Loop(window_container);
return EXIT_SUCCESS;
}

View File

@ -49,4 +49,4 @@ struct Pixel {
} // namespace ftxui } // namespace ftxui
#endif // FTXUI_SCREEN_PIXEL_HPP #endif // FTXUI_SCREEN_PIXEL_HPP

View File

@ -205,7 +205,7 @@ Component Button(ButtonOption option) {
Component Button(ConstStringRef label, Component Button(ConstStringRef label,
std::function<void()> on_click, std::function<void()> on_click,
ButtonOption option) { ButtonOption option) {
option.label = label; option.label = std::move(label);
option.on_click = std::move(on_click); option.on_click = std::move(on_click);
return Make<ButtonBase>(std::move(option)); return Make<ButtonBase>(std::move(option));
} }

View File

@ -47,7 +47,7 @@ Component Collapsible(ConstStringRef label, Component child, Ref<bool> show) {
return hbox({prefix, t}); return hbox({prefix, t});
}; };
Add(Container::Vertical({ Add(Container::Vertical({
Checkbox(label, show_.operator->(), opt), Checkbox(std::move(label), show_.operator->(), opt),
Maybe(std::move(child), show_.operator->()), Maybe(std::move(child), show_.operator->()),
})); }));
} }

View File

@ -5,6 +5,7 @@
#include <cassert> // for assert #include <cassert> // for assert
#include <cstddef> // for size_t #include <cstddef> // for size_t
#include <iterator> // for begin, end #include <iterator> // for begin, end
#include <memory> // for unique_ptr, make_unique
#include <utility> // for move #include <utility> // for move
#include <vector> // for vector, __alloc_traits<>::value_type #include <vector> // for vector, __alloc_traits<>::value_type

View File

@ -3,12 +3,11 @@
// the LICENSE file. // the LICENSE file.
#include "ftxui/component/component_options.hpp" #include "ftxui/component/component_options.hpp"
#include <ftxui/dom/linear_gradient.hpp> // for LinearGradient
#include <ftxui/screen/color.hpp> // for Color, Color::White, Color::Black, Color::GrayDark, Color::Blue, Color::GrayLight, Color::Red #include <ftxui/screen/color.hpp> // for Color, Color::White, Color::Black, Color::GrayDark, Color::Blue, Color::GrayLight, Color::Red
#include <memory> // for shared_ptr #include <memory> // for shared_ptr
#include <utility> // for move #include <utility> // for move
#include "ftxui/component/animation.hpp" // for Function, Duration #include "ftxui/component/animation.hpp" // for Function, Duration
#include "ftxui/dom/direction.hpp"
#include "ftxui/dom/elements.hpp" // for operator|=, Element, text, bgcolor, inverted, bold, dim, operator|, color, borderEmpty, hbox, automerge, border, borderLight #include "ftxui/dom/elements.hpp" // for operator|=, Element, text, bgcolor, inverted, bold, dim, operator|, color, borderEmpty, hbox, automerge, border, borderLight
namespace ftxui { namespace ftxui {

View File

@ -1,11 +1,11 @@
// Copyright 2021 Arthur Sonzogni. All rights reserved. // Copyright 2021 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <cstddef> // for size_t
#include <ftxui/component/event.hpp> #include <ftxui/component/event.hpp>
#include <functional> // for function #include <functional> // for function
#include <string> // for string #include <string> // for string
#include <utility>
#include "ftxui/component/component.hpp" // for Maybe, Checkbox, Make, Radiobox, Vertical, Dropdown #include "ftxui/component/component.hpp" // for Maybe, Checkbox, Make, Radiobox, Vertical, Dropdown
#include "ftxui/component/component_base.hpp" // for Component, ComponentBase #include "ftxui/component/component_base.hpp" // for Component, ComponentBase
#include "ftxui/component/component_options.hpp" // for CheckboxOption, EntryState #include "ftxui/component/component_options.hpp" // for CheckboxOption, EntryState
@ -21,7 +21,7 @@ namespace ftxui {
/// @param selected The index of the selected entry. /// @param selected The index of the selected entry.
Component Dropdown(ConstStringListRef entries, int* selected) { Component Dropdown(ConstStringListRef entries, int* selected) {
DropdownOption option; DropdownOption option;
option.radiobox.entries = entries; option.radiobox.entries = std::move(entries);
option.radiobox.selected = selected; option.radiobox.selected = selected;
return Dropdown(option); return Dropdown(option);
} }
@ -29,6 +29,7 @@ Component Dropdown(ConstStringListRef entries, int* selected) {
/// @brief A dropdown menu. /// @brief A dropdown menu.
/// @ingroup component /// @ingroup component
/// @param option The options for the dropdown. /// @param option The options for the dropdown.
// NOLINTNEXTLINE
Component Dropdown(DropdownOption option) { Component Dropdown(DropdownOption option) {
class Impl : public ComponentBase, public DropdownOption { class Impl : public ComponentBase, public DropdownOption {
public: public:

View File

@ -1,7 +1,8 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved. // Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <map> // for map #include <map> // for map
#include <string>
#include <utility> // for move #include <utility> // for move
#include "ftxui/component/event.hpp" #include "ftxui/component/event.hpp"

View File

@ -1,9 +1,8 @@
// Copyright 2022 Arthur Sonzogni. All rights reserved. // Copyright 2022 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <ftxui/component/captured_mouse.hpp> // for CapturedMouse #include <functional> // for function
#include <functional> // for function #include <utility> // for move
#include <utility> // for move
#include "ftxui/component/component.hpp" // for ComponentDecorator, Hoverable, Make #include "ftxui/component/component.hpp" // for ComponentDecorator, Hoverable, Make
#include "ftxui/component/component_base.hpp" // for ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase

View File

@ -69,10 +69,10 @@ TEST(HoverableTest, BasicCallback) {
int on_enter_2 = 0; int on_enter_2 = 0;
int on_leave_1 = 0; int on_leave_1 = 0;
int on_leave_2 = 0; int on_leave_2 = 0;
auto c1 = Hoverable( auto c1 =
BasicComponent(), [&] { on_enter_1++; }, [&] { on_leave_1++; }); Hoverable(BasicComponent(), [&] { on_enter_1++; }, [&] { on_leave_1++; });
auto c2 = Hoverable( auto c2 =
BasicComponent(), [&] { on_enter_2++; }, [&] { on_leave_2++; }); Hoverable(BasicComponent(), [&] { on_enter_2++; }, [&] { on_leave_2++; });
auto layout = Container::Horizontal({c1, c2}); auto layout = Container::Horizontal({c1, c2});
auto screen = Screen(8, 2); auto screen = Screen(8, 2);
Render(screen, layout->Render()); Render(screen, layout->Render());

View File

@ -5,13 +5,11 @@
#include <cstddef> // for size_t #include <cstddef> // for size_t
#include <cstdint> // for uint32_t #include <cstdint> // for uint32_t
#include <functional> // for function #include <functional> // for function
#include <memory> // for allocator, shared_ptr, allocator_traits<>::value_type #include <sstream> // for basic_istream, stringstream
#include <sstream> // for basic_istream, stringstream #include <string> // for string, basic_string, operator==, getline
#include <string> // for string, basic_string, operator==, getline #include <utility> // for move
#include <utility> // for move #include <vector> // for vector
#include <vector> // for vector
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
#include "ftxui/component/component.hpp" // for Make, Input #include "ftxui/component/component.hpp" // for Make, Input
#include "ftxui/component/component_base.hpp" // for ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/component_options.hpp" // for InputOption #include "ftxui/component/component_options.hpp" // for InputOption
@ -134,7 +132,7 @@ class InputBase : public ComponentBase, public InputOption {
break; break;
} }
cursor_char_index -= line.size() + 1; cursor_char_index -= static_cast<int>(line.size() + 1);
cursor_line++; cursor_line++;
} }
@ -164,7 +162,7 @@ class InputBase : public ComponentBase, public InputOption {
// The cursor is on this line. // The cursor is on this line.
const int glyph_start = cursor_char_index; const int glyph_start = cursor_char_index;
const int glyph_end = GlyphNext(line, glyph_start); const int glyph_end = static_cast<int>(GlyphNext(line, glyph_start));
const std::string part_before_cursor = line.substr(0, glyph_start); const std::string part_before_cursor = line.substr(0, glyph_start);
const std::string part_at_cursor = const std::string part_at_cursor =
line.substr(glyph_start, glyph_end - glyph_start); line.substr(glyph_start, glyph_end - glyph_start);
@ -206,7 +204,7 @@ class InputBase : public ComponentBase, public InputOption {
const size_t start = GlyphPrevious(content(), cursor_position()); const size_t start = GlyphPrevious(content(), cursor_position());
const size_t end = cursor_position(); const size_t end = cursor_position();
content->erase(start, end - start); content->erase(start, end - start);
cursor_position() = start; cursor_position() = static_cast<int>(start);
on_change(); on_change();
return true; return true;
} }
@ -234,7 +232,8 @@ class InputBase : public ComponentBase, public InputOption {
return false; return false;
} }
cursor_position() = GlyphPrevious(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphPrevious(content(), cursor_position()));
return true; return true;
} }
@ -243,7 +242,8 @@ class InputBase : public ComponentBase, public InputOption {
return false; return false;
} }
cursor_position() = GlyphNext(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
return true; return true;
} }
@ -258,7 +258,7 @@ class InputBase : public ComponentBase, public InputOption {
if (content()[iter] == '\n') { if (content()[iter] == '\n') {
break; break;
} }
width += GlyphWidth(content(), iter); width += static_cast<int>(GlyphWidth(content(), iter));
} }
return width; return width;
} }
@ -271,8 +271,9 @@ class InputBase : public ComponentBase, public InputOption {
return; return;
} }
columns -= GlyphWidth(content(), cursor_position()); columns -= static_cast<int>(GlyphWidth(content(), cursor_position()));
cursor_position() = GlyphNext(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
} }
} }
@ -292,9 +293,10 @@ class InputBase : public ComponentBase, public InputOption {
if (content()[previous] == '\n') { if (content()[previous] == '\n') {
break; break;
} }
cursor_position() = previous; cursor_position() = static_cast<int>(previous);
} }
cursor_position() = GlyphPrevious(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphPrevious(content(), cursor_position()));
while (true) { while (true) {
if (cursor_position() == 0) { if (cursor_position() == 0) {
break; break;
@ -303,10 +305,10 @@ class InputBase : public ComponentBase, public InputOption {
if (content()[previous] == '\n') { if (content()[previous] == '\n') {
break; break;
} }
cursor_position() = previous; cursor_position() = static_cast<int>(previous);
} }
MoveCursorColumn(columns); MoveCursorColumn(static_cast<int>(columns));
return true; return true;
} }
@ -322,14 +324,16 @@ class InputBase : public ComponentBase, public InputOption {
if (content()[cursor_position()] == '\n') { if (content()[cursor_position()] == '\n') {
break; break;
} }
cursor_position() = GlyphNext(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
if (cursor_position() == (int)content().size()) { if (cursor_position() == (int)content().size()) {
return true; return true;
} }
} }
cursor_position() = GlyphNext(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
MoveCursorColumn(columns); MoveCursorColumn(static_cast<int>(columns));
return true; return true;
} }
@ -339,7 +343,7 @@ class InputBase : public ComponentBase, public InputOption {
} }
bool HandleEnd() { bool HandleEnd() {
cursor_position() = content->size(); cursor_position() = static_cast<int>(content->size());
return true; return true;
} }
@ -357,7 +361,7 @@ class InputBase : public ComponentBase, public InputOption {
DeleteImpl(); DeleteImpl();
} }
content->insert(cursor_position(), character); content->insert(cursor_position(), character);
cursor_position() += character.size(); cursor_position() += static_cast<int>(character.size());
on_change(); on_change();
return true; return true;
} }
@ -421,7 +425,7 @@ class InputBase : public ComponentBase, public InputOption {
if (IsWordCharacter(content(), previous)) { if (IsWordCharacter(content(), previous)) {
break; break;
} }
cursor_position() = previous; cursor_position() = static_cast<int>(previous);
} }
// Move left, as long as left is a word character: // Move left, as long as left is a word character:
while (cursor_position()) { while (cursor_position()) {
@ -429,7 +433,7 @@ class InputBase : public ComponentBase, public InputOption {
if (!IsWordCharacter(content(), previous)) { if (!IsWordCharacter(content(), previous)) {
break; break;
} }
cursor_position() = previous; cursor_position() = static_cast<int>(previous);
} }
return true; return true;
} }
@ -441,7 +445,8 @@ class InputBase : public ComponentBase, public InputOption {
// Move right, until entering a word. // Move right, until entering a word.
while (cursor_position() < (int)content().size()) { while (cursor_position() < (int)content().size()) {
cursor_position() = GlyphNext(content(), cursor_position()); cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
if (IsWordCharacter(content(), cursor_position())) { if (IsWordCharacter(content(), cursor_position())) {
break; break;
} }
@ -452,7 +457,7 @@ class InputBase : public ComponentBase, public InputOption {
if (!IsWordCharacter(content(), cursor_position())) { if (!IsWordCharacter(content(), cursor_position())) {
break; break;
} }
cursor_position() = next; cursor_position() = static_cast<int>(next);
} }
return true; return true;
@ -489,7 +494,7 @@ class InputBase : public ComponentBase, public InputOption {
break; break;
} }
cursor_char_index -= line.size() + 1; cursor_char_index -= static_cast<int>(line.size() + 1);
cursor_line++; cursor_line++;
} }
const int cursor_column = const int cursor_column =
@ -515,11 +520,13 @@ class InputBase : public ComponentBase, public InputOption {
// Convert back the new_cursor_{line,column} toward cursor_position: // Convert back the new_cursor_{line,column} toward cursor_position:
cursor_position() = 0; cursor_position() = 0;
for (int i = 0; i < new_cursor_line; ++i) { for (int i = 0; i < new_cursor_line; ++i) {
cursor_position() += lines[i].size() + 1; cursor_position() += static_cast<int>(lines[i].size() + 1);
} }
while (new_cursor_column > 0) { while (new_cursor_column > 0) {
new_cursor_column -= GlyphWidth(content(), cursor_position()); new_cursor_column -=
cursor_position() = GlyphNext(content(), cursor_position()); static_cast<int>(GlyphWidth(content(), cursor_position()));
cursor_position() =
static_cast<int>(GlyphNext(content(), cursor_position()));
} }
on_change(); on_change();

View File

@ -511,6 +511,7 @@ class MenuBase : public ComponentBase, public MenuOption {
/// entry 2 /// entry 2
/// entry 3 /// entry 3
/// ``` /// ```
// NOLINTNEXTLINE
Component Menu(MenuOption option) { Component Menu(MenuOption option) {
return Make<MenuBase>(std::move(option)); return Make<MenuBase>(std::move(option));
} }
@ -543,7 +544,7 @@ Component Menu(MenuOption option) {
/// entry 3 /// entry 3
/// ``` /// ```
Component Menu(ConstStringListRef entries, int* selected, MenuOption option) { Component Menu(ConstStringListRef entries, int* selected, MenuOption option) {
option.entries = entries; option.entries = std::move(entries);
option.selected = selected; option.selected = selected;
return Menu(option); return Menu(option);
} }
@ -554,7 +555,7 @@ Component Menu(ConstStringListRef entries, int* selected, MenuOption option) {
/// See also |Menu|. /// See also |Menu|.
/// @ingroup component /// @ingroup component
Component Toggle(ConstStringListRef entries, int* selected) { Component Toggle(ConstStringListRef entries, int* selected) {
return Menu(entries, selected, MenuOption::Toggle()); return Menu(std::move(entries), selected, MenuOption::Toggle());
} }
/// @brief A specific menu entry. They can be put into a Container::Vertical to /// @brief A specific menu entry. They can be put into a Container::Vertical to

View File

@ -204,6 +204,7 @@ class RadioboxBase : public ComponentBase, public RadioboxOption {
/// ○ entry 2 /// ○ entry 2
/// ○ entry 3 /// ○ entry 3
/// ``` /// ```
/// NOLINTNEXTLINE
Component Radiobox(RadioboxOption option) { Component Radiobox(RadioboxOption option) {
return Make<RadioboxBase>(std::move(option)); return Make<RadioboxBase>(std::move(option));
} }
@ -239,7 +240,7 @@ Component Radiobox(RadioboxOption option) {
Component Radiobox(ConstStringListRef entries, Component Radiobox(ConstStringListRef entries,
int* selected, int* selected,
RadioboxOption option) { RadioboxOption option) {
option.entries = entries; option.entries = std::move(entries);
option.selected = selected; option.selected = selected;
return Make<RadioboxBase>(std::move(option)); return Make<RadioboxBase>(std::move(option));
} }

View File

@ -1,34 +1,38 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved. // Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include "ftxui/component/screen_interactive.hpp"
#include <algorithm> // for copy, max, min #include <algorithm> // for copy, max, min
#include <array> // for array #include <array> // for array
#include <atomic>
#include <chrono> // for operator-, milliseconds, operator>=, duration, common_type<>::type, time_point #include <chrono> // for operator-, milliseconds, operator>=, duration, common_type<>::type, time_point
#include <csignal> // for signal, SIGTSTP, SIGABRT, SIGWINCH, raise, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM, __sighandler_t, size_t #include <csignal> // for signal, SIGTSTP, SIGABRT, SIGWINCH, raise, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM, __sighandler_t, size_t
#include <cstdio> // for fileno, stdin #include <cstdint>
#include <cstdio> // for fileno, stdin
#include <ftxui/component/task.hpp> // for Task, Closure, AnimationTask #include <ftxui/component/task.hpp> // for Task, Closure, AnimationTask
#include <ftxui/screen/screen.hpp> // for Pixel, Screen::Cursor, Screen, Screen::Cursor::Hidden #include <ftxui/screen/screen.hpp> // for Pixel, Screen::Cursor, Screen, Screen::Cursor::Hidden
#include <functional> // for function #include <functional> // for function
#include <initializer_list> // for initializer_list #include <initializer_list> // for initializer_list
#include <iostream> // for cout, ostream, operator<<, basic_ostream, endl, flush #include <iostream> // for cout, ostream, operator<<, basic_ostream, endl, flush
#include <stack> // for stack #include <memory>
#include <thread> // for thread, sleep_for #include <stack> // for stack
#include <tuple> // for _Swallow_assign, ignore #include <string>
#include <thread> // for thread, sleep_for
#include <tuple> // for _Swallow_assign, ignore
#include <type_traits> // for decay_t #include <type_traits> // for decay_t
#include <utility> // for move, swap #include <utility> // for move, swap
#include <variant> // for visit, variant #include <variant> // for visit, variant
#include <vector> // for vector #include <vector> // for vector
#include "ftxui/component/animation.hpp" // for TimePoint, Clock, Duration, Params, RequestAnimationFrame #include "ftxui/component/animation.hpp" // for TimePoint, Clock, Duration, Params, RequestAnimationFrame
#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse, CapturedMouseInterface #include "ftxui/component/captured_mouse.hpp" // for CapturedMouse, CapturedMouseInterface
#include "ftxui/component/component_base.hpp" // for ComponentBase #include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/event.hpp" // for Event #include "ftxui/component/event.hpp" // for Event
#include "ftxui/component/loop.hpp" // for Loop #include "ftxui/component/loop.hpp" // for Loop
#include "ftxui/component/receiver.hpp" // for ReceiverImpl, Sender, MakeReceiver, SenderImpl, Receiver #include "ftxui/component/receiver.hpp" // for ReceiverImpl, Sender, MakeReceiver, SenderImpl, Receiver
#include "ftxui/component/screen_interactive.hpp"
#include "ftxui/component/terminal_input_parser.hpp" // for TerminalInputParser #include "ftxui/component/terminal_input_parser.hpp" // for TerminalInputParser
#include "ftxui/dom/node.hpp" // for Node, Render #include "ftxui/dom/node.hpp" // for Node, Render
#include "ftxui/dom/requirement.hpp" // for Requirement #include "ftxui/dom/requirement.hpp" // for Requirement
#include "ftxui/screen/pixel.hpp" // for Pixel
#include "ftxui/screen/terminal.hpp" // for Dimensions, Size #include "ftxui/screen/terminal.hpp" // for Dimensions, Size
#if defined(_WIN32) #if defined(_WIN32)
@ -158,7 +162,7 @@ void ftxui_on_resize(int columns, int rows) {
#else // POSIX (Linux & Mac) #else // POSIX (Linux & Mac)
int CheckStdinReady(int usec_timeout) { int CheckStdinReady(int usec_timeout) {
timeval tv = {0, usec_timeout}; timeval tv = {0, usec_timeout}; // NOLINT
fd_set fds; fd_set fds;
FD_ZERO(&fds); // NOLINT FD_ZERO(&fds); // NOLINT
FD_SET(STDIN_FILENO, &fds); // NOLINT FD_SET(STDIN_FILENO, &fds); // NOLINT
@ -213,11 +217,11 @@ void RecordSignal(int signal) {
break; break;
#if !defined(_WIN32) #if !defined(_WIN32)
case SIGTSTP: case SIGTSTP: // NOLINT
g_signal_stop_count++; g_signal_stop_count++;
break; break;
case SIGWINCH: case SIGWINCH: // NOLINT
g_signal_resize_count++; g_signal_resize_count++;
break; break;
#endif #endif
@ -265,7 +269,7 @@ const std::string ST = "\x1b\\"; // NOLINT
const std::string DECRQSS_DECSCUSR = DCS + "$q q" + ST; // NOLINT const std::string DECRQSS_DECSCUSR = DCS + "$q q" + ST; // NOLINT
// DEC: Digital Equipment Corporation // DEC: Digital Equipment Corporation
enum class DECMode { enum class DECMode : std::uint16_t {
kLineWrap = 7, kLineWrap = 7,
kCursor = 25, kCursor = 25,
@ -284,7 +288,7 @@ enum class DECMode {
}; };
// Device Status Report (DSR) { // Device Status Report (DSR) {
enum class DSRMode { enum class DSRMode : std::uint8_t {
kCursor = 6, kCursor = 6,
}; };
@ -543,7 +547,8 @@ void ScreenInteractive::PostMain() {
// On final exit, keep the current drawing and reset cursor position one // On final exit, keep the current drawing and reset cursor position one
// line after it. // line after it.
if (!use_alternative_screen_) { if (!use_alternative_screen_) {
std::cout << std::endl; std::cout << '\n';
std::cout << std::flush;
} }
} }
} }
@ -597,7 +602,7 @@ void ScreenInteractive::Install() {
// Request the terminal to report the current cursor shape. We will restore it // Request the terminal to report the current cursor shape. We will restore it
// on exit. // on exit.
std::cout << DECRQSS_DECSCUSR; std::cout << DECRQSS_DECSCUSR;
on_exit_functions.emplace([=] { on_exit_functions.emplace([this] {
std::cout << "\033[?25h"; // Enable cursor. std::cout << "\033[?25h"; // Enable cursor.
std::cout << "\033[" + std::to_string(cursor_reset_shape_) + " q"; std::cout << "\033[" + std::to_string(cursor_reset_shape_) + " q";
}); });

View File

@ -9,7 +9,7 @@
#include <map> #include <map>
#include <memory> // for unique_ptr, allocator #include <memory> // for unique_ptr, allocator
#include <utility> // for move #include <utility> // for move
#include <vector>
#include "ftxui/component/event.hpp" // for Event #include "ftxui/component/event.hpp" // for Event
#include "ftxui/component/task.hpp" // for Task #include "ftxui/component/task.hpp" // for Task

View File

@ -5,8 +5,14 @@
#include <algorithm> #include <algorithm>
#include <ftxui/component/component.hpp> #include <ftxui/component/component.hpp>
#include <ftxui/component/component_base.hpp> #include <ftxui/component/component_base.hpp>
#include <ftxui/component/component_options.hpp>
#include <ftxui/component/screen_interactive.hpp> // for ScreenInteractive #include <ftxui/component/screen_interactive.hpp> // for ScreenInteractive
#include "ftxui/dom/node_decorator.hpp" // for NodeDecorator #include <memory>
#include <utility>
#include "ftxui/dom/elements.hpp" // for text, window, hbox, vbox, size, clear_under, reflect, emptyElement
#include "ftxui/dom/node_decorator.hpp" // for NodeDecorator
#include "ftxui/screen/color.hpp" // for Color
#include "ftxui/screen/screen.hpp" // for Screen
namespace ftxui { namespace ftxui {
@ -87,7 +93,7 @@ class ResizeDecorator : public NodeDecorator {
Element DefaultRenderState(const WindowRenderState& state) { Element DefaultRenderState(const WindowRenderState& state) {
Element element = state.inner; Element element = state.inner;
if (state.active) { if (!state.active) {
element |= dim; element |= dim;
} }
@ -206,7 +212,7 @@ class WindowImpl : public ComponentBase, public WindowOptions {
} }
// Clamp the window size. // Clamp the window size.
width() = std::max<int>(width(), title().size() + 2); width() = std::max<int>(width(), static_cast<int>(title().size() + 2));
height() = std::max<int>(height(), 2); height() = std::max<int>(height(), 2);
return true; return true;

View File

@ -2,7 +2,6 @@
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <benchmark/benchmark.h> #include <benchmark/benchmark.h>
#include <iostream>
#include "ftxui/dom/elements.hpp" // for gauge, separator, operator|, text, Element, hbox, vbox, blink, border, inverted #include "ftxui/dom/elements.hpp" // for gauge, separator, operator|, text, Element, hbox, vbox, blink, border, inverted
#include "ftxui/dom/node.hpp" // for Render #include "ftxui/dom/node.hpp" // for Render

View File

@ -8,12 +8,12 @@
#include <optional> // for optional, nullopt #include <optional> // for optional, nullopt
#include <string> // for basic_string, string #include <string> // for basic_string, string
#include <utility> // for move #include <utility> // for move
#include <vector> // for __alloc_traits<>::value_type
#include "ftxui/dom/elements.hpp" // for unpack, Element, Decorator, BorderStyle, ROUNDED, borderStyled, Elements, DASHED, DOUBLE, EMPTY, HEAVY, LIGHT, border, borderDashed, borderDouble, borderEmpty, borderHeavy, borderLight, borderRounded, borderWith, window #include "ftxui/dom/elements.hpp" // for unpack, Element, Decorator, BorderStyle, ROUNDED, borderStyled, Elements, DASHED, DOUBLE, EMPTY, HEAVY, LIGHT, border, borderDashed, borderDouble, borderEmpty, borderHeavy, borderLight, borderRounded, borderWith, window
#include "ftxui/dom/node.hpp" // for Node, Elements #include "ftxui/dom/node.hpp" // for Node, Elements
#include "ftxui/dom/requirement.hpp" // for Requirement #include "ftxui/dom/requirement.hpp" // for Requirement
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/pixel.hpp" // for Pixel
#include "ftxui/screen/screen.hpp" // for Pixel, Screen #include "ftxui/screen/screen.hpp" // for Pixel, Screen
namespace ftxui { namespace ftxui {
@ -38,7 +38,8 @@ class Border : public Node {
BorderStyle style, BorderStyle style,
std::optional<Color> foreground_color = std::nullopt) std::optional<Color> foreground_color = std::nullopt)
: Node(std::move(children)), : Node(std::move(children)),
charset_(simple_border_charset[style]), charset_(simple_border_charset[style]) // NOLINT
,
foreground_color_(foreground_color) {} // NOLINT foreground_color_(foreground_color) {} // NOLINT
const Charset& charset_; // NOLINT const Charset& charset_; // NOLINT

View File

@ -4,6 +4,7 @@
#include "ftxui/dom/box_helper.hpp" #include "ftxui/dom/box_helper.hpp"
#include <algorithm> // for max #include <algorithm> // for max
#include <vector> // for vector
namespace ftxui::box_helper { namespace ftxui::box_helper {

View File

@ -8,6 +8,7 @@
#include <cstdint> // for uint8_t #include <cstdint> // for uint8_t
#include <cstdlib> // for abs #include <cstdlib> // for abs
#include <ftxui/screen/color.hpp> // for Color #include <ftxui/screen/color.hpp> // for Color
#include <functional> // for function
#include <map> // for map #include <map> // for map
#include <memory> // for make_shared #include <memory> // for make_shared
#include <utility> // for move, pair #include <utility> // for move, pair
@ -17,6 +18,8 @@
#include "ftxui/dom/node.hpp" // for Node #include "ftxui/dom/node.hpp" // for Node
#include "ftxui/dom/requirement.hpp" // for Requirement #include "ftxui/dom/requirement.hpp" // for Requirement
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/image.hpp" // for Image
#include "ftxui/screen/pixel.hpp" // for Pixel
#include "ftxui/screen/screen.hpp" // for Pixel, Screen #include "ftxui/screen/screen.hpp" // for Pixel, Screen
#include "ftxui/screen/string.hpp" // for Utf8ToGlyphs #include "ftxui/screen/string.hpp" // for Utf8ToGlyphs
#include "ftxui/util/ref.hpp" // for ConstRef #include "ftxui/util/ref.hpp" // for ConstRef
@ -28,7 +31,7 @@ namespace {
// Base UTF8 pattern: // Base UTF8 pattern:
// 11100010 10100000 10000000 // empty // 11100010 10100000 10000000 // empty
// Pattern for the individuel dots: // Pattern for the individual dots:
// ┌──────┬───────┐ // ┌──────┬───────┐
// │dot1 │ dot4 │ // │dot1 │ dot4 │
// ├──────┼───────┤ // ├──────┼───────┤

View File

@ -2,13 +2,16 @@
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <algorithm> // for max #include <algorithm> // for max
#include <cstddef> // for size_t
#include <memory> // for __shared_ptr_access, shared_ptr, make_shared #include <memory> // for __shared_ptr_access, shared_ptr, make_shared
#include <utility> // for move #include <utility> // for move
#include <vector>
#include "ftxui/dom/elements.hpp" // for Element, Elements, dbox #include "ftxui/dom/elements.hpp" // for Element, Elements, dbox
#include "ftxui/dom/node.hpp" // for Node, Elements #include "ftxui/dom/node.hpp" // for Node, Elements
#include "ftxui/dom/requirement.hpp" // for Requirement #include "ftxui/dom/requirement.hpp" // for Requirement
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/pixel.hpp" // for Pixel
namespace ftxui { namespace ftxui {
@ -49,12 +52,13 @@ class DBox : public Node {
void Render(Screen& screen) override { void Render(Screen& screen) override {
if (children_.size() <= 1) { if (children_.size() <= 1) {
return Node::Render(screen); Node::Render(screen);
return;
} }
const int width = box_.x_max - box_.x_min + 1; const int width = box_.x_max - box_.x_min + 1;
const int height = box_.y_max - box_.y_min + 1; const int height = box_.y_max - box_.y_min + 1;
std::vector<Pixel> pixels(size_t(width * height)); std::vector<Pixel> pixels(std::size_t(width * height));
for (auto& child : children_) { for (auto& child : children_) {
child->Render(screen); child->Render(screen);
@ -67,7 +71,7 @@ class DBox : public Node {
acc->background_color = acc->background_color =
Color::Blend(acc->background_color, pixel.background_color); Color::Blend(acc->background_color, pixel.background_color);
acc->automerge = pixel.automerge || acc->automerge; acc->automerge = pixel.automerge || acc->automerge;
if (pixel.character == "") { if (pixel.character.empty()) {
acc->foreground_color = acc->foreground_color =
Color::Blend(acc->foreground_color, pixel.background_color); Color::Blend(acc->foreground_color, pixel.background_color);
} else { } else {
@ -82,7 +86,7 @@ class DBox : public Node {
acc->character = pixel.character; acc->character = pixel.character;
acc->foreground_color = pixel.foreground_color; acc->foreground_color = pixel.foreground_color;
} }
++acc; ++acc; // NOLINT
pixel = Pixel(); pixel = Pixel();
} }
@ -93,7 +97,7 @@ class DBox : public Node {
Pixel* acc = pixels.data(); Pixel* acc = pixels.data();
for (int x = 0; x < width; ++x) { for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) { for (int y = 0; y < height; ++y) {
screen.PixelAt(x + box_.x_min, y + box_.y_min) = *acc++; screen.PixelAt(x + box_.x_min, y + box_.y_min) = *acc++; // NOLINT
} }
} }
} }

View File

@ -3,7 +3,6 @@
// the LICENSE file. // the LICENSE file.
#include <memory> // for make_shared, __shared_ptr_access #include <memory> // for make_shared, __shared_ptr_access
#include <utility> // for move #include <utility> // for move
#include <vector> // for __alloc_traits<>::value_type
#include "ftxui/dom/elements.hpp" // for Element, unpack, filler, flex, flex_grow, flex_shrink, notflex, xflex, xflex_grow, xflex_shrink, yflex, yflex_grow, yflex_shrink #include "ftxui/dom/elements.hpp" // for Element, unpack, filler, flex, flex_grow, flex_shrink, notflex, xflex, xflex_grow, xflex_shrink, yflex, yflex_grow, yflex_shrink
#include "ftxui/dom/node.hpp" // for Elements, Node #include "ftxui/dom/node.hpp" // for Elements, Node

View File

@ -7,6 +7,7 @@
#include <cstddef> // for size_t #include <cstddef> // for size_t
#include <ftxui/dom/flexbox_config.hpp> // for FlexboxConfig, FlexboxConfig::Direction, FlexboxConfig::AlignContent, FlexboxConfig::JustifyContent, FlexboxConfig::Wrap, FlexboxConfig::Direction::RowInversed, FlexboxConfig::AlignItems, FlexboxConfig::Direction::Row, FlexboxConfig::Direction::Column, FlexboxConfig::Direction::ColumnInversed, FlexboxConfig::Wrap::WrapInversed, FlexboxConfig::AlignContent::Stretch, FlexboxConfig::JustifyContent::Stretch, FlexboxConfig::Wrap::Wrap, FlexboxConfig::AlignContent::Center, FlexboxConfig::AlignContent::FlexEnd, FlexboxConfig::AlignContent::FlexStart, FlexboxConfig::AlignContent::SpaceAround, FlexboxConfig::AlignContent::SpaceBetween, FlexboxConfig::AlignContent::SpaceEvenly, FlexboxConfig::AlignItems::Center, FlexboxConfig::AlignItems::FlexEnd, FlexboxConfig::AlignItems::FlexStart, FlexboxConfig::AlignItems::Stretch, FlexboxConfig::JustifyContent::Center, FlexboxConfig::JustifyContent::FlexEnd, FlexboxConfig::JustifyContent::FlexStart, FlexboxConfig::JustifyContent::SpaceAround, FlexboxConfig::JustifyContent::SpaceBetween, FlexboxConfig::JustifyContent::SpaceEvenly, FlexboxConfig::Wrap::NoWrap #include <ftxui/dom/flexbox_config.hpp> // for FlexboxConfig, FlexboxConfig::Direction, FlexboxConfig::AlignContent, FlexboxConfig::JustifyContent, FlexboxConfig::Wrap, FlexboxConfig::Direction::RowInversed, FlexboxConfig::AlignItems, FlexboxConfig::Direction::Row, FlexboxConfig::Direction::Column, FlexboxConfig::Direction::ColumnInversed, FlexboxConfig::Wrap::WrapInversed, FlexboxConfig::AlignContent::Stretch, FlexboxConfig::JustifyContent::Stretch, FlexboxConfig::Wrap::Wrap, FlexboxConfig::AlignContent::Center, FlexboxConfig::AlignContent::FlexEnd, FlexboxConfig::AlignContent::FlexStart, FlexboxConfig::AlignContent::SpaceAround, FlexboxConfig::AlignContent::SpaceBetween, FlexboxConfig::AlignContent::SpaceEvenly, FlexboxConfig::AlignItems::Center, FlexboxConfig::AlignItems::FlexEnd, FlexboxConfig::AlignItems::FlexStart, FlexboxConfig::AlignItems::Stretch, FlexboxConfig::JustifyContent::Center, FlexboxConfig::JustifyContent::FlexEnd, FlexboxConfig::JustifyContent::FlexStart, FlexboxConfig::JustifyContent::SpaceAround, FlexboxConfig::JustifyContent::SpaceBetween, FlexboxConfig::JustifyContent::SpaceEvenly, FlexboxConfig::Wrap::NoWrap
#include <utility> // for swap, move #include <utility> // for swap, move
#include <vector>
#include "ftxui/dom/box_helper.hpp" // for Element, Compute #include "ftxui/dom/box_helper.hpp" // for Element, Compute
@ -330,8 +331,8 @@ void Compute3(Global& global) {
line = Line(); line = Line();
} }
block.line = lines.size(); block.line = static_cast<int>(lines.size());
block.line_position = line.blocks.size(); block.line_position = static_cast<int>(line.blocks.size());
line.blocks.push_back(&block); line.blocks.push_back(&block);
x += block.min_size_x + global.config.gap_x; x += block.min_size_x + global.config.gap_x;
} }

View File

@ -32,7 +32,7 @@ class Reflect : public Node {
void Render(Screen& screen) final { void Render(Screen& screen) final {
reflected_box_ = Box::Intersection(screen.stencil, reflected_box_); reflected_box_ = Box::Intersection(screen.stencil, reflected_box_);
return Node::Render(screen); Node::Render(screen);
} }
private: private:

View File

@ -11,6 +11,7 @@
#include "ftxui/dom/requirement.hpp" // for Requirement #include "ftxui/dom/requirement.hpp" // for Requirement
#include "ftxui/screen/box.hpp" // for Box #include "ftxui/screen/box.hpp" // for Box
#include "ftxui/screen/color.hpp" // for Color #include "ftxui/screen/color.hpp" // for Color
#include "ftxui/screen/pixel.hpp" // for Pixel
#include "ftxui/screen/screen.hpp" // for Pixel, Screen #include "ftxui/screen/screen.hpp" // for Pixel, Screen
namespace ftxui { namespace ftxui {
@ -63,7 +64,8 @@ class SeparatorAuto : public Node {
const bool is_column = (box_.x_max == box_.x_min); const bool is_column = (box_.x_max == box_.x_min);
const bool is_line = (box_.y_min == box_.y_max); const bool is_line = (box_.y_min == box_.y_max);
const std::string c = charsets[style_][int(is_line && !is_column)]; const std::string c =
charsets[style_][int(is_line && !is_column)]; // NOLINT
for (int y = box_.y_min; y <= box_.y_max; ++y) { for (int y = box_.y_min; y <= box_.y_max; ++y) {
for (int x = box_.x_min; x <= box_.x_max; ++x) { for (int x = box_.x_min; x <= box_.x_max; ++x) {

View File

@ -6,6 +6,7 @@
#include <algorithm> // for max #include <algorithm> // for max
#include <memory> // for allocator, shared_ptr, allocator_traits<>::value_type #include <memory> // for allocator, shared_ptr, allocator_traits<>::value_type
#include <utility> // for move, swap #include <utility> // for move, swap
#include <vector> // for vector
#include "ftxui/dom/elements.hpp" // for Element, operator|, text, separatorCharacter, Elements, BorderStyle, Decorator, emptyElement, size, gridbox, EQUAL, flex, flex_shrink, HEIGHT, WIDTH #include "ftxui/dom/elements.hpp" // for Element, operator|, text, separatorCharacter, Elements, BorderStyle, Decorator, emptyElement, size, gridbox, EQUAL, flex, flex_shrink, HEIGHT, WIDTH

View File

@ -6,14 +6,12 @@
#include <array> // for array #include <array> // for array
#include <cmath> #include <cmath>
#include <cstdint> #include <cstdint>
#include <string>
#include "ftxui/screen/color_info.hpp" // for GetColorInfo, ColorInfo #include "ftxui/screen/color_info.hpp" // for GetColorInfo, ColorInfo
#include "ftxui/screen/terminal.hpp" // for ColorSupport, Color, Palette256, TrueColor #include "ftxui/screen/terminal.hpp" // for ColorSupport, Color, Palette256, TrueColor
namespace ftxui { namespace ftxui {
using namespace std::literals;
namespace { namespace {
const std::array<const char*, 33> palette16code = { const std::array<const char*, 33> palette16code = {
"30", "40", // "30", "40", //
@ -46,23 +44,33 @@ bool Color::operator!=(const Color& rhs) const {
} }
std::string Color::Print(bool is_background_color) const { std::string Color::Print(bool is_background_color) const {
switch (type_) { if (is_background_color) {
case ColorType::Palette1: switch (type_) {
return is_background_color ? "49"s : "39"s; case ColorType::Palette1:
return "49";
case ColorType::Palette16: case ColorType::Palette16:
return palette16code[2 * red_ + is_background_color]; // NOLINT; return palette16code[2 * red_ + 1]; // NOLINT
case ColorType::Palette256:
case ColorType::Palette256: return "48;5;" + std::to_string(red_);
return (is_background_color ? "48;5;"s : "38;5;"s) + std::to_string(red_); case ColorType::TrueColor:
return "48;2;" + std::to_string(red_) + ";" + std::to_string(green_) +
case ColorType::TrueColor: ";" + std::to_string(blue_);
default: }
return (is_background_color ? "48;2;"s : "38;2;"s) // } else {
+ std::to_string(red_) + ";" // switch (type_) {
+ std::to_string(green_) + ";" // case ColorType::Palette1:
+ std::to_string(blue_); // return "39";
case ColorType::Palette16:
return palette16code[2 * red_]; // NOLINT
case ColorType::Palette256:
return "38;5;" + std::to_string(red_);
case ColorType::TrueColor:
return "38;2;" + std::to_string(red_) + ";" + std::to_string(green_) +
";" + std::to_string(blue_);
}
} }
// NOTREACHED();
return "";
} }
/// @brief Build a transparent color. /// @brief Build a transparent color.

View File

@ -2,8 +2,11 @@
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <sstream> // IWYU pragma: keep #include <sstream> // IWYU pragma: keep
#include <string>
#include <vector>
#include "ftxui/screen/image.hpp" #include "ftxui/screen/image.hpp"
#include "ftxui/screen/pixel.hpp"
namespace ftxui { namespace ftxui {

View File

@ -1,13 +1,16 @@
// Copyright 2020 Arthur Sonzogni. All rights reserved. // Copyright 2020 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in // Use of this source code is governed by the MIT license that can be found in
// the LICENSE file. // the LICENSE file.
#include <cstdint> // for size_t #include <cstddef> // for size_t
#include <cstdint>
#include <iostream> // for operator<<, stringstream, basic_ostream, flush, cout, ostream #include <iostream> // for operator<<, stringstream, basic_ostream, flush, cout, ostream
#include <limits> #include <limits>
#include <map> // for _Rb_tree_const_iterator, map, operator!=, operator== #include <map> // for _Rb_tree_const_iterator, map, operator!=, operator==
#include <sstream> // IWYU pragma: keep #include <sstream> // IWYU pragma: keep
#include <utility> // for pair #include <utility> // for pair
#include "ftxui/screen/image.hpp" // for Image
#include "ftxui/screen/pixel.hpp" // for Pixel
#include "ftxui/screen/screen.hpp" #include "ftxui/screen/screen.hpp"
#include "ftxui/screen/string.hpp" // for string_width #include "ftxui/screen/string.hpp" // for string_width
#include "ftxui/screen/terminal.hpp" // for Dimensions, Size #include "ftxui/screen/terminal.hpp" // for Dimensions, Size
@ -117,11 +120,11 @@ void UpdatePixelStyle(const Screen* screen,
} }
struct TileEncoding { struct TileEncoding {
uint8_t left : 2; std::uint8_t left : 2;
uint8_t top : 2; std::uint8_t top : 2;
uint8_t right : 2; std::uint8_t right : 2;
uint8_t down : 2; std::uint8_t down : 2;
uint8_t round : 1; std::uint8_t round : 1;
// clang-format off // clang-format off
bool operator<(const TileEncoding& other) const { bool operator<(const TileEncoding& other) const {
@ -521,20 +524,20 @@ void Screen::ApplyShader() {
} }
// clang-format on // clang-format on
uint8_t Screen::RegisterHyperlink(const std::string& link) { std::uint8_t Screen::RegisterHyperlink(const std::string& link) {
for (size_t i = 0; i < hyperlinks_.size(); ++i) { for (std::size_t i = 0; i < hyperlinks_.size(); ++i) {
if (hyperlinks_[i] == link) { if (hyperlinks_[i] == link) {
return i; return i;
} }
} }
if (hyperlinks_.size() == std::numeric_limits<uint8_t>::max()) { if (hyperlinks_.size() == std::numeric_limits<std::uint8_t>::max()) {
return 0; return 0;
} }
hyperlinks_.push_back(link); hyperlinks_.push_back(link);
return hyperlinks_.size() - 1; return hyperlinks_.size() - 1;
} }
const std::string& Screen::Hyperlink(uint8_t id) const { const std::string& Screen::Hyperlink(std::uint8_t id) const {
if (id >= hyperlinks_.size()) { if (id >= hyperlinks_.size()) {
return hyperlinks_[0]; return hyperlinks_[0];
} }

View File

@ -16,6 +16,7 @@
#include <cstdint> // for uint32_t, uint8_t, uint16_t, int32_t #include <cstdint> // for uint32_t, uint8_t, uint16_t, int32_t
#include <string> // for string, basic_string, wstring #include <string> // for string, basic_string, wstring
#include <tuple> // for _Swallow_assign, ignore #include <tuple> // for _Swallow_assign, ignore
#include <vector>
#include "ftxui/screen/deprecated.hpp" // for wchar_width, wstring_width #include "ftxui/screen/deprecated.hpp" // for wchar_width, wstring_width
#include "ftxui/screen/string_internal.hpp" // for WordBreakProperty, EatCodePoint, CodepointToWordBreakProperty, GlyphCount, GlyphIterate, GlyphNext, GlyphPrevious, IsCombining, IsControl, IsFullWidth, Utf8ToWordBreakProperty #include "ftxui/screen/string_internal.hpp" // for WordBreakProperty, EatCodePoint, CodepointToWordBreakProperty, GlyphCount, GlyphIterate, GlyphNext, GlyphPrevious, IsCombining, IsControl, IsFullWidth, Utf8ToWordBreakProperty
@ -1355,7 +1356,6 @@ int string_width(const std::string& input) {
std::vector<std::string> Utf8ToGlyphs(const std::string& input) { std::vector<std::string> Utf8ToGlyphs(const std::string& input) {
std::vector<std::string> out; std::vector<std::string> out;
const std::string current;
out.reserve(input.size()); out.reserve(input.size());
size_t start = 0; size_t start = 0;
size_t end = 0; size_t end = 0;

View File

@ -48,25 +48,38 @@ Dimensions& FallbackSize() {
return g_fallback_size; return g_fallback_size;
} }
const char* Safe(const char* c) {
return (c != nullptr) ? c : "";
}
bool Contains(const std::string& s, const char* key) { bool Contains(const std::string& s, const char* key) {
return s.find(key) != std::string::npos; return s.find(key) != std::string::npos;
} }
// https://github.com/gabime/spdlog/blob/885b5473e291833b148eeac3b7ce227e582cd88b/include/spdlog/details/os-inl.h#L566
std::string getenv_safe(const char *field) {
#if defined(_MSC_VER)
#if defined(__cplusplus_winrt)
return std::string{}; // not supported under uwp
#else
size_t len = 0;
char buf[1024];
bool ok = ::getenv_s(&len, buf, sizeof(buf), field) == 0;
return ok ? buf : std::string{};
#endif
#else // revert to getenv
char *buf = ::getenv(field); // NOLINT(*-mt-unsafe)
return buf ? buf : std::string{};
#endif
}
Terminal::Color ComputeColorSupport() { Terminal::Color ComputeColorSupport() {
#if defined(__EMSCRIPTEN__) #if defined(__EMSCRIPTEN__)
return Terminal::Color::TrueColor; return Terminal::Color::TrueColor;
#endif #endif
std::string COLORTERM = Safe(std::getenv("COLORTERM")); // NOLINT std::string COLORTERM = getenv_safe("COLORTERM");
if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) { if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) {
return Terminal::Color::TrueColor; return Terminal::Color::TrueColor;
} }
std::string TERM = Safe(std::getenv("TERM")); // NOLINT std::string TERM = getenv_safe("TERM");
if (Contains(COLORTERM, "256") || Contains(TERM, "256")) { if (Contains(COLORTERM, "256") || Contains(TERM, "256")) {
return Terminal::Color::Palette256; return Terminal::Color::Palette256;
} }

View File

@ -1,3 +1,7 @@
// 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.
#include "ftxui/util/ref.hpp" #include "ftxui/util/ref.hpp"
#include <gtest/gtest.h> #include <gtest/gtest.h>