finalcut/src/include/final/fwidget.h

1050 lines
37 KiB
C
Raw Normal View History

2017-11-04 07:03:53 +01:00
/***********************************************************************
* fwidget.h - Intermediate base class for all widget objects *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2015-2019 Markus Gans *
2017-11-04 07:03:53 +01:00
* *
* The 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. *
* *
* The 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
*
*
*
* FTerm
*
*
*
*
* FVTerm FObject
*
*
*
*
*
* 1 1
* FWidget -- - - - FStatusBar
* :
* :
* : 1
* :- - - - FMenuBar
* :
* :
* : *
* :- - - - FString
* :
* :
* : *
* :- - - - FEvent
* :
* :
* : *
* :- - - - FKeyEvent
* :
* :
* : *
* :- - - - FMouseEvent
* :
* :
* : *
* :- - - - FWheelEvent
* :
* :
* : *
* :- - - - FFocusEvent
* :
* :
* : *
* :- - - - FAccelEvent
* :
* :
* : *
* :- - - - FResizeEvent
* :
* :
* : *
* :- - - - FShowEvent
* :
* :
* : *
* :- - - - FHideEvent
* :
* :
* : *
* - - - - FCloseEvent
*
*/
2015-05-23 13:35:12 +02:00
#ifndef FWIDGET_H
#define FWIDGET_H
2015-05-23 13:35:12 +02:00
#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
#error "Only <final/final.h> can be included directly."
#endif
2018-11-20 21:11:04 +01:00
#include <utility>
2017-09-11 03:06:02 +02:00
#include <vector>
#include "final/fvterm.h"
#include "final/fwidgetcolors.h"
2015-05-23 13:35:12 +02:00
// Callback macros
#define F_FUNCTION_CALLBACK(h) \
reinterpret_cast<finalcut::FWidget::FCallback>((h))
#define F_METHOD_CALLBACK(i,h) \
reinterpret_cast<finalcut::FWidget*>((i)) \
, reinterpret_cast<finalcut::FWidget::FMemberCallback>((h))
namespace finalcut
{
// class forward declaration
2015-05-23 13:35:12 +02:00
class FStatusBar;
2015-08-09 23:44:11 +02:00
class FMenuBar;
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
// class FWidget
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class FWidget : public FVTerm, public FObject
2015-05-23 13:35:12 +02:00
{
2017-09-11 03:06:02 +02:00
public:
// Using-declaration
using FVTerm::setColor;
struct accelerator
{
2018-11-21 20:07:08 +01:00
FKey key;
2017-09-11 03:06:02 +02:00
FWidget* object;
};
// Typedefs
typedef std::vector<FWidget*> widgetList;
typedef std::vector<accelerator> Accelerators;
2018-12-27 00:14:46 +01:00
typedef void (*FCallback)(FWidget*, FDataPtr);
typedef void (FWidget::*FMemberCallback)(FWidget*, FDataPtr);
2017-09-11 03:06:02 +02:00
struct widget_flags // Properties of a widget ⚑
{
uInt32 shadow : 1;
uInt32 trans_shadow : 1;
uInt32 active : 1;
uInt32 visible : 1;
uInt32 shown : 1;
uInt32 hidden : 1;
uInt32 focus : 1;
uInt32 focusable : 1;
uInt32 scrollable : 1;
uInt32 resizeable : 1;
uInt32 modal : 1;
uInt32 visible_cursor : 1;
uInt32 window_widget : 1;
uInt32 dialog_widget : 1;
uInt32 menu_widget : 1;
uInt32 always_on_top : 1;
uInt32 flat : 1;
uInt32 no_underline : 1;
uInt32 : 14; // padding bits
};
2017-09-11 03:06:02 +02:00
// Constructor
explicit FWidget (FWidget* = nullptr, bool = false);
// Disable copy constructor
FWidget (const FWidget&) = delete;
2017-09-11 03:06:02 +02:00
// Destructor
2018-09-24 04:02:35 +02:00
virtual ~FWidget();
2017-09-11 03:06:02 +02:00
// Disable assignment operator (=)
FWidget& operator = (const FWidget&) = delete;
2017-09-11 03:06:02 +02:00
// Accessors
2018-12-31 06:18:39 +01:00
virtual const char* getClassName() const override;
FWidget* getRootWidget() const;
FWidget* getParentWidget() const;
static FWidget*& getMainWidget();
static FWidget*& getActiveWindow();
static FWidget*& getFocusWidget();
static FWidget*& getClickedWidget();
static FWidget*& getOpenMenu();
static FWidget*& getMoveSizeWidget();
virtual FWidget* getFirstFocusableWidget (FObjectList);
virtual FWidget* getLastFocusableWidget (FObjectList);
static FMenuBar* getMenuBar();
static FStatusBar* getStatusBar();
FString getStatusbarMessage() const;
FColor getForegroundColor() const; // get the primary
FColor getBackgroundColor() const; // widget colors
int getX() const; // positioning
int getY() const;
const FPoint getPos() const;
int getTermX() const;
int getTermY() const;
const FPoint getTermPos() const;
std::size_t getWidth() const;
std::size_t getHeight() const;
int getTopPadding() const;
int getLeftPadding() const;
int getBottomPadding() const;
int getRightPadding() const;
std::size_t getClientWidth() const;
std::size_t getClientHeight() const;
std::size_t getMaxWidth() const;
std::size_t getMaxHeight() const;
const FPoint& getShadow() const;
const FRect& getGeometry() const;
const FRect& getGeometryWithShadow();
const FRect& getTermGeometry();
const FRect& getTermGeometryWithShadow();
std::size_t getDesktopWidth();
std::size_t getDesktopHeight();
widget_flags getFlags() const;
FPoint getCursorPos();
FPoint getPrintPos();
std::vector<bool>& doubleFlatLine_ref (fc::sides);
2017-09-11 03:06:02 +02:00
// Mutators
2018-12-31 06:18:39 +01:00
static void setMainWidget (FWidget*);
static void setFocusWidget (FWidget*);
static void setClickedWidget (FWidget*);
static void setMoveSizeWidget (FWidget*);
static void setActiveWindow (FWidget*);
static void setOpenMenu (FWidget*);
virtual void setStatusbarMessage (const FString&);
bool setVisible (bool);
2018-12-31 06:18:39 +01:00
bool setVisible();
bool unsetVisible();
2018-12-31 06:18:39 +01:00
virtual bool setEnable (bool);
virtual bool setEnable();
virtual bool unsetEnable();
virtual bool setDisable();
virtual bool setVisibleCursor (bool); // input cursor visibility
virtual bool setVisibleCursor(); // for the widget
virtual bool unsetVisibleCursor();
virtual bool setFocus (bool);
virtual bool setFocus();
virtual bool unsetFocus();
void setFocusable();
void unsetFocusable();
bool ignorePadding (bool); // ignore padding from
bool ignorePadding(); // the parent widget
bool acceptPadding();
void setForegroundColor (FColor);
void setBackgroundColor (FColor);
void setColor();
virtual void setX (int, bool = true); // positioning
virtual void setY (int, bool = true);
virtual void setPos (const FPoint&, bool = true);
virtual void setPos (int, int, bool = true);
virtual void setWidth (std::size_t, bool = true);
virtual void setHeight (std::size_t, bool = true);
virtual void setSize (std::size_t, std::size_t, bool = true);
void setTopPadding (int, bool = true);
void setLeftPadding (int, bool = true);
void setBottomPadding (int, bool = true);
void setRightPadding (int, bool = true);
void setParentOffset();
void setTermOffset();
void setTermOffsetWithPadding();
void setTermSize (std::size_t, std::size_t);
virtual void setGeometry (const FRect&, bool = true);
virtual void setGeometry ( int, int
, std::size_t, std::size_t
, bool = true );
virtual void setShadowSize (int, int);
void setMinimumWidth (std::size_t);
void setMinimumHeight (std::size_t);
void setMinimumSize (std::size_t, std::size_t);
void setMaximumWidth (std::size_t);
void setMaximumHeight (std::size_t);
void setMaximumSize (std::size_t, std::size_t);
void setFixedSize (std::size_t, std::size_t);
bool setCursorPos (const FPoint&);
bool setCursorPos (int, int);
void unsetCursorPos();
void setPrintPos (const FPoint&);
void setPrintPos (int, int);
void setDoubleFlatLine (fc::sides, bool = true);
void unsetDoubleFlatLine (fc::sides);
void setDoubleFlatLine (fc::sides, int, bool = true);
void unsetDoubleFlatLine (fc::sides, int);
2017-09-11 03:06:02 +02:00
// Inquiries
2018-12-31 06:18:39 +01:00
bool isRootWidget() const;
bool isWindowWidget() const;
bool isDialogWidget() const;
bool isMenuWidget() const;
bool isVisible() const;
bool isShown() const;
bool isEnabled() const;
bool hasVisibleCursor() const;
bool hasFocus() const;
bool acceptFocus() const; // is focusable
bool isPaddingIgnored();
2017-09-11 03:06:02 +02:00
// Methods
2018-12-31 06:18:39 +01:00
static FWidget* childWidgetAt (FWidget*, const FPoint&);
static FWidget* childWidgetAt (FWidget*, int, int);
int numOfFocusableChildren();
virtual bool close();
void clearStatusbarMessage();
void addCallback ( const FString&
, FCallback
, FDataPtr = nullptr );
void addCallback ( const FString&
, FWidget*
, FMemberCallback
, FDataPtr = nullptr );
void delCallback (FCallback);
void delCallback (FWidget*);
void delCallbacks();
void emitCallback (const FString&);
void addAccelerator (FKey);
virtual void addAccelerator (FKey, FWidget*);
void delAccelerator ();
virtual void delAccelerator (FWidget*);
virtual void redraw();
virtual void resize();
virtual void show();
virtual void hide();
virtual bool focusFirstChild(); // widget focusing
virtual bool focusLastChild();
FPoint termToWidgetPos (const FPoint&);
void detectTermSize();
virtual void move (const FPoint&);
virtual void move (int, int);
void drawShadow();
void clearShadow();
void drawFlatBorder();
void clearFlatBorder();
virtual void drawBorder (int, int, int, int);
virtual void drawBorder();
static void quit();
2017-09-11 03:06:02 +02:00
// Data Members
2018-12-31 06:18:39 +01:00
static widgetList* window_list;
Accelerators* accelerator_list{nullptr};
2017-09-11 03:06:02 +02:00
protected:
struct callback_data
{
FString cb_signal;
FCallback cb_handler;
2018-12-27 00:14:46 +01:00
FDataPtr data;
2017-09-11 03:06:02 +02:00
};
struct member_callback_data
{
FString cb_signal;
FWidget* cb_instance;
FMemberCallback cb_handler;
2018-12-27 00:14:46 +01:00
FDataPtr data;
2017-09-11 03:06:02 +02:00
};
// Typedefs
typedef std::vector<callback_data> CallbackObjects;
typedef std::vector<member_callback_data> MemberCallbackObjects;
// Accessor
virtual term_area* getPrintArea() override;
virtual void addPreprocessingHandler ( FVTerm*
, FPreprocessingHandler ) override;
virtual void delPreprocessingHandler (FVTerm*) override;
// Inquiry
2018-12-31 06:18:39 +01:00
bool isChildPrintArea() const;
2017-09-11 03:06:02 +02:00
// Mutators
2018-12-31 06:18:39 +01:00
virtual void setStatusBar (FStatusBar*);
virtual void setMenuBar (FMenuBar*);
2017-09-11 03:06:02 +02:00
// Methods
2018-12-31 06:18:39 +01:00
virtual void adjustSize();
void adjustSizeGlobal();
2019-01-11 22:16:59 +01:00
void hideSize (std::size_t, std::size_t);
2018-12-31 06:18:39 +01:00
virtual bool focusNextChild(); // Change child...
virtual bool focusPrevChild(); // ...focus
2017-09-11 03:06:02 +02:00
// Event handlers
virtual bool event (FEvent*) override;
2018-12-31 06:18:39 +01:00
virtual void onKeyPress (FKeyEvent*);
virtual void onKeyUp (FKeyEvent*);
virtual void onKeyDown (FKeyEvent*);
virtual void onMouseDown (FMouseEvent*);
virtual void onMouseUp (FMouseEvent*);
virtual void onMouseDoubleClick (FMouseEvent*);
virtual void onWheel (FWheelEvent*);
virtual void onMouseMove (FMouseEvent*);
virtual void onFocusIn (FFocusEvent*);
virtual void onFocusOut (FFocusEvent*);
virtual void onChildFocusIn (FFocusEvent*);
virtual void onChildFocusOut (FFocusEvent*);
virtual void onAccel (FAccelEvent*);
virtual void onResize (FResizeEvent*);
virtual void onShow (FShowEvent*);
virtual void onHide (FHideEvent*);
virtual void onClose (FCloseEvent*);
2017-09-11 03:06:02 +02:00
// Data Members
struct widget_flags flags{};
2017-09-11 03:06:02 +02:00
static uInt modal_dialogs;
static FWidgetColors wc;
2017-09-11 03:06:02 +02:00
static widgetList* dialog_list;
static widgetList* always_on_top_list;
static widgetList* close_widget;
MemberCallbackObjects member_callback_objects{};
CallbackObjects callback_objects{};
2017-09-11 03:06:02 +02:00
private:
// Methods
2018-12-31 06:18:39 +01:00
void init();
void finish();
void insufficientSpaceAdjust();
void KeyPressEvent (FKeyEvent*);
void KeyDownEvent (FKeyEvent*);
bool changeFocus (FWidget*, FWidget*, fc::FocusTypes);
void processDestroy();
virtual void draw();
void drawWindows();
void drawChildren();
void drawTransparentShadow (int, int, int, int);
void drawBlockShadow (int, int, int, int);
void drawBox (int, int, int, int);
void drawNewFontBox (int, int, int, int);
static void setColorTheme();
2017-09-11 03:06:02 +02:00
// Data Members
FPoint widget_cursor_position{-1, -1};
2017-09-11 03:06:02 +02:00
struct widget_size_hints
{
widget_size_hints() = default;
~widget_size_hints() = default;
2017-09-11 03:06:02 +02:00
void setMinimum (std::size_t w, std::size_t h)
2017-09-11 03:06:02 +02:00
{
min_width = w;
min_height = h;
}
void setMaximum (std::size_t w, std::size_t h)
2017-09-11 03:06:02 +02:00
{
max_width = w;
max_height = h;
}
std::size_t min_width{0};
std::size_t min_height{0};
std::size_t max_width{INT_MAX};
std::size_t max_height{INT_MAX};
} size_hints{};
2017-09-11 03:06:02 +02:00
struct dbl_line_mask
{
dbl_line_mask() = default;
~dbl_line_mask() = default;
2017-09-11 03:06:02 +02:00
std::vector<bool> top{};
std::vector<bool> right{};
std::vector<bool> bottom{};
std::vector<bool> left{};
} double_flatline_mask{};
2017-09-11 03:06:02 +02:00
struct widget_padding
{
widget_padding() = default;
~widget_padding() = default;
2017-09-11 03:06:02 +02:00
int top{0};
int left{0};
int bottom{0};
int right{0};
} padding{};
2017-09-11 03:06:02 +02:00
bool ignore_padding{false};
2017-09-11 03:06:02 +02:00
// widget size
FRect wsize{1, 1, 1, 1};
FRect adjust_wsize{1, 1, 1, 1};
FRect adjust_wsize_term{};
FRect adjust_wsize_shadow{};
FRect adjust_wsize_term_shadow{};
2017-09-11 03:06:02 +02:00
// widget offset
FRect offset{};
2017-09-11 03:06:02 +02:00
// offset of the widget client area
FRect client_offset{};
2017-09-11 03:06:02 +02:00
// widget shadow size (on the right and bottom side)
FPoint wshadow{0, 0};
2017-09-11 03:06:02 +02:00
// default widget foreground and background color
FColor foreground_color{fc::Default};
FColor background_color{fc::Default};
2017-09-11 03:06:02 +02:00
FString statusbar_message{};
2017-09-11 03:06:02 +02:00
static FStatusBar* statusbar;
static FMenuBar* menubar;
static FWidget* main_widget;
static FWidget* active_window;
static FWidget* focus_widget;
static FWidget* clicked_widget;
static FWidget* open_menu;
static FWidget* move_size_widget;
2017-09-11 03:06:02 +02:00
static FWidget* show_root_widget;
static FWidget* redraw_root_widget;
static bool init_desktop;
static bool hideable;
2019-01-12 09:11:22 +01:00
// Friend classes
2017-09-11 03:06:02 +02:00
friend class FToggleButton;
friend class FScrollView;
2015-05-23 13:35:12 +02:00
};
#pragma pack(pop)
2015-10-17 19:40:43 +02:00
// FWidget inline functions
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const char* FWidget::getClassName() const
{ return "FWidget"; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getMainWidget()
{ return main_widget; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getActiveWindow() // returns active FWindow object
{ return active_window; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getFocusWidget()
{ return focus_widget; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getClickedWidget()
{ return clicked_widget; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getOpenMenu()
{ return open_menu; }
//----------------------------------------------------------------------
inline FWidget*& FWidget::getMoveSizeWidget()
{ return move_size_widget; }
//----------------------------------------------------------------------
inline FMenuBar* FWidget::getMenuBar()
{ return menubar; }
//----------------------------------------------------------------------
inline FStatusBar* FWidget::getStatusBar()
{ return statusbar; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline FString FWidget::getStatusbarMessage() const
2015-05-23 13:35:12 +02:00
{ return statusbar_message; }
//----------------------------------------------------------------------
2018-11-13 02:51:41 +01:00
inline FColor FWidget::getForegroundColor() const
{ return foreground_color; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
2018-11-13 02:51:41 +01:00
inline FColor FWidget::getBackgroundColor() const
{ return background_color; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getX() const // x-position relative to the widget
{ return adjust_wsize.getX(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getY() const // y-position relative to the widget
{ return adjust_wsize.getY(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FPoint FWidget::getPos() const // position relative to the widget
{ return adjust_wsize.getPos(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getTermX() const // x-position on terminal
{ return offset.getX1() + adjust_wsize.getX(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getTermY() const // y-position on terminal
{ return offset.getY1() + adjust_wsize.getY(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FPoint FWidget::getTermPos() const // position on terminal
{ return FPoint(getTermX(), getTermY()); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getWidth() const
{ return adjust_wsize.getWidth(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getHeight() const
{ return adjust_wsize.getHeight(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getTopPadding() const
{ return padding.top; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getLeftPadding() const
{ return padding.left; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getBottomPadding() const
{ return padding.bottom; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline int FWidget::getRightPadding() const
{ return padding.right; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getClientWidth() const
{ return client_offset.getWidth(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getClientHeight() const
{ return client_offset.getHeight(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getMaxWidth() const
{ return offset.getWidth(); }
//----------------------------------------------------------------------
inline std::size_t FWidget::getMaxHeight() const
{ return offset.getHeight(); }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FPoint& FWidget::getShadow() const
{ return wshadow; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FRect& FWidget::getGeometry() const
{ return adjust_wsize; }
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FRect& FWidget::getGeometryWithShadow()
{
adjust_wsize_shadow.setCoordinates
(
adjust_wsize.x1_ref(),
adjust_wsize.y1_ref(),
adjust_wsize.x2_ref() + wshadow.x_ref(),
adjust_wsize.y2_ref() + wshadow.y_ref()
);
return adjust_wsize_shadow;
}
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FRect& FWidget::getTermGeometry()
{
adjust_wsize_term.setCoordinates
(
adjust_wsize.x1_ref() + offset.x1_ref(),
adjust_wsize.y1_ref() + offset.y1_ref(),
adjust_wsize.x2_ref() + offset.x1_ref(),
adjust_wsize.y2_ref() + offset.y1_ref()
);
return adjust_wsize_term;
}
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline const FRect& FWidget::getTermGeometryWithShadow()
{
adjust_wsize_term_shadow.setCoordinates
(
adjust_wsize.x1_ref() + offset.x1_ref(),
adjust_wsize.y1_ref() + offset.y1_ref(),
adjust_wsize.x2_ref() + offset.x1_ref() + wshadow.x_ref(),
adjust_wsize.y2_ref() + offset.y1_ref() + wshadow.y_ref()
);
return adjust_wsize_term_shadow;
}
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
inline std::size_t FWidget::getDesktopWidth()
{ return getColumnNumber(); }
//----------------------------------------------------------------------
inline std::size_t FWidget::getDesktopHeight()
{ return getLineNumber(); }
//----------------------------------------------------------------------
inline FWidget::widget_flags FWidget::getFlags() const
{ return flags; }
//----------------------------------------------------------------------
inline FPoint FWidget::getCursorPos()
{ return widget_cursor_position; }
//----------------------------------------------------------------------
inline void FWidget::setActiveWindow (FWidget* obj)
{ active_window = obj; }
//----------------------------------------------------------------------
inline void FWidget::setFocusWidget (FWidget* obj)
{ focus_widget = obj; }
//----------------------------------------------------------------------
inline void FWidget::setClickedWidget (FWidget* obj)
{ clicked_widget = obj; }
//----------------------------------------------------------------------
inline void FWidget::setOpenMenu (FWidget* obj)
{ open_menu = obj; }
//----------------------------------------------------------------------
inline void FWidget::setMoveSizeWidget (FWidget* obj)
{ move_size_widget = obj; }
//----------------------------------------------------------------------
inline void FWidget::setStatusbarMessage (const FString& msg)
{ statusbar_message = msg; }
//----------------------------------------------------------------------
inline bool FWidget::setVisible()
{ return setVisible(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetVisible()
{ return setVisible(false); }
//----------------------------------------------------------------------
inline bool FWidget::setEnable()
{ return setEnable(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetEnable()
{ return setEnable(false); }
//----------------------------------------------------------------------
inline bool FWidget::setDisable()
{ return setEnable(false); }
//----------------------------------------------------------------------
2018-12-22 23:50:10 +01:00
inline bool FWidget::setVisibleCursor (bool enable)
{
2018-12-22 23:50:10 +01:00
flags.visible_cursor = ( enable ) ? true : (( hideable ) ? false : true);
return flags.visible_cursor;
}
//----------------------------------------------------------------------
inline bool FWidget::setVisibleCursor()
{ return setVisibleCursor(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetVisibleCursor()
{ return setVisibleCursor(false); }
//----------------------------------------------------------------------
inline bool FWidget::setFocus()
{ return setFocus(true); }
//----------------------------------------------------------------------
inline bool FWidget::unsetFocus()
{ return setFocus(false); }
//----------------------------------------------------------------------
inline void FWidget::setFocusable()
{ flags.focusable = true; }
//----------------------------------------------------------------------
inline void FWidget::unsetFocusable()
{ flags.focusable = false; }
//----------------------------------------------------------------------
2018-12-22 23:50:10 +01:00
inline bool FWidget::ignorePadding (bool enable)
{ return (ignore_padding = enable); }
//----------------------------------------------------------------------
inline bool FWidget::ignorePadding()
{ return (ignore_padding = true); }
//----------------------------------------------------------------------
inline bool FWidget::acceptPadding()
{ return (ignore_padding = false); }
//----------------------------------------------------------------------
2018-11-07 22:06:58 +01:00
inline void FWidget::setForegroundColor (FColor color)
{
// valid colors -1..254
if ( color == fc::Default || color >> 8 == 0 )
foreground_color = color;
}
//----------------------------------------------------------------------
2018-11-07 22:06:58 +01:00
inline void FWidget::setBackgroundColor (FColor color)
{
// valid colors -1..254
if ( color == fc::Default || color >> 8 == 0 )
background_color = color;
}
//----------------------------------------------------------------------
inline void FWidget::setPos (const FPoint& p, bool adjust)
{ setPos (p.getX(), p.getY(), adjust); }
2015-10-17 19:40:43 +02:00
//----------------------------------------------------------------------
inline void FWidget::setGeometry (const FRect& box, bool adjust)
{
setGeometry ( box.getX()
, box.getY()
, std::size_t(box.getWidth())
, std::size_t(box.getHeight())
2015-10-17 19:40:43 +02:00
, adjust );
}
//----------------------------------------------------------------------
inline void FWidget::setShadowSize (int right, int bottom)
{ wshadow.setPoint (right, bottom); }
//----------------------------------------------------------------------
inline void FWidget::setMinimumWidth (std::size_t min_width)
{ size_hints.setMinimum (min_width, size_hints.min_height); }
//----------------------------------------------------------------------
inline void FWidget::setMinimumHeight (std::size_t min_height)
{ size_hints.setMinimum (size_hints.min_width, min_height); }
//----------------------------------------------------------------------
2018-10-24 00:16:45 +02:00
inline void FWidget::setMinimumSize ( std::size_t min_width
, std::size_t min_height )
{ size_hints.setMinimum (min_width, min_height); }
//----------------------------------------------------------------------
inline void FWidget::setMaximumWidth (std::size_t max_width)
{ size_hints.setMaximum (max_width, size_hints.max_height); }
//----------------------------------------------------------------------
inline void FWidget::setMaximumHeight (std::size_t max_height)
{ size_hints.setMaximum (size_hints.max_width, max_height); }
//----------------------------------------------------------------------
2018-10-24 00:16:45 +02:00
inline void FWidget::setMaximumSize ( std::size_t max_width
, std::size_t max_height )
{ size_hints.setMaximum (max_width, max_height); }
//----------------------------------------------------------------------
inline void FWidget::setFixedSize (std::size_t width, std::size_t height)
{
size_hints.setMinimum (width, height);
size_hints.setMaximum (width, height);
}
2015-10-17 19:40:43 +02:00
//----------------------------------------------------------------------
inline bool FWidget::setCursorPos (const FPoint& pos)
{ return setCursorPos (pos.getX(), pos.getY()); }
//----------------------------------------------------------------------
inline void FWidget::unsetCursorPos()
2017-09-11 03:06:02 +02:00
{ setCursorPos(-1, -1); }
2015-10-17 19:40:43 +02:00
//----------------------------------------------------------------------
inline void FWidget::setPrintPos (const FPoint& pos)
{ setPrintPos (pos.getX(), pos.getY()); }
//----------------------------------------------------------------------
inline void FWidget::unsetDoubleFlatLine (fc::sides side)
{ setDoubleFlatLine(side, false); }
//----------------------------------------------------------------------
inline void FWidget::unsetDoubleFlatLine (fc::sides side, int pos)
{ setDoubleFlatLine(side, pos, false); }
//----------------------------------------------------------------------
inline bool FWidget::isRootWidget() const
{ return (! hasParent()); }
//----------------------------------------------------------------------
inline bool FWidget::isVisible() const
{ return flags.visible; }
//----------------------------------------------------------------------
inline bool FWidget::isShown() const
{ return flags.shown; }
//----------------------------------------------------------------------
inline bool FWidget::isWindowWidget() const
{ return flags.window_widget; }
//----------------------------------------------------------------------
inline bool FWidget::isDialogWidget() const
{ return flags.dialog_widget; }
//----------------------------------------------------------------------
inline bool FWidget::isMenuWidget() const
{ return flags.menu_widget; }
//----------------------------------------------------------------------
inline bool FWidget::isEnabled() const
{ return flags.active; }
//----------------------------------------------------------------------
inline bool FWidget::hasVisibleCursor() const
{ return flags.visible_cursor; }
//----------------------------------------------------------------------
inline bool FWidget::hasFocus() const
{ return flags.focus; }
//----------------------------------------------------------------------
inline bool FWidget::acceptFocus() const // is focusable
{ return flags.focusable; }
//----------------------------------------------------------------------
inline bool FWidget::isPaddingIgnored()
{ return ignore_padding; }
//----------------------------------------------------------------------
inline FWidget* FWidget::childWidgetAt (FWidget* p, const FPoint& pos)
{ return childWidgetAt (p, pos.getX(), pos.getY()); }
//----------------------------------------------------------------------
inline void FWidget::clearStatusbarMessage()
{ statusbar_message.clear(); }
//----------------------------------------------------------------------
2018-11-21 20:07:08 +01:00
inline void FWidget::addAccelerator (FKey key)
{ addAccelerator (key, this); }
//----------------------------------------------------------------------
inline void FWidget::delAccelerator()
{ delAccelerator(this); }
//----------------------------------------------------------------------
inline FPoint FWidget::termToWidgetPos (const FPoint& tPos)
{
return FPoint ( tPos.getX() + 1 - offset.getX1() - adjust_wsize.getX()
, tPos.getY() + 1 - offset.getY1() - adjust_wsize.getY() );
}
//----------------------------------------------------------------------
inline void FWidget::move (const FPoint& pos)
2018-09-24 04:02:35 +02:00
{ move(pos.getX(), pos.getY()); }
//----------------------------------------------------------------------
inline void FWidget::drawBorder()
{ drawBorder (1, 1, int(getWidth()), int(getHeight())); }
//----------------------------------------------------------------------
inline void FWidget::processDestroy()
{ emitCallback("destroy"); }
2015-05-23 13:35:12 +02:00
// Non-member elements for NewFont
2015-05-23 13:35:12 +02:00
//----------------------------------------------------------------------
const wchar_t NF_Drive[5] =
{
fc::NF_shadow_box_left,
fc::NF_shadow_box_middle,
fc::NF_shadow_box_hdd,
fc::NF_shadow_box_right,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t NF_CD_ROM[5] =
{
fc::NF_shadow_box_left,
fc::NF_shadow_box_middle,
fc::NF_shadow_box_cd,
fc::NF_shadow_box_right,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t NF_Net_Drive[5] =
{
fc::NF_shadow_box_left,
fc::NF_shadow_box_middle,
fc::NF_shadow_box_net,
fc::NF_shadow_box_right,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t CHECKBOX[4] =
{
fc::NF_shadow_box_left,
fc::NF_shadow_box_middle,
fc::NF_shadow_box_right,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t CHECKBOX_ON[4] =
{
fc::NF_shadow_box_left,
fc::NF_shadow_box_checked,
fc::NF_shadow_box_right,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t RADIO_BUTTON[4] =
{
fc::NF_radio_button1,
fc::NF_radio_button2,
fc::NF_radio_button3,
'\0'
};
2015-05-23 13:35:12 +02:00
const wchar_t CHECKED_RADIO_BUTTON[4] =
{
fc::NF_radio_button1,
fc::NF_radio_button2_checked,
fc::NF_radio_button3,
'\0'
};
2018-10-20 22:50:35 +02:00
// non-member functions
//----------------------------------------------------------------------
inline char* createBlankArray (std::size_t size)
{
char* blank;
2019-01-11 22:16:59 +01:00
if ( size == 0 )
return 0;
2018-10-20 22:50:35 +02:00
try
{
blank = new char[size + 1];
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
2018-10-20 22:50:35 +02:00
return 0;
}
std::memset(blank, ' ', size);
blank[size] = '\0';
return blank;
}
//----------------------------------------------------------------------
inline void destroyBlankArray (char blank[])
{
delete[] blank;
}
} // namespace finalcut
#endif // FWIDGET_H