Re[3]: move()+update()
От: eudo Мухосранск  
Дата: 18.10.08 00:50
Оценка: 2 (1)
C>Хм, так он вообще не передвигается )

Вообще-то и не должно. В вашем случае, для одноразового перемещения, используйте style#left&right. Move немного другие вещи делает

Или вот вам код tiscript, если нужно что-то тягать мышкой в пределах view. Этот бихейвор реализует эффективное перемещение элемента мышкой, посмотрите на clear и на контекст. Или опишите задачу.

type Wnd: Behavior
{
    function this()
    {
        this.xoff = 0;
        this.yoff = 0;
        this.dragging = false;
    }

    function attached()
    {
        this.cap = this.select(":root>caption");
        if(!this.cap) this.cap = this;
        this.classRemoved = false;
    }

    function onMouse(evt)
    {
        switch(evt.type) 
        {
            case Event.MOUSE_DOWN:
                // Becouse evt.target is TEXT tag
                if( evt.target.parent === this.cap || evt.target === this.cap)
                {
                    this.boxW = this.box(#width);
                    this.boxH = this.box(#height);

                    this.viewW = view.box(#width);
                    this.viewH = view.box(#height);

                    this.xoff = evt.x;
                    this.yoff = evt.y;
    
                    this.dragging = true;
                    this.cap.capture(true);

                    return true;
                }
            break;
        
            case Event.MOUSE_UP:
                if(this.dragging)
                {
                    this.dragging = false;
                    this.cap.capture(false); 

                    var nx = evt.xRoot - evt.x + this.box(#left, #margin, #self) + this.cap.box(#left, #margin, #self),
                        ny = evt.yRoot - evt.y + this.box(#top, #margin, #self) + this.cap.box(#top, #margin, #self);

                    if(nx > this.viewW - this.boxW)
                        nx = this.viewW - this.boxW;

                    if(ny > this.viewH - this.boxH)
                        ny = this.viewH - this.boxH;

                    this.style.clear();
                    this.style#left = nx >= 0 ? nx : 0;
                    this.style#top = ny >= 0 ? ny : 0;

                    return true;
                }
            break;
            case Event.MOUSE_MOVE:
                if(this.dragging)
                {
                    var mx = this.box(#left, #margin, #self), 
                        my = this.box(#top, #margin, #self);

                    var nx = evt.xView - this.xoff, 
                        ny = evt.yView - this.yoff;

                    if(nx >= this.viewW - (this.boxW - mx))
                        nx = this.viewW - this.boxW + mx;

                    if(ny >= this.viewH - this.boxH - -1*my)
                        ny = this.viewH - this.boxH + my;

                    var dx = nx + mx, dy = ny + my;

                    if(dx <= 0) nx = -1*mx;
                    if(dy <= 0) ny = -1*my;

                    this.move(nx, ny);

                    return true;
                }
            break;
        }
    }

    function setCenter()
    {
        var boxW = this.box(#width), boxH = this.box(#height);
        var viewW = self.box(#width), viewH = self.box(#height);
        var x = viewW/2 - boxW/2, y = viewH/2 - boxH/2;

        this.style#left = x;
        this.style#top = y;
    }
}


Используйте вот примерно так:

<widget style="prototype:Wnd;position:absolute;">
<caption>Caption</caption>
Супер-далог
</widget>
Съешь еще этих мягких французских булок...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.