50 #if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT) 51 #error "Only <final/final.h> can be included directly." 54 #include <unordered_map> 56 #include "final/menu/fmenu.h" 57 #include "final/widget/fwindow.h" 73 using FWindow::setResizable;
74 using FWindow::setMinimizable;
77 enum class ResultCode : uInt8
103 auto getClassName()
const ->
FString override;
104 virtual auto getText()
const ->
FString;
107 void setDialogWidget (
bool =
true);
108 void unsetDialogWidget();
109 void setModal (
bool =
true);
111 void setResizable (
bool =
true)
override;
112 void setMinimizable (
bool =
true)
override;
113 void setTitleBarButtonVisibility (
bool =
true);
114 void unsetTitleBarButtonVisibility();
115 void setBorder (
bool =
true);
117 void resetColors()
override;
118 virtual void setText (
const FString&);
121 auto isModal()
const -> bool;
122 auto hasBorder()
const -> bool;
125 void show()
override;
126 void hide()
override;
127 auto exec() -> ResultCode;
128 void setPos (
const FPoint&,
bool =
true)
override;
129 void move (
const FPoint&)
override;
130 auto moveUp (
int) -> bool;
131 auto moveDown (
int) -> bool;
132 auto moveLeft (
int) -> bool;
133 auto moveRight (
int) -> bool;
134 void setWidth (std::size_t,
bool =
true)
override;
135 void setHeight (std::size_t,
bool =
true)
override;
136 void setSize (
const FSize&,
bool =
true)
override;
137 auto reduceHeight (
int) -> bool;
138 auto expandHeight (
int) -> bool;
139 auto reduceWidth (
int) -> bool;
140 auto expandWidth (
int) -> bool;
141 auto zoomWindow() ->
bool override;
142 auto minimizeWindow() ->
bool override;
143 void flushChanges()
override;
144 void activateDialog();
153 void onWindowActive (
FEvent*)
override;
154 void onWindowInactive (
FEvent*)
override;
155 void onWindowRaised (
FEvent*)
override;
156 void onWindowLowered (
FEvent*)
override;
160 void adjustSize()
override;
161 void done (ResultCode);
162 void draw()
override;
163 void drawDialogShadow();
174 std::size_t menu_btn;
175 std::size_t minimize_btn;
176 std::size_t zoom_btn;
177 bool mouse_over_menu;
183 bool zoom_button_pressed{
false};
184 bool zoom_button_active{
false};
185 bool minimize_button_pressed{
false};
186 bool minimize_button_active{
false};
191 bool setPos_error{
false};
192 bool setSize_error{
false};
197 FPoint title_bar_click_pos{};
198 FPoint resize_click_pos{};
205 FRect save_geometry{};
210 FMenu* menu{
nullptr};
219 using KeyMap = std::unordered_map<FKey, std::function<void()>,
EnumHash<FKey>>;
222 static constexpr
bool PRINT_WIN_NUMBER =
false;
226 void initDialogMenu();
227 void initMoveSizeMenuItem (
FMenu*);
228 void initZoomMenuItem (
FMenu*);
229 void initMinimizeMenuItem (
FMenu*);
230 void initCloseMenuItem (
FMenu*);
231 auto initMouseStates (
const FMouseEvent&,
bool)
const -> MouseStates;
232 void mapKeyFunctions();
233 void recoverBackgroundAfterMove (
const FPoint&,
const FRect&);
234 void drawBorder()
override;
236 void drawBarButton();
237 void drawZoomButton();
238 void drawMinimizeButton();
239 void printRestoreSizeButton();
240 void printZoomedButton();
241 void printMinimizeButton();
243 void setTextBarColors()
const;
244 void printSpace (std::size_t);
245 void printTitleBarText (std::size_t&, std::size_t);
246 void clearStatusBar()
const;
247 void setCursorToFocusWidget();
250 void selectFirstMenuItem();
251 void setMoveSizeItem();
253 void setMinimizeItem();
254 auto getMenuButtonWidth()
const -> std::size_t;
255 auto getZoomButtonWidth()
const -> std::size_t;
256 auto getMinimizeButtonWidth()
const -> std::size_t;
257 void activateMinimizeButton (
const MouseStates&);
258 void deactivateMinimizeButton();
259 void leaveMinimizeButton (
const MouseStates&);
260 void pressMinimizeButton (
const MouseStates&);
261 void activateZoomButton (
const MouseStates&);
262 void deactivateZoomButton();
263 void leaveZoomButton (
const MouseStates&);
264 void pressZoomButton (
const MouseStates&);
265 auto isMouseOverMenu (
const FPoint&)
const -> bool;
266 auto isMouseOverMenuButton (
const MouseStates&)
const -> bool;
267 auto isMouseOverZoomButton (
const MouseStates&)
const -> bool;
268 auto isMouseOverMinimizeButton (
const MouseStates&)
const -> bool;
269 auto isMouseOverTitleBar (
const MouseStates&)
const -> bool;
270 void passEventToSubMenu (
const MouseStates&
272 void handleLeftMouseDown (
const MouseStates&);
273 auto isClickOnTitleBar (
const MouseStates&,
int,
int)
const -> bool;
274 void handleRightAndMiddleMouseDown (
const MouseButton&,
const MouseStates&);
276 void raiseActivateDialog();
277 void lowerActivateDialog();
278 auto isOutsideTerminal (
const FPoint&)
const -> bool;
279 auto isLeftOutside()
const -> bool;
280 auto isBottomOutside()
const -> bool;
281 auto isLowerRightResizeCorner (
const MouseStates&)
const -> bool;
282 auto noVisibleDialog()
const -> bool;
283 void resizeMouseDown (
const MouseStates&);
284 void resizeMouseUpMove (
const MouseStates&,
bool =
false);
285 auto calculateNewSize (
const MouseStates&)
const ->
FSize;
286 void cancelMouseResize();
287 void prepareToMove();
288 void handleTooltipDisplay();
289 void acceptMoveSize();
290 void cancelMoveSize();
291 static void addDialog (
FWidget*);
292 static void delDialog (
const FWidget*);
301 TitleBarFlags title_bar{};
302 ErrorFlags error_flags{
false,
false};
303 PositionData position_data{};
304 SizeData size_data{};
305 DialogMenu dialog_menu{};
309 ResultCode result_code{ResultCode::Reject};
312 friend void FMenu::hideSuperMenus()
const;
317 inline auto FDialog::getClassName()
const ->
FString 318 {
return "FDialog"; }
321 inline auto FDialog::getText()
const ->
FString 325 inline void FDialog::unsetDialogWidget()
326 { setDialogWidget(
false); }
329 inline void FDialog::unsetModal()
333 inline void FDialog::setTitleBarButtonVisibility (
bool enable)
334 { title_bar.buttons = enable; }
337 inline void FDialog::unsetTitleBarButtonVisibility()
338 { setTitleBarButtonVisibility(
false); }
341 inline void FDialog::unsetBorder()
342 { setBorder(
false); }
345 inline void FDialog::setText (
const FString& txt)
346 { tb_text.setString(txt); }
349 inline auto FDialog::isModal()
const ->
bool 350 {
return getFlags().visibility.modal; }
353 inline auto FDialog::hasBorder()
const ->
bool 354 {
return ! getFlags().feature.no_border; }
Definition: class_template.cpp:25