From 50c8237cdbdd4680c09c88f0e0cea9c349866268 Mon Sep 17 00:00:00 2001 From: unknown <marcus.gagelmann@student.uni-halle.de> Date: Mon, 13 Jul 2020 17:03:32 +0200 Subject: [PATCH] hover effect for CharacterIcons back in app; no more opening of newIcon Modal when deleting ObjectIcons; CharacterIcons now get properly deleted after deleting their Character in the FighterTool-Tab and their IDs will be correct afterwards, too! --- out/main.js | 88 +++++++++++++++++++++++++----------------- src/DungeonMap.elm | 20 +++++----- src/Main.elm | 24 +++++++----- src/Model.elm | 2 +- src/res/Stylesheet.css | 6 --- 5 files changed, 79 insertions(+), 61 deletions(-) diff --git a/out/main.js b/out/main.js index badd00e..37abf5a 100644 --- a/out/main.js +++ b/out/main.js @@ -6817,21 +6817,32 @@ var $elm$core$List$filter = F2( _List_Nil, list); }); -var $author$project$Main$generateObjectIdents = function (list) { +var $author$project$Main$generateIconIdents = function (list) { return A2( $elm$core$List$indexedMap, F2( function (id, _char) { - if (_char.$ === 'ObjectIcon') { - var typeID = _char.a; - var x = _char.b; - var y = _char.c; - var t = _char.d; - var c = _char.e; - var ident = _char.f; - return A6($author$project$Model$ObjectIcon, typeID, x, y, t, c, id + 1); - } else { - return A6($author$project$Model$ObjectIcon, 0, '', '', '', $elm$core$Maybe$Nothing, 0); + switch (_char.$) { + case 'ObjectIcon': + var typeID = _char.a; + var x = _char.b; + var y = _char.c; + var t = _char.d; + var c = _char.e; + var ident = _char.f; + return A6($author$project$Model$ObjectIcon, typeID, x, y, t, c, id + 1); + case 'PlayerIcon': + var ident = _char.a; + var x = _char.b; + var y = _char.c; + var name = _char.d; + return A4($author$project$Model$PlayerIcon, id + 1, x, y, name); + default: + var ident = _char.a; + var x = _char.b; + var y = _char.c; + var name = _char.d; + return A4($author$project$Model$MonsterIcon, id + 1, x, y, name); } }), list); @@ -8119,7 +8130,14 @@ var $author$project$Main$update = F2( _Utils_update( model, { - enemy: A2($elm_community$array_extra$Array$Extra$removeAt, index, model.enemy) + activeTooltip: '', + characterList: $author$project$Main$generateIconIdents( + A2( + $elm$core$List$filter, + $author$project$Main$isNotId(index + 1), + model.characterList)), + enemy: A2($elm_community$array_extra$Array$Extra$removeAt, index, model.enemy), + highlightedTableRow: 0 }), $elm$core$Platform$Cmd$none); case 'CharacterDeath': @@ -8335,7 +8353,7 @@ var $author$project$Main$update = F2( { addCharacterIcon: $author$project$Model$DrawingInactive, iconText: '', - objectIconList: $author$project$Main$generateObjectIdents( + objectIconList: $author$project$Main$generateIconIdents( _Utils_ap( model.objectIconList, _List_fromArray( @@ -8582,23 +8600,18 @@ var $author$project$Main$update = F2( } case 'ToolTipMsg': var tooltip = msg.a; + var mouseInObjectIcon = msg.b; if (tooltip === '') { return _Utils_Tuple2( _Utils_update( model, - { - activeTooltip: '', - mouseInIcon: (tooltip === '') ? false : true - }), + {activeTooltip: '', mouseInIcon: mouseInObjectIcon}), $elm$core$Platform$Cmd$none); } else { return _Utils_Tuple2( _Utils_update( model, - { - activeTooltip: tooltip, - mouseInIcon: (tooltip === '') ? false : true - }), + {activeTooltip: tooltip, mouseInIcon: mouseInObjectIcon}), $elm$core$Platform$Cmd$none); } case 'HighlightTableRow': @@ -8692,22 +8705,22 @@ var $author$project$About$aboutView = A2( _List_Nil, _List_fromArray( [ - $elm$html$Html$text('\n Die wenigsten Geschichten im Pen & Paper Rollenspiel DSA kommen ohne einen Kampf aus.\n Die Mechanik unterscheidet sich allerdings etwas vom normalen Spielgeschehen.\n '), + $elm$html$Html$text('\r\n Die wenigsten Geschichten im Pen & Paper Rollenspiel DSA kommen ohne einen Kampf aus.\r\n Die Mechanik unterscheidet sich allerdings etwas vom normalen Spielgeschehen.\r\n '), A2($elm$html$Html$br, _List_Nil, _List_Nil), - $elm$html$Html$text('\n Zur Vorbereitung wird die Reihenfolge der Kämpfenden bestimmt. Dazu wird der die Initiative (INI) ausgewürfelt.\n Der Spielleiter würfelt für alle NSCs.\n '), + $elm$html$Html$text('\r\n Zur Vorbereitung wird die Reihenfolge der Kämpfenden bestimmt. Dazu wird der die Initiative (INI) ausgewürfelt.\r\n Der Spielleiter würfelt für alle NSCs.\r\n '), A2($elm$html$Html$br, _List_Nil, _List_Nil), - $elm$html$Html$text('\n Dieser Reihenfolge nach dürfen die Charaktere jetzt je einen Gegner angreifen.\n ') + $elm$html$Html$text('\r\n Dieser Reihenfolge nach dürfen die Charaktere jetzt je einen Gegner angreifen.\r\n ') ])), A2( $elm$html$Html$p, _List_Nil, _List_fromArray( [ - $elm$html$Html$text('\n Um anzugreifen muss zunächst eine Probe mit einem W20 auf den AT-Wert bestanden werden.\n Gleichzeitig wirft der Angegriffene auf PA oder AW. Gelingt die Probe bricht der Angriff an dieser Stelle ab.\n '), + $elm$html$Html$text('\r\n Um anzugreifen muss zunächst eine Probe mit einem W20 auf den AT-Wert bestanden werden.\r\n Gleichzeitig wirft der Angegriffene auf PA oder AW. Gelingt die Probe bricht der Angriff an dieser Stelle ab.\r\n '), A2($elm$html$Html$br, _List_Nil, _List_Nil), - $elm$html$Html$text('\n War der Angriff erfolgreich und die Verteidigung ein Fehlschlag wird der Schaden berechnet.\n Das ist die Gelegenheit den \"Angriff\"-Button zu klicken.\n Entsprechend der Angabe der Waffe (z.B 1W6+4) wird der Angriffswert erwürfelt.\n Von diesem wird der RS-Wert des Angegriffenen subtrahiert und das Ergebnis von den LeP abgezogen.\n '), + $elm$html$Html$text('\r\n War der Angriff erfolgreich und die Verteidigung ein Fehlschlag wird der Schaden berechnet.\r\n Das ist die Gelegenheit den \"Angriff\"-Button zu klicken.\r\n Entsprechend der Angabe der Waffe (z.B 1W6+4) wird der Angriffswert erwürfelt.\r\n Von diesem wird der RS-Wert des Angegriffenen subtrahiert und das Ergebnis von den LeP abgezogen.\r\n '), A2($elm$html$Html$br, _List_Nil, _List_Nil), - $elm$html$Html$text('\n Die Berechnung übernimmt der Manager vollständig!\n ') + $elm$html$Html$text('\r\n Die Berechnung übernimmt der Manager vollständig!\r\n ') ])), A2( $elm$html$Html$p, @@ -12419,9 +12432,10 @@ var $author$project$Model$HighlightTableRow = F2( function (a, b) { return {$: 'HighlightTableRow', a: a, b: b}; }); -var $author$project$Model$ToolTipMsg = function (a) { - return {$: 'ToolTipMsg', a: a}; -}; +var $author$project$Model$ToolTipMsg = F2( + function (a, b) { + return {$: 'ToolTipMsg', a: a, b: b}; + }); var $avh4$elm_color$Color$black = A4($avh4$elm_color$Color$RgbaSpace, 0 / 255, 0 / 255, 0 / 255, 1.0); var $elm$core$String$concat = function (strings) { return A2($elm$core$String$join, '', strings); @@ -12718,7 +12732,8 @@ var $author$project$DungeonMap$placeIcon = function (s) { $elm$svg$Svg$Events$onMouseOut( A2($author$project$Model$HighlightTableRow, 0, '')), $elm$svg$Svg$Events$onClick( - A2($author$project$Model$DeleteIcon, iconType, id)) + A2($author$project$Model$DeleteIcon, iconType, id)), + $elm$svg$Svg$Attributes$class('MonsterIcon') ]), _List_Nil) ]); @@ -12774,7 +12789,8 @@ var $author$project$DungeonMap$placeIcon = function (s) { $elm$svg$Svg$Events$onMouseOut( A2($author$project$Model$HighlightTableRow, 0, '')), $elm$svg$Svg$Events$onClick( - A2($author$project$Model$DeleteIcon, iconType, id)) + A2($author$project$Model$DeleteIcon, iconType, id)), + $elm$svg$Svg$Attributes$class('PlayerIcon') ]), _List_Nil) ]); @@ -12795,9 +12811,9 @@ var $author$project$DungeonMap$placeIcon = function (s) { $elm$svg$Svg$Attributes$style( $author$project$DungeonMap$buildCustomObjectIconStyle(color)), $elm$svg$Svg$Events$onMouseOver( - $author$project$Model$ToolTipMsg(text)), + A2($author$project$Model$ToolTipMsg, text, true)), $elm$svg$Svg$Events$onMouseOut( - $author$project$Model$ToolTipMsg('')), + A2($author$project$Model$ToolTipMsg, '', false)), $elm$svg$Svg$Attributes$class('ObjectIcon'), $elm$svg$Svg$Events$onClick( A2($author$project$Model$DeleteIcon, iconType, id)) @@ -12827,9 +12843,9 @@ var $author$project$DungeonMap$placeIcon = function (s) { $elm$svg$Svg$Attributes$xlinkHref( $author$project$DungeonMap$getIconPath(typeID)), $elm$svg$Svg$Events$onMouseOver( - $author$project$Model$ToolTipMsg(text)), + A2($author$project$Model$ToolTipMsg, text, true)), $elm$svg$Svg$Events$onMouseOut( - $author$project$Model$ToolTipMsg('')), + A2($author$project$Model$ToolTipMsg, '', false)), $elm$svg$Svg$Attributes$class('ObjectIcon'), $elm$svg$Svg$Events$onClick( A2($author$project$Model$DeleteIcon, iconType, id)) diff --git a/src/DungeonMap.elm b/src/DungeonMap.elm index a77a72e..75d63fc 100644 --- a/src/DungeonMap.elm +++ b/src/DungeonMap.elm @@ -46,7 +46,7 @@ dungeonMapView model = [ text "Upload Map" ] , Button.button [ Button.attrs [ class "metalButton", style "height" "52px" ] - , Button.onClick ClearCharacterList ] + , Button.onClick ClearCharacterList ] [ text "Clear Map" ] ] ] @@ -71,7 +71,7 @@ dungeonMap_MonsterList model = Table.tbody [] <| characters2rows model.enemy model.highlightedTableRow } - + ] characters2rows : Array.Array Character -> Int -> List (Table.Row Msg) @@ -112,12 +112,12 @@ dungeonMap_Svg model = ([ SvgAtt.width "100%", SvgAtt.viewBox "0 0 800 550", SvgAtt.version "1.1" ] ++ mouseDrawEvents model.addCharacterIcon ) - ([ Svg.image + ([ Svg.image [ SvgAtt.width "800" , SvgAtt.height "550" , SvgAtt.title "DungeonMap" - , SvgAtt.xlinkHref (Maybe.withDefault "" (List.head model.previews)) - ] [] + , SvgAtt.xlinkHref (Maybe.withDefault "" (List.head model.previews)) + ] [] ] ++ svgIconList model ++ newIconsView model.addCharacterIcon @@ -214,6 +214,7 @@ placeIcon s = , Svg.Events.onMouseOver (HighlightTableRow id text) , Svg.Events.onMouseOut (HighlightTableRow 0 "") , Svg.Events.onClick (DeleteIcon iconType id) + , SvgAtt.class "MonsterIcon" ] [] ] @@ -234,6 +235,7 @@ placeIcon s = , Svg.Events.onMouseOver (HighlightTableRow id text) , Svg.Events.onMouseOut (HighlightTableRow 0 "") , Svg.Events.onClick (DeleteIcon iconType id) + , SvgAtt.class "PlayerIcon" ] [] ] @@ -245,8 +247,8 @@ placeIcon s = , SvgAtt.cy y , SvgAtt.r "10" , SvgAtt.style (buildCustomObjectIconStyle color) - , Svg.Events.onMouseOver (ToolTipMsg text) - , Svg.Events.onMouseOut (ToolTipMsg "") + , Svg.Events.onMouseOver (ToolTipMsg text True) + , Svg.Events.onMouseOut (ToolTipMsg "" False) , SvgAtt.class "ObjectIcon" , Svg.Events.onClick (DeleteIcon iconType id) ] @@ -259,8 +261,8 @@ placeIcon s = , SvgAtt.x (String.fromFloat (Maybe.withDefault 0 (String.toFloat x) - 11.5)) , SvgAtt.y (String.fromFloat (Maybe.withDefault 0 (String.toFloat y) - 11.5)) , SvgAtt.xlinkHref (getIconPath typeID) - , Svg.Events.onMouseOver (ToolTipMsg text) - , Svg.Events.onMouseOut (ToolTipMsg "") + , Svg.Events.onMouseOver (ToolTipMsg text True) + , Svg.Events.onMouseOut (ToolTipMsg "" False) , SvgAtt.class "ObjectIcon" , Svg.Events.onClick (DeleteIcon iconType id) ] [] diff --git a/src/Main.elm b/src/Main.elm index 2d2f9e0..2d0937f 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -68,7 +68,10 @@ update msg model = ) RemoveEnemy index -> - ( { model | enemy = Array.removeAt index model.enemy } + ( { model | enemy = Array.removeAt index model.enemy + , characterList = generateIconIdents (List.filter (isNotId (index+1)) model.characterList) + , highlightedTableRow = 0 + , activeTooltip = "" } , Cmd.none ) @@ -164,7 +167,7 @@ update msg model = else ( { model | addCharacterIcon = DrawingInactive }, Cmd.none ) ObjectIcon i x y t c ident -> - ( { model | objectIconList = (generateObjectIdents (model.objectIconList ++ [ ObjectIcon i x y model.iconText (Just model.colour) ident ])) + ( { model | objectIconList = (generateIconIdents (model.objectIconList ++ [ ObjectIcon i x y model.iconText (Just model.colour) ident ])) , addCharacterIcon = DrawingInactive , showObjectIconModal = Modal.hidden , iconText = "" @@ -269,15 +272,15 @@ update msg model = _ -> ( model, Cmd.none ) - ToolTipMsg tooltip -> + ToolTipMsg tooltip mouseInObjectIcon -> case tooltip of "" -> ( { model | activeTooltip = "" - , mouseInIcon = (if tooltip=="" then False else True) } + , mouseInIcon = mouseInObjectIcon } , Cmd.none ) _ -> ( { model | activeTooltip = tooltip - , mouseInIcon = (if tooltip=="" then False else True) } + , mouseInIcon = mouseInObjectIcon } , Cmd.none ) @@ -373,14 +376,17 @@ isNotId id s = ObjectIcon _ _ _ _ _ ident -> id/=ident -generateObjectIdents : List CharacterIcon -> List CharacterIcon -generateObjectIdents list = +generateIconIdents : List CharacterIcon -> List CharacterIcon +generateIconIdents list = List.indexedMap (\id char -> case char of ObjectIcon typeID x y t c ident -> ObjectIcon typeID x y t c (id+1) - _ -> - ObjectIcon 0 "" "" "" Nothing 0 + PlayerIcon ident x y name -> + PlayerIcon (id+1) x y name + + MonsterIcon ident x y name -> + MonsterIcon (id+1) x y name ) list diff --git a/src/Model.elm b/src/Model.elm index 3eae4ea..8e8fc09 100644 --- a/src/Model.elm +++ b/src/Model.elm @@ -125,7 +125,7 @@ type Msg | ChangeIconText String | ChangeIcon Int | ColorPickerMsg ColorPicker.Msg - | ToolTipMsg String + | ToolTipMsg String Bool | HighlightTableRow Int String | DeleteIcon String Int diff --git a/src/res/Stylesheet.css b/src/res/Stylesheet.css index 5748fdd..d9c0249 100644 --- a/src/res/Stylesheet.css +++ b/src/res/Stylesheet.css @@ -123,8 +123,6 @@ tr:nth-child(odd) {background-color: #faf2eb;} fill: grey-darker; opacity:0.5; fill-opacity:0.5; - width:25px; - height:25px; } .MonsterIcon { @@ -138,16 +136,12 @@ tr:nth-child(odd) {background-color: #faf2eb;} fill: grey-darker; opacity:0.5; fill-opacity:0.5; - width:30px; - height:30px; } .ObjectIcon:hover { fill: grey-darker; opacity:0.5; fill-opacity:0.5; - width:25px; - height:25px; } .aboutText { -- GitLab