[sciter] свой behavior (с++) и вызов метода из скрипта
От: ptica  
Дата: 12.10.07 02:56
Оценка:
Здравствуйте, Коллеги.
sciter ver 1.0.4.24
Не приходит вызов из скрипта (handle_scripting_call ) =(.
Хотя уверенности что все правильно и до конца реализовано тоже нет...

Код:
using namespace sciter;
using namespace sciter::dom;


struct behavior_media : public event_handler
{
        behavior_media() : event_handler()
        {
            debug_output_console dc;
            dc.printf("behavior_media create\n");

        }

        virtual bool handle_event (HELEMENT he, BEHAVIOR_EVENT_PARAMS& params )
        {
            debug_output_console dc;
            dc.printf("behavior_media handle_event\n");
            return false;
        }

        virtual bool handle_key  (HELEMENT he, KEY_PARAMS& params )
        {
            debug_output_console dc;
            dc.printf("behavior_media handle_key\n");
            return false;
        }

         virtual bool handle_mouse (HELEMENT he, KEY_PARAMS& params )
         {
             debug_output_console dc;
             dc.printf("behavior_media handle_mouse\n");
             return false;
         }

        virtual bool handle_method_call (HELEMENT he, METHOD_PARAMS& params ) 
        {
            debug_output_console dc;
            dc.printf("behavior_media handle_method_call\n");
            return false;
        }

        virtual bool handle_scripting_call (HELEMENT he, SCRIPTING_METHOD_PARAMS& params ) 
        {
            debug_output_console dc;
            dc.printf("behavior_media handle_scripting_call\n");
            return false;
        }

         virtual bool handle_draw (HELEMENT he, DRAW_PARAMS& params )  
         {
             debug_output_console dc;
             dc.printf("behavior_media handle_draw\n");
             return false;
         }

        

        virtual void attached ( HELEMENT he ) 
        {
            debug_output_console dc;
            dc.printf("behavior_media attached\n");

        }

        virtual void detached  (HELEMENT he ) 
        {
            debug_output_console dc;
            dc.printf("behavior_media detached\n");

            delete this;

        } 

        virtual void handle_size(HELEMENT he)
        {
            debug_output_console dc;
            dc.printf("behavior_media handle_size\n");
        }
};


struct behavior_media_factory : public behavior_factory
{

    behavior_media_factory() : behavior_factory("media_video" )    
    {
    }

    virtual event_handler* create (HELEMENT he ) 
    { 
        return new behavior_media();     
    }
};

behavior_media_factory media_instance;


Сам html:

<html>
<head>

<style> 

#Video
{
    overflow: auto;
    width:100%%;
    height:100%%;
    prototype:Grid;
    background-color:#000 #e9e8f3 #e9e8f3 #fff;
    behavior: media_video;
}

#Status
{
    prototype: Status;
    background-color:#FFF #e9e8f3 #e9e8f3 #FFF;
}


</style>

<script src="sciter:lib/root-extender.tis" type="text/tiscript"/> 
<script type="text/tiscript">

var video = self.select("#Video");
var status = self.select("#Status");


    function self.onMouse(event)
    {
        switch(event.type)
        {
          case Event.MOUSE_UP: 
           if(!status) { stderr << "status is not found";  return true; }          
            status.text = "[1]";
            status.update(false);
            if(!video) { stderr << "video is not found";  return true; }
            
            //===========================           
            video.show = true;
            video.test();
            //===========================
            
            //video.postEvent( 300000 );
            
            status.text = "[2]";
            status.update(false);
            return true;
        }
        return false;
   }
    
</script>
 
</head>
<body>
<widget id = "Video">Video</widget>
<div id="Status">status</div>
</html>


Не прокидываються в behavior_media вызова:
            //===========================           
            video.show = true;
            video.test();
            //===========================


sciter ver 1.0.4.24

Хотя video.postEvent( 300000 ); вызывается на ура.


Возможно что то до конца не прочувствовал в библиотеке =). Помогите
Re: [sciter] свой behavior (с++) и вызов метода из скрипта
От: c-smile Канада http://terrainformatica.com
Дата: 12.10.07 05:38
Оценка: 39 (2)
Здравствуйте, ptica, Вы писали:

P>Не прокидываються в behavior_media вызова:

P>
P>            //===========================           
P>            video.show = true;
P>            video.test();
P>            //===========================
P>


P>sciter ver 1.0.4.24


P>Хотя video.postEvent( 300000 ); вызывается на ура.


P>Возможно что то до конца не прочувствовал в библиотеке =). Помогите



Метод behavior'а:
virtual bool handle_scripting_call (HELEMENT he, SCRIPTING_METHOD_PARAMS& params ) {}
Где: 
  struct SCRIPTING_METHOD_PARAMS 
  {
      LPCSTR        name;   //< method name
      SCITER_VALUE* argv;   //< vector of arguments
      UINT          argc;   //< argument count
      SCITER_VALUE  result; //< return value
  };

это в скрипте метод
result = element.xcall(#sym, argv0, argv1, ... )

Т.е. надо так:

video.xcall(#test);

video.xcall(#show,true);
var s = video.xcall(#show);


Для того чтобы с этим делом работать так:

video.show = true;
video.test();


то нужно обернуть это дело в Behavior

type Video : Behavior
{
   property show(v)
   {
      get return this.xcall(#show);
      set return this.xcall(#show, v);
   }
   function test()
   {
      return this.xcall(#test);
   }
}


соотв. в CSS прописать :

#Video
{
    width:100%%;
    height:100%%;
    behavior: media_video;
    prototype: Video;
}
Re[2]: [sciter] свой behavior (с++) и вызов метода из скрипт
От: ptica  
Дата: 12.10.07 06:33
Оценка:
Здравствуйте, c-smile, Вы писали:
...

Самое оно =).
Как-то не заметил что такое в sciter-bn.dll (sciter\facades) используется.
Большое спасибо за шикарную библиотек!

И в догонку еще вопросик касательно расширения функционала и вынесения в отдельную dll
поясни те 2 функции, что в sciter-x-module.cpp находятся:

EXTERN_C BOOL WINAPI SciterInitModule( SciterDomApi* pdomapi, VOID* p1, VOID* p2 )
{
  sciter::dom::element::api(pdomapi);
  return TRUE;
}

EXTERN_C BOOL WINAPI SciterBehaviorFactory( LPCSTR, HELEMENT, SciterDomApi::LPELEMENT_EVENT_PROC*, LPVOID* )
{
  return FALSE;
}


Если можно в контексте:
struct behavior_media_factory
struct behavior_media. =)
Re[3]: [sciter] свой behavior (с++) и вызов метода из скрипт
От: c-smile Канада http://terrainformatica.com
Дата: 12.10.07 07:23
Оценка:
Здравствуйте, ptica, Вы писали:

P>И в догонку еще вопросик касательно расширения функционала и вынесения в отдельную dll

P>поясни те 2 функции, что в sciter-x-module.cpp находятся:

P>
P>EXTERN_C BOOL WINAPI SciterInitModule( SciterDomApi* pdomapi, VOID* p1, VOID* p2 )
P>EXTERN_C BOOL WINAPI SciterBehaviorFactory( LPCSTR, HELEMENT, SciterDomApi::LPELEMENT_EVENT_PROC*, LPVOID* )
P>


P>struct behavior_media_factory

P>struct behavior_media. =)

sciter-x-module.cpp это опциональная вещь вообще-то.

Если надо сделать загрузку behaviros из DLL то можно это сделать на уровне своей собственной обработки
HLN/SCN_ATTACH_BEHAVIOR.

Сделать свой naming convention, скажем так:
#myid
{
  behavior: plugin\/media\/ogg-viewer; 
}


В SCN_ATTACH_BEHAVIOR анализируем имя и если оно начинается с "plugin/" то
скажем идем в некий фолдер /plugin/ и смотрим там media.dll.

Далее уже дело техники : LoadLibrary, потом позвать нечто well known типа SciterInitModule или InitPlugin
c передачей в длл SciterDomApi. Ну и напоследок позвать фабрику за для event handler по имени "ogg-viewer"
Вот для этого из этой длл и должно наружу быть видным нечто типа
EXTERN_C BOOL WINAPI SciterBehaviorFactory( LPCSTR, HELEMENT, SciterDomApi::LPELEMENT_EVENT_PROC*, LPVOID* )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.