diff --git a/examples/meshtastic-qt6/.gitignore b/examples/Qt6/9999/.gitignore
similarity index 100%
rename from examples/meshtastic-qt6/.gitignore
rename to examples/Qt6/9999/.gitignore
diff --git a/examples/Qt6/9999/qml/main.qml b/examples/Qt6/9999/qml/main.qml
new file mode 100644
index 0000000..3c4d921
--- /dev/null
+++ b/examples/Qt6/9999/qml/main.qml
@@ -0,0 +1,69 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import QtQuick.Window
+
+Rectangle {
+ id: main
+ width: 200
+ height: 300 + input.height
+ color: "lavender"
+
+ TextField {
+ id: input
+ objectName: "input"
+ width: parent.width
+ horizontalAlignment: Qt.AlignHCenter
+ text: "0000"
+ inputMask: "9999"
+ inputMethodHints: Qt.ImhDigitsOnly
+ focus: true
+
+ onTextChanged: Lisp.call("app:draw-number", Number(text))
+ }
+
+ Canvas {
+ id: canvas
+ objectName: "canvas"
+ y: input.height
+ width: parent.width
+ height: {
+ var h = Qt.inputMethod.keyboardRectangle.y
+ var f = (Qt.platform.os === "android") ? Screen.devicePixelRatio : 1
+ h = (h === 0) ? main.height : h / f
+ return (h - input.height)
+ }
+
+ property var ctx
+
+ // functions to be called from Lisp
+
+ function begin(color, width) {
+ ctx.beginPath()
+ ctx.strokeStyle = color
+ ctx.lineWidth = width
+ ctx.lineCap = "round"
+ }
+
+ function end() {
+ ctx.stroke()
+ }
+
+ function drawLine(x1, y1, x2, y2) {
+ ctx.moveTo(x1, y1)
+ ctx.lineTo(x2, y2)
+ }
+
+ onPaint: {
+ ctx = getContext("2d")
+ ctx.reset()
+ ctx.translate(canvas.width / 2, canvas.height / 2)
+ var s = height / 340
+ ctx.scale(s, s)
+
+ Lisp.call("app:paint")
+
+ ctx.stroke()
+ }
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/.gitignore b/examples/Qt6/advanced-qml-auto-reload/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.create-qml-loaders.lisp b/examples/Qt6/advanced-qml-auto-reload/qml/.create-qml-loaders.lisp
new file mode 100644
index 0000000..dde001b
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.create-qml-loaders.lisp
@@ -0,0 +1,22 @@
+(in-package :cl-user)
+
+(defparameter *dir* *load-truename*)
+
+(defvar *template* (with-open-file (s (merge-pathnames ".template.qml" *dir*))
+ (let ((str (make-string (file-length s))))
+ (read-sequence str s)
+ str)))
+
+(defun create-qml-loaders ()
+ (dolist (file (directory (merge-pathnames "ext/**/*.qml" *dir*)))
+ (let* ((name (namestring file))
+ (p (1+ (search "/ext/" name)))
+ (loader (concatenate 'string (subseq name 0 p) "." (subseq name p))))
+ (unless (probe-file loader)
+ (ensure-directories-exist loader)
+ (with-open-file (s loader :direction :output)
+ (let ((new (subseq name p)))
+ (format t "~&creating .~A~%" new)
+ (format s *template* (subseq name p))))))))
+
+(create-qml-loaders)
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page1.qml b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page1.qml
new file mode 100644
index 0000000..07bf006
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page1.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Loader {
+ objectName: "ext/Page1.qml"
+ source: objectName
+
+ Component.onCompleted: if (width === 0) { anchors.fill = parent }
+
+ function reload() {
+ var src = source
+ source = ""
+ Engine.clearCache()
+ source = src
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page2.qml b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page2.qml
new file mode 100644
index 0000000..59feeb5
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page2.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Loader {
+ objectName: "ext/Page2.qml"
+ source: objectName
+
+ Component.onCompleted: if (width === 0) { anchors.fill = parent }
+
+ function reload() {
+ var src = source
+ source = ""
+ Engine.clearCache()
+ source = src
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page3.qml b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page3.qml
new file mode 100644
index 0000000..60631d9
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Page3.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Loader {
+ objectName: "ext/Page3.qml"
+ source: objectName
+
+ Component.onCompleted: if (width === 0) { anchors.fill = parent }
+
+ function reload() {
+ var src = source
+ source = ""
+ Engine.clearCache()
+ source = src
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Repl.qml b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Repl.qml
new file mode 100644
index 0000000..c089b8b
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.ext/Repl.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Loader {
+ objectName: "ext/Repl.qml"
+ source: objectName
+
+ Component.onCompleted: if (width === 0) { anchors.fill = parent }
+
+ function reload() {
+ var src = source
+ source = ""
+ Engine.clearCache()
+ source = src
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/.template.qml b/examples/Qt6/advanced-qml-auto-reload/qml/.template.qml
new file mode 100644
index 0000000..5f53e52
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/.template.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Loader {
+ objectName: "~A"
+ source: objectName
+
+ Component.onCompleted: if (width === 0) { anchors.fill = parent }
+
+ function reload() {
+ var src = source
+ source = ""
+ Engine.clearCache()
+ source = src
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page1.qml b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page1.qml
new file mode 100644
index 0000000..301f884
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page1.qml
@@ -0,0 +1,15 @@
+import QtQuick
+
+Item {
+ Rectangle {
+ anchors.fill: parent
+ color: Qt.lighter("red", 1.5)
+ border.width: 10
+ border.color: "red"
+
+ Text {
+ anchors.centerIn: parent
+ text: "
page 1
"
+ }
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page2.qml b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page2.qml
new file mode 100644
index 0000000..66eba1a
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page2.qml
@@ -0,0 +1,16 @@
+import QtQuick
+
+Item {
+ Rectangle {
+ anchors.fill: parent
+ radius: 100
+ color: Qt.lighter("green", 3.0)
+ border.width: 10
+ border.color: "green"
+
+ Text {
+ anchors.centerIn: parent
+ text: "page 2
"
+ }
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page3.qml b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page3.qml
new file mode 100644
index 0000000..e17f89f
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Page3.qml
@@ -0,0 +1,18 @@
+import QtQuick
+
+Item {
+ Rectangle {
+ anchors.centerIn: parent
+ width: Math.min(parent.width, parent.height)
+ height: width
+ radius: width
+ color: Qt.lighter("blue", 1.7)
+ border.width: 10
+ border.color: "blue"
+
+ Text {
+ anchors.centerIn: parent
+ text: "page 3
"
+ }
+ }
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/ext/Repl.qml b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Repl.qml
new file mode 100644
index 0000000..5e123b1
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/ext/Repl.qml
@@ -0,0 +1,160 @@
+import QtQuick
+import QtQuick.Controls
+
+Item {
+ id: repl
+ z: 1
+ anchors.fill: parent
+
+ Row {
+ anchors.right: parent.right
+ z: 1
+
+ Text {
+ text: "REPL"
+ anchors.verticalCenter: show.verticalCenter
+ visible: !show.checked
+ }
+
+ Switch {
+ id: show
+
+ onCheckedChanged: container.enabled = checked
+ }
+ }
+
+ Column {
+ id: container
+ opacity: 0
+
+ Rectangle {
+ width: repl.parent.width
+ height: repl.parent.height / 4
+ color: "#101010"
+
+ ListView {
+ id: replOutput
+ objectName: "repl_output"
+ anchors.fill: parent
+ contentWidth: parent.width * 4
+ clip: true
+ model: replModel
+ flickableDirection: Flickable.HorizontalAndVerticalFlick
+
+ delegate: Column {
+ Rectangle {
+ width: replOutput.contentWidth
+ height: 1
+ color: "#707070"
+ visible: mLine
+ }
+
+ Text {
+ x: 2
+ padding: 2
+ textFormat: Text.PlainText
+ font.family: fontHack.name
+ font.bold: mBold
+ text: mText
+ color: mColor
+ }
+ }
+ }
+
+ ListModel {
+ id: replModel
+ objectName: "repl_model"
+
+ function appendText(data) {
+ append(data)
+ replOutput.contentX = 0
+ replOutput.positionViewAtEnd()
+ }
+ }
+ }
+
+ Row {
+ width: repl.parent.width
+
+ TextField {
+ id: input
+ objectName: "repl_input"
+ width: repl.parent.width - 2 * back.width
+ font.family: fontHack.name
+ font.bold: true
+ color: "#c0c0c0"
+ inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
+ focus: show.checked
+ palette {
+ highlight: "#e0e0e0"
+ highlightedText: "#101010"
+ }
+
+ background: Rectangle {
+ color: "#101010"
+ border.width: 2
+ border.color: "gray"
+ }
+
+ onAccepted: Lisp.call("eval:eval-in-thread", text)
+ }
+
+ Button {
+ id: back
+ objectName: "history_back"
+ width: 40
+ height: input.height
+ focusPolicy: Qt.NoFocus
+ font.family: fontIcons.name
+ font.pixelSize: 26
+ text: "\uf100"
+
+ onClicked: Lisp.call("eval:history-move", "back")
+ }
+
+ Rectangle {
+ width: 1
+ height: input.height
+ color: "#101010"
+ }
+
+ Button {
+ id: forward
+ objectName: "history_forward"
+ width: back.width
+ height: input.height
+ focusPolicy: Qt.NoFocus
+ font.family: fontIcons.name
+ font.pixelSize: 26
+ text: "\uf101"
+
+ onClicked: Lisp.call("eval:history-move", "forward")
+ }
+ }
+
+ Rectangle {
+ width: repl.parent.width
+ height: 1
+ color: "#101010"
+ }
+ }
+
+ ProgressBar {
+ objectName: "progress"
+ anchors.top: container.bottom
+ width: repl.width
+ z: 1
+ indeterminate: true
+ enabled: visible
+ visible: false
+ }
+
+ states: [
+ State { when: show.checked; PropertyChanges { target: container; opacity: 0.9; y: 0 }},
+ State { when: !show.checked; PropertyChanges { target: container; opacity: 0.0; y: -height }}
+ ]
+
+ transitions: [
+ Transition { NumberAnimation { properties: "opacity,y"; duration: 250; easing.type: Easing.InCubic }}
+ ]
+}
diff --git a/examples/Qt6/advanced-qml-auto-reload/qml/main.qml b/examples/Qt6/advanced-qml-auto-reload/qml/main.qml
new file mode 100644
index 0000000..601c1c2
--- /dev/null
+++ b/examples/Qt6/advanced-qml-auto-reload/qml/main.qml
@@ -0,0 +1,49 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import ".ext/" as Ext // for single file auto reload (development)
+//import "ext/" as Ext // release version
+
+Rectangle {
+ id: main
+ width: 300
+ height: 500
+ objectName: "main"
+ color: "black"
+
+ SwipeView {
+ id: view
+ objectName: "view"
+ anchors.fill: parent
+
+ Rectangle {
+ color: "white"
+
+ Ext.Repl {}
+
+ Text {
+ anchors.centerIn: parent
+ text: "swipe for next page"
+ }
+ }
+
+ // N.B. don't use Loader inside a Repeater here, won't work with single
+ // file auto reload (which already uses a Loader)
+
+ Ext.Page1 {}
+ Ext.Page2 {}
+ Ext.Page3 {}
+ }
+
+ PageIndicator {
+ anchors.bottom: view.bottom
+ anchors.bottomMargin: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+ count: view.count
+ currentIndex: view.currentIndex
+ }
+
+ FontLoader { id: fontIcons; source: "fonts/fontawesome-webfont.ttf" }
+ FontLoader { id: fontHack; source: "fonts/Hack-Regular.ttf" }
+ FontLoader { id: fontHackBold; source: "fonts/Hack-Bold.ttf" }
+}
diff --git a/examples/Qt6/meshtastic/.gitignore b/examples/Qt6/meshtastic/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/examples/Qt6/meshtastic/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/examples/meshtastic-qt6/platforms/android/AndroidManifest.xml b/examples/Qt6/meshtastic/platforms/android/AndroidManifest.xml
similarity index 100%
rename from examples/meshtastic-qt6/platforms/android/AndroidManifest.xml
rename to examples/Qt6/meshtastic/platforms/android/AndroidManifest.xml
diff --git a/examples/meshtastic-qt6/qml/ext/common/ComboBox.qml b/examples/Qt6/meshtastic/qml/ext/common/ComboBox.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/ComboBox.qml
rename to examples/Qt6/meshtastic/qml/ext/common/ComboBox.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/Help.qml b/examples/Qt6/meshtastic/qml/ext/common/Help.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/Help.qml
rename to examples/Qt6/meshtastic/qml/ext/common/Help.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/Hourglass.qml b/examples/Qt6/meshtastic/qml/ext/common/Hourglass.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/Hourglass.qml
rename to examples/Qt6/meshtastic/qml/ext/common/Hourglass.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/MainIcon.qml b/examples/Qt6/meshtastic/qml/ext/common/MainIcon.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/MainIcon.qml
rename to examples/Qt6/meshtastic/qml/ext/common/MainIcon.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/MainView.qml b/examples/Qt6/meshtastic/qml/ext/common/MainView.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/MainView.qml
rename to examples/Qt6/meshtastic/qml/ext/common/MainView.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/Menu.qml b/examples/Qt6/meshtastic/qml/ext/common/Menu.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/Menu.qml
rename to examples/Qt6/meshtastic/qml/ext/common/Menu.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/MenuItem.qml b/examples/Qt6/meshtastic/qml/ext/common/MenuItem.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/MenuItem.qml
rename to examples/Qt6/meshtastic/qml/ext/common/MenuItem.qml
diff --git a/examples/meshtastic-qt6/qml/ext/common/Toast.qml b/examples/Qt6/meshtastic/qml/ext/common/Toast.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/common/Toast.qml
rename to examples/Qt6/meshtastic/qml/ext/common/Toast.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/Confirm.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/Confirm.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/Confirm.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/Confirm.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/ConfirmMobile.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/ConfirmMobile.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/ConfirmMobile.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/ConfirmMobile.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/Dialogs.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/Dialogs.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/Dialogs.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/Dialogs.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/Input.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/Input.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/Input.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/Input.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/InputMobile.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/InputMobile.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/InputMobile.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/InputMobile.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/Message.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/Message.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/Message.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/Message.qml
diff --git a/examples/meshtastic-qt6/qml/ext/dialogs/MessageMobile.qml b/examples/Qt6/meshtastic/qml/ext/dialogs/MessageMobile.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/dialogs/MessageMobile.qml
rename to examples/Qt6/meshtastic/qml/ext/dialogs/MessageMobile.qml
diff --git a/examples/meshtastic-qt6/qml/ext/group/Group.qml b/examples/Qt6/meshtastic/qml/ext/group/Group.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/group/Group.qml
rename to examples/Qt6/meshtastic/qml/ext/group/Group.qml
diff --git a/examples/meshtastic-qt6/qml/ext/group/Map.qml b/examples/Qt6/meshtastic/qml/ext/group/Map.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/group/Map.qml
rename to examples/Qt6/meshtastic/qml/ext/group/Map.qml
diff --git a/examples/meshtastic-qt6/qml/ext/group/MapButton.qml b/examples/Qt6/meshtastic/qml/ext/group/MapButton.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/group/MapButton.qml
rename to examples/Qt6/meshtastic/qml/ext/group/MapButton.qml
diff --git a/examples/meshtastic-qt6/qml/ext/group/Markers.qml b/examples/Qt6/meshtastic/qml/ext/group/Markers.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/group/Markers.qml
rename to examples/Qt6/meshtastic/qml/ext/group/Markers.qml
diff --git a/examples/meshtastic-qt6/qml/ext/messages/EmojiView.qml b/examples/Qt6/meshtastic/qml/ext/messages/EmojiView.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/messages/EmojiView.qml
rename to examples/Qt6/meshtastic/qml/ext/messages/EmojiView.qml
diff --git a/examples/meshtastic-qt6/qml/ext/messages/Emojis.qml b/examples/Qt6/meshtastic/qml/ext/messages/Emojis.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/messages/Emojis.qml
rename to examples/Qt6/meshtastic/qml/ext/messages/Emojis.qml
diff --git a/examples/meshtastic-qt6/qml/ext/messages/Messages.qml b/examples/Qt6/meshtastic/qml/ext/messages/Messages.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/messages/Messages.qml
rename to examples/Qt6/meshtastic/qml/ext/messages/Messages.qml
diff --git a/examples/meshtastic-qt6/qml/ext/radios/BatteryLevel.qml b/examples/Qt6/meshtastic/qml/ext/radios/BatteryLevel.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/radios/BatteryLevel.qml
rename to examples/Qt6/meshtastic/qml/ext/radios/BatteryLevel.qml
diff --git a/examples/meshtastic-qt6/qml/ext/radios/Radios.qml b/examples/Qt6/meshtastic/qml/ext/radios/Radios.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/ext/radios/Radios.qml
rename to examples/Qt6/meshtastic/qml/ext/radios/Radios.qml
diff --git a/examples/meshtastic-qt6/qml/main.qml b/examples/Qt6/meshtastic/qml/main.qml
similarity index 100%
rename from examples/meshtastic-qt6/qml/main.qml
rename to examples/Qt6/meshtastic/qml/main.qml
diff --git a/examples/Qt6/planets/.gitignore b/examples/Qt6/planets/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/examples/Qt6/planets/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/examples/Qt6/planets/qml/main.qml b/examples/Qt6/planets/qml/main.qml
new file mode 100644
index 0000000..f706f91
--- /dev/null
+++ b/examples/Qt6/planets/qml/main.qml
@@ -0,0 +1,193 @@
+import QtQuick
+
+Item {
+ id: main
+ objectName: "main"
+ width: 300
+ height: 500
+
+ Rectangle {
+ anchors.fill: parent
+ color: "#101010"
+ }
+
+ ListView {
+ id: view
+ objectName: "view"
+ anchors.fill: parent
+ delegate: planetInfo
+ model: planets
+ }
+
+ ListModel {
+ id: planets
+ objectName: "planets"
+
+ // example of inline item
+ //ListElement { name: "Earth"; shape: "img/earth.png"; map: "img/earth-map.jpg"; info: "..." }
+
+ function addPlanet(planet) { append(planet) }
+ }
+
+ property int itemHeight: 44
+
+ Component {
+ id: planetInfo
+
+ Item {
+ id: wrapper
+ width: view.width
+ height: itemHeight
+
+ Rectangle {
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.top: parent.top
+ height: itemHeight
+ color: "#303060"
+ border.color: Qt.lighter(color, 1.2)
+
+ Text {
+ x: 15
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.leftMargin: 4
+ font.pixelSize: parent.height - 22
+ color: "#f0f0f0"
+ text: model.name // see Lisp keyword name
+ }
+ }
+
+ Rectangle {
+ id: image
+ width: itemHeight - 4
+ height: width
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.rightMargin: 2
+ anchors.topMargin: 2
+ color: "#101010"
+
+ Column {
+ id: imageColumn
+ anchors.fill: parent
+
+ Image {
+ id: shapeImage
+ height: parent.height - mapImage.height
+ width: parent.width
+ fillMode: Image.PreserveAspectFit
+ source: model.shape // see Lisp keyword name
+ }
+
+ Image {
+ id: mapImage
+ width: parent.width
+ height: 0
+ fillMode: Image.PreserveAspectFit
+ source: model.map // see Lisp keyword name
+ }
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: parent.state = "expanded"
+ }
+
+ Item {
+ id: infoView
+ anchors.top: image.bottom
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+ opacity: 0
+
+ Rectangle {
+ anchors.fill: parent
+ color: "#303060"
+ border.color: "#101010"
+ border.width: 1
+
+ Flickable {
+ id: flick
+ anchors.fill: parent
+ anchors.margins: 4
+ contentWidth: edit.paintedWidth
+ contentHeight: edit.paintedHeight
+ clip: true
+
+ function ensureVisible(r) {
+ if (contentX >= r.x)
+ contentX = r.x;
+ else if (contentX+width <= r.x + r.width)
+ contentX = r.x + r.width-width;
+ if (contentY >= r.y)
+ contentY = r.y;
+ else if (contentY+height <= r.y + r.height)
+ contentY = r.y + r.height-height;
+ }
+
+ TextEdit {
+ id: edit
+ width: flick.width
+ color: "#f0f0f0"
+ font.pixelSize: 16
+ readOnly: true
+ focus: true
+ wrapMode: TextEdit.Wrap
+ onCursorRectangleChanged: flick.ensureVisible(cursorRectangle)
+ text: model.info // see Lisp keyword name
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ id: closeButton
+ anchors.right: parent.right
+ anchors.top: parent.top
+ anchors.rightMargin: 2
+ anchors.topMargin: 2
+ width: itemHeight - 4
+ height: width
+ color: "transparent"
+ border.color: "#f0f0f0"
+ opacity: 0
+
+ Text {
+ anchors.centerIn: parent
+ color: "#f0f0f0"
+ font.bold: true
+ text: "X"
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: wrapper.state = ""
+ }
+ }
+
+ states: [
+ State {
+ name: "expanded"
+
+ PropertyChanges { target: wrapper; height: view.height }
+ PropertyChanges { target: image; width: view.width; height: view.height * 2/3; anchors.rightMargin: 0; anchors.topMargin: itemHeight }
+ PropertyChanges { target: mapImage; height: view.height * 1/3 }
+ PropertyChanges { target: infoView; opacity: 1 }
+ PropertyChanges { target: closeButton; opacity: 1 }
+ PropertyChanges { target: wrapper.ListView.view; contentY: wrapper.y; interactive: false }
+ }
+ ]
+
+ transitions: [
+ Transition {
+ NumberAnimation {
+ duration: 250
+ properties: "height,width,anchors.rightMargin,anchors.topMargin,opacity,contentY"
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/examples/meshtastic-qt6/readme.md b/examples/Qt6/readme.md
similarity index 100%
rename from examples/meshtastic-qt6/readme.md
rename to examples/Qt6/readme.md
diff --git a/examples/Qt6/sokoban/.gitignore b/examples/Qt6/sokoban/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/examples/Qt6/sokoban/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/examples/Qt6/sokoban/qml/ext/ArrowButton.qml b/examples/Qt6/sokoban/qml/ext/ArrowButton.qml
new file mode 100644
index 0000000..7904598
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/ArrowButton.qml
@@ -0,0 +1,16 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+
+Button {
+ width: main.small ? 37 : 50
+ height: width
+ flat: true
+ focusPolicy: Qt.NoFocus
+ font.family: fontAwesome.name
+ font.pixelSize: 1.2 * width
+ opacity: 0.2
+ scale: 1.2
+
+ onPressed: Lisp.call(this, "qsoko:button-pressed")
+}
diff --git a/examples/Qt6/sokoban/qml/ext/Button.qml b/examples/Qt6/sokoban/qml/ext/Button.qml
new file mode 100644
index 0000000..fa4c6f7
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/Button.qml
@@ -0,0 +1,13 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+
+Button {
+ width: main.small ? 32 : 50
+ height: width
+ font.family: fontAwesome.name
+ font.pixelSize: width - 6
+ opacity: 0.8
+
+ onPressed: Lisp.call(this, "qsoko:button-pressed")
+}
diff --git a/examples/Qt6/sokoban/qml/ext/Dynamic.qml b/examples/Qt6/sokoban/qml/ext/Dynamic.qml
new file mode 100644
index 0000000..4bbbafe
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/Dynamic.qml
@@ -0,0 +1,21 @@
+import QtQuick
+
+Item {
+ objectName: "dynamic"
+
+ property Component box: Qt.createComponent("dynamic/Box.qml")
+ property Component box2: Qt.createComponent("dynamic/Box2.qml")
+ property Component player: Qt.createComponent("dynamic/Player.qml")
+ property Component fixed: Qt.createComponent("dynamic/Fixed.qml")
+
+ function createItem(name) {
+ switch (name) {
+ case "object": return box.createObject()
+ case "object2": return box2.createObject()
+ case "player":
+ case "player2": return player.createObject()
+ case "wall":
+ case "goal": return fixed.createObject()
+ }
+ }
+}
diff --git a/examples/Qt6/sokoban/qml/ext/NumberAnimation.qml b/examples/Qt6/sokoban/qml/ext/NumberAnimation.qml
new file mode 100644
index 0000000..4ca8242
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/NumberAnimation.qml
@@ -0,0 +1,6 @@
+import QtQuick
+
+NumberAnimation {
+ onRunningChanged: Lisp.call("qsoko:animation-change", running)
+}
+
diff --git a/examples/Qt6/sokoban/qml/ext/RotationAnimation.qml b/examples/Qt6/sokoban/qml/ext/RotationAnimation.qml
new file mode 100644
index 0000000..baa9aeb
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/RotationAnimation.qml
@@ -0,0 +1,6 @@
+import QtQuick
+
+RotationAnimation {
+ onRunningChanged: Lisp.call("qsoko:animation-change", running)
+}
+
diff --git a/examples/Qt6/sokoban/qml/ext/ScaleAnimator.qml b/examples/Qt6/sokoban/qml/ext/ScaleAnimator.qml
new file mode 100644
index 0000000..b13df67
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/ScaleAnimator.qml
@@ -0,0 +1,5 @@
+import QtQuick
+
+ScaleAnimator {
+ onRunningChanged: Lisp.call("qsoko:animation-change", running)
+}
diff --git a/examples/Qt6/sokoban/qml/ext/SequentialAnimation.qml b/examples/Qt6/sokoban/qml/ext/SequentialAnimation.qml
new file mode 100644
index 0000000..008dbcb
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/SequentialAnimation.qml
@@ -0,0 +1,6 @@
+import QtQuick
+
+SequentialAnimation {
+ onRunningChanged: Lisp.call("qsoko:animation-change", running)
+}
+
diff --git a/examples/Qt6/sokoban/qml/ext/dynamic/Box.qml b/examples/Qt6/sokoban/qml/ext/dynamic/Box.qml
new file mode 100644
index 0000000..e71dc96
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/dynamic/Box.qml
@@ -0,0 +1,18 @@
+import QtQuick
+import "../" as Ext
+
+Image {
+ Behavior on x {
+ Ext.NumberAnimation {
+ duration: 150
+ easing.type: Easing.InQuart
+ }
+ }
+
+ Behavior on y {
+ Ext.NumberAnimation {
+ duration: 150
+ easing.type: Easing.InQuart
+ }
+ }
+}
diff --git a/examples/Qt6/sokoban/qml/ext/dynamic/Box2.qml b/examples/Qt6/sokoban/qml/ext/dynamic/Box2.qml
new file mode 100644
index 0000000..12d56b4
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/dynamic/Box2.qml
@@ -0,0 +1,48 @@
+import QtQuick
+import "../" as Ext
+
+Image {
+ id: box2
+
+ Behavior on x {
+ Ext.NumberAnimation {
+ duration: 150
+ easing.type: Easing.InQuart
+ }
+ }
+
+ Behavior on y {
+ Ext.NumberAnimation {
+ duration: 150
+ easing.type: Easing.InQuart
+ }
+ }
+
+ // final animation
+
+ Ext.SequentialAnimation {
+ objectName: "wiggle_box"
+ loops: 3
+
+ RotationAnimation {
+ target: box2
+ property: "rotation"
+ from: 0; to: 30
+ duration: 150
+ }
+
+ RotationAnimation {
+ target: box2
+ property: "rotation"
+ from: 30; to: -30
+ duration: 300
+ }
+
+ RotationAnimation {
+ target: box2
+ property: "rotation"
+ from: -30; to: 0
+ duration: 150
+ }
+ }
+}
diff --git a/examples/Qt6/sokoban/qml/ext/dynamic/Fixed.qml b/examples/Qt6/sokoban/qml/ext/dynamic/Fixed.qml
new file mode 100644
index 0000000..e694b98
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/dynamic/Fixed.qml
@@ -0,0 +1,4 @@
+import QtQuick
+
+Image {
+}
diff --git a/examples/Qt6/sokoban/qml/ext/dynamic/Player.qml b/examples/Qt6/sokoban/qml/ext/dynamic/Player.qml
new file mode 100644
index 0000000..dd636ff
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/ext/dynamic/Player.qml
@@ -0,0 +1,30 @@
+import QtQuick
+import "../" as Ext
+
+Image {
+ id: player
+
+ Behavior on x {
+ Ext.NumberAnimation {
+ duration: 120
+ easing.type: Easing.InOutSine
+ }
+ }
+
+ Behavior on y {
+ Ext.NumberAnimation {
+ duration: 120
+ easing.type: Easing.InOutSine
+ }
+ }
+
+ // final animation
+
+ Ext.RotationAnimation {
+ objectName: "rotate_player"
+ target: player
+ property: "rotation"
+ from: 0; to: 360
+ duration: 600
+ }
+}
diff --git a/examples/Qt6/sokoban/qml/main.qml b/examples/Qt6/sokoban/qml/main.qml
new file mode 100644
index 0000000..ce39f1e
--- /dev/null
+++ b/examples/Qt6/sokoban/qml/main.qml
@@ -0,0 +1,157 @@
+import QtQuick
+import QtQuick.Controls
+import QtQuick.Controls.Basic
+import QtQuick.Window
+import "ext/" as Ext
+
+Rectangle {
+ id: main
+ width: Screen.desktopAvailableWidth
+ height: Screen.desktopAvailableHeight
+ color: Qt.darker("lightsteelblue", 1.25)
+
+ property bool small: (Math.max(width, height) < 1000)
+
+ function isLandscape() { return (Screen.primaryOrientation === Qt.LandscapeOrientation) }
+
+ Ext.Dynamic {}
+
+ Row {
+ anchors.centerIn: parent
+ // adapt 'level' and 'board' scale to screen size
+ scale: isLandscape()
+ ? ((Screen.desktopAvailableHeight - 10) / board.height)
+ : ((Screen.desktopAvailableWidth - 10) / (board.width + 2 * level.width))
+
+ Slider {
+ id: level
+ objectName: "level"
+ height: board.height
+ orientation: Qt.Vertical
+ stepSize: 1.0
+
+ onValueChanged: Lisp.call("qsoko:set-maze")
+ }
+
+ Rectangle {
+ id: board
+ objectName: "board"
+ width: 512; height: 512
+ color: "lightsteelblue"
+ }
+
+ // dummy to have it exactly centered
+ Item {
+ width: level.width
+ height: level.height
+ }
+ }
+
+ Row {
+ id: buttons1
+ objectName: "buttons1"
+ spacing: main.small ? 10 : 15
+ padding: 10
+ anchors.bottom: parent.bottom
+
+ Ext.Button {
+ objectName: "previous"
+ text: "\uf100"
+ }
+ Ext.Button {
+ objectName: "next"
+ text: "\uf101"
+ }
+ }
+
+ Row {
+ id: buttons2
+ objectName: "buttons2"
+ spacing: main.small ? 10 : 15
+ padding: 10
+ anchors.right: parent.right
+ anchors.bottom: parent.bottom
+
+ Ext.Button {
+ objectName: "undo"
+ text: "\uf112"
+ }
+ Ext.Button {
+ objectName: "restart"
+ text: "\uf0e2"
+ }
+ Ext.Button {
+ objectName: "solve"
+ text: "\uf17b"
+ }
+ }
+
+ // container for arrow buttons
+ Item {
+ id: arrows
+ y: buttons1.y - height - (main.small ? 25 : 50)
+ width: up.width * 3
+ height: up.height * 3
+ anchors.margins: 10
+ anchors.horizontalCenter: buttons2.horizontalCenter
+
+ Ext.ArrowButton {
+ id: up
+ objectName: "up"
+ text: "\uf139"
+ anchors.horizontalCenter: parent.horizontalCenter
+ }
+
+ Ext.ArrowButton {
+ objectName: "left"
+ text: "\uf137"
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ Ext.ArrowButton {
+ objectName: "right"
+ text: "\uf138"
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ }
+
+ Ext.ArrowButton {
+ objectName: "down"
+ text: "\uf13a"
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ }
+ }
+
+ // level change animations
+
+ Ext.ScaleAnimator {
+ objectName: "zoom_board_out"
+ target: board
+ from: 1.0
+ to: 0.0
+ duration: 250
+ }
+
+ Ext.ScaleAnimator {
+ objectName: "zoom_board_in"
+ target: board
+ from: 0.0
+ to: 1.0
+ duration: 250
+ }
+
+ // etc
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Back) {
+ event.accepted = true
+ Lisp.call("qml:qquit")
+ }
+ }
+
+ FontLoader {
+ id: fontAwesome
+ source: "fonts/fontawesome-webfont.ttf"
+ }
+}
diff --git a/examples/cl-repl/app.pro b/examples/cl-repl/app.pro
index 536bd34..5a56186 100644
--- a/examples/cl-repl/app.pro
+++ b/examples/cl-repl/app.pro
@@ -30,7 +30,7 @@ win32: PRE_TARGETDEPS = tmp/app.lib
QT += quick qml quickcontrols2
TEMPLATE = app
CONFIG += c++17 no_keywords release
-DEFINES += DESKTOP_APP INI_LISP INI_ASDF INI_ECL_CONTRIB QT_EXTENSION
+DEFINES += DESKTOP_APP INI_LISP INI_ASDF INI_ECL_CONTRIB QT_EXTENSION # NO_USB
INCLUDEPATH = /usr/local/include
ECL_VERSION = $$lower($$system(ecl -v))
ECL_VERSION = $$replace(ECL_VERSION, " ", "-")
diff --git a/examples/clog-demo/readme.md b/examples/clog-demo/readme.md
index ee1af03..62225b1 100644
--- a/examples/clog-demo/readme.md
+++ b/examples/clog-demo/readme.md
@@ -1,3 +1,5 @@
+*This example is outdated and not really useful anymore, sorry.*
+
Try it
------
diff --git a/examples/meshtastic-qt6/qml/fonts/Ubuntu-Medium.ttf b/examples/meshtastic-qt6/qml/fonts/Ubuntu-Medium.ttf
deleted file mode 100644
index 7340a40..0000000
Binary files a/examples/meshtastic-qt6/qml/fonts/Ubuntu-Medium.ttf and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/fonts/Ubuntu.ttf b/examples/meshtastic-qt6/qml/fonts/Ubuntu.ttf
deleted file mode 100644
index f98a2da..0000000
Binary files a/examples/meshtastic-qt6/qml/fonts/Ubuntu.ttf and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/broadcast.png b/examples/meshtastic-qt6/qml/img/broadcast.png
deleted file mode 100644
index 251b97f..0000000
Binary files a/examples/meshtastic-qt6/qml/img/broadcast.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/busy.gif b/examples/meshtastic-qt6/qml/img/busy.gif
deleted file mode 100644
index 4ed7b6f..0000000
Binary files a/examples/meshtastic-qt6/qml/img/busy.gif and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/delete.png b/examples/meshtastic-qt6/qml/img/delete.png
deleted file mode 100644
index 9bc0640..0000000
Binary files a/examples/meshtastic-qt6/qml/img/delete.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/emoji.png b/examples/meshtastic-qt6/qml/img/emoji.png
deleted file mode 100644
index 41e765a..0000000
Binary files a/examples/meshtastic-qt6/qml/img/emoji.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/find.png b/examples/meshtastic-qt6/qml/img/find.png
deleted file mode 100644
index 3b77889..0000000
Binary files a/examples/meshtastic-qt6/qml/img/find.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/group.png b/examples/meshtastic-qt6/qml/img/group.png
deleted file mode 100644
index c9e66b3..0000000
Binary files a/examples/meshtastic-qt6/qml/img/group.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/hand.png b/examples/meshtastic-qt6/qml/img/hand.png
deleted file mode 100644
index c5c2d77..0000000
Binary files a/examples/meshtastic-qt6/qml/img/hand.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/hourglass.png b/examples/meshtastic-qt6/qml/img/hourglass.png
deleted file mode 100644
index 36626a3..0000000
Binary files a/examples/meshtastic-qt6/qml/img/hourglass.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/location.png b/examples/meshtastic-qt6/qml/img/location.png
deleted file mode 100644
index 2e12795..0000000
Binary files a/examples/meshtastic-qt6/qml/img/location.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/logo.png b/examples/meshtastic-qt6/qml/img/logo.png
deleted file mode 100644
index 8cd1f56..0000000
Binary files a/examples/meshtastic-qt6/qml/img/logo.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/marker.png b/examples/meshtastic-qt6/qml/img/marker.png
deleted file mode 100644
index 2dc79f2..0000000
Binary files a/examples/meshtastic-qt6/qml/img/marker.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/message.png b/examples/meshtastic-qt6/qml/img/message.png
deleted file mode 100644
index 1b2d3d5..0000000
Binary files a/examples/meshtastic-qt6/qml/img/message.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/radio.png b/examples/meshtastic-qt6/qml/img/radio.png
deleted file mode 100644
index dcd5f50..0000000
Binary files a/examples/meshtastic-qt6/qml/img/radio.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/remove-marker.png b/examples/meshtastic-qt6/qml/img/remove-marker.png
deleted file mode 100644
index 9aff828..0000000
Binary files a/examples/meshtastic-qt6/qml/img/remove-marker.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/semaphore.gif b/examples/meshtastic-qt6/qml/img/semaphore.gif
deleted file mode 100644
index 72a63bf..0000000
Binary files a/examples/meshtastic-qt6/qml/img/semaphore.gif and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/img/send.png b/examples/meshtastic-qt6/qml/img/send.png
deleted file mode 100644
index 3f08b34..0000000
Binary files a/examples/meshtastic-qt6/qml/img/send.png and /dev/null differ
diff --git a/examples/meshtastic-qt6/qml/tile-provider/cycle b/examples/meshtastic-qt6/qml/tile-provider/cycle
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/cycle
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/hiking b/examples/meshtastic-qt6/qml/tile-provider/hiking
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/hiking
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/night-transit b/examples/meshtastic-qt6/qml/tile-provider/night-transit
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/night-transit
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/satellite b/examples/meshtastic-qt6/qml/tile-provider/satellite
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/satellite
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/street b/examples/meshtastic-qt6/qml/tile-provider/street
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/street
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/terrain b/examples/meshtastic-qt6/qml/tile-provider/terrain
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/terrain
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic-qt6/qml/tile-provider/transit b/examples/meshtastic-qt6/qml/tile-provider/transit
deleted file mode 100644
index 0e00d28..0000000
--- a/examples/meshtastic-qt6/qml/tile-provider/transit
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "UrlTemplate": "https://tile.openstreetmap.org/%z/%x/%y.png",
- "ImageFormat": "png",
- "QImageFormat": "Indexed8",
- "ID": "cl-meshtastic",
- "MaximumZoomLevel": 19,
- "MapCopyRight": "OpenStreetMap",
- "DataCopyRight": ""
-}
-
diff --git a/examples/meshtastic/hardware/radio.htm b/examples/meshtastic/hardware/radio.htm
index 80519e9..dfe4a05 100644
--- a/examples/meshtastic/hardware/radio.htm
+++ b/examples/meshtastic/hardware/radio.htm
@@ -105,7 +105,7 @@
Simple Standalone Device
- Support for Meshtastic is increasing continuously. These are CircuitMess Chatter 2.0 devices (they come in pairs). Currently only available on ebay.
+ Support for Meshtastic is increasing continuously. These are CircuitMess Chatter 2.0 devices (they come in pairs). I found them on US amazon, also available on ebay.
They have some limitations: they only support MediumSlow instead of LongFast, and have a lousy antenna, but work great if those limitations are acceptable for one's use case.
diff --git a/examples/palindrome/.gitignore b/examples/palindrome/.gitignore
new file mode 100644
index 0000000..d6b7ef3
--- /dev/null
+++ b/examples/palindrome/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/readme.md b/readme.md
index 9efb3d3..7e43297 100644
--- a/readme.md
+++ b/readme.md
@@ -38,8 +38,8 @@ LQML is **BSD** 0 clause.
Tested
------
-The examples are only tested with **Qt5.15**. The binding also works with
-**Qt6**, but would need some adaption of QML in most examples. It's recommended
+The examples are tested with both **Qt5.15** and **Qt6**. For differences
+in Qt6 (mostly in QML) see [examples/Qt6/](examples/Qt6/). It's recommended
to use the new Qt online installer (see [readme-qt](readme-qt.md)), where
you can choose to install different Qt versions side by side, sharing the same
Qt Creator.