EQL5/examples/3-main-window.lisp

52 lines
1.7 KiB
Common Lisp

(defpackage :main-window
(:use :common-lisp :eql)
(:export
#:start))
(in-package :main-window)
(defvar *main* (qload-ui (in-src "examples/data/main-window.ui")))
(defvar *editor* (qfind-child *main* "editor"))
(defvar *action-open* (qfind-child *main* "action_open"))
(defvar *action-save* (qfind-child *main* "action_save"))
(defun read-file (file)
;; "x:path" for unicode file names (OS specific)
(with-open-file (s (x:path file) :direction :input)
(let ((str (make-string (file-length s))))
(read-sequence str s)
str)))
(defun set-icon (action name)
"Icon from current theme."
(|setIcon| action (|fromTheme.QIcon| name)))
(defun set-icon-from-file (action name)
"Icon from custom pixmap."
(|setIcon| action (qnew "QIcon(QString)"
(in-src (format nil "examples/data/icons/~A.png" name)))))
(defun start ()
(x:do-with (qset *main*)
("pos" '(50 50))
("size" '(700 500)))
(set-icon *action-open* "document-open")
(set-icon *action-save* "document-save")
(qconnect *action-open* "triggered()" 'file-open)
(qconnect *action-save* "triggered()" 'file-save)
(|setHtml| *editor* (read-file (in-src "examples/data/utf8.htm")))
(x:do-with *main* |show| |raise|))
(defun file-open ()
(let ((file (|getOpenFileName.QFileDialog|)))
(unless (x:empty-string file)
(|setHtml| *editor* (read-file file)))))
(defun file-save ()
(let ((file (|getSaveFileName.QFileDialog|)))
(unless (x:empty-string file)
;; "x:path" for unicode file names (OS specific)
(with-open-file (s (x:path file) :direction :output :if-exists :supersede)
(write-string (|toHtml| *editor*) s)))))
(start)