From 8eda125d727c0cb9cddbb24763d89691299120ce Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 29 Jan 2020 22:34:21 +0300 Subject: [PATCH] Update README.md --- README.md | 190 ++++++++++++++++++++++++++++++++++++++++--- media/druid_logo.png | Bin 0 -> 6863 bytes 2 files changed, 178 insertions(+), 12 deletions(-) create mode 100644 media/druid_logo.png diff --git a/README.md b/README.md index 2a8006a..32bfa90 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,187 @@ -# Defold Druid -Defold UI library --- +![](media/druid_logo.png) +_travis/release bages_ -# Install +**Druid** - powerful defold component UI library. Use standart components or make your own game-specific to make amazing GUI in your games. -# Setup +## Setup +#### Dependency +You can use the druid extension in your own project by adding this project as a [Defold library dependency](https://www.defold.com/manuals/libraries/). Open your game.project file and in the dependencies field under project add: -# Usage +> [https://github.com/AGulev/druid/archive/master.zip](https://github.com/AGulev/druid/archive/master.zip) -# API +Or point to the ZIP file of a [specific release](https://github.com/AGulev/druid/releases). -# LDoc -Generate with `ldoc .` with `config.ld` file +#### Code +Adjust druid settings: +```lua +local settings = require("druid.settings") +settings.play_sound = function(name) + ... +end -Insctruction here: https://github.com/stevedonovan/LDoc +settings.get_text = function(lang_id) + ... +end +``` -# Authors +## Usage -# License +## Components +Druid provides next basic components: +_insert simple gif of each?_ +- **Button** - basic game button +- **Text** - wrap on gui text node +- **Blocker** - block input in node zone +- **Back** Handler - handle back button (Android, backspace) +- **Locale** - localized text node +- **Timer** - run timer on defined time +- **Progress** - simple progress bar +- **Scroll** - general scroll component +- **Grid** - manage node positions +- **Slider** - simple slider (ex. volume adjust) +- **Checkbox** - simple checkbox +- **Checkbox** group - many checkbox +- **Radio** group - many checkbox with single choice + +## Styles +You can setup default style for all druid module, for druid instance or any base druid component. +Setup default druid style via `druid.set_default_style` +```lua +local druid = require("druid.druid") +local my_style = require("my.amazing.style") + +local function init(self) + druid.set_default_style(my_style) +end +``` +_TODO_ + +## Creating components +Any components creating via druid: +```lua +local druid = require("druid.druid") + +local function init(self) + self.druid = druid.new(self) + local button = self.druid:new_button(node_name, callback) + local text = self.druid:new_text(node_text_name) +end + +function update(self, dt) + self.druid:update(dt) +end + +function on_message(self, message_id, message, sender) + self.druid:on_message(message_id, message, sender) +end + +function on_input(self, action_id, action) + self.druid:on_input(action_id, action) +end +``` + +## Custom components + +Add your custom components via `druid.register` +```lua +local druid = require("druid.druid") +local my_component = require("my.amazing.component") + +local function init(self) + druid.register("my_component", my_component) +end +``` + +Basic custom component template looks like this: +```lua +local const = require("druid.const") + +local M = {} +M.interest = { const.ON_INPUT } + +function M.init(self, ...) + -- Component constructor +end + +-- Call only if exist interest: const.ON_UPDATE +function M.update(self, dt) + +end + +-- Call only if exist interest: const.ON_INPUT or const.ON_SWIPE +function M.on_input(self, action_id, action) + +end + +-- Call only if exist interest: const.ON_MESSAGE +function M.on_message(self, message_id, message, sender) + +end + +-- Call only if swipe was started on another component (ex. scroll) +function M.on_swipe(self) + +end + +return M +``` + +## Best practice on custom components +On each component recomended describe component schema in next way: + +```lua +-- Component module +local helper = require("druid.helper") + +local M = {} + +local SCHEME = { + ROOT = "/root", + ITEM = "/item", + TITLE = "/title" +} + +-- TODO: Rework self.template/self.nodes +-- Make self._inner_data? { component_name, template, nodes } +function M.init(self, template_name, node_table) + -- If component use template, setup it: + self.template = template_name + + -- If component was cloned with gui.clone_tree, pass his nodes + self.nodes = node_table + + -- helper can get node from gui/template/table + local root = helper.node(self, SCHEME.ROOT) + + -- This component can spawn another druid components: + local druid = helper.get_druid(self) + -- Button self on callback is self of _this_ component + local button = druid:new_button(...) + + -- helper can return you the component style + local my_style = helper.get_style(self, "component_name") +end + +``` + +## Example +You can check our example here +_TODO_ + +## API +_Link to ldoc_ + +## Internal +Generate with `ldoc .` with `config.ld` file. [Instructions](https://github.com/stevedonovan/LDoc) + +## Games powered by Druid: +_TODO_ + + +## License +MIT License + + +## Issues and suggestions +If you have any issues, questions or suggestions please [create an issue](https://github.com/AGulev/druid/issues) or contact me: [insality@gmail.com](mailto:insality@gmail.com) diff --git a/media/druid_logo.png b/media/druid_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..84d44b9e31487c53b51fa13d3dccf07b5e7cef12 GIT binary patch literal 6863 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