;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; CLOG - The Common Lisp Omnificent GUI ;;;;
;;;; (c) 2020-2021 David Botton ;;;;
;;;; License BSD 3 Clause ;;;;
;;;; ;;;;
;;;; clog-gui.lisp ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(cl:in-package :clog)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - clog-gui - Desktop GUI abstraction
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun clog-gui-initialize (clog-body &key (w3-css-url "/css/w3.css"))
"Initializes clog-gui loading w3.css from :W3-CSS-URL"
(load-css (html-document clog-body) w3-css-url))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Implementation - Menus
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;
;; create-gui-menu-bar ;;
;;;;;;;;;;;;;;;;;;;;;;;;;
(defclass clog-gui-menu-bar (clog-div)()
(:documentation "Menu bar"))
(defgeneric create-gui-menu-bar (clog-obj &key class html-id)
(:documentation "Attached a menu bar to a CLOG-OBJ in general a
clog-body."))
(defmethod create-gui-menu-bar ((obj clog-obj)
&key (class "w3-bar w3-black w3-card-4")
(html-id nil))
(let ((div (create-div obj :class class :html-id html-id)))
(change-class div 'clog-gui-menu-bar)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; create-gui-menu-drop-down ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defclass clog-gui-menu-drop-down (clog-div)()
(:documentation "Drop down menu"))
(defgeneric create-gui-menu-drop-down (clog-gui-menu-bar
&key content class html-id)
(:documentation "Attached a menu bar drop-down to a CLOG-GUI-MENU-BAR"))
(defmethod create-gui-menu-drop-down ((obj clog-gui-menu-bar)
&key (content "")
(class "w3-dropdown-content w3-bar-block w3-card-4")
(html-id nil))
(let* ((hover (create-div obj :class "w3-dropdown-hover"))
(button (create-button hover :class "w3-button" :content content))
(div (create-div hover :class class :html-id html-id)))
(change-class div 'clog-gui-menu-drop-down)))
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; create-gui-menu-item ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defclass clog-gui-menu-item (clog-span)()
(:documentation "Menu bar"))
(defgeneric create-gui-menu-item (clog-gui-menu-drop-down
&key content
on-click
class
html-id)
(:documentation "Attached a menu item to a CLOG-GUI-MENU-DROP-DOWN"))
(defmethod create-gui-menu-item ((obj clog-obj)
&key (content "")
(on-click nil)
(class "w3-bar-item w3-button")
(html-id nil))
(let ((span (create-span obj :content content :class class :html-id html-id)))
(set-on-click span on-click)
(change-class span 'clog-gui-menu-item)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; create-gui-menu-full-screen ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defgeneric create-gui-menu-full-screen (clog-gui-menu-bar &key html-id)
(:documentation "Add as last item in menu bar to allow for a full screen
icon ⤢ and full screen mode."))
(defmethod create-gui-menu-full-screen ((obj clog-gui-menu-bar)
&key (html-id nil))
(create-child obj
" ⤢"
:html-id html-id
:clog-type 'clog-gui-menu-item))
;;;;;;;;;;;;;;;;;;;;;;;;;;
;; create-gui-menu-icon ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defgeneric create-gui-menu-icon (clog-gui-menu-bar &key image-url
on-click
class
html-id)
(:documentation "Add icon as menu bar item."))
(defmethod create-gui-menu-icon ((obj clog-gui-menu-bar)
&key (image-url "/img/clogwicon.png")
(on-click nil)
(class "w3-button w3-bar-item")
(html-id nil))
(set-on-click
(create-child obj
(format nil ""
class
image-url)
:html-id html-id
:clog-type 'clog-gui-menu-item)
on-click))