(in-package #:cl-bible.chapter) (defclass chapter () ((%verses :initarg :verses :reader verses))) (defgeneric chapter-to-clog (chapter parent &key translation)) (defgeneric book/chapter-window (canvas title)) (defgeneric translations-drop-down (div display chapter drop-down)) (defgeneric display-chapter-or-book (canvas title chapter)) (defgeneric load-chapter (canvas book chapter)) (defgeneric load-book (canvas book)) (defmethod chapter-to-clog ((chapter chapter) (parent clog:clog-obj) &key (translation :mng)) (labels ((verse-to-clog (verse) ;;; (clog:set-on-click (v:verse-to-clog verse parent :translation translation) ;;; (lambda (obj) ;;; (declare (ignore obj)) ;;; (v::show-notes verse parent))) )) (mapcar #'verse-to-clog (verses chapter)))) (defmethod book/chapter-window (canvas (title string)) (let* ((win (window-content (create-gui-window canvas :title title :height 400 :width 500))) (mbar (create-gui-menu-bar win)) (drop-down (create-gui-menu-drop-down mbar :content "Translations"))) (values (create-div win) drop-down))) (defmethod translations-drop-down ((div clog:clog-div) display (chapter chapter) drop-down) (mapcar (lambda (translation) (labels ((callback (obj) (declare (ignore obj)) (d:update-bible (third translation)))) (create-gui-menu-item drop-down :content (first translation) :on-click #'callback))) d:*translations*)) (defmethod display-chapter-or-book (canvas (title string) (chapter chapter)) (multiple-value-bind (div drop-down) (book/chapter-window canvas title) (let ((display (chapter-to-clog chapter div :translation d:*translation*))) (translations-drop-down div display chapter drop-down)))) (defmethod load-chapter (canvas (book string) (chapter string)) (let* ((bk (s:find-book d:*bible* book)) (verses (if (find #\- chapter) (loop :for chap :in (uiop:split-string chapter :separator '(#\-)) :append (s:find-chapter bk chap)) (s:find-chapter bk chapter)))) (display-chapter-or-book canvas (format nil "~A: ~A ~A" d:*translation* book chapter) (make-instance 'chapter :verses verses)))) (defmethod load-book ((canvas clog:clog-body) (book string)) (display-chapter-or-book canvas (format nil "~A: ~A" d:*translation* book) (make-instance 'chapter :verses (s:find-book d:*bible* book)))) (defmethod load-position ((canvas clog:clog-body) (pos string)) (display-chapter-or-book canvas (format nil "~A: ~A" d:*translation* pos) (make-instance 'chapter :verses (s:find-verse d:*bible* (s:parse-position pos)))))