Commit b20a6b0e authored by David O'Toole's avatar David O'Toole

squareball demo

parent 6fb61e95
......@@ -484,14 +484,15 @@
(rename-buffer buffer buffer-name))))
(define-properties-dialog project-properties
(path width height scale-output-to-window frame-rate resizable author author-contact title license))
(path width height double-tap-time scale-output-to-window frame-rate resizable author author-contact title license))
(defmethod apply-properties :after ((dialog project-properties-dialog) &optional project)
(with-slots (name path resizable scale-output-to-window frame-rate title author author-contact
width height license) project
width height double-tap-time license) project
(setf *scale-output-to-window* scale-output-to-window)
(set-frame-rate frame-rate)
(setf *title* title)
(setf *double-tap-time* double-tap-time)
(setf *author* author)
(setf *author-contact* author)
(setf *screen-width* width)
......@@ -503,6 +504,12 @@
(loop for name being the hash-keys of *buffers* collect name))
;; User dialogs:1 ends here
;; [[file:~/xelf/gui.org::*User%20dialogs][User dialogs:2]]
(define-dialog change-buffer-class
((new-class (class-name (class-of (current-buffer)))))
(change-class (current-buffer) new-class))
;; User dialogs:2 ends here
;; Menu bar structure
......@@ -561,6 +568,7 @@
(:label "Copy buffer" :action show-copy-buffer-dialog)
(:label "Destroy buffer" :action show-destroy-buffer-dialog)
(:label "Save buffer in new file" :action show-save-buffer-in-new-file-dialog)
(:label "Change buffer class" :action show-change-buffer-class-dialog)
(:label "Revert buffer" :action show-revert-buffer-dialog)
(:label "Resize to background image" :action do-resize-to-background-image)
(:label "Make snapshot" :action show-take-snapshot-dialog)
......@@ -1187,6 +1195,7 @@ replace the original grid with this one."
(cursor-column :initform 0 :initarg :cursor-column :accessor cursor-column)
(row-heights :initform nil :initarg :row-heights :accessor row-heights)
(column-widths :initform nil :initarg :column-widths :accessor column-widths)
(column-labels :initform nil :initarg :column-labels :accessor column-labels)
(borders-p :initform nil :initarg :borders-p :accessor borders-p)
(headers-p :initform t :initarg :headers-p :accessor headers-p)))
......@@ -1284,10 +1293,14 @@ replace the original grid with this one."
(defparameter *sheet-header-font* "sans-9")
(defmethod header-width ((sheet cell-sheet))
(+ 12 (font-text-width (format nil "~d" (grid-rows (grid sheet))) *sheet-header-font*)))
(if (headers-p sheet)
(+ 12 (font-text-width (format nil "~d" (grid-rows (grid sheet))) *sheet-header-font*))
0))
(defmethod header-height ((sheet cell-sheet))
(font-height *sheet-header-font*))
(if (headers-p sheet)
(font-height *sheet-header-font*)
0))
(defparameter *minimum-column-width* 12)
(defparameter *minimum-row-height* 12)
......@@ -1406,15 +1419,28 @@ replace the original grid with this one."
(draw-box left top (- right left) (- bottom top) :color "gray20")
(draw-string string left top :color "white" :font *sheet-header-font*))
(defmethod row-label ((sheet cell-sheet) row)
(format nil "~d" row))
(defmethod column-label ((sheet cell-sheet) column)
(with-slots (column-labels) sheet
(if (and (consp column-labels)
(> (length column-labels)
column))
(nth column column-labels)
(format nil "~d" column))))
(defmethod draw-row-header ((sheet cell-sheet) row)
(apply #'draw-header-cell
sheet (format nil "~d" row)
sheet
(row-label sheet row)
(multiple-value-list
(row-header-bounding-box sheet row))))
(defmethod draw-column-header ((sheet cell-sheet) column)
(apply #'draw-header-cell
sheet (format nil "~d" column)
sheet
(column-label sheet column)
(multiple-value-list
(column-header-bounding-box sheet column))))
......@@ -1428,21 +1454,29 @@ replace the original grid with this one."
(draw-column-header sheet column)))
(do-nodes (node sheet)
(draw node))))
(defmethod process-tap :after ((cell-sheet cell-sheet) (node node) x y)
(multiple-value-bind (cell row column) (cell-at cell-sheet x y)
(when cell
(follow-with-camera cell-sheet node))))
;; Rendering cell sheets:1 ends here
;; Buffer list sheet
;; [[file:~/xelf/gui.org::*Buffer%20list%20sheet][Buffer list sheet:1]]
(defclass buffer-list (cell-sheet) ())
(defclass buffer-list (cell-sheet)
((column-labels :initform '("Name" "Class" "Objects" "File"))))
(defmethod populate ((buffer-list buffer-list))
(setf (grid buffer-list) (make-grid (hash-table-count *buffers*) 2))
(setf (grid buffer-list) (make-grid (hash-table-count *buffers*) 4))
(let ((row 0))
(dolist (buffer-name (all-buffer-names))
(let ((buffer (find-buffer buffer-name)))
(setf (cell buffer-list row 0) (make-instance 'string-entry :value buffer-name))
(setf (cell buffer-list row 1) (make-instance 'property-value-entry :value (hash-table-count (objects buffer)))))
(setf (cell buffer-list row 0) (make-instance 'string-entry :value buffer-name :label buffer-name))
(setf (cell buffer-list row 1) (make-instance 'property-value-entry :value (class-name (class-of buffer))))
(setf (cell buffer-list row 2) (make-instance 'property-value-entry :value (hash-table-count (objects buffer))))
(setf (cell buffer-list row 3) (make-instance 'property-value-entry :value (buffer-file-name buffer))))
(incf row))))
(defmethod process-tap :after ((buffer-list buffer-list) (node node) x y)
......@@ -1451,17 +1485,53 @@ replace the original grid with this one."
(let ((buffer (get-value (cell buffer-list row 0))))
(at-next-update (switch-to-buffer buffer))))))
;; (defmethod tap :after ((buffer-list buffer-list) x y)
;; (with-slots (point-row) buffer-list
;; (at-next-update (switch-to-buffer (nth point-row (slot-value buffer-list 'buffer))))))
;; (defclass buffer-list-dialog (dialog)
;; ((inputs :initform (list (make-instance 'buffer-list :text (all-buffer-names))))))
;; (defun show-buffer-list-dialog ()
;; (show-dialog (make-instance 'buffer-list-dialog) "Buffer list" :destroy-after-evaluate-p t))
(defmethod visit :after ((buffer-list buffer-list))
(with-slots (grid) buffer-list
(setf grid nil)
(do-nodes (node buffer-list)
(destroy node))
(populate buffer-list)))
;; Buffer list sheet:1 ends here
;; [[file:~/xelf/gui.org::*Buffer%20list%20sheet][Buffer list sheet:2]]
(defclass image-preview (node) ())
(defmethod initialize-instance :after ((image-preview image-preview) &key image)
(setf (slot-value image-preview 'image) image)
(resize image-preview 64 64))
(defmethod draw ((image-preview image-preview))
(with-slots (image x y width height) image-preview
(draw-image image x y :width width :height height)))
(defclass image-list (cell-sheet)
((column-labels :initform '("Preview" "Width" "Height" "File"))))
(defmethod populate ((image-list image-list))
(let ((images (all-image-names (current-project))))
(setf (grid image-list) (make-grid (length images) 4))
(let ((row 0))
(dolist (image-name images)
(setf (cell image-list row 0) (make-instance 'image-preview :image image-name))
(setf (cell image-list row 1) (make-instance 'property-value-entry :value (image-width image-name)))
(setf (cell image-list row 2) (make-instance 'property-value-entry :value (image-height image-name)))
(setf (cell image-list row 3) (make-instance 'property-value-entry :value (find-file (current-project) image-name)))
(incf row)))))
;; (defmethod process-tap :after ((image-list image-list) (node node) x y)
;; (multiple-value-bind (cell row column) (cell-at image-list x y)
;; (when cell
;; (let ((buffer (get-value (cell image-list row 0))))
;; (at-next-update (switch-to-buffer buffer))))))
(defmethod visit :after ((image-list image-list))
(with-slots (grid) image-list
(setf grid nil)
(do-nodes (node image-list)
(destroy node))
(populate image-list)))
;; Buffer list sheet:2 ends here
;; Desktop
;; The included icons are inspired by the Xerox Star interface.
......@@ -1636,18 +1706,25 @@ replace the original grid with this one."
(make-instance 'text-icon :text *copyright-notice* :title "License")
(make-instance 'button-icon
:image (icon-image :open-folder)
:caption "Cell sheet"
:action #'(lambda ()
(at-next-update
(switch-to-buffer
(make-instance 'cell-sheet :buffer-name "*cell sheet*")))))
(make-instance 'buffer-icon :buffer-name "New Buffer")
(make-instance 'buffer-icon :buffer-name "New Class")
(make-instance 'folder-icon :buffer-name "Classes")
(make-instance 'folder-icon :buffer-name "Resources")
(make-instance 'folder-icon :buffer-name "Buffers")
;; (make-instance 'buffer-icon :buffer-name "New Buffer")
;; (make-instance 'buffer-icon :buffer-name "New Class")
;; (make-instance 'folder-icon :buffer-name "Classes")
;; (make-instance 'folder-icon :buffer-name "Resources")
;; (make-instance 'folder-icon :buffer-name "Buffers")
(make-instance 'button-icon :image (icon-image :project)
:action #'show-buffer-list
:caption "Buffer List")))
:caption "Buffer List")
(make-instance 'button-icon :image (icon-image :project)
:action #'show-image-list
:caption "Image List")))
(defun show-image-list ()
(at-next-update (switch-to-buffer (find-buffer "*image-list*" :create t :class 'image-list))))
(defmethod populate ((desktop desktop))
(dolist (icon (default-icons desktop))
......
......@@ -109,15 +109,16 @@ These should be set before the window opens, i.e. before [[file:dictionary/WITH-
(defparameter *height* 720)
(defun configure-screen ()
(setf *font* "sans-11")
(setf *frame-rate* 60)
(setf *font-texture-scale* 2)
(setf *font-texture-scale* 1)
(setf *font-texture-filter* :linear)
(setf *window-title* *title-string*)
(setf *screen-width* *width*)
(setf *screen-height* *height*)
(setf *nominal-screen-width* *width*)
(setf *nominal-screen-height* *height*)
(setf *scale-output-to-window* t))
(setf *scale-output-to-window* nil))
#+end_src
* Establishing grid unit size
......@@ -2261,7 +2262,8 @@ These strings are segregated here for easier localization and editing.
(defun squareball (&rest args)
(setf *use-fortresses* nil)
(setf *use-bumpers* nil)
(setf *use-antialiased-text* nil)
(setf *scale-output-to-window* nil)
(setf *use-antialiased-text* t)
(setf *variation* 4)
(configure-screen)
(with-session
......@@ -2271,7 +2273,7 @@ These strings are segregated here for easier localization and editing.
(index-pending-resources)
(preload-resources)
;; preload music
(setf *default-texture-filter* :nearest)
(setf *default-texture-filter* :linear)
(mapc #'find-resource '("rhythm.ogg" "fanfare-1.ogg" "fanfare-2.ogg" "vixon.ogg" "end.ogg" "beatdown.ogg"))
(initialize-sounds)
(apply #'play-squareball args)))
......
......@@ -292,9 +292,12 @@
;; [[file:~/xelf/gui.org::*Buffers%20associated%20with%20a%20file][Buffers associated with a file:1]]
(defmethod buffer-file-name ((self buffer))
(defun safe-file-name-string (string)
(substitute #\- #\Space (strip-asterisks string)))
(defmethod buffer-file-name ((self buffer))
(when (slot-value self 'buffer-name)
(concatenate 'string (slot-value self 'buffer-name) ".xelf")))
(safe-file-name-string (concatenate 'string (slot-value self 'buffer-name) ".xelf"))))
;; Buffers associated with a file:1 ends here
;; Modification flag for editing
......@@ -338,7 +341,7 @@
(defun flash (&optional (divisor 4))
(let ((factor (case *frame-rate*
(30 1)
(60 2))))
(60 1/2))))
(sin (* (/ *updates* divisor)
(or factor 1)))))
......
This diff is collapsed.
......@@ -72,15 +72,16 @@ directory included with this application.
(defparameter *height* 720)
(defun configure-screen ()
(setf *font* "sans-11")
(setf *frame-rate* 60)
(setf *font-texture-scale* 2)
(setf *font-texture-scale* 1)
(setf *font-texture-filter* :linear)
(setf *window-title* *title-string*)
(setf *screen-width* *width*)
(setf *screen-height* *height*)
(setf *nominal-screen-width* *width*)
(setf *nominal-screen-height* *height*)
(setf *scale-output-to-window* t))
(setf *scale-output-to-window* nil))
;; Display properties:1 ends here
;; Establishing grid unit size
......@@ -2322,7 +2323,8 @@ directory included with this application.
(defun squareball (&rest args)
(setf *use-fortresses* nil)
(setf *use-bumpers* nil)
(setf *use-antialiased-text* nil)
(setf *scale-output-to-window* nil)
(setf *use-antialiased-text* t)
(setf *variation* 4)
(configure-screen)
(with-session
......@@ -2332,7 +2334,7 @@ directory included with this application.
(index-pending-resources)
(preload-resources)
;; preload music
(setf *default-texture-filter* :nearest)
(setf *default-texture-filter* :linear)
(mapc #'find-resource '("rhythm.ogg" "fanfare-1.ogg" "fanfare-2.ogg" "vixon.ogg" "end.ogg" "beatdown.ogg"))
(initialize-sounds)
(apply #'play-squareball args)))
......
* Demo
** TODO start with desktop
** TODO show cell sheet
** TODO show cell selection
** TODO show layout change in cells when opening/closing menu
** TODO show create buffer
** TODO show change class
** TODO show image browser
* Task list
** TODO Fix FIND-BUFFER registration and too many buffers being created :initarg not respected
** TODO cursor movement
** TODO scrolling
** DONE function to determine what row/col was clicked widget
CLOSED: [2017-04-26 Wed 17:57]
** DONE change buffer list window into cell sheet
CLOSED: [2017-04-26 Wed 17:11]
** TODO cell cursor movement
** TODO cell scrolling
** TODO context tool buttons on / above modeline
** TODO [#A] allow recursive buffer view and split views
**** TODO buffer-proxy class
**** TODO fix project-window always before draw
......@@ -15,7 +20,8 @@
** TODO [#B] Design user experience
*** TODO launching external programs to edit assets. gimp, audacity, switch-to-emacs,. etc
*** TODO folders are virtual views, they don't nest
** TODO [#A] change-buffer-class
** DONE [#A] change-buffer-class
CLOSED: [2017-04-26 Wed 19:30]
** TODO [#A] command undo/redo
** TODO [#A] design layered tile map editing
** TODO [#A] snap-to-grid and offset
......@@ -1278,3 +1284,33 @@
*** TODO tree with each row being a list of words
*** TODO passive layout child cell class
*** TODO review cell-mode code
** DONE Fix FIND-BUFFER registration and too many buffers being created :initarg not respected
CLOSED: [2017-04-26 Wed 19:00]
:PROPERTIES:
:ARCHIVE_TIME: 2017-04-26 Wed 19:00
:ARCHIVE_FILE: ~/xelf/tasks.org
:ARCHIVE_OLPATH: Task list
:ARCHIVE_CATEGORY: tasks
:ARCHIVE_TODO: DONE
:END:
** DONE function to determine what row/col was clicked widget
CLOSED: [2017-04-26 Wed 17:57]
:PROPERTIES:
:ARCHIVE_TIME: 2017-04-26 Wed 19:00
:ARCHIVE_FILE: ~/xelf/tasks.org
:ARCHIVE_OLPATH: Task list
:ARCHIVE_CATEGORY: tasks
:ARCHIVE_TODO: DONE
:END:
** DONE change buffer list window into cell sheet
CLOSED: [2017-04-26 Wed 17:11]
:PROPERTIES:
:ARCHIVE_TIME: 2017-04-26 Wed 19:00
:ARCHIVE_FILE: ~/xelf/tasks.org
:ARCHIVE_OLPATH: Task list
:ARCHIVE_CATEGORY: tasks
:ARCHIVE_TODO: DONE
:END:
......@@ -21,7 +21,9 @@
(setf xelf::*font* "sans-11")
(with-session
(open-project :plong)
(index-pending-resources)
(xelf::index-all-images)
(xelf::index-pending-resources)
(xelf::preload-resources)
(let ((plong (make-instance 'xelf::desktop)))
;; start the buffer running
(switch-to-buffer plong))))
......@@ -31,61 +33,67 @@
;; (bind-event (current-buffer) '(:f9) 'xelf::toggle-other-windows)
;; (start-game plong)))))
;; (trace xelf::evaluate)
;; (trace xelf::get-property-list)
;; (trace xelf::apply-properties)
;; (trace xelf::show-dialog)
;; (trace xelf::tab)
;; (trace xelf::find-tab-parent)
;; (trace xelf::find-tab-proxy)
;; (trace xelf::position-within-parent)
;; (trace xelf::show-dialog)
;; (trace xelf::tap)
;; (trace xelf::get-property-object-pairs)
;; (trace xelf::get-property-entries)
;; ;; (trace xelf::resize)
;; ;; (trace xelf::layout)
;; ;; (trace xelf::evaluate-here)
;; ;; (trace xelf::evaluate-expression)
;; ;; (trace xelf::evaluate-output)
;; ;; (trace xelf::layout)
;; (trace xelf::select)
;; (trace xelf::unselect)
;; (trace xelf::toggle-selected)
;; (trace xelf::backtab)
;; (trace xelf::handle-event)
;; (trace xelf::do-show-buffer-properties-dialog)
;; (trace xelf::show-buffer-properties-dialog)
;; (trace xelf::close-menus)
;; (trace xelf::context-menu)
;; (trace xelf::restore-default-values)
;; (trace xelf::make-menu)
;; (trace xelf::make-tree)
;; (trace xelf::make-halo)
;; (trace xelf::make-method-menu-item)
;; (trace xelf::release)
;; (trace xelf::press)
;; (trace xelf::open-shell)
;; (trace xelf::focus-on)
;; (trace xelf::close-shell)
(trace xelf::all-images)
(trace xelf::all-buffers)
(trace xelf::project-images)
(trace xelf::open-p)
(trace xelf::evaluate)
(trace xelf::get-property-list)
(trace xelf::apply-properties)
(trace xelf::show-dialog)
(trace xelf::tab)
(trace xelf::find-tab-parent)
(trace xelf::find-tab-proxy)
(trace xelf::position-within-parent)
(trace xelf::show-dialog)
(trace xelf::tap)
(trace xelf::get-property-object-pairs)
(trace xelf::get-property-entries)
;; (trace xelf::resize)
;; (trace xelf::layout)
;; (trace xelf::evaluate-here)
;; (trace xelf::evaluate-expression)
;; (trace xelf::evaluate-output)
;; (trace xelf::layout)
(trace xelf::select)
(trace xelf::unselect)
(trace xelf::toggle-selected)
(trace xelf::backtab)
(trace xelf::handle-event)
(trace xelf::do-show-buffer-properties-dialog)
(trace xelf::show-buffer-properties-dialog)
(trace xelf::close-menus)
(trace xelf::context-menu)
(trace xelf::restore-default-values)
(trace xelf::make-menu)
(trace xelf::make-tree)
(trace xelf::make-halo)
(trace xelf::make-method-menu-item)
(trace xelf::release)
(trace xelf::press)
(trace xelf::open-shell)
(trace xelf::focus-on)
(trace xelf::close-shell)
;; (trace switch-to-buffer)
;; (trace all-buffer-names)
;; ;; (trace xelf::drag-candidate)
;; ;; (trace xelf::drag-maybe)
;; ;; (trace xelf::drag-fail)
;; ;; (trace xelf::hit-inputs)
;; ;; (trace xelf::draw-focus)
;; (trace xelf::destroy)
(trace switch-to-buffer)
(trace all-buffer-names)
;; (trace xelf::drag-candidate)
;; (trace xelf::drag-maybe)
;; (trace xelf::drag-fail)
;; (trace xelf::hit-inputs)
;; (trace xelf::draw-focus)
(trace xelf::destroy)
;; (trace xelf::find-root-desktop)
;; (trace xelf::find-buffer)
;; (trace xelf::show-root-desktop)
;; (trace xelf::auto-arrange)
;; (trace xelf::default-icons)
;; (trace xelf::populate)
(trace xelf::find-root-desktop)
(trace xelf::find-buffer)
(trace xelf::show-root-desktop)
(trace xelf::auto-arrange)
(trace xelf::default-icons)
(trace xelf::populate)
;; (trace xelf::add-node)
(trace xelf::all-image-names)
(trace xelf::add-node)
(trace xelf::index-all-images)
;; (untrace xelf::layout)
;; (trace xelf::draw-cell)
......
......@@ -1564,6 +1564,7 @@ Returns a newly allocated list."
(clear-cached-fonts))
(when *clear-cached-images-on-buffer-switch*
(clear-cached-images))
(visit buffer)
))
;; make sure shell stays open when switching
(if *interactive-p*
......@@ -1600,6 +1601,8 @@ Returns a newly allocated list."
(quadtree :initform nil :accessor quadtree)
(quadtree-depth :initform 4 :accessor quadtree-depth)))
(defmethod visit ((qbuffer qbuffer)) nil)
(defmethod initialize-instance :after ((qbuffer qbuffer) &key)
(setf (objects qbuffer)
(make-hash-table :test 'equal)))
......@@ -3396,7 +3399,6 @@ Returns a newly allocated list."
(defun project-images ()
(directory-images (find-project-path)))
(defun add-file-resource (filename)
(add-resource (expand-resource-description
(list :name (find-native-namestring (file-namestring filename))))))
......@@ -6211,7 +6213,7 @@ Returns a newly allocated list."
;; defclass lower-command
;; Commands and undo/redo:1 ends here
;; Project object
;; TODO Project object
;; [[file:~/xelf/xelf.org::*Project%20object][Project object:1]]
......@@ -6229,6 +6231,7 @@ Returns a newly allocated list."
(height :initform *screen-height*)
(open-p :initform nil :accessor open-p)
(modified-p :initform nil :accessor modified-p)
(double-tap-time :initform *double-tap-time* :accessor double-tap-time :initarg :double-tap-time)
(properties :initform nil :initarg :properties :accessor properties)))
(defmethod create-new ((project project) name &optional folder-name parent)
......@@ -6262,12 +6265,20 @@ Returns a newly allocated list."
*buffers*)))
(defmethod all-images ((project project))
(when (open-p project)
(project-images)))
;; (when (open-p project)
(project-images))
(defmethod all-image-names ((project project))
(let (images)
(maphash #'(lambda (name resource)
(when (eq :image (resource-type resource))
(push name images)))
*resources*)
images))
(defmethod all-samples ((project project))
(when (open-p project)
(project-samples)))
;;(when (open-p project)
(project-samples))
(defmethod all-music ((project project))
(remove-if-not #'music-filename-p
......
......@@ -1632,6 +1632,7 @@ Only one buffer can be active at a time.
(clear-cached-fonts))
(when *clear-cached-images-on-buffer-switch*
(clear-cached-images))
(visit buffer)
))
;; make sure shell stays open when switching
(if *interactive-p*
......@@ -1667,6 +1668,8 @@ them into the quadtree system by managing QUADRILLE objects.
(quadtree :initform nil :accessor quadtree)
(quadtree-depth :initform 4 :accessor quadtree-depth)))
(defmethod visit ((qbuffer qbuffer)) nil)
(defmethod initialize-instance :after ((qbuffer qbuffer) &key)
(setf (objects qbuffer)
(make-hash-table :test 'equal)))
......@@ -3413,7 +3416,6 @@ increases.
(defun project-images ()
(directory-images (find-project-path)))
(defun add-file-resource (filename)
(add-resource (expand-resource-description
(list :name (find-native-namestring (file-namestring filename))))))
......@@ -6192,7 +6194,7 @@ Please see the [[file:gui.html][GUI page]] for code and documentation.
* Facade objects
** Project object
** TODO Project object
#+begin_src lisp
(defclass project (node)
......@@ -6209,6 +6211,7 @@ Please see the [[file:gui.html][GUI page]] for code and documentation.
(height :initform *screen-height*)
(open-p :initform nil :accessor open-p)
(modified-p :initform nil :accessor modified-p)
(double-tap-time :initform *double-tap-time* :accessor double-tap-time :initarg :double-tap-time)
(properties :initform nil :initarg :properties :accessor properties)))
(defmethod create-new ((project project) name &optional folder-name parent)
......@@ -6242,12 +6245,20 @@ Please see the [[file:gui.html][GUI page]] for code and documentation.
*buffers*)))
(defmethod all-images ((project project))
(when (open-p project)
(project-images)))
;; (when (open-p project)
(project-images))
(defmethod all-image-names ((project project))
(let (images)
(maphash #'(lambda (name resource)
(when (eq :image (resource-type resource))
(push name images)))
*resources*)
images))
(defmethod all-samples ((project project))
(when (open-p project)
(project-samples)))
;;(when (open-p project)
(project-samples))
(defmethod all-music ((project project))
(remove-if-not #'music-filename-p
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment