Skip to content

Commit 9520a74

Browse files
author
Thomas Witte
committed
blockly roundtrip works
1 parent e990c8c commit 9520a74

11 files changed

Lines changed: 211 additions & 11 deletions

CMakeLists.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ find_package(catkin REQUIRED COMPONENTS
2020
)
2121

2222
## System dependencies are found with CMake's conventions
23-
find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
23+
find_package(Qt5 COMPONENTS Core Widgets WebEngineWidgets REQUIRED)
2424

2525

2626
## Uncomment this if the package has a setup.py. This macro ensures
@@ -125,6 +125,8 @@ set(interactive_script_plugin_SRCS
125125
src/interactive_script_plugin/quad_interface.cpp
126126
src/interactive_script_plugin/tf_interface.cpp
127127
src/interactive_script_plugin/builtins.cpp
128+
src/interactive_script_plugin/blocklybridge.cpp
129+
src/interactive_script_plugin/blocklywidget.cpp
128130
)
129131

130132
set(interactive_script_plugin_HDRS
@@ -133,6 +135,8 @@ set(interactive_script_plugin_HDRS
133135
include/interactive_script/quad_interface.h
134136
include/interactive_script/tf_interface.h
135137
include/interactive_script/builtins.h
138+
include/interactive_script/blocklybridge.h
139+
include/interactive_script/blocklywidget.h
136140
)
137141

138142
set(interactive_script_plugin_UIS
@@ -195,7 +199,7 @@ add_library(${PROJECT_NAME}
195199
## Specify libraries to link a library or executable target against
196200
target_link_libraries(${PROJECT_NAME}
197201
${catkin_LIBRARIES}
198-
Qt5::Widgets Qt5::Core
202+
Qt5::Widgets Qt5::Core Qt5::WebEngineWidgets
199203
MiniLua
200204
)
201205

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#ifndef BLOCKLYBRIDGE_H
2+
#define BLOCKLYBRIDGE_H
3+
4+
#include <iostream>
5+
#include <QObject>
6+
#include <QPlainTextEdit>
7+
8+
class BlocklyBridge : public QObject
9+
{
10+
Q_OBJECT
11+
public:
12+
explicit BlocklyBridge(QObject *parent = nullptr);
13+
void setEditor(QPlainTextEdit *editor);
14+
15+
private:
16+
QPlainTextEdit *editor = nullptr;
17+
18+
signals:
19+
void highlight_block(QString id);
20+
void set_field_value(QString id, QString field, QString value);
21+
22+
public slots:
23+
void log(const QString& msg);
24+
void on_event(const QString& type, const QString& workspace_id, const QString& block_id, const QString& group_id);
25+
void state_changed(const QString& xml, const QString& lua);
26+
};
27+
28+
#endif // BLOCKLYBRIDGE_H
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef BLOCKLYWIDGET_H
2+
#define BLOCKLYWIDGET_H
3+
4+
#include <iostream>
5+
#include <QObject>
6+
#include <QPlainTextEdit>
7+
#include <QWebEngineView>
8+
#include <QWebChannel>
9+
#include "interactive_script/blocklybridge.h"
10+
11+
class BlocklyWidget : public QWebEngineView
12+
{
13+
Q_OBJECT
14+
15+
private:
16+
BlocklyBridge *bridge;
17+
QWebChannel *channel;
18+
19+
public:
20+
explicit BlocklyWidget(QWidget *parent = nullptr);
21+
void setEditor(QPlainTextEdit *editor);
22+
23+
signals:
24+
25+
public slots:
26+
void setBlockValue(QString, QString, QString);
27+
};
28+
29+
#endif // BLOCKLYWIDGET_H

include/interactive_script/builtins.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct SignalObject : QObject {
3434
void appendTerminal(QString);
3535
void highlightTokens(TokenMessage);
3636
void removeFormatting();
37+
void setBlockValue(QString, QString, QString);
3738
};
3839

3940
struct Interpreter {

include/interactive_script/interactive_script_plugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <QWidget>
1313
#include <memory>
1414
#include <interactive_script/builtins.h>
15+
#include <interactive_script/blocklybridge.h>
1516

1617
namespace interactive_script_plugin
1718
{

interactive_script.files

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ include/interactive_script/interactive_script_plugin.h
44
include/interactive_script/marker_interface.h
55
include/interactive_script/quad_interface.h
66
include/interactive_script/tf_interface.h
7+
include/interactive_script/blocklybridge.h
8+
include/interactive_script/blocklywidget.h
79
package.xml
810
plugin.xml
911
setup.py
@@ -13,3 +15,5 @@ src/interactive_script_plugin/interactive_script_plugin.ui
1315
src/interactive_script_plugin/marker_interface.cpp
1416
src/interactive_script_plugin/quad_interface.cpp
1517
src/interactive_script_plugin/tf_interface.cpp
18+
src/interactive_script_plugin/blocklybridge.cpp
19+
src/interactive_script_plugin/blocklywidget.cpp
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "interactive_script/blocklybridge.h"
2+
3+
BlocklyBridge::BlocklyBridge(QObject *parent) : QObject(parent)
4+
{
5+
6+
}
7+
8+
void BlocklyBridge::log(const QString& msg) {
9+
std::cout << msg.toStdString() << std::endl;
10+
}
11+
12+
void BlocklyBridge::on_event(const QString& type, const QString& workspace_id, const QString& block_id, const QString& group_id) {
13+
std::cout << type.toStdString() << " " << block_id.toStdString() << std::endl;
14+
15+
// if (type == "create") {
16+
// highlight_block(block_id);
17+
// }
18+
19+
// if (type == "move") {
20+
// set_field_value(block_id, "42", "NUM");
21+
// }
22+
}
23+
24+
void BlocklyBridge::state_changed(const QString& xml, const QString& lua) {
25+
std::cout << xml.toStdString() << std::endl;
26+
std::cout << lua.toStdString() << std::endl;
27+
if (editor) {
28+
editor->setPlainText(lua);
29+
}
30+
}
31+
32+
void BlocklyBridge::setEditor(QPlainTextEdit *editor) {
33+
this->editor = editor;
34+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#include "interactive_script/blocklywidget.h"
2+
3+
BlocklyWidget::BlocklyWidget(QWidget *parent) : QWebEngineView(parent)
4+
{
5+
load(QUrl("file:///home/thomas/catkin_ws/src/blockly/index.html"));
6+
7+
bridge = new BlocklyBridge();
8+
channel = new QWebChannel(this);
9+
10+
channel->registerObject("bridge", bridge);
11+
page()->setWebChannel(channel);
12+
}
13+
14+
void BlocklyWidget::setEditor(QPlainTextEdit *editor) {
15+
bridge->setEditor(editor);
16+
}
17+
18+
void BlocklyWidget::setBlockValue(QString id, QString field, QString value) {
19+
emit bridge->set_field_value(id, field, value);
20+
}

src/interactive_script_plugin/builtins.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,47 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
257257
return {nil()};
258258
}), false);
259259

260+
env.assign("blockValue", make_shared<cfunction>([this, &env](const vallist& args) mutable -> cfunction::result {
261+
if (args.size() != 3 || !args[0].isstring() || !args[1].isstring()) {
262+
signal.appendTerminal("invalid args to blockValue(id, field, val)");
263+
return {nil()};
264+
}
265+
266+
val result = args[2];
267+
268+
// set source
269+
struct block_val : sourceexp {
270+
block_val(SignalObject& signal, const string& id, const string& field) : signal(signal), id(id), field(field) {}
271+
272+
optional<shared_ptr<SourceChange>> forceValue(const val& newval) const override{
273+
// TODO: unsauber, SourceChangeBlock als return!
274+
signal.setBlockValue(QString::fromStdString(id),
275+
QString::fromStdString(field),
276+
QString::fromStdString(newval.to_string()));
277+
278+
return nullopt;
279+
}
280+
281+
eval_result_t reevaluate() override {
282+
return string{"not implemented"};
283+
}
284+
285+
bool isDirty() const override {
286+
return false;
287+
}
288+
289+
SignalObject& signal;
290+
string id;
291+
string field;
292+
};
293+
294+
result.source = std::make_shared<block_val>(signal,
295+
get<string>(args[0]),
296+
get<string>(args[1]));
297+
298+
return {result};
299+
}), false);
300+
260301
auto rviz = make_shared<table>();
261302
env.assign("rviz", rviz, false);
262303

src/interactive_script_plugin/interactive_script_plugin.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,16 @@ void InteractiveScriptGui::initPlugin(qt_gui_cpp::PluginContext& context)
6868
connect(&live.signal, &SignalObject::highlightTokens,
6969
this, &InteractiveScriptGui::onHighlightTokens);
7070

71+
if(!connect(&vis.signal, &SignalObject::setBlockValue,
72+
ui_.blockly_widget, &BlocklyWidget::setBlockValue))
73+
ROS_ERROR("could not connect signal setBlockValue");
7174

7275
setlocale(LC_ALL, "C");
7376
onTextChanged();
7477

78+
// set the editor into which the blockly widget writes the generated code
79+
ui_.blockly_widget->setEditor(ui_.editor);
80+
7581
QTimer* timer = new QTimer(this);
7682
timer->setInterval(1000/60.0);
7783
timer->start();

0 commit comments

Comments
 (0)