X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/21f6214a2c77cbdca88a2e3d5e03bc5afb659ef2..bdc1babff5b7fdc80ddaa9baf1b51be64869ad1b:/examples/testgtk.lisp diff --git a/examples/testgtk.lisp b/examples/testgtk.lisp index 0ce2632..aa85e49 100644 --- a/examples/testgtk.lisp +++ b/examples/testgtk.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: testgtk.lisp,v 1.6 2004-11-15 19:33:21 espen Exp $ +;; $Id: testgtk.lisp,v 1.10 2004-12-05 13:57:10 espen Exp $ ;;; Some of the code in this file are really outdatet, but it is @@ -55,8 +55,8 @@ (defmacro define-simple-dialog (name (dialog title &rest initargs) &body body) `(define-dialog ,name (,dialog ,title 'dialog ,@initargs) - (dialog-add-button ,dialog "Close" #'widget-destroy :object t) - ,@body)) + ,@body + (dialog-add-button ,dialog "gtk-close" #'widget-destroy :object t))) @@ -184,9 +184,9 @@ :child (make-instance class :border-width 5 :layout-style layout :spacing spacing ; :child-min-width width :child-min-height height - :child (make-instance 'button :label "OK") - :child (make-instance 'button :label "Cancel") - :child (make-instance 'button :label "Help")))) + :child (make-instance 'button :label "gtk-ok" :use-stock t) + :child (make-instance 'button :label "gtk-cancel" :use-stock t) + :child (make-instance 'button :label "gtk-help" :use-stock t)))) (define-toplevel create-button-box (window "Button Boxes") (make-instance 'v-box @@ -459,6 +459,16 @@ (widget-show-all main))) +;; Expander + +(define-simple-dialog create-expander (dialog "Expander" :resizable nil) + (make-instance 'v-box + :parent dialog :spacing 5 :border-width 5 :show-all t + :child (create-label "Expander demo. Click on the triangle for details.") + :child (make-instance 'expander + :label "Details" + :child (create-label "Details can be shown or hidden.")))) + ;; File chooser dialog @@ -714,39 +724,94 @@ This one is underlined (こんにちは) in quite a funky fashion" ;;; List (define-simple-dialog create-list (dialog "List" :default-height 400) - (let ((store (make-instance 'list-store - :column-types '(string int boolean) - :column-names '(:foo :bar :baz) - :initial-content '(#("First" 12321 nil) - (:foo "Yeah" :baz t))))) + (let* ((store (make-instance 'list-store + :column-types '(string int boolean) + :column-names '(:foo :bar :baz) + :initial-content '(#("First" 12321 nil) + (:foo "Yeah" :baz t)))) + (tree (make-instance 'tree-view :model store))) (loop with iter = (make-instance 'tree-iter) for i from 1 to 1000 do (list-store-append store (vector "Test" i (zerop (mod i 3))) iter)) + + (let ((column (make-instance 'tree-view-column :title "Column 1")) + (cell (make-instance 'cell-renderer-text))) + (cell-layout-pack column cell :expand t) + (cell-layout-add-attribute column cell 'text (column-index store :foo)) + (tree-view-append-column tree column)) + + (let ((column (make-instance 'tree-view-column :title "Column 2")) + (cell (make-instance 'cell-renderer-text :background "orange"))) + (cell-layout-pack column cell :expand t) + (cell-layout-add-attribute column cell 'text (column-index store :bar)) + (tree-view-append-column tree column)) + + (let ((column (make-instance 'tree-view-column :title "Column 3")) + (cell (make-instance 'cell-renderer-text))) + (cell-layout-pack column cell :expand t) + (cell-layout-add-attribute column cell 'text (column-index store :baz)) + (tree-view-append-column tree column)) - (let ((tree (make-instance 'tree-view :model store))) - (let ((column (make-instance 'tree-view-column :title "Column 1")) - (cell (make-instance 'cell-renderer-text))) - (cell-layout-pack column cell) - (cell-layout-add-attribute column cell 'text (column-index store :foo)) - (tree-view-append-column tree column)) - - (let ((column (make-instance 'tree-view-column :title "Column 2")) - (cell (make-instance 'cell-renderer-text :background "orange"))) - (cell-layout-pack column cell) - (cell-layout-add-attribute column cell 'text (column-index store :bar)) - (tree-view-append-column tree column)) - - (let ((column (make-instance 'tree-view-column :title "Column 3")) - (cell (make-instance 'cell-renderer-text))) - (cell-layout-pack column cell) - (cell-layout-add-attribute column cell 'text (column-index store :baz)) - (tree-view-append-column tree column)) - - (make-instance 'scrolled-window - :parent dialog :child tree :show-all t :border-width 10 - :hscrollbar-policy :automatic)))) + (make-instance 'v-box + :parent dialog :border-width 10 :spacing 10 :show-all t + :child (list + (make-instance 'h-box + :spacing 10 + :child (make-instance 'button + :label "Remove Selection" + :signal (list 'clicked + #'(lambda () + (let ((references + (mapcar + #'(lambda (path) + (make-instance 'tree-row-reference :model store :path path)) + (tree-selection-get-selected-rows + (tree-view-selection tree))))) + (mapc + #'(lambda (reference) + (list-store-remove store reference)) + references)))))) + :expand nil) + :child (list + (make-instance 'h-box + :spacing 10 + :child (make-instance 'check-button + :label "Show Headers" :active t + :signal (list 'toggled + #'(lambda (button) + (setf + (tree-view-headers-visible-p tree) + (toggle-button-active-p button))) + :object t)) + :child (make-instance 'check-button + :label "Reorderable" :active nil + :signal (list 'toggled + #'(lambda (button) + (setf + (tree-view-reorderable-p tree) + (toggle-button-active-p button))) + :object t)) + :child (list + (make-instance 'h-box + :child (make-instance 'label :label "Selection Mode: ") + :child (make-instance 'combo-box + :content '("Single" "Browse" "Multiple") + :active 0 + :signal (list 'changed + #'(lambda (combo-box) + (setf + (tree-selection-mode + (tree-view-selection tree)) + (svref + #(:single :browse :multiple) + (combo-box-active combo-box)))) + :object t))) + :expand nil)) + :expand nil) + :child (make-instance 'scrolled-window + :child tree :hscrollbar-policy :automatic)))) ;; Menus @@ -1370,96 +1435,79 @@ This one is underlined (こんにちは) in quite a funky fashion" ;;; Idle test -;; (define-standard-dialog create-idle-test "Idle Test" -;; (let* ((container (make-instance 'hbox :parent main-box)) -;; (label (make-instance 'label -;; :label "count: 0" :xpad 10 :ypad 10 :parent container)) -;; (idle nil) -;; (count 0)) -;; (declare (fixnum count)) -;; (signal-connect -;; window 'destroy #'(lambda () (when idle (idle-remove idle)))) +(define-simple-dialog create-idle-test (dialog "Idle Test") + (let ((label (make-instance 'label + :label "count: 0" :xpad 10 :ypad 10)) + (idle nil) + (count 0)) + (signal-connect dialog 'destroy + #'(lambda () (when idle (idle-remove idle)))) -;; (make-instance 'frame -;; :label "Label Container" :border-width 5 :parent main-box -;; :child -;; (make-instance 'v-box -;; :children -;; (create-radio-button-group -;; '(("Resize-Parent" :parent) -;; ("Resize-Queue" :queue) -;; ("Resize-Immediate" :immediate)) -;; 0 -;; '(setf container-resize-mode) container))) - -;; (make-instance 'button -;; :label "start" :can-default t :parent action-area -;; :signals -;; (list -;; (list -;; 'clicked -;; #'(lambda () -;; (unless idle -;; (setq -;; idle -;; (idle-add -;; #'(lambda () -;; (incf count) -;; (setf (label-label label) (format nil "count: ~D" count)) -;; t)))))))) + (make-instance 'v-box + :parent dialog :border-width 10 :spacing 10 :show-all t + :child label + :child (make-instance 'frame + :label "Label Container" :border-width 5 + :child(make-instance 'v-box + :children (create-radio-button-group + '(("Resize-Parent" :parent) + ("Resize-Queue" :queue) + ("Resize-Immediate" :immediate)) + 0 + #'(lambda (mode) + (setf + (container-resize-mode (dialog-action-area dialog)) mode)))))) + + (dialog-add-button dialog "Start" + #'(lambda () + (unless idle + (setq idle + (idle-add + #'(lambda () + (incf count) + (setf (label-label label) (format nil "count: ~D" count)) + t)))))) -;; (make-instance 'button -;; :label "stop" :can-default t :parent action-area -;; :signals -;; (list -;; (list -;; 'clicked -;; #'(lambda () -;; (when idle -;; (idle-remove idle) -;; (setq idle nil)))))))) + (dialog-add-button dialog "Stop" + #'(lambda () + (when idle + (idle-remove idle) + (setq idle nil)))))) ;;; Timeout test -;; (define-standard-dialog create-timeout-test "Timeout Test" -;; (let ((label (make-instance 'label -;; :label "count: 0" :xpad 10 :ypad 10 :parent main-box)) -;; (timer nil) -;; (count 0)) -;; (declare (fixnum count)) -;; (signal-connect -;; window 'destroy #'(lambda () (when timer (timeout-remove timer)))) - -;; (make-instance 'button -;; :label "start" :can-default t :parent action-area -;; :signals -;; (list -;; (list -;; 'clicked -;; #'(lambda () -;; (unless timer -;; (setq -;; timer -;; (timeout-add -;; 100 -;; #'(lambda () -;; (incf count) -;; (setf (label-label label) (format nil "count: ~D" count)) -;; t)))))))) - -;; (make-instance 'button -;; :label "stop" :can-default t :parent action-area -;; :signals -;; (list -;; (list -;; 'clicked -;; #'(lambda () -;; (when timer -;; (timeout-remove timer) -;; (setq timer nil)))))))) - +(define-simple-dialog create-timeout-test (dialog "Timeout Test") + (let ((label (make-instance 'label + :label "count: 0" :xpad 10 :ypad 10 :parent dialog :visible t)) + (timer nil) + (count 0)) + (signal-connect dialog 'destroy + #'(lambda () (when timer (timeout-remove timer)))) + + (dialog-add-button dialog "Start" + #'(lambda () + (unless timer + (setq timer + (timeout-add 100 + #'(lambda () + (incf count) + (setf (label-label label) (format nil "count: ~D" count)) + t)))))) + + (dialog-add-button dialog "Stop" + #'(lambda () + (when timer + (timeout-remove timer) + (setq timer nil)))))) + + +;;; Text + +(define-simple-dialog create-text (dialog "Text" :default-width 400 + :default-height 400) + (make-instance 'text-view :border-width 10 :parent dialog :visible t)) ;;; Toggle buttons @@ -1584,66 +1632,96 @@ This one is underlined (こんにちは) in quite a funky fashion" ;;; Tooltips test -;; (define-standard-dialog create-tooltips "Tooltips" -;; (setf -;; (window-allow-grow-p window) t -;; (window-allow-shrink-p window) nil -;; (window-auto-shrink-p window) t -;; (widget-width window) 200 -;; (container-border-width main-box) 10 -;; (box-spacing main-box) 10) - -;; (let ((tooltips (tooltips-new))) -;; (flet ((create-button (label tip-text tip-private) -;; (let ((button (make-instance 'toggle-button -;; :label label :parent main-box))) -;; (tooltips-set-tip tooltips button tip-text tip-private) -;; button))) -;; (create-button "button1" "This is button 1" "ContextHelp/button/1") -;; (create-button "button2" "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly." "ContextHelp/button/2") - -;; (let* ((toggle (create-button "Override TipSQuery Label" -;; "Toggle TipsQuery view" "Hi msw! ;)")) -;; (box (make-instance 'v-box -;; :homogeneous nil :spacing 5 :border-width 5 -;; :parent (make-instance 'frame -;; :label "ToolTips Inspector" -;; :label-xalign 0.5 :border-width 0 -;; :parent main-box))) -;; (button (make-instance 'button :label "[?]" :parent box)) -;; (tips-query (make-instance 'tips-query -;; :caller button :parent box))) - -;; (signal-connect -;; button 'clicked #'tips-query-start-query :object tips-query) - -;; (signal-connect -;; tips-query 'widget-entered -;; #'(lambda (widget tip-text tip-private) -;; (declare (ignore widget tip-private)) -;; (when (toggle-button-active-p toggle) -;; (setf -;; (label-label tips-query) -;; (if tip-text -;; "There is a Tip!" -;; "There is no Tip!")) -;; (signal-emit-stop tips-query 'widget-entered)))) - -;; (signal-connect -;; tips-query 'widget-selected -;; #'(lambda (widget tip-text tip-private event) -;; (declare (ignore tip-text event)) -;; (when widget -;; (format -;; t "Help ~S requested for ~S~%" -;; (or tip-private "None") (type-of widget))) -;; t)) +(define-simple-dialog create-tooltips (dialog "Tooltips" :default-width 200) + (let ((tooltips (make-instance 'tooltips))) + (flet ((create-button (label tip-text tip-private) + (let ((button (make-instance 'toggle-button :label label))) + (tooltips-set-tip tooltips button tip-text tip-private) + button))) + (make-instance 'v-box + :parent dialog :border-width 10 :spacing 10 :show-all t + :child (create-button "button1" "This is button 1" "ContextHelp/button/1") + :child (create-button "button2" "This is button 2. This is also a really long tooltip which probably won't fit on a single line and will therefore need to be wrapped. Hopefully the wrapping will work correctly." "ContextHelp/button/2"))) + + (let ((close-button (first (container-children (dialog-action-area dialog))))) + (tooltips-set-tip tooltips close-button "Push this button to close window" + "ContextHelp/buttons/Close")))) + + +;;; UI Manager + +(defvar *ui-description* + '((:menubar "MenuBar" + (:menu "FileMenu" + (:menuitem "New") + (:menuitem "Open") + (:menuitem "Save") + (:menuitem "SaveAs") + :separator + (:menuitem "Quit")) + (:menu "PreferencesMenu" + (:menu "ColorMenu" + (:menuitem "Red") + (:menuitem "Green") + (:menuitem "Blue")) + (:menu "ShapeMenu" + (:menuitem "Square") + (:menuitem "Rectangle") + (:menuitem "Oval")) + (:menuitem "Bold")) + (:menu "HelpMenu" + (:menuitem "About"))) + (:toolbar "ToolBar" + (:toolitem "Open") + (:toolitem "Quit") + (:separator "Sep1") + (:toolitem "Logo")))) + +(define-simple-dialog create-ui-manager (dialog "UI Manager") + (let ((actions + (make-instance 'action-group + :name "Actions" + :action (create-action "FileMenu" nil "_File") + :action (create-action "PreferencesMenu" nil "_Preferences") + :action (create-action "ColorMenu" nil "_Color") + :action (create-action "ShapeMenu" nil "_Shape") + :action (create-action "HelpMenu" nil "_Help") + :action (create-action "New" "gtk-new" "_New" "N" "Create a new file") + :action (create-action "Open" "gtk-open" "_Open" "O" "Open a file") + :action (create-action "Save" "gtk-save" "_Save" "S" "Save current file") + :action (create-action "SaveAs" "gtk-save" "Save _As..." "" "Save to a file") + :action (create-action "Quit" "gtk-quit" "_Quit" "Q" "Quit") + :action (create-action "About" nil "_About" "A" "About") + :action (create-action "Logo" "demo-gtk-logo" "" nil "GTK+") + :action (create-toggle-action "Bold" "gtk-bold" "_Bold" "B" "Bold" t) + :actions (create-radio-actions + '(("Red" nil "_Red" "R" "Blood") + ("Green" nil "_Green" "G" "Grass") + ("Blue" nil "_Blue" "B" "Sky")) + "Green") + :actions (create-radio-actions + '(("Square" nil "_Square" "S" "Square") + ("Rectangle" nil "_Rectangle" "R" "Rectangle") + ("Oval" nil "_Oval" "O" "Egg"))))) + (ui (make-instance 'ui-manager))) + + (ui-manager-insert-action-group ui actions) + (ui-manager-add-ui ui *ui-description*) -;; (tooltips-set-tip -;; tooltips button "Start the Tooltip Inspector" "ContextHelp/buttons/?") -;; (tooltips-set-tip -;; tooltips close-button "Push this button to close window" -;; "ContextHelp/buttons/Close"))))) + (window-add-accel-group dialog (ui-manager-accel-group ui)) + + (make-instance 'v-box + :parent dialog :show-all t + :child (list + (ui-manager-get-widget ui "/MenuBar") + :expand nil :fill nil) + :child (list + (ui-manager-get-widget ui "/ToolBar") + :expand nil :fill nil) + :child (make-instance 'label + :label "Type to start" + :xalign 0.5 :yalign 0.5 + :width-request 200 :height-request 200)))) @@ -1664,6 +1742,7 @@ This one is underlined (こんにちは) in quite a funky fashion" ;; ; ("dnd") ("entry" create-entry) ;; ("event watcher") + ("enxpander" create-expander) ("file chooser" create-file-chooser) ;; ("font selection") ;; ("handle box" create-handle-box) @@ -1687,16 +1766,17 @@ This one is underlined (こんにちは) in quite a funky fashion" ;; ("shapes" create-shapes) ("spinbutton" create-spins) ("statusbar" create-statusbar) -;; ("test idle" create-idle-test) + ("test idle" create-idle-test) ;; ("test mainloop") ;; ("test scrolling") ;; ("test selection") -;; ("test timeout" create-timeout-test) -;; ("text" #|create-text|#) + ("test timeout" create-timeout-test) + ("text" create-text) ("toggle buttons" create-toggle-buttons) ("toolbar" create-toolbar) -;; ("tooltips" create-tooltips) + ("tooltips" create-tooltips) ;; ("tree" #|create-tree|#) + ("UI manager" create-ui-manager) )) (main-window (make-instance 'window :title "testgtk.lisp" :name "main_window"