1#
2# francy: Interactive Discrete Mathematics in GAP
3#
4
5#############################################################################
6##
7#M  Menu( <title> ) . . . . . . . . . . . . . . . a new menu entry
8##
9InstallMethod(Menu,
10  "a title string",
11  true,
12  [IsString,
13   IsCallback],
14  0,
15function(title, callback)
16  return Objectify(MenuObjectType, rec(
17    id       := GenerateID(),
18    title    := title,
19    callback := callback,
20    menus    := rec()
21  ));
22end);
23
24InstallOtherMethod(Menu,
25  "a title string",
26  true,
27  [IsString],
28  0,
29function(title)
30  return Menu(title, NoopCallback());
31end);
32
33#############################################################################
34##
35#M  Add( <menu>, <menu> ) . . . . . add menu to canvas
36##
37InstallOtherMethod(Add,
38  "a menu, a menu",
39  true,
40  [IsMenu,
41   IsMenu],
42  0,
43function(menu, object)
44  menu!.menus!.(object!.id) := object;
45  return menu;
46end);
47
48InstallOtherMethod(Add,
49  "a canvas, a list of francy objects",
50  true,
51  [IsMenu,
52   IsList],
53  0,
54function(menu, objects)
55  local object;
56  for object in objects do
57    Add(menu, object);
58  od;
59  return menu;
60end);
61
62#############################################################################
63##
64#M  Remove( <menu>, <menu> ) . . . . . remove menu from menu
65##
66InstallOtherMethod(Remove,
67  "a menu, a menu",
68  true,
69  [IsMenu,
70   IsMenu],
71  0,
72function(menu, object)
73  Unbind(menu!.menus!.(object!.id));
74  return menu;
75end);
76
77InstallOtherMethod(Remove,
78  "a menu, a list of francy objects",
79  true,
80  [IsMenu,
81   IsList],
82  0,
83function(menu, objects)
84  local object;
85  for object in objects do
86    Remove(menu, object);
87  od;
88  return menu;
89end);