File: ftogglebutton.h

package info (click to toggle)
finalcut 0.9.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,832 kB
  • sloc: cpp: 90,264; makefile: 546; sh: 412
file content (215 lines) | stat: -rw-r--r-- 7,712 bytes parent folder | download
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/***********************************************************************
* ftogglebutton.h - Intermediate base class for a toggle button        *
*                                                                      *
* This file is part of the FINAL CUT widget toolkit                    *
*                                                                      *
* Copyright 2014-2023 Markus Gans                                      *
*                                                                      *
* FINAL CUT 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.                  *
*                                                                      *
* FINAL CUT 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 this program.  If not, see                        *
* <http://www.gnu.org/licenses/>.                                      *
***********************************************************************/

/*  Inheritance diagram
 *  ═══════════════════
 *
 * ▕▔▔▔▔▔▔▔▔▔▏ ▕▔▔▔▔▔▔▔▔▔▏
 * ▕ FVTerm  ▏ ▕ FObject ▏
 * ▕▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▏
 *      ▲           ▲
 *      │           │
 *      └─────┬─────┘
 *            │
 *       ▕▔▔▔▔▔▔▔▔▔▏
 *       ▕ FWidget ▏
 *       ▕▁▁▁▁▁▁▁▁▁▏
 *            ▲
 *            │
 *    ▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▏
 *    ▕ FToggleButton ▏
 *    ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▏
 */

#ifndef FTOGGLEBUTTON_H
#define FTOGGLEBUTTON_H

#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
  #error "Only <final/final.h> can be included directly."
#endif

#include "final/fwidget.h"

namespace finalcut
{

// class forward declaration
class FButtonGroup;

//----------------------------------------------------------------------
// class FToggleButton - abstract class for FRadioButton, FCheckBox, ...
//----------------------------------------------------------------------

class FToggleButton : public FWidget
{
  public:
    // Using-declaration
    using FWidget::setGeometry;

    // Constructors
    explicit FToggleButton (FWidget* = nullptr);
    explicit FToggleButton (const FString&, FWidget* = nullptr);

    // Disable copy constructor
    FToggleButton (const FToggleButton&) = delete;

    // Disable move constructor
    FToggleButton (FToggleButton&&) noexcept = delete;

    // Destructor
    ~FToggleButton() override;

    // Disable copy assignment operator (=)
    auto operator = (const FToggleButton&) -> FToggleButton& = delete;

    // Disable move assignment operator (=)
    auto operator = (FToggleButton&&) noexcept -> FToggleButton& = delete;
    // Accessors
    auto getClassName() const -> FString override;
    auto getText() & -> FString&;

    // Mutators
    void setSize (const FSize&, bool = true) override;
    void setGeometry (const FPoint&, const FSize&, bool = true) override;
    void resetColors() override;
    auto setNoUnderline (bool = true) -> bool;
    auto unsetNoUnderline() -> bool;
    auto setEnable (bool = true) -> bool override;
    auto unsetEnable() -> bool override;
    auto setDisable() -> bool override;
    auto setChecked (bool = true) -> bool;
    auto unsetChecked() -> bool;
    virtual void setText (const FString&);

    // Inquiries
    auto isChecked() const noexcept -> bool;
    auto hasRadiobuttonFocus() const noexcept -> bool;

    // Method
    void hide() override;

    // Event handlers
    void onMouseDown (FMouseEvent*) override;
    void onMouseUp (FMouseEvent*) override;
    void onWheel (FWheelEvent*) override;
    void onAccel (FAccelEvent*) override;
    void onFocusIn (FFocusEvent*) override;
    void onFocusOut (FFocusEvent*) override;

  protected:
    // Accessor
    auto getGroup() const -> FButtonGroup*;
    friend auto getGroup (FToggleButton& toggle_btn) -> FButtonGroup*;

    // Mutator
    void setHotkeyAccelerator();
    void setButtonWidth (std::size_t) noexcept;
    void setLabelOffsetPos (std::size_t) noexcept;

    // Inquiries
    auto isRadioButton() const -> bool;
    auto isCheckboxButton() const -> bool;
    auto hasGroup() const -> bool;

    // Methods
    void draw() override;
    void drawLabel();
    void processClick() const;
    void processToggle() const;

    // Event handler
    void onKeyPress (FKeyEvent*) override;

  private:
    // Constants
    static constexpr auto NOT_SET = static_cast<std::size_t>(-1);

    // Mutator
    void setGroup (FButtonGroup*);
    friend void setGroup (FToggleButton&, FButtonGroup*);

    // Methods
    void init();
    void drawText (const FString&, std::size_t);
    void performButtonAction();
    void correctSize (FSize&) const;

    // Data members
    FButtonGroup* button_group{nullptr};
    FString       text{};
    std::size_t   label_offset_pos{0};
    std::size_t   button_width{0};  // plus margin spaces
    bool          radiobutton_focus{false};
    bool          checked{false};
};

// FRadioButton inline functions
//----------------------------------------------------------------------
inline auto FToggleButton::getClassName() const -> FString
{ return "FToggleButton"; }

//----------------------------------------------------------------------
inline auto FToggleButton::getText() & -> FString&
{ return text; }

//----------------------------------------------------------------------
inline auto FToggleButton::unsetNoUnderline() -> bool
{ return setNoUnderline(false); }
//----------------------------------------------------------------------
inline auto FToggleButton::unsetEnable() -> bool
{ return setEnable(false); }

//----------------------------------------------------------------------
inline auto FToggleButton::setDisable() -> bool
{ return setEnable(false); }

//----------------------------------------------------------------------
inline auto FToggleButton::unsetChecked() -> bool
{ return setChecked(false); }

//----------------------------------------------------------------------
inline auto FToggleButton::isChecked() const noexcept -> bool
{ return checked; }

//----------------------------------------------------------------------
inline auto FToggleButton::hasRadiobuttonFocus() const noexcept -> bool
{ return radiobutton_focus; }

//----------------------------------------------------------------------
inline auto FToggleButton::getGroup() const -> FButtonGroup*
{ return button_group; }

//----------------------------------------------------------------------
inline void FToggleButton::setButtonWidth (std::size_t width) noexcept
{ button_width = width; }

//----------------------------------------------------------------------
inline void FToggleButton::setLabelOffsetPos (std::size_t offset) noexcept
{ label_offset_pos = offset; }

//----------------------------------------------------------------------
inline auto FToggleButton::hasGroup() const -> bool
{ return button_group; }

}  // namespace finalcut

#endif  // FTOGGLEBUTTON_H