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.