Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: 8th Nuklear, custom widget

jalski [28.06.2023 14:12:28]

#

Esimerkkinä melko lailla yksinkertaisin mahdollinen "custom widget" 8th:n käyttämälle Nuklear GUI:lle.

Esimerkki tekee oman widgetin mikä näyttää mikäli kyseisen widgetin nappi on hiirikursorin alla. Mallina muodostetaan käyttöliittymä jossa on neljä nappia ja mikäli nappia painaa niin tulostaa konsoliin mitä nappia on painettu.

Näyttää tältä

needs nk/gui
needs nk/buttons

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

: new-win
  {
    name: "main",
    wide: 640,
    high: 64,
    resizable: false,
    bg: "white",
    title: "Custom widget test"
  } nk:win ;


: highlight-button  \ s w --
  \ We just highlight the button when it's under the mouse cursor,
  \ so we only need to test that status is not WIDGET_INVALID.
  \ If we would handle input ourself then we should also honor
  \ possible WIDGET_ROM state. Without this mechanism when your widget
  \ would be under the menu item, it would also handle mouse input when
  \ menu item above it is clicked. Bottom line is when status is WIDGET_ROM,
  \ then don't handle the input.
  nk:widget if
    \ Widget bounds rectangle is on TOS.
    \ Grid layout and margin does the trick...
    { rows: 1, cols: 1, margin: 4 } nk:layout-grid-begin
      0 1 0 1 nk:grid { rows: 1, cols: 1, margin: 4 } nk:layout-grid-begin
        0 1 0 1 nk:grid nk:rect>local nk:grid-push
          nk:button-label
          0 1 0 1 nk:grid nk:hovered?
      nk:layout-grid-end
      if
        0 1 0 1 nk:grid 4 4 "red" nk:stroke-rect
      then
    nk:layout-grid-end
  else
    drop
  then ;

(
  a:new
  ( "Button %d" s:strfmt dup "%s pressed\n" s:strfmt ( . ) curry
    2 a:close a:push
  ) 1 4 loop
) w:exec constant button-names-and-callbacks

: 4buttons
  button-names-and-callbacks
  ( swap 0 1 rot 1 nk:grid nk:rect>local nk:grid-push
    a:open highlight-button
  ) a:each drop ;

: main-render
  {
    bg: "white",
    flags: [ @nk:WINDOW_NO_SCROLLBAR ]
  }
  nk:begin
    null { rows: 1, cols: 4, margin: 4 } nk:layout-grid-begin
      4buttons
    nk:layout-grid-end
  nk:end ;

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta