  class AbstractControl : public QFrame {
    Q_OBJECT
  
  protected:
    AbstractControl(const QString &title, const QString &desc = "", const QString &icon = "");
  
    QSize minimumSizeHint() const override {
      QSize size = QFrame::minimumSizeHint();
      size.setHeight(120);
      return size;
 
</s> remove   panel_layout = new QStackedLayout();
 </s> add   panel_widget = new QStackedWidget(); </s> remove   ParamControl(const QString &param, const QString &title, const QString &desc, const QString &icon) : ToggleControl(title, desc, icon) {
 </s> add   ParamControl(const QString &param, const QString &title, const QString &desc, const QString &icon, QWidget *parent = nullptr) : ToggleControl(title, desc, icon, parent) { </s> remove   setLayout(hlayout);
 </s> add   vlayout->addLayout(hlayout);

  // description
  if (!desc.isEmpty()) {
    description = new QLabel(desc);
    description->setContentsMargins(40, 20, 40, 20);
    description->setStyleSheet("font-size: 40px; color:grey");
    description->setWordWrap(true);
    description->setVisible(false);
    vlayout->addWidget(description);

    connect(title_label, &QPushButton::clicked, [=]() {
      description->setVisible(!description->isVisible());
    });
  }

  setLayout(vlayout);
  AbstractControl(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr);
  class AbstractControl : public QFrame {
    Q_OBJECT
  
  protected:
  AbstractControl(const QString &title, const QString &desc = "", const QString &icon = "", QWidget *parent = nullptr);
  
    QSize minimumSizeHint() const override {
      QSize size = QFrame::minimumSizeHint();
      size.setHeight(120);
      return size;
keep keep keep keep replace keep keep keep keep keep
 add descriptions in settings (#20453)

* add descriptions

* scroll scroll

* clean up

* try this

* scrolling on touch

* better scrolling

* we can afford 30fps

* remove that

Co-authored-by: Comma Device <device@comma.ai> 
selfdrive/ui/qt/widgets/controls.hpp