PC Application: partial firmware update dialog

This commit is contained in:
Jan Käberich 2020-08-30 22:03:41 +02:00
parent 8c8749accd
commit 07ba714f1f
134 changed files with 13954 additions and 7 deletions

View file

@ -0,0 +1,84 @@
#include "menu.h"
#include <QKeyEvent>
#include "menuaction.h"
#include <iostream>
using namespace std;
Menu::Menu(QStackedLayout &layout, QString name)
: name(name),
m_containingLayout(layout)
{
m_layout = new QVBoxLayout;
setLayout(m_layout);
m_widgetCount = 0;
setFixedSize(180, 800);
parent = nullptr;
layout.addWidget(this);
if(name.length() > 0) {
auto back = new MenuAction(name, MenuAction::ArrowType::Left);
back->setStyleSheet("background-color:lightblue;");
connect(back, &MenuAction::triggered, this, &Menu::leave);
addItem(back);
}
}
void Menu::addItem(MenuItem *i)
{
if(m_widgetCount >= maxWidgets) {
throw runtime_error("Menu already at maximum capacity");
}
m_layout->addWidget(i, 1);
items.push_back(i);
m_widgetCount++;
}
void Menu::addMenu(Menu *m)
{
auto menuLabel = new MenuAction(m->name, MenuAction::ArrowType::Right);
submenus.push_back(SubmenuEntry(menuLabel, m, m_widgetCount));
connect(menuLabel, &MenuAction::triggered, [=]() {
m->m_containingLayout.setCurrentWidget(m);
});
addItem(menuLabel);
m->parent = this;
}
void Menu::finalize()
{
m_layout->addStretch(maxWidgets - m_widgetCount);
}
void Menu::keyPressEvent(QKeyEvent *event)
{
// check if softkey pressed
int index = -1;
switch(event->key()) {
case Qt::Key_F1: index = 0; break;
case Qt::Key_F2: index = 1; break;
case Qt::Key_F3: index = 2; break;
case Qt::Key_F4: index = 3; break;
case Qt::Key_F5: index = 4; break;
case Qt::Key_F6: index = 5; break;
case Qt::Key_F7: index = 6; break;
case Qt::Key_F8: index = 7; break;
}
if(index >= 0) {
auto w = m_layout->itemAt(index);
w->widget()->setFocus();
items[index]->userSelected();
event->accept();
} else if(event->key() == Qt::Key_Escape) {
leave();
event->accept();
}
}
void Menu::leave()
{
if(parent) {
// got a parent menu
parent->m_containingLayout.setCurrentWidget(parent);
}
}

View file

@ -0,0 +1,41 @@
#ifndef MENU_H
#define MENU_H
#include <QWidget>
#include <QStackedLayout>
#include "menuitem.h"
#include "menuaction.h"
class Menu : public QWidget
{
Q_OBJECT
public:
Menu(QStackedLayout &layout, QString name = QString());
void addItem(MenuItem *i);
void addMenu(Menu *m);
void finalize();
signals:
protected:
void keyPressEvent(QKeyEvent *event) override;
private:
void leave();
class SubmenuEntry {
public:
SubmenuEntry(MenuAction *label, Menu *menu, int index) :
label(label), menu(menu), index(index){};
MenuAction *label;
Menu *menu;
int index;
};
static constexpr int maxWidgets = 12;
QVBoxLayout *m_layout;
Menu *parent;
const QString name;
QStackedLayout &m_containingLayout;
std::vector<SubmenuEntry> submenus;
std::vector<MenuItem*> items;
int m_widgetCount;
};
#endif // MENU_H

View file

@ -0,0 +1,65 @@
#include "menuaction.h"
#include <QLabel>
#include <QStyle>
#include <QSizePolicy>
MenuAction::MenuAction(const QString &l, MenuAction::ArrowType arrow)
{
subline = nullptr;
auto label = new QLabel(l, this);
label->setAlignment(Qt::AlignCenter);
auto labelLayout = new QHBoxLayout();
if(arrow == ArrowType::Left) {
auto lIcon = new QLabel(this);
lIcon->setPixmap(style()->standardIcon(QStyle::SP_ArrowLeft).pixmap(16));
lIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
labelLayout->addWidget(lIcon);
}
labelLayout->addWidget(label);
if(arrow == ArrowType::Right) {
auto lIcon = new QLabel(this);
lIcon->setPixmap(style()->standardIcon(QStyle::SP_ArrowRight).pixmap(16));
lIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
labelLayout->addWidget(lIcon);
}
layout.addLayout(labelLayout);
setLayout(&layout);
}
void MenuAction::AddSubline(const QString &l)
{
if(!subline) {
subline = new QLabel(this);
subline->setAlignment(Qt::AlignCenter);
layout.addWidget(subline);
}
QFont f( "Arial", 8);
subline->setFont( f);
subline->setText(l);
}
void MenuAction::RemoveSubline()
{
if(subline) {
layout.removeWidget(subline);
delete subline;
subline = nullptr;
}
}
void MenuAction::userSelected()
{
emit triggered();
}
void MenuAction::mouseReleaseEvent(QMouseEvent *me)
{
setFrameStyle(QFrame::Raised | QFrame::Panel);
MenuItem::mouseReleaseEvent(me);
}
void MenuAction::mousePressEvent(QMouseEvent *)
{
setFrameStyle(QFrame::Sunken | QFrame::Panel);
}

View file

@ -0,0 +1,33 @@
#ifndef MENULABEL_H
#define MENULABEL_H
#include "menuitem.h"
#include <QVBoxLayout>
#include <QLabel>
class MenuAction : public MenuItem
{
Q_OBJECT
public:
enum class ArrowType {
None,
Left,
Right,
};
MenuAction(const QString &l, ArrowType arrow = ArrowType::None);
void AddSubline(const QString &l);
void RemoveSubline();
signals:
void triggered();
public slots:
void userSelected() override;
private:
QVBoxLayout layout;
QLabel *subline;
protected:
void mouseReleaseEvent(QMouseEvent *me) override;
void mousePressEvent(QMouseEvent *me) override;
};
#endif // MENULABEL_H

View file

@ -0,0 +1,36 @@
#include "menubool.h"
#include <QLabel>
MenuBool::MenuBool(QString name, bool defaultValue)
{
auto label = new QLabel(name, this);
label->setAlignment(Qt::AlignCenter);
layout.addWidget(label);
sw = new ToggleSwitch(this, defaultValue);
layout.addWidget(sw);
setLayout(&layout);
connect(sw, &ToggleSwitch::toggled, this, &MenuBool::valueChanged);
sw->setFocusPolicy(Qt::NoFocus);
}
void MenuBool::setValue(bool value)
{
sw->setState(value);
}
void MenuBool::userSelected()
{
sw->toggle();
}
void MenuBool::mouseReleaseEvent(QMouseEvent *me)
{
setFrameStyle(QFrame::Raised | QFrame::Panel);
MenuItem::mouseReleaseEvent(me);
}
void MenuBool::mousePressEvent(QMouseEvent *)
{
setFrameStyle(QFrame::Sunken | QFrame::Panel);
}

View file

@ -0,0 +1,28 @@
#ifndef MENUBOOL_H
#define MENUBOOL_H
#include <QObject>
#include "menuitem.h"
#include <QVBoxLayout>
#include "CustomWidgets/toggleswitch.h"
class MenuBool : public MenuItem
{
Q_OBJECT
public:
MenuBool(QString name, bool defaultValue = false);
signals:
void valueChanged(bool value);
public slots:
void setValue(bool value);
void userSelected() override;
protected:
void mouseReleaseEvent(QMouseEvent *me) override;
void mousePressEvent(QMouseEvent *me) override;
private:
QVBoxLayout layout;
ToggleSwitch *sw;
};
#endif // MENUBOOL_H

View file

@ -0,0 +1,17 @@
#include "menuitem.h"
#include <QMouseEvent>
MenuItem::MenuItem() : QFrame()
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
//setStyleSheet("*:focus {background: lightblue}");
setFocusPolicy(Qt::StrongFocus);
setFrameStyle(QFrame::Raised | QFrame::Panel);
}
void MenuItem::mouseReleaseEvent(QMouseEvent *me)
{
userSelected();
me->accept();
}

View file

@ -0,0 +1,20 @@
#ifndef MENUITEM_H
#define MENUITEM_H
#include <QFrame>
class MenuItem : public QFrame
{
Q_OBJECT
public:
MenuItem();
public slots:
virtual void userSelected(){};
protected:
void mouseReleaseEvent(QMouseEvent *me) override;
};
#endif // MENUITEM_H

View file

@ -0,0 +1,46 @@
#include "menuvalue.h"
#include <QVBoxLayout>
#include <math.h>
#include <sstream>
#include <iomanip>
#include "valueinput.h"
#include <QMouseEvent>
#include "unit.h"
#include <QDoubleValidator>
using namespace std;
MenuValue::MenuValue(QString name, double defaultValue, QString unit, QString prefixes, int precision)
: name(name)
{
if(prefixes.indexOf(' ') < 0) {
throw runtime_error("Prefix string must contain space");
}
auto layout = new QVBoxLayout;
auto label = new QLabel(name, this);
label->setAlignment(Qt::AlignCenter);
layout->addWidget(label);
lvalue = new SIUnitEdit(unit, prefixes, precision);
// pass on signal
connect(lvalue, &SIUnitEdit::valueChanged, this, &MenuValue::valueChanged);
layout->addWidget(lvalue);
setValue(defaultValue);
setLayout(layout);
}
void MenuValue::setValue(double value)
{
lvalue->setValue(value);
}
void MenuValue::setValueQuiet(double value)
{
lvalue->setValueQuiet(value);
}
void MenuValue::userSelected()
{
lvalue->setFocus();
//startInputDialog();
}

View file

@ -0,0 +1,26 @@
#ifndef MENUVALUE_H
#define MENUVALUE_H
#include "menuitem.h"
#include <QLabel>
#include <CustomWidgets/siunitedit.h>
class MenuValue : public MenuItem
{
Q_OBJECT
public:
MenuValue(QString name, double defaultValue = 0.0, QString unit = QString(), QString prefixes = " ", int precision = 0);
signals:
void valueChanged(double value);
public slots:
void setValue(double value);
// same as setValue, except that no valueChanged signal is emitted
void setValueQuiet(double value);
void userSelected() override;
private:
SIUnitEdit *lvalue;
const QString name;
};
#endif // MENUVALUE_H