Blame


1 6b4d9ef2 2020-11-09 op (in-package #:phos/ui)
2 6b4d9ef2 2020-11-09 op
3 073b25eb 2020-11-09 op (defparameter *title-1-font* "serif 22"
4 073b25eb 2020-11-09 op "Font for the level 1 title.")
5 073b25eb 2020-11-09 op
6 073b25eb 2020-11-09 op (defparameter *title-2-font* "serif 19"
7 073b25eb 2020-11-09 op "Font for the level 2 title.")
8 073b25eb 2020-11-09 op
9 073b25eb 2020-11-09 op (defparameter *title-3-font* "serif 16"
10 073b25eb 2020-11-09 op "Font for the level 3 title.")
11 073b25eb 2020-11-09 op
12 073b25eb 2020-11-09 op (defparameter *verbatim-font* "monospace 12"
13 073b25eb 2020-11-09 op "Font for the verbatim element.")
14 073b25eb 2020-11-09 op
15 073b25eb 2020-11-09 op (defparameter *item-font* "serif 12"
16 073b25eb 2020-11-09 op "Font for the item.")
17 073b25eb 2020-11-09 op
18 073b25eb 2020-11-09 op (defparameter *link-font* "serif 12"
19 073b25eb 2020-11-09 op "Font for the links.")
20 073b25eb 2020-11-09 op
21 073b25eb 2020-11-09 op (defparameter *paragraph-font* "serif 12"
22 073b25eb 2020-11-09 op "Font for the normal text")
23 073b25eb 2020-11-09 op
24 073b25eb 2020-11-09 op (defparameter *window-content* nil)
25 073b25eb 2020-11-09 op
26 073b25eb 2020-11-09 op (defparameter *current-url* nil)
27 073b25eb 2020-11-09 op
28 6b4d9ef2 2020-11-09 op (defgeneric render (obj frame)
29 073b25eb 2020-11-09 op (:documentation "Render OBJ in the nodgui FRAME"))
30 6b4d9ef2 2020-11-09 op
31 6b4d9ef2 2020-11-09 op (defmethod render ((l list) f)
32 6b4d9ef2 2020-11-09 op (dolist (el l)
33 6b4d9ef2 2020-11-09 op (render el f)))
34 6b4d9ef2 2020-11-09 op
35 6b4d9ef2 2020-11-09 op (defmethod render ((title gemtext:title) f)
36 073b25eb 2020-11-09 op (with-slots ((text phos/gemtext:text)
37 6b4d9ef2 2020-11-09 op (level phos/gemtext:level))
38 6b4d9ef2 2020-11-09 op title
39 6b4d9ef2 2020-11-09 op (let ((w (make-instance 'label
40 6b4d9ef2 2020-11-09 op :master f
41 073b25eb 2020-11-09 op :font (case level
42 073b25eb 2020-11-09 op (1 *title-1-font*)
43 073b25eb 2020-11-09 op (2 *title-2-font*)
44 073b25eb 2020-11-09 op (3 *title-3-font*))
45 073b25eb 2020-11-09 op :text (format nil "~v{~A~:*~} ~a" level '("#") text))))
46 6b4d9ef2 2020-11-09 op (pack w :side :top))))
47 6b4d9ef2 2020-11-09 op
48 6b4d9ef2 2020-11-09 op (defmethod render ((link gemtext:link) f)
49 6b4d9ef2 2020-11-09 op (with-slots ((text phos/gemtext:text)
50 6b4d9ef2 2020-11-09 op (url phos/gemtext:url))
51 6b4d9ef2 2020-11-09 op link
52 6b4d9ef2 2020-11-09 op (let ((w (make-instance 'button
53 6b4d9ef2 2020-11-09 op :master f
54 073b25eb 2020-11-09 op ;; :font *link-font*
55 073b25eb 2020-11-09 op :text (format nil "~a" (or text url))
56 073b25eb 2020-11-09 op :command (lambda ()
57 073b25eb 2020-11-09 op (format t "before rendering ~a~%" url)
58 073b25eb 2020-11-09 op (do-render url)))))
59 6b4d9ef2 2020-11-09 op (pack w :side :top))))
60 6b4d9ef2 2020-11-09 op
61 6b4d9ef2 2020-11-09 op (defmethod render ((item gemtext:item) f)
62 6b4d9ef2 2020-11-09 op (with-slots ((text phos/gemtext:text)) item
63 6b4d9ef2 2020-11-09 op (let ((w (make-instance 'label
64 6b4d9ef2 2020-11-09 op :master f
65 073b25eb 2020-11-09 op :font *item-font*
66 6b4d9ef2 2020-11-09 op :text (format nil "* ~a" text))))
67 6b4d9ef2 2020-11-09 op (pack w :side :top))))
68 6b4d9ef2 2020-11-09 op
69 6b4d9ef2 2020-11-09 op (defmethod render ((par gemtext:paragraph) f)
70 6b4d9ef2 2020-11-09 op (with-slots ((text phos/gemtext:text)) par
71 6b4d9ef2 2020-11-09 op (let ((w (make-instance 'label
72 6b4d9ef2 2020-11-09 op :master f
73 073b25eb 2020-11-09 op :font *paragraph-font*
74 6b4d9ef2 2020-11-09 op :text text)))
75 6b4d9ef2 2020-11-09 op (pack w :side :top))))
76 6b4d9ef2 2020-11-09 op
77 6b4d9ef2 2020-11-09 op (defmethod render ((v gemtext:verbatim) f)
78 6b4d9ef2 2020-11-09 op (with-slots ((text phos/gemtext:text)
79 6b4d9ef2 2020-11-09 op (alt phos/gemtext:alt))
80 6b4d9ef2 2020-11-09 op v
81 6b4d9ef2 2020-11-09 op (let ((w (make-instance 'label
82 6b4d9ef2 2020-11-09 op :master f
83 073b25eb 2020-11-09 op :font *verbatim-font*
84 073b25eb 2020-11-09 op :text text)))
85 073b25eb 2020-11-09 op (pack w :side :top)
86 073b25eb 2020-11-09 op (when alt
87 073b25eb 2020-11-09 op (pack (make-instance 'label
88 073b25eb 2020-11-09 op :master f
89 073b25eb 2020-11-09 op :text alt)
90 073b25eb 2020-11-09 op :side :top)))))
91 6b4d9ef2 2020-11-09 op
92 073b25eb 2020-11-09 op (defun clear-window ()
93 073b25eb 2020-11-09 op (pack-forget-all *window-content*))
94 6b4d9ef2 2020-11-09 op
95 073b25eb 2020-11-09 op (defun do-render (url)
96 073b25eb 2020-11-09 op (let* ((uri (quri:uri url))
97 073b25eb 2020-11-09 op (*current-url* uri)
98 073b25eb 2020-11-09 op (base (quri:copy-uri uri)))
99 073b25eb 2020-11-09 op (setf (quri:uri-path base) nil)
100 073b25eb 2020-11-09 op (clear-window)
101 073b25eb 2020-11-09 op (render (gemtext:parse-string "# loading...")
102 073b25eb 2020-11-09 op *window-content*)
103 073b25eb 2020-11-09 op (clear-window)
104 073b25eb 2020-11-09 op (multiple-value-bind (status body) (gemini:request url)
105 073b25eb 2020-11-09 op (declare (ignore status))
106 073b25eb 2020-11-09 op (render (gemtext:parse-string body base)
107 073b25eb 2020-11-09 op *window-content*))))
108 6b4d9ef2 2020-11-09 op
109 073b25eb 2020-11-09 op (defun main (url)
110 073b25eb 2020-11-09 op (with-nodgui (:title "phos")
111 073b25eb 2020-11-09 op (let ((sf (make-instance 'scrolled-frame)))
112 073b25eb 2020-11-09 op (setf *window-content* (interior sf))
113 073b25eb 2020-11-09 op (pack sf :side :top :fill :both :expand t)
114 073b25eb 2020-11-09 op (do-render url))))
115 073b25eb 2020-11-09 op
116 073b25eb 2020-11-09 op ;; (nodgui.demo:demo)
117 073b25eb 2020-11-09 op
118 073b25eb 2020-11-09 op ;; (main "gemini://gemini.omarpolo.com/")