5. Web-Apps mit Elm

5.4 Svg-Grafiken in Elm

Alle Beispiel-Programme zu diesem Teilkapitel finden Sie in session-2023-12-18.zip

Svg-Elemente

In der Datei web05svg.html Hier sehen Sie eine Html-Seite mit einem Svg-Objekt, welches vier Unterobjekte enthält: ein Rechteck, zwei Kreise und eine Gerade. Ein Svg-Objekt ist ein Spezialfall eines Html-Objekts, aber es besteht auch aus einem Tag-Namen (rect, circle, line etc.), einer Attributliste (Position, Farbe, etc.) und einer Kinderliste. In unserem Beispiel hat aber nur das oberste Svg-Element Kinder.

In Elm geht das ganz analog. Hier sehen Sie meinen Elm-Code, der die fast gleiche Webseite erzeugt: Web05Svg.elm.

Übungsaufgabe Speichern Sie Web05Svg.elm in Ihrem Ordner elm/web. Dann erweitern Sie die Datei, so dass sie Benutzerinput entgegennehmen kann. Sie soll folgendes enthalte:

  1. Ein Texteingabefeld, in der der Nutzer eine neue Füllfarbe für die Kreise eingeben kann (z.B. "red" oder "violet" oder auf RGB-Farben wie "rgb(255, 255, 0)").
  2. Einen Knopf , der auf Knopfdruck die Farbe der Kreise ändert auf das, was der Nutzer eingegeben hat.

Svg-Events

Auch Svg-Elemente können "lauschen", etwa nach Mausklicks. Genauso, wie Sie mit Html.Events.onClick ButtonClicked ein Attribut erzeugen können, das spezifiziert, dass der Knopf bei Klick die Nachricht ButtonClicked erzeugen soll, so können Sie mit Svg.Events.onClick dies einem beliebigen Svg-Element hinzufügen. Als Beispiel-App hier Web07SvgClick.elm. Das ist einfach ein Kreis, der auf Knopfdruck die Farbe wechselt.

Maus-Position

Um Spaß mit Grafiken zu haben, müssen Sie auf die Maus-Position reagieren können. Dazu müssen Sie ein weiteres Elm-Paket installieren:

elm install mpizenberg/elm-pointer-events

Hier sehen Sie eine einfache App, die ein umrandetes Svg-Feld erzeugt und auf Mausklick die Mauskoordinaten angibt: Web06Mouse.elm. Die entscheidenden Code-Zeilen sind:

type Msg                        
    = MouseClicked Mouse.Event

Hier definieren wir einen Datentyp Msg. Die Nachricht soll an unseren Elm-Code gesendet werden, wenn der Nutzer mit der Maus in das Svg-Feld klickt. Als Payload sollen die Maus-Koordinaten angehängt werden. In Elm wird standardmäßig mehr angehängt, nämlich ein Objekt vom Typ Mouse.Event, der unter anderem eine Variable offsetPos vom Typ (Float, Float) enthält. Als nächstes die Funktion update, in der wir auf diese Nachricht reagieren:

update : Msg -> Model -> Model
update message model =
    case message of
        MouseClicked mouseEvent ->
            -- wir fangen die Payload im Bezeichner 'mouseEvent'
            { clickPosition = mouseEvent.offsetPos }                        
                    

Schließlich gibt es in der Funktion view noch die Stelle, wo wir aus der Klickposition, also einem (Float, Float), ein Html-Text-Element erzeugen. Schauen Sie sich das im Quelltext selber an.

Übungsaufgabe Machen Sie die App in Web06Mouse.elm jetzt interessanter: jeder Klick soll einen neuen Kreis erzeugen.

Übungsaufgabe Legen Sie eine Kopie von Web07SvgClick.elm an und erweitern Sie sie: ein Mausklick sollte jetzt nicht die Farbe ändern, sondern sollte Sie befähigen, den Kreis mit der Maus herumzuziehen, also drag and drop. Hierzu brauchen Sie jetzt anstatt Mouse.onClick die Funktionen Mouse.onDown / Mouse.onUp / Mouse.onMove, welche jeweils eine Nachricht mit Payload Mouse.Event erzeugen, wenn der linke Mausknopf gedrückt / losgelassen / die Maus bewegt wird.