diff --git a/clog-system.lisp b/clog-system.lisp
index 3ca4d4c..e217f80 100644
--- a/clog-system.lisp
+++ b/clog-system.lisp
@@ -93,3 +93,11 @@ function. If BOOT-FILE is nil path is removed."
(clrhash *url-to-on-new-window*)
(setf *clog-running* nil)
(cc:shutdown-clog))
+
+;;;;;;;;;;;;;;;;
+;; debug-mode ;;
+;;;;;;;;;;;;;;;;
+
+(defun debug-mode (obj)
+ "Turn on browser console debugging for OBJ's connection."
+ (cc:debug-mode (connection-id obj)))
diff --git a/clog.lisp b/clog.lisp
index 708dbb8..ce5706c 100644
--- a/clog.lisp
+++ b/clog.lisp
@@ -51,7 +51,8 @@ embedded in a native template application.)"
"CLOG Startup and Shutdown"
(initialize function)
(set-on-new-window function)
- (shutdown function))
+ (shutdown function)
+ (debug-mode function))
(defsection @clog-utilities (:title "CLOG Utilities")
"CLOG utilities"
diff --git a/tutorial/09-tutorial.lisp b/tutorial/09-tutorial.lisp
index f912be4..de7e246 100644
--- a/tutorial/09-tutorial.lisp
+++ b/tutorial/09-tutorial.lisp
@@ -11,7 +11,7 @@
;; compiler can mark those for garbage collection early
;; this not an issue as the element is created already
;; in the browser window.
-
+ ;;
;; Create tabs and panels
(t1 (create-button body :content "Tab1"))
(t2 (create-button body :content "Tab2"))
@@ -20,7 +20,6 @@
(p1 (create-div body))
(p2 (create-div body))
(p3 (create-div body :content "Panel3 - Type here"))
-
;; Create form for panel 1
(f1 (create-form p1))
(fe1 (create-form-element f1 :text
@@ -31,7 +30,6 @@
(tmp (create-br f1))
(tmp (create-form-element f1 :submit :value "OK"))
(tmp (create-form-element f1 :reset :value "Start Again"))
-
;; Create for for panel 2
(f2 (create-form p2))
(fs2 (create-fieldset f2 :legend "Stuff"))
@@ -49,8 +47,7 @@
(tmp (create-label fs2 :content "There" :label-for ck2))
(tmp (create-br fs2))
(sl1 (create-select fs2 :label (create-label fs2 :content "Pick one:")))
- (sl2 (create-select fs2 :label (create-label fs2 :content "Pick one:")))
-
+ (sl2 (create-select fs2 :label (create-label fs2 :content "Pick one:")))
(sl3 (create-select fs2 :multiple t
:label (create-label fs2 :content "Pick some:")))
(o1 (create-option sl3 :content "one"))
@@ -61,50 +58,41 @@
(o5 (create-option og1 :content "five"))
(tmp (create-form-element f2 :submit :value "OK"))
(tmp (create-form-element f2 :reset :value "Start Again")))
-
- ;; Panel 1 contents
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
+ ;; Panel 1 contents
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setf (place-holder fe1) "type here..")
(setf (requiredp fe1) t)
- (setf (size fe1) 60)
-
+ (setf (size fe1) 60)
(make-data-list fe1 '("Cool Title"
"Not So Cool Title"
- "Why Not, Another Title"))
-
+ "Why Not, Another Title"))
(make-data-list fe2 '("#ffffff"
"#ff0000"
"#00ff00"
"#0000ff"
- "#ff00ff"))
-
+ "#ff00ff"))
(set-on-submit f1
(lambda (obj)
(setf (title (html-document body)) (value fe1))
(setf (background-color p1) (value fe2))
(setf (hiddenp f1) t)
(create-span p1 :content
- "
Your form has been submitted")))
-
+ "
Your form has been submitted")))
(setf (width p1) "100%")
(setf (width p2) "100%")
- (setf (width p3) "100%")
-
+ (setf (width p3) "100%")
(setf (height p1) 400)
(setf (height p2) 400)
(setf (height p3) 400)
-
(set-border p1 :thin :solid :black)
(set-border p2 :thin :solid :black)
(set-border p3 :thin :solid :black)
-
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Panel 2 contents
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
(setf (vertical-align ta1) :top)
(disable-resize ta1)
-
(setf (vertical-align sl1) :top)
(setf (vertical-align sl2) :top)
(setf (vertical-align sl3) :top)
@@ -114,13 +102,11 @@
"three"
"four"
"five"))
-
(add-select-options sl2 '("one"
"two"
"three"
"four"
"five"))
-
(set-on-change sl3 (lambda (obj)
(when (selectedp o5)
(alert (window body) "Selected 5"))))
@@ -134,31 +120,25 @@
(value sl1)
(value sl2)
(selectedp o2)))))
-
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Panel 3 contents
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
(setf (editablep p3) t)
-
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Tab functionality
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
(flet ((select-tab (obj)
(setf (hiddenp p1) t)
(setf (hiddenp p2) t)
(setf (hiddenp p3) t)
-
(setf (background-color t1) :lightgrey)
(setf (background-color t2) :lightgrey)
- (setf (background-color t3) :lightgrey)
-
+ (setf (background-color t3) :lightgrey)
(setf (background-color last-tab) :lightblue)
(setf (hiddenp obj) nil)
(focus obj)))
-
(setf last-tab t1)
- (select-tab p1)
-
+ (select-tab p1)
(set-on-click t1 (lambda (obj)
(setf last-tab obj)
(select-tab p1)))
@@ -172,6 +152,5 @@
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))
diff --git a/tutorial/10-tutorial.lisp b/tutorial/10-tutorial.lisp
index c11d418..a22f0dc 100644
--- a/tutorial/10-tutorial.lisp
+++ b/tutorial/10-tutorial.lisp
@@ -7,26 +7,20 @@
(defun on-new-window (body)
(let* ((canvas (create-canvas body :width 600 :height 400))
(cx (create-context2d canvas)))
-
- (set-border canvas :thin :solid :black)
-
+ (set-border canvas :thin :solid :black)
(fill-style cx :green)
(fill-rect cx 10 10 150 100)
-
(fill-style cx :blue)
(font-style cx "bold 24px serif")
(fill-text cx "Hello World" 10 150)
-
(fill-style cx :red)
(begin-path cx)
(ellipse cx 200 200 50 7 0.78 0 6.29)
(path-stroke cx)
(path-fill cx)
-
(run body)))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))
diff --git a/tutorial/11-tutorial.lisp b/tutorial/11-tutorial.lisp
index 8fa01f3..94c4e9d 100644
--- a/tutorial/11-tutorial.lisp
+++ b/tutorial/11-tutorial.lisp
@@ -1,32 +1,31 @@
-;; Creating code GUIs from scratch is great, but in the real world often design
-;; is left to artists and code is left to engineers. CLOG is an amazign solution
-;; for that model of app development. Any existing web page can be come a CLOG
-;; app by simply adding the following two lines to an existing HTML file:
-;;
-;;
-;;
-;;
-;; The first line adds jquery which CLOG uses to enhance browser compatability.
-;; The second line add the "boot" file.
-;;
-;; For this tutorial we generated the clog/static-files/tutorial/tut-11.html
-;; by using the form generator at https://bootsnipp.com/forms?version=3
-;; then used the the template from https://getbootstrap.com/docs/3.3/
-;; and added CLOG's boot.js script line. It was neccesary to add an id to the
-;; form (id='form1') as the generator did not add one.
-;;
-;; - We set a blank on-submit to overide the behavior in the bootstrap
-;; buttons to submit the from HTML style.
-;; - We are going to attach to the "Good Button" an on-click handler
-;; to handle getting the values
-;; - We attach to each control in the on-click handler that we want
-;; value for and query them
-;; - We attach an on-click handler that resets the form to the
-;; "Scary Button"
-;;
-;; - We go in the browser to the file
-;; "http://127.0.0.1:8080/tutorial/tut-11.html"
-
+;;; Creating code GUIs from scratch is great, but in the real world often design
+;;; is left to artists and code is left to engineers. CLOG is an amazign solution
+;;; for that model of app development. Any existing web page can be come a CLOG
+;;; app by simply adding the following two lines to an existing HTML file:
+;;;
+;;;
+;;;
+;;;
+;;; The first line adds jquery which CLOG uses to enhance browser compatability.
+;;; The second line add the "boot" file.
+;;;
+;;; For this tutorial we generated the clog/static-files/tutorial/tut-11.html
+;;; by using the form generator at https://bootsnipp.com/forms?version=3
+;;; then used the the template from https://getbootstrap.com/docs/3.3/
+;;; and added CLOG's boot.js script line. It was neccesary to add an id to the
+;;; form (id='form1') as the generator did not add one.
+;;;
+;;; - We set a blank on-submit to overide the behavior in the bootstrap
+;;; buttons to submit the from HTML style.
+;;; - We are going to attach to the "Good Button" an on-click handler
+;;; to handle getting the values
+;;; - We attach to each control in the on-click handler that we want
+;;; value for and query them
+;;; - We attach an on-click handler that resets the form to the
+;;; "Scary Button"
+;;;
+;;; - We go in the browser to the file
+;;; "http://127.0.0.1:8080/tutorial/tut-11.html"
(defpackage #:clog-user
(:use #:cl #:clog)
@@ -35,22 +34,19 @@
(in-package :clog-user)
(defun on-new-window (body)
- (clog-connection:debug-mode (clog::connection-id body))
-
+ ;; This will turn on debug output in the browser console.
+ (debug-mode body)
+ ;; Setup form
(let* ((form (attach-as-child body "form1" :clog-type 'clog-form))
(good-button (attach-as-child body "button1id"))
(scary-button (attach-as-child body "button2id")))
-
(flet ((on-click-good (obj)
(let ((alert-div (create-div body)))
-
(place-before form alert-div)
(setf (hiddenp form) t)
-
;; Bootstrap specific markup
(setf (css-class-name alert-div) "alert alert-success")
(setf (attribute alert-div "role") "alert")
-
;; We collect the data from the hidden form elements
;; using radio-value and name-value (for other types if
;; input other than radio buttons) or we could bind each
@@ -62,20 +58,15 @@
textinput value : ~A
radios value : ~A
textinput value : ~A
@@ -46,11 +42,9 @@ Changes made to a local key will fire an event and print below:
"
(storage-element (window body) :local "my-local-key")
"my-session-key"
(storage-element (window body) :session "my-session-key")))
-
(run body))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))
diff --git a/tutorial/15-tutorial.lisp b/tutorial/15-tutorial.lisp
index b41e451..67d0cc8 100644
--- a/tutorial/15-tutorial.lisp
+++ b/tutorial/15-tutorial.lisp
@@ -5,7 +5,6 @@
(in-package :clog-user)
(defun on-new-window (body)
-
(let* ((vid (create-video body :source "https://www.w3schools.com/html/mov_bbb.mp4"))
(tmp (create-br body))
(vpl (create-button body :content ">"))
@@ -18,19 +17,15 @@
(ast (create-button body :content "||"))
(alc (create-form-element body :input))
(tmp (create-hr body)))
-
(set-on-click vpl (lambda (obj)(play-media vid)))
(set-on-click apl (lambda (obj)(play-media aud)))
(set-on-click vst (lambda (obj)(pause-media vid)))
(set-on-click ast (lambda (obj)(pause-media aud)))
-
(set-on-time-update vid (lambda (obj)(setf (value vlc) (media-position vid))))
(set-on-time-update aud (lambda (obj)(setf (value alc) (media-position aud))))
-
(run body)))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))
diff --git a/tutorial/16-tutorial.lisp b/tutorial/16-tutorial.lisp
index 8fe8bec..2e0f2c9 100644
--- a/tutorial/16-tutorial.lisp
+++ b/tutorial/16-tutorial.lisp
@@ -4,8 +4,8 @@
(in-package :clog-user)
-;; In previous tutorials we attached to an html file using bootstrap. For this tutorial we
-;; are going to create a bootstrap 4.0 page just using CLOG.
+;;; In previous tutorials we attached to an html file using bootstrap. For this tutorial we
+;;; are going to create a bootstrap 4.0 page just using CLOG.
(defun on-index (body)
(load-css (html-document body) "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css")
@@ -13,46 +13,42 @@
;; the generic boot.html
(load-script (html-document body) "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js")
(load-script (html-document body) "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js")
-
+ ;; Root page setup
(setf (title (html-document body)) "Hello Boostrap")
-
(let* ((nav (create-section body :nav :class "nav"))
+ ;; Nav Bar
(l1 (create-a nav :content "link1" :class "nav-link"))
(l2 (create-a nav :content "link2" :class "nav-link"))
(l3 (create-a nav :content "link3" :class "nav-link"))
(l4 (create-a nav :content "link3" :class "nav-link" :link "/page2"))
-
+ ;; Jumbotron message
(jumbo (create-div body :class "jumbotron text-center"))
(jname (create-section jumbo :h1 :content "My First Bootstrap Page"))
(tmp (create-p jumbo :content "Resize this responsive page to see the effect!"))
-
+ ;; Container for three colomns pf text
(container (create-div body :class "container"))
(row (create-div container :class "row"))
-
+ ;; Column 1
(col1 (create-div row :class "col-sm-4"))
(tmp (create-section col1 :h3 :content "Column 1"))
(tmp (create-p col1 :content "Lorem ipsum dolor.."))
-
+ ;; Column 2
(col2 (create-div row :class "col-sm-4"))
(tmp (create-section col2 :h3 :content "Column 2"))
(tmp (create-p col2 :content "Lorem ipsum dolor.."))
-
+ ;; Column 3
(col3 (create-div row :class "col-sm-4"))
(tmp (create-section col3 :h3 :content "Column 3"))
(tmp (create-p col3 :content "Lorem ipsum dolor..")))
-
- (set-on-click l1 (lambda (obj)(alert (window body) "Clicked link1")))
-
+ (set-on-click l1 (lambda (obj)(alert (window body) "Clicked link1")))
(set-on-click l2 (lambda (obj)
(let* ((alert (create-div body :class "alert alert-warning alert-dismissible fade show"))
(tmp (create-phrase alert :strong :content "Wow! You clicked link 2"))
(btn (create-button alert :class "close" :content "×")))
(setf (attribute alert "role") "alert")
(setf (attribute btn "data-dismiss") "alert")
- (place-after nav alert))))
-
- (set-on-click l3 (lambda (obj)(setf (color jname) (rgb 128 128 0)))))
-
+ (place-after nav alert))))
+ (set-on-click l3 (lambda (obj)(setf (color jname) (rgb 128 128 0)))))
(run body))
(defun on-page2 (body)
@@ -60,23 +56,21 @@
(load-css (html-document body) "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css")
(load-script (html-document body) "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js")
(load-script (html-document body) "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js")
-
+ ;; Setup page2
(setf (title (html-document body)) "Hello Boostrap - page2")
-
(let* ((nav (create-section body :nav :class "nav"))
+ ;; Nav Bar
(l1 (create-a nav :content "link1" :class "nav-link"))
(l2 (create-a nav :content "link2" :class "nav-link"))
(l3 (create-a nav :content "link3" :class "nav-link"))
(l4 (create-a nav :content "page1" :class "nav-link" :link "/"))
-
+ ;; Jumbotron
(jumbo (create-div body :class "jumbotron text-center"))
(jname (create-section jumbo :h1 :content "You found Page2"))))
-
(run body))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-index)
(set-on-new-window #'on-page2 :path "/page2")
(open-browser))
diff --git a/tutorial/17-tutorial.lisp b/tutorial/17-tutorial.lisp
index cebb471..138cf84 100644
--- a/tutorial/17-tutorial.lisp
+++ b/tutorial/17-tutorial.lisp
@@ -4,20 +4,20 @@
(in-package :clog-user)
-;; In this tutorial we will use a CSS only alternative to bootsrap -
-;; https://www.w3schools.com/w3css/default.asp
+;;; In this tutorial we will use a CSS only alternative to bootsrap -
+;;; https://www.w3schools.com/w3css/default.asp
(defun on-index (body)
+ ;; Load css files
(load-css (html-document body) "https://www.w3schools.com/w3css/4/w3.css")
(load-css (html-document body) "https://www.w3schools.com/lib/w3-theme-teal.css")
+ ;; Setup page
(setf (title (html-document body)) "Hello W3.CSS")
-
(let* ((header (create-section body :header :class "w3-container w3-card w3-theme"))
(tmp (create-section header :h1 :content "Explore Forms"))
-
+ ;; Main area of page
(data-area (create-div body :class "w3-container"))
(tmp (create-hr data-area))
-
;; This is a traditional "post" form that will submit data
;; to a server.
(fcontainer (create-div data-area :class "w3-container"))
@@ -28,9 +28,7 @@
(create-label form1 :content "Enter name:")))
(fsubmit (create-form-element form1 :submit))
(tmp (create-br fcontainer))
-
(tmp (create-hr data-area))
-
;; This is a traditional "get" form that will submit data
;; to a server.
(fcontainer (create-div data-area :class "w3-container"))
@@ -41,9 +39,7 @@
(create-label form2 :content "Enter name:")))
(fsubmit (create-form-element form2 :submit))
(tmp (create-br fcontainer))
-
(tmp (create-hr data-area))
-
;; This is a CLOG style form, instead of submitting data
;; to another page it is dealt with in place.
(fcontainer (create-div data-area :class "w3-container"))
@@ -54,21 +50,18 @@
(create-label form3 :content "Enter name:")))
(fsubmit3 (create-form-element form3 :submit))
(tmp (create-br fcontainer))
-
(tmp (create-hr data-area))
-
(footer (create-section body :footer :class "w3-container w3-theme"))
(tmp (create-section footer :p :content "(c) All's well that ends well")))
(set-on-click fsubmit3
- (lambda (obj)
- (setf (hiddenp data-area) t)
- (place-before footer
- (create-div body
- :content (format nil "yourname3 = using NAME-VALUE ~A or VALUE ~A"
- (name-value form3 "yourname3")
- (value finput3)))))))
-
+ (lambda (obj)
+ (setf (hiddenp data-area) t)
+ (place-before footer
+ (create-div body
+ :content (format nil "yourname3 = using NAME-VALUE ~A or VALUE ~A"
+ (name-value form3 "yourname3")
+ (value finput3)))))))
(run body))
(defun on-page2 (body)
@@ -87,7 +80,6 @@
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-index)
(set-on-new-window #'on-page2 :path "/page2")
(set-on-new-window #'on-page3 :path "/page3")
diff --git a/tutorial/18-tutorial.lisp b/tutorial/18-tutorial.lisp
index f6d9135..0ae7811 100644
--- a/tutorial/18-tutorial.lisp
+++ b/tutorial/18-tutorial.lisp
@@ -10,53 +10,49 @@
(object (create-div target1))
(msg (create-div body
:content "Drag green box to other yellow box")))
-
+ ;; Instructions
(setf (positioning msg) :fixed)
(setf (top msg) "125px")
-
+ ;; Box 1
(setf (positioning target1) :fixed)
(setf (top target1) "10px")
(setf (left target1) "10px")
(setf (width target1) "100px")
(setf (height target1) "100px")
(setf (background-color target1) :yellow)
-
+ ;; Box 2
(setf (positioning target2) :fixed)
(setf (top target2) "10px")
(setf (left target2) "140px")
(setf (width target2) "100px")
(setf (height target2) "100px")
(setf (background-color target2) :yellow)
-
+ ;; Box to Drag
(setf (positioning object) :absolute)
(setf (top object) "10px")
(setf (left object) "10px")
(setf (width object) "50px")
(setf (height object) "50px")
(setf (background-color object) :green)
-
;; To allow for drag and drop requires:
;;
;; 1 object is draggable
(setf (draggablep object) t)
;; 2 the on-drag-start event is set
(set-on-drag-start object (lambda (obj)()) :drag-data "some data")
-
;; 4 the target on-drag-over event is sett
(set-on-drag-over target1 (lambda (obj)()))
;; 5 the target on-drop event is set
(set-on-drop target1 (lambda (obj data)
(place-inside-bottom-of target1 object)))
-
+ ;; Set up other box 1 also as targer for returning drag box
(set-on-drag-over target2 (lambda (obj)()))
(set-on-drop target2 (lambda (obj data)
(print (getf data :drag-data))
(place-inside-bottom-of target2 object)))
-
(run body)))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))
diff --git a/tutorial/19-tutorial.lisp b/tutorial/19-tutorial.lisp
index cb7a9ef..02984be 100644
--- a/tutorial/19-tutorial.lisp
+++ b/tutorial/19-tutorial.lisp
@@ -4,16 +4,15 @@
(in-package :clog-user)
-;; In this tutorial we will see how to easily use a JavaScript
-;; component. In the static-files directory there is a simple
-;; JavaScript component (clog/static-files/tutorial/jslists) to create
-;; collapsable trees that we will use for this tutorial.
+;;; In this tutorial we will see how to easily use a JavaScript
+;;; component. In the static-files directory there is a simple
+;;; JavaScript component (clog/static-files/tutorial/jslists) to create
+;;; collapsable trees that we will use for this tutorial.
(defun on-new-window (body)
;; First we need to load jslists' JavaScript file and css
(load-css (html-document body) "/tutorial/jslists/jsLists.css")
- (load-script (html-document body) "/tutorial/jslists/jsLists.js")
-
+ (load-script (html-document body) "/tutorial/jslists/jsLists.js")
;; Second we need to build an example list. jsLists uses an ordered
;; or unordered list for it's data.
(let* ((list-top (create-unordered-list body))
@@ -23,13 +22,11 @@
(item (create-list-item list-b :content "Item 2"))
(item (create-list-item list-b :content "Item 3"))
(item (create-list-item list-b :content "Item 4")))
-
(js-execute body (format nil "JSLists.applyToList('~A', 'ALL');"
(html-id list-top))))
(run body))
(defun start-tutorial ()
"Start turtorial."
-
(initialize #'on-new-window)
(open-browser))