diff --git a/assets/kenny/arrowBeige_left.png b/assets/kenny/arrowBeige_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2fdaae0a322aa0b01767f6838018fbe99f031b Binary files /dev/null and b/assets/kenny/arrowBeige_left.png differ diff --git a/assets/kenny/arrowBeige_right.png b/assets/kenny/arrowBeige_right.png new file mode 100644 index 0000000000000000000000000000000000000000..166bbfe83c11f9f8918309bd790fa0b8b1923ecd Binary files /dev/null and b/assets/kenny/arrowBeige_right.png differ diff --git a/assets/kenny/arrowBlue_left.png b/assets/kenny/arrowBlue_left.png new file mode 100644 index 0000000000000000000000000000000000000000..05d3b3b7bd788db6abf3351e1eba315c0f6f152b Binary files /dev/null and b/assets/kenny/arrowBlue_left.png differ diff --git a/assets/kenny/arrowBlue_right.png b/assets/kenny/arrowBlue_right.png new file mode 100644 index 0000000000000000000000000000000000000000..51fb299c4537f2a8b5a16ae0089ab0e41e0eecec Binary files /dev/null and b/assets/kenny/arrowBlue_right.png differ diff --git a/assets/kenny/arrowBrown_left.png b/assets/kenny/arrowBrown_left.png new file mode 100644 index 0000000000000000000000000000000000000000..de9961bc391b207b163a09827fd288127b163d14 Binary files /dev/null and b/assets/kenny/arrowBrown_left.png differ diff --git a/assets/kenny/arrowBrown_right.png b/assets/kenny/arrowBrown_right.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6b571d6f308991f5822300c6f8ec770bbdba1e Binary files /dev/null and b/assets/kenny/arrowBrown_right.png differ diff --git a/assets/kenny/arrowSilver_left.png b/assets/kenny/arrowSilver_left.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed60b705238c5782b255868c5198233edbda554 Binary files /dev/null and b/assets/kenny/arrowSilver_left.png differ diff --git a/assets/kenny/arrowSilver_right.png b/assets/kenny/arrowSilver_right.png new file mode 100644 index 0000000000000000000000000000000000000000..be71d37da86af30a30c960197227656aca4aee1b Binary files /dev/null and b/assets/kenny/arrowSilver_right.png differ diff --git a/assets/kenny/barBack_horizontalLeft.png b/assets/kenny/barBack_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..801e6b5b29ba00f5009a9fcd462cfb4dabd77931 Binary files /dev/null and b/assets/kenny/barBack_horizontalLeft.png differ diff --git a/assets/kenny/barBack_horizontalMid.png b/assets/kenny/barBack_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..319bdbc38ebf193cee5310fdbb35ab589a5a3475 Binary files /dev/null and b/assets/kenny/barBack_horizontalMid.png differ diff --git a/assets/kenny/barBack_horizontalRight.png b/assets/kenny/barBack_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a850f506334abd9d52f64f744c7387cab7a279 Binary files /dev/null and b/assets/kenny/barBack_horizontalRight.png differ diff --git a/assets/kenny/barBack_verticalBottom.png b/assets/kenny/barBack_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e7064bd2886df713fc7e548b237c3021e6e259 Binary files /dev/null and b/assets/kenny/barBack_verticalBottom.png differ diff --git a/assets/kenny/barBack_verticalMid.png b/assets/kenny/barBack_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3e8fd2b5e605adb97a592da9c0d528c352c1f9 Binary files /dev/null and b/assets/kenny/barBack_verticalMid.png differ diff --git a/assets/kenny/barBack_verticalTop.png b/assets/kenny/barBack_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..543cd193f4438d0971841dc245e78dda4b4de964 Binary files /dev/null and b/assets/kenny/barBack_verticalTop.png differ diff --git a/assets/kenny/barBlue_horizontalBlue.png b/assets/kenny/barBlue_horizontalBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..5367dba38591073c177329b2d08825f0decf9eaf Binary files /dev/null and b/assets/kenny/barBlue_horizontalBlue.png differ diff --git a/assets/kenny/barBlue_horizontalLeft.png b/assets/kenny/barBlue_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..0245eb3b533adb39089d3b5d5544f3040ce18938 Binary files /dev/null and b/assets/kenny/barBlue_horizontalLeft.png differ diff --git a/assets/kenny/barBlue_horizontalRight.png b/assets/kenny/barBlue_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..e94c0c61e76ad123581c93972a91659a6ce7cec8 Binary files /dev/null and b/assets/kenny/barBlue_horizontalRight.png differ diff --git a/assets/kenny/barBlue_verticalBottom.png b/assets/kenny/barBlue_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..2834db913084b0aa6402b3e2b8db40d1b54771e8 Binary files /dev/null and b/assets/kenny/barBlue_verticalBottom.png differ diff --git a/assets/kenny/barBlue_verticalMid.png b/assets/kenny/barBlue_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..7629e5527e7a9d9e2d430011c4ab7b143122e5d3 Binary files /dev/null and b/assets/kenny/barBlue_verticalMid.png differ diff --git a/assets/kenny/barBlue_verticalTop.png b/assets/kenny/barBlue_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..18dda588ea2c163cac750aae5d5b832ed7e33cc5 Binary files /dev/null and b/assets/kenny/barBlue_verticalTop.png differ diff --git a/assets/kenny/barGreen_horizontalLeft.png b/assets/kenny/barGreen_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5b08f21c6657ad089f2371a30c866dd0f7d2ca87 Binary files /dev/null and b/assets/kenny/barGreen_horizontalLeft.png differ diff --git a/assets/kenny/barGreen_horizontalMid.png b/assets/kenny/barGreen_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b5d775bebc60dc63879a9f100fa2dc4056366b Binary files /dev/null and b/assets/kenny/barGreen_horizontalMid.png differ diff --git a/assets/kenny/barGreen_horizontalRight.png b/assets/kenny/barGreen_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..407b61b535d91dcbbd524f03d9f52bfd556bf039 Binary files /dev/null and b/assets/kenny/barGreen_horizontalRight.png differ diff --git a/assets/kenny/barGreen_verticalBottom.png b/assets/kenny/barGreen_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..1f733d4c07fa0bfad2d060ece7260ac0c573874c Binary files /dev/null and b/assets/kenny/barGreen_verticalBottom.png differ diff --git a/assets/kenny/barGreen_verticalMid.png b/assets/kenny/barGreen_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..03ff210f290097aadfdadb8d958f16de269f4feb Binary files /dev/null and b/assets/kenny/barGreen_verticalMid.png differ diff --git a/assets/kenny/barGreen_verticalTop.png b/assets/kenny/barGreen_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..235afa0b4f1be3e64c4a4b26ed7471eb58e6d8cb Binary files /dev/null and b/assets/kenny/barGreen_verticalTop.png differ diff --git a/assets/kenny/barRed_horizontalLeft.png b/assets/kenny/barRed_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8e7a6f84084924da9526600d46c5c8107a3313 Binary files /dev/null and b/assets/kenny/barRed_horizontalLeft.png differ diff --git a/assets/kenny/barRed_horizontalMid.png b/assets/kenny/barRed_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..99da8810a636da75e56777141a476a3349270a2c Binary files /dev/null and b/assets/kenny/barRed_horizontalMid.png differ diff --git a/assets/kenny/barRed_horizontalRight.png b/assets/kenny/barRed_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec2bd4fd1b9336a1ad147e72e0b90cd8a506335 Binary files /dev/null and b/assets/kenny/barRed_horizontalRight.png differ diff --git a/assets/kenny/barRed_verticalBottom.png b/assets/kenny/barRed_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..767d6a4c607e94fc625ef175be65ec02caefa3cf Binary files /dev/null and b/assets/kenny/barRed_verticalBottom.png differ diff --git a/assets/kenny/barRed_verticalMid.png b/assets/kenny/barRed_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..934e6f80d48c32fd19067d255ded269a8d157e8c Binary files /dev/null and b/assets/kenny/barRed_verticalMid.png differ diff --git a/assets/kenny/barRed_verticalTop.png b/assets/kenny/barRed_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..35101937914a1de0c7b84c3fe246811b47fa7391 Binary files /dev/null and b/assets/kenny/barRed_verticalTop.png differ diff --git a/assets/kenny/barYellow_horizontalLeft.png b/assets/kenny/barYellow_horizontalLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..79c4b63fdde994900ebceb2c3eed8f52b9869908 Binary files /dev/null and b/assets/kenny/barYellow_horizontalLeft.png differ diff --git a/assets/kenny/barYellow_horizontalMid.png b/assets/kenny/barYellow_horizontalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..38f37b6c06e4a31b51fdea38752be70e9a77f953 Binary files /dev/null and b/assets/kenny/barYellow_horizontalMid.png differ diff --git a/assets/kenny/barYellow_horizontalRight.png b/assets/kenny/barYellow_horizontalRight.png new file mode 100644 index 0000000000000000000000000000000000000000..3d00f789fbbb163d20c5184a9970a02e6b218928 Binary files /dev/null and b/assets/kenny/barYellow_horizontalRight.png differ diff --git a/assets/kenny/barYellow_verticalBottom.png b/assets/kenny/barYellow_verticalBottom.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cc9d72dcdbe6c404639f66db905b3203fa29c0 Binary files /dev/null and b/assets/kenny/barYellow_verticalBottom.png differ diff --git a/assets/kenny/barYellow_verticalMid.png b/assets/kenny/barYellow_verticalMid.png new file mode 100644 index 0000000000000000000000000000000000000000..e2491258bddf717d2026d2f804bd89a935b4e4a4 Binary files /dev/null and b/assets/kenny/barYellow_verticalMid.png differ diff --git a/assets/kenny/barYellow_verticalTop.png b/assets/kenny/barYellow_verticalTop.png new file mode 100644 index 0000000000000000000000000000000000000000..18b96ab2111d5f88218092ca0d6e816552326977 Binary files /dev/null and b/assets/kenny/barYellow_verticalTop.png differ diff --git a/assets/kenny/buttonLong_beige.png b/assets/kenny/buttonLong_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b35372b38e503f3e22f3a05c529cd04d82991c Binary files /dev/null and b/assets/kenny/buttonLong_beige.png differ diff --git a/assets/kenny/buttonLong_beige_pressed.png b/assets/kenny/buttonLong_beige_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..25378784c18ce313bfe6ec505cef5d962f8d3778 Binary files /dev/null and b/assets/kenny/buttonLong_beige_pressed.png differ diff --git a/assets/kenny/buttonLong_blue.png b/assets/kenny/buttonLong_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..cbaf8d7817a9bb52324e9bdf9df811638a6a5bd8 Binary files /dev/null and b/assets/kenny/buttonLong_blue.png differ diff --git a/assets/kenny/buttonLong_blue_pressed.png b/assets/kenny/buttonLong_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad0b5c2c60076b7a300246003fb4a8fbd35500c Binary files /dev/null and b/assets/kenny/buttonLong_blue_pressed.png differ diff --git a/assets/kenny/buttonLong_brown.png b/assets/kenny/buttonLong_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..299dc59d80e91af63053fdc0fe26d6224e43fcfe Binary files /dev/null and b/assets/kenny/buttonLong_brown.png differ diff --git a/assets/kenny/buttonLong_brown_pressed.png b/assets/kenny/buttonLong_brown_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ec0a49445c98f2f9dbc6285973a913eca9ed7be2 Binary files /dev/null and b/assets/kenny/buttonLong_brown_pressed.png differ diff --git a/assets/kenny/buttonLong_grey.png b/assets/kenny/buttonLong_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b8c3fe09dc4da9950b0d82d926402377ecee47d8 Binary files /dev/null and b/assets/kenny/buttonLong_grey.png differ diff --git a/assets/kenny/buttonLong_grey_pressed.png b/assets/kenny/buttonLong_grey_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..ef427446823017796b305b808a73e77fc5b9c149 Binary files /dev/null and b/assets/kenny/buttonLong_grey_pressed.png differ diff --git a/assets/kenny/buttonRound_beige.png b/assets/kenny/buttonRound_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..69cbb7ba27900d43ff74555b266d232c88f5c35c Binary files /dev/null and b/assets/kenny/buttonRound_beige.png differ diff --git a/assets/kenny/buttonRound_blue.png b/assets/kenny/buttonRound_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fb596e506aaf4d41c5eeec08c5ac60cbad38e0 Binary files /dev/null and b/assets/kenny/buttonRound_blue.png differ diff --git a/assets/kenny/buttonRound_brown.png b/assets/kenny/buttonRound_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..cb824ea08112cade237ce70b0e480784d11b9f04 Binary files /dev/null and b/assets/kenny/buttonRound_brown.png differ diff --git a/assets/kenny/buttonRound_grey.png b/assets/kenny/buttonRound_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe89f8acde8482d72d2a95572dbf13759eea766 Binary files /dev/null and b/assets/kenny/buttonRound_grey.png differ diff --git a/assets/kenny/buttonSquare_beige.png b/assets/kenny/buttonSquare_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..15ecc1cab174e47effe6b26d35594886c7b499e8 Binary files /dev/null and b/assets/kenny/buttonSquare_beige.png differ diff --git a/assets/kenny/buttonSquare_beige_pressed.png b/assets/kenny/buttonSquare_beige_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..2465c870a33cdc902374d3a2136f40c18ce2dcbd Binary files /dev/null and b/assets/kenny/buttonSquare_beige_pressed.png differ diff --git a/assets/kenny/buttonSquare_blue.png b/assets/kenny/buttonSquare_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..c165e51f7feb1169ed3cea51e4f87617a1e6b93c Binary files /dev/null and b/assets/kenny/buttonSquare_blue.png differ diff --git a/assets/kenny/buttonSquare_blue_pressed.png b/assets/kenny/buttonSquare_blue_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab31c5c340034da8b1d95e05f9563cb20774ba3 Binary files /dev/null and b/assets/kenny/buttonSquare_blue_pressed.png differ diff --git a/assets/kenny/buttonSquare_brown.png b/assets/kenny/buttonSquare_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..1707aab0be8282fa1d7e1ed9e5f69f0170c21215 Binary files /dev/null and b/assets/kenny/buttonSquare_brown.png differ diff --git a/assets/kenny/buttonSquare_brown_pressed.png b/assets/kenny/buttonSquare_brown_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea2427e98d65f0db66cd11011356c813c226945 Binary files /dev/null and b/assets/kenny/buttonSquare_brown_pressed.png differ diff --git a/assets/kenny/buttonSquare_grey.png b/assets/kenny/buttonSquare_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f21b17e1b4b38c0bff17c3db279ec4b6a433ea8f Binary files /dev/null and b/assets/kenny/buttonSquare_grey.png differ diff --git a/assets/kenny/buttonSquare_grey_pressed.png b/assets/kenny/buttonSquare_grey_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..bf7b41072881803606334a14dae6e24b14145ae7 Binary files /dev/null and b/assets/kenny/buttonSquare_grey_pressed.png differ diff --git a/assets/kenny/cursorGauntlet_blue.png b/assets/kenny/cursorGauntlet_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..ab9eaafe0d11b360e536799037004edab6b4dfbc Binary files /dev/null and b/assets/kenny/cursorGauntlet_blue.png differ diff --git a/assets/kenny/cursorGauntlet_bronze.png b/assets/kenny/cursorGauntlet_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..379b6f5c889eb8de8b7ad6738b7fd92144d26b33 Binary files /dev/null and b/assets/kenny/cursorGauntlet_bronze.png differ diff --git a/assets/kenny/cursorGauntlet_grey.png b/assets/kenny/cursorGauntlet_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f84c34ad917931ce414044910c0f6693f9ae1a Binary files /dev/null and b/assets/kenny/cursorGauntlet_grey.png differ diff --git a/assets/kenny/cursorHand_beige.png b/assets/kenny/cursorHand_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2bba7414d26868c7e3b9a1cf8e399ae0b653fb Binary files /dev/null and b/assets/kenny/cursorHand_beige.png differ diff --git a/assets/kenny/cursorHand_blue.png b/assets/kenny/cursorHand_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee5baaf38d45a98f51b209a968502e46681c942 Binary files /dev/null and b/assets/kenny/cursorHand_blue.png differ diff --git a/assets/kenny/cursorHand_grey.png b/assets/kenny/cursorHand_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..fa83d37ef5c20e9bda94ed989ff8383a4139c8b8 Binary files /dev/null and b/assets/kenny/cursorHand_grey.png differ diff --git a/assets/kenny/cursorSword_bronze.png b/assets/kenny/cursorSword_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..2b43075a33e0f6bd05e39e834bc6ff5894bf76b8 Binary files /dev/null and b/assets/kenny/cursorSword_bronze.png differ diff --git a/assets/kenny/cursorSword_gold.png b/assets/kenny/cursorSword_gold.png new file mode 100644 index 0000000000000000000000000000000000000000..ccca5fd30a5ee35e6c5d59212e787285510d5033 Binary files /dev/null and b/assets/kenny/cursorSword_gold.png differ diff --git a/assets/kenny/cursorSword_silver.png b/assets/kenny/cursorSword_silver.png new file mode 100644 index 0000000000000000000000000000000000000000..1b37fe8e588fd429e789e50b9fd8b5675f48bbad Binary files /dev/null and b/assets/kenny/cursorSword_silver.png differ diff --git a/assets/kenny/iconCheck_beige.png b/assets/kenny/iconCheck_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..bc4790e7f1e91579f31fc16ca705dacd2719ec21 Binary files /dev/null and b/assets/kenny/iconCheck_beige.png differ diff --git a/assets/kenny/iconCheck_blue.png b/assets/kenny/iconCheck_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef72cde22fb2f178e6c6d14853473bd40039dcc Binary files /dev/null and b/assets/kenny/iconCheck_blue.png differ diff --git a/assets/kenny/iconCheck_bronze.png b/assets/kenny/iconCheck_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..cdaa2f239d8d53bcfdb88e300cde5de81ade3f9f Binary files /dev/null and b/assets/kenny/iconCheck_bronze.png differ diff --git a/assets/kenny/iconCheck_grey.png b/assets/kenny/iconCheck_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..e4016cf7d97d78ab3443a8b0df0f749b4311580e Binary files /dev/null and b/assets/kenny/iconCheck_grey.png differ diff --git a/assets/kenny/iconCircle_beige.png b/assets/kenny/iconCircle_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..a5e3ca1ed5671c2cfe54b60cc75e16902b6d5cd4 Binary files /dev/null and b/assets/kenny/iconCircle_beige.png differ diff --git a/assets/kenny/iconCircle_blue.png b/assets/kenny/iconCircle_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7062e5c7d1efbb13987f28a76400c89fa8676546 Binary files /dev/null and b/assets/kenny/iconCircle_blue.png differ diff --git a/assets/kenny/iconCircle_brown.png b/assets/kenny/iconCircle_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..7abf40fe3ce29d58c2492c095da6c454a7b37e12 Binary files /dev/null and b/assets/kenny/iconCircle_brown.png differ diff --git a/assets/kenny/iconCircle_grey.png b/assets/kenny/iconCircle_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..d35d80be281cb016b4f8eeeeb381969fb7b0d67a Binary files /dev/null and b/assets/kenny/iconCircle_grey.png differ diff --git a/assets/kenny/iconCross_beige.png b/assets/kenny/iconCross_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..32278dccd955874b321a7410a35a84342a32065a Binary files /dev/null and b/assets/kenny/iconCross_beige.png differ diff --git a/assets/kenny/iconCross_blue.png b/assets/kenny/iconCross_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab70a18ce0590995d90340d15327f287575b306 Binary files /dev/null and b/assets/kenny/iconCross_blue.png differ diff --git a/assets/kenny/iconCross_brown.png b/assets/kenny/iconCross_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..7cce69ada1e4cb5a85cfbf0b4acd6ab9b6f1a5cd Binary files /dev/null and b/assets/kenny/iconCross_brown.png differ diff --git a/assets/kenny/iconCross_grey.png b/assets/kenny/iconCross_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f57ccd8c322d5474a09f734c61f72fc63f65f442 Binary files /dev/null and b/assets/kenny/iconCross_grey.png differ diff --git a/assets/kenny/panelInset_beige.png b/assets/kenny/panelInset_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..f92416fa221ee96a706413b02140b7ecf08e46e1 Binary files /dev/null and b/assets/kenny/panelInset_beige.png differ diff --git a/assets/kenny/panelInset_beigeLight.png b/assets/kenny/panelInset_beigeLight.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed1a7bc90f65bce6867a26062079b362c4a3b6d Binary files /dev/null and b/assets/kenny/panelInset_beigeLight.png differ diff --git a/assets/kenny/panelInset_blue.png b/assets/kenny/panelInset_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0c2b5851e38c010d067501f099cbf88ebc97a492 Binary files /dev/null and b/assets/kenny/panelInset_blue.png differ diff --git a/assets/kenny/panelInset_brown.png b/assets/kenny/panelInset_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..fc293f144b4acc58ac8c44ea2f7cb4ff532fc252 Binary files /dev/null and b/assets/kenny/panelInset_brown.png differ diff --git a/assets/kenny/panel_beige.png b/assets/kenny/panel_beige.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a1d99d5249af3b6cb7e68681bb806e3b95d24b Binary files /dev/null and b/assets/kenny/panel_beige.png differ diff --git a/assets/kenny/panel_beigeLight.png b/assets/kenny/panel_beigeLight.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccf82cf70d500ed7d5e627f70b54e56cb02ed2a Binary files /dev/null and b/assets/kenny/panel_beigeLight.png differ diff --git a/assets/kenny/panel_blue.png b/assets/kenny/panel_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..cf58c662e703e08e83f31c56834224e6810ee1ac Binary files /dev/null and b/assets/kenny/panel_blue.png differ diff --git a/assets/kenny/panel_brown.png b/assets/kenny/panel_brown.png new file mode 100644 index 0000000000000000000000000000000000000000..97c381ba6000d74d29284c3e8bef0f9929c8ffdb Binary files /dev/null and b/assets/kenny/panel_brown.png differ diff --git a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs index c2d75f93c997255de0d2027eecf8a171ee6df4a1..fdd47979cc4b97c650c0d5be41b93f8eda1f8d5d 100644 --- a/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs +++ b/bevy_kayak_ui/src/render/unified/nine_patch/extract.rs @@ -130,7 +130,7 @@ pub fn extract_nine_patch( extracted_quads.push(top_middle_quad); // Bottom - let bottom_y_pos = layout.posy + (layout.width - border.bottom); + let bottom_y_pos = layout.posy + (layout.height - border.bottom); let bottom_left_quad = ExtractQuadBundle { extracted_quad: ExtractedQuad { rect: Rect { @@ -245,7 +245,7 @@ pub fn extract_nine_patch( }, uv_min: Some(Vec2::new( border.left / image_size.x, - border.bottom / image_size.y, + border.top / image_size.y, )), uv_max: Some(Vec2::new( (image_size.x - border.right) / image_size.x, diff --git a/examples/full_ui.rs b/examples/full_ui.rs new file mode 100644 index 0000000000000000000000000000000000000000..ed9b075b7d9ab309ec9cbce1c64d52c74e627ba2 --- /dev/null +++ b/examples/full_ui.rs @@ -0,0 +1,197 @@ +use bevy::{ + math::Vec2, + prelude::{App as BevyApp, AssetServer, Commands, Handle, Res, ResMut, World}, + window::{WindowDescriptor, Windows}, + PipelinedDefaultPlugins, +}; +use bevy_kayak_ui::{BevyContext, BevyKayakUIPlugin, ImageManager, UICameraBundle}; +use kayak_components::{NinePatch, Text}; +use kayak_core::{ + context::KayakContext, + layout_cache::Space, + styles::{LayoutType, Style, StyleProp, Units}, + widget, Children, EventType, Index, OnEvent, +}; +use kayak_ui::components::App; +use kayak_ui::core::rsx; + +#[widget] +fn BlueButton(context: KayakContext, children: Children, styles: Option<Style>) { + let (blue_button_handle, blue_button_hover_handle) = { + let world = context.get_global_state::<World>(); + if world.is_err() { + return; + } + + let mut world = world.unwrap(); + + let (handle1, handle2) = { + let asset_server = world.get_resource::<AssetServer>().unwrap(); + let handle1: Handle<bevy::render2::texture::Image> = + asset_server.load("../assets/kenny/buttonSquare_blue.png"); + let handle2: Handle<bevy::render2::texture::Image> = + asset_server.load("../assets/kenny/buttonSquare_blue_pressed.png"); + + (handle1, handle2) + }; + + let mut image_manager = world.get_resource_mut::<ImageManager>().unwrap(); + let blue_button_handle = image_manager.get(&handle1); + let blue_button_hover_handle = image_manager.get(&handle2); + + (blue_button_handle, blue_button_hover_handle) + }; + + let current_button_handle = *context.create_state::<u16>(blue_button_handle).unwrap(); + dbg!(current_button_handle); + + let button_styles = Style { + width: StyleProp::Value(Units::Pixels(200.0)), + height: StyleProp::Value(Units::Pixels(50.0)), + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..styles.clone().unwrap_or_default() + }; + + let button_id = self.get_id(); + let on_event = OnEvent::new(move |context, event| match event.event_type { + EventType::Click => { + dbg!("Clicked!"); + context.set_current_id(button_id); + context.set_state::<u16>(blue_button_hover_handle); + } + _ => { + context.set_state::<u16>(blue_button_handle); + } + }); + + rsx! { + <NinePatch + border={Space { + left: 10.0, + right: 10.0, + top: 10.0, + bottom: 10.0, + }} + handle={current_button_handle} + styles={Some(button_styles)} + on_event={Some(on_event)} + > + {children} + </NinePatch> + } +} + +fn startup( + mut commands: Commands, + windows: Res<Windows>, + asset_server: Res<AssetServer>, + mut image_manager: ResMut<ImageManager>, +) { + commands.spawn_bundle(UICameraBundle::new()); + + let window_size = if let Some(window) = windows.get_primary() { + Vec2::new(window.width(), window.height()) + } else { + panic!("Couldn't find primary window!"); + }; + + let handle: Handle<bevy::render2::texture::Image> = asset_server.load("kenny/panel_brown.png"); + let panel_brown_handle = image_manager.get(&handle); + + let context = BevyContext::new(window_size.x, window_size.y, |styles, context| { + // Hack to trick the proc macro for right now.. + let parent_id: Option<Index> = None; + + let nine_patch_styles = Style { + layout_type: StyleProp::Value(LayoutType::Column), + width: StyleProp::Value(Units::Pixels(512.0)), + height: StyleProp::Value(Units::Pixels(512.0)), + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..Style::default() + }; + + let app_styles = Style { + padding_left: StyleProp::Value(Units::Stretch(1.0)), + padding_right: StyleProp::Value(Units::Stretch(1.0)), + padding_top: StyleProp::Value(Units::Stretch(1.0)), + padding_bottom: StyleProp::Value(Units::Stretch(1.0)), + ..styles.clone() + }; + + let header_styles = Style { + width: StyleProp::Value(Units::Pixels(432.0)), + height: StyleProp::Value(Units::Pixels(64.0)), + bottom: StyleProp::Value(Units::Stretch(1.0)), + ..Style::default() + }; + + let play_button_styles = Style { + width: StyleProp::Value(Units::Pixels(54.0)), + height: StyleProp::Value(Units::Pixels(45.0)), + ..Style::default() + }; + + let options_button_text_styles = Style { + width: StyleProp::Value(Units::Pixels(102.0)), + height: StyleProp::Value(Units::Pixels(45.0)), + ..Style::default() + }; + + let options_button_styles = Style { + top: StyleProp::Value(Units::Pixels(15.0)), + ..Style::default() + }; + + rsx! { + <App styles={Some(app_styles)}> + <NinePatch + styles={Some(nine_patch_styles)} + border={Space { + left: 30.0, + right: 30.0, + top: 30.0, + bottom: 30.0, + }} + handle={panel_brown_handle} + > + <Text + styles={Some(header_styles)} + size={50.0} + content={"Name My Game Plz".to_string()} + /> + <BlueButton> + <Text styles={Some(play_button_styles)} size={30.0} content={"Play".to_string()} /> + </BlueButton> + <BlueButton styles={Some(options_button_styles)}> + <Text styles={Some(options_button_text_styles)} size={30.0} content={"Options".to_string()} /> + </BlueButton> + <BlueButton styles={Some(options_button_styles)}> + <Text styles={Some(play_button_styles)} size={30.0} content={"Quit".to_string()} /> + </BlueButton> + </NinePatch> + </App> + } + }); + + commands.insert_resource(context); +} + +fn main() { + BevyApp::new() + .insert_resource(WindowDescriptor { + width: 1270.0, + height: 720.0, + title: String::from("UI Example"), + ..Default::default() + }) + .add_plugins(PipelinedDefaultPlugins) + .add_plugin(BevyKayakUIPlugin) + .add_startup_system(startup) + .run(); +} diff --git a/kayak_core/src/context.rs b/kayak_core/src/context.rs index 7e39265f163bc81aef7ab29994743e58ea513ced..59d1d52306c005762e0cd1b2e17ee12983186f25 100644 --- a/kayak_core/src/context.rs +++ b/kayak_core/src/context.rs @@ -38,6 +38,7 @@ impl KayakContext { &mut self, initial_state: T, ) -> Option<Ref<T>> { + dbg!(self.current_id); if self.component_states.contains_key(&self.current_id) { let states = self.component_states.get_mut(&self.current_id).unwrap(); if !states.contains::<T>() { @@ -62,10 +63,12 @@ impl KayakContext { } pub fn set_state<T: resources::Resource + Clone>(&mut self, state: T) { + dbg!(self.current_id); if self.component_states.contains_key(&self.current_id) { let states = self.component_states.get(&self.current_id).unwrap(); if states.contains::<T>() { let mut mutate_t = states.get_mut::<T>().unwrap(); + dbg!("Mutating state!"); self.widget_manager.dirty_nodes.push(self.current_id); *mutate_t = state; } else { diff --git a/kayak_core/src/styles.rs b/kayak_core/src/styles.rs index 17266dc971130ef194237f890258de14561921b6..a1671dcf387ec682d5e48b2cb8dd3d6f20d7de92 100644 --- a/kayak_core/src/styles.rs +++ b/kayak_core/src/styles.rs @@ -49,6 +49,10 @@ pub struct Style { pub padding_right: StyleProp<Units>, pub padding_top: StyleProp<Units>, pub padding_bottom: StyleProp<Units>, + pub margin_left: StyleProp<Units>, + pub margin_right: StyleProp<Units>, + pub margin_top: StyleProp<Units>, + pub margin_bottom: StyleProp<Units>, } impl Default for Style { @@ -70,6 +74,10 @@ impl Default for Style { padding_right: StyleProp::Default, padding_top: StyleProp::Default, padding_bottom: StyleProp::Default, + margin_left: StyleProp::Default, + margin_right: StyleProp::Default, + margin_top: StyleProp::Default, + margin_bottom: StyleProp::Default, } } } @@ -164,5 +172,21 @@ impl Style { StyleProp::Inherit => self.padding_bottom = other.padding_bottom.clone(), _ => (), } + match self.margin_left { + StyleProp::Inherit => self.margin_left = other.margin_left.clone(), + _ => (), + } + match self.margin_right { + StyleProp::Inherit => self.margin_right = other.margin_right.clone(), + _ => (), + } + match self.margin_top { + StyleProp::Inherit => self.margin_top = other.margin_top.clone(), + _ => (), + } + match self.margin_bottom { + StyleProp::Inherit => self.margin_bottom = other.margin_bottom.clone(), + _ => (), + } } } diff --git a/kayak_core/src/widget_manager.rs b/kayak_core/src/widget_manager.rs index 97ed85ebe3fdb3f78e6f8eab4e98726d97f87058..dd141b2000b077425f0792b647b780af24ebd17e 100644 --- a/kayak_core/src/widget_manager.rs +++ b/kayak_core/src/widget_manager.rs @@ -139,6 +139,7 @@ impl WidgetManager { right: crate::styles::StyleProp::Default, top: crate::styles::StyleProp::Default, width: crate::styles::StyleProp::Default, + ..Style::default() }; for dirty_node_index in self.dirty_render_nodes.drain(..) { let dirty_widget = self.current_widgets[dirty_node_index].as_ref().unwrap(); diff --git a/kayak_render_macros/src/children.rs b/kayak_render_macros/src/children.rs index f948e6727cb1817f9b96c964ab349c6d73ab9471..88dd8dc2c2a1054ae1cc984d18162f0a75749c86 100644 --- a/kayak_render_macros/src/children.rs +++ b/kayak_render_macros/src/children.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use crate::{ arc_function::build_arc_function, attribute::Attribute, @@ -95,60 +97,101 @@ impl Children { _ => { let mut iter = children_quotes.iter(); - let first = iter.next().unwrap(); - let second = iter.next().unwrap(); - - let first = build_arc_function(quote! { child1 }, first.clone(), true, 0); - let second = build_arc_function(quote! { child2 }, second.clone(), true, 1); + // First get shared and non-shared attributes.. + let mut child_attributes_list = Vec::new(); + for i in 0..children_quotes.len() { + child_attributes_list.push(self.get_clonable_attributes(i)); + } - let children_attributes0: Vec<_> = self.get_clonable_attributes(0); - let children_attributes1: Vec<_> = self.get_clonable_attributes(1); - let (children_attributes0, children_attributes1, matching) = - handle_tuple_attributes(&children_attributes0, &children_attributes1); + let mut all_attributes = HashSet::new(); + for child_attributes in child_attributes_list.iter() { + for child_attribute in child_attributes { + all_attributes.insert(child_attribute.to_string()); + } + } - let base_matching: Vec<proc_macro2::TokenStream> = matching + let base_matching: Vec<proc_macro2::TokenStream> = all_attributes .iter() - .map(|a| { - format!("base_{}", a.to_string()) - .to_string() - .parse() - .unwrap() - }) + .map(|a| format!("base_{}", a).to_string().parse().unwrap()) .collect(); + let all_attributes: Vec<proc_macro2::TokenStream> = + all_attributes.iter().map(|a| a.parse().unwrap()).collect(); + let base_clone = quote! { - #(let #base_matching = #matching.clone();)* + #(let #base_matching = #all_attributes.clone();)* }; let base_clones_inner = quote! { - #(let #matching = #base_matching.clone();)* + #(let #all_attributes = #base_matching.clone();)* }; - let cloned_attrs0 = quote! { - #(let #children_attributes0 = #children_attributes0.clone();)* - }; - let cloned_attrs1 = quote! { - #(let #children_attributes1 = #children_attributes1.clone();)* - }; + let mut output = Vec::new(); + output.push(quote! { #base_clone }); + for i in 0..children_quotes.len() { + output.push(quote! { #base_clones_inner }); + let name: proc_macro2::TokenStream = format!("child{}", i).parse().unwrap(); + let child = + build_arc_function(quote! { #name }, children_quotes[i].clone(), true, i); + output.push(quote! { #child }); + } - let tuple_of_tuples = iter.fold( - quote! { - #base_clone - #cloned_attrs0 - #base_clones_inner - #first - #base_clones_inner - #cloned_attrs1 - #second - }, - |renderable, current| quote!((#renderable, #current)), - ); + // let first = iter.next().unwrap(); + // let second = iter.next().unwrap(); + + // let first = build_arc_function(quote! { child1 }, first.clone(), true, 0); + // let second = build_arc_function(quote! { child2 }, second.clone(), true, 1); + + // let children_attributes0: Vec<_> = self.get_clonable_attributes(0); + // let children_attributes1: Vec<_> = self.get_clonable_attributes(1); + // let (children_attributes0, children_attributes1, matching) = + // handle_tuple_attributes(&children_attributes0, &children_attributes1); + + // let base_matching: Vec<proc_macro2::TokenStream> = matching + // .iter() + // .map(|a| { + // format!("base_{}", a.to_string()) + // .to_string() + // .parse() + // .unwrap() + // }) + // .collect(); + + // let base_clone = quote! { + // #(let #base_matching = #matching.clone();)* + // }; + + // let base_clones_inner = quote! { + // #(let #matching = #base_matching.clone();)* + // }; + + // let cloned_attrs0 = quote! { + // #(let #children_attributes0 = #children_attributes0.clone();)* + // }; + // let cloned_attrs1 = quote! { + // #(let #children_attributes1 = #children_attributes1.clone();)* + // }; + + // let tuple_of_tuples = iter.fold( + // quote! { + // #base_clone + // #cloned_attrs0 + // #base_clones_inner + // #first + // #base_clones_inner + // #cloned_attrs1 + // #second + // }, + // |renderable, current| quote!((#renderable, #current)), + // ); quote! { Some(std::sync::Arc::new(move |parent_id: Option<kayak_core::Index>, context: &mut kayak_core::context::KayakContext| { - #tuple_of_tuples + #(#output)* })) } + + // quote! {} } } }