(defpackage #:clog-user (:use #:cl #:clog) (:export start-demo)) (in-package :clog-user) (defvar *last-z* -9999) (defclass app-data () ((body :accessor body :documentation "Top level access to browser window") (drag-mutex :reader drag-mutex :initform (bordeaux-threads:make-lock) :documentation "Serialize access to the on-ide-drag-down event.") (in-drag :accessor in-drag :initform nil :documentation "Ensure only one box is dragged at a time and type of drag.") (drag-x :accessor drag-x :documentation "Location of the left side or width relative to pointer during drag.") (drag-y :accessor drag-y :documentation "Location of the top or height relative to pointer during drag."))) (defun on-ide-drag-down (obj data) (let ((app (connection-data-item obj "app-data"))) (bordeaux-threads:with-lock-held ((drag-mutex app)) (unless (in-drag app) (setf (in-drag app) (attribute obj "data-drag-type")) (let* ((id-drag (attribute obj "data-drag-obj")) (drag-obj (attach-as-child obj id-drag)) (pointer-x (getf data ':screen-x)) (pointer-y (getf data ':screen-y)) (obj-top) (obj-left)) (if (equalp (in-drag app) "m") (progn (setf obj-top (parse-integer (top drag-obj) :junk-allowed t)) (setf obj-left (parse-integer (left drag-obj) :junk-allowed t))) (progn (setf obj-top (height drag-obj)) (setf obj-left (width drag-obj)))) (setf (z-index drag-obj) (incf *last-z*)) (setf (drag-y app) (- pointer-y obj-top)) (setf (drag-x app) (- pointer-x obj-left)) (set-on-pointer-move obj 'on-ide-drag-move) (set-on-pointer-up obj 'on-ide-drag-stop)))))) (defun on-ide-drag-move (obj data) (let* ((app (connection-data-item obj "app-data")) (drag-obj (attach-as-child obj (attribute obj "data-drag-obj"))) (x (getf data ':screen-x)) (y (getf data ':screen-y)) (adj-y (- y (drag-y app))) (adj-x (- x (drag-x app)))) (when (and (> adj-x 0) (> adj-y 30)) (if (equalp (in-drag app) "m") (progn (setf (top drag-obj) (format nil "~Apx" adj-y)) (setf (left drag-obj) (format nil "~Apx" adj-x))) (progn (js-execute drag-obj (format nil "editor_~A.resize()" (html-id drag-obj))) (setf (height drag-obj) (format nil "~Apx" adj-y)) (setf (width drag-obj) (format nil "~Apx" adj-x))))))) (defun on-ide-drag-stop (obj data) (let ((app (connection-data-item obj "app-data"))) (on-ide-drag-move obj data) (setf (in-drag app) nil) (set-on-pointer-move obj nil) (set-on-pointer-up obj nil))) (defgeneric create-window (clog-obj title &key html-id content left top width height) (:documentation "Create an html-window")) (defmethod create-window ((obj clog-obj) title &key (html-id nil) (content "") (left 60) (top 60) (width 400) (height 300)) (unless html-id (setf html-id (clog-connection:generate-id))) (let* ((app (connection-data-item obj "app-data")) (win (create-child (body app) (format nil "