mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-26 19:32:06 -05:00
eefe6e35ac
When items are sent to the overflow menu one by one, it can happen that buttons that are heavily related, and don't make sense without one another (either visually or logically) are separated. This new option enables the developer to choose the "grouping" behavior, of sending all items that are not separated to the overflow menu together, as soon as one of them doesn't have enough space to be displayed. (provided the toolbar is set as collapsible)
66 lines
1.7 KiB
C++
66 lines
1.7 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2022, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/NonnullOwnPtrVector.h>
|
|
#include <LibGUI/Button.h>
|
|
#include <LibGUI/Menu.h>
|
|
#include <LibGUI/Widget.h>
|
|
|
|
namespace GUI {
|
|
|
|
class Toolbar : public Widget {
|
|
C_OBJECT(Toolbar)
|
|
public:
|
|
virtual ~Toolbar() override = default;
|
|
|
|
ErrorOr<NonnullRefPtr<GUI::Button>> try_add_action(GUI::Action&);
|
|
ErrorOr<void> try_add_separator();
|
|
|
|
GUI::Button& add_action(GUI::Action&);
|
|
void add_separator();
|
|
|
|
bool is_collapsible() const { return m_collapsible; }
|
|
void set_collapsible(bool b) { m_collapsible = b; }
|
|
bool is_grouped() const { return m_grouped; }
|
|
void set_grouped(bool b) { m_grouped = b; }
|
|
|
|
virtual Optional<UISize> calculated_preferred_size() const override;
|
|
virtual Optional<UISize> calculated_min_size() const override;
|
|
|
|
protected:
|
|
explicit Toolbar(Gfx::Orientation = Gfx::Orientation::Horizontal, int button_size = 24);
|
|
|
|
virtual void paint_event(PaintEvent&) override;
|
|
virtual void resize_event(GUI::ResizeEvent&) override;
|
|
|
|
ErrorOr<void> update_overflow_menu();
|
|
ErrorOr<void> create_overflow_objects();
|
|
|
|
private:
|
|
struct Item {
|
|
enum class Type {
|
|
Invalid,
|
|
Separator,
|
|
Action
|
|
};
|
|
Type type { Type::Invalid };
|
|
RefPtr<Action> action;
|
|
RefPtr<Widget> widget;
|
|
};
|
|
NonnullOwnPtrVector<Item> m_items;
|
|
RefPtr<Menu> m_overflow_menu;
|
|
RefPtr<Action> m_overflow_action;
|
|
RefPtr<Button> m_overflow_button;
|
|
const Gfx::Orientation m_orientation;
|
|
int m_button_size { 24 };
|
|
bool m_collapsible { false };
|
|
bool m_grouped { false };
|
|
};
|
|
|
|
}
|