lgq
2026-03-31 e491cdb48129752324c4e3764f99bd9203c56dec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
//build:20240724
/**
 * UI 的基础组件,需要先了解一些概念
 * 1. 图层:设备具备2个基本图层,主图层(main)和顶部图层(top)
      其中TOP图层永远在主图层之上,主图层切换页面不会挡住TOP图层,TOP图层用于显示一些状态栏是比较合适的。
      其中主图层可以预先在内存中构造多个页面,然后通过loadMain来加载切换不同的页面。而TOP图层不能切换,只能让ui对象隐藏或删除
 
 * 2. UI对象:有很多种类的UI对象,其中最基础的是 'view' 对象,主图层和顶部图层的根ui对象必须是 'view'对象,剩下的 ui 对象都是某个 ui 对象的子ui。
      ui对象包括常见的 'button'、'label'、'image'等等,所有对象都有一些通用的属性,也有一些独特的属性
      所有 ui 对象都有全局唯一的 id ,不能重复。通用的属性还包括
      - type:获取ui对象的类型,字符串
      - parent:获取ui对象的父节点,字符串
      - children:获取ui对象的所有子对象的id,字符串数组
 
 * 3. dxui文件:以.dxui为扩展名的文件是利用可视化拖拽工具生成的 ui 树,工具会自动生成对应的js文件,可以import对应的js文件来操作
 
 */
 
import logger from './dxLogger.js'
import utils from './uiUtils.js'
import button from './uiButton.js'
import font from './uiFont.js'
import image from './uiImage.js'
import label from './uiLabel.js'
import line from './uiLine.js'
import list from './uiList.js'
import dropdown from './uiDropdown.js'
import checkbox from './uiCheckbox.js'
import slider from './uiSlider.js'
import _switch from './uiSwitch.js'
import textarea from './uiTextarea.js'
import keyboard from './uiKeyboard.js'
import style from './uiStyle.js'
import view from './uiView.js'
import buttons from './uiButtons.js'
 
const dxui = {}
dxui.Button = button
dxui.Font = font
dxui.Image = image
dxui.Label = label
dxui.Line = line
dxui.List = list
dxui.Dropdown = dropdown
dxui.Checkbox = checkbox
dxui.Slider = slider
dxui.Switch = _switch
dxui.Textarea = textarea
dxui.Keyboard = keyboard
dxui.Style = style
dxui.View = view
dxui.Utils = utils
dxui.Buttons = buttons
let orientation = 1 //默认横屏
/**
 * 初始化,必须在代码最前面调用
 * @param {object} options 初始化参数
 *        @param {number} options.orientation 屏幕方向 可以为0,1,2,3,分别表示竖屏,屏幕在左;横屏,屏幕在上;竖屏,屏幕在右;横批,屏幕在下
 * @param {object} context 上下文,每个应用都有唯一的一个上下文变量,不同的js可以都引用dxUi.js,但是context必须一致 
*/
dxui.init = function (options, context = {}) {
     this.initContext(context)
     if (options && options.orientation != undefined && options.orientation != null && [0, 1, 2, 3].includes(options.orientation)) {
          orientation = options.orientation
     }
     utils.GG.NativeDisp.lvDispSetRotation(orientation)
}
/**
 * 初始化上下文,每个应用都有唯一的一个上下文变量,不同的js可以都引用dxUi.js,但是context必须一致
 * 在构建ui前需要初始化
 * @param {object} context 初始是一个空对象{}
 */
dxui.initContext = function (context) {
     utils.validateObject(context)
     dxui.all = context
     dxui.Button.all = dxui.all
     dxui.Image.all = dxui.all
     dxui.Label.all = dxui.all
     dxui.Line.all = dxui.all
     dxui.List.all = dxui.all
     dxui.Dropdown.all = dxui.all
     dxui.Checkbox.all = dxui.all
     dxui.Slider.all = dxui.all
     dxui.Switch.all = dxui.all
     dxui.Textarea.all = dxui.all
     dxui.Keyboard.all = dxui.all
     dxui.View.all = dxui.all
     dxui.Buttons.all = dxui.all
}
/**
 * 根据id获取已经构建的ui对象
 * @param {string} id 
 * @returns 
 */
dxui.getUi = function (id) {
     return dxui.all[id]
}
/**
 * 外部循环需要调用此方法
 */
dxui.handler = function () {
     return utils.GG.NativeTimer.lvTimerHandler()
}
/**
 * 获取屏幕方向,不同的屏幕方向可能要加载不同的ui或不同的处理逻辑
 * @returns 可以为0,1,2,3,分别表示竖屏,屏幕在左;横屏,屏幕在上;竖屏,屏幕在右;横批,屏幕在下
 */
dxui.getOrientation = function () {
     return orientation;
}
/**
 * 创建一个定时器,每隔ms毫秒执行一次回调函数,主要用于定时刷新某个ui对象的值
 * 可以在回调函数里删除定时器(clearInterval)来实现setTimeout的效果
 * @param {string} id 定时器的唯一标识 必填
 * @param {function} callback 回调函数(可以是匿名函数)
 * @param {number} ms 毫秒数
 * @param {object} user_data 用户数据,传递给回调参数
 * @returns 定时器句柄 
 */
dxui.setInterval = function (id, callback, ms, user_data) {
     if (utils.validateId(dxui.all, id))
          if (!callback || (typeof callback != 'function') || !callback.name || callback.name === '') {
               throw new Error('The callback should not be null and should be named function')
          }
     if (!ms || (typeof ms != 'number')) {
          throw new Error('The interval should not be empty, and should be number')
     }
     if (!this.all.__interval) {
          this.all.__interval = {}
     }
     this.all.__interval[id] = utils.GG.NativeTimer.lvTimerCreate(callback, ms, user_data)
}
/**
 * 定时器不再需要后,可以删除这个定时器
 * @param {string} id 定时器id 
 */
dxui.clearInterval = function (id) {
     if (!dxui.all[id]) {
          return
     }
     utils.GG.NativeTimer.lvTimerDel(dxui.all[id])
     delete dxui.all.__interval[id]
}
/**
 * 获取ui对象的父对象
 * @param {Object} ui 
 */
dxui.getParent = function (ui) {
     if (ui.parent) {
          return dxui.getUi(ui.parent)
     }
     return null
}
/**
 * 删除当前自身ui对象
 */
dxui.del = function (ui) {
     function recursiveDelete(ui) {
          // 如果对象不存在,直接返回
          if (!dxui.all[ui.id]) {
               return;
          }
 
          // 先递归删除所有子对象
          if (ui.children && Array.isArray(ui.children)) {
               // 倒序遍历子节点
               for (let i = ui.children.length - 1; i >= 0; i--) {
                    const childId = ui.children[i];
                    if (dxui.all[childId]) {
                         recursiveDelete(dxui.all[childId]);
                    }
               }
          }
          // 从父对象中移除当前对象
          if (ui.parent && dxui.all[ui.parent] && Array.isArray(dxui.all[ui.parent].children)) {
               const children = dxui.all[ui.parent].children
               let index = children.indexOf(ui.id);
               if (index !== -1) {
                    children.splice(index, 1);
               }
          }
 
          // 删除当前对象
          ui.obj.lvObjDel();
          delete dxui.all[ui.id];
     }
 
     // 开始递归删除
     recursiveDelete(ui);
}
/**
 * 在主图层加载(切换)已经构建好的 ui 对象,
 * @param {object} ui 使用build函数构建的 ui 对象
 */
dxui.loadMain = function (ui) {
     if (!ui || !ui.obj) {
          throw new Error("dxui.loadMain:'ui' paramter should not be null")
     }
     // 加载主屏幕
     utils.GG.NativeDisp.lvScrLoad(ui.obj)
}
/**
 * 从最后一个用户活动显示(如点击)经过的时间
 * @returns 返回从最后一个活动开始的经过时间(毫秒)
 */
dxui.getIdleDuration = function () {
     return utils.GG.NativeDisp.lvDispGetInactiveTime()
}
/**
 * 重置用户活动显示(如点击)经过的时间
 */
dxui.trigActivity = function () {
     utils.GG.NativeDisp.lvDispTrigActivity()
}
 
export default dxui;