diff --git a/examples/M-modules/quick/sokoban/qml/sokoban.qml b/examples/M-modules/quick/sokoban/qml/sokoban.qml index c768153..1b64921 100644 --- a/examples/M-modules/quick/sokoban/qml/sokoban.qml +++ b/examples/M-modules/quick/sokoban/qml/sokoban.qml @@ -1,17 +1,50 @@ import QtQuick 2.2 +import QtQuick.Controls 1.4 +import QtQuick.Controls.Styles 1.4 import "ext/" +import EQL5 1.0 Rectangle { - id: root - x: -44; y: -44 - width: 512; height: 512 - color: "lightsteelblue" + width: 444; height: 444 + color: "#404040" - scale: 0.8 + Slider { + objectName: "level" + x: 6; y: 6; height: 410 + orientation: Qt.Vertical + stepSize: 1.0 + updateValueWhileDragging: false + + onValueChanged: { Lisp.call("qsoko:set-maze") } + + style: SliderStyle { + groove: Rectangle { + implicitWidth: 200 + implicitHeight: 2 + color: "white" + } + handle: Rectangle { + anchors.centerIn: parent + color: control.pressed ? "white" : "coral" + implicitWidth: 16 + implicitHeight: 16 + radius: 8 + } + } + } + + Rectangle { + id: board + objectName: "board" + x: -24; y: -44 + width: 512; height: 512 + color: "lightsteelblue" + scale: 0.8 + } Text { - y: 516 - font.pixelSize: 15 + x: 8; y: 424 + font.pixelSize: 12 color: "white" text: "N ext | P revious | R estart | S olve" } @@ -20,16 +53,16 @@ Rectangle { ScaleAnimatorExt { objectName: "zoom_board_out" - target: root + target: board from: 0.8 - to: 0 + to: 0.0 duration: 250 } ScaleAnimatorExt { objectName: "zoom_board_in" - target: root - from: 0 + target: board + from: 0.0 to: 0.8 duration: 250 } diff --git a/examples/M-modules/quick/sokoban/sokoban.lisp b/examples/M-modules/quick/sokoban/sokoban.lisp index 9d1d358..0dd0815 100644 --- a/examples/M-modules/quick/sokoban/sokoban.lisp +++ b/examples/M-modules/quick/sokoban/sokoban.lisp @@ -32,7 +32,6 @@ (defvar *items* nil) (defvar *item-size* nil) -(defvar *level* 0) (defvar *maze* nil) (defvar *my-mazes* (mapcar 'sokoban:copy-maze sokoban:*mazes*)) (defvar *solving* nil) @@ -49,6 +48,15 @@ (defvar *box-item-2* (qml-component "box2.qml")) ; :object2 (defvar *static-item* (qml-component "static.qml")) ; :wall :goal +(defun board () + (qml:find-quick-item "board")) + +(defun level () + (floor (qml-get "level" "value"))) + +(defun set-level (index) + (qml-set "level" "value" index)) + (defun assoc* (item alist) (cdr (assoc item alist))) @@ -59,13 +67,13 @@ (car (find type *item-types* :key 'cdr))) (defun set-maze () - (setf *maze* (nth *level* *my-mazes*)) + (setf *maze* (nth (level) *my-mazes*)) (create-items) (place-all-items)) (defun reset-maze () - (setf *maze* (setf (nth *level* *my-mazes*) - (sokoban:copy-maze (nth *level* sokoban:*mazes*)))) + (setf *maze* (setf (nth (level) *my-mazes*) + (sokoban:copy-maze (nth (level) sokoban:*mazes*)))) (update-placed-items t)) (defun create-item-type (type) @@ -89,8 +97,8 @@ (dolist (type (x:ensure-list types)) (let ((item (create-item type))) (push item (cdr (assoc type *items*))) - (|setParent| item (qml:root-item)) - (|setParentItem| item (qml:root-item)))))) + (|setParent| item (board)) + (|setParentItem| item (board)))))) (dolist (row (sokoban:maze-text *maze*)) (x:do-string (char row) (unless (char= #\Space char) @@ -134,13 +142,12 @@ (max 0 (if (numberp direction/index) direction/index (+ (if (eql :next direction/index) 1 -1) - *level*)))))) - (when (/= level *level*) - (setf *level* level) + (level))))))) + (when (/= level (level)) (queued (qml-set "zoom_board_out" "running" t) - (set-maze) + (set-level level) ; will call SET-MAZE from QML (qml-set "zoom_board_in" "running" t)))) - *level*) + (level)) (defun key-pressed (object event) (when (and (zerop *running-animations*) @@ -167,7 +174,7 @@ (defun solve () (let ((*solving* t)) (reset-maze) - (x:do-string (ch (nth *level* sokoban:*solutions*)) + (x:do-string (ch (nth (level) sokoban:*solutions*)) (sokoban:move (case (char-downcase ch) (#\u :north) (#\d :south) @@ -223,7 +230,7 @@ (y (* h pos-y)) (dx (case direction (:east w) (:west (- w)) (t 0))) (dy (case direction (:south h) (:north (- h)) (t 0))) - (item (|childAt| (qml:root-item) (+ x (/ w 2)) (+ y (/ h 2))))) + (item (|childAt| (board) (+ x (/ w 2)) (+ y (/ h 2))))) (unless (qnull item) (if (zerop dy) (qml-set item "x" (+ x dx)) @@ -252,12 +259,12 @@ (defun run () (x:do-with *quick-view* (|setSource| (|fromLocalFile.QUrl| "qml/sokoban.qml")) - (|setMinimumSize| '(424 444)) + (|setMinimumSize| '(444 444)) (|resize| (|minimumSize| *quick-view*)) - (|setColor| "#404040") (|show|)) (qadd-event-filter nil |QEvent.KeyPress| 'key-pressed) (setf sokoban:*move-hook* 'move-item) + (qml-set "level" "maximumValue" (1- (length *my-mazes*))) (set-maze)) (progn