Skip to content

Commit 8ab69f0

Browse files
author
Thomas Witte
committed
added config dialog, blockly highlighting works
1 parent 1f3c749 commit 8ab69f0

11 files changed

Lines changed: 266 additions & 36 deletions

File tree

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ catkin_package(
122122

123123
set(interactive_script_plugin_SRCS
124124
src/interactive_script_plugin/interactive_script_plugin.cpp
125+
src/interactive_script_plugin/configdialog.cpp
125126
src/interactive_script_plugin/marker_interface.cpp
126127
src/interactive_script_plugin/quad_interface.cpp
127128
src/interactive_script_plugin/tf_interface.cpp
@@ -132,6 +133,7 @@ set(interactive_script_plugin_SRCS
132133

133134
set(interactive_script_plugin_HDRS
134135
include/interactive_script/interactive_script_plugin.h
136+
include/interactive_script/configdialog.h
135137
include/interactive_script/marker_interface.h
136138
include/interactive_script/quad_interface.h
137139
include/interactive_script/tf_interface.h
@@ -142,6 +144,7 @@ set(interactive_script_plugin_HDRS
142144

143145
set(interactive_script_plugin_UIS
144146
src/interactive_script_plugin/interactive_script_plugin.ui
147+
src/interactive_script_plugin/configdialog.ui
145148
)
146149

147150
qt5_wrap_cpp(interactive_script_plugin_MOCS ${interactive_script_plugin_HDRS})

include/interactive_script/blocklybridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class BlocklyBridge : public QObject
1717

1818
signals:
1919
void highlight_block(QString id);
20+
void highlight_field(QString id, QString field);
21+
void remove_highlights();
2022
void set_field_value(QString id, QString field, QString value);
2123

2224
public slots:

include/interactive_script/blocklywidget.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class BlocklyWidget : public QWebEngineView
2424

2525
public slots:
2626
void setBlockValue(QString, QString, QString);
27+
void highlightBlock(QString);
28+
void highlightField(QString, QString);
29+
void removeHighlights();
2730
};
2831

2932
#endif // BLOCKLYWIDGET_H

include/interactive_script/builtins.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ using SourceChangeMessage = shared_ptr<lua::rt::SourceChange>;
2020
Q_DECLARE_METATYPE(SourceChangeMessage);
2121
Q_DECLARE_METATYPE(QTextCharFormat);
2222

23+
struct InteractiveScriptSettings {
24+
bool print_performance_statistics = false;
25+
bool click_for_dependency_trace = true;
26+
bool dependency_trace_colors = true;
27+
bool move_markers = true;
28+
};
29+
2330
/* The syntax highlighting goes completely haywire in the context of QObjects
2431
* and VisualizationInterpreter does not include the plugin header for the same
2532
* reason. To connect the two the signal object is used
@@ -35,6 +42,8 @@ struct SignalObject : QObject {
3542
void highlightTokens(TokenMessage, QTextCharFormat);
3643
void removeFormatting();
3744
void setBlockValue(QString, QString, QString);
45+
void highlightBlock(QString);
46+
void highlightField(QString, QString);
3847
};
3948

4049
struct Interpreter {
@@ -62,8 +71,8 @@ struct VisualizationInterpreter {
6271
LuaParser parser;
6372
PerformanceStatistics ps;
6473

65-
void run_script(std::string& script);
66-
void populate_visualization_env(lua::rt::Environment& env, LuaParser& parser);
74+
void run_script(std::string& script, const InteractiveScriptSettings& settings);
75+
void populate_visualization_env(lua::rt::Environment& env, LuaParser& parser, const InteractiveScriptSettings& settings);
6776
};
6877

6978
struct LiveScriptInterpreter {
@@ -75,7 +84,7 @@ struct LiveScriptInterpreter {
7584
SignalObject signal;
7685
LuaParser parser;
7786

78-
void run_script(const std::string& script);
87+
void run_script(const std::string& script, const InteractiveScriptSettings& settings);
7988
void populate_live_env(lua::rt::Environment& env, const Async::cancel_t& cancelled);
8089
};
8190

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef CONFIGDIALOG_H
2+
#define CONFIGDIALOG_H
3+
4+
#include <QDialog>
5+
#include "ui_configdialog.h"
6+
7+
namespace Ui {
8+
class ConfigDialog;
9+
}
10+
11+
class ConfigDialog : public QDialog
12+
{
13+
Q_OBJECT
14+
15+
public:
16+
explicit ConfigDialog(QWidget *parent = nullptr);
17+
~ConfigDialog();
18+
19+
Ui::ConfigDialog *ui;
20+
};
21+
22+
#endif // CONFIGDIALOG_H

include/interactive_script/interactive_script_plugin.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <ros/console.h>
1111
#include <ui_interactive_script_plugin.h>
1212
#include <QWidget>
13+
#include <interactive_script/configdialog.h>
1314
#include <memory>
1415
#include <interactive_script/builtins.h>
1516
#include <interactive_script/blocklybridge.h>
@@ -35,11 +36,12 @@ class InteractiveScriptGui
3536
void removeFormatting();
3637

3738
// Comment in to signal that the plugin has a way to configure it
38-
// bool hasConfiguration() const;
39-
// void triggerConfiguration();
39+
bool hasConfiguration() const;
40+
void triggerConfiguration();
4041
Ui::InteractiveScriptWidget ui_;
4142
private:
42-
bool setting_print_performance_statistics = false;
43+
44+
InteractiveScriptSettings settings;
4345

4446
QWidget* widget_ = nullptr;
4547

src/interactive_script_plugin/blocklywidget.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,15 @@ void BlocklyWidget::setEditor(QPlainTextEdit *editor) {
2525
void BlocklyWidget::setBlockValue(QString id, QString field, QString value) {
2626
emit bridge->set_field_value(id, field, value);
2727
}
28+
29+
void BlocklyWidget::highlightBlock(QString id) {
30+
emit bridge->highlight_block(id);
31+
}
32+
33+
void BlocklyWidget::highlightField(QString id, QString field) {
34+
emit bridge->highlight_field(id, field);
35+
}
36+
37+
void BlocklyWidget::removeHighlights() {
38+
emit bridge->remove_highlights();
39+
}

src/interactive_script_plugin/builtins.cpp

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ QTextCharFormat format(Qt::GlobalColor bg_color, Qt::GlobalColor fg_color = Qt::
3737
return fmt;
3838
}
3939

40-
void VisualizationInterpreter::run_script(std::string& script) {
40+
void VisualizationInterpreter::run_script(std::string& script, const InteractiveScriptSettings& settings) {
4141
if (is_running.exchange(true)) { // avoid running scripts in parallel
4242
return;
4343
}
@@ -47,7 +47,7 @@ void VisualizationInterpreter::run_script(std::string& script) {
4747

4848
auto exec_start = chrono::steady_clock::now();
4949
Interpreter interpreter {parser};
50-
populate_visualization_env(*interpreter.env, interpreter.parser);
50+
populate_visualization_env(*interpreter.env, interpreter.parser, settings);
5151
auto exec_ready = chrono::steady_clock::now();
5252

5353
switch (auto [c, s] = interpreter.dostring(script, ps); c) {
@@ -84,7 +84,7 @@ void VisualizationInterpreter::run_script(std::string& script) {
8484
is_running.store(false);
8585
}
8686

87-
void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaParser& parser) {
87+
void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaParser& parser, const InteractiveScriptSettings& settings) {
8888
env.assign("__quad_pose", make_shared<table>(
8989
vector<pair<val, val>> {{"x", 0},{"y", 0},{"z", 0},{"psi", 0}}), false);
9090

@@ -103,7 +103,7 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
103103
return {};
104104
}), false);
105105

106-
env.assign("moveTo", make_shared<cfunction>([this, &env, &parser](const vallist& args) mutable -> cfunction::result {
106+
env.assign("moveTo", make_shared<cfunction>([this, &env, &parser, settings](const vallist& args) mutable -> cfunction::result {
107107
if (args.size() == 4 && args[0].isnumber() && args[1].isnumber() && args[2].isnumber() && args[3].isnumber()) {
108108
val target = env.getvar("__quad_target");
109109
table& tab_target = *get<table_p>(target);
@@ -116,12 +116,13 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
116116
get<double>(args[1]),
117117
get<double>(args[2]),
118118
get<double>(args[3]),
119-
args[0].source.get(),
120-
args[1].source.get(),
121-
args[2].source.get(),
122-
args[3].source.get(),
123-
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, psi_source = args[3].source, this, tokens = parser.tokens, original_psi = get<double>(args[3])](const auto& feedback) mutable {
124-
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK) {
119+
args[0].source.get() && settings.move_markers,
120+
args[1].source.get() && settings.move_markers,
121+
args[2].source.get() && settings.move_markers,
122+
args[3].source.get() && settings.move_markers,
123+
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, psi_source = args[3].source,
124+
this, settings, tokens = parser.tokens, original_psi = get<double>(args[3])](const auto& feedback) mutable {
125+
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK && settings.click_for_dependency_trace) {
125126
vector<LuaToken> tokens;
126127
signal.removeFormatting();
127128

@@ -142,6 +143,10 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
142143
}
143144

144145
} else if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::MOUSE_UP) {
146+
if (feedback->control_name != "clicked") {
147+
signal.removeFormatting();
148+
}
149+
145150
auto changes = make_shared<lua::rt::SourceChangeAnd>();
146151
if (x_source && feedback->control_name == "move_x") {
147152
if (const auto& change = x_source->forceValue(feedback->pose.position.x))
@@ -162,7 +167,6 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
162167

163168
// apply and highlight changes
164169
if (feedback->control_name != "clicked") {
165-
signal.removeFormatting();
166170
QTextCharFormat fmt;
167171
fmt.setBackground(Qt::red);
168172
fmt.setForeground(Qt::white);
@@ -304,6 +308,8 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
304308
QString::fromStdString(field),
305309
QString::fromStdString(newval.to_string()));
306310

311+
signal.highlightField(QString::fromStdString(id), QString::fromStdString(field));
312+
307313
return nullopt;
308314
}
309315

@@ -316,6 +322,10 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
316322
}
317323

318324
vector<LuaToken> get_all_tokens() const override {
325+
// TODO: remove this hack
326+
327+
signal.highlightField(QString::fromStdString(id), QString::fromStdString(field));
328+
319329
return {};
320330
}
321331

@@ -334,15 +344,17 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
334344
auto rviz = make_shared<table>();
335345
env.assign("rviz", rviz, false);
336346

337-
(*rviz)["point"] = make_shared<lua::rt::cfunction>([this, &parser](const lua::rt::vallist& args) -> cfunction::result {
347+
(*rviz)["point"] = make_shared<lua::rt::cfunction>([this, settings, &parser](const lua::rt::vallist& args) -> cfunction::result {
338348
if (args.size() != 3 || !args[0].isnumber() || !args[1].isnumber() || !args[2].isnumber()) {
339349
signal.appendTerminal("point requires 3 number arguments");
340350
return {nil()};
341351
}
342352
marker.addPoint(get<double>(args[0]), get<double>(args[1]), get<double>(args[2]),
343-
args[0].source.get(), args[1].source.get(), args[2].source.get(),
344-
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, this, tokens = parser.tokens](const auto& feedback) mutable {
345-
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK) {
353+
args[0].source.get() && settings.move_markers,
354+
args[1].source.get() && settings.move_markers,
355+
args[2].source.get() && settings.move_markers,
356+
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, this, settings, tokens = parser.tokens](const auto& feedback) mutable {
357+
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK && settings.click_for_dependency_trace) {
346358
vector<LuaToken> tokens;
347359
signal.removeFormatting();
348360

@@ -359,6 +371,10 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
359371
}
360372

361373
} else if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::MOUSE_UP) {
374+
if (feedback->control_name != "clicked") {
375+
signal.removeFormatting();
376+
}
377+
362378
auto changes = make_shared<lua::rt::SourceChangeAnd>();
363379
if (x_source && feedback->control_name == "move_x") {
364380
if (const auto& change = x_source->forceValue(feedback->pose.position.x))
@@ -375,7 +391,6 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
375391

376392
// apply and highlight changes
377393
if (feedback->control_name != "clicked") {
378-
signal.removeFormatting();
379394
QTextCharFormat fmt;
380395
fmt.setBackground(Qt::red);
381396
fmt.setForeground(Qt::white);
@@ -398,15 +413,18 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
398413
return {};
399414
});
400415

401-
(*rviz)["pose"] = make_shared<lua::rt::cfunction>([this, &parser](const lua::rt::vallist& args) -> cfunction::result {
416+
(*rviz)["pose"] = make_shared<lua::rt::cfunction>([this, settings, &parser](const lua::rt::vallist& args) -> cfunction::result {
402417
if (args.size() != 4 || !args[0].isnumber() || !args[1].isnumber() || !args[2].isnumber() || !args[3].isnumber()) {
403418
signal.appendTerminal("pose requires 4 number arguments");
404419
return {nil()};
405420
}
406421
marker.addPose(get<double>(args[0]), get<double>(args[1]), get<double>(args[2]), get<double>(args[3]),
407-
args[0].source.get(), args[1].source.get(), args[2].source.get(), args[3].source.get(),
408-
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, psi_source = args[3].source, this, tokens = parser.tokens, original_psi = get<double>(args[3])](const auto& feedback) mutable {
409-
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK) {
422+
args[0].source.get() && settings.move_markers,
423+
args[1].source.get() && settings.move_markers,
424+
args[2].source.get() && settings.move_markers,
425+
args[3].source.get() && settings.move_markers,
426+
[x_source = args[0].source, y_source = args[1].source, z_source = args[2].source, psi_source = args[3].source, this, settings, tokens = parser.tokens, original_psi = get<double>(args[3])](const auto& feedback) mutable {
427+
if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::BUTTON_CLICK && settings.click_for_dependency_trace) {
410428
vector<LuaToken> tokens;
411429
signal.removeFormatting();
412430

@@ -427,6 +445,10 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
427445
}
428446

429447
} else if (feedback->event_type == visualization_msgs::InteractiveMarkerFeedback::MOUSE_UP) {
448+
if (feedback->control_name != "clicked") {
449+
signal.removeFormatting();
450+
}
451+
430452
auto changes = make_shared<lua::rt::SourceChangeAnd>();
431453
if (x_source && feedback->control_name == "move_x") {
432454
if (const auto& change = x_source->forceValue(feedback->pose.position.x))
@@ -447,7 +469,6 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
447469

448470
// apply and highlight changes
449471
if (feedback->control_name != "clicked") {
450-
signal.removeFormatting();
451472
QTextCharFormat fmt;
452473
fmt.setBackground(Qt::red);
453474
fmt.setForeground(Qt::white);
@@ -459,7 +480,7 @@ void VisualizationInterpreter::populate_visualization_env(Environment& env, LuaP
459480
});
460481
}
461482

462-
void LiveScriptInterpreter::run_script(const std::string& script) {
483+
void LiveScriptInterpreter::run_script(const std::string& script, const InteractiveScriptSettings&) {
463484
async = Async([this, script](const Async::cancel_t& cancelled){
464485
Interpreter interpreter {parser};
465486

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "interactive_script/configdialog.h"
2+
3+
ConfigDialog::ConfigDialog(QWidget *parent) :
4+
QDialog(parent),
5+
ui(new Ui::ConfigDialog)
6+
{
7+
ui->setupUi(this);
8+
}
9+
10+
ConfigDialog::~ConfigDialog()
11+
{
12+
delete ui;
13+
}

0 commit comments

Comments
 (0)