文档章节

100行lua代码实现简单目录浏览器

ouloba
 ouloba
发布于 2016/06/25 11:55
字数 901
阅读 4087
收藏 48

 

lae下载地址:

https://github.com/ouloba/laetool.git

lae下载地址(国内):https://pan.baidu.com/s/1ckMy0Q

相关视频:

http://www.tudou.com/listplay/aly7NDWz_sQ/AaqZ81jIt-k.html

教程:

lae界面开发工具入门介绍之一<新建工程篇>

lae界面开发工具入门之介绍二--<渲染组件篇>

lae界面开发工具入门之介绍三--<布局篇>

 lae界面开发工具入门之介绍四--<秘籍篇-拷贝粘贴>

lae界面开发工具入门之介绍五--<秘籍篇-杂项>

lae界面开发工具入门之介绍六--<秘籍篇-状态篇>

 

关于lae工具问题单独介绍!

--lua代码

lua编辑器 
csdn下载

github下载地址,csdn没有更新版本功能,这里改为git,可实时获得最新的版本
下载地址:

 

--目录浏览器下载地址

https://github.com/ouloba/folder-explorer.git

--辅助接口
LXZDoFile("LXZHelper.lua");
LXZDoFile("serial.lua");

--每帧调用,root窗口status中IsActive设置为true,即可触发OnUpdate事件。
local function OnUpdate(window, msg, sender)
 UpdateWindow();
end

--更新目录子目录或者文件列表
local function UpdateDirectry(dir)
 local root = HelperGetRoot();
 
 --set current dir. 
 lfs.chdir(dir);
 HelperSetWindowText(root:GetLXZWindow("directry"), dir);
 
 --
 local items = root:GetLXZWindow("folders:area:items"); --目录文件容器
 local item = root:GetLXZWindow("folders:item"); --目录文件项 
 local path = lfs.currentdir();
 
 --清除容器中内容
 items:ClearChilds();
 
 --遍历该目录下的子目录文件
 local cnt = 0;
 for file in lfs.dir(lfs.currentdir()) do
  local wnd = item:Clone(); --克隆一个目录文件项"folders:item"
  wnd:Show();                      --显示
  HelperSetWindowText(wnd:GetChild("text"), file); --设置目录或者文件名
  items:AddChild(wnd);   --加入items容器中
  
  local f = path.."\\"..file;
  local attr = lfs.attributes(f);    
  if attr and attr.mode=="directory" then
   wnd:GetChild("icon"):SetState(0); --通过0状态设置目录图标
  else
   wnd:GetChild("icon"):SetState(1);--通过1状态设置文件名图标
  end  
  cnt=cnt+1;
 end
 
 --如果无法访问该目录,则添加"."与".."
 if cnt==0 then
  local wnd = item:Clone();
  wnd:Show();
  HelperSetWindowText(wnd:GetChild("text"), ".");
  items:AddChild(wnd);  
  
  local wnd = item:Clone();
  wnd:Show();
  HelperSetWindowText(wnd:GetChild("text"), "..");
  items:AddChild(wnd);  
 end
 
 --垂直滚动条适应内容大小。
 local msg = CLXZMessage:new_local();
 local wnd = root:GetLXZWindow("folders:vertical slider");
 wnd:ProcMessage("OnReset", msg, wnd);
 
end

--点击目录或者文件项
local function OnClickItem(window, msg, sender)
 local file=HelperGetWindowText(sender:GetChild("text"));
 local path = lfs.currentdir();
 
 local f = path.."\\"..file;
  local attr,err = lfs.attributes (f)
  if attr== nil then
  LXZMessageBox("error:"..err);
  return;
  end
 
 -- LXZMessageBox("type(attr)"..type(attr).."f:"..f)
     assert (type(attr) == "table");
     if attr.mode == "directory" then --如果是目录
  UpdateDirectry(f);  
  end

end

--ui加载时触发该事件
local function OnLoad(window, msg, sender)
 local root = HelperGetRoot();
 
 --set default.
 local default_dir = "c:\\";
 HelperSetWindowText(root:GetLXZWindow("directry"), default_dir);
 
 --set folder list.
 UpdateDirectry(default_dir);
end

--事件与接口绑定
local event_callback = {}
event_callback ["OnUpdate"] = OnUpdate;
event_callback ["OnLoad"] = OnLoad;
event_callback ["OnClickItem"] = OnClickItem;

--事件分发器
function main_dispacher(window, cmd, msg, sender)
--- LXZAPI_OutputDebugStr("cmd 1:"..cmd);
 if(event_callback[cmd] ~= nil) then
--  LXZAPI_OutputDebugStr("cmd 2:"..cmd);
  event_callback[cmd](window, msg, sender);
 end
end

增加权限、创建时间、修改时间等

--增加lua代码

    

    if attr then            
            HelperSetWindowText(wnd:GetChild("access time"), os.date("%c", attr.access) );
            HelperSetWindowText(wnd:GetChild("modify time"), os.date("%c", attr.modification));
            HelperSetWindowText(wnd:GetChild("change time"), os.date("%c", attr.change));
            HelperSetWindowText(wnd:GetChild("permissions"), attr.permissions);
        end

--界面修改如下

--增加浏览图片的功能

--修改lua代码,增加事件

--获取扩展名  
function getextension(filename)  
    return filename:match(".+%.(%w+)$")  
end  


--鼠标进入
local function OnMouseEnterItem(window, msg, sender)
    local file=HelperGetWindowText(sender:GetChild("text"));
    local path = lfs.currentdir();
    
    local f = path.."\\"..file;
     local attr,err = lfs.attributes (f)
     if attr== nil then
        LXZMessageBox("error:"..err);
        return;
     end
     
     local root = HelperGetRoot();    
     assert (type(attr) == "table");
     local ext = getextension(file);
     
     LXZAPI_OutputDebugStr("OnMouseEnterItem:"..f.." mode:"..attr.mode);
     
     if attr.mode == "file" and (ext=="png" or ext=="PNG") then --如果是图片文件
        LXZAPI_OutputDebugStr("OnMouseEnterItem:"..f.." ext:"..ext.." mode:"..attr.mode);
        local wnd = root:GetLXZWindow ("folders:show picture");
        HelperSetWindowPictureFile(wnd,f);
        wnd:Show();
        HelperCoroutine(function(thread)
            AddWndUpdateFunc(wnd, EffectFaceOut, {from=255, End=200,step=3, old=255, hide=true}, thread);        
            coroutine.yield();
            local texture = ILXZTexture:GetTexture(f);
            if texture then
                texture:RemoveTexture();
            end
        end);
     end
end

表现如下

© 著作权归作者所有

共有 人打赏支持
ouloba
粉丝 17
博文 26
码字总数 13824
作品 0
南宁
项目经理
私信 提问
加载中

评论(7)

aaqxhaa1979
aaqxhaa1979
我找到的知乎上的LAE介绍:https://zhuanlan.zhihu.com/p/2174073313
aaqxhaa1979
aaqxhaa1979
13、lae采用Lua编写逻辑代码。Lua是一个小巧的脚本语言,可为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行,具有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,运行效率甚至可以和Native开发媲美。Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lae能够狠容易的集成第三方SDK。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的,并且具有简单易学的特点。这一切都决定了Lua是作为嵌入式脚本的最佳选择,这也正是Lae选择Lua编写逻辑代码的主要原因。
14、自适应各种分辨率和各种DPI(像素密度)。大多数开发工具平台都不可能同时支持自适应分辨率和DPI的功能,导致之前开发的大多数软件无法完美的运行在高DPI显示器上,特别是在手机APP广泛应用之后,这个问题更为突出。lae采用相对布局和绝对布局相结合的方式可以完美地适应不同的分辨率和DPI需求,进而完全避免由于被动放大匹配导致的模糊和毛刺等问题。
15、手机真机预览功能。Lae支持在手机上通过lae浏览器APP,直接查看到即时编辑的效果,无需通过复杂冗长的编译、打包、发布等过程,提供快速直观的运行,让用户可以随时查看自己所开发的APP在手机中的真实表现,极大地方便了APP软件的制作、测试和修改。
16、多语言转换功能,通过更改语言配置文件可实现软件里面的语言相互转换,简单实现用户所开发软件的多语言版本。
aaqxhaa1979
aaqxhaa1979
6、Lua业务逻辑相对独立且纯粹。Lua业务逻辑相对独立且纯粹,界面无代码且和业务逻辑耦合性极小,业务逻辑会更清晰简洁,带来的好处是大幅减低代码量,且由于业务逻辑独立纯粹,使用户更容易理解代码原本的含义,更容易检查维护。
7、自定义控件简单。在Lae中自定义控件非常简单,控件样式亦可随意定义,可以是图片、文字、矢量部件等等,完全满足软件开发者所需要的任何形式的控件。用户可以发明自己的控件,随意自定义各种功能,通过不同组合与不同表现,实现特殊的控件功能,满足专业领域的控件需求,甚至制作出现在完全不存在的控件。一次制作的控件功能能够重复使用在不同的软件和领域中,控件的表现形式可以随意改变,从而重用性和适应性都得到很好的满足,极大的丰富界面控件的表现力。
8、所开发的软件可以相互嵌套而不会产生任何问题。对于lae来说,其所开发的每个软件都可以理解为一个窗口,然而在lae中窗口又可以镶嵌入窗口,所以lae开发的软件可以相互镶嵌。比如用户A做了聊天工具,用户B开发了网络商店,则他们可以相互分享,从而实现聊天工具镶嵌入网络商店,使网络商店具有聊天的功能,或者网络商店里镶嵌入聊天工具,使聊天工具具有网络商店的功能。
9、操作简单,完全可以由非程序员操作,真正实现让专业的人做专业的事。从软件初期设想、整理需求、流程规划、界面设计、页面制作,除了实现具体业务功能这部分工作外,包括UI制作、布局、调整均可由非程序员来完成。使用Lae,让设计的人员完成设计的工作,让美工完成美工的工作,让程序员只做程序员的工作,让专业的人做专业的事,完全省去交流沟通的麻烦,大幅降低沟通成本。
10、Lae运行效率高。由于使用显卡加速,大幅降低cpu的占用,极大的提高用户体验效果。
11、参考图功能。Lae所提供的参考图功能,参考图显示窗口可以打开各种类型的效果图文件,为UI制作的准确布局和色彩搭配等提供直观的参照,甚至可以当成蒙板使用,任何控件、按钮、字体、线条的位置、大小、颜色都不再需要烦杂的调整,减轻设计人员与开发人员之间的沟通麻烦,大幅提高软件UI制作效率。
12、使用LuaIDE作为Lae的代码编辑器。专门的lua代码编辑器LuaIDE提供代码管理、编辑、修改、编译等功能,并且有自动完成提示以及各种帮助注释功能,不需专门的记忆或者查找文档,大大方便代码的编写和降低出错的概率,对维护代码起了很大作用
aaqxhaa1979
aaqxhaa1979
所见即所得的极速app软件开发工具——LAE
lae是一款运行于windows的界面开发工具,可以开发同时运行在windows、Linux、MacOX、iOS、Android等系统平台的软件,适用于开发的软件包括:windows桌面工具软件、管理软件、游戏界面;linux系统桌面工具软件、管理软件、游戏界面;Mac OSX系统上桌面工具软件、管理软件、游戏界面;安卓系统的APP软件、2D游戏;iOS系统上的APP软件、2D游戏等。
相对其他软件界面开发系统,lae拥有许多独特的优点。
1、所见即所得。Lae支持直接在树结构列表和属性列表中操作、修改、设置图片、图标、列表、文字的大小、位置、布局、颜色、字体、渲染组件、特效等,包括简单事件的触发和处理、状态控制、窗口的控制属性,直接在工作区中反映出实际效果,无需编码、无需编译、无需运行。

2、机制简单。使用Lae进行软件开发,所有功能实现步骤都按照事件监听、转发、接收、处理的过程完成,灵活方便,无论什么功能其实现流程都是统一的。
3、跨平台。一次发布,可同时运行在linux、windows、macosx、iOS、Android系统平台上。开发一个软件,如果希望它能够同时运行在不同的平台上,因为不同平台上进行Native开发时需要不同的开发工具、开发语言、不同框架,所需的知识和技能完全不同,所以现行的普遍做法是单独聘请专门的平台开发人员,为每个平台单独开发适配, 导致需要更多的开发人员、更大的资金投入、更长的开发周期。lae能够完美的解决这个问题,运用c++语言编写的虚拟机式的组件式架构和OpenGLES图形渲染机制,可以实现一次开发适配所有平台运行要求,完全没有重复开发的麻烦,带来极速开发和低成本开发的全新体验。
4 、布局自由。Lae中所有窗口可随心所欲修改大小和位置,不受任何限制。窗口可以任意镶嵌,父窗口下可有任意个子窗口,子窗口下还可以有任意孙窗口。依赖的布局窗口可以是父窗口,也可以是前兄弟窗口,而且可任意调整窗口的每条边框的相对布局,还可以用比例布局,可以完美的适应不同的分辨率显示需要。
5、内存透明。属性列表所显示和窗口内存内容完全一致,非常有利于查找并修正程序错误,方便其他非专业人员的使用设置调整相关属性。
第四修正案

引用来自“星罗棋布”的评论

"界面部分用lae实现", 可否简单介绍下 lae.
haohaohao
星罗棋布
星罗棋布
"界面部分用lae实现", 可否简单介绍下 lae.
贾珣
贾珣
+1
Openresty最佳案例 | 第7篇: 模块开发、OpenResty连接Redis

转载请标明出处: http://blog.csdn.net/forezp/article/details/78616714 本文出自方志朋的博客 Lua模块开发 在实际的开发过程中,不可能把所有的lua代码写在一个lua文件中,通常的做法将特...

forezp
2017/11/23
0
0
第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容。 创建工程 我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Coc...

智捷课堂
2015/05/07
0
0
第一个Cocos2d-x Lua游戏

我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容。 创建工程 我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实现,但这种方式不能与Coc...

智捷课堂
2015/05/06
0
0
yanue/nginx-lua-GraphicsMagick

nginx-lua-GraphicsMagick Nginx+Lua+GraphicsMagick,实现自定义图片尺寸功能,支持两种模式[固定高宽模式,定高或定宽模式],支持FastDFS文件存储 github地址:https://github.com/yanue/ngi...

yanue
2016/01/14
0
0
Unity3D 下 Lua 编程解决方案--xLua

Unity3D下Lua编程支持 xLua为Unity3D增加Lua脚本编程的能力,进而提供代码逻辑增量更新的可能。当然不仅仅如此,在coco2dx上的实践告诉我们,以Lua为主打语言的游戏客户端编程是可行的。 xL...

Johnche
2017/01/04
7.6K
6

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
29分钟前
1
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
41分钟前
2
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
43分钟前
9
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
43分钟前
2
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
48分钟前
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部