[plt-scheme] Make a grid / table control in GUI
How would you implement that?
Another iteration
#lang scheme/gui
(define grid-pasteboard%
(class pasteboard%
(init-field w h)
(define/override (insert snip r c) (super insert snip (* c w) (* r h)))
(super-new)))
;; accepts data-grid (list of columns)
(define data-grid-pasteboard%
(class pasteboard%
(init-field data-grid
(col-widths '(75 55 65))
(row-height 16)
)
;; create new list that is the cumulative sum of the source list
(define (cumulative-sums offsets)
(foldl (lambda (offset cum-list)
(append cum-list (list (+ offset (last cum-list)))))
(list 0) ; start from 0
offsets))
;; column widths -> col offsets
(define (column-offsets col-widths)
(cumulative-sums (drop-right col-widths 1)))
;;
(define col-offset
(let ((offsets (column-offsets col-widths)))
(lambda (col) (list-ref offsets col))))
;; rows are all the same height
(define (row-offset row)
(* row row-height))
;; initialise pasteboard
(define/override (insert snip row col)
(super insert snip (col-offset col) (row-offset row)))
(define (grid-ref datagrid row col)
(list-ref (list-ref datagrid col) row)
)
(super-new)
(for ([col (in-range (length data-grid))])
(for ([row (in-range (length (car data-grid)))])
(insert (make-object string-snip% (grid-ref data-grid row col))
row col)
))
))
(define f (new frame% [label "Simple Edit"]
[width 200]
[height 200]))
(define c (new editor-canvas% [parent f]))
(define t (new grid-pasteboard% (w 66) (h 16)))
(send t insert (make-object string-snip% "at23") 2 3)
(send t insert (make-object string-snip% "at23") 2 2)
(send t insert (make-object string-snip% "at23") 3 2)
(send t insert (make-object string-snip% "at23") 1 1)
(send t insert (make-object string-snip% "at23") 0 0)
(send c set-editor t)
(send f show #t)
;;
(define f2 (new frame% [label "Simple Edit"]
[width 200]
[height 200]))
(define c2 (new editor-canvas% [parent f2]))
(define t2 (new data-grid-pasteboard%
(data-grid
'(("name" "Stephen" "Patrick")
("age" "39" "38")
("eye-colour" "green" "blue")
))))
(send c2 set-editor t2)
(send f2 show #t)
On Tue, Sep 8, 2009 at 2:01 PM, praimon <praimon at gmail.com> wrote:
> Hi,
> Thanks for your work. It seems we have this conversation every year or two.
> One of the most important features of the directory-table widget is the
> ability
> to manually resize the columns. Otherwise, either some of the data will be
> hidden/lost or the table needs to be too large (so as to accomodate
> any conceivable
> data entry).
> regards,
> praimon
>
> On Tue, Sep 8, 2009 at 2:15 AM, Stephen De
> Gabrielle<spdegabrielle at gmail.com> wrote:
> > Hi, people have asked about a data grid on this list a few times.
> >
> > This is the simplest possible approach. I've tried and abandoned other
> > approaches when I realised they were too much work for my available free
> > time.
> >
> > Comments appreciated.
> >
>
--
--
Stephen De Gabrielle
stephen.degabrielle at acm.org
Telephone +44 (0)20 85670911
Mobile +44 (0)79 85189045
http://www.degabrielle.name/stephen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090908/29708d36/attachment.html>