finalcut/examples/watch.cpp

227 lines
6.1 KiB
C++
Raw Normal View History

2017-11-04 07:03:53 +01:00
/***********************************************************************
* watch.cpp - A watch with FSwitch widgets *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2015-2018 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/>. *
***********************************************************************/
#include <ctime>
#include <final/final.h>
//----------------------------------------------------------------------
2017-09-20 06:19:27 +02:00
// class Watch
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class Watch : public finalcut::FDialog
{
2017-09-11 03:06:02 +02:00
public:
// Constructor
explicit Watch (finalcut::FWidget* = 0);
2017-09-11 03:06:02 +02:00
// Destructor
2017-09-20 06:19:27 +02:00
~Watch();
2017-09-11 03:06:02 +02:00
// Method
void printTime();
// Event handlers
void onTimer (finalcut::FTimerEvent*);
void onClose (finalcut::FCloseEvent*);
2017-09-11 03:06:02 +02:00
// Callback methods
void cb_clock (finalcut::FWidget*, data_ptr);
void cb_seconds (finalcut::FWidget*, data_ptr);
2017-09-11 03:06:02 +02:00
protected:
// Method
void adjustSize();
private:
// Disable copy constructor
2017-09-20 06:19:27 +02:00
Watch (const Watch&);
2017-09-11 03:06:02 +02:00
// Disable assignment operator (=)
2017-09-20 06:19:27 +02:00
Watch& operator = (const Watch&);
2017-09-11 03:06:02 +02:00
// Data Members
bool sec;
finalcut::FLabel* time_label;
finalcut::FLabel* time_str;
finalcut::FSwitch* clock_sw;
finalcut::FSwitch* seconds_sw;
};
#pragma pack(pop)
//----------------------------------------------------------------------
2017-09-20 06:19:27 +02:00
Watch::Watch (FWidget* parent)
: finalcut::FDialog(parent)
2015-09-22 04:18:20 +02:00
, sec(true)
, time_label(0)
, time_str(0)
, clock_sw(0)
, seconds_sw(0)
{
setText ("Watch");
int pw = getParentWidget()->getWidth();
setGeometry (1 + (pw - 22) / 2, 3, 22, 13);
// Create labels
time_label = new finalcut::FLabel(L"Time", this);
time_label->setGeometry(5, 2, 5, 1);
time_label->setEmphasis();
time_str = new finalcut::FLabel(L"--:--:--", this);
time_str->setGeometry(10, 2, 8, 1);
// Create checkbox buttons
clock_sw = new finalcut::FSwitch(L"Clock", this);
seconds_sw = new finalcut::FSwitch(L"Seconds", this);
clock_sw->setGeometry(4, 4, 9, 1);
seconds_sw->setGeometry(2, 6, 11, 1);
sec = seconds_sw->setChecked();
// Create button
finalcut::FButton* quit_btn = new finalcut::FButton(L"&Quit", this);
2015-09-20 05:44:50 +02:00
quit_btn->setGeometry(6, 9, 9, 1);
// Connect switch signal "toggled" with a callback member function
clock_sw->addCallback
(
"toggled",
2017-09-20 06:19:27 +02:00
F_METHOD_CALLBACK (this, &Watch::cb_clock)
);
// Connect switch signal "toggled" with a callback member function
seconds_sw->addCallback
(
"toggled",
2017-09-20 06:19:27 +02:00
F_METHOD_CALLBACK (this, &Watch::cb_seconds)
);
// Connect button signal "clicked" with a callback member function
2015-09-20 05:44:50 +02:00
quit_btn->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &finalcut::FApplication::cb_exitApp)
);
}
//----------------------------------------------------------------------
2017-09-20 06:19:27 +02:00
Watch::~Watch()
{
2015-12-19 20:49:01 +01:00
delOwnTimer();
}
//----------------------------------------------------------------------
2017-09-20 06:19:27 +02:00
void Watch::printTime()
{
finalcut::FString str;
2017-09-11 03:06:02 +02:00
std::tm now;
std::time_t t;
t = std::time(0); // get current time
2017-09-11 03:06:02 +02:00
localtime_r(&t, &now);
if ( sec )
2017-09-11 03:06:02 +02:00
str.sprintf("%02d:%02d:%02d", now.tm_hour, now.tm_min, now.tm_sec);
else
2017-09-11 03:06:02 +02:00
str.sprintf("%02d:%02d ", now.tm_hour, now.tm_min);
*time_str = str;
time_str->redraw();
}
//----------------------------------------------------------------------
void Watch::onTimer (finalcut::FTimerEvent*)
{
printTime();
}
//----------------------------------------------------------------------
void Watch::onClose (finalcut::FCloseEvent* ev)
{
finalcut::FApplication::closeConfirmationDialog (this, ev);
}
//----------------------------------------------------------------------
void Watch::cb_clock (finalcut::FWidget*, data_ptr)
{
if ( clock_sw->isChecked() )
{
printTime();
addTimer(1000);
}
else
{
delAllTimer();
*time_str = "--:--:--";
time_str->redraw();
}
}
//----------------------------------------------------------------------
void Watch::cb_seconds (finalcut::FWidget*, data_ptr)
{
if ( seconds_sw->isChecked() )
sec = true;
else
sec = false;
if ( clock_sw->isChecked() )
printTime();
else
{
if ( sec )
*time_str = "--:--:--";
else
*time_str = "--:-- ";
time_str->redraw();
}
}
//----------------------------------------------------------------------
2017-09-20 06:19:27 +02:00
void Watch::adjustSize()
{
int pw = getParentWidget()->getWidth();
setX (1 + (pw - 22) / 2, false);
finalcut::FDialog::adjustSize();
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
// Create the application object
finalcut::FApplication app(argc, argv);
// Create a simple dialog box
2017-09-20 06:19:27 +02:00
Watch w(&app);
// Set dialog w as main widget
app.setMainWidget(&w);
// Show and start the application
w.show();
return app.exec();
}