Add some GUI abstraction and implement basic monitor selection

This commit is contained in:
BlackMark 2020-07-12 21:04:08 +02:00
parent 994e08bebc
commit 5b6dd9e62c
2 changed files with 68 additions and 9 deletions

View File

@ -24,8 +24,8 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent)
m_ui.setupUi(this); m_ui.setupUi(this);
m_sensors = enumerateSensors(); enumSensors();
m_monitors = enumerateMonitors(); enumMonitors();
setupMonitorsTab(); setupMonitorsTab();
@ -50,6 +50,28 @@ void MainWindow::closeEvent(QCloseEvent* event)
event->ignore(); event->ignore();
} }
void MainWindow::enumSensors()
{
auto sensors = enumerateSensors();
for(auto& sensor: sensors) {
m_sensors.push_back({std::move(sensor)});
}
}
void MainWindow::enumMonitors()
{
m_ui.monitorDropdown->clear();
auto monitors = enumerateMonitors();
for(auto& monitor: monitors) {
const auto currentBrightness = monitor.getBrightness();
m_ui.monitorDropdown->addItem(monitor.getName());
m_monitors.push_back({std::move(monitor), 0.f, 1.f, currentBrightness, false});
}
}
void MainWindow::loadIcons() void MainWindow::loadIcons()
{ {
qDebug(ltr("Loading icons")); qDebug(ltr("Loading icons"));
@ -87,6 +109,8 @@ void MainWindow::loadIcons()
void MainWindow::setupMonitorsTab() void MainWindow::setupMonitorsTab()
{ {
connect(m_ui.monitorDropdown, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &MainWindow::updateCurrentMonitorGUI);
m_ui.monitorBrightnessSlider->setDisabled(true); m_ui.monitorBrightnessSlider->setDisabled(true);
m_ui.monitorOverallBrightnessSlider->setDisabled(true); m_ui.monitorOverallBrightnessSlider->setDisabled(true);
@ -157,6 +181,24 @@ void MainWindow::setupCallbackTimer()
qDebug(ltr("Callback timer started")); qDebug(ltr("Callback timer started"));
} }
void MainWindow::updateCurrentMonitorGUI(int index)
{
const auto brightness = std::clamp<int>(utils::map(m_monitors[index].brightness, 0.f, 1.f, 0, 100), 0, 100);
const auto minimum = std::clamp<int>(utils::map(m_monitors[index].minBrightness, 0.f, 1.f, 0, 100), 0, 100);
const auto maximum = std::clamp<int>(utils::map(m_monitors[index].maxBrightness, 0.f, 1.f, 0, 100), 0, 100);
m_ui.monitorMinBrightnessSlider->setValue(minimum);
m_ui.monitorMinBrightnessValueLabel->setText(QString("%1%").arg(minimum, 3, 10));
m_ui.monitorMaxBrightnessSlider->setValue(maximum);
m_ui.monitorMaxBrightnessValueLabel->setText(QString("%1%").arg(maximum, 3, 10));
m_ui.monitorBrightnessSlider->setValue(brightness);
m_ui.monitorBrightnessValueLabel->setText(QString("%1%").arg(brightness, 3, 10));
m_ui.monitorOverrideCheck->setChecked(m_monitors[index].manualOverride);
}
void MainWindow::updateState() void MainWindow::updateState()
{ {
qDebug(ltr("Updating state")); qDebug(ltr("Updating state"));
@ -173,8 +215,8 @@ void MainWindow::updateState()
std::vector<float> values; std::vector<float> values;
for(auto& sensor: m_sensors) { for(auto& sensor: m_sensors) {
const auto sensorValues = sensor.readValues(); const auto sensorValues = sensor.driver.readValues();
if(!sensor) { if(!sensor.driver) {
return false; return false;
} }
values.insert(values.end(), sensorValues.begin(), sensorValues.end()); values.insert(values.end(), sensorValues.begin(), sensorValues.end());
@ -191,7 +233,7 @@ void MainWindow::updateState()
bool errorOccurred = false; bool errorOccurred = false;
for(auto& monitor: m_monitors) { for(auto& monitor: m_monitors) {
if(!monitor.setBrightness(brightness)) { if(!monitor.driver.setBrightness(brightness)) {
errorOccurred = true; errorOccurred = true;
} }
} }
@ -199,7 +241,7 @@ void MainWindow::updateState()
}; };
if(!getAverageSensorValue(m_brightness)) { if(!getAverageSensorValue(m_brightness)) {
m_sensors = enumerateSensors(); enumSensors();
qInfo(ltr("At least one sensor became invalid, re-enumerating sensors found %1 valid sensor(s)").arg(m_sensors.size())); qInfo(ltr("At least one sensor became invalid, re-enumerating sensors found %1 valid sensor(s)").arg(m_sensors.size()));
sensorError = true; sensorError = true;
} }
@ -208,7 +250,7 @@ void MainWindow::updateState()
iconBrightness = std::clamp<size_t>(roundedBrightness, 0, 8); iconBrightness = std::clamp<size_t>(roundedBrightness, 0, 8);
if(!setAllMonitorsBrightness(m_brightness)) { if(!setAllMonitorsBrightness(m_brightness)) {
m_monitors = enumerateMonitors(); enumMonitors();
qInfo(ltr("At least one monitor became invalid, re-enumerating monitors found %1 valid monitor(s)").arg(m_monitors.size())); qInfo(ltr("At least one monitor became invalid, re-enumerating monitors found %1 valid monitor(s)").arg(m_monitors.size()));
monitorError = true; monitorError = true;
} }

View File

@ -28,12 +28,17 @@ class MainWindow : public QMainWindow {
private: private:
void closeEvent(QCloseEvent* event) override; void closeEvent(QCloseEvent* event) override;
void enumSensors();
void enumMonitors();
void loadIcons(); void loadIcons();
void setupMonitorsTab(); void setupMonitorsTab();
void setupTrayIcon(); void setupTrayIcon();
void setupCallbackTimer(); void setupCallbackTimer();
void updateCurrentMonitorGUI(int index);
void updateState(); void updateState();
void trayIconClicked(QSystemTrayIcon::ActivationReason reason); void trayIconClicked(QSystemTrayIcon::ActivationReason reason);
@ -54,6 +59,18 @@ class MainWindow : public QMainWindow {
float m_brightness = 0.5f; float m_brightness = 0.5f;
std::vector<Sensor> m_sensors; struct SensorData {
std::vector<Monitor> m_monitors; Sensor driver;
};
struct MonitorData {
Monitor driver;
float minBrightness;
float maxBrightness;
float brightness;
bool manualOverride;
};
std::vector<SensorData> m_sensors;
std::vector<MonitorData> m_monitors;
}; };