Skip to content
Snippets Groups Projects
Unverified Commit 9f610a01 authored by Arthur Sonzogni's avatar Arthur Sonzogni Committed by GitHub
Browse files

Make the focused button to take the focus inside frame. (#371)

parent aebde943
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,7 @@ current (development) ...@@ -21,6 +21,7 @@ current (development)
- `Menu` can now be used in the 4 directions, using `MenuOption.direction`. - `Menu` can now be used in the 4 directions, using `MenuOption.direction`.
- `Menu` can display an animated underline, using - `Menu` can display an animated underline, using
`MenuOption.underline.enabled`. `MenuOption.underline.enabled`.
- `Button` is now taking the focus in frame.
- **breaking** All the options are now using a transform function. - **breaking** All the options are now using a transform function.
- **breaking** The `Toggle` component is now implemented using `Menu`. - **breaking** The `Toggle` component is now implemented using `Menu`.
- **bugfix** Container::Tab implements `Focusable()`. - **bugfix** Container::Tab implements `Focusable()`.
......
...@@ -2,6 +2,7 @@ set(DIRECTORY_LIB component) ...@@ -2,6 +2,7 @@ set(DIRECTORY_LIB component)
example(button) example(button)
example(button_animated) example(button_animated)
example(button_in_frame)
example(button_style) example(button_style)
example(canvas_animated) example(canvas_animated)
example(checkbox) example(checkbox)
......
#include <array> // for array
#include <memory> // for shared_ptr, __shared_ptr_access
#include <string> // for operator+, to_string
#include "ftxui/component/captured_mouse.hpp" // for ftxui
#include "ftxui/component/component.hpp" // for Checkbox, Renderer, Vertical
#include "ftxui/component/component_base.hpp" // for ComponentBase
#include "ftxui/component/screen_interactive.hpp" // for ScreenInteractive
#include "ftxui/dom/elements.hpp" // for operator|, Element, size, border, frame, vscroll_indicator, HEIGHT, LESS_THAN
using namespace ftxui;
int main(int argc, const char* argv[]) {
int counter = 0;
auto on_click = [&] { counter++; };
auto button_style = ButtonOption::Animated(Color::Default, Color::GrayDark,
Color::Default, Color::White);
auto container = Container::Vertical({});
for (int i = 0; i < 30; ++i) {
auto button =
Button("Button " + std::to_string(i), on_click, &button_style);
container->Add(button);
}
auto renderer = Renderer(container, [&] {
return vbox({
hbox({
text("Counter:"),
text(std::to_string(counter)),
}),
separator(),
container->Render() | vscroll_indicator | frame |
size(HEIGHT, LESS_THAN, 20),
}) |
border;
});
auto screen = ScreenInteractive::FitComponent();
screen.Loop(renderer);
return 0;
}
// Copyright 2022 Arthur Sonzogni. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
...@@ -69,22 +69,27 @@ Component Button(ConstStringRef label, ...@@ -69,22 +69,27 @@ Component Button(ConstStringRef label,
// Component implementation: // Component implementation:
Element Render() override { Element Render() override {
float target = Focused() ? 1.F : 0.F; // NOLINT const bool active = Active();
const bool focused = Focused();
const bool focused_or_hover = focused || mouse_hover_;
float target = focused_or_hover ? 1.F : 0.F; // NOLINT
if (target != animator_background_.to()) { if (target != animator_background_.to()) {
SetAnimationTarget(target); SetAnimationTarget(target);
} }
auto focus_management = focused ? focus : active ? select : nothing;
EntryState state = { EntryState state = {
*label_, *label_,
false, false,
Active(), active,
Focused(), focused_or_hover,
}; };
auto element = auto element =
(option_->transform ? option_->transform : DefaultTransform) // (option_->transform ? option_->transform : DefaultTransform) //
(state); (state);
return element | AnimatedColorStyle() | reflect(box_); return element | AnimatedColorStyle() | focus_management | reflect(box_);
} }
Decorator AnimatedColorStyle() { Decorator AnimatedColorStyle() {
...@@ -151,10 +156,9 @@ Component Button(ConstStringRef label, ...@@ -151,10 +156,9 @@ Component Button(ConstStringRef label,
return false; return false;
} }
TakeFocus();
if (event.mouse().button == Mouse::Left && if (event.mouse().button == Mouse::Left &&
event.mouse().motion == Mouse::Pressed) { event.mouse().motion == Mouse::Pressed) {
TakeFocus();
OnClick(); OnClick();
return true; return true;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment