diff --git a/src/Manager/ModalManager.elm b/src/Manager/ModalManager.elm index 2e39cd6d05a1c5e5dc4fa9c6f3c44e99584ec3ed..bb543bf524d1882cc82da06a14080782ecee3979 100644 --- a/src/Manager/ModalManager.elm +++ b/src/Manager/ModalManager.elm @@ -62,21 +62,25 @@ updateInput inputType value modal modalType iShape ix iy mouse = Empty -> modal -- ERROR Circle _ b c -> modalInputConstruktor modalType (Circle value b c ) ix iy mouse Rectangle _ b c d -> modalInputConstruktor modalType (Rectangle value b c d) ix iy mouse + Ellipse _ b c d -> modalInputConstruktor modalType (Ellipse value b c d) ix iy mouse Polygon _ -> modalInputConstruktor modalType iShape value iy mouse '2' -> case iShape of Empty -> modal -- ERROR Circle a _ c -> modalInputConstruktor modalType (Circle a value c ) ix iy mouse Rectangle a _ c d -> modalInputConstruktor modalType (Rectangle a value c d) ix iy mouse + Ellipse a _ c d -> modalInputConstruktor modalType (Ellipse a value c d) ix iy mouse Polygon _ -> modalInputConstruktor modalType iShape ix value mouse '3' -> case iShape of Empty -> modal -- ERROR Circle a b _ -> modalInputConstruktor modalType (Circle a b value ) ix iy mouse Rectangle a b _ d -> modalInputConstruktor modalType (Rectangle a b value d) ix iy mouse + Ellipse a b _ d -> modalInputConstruktor modalType (Ellipse a b value d) ix iy mouse Polygon _ -> modal -- ERROR '4' -> case iShape of Empty -> modal -- ERROR Circle _ _ _ -> modal -- ERROR Rectangle a b c _ -> modalInputConstruktor modalType (Rectangle a b c value) ix iy mouse + Ellipse a b c _ -> modalInputConstruktor modalType (Ellipse a b c value) ix iy mouse Polygon _ -> modal -- ERROR _ -> modal -- ERROR -- Modal Construktors diff --git a/src/Manager/UpdateManager.elm b/src/Manager/UpdateManager.elm index d84ee8059e826828f60d21436c52bb3491afd6f2..382c0111e91e8c7528a98c707daf1af2757111b7 100644 --- a/src/Manager/UpdateManager.elm +++ b/src/Manager/UpdateManager.elm @@ -78,6 +78,21 @@ updateModel msg model = in { model | saved = (Rectangle coords.x coords.y coords.w coords.h)::model.saved , state = Standby } + Ellipse a b w h -> + if a=="" + then { model | state = DrawShape + (Ellipse (String.fromInt mPos.x) (String.fromInt mPos.y) w h) + mPos + } + else let coords = manageRectCoords + {x= a + ,y= b + ,w= (abstand1D mPos.x (stringToInt a)) + ,h= (abstand1D mPos.y (stringToInt b)) + } + in { model | saved = (Ellipse coords.x coords.y coords.w coords.h)::model.saved + , state = Standby + } Polygon pList -> { model | state = DrawShape (Polygon (( String.fromInt mPos.x , String.fromInt mPos.y @@ -128,6 +143,7 @@ updateCmdMsg msg model = "https://users.informatik.uni-halle.de/~hinnebur/fenster-liste.json"else "https://users.informatik.uni-halle.de/~hinnebur/tueren-liste.json") , expect = Http.expectJson ShapesLoaded rectListDecoder + --, expect = Http.expectJson ShapesLoaded ellipseListDecoder } else Cmd.none Err e -> Cmd.none diff --git a/src/Manager/ViewManager.elm b/src/Manager/ViewManager.elm index ea55e9944283a4f90e5f6fdce284af9b29f7accf..353a2a78a1741b2e5cf246e9e14cb2bf53bf6a7d 100644 --- a/src/Manager/ViewManager.elm +++ b/src/Manager/ViewManager.elm @@ -4,8 +4,8 @@ import Html exposing (Html, Attribute, div, text, node, button, a, h1 import Html.Attributes exposing (class, style, href, rel, id, title, value) import Html.Events exposing (onClick, onInput) -- Svg -import Svg exposing (Svg,svg, image,rect,circle,polygon,g) -import Svg.Attributes exposing (width,height, viewBox, version, xlinkHref, x, y, cx, cy, r) +import Svg exposing (Svg,svg, image,rect,ellipse,circle,polygon,g) +import Svg.Attributes exposing (width,height, viewBox, version, xlinkHref, x, y, cx, cy,rx,ry, r) import Svg.Events -- Own import TypeHolder exposing (Model,Msg(..)) @@ -102,6 +102,10 @@ viewHeader_Buttons state = , onClick (OpenDrawShape (Rectangle "" "" "" "")) , href "" ] [text "Rechteck"] + , a [class "dropdown-item" + , onClick (OpenDrawShape (Ellipse "" "" "" "")) + , href "" + ] [text "Ellipse"] , a [class "dropdown-item" , onClick (OpenDrawShape (Polygon [])) , href "" @@ -130,6 +134,21 @@ viewImage model = if x=="" then circle [cx (String.fromInt mPos.x) , cy (String.fromInt mPos.y), r "5"] [] else circle [cx x, cy y, r (abstand x y mPos)] [] + Ellipse a b w h -> + if a=="" then ellipse [ cx (String.fromInt mPos.x) + , cy (String.fromInt mPos.y) + , rx "10", ry "10"] [] + else let coords = manageEllipseCoords + {x= a + ,y= b + ,w= (abstand1D mPos.x (stringToInt a)) + ,h= (abstand1D mPos.y (stringToInt b)) + } + in ellipse [ cx coords.x + , cy coords.y + , rx coords.w + , ry coords.h + ] [] Rectangle a b w h -> if a=="" then rect [ x (String.fromInt mPos.x) , y (String.fromInt mPos.y) @@ -195,6 +214,10 @@ viewNewShapeInputModal iShape ix iy = , onClick (ManageModal (Check "Rectangle") "") , href "" ] [text "Rechteck"] + , a [ class "dropdown-item" + , onClick (ManageModal (Check "Ellipse") "") + , href "" + ] [text "Ellipse"] , a [ class "dropdown-item" , onClick (ManageModal (Check "Polygon" ) "") , href "" @@ -235,6 +258,22 @@ viewNewShapeInputModal iShape ix iy = , value d, onInput (ManageModal (Input '4' "")) ] [] ] ] ] + Ellipse a b c d -> + [ div [] + [ label [class "label"] [text "X1-Position-"] + , label [] [ input [class "input", Html.Attributes.placeholder "X1-Position" + , value a, onInput (ManageModal (Input '1' "")) ] [] ] + , label [class "label"] [text "Y1-Position"] + , label [] [ input [class "input", Html.Attributes.placeholder "Y1-Position" + , value b, onInput (ManageModal (Input '2' "")) ] [] ] + , label [class "label"] [text "X2-Position"] + , label [] [ input [class "input", Html.Attributes.placeholder "X2-Position" + , value c, onInput (ManageModal (Input '3' "")) ] [] ] + , label [class "label"] [text "Y2-Position"] + , label [] [ input [class "input", Html.Attributes.placeholder "Y2-Position" + , value d, onInput (ManageModal (Input '4' "")) ] [] ] + ] + ] Polygon _ -> [ div [] [ label [class "label"] [text "X-Position"] @@ -322,6 +361,8 @@ viewSvgShapes shapes activeShape id = ++svgShapeStyle activeShape id) [] Rectangle a b c d -> rect ([Svg.Attributes.x a, y b, width c, height d ] ++svgShapeStyle activeShape id) [] + Ellipse a b c d -> ellipse ([Svg.Attributes.cx a, cy b, rx c, ry d ] + ++svgShapeStyle activeShape id) [] Polygon pointList -> polygon([Svg.Attributes.points (shapeCoordsToHtmlCoords x)] ++svgShapeStyle activeShape id) [] )::viewSvgShapes xs activeShape (id+1) diff --git a/src/Util/ShapeManager.elm b/src/Util/ShapeManager.elm index 9806afd4693d8375a86acbf228b023aa832426f4..9e1e870494a4fc9e6097629b2a010127e8059b3a 100644 --- a/src/Util/ShapeManager.elm +++ b/src/Util/ShapeManager.elm @@ -6,6 +6,7 @@ type Shape = Empty | Circle String String String | Rectangle String String String String + | Ellipse String String String String | Polygon (List ( String, String ) ) type ShapesMsg @@ -26,6 +27,7 @@ shapeDefaultConstruktor shape = case shape of "Circle" -> Circle "" "" "" "Rectangle"-> Rectangle "" "" "" "" + "Ellipse" -> Ellipse "" "" "" "" "Polygon" -> Polygon [] _ -> Empty shapesDecoder : String -> List Shape @@ -47,6 +49,13 @@ shapesDecoder s = (shapesDecoderList "rectangle" "height" s) ] else [] + , if (String.contains "Ellipse" s) + then [ Ellipse (shapesDecoderList "Ellipse" "cx" s) + (shapesDecoderList "Ellipse" "cy" s) + (shapesDecoderList "Ellipse" "rx" s) + (shapesDecoderList "Ellipse" "ry" s) + ] + else [] , if (String.contains "polygon" s) then [ Polygon (List.map2 Tuple.pair (shapesDecoderListPoly "x" s) @@ -64,6 +73,7 @@ deleteCoordsFromShape shape = Empty -> Empty Circle _ _ _ -> Circle "" "" "" Rectangle _ _ _ _ -> Rectangle "" "" "" "" + Ellipse _ _ _ _ -> Ellipse "" "" "" "" Polygon _ -> Polygon [] -- Get Methods : Parameter of Shapes getPointListFromPolygon : Shape -> List (String,String) @@ -72,6 +82,7 @@ getPointListFromPolygon shape = Empty -> [] Circle _ _ _ -> [] Rectangle _ _ _ _ -> [] + Ellipse _ _ _ _ -> [] Polygon pointList -> pointList -- Transform Shape to other Types shapeNameToString : Shape -> String @@ -80,6 +91,7 @@ shapeNameToString shape = Empty -> "" Circle _ _ _ -> "Circle" Rectangle _ _ _ _ -> "Rectangle" + Ellipse _ _ _ _ -> "Ellipse" Polygon _ -> "Polygon" shapeNameStringToGerman : String -> String shapeNameStringToGerman shape = @@ -87,6 +99,7 @@ shapeNameStringToGerman shape = "Circle" -> "Kreis" "Rectangle"-> "Rechteck" "Polygon" -> "Vieleck" + "Ellipse" -> "Ellipse" _ -> "" shapeCoordsToString : Shape -> String shapeCoordsToString shape = @@ -94,6 +107,7 @@ shapeCoordsToString shape = Empty -> "" Circle x_center y_center radius -> x_center++","++y_center++","++radius Rectangle x_left y_upper x_right y_lower -> x_left++","++y_upper++","++x_right++","++y_lower + Ellipse x_left y_upper x_right y_lower -> x_left++","++y_upper++","++x_right++","++y_lower Polygon pointList -> case pointList of [] -> "" @@ -104,6 +118,7 @@ shapeCoordsToHtmlCoords shape = Empty -> "" Circle _ _ _ -> shapeCoordsToString shape Rectangle _ _ _ _ -> shapeCoordsToString shape + Ellipse _ _ _ _ -> shapeCoordsToString shape Polygon _ -> String.left ((String.length (shapeCoordsToHtmlCoordsHelper shape))-1) (shapeCoordsToHtmlCoordsHelper shape) shapeCoordsToHtmlCoordsHelper : Shape -> String @@ -112,6 +127,7 @@ shapeCoordsToHtmlCoordsHelper shape = Empty -> "" Circle _ _ _ -> shapeCoordsToString shape Rectangle _ _ _ _ -> shapeCoordsToString shape + Ellipse _ _ _ _ -> shapeCoordsToString shape Polygon pointList -> case pointList of [] -> "" @@ -126,6 +142,15 @@ rectListDecoder = JD.field "rectangle" (JD.list (JD.map4 (JD.field "height" JD.string) ) ) +ellipseListDecoder : JD.Decoder (List Shape) +ellipseListDecoder = JD.field "ellipse" (JD.list (JD.map4 + Ellipse + (JD.field "cx" JD.string) + (JD.field "cy" JD.string) + (JD.field "rx" JD.string) + (JD.field "ry" JD.string) + ) + ) shapesDecoderList : String -> String -> String -> String shapesDecoderList shape var s = let res = JD.decodeString diff --git a/src/Util/Util.elm b/src/Util/Util.elm index 8596afcecaa3449f46c36d891b9863c95a710e80..103f22a1e1f224f9414cb483eb93ea36b0807a79 100644 --- a/src/Util/Util.elm +++ b/src/Util/Util.elm @@ -46,6 +46,25 @@ manageRectCoords coords = else if h>0 then {x=String.fromInt (x+w),y=String.fromInt y ,w=String.fromInt -w,h=String.fromInt h} else {x=String.fromInt (x+w),y=String.fromInt (y+h),w=String.fromInt -w,h=String.fromInt -h} +type alias EllipseCoords = + { x : String + , y : String + , w : String + , h : String + } +manageEllipseCoords : EllipseCoords -> EllipseCoords +manageEllipseCoords coords = + let x = stringToInt coords.x + y = stringToInt coords.y + w = stringToInt coords.w + h = stringToInt coords.h + in if w>0 + then if h>0 + then coords + else {x=String.fromInt x ,y=String.fromInt (y+h),w=String.fromInt w,h=String.fromInt -h} + else if h>0 + then {x=String.fromInt (x+w),y=String.fromInt y ,w=String.fromInt -w,h=String.fromInt h} + else {x=String.fromInt (x+w),y=String.fromInt (y+h),w=String.fromInt -w,h=String.fromInt -h} -- Transformation between elm-types stringToInt : String -> Int stringToInt a = Maybe.withDefault 0 (String.toInt a)