diff --git a/build.rbxmx b/build.rbxmx index 08f9c78..68ad819 100644 --- a/build.rbxmx +++ b/build.rbxmx @@ -28,18 +28,22 @@ frame{ ]] +require = require(script.require); +local event = require("event"); +local store = require("store"); +local style = require("style"); +local class = require("class"); +local mount = require("mount"); + function module.init() local this = {items = {}}; - local event = require(script.event).init(this); if false then event = require("src.event").init(this); end - local class = require(script.class).init(this); if false then class = require("src.class").init(this); end - local store = require(script.store).init(this); if false then store = require("src.store").init(this); end - local style = require(script.style).init(this); if false then style = require("src.style").init(this); end + this.event = event.init(this); + this.store = store.init(this); + this.style = style.init(this); + this.class = class.init(this); + this.mount = mount.init(this); - this.event = event; - this.class = class; - this.store = store; - this.style = style; --this.makeClass = makeClass; --this.tween = tween; --this.plugin = plugin; @@ -51,6 +55,12 @@ return module; ]]> + + bind + + + + class local module = {}; @@ -58,21 +68,21 @@ return module; function module.init(shared) local new = {}; local bind = shared.event.bind; - local items = shared.items; + local addObject = shared.store.addObject; function new.make(ClassName,prop) -- make thing local item; local classOfClassName = type(ClassName); - if classOfClassName == "string" then + if classOfClassName == "string" then -- if classname is a string value, cdall instance.new for making new roblox instance item = Instance.new(ClassName); - elseif classOfClassName == "function" then + elseif classOfClassName == "function" then -- if classname is a function value, call it for making new object (OOP object) item = ClassName(); - elseif classOfClassName == "table" then + elseif classOfClassName == "table" then -- if classname is a calss what is included new function, call it for making new object (object) local func = ClassName.new or ClassName.New or ClassName.__new; item = func(); end - if not item then + if not item then -- if cannot make new object, ignore this call local str = tostring(ClassName); print(("fail to make item '%s', did you forget to checking the class '%s' is exist?"):format(str,str)); end @@ -94,21 +104,26 @@ function module.init(shared) end local make = new.make; - function new.import(ClassName) - return function (prop) - if type(prop) == "string" then - local lastName = prop; - return function (nprop) - nprop.Name = lastName; - local item = make(ClassName,nprop); - items[lastName] = item; - return item; - end; - end - return make(ClassName,prop); - end; + function new.import(ClassName) -- make new quad class object + local this = {styles = {}}; + setmetatable(this,{ + __call = function (self,prop) + if type(prop) == "string" then + local lastName = prop; + return function (nprop) + nprop.Name = lastName; + local item = make(ClassName,nprop); + addObject(lastName,item); + return item; + end; + end + return make(ClassName,prop); + end; + }); + return this; end + -- set module calling function setmetatable(new,{ __call = function (self,...) return self.import(...); @@ -121,7 +136,7 @@ end return module; - + event local module = {}; @@ -196,7 +211,68 @@ end return module; - + + + mount + local module = {}; + +function module.init(shared) + local new = {}; + + -- we should add plugin support + function new.mount(to,this) + this.Parent = to; + end + + setmetatable(new,{ + __call = function (self,...) + self.mount(...); + end; + }); + + return new; +end + +return module; + + + + + require + -- remove the roblox's require system, +-- now, we can call modules with string path + +if (not workspace) and (not game) and (not script) then + return; +end + +return function (query) + local typeQuery = type(query); + + if typeQuery == "string" then + local object = script.Parent; + query = query:gsub("/","."); + -- local index = 0; + query:gsub("[^%.]+",function (this) + -- index = index + 1; + -- if index == 1 and this == "src" then + -- return; + -- end + local lastObject = object; + object = object[this]; + if not object then + object = lastObject.libs + error(("[require] : object %s was not found from this worktree, require failed"):format(query)); + end + end); + return require(object); + elseif typeQuery == "userdata" then + return require(query); + end +end; + + + store - + style local module = {}; @@ -231,12 +315,10 @@ return module; function module.init(shared) local new = {}; - function shared.new() + function shared.new(property) end - function shared. - return new; end diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..fa3e5ec --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +rojo build default.project.json -o build.rbxmx \ No newline at end of file diff --git a/src/bind.lua b/src/bind.lua new file mode 100644 index 0000000..e69de29 diff --git a/src/class.lua b/src/class.lua index e5e2f65..c9a6e18 100644 --- a/src/class.lua +++ b/src/class.lua @@ -3,21 +3,21 @@ local module = {}; function module.init(shared) local new = {}; local bind = shared.event.bind; - local items = shared.items; + local addObject = shared.store.addObject; function new.make(ClassName,prop) -- make thing local item; local classOfClassName = type(ClassName); - if classOfClassName == "string" then + if classOfClassName == "string" then -- if classname is a string value, cdall instance.new for making new roblox instance item = Instance.new(ClassName); - elseif classOfClassName == "function" then + elseif classOfClassName == "function" then -- if classname is a function value, call it for making new object (OOP object) item = ClassName(); - elseif classOfClassName == "table" then + elseif classOfClassName == "table" then -- if classname is a calss what is included new function, call it for making new object (object) local func = ClassName.new or ClassName.New or ClassName.__new; item = func(); end - if not item then + if not item then -- if cannot make new object, ignore this call local str = tostring(ClassName); print(("fail to make item '%s', did you forget to checking the class '%s' is exist?"):format(str,str)); end @@ -29,7 +29,7 @@ function module.init(shared) -- child if indexType ~= "string" then -- object - value.Parent = new; + value.Parent = item; elseif valueType == "function" and bind(value) then -- connect event elseif indexType == "string" then new[index] = value; -- set property @@ -39,21 +39,26 @@ function module.init(shared) end local make = new.make; - function new.import(ClassName) - return function (prop) - if type(prop) == "string" then - local lastName = prop; - return function (nprop) - nprop.Name = lastName; - local item = make(ClassName,nprop); - items[lastName] = item; - return item; - end; - end - return make(ClassName,prop); - end; + function new.import(ClassName) -- make new quad class object + local this = {styles = {}}; + setmetatable(this,{ + __call = function (self,prop) + if type(prop) == "string" then + local lastName = prop; + return function (nprop) + nprop.Name = lastName; + local item = make(ClassName,nprop); + addObject(lastName,item); + return item; + end; + end + return make(ClassName,prop); + end; + }); + return this; end + -- set module calling function setmetatable(new,{ __call = function (self,...) return self.import(...); diff --git a/src/init.lua b/src/init.lua index cab7134..f2d2e83 100644 --- a/src/init.lua +++ b/src/init.lua @@ -23,18 +23,22 @@ frame{ ]] +require = require(script.require); +local event = require("event"); +local store = require("store"); +local style = require("style"); +local class = require("class"); +local mount = require("mount"); + function module.init() local this = {items = {}}; - local event = require(script.event).init(this); if false then event = require("src.event").init(this); end - local class = require(script.class).init(this); if false then class = require("src.class").init(this); end - local store = require(script.store).init(this); if false then store = require("src.store").init(this); end - local style = require(script.style).init(this); if false then style = require("src.style").init(this); end + this.event = event.init(this); + this.store = store.init(this); + this.style = style.init(this); + this.class = class.init(this); + this.mount = mount.init(this); - this.event = event; - this.class = class; - this.store = store; - this.style = style; --this.makeClass = makeClass; --this.tween = tween; --this.plugin = plugin; diff --git a/src/libs/QuaTest b/src/libs/QuaTest deleted file mode 160000 index 7874691..0000000 --- a/src/libs/QuaTest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 78746916147fc401984a1267c361a946a7784262 diff --git a/src/mount.lua b/src/mount.lua new file mode 100644 index 0000000..32a4614 --- /dev/null +++ b/src/mount.lua @@ -0,0 +1,20 @@ +local module = {}; + +function module.init(shared) + local new = {}; + + -- we should add plugin support + function new.mount(to,this) + this.Parent = to; + end + + setmetatable(new,{ + __call = function (self,...) + self.mount(...); + end; + }); + + return new; +end + +return module; \ No newline at end of file diff --git a/src/require.lua b/src/require.lua new file mode 100644 index 0000000..00ac067 --- /dev/null +++ b/src/require.lua @@ -0,0 +1,31 @@ +-- remove the roblox's require system, +-- now, we can call modules with string path + +if (not workspace) and (not game) and (not script) then + return; +end + +return function (query) + local typeQuery = type(query); + + if typeQuery == "string" then + local object = script.Parent; + query = query:gsub("/","."); + -- local index = 0; + query:gsub("[^%.]+",function (this) + -- index = index + 1; + -- if index == 1 and this == "src" then + -- return; + -- end + local lastObject = object; + object = object[this]; + if not object then + object = lastObject.libs + error(("[require] : object %s was not found from this worktree, require failed"):format(query)); + end + end); + return require(object); + elseif typeQuery == "userdata" then + return require(query); + end +end; \ No newline at end of file diff --git a/src/store.lua b/src/store.lua index a66012c..698d865 100644 --- a/src/store.lua +++ b/src/store.lua @@ -6,16 +6,34 @@ but, it can't allows mulit id and object this feature should be upgraded ]] +local insert = table.insert; function module.init(shared) local new = {}; local items = shared.items; - function new.getObject(id) + local objSpace = {}; + function objSpace:each(func) + for i,v in ipairs(self) do + local ret = func(i,v); + if ret then + break; + end + end + end + + function new.getObjects(id) return items[id]; end - function new.setObject(id,object) - items[id] = object; + function new.addObject(id,object) + local array = items[id]; + if not array then + array = setmetatable({},{__index = objSpace}); + items[id] = array; + end + insert(array, object); end + + return new; end return module; diff --git a/src/style.lua b/src/style.lua index 0e44c3e..98196ef 100644 --- a/src/style.lua +++ b/src/style.lua @@ -3,12 +3,10 @@ local module = {}; function module.init(shared) local new = {}; - function shared.new() + function shared.new(property) end - function shared. - return new; end diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..6ed0987 --- /dev/null +++ b/test.lua @@ -0,0 +1,37 @@ +local quad = require(script.quad) if false then quad = require("src"); end +local render = quad.init(); +local gui = script.Parent; + +local class = render.class; +local mount = render.mount; +local store = render.store; +local style = render.style; + +local frame = class "Frame"; +local text = class "TextLabel"; + +mount(gui,frame "testFrame" { + text "texts" { + Text = "We can make ui like this"; + }; + text "texts" { + Text = "asdfasdfasdf"; + }; + text "texts" { + Text = "qweiufnwlqef"; + }; +}); + +store.getObjects("texts"):each(function(index,this) + this.Text = "이렇게 모든 택스트를 한꺼번에 바꿀 수도 있습니다"; +end); + +do local this = store.getObjects("testFrame")[1]; + spawn(function () + local flip = false; + while wait(0.5) do + flip = not flip; + this.BackgroundTransparency = flip and 1 or 0; + end + end); +end