forked from rhett-lee/nim_duilib
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCombo.h
More file actions
435 lines (349 loc) · 12.3 KB
/
Copy pathCombo.h
File metadata and controls
435 lines (349 loc) · 12.3 KB
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
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
#ifndef UI_CONTROL_COMBO_H_
#define UI_CONTROL_COMBO_H_
#include "duilib/Core/Box.h"
#include "duilib/Control/TreeView.h"
#include "duilib/Control/RichEdit.h"
namespace ui
{
class RichEdit;
class CComboWnd;
/** 组合框控件
*/
class UILIB_API Combo : public Box
{
typedef Box BaseClass;
friend class CComboWnd;
public:
explicit Combo(Window* pWindow);
Combo(const Combo& r) = delete;
Combo& operator=(const Combo& r) = delete;
virtual ~Combo() override;
/// 重写父类方法,提供个性化功能,请参考父类声明
virtual DString GetType() const override;
virtual void SetAttribute(const DString& strName, const DString& strValue) override;
virtual bool CanPlaceCaptionBar() const override;
virtual DString GetBorderColor(ControlStateType stateType) const override;
/** DPI发生变化,更新控件大小和布局
* @param [in] nOldDpiScale 旧的DPI缩放百分比
* @param [in] nNewDpiScale 新的DPI缩放百分比,与Dpi().GetScale()的值一致
*/
virtual void ChangeDpiScale(uint32_t nOldDpiScale, uint32_t nNewDpiScale) override;
/** 语言发生变化,刷新界面文字显示相关的内容
*/
virtual void OnLanguageChanged() override;
protected:
virtual void OnInit() override;
public:
/** Combo类型
*/
enum ComboType
{
//下拉列表, 不可编辑输入
kCombo_DropList = 0,
//编辑列表,可编辑输入
kCombo_DropDown = 1
};
/** 设置Combo类型
*/
void SetComboType(ComboType comboType);
/** 获取Combo类型
*/
ComboType GetComboType() const;
/** 获取下拉框列表大小(宽度和高度)
*/
const UiSize& GetDropBoxSize() const;
/** 设置下拉框列表大小(宽度和高度)
* @param [in] szDropBox 要设置的大小信息
* @param [in] bNeedScaleDpi 是否需要做DPI自适应
*/
void SetDropBoxSize(UiSize szDropBox, bool bNeedScaleDpi);
/** 设置 Combobox 是否向上弹出
* @param[in] top 为 true 则向上弹出,false 为默认向下弹出
*/
void SetPopupTop(bool top) { m_bPopupTop = top; }
/** 判断 Combobox 弹出模式是否是向上弹出
* @return 返回 true 表示向上弹出,否则为 false
*/
bool IsPopupTop() const { return m_bPopupTop; }
/** 设置下拉表TreeView的Class属性
*/
void SetComboTreeClass(const DString& classValue);
/** 设置下拉表TreeView的节点Class属性
*/
void SetComboTreeNodeClass(const DString& classValue);
/** 设置显示图标的Class属性
*/
void SetIconControlClass(const DString& classValue);
/** 设置编辑控件的Class属性
*/
void SetEditControlClass(const DString& classValue);
/** 设置按钮控件的Class属性
*/
void SetButtonControlClass(const DString& classValue);
public:
/** 获取Combo列表中的子项个数
*/
size_t GetCount() const;
/** 获取当前选择项索引
* @return 返回当前选择项索引, (如果无有效索引,则返回Box::InvalidIndex)
*/
size_t GetCurSel() const;
/** 选择一个子项, 不触发选择事件
* @param[in] iIndex 要选择的子项索引
* @return 返回 true 表示成功,否则为 false
*/
bool SetCurSel(size_t iIndex);
/** 获取子项关联的数据
* @param [in] iIndex 子项索引号
* @return 返回该索引号关联的数据
*/
size_t GetItemData(size_t iIndex) const;
/** 设置子项关联的数据
* @param [in] iIndex 子项索引号
* @param [in] itemData 需要保存的数据
*/
bool SetItemData(size_t iIndex, size_t itemData);
/** 获取子项的文本
* @param [in] iIndex 子项索引号
*/
DString GetItemText(size_t iIndex) const;
/** 获取子项的文本ID(支持多语言版)
* @param [in] iIndex 子项索引号
*/
DString GetItemTextId(size_t iIndex) const;
/** 设置子项的文本
* @param [in] iIndex 子项索引号
* @param [in] itemText 子项的文本内容
*/
bool SetItemText(size_t iIndex, const DString& itemText);
/** 设置子项的文本ID(支持多语言版)
* @param [in] iIndex 子项索引号
* @param [in] itemTextId 子项的文本内容ID
*/
bool SetItemTextId(size_t iIndex, const DString& itemTextId);
/** 添加一个子项字符串
* @param [in] itemText 子项的文本内容
* @return 返回新添加的子项索引号
*/
size_t AddTextItem(const DString& itemText);
/** 添加一个子项字符串ID
* @param [in] itemTextId 子项的文本内容(支持多语言版)
* @return 返回新添加的子项索引号
*/
size_t AddTextIdItem(const DString& itemTextId);
/** 在指定索引号位置, 插入一个子项字符串, 返回新添加的子项索引号
* @param [in] iIndex 子项索引号
* @param [in] itemText 子项的文本内容
*/
size_t InsertTextItem(size_t iIndex, const DString& itemText);
/** 在指定索引号位置, 插入一个子项字符串, 返回新添加的子项索引号
* @param [in] iIndex 子项索引号
* @param [in] itemText 子项的文本内容ID(支持多语言版)
*/
size_t InsertTextIdItem(size_t iIndex, const DString& itemTextId);
/** 删除一个子项
* @param [in] iIndex 子项索引号
*/
bool DeleteItem(size_t iIndex);
/** 移除所有子节点
*/
void DeleteAllItems();
/** 选择匹配的文本项目
* @param [in] itemText 子项的文本内容
* @param [in] bTriggerEvent bTriggerEvent 是否触发选择事件, 如果为true,会触发一个kEventSelect事件
* @return 返回该选中项的索引号,如果未能选中,则返回Box::InvalidIndex
*/
size_t SelectTextItem(const DString& itemText, bool bTriggerEvent = true);
public:
/** 获取当前编辑框内的文本
*/
DString GetText() const;
/** 设置编辑框内的文本
*/
void SetText(const DString& text);
/** 让控件获取焦点
*/
virtual void SetFocus() override;
public:
/** 获取下拉列表的树接口
*/
TreeView* GetTreeView();
/** 获取图标控件
*/
Control* GetIconControl() const;
/** 编辑框控件
*/
RichEdit* GetEditControl() const;
/** 按钮控件
*/
Button* GetButtonContrl() const;
/** 更新下拉列表窗口的位置
*/
void UpdateComboWndPos();
/** 下拉框的窗口接口(只有在显示时能获取到,隐藏时即失效)
*/
Window* GetComboWnd() const;
/** 设置下拉窗口的阴影类型
*/
void SetComboWndShadowType(Shadow::ShadowType nShadowType);
/** 获取下拉窗口的阴影类型
*/
Shadow::ShadowType GetComboWndShadowType() const;
public:
/** 监听子项被选择事件
* @param [in] callback 子项被选择后触发的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachSelect(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventSelect, callback, callbackID);}
/** 监听下拉窗创建事件
* @param [in] callback 下拉窗关闭后触发的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachWindowCreate(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventWindowCreate, callback, callbackID); }
/** 监听下拉窗关闭事件
* @param [in] callback 下拉窗关闭后触发的回调函数
* @param [in] callbackID 该回调函数对应的ID(用于删除回调函数)
*/
void AttachWindowClose(const EventCallback& callback, EventCallbackID callbackID = 0) { AttachEvent(kEventWindowClose, callback, callbackID); }
protected:
/** 显示下拉列表
*/
virtual void ShowComboList();
/** 关闭下拉列表
*/
virtual void HideComboList();
/** 更新下拉列表
*/
virtual void UpdateComboList();
/** 默认的子项被选择处理函数
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnSelectItem(const EventArgs& args);
/** 下拉框窗口关闭
* @param [in] bCanceled true表示取消,否则表示正常关闭
* @param [in] needUpdateSelItem true表示需要更新选择项,否则不需要更新选择项
* @param [in] oldEditText 下拉框显示时,编辑框的文本内容
*/
virtual void OnComboWndClosed(bool bCanceled,
bool needUpdateSelItem,
const DString& oldEditText);
/** 鼠标按下按钮
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnButtonDown(const EventArgs& args);
/** 点击按钮
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnButtonClicked(const EventArgs& args);
/** 鼠标在Edit上面按下按钮
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditButtonDown(const EventArgs& args);
/** 鼠标在Edit上面弹起按钮
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditButtonUp(const EventArgs& args);
/** 在Edit上按键
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditKeyDown(const EventArgs& args);
/** Edit控件获得焦点
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditSetFocus(const EventArgs& args);
/** Edit控件失去焦点
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditKillFocus(const EventArgs& args);
/** 窗口失去焦点
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnWindowKillFocus(const EventArgs& args) override;
/** 窗口移动
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnWindowMove(const EventArgs& args);
/** 选择项变化,同步Edit控件的文本
*/
virtual void OnSelectedItemChanged();
/** Edit的文本内容发生变化
* @param[in] args 参数列表
* @return 始终返回 true
*/
virtual bool OnEditTextChanged(const ui::EventArgs& args);
private:
/** 解析属性列表
*/
void ParseAttributeList(const DString& strList,
std::vector<std::pair<DString, DString>>& attributeList) const;
/** 设置控件的属性列表
*/
void SetAttributeList(Control* pControl, const DString& classValue);
/** 移除控件
*/
void RemoveControl(Control* pControl);
/** 创建一个新的树节点
* @param [in] itemText 子项的文本内容
* @param [in] bTextId itemText的文本内容是否为文本ID(支持多语言版)
*/
TreeNode* CreateTreeNode(const DString& itemText, bool bTextId);
/** 挂载该控件的鼠标事件,设置焦点
*/
void AttachMouseEvents(Control* pControl);
/** 在指定索引号位置, 插入一个子项字符串, 返回新添加的子项索引号
* @param [in] iIndex 子项索引号
* @param [in] itemText 子项的文本内容
* @param [in] bTextId itemText的文本内容是否为文本ID(支持多语言版)
*/
size_t PrivateInsertTextItem(size_t iIndex, const DString& itemText, bool bTextId);
private:
/** Combo类型
*/
uint8_t m_comboType;
/** 列表树的接口
*/
TreeView m_treeView;
/** 下拉列表的窗口接口
*/
CComboWnd* m_pWindow;
/** 阴影类型
*/
Shadow::ShadowType m_nShadowType;
/** 下拉列表的大小(宽度和高度)
*/
UiSize m_szDropBox;
/** 下拉列表是否向上弹出
*/
bool m_bPopupTop;
/** 下拉表TreeView的节点Class属性
*/
UiString m_treeNodeClass;
private:
/** 图标控件
*/
ControlPtr m_pIconControl;
/** 编辑框控件
*/
ControlPtrT<RichEdit> m_pEditControl;
/** 按钮控件
*/
ControlPtrT<Button> m_pButtonControl;
/** 当前选择项索引号
*/
size_t m_iCurSel;
/** 鼠标按下的时候,是否正在显示下拉列表
*/
bool m_bDropListShown;
};
} // namespace ui
#endif // UI_CONTROL_COMBO_H_