Files
thunderpad/src/layout.h
2014-02-25 04:16:43 +01:00

120 lines
3.4 KiB
C++

#ifndef QJOYPAD_LAYOUT_H
#define QJOYPAD_LAYOUT_H
//to allow for interprocess communications (ie, signaling a running instance of
//qjoypad by running "qjoypad layout-name", etc.) QJoyPad uses signals to
//triger certain events. This is for signaling the main program to update
//the joystick device list.
#include <signal.h>
#include <QAction>
#include <QDir>
#include <QMenu>
#include <QApplication>
#include <QDialog>
#include <QPointer>
#include <QInputDialog>
#include <QSystemTrayIcon>
#include "config.h"
#ifdef WITH_LIBUDEV
#include <libudev.h>
#endif
//a layout handles several joypads
#include "joypad.h"
//for errors
#include "error.h"
//For displaying a floating icon instead of a tray icon
#include "icon.h"
//So we can know if there is a graphical version of the Layout Manager displayed
#include "layout_edit.h"
//handles loading, saving, and changing of layouts
class LayoutManager : public QObject {
friend class LayoutEdit;
Q_OBJECT
public:
LayoutManager(bool useTrayIcon, const QString &devdir, const QString &settingsDir);
~LayoutManager();
//produces a list of the names of all the available layout.
QStringList getLayoutNames() const;
public slots:
//load a layout with a given name
bool load(const QString& name);
//look for the last loaded layout and try to load that.
bool load();
//load the current layout, overwriting any changes made to it.
bool reload();
//reset to a blank, empty layout
void clear();
//save the current layout with its current name
void save();
void save(const QString& filename);
void save(QFile& file);
//save the current layout with a new name
void saveAs();
void exportLayout();
void importLayout();
//save the currently loaded layout so it can be recalled later
void saveDefault();
//get rid of a layout
void remove();
//rename current layout
void rename();
//when the tray icon is clicked
void iconClick();
void trayClick(QSystemTrayIcon::ActivationReason reason);
//rebuild the popup menu with the current information
void fillPopup();
//update the list of available joystick devices
void updateJoyDevs();
private slots:
//when the user selects an item on the tray's popup menu
void layoutTriggered();
private:
void addJoyPad(int index);
void addJoyPad(int index, const QString& devpath);
void removeJoyPad(int index);
//change to the given layout name and make all the necesary adjustments
void setLayoutName(const QString& name);
//get the file name for a layout name
QString getFileName(const QString& layoutname);
//the directory in wich the joystick devices are (e.g. "/dev/input")
QString devdir;
QString settingsDir;
//the layout that is currently in use
QString currentLayout;
//the popup menu from the tray/floating icon
QMenu trayMenu;
//known actions for the popup menu
QActionGroup *layoutGroup;
QAction *titleAction;
QAction *updateDevicesAction;
QAction *updateLayoutsAction;
QAction *quitAction;
//if there is a LayoutEdit open, this points to it. Otherwise, NULL.
QPointer<LayoutEdit> le;
QHash<int, JoyPad*> available;
QHash<int, JoyPad*> joypads;
#ifdef WITH_LIBUDEV
bool initUDev();
QSocketNotifier *udevNotifier;
struct udev *udev;
struct udev_monitor *monitor;
private slots:
void udevUpdate();
#endif
};
#endif