mixer/src/qt/qtclasses.h

173 lines
4.1 KiB
C++

#pragma once
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QApplication>
#include <QCloseEvent>
#include <QIcon>
#include <QSystemTrayIcon>
#include <QMenu>
//#include <QMessageBox>
#include <QLabel>
#include <QSlider>
#include <QGridLayout>
#include <QPushButton>
#include <QCheckBox>
#include <QTimer>
/*
* #else
* class QSlider;
* class QLabel;
* class QGridLayout;
* class QPushButton;
* class QWidget;
* class QMainWindow;
* #endif
*/
#include "global.h"
#include "contclasses.h"
//class EndpointHandler;
/*
* class ToggleButton : public QAbstractButton {
* Q_OBJECT
*
* public:
* ToggleButton(QWidget *parent = nullptr);
* void checkStateSet();
* bool hitButton(const QPoint &pos) const;
* void nextCheckState();
* void changeEvent(QEvent *e) override;
* bool event(QEvent *e) override;
* void focusInEvent(QFocusEvent *e) override;
* void focusOutEvent(QFocusEvent *e) override;
* void keyPressEvent(QKeyEvent *e) override;
* void keyReleaseEvent(QKeyEvent *e) override;
* void mouseMoveEvent(QMouseEvent *e) override;
* void mousePressEvent(QMouseEvent *e) override;
* void mouseReleaseEvent(QMouseEvent *e) override;
* void paintEvent(QPaintEvent *e) override = 0;
* void timerEvent(QTimerEvent *e) override;
* ToggleButton(QWidget *parent = nullptr);
* };
*/
enum CustomQEvent {
EndpointWidgetObsolete = 1001,
EndpointWidgetCreated = 1002,
EndpointDefaultChange = 1003,
};
template <typename T>
class EndpointWidgetEvent : public QEvent {
public:
EndpointWidgetEvent(QEvent::Type type, T payload);
T payload;
};
//Q_DECLARE_METATYPE(EndpointWidgetEvent)
class ExtendedCheckBox : public QCheckBox {
Q_OBJECT
protected:
void customEvent(QEvent* ev) override;
public:
//c++11: this inherits all parent's constructors unconditionally
using QCheckBox::QCheckBox;
//alternative being calling parent ctor directly after declaring child ctor:
//B(int x) : A(x) { }
};
class EndpointWidget : public QWidget {
Q_OBJECT
public:
EndpointWidget(uint64_t idx, EndpointHandler* eph, QWidget *parent = nullptr);
EndpointHandler* getEndpointHandler();
void updateFrontIndex(uint64_t index);
void setIndex(uint64_t idx);
uint64_t getIndex();
void setVolume(int channel, float volume);
QCheckBox *muteButton = nullptr;
QLabel *mainLabel = nullptr, *leftChannelLabel = nullptr, *rightChannelLabel = nullptr;
QSlider *mainSlider = nullptr;
std::vector<QSlider*> channelSliders;
std::vector<QLabel*> channelLabels;
QGridLayout *layout = nullptr;
QGridLayout *mainMuteLayout = nullptr;
std::map<Roles, ExtendedCheckBox*> defaultRolesCheckBoxes;
~EndpointWidget();
//void updateMainVolume(float newValue);
//void updateVolume(uint32_t channel, float newValue);
//void updateMute(bool muted);
//void populateEndpointWidget(EndpointHandler *eph);
//void setEndpointHandlers(std::vector<EndpointHandler*> *ephs);
public slots:
void updateMainVolume(int newValue);
void updateMute(int checked);
private:
EndpointHandler* eph;
size_t defaultRolesVectorSize = 4;
QTimer* timer = nullptr;
uint64_t idx;
//std::vector<EndpointHandler*> *ephs;
//std::vector<QSlider> *sliders;
//signals:
//void valueChanged(int value);
};
class MainWindow : public QMainWindow {
Q_OBJECT
//QWidget *centralWidget;
public:
MainWindow(QWidget *parent = nullptr);
void reloadEndpointWidgets();
protected:
void closeEvent(QCloseEvent *event) override;
void customEvent(QEvent* ev) override;
private slots:
void trayIconActivated(QSystemTrayIcon::ActivationReason reason);
void removeEndpointWidget(EndpointWidgetEvent<uint64_t>* ev);
void addEndpointWidget(EndpointWidgetEvent<EndpointHandler*>* ev);
//TODO: destroy/empty existing EndpointWidgets
//void setEndpointHandlers(std::vector<EndpointHandler*> *ephs);
private:
//std::vector<EndpointHandler*> *ephs;
std::vector<EndpointWidget*> ews;
QWidget *widget;
QGridLayout *layout;
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
QAction *trayIconMenuQuit;
//public slots:
// void setEndpointHandlers(std::vector<EndpointHandler*> *ephs);
//signals:
//void valueChanged(int value);
};
#endif