File: flabel.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 (239 lines) | stat: -rw-r--r-- 8,406 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
227
228
229
230
231
232
233
234
235
236
237
238
239
/***********************************************************************
* flabel.cpp - Widget FLabel                                           *
*                                                                      *
* This file is part of the FINAL CUT widget toolkit                    *
*                                                                      *
* Copyright 2014-2022 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 ▏
 *       ▕▁▁▁▁▁▁▁▁▁▏
 *            ▲
 *            │
 *       ▕▔▔▔▔▔▔▔▔▏
 *       ▕ FLabel ▏
 *       ▕▁▁▁▁▁▁▁▁▏
 */

#ifndef FLABEL_H
#define FLABEL_H

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

#include <vector>

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

namespace finalcut
{

//----------------------------------------------------------------------
// class FLabel
//----------------------------------------------------------------------

class FLabel : public FWidget
{
  public:
    // Using-declaration
    using FWidget::setEnable;

    // Constructor
    explicit FLabel (FWidget* = nullptr);
    explicit FLabel (const FString&, FWidget* = nullptr);

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

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

    // Destructor
    ~FLabel() override;

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

    // Disable move assignment operator (=)
    auto operator = (FLabel&&) noexcept -> FLabel& = delete;

    // Overloaded operators
    auto operator = (const FString&) -> FLabel&;
    template <typename typeT>
    auto operator << (const typeT&) -> FLabel&;
    auto operator << (UniChar) -> FLabel&;
    auto operator << (const wchar_t) -> FLabel&;
    auto operator >> (FString&) const -> const FLabel&;

    // Accessors
    auto getClassName() const -> FString override;
    auto getAccelWidget() -> FWidget*;
    auto getAlignment() const noexcept -> Align;
    auto getText() & -> FString&;

    // Mutators
    void setAccelWidget (FWidget* = nullptr);
    void setAlignment (Align) noexcept;
    auto setEmphasis (bool = true) noexcept -> bool;
    auto unsetEmphasis() noexcept -> bool;
    void resetColors() override;
    auto setReverseMode (bool = true) noexcept -> bool;
    auto unsetReverseMode() noexcept -> bool;
    auto setEnable (bool = true) -> bool override;
    void setNumber (uLong);
    void setNumber (long);
    void setNumber (float, int = FLT_DIG);
    void setNumber (double, int = DBL_DIG);
    void setNumber (lDouble, int = LDBL_DIG);
    void setText (const FString&);

    // Inquiries
    auto hasEmphasis() const noexcept -> bool;
    auto hasReverseMode() const noexcept -> bool;

    // Methods
    void hide() override;
    void clear();

    // Event handlers
    void onMouseDown (FMouseEvent*) override;
    void onAccel (FAccelEvent*) override;

    // Callback method
    void cb_accelWidgetDestroyed();

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

    // Methods
    void init();
    void setHotkeyAccelerator();
    auto getAlignOffset (const std::size_t) const -> std::size_t;
    void draw() override;
    void drawMultiLine();
    void drawSingleLine();
    void printHotkeyChar (wchar_t);
    void printLineContent (FString&, std::size_t);
    void printLine (FString&);

    // Data members
    FStringList  multiline_text{};
    FString      text{};
    FWidget*     accel_widget{nullptr};
    Align        alignment{Align::Left};
    std::size_t  align_offset{0};
    std::size_t  hotkeypos{NOT_SET};
    std::size_t  column_width{0};
    FColor       emphasis_color{FColor::Default};
    FColor       ellipsis_color{FColor::Default};
    bool         multiline{false};
    bool         emphasis{false};
    bool         reverse_mode{false};
};

// FLabel inline functions
//----------------------------------------------------------------------
template <typename typeT>
inline auto FLabel::operator << (const typeT& s) -> FLabel&
{
  FString str{};
  str << s;
  setText(text + str);
  return *this;
}

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

//----------------------------------------------------------------------
inline auto FLabel::getAccelWidget () -> FWidget*
{ return accel_widget; }

//----------------------------------------------------------------------
inline auto FLabel::getAlignment() const noexcept -> Align
{ return alignment; }

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

//----------------------------------------------------------------------
inline auto FLabel::setEmphasis (bool enable) noexcept -> bool
{ return (emphasis = enable); }

//----------------------------------------------------------------------
inline auto FLabel::unsetEmphasis() noexcept -> bool
{ return setEmphasis(false); }

//----------------------------------------------------------------------
inline auto FLabel::setReverseMode (bool enable) noexcept -> bool
{ return (reverse_mode = enable); }

//----------------------------------------------------------------------
inline auto FLabel::unsetReverseMode() noexcept -> bool
{ return setReverseMode(false); }

//----------------------------------------------------------------------
inline void FLabel::setNumber (uLong num)
{ setText(FString().setNumber(num)); }

//----------------------------------------------------------------------
inline void FLabel::setNumber (long num)
{ setText(FString().setNumber(num)); }

//----------------------------------------------------------------------
inline void FLabel::setNumber (float num, int precision)
{ setText(FString().setNumber(num, precision)); }

//----------------------------------------------------------------------
inline void FLabel::setNumber (double num, int precision)
{ setText(FString().setNumber(num, precision)); }

//----------------------------------------------------------------------
inline void FLabel::setNumber (lDouble num, int precision)
{ setText(FString().setNumber(num, precision)); }

//----------------------------------------------------------------------
inline auto FLabel::hasEmphasis() const noexcept -> bool
{ return emphasis; }

//----------------------------------------------------------------------
inline auto FLabel::hasReverseMode() const noexcept -> bool
{ return reverse_mode; }

//----------------------------------------------------------------------
inline void FLabel::clear()
{ text.clear(); }

}  // namespace finalcut

#endif  // FLABEL_H