finalcut/examples/scrollview.cpp

282 lines
8.0 KiB
C++

/***********************************************************************
* scrollview.cpp - Shows client widgets in a scroll area *
* *
* This file is part of the Final Cut widget toolkit *
* *
* Copyright 2017-2018 Markus Gans *
* *
* 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 <final/final.h>
//----------------------------------------------------------------------
// class Scrollview
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class Scrollview : public finalcut::FScrollView
{
public:
// Constructor
explicit Scrollview (finalcut::FWidget* = 0);
// Destructor
~Scrollview ();
// Mutator
void setScrollSize (int, int);
private:
// Disable copy constructor
Scrollview (const Scrollview&);
// Disable assignment operator (=)
Scrollview& operator = (const Scrollview&);
// Method
void draw();
// Callback methods
void cb_go_east (finalcut::FWidget*, data_ptr);
void cb_go_south (finalcut::FWidget*, data_ptr);
void cb_go_west (finalcut::FWidget*, data_ptr);
void cb_go_north (finalcut::FWidget*, data_ptr);
// Data Members
finalcut::FButton* go_east;
finalcut::FButton* go_south;
finalcut::FButton* go_west;
finalcut::FButton* go_north;
};
#pragma pack(pop)
//----------------------------------------------------------------------
Scrollview::Scrollview (finalcut::FWidget* parent)
: finalcut::FScrollView(parent)
, go_east()
, go_south()
, go_west()
, go_north()
{
// Create the four navigation buttons
wchar_t pointer_right = wchar_t(finalcut::fc::BlackRightPointingPointer);
go_east = new finalcut::FButton(pointer_right, this);
go_east->setGeometry (1, 1, 5, 1);
wchar_t pointer_down = wchar_t(finalcut::fc::BlackDownPointingTriangle);
go_south = new finalcut::FButton(pointer_down, this);
go_south->setGeometry (getScrollWidth() - 5, 1, 5, 1);
wchar_t pointer_left = wchar_t(finalcut::fc::BlackLeftPointingPointer);
go_west = new finalcut::FButton(pointer_left, this);
go_west->setGeometry (getScrollWidth() - 5, getScrollHeight() - 2, 5, 1);
wchar_t pointer_up = wchar_t(finalcut::fc::BlackUpPointingTriangle);
go_north = new finalcut::FButton(pointer_up, this);
go_north->setGeometry (1, getScrollHeight() - 2, 5, 1);
// Add scroll function callbacks to the buttons
go_east->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Scrollview::cb_go_east)
);
go_south->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Scrollview::cb_go_south)
);
go_west->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Scrollview::cb_go_west)
);
go_north->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Scrollview::cb_go_north)
);
}
//----------------------------------------------------------------------
Scrollview::~Scrollview()
{ }
//----------------------------------------------------------------------
void Scrollview::setScrollSize (int width, int height)
{
FScrollView::setScrollSize (width, height);
go_south->setPos (width - 5, 1);
go_west->setPos (width - 5, height - 1);
go_north->setPos (1, height - 1);
}
//----------------------------------------------------------------------
void Scrollview::draw()
{
if ( isMonochron() )
setReverse(true);
setColor (wc.label_inactive_fg, wc.dialog_bg);
clearArea();
for (int y = 0; y < getScrollHeight(); y++)
{
setPrintPos (1, 1 + y);
for (int x = 0; x < getScrollWidth(); x++)
print (32 + ((x + y) % 0x5f));
}
if ( isMonochron() )
setReverse(false);
FScrollView::draw();
}
//----------------------------------------------------------------------
void Scrollview::cb_go_east (finalcut::FWidget*, data_ptr)
{
scrollToX (getScrollWidth() - getViewportWidth() + 1);
go_south->setFocus();
go_east->redraw();
go_south->redraw();
}
//----------------------------------------------------------------------
void Scrollview::cb_go_south (finalcut::FWidget*, data_ptr)
{
scrollToY (getScrollHeight() - getViewportHeight() + 1);
go_west->setFocus();
go_south->redraw();
go_west->redraw();
}
//----------------------------------------------------------------------
void Scrollview::cb_go_west (finalcut::FWidget*, data_ptr)
{
scrollToX (1);
go_north->setFocus();
go_west->redraw();
go_north->redraw();
}
//----------------------------------------------------------------------
void Scrollview::cb_go_north (finalcut::FWidget*, data_ptr)
{
scrollToY (1);
go_east->setFocus();
go_north->redraw();
go_east->redraw();
}
//----------------------------------------------------------------------
// class Scrollviewdemo
//----------------------------------------------------------------------
#pragma pack(push)
#pragma pack(1)
class Scrollviewdemo : public finalcut::FDialog
{
public:
// Constructor
explicit Scrollviewdemo (finalcut::FWidget* = 0);
// Destructor
~Scrollviewdemo();
// Event handler
void onClose (finalcut::FCloseEvent*);
// Callback method
void cb_quit (finalcut::FWidget* = 0, data_ptr = 0);
};
#pragma pack(pop)
//----------------------------------------------------------------------
Scrollviewdemo::Scrollviewdemo (finalcut::FWidget* parent)
: finalcut::FDialog(parent)
{
setGeometry (16, 3, 50, 19);
setText ("Scrolling viewport example");
// The scrolling viewport widget
Scrollview* sview = new Scrollview (this);
sview->setGeometry(3, 2, 44, 12);
sview->setScrollSize(188, 124);
// Quit button
finalcut::FButton* button = new finalcut::FButton("&Quit", this);
button->setGeometry(37, 15, 10, 1);
// Add function callback
button->addCallback
(
"clicked",
F_METHOD_CALLBACK (this, &Scrollviewdemo::cb_quit)
);
// Text label
finalcut::FLabel* label = new finalcut::FLabel (this);
label->setGeometry(2, 1, 46, 1);
label->setEmphasis();
*label << L"Use scrollbars to change the viewport position";
}
//----------------------------------------------------------------------
Scrollviewdemo::~Scrollviewdemo()
{ }
//----------------------------------------------------------------------
void Scrollviewdemo::cb_quit (finalcut::FWidget*, data_ptr)
{
close();
}
//----------------------------------------------------------------------
void Scrollviewdemo::onClose (finalcut::FCloseEvent* ev)
{
finalcut::FApplication::closeConfirmationDialog (this, ev);
}
//----------------------------------------------------------------------
// main part
//----------------------------------------------------------------------
int main (int argc, char* argv[])
{
// Create the application object
finalcut::FApplication app(argc, argv);
// Create a simple dialog box
Scrollviewdemo svdemo(&app);
// Set dialog main_dlg as main widget
app.setMainWidget(&svdemo);
// Show and start the application
svdemo.show();
return app.exec();
}