Qt scroller class (#20549)

* initial commit

* class works

* cleanup

* naming

* text window

* fixes

* alerts are now scrollable

* dismiss

* fixed placement

* realease scrolling

* better

* better

* revert text

* naming

* parent
albatross
iejMac 2021-04-01 14:03:31 -07:00 committed by GitHub
parent 387bae9af9
commit 9afa14c47f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 59 additions and 20 deletions

View File

@ -14,7 +14,7 @@ if arch == "Darwin":
widgets_src = ["qt/widgets/input.cc", "qt/widgets/drive_stats.cc", "qt/sound.cc",
"qt/widgets/ssh_keys.cc", "qt/widgets/toggle.cc", "qt/widgets/controls.cc",
"qt/widgets/offroad_alerts.cc", "qt/widgets/setup.cc", "qt/widgets/keyboard.cc",
"#phonelibs/qrcode/QrCode.cc"]
"qt/widgets/scrollview.cc", "#phonelibs/qrcode/QrCode.cc"]
if arch != 'aarch64':
widgets_src += ["qt/offroad/networking.cc", "qt/offroad/wifiManager.cc"]
@ -22,7 +22,7 @@ widgets = qt_env.Library("qt_widgets", widgets_src, LIBS=base_libs)
qt_libs = base_libs + [widgets]
# spinner and text window
qt_env.Program("qt/text", ["qt/text.cc"], LIBS=base_libs)
qt_env.Program("qt/text", ["qt/text.cc"], LIBS=qt_libs)
qt_env.Program("qt/spinner", ["qt/spinner.cc"], LIBS=base_libs)
# build main UI

View File

@ -10,6 +10,7 @@
#include "widgets/input.hpp"
#include "widgets/toggle.hpp"
#include "widgets/offroad_alerts.hpp"
#include "widgets/scrollview.hpp"
#include "widgets/controls.hpp"
#include "widgets/ssh_keys.hpp"
#include "common/params.h"
@ -17,6 +18,7 @@
#include "selfdrive/hardware/hw.h"
#include "home.hpp"
QWidget * toggles_panel() {
QVBoxLayout *toggles_list = new QVBoxLayout();
@ -273,21 +275,8 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) {
sidebar_layout->addWidget(btn, 0, Qt::AlignRight);
panel->setContentsMargins(50, 25, 50, 25);
QScrollArea *panel_frame = new QScrollArea;
panel_frame->setWidget(panel);
panel_frame->setWidgetResizable(true);
panel_frame->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
panel_frame->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
panel_frame->setStyleSheet("background-color:transparent;");
QScroller *scroller = QScroller::scroller(panel_frame->viewport());
auto sp = scroller->scrollerProperties();
sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QVariant::fromValue<QScrollerProperties::OvershootPolicy>(QScrollerProperties::OvershootAlwaysOff));
scroller->grabGesture(panel_frame->viewport(), QScroller::LeftMouseButtonGesture);
scroller->setScrollerProperties(sp);
ScrollView *panel_frame = new ScrollView(panel, this);
panel_widget->addWidget(panel_frame);
QObject::connect(btn, &QPushButton::released, [=, w = panel_frame]() {

View File

@ -10,6 +10,13 @@
OffroadAlert::OffroadAlert(QWidget* parent) : QFrame(parent) {
QVBoxLayout *layout = new QVBoxLayout();
layout->setMargin(50);
layout->setSpacing(30);
QWidget *alerts_widget = new QWidget;
QVBoxLayout *alerts_layout = new QVBoxLayout;
alerts_layout->setMargin(0);
alerts_layout->setSpacing(30);
alerts_widget->setLayout(alerts_layout);
// setup labels for each alert
QString json = QString::fromStdString(util::read_file("../controls/lib/alerts_offroad.json"));
@ -23,13 +30,22 @@ OffroadAlert::OffroadAlert(QWidget* parent) : QFrame(parent) {
l->setWordWrap(true);
l->setStyleSheet("background-color: " + QString(severity ? "#E22C2C" : "#292929"));
l->setVisible(false);
layout->addWidget(l);
alerts_layout->addWidget(l);
}
alerts_layout->addStretch(1);
// release notes
releaseNotes.setWordWrap(true);
releaseNotes.setVisible(false);
releaseNotes.setStyleSheet("font-size: 48px;");
layout->addWidget(&releaseNotes);
releaseNotes.setAlignment(Qt::AlignTop);
releaseNotesScroll = new ScrollView(&releaseNotes, this);
layout->addWidget(releaseNotesScroll);
alertsScroll = new ScrollView(alerts_widget, this);
layout->addWidget(alertsScroll);
// bottom footer, dismiss + reboot buttons
QHBoxLayout *footer_layout = new QHBoxLayout();
@ -70,11 +86,12 @@ void OffroadAlert::refresh() {
updateAlerts();
rebootBtn.setVisible(updateAvailable);
releaseNotes.setVisible(updateAvailable);
releaseNotesScroll->setVisible(updateAvailable);
releaseNotes.setText(QString::fromStdString(params.get("ReleaseNotes")));
alertsScroll->setVisible(!updateAvailable);
for (const auto& [k, label] : alerts) {
label->setVisible(!updateAvailable && !label->text().isEmpty());
label->setVisible(!label->text().isEmpty());
}
}

View File

@ -6,6 +6,7 @@
#include <QLabel>
#include "common/params.h"
#include "widgets/scrollview.hpp"
class OffroadAlert : public QFrame {
Q_OBJECT
@ -22,6 +23,9 @@ private:
QPushButton rebootBtn;
void updateAlerts();
ScrollView *releaseNotesScroll;
ScrollView *alertsScroll;
signals:
void closeAlerts();

View File

@ -0,0 +1,18 @@
#include "scrollview.hpp"
ScrollView::ScrollView(QWidget *w, QWidget *parent) : QScrollArea(parent){
setWidget(w);
setWidgetResizable(true);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setStyleSheet("background-color:transparent;");
QScroller *scroller = QScroller::scroller(this->viewport());
QScrollerProperties sp = scroller->scrollerProperties();
sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QVariant::fromValue<QScrollerProperties::OvershootPolicy>(QScrollerProperties::OvershootAlwaysOff));
sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue<QScrollerProperties::OvershootPolicy>(QScrollerProperties::OvershootAlwaysOff));
scroller->grabGesture(this->viewport(), QScroller::LeftMouseButtonGesture);
scroller->setScrollerProperties(sp);
}

View File

@ -0,0 +1,11 @@
#pragma once
#include <QScroller>
#include <QScrollArea>
class ScrollView : public QScrollArea {
Q_OBJECT
public:
explicit ScrollView(QWidget *w = nullptr, QWidget *parent = nullptr);
};