Added a lot of icons to all context menus & separated Color/SoundSource (s)
@ -1 +1 @@
|
||||
Subproject commit 8222b1287c40965622fffcdeff4ae93f5d0418b5
|
||||
Subproject commit db1a8c3ac5ebc247086327303a47313456a4e987
|
||||
BIN
sprites/icons/Antenna.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/AspectRatio.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
sprites/icons/Code.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Copy.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Cross.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Delete.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
sprites/icons/Edit.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
sprites/icons/Eject.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/File.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Folder.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/FolderSlash.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Label.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
sprites/icons/Link.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/LinkSlash.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Microchip.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Plus.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
sprites/icons/Power.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
sprites/icons/Restart.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
sprites/icons/Save.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/SaveAs.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
sprites/icons/Tiers.png
Normal file
|
After Width: | Height: | Size: 3.2 KiB |
BIN
sprites/icons/Window.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 6.5 KiB |
@ -24,11 +24,12 @@ Connection = #909090
|
||||
NodeSelectorRing = #4c7f66
|
||||
NodeSelectorBackground = #00000066
|
||||
|
||||
ContextMenuBackground = #222222cc
|
||||
ContextMenuBackground = #222222ee
|
||||
ContextMenuBorder = #444444
|
||||
ContextMenuText = #b0b0b0
|
||||
ContextMenuHover = #333333
|
||||
ContextMenuHover = #363636
|
||||
ContextMenuSeparator = #444444
|
||||
ContextMenuIcon = #7F7F7F
|
||||
|
||||
ComponentSelectorBackground = #222222cc
|
||||
ComponentSelectorBorder = #444444
|
||||
|
||||
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 100 KiB |
@ -1,251 +1,273 @@
|
||||
BackgroundPattern 0 0 304 304
|
||||
BarSegment 69 479 16 4
|
||||
Empty 426 305 16 16
|
||||
EmptySlot 404 330 18 18
|
||||
Knob 459 208 50 50
|
||||
KnobCenter 406 129 50 50
|
||||
KnobLimits 457 129 50 50
|
||||
ShadowBorder 505 0 1 24
|
||||
ShadowCorner 301 305 24 24
|
||||
TabArrow 16 479 8 14
|
||||
blocks/Generic 443 305 16 16
|
||||
blocks/HologramEffect 507 18 4 4
|
||||
blocks/HologramProjector1Top 460 305 16 16
|
||||
blocks/HologramProjector2Top 477 305 16 16
|
||||
blocks/HologramProjectorSide 494 305 16 16
|
||||
buttons/BottomDrawerClose 423 330 18 18
|
||||
buttons/BottomDrawerOpen 442 330 18 18
|
||||
buttons/OpenFMRadioCloseOff 502 117 7 8
|
||||
buttons/OpenFMRadioCloseOn 131 494 7 8
|
||||
buttons/OpenFMRadioRedstoneOff 502 72 8 8
|
||||
buttons/OpenFMRadioRedstoneOn 502 81 8 8
|
||||
buttons/OpenFMRadioStartOff 326 305 24 24
|
||||
buttons/OpenFMRadioStartOn 351 305 24 24
|
||||
buttons/OpenFMRadioStopOff 376 305 24 24
|
||||
buttons/OpenFMRadioStopOn 401 305 24 24
|
||||
buttons/OpenFMRadioVolumeDownOff 25 479 10 10
|
||||
buttons/OpenFMRadioVolumeDownOn 36 479 10 10
|
||||
buttons/OpenFMRadioVolumeUpOff 47 479 10 10
|
||||
buttons/OpenFMRadioVolumeUpOn 58 479 10 10
|
||||
buttons/PowerOff 461 330 18 18
|
||||
buttons/PowerOn 480 330 18 18
|
||||
icons/ButtonCheck 301 378 17 17
|
||||
icons/ButtonClipboard 319 378 17 17
|
||||
icons/ButtonRandomize 337 378 17 17
|
||||
icons/CPU 406 180 16 16
|
||||
icons/Card 423 180 16 16
|
||||
icons/Close 0 479 15 14
|
||||
icons/ComponentBus 440 180 16 16
|
||||
icons/DragLMB 301 363 21 14
|
||||
icons/DragRMB 323 363 21 14
|
||||
icons/EEPROM 457 180 16 16
|
||||
icons/Floppy 474 180 16 16
|
||||
icons/Grid 335 330 22 22
|
||||
icons/GridOff 358 330 22 22
|
||||
icons/HDD 491 180 16 16
|
||||
icons/Home 381 330 22 22
|
||||
icons/LMB 71 494 11 14
|
||||
icons/Memory 459 259 16 16
|
||||
icons/NA 476 259 16 16
|
||||
icons/NotificationError 95 494 11 11
|
||||
icons/NotificationInfo 107 494 11 11
|
||||
icons/NotificationWarning 119 494 11 11
|
||||
icons/Pin 26 494 14 14
|
||||
icons/RMB 83 494 11 14
|
||||
icons/Server 493 259 16 16
|
||||
icons/SettingsSound 0 494 12 17
|
||||
icons/SettingsUI 13 494 12 17
|
||||
icons/Tier0 379 279 16 16
|
||||
icons/Tier1 396 279 16 16
|
||||
icons/Tier2 413 279 16 16
|
||||
icons/Unpin 41 494 14 14
|
||||
icons/WaveLFSR 359 462 24 10
|
||||
icons/WaveNoise 384 462 24 10
|
||||
icons/WaveSawtooth 409 462 24 10
|
||||
icons/WaveSine 434 462 24 10
|
||||
icons/WaveSquare 459 462 24 10
|
||||
icons/WaveTriangle 484 462 24 10
|
||||
icons/WireArrowLeft 507 0 4 8
|
||||
icons/WireArrowRight 507 9 4 8
|
||||
items/APU0 233 305 16 96
|
||||
items/APU1 250 305 16 96
|
||||
items/APU2 267 305 16 96
|
||||
items/CPU0 430 279 16 16
|
||||
items/CPU1 447 279 16 16
|
||||
items/CPU2 464 279 16 16
|
||||
items/CardBase 481 279 16 16
|
||||
items/CircuitBoard 0 411 16 16
|
||||
items/ComponentBus0 17 411 16 16
|
||||
items/ComponentBus1 34 411 16 16
|
||||
items/ComponentBus2 51 411 16 16
|
||||
items/ComponentBus3 68 411 16 16
|
||||
BarSegment 459 479 16 4
|
||||
Empty 473 277 16 16
|
||||
EmptySlot 233 379 18 18
|
||||
Knob 447 208 50 50
|
||||
KnobCenter 233 305 50 50
|
||||
KnobLimits 284 305 50 50
|
||||
ShadowBorder 497 305 1 24
|
||||
ShadowCorner 372 305 24 24
|
||||
TabArrow 85 496 8 14
|
||||
blocks/Generic 490 277 16 16
|
||||
blocks/HologramEffect 277 498 4 4
|
||||
blocks/HologramProjector1Top 486 129 16 16
|
||||
blocks/HologramProjector2Top 486 146 16 16
|
||||
blocks/HologramProjectorSide 486 163 16 16
|
||||
buttons/BottomDrawerClose 252 379 18 18
|
||||
buttons/BottomDrawerOpen 271 379 18 18
|
||||
buttons/OpenFMRadioCloseOff 248 496 7 8
|
||||
buttons/OpenFMRadioCloseOn 256 496 7 8
|
||||
buttons/OpenFMRadioRedstoneOff 203 496 8 8
|
||||
buttons/OpenFMRadioRedstoneOn 212 496 8 8
|
||||
buttons/OpenFMRadioStartOff 397 305 24 24
|
||||
buttons/OpenFMRadioStartOn 422 305 24 24
|
||||
buttons/OpenFMRadioStopOff 447 305 24 24
|
||||
buttons/OpenFMRadioStopOn 472 305 24 24
|
||||
buttons/OpenFMRadioVolumeDownOff 130 496 10 10
|
||||
buttons/OpenFMRadioVolumeDownOn 141 496 10 10
|
||||
buttons/OpenFMRadioVolumeUpOff 152 496 10 10
|
||||
buttons/OpenFMRadioVolumeUpOn 163 496 10 10
|
||||
buttons/PowerOff 290 379 18 18
|
||||
buttons/PowerOn 309 379 18 18
|
||||
icons/Antenna 486 180 16 16
|
||||
icons/AspectRatio 0 411 16 16
|
||||
icons/ButtonCheck 447 259 17 17
|
||||
icons/ButtonClipboard 465 259 17 17
|
||||
icons/ButtonRandomize 483 259 17 17
|
||||
icons/CPU 17 411 16 16
|
||||
icons/Card 34 411 16 16
|
||||
icons/Close 0 496 15 14
|
||||
icons/Code 51 411 16 16
|
||||
icons/ComponentBus 68 411 16 16
|
||||
icons/Copy 85 411 16 16
|
||||
icons/Cross 102 411 16 16
|
||||
icons/Delete 119 411 16 16
|
||||
icons/DragLMB 302 356 21 14
|
||||
icons/DragRMB 324 356 21 14
|
||||
icons/EEPROM 136 411 16 16
|
||||
icons/Edit 153 411 16 16
|
||||
icons/Eject 170 411 16 16
|
||||
icons/File 187 411 16 16
|
||||
icons/Floppy 204 411 16 16
|
||||
icons/Folder 221 411 16 16
|
||||
icons/FolderSlash 238 411 16 16
|
||||
icons/Grid 233 356 22 22
|
||||
icons/GridOff 256 356 22 22
|
||||
icons/HDD 255 411 16 16
|
||||
icons/Home 279 356 22 22
|
||||
icons/LMB 61 496 11 14
|
||||
icons/Label 272 411 16 16
|
||||
icons/Link 289 411 16 16
|
||||
icons/LinkSlash 306 411 16 16
|
||||
icons/Memory 323 411 16 16
|
||||
icons/Microchip 340 411 16 16
|
||||
icons/NA 357 411 16 16
|
||||
icons/NotificationError 94 496 11 11
|
||||
icons/NotificationInfo 106 496 11 11
|
||||
icons/NotificationWarning 118 496 11 11
|
||||
icons/Pin 16 496 14 14
|
||||
icons/Plus 374 411 16 16
|
||||
icons/Power 391 411 16 16
|
||||
icons/RMB 73 496 11 14
|
||||
icons/Restart 408 411 16 16
|
||||
icons/Save 425 411 16 16
|
||||
icons/SaveAs 442 411 16 16
|
||||
icons/Server 459 411 16 16
|
||||
icons/SettingsSound 447 277 12 17
|
||||
icons/SettingsUI 460 277 12 17
|
||||
icons/Tier0 476 411 16 16
|
||||
icons/Tier1 493 411 16 16
|
||||
icons/Tier2 0 428 16 16
|
||||
icons/Tiers 17 428 16 16
|
||||
icons/Unpin 31 496 14 14
|
||||
icons/WaveLFSR 335 344 24 10
|
||||
icons/WaveNoise 360 344 24 10
|
||||
icons/WaveSawtooth 385 344 24 10
|
||||
icons/WaveSine 410 344 24 10
|
||||
icons/WaveSquare 435 344 24 10
|
||||
icons/WaveTriangle 460 344 24 10
|
||||
icons/Window 34 428 16 16
|
||||
icons/WireArrowLeft 264 496 4 8
|
||||
icons/WireArrowRight 269 496 4 8
|
||||
items/APU0 305 208 16 96
|
||||
items/APU1 322 208 16 96
|
||||
items/APU2 339 208 16 96
|
||||
items/CPU0 51 428 16 16
|
||||
items/CPU1 68 428 16 16
|
||||
items/CPU2 85 428 16 16
|
||||
items/CardBase 102 428 16 16
|
||||
items/CircuitBoard 119 428 16 16
|
||||
items/ComponentBus0 136 428 16 16
|
||||
items/ComponentBus1 153 428 16 16
|
||||
items/ComponentBus2 170 428 16 16
|
||||
items/ComponentBus3 187 428 16 16
|
||||
items/DataCard0 434 0 16 128
|
||||
items/DataCard1 451 0 16 128
|
||||
items/DataCard2 468 0 16 128
|
||||
items/DebugCard 85 411 16 16
|
||||
items/DiskDriveMountable 102 411 16 16
|
||||
items/EEPROM 119 411 16 16
|
||||
items/FloppyDisk_dyeBlack 136 411 16 16
|
||||
items/FloppyDisk_dyeBlue 153 411 16 16
|
||||
items/FloppyDisk_dyeBrown 170 411 16 16
|
||||
items/FloppyDisk_dyeCyan 187 411 16 16
|
||||
items/FloppyDisk_dyeGray 204 411 16 16
|
||||
items/FloppyDisk_dyeGreen 221 411 16 16
|
||||
items/FloppyDisk_dyeLightBlue 238 411 16 16
|
||||
items/FloppyDisk_dyeLightGray 255 411 16 16
|
||||
items/FloppyDisk_dyeLime 272 411 16 16
|
||||
items/FloppyDisk_dyeMagenta 289 411 16 16
|
||||
items/FloppyDisk_dyeOrange 306 411 16 16
|
||||
items/FloppyDisk_dyePink 323 411 16 16
|
||||
items/FloppyDisk_dyePurple 340 411 16 16
|
||||
items/FloppyDisk_dyeRed 357 411 16 16
|
||||
items/FloppyDisk_dyeWhite 374 411 16 16
|
||||
items/FloppyDisk_dyeYellow 391 411 16 16
|
||||
items/GraphicsCard0 408 411 16 16
|
||||
items/GraphicsCard1 425 411 16 16
|
||||
items/GraphicsCard2 442 411 16 16
|
||||
items/HardDiskDrive0 459 411 16 16
|
||||
items/HardDiskDrive1 476 411 16 16
|
||||
items/HardDiskDrive2 493 411 16 16
|
||||
items/InternetCard 301 330 16 32
|
||||
items/LinkedCard 284 305 16 96
|
||||
items/Memory0 0 428 16 16
|
||||
items/Memory1 17 428 16 16
|
||||
items/Memory2 34 428 16 16
|
||||
items/Memory3 51 428 16 16
|
||||
items/Memory4 68 428 16 16
|
||||
items/Memory5 85 428 16 16
|
||||
items/NetworkCard 102 428 16 16
|
||||
items/RedstoneCard0 119 428 16 16
|
||||
items/RedstoneCard1 136 428 16 16
|
||||
items/SelfDestructingCard 318 330 16 32
|
||||
items/Server0 153 428 16 16
|
||||
items/Server1 170 428 16 16
|
||||
items/Server2 187 428 16 16
|
||||
items/Server3 204 428 16 16
|
||||
items/DebugCard 204 428 16 16
|
||||
items/DiskDriveMountable 221 428 16 16
|
||||
items/EEPROM 238 428 16 16
|
||||
items/FloppyDisk_dyeBlack 255 428 16 16
|
||||
items/FloppyDisk_dyeBlue 272 428 16 16
|
||||
items/FloppyDisk_dyeBrown 289 428 16 16
|
||||
items/FloppyDisk_dyeCyan 306 428 16 16
|
||||
items/FloppyDisk_dyeGray 323 428 16 16
|
||||
items/FloppyDisk_dyeGreen 340 428 16 16
|
||||
items/FloppyDisk_dyeLightBlue 357 428 16 16
|
||||
items/FloppyDisk_dyeLightGray 374 428 16 16
|
||||
items/FloppyDisk_dyeLime 391 428 16 16
|
||||
items/FloppyDisk_dyeMagenta 408 428 16 16
|
||||
items/FloppyDisk_dyeOrange 425 428 16 16
|
||||
items/FloppyDisk_dyePink 442 428 16 16
|
||||
items/FloppyDisk_dyePurple 459 428 16 16
|
||||
items/FloppyDisk_dyeRed 476 428 16 16
|
||||
items/FloppyDisk_dyeWhite 493 428 16 16
|
||||
items/FloppyDisk_dyeYellow 0 445 16 16
|
||||
items/GraphicsCard0 17 445 16 16
|
||||
items/GraphicsCard1 34 445 16 16
|
||||
items/GraphicsCard2 51 445 16 16
|
||||
items/HardDiskDrive0 68 445 16 16
|
||||
items/HardDiskDrive1 85 445 16 16
|
||||
items/HardDiskDrive2 102 445 16 16
|
||||
items/InternetCard 338 305 16 32
|
||||
items/LinkedCard 356 208 16 96
|
||||
items/Memory0 119 445 16 16
|
||||
items/Memory1 136 445 16 16
|
||||
items/Memory2 153 445 16 16
|
||||
items/Memory3 170 445 16 16
|
||||
items/Memory4 187 445 16 16
|
||||
items/Memory5 204 445 16 16
|
||||
items/NetworkCard 221 445 16 16
|
||||
items/RedstoneCard0 238 445 16 16
|
||||
items/RedstoneCard1 255 445 16 16
|
||||
items/SelfDestructingCard 355 305 16 32
|
||||
items/Server0 272 445 16 16
|
||||
items/Server1 289 445 16 16
|
||||
items/Server2 306 445 16 16
|
||||
items/Server3 323 445 16 16
|
||||
items/SoundCard 485 0 16 128
|
||||
items/WirelessNetworkCard0 221 428 16 16
|
||||
items/WirelessNetworkCard1 238 428 16 16
|
||||
light-panel/BookmarkLeft 340 462 18 14
|
||||
light-panel/BookmarkRight 355 378 20 14
|
||||
light-panel/BorderB 139 494 4 4
|
||||
light-panel/BorderL 229 494 4 2
|
||||
light-panel/BorderR 144 494 4 4
|
||||
light-panel/BorderT 149 494 4 4
|
||||
light-panel/CornerBL 154 494 4 4
|
||||
light-panel/CornerBR 159 494 4 4
|
||||
light-panel/CornerTL 164 494 4 4
|
||||
light-panel/CornerTR 169 494 4 4
|
||||
light-panel/Fill 88 479 2 2
|
||||
light-panel/Vent 502 0 2 38
|
||||
nodes/Cable 502 90 8 8
|
||||
nodes/Camera 255 428 16 16
|
||||
nodes/Chest 56 494 14 14
|
||||
nodes/HologramProjector0 272 428 16 16
|
||||
nodes/HologramProjector1 289 428 16 16
|
||||
nodes/IronNoteBlock 306 428 16 16
|
||||
nodes/Lamp 323 428 16 16
|
||||
nodes/LampFrame 340 428 16 16
|
||||
items/WirelessNetworkCard0 340 445 16 16
|
||||
items/WirelessNetworkCard1 357 445 16 16
|
||||
light-panel/BookmarkLeft 328 379 18 14
|
||||
light-panel/BookmarkRight 346 356 20 14
|
||||
light-panel/BorderB 282 498 4 4
|
||||
light-panel/BorderL 372 498 4 2
|
||||
light-panel/BorderR 287 498 4 4
|
||||
light-panel/BorderT 292 498 4 4
|
||||
light-panel/CornerBL 297 498 4 4
|
||||
light-panel/CornerBR 302 498 4 4
|
||||
light-panel/CornerTL 307 498 4 4
|
||||
light-panel/CornerTR 312 498 4 4
|
||||
light-panel/Fill 492 479 2 2
|
||||
light-panel/Vent 335 305 2 38
|
||||
nodes/Cable 221 496 8 8
|
||||
nodes/Camera 374 445 16 16
|
||||
nodes/Chest 46 496 14 14
|
||||
nodes/HologramProjector0 391 445 16 16
|
||||
nodes/HologramProjector1 408 445 16 16
|
||||
nodes/IronNoteBlock 425 445 16 16
|
||||
nodes/Lamp 442 445 16 16
|
||||
nodes/LampFrame 459 445 16 16
|
||||
nodes/LampGlow 305 0 128 128
|
||||
nodes/NewNode 357 428 16 16
|
||||
nodes/NoteBlock 374 428 16 16
|
||||
nodes/OpenFMRadio 391 428 16 16
|
||||
nodes/Relay 408 428 16 16
|
||||
nodes/computer/Activity 425 428 16 16
|
||||
nodes/computer/Default 442 428 16 16
|
||||
nodes/computer/Error 459 428 16 16
|
||||
nodes/computer/On 476 428 16 16
|
||||
nodes/disk-drive/Activity 493 428 16 16
|
||||
nodes/disk-drive/Default 0 445 16 16
|
||||
nodes/disk-drive/Floppy 17 445 16 16
|
||||
nodes/rack/Default 34 445 16 16
|
||||
nodes/rack/Empty 51 445 16 16
|
||||
nodes/rack/drive/0/Activity 68 445 16 16
|
||||
nodes/rack/drive/0/Default 85 445 16 16
|
||||
nodes/rack/drive/0/Floppy 102 445 16 16
|
||||
nodes/rack/drive/1/Activity 119 445 16 16
|
||||
nodes/rack/drive/1/Default 136 445 16 16
|
||||
nodes/rack/drive/1/Floppy 153 445 16 16
|
||||
nodes/rack/drive/2/Activity 170 445 16 16
|
||||
nodes/rack/drive/2/Default 187 445 16 16
|
||||
nodes/rack/drive/2/Floppy 204 445 16 16
|
||||
nodes/rack/drive/3/Activity 221 445 16 16
|
||||
nodes/rack/drive/3/Default 238 445 16 16
|
||||
nodes/rack/drive/3/Floppy 255 445 16 16
|
||||
nodes/rack/drive/Floppy 272 445 16 16
|
||||
nodes/rack/server/0/Activity 289 445 16 16
|
||||
nodes/rack/server/0/Default 306 445 16 16
|
||||
nodes/rack/server/0/Error 323 445 16 16
|
||||
nodes/rack/server/0/On 340 445 16 16
|
||||
nodes/rack/server/1/Activity 357 445 16 16
|
||||
nodes/rack/server/1/Default 374 445 16 16
|
||||
nodes/rack/server/1/Error 391 445 16 16
|
||||
nodes/rack/server/1/On 408 445 16 16
|
||||
nodes/rack/server/2/Activity 425 445 16 16
|
||||
nodes/rack/server/2/Default 442 445 16 16
|
||||
nodes/rack/server/2/Error 459 445 16 16
|
||||
nodes/rack/server/2/On 476 445 16 16
|
||||
nodes/rack/server/3/Activity 493 445 16 16
|
||||
nodes/rack/server/3/Default 0 462 16 16
|
||||
nodes/rack/server/3/Error 17 462 16 16
|
||||
nodes/rack/server/3/On 34 462 16 16
|
||||
nodes/screen/BottomLeft 51 462 16 16
|
||||
nodes/screen/BottomMiddle 68 462 16 16
|
||||
nodes/screen/BottomRight 85 462 16 16
|
||||
nodes/screen/ColumnBottom 102 462 16 16
|
||||
nodes/screen/ColumnMiddle 119 462 16 16
|
||||
nodes/screen/ColumnTop 136 462 16 16
|
||||
nodes/screen/Middle 153 462 16 16
|
||||
nodes/screen/MiddleLeft 170 462 16 16
|
||||
nodes/screen/MiddleRight 187 462 16 16
|
||||
nodes/screen/PowerOnOverlay 204 462 16 16
|
||||
nodes/screen/RowLeft 221 462 16 16
|
||||
nodes/screen/RowMiddle 238 462 16 16
|
||||
nodes/screen/RowRight 255 462 16 16
|
||||
nodes/screen/Standalone 272 462 16 16
|
||||
nodes/screen/TopLeft 289 462 16 16
|
||||
nodes/screen/TopMiddle 306 462 16 16
|
||||
nodes/screen/TopRight 323 462 16 16
|
||||
panel/BorderB 174 494 4 4
|
||||
panel/BorderL 234 494 4 2
|
||||
panel/BorderR 179 494 4 4
|
||||
panel/BorderT 184 494 4 4
|
||||
panel/CornerBL 189 494 4 4
|
||||
panel/CornerBR 194 494 4 4
|
||||
panel/CornerTL 199 494 4 4
|
||||
panel/CornerTR 204 494 4 4
|
||||
panel/Fill 91 479 2 2
|
||||
particles/Note 502 61 7 10
|
||||
screen/BorderB 508 25 2 8
|
||||
screen/BorderT 505 25 2 10
|
||||
screen/CornerBL 502 99 8 8
|
||||
screen/CornerBR 502 108 8 8
|
||||
screen/CornerTL 502 39 8 10
|
||||
screen/CornerTR 502 50 8 10
|
||||
window/BorderDark 510 117 1 4
|
||||
window/BorderLight 86 479 1 4
|
||||
window/CornerBL 209 494 4 4
|
||||
window/CornerBR 214 494 4 4
|
||||
window/CornerTL 219 494 4 4
|
||||
window/CornerTR 224 494 4 4
|
||||
nodes/NewNode 476 445 16 16
|
||||
nodes/NoteBlock 493 445 16 16
|
||||
nodes/OpenFMRadio 0 462 16 16
|
||||
nodes/Relay 17 462 16 16
|
||||
nodes/computer/Activity 34 462 16 16
|
||||
nodes/computer/Default 51 462 16 16
|
||||
nodes/computer/Error 68 462 16 16
|
||||
nodes/computer/On 85 462 16 16
|
||||
nodes/disk-drive/Activity 102 462 16 16
|
||||
nodes/disk-drive/Default 119 462 16 16
|
||||
nodes/disk-drive/Floppy 136 462 16 16
|
||||
nodes/rack/Default 153 462 16 16
|
||||
nodes/rack/Empty 170 462 16 16
|
||||
nodes/rack/drive/0/Activity 187 462 16 16
|
||||
nodes/rack/drive/0/Default 204 462 16 16
|
||||
nodes/rack/drive/0/Floppy 221 462 16 16
|
||||
nodes/rack/drive/1/Activity 238 462 16 16
|
||||
nodes/rack/drive/1/Default 255 462 16 16
|
||||
nodes/rack/drive/1/Floppy 272 462 16 16
|
||||
nodes/rack/drive/2/Activity 289 462 16 16
|
||||
nodes/rack/drive/2/Default 306 462 16 16
|
||||
nodes/rack/drive/2/Floppy 323 462 16 16
|
||||
nodes/rack/drive/3/Activity 340 462 16 16
|
||||
nodes/rack/drive/3/Default 357 462 16 16
|
||||
nodes/rack/drive/3/Floppy 374 462 16 16
|
||||
nodes/rack/drive/Floppy 391 462 16 16
|
||||
nodes/rack/server/0/Activity 408 462 16 16
|
||||
nodes/rack/server/0/Default 425 462 16 16
|
||||
nodes/rack/server/0/Error 442 462 16 16
|
||||
nodes/rack/server/0/On 459 462 16 16
|
||||
nodes/rack/server/1/Activity 476 462 16 16
|
||||
nodes/rack/server/1/Default 493 462 16 16
|
||||
nodes/rack/server/1/Error 0 479 16 16
|
||||
nodes/rack/server/1/On 17 479 16 16
|
||||
nodes/rack/server/2/Activity 34 479 16 16
|
||||
nodes/rack/server/2/Default 51 479 16 16
|
||||
nodes/rack/server/2/Error 68 479 16 16
|
||||
nodes/rack/server/2/On 85 479 16 16
|
||||
nodes/rack/server/3/Activity 102 479 16 16
|
||||
nodes/rack/server/3/Default 119 479 16 16
|
||||
nodes/rack/server/3/Error 136 479 16 16
|
||||
nodes/rack/server/3/On 153 479 16 16
|
||||
nodes/screen/BottomLeft 170 479 16 16
|
||||
nodes/screen/BottomMiddle 187 479 16 16
|
||||
nodes/screen/BottomRight 204 479 16 16
|
||||
nodes/screen/ColumnBottom 221 479 16 16
|
||||
nodes/screen/ColumnMiddle 238 479 16 16
|
||||
nodes/screen/ColumnTop 255 479 16 16
|
||||
nodes/screen/Middle 272 479 16 16
|
||||
nodes/screen/MiddleLeft 289 479 16 16
|
||||
nodes/screen/MiddleRight 306 479 16 16
|
||||
nodes/screen/PowerOnOverlay 323 479 16 16
|
||||
nodes/screen/RowLeft 340 479 16 16
|
||||
nodes/screen/RowMiddle 357 479 16 16
|
||||
nodes/screen/RowRight 374 479 16 16
|
||||
nodes/screen/Standalone 391 479 16 16
|
||||
nodes/screen/TopLeft 408 479 16 16
|
||||
nodes/screen/TopMiddle 425 479 16 16
|
||||
nodes/screen/TopRight 442 479 16 16
|
||||
panel/BorderB 317 498 4 4
|
||||
panel/BorderL 377 498 4 2
|
||||
panel/BorderR 322 498 4 4
|
||||
panel/BorderT 327 498 4 4
|
||||
panel/CornerBL 332 498 4 4
|
||||
panel/CornerBR 337 498 4 4
|
||||
panel/CornerTL 342 498 4 4
|
||||
panel/CornerTR 347 498 4 4
|
||||
panel/Fill 495 479 2 2
|
||||
particles/Note 192 496 7 10
|
||||
screen/BorderB 274 496 2 8
|
||||
screen/BorderT 200 496 2 10
|
||||
screen/CornerBL 230 496 8 8
|
||||
screen/CornerBR 239 496 8 8
|
||||
screen/CornerTL 174 496 8 10
|
||||
screen/CornerTR 183 496 8 10
|
||||
window/BorderDark 476 479 1 4
|
||||
window/BorderLight 478 479 1 4
|
||||
window/CornerBL 352 498 4 4
|
||||
window/CornerBR 357 498 4 4
|
||||
window/CornerTL 362 498 4 4
|
||||
window/CornerTR 367 498 4 4
|
||||
window/OpenFMRadio 0 305 232 105
|
||||
window/case/Motherboard 379 208 79 70
|
||||
window/rack/Lines 305 208 73 91
|
||||
window/case/Motherboard 406 129 79 70
|
||||
window/rack/Lines 373 208 73 91
|
||||
window/rack/Motherboard 305 129 100 78
|
||||
window/rack/NetworkBack 149 499 1 2
|
||||
window/rack/NetworkBottom 151 499 1 2
|
||||
window/rack/NetworkConnector 153 499 1 2
|
||||
window/rack/NetworkLeft 155 499 1 2
|
||||
window/rack/NetworkRight 157 499 1 2
|
||||
window/rack/NetworkTop 159 499 1 2
|
||||
window/rack/NodeBack 239 494 5 1
|
||||
window/rack/NodeBottom 245 494 5 1
|
||||
window/rack/NodeLeft 251 494 5 1
|
||||
window/rack/NodeRight 257 494 5 1
|
||||
window/rack/NodeTop 263 494 5 1
|
||||
window/rack/SideBack 510 122 1 3
|
||||
window/rack/SideBottom 139 499 1 3
|
||||
window/rack/SideConnector 141 499 1 3
|
||||
window/rack/SideLeft 143 499 1 3
|
||||
window/rack/SideRight 145 499 1 3
|
||||
window/rack/SideTop 147 499 1 3
|
||||
window/rack/NetworkBack 498 479 1 2
|
||||
window/rack/NetworkBottom 500 479 1 2
|
||||
window/rack/NetworkConnector 502 479 1 2
|
||||
window/rack/NetworkLeft 504 479 1 2
|
||||
window/rack/NetworkRight 506 479 1 2
|
||||
window/rack/NetworkTop 508 479 1 2
|
||||
window/rack/NodeBack 277 496 5 1
|
||||
window/rack/NodeBottom 283 496 5 1
|
||||
window/rack/NodeLeft 289 496 5 1
|
||||
window/rack/NodeRight 295 496 5 1
|
||||
window/rack/NodeTop 301 496 5 1
|
||||
window/rack/SideBack 480 479 1 3
|
||||
window/rack/SideBottom 482 479 1 3
|
||||
window/rack/SideConnector 484 479 1 3
|
||||
window/rack/SideLeft 486 479 1 3
|
||||
window/rack/SideRight 488 479 1 3
|
||||
window/rack/SideTop 490 479 1 3
|
||||
|
||||
@ -56,16 +56,6 @@ class SoundSource(val kind: SoundSource.Kind,
|
||||
}
|
||||
|
||||
object SoundSource {
|
||||
lazy val InterfaceClick: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceClick, SoundCategory.Interface)
|
||||
lazy val InterfaceClickLow: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceClick, SoundCategory.Interface, pitch = 0.8f)
|
||||
lazy val InterfaceTick: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceTick, SoundCategory.Interface)
|
||||
|
||||
lazy val MinecraftClick: SoundSource = SoundSource.fromBuffer(SoundBuffers.MinecraftClick, SoundCategory.Interface)
|
||||
lazy val MinecraftExplosion: SoundSource = SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment)
|
||||
|
||||
lazy val MachineFloppyInsert: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyInsert, SoundCategory.Environment)
|
||||
lazy val MachineFloppyEject: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyEject, SoundCategory.Environment)
|
||||
|
||||
sealed trait Kind
|
||||
|
||||
case class KindSoundBuffer(buffer: SoundBuffer) extends Kind
|
||||
@ -92,4 +82,16 @@ object SoundSource {
|
||||
object Status extends Enumeration {
|
||||
val Playing, Paused, Stopped = Value
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
|
||||
lazy val InterfaceClick: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceClick, SoundCategory.Interface)
|
||||
lazy val InterfaceClickLow: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceClick, SoundCategory.Interface, pitch = 0.8f)
|
||||
lazy val InterfaceTick: SoundSource = SoundSource.fromBuffer(SoundBuffers.InterfaceTick, SoundCategory.Interface)
|
||||
|
||||
lazy val MinecraftClick: SoundSource = SoundSource.fromBuffer(SoundBuffers.MinecraftClick, SoundCategory.Interface)
|
||||
lazy val MinecraftExplosion: SoundSource = SoundSource.fromBuffer(SoundBuffers.MinecraftExplosion, SoundCategory.Environment)
|
||||
|
||||
lazy val MachineFloppyInsert: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyInsert, SoundCategory.Environment)
|
||||
lazy val MachineFloppyEject: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineFloppyEject, SoundCategory.Environment)
|
||||
}
|
||||
@ -1,5 +1,15 @@
|
||||
package ocelot.desktop.color
|
||||
|
||||
trait Color {
|
||||
def toInt: IntColor
|
||||
|
||||
def toRGBA: RGBAColor
|
||||
|
||||
def toRGBANorm: RGBAColorNorm
|
||||
|
||||
def toHSVA: HSVAColor
|
||||
}
|
||||
|
||||
object Color {
|
||||
val White: RGBAColorNorm = RGBAColorNorm(1, 1, 1)
|
||||
val Black: RGBAColorNorm = RGBAColorNorm(0, 0, 0)
|
||||
@ -10,13 +20,3 @@ object Color {
|
||||
val Grey: RGBAColorNorm = RGBAColorNorm(0.5f, 0.5f, 0.5f)
|
||||
val Transparent: RGBAColorNorm = RGBAColorNorm(0, 0, 0, 0)
|
||||
}
|
||||
|
||||
trait Color {
|
||||
def toInt: IntColor
|
||||
|
||||
def toRGBA: RGBAColor
|
||||
|
||||
def toRGBANorm: RGBAColorNorm
|
||||
|
||||
def toHSVA: HSVAColor
|
||||
}
|
||||
|
||||
@ -257,12 +257,12 @@ class Graphics(private var scalingFactor: Float) extends Logging with Resource {
|
||||
}
|
||||
|
||||
// I hate scala. Overloaded methods with default arguments are not allowed
|
||||
def sprite(icon: IconDef, bounds: Rect2D): Unit = {
|
||||
sprite(icon.icon, bounds.x, bounds.y, bounds.w, bounds.h, icon.color, icon.animation)
|
||||
def sprite(icon: IconSource, bounds: Rect2D): Unit = {
|
||||
sprite(icon.path, bounds.x, bounds.y, bounds.w, bounds.h, Color.White, icon.animation)
|
||||
}
|
||||
|
||||
def sprite(icon: IconDef, pos: Vector2D, size: Size2D): Unit = {
|
||||
sprite(icon.icon, pos.x, pos.y, size.width, size.height, icon.color, icon.animation)
|
||||
def sprite(icon: IconSource, pos: Vector2D, size: Size2D): Unit = {
|
||||
sprite(icon.path, pos.x, pos.y, size.width, size.height, Color.White, icon.animation)
|
||||
}
|
||||
|
||||
def sprite(name: String, bounds: Rect2D): Unit = {
|
||||
@ -287,7 +287,7 @@ class Graphics(private var scalingFactor: Float) extends Logging with Resource {
|
||||
|
||||
def sprite(name: String, x: Float, y: Float, width: Float, height: Float,
|
||||
color: Color = RGBAColorNorm(1f, 1f, 1f),
|
||||
animation: Option[IconDef.Animation] = None): Unit =
|
||||
animation: Option[IconSource.Animation] = None): Unit =
|
||||
{
|
||||
sprite = name
|
||||
foreground = color
|
||||
|
||||
@ -1,14 +0,0 @@
|
||||
package ocelot.desktop.graphics
|
||||
|
||||
import ocelot.desktop.color.Color
|
||||
|
||||
case class IconDef(
|
||||
icon: String,
|
||||
sizeMultiplier: Float = 2f,
|
||||
animation: Option[IconDef.Animation] = None,
|
||||
color: Color = Color.White
|
||||
)
|
||||
|
||||
object IconDef {
|
||||
type Animation = Array[(Int, Float)]
|
||||
}
|
||||
137
src/main/scala/ocelot/desktop/graphics/IconSource.scala
Normal file
@ -0,0 +1,137 @@
|
||||
package ocelot.desktop.graphics
|
||||
|
||||
import ocelot.desktop.ui.widget.modal.notification.NotificationType.NotificationType
|
||||
import totoro.ocelot.brain.util.DyeColor
|
||||
import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
case class IconSource(
|
||||
path: String,
|
||||
animation: Option[IconSource.Animation] = None
|
||||
)
|
||||
|
||||
object IconSource {
|
||||
type Animation = Array[(Int, Float)]
|
||||
|
||||
val CardIcon: IconSource = IconSource("icons/Card")
|
||||
val CpuIcon: IconSource = IconSource("icons/CPU")
|
||||
val HddIcon: IconSource = IconSource("icons/HDD")
|
||||
val EepromIcon: IconSource = IconSource("icons/EEPROM")
|
||||
val FloppyIcon: IconSource = IconSource("icons/Floppy")
|
||||
val MemoryIcon: IconSource = IconSource("icons/Memory")
|
||||
val ServerIcon: IconSource = IconSource("icons/Server")
|
||||
val ComponentBusIcon: IconSource = IconSource("icons/ComponentBus")
|
||||
|
||||
val TierIcon: Tier => IconSource = { tier =>
|
||||
IconSource(s"icons/Tier${tier.id}")
|
||||
}
|
||||
|
||||
val Cpu: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/CPU${tier.id}")
|
||||
}
|
||||
|
||||
val Apu: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/APU${tier.id}", animation = Some(Animations.Apu))
|
||||
}
|
||||
|
||||
val GraphicsCard: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/GraphicsCard${tier.id}")
|
||||
}
|
||||
|
||||
val NetworkCard: IconSource = IconSource("items/NetworkCard")
|
||||
|
||||
val WirelessNetworkCard: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/WirelessNetworkCard${tier.id}")
|
||||
}
|
||||
|
||||
val LinkedCard: IconSource = IconSource("items/LinkedCard", animation = Some(Animations.LinkedCard))
|
||||
|
||||
val InternetCard: IconSource = IconSource("items/InternetCard", animation = Some(Animations.InternetCard))
|
||||
|
||||
val RedstoneCard: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/RedstoneCard${tier.id}")
|
||||
}
|
||||
|
||||
val DataCard: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/DataCard${tier.id}", animation = Some(Animations.DataCard))
|
||||
}
|
||||
|
||||
val SoundCard: IconSource = IconSource("items/SoundCard", animation = Some(Animations.DataCard))
|
||||
|
||||
val SelfDestructingCard: IconSource = IconSource("items/SelfDestructingCard", animation = Some(Animations.SelfDestructingCard))
|
||||
|
||||
val HardDiskDrive: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/HardDiskDrive${tier.id}")
|
||||
}
|
||||
|
||||
val Eeprom: IconSource = IconSource("items/EEPROM")
|
||||
|
||||
val FloppyDisk: DyeColor => IconSource = { color =>
|
||||
IconSource(s"items/FloppyDisk_${color.name}")
|
||||
}
|
||||
|
||||
val Memory: ExtendedTier => IconSource = { tier =>
|
||||
IconSource(s"items/Memory${tier.id}")
|
||||
}
|
||||
|
||||
val Server: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/Server${tier.id}")
|
||||
}
|
||||
|
||||
val ComponentBus: Tier => IconSource = { tier =>
|
||||
IconSource(s"items/ComponentBus${tier.id}")
|
||||
}
|
||||
|
||||
val DiskDriveMountable: IconSource = IconSource("items/DiskDriveMountable")
|
||||
|
||||
//noinspection ScalaWeakerAccess
|
||||
object Animations {
|
||||
val Apu: Animation = Array(
|
||||
(0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f),
|
||||
(4, 3f), (3, 3f), (2, 3f), (1, 3f), (0, 3f))
|
||||
|
||||
val LinkedCard: Animation =
|
||||
Array((0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f))
|
||||
|
||||
val InternetCard: Animation = Array(
|
||||
(0, 2f), (1, 7f), (0, 5f), (1, 4f), (0, 7f), (1, 2f), (0, 8f),
|
||||
(1, 9f), (0, 6f), (1, 4f))
|
||||
|
||||
val DataCard: Animation = Array(
|
||||
(0, 4f), (1, 4f), (2, 4f), (3, 4f), (4, 4f), (5, 4f), (6, 4f), (7, 4f))
|
||||
|
||||
val SelfDestructingCard: Animation = Array((0, 4f), (1, 4f))
|
||||
}
|
||||
|
||||
// ----------------------- Ocelot interface icons -----------------------
|
||||
|
||||
|
||||
val Notification: NotificationType => IconSource = { notificationType =>
|
||||
IconSource(s"icons/Notification$notificationType")
|
||||
}
|
||||
|
||||
val SettingsSound: IconSource = IconSource("icons/SettingsSound")
|
||||
val SettingsUI: IconSource = IconSource("icons/SettingsUI")
|
||||
val Delete: IconSource = IconSource("icons/Delete")
|
||||
val Label: IconSource = IconSource("icons/Label")
|
||||
val Copy: IconSource = IconSource("icons/Copy")
|
||||
val AspectRatio: IconSource = IconSource("icons/AspectRatio")
|
||||
val Eject: IconSource = IconSource("icons/Eject")
|
||||
val Restart: IconSource = IconSource("icons/Restart")
|
||||
val Edit: IconSource = IconSource("icons/Edit")
|
||||
val Folder: IconSource = IconSource("icons/Folder")
|
||||
val FolderSlash: IconSource = IconSource("icons/FolderSlash")
|
||||
val Code: IconSource = IconSource("icons/Code")
|
||||
val File: IconSource = IconSource("icons/File")
|
||||
val Link: IconSource = IconSource("icons/Link")
|
||||
val LinkSlash: IconSource = IconSource("icons/LinkSlash")
|
||||
val Power: IconSource = IconSource("icons/Power")
|
||||
val Save: IconSource = IconSource("icons/Save")
|
||||
val SaveAs: IconSource = IconSource("icons/SaveAs")
|
||||
val Plus: IconSource = IconSource("icons/Plus")
|
||||
val Cross: IconSource = IconSource("icons/Cross")
|
||||
val Microchip: IconSource = IconSource("icons/Microchip")
|
||||
val Antenna: IconSource = IconSource("icons/Antenna")
|
||||
val Window: IconSource = IconSource("icons/Window")
|
||||
val Tiers: IconSource = IconSource("icons/Tiers")
|
||||
}
|
||||
@ -1,108 +0,0 @@
|
||||
package ocelot.desktop.graphics
|
||||
|
||||
import ocelot.desktop.graphics.IconDef.Animation
|
||||
import ocelot.desktop.ui.widget.modal.notification.NotificationType.NotificationType
|
||||
import totoro.ocelot.brain.util.DyeColor
|
||||
import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
object Icons {
|
||||
// Icons
|
||||
val CardIcon: IconDef = IconDef("icons/Card")
|
||||
val CpuIcon: IconDef = IconDef("icons/CPU")
|
||||
val HddIcon: IconDef = IconDef("icons/HDD")
|
||||
val EepromIcon: IconDef = IconDef("icons/EEPROM")
|
||||
val FloppyIcon: IconDef = IconDef("icons/Floppy")
|
||||
val MemoryIcon: IconDef = IconDef("icons/Memory")
|
||||
val ServerIcon: IconDef = IconDef("icons/Server")
|
||||
val ComponentBusIcon: IconDef = IconDef("icons/ComponentBus")
|
||||
|
||||
val TierIcon: Tier => IconDef = { tier =>
|
||||
IconDef(s"icons/Tier${tier.id}")
|
||||
}
|
||||
|
||||
val NotificationIcon: NotificationType => IconDef = { notificationType =>
|
||||
IconDef(s"icons/Notification$notificationType", 4)
|
||||
}
|
||||
|
||||
val SettingsSound: IconDef = IconDef("icons/SettingsSound")
|
||||
val SettingsUI: IconDef = IconDef("icons/SettingsUI")
|
||||
|
||||
// Items
|
||||
val Cpu: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/CPU${tier.id}")
|
||||
}
|
||||
|
||||
val Apu: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/APU${tier.id}", animation = Some(Animations.Apu))
|
||||
}
|
||||
|
||||
val GraphicsCard: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/GraphicsCard${tier.id}")
|
||||
}
|
||||
|
||||
val NetworkCard: IconDef = IconDef("items/NetworkCard")
|
||||
|
||||
val WirelessNetworkCard: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/WirelessNetworkCard${tier.id}")
|
||||
}
|
||||
|
||||
val LinkedCard: IconDef = IconDef("items/LinkedCard", animation = Some(Animations.LinkedCard))
|
||||
|
||||
val InternetCard: IconDef = IconDef("items/InternetCard", animation = Some(Animations.InternetCard))
|
||||
|
||||
val RedstoneCard: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/RedstoneCard${tier.id}")
|
||||
}
|
||||
|
||||
val DataCard: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/DataCard${tier.id}", animation = Some(Animations.DataCard))
|
||||
}
|
||||
|
||||
val SoundCard: IconDef = IconDef("items/SoundCard", animation = Some(Animations.DataCard))
|
||||
|
||||
val SelfDestructingCard: IconDef = IconDef("items/SelfDestructingCard", animation = Some(Animations.SelfDestructingCard))
|
||||
|
||||
val HardDiskDrive: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/HardDiskDrive${tier.id}")
|
||||
}
|
||||
|
||||
val Eeprom: IconDef = IconDef("items/EEPROM")
|
||||
|
||||
val FloppyDisk: DyeColor => IconDef = { color =>
|
||||
IconDef(s"items/FloppyDisk_${color.name}")
|
||||
}
|
||||
|
||||
val Memory: ExtendedTier => IconDef = { tier =>
|
||||
IconDef(s"items/Memory${tier.id}")
|
||||
}
|
||||
|
||||
val Server: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/Server${tier.id}")
|
||||
}
|
||||
|
||||
val ComponentBus: Tier => IconDef = { tier =>
|
||||
IconDef(s"items/ComponentBus${tier.id}")
|
||||
}
|
||||
|
||||
val DiskDriveMountable: IconDef = IconDef("items/DiskDriveMountable")
|
||||
|
||||
//noinspection ScalaWeakerAccess
|
||||
object Animations {
|
||||
val Apu: Animation = Array(
|
||||
(0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f),
|
||||
(4, 3f), (3, 3f), (2, 3f), (1, 3f), (0, 3f))
|
||||
|
||||
val LinkedCard: Animation =
|
||||
Array((0, 3f), (1, 3f), (2, 3f), (3, 3f), (4, 3f), (5, 3f))
|
||||
|
||||
val InternetCard: Animation = Array(
|
||||
(0, 2f), (1, 7f), (0, 5f), (1, 4f), (0, 7f), (1, 2f), (0, 8f),
|
||||
(1, 9f), (0, 6f), (1, 4f))
|
||||
|
||||
val DataCard: Animation = Array(
|
||||
(0, 4f), (1, 4f), (2, 4f), (3, 4f), (4, 4f), (5, 4f), (6, 4f), (7, 4f))
|
||||
|
||||
val SelfDestructingCard: Animation = Array((0, 4f), (1, 4f))
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,7 @@ package ocelot.desktop.inventory
|
||||
|
||||
import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.event.EventAware
|
||||
import ocelot.desktop.ui.widget.Updatable
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
@ -64,7 +64,7 @@ trait Item extends EventAware with Updatable with Disposable {
|
||||
/**
|
||||
* The icon used to draw the item in a slot.
|
||||
*/
|
||||
def icon: IconDef = factory.icon
|
||||
def icon: IconSource = factory.icon
|
||||
|
||||
/**
|
||||
* The tier of the item (if it has one).
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory
|
||||
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
/**
|
||||
@ -45,7 +45,7 @@ trait ItemFactory {
|
||||
*
|
||||
* Used by the [[ocelot.desktop.ui.widget.slot.ItemChooser ItemChooser]] in its entries.
|
||||
*/
|
||||
def icon: IconDef
|
||||
def icon: IconSource
|
||||
|
||||
/**
|
||||
* Constructs a new item instance.
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory
|
||||
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.item._
|
||||
import ocelot.desktop.util.Logging
|
||||
import ocelot.desktop.util.ReflectionUtils.linearizationOrder
|
||||
@ -60,7 +60,7 @@ object Items extends Logging {
|
||||
}
|
||||
}
|
||||
|
||||
def registerArbitrary(name: String, icon: IconDef, factories: IterableOnce[(String, ItemFactory)]): Unit = {
|
||||
def registerArbitrary(name: String, icon: IconSource, factories: IterableOnce[(String, ItemFactory)]): Unit = {
|
||||
val group = ArbitraryItemGroup(name, icon, factories.iterator.toSeq)
|
||||
_groups += group
|
||||
|
||||
@ -93,7 +93,7 @@ object Items extends Logging {
|
||||
|
||||
case class ExtendedTieredItemGroup(name: String, factories: Seq[(ExtendedTier, ItemFactory)]) extends ItemGroup
|
||||
|
||||
case class ArbitraryItemGroup(name: String, icon: IconDef, factories: Seq[(String, ItemFactory)]) extends ItemGroup
|
||||
case class ArbitraryItemGroup(name: String, icon: IconSource, factories: Seq[(String, ItemFactory)]) extends ItemGroup
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ import ocelot.desktop.OcelotDesktop
|
||||
import ocelot.desktop.inventory.PersistedInventory.ItemLoadException
|
||||
import ocelot.desktop.inventory.SyncedInventory.SlotStatus.SlotStatus
|
||||
import ocelot.desktop.inventory.SyncedInventory.SyncDirection.SyncDirection
|
||||
import ocelot.desktop.inventory.SyncedInventory.{SyncDirection, _}
|
||||
import ocelot.desktop.inventory.SyncedInventory._
|
||||
import ocelot.desktop.inventory.traits.ComponentItem
|
||||
import ocelot.desktop.ui.event.BrainEvent
|
||||
import ocelot.desktop.ui.widget.EventHandlers
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, CpuLikeItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.APU
|
||||
@ -26,7 +26,7 @@ object ApuItem {
|
||||
// we keep the latter tier internally and increment it when dealing with the rest of the world
|
||||
override def tier: Option[Tier] = Some(_tier.saturatingAdd(1))
|
||||
|
||||
override def icon: IconDef = Icons.Apu(_tier)
|
||||
override def icon: IconSource = IconSource.Apu(_tier)
|
||||
|
||||
override def build(): ApuItem = new ApuItem(new APU(_tier))
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.ComponentItem
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.ComponentBus
|
||||
@ -25,7 +25,7 @@ object ComponentBusItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(_tier)
|
||||
|
||||
override def icon: IconDef = Icons.ComponentBus(_tier)
|
||||
override def icon: IconSource = IconSource.ComponentBus(_tier)
|
||||
|
||||
override def build(): ComponentBusItem = new ComponentBusItem(new ComponentBus(_tier))
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, CpuLikeItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.CPU
|
||||
@ -23,7 +23,7 @@ object CpuItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(_tier)
|
||||
|
||||
override def icon: IconDef = Icons.Cpu(_tier)
|
||||
override def icon: IconSource = IconSource.Cpu(_tier)
|
||||
|
||||
override def build(): CpuItem = new CpuItem(new CPU(_tier))
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.DataCard
|
||||
@ -14,7 +14,7 @@ object DataCardItem {
|
||||
abstract class Factory extends ItemFactory {
|
||||
override def name: String = s"Data Card (${tier.get.label})"
|
||||
|
||||
override def icon: IconDef = Icons.DataCard(tier.get)
|
||||
override def icon: IconSource = IconSource.DataCard(tier.get)
|
||||
}
|
||||
|
||||
class Tier1(val dataCard: DataCard.Tier1) extends DataCardItem {
|
||||
|
||||
@ -1,9 +1,8 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.util.DiskDriveAware
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, RackMountable}
|
||||
import totoro.ocelot.brain.entity.{DiskDriveMountable, FloppyDiskDrive}
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
@ -27,7 +26,7 @@ object DiskDriveMountableItem {
|
||||
|
||||
override def name: String = "Disk drive"
|
||||
|
||||
override def icon: IconDef = Icons.DiskDriveMountable
|
||||
override def icon: IconSource = IconSource.DiskDriveMountable
|
||||
|
||||
override def build(): DiskDriveMountableItem = new DiskDriveMountableItem(new DiskDriveMountable())
|
||||
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.OcelotDesktop
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.InputDialog
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.tooltip.ItemTooltip
|
||||
import totoro.ocelot.brain.entity.EEPROM
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, Environment}
|
||||
@ -32,47 +32,39 @@ class EepromItem(val eeprom: EEPROM) extends Item with ComponentItem with Persis
|
||||
}
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(
|
||||
new ContextMenuSubmenu("External data source") {
|
||||
addEntry(
|
||||
ContextMenuEntry("Local file") {
|
||||
OcelotDesktop.showFileChooserDialog(JFileChooser.OPEN_DIALOG, JFileChooser.FILES_ONLY) { file =>
|
||||
Try {
|
||||
for (file <- file) {
|
||||
eeprom.codePath = Some(file.toPath)
|
||||
}
|
||||
}
|
||||
menu.addEntry(new ContextMenuSubmenu("External data source", Some(ContextMenuIcon(IconSource.Code))) {
|
||||
addEntry(ContextMenuEntry("Local file", IconSource.File) {
|
||||
OcelotDesktop.showFileChooserDialog(JFileChooser.OPEN_DIALOG, JFileChooser.FILES_ONLY) { file =>
|
||||
Try {
|
||||
for (file <- file) {
|
||||
eeprom.codePath = Some(file.toPath)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
addEntry(
|
||||
ContextMenuEntry("File via URL") {
|
||||
new InputDialog(
|
||||
title = "File via URL",
|
||||
onConfirmed = { text =>
|
||||
eeprom.codeURL = Some(new URL(text))
|
||||
},
|
||||
inputValidator = text =>
|
||||
try {
|
||||
new URL(text)
|
||||
true
|
||||
} catch {
|
||||
case _: MalformedURLException => false
|
||||
},
|
||||
).show()
|
||||
}
|
||||
)
|
||||
|
||||
if (eeprom.codePath.nonEmpty || eeprom.codeURL.nonEmpty) {
|
||||
addEntry(
|
||||
ContextMenuEntry("Detach") {
|
||||
eeprom.codeBytes = Some(Array.empty)
|
||||
}
|
||||
)
|
||||
}
|
||||
})
|
||||
|
||||
addEntry(ContextMenuEntry("File via URL", IconSource.Link) {
|
||||
new InputDialog(
|
||||
title = "File via URL",
|
||||
onConfirmed = { text =>
|
||||
eeprom.codeURL = Some(new URL(text))
|
||||
},
|
||||
inputValidator = text =>
|
||||
try {
|
||||
new URL(text)
|
||||
true
|
||||
} catch {
|
||||
case _: MalformedURLException => false
|
||||
},
|
||||
).show()
|
||||
})
|
||||
|
||||
if (eeprom.codePath.nonEmpty || eeprom.codeURL.nonEmpty) {
|
||||
addEntry(ContextMenuEntry("Detach", IconSource.LinkSlash) {
|
||||
eeprom.codeBytes = Some(Array.empty)
|
||||
})
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
@ -92,7 +84,7 @@ object EepromItem {
|
||||
|
||||
override def tier: Option[Tier] = None
|
||||
|
||||
override def icon: IconDef = Icons.Eeprom
|
||||
override def icon: IconSource = IconSource.Eeprom
|
||||
|
||||
override def recoverers: Iterable[ItemRecoverer[_, _]] = Some(ItemRecoverer(new EepromItem(_)))
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, DiskItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
@ -65,7 +65,7 @@ class FloppyItem(var floppy: Floppy) extends Item with ComponentItem with Persis
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
floppy match {
|
||||
case floppy: FloppyManaged => addSetDirectoryEntry(menu, floppy)
|
||||
case floppy: FloppyManaged => addRealPathContextMenuEntries(menu, floppy)
|
||||
case _ => // unmanaged floppies don't need any special entries
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ object FloppyItem {
|
||||
|
||||
override def tier: Option[Tier] = None
|
||||
|
||||
override def icon: IconDef = Icons.FloppyDisk(color)
|
||||
override def icon: IconSource = IconSource.FloppyDisk(color)
|
||||
|
||||
override def recoverers: Iterable[ItemRecoverer[_, _]] = Some(ItemRecoverer(new FloppyItem(_)))
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.GraphicsCard
|
||||
@ -21,7 +21,7 @@ object GraphicsCardItem {
|
||||
|
||||
override def name: String = s"Graphics Card (${_tier.label})"
|
||||
override def tier: Option[Tier] = Some(_tier)
|
||||
override def icon: IconDef = Icons.GraphicsCard(_tier)
|
||||
override def icon: IconSource = IconSource.GraphicsCard(_tier)
|
||||
|
||||
override def build(): GraphicsCardItem = new GraphicsCardItem(new GraphicsCard(_tier))
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.item.HddItem.Hdd
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, DiskItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
@ -64,10 +64,11 @@ class HddItem(var hdd: Hdd) extends Item with ComponentItem with PersistableItem
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
hdd match {
|
||||
case Hdd.Managed(hdd) =>
|
||||
addSetDirectoryEntry(menu, hdd)
|
||||
addRealPathContextMenuEntries(menu, hdd)
|
||||
|
||||
case _ => // unmanaged HDDs don't need any special entries
|
||||
}
|
||||
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
@ -87,7 +88,7 @@ object HddItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(_tier)
|
||||
|
||||
override def icon: IconDef = Icons.HardDiskDrive(_tier)
|
||||
override def icon: IconSource = IconSource.HardDiskDrive(_tier)
|
||||
|
||||
override def build(): HddItem = new HddItem(
|
||||
if (managed) Hdd(new HDDManaged(_tier)) else Hdd(new HDDUnmanaged(_tier))
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.InternetCard
|
||||
@ -24,7 +24,7 @@ object InternetCardItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(Tier.Two)
|
||||
|
||||
override def icon: IconDef = Icons.InternetCard
|
||||
override def icon: IconSource = IconSource.InternetCard
|
||||
|
||||
override def build(): InternetCardItem = new InternetCardItem(new InternetCard)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.TunnelDialog
|
||||
@ -22,7 +22,7 @@ class LinkedCardItem(val linkedCard: LinkedCard) extends Item with ComponentItem
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Set channel") {
|
||||
ContextMenuEntry("Set channel", IconSource.Antenna) {
|
||||
new TunnelDialog(
|
||||
tunnel => linkedCard.tunnel = tunnel,
|
||||
linkedCard.tunnel,
|
||||
@ -45,7 +45,7 @@ object LinkedCardItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(Tier.Three)
|
||||
|
||||
override def icon: IconDef = Icons.LinkedCard
|
||||
override def icon: IconSource = IconSource.LinkedCard
|
||||
|
||||
override def build(): LinkedCardItem = new LinkedCardItem(new LinkedCard)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.Memory
|
||||
@ -24,7 +24,7 @@ object MemoryItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(memoryTier.toTier)
|
||||
|
||||
override def icon: IconDef = Icons.Memory(memoryTier)
|
||||
override def icon: IconSource = IconSource.Memory(memoryTier)
|
||||
|
||||
override def build(): MemoryItem = new MemoryItem(new Memory(memoryTier))
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.NetworkCard
|
||||
@ -22,7 +22,7 @@ object NetworkCardItem {
|
||||
|
||||
override def name: String = "Network Card"
|
||||
override def tier: Option[Tier] = Some(Tier.One)
|
||||
override def icon: IconDef = Icons.NetworkCard
|
||||
override def icon: IconSource = IconSource.NetworkCard
|
||||
|
||||
override def build(): NetworkCardItem = new NetworkCardItem(new NetworkCard)
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ import ocelot.desktop.inventory.Item
|
||||
import ocelot.desktop.inventory.traits.ComponentItem
|
||||
import ocelot.desktop.node.nodes.RackNode
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
import totoro.ocelot.brain.entity.{Rack, result}
|
||||
import totoro.ocelot.brain.entity.result
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, RackMountable}
|
||||
|
||||
trait RackMountableItem
|
||||
|
||||
@ -1,39 +1,41 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem, WindowProvider}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.card.{Redstone1Window, Redstone2Window}
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.tooltip.ItemTooltip
|
||||
import ocelot.desktop.ui.widget.window.Window
|
||||
import ocelot.desktop.ui.widget.window.{Window, Windowed}
|
||||
import totoro.ocelot.brain.entity.Redstone
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, Environment}
|
||||
import totoro.ocelot.brain.util.Tier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
abstract class RedstoneCardItem extends Item with ComponentItem with PersistableItem with CardItem
|
||||
abstract class RedstoneCardItem extends Item with ComponentItem with PersistableItem with CardItem with Windowed {
|
||||
def windowContextMenuEntryName: String
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(ContextMenuEntry(windowContextMenuEntryName, IconSource.Window) {
|
||||
window.get.open()
|
||||
})
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
}
|
||||
|
||||
object RedstoneCardItem {
|
||||
abstract class Factory extends ItemFactory {
|
||||
override def name: String = s"Redstone Card (${tier.get.label})"
|
||||
|
||||
override def icon: IconDef = Icons.RedstoneCard(tier.get)
|
||||
override def icon: IconSource = IconSource.RedstoneCard(tier.get)
|
||||
}
|
||||
|
||||
class Tier1(val redstoneCard: Redstone.Tier1) extends RedstoneCardItem {
|
||||
private val redstoneIoWindow: WindowProvider = new WindowProvider {
|
||||
override def windowEntryLabel: String = "Redstone I/O"
|
||||
|
||||
override def makeWindow(): Window = new Redstone1Window(redstoneCard)
|
||||
}
|
||||
|
||||
override def component: Entity with Environment = redstoneCard
|
||||
|
||||
protected def addWindowEntries(menu: ContextMenu): Unit = {
|
||||
redstoneIoWindow.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
override def fillTooltip(tooltip: ItemTooltip): Unit = {
|
||||
super.fillTooltip(tooltip)
|
||||
|
||||
@ -42,12 +44,11 @@ object RedstoneCardItem {
|
||||
}
|
||||
}
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
addWindowEntries(menu)
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
override def factory: Factory = RedstoneCardItem.Tier1.Factory
|
||||
|
||||
private lazy val _window = new Redstone1Window(redstoneCard)
|
||||
override def window: Option[Window] = Some(_window)
|
||||
override def windowContextMenuEntryName: String = "Redstone I/O"
|
||||
}
|
||||
|
||||
object Tier1 {
|
||||
@ -65,20 +66,13 @@ object RedstoneCardItem {
|
||||
}
|
||||
|
||||
class Tier2(override val redstoneCard: Redstone.Tier2) extends RedstoneCardItem.Tier1(redstoneCard) {
|
||||
private val bundledIoWindow: WindowProvider = new WindowProvider {
|
||||
override def windowEntryLabel: String = "Bundled I/O"
|
||||
|
||||
override def makeWindow(): Window = new Redstone2Window(redstoneCard)
|
||||
}
|
||||
|
||||
override def component: Entity with Environment = redstoneCard
|
||||
|
||||
override def addWindowEntries(menu: ContextMenu): Unit = {
|
||||
super.addWindowEntries(menu)
|
||||
bundledIoWindow.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
override def factory: Factory = RedstoneCardItem.Tier2.Factory
|
||||
|
||||
private lazy val _window = new Redstone2Window(redstoneCard)
|
||||
override def window: Option[Window] = Some(_window)
|
||||
override def windowContextMenuEntryName: String = "Bundled I/O"
|
||||
}
|
||||
|
||||
object Tier2 {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.SelfDestructingCard
|
||||
@ -29,7 +29,7 @@ object SelfDestructingCardItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(Tier.Two)
|
||||
|
||||
override def icon: IconDef = Icons.SelfDestructingCard
|
||||
override def icon: IconSource = IconSource.SelfDestructingCard
|
||||
|
||||
override def build(): SelfDestructingCardItem = new SelfDestructingCardItem(new SelfDestructingCard)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.slot._
|
||||
import ocelot.desktop.util.ComputerAware
|
||||
@ -113,7 +113,7 @@ object ServerItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(_tier)
|
||||
|
||||
override def icon: IconDef = Icons.Server(_tier)
|
||||
override def icon: IconSource = IconSource.Server(_tier)
|
||||
|
||||
override def build(): ServerItem = {
|
||||
val item = new ServerItem(new Server(_tier))
|
||||
|
||||
@ -1,27 +1,29 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem, WindowProvider}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.{CardItem, ComponentItem, PersistableItem}
|
||||
import ocelot.desktop.inventory.{Item, ItemFactory, ItemRecoverer}
|
||||
import ocelot.desktop.ui.widget.card.SoundCardWindow
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
import ocelot.desktop.ui.widget.window.Window
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.window.{Window, Windowed}
|
||||
import totoro.ocelot.brain.entity.sound_card.SoundCard
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, Environment}
|
||||
import totoro.ocelot.brain.util.Tier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class SoundCardItem(val soundCard: SoundCard) extends Item with ComponentItem with PersistableItem with CardItem {
|
||||
private val window = new WindowProvider {
|
||||
override def windowEntryLabel: String = "Open"
|
||||
|
||||
override def makeWindow(): Window = new SoundCardWindow(soundCard)
|
||||
}
|
||||
class SoundCardItem(val soundCard: SoundCard) extends Item with ComponentItem with PersistableItem with CardItem with Windowed {
|
||||
private lazy val _window = new SoundCardWindow(soundCard)
|
||||
override def window: Option[Window] = Some(_window)
|
||||
|
||||
override def component: Entity with Environment = soundCard
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
window.fillRmbMenu(menu)
|
||||
menu.addEntry(ContextMenuEntry("Open card interface", IconSource.Window) {
|
||||
window.get.open()
|
||||
})
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
@ -38,7 +40,7 @@ object SoundCardItem {
|
||||
|
||||
override def tier: Option[Tier] = Some(Tier.Two)
|
||||
|
||||
override def icon: IconDef = Icons.SoundCard
|
||||
override def icon: IconSource = IconSource.SoundCard
|
||||
|
||||
override def build(): SoundCardItem = new SoundCardItem(new SoundCard)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.inventory.item
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.{ItemFactory, ItemRecoverer}
|
||||
import totoro.ocelot.brain.entity.WirelessNetworkCard
|
||||
import totoro.ocelot.brain.util.Tier
|
||||
@ -14,7 +14,7 @@ object WirelessNetworkCardItem {
|
||||
abstract class Factory extends ItemFactory {
|
||||
override def name: String = s"Wireless Net. Card (${tier.get.label})"
|
||||
|
||||
override def icon: IconDef = Icons.WirelessNetworkCard(tier.get)
|
||||
override def icon: IconSource = IconSource.WirelessNetworkCard(tier.get)
|
||||
}
|
||||
|
||||
class Tier1(override val card: WirelessNetworkCard.Tier1) extends WirelessNetworkCardItem(card) {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package ocelot.desktop.inventory.traits
|
||||
|
||||
import ocelot.desktop.OcelotDesktop
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Item
|
||||
import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
@ -58,7 +59,7 @@ trait ComponentItem extends Item with PersistableItem {
|
||||
}
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(ContextMenuEntry("Copy address") {
|
||||
menu.addEntry(ContextMenuEntry("Copy address", IconSource.Copy) {
|
||||
UiHandler.clipboard = component.node.address
|
||||
})
|
||||
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
package ocelot.desktop.inventory.traits
|
||||
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Item
|
||||
import ocelot.desktop.inventory.traits.CpuLikeItem.CpuArchitectureChangedNotification
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu}
|
||||
import totoro.ocelot.brain.entity.machine.MachineAPI
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, GenericCPU}
|
||||
|
||||
@ -13,7 +14,7 @@ trait CpuLikeItem extends ComponentItem {
|
||||
override def component: Entity with GenericCPU
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(new ContextMenuSubmenu("Set architecture") {
|
||||
menu.addEntry(new ContextMenuSubmenu("Set architecture", Some(ContextMenuIcon(IconSource.Microchip))) {
|
||||
for (arch <- component.allArchitectures) {
|
||||
val name = MachineAPI.getArchitectureName(arch) +
|
||||
(if (arch == component.architecture) " (current)" else "")
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
package ocelot.desktop.inventory.traits
|
||||
|
||||
import ocelot.desktop.OcelotDesktop
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.widget.DiskEditWindow
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.tooltip.ItemTooltip
|
||||
import ocelot.desktop.ui.widget.window.Window
|
||||
import ocelot.desktop.ui.widget.window.{Window, Windowed}
|
||||
import totoro.ocelot.brain.entity.traits.{Disk, DiskManaged, DiskUnmanaged, Entity}
|
||||
import totoro.ocelot.brain.util.DyeColor
|
||||
|
||||
@ -14,7 +15,7 @@ import scala.util.Try
|
||||
/**
|
||||
* A utility mixin for HDDs and floppies.
|
||||
*/
|
||||
trait DiskItem extends ComponentItem {
|
||||
trait DiskItem extends ComponentItem with Windowed {
|
||||
override def component: Entity with Disk
|
||||
|
||||
def diskKind: String
|
||||
@ -35,33 +36,44 @@ trait DiskItem extends ComponentItem {
|
||||
component.setLocked(OcelotDesktop.player.nickname)
|
||||
}
|
||||
|
||||
protected def addSetDirectoryEntry(menu: ContextMenu, disk: DiskManaged): Unit = {
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Set directory") {
|
||||
OcelotDesktop.showFileChooserDialog(JFileChooser.OPEN_DIALOG, JFileChooser.DIRECTORIES_ONLY) { dir =>
|
||||
Try {
|
||||
for (dir <- dir) {
|
||||
reinserting {
|
||||
// trigger component_removed / component_added signals
|
||||
disk.customRealPath = Some(dir.toPath.toAbsolutePath)
|
||||
}
|
||||
protected def addRealPathContextMenuEntries(menu: ContextMenu, disk: DiskManaged): Unit = {
|
||||
menu.addEntry(ContextMenuEntry(
|
||||
if (disk.customRealPath.isDefined) "Change directory" else "Set directory",
|
||||
IconSource.Folder
|
||||
) {
|
||||
OcelotDesktop.showFileChooserDialog(JFileChooser.OPEN_DIALOG, JFileChooser.DIRECTORIES_ONLY) { dir =>
|
||||
Try {
|
||||
for (dir <- dir) {
|
||||
reinserting {
|
||||
// trigger component_removed / component_added signals
|
||||
disk.customRealPath = Some(dir.toPath.toAbsolutePath)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
// TODO: unset directory?????? anyone?
|
||||
if (disk.customRealPath.isDefined) {
|
||||
menu.addEntry( ContextMenuEntry("Reset directory", IconSource.FolderSlash) {
|
||||
reinserting {
|
||||
// trigger component_removed / component_added signals
|
||||
disk.customRealPath = None
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private val editWindow = new WindowProvider {
|
||||
override def windowEntryLabel: String = "Edit"
|
||||
private lazy val _window = new DiskEditWindow(DiskItem.this)
|
||||
|
||||
override def makeWindow(): Window = new DiskEditWindow(DiskItem.this)
|
||||
}
|
||||
override def window: Option[Window] = Some(_window)
|
||||
|
||||
override def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
editWindow.fillRmbMenu(menu)
|
||||
menu.addEntry(ContextMenuEntry("Edit disk", IconSource.Edit) {
|
||||
window.get.open()
|
||||
})
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
super.fillRmbMenu(menu)
|
||||
}
|
||||
|
||||
|
||||
@ -1,25 +0,0 @@
|
||||
package ocelot.desktop.inventory.traits
|
||||
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.window.Window
|
||||
|
||||
/**
|
||||
* Potentially manages the windows of an [[ocelot.desktop.inventory.Item Item]] that has them (e.g., the sound card).
|
||||
* Though at the moment it just provides a convenient way to add an entry to the item's context menu
|
||||
* for opening a window.
|
||||
*/
|
||||
trait WindowProvider {
|
||||
def windowEntryLabel: String
|
||||
|
||||
def makeWindow(): Window
|
||||
|
||||
def fillRmbMenu(menu: ContextMenu): Unit = {
|
||||
// TODO: disable the entry while the window is open
|
||||
// TODO: serialize the window
|
||||
menu.addEntry(
|
||||
ContextMenuEntry(windowEntryLabel) {
|
||||
makeWindow().open()
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
@ -9,7 +9,7 @@ import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.event.BrainEvent
|
||||
import ocelot.desktop.ui.event.handlers.DiskActivityHandler
|
||||
import ocelot.desktop.ui.widget.ComputerErrorMessageLabel
|
||||
import ocelot.desktop.util.{Logging, Messages}
|
||||
import ocelot.desktop.util.Messages
|
||||
import totoro.ocelot.brain.Settings
|
||||
import totoro.ocelot.brain.entity.traits.{Entity, Environment, WorkspaceAware}
|
||||
import totoro.ocelot.brain.event._
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package ocelot.desktop.node
|
||||
|
||||
import ocelot.desktop.OcelotDesktop
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.event.ClickEvent
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
@ -34,7 +35,7 @@ abstract class EntityNode(val entity: Entity with Environment) extends Node {
|
||||
override def setupContextMenu(menu: ContextMenu, event: ClickEvent): Unit = {
|
||||
if (exposeAddress && entity.node != null && entity.node.address != null) {
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Copy address") {
|
||||
ContextMenuEntry("Copy address", IconSource.Copy) {
|
||||
UiHandler.clipboard = entity.node.address
|
||||
}
|
||||
)
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
package ocelot.desktop.node
|
||||
|
||||
import ocelot.desktop.color.RGBAColor
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.event.ClickEvent
|
||||
import ocelot.desktop.ui.widget.InputDialog
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
@ -26,7 +26,7 @@ trait LabeledNode extends Node {
|
||||
}
|
||||
|
||||
override def setupContextMenu(menu: ContextMenu, event: ClickEvent): Unit = {
|
||||
menu.addEntry(ContextMenuEntry("Set label") {
|
||||
menu.addEntry(ContextMenuEntry("Set label", IconSource.Label) {
|
||||
new InputDialog(
|
||||
"Set label",
|
||||
text => {
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
package ocelot.desktop.node
|
||||
|
||||
import ocelot.desktop.audio.SoundSource
|
||||
import ocelot.desktop.color.{Color, RGBAColor}
|
||||
import ocelot.desktop.geometry.{Rect2D, Size2D, Vector2D}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.node.Node._
|
||||
import ocelot.desktop.ui.event.handlers.{ClickHandler, DragHandler, HoverHandler}
|
||||
import ocelot.desktop.ui.event.{ClickEvent, DragEvent, HoverEvent, MouseEvent}
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.window.Windowed
|
||||
import ocelot.desktop.ui.widget.{Widget, WorkspaceView}
|
||||
import ocelot.desktop.util.Disposable
|
||||
import ocelot.desktop.util.animation.ColorAnimation
|
||||
import org.lwjgl.input.Keyboard
|
||||
import totoro.ocelot.brain.nbt.NBTTagCompound
|
||||
@ -88,18 +88,14 @@ abstract class Node extends Widget with DragHandler with ClickHandler with Hover
|
||||
|
||||
def setupContextMenu(menu: ContextMenu, event: ClickEvent): Unit = {
|
||||
if (ports.nonEmpty) {
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Disconnect") {
|
||||
disconnectFromAll()
|
||||
}
|
||||
)
|
||||
menu.addEntry(ContextMenuEntry("Disconnect", IconSource.LinkSlash, SoundSource.InterfaceClickLow) {
|
||||
disconnectFromAll()
|
||||
})
|
||||
}
|
||||
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Delete") {
|
||||
destroy()
|
||||
}
|
||||
)
|
||||
menu.addEntry(ContextMenuEntry("Remove", IconSource.Delete, SoundSource.InterfaceClickLow) {
|
||||
destroy()
|
||||
})
|
||||
}
|
||||
|
||||
override def update(): Unit = {
|
||||
@ -290,10 +286,10 @@ abstract class Node extends Widget with DragHandler with ClickHandler with Hover
|
||||
}
|
||||
|
||||
override def dispose(): Unit = {
|
||||
super.dispose()
|
||||
|
||||
disconnectFromAll()
|
||||
window.foreach(_.closeAndDispose())
|
||||
|
||||
super.dispose()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2,18 +2,15 @@ package ocelot.desktop.node.nodes
|
||||
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.inventory.SyncedInventory
|
||||
import ocelot.desktop.node.ComputerAwareNode
|
||||
import ocelot.desktop.node.Node.HighlightThickness
|
||||
import ocelot.desktop.ui.event.ClickEvent
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
import ocelot.desktop.ui.widget.slot._
|
||||
import ocelot.desktop.util.{ComputerAware, DrawUtils, TierColor}
|
||||
import ocelot.desktop.windows.ComputerWindow
|
||||
import totoro.ocelot.brain.entity.Case
|
||||
import totoro.ocelot.brain.entity.traits.{Computer, Inventory, TieredPersistable}
|
||||
import totoro.ocelot.brain.entity.traits.Inventory
|
||||
import totoro.ocelot.brain.util.Tier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class ComputerNode(val computerCase: Case)
|
||||
extends ComputerAwareNode(computerCase)
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package ocelot.desktop.node.nodes
|
||||
|
||||
import ocelot.desktop.geometry.{Rect2D, Size2D, Vector2D}
|
||||
import ocelot.desktop.graphics.{Graphics, Icons}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.inventory.Item
|
||||
import ocelot.desktop.inventory.item.{DiskDriveMountableItem, RackMountableItem, ServerItem}
|
||||
import ocelot.desktop.inventory.{Item, SyncedInventory}
|
||||
import ocelot.desktop.node.Node.{HighlightThickness, NoHighlightSize, Size, TexelCount}
|
||||
import ocelot.desktop.node.{ComputerAwareNode, NodePort}
|
||||
import ocelot.desktop.ui.event.ClickEvent
|
||||
@ -12,7 +12,7 @@ import ocelot.desktop.ui.widget.window.Window
|
||||
import ocelot.desktop.util.DrawUtils
|
||||
import ocelot.desktop.windows.RackWindow
|
||||
import totoro.ocelot.brain.entity.Rack
|
||||
import totoro.ocelot.brain.entity.traits.{ComponentInventory, Environment, Inventory, RackMountable, WorkspaceAware}
|
||||
import totoro.ocelot.brain.entity.traits.{ComponentInventory, Environment, Inventory, RackMountable}
|
||||
import totoro.ocelot.brain.network
|
||||
import totoro.ocelot.brain.util.Direction
|
||||
|
||||
@ -108,7 +108,7 @@ class RackNode(val rack: Rack)
|
||||
override def dispose(): Unit = {
|
||||
for (i <- 0 until 4) {
|
||||
Slot(i).get match {
|
||||
case Some(serverItem: ServerItem) => serverItem.dispose()
|
||||
case Some(serverItem: ServerItem) => serverItem.onRemoved()
|
||||
case _=>
|
||||
}
|
||||
}
|
||||
@ -174,17 +174,18 @@ object RackNode {
|
||||
def addContextMenuEntriesOfMountable(menu: ContextMenu, item: Option[RackMountableItem]): Unit = {
|
||||
item match {
|
||||
case Some(serverItem: ServerItem) =>
|
||||
menu.addEntry(ContextMenuEntry("Set up", IconSource.Window) {
|
||||
serverItem.window.get.open()
|
||||
})
|
||||
|
||||
if (serverItem.isInRack) {
|
||||
serverItem.addPowerContextMenuEntries(menu)
|
||||
menu.addSeparator()
|
||||
|
||||
serverItem.addPowerContextMenuEntries(menu)
|
||||
}
|
||||
|
||||
serverItem.addTierContextMenuEntries(menu)
|
||||
|
||||
menu.addEntry(ContextMenuEntry("Configure server") {
|
||||
serverItem.window.get.open()
|
||||
})
|
||||
|
||||
menu.addSeparator()
|
||||
|
||||
case Some(diskDriveMountableItem: DiskDriveMountableItem) =>
|
||||
|
||||
@ -2,7 +2,7 @@ package ocelot.desktop.node.nodes
|
||||
|
||||
import ocelot.desktop.color.{Color, IntColor}
|
||||
import ocelot.desktop.geometry.{Rect2D, Size2D}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.node.Node.{HighlightThickness, NoHighlightSize, Size}
|
||||
import ocelot.desktop.node.nodes.ScreenNode.{BorderSize, FontHeight, FontWidth}
|
||||
import ocelot.desktop.node.{EntityNode, LabeledEntityNode}
|
||||
@ -66,11 +66,11 @@ class ScreenNode(val screen: Screen) extends EntityNode(screen) with LabeledEnti
|
||||
|
||||
override def setupContextMenu(menu: ContextMenu, event: ClickEvent): Unit = {
|
||||
if (screen.getPowerState)
|
||||
menu.addEntry(ContextMenuEntry("Turn off") { screen.setPowerState(false) })
|
||||
menu.addEntry(ContextMenuEntry("Turn off", IconSource.Power) { screen.setPowerState(false) })
|
||||
else
|
||||
menu.addEntry(ContextMenuEntry("Turn on") { screen.setPowerState(true) })
|
||||
menu.addEntry(ContextMenuEntry("Turn on", IconSource.Power) { screen.setPowerState(true) })
|
||||
|
||||
menu.addEntry(ContextMenuEntry("Set aspect ratio") {
|
||||
menu.addEntry(ContextMenuEntry("Set aspect ratio", IconSource.AspectRatio) {
|
||||
new ScreenAspectRatioDialog(this).show()
|
||||
})
|
||||
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package ocelot.desktop.ui
|
||||
|
||||
import buildinfo.BuildInfo
|
||||
import ocelot.desktop.audio.{Audio, SoundBuffers}
|
||||
import ocelot.desktop.geometry.{Rect2D, Size2D, Vector2D}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
|
||||
@ -51,6 +51,7 @@ class Checkbox(val label: String, val initialValue: Boolean = false, val isSmall
|
||||
DrawUtils.ring(g, position.x, position.y, boxSize, boxSize, 2, ColorScheme("CheckboxBorder"))
|
||||
|
||||
g.background = Color.Transparent
|
||||
|
||||
if (checked) {
|
||||
g.line(position.x + 1, position.y + boxSize / 2 + 1,
|
||||
position.x + boxSize / 4 + 1, position.y + boxSize / 4 * 3 + 1, 3, ColorScheme("CheckboxForeground"))
|
||||
|
||||
@ -3,14 +3,14 @@ package ocelot.desktop.ui.widget
|
||||
import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.Icons
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.DiskItem
|
||||
import ocelot.desktop.ui.layout.{AlignItems, LinearLayout}
|
||||
import ocelot.desktop.ui.widget.DiskEditWindow.{ColorNames, Units}
|
||||
import ocelot.desktop.ui.widget.DiskEditWindow.Units
|
||||
import ocelot.desktop.ui.widget.window.PanelWindow
|
||||
import ocelot.desktop.util.FuncUtils.composeN
|
||||
import ocelot.desktop.util.Orientation
|
||||
import ocelot.desktop.util.animation.ColorAnimation
|
||||
import ocelot.desktop.util.{DiskDriveAware, Orientation}
|
||||
import totoro.ocelot.brain.entity.traits.{DiskManaged, DiskUnmanaged}
|
||||
import totoro.ocelot.brain.util.DyeColor
|
||||
|
||||
@ -92,13 +92,13 @@ class DiskEditWindow(item: DiskItem) extends PanelWindow {
|
||||
for (dyeColor <- row) {
|
||||
def isColorSelected: Boolean = dyeColor == item.color.get
|
||||
|
||||
val floppyIcon = Icons.FloppyDisk(dyeColor).icon
|
||||
val floppyIcon = IconSource.FloppyDisk(dyeColor).path
|
||||
children :+= new IconButton(
|
||||
floppyIcon,
|
||||
floppyIcon,
|
||||
mode = IconButton.Mode.Radio,
|
||||
drawBackground = true,
|
||||
tooltip = Some(ColorNames(dyeColor)),
|
||||
tooltip = Some(DiskDriveAware.ColorNames(dyeColor)),
|
||||
padding = 2,
|
||||
sizeMultiplier = 2f,
|
||||
model = IconButton.ReadOnlyModel(isColorSelected),
|
||||
@ -174,23 +174,4 @@ object DiskEditWindow {
|
||||
4 * 1024 -> "kiB",
|
||||
1024 * 1024 -> "MiB",
|
||||
)
|
||||
|
||||
private val ColorNames = Map(
|
||||
DyeColor.White -> "White",
|
||||
DyeColor.Orange -> "Orange",
|
||||
DyeColor.Magenta -> "Magenta",
|
||||
DyeColor.LightBlue -> "LightBlue",
|
||||
DyeColor.Yellow -> "Yellow",
|
||||
DyeColor.Lime -> "Lime",
|
||||
DyeColor.Pink -> "Pink",
|
||||
DyeColor.Gray -> "Gray",
|
||||
DyeColor.Silver -> "Silver",
|
||||
DyeColor.Cyan -> "Cyan",
|
||||
DyeColor.Purple -> "Purple",
|
||||
DyeColor.Blue -> "Blue",
|
||||
DyeColor.Brown -> "Brown",
|
||||
DyeColor.Green -> "Green",
|
||||
DyeColor.Red -> "Red",
|
||||
DyeColor.Black -> "Black",
|
||||
)
|
||||
}
|
||||
|
||||
@ -2,24 +2,24 @@ package ocelot.desktop.ui.widget
|
||||
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.Size2D
|
||||
import ocelot.desktop.graphics.{Graphics, IconDef}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.util.Spritesheet
|
||||
|
||||
class Icon(icon: IconDef) extends Widget {
|
||||
class Icon(icon: IconSource) extends Widget {
|
||||
def this(name: String) {
|
||||
this(IconDef(name))
|
||||
this(IconSource(name))
|
||||
}
|
||||
|
||||
def this(name: String, color: Color) {
|
||||
this(IconDef(name, color = color))
|
||||
def this(name: String, animation: IconSource.Animation) {
|
||||
this(IconSource(name, animation = Some(animation)))
|
||||
}
|
||||
|
||||
def this(name: String, animation: IconDef.Animation) {
|
||||
this(IconDef(name, animation = Some(animation)))
|
||||
}
|
||||
def iconColor: Color = Color.White
|
||||
def iconSize: Size2D = Spritesheet.spriteSize(icon.path)
|
||||
|
||||
override def minimumSize: Size2D = {
|
||||
val size = Spritesheet.spriteSize(icon.icon) * icon.sizeMultiplier
|
||||
val size = iconSize
|
||||
|
||||
icon.animation match {
|
||||
case None => size
|
||||
case Some(_) => size.copy(height = size.width)
|
||||
@ -29,6 +29,6 @@ class Icon(icon: IconDef) extends Widget {
|
||||
override def maximumSize: Size2D = minimumSize
|
||||
|
||||
override def draw(g: Graphics): Unit = {
|
||||
g.sprite(icon.icon, bounds.x, bounds.y, bounds.w, bounds.h, icon.color, icon.animation)
|
||||
g.sprite(icon.path, bounds.x, bounds.y, bounds.w, bounds.h, iconColor, icon.animation)
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,7 @@ package ocelot.desktop.ui.widget
|
||||
|
||||
import ocelot.desktop.audio.SoundSource
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.event.KeyEvent
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenuEntry, ContextMenuSubmenu}
|
||||
import ocelot.desktop.{ColorScheme, OcelotDesktop}
|
||||
@ -18,23 +18,25 @@ class MenuBar extends Widget {
|
||||
private def addEntry(w: Widget): Unit = entries.children :+= w
|
||||
|
||||
addEntry(new MenuBarSubmenu("File", menu => {
|
||||
menu.addEntry(ContextMenuEntry("New") { OcelotDesktop.newWorkspace() })
|
||||
menu.addEntry(ContextMenuEntry("Open") { OcelotDesktop.showOpenDialog() })
|
||||
menu.addEntry(ContextMenuEntry("Save") { OcelotDesktop.save() })
|
||||
menu.addEntry(ContextMenuEntry("Save as…") { OcelotDesktop.saveAs() })
|
||||
menu.addEntry(ContextMenuEntry("New", IconSource.Plus) { OcelotDesktop.newWorkspace() })
|
||||
menu.addEntry(ContextMenuEntry("Open", IconSource.Folder) { OcelotDesktop.showOpenDialog() })
|
||||
menu.addEntry(ContextMenuEntry("Save", IconSource.Save) { OcelotDesktop.save() })
|
||||
menu.addEntry(ContextMenuEntry("Save as", IconSource.SaveAs) { OcelotDesktop.saveAs() })
|
||||
|
||||
menu.addSeparator()
|
||||
menu.addEntry(ContextMenuEntry("Exit") { OcelotDesktop.exit() })
|
||||
|
||||
menu.addEntry(ContextMenuEntry("Exit", IconSource.Cross, SoundSource.InterfaceClickLow) { OcelotDesktop.exit() })
|
||||
}))
|
||||
|
||||
addEntry(new MenuBarSubmenu("Player", menu => {
|
||||
menu.addEntry(ContextMenuEntry("Add...") { OcelotDesktop.showAddPlayerDialog() })
|
||||
menu.addEntry(ContextMenuEntry("Create new", IconSource.Plus) { OcelotDesktop.showAddPlayerDialog() })
|
||||
menu.addSeparator()
|
||||
OcelotDesktop.players.foreach(player => {
|
||||
menu.addEntry(new ContextMenuSubmenu(
|
||||
(if (player == OcelotDesktop.players.head) "● " else " ") + player.nickname,
|
||||
() => OcelotDesktop.selectPlayer(player.nickname)
|
||||
s"${if (player == OcelotDesktop.players.head) "● " else " "}${player.nickname}",
|
||||
onClick = () => OcelotDesktop.selectPlayer(player.nickname)
|
||||
) {
|
||||
addEntry(ContextMenuEntry("Remove", sound = SoundSource.InterfaceClickLow) {
|
||||
addEntry(ContextMenuEntry("Remove", IconSource.Delete, SoundSource.InterfaceClickLow) {
|
||||
OcelotDesktop.removePlayer(player.nickname)
|
||||
})
|
||||
})
|
||||
|
||||
@ -3,11 +3,11 @@ package ocelot.desktop.ui.widget.component
|
||||
import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.Padding2D
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.layout.{AlignItems, Layout, LinearLayout}
|
||||
import ocelot.desktop.ui.widget.{Icon, Label, PaddingBox, Widget}
|
||||
|
||||
class ComponentSelectorEntry(label: String, icon: IconDef) extends Widget {
|
||||
class ComponentSelectorEntry(label: String, icon: IconSource) extends Widget {
|
||||
children :+= new Widget {
|
||||
override val layout: Layout = new LinearLayout(this, alignItems = AlignItems.Center)
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.audio.SoundSource
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.{Graphics, IconDef}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.event.handlers.{ClickHandler, HoverHandler}
|
||||
import ocelot.desktop.ui.event.{ClickEvent, HoverEvent, MouseEvent}
|
||||
import ocelot.desktop.ui.layout.{AlignItems, Layout, LinearLayout}
|
||||
@ -13,11 +13,11 @@ import ocelot.desktop.util.animation.ValueAnimation
|
||||
import ocelot.desktop.util.animation.easing.{EaseInQuad, EaseOutQuad}
|
||||
|
||||
class ContextMenuEntry(
|
||||
label: String,
|
||||
onClick: () => Unit = () => {},
|
||||
icon: Option[IconDef] = None,
|
||||
sound: SoundSource = SoundSource.InterfaceClick,
|
||||
soundDisabled: SoundSource = SoundSource.InterfaceClickLow
|
||||
label: String,
|
||||
icon: Option[ContextMenuIcon] = None,
|
||||
onClick: () => Unit = () => {},
|
||||
sound: SoundSource = SoundSource.InterfaceClick,
|
||||
soundDisabled: SoundSource = SoundSource.InterfaceClickLow
|
||||
) extends Widget
|
||||
with ClickHandler
|
||||
with HoverHandler
|
||||
@ -42,16 +42,26 @@ class ContextMenuEntry(
|
||||
|
||||
icon match {
|
||||
case Some(icon) =>
|
||||
children :+= new PaddingBox(new Icon(icon), Padding2D(left = 8f, right = 6f))
|
||||
children :+= new PaddingBox(
|
||||
new Icon(icon.source) {
|
||||
override def iconColor: Color = icon.color.getOrElse(ColorScheme("ContextMenuIcon"))
|
||||
|
||||
override def iconSize: Size2D = icon.size match {
|
||||
case ContextMenuIconSize.Normal => Size2D(16, 16)
|
||||
case _ => Size2D(32, 32)
|
||||
}
|
||||
},
|
||||
Padding2D(left = 8f, right = 8f)
|
||||
)
|
||||
case _ =>
|
||||
}
|
||||
|
||||
children :+= new PaddingBox(
|
||||
new Label {
|
||||
override def text: String = label
|
||||
|
||||
override def color: Color = ColorScheme("ContextMenuText")
|
||||
}, Padding2D(top = 3f, bottom = 3f)
|
||||
},
|
||||
Padding2D(top = 5f, bottom = 5f)
|
||||
)
|
||||
}, Padding2D(left = padLeft, right = 16f, top = 2f, bottom = 2f)
|
||||
)
|
||||
@ -123,16 +133,43 @@ class ContextMenuEntry(
|
||||
|
||||
object ContextMenuEntry {
|
||||
def apply(
|
||||
label: String,
|
||||
icon: Option[IconDef] = None,
|
||||
sound: SoundSource = SoundSource.InterfaceClick,
|
||||
soundDisabled: SoundSource = SoundSource.InterfaceClickLow
|
||||
label: String,
|
||||
icon: Option[ContextMenuIcon] = None
|
||||
)(onClick: => Unit): ContextMenuEntry =
|
||||
new ContextMenuEntry(
|
||||
label,
|
||||
onClick = onClick _,
|
||||
icon = icon,
|
||||
icon = icon
|
||||
)
|
||||
|
||||
def apply(
|
||||
label: String
|
||||
)(onClick: => Unit): ContextMenuEntry =
|
||||
new ContextMenuEntry(
|
||||
label,
|
||||
onClick = onClick _,
|
||||
icon = None
|
||||
)
|
||||
|
||||
def apply(
|
||||
label: String,
|
||||
icon: IconSource
|
||||
)(onClick: => Unit): ContextMenuEntry =
|
||||
new ContextMenuEntry(
|
||||
label,
|
||||
Some(ContextMenuIcon(icon)),
|
||||
onClick = onClick _,
|
||||
)
|
||||
|
||||
def apply(
|
||||
label: String,
|
||||
icon: IconSource,
|
||||
sound: SoundSource
|
||||
)(onClick: => Unit): ContextMenuEntry =
|
||||
new ContextMenuEntry(
|
||||
label,
|
||||
Some(ContextMenuIcon(icon)),
|
||||
sound = sound,
|
||||
soundDisabled = soundDisabled
|
||||
onClick = onClick _
|
||||
)
|
||||
}
|
||||
|
||||
@ -0,0 +1,10 @@
|
||||
package ocelot.desktop.ui.widget.contextmenu
|
||||
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
|
||||
case class ContextMenuIcon(
|
||||
source: IconSource,
|
||||
size: ContextMenuIconSize.Value = ContextMenuIconSize.Normal,
|
||||
color: Option[Color] = None
|
||||
)
|
||||
@ -0,0 +1,5 @@
|
||||
package ocelot.desktop.ui.widget.contextmenu
|
||||
|
||||
object ContextMenuIconSize extends Enumeration {
|
||||
val Normal, Big = Value
|
||||
}
|
||||
@ -3,15 +3,20 @@ package ocelot.desktop.ui.widget.contextmenu
|
||||
import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.Vector2D
|
||||
import ocelot.desktop.graphics.{Graphics, IconDef}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.event.HoverEvent
|
||||
|
||||
class ContextMenuSubmenu(label: String,
|
||||
onClick: () => Unit = null,
|
||||
icon: Option[IconDef] = None)
|
||||
extends ContextMenuEntry(label + " ", if (onClick != null) onClick else () => {}, icon)
|
||||
{
|
||||
class ContextMenuSubmenu(
|
||||
label: String,
|
||||
icon: Option[ContextMenuIcon] = None,
|
||||
onClick: () => Unit = () => {},
|
||||
)
|
||||
extends ContextMenuEntry(
|
||||
label + " ",
|
||||
icon,
|
||||
onClick
|
||||
) {
|
||||
private val parentEntry = this
|
||||
private val submenu = new ContextMenu {
|
||||
override def update(): Unit = {
|
||||
@ -54,4 +59,4 @@ class ContextMenuSubmenu(label: String,
|
||||
contextMenus.open(submenu, position + Vector2D(width, -4),
|
||||
position.x, position.y + height + 4, isSubmenu = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3,7 +3,7 @@ package ocelot.desktop.ui.widget.modal.notification
|
||||
import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.Padding2D
|
||||
import ocelot.desktop.graphics.{Graphics, Icons}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.layout.LinearLayout
|
||||
import ocelot.desktop.ui.widget._
|
||||
import ocelot.desktop.ui.widget.modal.ModalDialog
|
||||
@ -30,7 +30,7 @@ class NotificationDialog(message: String, notificationType: NotificationType = N
|
||||
|
||||
// Icon
|
||||
children :+= new PaddingBox(
|
||||
new Icon(Icons.NotificationIcon(notificationType)),
|
||||
new Icon(IconSource.Notification(notificationType)),
|
||||
Padding2D.equal(10)
|
||||
)
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.ui.widget.settings
|
||||
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.layout.LinearLayout
|
||||
import ocelot.desktop.ui.widget.Widget
|
||||
import ocelot.desktop.util.Orientation
|
||||
@ -8,7 +8,7 @@ import ocelot.desktop.util.Orientation
|
||||
trait SettingsTab extends Widget {
|
||||
override protected val layout = new LinearLayout(this, orientation = Orientation.Vertical)
|
||||
|
||||
val icon: IconDef
|
||||
val icon: IconSource
|
||||
val label: String
|
||||
|
||||
/**
|
||||
|
||||
@ -2,11 +2,11 @@ package ocelot.desktop.ui.widget.settings
|
||||
|
||||
import ocelot.desktop.Settings
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.widget.{PaddingBox, Slider}
|
||||
|
||||
class SoundSettingsTab extends SettingsTab {
|
||||
override val icon: IconDef = Icons.SettingsSound
|
||||
override val icon: IconSource = IconSource.SettingsSound
|
||||
override val label: String = "Sound"
|
||||
|
||||
children :+= new PaddingBox(new Slider(Settings.get.volumeMaster, "Master Volume") {
|
||||
|
||||
@ -2,12 +2,12 @@ package ocelot.desktop.ui.widget.settings
|
||||
|
||||
import ocelot.desktop.Settings
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.widget.{Checkbox, PaddingBox, Slider}
|
||||
|
||||
class UISettingsTab extends SettingsTab {
|
||||
override val icon: IconDef = Icons.SettingsUI
|
||||
override val icon: IconSource = IconSource.SettingsUI
|
||||
override val label: String = "UI"
|
||||
|
||||
override def applySettings(): Unit = {
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.traits.CardItem
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class CardSlotWidget(slot: Inventory#Slot, _tier: Tier) extends SlotWidget[CardItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.CardIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.CardIcon)
|
||||
override def slotTier: Option[Tier] = Some(_tier)
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.ComponentBusItem
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
@ -8,6 +8,6 @@ import totoro.ocelot.brain.util.Tier.Tier
|
||||
class ComponentBusSlotWidget(slot: Inventory#Slot, _tier: Tier)
|
||||
extends SlotWidget[ComponentBusItem](slot)
|
||||
{
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.ComponentBusIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.ComponentBusIcon)
|
||||
override def slotTier: Option[Tier] = Some(_tier)
|
||||
}
|
||||
|
||||
@ -1,13 +1,13 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.traits.CpuLikeItem
|
||||
import ocelot.desktop.inventory.{Inventory, Item}
|
||||
import ocelot.desktop.util.ComputerAware
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class CpuSlotWidget(slot: Inventory#Slot, computer: ComputerAware, _tier: Tier) extends SlotWidget[CpuLikeItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.CpuIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.CpuIcon)
|
||||
override def slotTier: Option[Tier] = Some(_tier)
|
||||
|
||||
protected override def onItemNotification(notification: Item.Notification): Unit = {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.EepromItem
|
||||
|
||||
class EepromSlotWidget(slot: Inventory#Slot) extends SlotWidget[EepromItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.EepromIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.EepromIcon)
|
||||
}
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.audio.{Audio, SoundSource}
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.FloppyItem
|
||||
|
||||
class FloppySlotWidget(slot: Inventory#Slot) extends SlotWidget[FloppyItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.FloppyIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.FloppyIcon)
|
||||
|
||||
override def onItemAdded(): Unit = {
|
||||
super.onItemAdded()
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.HddItem
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class HddSlotWidget(slot: Inventory#Slot, _tier: Tier) extends SlotWidget[HddItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.HddIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.HddIcon)
|
||||
override def slotTier: Option[Tier] = Some(_tier)
|
||||
}
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.IconDef
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.inventory.Items.{ArbitraryItemGroup, ExtendedTieredItemGroup, SingletonItemGroup, TieredItemGroup}
|
||||
import ocelot.desktop.inventory._
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.contextmenu._
|
||||
import totoro.ocelot.brain.util.ExtendedTier.ExtendedTier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
@ -11,7 +11,10 @@ class ItemChooser[I <: Item](slot: SlotWidget[I]) extends ContextMenu {
|
||||
import ItemChooser._
|
||||
|
||||
private def makeMenuEntry(factory: ItemFactory, label: String): ContextMenuEntry = {
|
||||
ContextMenuEntry(label, icon = Some(factory.icon)) {
|
||||
ContextMenuEntry(
|
||||
label,
|
||||
Some(ContextMenuIcon(factory.icon, ContextMenuIconSize.Big, Some(Color.White)))
|
||||
) {
|
||||
slot.item = factory.build().asInstanceOf[I]
|
||||
}
|
||||
}
|
||||
@ -19,7 +22,7 @@ class ItemChooser[I <: Item](slot: SlotWidget[I]) extends ContextMenu {
|
||||
private def addSubmenu[T: HasLabel](
|
||||
name: String,
|
||||
factories: Seq[(T, ItemFactory)],
|
||||
icon: Option[IconDef] = None
|
||||
icon: Option[ContextMenuIcon] = None
|
||||
): Unit = {
|
||||
val tierLabel = implicitly[HasLabel[T]].label _
|
||||
|
||||
@ -27,7 +30,10 @@ class ItemChooser[I <: Item](slot: SlotWidget[I]) extends ContextMenu {
|
||||
|
||||
if (acceptedFactories.nonEmpty) {
|
||||
addEntry(
|
||||
new ContextMenuSubmenu(name, icon = Some(icon.getOrElse(acceptedFactories.last._2.icon))) {
|
||||
new ContextMenuSubmenu(
|
||||
name,
|
||||
Some(icon.getOrElse(ContextMenuIcon(acceptedFactories.last._2.icon, ContextMenuIconSize.Big, Some(Color.White))))
|
||||
) {
|
||||
for ((tier, factory) <- acceptedFactories) {
|
||||
addEntry(makeMenuEntry(factory, tierLabel(tier)))
|
||||
}
|
||||
@ -47,7 +53,7 @@ class ItemChooser[I <: Item](slot: SlotWidget[I]) extends ContextMenu {
|
||||
|
||||
case ExtendedTieredItemGroup(name, factories) => addSubmenu(name, factories)
|
||||
|
||||
case ArbitraryItemGroup(name, icon, factories) => addSubmenu(name, factories, Some(icon))
|
||||
case ArbitraryItemGroup(name, icon, factories) => addSubmenu(name, factories, Some(ContextMenuIcon(icon, ContextMenuIconSize.Big, Some(Color.White))))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,11 +1,11 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.MemoryItem
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
|
||||
class MemorySlotWidget(slot: Inventory#Slot, _tier: Tier) extends SlotWidget[MemoryItem](slot) {
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.MemoryIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.MemoryIcon)
|
||||
override def slotTier: Option[Tier] = Some(_tier)
|
||||
}
|
||||
|
||||
@ -1,17 +1,13 @@
|
||||
package ocelot.desktop.ui.widget.slot
|
||||
|
||||
import ocelot.desktop.graphics.{IconDef, Icons}
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.Inventory
|
||||
import ocelot.desktop.inventory.item.{DiskDriveMountableItem, RackMountableItem, ServerItem}
|
||||
import ocelot.desktop.node.nodes.RackNode
|
||||
import ocelot.desktop.ui.event.sources.KeyEvents
|
||||
import ocelot.desktop.ui.widget.contextmenu.ContextMenu
|
||||
import org.lwjgl.input.Keyboard
|
||||
import ocelot.desktop.inventory.item.{RackMountableItem, ServerItem}
|
||||
|
||||
class RackMountableSlotWidget(slot: Inventory#Slot)
|
||||
extends SlotWidget[RackMountableItem](slot)
|
||||
{
|
||||
override def ghostIcon: Option[IconDef] = Some(Icons.ServerIcon)
|
||||
override def ghostIcon: Option[IconSource] = Some(IconSource.ServerIcon)
|
||||
|
||||
override def onItemRemoved(removedItem: RackMountableItem, replacedBy: Option[RackMountableItem]): Unit = {
|
||||
super.onItemRemoved(removedItem, replacedBy)
|
||||
|
||||
@ -3,7 +3,7 @@ package ocelot.desktop.ui.widget.slot
|
||||
import ocelot.desktop.audio.SoundSource
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.{Size2D, Vector2D}
|
||||
import ocelot.desktop.graphics.{Graphics, IconDef, Icons}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.inventory.{Inventory, Item, ItemFactory}
|
||||
import ocelot.desktop.ui.event.handlers.{ClickHandler, DragHandler, HoverHandler}
|
||||
import ocelot.desktop.ui.event.{ClickEvent, DragEvent, HoverEvent, MouseEvent}
|
||||
@ -12,7 +12,6 @@ import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.itemdrag.DraggedItem
|
||||
import ocelot.desktop.ui.widget.slot.SlotWidget.{HighlightAlpha, HighlightAnimationHideSpeed, HighlightAnimationShowSpeed}
|
||||
import ocelot.desktop.ui.widget.tooltip.{ItemTooltip, Tooltip}
|
||||
import ocelot.desktop.util.Disposable
|
||||
import ocelot.desktop.util.animation.ValueAnimation
|
||||
import totoro.ocelot.brain.util.Tier
|
||||
import totoro.ocelot.brain.util.Tier.Tier
|
||||
@ -58,13 +57,13 @@ class SlotWidget[I <: Item](private val slot: Inventory#Slot)(implicit slotItemT
|
||||
disposed = true
|
||||
}
|
||||
|
||||
def ghostIcon: Option[IconDef] = None
|
||||
def ghostIcon: Option[IconSource] = None
|
||||
|
||||
def slotTier: Option[Tier] = None
|
||||
|
||||
def tierIcon: Option[IconDef] = slotTier.map(Icons.TierIcon)
|
||||
def tierIcon: Option[IconSource] = slotTier.map(IconSource.TierIcon)
|
||||
|
||||
def itemIcon: Option[IconDef] = item.map(_.icon)
|
||||
def itemIcon: Option[IconSource] = item.map(_.icon)
|
||||
|
||||
def item: Option[I] = slot.get.filter(_ => !disposed).map(_.asInstanceOf[I])
|
||||
|
||||
@ -111,7 +110,7 @@ class SlotWidget[I <: Item](private val slot: Inventory#Slot)(implicit slotItemT
|
||||
for (item <- item) {
|
||||
item.fillRmbMenu(menu)
|
||||
menu.addEntry(
|
||||
ContextMenuEntry("Remove", sound = SoundSource.InterfaceClickLow) {
|
||||
ContextMenuEntry("Remove", IconSource.Delete, SoundSource.InterfaceClickLow) {
|
||||
slot.remove()
|
||||
}
|
||||
)
|
||||
@ -255,7 +254,7 @@ class SlotWidget[I <: Item](private val slot: Inventory#Slot)(implicit slotItemT
|
||||
|
||||
override def update(): Unit = {
|
||||
super.update()
|
||||
|
||||
|
||||
if (item.isDefined)
|
||||
item.get.update()
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@ package ocelot.desktop.ui.widget.statusbar
|
||||
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.UiHandler
|
||||
import ocelot.desktop.ui.event.handlers.ClickHandler
|
||||
import ocelot.desktop.ui.event.{ClickEvent, KeyEvent, MouseEvent}
|
||||
@ -55,19 +55,23 @@ class StatusBar extends Widget {
|
||||
eventHandlers += {
|
||||
case ClickEvent(MouseEvent.Button.Right, pos) =>
|
||||
val menu = new ContextMenu
|
||||
menu.addEntry(ContextMenuEntry("Change simulation speed") {
|
||||
menu.addEntry(ContextMenuEntry("Change simulation speed", IconSource.Edit) {
|
||||
new ChangeSimulationSpeedDialog().show()
|
||||
})
|
||||
menu.addEntry(ContextMenuEntry("Reset simulation speed") {
|
||||
|
||||
menu.addEntry(ContextMenuEntry("Reset simulation speed", IconSource.Restart) {
|
||||
OcelotDesktop.ticker.tickInterval = 50.millis
|
||||
})
|
||||
|
||||
if (OcelotDesktop.tickerIntervalHistory.nonEmpty)
|
||||
menu.addSeparator()
|
||||
|
||||
for (elem <- OcelotDesktop.tickerIntervalHistory.reverseIterator) {
|
||||
menu.addEntry(ContextMenuEntry((1_000_000f / elem.toMicros).toString) {
|
||||
OcelotDesktop.ticker.tickInterval = elem
|
||||
})
|
||||
}
|
||||
|
||||
root.get.contextMenus.open(menu, pos)
|
||||
}
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ import ocelot.desktop.ColorScheme
|
||||
import ocelot.desktop.audio.SoundSource
|
||||
import ocelot.desktop.color.Color
|
||||
import ocelot.desktop.geometry.{Padding2D, Size2D}
|
||||
import ocelot.desktop.graphics.{Graphics, IconDef}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.ui.event.handlers.{ClickHandler, HoverHandler}
|
||||
import ocelot.desktop.ui.event.{ClickEvent, HoverEvent, MouseEvent}
|
||||
import ocelot.desktop.ui.layout.LinearLayout
|
||||
@ -12,7 +12,7 @@ import ocelot.desktop.ui.widget._
|
||||
import ocelot.desktop.util.Orientation
|
||||
import ocelot.desktop.util.animation.ColorAnimation
|
||||
|
||||
class VerticalMenuButton(icon: IconDef, label: String, handler: VerticalMenuButton => Unit = _ => {})
|
||||
class VerticalMenuButton(icon: IconSource, label: String, handler: VerticalMenuButton => Unit = _ => {})
|
||||
extends Widget with ClickHandler with HoverHandler with ClickSoundSource {
|
||||
val colorAnimation: ColorAnimation = new ColorAnimation(ColorScheme("VerticalMenuBackground"), 0.6f)
|
||||
|
||||
@ -22,7 +22,9 @@ class VerticalMenuButton(icon: IconDef, label: String, handler: VerticalMenuButt
|
||||
override val layout = new LinearLayout(this, orientation = Orientation.Horizontal)
|
||||
|
||||
children :+= new PaddingBox(
|
||||
new Icon(icon.copy(sizeMultiplier = 1f, color = ColorScheme("VerticalMenuEntryIcon"))),
|
||||
new Icon(icon) {
|
||||
override def iconColor: Color = ColorScheme("VerticalMenuEntryIcon")
|
||||
},
|
||||
Padding2D(right = 8)
|
||||
)
|
||||
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
package ocelot.desktop.util
|
||||
|
||||
import ocelot.desktop.audio._
|
||||
import ocelot.desktop.graphics.IconSource
|
||||
import ocelot.desktop.inventory.item._
|
||||
import ocelot.desktop.inventory.traits.ComponentItem
|
||||
import ocelot.desktop.inventory.{Item, SyncedInventory}
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry, ContextMenuIcon, ContextMenuSubmenu}
|
||||
import ocelot.desktop.ui.widget.slot._
|
||||
import ocelot.desktop.ui.widget.window.Windowed
|
||||
import ocelot.desktop.windows.ComputerWindow
|
||||
@ -62,35 +63,25 @@ trait ComputerAware
|
||||
|
||||
def addPowerContextMenuEntries(menu: ContextMenu): Unit = {
|
||||
if (computer.machine.isRunning) {
|
||||
menu.addEntry(ContextMenuEntry("Turn off") {
|
||||
menu.addEntry(ContextMenuEntry("Turn off", IconSource.Power) {
|
||||
turnOff()
|
||||
})
|
||||
|
||||
menu.addEntry(ContextMenuEntry("Reboot") {
|
||||
menu.addEntry(ContextMenuEntry("Reboot", IconSource.Restart) {
|
||||
turnOff()
|
||||
turnOn()
|
||||
})
|
||||
}
|
||||
else {
|
||||
menu.addEntry(ContextMenuEntry("Turn on") {
|
||||
menu.addEntry(ContextMenuEntry("Turn on", IconSource.Power) {
|
||||
turnOn()
|
||||
})
|
||||
}
|
||||
|
||||
menu.addEntry(
|
||||
new ContextMenuSubmenu("Set tier") {
|
||||
for (tier <- Tier.One to Tier.Creative) {
|
||||
addEntry(ContextMenuEntry(tier.label) {
|
||||
changeTier(tier)
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
def addTierContextMenuEntries(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(
|
||||
new ContextMenuSubmenu("Set tier") {
|
||||
new ContextMenuSubmenu("Change tier", Some(ContextMenuIcon(IconSource.Tiers))) {
|
||||
for (tier <- Tier.One to Tier.Creative) {
|
||||
addEntry(ContextMenuEntry(tier.label) {
|
||||
changeTier(tier)
|
||||
@ -108,6 +99,8 @@ trait ComputerAware
|
||||
var diskSlots: Array[HddSlotWidget] = Array.empty
|
||||
var floppySlot: Option[FloppySlotWidget] = None
|
||||
|
||||
private var nextSlotIndex = 0
|
||||
|
||||
protected def slots: IterableOnce[SlotWidget[I]] = (
|
||||
// slots may be null during initialization
|
||||
Option(eepromSlot).iterator ++
|
||||
@ -119,7 +112,13 @@ trait ComputerAware
|
||||
floppySlot.iterator
|
||||
).map(_.asInstanceOf[SlotWidget[I]])
|
||||
|
||||
protected def insertItems(items: IterableOnce[I]): Unit = {
|
||||
private def addSlot(): Slot = {
|
||||
val result = Slot(nextSlotIndex)
|
||||
nextSlotIndex += 1
|
||||
result
|
||||
}
|
||||
|
||||
private def insertItems(items: IterableOnce[I]): Unit = {
|
||||
def findBestSlot[A <: I](item: A, candidates: IterableOnce[SlotWidget[A]]): Option[SlotWidget[A]] = {
|
||||
candidates.iterator
|
||||
.filter(_.item.isEmpty)
|
||||
@ -132,14 +131,6 @@ trait ComputerAware
|
||||
}
|
||||
}
|
||||
|
||||
private var nextSlotIndex = 0
|
||||
|
||||
private def addSlot(): Slot = {
|
||||
val result = Slot(nextSlotIndex)
|
||||
nextSlotIndex += 1
|
||||
result
|
||||
}
|
||||
|
||||
protected def addSlotWidget[T <: SlotWidget[_]](factory: Slot => T): T = {
|
||||
val slot = addSlot()
|
||||
val widget = factory(slot)
|
||||
|
||||
@ -3,12 +3,13 @@ package ocelot.desktop.util
|
||||
import ocelot.desktop.audio.{Audio, SoundSource}
|
||||
import ocelot.desktop.color._
|
||||
import ocelot.desktop.geometry.Rect2D
|
||||
import ocelot.desktop.graphics.{Graphics, Icons}
|
||||
import ocelot.desktop.graphics.{Graphics, IconSource}
|
||||
import ocelot.desktop.inventory.SyncedInventory
|
||||
import ocelot.desktop.inventory.item._
|
||||
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
|
||||
import ocelot.desktop.ui.widget.slot._
|
||||
import ocelot.desktop.ui.widget.window.Windowed
|
||||
import ocelot.desktop.util.DiskDriveAware.ColorValues
|
||||
import ocelot.desktop.windows.DiskDriveWindow
|
||||
import totoro.ocelot.brain.entity.FloppyDiskDrive
|
||||
import totoro.ocelot.brain.entity.traits.Inventory
|
||||
@ -31,7 +32,61 @@ trait DiskDriveAware
|
||||
floppySlotWidget.item = new FloppyItem.Factory.Loot(Loot.OpenOsFloppy).build()
|
||||
}
|
||||
|
||||
protected val colorMap: Map[DyeColor, Int] = Map(
|
||||
def drawActivityAndFloppy(g: Graphics, bounds: Rect2D, prefix: String): Unit = {
|
||||
if (System.currentTimeMillis() - floppyDiskDrive.lastDiskAccess < 400 && Math.random() > 0.1)
|
||||
g.sprite(s"${prefix}Activity", bounds)
|
||||
|
||||
for (item <- floppySlotWidget.item) {
|
||||
g.sprite(
|
||||
s"${prefix}Floppy",
|
||||
bounds.x,
|
||||
bounds.y,
|
||||
bounds.w,
|
||||
bounds.h,
|
||||
IntColor(ColorValues(item.color.value))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
def isFloppyItemPresent: Boolean = floppySlotWidget.item.isDefined
|
||||
|
||||
def eject(): Unit = {
|
||||
floppySlotWidget.item = None
|
||||
|
||||
if (!Audio.isDisabled)
|
||||
SoundSource.MachineFloppyEject.play()
|
||||
}
|
||||
|
||||
def addDiskDriveMenuEntries(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(ContextMenuEntry("Eject", IconSource.Eject) {
|
||||
eject()
|
||||
})
|
||||
}
|
||||
|
||||
override val window: Option[DiskDriveWindow] = Some(new DiskDriveWindow(this))
|
||||
}
|
||||
|
||||
object DiskDriveAware {
|
||||
val ColorNames: Map[DyeColor, String] = Map(
|
||||
DyeColor.White -> "White",
|
||||
DyeColor.Orange -> "Orange",
|
||||
DyeColor.Magenta -> "Magenta",
|
||||
DyeColor.LightBlue -> "LightBlue",
|
||||
DyeColor.Yellow -> "Yellow",
|
||||
DyeColor.Lime -> "Lime",
|
||||
DyeColor.Pink -> "Pink",
|
||||
DyeColor.Gray -> "Gray",
|
||||
DyeColor.Silver -> "Silver",
|
||||
DyeColor.Cyan -> "Cyan",
|
||||
DyeColor.Purple -> "Purple",
|
||||
DyeColor.Blue -> "Blue",
|
||||
DyeColor.Brown -> "Brown",
|
||||
DyeColor.Green -> "Green",
|
||||
DyeColor.Red -> "Red",
|
||||
DyeColor.Black -> "Black",
|
||||
)
|
||||
|
||||
val ColorValues: Map[DyeColor, Int] = Map(
|
||||
DyeColor.Black -> 0x444444, // 0x1E1B1B
|
||||
DyeColor.Red -> 0xB3312C,
|
||||
DyeColor.Green -> 0x339911, // 0x3B511A
|
||||
@ -49,37 +104,4 @@ trait DiskDriveAware
|
||||
DyeColor.Orange -> 0xEB8844,
|
||||
DyeColor.White -> 0xF0F0F0
|
||||
)
|
||||
|
||||
def drawActivityAndFloppy(g: Graphics, bounds: Rect2D, prefix: String): Unit = {
|
||||
if (System.currentTimeMillis() - floppyDiskDrive.lastDiskAccess < 400 && Math.random() > 0.1)
|
||||
g.sprite(s"${prefix}Activity", bounds)
|
||||
|
||||
for (item <- floppySlotWidget.item) {
|
||||
g.sprite(
|
||||
s"${prefix}Floppy",
|
||||
bounds.x,
|
||||
bounds.y,
|
||||
bounds.w,
|
||||
bounds.h,
|
||||
IntColor(colorMap(item.color.value))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
def isFloppyItemPresent: Boolean = floppySlotWidget.item.isDefined
|
||||
|
||||
def eject(): Unit = {
|
||||
floppySlotWidget.item = None
|
||||
|
||||
if (!Audio.isDisabled)
|
||||
SoundSource.MachineFloppyEject.play()
|
||||
}
|
||||
|
||||
def addDiskDriveMenuEntries(menu: ContextMenu): Unit = {
|
||||
menu.addEntry(ContextMenuEntry("Eject") {
|
||||
eject()
|
||||
})
|
||||
}
|
||||
|
||||
override val window: Option[DiskDriveWindow] = Some(new DiskDriveWindow(this))
|
||||
}
|
||||
}
|
||||
@ -5,9 +5,9 @@ import ocelot.desktop.graphics.Graphics
|
||||
import ocelot.desktop.inventory.item.{NetworkCardItem, ServerItem}
|
||||
import ocelot.desktop.node.nodes.RackNode
|
||||
import ocelot.desktop.ui.layout.{Layout, LinearLayout}
|
||||
import ocelot.desktop.ui.widget._
|
||||
import ocelot.desktop.ui.widget.slot.RackMountableSlotWidget
|
||||
import ocelot.desktop.ui.widget.window.PanelWindow
|
||||
import ocelot.desktop.ui.widget._
|
||||
import ocelot.desktop.util.Orientation
|
||||
import totoro.ocelot.brain.util.Direction
|
||||
import totoro.ocelot.brain.util.Direction.Direction
|
||||
|
||||
@ -84,10 +84,12 @@ class ScreenWindow(screenNode: ScreenNode) extends BasicWindow with Logging {
|
||||
if (sentTouchEvent) {
|
||||
screen.mouseUp(lastMousePos.x, lastMousePos.y, event.button.id, OcelotDesktop.player)
|
||||
sentTouchEvent = false
|
||||
} else if (pinButtonBounds.contains(UiHandler.mousePosition)) {
|
||||
}
|
||||
else if (pinButtonBounds.contains(UiHandler.mousePosition)) {
|
||||
if (isPinned) unpin() else pin()
|
||||
SoundSource.InterfaceClick.play()
|
||||
} else if (closeButtonBounds.contains(UiHandler.mousePosition)) {
|
||||
}
|
||||
else if (closeButtonBounds.contains(UiHandler.mousePosition)) {
|
||||
close()
|
||||
SoundSource.InterfaceClick.play()
|
||||
}
|
||||
|
||||