1 module w95.desktop;
2 
3 import fluid;
4 import raylib;
5 
6 import w95.util;
7 import w95.theme;
8 import w95.window;
9 import w95.toolbar;
10 import w95.icon_grid;
11 import w95.image_button;
12 
13 @safe:
14 
15 alias desktop = simpleConstructor!Desktop;
16 
17 /// Displays a Windows 95-style desktop.
18 class Desktop : Frame, WindowManager {
19 
20     enum Vector2 defaultSize = Vector2(640, 480);
21     
22     public {
23 
24         NodeSlot!IconGrid icons;
25         NodeSlot!Toolbar toolbar;
26         MapFrame windows;
27         
28     }
29 
30     private {
31 
32         Rectangle rect;
33 
34     }
35 
36     this(IconGrid icons, Toolbar toolbar) {
37 
38         super(
39             onionFrame(
40                 .layout!(1, "fill"),
41                 this.icons = nodeSlot!IconGrid(
42                     .layout!"fill",
43                     icons
44                 ),
45                 windows = mapFrame(
46                     .ignoreMouse,
47                     .acceptDrop(Window95.selector),
48                     .layout!"fill",
49                 ),
50             ),
51             this.toolbar = nodeSlot!Toolbar(
52                 .layout!"fill",
53                 toolbar
54             ),
55         );
56         super.theme = w95Theme;
57         this.layout = .layout!"fill";
58 
59         if (icons)
60             icons.layout = .layout!"fill";
61         if (toolbar)
62             toolbar.layout = .layout!"fill";
63 
64 
65     }
66 
67     override void resizeImpl(Vector2 space) {
68 
69         if (space.x < defaultSize.x) space.x = defaultSize.x;
70         if (space.y < defaultSize.y) space.y = defaultSize.y;
71 
72         super.resizeImpl(space);
73         minSize = defaultSize;
74 
75     }
76 
77     override void drawImpl(Rectangle outer, Rectangle inner) {
78 
79         super.drawImpl(outer, inner);
80         rect = inner;        
81 
82     }
83 
84     /// Spawn a window.
85     void addWindow(Window95 window) {
86 
87         addWindow(window,
88             MapPosition(
89                 rect.size / 2,
90                 dropVector!"center"
91             )
92         );
93 
94     }
95 
96     /// ditto
97     void addWindow(Window95 window, MapPosition position) {
98 
99         windows.addChild(window, position);
100         windows.updateSize();
101 
102     }
103 
104 }
105 
106 interface WindowManager {
107 
108     void addWindow(Window95 window);
109 
110 }