Use of smart pointers

This commit is contained in:
Markus Gans 2018-12-19 22:04:02 +01:00
parent 554d26ca00
commit f3bdc3b410
20 changed files with 147 additions and 205 deletions

View File

@ -1,3 +1,6 @@
2018-12-19 Markus Gans <guru.mail@muenster.de>
* Use of smart pointers
2018-12-17 Markus Gans <guru.mail@muenster.de>
* Improve FButton mouse click animation
* Minor data type corrections

View File

@ -25,6 +25,7 @@
#include <cstdlib>
#include <limits>
#include <map>
#include <memory>
#include <stack>
#include <final/final.h>
@ -236,7 +237,7 @@ class Calc : public finalcut::FDialog
};
std::stack<stack_data> bracket_stack{};
std::map<Calc::button, Button*> calculator_buttons{};
std::map<Calc::button, std::shared_ptr<Button> > calculator_buttons{};
std::map<Calc::button, keyFunction> key_map{};
};
#pragma pack(pop)
@ -252,9 +253,9 @@ Calc::Calc (FWidget* parent)
setGeometry (19, 6, 37, 18);
addAccelerator('q'); // Press 'q' to quit
for (int key = 0; key < Calc::NUM_OF_BUTTONS; key++)
for (std::size_t key = 0; key < Calc::NUM_OF_BUTTONS; key++)
{
auto btn = new Button(this);
auto btn = std::make_shared<Button>(this);
button_no[key] = key;
if ( key == Equals )

View File

@ -23,14 +23,16 @@
#include <vector>
#include <final/final.h>
// Typedef
typedef std::shared_ptr<finalcut::FRadioButton> FRadioButtonPtr;
// function prototypes
// Function prototypes
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr);
void populateChoice (std::vector<finalcut::FRadioButton*>&, finalcut::FButtonGroup*);
void preset (std::vector<finalcut::FRadioButton*>&);
void populateChoice (std::vector<FRadioButtonPtr>&, finalcut::FButtonGroup&);
void preset (std::vector<FRadioButtonPtr>&);
//----------------------------------------------------------------------
// callback functions
// Callback functions
//----------------------------------------------------------------------
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
{
@ -39,22 +41,22 @@ void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
}
//----------------------------------------------------------------------
void populateChoice ( std::vector<finalcut::FRadioButton*>& os
, finalcut::FButtonGroup* group )
void populateChoice ( std::vector<FRadioButtonPtr>& os
, finalcut::FButtonGroup& group )
{
os[0] = new finalcut::FRadioButton("AIX", group);
os[1] = new finalcut::FRadioButton("Cygwin", group);
os[2] = new finalcut::FRadioButton("FreeBSD", group);
os[3] = new finalcut::FRadioButton("HP-UX", group);
os[4] = new finalcut::FRadioButton("Linux", group);
os[5] = new finalcut::FRadioButton("Mac OS X", group);
os[6] = new finalcut::FRadioButton("NetBSD", group);
os[7] = new finalcut::FRadioButton("OpenBSD", group);
os[8] = new finalcut::FRadioButton("Solaris", group);
os[0] = std::make_shared<finalcut::FRadioButton>("AIX", &group);
os[1] = std::make_shared<finalcut::FRadioButton>("Cygwin", &group);
os[2] = std::make_shared<finalcut::FRadioButton>("FreeBSD", &group);
os[3] = std::make_shared<finalcut::FRadioButton>("HP-UX", &group);
os[4] = std::make_shared<finalcut::FRadioButton>("Linux", &group);
os[5] = std::make_shared<finalcut::FRadioButton>("Mac OS X", &group);
os[6] = std::make_shared<finalcut::FRadioButton>("NetBSD", &group);
os[7] = std::make_shared<finalcut::FRadioButton>("OpenBSD", &group);
os[8] = std::make_shared<finalcut::FRadioButton>("Solaris", &group);
}
//----------------------------------------------------------------------
void preset (std::vector<finalcut::FRadioButton*>& os)
void preset (std::vector<FRadioButtonPtr>& os)
{
#if defined(_AIX)
os[0]->setChecked();
@ -111,8 +113,8 @@ int main (int argc, char* argv[])
checkButtonGroup.setGeometry (2, 1, 16, 7);
// Create radio buttons
std::vector<finalcut::FRadioButton*> os (9);
populateChoice (os, &checkButtonGroup);
std::vector<FRadioButtonPtr> os (9);
populateChoice (os, checkButtonGroup);
// Set the radio button geometry
// => checkButtonGroup.setScrollSize(...) is not required

View File

@ -31,8 +31,8 @@ void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr);
//----------------------------------------------------------------------
void cb_quit (finalcut::FWidget*, finalcut::FWidget::data_ptr data)
{
auto app = static_cast<finalcut::FApplication*>(data);
app->quit();
auto& app = *(static_cast<finalcut::FApplication*>(data));
app.quit();
}

View File

@ -29,7 +29,7 @@
// Global application object
static finalcut::FString* temp_str = nullptr;
static std::shared_ptr<finalcut::FString> temp_str { nullptr };
// Function prototypes
@ -103,7 +103,7 @@ class Listbox : public finalcut::FDialog
Listbox::Listbox (finalcut::FWidget* parent)
: finalcut::FDialog(parent)
{
temp_str = new finalcut::FString;
temp_str = std::make_shared<finalcut::FString>();
// listbox 1
//----------
@ -158,9 +158,7 @@ Listbox::Listbox (finalcut::FWidget* parent)
//----------------------------------------------------------------------
Listbox::~Listbox() // destructor
{
delete temp_str;
}
{ }
//----------------------------------------------------------------------
void Listbox::onClose (finalcut::FCloseEvent* ev)

View File

@ -189,7 +189,7 @@ void Listview::onClose (finalcut::FCloseEvent* ev)
//----------------------------------------------------------------------
void Listview::cb_showInMessagebox (finalcut::FWidget*, data_ptr)
{
auto item = listView.getCurrentItem();
const auto& item = listView.getCurrentItem();
finalcut::FMessageBox info ( "Weather in " + item->getText(1)
, " Condition: " + item->getText(2) + "\n"
"Temperature: " + item->getText(3) + "\n"

View File

@ -201,7 +201,7 @@ MainWindow::MainWindow (finalcut::FWidget* parent)
// The memory allocation for the following three sub windows occurs
// with the operator new. The lifetime of the generated widget
// is managed by the parent object (this). The operator delete
// is not required in this scope and would result in a double free.
// is not required in this class and would result in a double free.
transpwin = new Transparent(this);
transpwin->setText("transparent");
transpwin->setGeometry (6, 3, 29, 12);

View File

@ -338,10 +338,10 @@ Treeview::Treeview (finalcut::FWidget* parent)
while ( continent_list->name )
{
auto country_list = continent_list->child_element;
auto& country_list = continent_list->child_element;
finalcut::FStringList continent_line ( continent_list->begin()
, continent_list->end() );
auto iter = listView.insert (continent_line);
const auto& iter = listView.insert (continent_line);
while ( country_list && country_list->name )
{

View File

@ -757,8 +757,8 @@ void MyDialog::onClose (finalcut::FCloseEvent* ev)
//----------------------------------------------------------------------
void MyDialog::cb_noFunctionMsg (finalcut::FWidget* widget, data_ptr)
{
auto button = static_cast<finalcut::FButton*>(widget);
auto text = button->getText();
auto& button = *(static_cast<finalcut::FButton*>(widget));
auto text = button.getText();
text = text.replace('&', "");
finalcut::FMessageBox::error ( this
, "The \"" + text + "\" button has\n"
@ -884,18 +884,18 @@ void MyDialog::cb_clearInput (finalcut::FWidget*, data_ptr)
//----------------------------------------------------------------------
void MyDialog::cb_input2buttonText (finalcut::FWidget* widget, data_ptr data)
{
auto button = static_cast<finalcut::FButton*>(widget);
auto lineedit = static_cast<finalcut::FLineEdit*>(data);
button->setText(lineedit->getText());
button->redraw();
auto& button = *(static_cast<finalcut::FButton*>(widget));
const auto& lineedit = *(static_cast<finalcut::FLineEdit*>(data));
button.setText(lineedit.getText());
button.redraw();
}
//----------------------------------------------------------------------
void MyDialog::cb_setTitlebar (finalcut::FWidget* widget, data_ptr)
{
auto lineedit = static_cast<finalcut::FLineEdit*>(widget);
auto& lineedit = *(static_cast<finalcut::FLineEdit*>(widget));
finalcut::FString title;
*lineedit >> title;
lineedit >> title;
setTermTitle (title);
setText (title);
redraw();
@ -911,32 +911,32 @@ void MyDialog::cb_ProgressBar (finalcut::FWidget*, data_ptr)
//----------------------------------------------------------------------
void MyDialog::cb_updateNumber (finalcut::FWidget* widget, data_ptr data)
{
auto list = static_cast<finalcut::FListBox*>(widget);
auto num = static_cast<finalcut::FLabel*>(data);
auto count = list->getCount();
auto& list = *(static_cast<finalcut::FListBox*>(widget));
auto& num = *(static_cast<finalcut::FLabel*>(data));
const auto& count = list.getCount();
int select_num = 0;
for (std::size_t n = 1; n <= count; n++)
if ( list->isSelected(n) )
if ( list.isSelected(n) )
select_num++;
num->clear();
*num << select_num;
num->redraw();
num.clear();
num << select_num;
num.redraw();
}
//----------------------------------------------------------------------
void MyDialog::cb_activateButton (finalcut::FWidget* widget, data_ptr data)
{
auto rb = static_cast<finalcut::FRadioButton*>(widget);
auto button = static_cast<finalcut::FButton*>(data);
auto& rb = *(static_cast<finalcut::FRadioButton*>(widget));
auto& button = *(static_cast<finalcut::FButton*>(data));
if ( rb->isChecked() )
button->setEnable();
if ( rb.isChecked() )
button.setEnable();
else
button->setDisable();
button.setDisable();
button->redraw();
button.redraw();
}
//----------------------------------------------------------------------
@ -953,7 +953,7 @@ void MyDialog::cb_view (finalcut::FWidget*, data_ptr data)
if ( file.isNull() )
return;
TextWindow* view = new TextWindow(this);
const auto& view = new TextWindow(this);
finalcut::FString filename(basename(const_cast<char*>(file.c_str())));
view->setText ("Viewer: " + filename);
view->setGeometry ( 1 + int((getRootWidget()->getWidth() - 60) / 2),
@ -961,7 +961,6 @@ void MyDialog::cb_view (finalcut::FWidget*, data_ptr data)
60,
getRootWidget()->getHeight() * 3 / 4 );
view->setResizeable();
std::string line = "";
std::ifstream infile;
infile.open(file);
@ -981,10 +980,10 @@ void MyDialog::cb_view (finalcut::FWidget*, data_ptr data)
//----------------------------------------------------------------------
void MyDialog::cb_setInput (finalcut::FWidget* widget, data_ptr data)
{
auto ListBox = static_cast<finalcut::FListBox*>(widget);
auto lineedit = static_cast<finalcut::FLineEdit*>(data);
*lineedit = ListBox->getItem(ListBox->currentItem()).getText();
lineedit->redraw();
auto& ListBox = *(static_cast<finalcut::FListBox*>(widget));
auto& lineedit = *(static_cast<finalcut::FLineEdit*>(data));
lineedit = ListBox.getItem(ListBox.currentItem()).getText();
lineedit.redraw();
}

View File

@ -84,9 +84,6 @@ FApplication::FApplication ( const int& _argc
//----------------------------------------------------------------------
FApplication::~FApplication() // destructor
{
//if ( event_queue )
// delete event_queue;
app_object = nullptr;
}
@ -389,7 +386,6 @@ void FApplication::init (long key_time, long dblclick_time)
try
{
//event_queue = new eventQueue;
event_queue = std::make_shared<eventQueue>();
}
catch (const std::bad_alloc& ex)

View File

@ -1381,11 +1381,11 @@ inline void FDialog::passEventToSubMenu ( mouseStates& ms
try
{
auto _ev = new FMouseEvent (fc::MouseMove_Event, p, g, b);
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseMove_Event, p, g, b);
dialog_menu->mouse_down = true;
setClickedWidget(dialog_menu);
dialog_menu->onMouseMove(_ev);
delete _ev;
dialog_menu->onMouseMove(_ev.get());
}
catch (const std::bad_alloc& ex)
{

View File

@ -220,7 +220,7 @@ const FString FFileDialog::fileOpenChooser ( FWidget* parent
, const FString& dirname
, const FString& filter )
{
FFileDialog* fileopen;
//FFileDialog* fileopen;
FString ret;
FString path = dirname;
FString file_filter = filter;
@ -236,25 +236,16 @@ const FString FFileDialog::fileOpenChooser ( FWidget* parent
if ( file_filter.isNull() || file_filter.isEmpty() )
file_filter = FString("*");
try
{
fileopen = new FFileDialog ( path
, file_filter
, FFileDialog::Open
, parent );
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
return FString();
}
FFileDialog fileopen ( path
, file_filter
, FFileDialog::Open
, parent );
if ( fileopen->exec() == FDialog::Accept )
ret = fileopen->getPath() + fileopen->getSelectedFile();
if ( fileopen.exec() == FDialog::Accept )
ret = fileopen.getPath() + fileopen.getSelectedFile();
else
ret = FString();
delete fileopen;
return ret;
}
@ -263,7 +254,6 @@ const FString FFileDialog::fileSaveChooser ( FWidget* parent
, const FString& dirname
, const FString& filter )
{
FFileDialog* fileopen;
FString ret;
FString path = dirname;
FString file_filter = filter;
@ -279,25 +269,16 @@ const FString FFileDialog::fileSaveChooser ( FWidget* parent
if ( file_filter.isNull() || file_filter.isEmpty() )
file_filter = FString("*");
try
{
fileopen = new FFileDialog ( path
, file_filter
, FFileDialog::Save
, parent );
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
return FString();
}
FFileDialog fileopen ( path
, file_filter
, FFileDialog::Save
, parent );
if ( fileopen->exec() == FDialog::Accept )
ret = fileopen->getPath() + fileopen->getSelectedFile();
if ( fileopen.exec() == FDialog::Accept )
ret = fileopen.getPath() + fileopen.getSelectedFile();
else
ret = FString();
delete fileopen;
return ret;
}

View File

@ -277,9 +277,9 @@ void FLabel::onMouseDown (FMouseEvent* ev)
try
{
auto _ev = new FMouseEvent (fc::MouseDown_Event, p, tp, b);
FApplication::sendEvent (parent, _ev);
delete _ev;
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseDown_Event, p, tp, b);
FApplication::sendEvent (parent, _ev.get());
}
catch (const std::bad_alloc& ex)
{

View File

@ -918,11 +918,11 @@ void FMenu::passEventToSubMenu (FMouseEvent*& ev)
try
{
auto _ev = new FMouseEvent (fc::MouseMove_Event, p, t, b);
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseMove_Event, p, t, b);
opened_sub_menu->mouse_down = true;
setClickedWidget(opened_sub_menu);
opened_sub_menu->onMouseMove(_ev);
delete _ev;
opened_sub_menu->onMouseMove(_ev.get());
}
catch (const std::bad_alloc& ex)
{
@ -935,18 +935,18 @@ void FMenu::passEventToSuperMenu (FMouseEvent*& ev)
{
// Mouse event handover to super-menu
auto smenu = superMenuAt (ev->getTermPos());
const auto& smenu = superMenuAt (ev->getTermPos());
const FPoint& t = ev->getTermPos();
const FPoint& p = smenu->termToWidgetPos(t);
int b = ev->getButton();
try
{
auto _ev = new FMouseEvent (fc::MouseMove_Event, p, t, b);
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseMove_Event, p, t, b);
smenu->mouse_down = true;
setClickedWidget(smenu);
smenu->onMouseMove(_ev);
delete _ev;
smenu->onMouseMove(_ev.get());
}
catch (const std::bad_alloc& ex)
{
@ -959,19 +959,19 @@ void FMenu::passEventToMenuBar (FMouseEvent*& ev)
{
// Mouse event handover to the menu bar
auto menu_bar = getMenuBar();
const auto& menu_bar = getMenuBar();
const FPoint& t = ev->getTermPos();
const FPoint& p = menu_bar->termToWidgetPos(t);
int b = ev->getButton();
try
{
auto _ev = new FMouseEvent (fc::MouseMove_Event, p, t, b);
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseMove_Event, p, t, b);
setClickedWidget(menu_bar);
auto mbar = static_cast<FMenuBar*>(menu_bar);
mbar->mouse_down = true;
mbar->onMouseMove(_ev);
delete _ev;
auto& mbar = *(static_cast<FMenuBar*>(menu_bar));
mbar.mouse_down = true;
mbar.onMouseMove(_ev.get());
}
catch (const std::bad_alloc& ex)
{

View File

@ -976,7 +976,7 @@ void FMenuBar::passEventToMenu (FMouseEvent*& ev)
return;
// Mouse event handover to the menu
auto menu = getSelectedItem()->getMenu();
const auto& menu = getSelectedItem()->getMenu();
const auto& menu_geometry = menu->getTermGeometry();
if ( menu->getCount() > 0
@ -988,11 +988,11 @@ void FMenuBar::passEventToMenu (FMouseEvent*& ev)
try
{
auto _ev = new FMouseEvent (fc::MouseMove_Event, p, t, b);
const auto& _ev = \
std::make_shared<FMouseEvent>(fc::MouseMove_Event, p, t, b);
menu->mouse_down = true;
setClickedWidget(menu);
menu->onMouseMove(_ev);
delete _ev;
menu->onMouseMove(_ev.get());
}
catch (const std::bad_alloc& ex)
{

View File

@ -680,14 +680,14 @@ void FMenuItem::passMouseEvent ( T widget, FMouseEvent* ev
if ( ! widget )
return;
FMouseEvent* _ev;
const FPoint& t = ev->getTermPos();
const FPoint& p2 = widget->termToWidgetPos(t);
int b = ev->getButton();
std::shared_ptr<FMouseEvent> _ev;
try
{
_ev = new FMouseEvent (ev_type, p2, t, b);
_ev = std::make_shared<FMouseEvent>(ev_type, p2, t, b);
}
catch (const std::bad_alloc& ex)
{
@ -698,23 +698,21 @@ void FMenuItem::passMouseEvent ( T widget, FMouseEvent* ev
switch ( int(ev_type) )
{
case fc::MouseDoubleClick_Event:
widget->onMouseDoubleClick(_ev);
widget->onMouseDoubleClick(_ev.get());
break;
case fc::MouseDown_Event:
widget->onMouseDown(_ev);
widget->onMouseDown(_ev.get());
break;
case fc::MouseUp_Event:
widget->onMouseUp(_ev);
widget->onMouseUp(_ev.get());
break;
case fc::MouseMove_Event:
widget->onMouseMove(_ev);
widget->onMouseMove(_ev.get());
break;
}
delete _ev;
}
//----------------------------------------------------------------------

View File

@ -169,22 +169,10 @@ int FMessageBox::info ( FWidget* parent
, int button2 )
{
int reply;
FMessageBox* mbox;
try
{
mbox = new FMessageBox ( caption, message
, button0, button1, button2
, parent );
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
return FDialog::Reject;
}
reply = mbox->exec();
delete mbox;
FMessageBox mbox ( caption, message
, button0, button1, button2
, parent );
reply = mbox.exec();
return reply;
}
@ -197,23 +185,11 @@ int FMessageBox::info ( FWidget* parent
, int button2 )
{
int reply;
FMessageBox* mbox;
try
{
mbox = new FMessageBox ( caption
, FString() << num
, button0, button1, button2
, parent );
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
return FDialog::Reject;
}
reply = mbox->exec();
delete mbox;
FMessageBox mbox ( caption
, FString() << num
, button0, button1, button2
, parent );
reply = mbox.exec();
return reply;
}
@ -226,28 +202,16 @@ int FMessageBox::error ( FWidget* parent
{
int reply;
const FString& caption = "Error message";
FMessageBox* mbox;
try
{
mbox = new FMessageBox ( caption, message
, button0, button1, button2
, parent );
}
catch (const std::bad_alloc& ex)
{
std::cerr << bad_alloc_str << ex.what() << std::endl;
return FDialog::Reject;
}
mbox->beep();
mbox->setHeadline("Warning:");
mbox->setCenterText();
mbox->setForegroundColor(mbox->wc.error_box_fg);
mbox->setBackgroundColor(mbox->wc.error_box_bg);
mbox->emphasis_color = mbox->wc.error_box_emphasis_fg;
reply = mbox->exec();
delete mbox;
FMessageBox mbox ( caption, message
, button0, button1, button2
, parent );
mbox.beep();
mbox.setHeadline("Warning:");
mbox.setCenterText();
mbox.setForegroundColor(mbox.wc.error_box_fg);
mbox.setBackgroundColor(mbox.wc.error_box_bg);
mbox.emphasis_color = mbox.wc.error_box_emphasis_fg;
reply = mbox.exec();
return reply;
}

View File

@ -26,10 +26,11 @@ namespace finalcut
{
// static class attributes
bool FObject::timer_modify_lock;
FObject::TimerList* FObject::timer_list = nullptr;
bool FObject::timer_modify_lock;
FObject::TimerListPtr FObject::timer_list = nullptr;
const FString* fc::emptyFString::empty_string = nullptr;
//----------------------------------------------------------------------
// class FObject
//----------------------------------------------------------------------
@ -52,7 +53,7 @@ FObject::FObject (FObject* parent)
{
try
{
timer_list = new TimerList();
timer_list = std::make_shared<TimerList>();
}
catch (const std::bad_alloc& ex)
{
@ -69,10 +70,7 @@ FObject::~FObject() // destructor
delOwnTimer(); // Delete all timers of this object
if ( ! has_parent && timer_list )
{
delete timer_list;
timer_list = nullptr;
}
if ( ! has_parent && ! fc::emptyFString::isNull() )
fc::emptyFString::clear();

View File

@ -177,18 +177,18 @@ class FApplication : public FWidget
, const FEvent* );
// Data Members
int app_argc;
char** app_argv;
long key_timeout{100000}; // 100 ms
long dblclick_interval{500000}; // 500 ms
int app_argc;
char** app_argv;
long key_timeout{100000}; // 100 ms
long dblclick_interval{500000}; // 500 ms
static FMouseControl* mouse;
static eventQueuePtr event_queue;
static int quit_code;
static bool quit_now;
static int loop_level;
static bool process_timer_event;
static FKeyboard* keyboard;
static FWidget* keyboard_widget;
static int quit_code;
static bool quit_now;
static int loop_level;
static bool process_timer_event;
static FKeyboard* keyboard;
static FWidget* keyboard_widget;
};
#pragma pack(pop)

View File

@ -45,6 +45,7 @@
#include <cstdlib>
#include <cstring>
#include <list>
#include <memory>
#include <vector>
#include "final/emptyfstring.h"
@ -123,8 +124,9 @@ class FObject
FObject* object;
};
// Typedef
// Typedefs
typedef std::vector<timer_data> TimerList;
typedef std::shared_ptr<TimerList> TimerListPtr;
// Accessor
TimerList* getTimerList() const;
@ -144,12 +146,12 @@ class FObject
virtual void performTimerAction (const FObject*, const FEvent*);
// Data Members
FObject* parent_obj{nullptr};
FObjectList children_list{}; // no children yet
bool has_parent{false};
bool widget_object{false};
static bool timer_modify_lock;
static TimerList* timer_list;
FObject* parent_obj{nullptr};
FObjectList children_list{}; // no children yet
bool has_parent{false};
bool widget_object{false};
static bool timer_modify_lock;
static TimerListPtr timer_list;
};
#pragma pack(pop)
@ -216,7 +218,7 @@ inline bool FObject::isTimerInUpdating() const
//----------------------------------------------------------------------
inline FObject::TimerList* FObject::getTimerList() const
{ return timer_list; }
{ return timer_list.get(); }
//----------------------------------------------------------------------
inline void FObject::setWidgetProperty (bool property)