Basic event manager with empty callback functions.

This commit is contained in:
Your Name 2022-01-22 17:25:16 +01:00
parent 41746288fc
commit 89f0f6094e
5 changed files with 209 additions and 10 deletions

44
include/EventManager.hpp Normal file
View 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

View file

@ -5,13 +5,12 @@
#include <TreeNodeDiskUsage.hpp>
#include <Display.hpp>
#include <AnsiTerminal.hpp>
#include <EventManager.hpp>
using std::cout;
using std::cerr;
using std::endl;
#ifdef D_UNIT_TESTS
void runTests(int argc, char *argv[]);
#endif
#endif

145
src/EventManager.cpp Normal file
View 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";
}

View file

@ -2,12 +2,13 @@
#include <TreeNodeDiskUsage.hpp>
#include <Display.hpp>
#include <AnsiTerminal.hpp>
#include <EventManager.hpp>
using std::cout;
using std::cerr;
using std::endl;
//#define D_UNIT_TESTS
#define D_UNIT_TESTS
#include <test.hpp>

View file

@ -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)
{// stat test
cout << "Reading '" << argv[1] << "'\n";
cout << "Reading '" << rootpath << "'\n";
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 & S_IFMT);
PRINT_VAR((s.st_mode & S_IFMT) == S_IFLNK);// symbolic link
@ -41,7 +43,8 @@ void runTests(int /* argc */, char *argv[])
}
if(0)
{// basic tree building and printing test
TreeNodeDiskUsage tree(argv[1]);
Display display;
TreeNodeDiskUsage tree(rootpath);
cout << "Scanning folder \"" << rootpath << "\" ...\n";
tree.BuildTree(true, display.Cols());
cout << endl;
@ -121,7 +124,7 @@ void runTests(int /* argc */, char *argv[])
PRINT_VAR(Bytes2HumanReadable(1000000000ULL, false));
}
//if(0)
if(0)
{// test screen functions
Display d;
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