Skip to content

Commit

Permalink
add speed slider
Browse files Browse the repository at this point in the history
  • Loading branch information
DorianRudolph committed Jun 20, 2021
1 parent a6974c8 commit c21d48a
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 5 deletions.
18 changes: 18 additions & 0 deletions AbsoluteSliderStyle.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include <QProxyStyle>

class AbsoluteSliderStyle : public QProxyStyle {
public:
using QProxyStyle::QProxyStyle;

int styleHint(QStyle::StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0,
QStyleHintReturn *returnData = 0) const {
if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
return (Qt::LeftButton);
if (hint == QStyle::SH_Slider_PageSetButtons)
return (Qt::MiddleButton | Qt::RightButton);
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};

57 changes: 52 additions & 5 deletions MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "WalkingPad.h"
#include <QDateTime>
#include <QSlider>
#include "AbsoluteSliderStyle.h"

MainWindow::MainWindow() {
setWindowTitle("QWalkingPad");
Expand All @@ -21,6 +22,19 @@ MainWindow::MainWindow() {
startDiscovering();
}

QSlider * MainWindow::makeSpeedSlider() {
auto slider = new QSlider(Qt::Orientation::Horizontal);
slider->setFixedHeight(25);
slider->setStyle(new AbsoluteSliderStyle(slider->style()));
slider->setRange(0, 60); // TODO handle different maximum speeds
connect(slider, &QSlider::sliderMoved, this, [=](int speed){
setSpeedWidgets(speed);
});
slider->setTickInterval(10);
slider->setTickPosition(QSlider::TicksBelow);
return slider;
}

void MainWindow::setupLayout() {
centerWidget = new QWidget;
centerWidget->setEnabled(false);
Expand Down Expand Up @@ -48,8 +62,37 @@ void MainWindow::setupLayout() {
addModeButton("Manual", MODE_MANUAL);
addModeButton("Auto", MODE_AUTO);

auto slider = new QSlider(this);
vBox->addWidget(slider);
auto gridWidget = new QWidget;
auto grid = new QGridLayout;
gridWidget->setLayout(grid);
vBox->addWidget(gridWidget);

speedLabel = new QLabel;
grid->addWidget(speedLabel, 0, 0, Qt::AlignTop);

speedSlider = makeSpeedSlider();
connect(speedSlider, &QSlider::sliderReleased, this, [=](){
setSpeedTime = QDateTime::currentMSecsSinceEpoch();
send(setSpeed(speedSlider->sliderPosition()));
});
grid->addWidget(speedSlider, 0, 1);
setSpeedWidgets(0);

startSpeedLabel = new QLabel;
grid->addWidget(startSpeedLabel, 1, 0, Qt::AlignTop);

startSpeedSlider = makeSpeedSlider();
grid->addWidget(startSpeedSlider, 1, 1);
}

void MainWindow::setSpeedWidgets(int speed) {
speedSlider->setSliderPosition(speed);
speedLabel->setText(QString("Speed: %1.%2 km/h").arg(speed/10).arg(speed % 10));
}

void MainWindow::setStartSpeedWidgets(int speed) {
speedSlider->setSliderPosition(speed);
speedLabel->setText(QString("Start Speed: %1.%2 km/h").arg(speed/10).arg(speed % 10));
}

void MainWindow::setupMenu() {
Expand All @@ -75,7 +118,7 @@ void MainWindow::setupMenu() {
connectMenu->addSeparator();

auto settingsMenu = menuBar()->addMenu("&Settings");
auto unifiedSpeed = settingsMenu->addAction("&Unified Speed");
auto unifiedSpeed = settingsMenu->addAction("&Update Speed with Start Speed");
unifiedSpeed->setCheckable(true);
unifiedSpeed->setChecked(settings.getUnifiedSpeed());
connect(unifiedSpeed, &QAction::triggered, [this](auto checked) {
Expand Down Expand Up @@ -127,7 +170,7 @@ void MainWindow::setupTimer() {
// So we only send one command from the queue every 50 msec
sendTimer = new QTimer(this);
sendTimer->setInterval(50);
connect(tickTimer, &QTimer::timeout, this, &MainWindow::handleSend);
connect(sendTimer, &QTimer::timeout, this, &MainWindow::handleSend);
sendTimer->start();
}

Expand Down Expand Up @@ -289,9 +332,13 @@ void MainWindow::characteristicChanged(const QLowEnergyCharacteristic &c, const
auto parsed = parseMessage(value);
if (auto info = std::get_if<PadInfo>(&parsed)) {
qDebug("Info state %u, speed %u, mode %u, time %u, distance %u, steps %u", info->state, info->speed, info->mode, info->time, info->distance, info->steps);
if (info->mode < 3 && (QDateTime::currentSecsSinceEpoch() - setModeTime) > 1500) {
auto time = QDateTime::currentMSecsSinceEpoch();
if (info->mode < 3 && (time - setModeTime) > 1000) {
modeButtons[info->mode]->setChecked(true);
}
if ((time - setSpeedTime) > 1000 && !speedSlider->isSliderDown()) {
setSpeedWidgets(info->speed);
}
} else if (auto params = std::get_if<PadParams>(&parsed)) {
qDebug() << "Params";
} else if (auto record = std::get_if<PadRecord>(&parsed)) {
Expand Down
9 changes: 9 additions & 0 deletions MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class QBluetoothDeviceInfo;
class QLabel;
class QLowEnergyController;
class QRadioButton;
class QSlider;

class MainWindow : public QMainWindow {
Q_OBJECT
Expand Down Expand Up @@ -43,6 +44,9 @@ private slots:
void connectDevice();
void setupLayout();
void send(const QByteArray &msg);
void setSpeedWidgets(int speed);
void setStartSpeedWidgets(int speed);
QSlider *makeSpeedSlider();

QLabel *statusLabel;
QLabel *messageLabel;
Expand Down Expand Up @@ -80,5 +84,10 @@ private slots:
qint64 setSpeedTime {};

QWidget *centerWidget;

QSlider *speedSlider;
QLabel *speedLabel;
QSlider *startSpeedSlider;
QLabel *startSpeedLabel;
};

0 comments on commit c21d48a

Please sign in to comment.