76 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Common Lisp
		
	
	
	
	
	
(ql:quickload "cl-cffi-gtk")
 | 
						|
 | 
						|
(defpackage :my-gtk-app
 | 
						|
  (:use :gtk :gdk :gdk-pixbuf :gobject
 | 
						|
   :glib :gio :pango :cairo :common-lisp))
 | 
						|
 | 
						|
(in-package :my-gtk-app)
 | 
						|
 | 
						|
(defun make-todo-item (task complete incomplete)
 | 
						|
  (let ((row (make-instance 'gtk-list-box-row :selectable nil))
 | 
						|
	(box (gtk-box-new :horizontal 6))
 | 
						|
	(checkmark (gtk-check-button-new))
 | 
						|
	(label (gtk-label-new task)))
 | 
						|
    (g-signal-connect checkmark "toggled"
 | 
						|
		      (lambda (w)
 | 
						|
			(if (gtk-toggle-button-active w)
 | 
						|
			    (gtk-widget-reparent row complete)
 | 
						|
			    (gtk-widget-reparent row incomplete))))
 | 
						|
    (gtk-container-add box checkmark)
 | 
						|
    (gtk-container-add box label)
 | 
						|
    (gtk-container-add row box)
 | 
						|
    (gtk-widget-show-all row)
 | 
						|
    row))
 | 
						|
 | 
						|
 | 
						|
 | 
						|
(defun my-app ()
 | 
						|
  (within-main-loop
 | 
						|
    (let ((win (make-instance 'gtk-window
 | 
						|
			      :type :toplevel
 | 
						|
			      :border-width 6
 | 
						|
			      :default-width 200
 | 
						|
			      :default-height 600
 | 
						|
			      )))
 | 
						|
      (g-signal-connect win "destroy" (lambda (widget) widget (leave-gtk-main)))
 | 
						|
      (let ((box (make-instance 'gtk-box :orientation :vertical :spacing 6
 | 
						|
				:homogeneous nil))
 | 
						|
	    (todo-box (make-instance 'gtk-box :orientation :vertical :spacing 6
 | 
						|
					      :homogeneous nil))
 | 
						|
	    (completed-frame (make-instance 'gtk-frame :label "Completed"
 | 
						|
						       :shadow-type :etched-in))
 | 
						|
	    (completed (gtk-list-box-new))
 | 
						|
	    (todo-frame (make-instance 'gtk-frame :label "Todo"
 | 
						|
						  :shadow-type :etched-in))
 | 
						|
	    (todo (gtk-list-box-new))
 | 
						|
	    (add-button (gtk-button-new-with-label "Add"))
 | 
						|
	    (entry (gtk-entry-new)))
 | 
						|
	(g-signal-connect add-button "clicked"
 | 
						|
			  (lambda (widget)
 | 
						|
			    (declare (ignore widget))
 | 
						|
			    (gtk-container-add todo
 | 
						|
					       (make-todo-item
 | 
						|
						(gtk-entry-text entry)
 | 
						|
						completed
 | 
						|
						todo))
 | 
						|
			    (setf (gtk-entry-text entry) "")))
 | 
						|
	(g-signal-connect entry "activate"
 | 
						|
			  (lambda (widget)
 | 
						|
			    (gtk-container-add todo
 | 
						|
					       (make-todo-item
 | 
						|
						(gtk-entry-text widget)
 | 
						|
						completed todo))
 | 
						|
			    (setf (gtk-entry-text widget) "")))
 | 
						|
	(gtk-container-add completed-frame completed)
 | 
						|
	(gtk-box-pack-start todo-box todo :expand t :fill t)
 | 
						|
	(gtk-box-pack-start todo-box entry :expand nil :fill nil)
 | 
						|
	(gtk-box-pack-start todo-box add-button :expand nil :fill nil)
 | 
						|
 | 
						|
	(gtk-container-add todo-frame todo-box)
 | 
						|
	(gtk-box-pack-start box completed-frame :expand nil :fill nil)
 | 
						|
	(gtk-box-pack-start box todo-frame :expand t :fill t)
 | 
						|
	(gtk-container-add win box)
 | 
						|
	)
 | 
						|
      (gtk-widget-show-all win))))
 | 
						|
(my-app)
 |