wfview/include/ControllerController.h

217 lines
6.7 KiB
C
Raw Permalink Normal View History

2026-03-02 09:28:07 +00:00
#ifndef CONTROLLERCONTROLLER_H
#define CONTROLLERCONTROLLER_H
2026-05-24 08:23:23 +01:00
#include "usbcontroller.h"
2026-03-02 09:28:07 +00:00
#include <QAbstractListModel>
#include <QColor>
#include <QImage>
#include <QJSValue>
2026-05-24 08:23:23 +01:00
#include <QMap>
#include <QMutex>
#include <QObject>
#include <QPoint>
#include <QQuickItem>
#include <QUrl>
#include <QVector>
2026-03-02 09:28:07 +00:00
// Forward declarations
struct BUTTON;
struct KNOB;
struct COMMAND;
/**
* @brief Model for USB controller devices
*/
class DeviceModel : public QAbstractListModel
{
Q_OBJECT
public:
2026-05-24 08:23:23 +01:00
enum DeviceRoles
{
2026-03-02 09:28:07 +00:00
DeviceNameRole = Qt::UserRole + 1,
DevicePathRole,
ConnectedRole,
CurrentPageRole,
TotalPagesRole,
2026-05-24 08:06:10 +01:00
DisabledRole,
SensitivityRole,
BrightnessRole,
SpeedRole,
OrientationRole,
TimeoutRole,
ShowSensitivityRole,
ShowBrightnessRole,
ShowSpeedRole,
ShowOrientationRole,
ShowColorRole,
ShowTimeoutRole
2026-03-02 09:28:07 +00:00
};
explicit DeviceModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
2026-05-24 08:06:10 +01:00
Q_INVOKABLE QVariantMap get(int row) const;
2026-03-02 09:28:07 +00:00
2026-05-24 08:23:23 +01:00
void addDevice(USBDEVICE *dev);
void removeDevice(const QString &path);
void updateDevice(const QString &path);
2026-05-24 08:06:10 +01:00
void reset();
2026-05-24 08:23:23 +01:00
USBDEVICE *getDevice(const QString &path);
USBDEVICE *getDevice(int index);
2026-03-02 09:28:07 +00:00
private:
2026-05-24 08:23:23 +01:00
QVector<USBDEVICE *> devices;
QMap<QString, int> pathToIndex;
2026-03-02 09:28:07 +00:00
};
/**
* @brief Model for command items
*/
class CommandModel : public QAbstractListModel
{
Q_OBJECT
public:
2026-05-24 08:23:23 +01:00
enum CommandRoles
{
2026-03-02 09:28:07 +00:00
TextRole = Qt::UserRole + 1,
IndexRole,
IsSeparatorRole
};
explicit CommandModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
2026-05-24 08:23:23 +01:00
void setCommands(QVector<COMMAND> *commandList, bool buttonCommands);
2026-03-02 09:28:07 +00:00
private:
2026-05-24 08:23:23 +01:00
QVector<COMMAND *> commandItems;
2026-03-02 09:28:07 +00:00
};
/**
* @brief Controller for managing USB controller settings in QML
*/
class ControllerController : public QObject
{
Q_OBJECT
2026-05-24 08:23:23 +01:00
Q_PROPERTY(DeviceModel *deviceModel READ deviceModel CONSTANT)
Q_PROPERTY(CommandModel *commandModel READ commandModel CONSTANT)
Q_PROPERTY(CommandModel *knobCommandModel READ knobCommandModel CONSTANT)
2026-03-02 09:28:07 +00:00
public:
explicit ControllerController(QObject *parent = nullptr);
~ControllerController();
2026-05-24 08:23:23 +01:00
DeviceModel *deviceModel()
{
return deviceModelObject;
}
CommandModel *commandModel()
{
return commandModelObject;
}
CommandModel *knobCommandModel()
{
return knobCommandModelObject;
}
2026-03-02 09:28:07 +00:00
// Initialize with data from main application
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void init(usbDevMap *deviceMap,
QVector<BUTTON> *buttonData,
QVector<KNOB> *knobData,
QVector<COMMAND> *commandData,
QMutex *sharedMutex);
2026-03-02 09:28:07 +00:00
// Device management
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void newDevice(USBDEVICE *dev);
Q_INVOKABLE void removeDevice(USBDEVICE *dev);
Q_INVOKABLE void setConnected(USBDEVICE *dev);
2026-03-02 09:28:07 +00:00
// Get controller image path based on device type
2026-05-24 08:23:23 +01:00
Q_INVOKABLE QString getControllerImagePath(const QString &devicePath);
2026-03-02 09:28:07 +00:00
// Get buttons/knobs for a specific page (returns QVariantList for QML)
2026-05-24 08:23:23 +01:00
Q_INVOKABLE QVariantList getButtonsForPage(const QString &devicePath, int page);
Q_INVOKABLE QVariantList getKnobsForPage(const QString &devicePath, int page);
2026-03-02 09:28:07 +00:00
// User interactions
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void showContextMenu(const QString &devicePath, const QPoint &pos);
Q_INVOKABLE void buttonPressed(const QString &devicePath, const QPoint &pos, bool pressed);
2026-03-02 09:28:07 +00:00
// Settings
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void setPage(const QString &devicePath, int page);
Q_INVOKABLE void setTotalPages(const QString &devicePath, int pages);
Q_INVOKABLE void setSensitivity(const QString &devicePath, int value);
Q_INVOKABLE void setBrightness(const QString &devicePath, int index);
Q_INVOKABLE void setSpeed(const QString &devicePath, int index);
Q_INVOKABLE void setOrientation(const QString &devicePath, int index);
Q_INVOKABLE void setColor(const QString &devicePath, const QColor &color);
Q_INVOKABLE void setTimeout(const QString &devicePath, int minutes);
Q_INVOKABLE void setDeviceDisabled(const QString &devicePath, bool disabled);
2026-03-02 09:28:07 +00:00
// Button/Knob configuration
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void applyButtonConfig(int onCommand, int offCommand, int knobCommand, bool toggle, int ledNumber);
Q_INVOKABLE void setCurrentButtonColor(bool pressedColor, const QColor &color);
2026-03-02 09:28:07 +00:00
// Backup/Restore
2026-05-24 08:23:23 +01:00
Q_INVOKABLE void backupSettings(const QString &devicePath, const QUrl &fileUrl);
Q_INVOKABLE void restoreSettings(const QString &devicePath, const QUrl &fileUrl);
2026-03-02 09:28:07 +00:00
signals:
2026-05-24 08:23:23 +01:00
void sendRequest(USBDEVICE *dev,
usbFeatureType request,
int val = 0,
QString text = "",
QImage *img = nullptr,
QColor *color = nullptr);
void programDisable(USBDEVICE *dev, bool disable);
void programPages(USBDEVICE *dev, int pages);
void backup(USBDEVICE *dev, QString path);
void restore(USBDEVICE *dev, QString path);
void commandTriggered(const COMMAND *command);
2026-03-02 09:28:07 +00:00
void deviceAdded(int index);
void deviceRemoved(int index);
2026-05-24 08:23:23 +01:00
void deviceUpdated(const QString &path);
void showConfigDialog(const QString &title,
bool isButton,
bool isKnob,
int onCommand,
int offCommand,
int knobCommand,
bool toggle,
int ledNumber,
bool showLed,
bool showColor,
bool showIcon,
const QColor &onColor,
const QColor &offColor);
2026-03-02 09:28:07 +00:00
private:
2026-05-24 08:23:23 +01:00
BUTTON *findButton(const QString &devicePath, const QPoint &pos, int page);
KNOB *findKnob(const QString &devicePath, const QPoint &pos, int page);
void updatePage(USBDEVICE *dev, int page);
DeviceModel *deviceModelObject;
CommandModel *commandModelObject;
CommandModel *knobCommandModelObject;
usbDevMap *usbDevices;
QVector<BUTTON> *buttonList;
QVector<KNOB> *knobList;
QVector<COMMAND> *commandList;
QMutex *controllerMutex;
BUTTON *currentButton;
KNOB *currentKnob;
2026-03-02 09:28:07 +00:00
};
#endif // CONTROLLERCONTROLLER_H