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 }