mirror of
https://gitlab.com/eql/EQL5.git
synced 2025-12-24 19:01:14 -08:00
89 lines
3.3 KiB
Common Lisp
89 lines
3.3 KiB
Common Lisp
;; port of Qt example "videowidget" (QtMultimediaWidgets)
|
|
|
|
(qrequire :multimedia)
|
|
|
|
(require :ui (in-src "examples/M-modules/multimedia/video-widget/ui/ui-video-widget"))
|
|
|
|
(defpackage :video-widget
|
|
(:nicknames :vw)
|
|
(:use :common-lisp :eql)
|
|
(:export
|
|
#:*media-player*
|
|
#:ini))
|
|
|
|
(in-package :video-widget)
|
|
|
|
(defvar *media-player* (qnew "QMediaPlayer(...)" nil |QMediaPlayer.VideoSurface|))
|
|
|
|
(defun standard-icon (style-sp)
|
|
(|standardIcon| (|style| ui:*main*) style-sp))
|
|
|
|
(defun theme-icon (name) ; optional (not used here)
|
|
;; the names would be:
|
|
;; "media-playback-start" and "media-playback-pause" (see Qt Assistant)
|
|
(|fromTheme.QIcon| name))
|
|
|
|
(defun ini ()
|
|
(ui:ini)
|
|
;; settings
|
|
(|setEnabled| ui:*play-button* nil)
|
|
(|setIcon| ui:*play-button* (standard-icon |QStyle.SP_MediaPlay|))
|
|
(|setRange| ui:*position-slider* 0 0)
|
|
(|setSizePolicy| ui:*error-label* (qnew "QSizePolicy(...)" |QSizePolicy.Preferred| |QSizePolicy.Maximum|))
|
|
(|setVideoOutput| *media-player* ui:*video-widget*)
|
|
;; connections
|
|
(qconnect ui:*open-button* "clicked()" 'open-file)
|
|
(qconnect ui:*play-button* "clicked()" 'play)
|
|
(qconnect ui:*position-slider* "sliderMoved(int)"
|
|
(lambda (position) (|setPosition| *media-player* position)))
|
|
(qconnect *media-player* "stateChanged(QMediaPlayer::State)" 'media-state-changed)
|
|
(qconnect *media-player* "positionChanged(qint64)"
|
|
(lambda (position) (|setValue| ui:*position-slider* position)))
|
|
(qconnect *media-player* "durationChanged(qint64)"
|
|
(lambda (duration) (|setRange| ui:*position-slider* 0 duration)))
|
|
(qconnect *media-player* "error(QMediaPlayer::Error)" 'handle-error)
|
|
(|show| ui:*main*))
|
|
|
|
(defun open-file ()
|
|
(let ((file-name (|getOpenFileName.QFileDialog|
|
|
ui:*main*
|
|
(tr "Open Movie")
|
|
(or (first (|standardLocations.QStandardPaths| |QStandardPaths.MoviesLocation|))
|
|
(|homePath.QDir|)))))
|
|
(unless (x:empty-string file-name)
|
|
(set-url (|fromLocalFile.QUrl| file-name))
|
|
(play))))
|
|
|
|
(defun set-url (url)
|
|
(|clear| ui:*error-label*)
|
|
(|setWindowFilePath| ui:*main* (if (|isLocalFile| url) (|toLocalFile| url) ""))
|
|
(qlet ((content "QMediaContent(QUrl)" url))
|
|
(|setMedia| *media-player* content))
|
|
(|setEnabled| ui:*play-button* t))
|
|
|
|
(defun play ()
|
|
(case (|state| *media-player*)
|
|
(#.|QMediaPlayer.PlayingState|
|
|
(|pause| *media-player*))
|
|
(t
|
|
(|play| *media-player*))))
|
|
|
|
(defun media-state-changed (state)
|
|
(|setIcon| ui:*play-button* (standard-icon (case state
|
|
(#.|QMediaPlayer.PlayingState|
|
|
|QStyle.SP_MediaPause|)
|
|
(t
|
|
|QStyle.SP_MediaPlay|)))))
|
|
|
|
(defun enum-error-to-string (number class enum-name)
|
|
(first (find number (cdadr (qenums class enum-name)) :key 'cdr)))
|
|
|
|
(defun handle-error (&optional num)
|
|
(|setEnabled| ui:*play-button* nil)
|
|
(let ((error-string (|errorString| *media-player*)))
|
|
(|setText| ui:*error-label* (format nil "Error: ~A"
|
|
(if (x:empty-string error-string)
|
|
(enum-error-to-string (|error| *media-player*) "QMediaPlayer" "Error")
|
|
error-string)))))
|
|
|
|
(ini)
|