File: pce_select_set_item.pl

package info (click to toggle)
swi-prolog 9.0.4%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 82,408 kB
  • sloc: ansic: 387,503; perl: 359,326; cpp: 6,613; lisp: 6,247; java: 5,540; sh: 3,147; javascript: 2,668; python: 1,900; ruby: 1,594; yacc: 845; makefile: 428; xml: 317; sed: 12; sql: 6
file content (107 lines) | stat: -rw-r--r-- 3,423 bytes parent folder | download | duplicates (4)
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
103
104
105
106
107
:- module(pce_select_set_item, []).
:- use_module(library(pce)).
:- use_module(library(pce_util)).

resource(back,    image, image('16x16/back.xpm')).
resource(forward, image, image('16x16/forward.xpm')).

:- pce_begin_class(select_set_item, dialog_group,
                   "Select objects from a set").

initialise(SSI, Name:name, Width:[int], Height:[int]) :->
    send_super(SSI, initialise, Name, group),
    send(SSI, attribute, hor_stretch, 100),
    send(SSI, attribute, ver_stretch, 100),
    send(SSI, attribute, ver_shrink, 100),
    send(SSI, display, new(LB, list_browser(@default, Width, Height))),
    send(LB, name, left),
    send(LB, multiple_selection, @on),
    send(SSI, display, new(RB, list_browser(@default, Width, Height))),
    send(RB, name, right),
    send(RB, multiple_selection, @on),
    send(SSI, display, new(Back, button(back))),
    send(Back, label, image(resource(back))),
    send(SSI, display, new(Forw, button(forward))),
    send(Forw, label, image(resource(forward))),
    get(LB?area, size, size(BW, BH)),
    send(SSI, size, size(BW*2+50, BH)),
    send(SSI, layout_dialog).

layout_dialog(SSI) :->
    get(SSI, size, size(TW, TH)),
    (   get(SSI, border, size(BW, BH))
    ->  true
    ;   get(SSI, gap, size(BW, BH))
    ),
    get(SSI, member, left, LB),
    get(SSI, member, right, RB),
    get(SSI, member, forward, B1),
    get(SSI, member, back, B2),
    BrowserSep = 50,
    BrowserWidth is (TW-2*BW-BrowserSep)//2,
    BrowserHeight is (TH-2*BH),
    send(LB, do_set,
         BW, BH,
         BrowserWidth, BrowserHeight),
    send(RB, do_set,
         BW+BrowserWidth+BrowserSep, BH,
         BrowserWidth, BrowserHeight),
    get(B1, size, size(B1W, B1H)),
    ButtonW is BW + BrowserWidth + (BrowserSep-B1W)//2,
    B1Y is BH + (BrowserHeight-2*B1H-15)/2,
    B2Y is B1Y + B1H + 15,
    send(B1, set, ButtonW, B1Y),
    send(B2, set, ButtonW, B2Y).

forward(SSI) :->
    "Move objects from left to right"::
    get(SSI, member, left, LB),
    get(SSI, member, right, RB),
    get(LB, selection, Chain),
    send(Chain, for_all, message(RB, append, @arg1)),
    send(RB, sort).

back(SSI) :->
    "Move objects from right to left"::
    get(SSI, member, left, LB),
    get(SSI, member, right, RB),
    get(RB, selection, Chain),
    send(Chain, for_all, message(LB, append, @arg1)),
    send(LB, sort).

append(SSI, DI:dict_item) :->
    "Append item to the set to select from"::
    get(SSI, member, left, LB),
    send(LB, append, DI).

clear(SSI) :->
    "Clear left browser"::
    get(SSI, member, left, LB),
    send(LB, clear).

selection(SSI, Items:chain) :<-
    "Get currently selected items"::
    get(SSI, member, right, RB),
    get(RB, members, Items).

:- pce_end_class(select_set_item).


/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
test :-
        D = @d,
        free(D),
        new(D, dialog),
        send(D, append, new(S, select_set_item(files))),
        expand_file_name('*.train', Files),
        send_list(S, append, Files),
        send(D, resize_message, message(D, layout, D?size)),
        send(D, append, button(ok,
                               message(@prolog, portray_object,
                                       S?selection))),
        send(D, append, button(cancel, message(D, destroy))),
        send(D, open).
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */