📄 slider.txt
字号:
;;;464 SLIDER_Obj* pObj;
;;;465 WM_LOCK();
;;;466 pObj = SLIDER_H2P(hObj);
00000c 4620 MOV r0,r4
00000e f7fffffe BL GUI_ALLOC_h2p
;;;467 pObj->NumTicks = NumTicks;
;;;468 WM_InvalidateWindow(hObj);
000012 6485 STR r5,[r0,#0x48]
000014 4620 MOV r0,r4
000016 e8bd4070 POP {r4-r6,lr}
00001a f7ffbffe B.W WM_InvalidateWindow
|L7.30|
;;;469 WM_UNLOCK();
;;;470 }
;;;471 }
00001e bd70 POP {r4-r6,pc}
;;;472
ENDP
AREA ||i.SLIDER_SetRange||, CODE, READONLY, ALIGN=1
SLIDER_SetRange PROC
;;;436 */
;;;437 void SLIDER_SetRange(SLIDER_Handle hObj, int Min, int Max) {
000000 b570 PUSH {r4-r6,lr}
000002 0006 MOVS r6,r0
000004 460c MOV r4,r1
000006 4615 MOV r5,r2
;;;438 if (hObj) {
000008 d014 BEQ |L8.52|
;;;439 SLIDER_Obj* pObj;
;;;440 WM_LOCK();
;;;441 pObj = SLIDER_H2P(hObj);
00000a 4630 MOV r0,r6
00000c f7fffffe BL GUI_ALLOC_h2p
;;;442 if (Max < Min) {
000010 42a5 CMP r5,r4
000012 da00 BGE |L8.22|
;;;443 Max = Min;
000014 4625 MOV r5,r4
|L8.22|
;;;444 }
;;;445 pObj->Min = Min;
;;;446 pObj->Max = Max;
;;;447 if (pObj->v < Min) {
000016 e9c0450e STRD r4,r5,[r0,#0x38]
00001a 6c01 LDR r1,[r0,#0x40]
00001c 42a1 CMP r1,r4
00001e da00 BGE |L8.34|
;;;448 pObj->v = Min;
000020 6404 STR r4,[r0,#0x40]
|L8.34|
;;;449 }
;;;450 if (pObj->v > Max) {
000022 6c01 LDR r1,[r0,#0x40]
000024 42a9 CMP r1,r5
000026 dd00 BLE |L8.42|
;;;451 pObj->v = Max;
000028 6405 STR r5,[r0,#0x40]
|L8.42|
;;;452 }
;;;453 WM_InvalidateWindow(hObj);
00002a 4630 MOV r0,r6
00002c e8bd4070 POP {r4-r6,lr}
000030 f7ffbffe B.W WM_InvalidateWindow
|L8.52|
;;;454 WM_UNLOCK();
;;;455 }
;;;456 }
000034 bd70 POP {r4-r6,pc}
;;;457
ENDP
AREA ||i.SLIDER_SetValue||, CODE, READONLY, ALIGN=1
SLIDER_SetValue PROC
;;;411 */
;;;412 void SLIDER_SetValue(SLIDER_Handle hObj, int v) {
000000 b570 PUSH {r4-r6,lr}
000002 0005 MOVS r5,r0
000004 460c MOV r4,r1
;;;413 SLIDER_Obj* pObj;
;;;414 if (hObj) {
000006 d017 BEQ |L9.56|
;;;415 WM_LOCK();
;;;416 pObj = SLIDER_H2P(hObj);
000008 4628 MOV r0,r5
00000a f7fffffe BL GUI_ALLOC_h2p
;;;417 /* Put in min/max range */
;;;418 if (v < pObj->Min) {
00000e 6b81 LDR r1,[r0,#0x38]
000010 42a1 CMP r1,r4
000012 dd00 BLE |L9.22|
;;;419 v = pObj->Min;
000014 460c MOV r4,r1
|L9.22|
;;;420 }
;;;421 if (v > pObj->Max) {
000016 6bc1 LDR r1,[r0,#0x3c]
000018 42a1 CMP r1,r4
00001a da00 BGE |L9.30|
;;;422 v = pObj->Max;
00001c 460c MOV r4,r1
|L9.30|
;;;423 }
;;;424 if (pObj->v != v) {
00001e 6c01 LDR r1,[r0,#0x40]
000020 42a1 CMP r1,r4
000022 d009 BEQ |L9.56|
;;;425 pObj->v = v;
;;;426 WM_InvalidateWindow(hObj);
000024 6404 STR r4,[r0,#0x40]
000026 4628 MOV r0,r5
000028 f7fffffe BL WM_InvalidateWindow
;;;427 WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
00002c 4628 MOV r0,r5
00002e e8bd4070 POP {r4-r6,lr}
000032 2105 MOVS r1,#5
000034 f7ffbffe B.W WM_NotifyParent
|L9.56|
;;;428 }
;;;429 WM_UNLOCK();
;;;430 }
;;;431 }
000038 bd70 POP {r4-r6,pc}
;;;432
ENDP
AREA ||i.SLIDER_SetWidth||, CODE, READONLY, ALIGN=1
SLIDER_SetWidth PROC
;;;394 */
;;;395 void SLIDER_SetWidth(SLIDER_Handle hObj, int Width) {
000000 b570 PUSH {r4-r6,lr}
000002 0005 MOVS r5,r0
000004 460c MOV r4,r1
;;;396 SLIDER_Obj* pObj;
;;;397 if (hObj) {
000006 d00d BEQ |L10.36|
;;;398 WM_LOCK();
;;;399 pObj = SLIDER_H2P(hObj);
000008 4628 MOV r0,r5
00000a f7fffffe BL GUI_ALLOC_h2p
;;;400 if (pObj->Width != Width) {
00000e f9b0104c LDRSH r1,[r0,#0x4c]
000012 42a1 CMP r1,r4
000014 d006 BEQ |L10.36|
;;;401 pObj->Width = Width;
000016 f8a0404c STRH r4,[r0,#0x4c]
;;;402 WM_InvalidateWindow(hObj);
00001a 4628 MOV r0,r5
00001c e8bd4070 POP {r4-r6,lr}
000020 f7ffbffe B.W WM_InvalidateWindow
|L10.36|
;;;403 }
;;;404 WM_UNLOCK();
;;;405 }
;;;406 }
000024 bd70 POP {r4-r6,pc}
;;;407
ENDP
AREA ||i._OnTouch||, CODE, READONLY, ALIGN=1
_OnTouch PROC
;;;210 */
;;;211 static void _OnTouch(SLIDER_Handle hObj, SLIDER_Obj* pObj, WM_MESSAGE*pMsg) {
000000 e92d47f0 PUSH {r4-r10,lr}
000004 4682 MOV r10,r0
;;;212 const GUI_PID_STATE* pState = (const GUI_PID_STATE*)pMsg->Data.p;
;;;213 if (pMsg->Data.p) { /* Something happened in our area (pressed or released) */
000006 6890 LDR r0,[r2,#8]
000008 460c MOV r4,r1 ;211
00000a 2800 CMP r0,#0
00000c d05b BEQ |L11.198|
;;;214 if (pState->Pressed) {
00000e 7a01 LDRB r1,[r0,#8]
000010 f44f7980 MOV r9,#0x100
000014 2900 CMP r1,#0
000016 d046 BEQ |L11.166|
;;;215 int x0, xsize, x, Sel, Range;
;;;216 Range = (pObj->Max - pObj->Min);
000018 e9d4210e LDRD r2,r1,[r4,#0x38]
00001c 1a8e SUBS r6,r1,r2
;;;217 x0 = 1 + pObj->Width / 2; /* 1 pixel focus rectangle + width of actual slider */
00001e f9b4104c LDRSH r1,[r4,#0x4c]
000022 f04f0801 MOV r8,#1
000026 eb0172d1 ADD r2,r1,r1,LSR #31
;;;218 x = (pObj->Widget.State & WIDGET_STATE_VERTICAL) ? pState->y : pState->x;
00002a 8ce1 LDRH r1,[r4,#0x26]
00002c eb080762 ADD r7,r8,r2,ASR #1 ;217
000030 0709 LSLS r1,r1,#28
000032 d501 BPL |L11.56|
000034 6840 LDR r0,[r0,#4]
000036 e000 B |L11.58|
|L11.56|
000038 6800 LDR r0,[r0,#0]
|L11.58|
;;;219 x -= x0;
00003a 1bc5 SUBS r5,r0,r7
;;;220 xsize = WIDGET__GetWindowSizeX(hObj) - 2 * x0;
00003c 4650 MOV r0,r10
00003e f7fffffe BL WIDGET__GetWindowSizeX
000042 4279 RSBS r1,r7,#0
000044 eb000041 ADD r0,r0,r1,LSL #1
;;;221 if (x <= 0) {
000048 2d00 CMP r5,#0
00004a dc01 BGT |L11.80|
;;;222 Sel = pObj->Min;
00004c 6ba5 LDR r5,[r4,#0x38]
00004e e00f B |L11.112|
|L11.80|
;;;223 } else if (x >= xsize) {
000050 4285 CMP r5,r0
000052 db01 BLT |L11.88|
;;;224 Sel = pObj->Max;
000054 6be5 LDR r5,[r4,#0x3c]
000056 e00b B |L11.112|
|L11.88|
;;;225 } else {
;;;226 int Div;
;;;227 Div = xsize ? xsize : 1; /* Make sure we do not divide by 0, even though xsize should never be 0 in this case anyhow */
000058 4641 MOV r1,r8
00005a b100 CBZ r0,|L11.94|
00005c 4601 MOV r1,r0
|L11.94|
;;;228 Sel = pObj->Min + ((U32)Range * (U32)x + Div / 2) / Div;
00005e 436e MULS r6,r5,r6
000060 eb0170d1 ADD r0,r1,r1,LSR #31
000064 eb060060 ADD r0,r6,r0,ASR #1
000068 fbb0f0f1 UDIV r0,r0,r1
00006c 6ba1 LDR r1,[r4,#0x38]
00006e 1845 ADDS r5,r0,r1
|L11.112|
;;;229 }
;;;230 if (WM_IsFocussable(hObj)) {
000070 4650 MOV r0,r10
000072 f7fffffe BL WM_IsFocussable
000076 b110 CBZ r0,|L11.126|
;;;231 WM_SetFocus(hObj);
000078 4650 MOV r0,r10
00007a f7fffffe BL WM_SetFocus
|L11.126|
;;;232 }
;;;233 WM_SetCapture(hObj, 1);
00007e 2101 MOVS r1,#1
000080 4650 MOV r0,r10
000082 f7fffffe BL WM_SetCapture
;;;234 SLIDER_SetValue(hObj, Sel);
000086 4629 MOV r1,r5
000088 4650 MOV r0,r10
00008a f7fffffe BL SLIDER_SetValue
;;;235 if ((pObj->Widget.State & SLIDER_STATE_PRESSED) == 0){
00008e 8ce0 LDRH r0,[r4,#0x26]
000090 05c0 LSLS r0,r0,#23
000092 d418 BMI |L11.198|
000094 4649 MOV r1,r9
000096 4650 MOV r0,r10
000098 f7fffffe BL WIDGET_OrState
00009c 8ba0 LDRH r0,[r4,#0x1c]
00009e 0780 LSLS r0,r0,#30
0000a0 d511 BPL |L11.198|
0000a2 2101 MOVS r1,#1
0000a4 e00a B |L11.188|
|L11.166|
;;;236 _SliderPressed(hObj, pObj);
;;;237 }
;;;238 } else {
;;;239 /* React only if button was pressed before ... avoid problems with moving / hiding windows above (such as dropdown) */
;;;240 if (pObj->Widget.State & SLIDER_STATE_PRESSED) {
0000a6 8ce0 LDRH r0,[r4,#0x26]
0000a8 05c0 LSLS r0,r0,#23
0000aa d50c BPL |L11.198|
0000ac 4649 MOV r1,r9
0000ae 4650 MOV r0,r10
0000b0 f7fffffe BL WIDGET_AndState
0000b4 8ba0 LDRH r0,[r4,#0x1c]
0000b6 0780 LSLS r0,r0,#30
0000b8 d505 BPL |L11.198|
0000ba 2102 MOVS r1,#2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -