Skip to content

Commit 60fc171

Browse files
author
Thomas Witte
committed
load and save
1 parent 7bf91f2 commit 60fc171

11 files changed

Lines changed: 155 additions & 0 deletions

File tree

interactive_script/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ set(interactive_script_plugin_SRCS
129129
src/interactive_script_plugin/builtins.cpp
130130
src/interactive_script_plugin/blocklybridge.cpp
131131
src/interactive_script_plugin/blocklywidget.cpp
132+
src/interactive_script_plugin/load_save_util.cpp
132133
)
133134

134135
set(interactive_script_plugin_HDRS
@@ -140,6 +141,7 @@ set(interactive_script_plugin_HDRS
140141
include/interactive_script/builtins.h
141142
include/interactive_script/blocklybridge.h
142143
include/interactive_script/blocklywidget.h
144+
include/interactive_script/load_save_util.h
143145
)
144146

145147
set(interactive_script_plugin_UIS

interactive_script/include/interactive_script/blocklybridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class BlocklyBridge : public QObject
1212
explicit BlocklyBridge(QObject *parent = nullptr);
1313
void setEditor(QPlainTextEdit *editor);
1414

15+
QString current_xml = "";
16+
1517
private:
1618
QPlainTextEdit *editor = nullptr;
1719

interactive_script/include/interactive_script/blocklywidget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ class BlocklyWidget : public QWebEngineView
1919
public:
2020
explicit BlocklyWidget(QWidget *parent = nullptr);
2121
void setEditor(QPlainTextEdit *editor);
22+
void loadXml(const QString& xml);
23+
QString xml();
2224

2325
signals:
2426

interactive_script/include/interactive_script/interactive_script_plugin.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <memory>
1515
#include <interactive_script/builtins.h>
1616
#include <interactive_script/blocklybridge.h>
17+
#include <interactive_script/load_save_util.h>
1718

1819
namespace interactive_script_plugin
1920
{
@@ -61,6 +62,8 @@ public slots:
6162
void onRunScriptClicked();
6263
void updateMarkerInterface() {vis.marker.update();}
6364
void updateTf();
65+
void on_save();
66+
void on_load();
6467
};
6568

6669
} // namespace rqt_graph_editor
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef LOAD_SAVE_UTIL_H
2+
#define LOAD_SAVE_UTIL_H
3+
4+
#include <optional>
5+
#include <string>
6+
7+
namespace load_save {
8+
9+
struct Filename {
10+
std::string name;
11+
enum {LUA, XML} format;
12+
};
13+
14+
std::optional<Filename> save_dialog(bool blockly_perspective);
15+
16+
std::optional<Filename> load_dialog();
17+
18+
void save_file(const Filename& filename, const std::string& content);
19+
20+
std::string load_file(const Filename& filename);
21+
22+
}
23+
24+
#endif // LOAD_SAVE_UTIL_H

interactive_script/interactive_script.files

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CMakeLists.txt
22
include/interactive_script/builtins.h
33
include/interactive_script/interactive_script_plugin.h
4+
include/interactive_script/load_save_util.h
45
include/interactive_script/marker_interface.h
56
include/interactive_script/quad_interface.h
67
include/interactive_script/tf_interface.h
@@ -12,6 +13,7 @@ setup.py
1213
src/interactive_script_plugin/builtins.cpp
1314
src/interactive_script_plugin/interactive_script_plugin.cpp
1415
src/interactive_script_plugin/interactive_script_plugin.ui
16+
src/interactive_script_plugin/load_save_util.cpp
1517
src/interactive_script_plugin/marker_interface.cpp
1618
src/interactive_script_plugin/quad_interface.cpp
1719
src/interactive_script_plugin/tf_interface.cpp

interactive_script/src/interactive_script_plugin/blocklybridge.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ void BlocklyBridge::state_changed(const QString& xml, const QString& lua) {
2727
if (editor) {
2828
editor->setPlainText(lua);
2929
}
30+
current_xml = xml;
3031
}
3132

3233
void BlocklyBridge::setEditor(QPlainTextEdit *editor) {

interactive_script/src/interactive_script_plugin/blocklywidget.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ BlocklyWidget::BlocklyWidget(QWidget *parent) : QWebEngineView(parent)
1818
page()->setWebChannel(channel);
1919
}
2020

21+
void BlocklyWidget::loadXml(const QString& xml) {
22+
std::cout << "Blockly.Xml.clearWorkspaceAndLoadFromXml('" + xml.toStdString() + "', workspace);" << std::endl;
23+
page()->runJavaScript("Blockly.Xml.clearWorkspaceAndLoadFromXml(Blockly.Xml.textToDom('" + xml + "'), workspace);");
24+
}
25+
26+
QString BlocklyWidget::xml() {
27+
return bridge->current_xml;
28+
}
29+
2130
void BlocklyWidget::setEditor(QPlainTextEdit *editor) {
2231
bridge->setEditor(editor);
2332
}

interactive_script/src/interactive_script_plugin/interactive_script_plugin.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ void InteractiveScriptGui::initPlugin(qt_gui_cpp::PluginContext& context)
4343

4444
connect(ui_.run_button, &QPushButton::clicked,
4545
this, &InteractiveScriptGui::onRunScriptClicked);
46+
connect(ui_.save_button, &QPushButton::clicked,
47+
this, &InteractiveScriptGui::on_save);
48+
connect(ui_.load_button, &QPushButton::clicked,
49+
this, &InteractiveScriptGui::on_load);
4650

4751
connect(&vis.signal, &SignalObject::changeEditorText,
4852
this, &InteractiveScriptGui::onChangeEditorText);
@@ -241,6 +245,38 @@ void InteractiveScriptGui::updateTf() {
241245
}
242246
}
243247

248+
void InteractiveScriptGui::on_save() {
249+
using namespace load_save;
250+
if(auto file = save_dialog(ui_.tabWidget->currentWidget() == ui_.blockly_tab)) {
251+
switch (file->format) {
252+
case Filename::XML:
253+
save_file(*file, ui_.blockly_widget->xml().toStdString());
254+
ui_.tabWidget->setCurrentWidget(ui_.blockly_tab);
255+
break;
256+
case Filename::LUA:
257+
save_file(*file, ui_.editor->toPlainText().toStdString());
258+
ui_.tabWidget->setCurrentWidget(ui_.code_tab);
259+
break;
260+
}
261+
}
262+
}
263+
264+
void InteractiveScriptGui::on_load() {
265+
using namespace load_save;
266+
if (auto file = load_dialog()) {
267+
switch (file->format) {
268+
case Filename::XML:
269+
ui_.blockly_widget->loadXml(QString::fromStdString(load_file(*file)));
270+
ui_.tabWidget->setCurrentWidget(ui_.blockly_tab);
271+
break;
272+
case Filename::LUA:
273+
ui_.editor->setPlainText(QString::fromStdString(load_file(*file)));
274+
ui_.tabWidget->setCurrentWidget(ui_.code_tab);
275+
break;
276+
}
277+
}
278+
}
279+
244280
bool InteractiveScriptGui::hasConfiguration() const {
245281
return true;
246282
}

interactive_script/src/interactive_script_plugin/interactive_script_plugin.ui

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@
1919
<layout class="QVBoxLayout" name="verticalLayout">
2020
<item>
2121
<layout class="QHBoxLayout" name="horizontalLayout">
22+
<item>
23+
<widget class="QPushButton" name="save_button">
24+
<property name="text">
25+
<string>Save</string>
26+
</property>
27+
</widget>
28+
</item>
29+
<item>
30+
<widget class="QPushButton" name="load_button">
31+
<property name="text">
32+
<string>Load</string>
33+
</property>
34+
</widget>
35+
</item>
2236
<item>
2337
<spacer name="horizontalSpacer">
2438
<property name="orientation">

0 commit comments

Comments
 (0)