EQL5/examples/M-modules/webkit/plugin-widget.lisp
2016-11-25 23:30:38 +01:00

57 lines
2 KiB
Common Lisp

;;; QtWebKit Plugin Widget Example
;;;
;;; (depends on small plugin, see "lib/")
;;;
;;; This is a simple example of embedding a custom QWidget in a QWebView.
;;;
;;; Note: Adding QNetworkRequest to the plugin widget would allow to get
;;; any data from the web, but this is not shown here.
#-qt-wrapper-functions ; see README-OPTIONAL.txt
(load (in-home "src/lisp/all-wrappers"))
(qrequire :webkit)
(in-package :eql-user)
(load "inspector")
(defvar *web-view* (qnew "QWebView"))
(defvar *webkit-bridge* (qload-c++ "lib/webkit_bridge"))
(defun frame ()
(|mainFrame| (|page| *web-view*)))
(defun clock ()
(symbol-value (find-symbol "*CLOCK*" :clock)))
(defun set-params (arg-names arg-values)
"Qt: void setParams(QStringList, QStringList)" ; see "README-GLUE-CODE.txt"
(mapc (lambda (name value)
(when (find name '("show-minutes" "show-seconds") :test 'string-equal)
(setf (symbol-value (find-symbol (string-upcase (format nil "*~A*" name)) :clock))
(string-equal "true" value))))
arg-names arg-values))
(defun ini ()
;; use example "clock" as plugin widget
(load "../../2-clock")
(|hide| (clock))
(let ((web-plugin (qnew "QWebPluginFactory(QObject*)" *web-view*))
(settings (|settings| *web-view*)))
(|setAttribute| settings |QWebSettings.PluginsEnabled| t)
(qoverride web-plugin "create(QString,QUrl,QStringList,QStringList)"
(lambda (mime-type url arg-names arg-values)
(when (string= "application/x-clock" mime-type)
(set-params arg-names arg-values)
(clock))))
(|setPluginFactory| (|page| *web-view*) web-plugin))
(qconnect (frame) "javaScriptWindowObjectCleared()"
(lambda ()
(|addToJavaScriptWindowObject| (frame) "Lisp" *webkit-bridge*)))
(|setUrl| *web-view* (qnew "QUrl(QString)"
(x:cc "file://" (namestring (probe-file "plugin-widget.htm")))))
(|show| *web-view*))
(ini)