File: list.scm

package info (click to toggle)
gauche-gtk 0.6%2Bgit20160927-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,452 kB
  • sloc: ansic: 7,097; lisp: 5,659; sh: 2,829; makefile: 338
file content (102 lines) | stat: -rw-r--r-- 3,881 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
;;
;; Simple example, ported from the one in Gtk+2.0 tutorial.
;;
;; $Id: list.scm,v 1.2 2007/01/13 01:36:30 maruska Exp $

(use gtk)

(define-constant *list-item-data-key* "list-item-data")

(define (main args)
  (gtk-init args)
  (let1 window (gtk-window-new GTK_WINDOW_TOPLEVEL)
    (gtk-window-set-title window "GtkList Example")
    (g-signal-connect window "destroy" (lambda _ (gtk-main-quit)))

    (let1 vbox (gtk-vbox-new #f 5)
      (gtk-container-set-border-width vbox 5)
      (gtk-container-add window vbox)
      (gtk-widget-show vbox)

      (let1 scrolled-window (gtk-scrolled-window-new #f #f)
        (gtk-widget-set-size-request scrolled-window 250 150)
        (gtk-container-add vbox scrolled-window)
        (gtk-widget-show scrolled-window)

        (let1 gtklist (gtk-list-new)
          (gtk-scrolled-window-add-with-viewport scrolled-window gtklist)
          (gtk-widget-show gtklist)
          (g-signal-connect gtklist "selection_changed"
                            sigh-print-selection)
          
          (let1 frame (gtk-frame-new "Prison")
            (gtk-widget-set-size-request frame 200 50)
            (gtk-container-set-border-width frame 5)
            (gtk-frame-set-shadow-type frame GTK_SHADOW_OUT)
            (gtk-container-add vbox frame)
            (gtk-widget-show frame)

            (g-signal-connect gtklist "button_release_event"
                              (lambda (w e)
                                (sigh-button-event w e frame))))

          (let1 separator (gtk-hseparator-new)
            (gtk-container-add vbox separator)
            (gtk-widget-show separator))

          (let1 button (gtk-button-new-with-label "Close")
            (gtk-container-add vbox button)
            (gtk-widget-show button)
            (g-signal-connect button "clicked"
                              (lambda _ (gtk-widget-destroy window))))

          ;; list items
          (dotimes (i 5)
            (let ((label (gtk-label-new #`"ListItemContainer with Label #,i"))
                  (list-item (gtk-list-item-new)))
              (gtk-container-add list-item label)
              (gtk-widget-show label)
              (gtk-container-add gtklist list-item)
              (gtk-widget-show list-item)
              (g-object-set-data list-item *list-item-data-key*
                                 (gtk-label-get-text label))))
          ;; more list items, using gtk-list-append-items
          (let ((items '()))
            (dotimes (i 10)
              (let1 list-item (gtk-list-item-new-with-label
                               #`"List Item with Label ,i")
                (push! items list-item)
                (gtk-widget-show list-item)
                (g-object-set-data list-item *list-item-data-key*
                                   "ListItem with integrated Label")))
            (gtk-list-append-items gtklist items))
          )
        )
      )
    (gtk-widget-show-all window)
    )
  (gtk-main)
  0)

(define (sigh-button-event gtklist event frame)
  (when (and (eqv? (slot-ref event 'type) GDK_BUTTON_RELEASE)
             (eqv? (slot-ref event 'button) 3))
    (let* ((selection (slot-ref gtklist 'selection))
           (new-prisoner (if (null? selection) #f (car selection))))
      (for-each (lambda (w)
                  (when (is-a? w <gtk-list-item>)
                    (gtk-widget-reparent w gtklist)))
                (gtk-container-get-children frame))
      (when new-prisoner
        (gtk-list-unselect-child gtklist new-prisoner)
        (gtk-widget-reparent new-prisoner frame))))
  #f)

(define (sigh-print-selection gtklist)
  (let1 selection (slot-ref gtklist 'selection)
    (if (null? selection)
        (print "Selection cleared")
        (format #t "The selection is a ~s\n"
                (map (cut g-object-get-data <> *list-item-data-key*)
                     selection))))
  #f)