virtual tree
От: mryau Россия http://woodland.ru/~wjdogs
Дата: 22.08.13 18:22
Оценка:
Всё написанное про Sciter 2.0.29 на Win7:

Почему в onControlEvent не приходит ни одного события?
Почему Event.SELECT_STATE_CHANGED приходит только когда я прокручиваю дерево с мыши mousewheel'ом?
Почему если экспандить узел дерева по двойному клику, то придёт Event.SELECT_SELECTION_CHANGED, а если кликнуть на иконке состояния узла, то при его раскрытии/свёртывании ни SELECT_SELECTION_CHANGED ни SELECT_STATE_CHANGED не приходят?
Это так задумано, или я что-то не так делаю?

Ну и как сделать визуальные эффекты для DnD на virtual tree -- по прежнему интересно.

Вот код (всё остальное, как в твоём примере про Virtual Tree):


<style>
  widget#tree {
    prototype: Draggable;
    size: 300px *;
    overflow-x:hidden;
  }
</style>
<script type="text/tiscript">
class Draggable: Behavior
{
  function attached() {
    this.src = "";
    this.dst = "";
    this.dragging = false;
  }

  function onControlEvent(evt) {
    stdout << "onControlEvent\n";
    return false;
  }

  function onMouse(evt) {
    switch(evt.type) {
      case Event.SELECT_SELECTION_CHANGED:
        stdout << "Event.SELECT_SELECTION_CHANGED\n";
        break;
      case Event.SELECT_STATE_CHANGED:
        stdout << "Event.SELECT_STATE_CHANGED\n";
        break;
      case Event.MOUSE_DOWN:
        if (evt.target.$is(text))
        {
          this.src = evt.target.text; 
          this.src_opt = evt.target.parent; 
          this.dst = "";
          this.dragging = true;
          return false;
        }
        break;
      case Event.MOUSE_UP:
        if(this.dragging)
        {
          this.dragging = false;
          if (evt.target.$is(text)) {
              this.dst = evt.target.text; 
              this.dst_opt = evt.target.parent; 
              if (this.dst != "" && this.src != "" && this.src_opt != this.dst_opt) {
                view.moveRow(this.src, this.dst);
                return true;
              }
          }
          this.dst = this.src = "";
        }
        break;
      case Event.MOUSE_MOVE:
        if( this.dragging && evt.target.parent != this.dst_opt)
        {
          return true;
        }
        break;
     }
   return false;
  }
}
include "virtual-tree.tis";
include "tree-data-source.tis";
var treew = $(widget#tree);
VirtualTree(treew, new TreeDataSource());
</script>
Re: virtual tree
От: c-smile Канада http://terrainformatica.com
Дата: 23.08.13 07:10
Оценка:
Здравствуйте, mryau, Вы писали:

Какое отношение имеет событие
Event.SELECT_SELECTION_CHANGED к function onMouse(evt) ?

В onMouse прилетают только Event.MOUSE_**** события.
Re[2]: virtual tree
От: mryau Россия http://woodland.ru/~wjdogs
Дата: 23.08.13 07:30
Оценка:
CS>Какое отношение имеет событие
CS>Event.SELECT_SELECTION_CHANGED к function onMouse(evt) ?

CS>В onMouse прилетают только Event.MOUSE_**** события.


О том и спич: в onControlEvent ничего не приходит, а в onMouse приходят SELECT_STATE_CHANGED и SELECT_SELECTION_CHANGED...
Re[3]: virtual tree
От: c-smile Канада http://terrainformatica.com
Дата: 23.08.13 23:38
Оценка:
Здравствуйте, mryau, Вы писали:

CS>>Какое отношение имеет событие

CS>>Event.SELECT_SELECTION_CHANGED к function onMouse(evt) ?

CS>>В onMouse прилетают только Event.MOUSE_**** события.


M>О том и спич: в onControlEvent ничего не приходит, а в onMouse приходят SELECT_STATE_CHANGED и SELECT_SELECTION_CHANGED...


Это потому что ты вызываешь функцию VirtualTree() которая переопредляет onControlEvent:
tree.onControlEvent = function(evt)
  {
    if( evt.type == Event.ELEMENT_EXPANDED )  { expandOption(evt.target); return true; }
    else if( evt.type == Event.ELEMENT_COLLAPSED ) { collapseOption(evt.target); return true; }
  }


В Sciter event handlers назначаются двумя способами:

Первый, через property элемента или метод класса:
  el.onControlEvent = function(evt) {...}
  el.onMouse = function(evt) {...}


Второй, через subscription механизм:

el.subscribe(Event.BEHAVIOR_EVENT,Event.SELECT_SELECTION_CHANGED, function(evt) {...}); 
el.unsubscribe(func);


В первом случае последнее переопределение скажем el.onControlEvent = function() затирает
то что было до того в el.onControlEvent — т.е. элемент может иметь строго один onControlEvent handler.

Во втором случае все subscriptions добавляются в список — множество event handlers.

Вот тебе имплементация VirtualTree оформленная в виде класса (а не функции):
https://dl.dropboxusercontent.com/u/14981836/tree.rar

Твой код находится в файле draggable-virtual-tree.tis как

class DraggableVirtualTree: VirtualTree {}


Методы (класса VirtualTree) которые ты можешь override в своем:

// overridables:
  function optionExpanded(option) {}
  function optionCollapsed(option) {}
  function selectionChanged() {}


А вообще я предлагаю устроить мастер-класс и прям в этом топике разработать этот самый DraggableVirtualTree ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.