52 lines
1.8 KiB
Racket
52 lines
1.8 KiB
Racket
#lang racket
|
|
|
|
(require racket/gui)
|
|
(require (prefix-in str: srfi/13))
|
|
|
|
(provide ellipsis-msg%)
|
|
|
|
(define ellipsis-msg%
|
|
(class message%
|
|
(super-new)
|
|
|
|
(init-field [font normal-control-font] [ellipsis 'right])
|
|
|
|
(define my_label "")
|
|
(define ellipsis_label "")
|
|
|
|
(define/private (ellipsize w l)
|
|
(let ((ext (call-with-values (lambda () (get-window-text-extent l font))
|
|
(lambda (w h) w))))
|
|
(if (< ext w)
|
|
l
|
|
(let* ((factor (/ w ext))
|
|
(strl (string-length l))
|
|
(n-strl (round (* strl factor)))
|
|
(drop (- strl n-strl)))
|
|
(if (eq? ellipsis 'right)
|
|
(ellipsize w (str:string-drop l drop))
|
|
(ellipsize w (str:string-drop-right l drop)))))))
|
|
|
|
(define/override (set-label l . resize)
|
|
(let ((rsz #f))
|
|
(unless (null? resize)
|
|
(set! rsz (car resize)))
|
|
(if (eq? rsz #t)
|
|
(super set-label l)
|
|
(let* ((width (send this get-width))
|
|
(ext (call-with-values (lambda () (get-window-text-extent l font))
|
|
(lambda (w h) w)))
|
|
)
|
|
(set! my_label l)
|
|
(set! ellipsis_label
|
|
(if (< ext width)
|
|
l
|
|
(ellipsize width (string-append
|
|
(if (eq? ellipsis 'left) "..." "")
|
|
l
|
|
(if (eq? ellipsis 'right) "..." "")))))
|
|
(super set-label ellipsis_label)))))
|
|
|
|
(define/override (get-label)
|
|
my_label)
|
|
)) |