Yui - A Declarative UI library for LÖVE ======================================= **Yui** - Yet another User Interface, is a library to create menu-like GUIs for the [LÖVE](https://love2d.org) engine. ## Why is that? Because I'm spending so much time tweaking and customizing existing libraries, I might as well make my own. ## Hello, World! ```lua local yui = require 'lib.yui' function love.load() local w, h = 300, 80 local x = math.floor((love.graphics.getWidth() - w) / 2) local y = math.floor((love.graphics.getHeight() - h) / 2) ui = yui.Ui:new { x = x, y = y, yui.Rows { yui.Label { w = w, h = h / 2, text = "Hello, World!" }, yui.Button { text = "Close", onHit = function() love.event.quit() end } } } end function love.update(dt) ui:update(dt) end function love.draw() ui:draw() end ``` ![Hello, World!](https://gitea.it/1414codeforge/yui-examples/raw/branch/master/pics/hello_world.png) ## Features **Yui** fills the following gaps: * Immediate mode UIs tend to clutter LÖVE `update()` code a lot, using a declarative approach - that is: describing how the UI should look upfront, and then letting the UI code `update()` and `draw()` itself accordingly, makes for a cleaner code. * Adapt to different sources of input easily (keyboard, mouse, touch, gamepad). * Out of the box internationalization. * Out of the box keyboard navigation across widgets. * Simple layouts (place widget in columns or rows, or possibly build rows made of several columns - grids). * Custom widgets support. * Custom theme support. * Custom input sources support. * Sufficiently compact, straightforward and hackable code. **Yui** does have some downsides: * The declarative approach makes UIs harder to change drastically from frame to frame. * **Yui** tries to ameliorate this, allowing widgets property tweening, it's still less powerful compared to an all out immediate UI approach. * Features come with a price, **Yui**'s code tries to be small and simple, but there are definitely smaller (and less featureful) frameworks out there. ## Dependencies **Yui** depends on: * [gear](https://gitea.it/1414codeforge/gear) for general algorithms. * [moonspeak](https://gitea.it/1414codeforge/moonspeak) for its localization functionality. * ...and any of their dependencies. You may either download each of them manually and place them inside a `lib` subdirectory, or use [crush](https://gitea.it/1414codeforge/crush) to do the work for you. 1. Clone this repository. ```sh git clone https://gitea.it/1414codeforge/yui ``` 2. Move to repository root directory: ```sh cd yui ``` 3. Resolve dependencies using **crush**. ```sh lua crush.lua ``` You should now see a `lib` subdirectory containing the necessary dependencies. ## Integrating yui in my project using crush 1. Download the latest [crush.lua](https://gitea.it/1414codeforge/crush/src/branch/master/crush.lua) file and place it in your project's root directory. 2. Create a `.lovedeps` text file in your project's root with the following entry: ```lua { yui = "https://gitea.it/1414codeforge/yui", -- ...more dependencies, if necessary... } ``` 3. **Yui** can now be downloaded directly by `crush` to the project's `lib` directory: ```sh lua crush.lua ``` 4. Now `yui` can be `require()`d in your code, like this: ```lua local yui = require 'lib.yui' ``` 5. Any project depending on yours will now fetch `yui` automatically when using `crush`, following the above procedure. ## Documentation Code is documented with [LDoc](https://github.com/lunarmodules/LDoc). Documentation may be generated running the command: ```sh ldoc . ``` `ldoc` generates a `doc` directory, open `doc/index.html` with your favorite browser to read the documentation. The source code is also (IMHO) sufficiently straightforward and disciplined to have a decent overview of the functionality. Examples are available at: [https://gitea.it/1414codeforge/yui-examples](https://gitea.it/1414codeforge/yui-examples) ## Acknowledgement Portions of this library's widget rendering code are taken from the Simple User Interface Toolkit (**SUIT**) for LÖVE by Matthias Richter. SUIT's source code is available at: [vrld/SUIT](https://github.com/vrld/SUIT). SUIT is licensed under the [MIT license](https://github.com/vrld/suit/blob/master/license.txt). Widgets offered by **yui** and basic theme are also mostly taken from SUIT. See [ACKNOWLEDGEMENT](README.ACKNOWLEDGEMENT) for full SUIT license information and copyright notice. ## Similar projects * [SUIT](https://github.com/vrld/SUIT) an excellent, simple and flexible framework for immediate UIs. * [Gspöt](https://notabug.org/pgimeno/Gspot) a stateful GUI lib for LÖVE, has similar aims, but different approach. ## License Zlib, see [LICENSE](LICENSE) for details.