Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: Deklaratiivinen graafinen käyttöliittymä

Sivun loppuun

jalski [14.02.2024 21:29:02]

#

8th käyttää Nuklear pohjaista ratkaisua graafiseksi käyttöliittymäksi. Käyttöliittymän tekeminen hoituu kokonaan ohjelmallisesti. Minulla oli kotiautomaation käyttöliittymän toteuttavaa ohjelmaa varten tarve helposti muokattavaan deklaratiiviseen ratkaisuun mikä automaattisesti hoitaisi asettelun tarkasti ja responsiivisesti. Päädyin toteuttamaan "tileui" kirjaston mikä käyttää laajennettua JSON-syntaksia ohjelman ulkoasun ja toiminnallisuuden määrittämiseen. Minulla on työnalla graafinen työkalu mikä muodostaa automaattisesti JSON:in, tarjoaa live-näkymän asetteluun ja ohjelman toimintamalli on deklaratiisen ja ohjelmallisen sekoitus. Aikaisemmin ohjelman muuttujat piti tallentaa joko globaaleina tai ikkunan map-rakenteeseen. Omassa mallissani ne voidaan tallentaa loogisemmin JSON-rakenteen layout -ja tile-solmuihin.

Esimerkiksi:

"calculator.display" tileui:data@

Hakee "display" solmun "data" map:in

"calculator.display:num" tileui:data@

Hakee "display" solmun "data" map rakenteesta "num" avaimella tallennetun tiedon. Avaimia voi antaa useamman kerralla erottelemalla avaimet kaksoispisteellä. Tässä tapauksessa palautetaan taulukko.

Laskin esimerkin kuva

Alla esimerkkikoodi laskimelle:

needs nk/gui
needs nk/tileui

32 constant FONTHEIGHT
FONTHEIGHT 1.75 n:* constant ROWHEIGHT

FONTHEIGHT font:system font:new "font1" font:atlas! drop

: +n \ nk n --
  >r
  "calculator.display:num" tileui:data@ 10 n:*
  r> n:+ "calculator.display:num" swap tileui:data! ;

: mathop \ nk w -- nk
  "calculator:op" swap tileui:data!
  "calculator.display:num" tileui:data@  "calculator:a" swap tileui:data!
  "calculator.display:num" 0 tileui:data! ;

{
  name: "calculator",
  grid: null,
  layout: { rows: [ @ROWHEIGHT, -1], cols: 1, rgap: 4, cgap: 4, margin: 4 },
  data: { },
  cb: null ,
  tiles: [
           {
             name: "display",
             grid: { row: 0, rows: 1, col: 0, cols: 1 },
             data: { num: 0 },
             cb: ( nk:rect>local nk:grid-push
                   "num" m:@ >s 32 nk:EDIT_SELECTABLE nk:EDIT_CLIPBOARD n:bor
                   nk:PLUGIN_FILTER_FLOAT edit-string drop >n "num" m:_! drop )
           },
           {
             name: "keypad",
             grid: { row: 1, rows: 1, col: 0, cols: 1 },
             layout: { rows: 4, cols: 4, rgap: 4, cgap: 4, margin: 4 },
             data: { },
             cb: ( 2 2 "black" nk:stroke-rect drop ),
             tiles: [
                      {
                        name: "7",
                        grid: { row: 0, rows: 1, col: 0, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "7" ( 7 +n ) nk:button-label drop )
                      },
                      {
                        name: "8",
                        grid: { row: 0, rows: 1, col: 1, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "8" ( 8 +n ) nk:button-label drop )
                      },
                      {
                        name: "9",
                        grid: { row: 0, rows: 1, col: 2, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "9" ( 9 +n ) nk:button-label drop )
                      },
                      {
                        name: "+",
                        grid: { row: 0, rows: 1, col: 3, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "+"  ( ' n:+ mathop ) nk:button-label drop )
                      },
                      {
                        name: "4",
                        grid: { row: 1, rows: 1, col: 0, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "4" ( 4 +n ) nk:button-label drop )
                      },
                      {
                        name: "5",
                        grid: { row: 1, rows: 1, col: 1, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "5" ( 5 +n ) nk:button-label drop )
                      },
                      {
                        name: "6",
                        grid: { row: 1, rows: 1, col: 2, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "6" ( 6 +n ) nk:button-label drop )
                      },
                      {
                        name: "-",
                        grid: { row: 1, rows: 1, col: 3, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "-" ( ' n:- mathop ) nk:button-label drop )
                      },
                      {
                        name: "1",
                        grid: { row: 2, rows: 1, col: 0, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "1" ( 1 +n ) nk:button-label drop )
                      },
                      {
                        name: "2",
                        grid: { row: 2, rows: 1, col: 1, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "2" ( 2 +n ) nk:button-label drop )
                      },
                      {
                        name: "3",
                        grid: { row: 2, rows: 1, col: 2, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "3" ( 3 +n ) nk:button-label drop )
                      },
                      {
                        name: "*",
                        grid: { row: 2, rows: 1, col: 3, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "*" ( ' n:* mathop ) nk:button-label drop )
                      },
                      {
                        name: "C",
                        grid: { row: 3, rows: 1, col: 0, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "C"
                              ( "calculator:a" 0 tileui:data! "calculator.display:num" 0 tileui:data! )
                              nk:button-label drop
                            )
                      },
                      {
                        name: "0",
                        grid: { row: 3, rows: 1, col: 1, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "0" ( 0 +n ) nk:button-label drop )
                      },
                      {
                        name: "=",
                        grid: { row: 3, rows: 1, col: 2, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "=" ( "calculator:op" tileui:data@ >r
                                                               "calculator.display:num" tileui:data@ >r
                                                               "calculator:a" tileui:data@ r> r> w:exec
                                                               "calculator.display:num" swap tileui:data!
                                                               "calculator:a" 0 tileui:data! ) nk:button-label drop )
                      },
                      {
                        name: "/",
                        grid: { row: 3, rows: 1, col: 3, cols: 1 },
                        data: { },
                        cb: ( nk:rect>local nk:grid-push "/"  ( ' n:/ mathop ) nk:button-label drop )
                      }
                    ]
           }
         ]
} constant UI


: init-window-size
  mobile? if
    hw:displaysize?
  else
    240 260
  then ;

init-window-size constant HEIGHT constant WIDTH

: new-win
  {
    name: "main",
    wide: @WIDTH,
    high: @HEIGHT,
    resizable: true,
    title: "Calculator"
  }
  nk:win ;

: main-render
  {
    name: "main",
    title: "main",
    bg: "white",
    padding: [0,0],
    flags: [ @nk:WINDOW_NO_SCROLLBAR ]
  }

  nk:begin
    UI tileui:render
  nk:end ;

: app:main
  UI tileui:init
  new-win ' main-render -1 nk:render-loop ;

mavavilj [24.02.2024 16:41:11]

#

Eikös sinua sitten kiinnosta XUL/UXP?

https://en.wikipedia.org/wiki/XUL

Minusta JSON on kyllä parempi formaatti, mutta HTML ja XML näyttävät liitolta.

jalski [24.02.2024 18:42:43]

#

mavavilj kirjoitti:

Eikös sinua sitten kiinnosta XUL/UXP?

Suoraan sanottuna ei. Tämä lähti alunperin omasta tarpeesta saada kotiautomaation hallintaohjelmaan mahdollisuus yksinkertaisesti sijoittaa widgetit tarkasti ja saada helposti aikaan responsiivinen sijoittelu. Tämä lähinnä siksi, että nykyään tarkka hiirityö rasittaa minua. Halusin myös, että käyttöliittymä toimisi puhelimella, tabletilla ja työpöydällä. Linux:illa halusin, että toimisi myös kokoruudun tilassa ilman X tai Wayland tukea.

Sijoittelu testi

mavavilj [25.02.2024 08:02:46]

#

Pitääkin sitten varmaan katsoa tätä sinun tuotosta. Pidin XUL:ia lupaavana, mutta siitä puuttuu mobiilialustojen tuki sinänsä, ja se on jotenkin sidottu selaimiin.

Nuklear oli minustakin kiinnostavin käyttöliittymäkirjasto, koska ei kiinnosta opetella wxWidgets:n kaltaisia järkäleitä (se kirja on 700 sivua). Mutta eipä tee natiiveja ikkunoita.

mpni [07.03.2024 12:37:47]

#

mavavilj kirjoitti:

(25.02.2024 08:02:46): Nuklear oli minustakin kiinnostavin käyttöliittymäkirjasto, koska ei kiinnosta opetella wxWidgets:n kaltaisia järkäleitä (se kirja on 700 sivua). Mutta eipä tee natiiveja ikkunoita.

Aikoinaan selasin kaksi viikkoa netistä näitä "järkäleitä" ja kolme viikkoa, kun lukaisin OpenGL:n red bookin läpi, jossa on 900 sivua. Tässä kolmessa viikossa kerkesin vielä koodailemaan läpi kirjan esimerkkejäkin.

mavavilj [08.03.2024 05:55:51]

#

mpni kirjoitti:

(07.03.2024 12:37:47): ”– –” Aikoinaan selasin kaksi viikkoa netistä näitä...

Ei kirjan lukeminen nopeasti tarkoita, että kirjasto on kätevä.

mpni [08.03.2024 19:31:23]

#

mavavilj kirjoitti:

Ei kirjan lukeminen nopeasti tarkoita, että kirjasto on kätevä.

Lukematta kirjaa (tai edes osia siitä) ei voi tietää onko kirja hyvä vai huono kirja.

Grez [08.03.2024 22:47:27]

#

Tai sitten arvosteluja kirjasta.


Sivun alkuun

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta