protobuf_factory.cpp
Go to the documentation of this file.
1 #include "protobuf_factory.h"
2 
3 #include <QSettings>
4 #include <QMessageBox>
5 
7 #include "PlotJuggler/svg_util.h"
8 
9 namespace gp = google::protobuf;
10 
11 
13 {
14  _widget = new QWidget(nullptr);
15  ui = new Ui::ProtobufLoader;
16  ui->setupUi(_widget);
17 
18  _source_tree.MapPath("", "");
19  _source_tree.MapPath("/", "/");
20 
21  loadSettings();
22 
23  QSettings settings;
24  QString theme = settings.value("Preferences::theme", "light").toString();
25  ui->pushButtonRemove->setIcon(LoadSvg(":/resources/svg/trash.svg", theme));
26 
27  connect( ui->pushButtonInclude, &QPushButton::clicked, this, &ParserFactoryProtobuf::onIncludeDirectory);
28  connect( ui->pushButtonLoad, &QPushButton::clicked, this, &ParserFactoryProtobuf::onLoadFile);
29  connect( ui->pushButtonRemove, &QPushButton::clicked, this, &ParserFactoryProtobuf::onRemoveInclude);
30 
31  QString last_type = settings.value("ProtobufParserCreator.lastType").toString();
32  int combo_index = ui->comboBox->findText(last_type, Qt::MatchExactly);
33  if( !last_type.isEmpty() && combo_index != -1)
34  {
35  ui->comboBox->setCurrentIndex(combo_index);
36  onComboChanged(last_type);
37  }
38 
39  connect( ui->comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
41 }
42 
43 void ParserFactoryProtobuf::importFile(QString filename)
44 {
45  QFile file(filename);
46  if( !file.exists() )
47  {
48  QMessageBox::warning(nullptr, tr("Error loading file"),
49  tr("File %1 does not exist").arg(filename),
50  QMessageBox::Cancel);
51  return;
52  }
53  file.open(QIODevice::ReadOnly);
54  FileInfo info;
55  QFileInfo fileinfo(filename);
56  QString file_basename = fileinfo.fileName();
57  info.file_path = filename;
58  info.proto_text = file.readAll();
59 
60  _source_tree.MapPath("", filename.toStdString());
61  _source_tree.MapPath("", file_basename.toStdString());
62  _source_tree.MapPath("", fileinfo.absolutePath().toStdString());
63 
64  FileErrorCollector error_collector;
65 
66  _importer.reset( new gp::compiler::Importer(&_source_tree, &error_collector) );
67  info.file_descriptor = _importer->Import(file_basename.toStdString());
68 
69  if( !info.file_descriptor )
70  {
71  if(error_collector.errors().size() > 0)
72  {
73  QMessageBox::warning(nullptr, "Error parsing Proto file",
74  error_collector.errors().front(),
75  QMessageBox::Cancel);
76  }
77  return;
78  }
79 
80  ui->loadedProto->setText(file_basename);
81  ui->protoPreview->setText(info.proto_text);
82  ui->comboBox->clear();
83 
84  for(int i=0; i < info.file_descriptor->message_type_count(); i++)
85  {
86  const std::string& type_name = info.file_descriptor->message_type(i)->name();
87  auto descriptor = info.file_descriptor->FindMessageTypeByName(type_name);
88  QString type_qname = QString::fromStdString(type_name);
89  info.descriptors.insert({type_qname, descriptor });
90  ui->comboBox->addItem(type_qname);
91  }
92  _loaded_file = std::move(info);
93 }
94 
96 {
97  ui->listWidget->clear();
98  ui->protoPreview->clear();
99 
100  QSettings settings;
101 
102  auto include_list = settings.value("ProtobufParserCreator.include_dirs").toStringList();
103  for (const auto& include_dir: include_list)
104  {
105  QDir path_dir(include_dir);
106  if (path_dir.exists())
107  {
108  ui->listWidget->addItem(include_dir);
109  _source_tree.MapPath("", include_dir.toStdString());
110  }
111  }
112  ui->listWidget->sortItems();
113 
114  auto filename = settings.value("ProtobufParserCreator.protofile").toString();
115  if( !filename.isEmpty() ){
116  importFile(filename);
117  }
118 }
119 
121 {
122  QSettings settings;
123  QStringList include_list;
124  for (int row=0; row<ui->listWidget->count(); row++)
125  {
126  include_list += ui->listWidget->item(row)->text();
127  }
128  settings.setValue("ProtobufParserCreator.include_dirs", include_list);
129  settings.setValue("ProtobufParserCreator.protofile", _loaded_file.file_path);
130 }
131 
133 {
134  delete ui;
135 }
136 
138  const std::string& type_name,
139  const std::string& schema,
141 {
142  QString descriptor_name = type_name.empty() ?
143  ui->comboBox->currentText() :
144  QString::fromStdString(type_name);
145  if( schema.empty() )
146  {
147  auto descr_it = _loaded_file.descriptors.find(descriptor_name);
148  if( descr_it == _loaded_file.descriptors.end())
149  {
150  throw std::runtime_error("ParserFactoryProtobuf: can't find the descriptor");
151  }
152  auto selected_descriptor = descr_it->second;
153  return std::make_shared<ProtobufParser>(topic_name, selected_descriptor, data );
154  }
155  else
156  {
157  gp::FileDescriptorSet field_set;
158  if (!field_set.ParseFromArray(schema.data(), schema.size()))
159  {
160  throw std::runtime_error("failed to parse schema data");
161  }
162 
163  return std::make_shared<ProtobufParser>(topic_name, type_name, field_set, data );
164  }
165 }
166 
168 {
169  QSettings settings;
170  QString directory_path =
171  settings.value("ProtobufParserCreator.loadDirectory", QDir::currentPath()).toString();
172 
173  QString dirname = QFileDialog::getExistingDirectory(_widget, tr("Load StyleSheet"), directory_path);
174  if (dirname.isEmpty())
175  {
176  return;
177  }
178  settings.setValue("ProtobufParserCreator.loadDirectory", dirname);
179  if( ui->listWidget->findItems(dirname, Qt::MatchExactly).empty() )
180  {
181  ui->listWidget->addItem( dirname );
182  ui->listWidget->sortItems();
183  }
184 }
185 
187 {
188  QSettings settings;
189 
190  QString directory_path =
191  settings.value("ProtobufParserCreator.loadDirectory", QDir::currentPath()).toString();
192 
193  QString filename = QFileDialog::getOpenFileName(_widget, tr("Load StyleSheet"),
194  directory_path, tr("(*.proto)"));
195  if (filename.isEmpty())
196  {
197  return;
198  }
199 
200  importFile(filename);
201 
202  directory_path = QFileInfo(filename).absolutePath();
203  settings.setValue("ProtobufParserCreator.loadDirectory", directory_path);
204 
205  saveSettings();
206 }
207 
209 {
210  auto selected = ui->listWidget->selectedItems();
211 
212  while(!selected.isEmpty())
213  {
214  auto item = selected.front();
215  delete ui->listWidget->takeItem(ui->listWidget->row(item));
216  selected.pop_front();
217  }
218  saveSettings();
219  loadSettings();
220 }
221 
222 
223 void ParserFactoryProtobuf::onComboChanged(const QString& text)
224 {
225  auto descr_it = _loaded_file.descriptors.find(text);
226  if( descr_it != _loaded_file.descriptors.end())
227  {
228  QSettings settings;
229  settings.setValue("ProtobufParserCreator.lastType", text);
230  }
231 }
232 
233 
234 
MessageParserPtr createParser(const std::string &topic_name, const std::string &type_name, const std::string &schema, PlotDataMapRef &data) override
google::protobuf::compiler::DiskSourceTree _source_tree
auto arg(const Char *name, const T &arg) -> detail::named_arg< Char, T >
Definition: core.h:1736
const QPixmap & LoadSvg(QString filename, QString style_name="light")
Definition: svg_util.h:26
std::shared_ptr< MessageParser > MessageParserPtr
void importFile(QString filename)
std::string type_name(lua_State *L, type t)
Definition: sol.hpp:8079
std::unique_ptr< google::protobuf::compiler::Importer > _importer
const T & move(const T &v)
Definition: backward.hpp:394
std::map< QString, const google::protobuf::Descriptor * > descriptors
dictionary data
Definition: mqtt_test.py:22
Ui::ProtobufLoader * ui
Definition: format.h:895
const google::protobuf::FileDescriptor * file_descriptor
void onComboChanged(const QString &text)
const QStringList & errors()


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon Jun 19 2023 03:01:38