Some architecural changes (message-communication).
This commit is contained in:
		
							parent
							
								
									9e9653e404
								
							
						
					
					
						commit
						1e10cf6b1e
					
				| 
						 | 
				
			
			@ -0,0 +1,311 @@
 | 
			
		|||
 | 
			
		||||
;;directory-files
 | 
			
		||||
;;---------------
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define initial-working-directory (cwd))
 | 
			
		||||
 | 
			
		||||
;;Result-Object für "directory-files"
 | 
			
		||||
(define-record-type dirfiles-result-object dirfiles-result-object
 | 
			
		||||
  (make-dirfiles-result-object pos-y
 | 
			
		||||
			       pos-x
 | 
			
		||||
			       file-list
 | 
			
		||||
			       result-text
 | 
			
		||||
			       working-directory
 | 
			
		||||
			       width
 | 
			
		||||
			       initial-wd
 | 
			
		||||
			       marked-items
 | 
			
		||||
			       res-marked-items)
 | 
			
		||||
  dirfiles-result-object?
 | 
			
		||||
  (pos-y dirfiles-result-object-pos-y)
 | 
			
		||||
  (pos-x dirfiles-result-object-pos-x)
 | 
			
		||||
  (file-list dirfiles-result-object-file-list)
 | 
			
		||||
  (result-text dirfiles-result-object-result-text)
 | 
			
		||||
  (working-directory dirfiles-result-object-working-directory)
 | 
			
		||||
  (width dirfiles-result-object-width)
 | 
			
		||||
  (initial-wd dirfiles-result-object-initial-wd)
 | 
			
		||||
  (marked-items dirfiles-result-object-marked-items)
 | 
			
		||||
  (res-marked-items dirfiles-result-object-res-marked-items))
 | 
			
		||||
 | 
			
		||||
;;Darstellung, falls die Eingabe ist: "(directory-files)"
 | 
			
		||||
(define layout-result-dirfiles
 | 
			
		||||
  (lambda (result-str result width)
 | 
			
		||||
    (begin
 | 
			
		||||
      (let ((printed-file-list (print-file-list result))
 | 
			
		||||
	    (directory (cwd))
 | 
			
		||||
	    (heading ""))
 | 
			
		||||
	(begin
 | 
			
		||||
	  (if (<= (string-length directory) (- width 27))
 | 
			
		||||
	      (set! heading (string-append "Directory-Content of " 
 | 
			
		||||
					   directory  " :"))
 | 
			
		||||
	      (let ((dir-string (substring directory 
 | 
			
		||||
					   (- (string-length directory) 
 | 
			
		||||
					      (- width 27))
 | 
			
		||||
					   (string-length directory))))
 | 
			
		||||
	      (set! heading (string-append "Directory-Content of ..."
 | 
			
		||||
					   dir-string))))
 | 
			
		||||
	  (append (list heading) (list " <-")
 | 
			
		||||
		  printed-file-list))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;Eine Datei pro Zeile
 | 
			
		||||
;;Falls es sich um ein Verzeichnis handelt wird "/" hinzugefügt
 | 
			
		||||
(define print-file-list
 | 
			
		||||
  (lambda (file-list)
 | 
			
		||||
    (let loop ((old file-list)
 | 
			
		||||
	       (new '()))
 | 
			
		||||
      (if (equal? '() old)
 | 
			
		||||
	  new
 | 
			
		||||
	  (let ((hd (list-ref old 0))
 | 
			
		||||
		(tl (cdr old)))
 | 
			
		||||
	    (if (file-directory? hd)
 | 
			
		||||
		(let ((new-str (string-append " " hd "/")))
 | 
			
		||||
		  (loop tl (append new (list new-str))))
 | 
			
		||||
		(loop tl (append new (list (string-append " " hd))))))))))
 | 
			
		||||
 | 
			
		||||
;;Auswahl->absteigen
 | 
			
		||||
(define selected-dirfiles
 | 
			
		||||
  (lambda (model)
 | 
			
		||||
    (let ((ln (dirfiles-result-object-pos-y model)))
 | 
			
		||||
      (if (or (>= ln (+ (length (dirfiles-result-object-result-text model)) 1))
 | 
			
		||||
	      (<= ln 1))
 | 
			
		||||
	  model
 | 
			
		||||
	  (if (= ln 2)
 | 
			
		||||
	      (if (not (equal? "/" (cwd)))
 | 
			
		||||
		(begin
 | 
			
		||||
		  (chdir "..")
 | 
			
		||||
		  (let* ((new-result (evaluate "(directory-files)"))
 | 
			
		||||
			 (new-result-string (exp->string new-result))
 | 
			
		||||
			 (width (dirfiles-result-object-width model))
 | 
			
		||||
			 (new-text (layout-result-dirfiles 
 | 
			
		||||
				    new-result-string new-result width))
 | 
			
		||||
			 (new-model (make-dirfiles-result-object
 | 
			
		||||
				     2
 | 
			
		||||
				     1
 | 
			
		||||
				     new-result
 | 
			
		||||
				     new-text
 | 
			
		||||
				     (cwd)
 | 
			
		||||
				     width
 | 
			
		||||
				     (dirfiles-result-object-initial-wd 
 | 
			
		||||
				      model)
 | 
			
		||||
				     (dirfiles-result-object-marked-items
 | 
			
		||||
				      model)
 | 
			
		||||
				     (dirfiles-result-object-res-marked-items
 | 
			
		||||
				      model))))
 | 
			
		||||
		    new-model))
 | 
			
		||||
		model)
 | 
			
		||||
	      (let* ((text (dirfiles-result-object-result-text model))
 | 
			
		||||
		     (ent (list-ref text (- ln 1)))
 | 
			
		||||
		     (len (string-length ent))
 | 
			
		||||
		     (last-char (substring ent (- len 1) len))
 | 
			
		||||
		     (rest (substring ent 1 (- len 1))))
 | 
			
		||||
		(if (equal? last-char "/")
 | 
			
		||||
		    (begin
 | 
			
		||||
		      (chdir rest)
 | 
			
		||||
		      (let* ((new-result (evaluate "(directory-files)"))
 | 
			
		||||
			     (new-result-string (exp->string new-result))
 | 
			
		||||
			     (width (dirfiles-result-object-width model))
 | 
			
		||||
			     (new-text (layout-result-dirfiles 
 | 
			
		||||
				        new-result-string new-result width))
 | 
			
		||||
			     (new-model (make-dirfiles-result-object
 | 
			
		||||
					 2
 | 
			
		||||
					 1
 | 
			
		||||
					 new-result
 | 
			
		||||
					 new-text
 | 
			
		||||
					 (cwd)
 | 
			
		||||
					 width
 | 
			
		||||
					 (dirfiles-result-object-initial-wd
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-marked-items
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-res-marked-items
 | 
			
		||||
					  model))))
 | 
			
		||||
			new-model))
 | 
			
		||||
		    model)))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;;Receiver für directory-files
 | 
			
		||||
(define dir-files-receiver
 | 
			
		||||
  (lambda (message)
 | 
			
		||||
    (cond
 | 
			
		||||
 | 
			
		||||
     ((next-command-message? message)
 | 
			
		||||
      (let* ((command (next-command-string message))
 | 
			
		||||
	     (result (evaluate command))
 | 
			
		||||
	     (result-string (exp->string result))
 | 
			
		||||
	     (width (next-command-message-width message))
 | 
			
		||||
	     (text (layout-result-dirfiles result-string result width))
 | 
			
		||||
	     (model (make-dirfiles-result-object 2 1 result text (cwd) 
 | 
			
		||||
						 width (cwd) '() '())))
 | 
			
		||||
	model))
 | 
			
		||||
 | 
			
		||||
     ((print-message? message)
 | 
			
		||||
      (let* ((model (print-message-object message))
 | 
			
		||||
	     (posy (dirfiles-result-object-pos-y model))
 | 
			
		||||
	     (posx (dirfiles-result-object-pos-x model))
 | 
			
		||||
	     (text (dirfiles-result-object-result-text model))
 | 
			
		||||
	     (marked-pos (get-marked-positions 
 | 
			
		||||
			  (dirfiles-result-object-file-list model)
 | 
			
		||||
			  (dirfiles-result-object-marked-items model))))
 | 
			
		||||
	(make-print-object posy posx text (list posy) marked-pos)))
 | 
			
		||||
 | 
			
		||||
     ((key-pressed-message? message)
 | 
			
		||||
      (let* ((model (key-pressed-message-result-model message))
 | 
			
		||||
	     (key (key-pressed-message-key message)))
 | 
			
		||||
	(cond
 | 
			
		||||
	 
 | 
			
		||||
	 ((= key key-up)
 | 
			
		||||
	  (let ((posy (dirfiles-result-object-pos-y model)))
 | 
			
		||||
	    (if (<= posy 2)
 | 
			
		||||
		model
 | 
			
		||||
		(let* ((new-posy (- posy 1))
 | 
			
		||||
		       (new-model (make-dirfiles-result-object 
 | 
			
		||||
				   new-posy
 | 
			
		||||
				   (dirfiles-result-object-pos-x model)
 | 
			
		||||
				   (dirfiles-result-object-file-list model)
 | 
			
		||||
				   (dirfiles-result-object-result-text 
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-working-directory
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-width model)
 | 
			
		||||
				   (dirfiles-result-object-initial-wd model)
 | 
			
		||||
				   (dirfiles-result-object-marked-items 
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-res-marked-items
 | 
			
		||||
				      model))))
 | 
			
		||||
		  new-model))))
 | 
			
		||||
 | 
			
		||||
	 ((= key key-down)
 | 
			
		||||
	  (let ((posy (dirfiles-result-object-pos-y model))
 | 
			
		||||
		(num-lines (length 
 | 
			
		||||
			    (dirfiles-result-object-result-text model))))
 | 
			
		||||
	    (if (>= posy num-lines)
 | 
			
		||||
		model
 | 
			
		||||
		(let* ((new-posy (+ posy 1))
 | 
			
		||||
		       (new-model (make-dirfiles-result-object 
 | 
			
		||||
				   new-posy
 | 
			
		||||
				   (dirfiles-result-object-pos-x model)
 | 
			
		||||
				   (dirfiles-result-object-file-list model)
 | 
			
		||||
				   (dirfiles-result-object-result-text 
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-working-directory
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-width model)
 | 
			
		||||
				   (dirfiles-result-object-initial-wd
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-marked-items
 | 
			
		||||
				    model)
 | 
			
		||||
				   (dirfiles-result-object-res-marked-items
 | 
			
		||||
				      model))))
 | 
			
		||||
		  new-model))))
 | 
			
		||||
 | 
			
		||||
	 ((= key 10)
 | 
			
		||||
	  (selected-dirfiles model))
 | 
			
		||||
 | 
			
		||||
	 ;;Ctrl+s -> Auswahl
 | 
			
		||||
	 ((= key 19)
 | 
			
		||||
	  (let* ((marked-items (dirfiles-result-object-marked-items model))
 | 
			
		||||
		 (res-marked-items (dirfiles-result-object-res-marked-items
 | 
			
		||||
				    model))
 | 
			
		||||
		 (actual-pos (dirfiles-result-object-pos-y model))
 | 
			
		||||
		 (all-items (dirfiles-result-object-file-list model)))
 | 
			
		||||
	    (if (<= actual-pos 2)
 | 
			
		||||
		model
 | 
			
		||||
		(let* ((actual-item (list-ref all-items (- actual-pos 3)))
 | 
			
		||||
		       (actual-res-item (string-append (cwd) "/" actual-item)))
 | 
			
		||||
		  (if (member actual-res-item marked-items)
 | 
			
		||||
		      model
 | 
			
		||||
		      (let* ((new-res-marked-items (append res-marked-items
 | 
			
		||||
							   (list 
 | 
			
		||||
							    actual-res-item)))
 | 
			
		||||
			     (new-marked-items (append marked-items
 | 
			
		||||
						       (list actual-item)))
 | 
			
		||||
			     (new-model (make-dirfiles-result-object
 | 
			
		||||
					 (dirfiles-result-object-pos-y model)
 | 
			
		||||
					 (dirfiles-result-object-pos-x model)
 | 
			
		||||
					 (dirfiles-result-object-file-list 
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-result-text 
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-working-directory
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-width model)
 | 
			
		||||
					 (dirfiles-result-object-initial-wd
 | 
			
		||||
					  model)
 | 
			
		||||
					 new-marked-items
 | 
			
		||||
					 new-res-marked-items)))
 | 
			
		||||
			new-model))))))
 | 
			
		||||
	 
 | 
			
		||||
	 ;;Ctrl+u -> aus Auswahl rausnehmen
 | 
			
		||||
	 ((= key 21)
 | 
			
		||||
	  (let* ((marked-items (dirfiles-result-object-marked-items model))
 | 
			
		||||
		 (res-marked-items (dirfiles-result-object-res-marked-items
 | 
			
		||||
				    model))
 | 
			
		||||
		 (actual-pos (dirfiles-result-object-pos-y model))
 | 
			
		||||
		 (all-items (dirfiles-result-object-file-list model)))
 | 
			
		||||
	    (if (<= actual-pos 2)
 | 
			
		||||
		model
 | 
			
		||||
		(let* ((actual-item (list-ref all-items (- actual-pos 3)))
 | 
			
		||||
		       (actual-res-item (string-append (cwd) "/" actual-item))
 | 
			
		||||
		       (rest (member actual-item marked-items))
 | 
			
		||||
		       (res-rest (member actual-res-item res-marked-items)))
 | 
			
		||||
		  (if (not res-rest)
 | 
			
		||||
		      model
 | 
			
		||||
		      (let* ((after-item (length rest))
 | 
			
		||||
			     (all-items (length marked-items))
 | 
			
		||||
			     (before-item (sublist marked-items
 | 
			
		||||
						   0 
 | 
			
		||||
						   (- all-items
 | 
			
		||||
						      after-item )))
 | 
			
		||||
			     (new-marked-items (append before-item
 | 
			
		||||
						  (list-tail rest 1)))
 | 
			
		||||
			     (after-res-item (length res-rest))
 | 
			
		||||
			     (all-res-items (length res-marked-items))
 | 
			
		||||
			     (before-res-item (sublist res-marked-items
 | 
			
		||||
						       0
 | 
			
		||||
						       (- all-res-items 
 | 
			
		||||
							  after-res-item)))
 | 
			
		||||
			     (new-res-marked-items (append before-res-item
 | 
			
		||||
							   (list-tail res-rest
 | 
			
		||||
								      1)))
 | 
			
		||||
			     (new-model (make-dirfiles-result-object
 | 
			
		||||
					 (dirfiles-result-object-pos-y model)
 | 
			
		||||
					 (dirfiles-result-object-pos-x model)
 | 
			
		||||
					 (dirfiles-result-object-file-list 
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-result-text 
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-working-directory
 | 
			
		||||
					  model)
 | 
			
		||||
					 (dirfiles-result-object-width model)
 | 
			
		||||
					 (dirfiles-result-object-initial-wd
 | 
			
		||||
					  model)
 | 
			
		||||
					 new-marked-items
 | 
			
		||||
					 new-res-marked-items)))
 | 
			
		||||
			new-model))))))
 | 
			
		||||
			
 | 
			
		||||
		      
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	 (else model))))
 | 
			
		||||
     
 | 
			
		||||
     ((restore-message? message)
 | 
			
		||||
      ;(let ((model (restore-message-object message)))
 | 
			
		||||
	;(chdir (dirfiles-result-object-initial-wd model))))
 | 
			
		||||
      (chdir initial-working-directory))
 | 
			
		||||
 | 
			
		||||
     ((selection-message? message)
 | 
			
		||||
      (let* ((model (selection-message-object message))
 | 
			
		||||
	     (marked-items (dirfiles-result-object-res-marked-items model)))
 | 
			
		||||
	(string-append "'" (exp->string marked-items))))
 | 
			
		||||
		  
 | 
			
		||||
				   
 | 
			
		||||
      
 | 
			
		||||
     (else   values))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define dir-files-rec
 | 
			
		||||
  (make-receiver "(directory-files)"  dir-files-receiver))
 | 
			
		||||
	   
 | 
			
		||||
(define receivers (cons dir-files-rec '()))
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -9,6 +9,8 @@
 | 
			
		|||
	signals 
 | 
			
		||||
	handle
 | 
			
		||||
	ncurses
 | 
			
		||||
	srfi-6)
 | 
			
		||||
	srfi-6
 | 
			
		||||
	rt-modules)
 | 
			
		||||
  (files nuit-engine
 | 
			
		||||
	 handle-fatal-error))
 | 
			
		||||
	 handle-fatal-error
 | 
			
		||||
	 directory-files))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue