Chandra

 view release on metacpan or  search on metacpan

xs/dragdrop.xs  view on Meta::CPAN

        "if(text){\n"
        "window.chandra.invoke('__chandra_dragdrop',[JSON.stringify({\n"
        "type:'text_drop',text:text,target:tgt\n"
        "})]);\n"
        "}\n"
        "},true);\n"

        /* Setup draggable elements */
        "draggables.forEach(function(cfg){\n"
        "var els=document.querySelectorAll(cfg.sel);\n"
        "els.forEach(function(el){\n"
        "el.setAttribute('draggable','true');\n"
        "el.addEventListener('dragstart',function(e){\n"
        "var data=cfg.data||null;\n"
        "if(cfg.dataFrom){\n"
        "var attr=el.getAttribute(cfg.dataFrom);\n"
        "try{data=JSON.parse(attr);}catch(_){data=attr;}\n"
        "}\n"
        "_dragData={data:data,source:elemInfo(el),sourceEl:el};\n"
        "e.dataTransfer.effectAllowed='move';\n"
        "});\n"
        "});\n"
        "});\n"

        "window.__chandraDragDrop={zones:zones,draggables:draggables};\n"
        "})();\n"
    );

    RETVAL = js;
}
OUTPUT:
    RETVAL

 # ---- inject() - inject JS via app->eval ----

SV *
inject(self)
    SV *self
CODE:
{
    HV *hv = (HV *)SvRV(self);
    SV **injected_svp;

    injected_svp = hv_fetchs(hv, "_injected", 0);
    if (injected_svp && SvTRUE(*injected_svp)) {
        RETVAL = SvREFCNT_inc(self);
    } else {
        SV *js;

        (void)hv_stores(hv, "_injected", newSViv(1));

        /* Bind __chandra_dragdrop dispatch if not already done */
        {
            SV **db_svp = hv_fetchs(hv, "_dispatch_bound", 0);
            if (!db_svp || !SvTRUE(*db_svp)) {
                SV **app_svp = hv_fetchs(hv, "app", 0);
                if (app_svp && SvOK(*app_svp)) {
                    SV *dd_self_ref = newSVsv(self);
                    CV *wrapper_cv;

                    sv_rvweaken(dd_self_ref);
                    wrapper_cv = newXS(NULL, XS_Chandra__DragDrop__dispatch_trampoline, __FILE__);
                    CvXSUBANY(wrapper_cv).any_ptr = (void *)dd_self_ref;
                    {
                        dSP;
                        ENTER; SAVETMPS;
                        PUSHMARK(SP);
                        XPUSHs(*app_svp);
                        XPUSHs(sv_2mortal(newSVpvs("__chandra_dragdrop")));
                        XPUSHs(sv_2mortal(newRV_noinc((SV *)wrapper_cv)));
                        PUTBACK;
                        call_method("bind", G_DISCARD);
                        FREETMPS; LEAVE;
                    }
                    (void)hv_stores(hv, "_dispatch_bound", newSViv(1));
                }
            }
        }

        /* Get JS code */
        {
            dSP;
            int count;
            ENTER; SAVETMPS;
            PUSHMARK(SP);
            XPUSHs(self);
            PUTBACK;
            count = call_method("js_code", G_SCALAR);
            SPAGAIN;
            js = (count > 0) ? newSVsv(POPs) : newSVpvs("");
            PUTBACK;
            FREETMPS; LEAVE;
        }

        /* Call $self->{app}->eval($js) */
        {
            SV **app_svp = hv_fetchs(hv, "app", 0);
            if (app_svp && SvOK(*app_svp)) {
                dSP;
                ENTER; SAVETMPS;
                PUSHMARK(SP);
                XPUSHs(*app_svp);
                XPUSHs(sv_2mortal(js));
                PUTBACK;
                call_method("eval", G_DISCARD);
                FREETMPS; LEAVE;
            } else {
                SvREFCNT_dec(js);
            }
        }

        RETVAL = SvREFCNT_inc(self);
    }
}
OUTPUT:
    RETVAL



( run in 2.669 seconds using v1.01-cache-2.11-cpan-364913b4093 )