Rich UI 끌어서 놓기
사용자가 한 위치에서 다른 위치로 위젯을 끌어서 놓을 수 있도록 코드를 작성할 수 있습니다. 좀 더 광범위하게 사용자 코드가 다음 사용자 이벤트에 응답할 수 있습니다(사용자가 위치를 잡을 때의 단일 마우스 다운 이벤트, 이후의 마우스 이동 이벤트, 단일 마우스 업 이벤트). 끌어서 놓기에 의해 표시되는 런타임 태스크를 이행할 수 있습니다. Rich UI에서는 이 동작을 정의하지 않습니다.
위젯 선언에서 세 개의 특성을 정의하고 해당 특성 값에서 참조할 함수를 작성하여 끌어서 놓기 코드를 작성합니다.
예를 들어 다음은 단추에 대한 선언입니다.
b1 Button {
text = "Button 1", position="absolute", x=10, y=10,
onStartDrag = start, onDrag = drag, onDropOnTarget = drop};
다음은 끌어서 놓기를 사용 가능하게 하는 세 개의 특성입니다.
- onStartDrag는 끄는 조작을 시작할 때 EGL 런타임에서 한 번 호출하는 함수를 참조합니다.
이 함수는 다음 위임 파트에 있는 특성을 가집니다.
Delegate StartDragFunction(widget Widget in, x int in, y int in) returns (Boolean)이 함수는 위젯에 대한 참조를 받고 마우스 포인터의 절대 x와 y 좌표를 받습니다. 또한 끄는 조작을 계속할지 여부를 나타내는 부울 값을 리턴합니다.
- onDrag는 끄는 조작을 진행함에 따라(특히 브라우저에서 마우스 이동 이벤트를 기록할 때마다) EGL 런타임에서 반복적으로 호출하는 함수를 참조합니다.
이 함수는 다음 위임 파트에 있는 특성을 가집니다.
Delegate DragFunction(widget Widget in, dropTarget Widget in, x int in, y int in)이 함수는 끌고 있는 위젯 및 마우스 포인트가 통과하고 있는 위젯(있는 경우)에 대한 참조를 받습니다. 마우스 포인터가 위젯을 통과하지 않는 경우 두 번째 인수는 널입니다. 또한 이 함수는 마우스 포인트의 절대 x와 y 좌표를 수신하고 리턴값은 없습니다. 함수 자체는 마우스 이동 이벤트에 대한 응답에서 위젯(또는 일부 다른 이미지)의 위치를 업데이트해야 합니다.
- onDropOnTarget은 사용자가 끄는 조작 끝에서 마우스를 해제할 때 EGL 런타임에서 한 번 호출하는 함수를 참조합니다.
이 함수는 다음 위임 파트에 있는 특성을 가집니다.
Delegate DropOnTargetFunction(widget Widget in, dropTarget Widget in, x int in, y int in)이 함수는 놓고 있는 위젯 및 마우스 포인트 아래에 있는 위젯(있는 경우)에 대한 참조를 받습니다. 위젯이 마우스 포인터 아래에 있지 않은 경우 두 번째 인수는 널입니다. 또한 이 함수는 마우스 포인트의 절대 x와 y 좌표를 수신하고 리턴값은 없습니다.
다음은 작업공간으로 가져올 수 있는 예입니다.
import com.ibm.egl.rui.widgets.TextField;
handler MyHandler type RUIHandler{initialUI =[myTextField]}
myTextField TextField{text =
"What a drag!", position = "absolute", x = 110, y = 210, width = 120,
onStartDrag = start, onDrag = drag, onDropOnTarget = drop};
dx, dy int;
function start(myWidget Widget in, x int in, y int in) returns(boolean)
dx = x - myWidget.x;
dy = y - myWidget.y;
return(true);
end
function drag(myWidget Widget in, drop Widget in, x int in, y int in)
myWidget.x = x - dx;
myWidget.y = y - dy;
end
function drop(widget Widget in, drop Widget in, x int in, y int in)
end
end
start 함수는 마우스 포인터의 위치와 위젯의 왼쪽 맨 위 모서리 간의 차이를 계산합니다.
해당 계산을 사용하면 조작하는 동안 마우스 포인터가 동일한 위치에 표시되는 효과가 있습니다.
이러한 효과를 보려면 코드를 두 번 실행하고 위젯의 오른쪽 맨 아래 모서리를 클릭하여 다음과 같은 상황이 발생할 때마다 끌어서 놓기 조작을 시작합니다.
- 표시된 대로 코드를 실행합니다.
- drag 함수의 명령문을 다음 지정으로 바꾼 후에만 코드를 실행합니다.
myWidget.x = x; myWidget.y = y;
추가 예는 Rich UI 새도우에 있습니다.