Jdi na navigaci předmětu

Kontextové menu na pravé tlačítko myši

Kontextové menu na pravé tlačítko myši

Jako příklad použiti contextového menu veymeme jednoduchou textovou kalkulačku. Vytvoříme složku context_calculator a uvnítř soubory context_calculator.js a instructions.json

instructions.json

 {
   "main_script": "context_calculator.js",
   "width": 300,
   "height": 200,
   "animation": true,
   "title": "Context Calculator"
 }

context_calculator.js

 var context_calculator = SAGE2_App.extend({
    init: function (data) {},
    draw: function (date) {},
    getContextEntries: function () {},
    saveNums: function (responseObject) {},
    setOperation: function (responseObject) {},
    clearAll: function () {}
 });

Na začátku si podíváme na funkce init(data).

    init: function (data) {
        // Vytváříme "div" HTML uzel
        this.SAGE2Init("div", data);
        // Nastavuje jeho id
        this.element.id = "calkulator example";
        // Obarvíme pozadi
        this.element.style.background = "white";
        // Voláme funkce, která inicializuje základní parametry
        this.clearAll();
    },

Jako obvykle ve funkci ` `init(data) inicialiyujeme okno aplikaci a proměny. Tentokrát ale spustíme okno v modu "div", což je variaci tegů div v HTML. Tohle nam dovolí psát HTML-kod a zobrázovat ho na obrazovce. Psát ten kod musíme do parametru this.element.innerHTML. Dělat to budé funkce draw(date).

    draw: function (date) {
        // Zapisuje do kontejneru "div" kontent pomoci parametru "this.element.innerHTML" v závislosti na parametru "this.status"
        if (this.status == "numbers")
            this.element.innerHTML = "Enter two numbers.";
        else if (this.status == "operation")
            this.element.innerHTML = this.number_1 + " | " + this.number_2 + "<br>Select operation.";
        else if (this.status == "result")
            this.element.innerHTML = this.number_1 + " | " + this.number_2 + "<br>" + this.operator + "<br>" + this.result;
    },

Tato funkce zobrazuje text v závislosti na stavu programu, který uložen v paramertu this.status. Stav můžeme měnit pomoci kontextového menu. Standardní kontextové menu obsahuje tlačítka jako „Zavřít kontextové menu“, „Zavřít aplikaci“ apod.

Abychom mohli přidat své položky do kontextového menu, musíme implementovat getContextEntries(). Tato funkce musí vracet seznam položek. Všechny položky se do seznamu zapisují ve formátu JSON. Standardní tlačítko musí obsahovat tři základní parametry: description, callback, parameters.

 var entries = [];
 entries.push({
    description: "-",
    callback: "setOperation",
    parameters: {
       operator: "-"
    }
 });
tlacitko kontextoveho menu 1

Do parametru description ukládáme popis, který se zobrazí na obrazovce. Do callback ukládáme název funkce, kterou budeme volat, a do parameters všechny parametry, které pošleme do funkce callback.

 setOperation: function (responseObject) {
    // V yávislosti na parametru "responseObject.operator" zavolá určitou operaci a uloží vysledek
    if (responseObject.operator == "+") {
        this.result = this.number_1 + this.number_2;
        this.operator = "+";
    }
    else if (responseObject.operator == "-") {
        this.result = this.number_1 - this.number_2;
        this.operator = "-";
    }
    else if (responseObject.operator == "x") {
        this.result = this.number_1 * this.number_2;
        this.operator = "x";
    }
    else if (responseObject.operator == "/") {
        this.result = this.number_1 / this.number_2;
        this.operator = "/";
    }
    this.status = "result";
    this.getFullContextMenuAndUpdate();
 },

Pokud do callbacku se neposílají žadné parametry, můžeme nepsát nic v závorkach.

 entries.push({
     description: "Clear",
     entryColor: "lightred",
     callback: "clearAll",
     parameters: {}
 });
 clearAll: function () {
     // Nastaví všechny parametry do počatečného stavu
     this.status = "numbers";
     this.number_1 = 0;
     this.number_2 = 0;
     this.result = 0;
     this.operator = "";
     this.getFullContextMenuAndUpdate();
 }
tlacitko kontextoveho menu 2

Pokud chcete udělat vstupní textové pole musíte k parametrům tlačítka přidat inputField a inputFieldSize

 entries.push({
     description: "Number1 Number2",
     callback: "saveNums",
     parameters: {},
     inputField: true,
     inputFieldSize: 20
 });
vstupni pole kontextoveho menu 2

inputField: true znamená, že chceme udělat z toho vstupní textové pole a v inputFieldSize ukládáme počet symbolů, které můžeme do tohoto pole zapsát. Zappsáný text můžeme dostat v callback v parammetru responseObject.clientInput.

 saveNums: function (responseObject) {
     // Callback funkce. Pokud uživatel napišé dvá čisla, funkce uloží je a přepné stav.
     // Uživatelský vstup lze nalezt uvnitř parametru "responseObgect.clientInput".
     var numArray = responseObject.clientInput.split(" ");
     if (numArray.length == 2 && Number(numArray[0]) != NaN && Number(numArray[1]) != NaN) {
         this.number_1 = Number(numArray[0]);
         this.number_2 = Number(numArray[1]);
         this.status = "operation";
         // Po volání funkce aktualizuje contextové menu(znovu zavolá "getContextEntries()")
         this.getFullContextMenuAndUpdate();
     }
 },

Pokud byste chtěli rozdělit vstupy můžete pro to použit separator. Pro to ptřebujete přidat ho do seznamu vystupů.

 entries.push({
       description: "+",
       callback: "setOperation",
       parameters: {
          operator: "+"
    }
 });
 // Přidame separator do contextového menu
 entries.push(separator);
 entries.push({
    description: "-",
    callback: "setOperation",
    parameters: {
       operator: "-"
    }
 });
separator kontextoveho menu 2

Program volá getContextEntries jednou a vytváří kontextové menu. Pokud ale budeme chtit změnit kontextové menu, musíme použit funkce this.getFullContextMenuAndUpdate(), která spustí getContextEntries a tím znovu vygeneruje contextové menu.

Zdrojový kod:

context_calculator