cabana: add dialog to open route from remote or local (#27183)
	
		
	
				
					
				
			* add OpenRouteDialog
* cleanup
* failed_to_load
* fix load
* clear message list and stream after open new route
* show message
* remove all tabs and charts after open
* use textEdited
* check route format
* cleanup loadRoute
old-commit-hash: 29d9d03759
			
			
				beeps
			
			
		
							parent
							
								
									b5b6a6a925
								
							
						
					
					
						commit
						7af5741071
					
				
				 16 changed files with 174 additions and 25 deletions
			
			
		| @ -0,0 +1,68 @@ | ||||
| #include "tools/cabana/route.h" | ||||
| 
 | ||||
| #include <QButtonGroup> | ||||
| #include <QFileDialog> | ||||
| #include <QHBoxLayout> | ||||
| #include <QLabel> | ||||
| #include <QMessageBox> | ||||
| #include <QPushButton> | ||||
| 
 | ||||
| #include "tools/cabana/streams/replaystream.h" | ||||
| 
 | ||||
| OpenRouteDialog::OpenRouteDialog(QWidget *parent) : QDialog(parent) { | ||||
|   // TODO: get route list from api.comma.ai
 | ||||
|   QHBoxLayout *edit_layout = new QHBoxLayout; | ||||
|   edit_layout->addWidget(new QLabel(tr("Route:"))); | ||||
|   edit_layout->addWidget(route_edit = new QLineEdit(this)); | ||||
|   route_edit->setPlaceholderText(tr("Enter remote route name or click browse to select a local route")); | ||||
|   auto file_btn = new QPushButton(tr("Browse..."), this); | ||||
|   edit_layout->addWidget(file_btn); | ||||
| 
 | ||||
|   btn_box = new QDialogButtonBox(QDialogButtonBox::Open | QDialogButtonBox::Cancel); | ||||
|   btn_box->button(QDialogButtonBox::Open)->setEnabled(false); | ||||
| 
 | ||||
|   QVBoxLayout *main_layout = new QVBoxLayout(this); | ||||
|   main_layout->addStretch(0); | ||||
|   main_layout->addLayout(edit_layout); | ||||
|   main_layout->addStretch(0); | ||||
|   main_layout->addWidget(btn_box); | ||||
|   setMinimumSize({550, 120}); | ||||
| 
 | ||||
|   QObject::connect(btn_box, &QDialogButtonBox::accepted, this, &OpenRouteDialog::loadRoute); | ||||
|   QObject::connect(btn_box, &QDialogButtonBox::rejected, this, &QDialog::reject); | ||||
|   QObject::connect(route_edit, &QLineEdit::textChanged, [this]() { | ||||
|     btn_box->button(QDialogButtonBox::Open)->setEnabled(!route_edit->text().isEmpty()); | ||||
|   }); | ||||
|   QObject::connect(file_btn, &QPushButton::clicked, [=]() { | ||||
|     QString dir = QFileDialog::getExistingDirectory(this, tr("Open Local Route"), settings.last_route_dir); | ||||
|     if (!dir.isEmpty()) { | ||||
|       route_edit->setText(dir); | ||||
|       settings.last_route_dir = QFileInfo(dir).absolutePath(); | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| void OpenRouteDialog::loadRoute() { | ||||
|   btn_box->setEnabled(false); | ||||
| 
 | ||||
|   QString route = route_edit->text(); | ||||
|   QString data_dir; | ||||
|   if (int idx = route.lastIndexOf('/'); idx != -1) { | ||||
|     data_dir = route.mid(0, idx + 1); | ||||
|     route = route.mid(idx + 1); | ||||
|   } | ||||
| 
 | ||||
|   bool is_valid_format = Route::parseRoute(route).str.size() > 0; | ||||
|   if (!is_valid_format) { | ||||
|     QMessageBox::warning(nullptr, tr("Warning"), tr("Invalid route format: '%1'").arg(route)); | ||||
|   } else { | ||||
|     failed_to_load = !dynamic_cast<ReplayStream *>(can)->loadRoute(route, data_dir); | ||||
|     if (failed_to_load) { | ||||
|       QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to load route: '%1'").arg(route)); | ||||
|     } else { | ||||
|       accept(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   btn_box->setEnabled(true); | ||||
| } | ||||
| @ -0,0 +1,19 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include <QDialogButtonBox> | ||||
| #include <QLineEdit> | ||||
| #include <QDialog> | ||||
| 
 | ||||
| class OpenRouteDialog : public QDialog { | ||||
|   Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|   OpenRouteDialog(QWidget *parent); | ||||
|   void loadRoute(); | ||||
|   inline bool failedToLoad() const { return failed_to_load; } | ||||
| 
 | ||||
| private: | ||||
|   QLineEdit *route_edit; | ||||
|   QDialogButtonBox *btn_box; | ||||
|   bool failed_to_load = false; | ||||
| }; | ||||
					Loading…
					
					
				
		Reference in new issue