Re[5]: move()+update()
От: c-smile Канада http://terrainformatica.com
Дата: 18.10.08 04:30
Оценка: 2 (1)
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.