Blame
Date:
Mon Jan 17 11:25:33 2022 UTC
Message:
fix ui after api change

see #7
001
2022-01-14
op
(defpackage #:phos/ui
002
2022-01-14
op
(:documentation "User Interface for phos")
003
2022-01-14
op
(:use #:cl #:nodgui))
004
2022-01-14
op
005
2020-11-09
op
(in-package #:phos/ui)
006
2020-11-09
op
007
2020-11-09
op
(defparameter *title-1-font* "serif 22"
008
2020-11-09
op
"Font for the level 1 title.")
009
2020-11-09
op
010
2020-11-09
op
(defparameter *title-2-font* "serif 19"
011
2020-11-09
op
"Font for the level 2 title.")
012
2020-11-09
op
013
2020-11-09
op
(defparameter *title-3-font* "serif 16"
014
2020-11-09
op
"Font for the level 3 title.")
015
2020-11-09
op
016
2020-11-09
op
(defparameter *verbatim-font* "monospace 12"
017
2020-11-09
op
"Font for the verbatim element.")
018
2020-11-09
op
019
2020-11-09
op
(defparameter *item-font* "serif 12"
020
2020-11-09
op
"Font for the item.")
021
2020-11-09
op
022
2020-11-09
op
(defparameter *link-font* "serif 12"
023
2020-11-09
op
"Font for the links.")
024
2020-11-09
op
025
2022-01-13
op
(defparameter *blockquote-font* "serif 12 italic"
026
2022-01-13
op
"Font for the quotations.")
027
2022-01-13
op
028
2020-11-09
op
(defparameter *paragraph-font* "serif 12"
029
2020-11-09
op
"Font for the normal text")
030
2020-11-09
op
031
2020-11-11
op
(defparameter *url-bar* nil)
032
2020-11-09
op
(defparameter *window-content* nil)
033
2020-11-09
op
034
2020-11-09
op
(defparameter *current-url* nil)
035
2020-11-09
op
036
2020-11-11
op
(defun join-paths (url path query)
037
2020-11-11
op
(setf (quri:uri-query url) query)
038
2020-11-11
op
(if (uiop:string-prefix-p "/" path)
039
2020-11-11
op
(setf (quri:uri-path url) path)
040
2020-11-11
op
(let ((p (quri:uri-path url)))
041
2020-11-11
op
(setf (quri:uri-path url)
042
2020-11-11
op
(format nil "~a~a"
043
2020-11-11
op
(if (uiop:string-suffix-p "/" p)
044
2020-11-11
op
p
045
2020-11-11
op
(directory-namestring p))
046
2020-11-11
op
path))))
047
2020-11-11
op
url)
048
2020-11-11
op
049
2020-11-11
op
(defun navigate-to (uri)
050
2020-11-11
op
(let ((hostname (quri:uri-host uri))
051
2020-11-11
op
(path (quri:uri-path uri))
052
2020-11-11
op
(query (quri:uri-query uri)))
053
2020-11-11
op
(if hostname
054
2020-11-11
op
(do-render uri)
055
2020-11-11
op
(do-render (join-paths (quri:copy-uri *current-url*)
056
2020-11-11
op
path
057
2020-11-11
op
query)))))
058
2020-11-11
op
059
2020-11-09
op
(defgeneric render (obj frame)
060
2020-11-09
op
(:documentation "Render OBJ in the nodgui FRAME"))
061
2020-11-09
op
062
2020-11-09
op
(defmethod render ((l list) f)
063
2020-11-09
op
(dolist (el l)
064
2020-11-09
op
(render el f)))
065
2020-11-09
op
066
2020-11-09
op
(defmethod render ((title gemtext:title) f)
067
2020-11-09
op
(with-slots ((text phos/gemtext:text)
068
2020-11-09
op
(level phos/gemtext:level))
069
2020-11-09
op
title
070
2020-11-09
op
(let ((w (make-instance 'label
071
2020-11-09
op
:master f
072
2020-11-09
op
:font (case level
073
2020-11-09
op
(1 *title-1-font*)
074
2020-11-09
op
(2 *title-2-font*)
075
2020-11-09
op
(3 *title-3-font*))
076
2022-01-14
op
:text (format nil "~v{~A~:*~} ~a"
077
2022-01-14
op
level '("#") text))))
078
2020-11-11
op
(pack w :side :top :fill :both :expand t))))
079
2020-11-09
op
080
2020-11-09
op
(defmethod render ((link gemtext:link) f)
081
2020-11-09
op
(with-slots ((text phos/gemtext:text)
082
2020-11-09
op
(url phos/gemtext:url))
083
2020-11-09
op
link
084
2020-11-09
op
(let ((w (make-instance 'button
085
2020-11-09
op
:master f
086
2020-11-09
op
;; :font *link-font*
087
2020-11-09
op
:text (format nil "~a" (or text url))
088
2020-11-09
op
:command (lambda ()
089
2020-11-11
op
(navigate-to url)))))
090
2020-11-11
op
(pack w :side :top :fill :both :expand t))))
091
2020-11-09
op
092
2020-11-09
op
(defmethod render ((item gemtext:item) f)
093
2020-11-09
op
(with-slots ((text phos/gemtext:text)) item
094
2020-11-09
op
(let ((w (make-instance 'label
095
2020-11-09
op
:master f
096
2020-11-09
op
:font *item-font*
097
2020-11-09
op
:text (format nil "* ~a" text))))
098
2020-11-11
op
(pack w :side :top :fill :both :expand t))))
099
2020-11-09
op
100
2022-01-13
op
(defmethod render ((q gemtext:blockquote) f)
101
2022-01-13
op
(with-slots ((text gemtext:text)) q
102
2022-01-13
op
(let ((w (make-instance 'message
103
2022-01-13
op
:master f
104
2022-01-13
op
:font *blockquote-font*
105
2022-01-13
op
:justify :left
106
2022-01-13
op
:text text
107
2022-01-13
op
:width 600)))
108
2022-01-13
op
(pack w :side :top :fill :both :expand t))))
109
2022-01-13
op
110
2020-11-09
op
(defmethod render ((par gemtext:paragraph) f)
111
2020-11-09
op
(with-slots ((text phos/gemtext:text)) par
112
2020-11-11
op
(let ((w (make-instance 'message
113
2020-11-09
op
:master f
114
2020-11-09
op
:font *paragraph-font*
115
2020-11-11
op
:justify "left"
116
2020-11-11
op
:text text
117
2020-11-11
op
:width 600)))
118
2020-11-11
op
;; (setf (text w) text)
119
2020-11-11
op
;; (configure w :state "disabled")
120
2020-11-11
op
(pack w :side :top :expand t :anchor "w"))))
121
2020-11-09
op
122
2020-11-09
op
(defmethod render ((v gemtext:verbatim) f)
123
2020-11-09
op
(with-slots ((text phos/gemtext:text)
124
2020-11-09
op
(alt phos/gemtext:alt))
125
2020-11-09
op
v
126
2020-11-09
op
(let ((w (make-instance 'label
127
2020-11-09
op
:master f
128
2020-11-09
op
:font *verbatim-font*
129
2020-11-09
op
:text text)))
130
2020-11-11
op
(pack w :side :top :fill :both :expand t)
131
2020-11-09
op
(when alt
132
2020-11-09
op
(pack (make-instance 'label
133
2020-11-09
op
:master f
134
2020-11-09
op
:text alt)
135
2020-11-11
op
:side :top
136
2020-11-11
op
:fill :both
137
2020-11-11
op
:expand t)))))
138
2020-11-09
op
139
2020-11-09
op
(defun clear-window ()
140
2020-11-09
op
(pack-forget-all *window-content*))
141
2020-11-09
op
142
2020-11-09
op
(defun do-render (url)
143
2020-11-11
op
(let* ((uri (quri:uri url)))
144
2020-11-11
op
(setf *current-url* uri)
145
2020-11-11
op
(setf (text *url-bar*) url)
146
2020-11-09
op
(clear-window)
147
2020-11-09
op
(render (gemtext:parse-string "# loading...")
148
2020-11-09
op
*window-content*)
149
2022-01-17
op
(multiple-value-bind (status meta body) (gemini:request url)
150
2022-01-17
op
(declare (ignore status meta))
151
2020-11-11
op
(clear-window)
152
2020-11-11
op
(render (gemtext:parse-string body)
153
2020-11-09
op
*window-content*))))
154
2020-11-09
op
155
2020-11-11
op
(defun navigate-button-cb ()
156
2022-01-14
op
(navigate-to (quri:uri (string-trim '(#\newline #\space)
157
2022-01-14
op
(text *url-bar*)))))
158
2020-11-11
op
159
2020-11-09
op
(defun main (url)
160
2020-11-09
op
(with-nodgui (:title "phos")
161
2020-11-11
op
(set-geometry *tk* 800 600 0 0)
162
2020-11-11
op
(let* ((nav (make-instance 'frame))
163
2020-11-11
op
(back-btn (make-instance 'button :text "←" :master nav))
164
2020-11-11
op
(forw-btn (make-instance 'button :text "→" :master nav))
165
2022-01-14
op
(go-btn (make-instance 'button :text "GO!" :master nav
166
2022-01-14
op
:command #'navigate-button-cb))
167
2020-11-11
op
(url-bar (make-instance 'text :height 1 :master nav))
168
2022-01-14
op
(sf (make-instance 'scrolled-frame :padding 10
169
2022-01-14
op
:takefocus nil)))
170
2020-11-11
op
(setf *url-bar* url-bar)
171
2020-11-09
op
(setf *window-content* (interior sf))
172
2020-11-11
op
(setf (text url-bar) "about:phos")
173
2020-11-11
op
(pack nav :fill :both)
174
2020-11-11
op
(pack back-btn :side :left)
175
2020-11-11
op
(pack forw-btn :side :left)
176
2020-11-11
op
(pack url-bar :side :left :expand t :fill :both)
177
2020-11-11
op
(pack go-btn :side :left)
178
2020-11-09
op
(pack sf :side :top :fill :both :expand t)
179
2020-11-09
op
(do-render url))))
180
2020-11-09
op
181
2020-11-09
op
;; (nodgui.demo:demo)
182
2020-11-09
op
183
2020-11-09
op
;; (main "gemini://gemini.omarpolo.com/")
Omar Polo