[gsharp-cvs] CVS update: gsharp/gui.lisp

Robert Strandh rstrandh at common-lisp.net
Wed Jul 21 14:45:43 UTC 2004


Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv21760

Modified Files:
	gui.lisp 
Log Message:
completions for staves, staff types, and clef types work better now
(should no longer fail on parse error). 

improved rename-staff command and made staff names unique. 


Date: Wed Jul 21 07:45:43 2004
Author: rstrandh

Index: gsharp/gui.lisp
diff -u gsharp/gui.lisp:1.13 gsharp/gui.lisp:1.14
--- gsharp/gui.lisp:1.13	Wed Jul 21 05:42:59 2004
+++ gsharp/gui.lisp	Wed Jul 21 07:45:43 2004
@@ -998,74 +998,113 @@
 ;;;
 ;;; Adding, deleting, and modifying staves
 
+(define-condition no-such-staff (gsharp-condition) ()
+  (:report
+   (lambda (condition stream)
+     (declare (ignore condition))
+     (format stream "No such staff"))))
+
+(define-presentation-method accept
+    ((type score-pane:staff) stream (view textual-view) &key)
+  (multiple-value-bind (staff success string)
+      (handler-case (complete-input stream
+				    (lambda (so-far mode)
+				      (complete-from-possibilities
+				       so-far
+				       (staves (buffer *gsharp-frame*))
+				       '()
+				       :action mode
+				       :predicate (lambda (obj) (declare (ignore obj)) t)
+				       :name-key #'name
+				       :value-key #'identity)))
+	(simple-parse-error () (error 'no-such-staff)))
+    (declare (ignore string))
+    (if success staff (error 'no-such-staff))))
+
 (define-presentation-method accept
     ((type fiveline-staff) stream (view textual-view) &key)
   (multiple-value-bind (staff success string)
-      (complete-input stream
-		      (lambda (so-far mode)
-			(complete-from-possibilities
-			 so-far
-			 (staves (buffer *gsharp-frame*))
-			 '()
-			 :action mode
-			 :predicate (lambda (obj) (typep obj 'fiveline-staff))
-			 :name-key #'name
-			 :value-key #'identity)))
+      (handler-case (complete-input stream
+				    (lambda (so-far mode)
+				      (complete-from-possibilities
+				       so-far
+				       (staves (buffer *gsharp-frame*))
+				       '()
+				       :action mode
+				       :predicate (lambda (obj) (typep obj 'fiveline-staff))
+				       :name-key #'name
+				       :value-key #'identity)))
+	(simple-parse-error () (error 'no-such-staff)))
     (declare (ignore string))
-    (if success
-	staff
-	(error "no such staff name")))) ; FIXME add a gsharp error here. 
+    (if success staff (error 'no-such-staff))))
 
 (defun symbol-name-lowcase (symbol)
   (string-downcase (symbol-name symbol)))
 
 (define-presentation-type staff-type ())
 
+(define-condition no-such-staff-type (gsharp-condition) ()
+  (:report
+   (lambda (condition stream)
+     (declare (ignore condition))
+     (format stream "No such staff type"))))
+
 (define-presentation-method accept
     ((type staff-type) stream (view textual-view) &key)
   (multiple-value-bind (type success string)
-      (complete-input stream
-		      (lambda (so-far mode)
-			(complete-from-possibilities
-			 so-far
-			 '(:fiveline)
-			 '()
-			 :action mode
-			 :predicate (lambda (obj) (declare (ignore obj)) t)
-			 :name-key #'symbol-name-lowcase
-			 :value-key #'identity)))
+      (handler-case (complete-input stream
+				    (lambda (so-far mode)
+				      (complete-from-possibilities
+				       so-far
+				       '(:fiveline)
+				       '()
+				       :action mode
+				       :predicate (lambda (obj) (declare (ignore obj)) t)
+				       :name-key #'symbol-name-lowcase
+				       :value-key #'identity)))
+	(simple-completion-error () (error 'no-such-staff-type)))
     (declare (ignore string))
-    (if success
-	type
-	(error "no such staff type"))))
+    (if success	type (error 'no-such-staff-type))))
 
 (define-presentation-type clef-type ())
 
 (define-presentation-method accept
     ((type clef-type) stream (view textual-view) &key)
   (multiple-value-bind (type success string)
-      (complete-input stream
-		      (lambda (so-far mode)
-			(complete-from-possibilities
-			 so-far
-			 '(:treble :bass :c :percussion)
-			 '()
-			 :action mode
-			 :predicate (lambda (obj) (declare (ignore obj)) t)
-			 :name-key #'symbol-name-lowcase
-			 :value-key #'identity)))
+      (handler-case (complete-input stream
+				    (lambda (so-far mode)
+				      (complete-from-possibilities
+				       so-far
+				       '(:treble :bass :c :percussion)
+				       '()
+				       :action mode
+				       :predicate (lambda (obj) (declare (ignore obj)) t)
+				       :name-key #'symbol-name-lowcase
+				       :value-key #'identity)))
+	(simple-completion-error () (error 'no-such-staff-type)))
     (declare (ignore string))
     (if success
 	type
 	(error "no such staff type"))))
 
+(define-condition staff-name-not-unique (gsharp-condition) ()
+  (:report
+   (lambda (condition stream)
+     (declare (ignore condition))
+     (format stream "Staff name already exists"))))
+
+(defun acquire-unique-staff-name ()
+  (let ((name (accept 'string :prompt "Staff name")))
+    (assert (not (member name (staves (buffer *gsharp-frame*)) :test #'string= :key #'name))
+	    () `staff-name-not-unique)
+    name))
+
 (defun acquire-new-staff ()
-  (let ((name (accept 'string :prompt "Staff name"))
-	(type (accept 'staff-type :prompt "Type")))
-    (ecase type
+  (let ((name (acquire-unique-staff-name)))
+    (ecase (accept 'staff-type :prompt "Type")
       (:fiveline (let ((clef (accept 'clef-type :prompt "Clef"))
 		       (line (accept 'integer :prompt "Line")))
-		   (make-fiveline-staff name (make-clef clef line)))))))	  
+		   (make-fiveline-staff name (make-clef clef line)))))))
 
 (define-gsharp-command (com-add-staff-before :name t) ()
   (add-staff-before-staff (accept 'score-pane:staff :prompt "Before staff")
@@ -1081,13 +1120,14 @@
   (remove-staff-from-buffer (accept 'score-pane:staff :prompt "Staff")
 			    (buffer *gsharp-frame*)))
 
-(define-gsharp-command (com-rename-staff :name t) ((name 'string))
-  (let ((buffer (buffer *gsharp-frame*))
-	(state (input-state *gsharp-frame*)))
-    (rename-staff name (staff state) buffer)))
+(define-gsharp-command (com-rename-staff :name t) ()
+  (let* ((staff (accept 'score-pane:staff :prompt "Staff"))
+	 (name (acquire-unique-staff-name))
+	 (buffer (buffer *gsharp-frame*)))
+    (rename-staff name staff buffer)))
 
-(define-gsharp-command (com-add-layer-staff :name t) ((name 'string))
-  (let ((staff (find-staff name (buffer *gsharp-frame*)))
+(define-gsharp-command (com-add-layer-staff :name t) ()
+  (let ((staff (accept 'score-pane:staff :prompt "Staff"))
 	(layer (layer (slice (bar (cursor *gsharp-frame*))))))
     (add-staff-to-layer staff layer)))
 





More information about the Gsharp-cvs mailing list