BI-PGA Programování grafických aplikací
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. Standartní kontextové menu obsahuje v sobě taková tlačátka, jako "Uzavřit contextové menu", "Uzavřit aplikace" apod.

Abychom mohli přidat svoe vstupy do contextového menu musíme implementovat getContextEntries(). Tato funkce musí vracet seznam vstupů. Všechny vstupy se do seynamu zapísují ve tvaru JSON. Standartní 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ádame popis, který se zobrazí na obrazovce. Do callback ukládame název funkce, kterou budeme volat a do parameters - všechny parametry, které pošleme do funkci 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