File: toolbar.hpp

package info (click to toggle)
sight 25.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 42,184 kB
  • sloc: cpp: 289,476; xml: 17,257; ansic: 9,878; python: 1,379; sh: 144; makefile: 33
file content (184 lines) | stat: -rw-r--r-- 6,911 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/************************************************************************
 *
 * Copyright (C) 2009-2025 IRCAD France
 * Copyright (C) 2012-2019 IHU Strasbourg
 *
 * This file is part of Sight.
 *
 * Sight is free software: you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Sight is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Sight. If not, see <https://www.gnu.org/licenses/>.
 *
 ***********************************************************************/

#pragma once

#include <sight/ui/__/config.hpp>

#include "ui/__/detail/registry/toolbar.hpp"
#include "ui/__/layout/toolbar_manager.hpp"

#include <service/base.hpp>

#include <ui/__/parameter.hpp>

namespace sight::ui
{

namespace detail::registry
{

class toolbar;

}

/**
 * @brief   Defines the service interface managing the toolbar.
 */
class SIGHT_UI_CLASS_API toolbar : public service::base
{
public:

    SIGHT_DECLARE_SERVICE(toolbar, service::base);

    /// Method called when an action service is stopping
    SIGHT_UI_API void action_service_stopping(std::string _action_srv_sid);

    /// Method called when an action service is starting
    SIGHT_UI_API void action_service_starting(std::string _action_srv_sid);

    /// Method called when the action service is activated
    SIGHT_UI_API void action_service_set_checked(std::string _action_srv_sid, bool _is_checked);

    /// Method called when the action service is executable
    SIGHT_UI_API void action_service_set_enabled(std::string _action_srv_sid, bool _is_enabled);

    /// Method called when the action service is visible
    SIGHT_UI_API void action_service_set_visible(std::string _action_srv_sid, bool _is_visible);

    /// SLOT: show/hide the container
    SIGHT_UI_API void set_visible(bool _is_visible);

    /// SLOT: return the visibility of the container
    SIGHT_UI_API bool visible() const;

    /// SLOT: show/hide the container using parameter_t (only testing bool alternative).
    SIGHT_UI_API void set_visible_by_parameter(ui::parameter_t);

    /// SLOT: show the container
    SIGHT_UI_API void show();

    /// SLOT: hide the container
    SIGHT_UI_API void hide();

    /// SLOT: enable/disable the container
    SIGHT_UI_API void set_enabled(bool _enabled);

    /// SLOT: enable the container
    SIGHT_UI_API void enable();

    /// SLOT: disable the container
    SIGHT_UI_API void disable();

protected:

    SIGHT_UI_API toolbar();
    SIGHT_UI_API ~toolbar() override = default;

    /**
     * @brief Initialize the layout and registry managers.
     *
     * Example of configuration
     * @code{.xml}
       <service uid="toolbar2" type="ui::toolbar" impl="sight::module::ui::toolbar">
           <gui>
               <layout hideActions="false" style="ToolButtonIconOnly">
                   <menuItem name="My item 2" style="radio" icon="TutoGui/system.png"/>
                   <menuItem name="My item 3" style="radio" icon="TutoGui/system.png"/>
                   <separator />
                   <menuItem name="My item A" style="radio" icon="TutoGui/monkey.png"/>
                   <menuItem name="My item B" style="radio" icon="TutoGui/monkey.png"/>
                   <separator />
                   <menu name="My menu" />
                   <separator />
                   <editor />
               </layout>
           </gui>
           <registry>
               <menuItem sid="item2" />
               <menuItem sid="item3" />
               <menuItem sid="item4" />
               <menuItem sid="item5" />
               <menu sid="menu" />
               <editor sid="editor" />
           </registry>
       </service>
       @endcode
     * - \<gui\> \</gui\> : (mandatory) describe the interface of the service.
     *   - \<layout\> \</layout\> : (mandatory) describe the layout of the service
     *     - \b hideActions: (optional, default=false): if true, the actions are hidden when they are stopped.
     *     - \b style: (optional, default=ToolButtonIconOnly):  describe the style of the tool button (possible values:
     * ToolButtonIconOnly/ToolButtonTextOnly/ToolButtonTextBesideIcon/ToolButtonTextUnderIcon/ToolButtonFollowStyle )
     * - \<registry\> \</registry\> : (mandatory) describe the service management.
     *   - \<menuItem\> represents action
     *   - \<menu\> represents menu
     *   - \<editor\> represents container service (editor, view, ...)
     *
     *  * @section Slots Slots
     * - \b set_visible(bool isVisible) : this slot shows the toolbar (if isVisible = true) or hides it.
     * - \b set_visible_by_parameter(ui::parameter_t isVisible) : this slot shows the toolbar (if isEnabled holds
     * boolean
     * alternative) or hides it.
     * - \b show() : this slot shows the toolbar.
     * - \b hide() : this slot hides the toolbar.
     *
     *   @warning
     *   - The number of item in the gui section must be EQUAL to the registry section.
     *   - The order of the item in each section (gui and registry) must be the same.\n
     *  For example: the item named "My item 2" will be connected with the service which have the sid = "item2".
     *   - A toolbar can't have the same service connected on two different buttons.
     *  @see ui::registry::toolbar::initialize(),
     *::ui::layout::toolbar_manager::initialize()
     */
    SIGHT_UI_API void initialize();

    /// Create the layout and start the managed services.
    SIGHT_UI_API void create();

    /// Destroy the layout and stop the managed services.
    SIGHT_UI_API void destroy();

    /// @brief slots: change the toolbar visibility
    struct slots
    {
        using key_t = sight::core::com::slots::key_t;
        static inline const key_t SET_VISIBLE          = "set_visible";
        static inline const key_t SET_VISIBLE_BY_PARAM = "setVisibleByParam";
        static inline const key_t SHOW                 = "show";
        static inline const key_t HIDE                 = "hide";
        static inline const key_t SET_ENABLED          = "set_enabled";
        static inline const key_t ENABLE               = "enable";
        static inline const key_t DISABLE              = "disable";
    };

private:

    void initialize_layout_manager(const ui::config_t& _layout_config);

    ui::layout::toolbar_manager::sptr m_layout_manager;
    SPTR(ui::detail::registry::toolbar) m_registry;

    /// Flag to hide or disable the actions if the service is stopped
    bool m_hide_actions {false};
};

} // namespace sight::ui