File: fbutton.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 (226 lines) | stat: -rw-r--r-- 8,277 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
216
217
218
219
220
221
222
223
224
225
226
/***********************************************************************
* fbutton.h - Widget FButton                                           *
*                                                                      *
* This file is part of the FINAL CUT widget toolkit                    *
*                                                                      *
* Copyright 2012-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 ▏
 *       ▕▁▁▁▁▁▁▁▁▁▏
 *            ▲
 *            │
 *       ▕▔▔▔▔▔▔▔▔▔▏
 *       ▕ FButton ▏
 *       ▕▁▁▁▁▁▁▁▁▁▏
 */

#ifndef FBUTTON_H
#define FBUTTON_H

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

#include "final/fwidget.h"
#include "final/fwidgetcolors.h"

namespace finalcut
{

//----------------------------------------------------------------------
// class FButton
//----------------------------------------------------------------------

class FButton : public FWidget
{
  public:
    // Constructors
    explicit FButton (FWidget* = nullptr);
    explicit FButton (FString&&, FWidget* = nullptr);

    // Destructor
    ~FButton() override;

    // Overloaded operator
    auto operator = (const FString&) -> FButton&;

    // Accessors
    auto getClassName() const -> FString override;
    auto getText() const -> FString;

    // Mutators
    void setForegroundColor (FColor) override;
    void setBackgroundColor (FColor) override;
    void setHotkeyForegroundColor (FColor);
    void setFocusForegroundColor (FColor);
    void setFocusBackgroundColor (FColor);
    void setInactiveForegroundColor (FColor);
    void setInactiveBackgroundColor (FColor);
    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 setFlat (bool = true) -> bool;
    auto unsetFlat() -> bool;
    auto setShadow (bool = true) -> bool;
    auto unsetShadow() -> bool;
    auto setDown (bool = true) -> bool;
    auto setUp() -> bool;
    auto setClickAnimation (bool = true) -> bool;
    auto unsetClickAnimation() -> bool;
    void setText (const FString&);

    // Inquiries
    auto isFlat() const -> bool;
    auto isDown() const noexcept -> bool;
    auto hasShadow() const -> bool;
    auto hasClickAnimation() const noexcept -> bool;

    // Methods
    void hide() override;

    // Event handlers
    void onKeyPress (FKeyEvent*) override;
    void onMouseDown (FMouseEvent*) override;
    void onMouseUp (FMouseEvent*) override;
    void onMouseMove (FMouseEvent*) override;
    void onWheel (FWheelEvent*) override;
    void onTimer (FTimerEvent*) override;
    void onAccel (FAccelEvent*) override;
    void onFocusIn (FFocusEvent*) override;
    void onFocusOut (FFocusEvent*) override;

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

    // Methods
    void init();
    void setHotkeyAccelerator();
    void detectHotkey();
    auto clickAnimationIndent (const FWidget*) -> std::size_t;
    void clearRightMargin (const FWidget*);
    void drawMarginLeft();
    void drawMarginRight();
    void drawTopBottomBackground();
    void printLeadingSpaces (std::size_t&);
    void setCursorPositionOnButton();
    void modifyStyle() const;
    void printButtonText (const FString&, std::size_t&);
    void printEllipsis();
    void resetStyle() const;
    void printTrailingSpaces (std::size_t);
    void drawButtonTextLine (const FString&);
    void draw() override;
    void updateButtonColor();
    void processClick() const;

    // Data members
    FString      text{};
    bool         button_down{false};
    bool         active_focus{false};
    bool         click_animation{true};
    int          click_time{150};
    wchar_t      space_char{L' '};
    FColor       button_fg{FColor::Default};
    FColor       button_bg{FColor::Default};
    FColor       button_hotkey_fg{FColor::Default};
    FColor       button_focus_fg{FColor::Default};
    FColor       button_focus_bg{FColor::Default};
    FColor       button_inactive_fg{FColor::Default};
    FColor       button_inactive_bg{FColor::Default};
    std::size_t  hotkeypos{NOT_SET};
    std::size_t  indent{0};
    std::size_t  center_offset{0};
    std::size_t  vcenter_offset{0};
    std::size_t  column_width{0};
};

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

//----------------------------------------------------------------------
inline auto FButton::getText() const -> FString
{ return text; }

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

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

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

//----------------------------------------------------------------------
inline auto FButton::unsetFlat() -> bool
{ return setFlat(false); }

//----------------------------------------------------------------------
inline auto FButton::unsetShadow() -> bool
{ return setShadow(false); }

//----------------------------------------------------------------------
inline auto FButton::setUp() -> bool
{ return setDown(false); }

//----------------------------------------------------------------------
inline auto FButton::setClickAnimation(bool enable) -> bool
{ return (click_animation = enable); }

//----------------------------------------------------------------------
inline auto FButton::unsetClickAnimation() -> bool
{ return setClickAnimation(false); }

//----------------------------------------------------------------------
inline auto FButton::isFlat() const -> bool
{ return getFlags().feature.flat; }

//----------------------------------------------------------------------
inline auto FButton::isDown() const noexcept -> bool
{ return button_down; }

//----------------------------------------------------------------------
inline auto FButton::hasShadow() const -> bool
{ return getFlags().shadow.shadow; }

//----------------------------------------------------------------------
inline auto FButton::hasClickAnimation() const noexcept -> bool
{ return click_animation; }

}  // namespace finalcut

#endif  // FBUTTON_H