Здравствуйте, cgibin, Вы писали:
C>Спасибо за код, не совсем понятен такой момент — правильно ли я понимаю, что после использования move() всегда нужно сбрасывать стиль, если планируется ещё что-делать с элементом(наример, изменить размер)? Как-то мне не улыбается каждый раз сохранять десяток-другой атрибутов. И как узнать, в каком состоянии находится элемент — спрайт или не спрайт?
В принципе sprite режим это просто position:popup . Т.е. достаточно сделать скажем el.style#position = #fixed; и элемент перестанет быть спрайтом.
Element.move(x,y) вызывает внутри вот этот метод:
void view::move_block( block* b, point view_pt )
{
refresh(b);
if(!b->assigned_style)
{
b->assigned_style = new style();
}
b->assigned_style->position = position_popup;
b->assigned_style->width = b->dim.x;
b->assigned_style->height = b->dim.y;
b->assigned_style->right.clear();
b->assigned_style->bottom.clear();
b->assigned_style->left = view_pt.x;
b->assigned_style->top = view_pt.y;
....
}
Это все атрибуты стиля которые я изменяю по ходу дела — фиксирую dimensions и устанавливаю left и top.
Т.е. для того чтобы вернуть на место (или зафиксировать) элемент который был спрайтом ему надо сказать новую positioning schema и соотв. установить left/top.
Вот метод dragEnded() из примера sdk/samples/ideas/moveable-windows/
type Wnd: Behavior
{
function dragEnded()
{
//stdout << "dragEnded\n";
const MAX_STEP = 20;
var x = this.box(#left, #inner, #view);
var y = this.box(#top, #inner, #view);
function anim()
{
var delta_x = (x - this.startingX) / 2;
var delta_y = (y - this.startingY) / 2;
if( delta_x < -MAX_STEP ) delta_x = -MAX_STEP;
else if( delta_x > MAX_STEP ) delta_x = MAX_STEP;
if( delta_y < -MAX_STEP ) delta_y = -MAX_STEP;
else if( delta_y > MAX_STEP ) delta_y = MAX_STEP;
x -= delta_x;
y -= delta_y;
this.move(x,y);
view.update();
if(!delta_x && !delta_y)
{
this.move(this.startingX,this.startingY);
this.style.clear(); // clear styles we've used in move()
return false;
}
return true;
}
this.timer(10,anim);
}
по окончанию drag он анимрованно возвращает блок к исходной позиции и делает
this.move(this.startingX,this.startingY);
this.style.clear(); // clear styles we've used in move()
т.е. блок опять становится position:absolute как он был объявлен в CSS.