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
|