Basic event manager with empty callback functions.
This commit is contained in:
parent
41746288fc
commit
89f0f6094e
5 changed files with 209 additions and 10 deletions
44
include/EventManager.hpp
Normal file
44
include/EventManager.hpp
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef H_EventManager
|
||||||
|
#define H_EventManager
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <termios.h>
|
||||||
|
|
||||||
|
#include <Display.hpp>
|
||||||
|
#include <TreeNodeDiskUsage.hpp>
|
||||||
|
|
||||||
|
/// This class manages the keyboard events and triggers actions.
|
||||||
|
class EventManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EventManager(Display & display_, TreeNodeDiskUsage & rootNode_);
|
||||||
|
~EventManager();
|
||||||
|
|
||||||
|
/// Starts the main event loop.
|
||||||
|
void MainEventLoop();
|
||||||
|
|
||||||
|
// Callback functions that are triggered when the corresponding key is pressed.
|
||||||
|
void CallbackArrowUp();
|
||||||
|
void CallbackArrowDown();
|
||||||
|
void CallbackArrowLeft();
|
||||||
|
void CallbackArrowRight();
|
||||||
|
void CallbackEnter();
|
||||||
|
void CallbackBackspace();
|
||||||
|
void CallbackHome();
|
||||||
|
void CallbackHelp();
|
||||||
|
void CallbackSort();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Display & display;
|
||||||
|
TreeNodeDiskUsage & rootNode;
|
||||||
|
|
||||||
|
int currentLine;
|
||||||
|
TreeNodeDiskUsage *currentNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -5,13 +5,12 @@
|
||||||
#include <TreeNodeDiskUsage.hpp>
|
#include <TreeNodeDiskUsage.hpp>
|
||||||
#include <Display.hpp>
|
#include <Display.hpp>
|
||||||
#include <AnsiTerminal.hpp>
|
#include <AnsiTerminal.hpp>
|
||||||
|
#include <EventManager.hpp>
|
||||||
|
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::cerr;
|
using std::cerr;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
|
||||||
#ifdef D_UNIT_TESTS
|
|
||||||
void runTests(int argc, char *argv[]);
|
void runTests(int argc, char *argv[]);
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
145
src/EventManager.cpp
Normal file
145
src/EventManager.cpp
Normal file
|
|
@ -0,0 +1,145 @@
|
||||||
|
#include <EventManager.hpp>
|
||||||
|
|
||||||
|
#define KEY_ARROW_UP 'A'
|
||||||
|
#define KEY_ARROW_DOWN 'B'
|
||||||
|
#define KEY_ARROW_RIGHT 'C'
|
||||||
|
#define KEY_ARROW_LEFT 'D'
|
||||||
|
#define KEY_BACKSPACE 127
|
||||||
|
#define KEY_DEL 126
|
||||||
|
#define KEY_HOME 'H'
|
||||||
|
#define KEY_ENTER 10
|
||||||
|
|
||||||
|
EventManager::EventManager(Display & display_, TreeNodeDiskUsage & rootNode_)
|
||||||
|
: display(display_),
|
||||||
|
rootNode(rootNode_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
EventManager::~EventManager()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::MainEventLoop()
|
||||||
|
{
|
||||||
|
struct termios oldSettings, newSettings;
|
||||||
|
|
||||||
|
tcgetattr(fileno(stdin), &oldSettings);
|
||||||
|
newSettings = oldSettings;
|
||||||
|
newSettings.c_lflag &= (~ICANON & ~ECHO);
|
||||||
|
tcsetattr(fileno(stdin), TCSANOW, &newSettings);
|
||||||
|
|
||||||
|
bool readingSymbol = false;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
fd_set set;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
tv.tv_sec = 10;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
FD_ZERO(&set);
|
||||||
|
FD_SET(fileno(stdin), &set);
|
||||||
|
|
||||||
|
int res = select(fileno(stdin)+1, &set, NULL, NULL, &tv);// res == 0 -> timeout reached
|
||||||
|
|
||||||
|
if(res > 0)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
read(fileno(stdin), &c, 1);
|
||||||
|
// std::cout << (int)c << " = \"" << c << "\"\n";// DEBUG
|
||||||
|
|
||||||
|
// Parse event
|
||||||
|
if(c == 'q') // Quit program
|
||||||
|
break;
|
||||||
|
else if(c == 27) // when an arrow key is pressed, a string of 3 characters is produced : 27, '[', key identifier
|
||||||
|
{
|
||||||
|
readingSymbol = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!readingSymbol) // Regular key presses that fit in a single character
|
||||||
|
{
|
||||||
|
if(c == KEY_ENTER)
|
||||||
|
CallbackEnter();
|
||||||
|
else if(c == KEY_BACKSPACE)
|
||||||
|
CallbackBackspace();
|
||||||
|
else if(c == '?' || c == 'h' || c == 'H')
|
||||||
|
CallbackHelp();
|
||||||
|
else if(c == 's' || c == 'S')
|
||||||
|
CallbackSort();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(c == '[') // second character of the symbol
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(c == KEY_ARROW_UP)
|
||||||
|
CallbackArrowUp();
|
||||||
|
else if(c == KEY_ARROW_DOWN)
|
||||||
|
CallbackArrowDown();
|
||||||
|
else if(c == KEY_ARROW_LEFT)
|
||||||
|
CallbackArrowLeft();
|
||||||
|
else if(c == KEY_ARROW_RIGHT)
|
||||||
|
CallbackArrowRight();
|
||||||
|
else if(c == KEY_HOME)
|
||||||
|
CallbackHome();
|
||||||
|
|
||||||
|
//std::cout << "symbol read : " << (int)c << " = \"" << c << "\"\n";// DEBUG
|
||||||
|
readingSymbol = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(res < 0)
|
||||||
|
{
|
||||||
|
std::cerr << "Event select error.\n";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tcsetattr(fileno(stdin), TCSANOW, &oldSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackArrowUp()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackArrowUp\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackArrowDown()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackArrowDown\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackArrowLeft()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackArrowLeft\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackArrowRight()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackArrowRight\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackEnter()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackEnter\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackBackspace()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackBackspace\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackHome()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackHome\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackHelp()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackHelp\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventManager::CallbackSort()
|
||||||
|
{
|
||||||
|
std::cout << "CallbackSort\n";
|
||||||
|
}
|
||||||
|
|
@ -2,12 +2,13 @@
|
||||||
#include <TreeNodeDiskUsage.hpp>
|
#include <TreeNodeDiskUsage.hpp>
|
||||||
#include <Display.hpp>
|
#include <Display.hpp>
|
||||||
#include <AnsiTerminal.hpp>
|
#include <AnsiTerminal.hpp>
|
||||||
|
#include <EventManager.hpp>
|
||||||
|
|
||||||
using std::cout;
|
using std::cout;
|
||||||
using std::cerr;
|
using std::cerr;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
|
|
||||||
//#define D_UNIT_TESTS
|
#define D_UNIT_TESTS
|
||||||
|
|
||||||
#include <test.hpp>
|
#include <test.hpp>
|
||||||
|
|
||||||
|
|
|
||||||
24
src/test.cpp
24
src/test.cpp
|
|
@ -1,12 +1,14 @@
|
||||||
|
#include <test.hpp>
|
||||||
|
|
||||||
#ifdef D_UNIT_TESTS
|
void runTests(int argc, char *argv[])
|
||||||
void runTests(int /* argc */, char *argv[])
|
|
||||||
{
|
{
|
||||||
|
std::string rootpath = (argc > 1) ? argv[1] : ".";
|
||||||
|
|
||||||
if(0)
|
if(0)
|
||||||
{// stat test
|
{// stat test
|
||||||
cout << "Reading '" << argv[1] << "'\n";
|
cout << "Reading '" << rootpath << "'\n";
|
||||||
struct stat s;
|
struct stat s;
|
||||||
PRINT_VAR(stat(argv[1], &s));
|
PRINT_VAR(stat(rootpath.c_str(), &s));
|
||||||
PRINT_VAR(s.st_mode);
|
PRINT_VAR(s.st_mode);
|
||||||
PRINT_VAR(s.st_mode & S_IFMT);
|
PRINT_VAR(s.st_mode & S_IFMT);
|
||||||
PRINT_VAR((s.st_mode & S_IFMT) == S_IFLNK);// symbolic link
|
PRINT_VAR((s.st_mode & S_IFMT) == S_IFLNK);// symbolic link
|
||||||
|
|
@ -41,7 +43,8 @@ void runTests(int /* argc */, char *argv[])
|
||||||
}
|
}
|
||||||
if(0)
|
if(0)
|
||||||
{// basic tree building and printing test
|
{// basic tree building and printing test
|
||||||
TreeNodeDiskUsage tree(argv[1]);
|
Display display;
|
||||||
|
TreeNodeDiskUsage tree(rootpath);
|
||||||
cout << "Scanning folder \"" << rootpath << "\" ...\n";
|
cout << "Scanning folder \"" << rootpath << "\" ...\n";
|
||||||
tree.BuildTree(true, display.Cols());
|
tree.BuildTree(true, display.Cols());
|
||||||
cout << endl;
|
cout << endl;
|
||||||
|
|
@ -121,7 +124,7 @@ void runTests(int /* argc */, char *argv[])
|
||||||
PRINT_VAR(Bytes2HumanReadable(1000000000ULL, false));
|
PRINT_VAR(Bytes2HumanReadable(1000000000ULL, false));
|
||||||
|
|
||||||
}
|
}
|
||||||
//if(0)
|
if(0)
|
||||||
{// test screen functions
|
{// test screen functions
|
||||||
Display d;
|
Display d;
|
||||||
PRINT_VAR(d.Rows());
|
PRINT_VAR(d.Rows());
|
||||||
|
|
@ -186,5 +189,12 @@ void runTests(int /* argc */, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//if(0)
|
||||||
|
{// test EventManager
|
||||||
|
Display display;
|
||||||
|
TreeNodeDiskUsage tree(rootpath);
|
||||||
|
tree.BuildTree(false);
|
||||||
|
EventManager eventManager(display, tree);
|
||||||
|
eventManager.MainEventLoop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif // D_UNIT_TESTS
|
|
||||||
Loading…
Add table
Reference in a new issue