LibGUI: Update buttons' text/tooltips in Action::set_text

This allows Actions that change based on some state to update their
associated buttons' text and tooltips to match their new text. The
play/pause button in SoundPlayer (and VideoPlayer if it's merged)
will now change tooltips when the playback changes state, rather than
always displaying "Play (Space)".
This commit is contained in:
Zaggy1024 2022-10-30 04:32:51 -05:00 committed by Andreas Kling
parent 1de1d6423b
commit e20756f9f7
Notes: sideshowbarker 2024-07-17 04:59:08 +09:00
4 changed files with 23 additions and 12 deletions

View File

@ -241,6 +241,9 @@ void Action::set_text(String text)
if (m_text == text)
return;
m_text = move(text);
for_each_toolbar_button([&](auto& button) {
button.set_text_from_action();
});
for_each_menu_item([&](auto& menu_item) {
menu_item.update_from_action({});
});

View File

@ -169,6 +169,25 @@ void Button::set_action(Action& action)
set_checkable(action.is_checkable());
if (action.is_checkable())
set_checked(action.is_checked());
set_text_from_action();
}
static String create_tooltip_for_action(Action const& action)
{
StringBuilder builder;
builder.append(action.text());
if (action.shortcut().is_valid()) {
builder.append(" ("sv);
builder.append(action.shortcut().to_string());
builder.append(')');
}
return builder.to_string();
}
void Button::set_text_from_action()
{
set_text(action()->text());
set_tooltip(create_tooltip_for_action(*action()));
}
void Button::set_icon(RefPtr<Gfx::Bitmap> icon)

View File

@ -50,6 +50,7 @@ public:
Action* action() { return m_action; }
Action const* action() const { return m_action; }
void set_action(Action&);
void set_text_from_action();
virtual bool is_uncheckable() const override;

View File

@ -51,7 +51,6 @@ private:
if (action.group() && action.group()->is_exclusive())
set_exclusive(true);
set_action(action);
set_tooltip(tooltip(action));
set_focus_policy(FocusPolicy::NoFocus);
if (action.icon())
set_icon(action.icon());
@ -59,17 +58,6 @@ private:
set_text(action.text());
set_button_style(Gfx::ButtonStyle::Coolbar);
}
String tooltip(Action const& action) const
{
StringBuilder builder;
builder.append(action.text());
if (action.shortcut().is_valid()) {
builder.append(" ("sv);
builder.append(action.shortcut().to_string());
builder.append(')');
}
return builder.to_string();
}
virtual void enter_event(Core::Event& event) override
{