diff --git a/index.html b/index.html index 299ea68289be6d18a28ab9e5f9fbe2235fb63bff..51cc5181b2ad799a5f229e13b77ff54fed9a885c 100644 --- a/index.html +++ b/index.html @@ -11,6 +11,27 @@ <title>Main</title> <script src="out/main.js"></script> <style> + .MonsterIcon:hover { + fill: grey-darker; + opacity:0.5; + fill-opacity:0.5; + width:30px; + height:30px; + } + .PlayerIcon:hover { + fill: grey-darker; + opacity:0.5; + fill-opacity:0.5; + width:25px; + height:25px; + } + .ObjectIcon:hover { + fill: grey-darker; + opacity:0.5; + fill-opacity:0.5; + width:25px; + height:25px; + } </style> </head> diff --git a/out/main.js b/out/main.js index d174dc77529a50d5639c27e045c4cbc4ec9f7ce5..2c8fa2ba96f35c329e464d858226e1b9784c1854 100644 --- a/out/main.js +++ b/out/main.js @@ -5632,6 +5632,7 @@ var $avh4$elm_color$Color$rgb = F3( var $author$project$Model$init = function (_v0) { return _Utils_Tuple2( { + activeTooltip: 'Tooltip', addCharacterIcon: $author$project$Model$DrawingInactive, bonusDamage: 0, characterId: 0, @@ -5644,9 +5645,11 @@ var $author$project$Model$init = function (_v0) { dieFaces: _List_Nil, enemy: $elm$core$Array$empty, enemyHero: 'Enemy', + highlightedTableRow: 0, hover: false, iconText: '', maxFace: 6, + mouseInIcon: false, myDrop1State: $rundis$elm_bootstrap$Bootstrap$Dropdown$initialState, objectIconList: _List_Nil, previews: _List_Nil, @@ -6249,17 +6252,17 @@ var $author$project$Model$GotFiles = F2( var $author$project$Model$GotPreviews = function (a) { return {$: 'GotPreviews', a: a}; }; -var $author$project$Model$MonsterIcon = F3( - function (a, b, c) { - return {$: 'MonsterIcon', a: a, b: b, c: c}; +var $author$project$Model$MonsterIcon = F4( + function (a, b, c, d) { + return {$: 'MonsterIcon', a: a, b: b, c: c, d: d}; }); -var $author$project$Model$ObjectIcon = F5( - function (a, b, c, d, e) { - return {$: 'ObjectIcon', a: a, b: b, c: c, d: d, e: e}; +var $author$project$Model$ObjectIcon = F6( + function (a, b, c, d, e, f) { + return {$: 'ObjectIcon', a: a, b: b, c: c, d: d, e: e, f: f}; }); -var $author$project$Model$PlayerIcon = F3( - function (a, b, c) { - return {$: 'PlayerIcon', a: a, b: b, c: c}; +var $author$project$Model$PlayerIcon = F4( + function (a, b, c, d) { + return {$: 'PlayerIcon', a: a, b: b, c: c, d: d}; }); var $elm$core$List$sum = function (numbers) { return A3($elm$core$List$foldl, $elm$core$Basics$add, 0, numbers); @@ -6813,6 +6816,25 @@ var $elm$core$List$filter = F2( _List_Nil, list); }); +var $author$project$Main$generateObjectIdents = 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); + } + }), + list); +}; var $author$project$Model$NewRandomList = function (a) { return {$: 'NewRandomList', a: a}; }; @@ -7178,8 +7200,8 @@ var $author$project$Main$isNotId = F2( var i = s.a; return !_Utils_eq(id, i); default: - var i = s.a; - return !_Utils_eq(id, i); + var ident = s.f; + return !_Utils_eq(id, ident); } }); var $elm$json$Json$Decode$field = _Json_decodeField; @@ -8146,13 +8168,14 @@ var $author$project$Main$update = F2( var y = _v4.c; var t = _v4.d; var c = _v4.e; + var ident = _v4.f; if (id === 3) { return _Utils_Tuple2( _Utils_update( model, { addCharacterIcon: $author$project$Model$DrawIcon( - A5($author$project$Model$ObjectIcon, id, x, y, t, c)), + A6($author$project$Model$ObjectIcon, id, x, y, t, c, ident)), radioCheckedID: id }), $elm$core$Platform$Cmd$none); @@ -8162,7 +8185,7 @@ var $author$project$Main$update = F2( model, { addCharacterIcon: $author$project$Model$DrawIcon( - A5($author$project$Model$ObjectIcon, id, x, y, t, $elm$core$Maybe$Nothing)), + A6($author$project$Model$ObjectIcon, id, x, y, t, $elm$core$Maybe$Nothing, ident)), radioCheckedID: id }), $elm$core$Platform$Cmd$none); @@ -8236,6 +8259,7 @@ var $author$project$Main$update = F2( var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var n = characterIcon.d; return _Utils_eq( $elm$core$List$length(model.characterList), $elm$core$List$length( @@ -8261,6 +8285,7 @@ var $author$project$Main$update = F2( var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var n = characterIcon.d; return _Utils_eq( $elm$core$List$length(model.characterList), $elm$core$List$length( @@ -8288,24 +8313,27 @@ var $author$project$Main$update = F2( var y = characterIcon.c; var t = characterIcon.d; var c = characterIcon.e; + var ident = characterIcon.f; return _Utils_Tuple2( _Utils_update( model, { addCharacterIcon: $author$project$Model$DrawingInactive, iconText: '', - objectIconList: _Utils_ap( - model.objectIconList, - _List_fromArray( - [ - A5( - $author$project$Model$ObjectIcon, - i, - x, - y, - model.iconText, - $elm$core$Maybe$Just(model.colour)) - ])), + objectIconList: $author$project$Main$generateObjectIdents( + _Utils_ap( + model.objectIconList, + _List_fromArray( + [ + A6( + $author$project$Model$ObjectIcon, + i, + x, + y, + model.iconText, + $elm$core$Maybe$Just(model.colour), + ident) + ]))), radioCheckedID: 0, showObjectIconModal: $rundis$elm_bootstrap$Bootstrap$Modal$hidden }), @@ -8318,6 +8346,7 @@ var $author$project$Main$update = F2( var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var name = characterIcon.d; return (_Utils_cmp( $elm$core$List$length(model.characterList), $elm$core$List$length( @@ -8339,13 +8368,14 @@ var $author$project$Main$update = F2( model, { addCharacterIcon: $author$project$Model$DrawIcon( - A3($author$project$Model$PlayerIcon, i, x, y)) + A4($author$project$Model$PlayerIcon, i, x, y, name)) }), $elm$core$Platform$Cmd$none); case 'MonsterIcon': var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var name = characterIcon.d; return (_Utils_cmp( $elm$core$List$length(model.characterList), $elm$core$List$length( @@ -8367,7 +8397,7 @@ var $author$project$Main$update = F2( model, { addCharacterIcon: $author$project$Model$DrawIcon( - A3($author$project$Model$MonsterIcon, i, x, y)) + A4($author$project$Model$MonsterIcon, i, x, y, name)) }), $elm$core$Platform$Cmd$none); default: @@ -8376,12 +8406,13 @@ var $author$project$Main$update = F2( var y = characterIcon.c; var t = characterIcon.d; var c = characterIcon.e; + var ident = characterIcon.f; return _Utils_Tuple2( _Utils_update( model, { addCharacterIcon: $author$project$Model$DrawIcon( - A5($author$project$Model$ObjectIcon, i, x, y, t, c)) + A6($author$project$Model$ObjectIcon, i, x, y, t, c, ident)) }), $elm$core$Platform$Cmd$none); } @@ -8445,7 +8476,10 @@ var $author$project$Main$update = F2( return _Utils_Tuple2( _Utils_update( model, - {showObjectIconModal: $rundis$elm_bootstrap$Bootstrap$Modal$shown}), + { + mouseInIcon: false, + showObjectIconModal: model.mouseInIcon ? $rundis$elm_bootstrap$Bootstrap$Modal$hidden : $rundis$elm_bootstrap$Bootstrap$Modal$shown + }), $elm$core$Platform$Cmd$none); } case 'ShowAttackModal': @@ -8506,7 +8540,7 @@ var $author$project$Main$update = F2( model, {previews: urls}), $elm$core$Platform$Cmd$none); - default: + case 'ColorPickerMsg': var cpMsg = msg.a; var _v11 = model.addCharacterIcon; if ((_v11.$ === 'DrawIcon') && (_v11.a.$ === 'ObjectIcon')) { @@ -8516,6 +8550,7 @@ var $author$project$Main$update = F2( var y = _v12.c; var t = _v12.d; var c = _v12.e; + var ident = _v12.f; var _v13 = A3($simonh1000$elm_colorpicker$ColorPicker$update, cpMsg, model.colour, model.colorPicker); var m = _v13.a; var colour = _v13.b; @@ -8530,6 +8565,68 @@ var $author$project$Main$update = F2( } else { return _Utils_Tuple2(model, $elm$core$Platform$Cmd$none); } + case 'ToolTipMsg': + var tooltip = msg.a; + if (tooltip === '') { + return _Utils_Tuple2( + _Utils_update( + model, + { + activeTooltip: 'Beschreibung', + mouseInIcon: (tooltip === 'Beschreibung') ? false : true + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + activeTooltip: tooltip, + mouseInIcon: (tooltip === 'Beschreibung') ? false : true + }), + $elm$core$Platform$Cmd$none); + } + case 'HighlightTableRow': + var id = msg.a; + var name = msg.b; + return _Utils_Tuple2( + _Utils_update( + model, + { + activeTooltip: name, + highlightedTableRow: id, + mouseInIcon: (!id) ? false : true + }), + $elm$core$Platform$Cmd$none); + default: + var iconType = msg.a; + var id = msg.b; + if (iconType === 'object') { + return _Utils_Tuple2( + _Utils_update( + model, + { + activeTooltip: 'Beschreibung', + objectIconList: A2( + $elm$core$List$filter, + $author$project$Main$isNotId(id), + model.objectIconList) + }), + $elm$core$Platform$Cmd$none); + } else { + return _Utils_Tuple2( + _Utils_update( + model, + { + activeTooltip: 'Beschreibung', + characterList: A2( + $elm$core$List$filter, + $author$project$Main$isNotId(id), + model.characterList), + highlightedTableRow: 0 + }), + $elm$core$Platform$Cmd$none); + } } }); var $author$project$Model$TabMsg = function (a) { @@ -11953,6 +12050,8 @@ var $rundis$elm_bootstrap$Bootstrap$Grid$col = F2( return $rundis$elm_bootstrap$Bootstrap$Grid$Column( {children: children, options: options}); }); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Disabled = {$: 'Disabled'}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$disabled = $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Disabled; var $rundis$elm_bootstrap$Bootstrap$Table$Bordered = {$: 'Bordered'}; var $rundis$elm_bootstrap$Bootstrap$Table$bordered = $rundis$elm_bootstrap$Bootstrap$Table$Bordered; var $author$project$Model$AddCharacterIcon = function (a) { @@ -11961,6 +12060,24 @@ var $author$project$Model$AddCharacterIcon = function (a) { var $author$project$Model$MouseDraw = function (a) { return {$: 'MouseDraw', a: a}; }; +<<<<<<< HEAD +======= +var $rundis$elm_bootstrap$Bootstrap$Table$RowAttr = function (a) { + return {$: 'RowAttr', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Table$rowAttr = function (attr_) { + return $rundis$elm_bootstrap$Bootstrap$Table$RowAttr(attr_); +}; +var $rundis$elm_bootstrap$Bootstrap$Table$Roled = function (a) { + return {$: 'Roled', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Table$RoledRow = function (a) { + return {$: 'RoledRow', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Internal$Role$Secondary = {$: 'Secondary'}; +var $rundis$elm_bootstrap$Bootstrap$Table$rowSecondary = $rundis$elm_bootstrap$Bootstrap$Table$RoledRow( + $rundis$elm_bootstrap$Bootstrap$Table$Roled($rundis$elm_bootstrap$Bootstrap$Internal$Role$Secondary)); +>>>>>>> dev var $author$project$DungeonMap$stopBubbling = function (msg) { return A2( $elm$html$Html$Events$stopPropagationOn, @@ -11972,93 +12089,100 @@ var $author$project$DungeonMap$stopBubbling = function (msg) { }, $elm$json$Json$Decode$succeed(msg))); }; -var $author$project$DungeonMap$characters2rows = function (chars) { - return A2( - $elm$core$List$indexedMap, - F2( - function (i, c) { - if (c.$ === 'Enemy') { - var name = c.a; - var health = c.b; - return A2( - $rundis$elm_bootstrap$Bootstrap$Table$tr, - _List_fromArray( - [ - $rundis$elm_bootstrap$Bootstrap$Table$rowAttr( - $author$project$DungeonMap$stopBubbling( - $author$project$Model$AddCharacterIcon( - $author$project$Model$MouseDraw( - A3($author$project$Model$MonsterIcon, i + 1, '-100', '-100'))))) - ]), - _List_fromArray( - [ - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromInt(i + 1)) - ])), - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text(name) - ])), - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromInt(health)) - ])) - ])); - } else { - var name = c.a; - var health = c.b; - return A2( - $rundis$elm_bootstrap$Bootstrap$Table$tr, - _List_fromArray( - [ - $rundis$elm_bootstrap$Bootstrap$Table$rowAttr( - $author$project$DungeonMap$stopBubbling( - $author$project$Model$AddCharacterIcon( - $author$project$Model$MouseDraw( - A3($author$project$Model$PlayerIcon, i + 1, '-100', '-100'))))) - ]), - _List_fromArray( - [ - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, - _List_fromArray( - [ - $elm$html$Html$text( - $elm$core$String$fromInt(i + 1)) - ])), - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, +var $author$project$DungeonMap$characters2rows = F2( + function (chars, highlighted) { + return A2( + $elm$core$List$indexedMap, + F2( + function (i, c) { + if (c.$ === 'Enemy') { + var name = c.a; + var health = c.b; + return A2( + $rundis$elm_bootstrap$Bootstrap$Table$tr, + _Utils_ap( _List_fromArray( [ - $elm$html$Html$text(name) - ])), - A2( - $rundis$elm_bootstrap$Bootstrap$Table$td, - _List_Nil, + $rundis$elm_bootstrap$Bootstrap$Table$rowAttr( + $author$project$DungeonMap$stopBubbling( + $author$project$Model$AddCharacterIcon( + $author$project$Model$MouseDraw( + A4($author$project$Model$MonsterIcon, i + 1, '-100', '-100', name))))) + ]), + _Utils_eq(highlighted, i + 1) ? _List_fromArray( + [$rundis$elm_bootstrap$Bootstrap$Table$rowSecondary]) : _List_Nil), + _List_fromArray( + [ + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(i + 1)) + ])), + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(name) + ])), + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(health)) + ])) + ])); + } else { + var name = c.a; + var health = c.b; + return A2( + $rundis$elm_bootstrap$Bootstrap$Table$tr, + _Utils_ap( _List_fromArray( [ - $elm$html$Html$text( - $elm$core$String$fromInt(health)) - ])) - ])); - } - }), - $elm$core$Array$toList(chars)); -}; + $rundis$elm_bootstrap$Bootstrap$Table$rowAttr( + $author$project$DungeonMap$stopBubbling( + $author$project$Model$AddCharacterIcon( + $author$project$Model$MouseDraw( + A4($author$project$Model$PlayerIcon, i + 1, '-100', '-100', name))))) + ]), + _Utils_eq(highlighted, i + 1) ? _List_fromArray( + [$rundis$elm_bootstrap$Bootstrap$Table$rowSecondary]) : _List_Nil), + _List_fromArray( + [ + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(i + 1)) + ])), + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text(name) + ])), + A2( + $rundis$elm_bootstrap$Bootstrap$Table$td, + _List_Nil, + _List_fromArray( + [ + $elm$html$Html$text( + $elm$core$String$fromInt(health)) + ])) + ])); + } + }), + $elm$core$Array$toList(chars)); + }); var $rundis$elm_bootstrap$Bootstrap$Table$Responsive = function (a) { return {$: 'Responsive', a: a}; }; @@ -12077,11 +12201,11 @@ var $author$project$DungeonMap$dungeonMap_MonsterList = function (model) { $rundis$elm_bootstrap$Bootstrap$Table$table( { options: _List_fromArray( - [$rundis$elm_bootstrap$Bootstrap$Table$striped, $rundis$elm_bootstrap$Bootstrap$Table$hover, $rundis$elm_bootstrap$Bootstrap$Table$bordered, $rundis$elm_bootstrap$Bootstrap$Table$responsive]), + [$rundis$elm_bootstrap$Bootstrap$Table$hover, $rundis$elm_bootstrap$Bootstrap$Table$bordered, $rundis$elm_bootstrap$Bootstrap$Table$responsive]), tbody: A2( $rundis$elm_bootstrap$Bootstrap$Table$tbody, _List_Nil, - $author$project$DungeonMap$characters2rows(model.enemy)), + A2($author$project$DungeonMap$characters2rows, model.enemy, model.highlightedTableRow)), thead: $rundis$elm_bootstrap$Bootstrap$Table$simpleThead( _List_fromArray( [ @@ -12112,7 +12236,6 @@ var $author$project$DungeonMap$dungeonMap_MonsterList = function (model) { }; var $author$project$Model$DragEnter = {$: 'DragEnter'}; var $author$project$Model$DragLeave = {$: 'DragLeave'}; -var $author$project$Model$ObjectIconModal = {$: 'ObjectIconModal'}; var $author$project$Model$Pick = {$: 'Pick'}; var $elm$file$File$decoder = _File_decoder; var $elm$json$Json$Decode$list = _Json_decodeList; @@ -12166,6 +12289,7 @@ var $elm$svg$Svg$image = $elm$svg$Svg$trustedNode('image'); var $author$project$Model$MouseClick = function (a) { return {$: 'MouseClick', a: a}; }; +var $author$project$Model$ObjectIconModal = {$: 'ObjectIconModal'}; var $elm$svg$Svg$Events$onClick = function (msg) { return A2( $elm$html$Html$Events$on, @@ -12196,37 +12320,41 @@ var $author$project$DungeonMap$onMouseMove = function (mapMousePositionToMsg) { 'mousemoveWithCoordinates', A2($elm$json$Json$Decode$map, mapMousePositionToMsg, $author$project$DungeonMap$mousePosition)); }; -var $author$project$DungeonMap$positionToCircleCenter = F2( - function (i, position) { - return $author$project$Model$AddCharacterIcon( - $author$project$Model$MouseDraw( - A3( - $author$project$Model$PlayerIcon, - i, - $elm$core$String$fromFloat(position.x), - $elm$core$String$fromFloat(position.y)))); - }); -var $author$project$DungeonMap$positionToIconCenter = F2( - function (i, position) { - return $author$project$Model$AddCharacterIcon( - $author$project$Model$MouseDraw( - A5( - $author$project$Model$ObjectIcon, - i, - $elm$core$String$fromFloat(position.x), - $elm$core$String$fromFloat(position.y), - '', - $elm$core$Maybe$Nothing))); - }); -var $author$project$DungeonMap$positionToRectangleCorner = F2( - function (i, position) { - return $author$project$Model$AddCharacterIcon( - $author$project$Model$MouseDraw( - A3( - $author$project$Model$MonsterIcon, - i, - $elm$core$String$fromFloat(position.x), - $elm$core$String$fromFloat(position.y)))); +var $author$project$DungeonMap$positionToIconCenter = F4( + function (icon, name, i, position) { + switch (icon) { + case 'player': + return $author$project$Model$AddCharacterIcon( + $author$project$Model$MouseDraw( + A4( + $author$project$Model$PlayerIcon, + i, + $elm$core$String$fromFloat(position.x), + $elm$core$String$fromFloat(position.y), + name))); + case 'monster': + return $author$project$Model$AddCharacterIcon( + $author$project$Model$MouseDraw( + A4( + $author$project$Model$MonsterIcon, + i, + $elm$core$String$fromFloat(position.x), + $elm$core$String$fromFloat(position.y), + name))); + case 'object': + return $author$project$Model$AddCharacterIcon( + $author$project$Model$MouseDraw( + A6( + $author$project$Model$ObjectIcon, + i, + $elm$core$String$fromFloat(position.x), + $elm$core$String$fromFloat(position.y), + '', + $elm$core$Maybe$Nothing, + 0))); + default: + return $author$project$Model$DoNothing; + } }); var $author$project$DungeonMap$mouseDrawEvents = function (addCharacterIcon) { if (addCharacterIcon.$ === 'DrawIcon') { @@ -12236,25 +12364,27 @@ var $author$project$DungeonMap$mouseDrawEvents = function (addCharacterIcon) { var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var n = characterIcon.d; return _List_fromArray( [ $elm$svg$Svg$Events$onClick( $author$project$Model$AddCharacterIcon( $author$project$Model$MouseClick(characterIcon))), $author$project$DungeonMap$onMouseMove( - $author$project$DungeonMap$positionToCircleCenter(i)) + A3($author$project$DungeonMap$positionToIconCenter, 'player', n, i)) ]); case 'MonsterIcon': var i = characterIcon.a; var x = characterIcon.b; var y = characterIcon.c; + var n = characterIcon.d; return _List_fromArray( [ $elm$svg$Svg$Events$onClick( $author$project$Model$AddCharacterIcon( $author$project$Model$MouseClick(characterIcon))), $author$project$DungeonMap$onMouseMove( - $author$project$DungeonMap$positionToRectangleCorner(i)) + A3($author$project$DungeonMap$positionToIconCenter, 'monster', n, i)) ]); default: var i = characterIcon.a; @@ -12262,22 +12392,34 @@ var $author$project$DungeonMap$mouseDrawEvents = function (addCharacterIcon) { var y = characterIcon.c; var t = characterIcon.d; var c = characterIcon.e; + var ident = characterIcon.f; return _List_fromArray( [ $elm$svg$Svg$Events$onClick( $author$project$Model$ShowModal($author$project$Model$ObjectIconModal)), $author$project$DungeonMap$onMouseMove( - $author$project$DungeonMap$positionToIconCenter(i)) + A3($author$project$DungeonMap$positionToIconCenter, 'object', '', i)) ]); } } else { return _List_fromArray( [ $author$project$DungeonMap$onMouseMove( - $author$project$DungeonMap$positionToIconCenter(0)) + A3($author$project$DungeonMap$positionToIconCenter, 'object', '', 0)) ]); } }; +var $author$project$Model$DeleteIcon = F2( + function (a, b) { + return {$: 'DeleteIcon', a: a, b: b}; + }); +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 $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); @@ -12317,18 +12459,26 @@ var $author$project$DungeonMap$buildCustomObjectIconStyle = function (color) { A2($elm$core$Maybe$withDefault, $avh4$elm_color$Color$black, color)); }; var $elm$svg$Svg$circle = $elm$svg$Svg$trustedNode('circle'); +var $elm$svg$Svg$Attributes$class = _VirtualDom_attribute('class'); var $elm$svg$Svg$Attributes$cx = _VirtualDom_attribute('cx'); var $elm$svg$Svg$Attributes$cy = _VirtualDom_attribute('cy'); var $elm$svg$Svg$Attributes$dominantBaseline = _VirtualDom_attribute('dominant-baseline'); -var $author$project$DungeonMap$getIconPath = function (id) { - switch (id) { - case 1: - return 'res/icons/chest.png'; - case 2: - return 'res/icons/key.png'; - case 3: - return 'custom'; +var $author$project$DungeonMap$getColor = function (object) { + switch (object.$) { + case 'MonsterIcon': + var i = object.a; + var x = object.b; + var y = object.c; + var n = object.d; + return $elm$core$Maybe$Nothing; + case 'PlayerIcon': + var i = object.a; + var x = object.b; + var y = object.c; + var n = object.d; + return $elm$core$Maybe$Nothing; default: +<<<<<<< HEAD return ''; } }; @@ -12586,11 +12736,17 @@ var $author$project$DungeonMap$getColor = function (object) { var y = object.c; return $elm$core$Maybe$Nothing; default: +======= +>>>>>>> dev var i = object.a; var x = object.b; var y = object.c; var t = object.d; var c = object.e; +<<<<<<< HEAD +======= + var ident = object.f; +>>>>>>> dev return c; } }; @@ -12600,11 +12756,13 @@ var $author$project$DungeonMap$getCoord = function (object) { var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return x + (',' + y); case 'PlayerIcon': var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return x + (',' + y); default: var i = object.a; @@ -12612,6 +12770,7 @@ var $author$project$DungeonMap$getCoord = function (object) { var y = object.c; var t = object.d; var c = object.e; + var ident = object.f; return x + (',' + y); } }; @@ -12621,11 +12780,13 @@ var $author$project$DungeonMap$getID = function (object) { var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return i; case 'PlayerIcon': var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return i; default: var i = object.a; @@ -12633,7 +12794,20 @@ var $author$project$DungeonMap$getID = function (object) { var y = object.c; var t = object.d; var c = object.e; - return i; + var ident = object.f; + return ident; + } +}; +var $author$project$DungeonMap$getIconPath = function (id) { + switch (id) { + case 1: + return 'res/icons/chest.png'; + case 2: + return 'res/icons/key.png'; + case 3: + return 'custom'; + default: + return ''; } }; var $author$project$DungeonMap$getIconType = function (object) { @@ -12642,11 +12816,13 @@ var $author$project$DungeonMap$getIconType = function (object) { var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return 'monster'; case 'PlayerIcon': var i = object.a; var x = object.b; var y = object.c; + var n = object.d; return 'player'; default: var i = object.a; @@ -12654,6 +12830,7 @@ var $author$project$DungeonMap$getIconType = function (object) { var y = object.c; var t = object.d; var c = object.e; + var ident = object.f; return 'object'; } }; @@ -12663,23 +12840,67 @@ var $author$project$DungeonMap$getObjectText = function (object) { var i = object.a; var x = object.b; var y = object.c; - return ''; + var name = object.d; + return name; case 'PlayerIcon': var i = object.a; var x = object.b; var y = object.c; - return ''; + var name = object.d; + return name; default: var i = object.a; var x = object.b; var y = object.c; var t = object.d; var c = object.e; + var ident = object.f; return t; } }; -var $author$project$DungeonMap$getAreaParam = function (s) { - var yCor = A2( +var $author$project$DungeonMap$getTypeID = function (object) { + if (object.$ === 'ObjectIcon') { + var i = object.a; + var x = object.b; + var y = object.c; + var t = object.d; + var c = object.e; + var ident = object.f; + return i; + } else { + return 0; + } +}; +var $elm$svg$Svg$Attributes$id = _VirtualDom_attribute('id'); +var $elm$svg$Svg$Events$onMouseOut = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mouseout', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$svg$Svg$Events$onMouseOver = function (msg) { + return A2( + $elm$html$Html$Events$on, + 'mouseover', + $elm$json$Json$Decode$succeed(msg)); +}; +var $elm$svg$Svg$Attributes$r = _VirtualDom_attribute('r'); +var $elm$svg$Svg$Attributes$style = _VirtualDom_attribute('style'); +var $elm$svg$Svg$text = $elm$virtual_dom$VirtualDom$text; +var $elm$svg$Svg$Attributes$textAnchor = _VirtualDom_attribute('text-anchor'); +var $elm$svg$Svg$text_ = $elm$svg$Svg$trustedNode('text'); +var $elm$core$String$toFloat = _String_toFloat; +var $elm$svg$Svg$Attributes$x = _VirtualDom_attribute('x'); +var $elm$svg$Svg$Attributes$xlinkHref = function (value) { + return A3( + _VirtualDom_attributeNS, + 'http://www.w3.org/1999/xlink', + 'xlink:href', + _VirtualDom_noJavaScriptUri(value)); +}; +var $elm$svg$Svg$Attributes$y = _VirtualDom_attribute('y'); +var $author$project$DungeonMap$placeIcon = function (s) { + var y = A2( $elm$core$Maybe$withDefault, '0', $elm$core$List$head( @@ -12690,7 +12911,7 @@ var $author$project$DungeonMap$getAreaParam = function (s) { $elm$core$String$split, ',', $author$project$DungeonMap$getCoord(s))))); - var xCor = A2( + var x = A2( $elm$core$Maybe$withDefault, '0', $elm$core$List$head( @@ -12698,17 +12919,258 @@ var $author$project$DungeonMap$getAreaParam = function (s) { $elm$core$String$split, ',', $author$project$DungeonMap$getCoord(s)))); - var objectText = $author$project$DungeonMap$getObjectText(s); + var typeID = $author$project$DungeonMap$getTypeID(s); + var text = $author$project$DungeonMap$getObjectText(s); var id = $author$project$DungeonMap$getID(s); + var iconType = $author$project$DungeonMap$getIconType(s); var color = $author$project$DungeonMap$getColor(s); - return A5( - $author$project$DungeonMap$placeIcon, - $author$project$DungeonMap$getIconType(s), - id, - xCor, - yCor, - color); + switch (iconType) { + case 'monster': + return _List_fromArray( + [ + A2( + $elm$svg$Svg$text_, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$textAnchor('middle'), + $elm$svg$Svg$Attributes$x( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(x)) - 3)), + $elm$svg$Svg$Attributes$y( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(y)) - 0.5)), + $elm$svg$Svg$Attributes$dominantBaseline('middle') + ]), + _List_fromArray( + [ + $elm$svg$Svg$text( + $elm$core$String$fromInt(id)) + ])), + A2( + $elm$svg$Svg$image, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$style('width:30px;height:30px;'), + $elm$svg$Svg$Attributes$x( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(x)) - 17.5)), + $elm$svg$Svg$Attributes$y( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(y)) - 17.5)), + $elm$svg$Svg$Attributes$xlinkHref('res/icons/enemy.png'), + $elm$svg$Svg$Attributes$class('MonsterIcon'), + $elm$svg$Svg$Events$onMouseOver( + A2($author$project$Model$HighlightTableRow, id, text)), + $elm$svg$Svg$Events$onMouseOut( + A2($author$project$Model$HighlightTableRow, 0, 'Beschreibung')), + $elm$svg$Svg$Events$onClick( + A2($author$project$Model$DeleteIcon, iconType, id)) + ]), + _List_Nil) + ]); + case 'player': + return _List_fromArray( + [ + A2( + $elm$svg$Svg$text_, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$textAnchor('middle'), + $elm$svg$Svg$Attributes$x( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(x)) + 1)), + $elm$svg$Svg$Attributes$y( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(y)) + 2.5)), + $elm$svg$Svg$Attributes$dominantBaseline('middle') + ]), + _List_fromArray( + [ + $elm$svg$Svg$text( + $elm$core$String$fromInt(id)) + ])), + A2( + $elm$svg$Svg$image, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$style('width:25px;height:25px;'), + $elm$svg$Svg$Attributes$x( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(x)) - 11.5)), + $elm$svg$Svg$Attributes$y( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(y)) - 11.5)), + $elm$svg$Svg$Attributes$xlinkHref('res/icons/hero.png'), + $elm$svg$Svg$Attributes$class('PlayerIcon'), + $elm$svg$Svg$Events$onMouseOver( + A2($author$project$Model$HighlightTableRow, id, text)), + $elm$svg$Svg$Events$onMouseOut( + A2($author$project$Model$HighlightTableRow, 0, 'Beschreibung')), + $elm$svg$Svg$Events$onClick( + A2($author$project$Model$DeleteIcon, iconType, id)) + ]), + _List_Nil) + ]); + case 'object': + var _v1 = $author$project$DungeonMap$getIconPath(typeID); + if (_v1 === 'custom') { + return _List_fromArray( + [ + A2( + $elm$svg$Svg$circle, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$id( + $elm$core$String$fromInt(id)), + $elm$svg$Svg$Attributes$cx(x), + $elm$svg$Svg$Attributes$cy(y), + $elm$svg$Svg$Attributes$r('10'), + $elm$svg$Svg$Attributes$style( + $author$project$DungeonMap$buildCustomObjectIconStyle(color)), + $elm$svg$Svg$Events$onMouseOver( + $author$project$Model$ToolTipMsg(text)), + $elm$svg$Svg$Events$onMouseOut( + $author$project$Model$ToolTipMsg('Beschreibung')), + $elm$svg$Svg$Attributes$class('ObjectIcon'), + $elm$svg$Svg$Events$onClick( + A2($author$project$Model$DeleteIcon, iconType, id)) + ]), + _List_Nil) + ]); + } else { + return _List_fromArray( + [ + A2( + $elm$svg$Svg$image, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$style('width:25px;height:25px;'), + $elm$svg$Svg$Attributes$x( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(x)) - 11.5)), + $elm$svg$Svg$Attributes$y( + $elm$core$String$fromFloat( + A2( + $elm$core$Maybe$withDefault, + 0, + $elm$core$String$toFloat(y)) - 11.5)), + $elm$svg$Svg$Attributes$xlinkHref( + $author$project$DungeonMap$getIconPath(typeID)), + $elm$svg$Svg$Events$onMouseOver( + $author$project$Model$ToolTipMsg(text)), + $elm$svg$Svg$Events$onMouseOut( + $author$project$Model$ToolTipMsg('Beschreibung')), + $elm$svg$Svg$Attributes$class('ObjectIcon'), + $elm$svg$Svg$Events$onClick( + A2($author$project$Model$DeleteIcon, iconType, id)) + ]), + _List_Nil) + ]); + } + default: + return _List_Nil; + } +}; +var $elm$svg$Svg$rect = $elm$svg$Svg$trustedNode('rect'); +var $elm$svg$Svg$Attributes$width = _VirtualDom_attribute('width'); +var $author$project$DungeonMap$newIconsView = function (addCharacterIcon) { + if (addCharacterIcon.$ === 'DrawIcon') { + var characterIcon = addCharacterIcon.a; + switch (characterIcon.$) { + case 'ObjectIcon': + var i = characterIcon.a; + var x = characterIcon.b; + var y = characterIcon.c; + var t = characterIcon.d; + var c = characterIcon.e; + var ident = characterIcon.f; + return _List_Nil; + case 'PlayerIcon': + var i = characterIcon.a; + var x = characterIcon.b; + var y = characterIcon.c; + var n = characterIcon.d; + return _Utils_ap( + $author$project$DungeonMap$placeIcon(characterIcon), + _List_fromArray( + [ + A2( + $elm$svg$Svg$rect, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$width('800'), + $elm$svg$Svg$Attributes$height('600'), + $elm$svg$Svg$Attributes$x('0'), + $elm$svg$Svg$Attributes$y('0'), + $elm$svg$Svg$Attributes$style('fill:blue;stroke:pink;stroke-width:5;fill-opacity:0.1;stroke-opacity:0.9') + ]), + _List_Nil) + ])); + default: + var i = characterIcon.a; + var x = characterIcon.b; + var y = characterIcon.c; + var n = characterIcon.d; + return _Utils_ap( + $author$project$DungeonMap$placeIcon(characterIcon), + _List_fromArray( + [ + A2( + $elm$svg$Svg$rect, + _List_fromArray( + [ + $elm$svg$Svg$Attributes$width('800'), + $elm$svg$Svg$Attributes$height('600'), + $elm$svg$Svg$Attributes$x('0'), + $elm$svg$Svg$Attributes$y('0'), + $elm$svg$Svg$Attributes$style('fill:blue;stroke:pink;stroke-width:5;fill-opacity:0.1;stroke-opacity:0.9') + ]), + _List_Nil) + ])); + } + } else { + return _List_Nil; + } }; +var $rundis$elm_bootstrap$Bootstrap$Button$onClick = function (message) { + return $rundis$elm_bootstrap$Bootstrap$Button$attrs( + _List_fromArray( + [ + A2( + $elm$html$Html$Events$preventDefaultOn, + 'click', + $elm$json$Json$Decode$succeed( + _Utils_Tuple2(message, true))) + ])); +}; +var $elm$svg$Svg$svg = $elm$svg$Svg$trustedNode('svg'); var $author$project$DungeonMap$svgIconList = function (model) { return A3( $elm$core$List$foldl, @@ -12716,9 +13178,10 @@ var $author$project$DungeonMap$svgIconList = function (model) { _List_Nil, A2( $elm$core$List$map, - $author$project$DungeonMap$getAreaParam, + $author$project$DungeonMap$placeIcon, _Utils_ap(model.characterList, model.objectIconList))); }; +var $elm$svg$Svg$Attributes$title = _VirtualDom_attribute('title'); var $elm$svg$Svg$Attributes$version = _VirtualDom_attribute('version'); var $elm$svg$Svg$Attributes$viewBox = _VirtualDom_attribute('viewBox'); var $author$project$DungeonMap$dungeonMap_Svg = function (model) { @@ -12774,13 +13237,7 @@ var $author$project$DungeonMap$dungeonMap_Svg = function (model) { $elm$svg$Svg$Attributes$viewBox('0 0 800 600'), $elm$svg$Svg$Attributes$version('1.1') ]), - _Utils_ap( - $author$project$DungeonMap$mouseDrawEvents(model.addCharacterIcon), - _Utils_eq(model.addCharacterIcon, $author$project$Model$DrawingInactive) ? _List_fromArray( - [ - $elm$svg$Svg$Events$onClick( - $author$project$Model$ShowModal($author$project$Model$ObjectIconModal)) - ]) : _List_Nil)), + $author$project$DungeonMap$mouseDrawEvents(model.addCharacterIcon)), _Utils_ap( _List_fromArray( [ @@ -12833,7 +13290,7 @@ var $author$project$DungeonMap$getCharIcon = function (state) { var charIcon = state.a; return charIcon; } else { - return A5($author$project$Model$ObjectIcon, 0, '', '', '', $elm$core$Maybe$Nothing); + return A6($author$project$Model$ObjectIcon, 0, '', '', '', $elm$core$Maybe$Nothing, 0); } }; var $rundis$elm_bootstrap$Bootstrap$Form$Radio$Inline = {$: 'Inline'}; @@ -12898,7 +13355,6 @@ var $simonh1000$elm_colorpicker$ColorPicker$OnMouseMove = F2( function (a, b) { return {$: 'OnMouseMove', a: a, b: b}; }); -var $elm$svg$Svg$Attributes$class = _VirtualDom_attribute('class'); var $elm$svg$Svg$defs = $elm$svg$Svg$trustedNode('defs'); var $elm$svg$Svg$Attributes$fill = _VirtualDom_attribute('fill'); var $elm$svg$Svg$linearGradient = $elm$svg$Svg$trustedNode('linearGradient'); @@ -14261,7 +14717,119 @@ var $rundis$elm_bootstrap$Bootstrap$Grid$row = F2( $rundis$elm_bootstrap$Bootstrap$Grid$Internal$rowAttributes(options), A2($elm$core$List$map, $rundis$elm_bootstrap$Bootstrap$Grid$renderCol, cols)); }); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Rows = function (a) { + return {$: 'Rows', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$rows = function (rows_) { + return $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Rows(rows_); +}; var $elm$html$Html$section = _VirtualDom_node('section'); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Textarea = function (a) { + return {$: 'Textarea', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$create = function (options) { + return $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Textarea( + {options: options}); +}; +var $elm$html$Html$textarea = _VirtualDom_node('textarea'); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$applyModifier = F2( + function (modifier, options) { + switch (modifier.$) { + case 'Id': + var id_ = modifier.a; + return _Utils_update( + options, + { + id: $elm$core$Maybe$Just(id_) + }); + case 'Rows': + var rows_ = modifier.a; + return _Utils_update( + options, + { + rows: $elm$core$Maybe$Just(rows_) + }); + case 'Disabled': + return _Utils_update( + options, + {disabled: true}); + case 'Value': + var value_ = modifier.a; + return _Utils_update( + options, + { + value: $elm$core$Maybe$Just(value_) + }); + case 'OnInput': + var onInput_ = modifier.a; + return _Utils_update( + options, + { + onInput: $elm$core$Maybe$Just(onInput_) + }); + case 'Validation': + var validation = modifier.a; + return _Utils_update( + options, + { + validation: $elm$core$Maybe$Just(validation) + }); + default: + var attrs_ = modifier.a; + return _Utils_update( + options, + { + attributes: _Utils_ap(options.attributes, attrs_) + }); + } + }); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$defaultOptions = {attributes: _List_Nil, disabled: false, id: $elm$core$Maybe$Nothing, onInput: $elm$core$Maybe$Nothing, rows: $elm$core$Maybe$Nothing, validation: $elm$core$Maybe$Nothing, value: $elm$core$Maybe$Nothing}; +var $elm$html$Html$Attributes$rows = function (n) { + return A2( + _VirtualDom_attribute, + 'rows', + $elm$core$String$fromInt(n)); +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$validationAttribute = function (validation) { + return $elm$html$Html$Attributes$class( + $rundis$elm_bootstrap$Bootstrap$Form$FormInternal$validationToString(validation)); +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$toAttributes = function (modifiers) { + var options = A3($elm$core$List$foldl, $rundis$elm_bootstrap$Bootstrap$Form$Textarea$applyModifier, $rundis$elm_bootstrap$Bootstrap$Form$Textarea$defaultOptions, modifiers); + return _Utils_ap( + _List_fromArray( + [ + $elm$html$Html$Attributes$class('form-control'), + $elm$html$Html$Attributes$disabled(options.disabled) + ]), + _Utils_ap( + A2( + $elm$core$List$filterMap, + $elm$core$Basics$identity, + _List_fromArray( + [ + A2($elm$core$Maybe$map, $elm$html$Html$Attributes$id, options.id), + A2($elm$core$Maybe$map, $elm$html$Html$Attributes$rows, options.rows), + A2($elm$core$Maybe$map, $elm$html$Html$Attributes$value, options.value), + A2($elm$core$Maybe$map, $elm$html$Html$Events$onInput, options.onInput), + A2($elm$core$Maybe$map, $rundis$elm_bootstrap$Bootstrap$Form$Textarea$validationAttribute, options.validation) + ])), + options.attributes)); +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$view = function (_v0) { + var options = _v0.a.options; + return A2( + $elm$html$Html$textarea, + $rundis$elm_bootstrap$Bootstrap$Form$Textarea$toAttributes(options), + _List_Nil); +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$textarea = A2($elm$core$Basics$composeL, $rundis$elm_bootstrap$Bootstrap$Form$Textarea$view, $rundis$elm_bootstrap$Bootstrap$Form$Textarea$create); +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Value = function (a) { + return {$: 'Value', a: a}; +}; +var $rundis$elm_bootstrap$Bootstrap$Form$Textarea$value = function (value_) { + return $rundis$elm_bootstrap$Bootstrap$Form$Textarea$Value(value_); +}; var $rundis$elm_bootstrap$Bootstrap$Grid$Internal$Col4 = {$: 'Col4'}; var $rundis$elm_bootstrap$Bootstrap$Grid$Internal$ColWidth = function (a) { return {$: 'ColWidth', a: a}; @@ -14299,6 +14867,14 @@ var $author$project$DungeonMap$dungeonMapView = function (model) { _List_Nil, _List_fromArray( [ + $rundis$elm_bootstrap$Bootstrap$Form$Textarea$textarea( + _List_fromArray( + [ + $rundis$elm_bootstrap$Bootstrap$Form$Textarea$rows(1), + $rundis$elm_bootstrap$Bootstrap$Form$Textarea$disabled, + $rundis$elm_bootstrap$Bootstrap$Form$Textarea$value(model.activeTooltip) + ])), + A2($elm$html$Html$br, _List_Nil, _List_Nil), $author$project$DungeonMap$dungeonMap_Svg(model) ])), A2( diff --git a/src/DungeonMap.elm b/src/DungeonMap.elm index 2131be07dd7c325961ba6e3c7630a1978c2d5091..29f952e8ada1ce864dc3065d2d96499b6600501f 100644 --- a/src/DungeonMap.elm +++ b/src/DungeonMap.elm @@ -16,6 +16,7 @@ import Bootstrap.Button as Button import Bootstrap.Modal as Modal import Bootstrap.Form.Input as Input import Bootstrap.Form.Radio as Radio +import Bootstrap.Form.Textarea as Textarea import Array exposing (Array) import File import ColorPicker @@ -30,7 +31,13 @@ dungeonMapView model = [ div [ class "section" ] [ Grid.row [] [ Grid.col [] - [ dungeonMap_Svg model + [ Textarea.textarea + [ Textarea.rows 1 + , Textarea.disabled + , Textarea.value model.activeTooltip + ] + , Html.br [] [] + , dungeonMap_Svg model ] , Grid.col [ Col.xs4 ] [ dungeonMap_MonsterList model @@ -44,7 +51,7 @@ dungeonMapView model = dungeonMap_MonsterList : Model -> Html Msg dungeonMap_MonsterList model = div [ class "container" ] - [ Table.table { options = [ Table.striped, Table.hover, Table.bordered, Table.responsive ] + [ Table.table { options = [ Table.hover, Table.bordered, Table.responsive ] , thead = Table.simpleThead [ Table.th [] [ Html.text "ID" ] , Table.th [] [ Html.text "Name" ] @@ -52,24 +59,26 @@ dungeonMap_MonsterList model = ] , tbody = Table.tbody [] - <| characters2rows model.enemy + <| characters2rows model.enemy model.highlightedTableRow } ] -characters2rows : Array.Array Character -> List (Table.Row Msg) -characters2rows chars = +characters2rows : Array.Array Character -> Int -> List (Table.Row Msg) +characters2rows chars highlighted = List.indexedMap (\i c -> case c of Enemy name health _ _ _ -> - Table.tr [ Table.rowAttr (stopBubbling (AddCharacterIcon (MouseDraw (MonsterIcon (i+1) "-100" "-100")))) ] + Table.tr ([ Table.rowAttr (stopBubbling (AddCharacterIcon (MouseDraw (MonsterIcon (i+1) "-100" "-100" name)))) ] + ++ if highlighted==i+1 then [ Table.rowSecondary ] else []) [ Table.td [] [Html.text <| String.fromInt (i+1)] , Table.td [] [Html.text name] , Table.td [] [Html.text <| String.fromInt health] ] Hero name health -> - Table.tr [ Table.rowAttr (stopBubbling (AddCharacterIcon (MouseDraw (PlayerIcon (i+1) "-100" "-100")))) ] + Table.tr ([ Table.rowAttr (stopBubbling (AddCharacterIcon (MouseDraw (PlayerIcon (i+1) "-100" "-100" name)))) ] + ++ if highlighted==i+1 then [ Table.rowSecondary ] else []) [ Table.td [] [Html.text <| String.fromInt (i+1)] , Table.td [] [Html.text name] , Table.td [] [Html.text <| String.fromInt health] @@ -93,10 +102,6 @@ dungeonMap_Svg model = [ Svg.svg ([ SvgAtt.width "100%", SvgAtt.viewBox "0 0 800 600", SvgAtt.version "1.1" ] ++ mouseDrawEvents model.addCharacterIcon - ++ if model.addCharacterIcon==DrawingInactive - then [ Svg.Events.onClick (ShowModal ObjectIconModal) - ] - else [] ) ([ Svg.image [ SvgAtt.width "800", SvgAtt.height "600", SvgAtt.title "DungeonMap", SvgAtt.xlinkHref (Maybe.withDefault "" (List.head model.previews)) ] [] ] ++ svgIconList model @@ -152,7 +157,7 @@ getCharIcon state = DrawIcon charIcon -> charIcon - _ -> ObjectIcon 0 "" "" "" Nothing + _ -> ObjectIcon 0 "" "" "" Nothing 0 stopBubbling : msg -> Svg.Attribute msg stopBubbling msg = @@ -162,28 +167,99 @@ stopBubbling msg = svgIconList : Model -> List (Svg.Svg Msg) svgIconList model = - List.foldl (++) [] (List.map getAreaParam (model.characterList ++ model.objectIconList)) + List.foldl (++) [] (List.map placeIcon (model.characterList ++ model.objectIconList)) -getAreaParam : CharacterIcon -> List (Svg.Svg Msg) -getAreaParam s = +placeIcon : CharacterIcon -> List (Svg.Svg Msg) +placeIcon s = let - xCor = Maybe.withDefault "0" (List.head (String.split "," (getCoord s))) - yCor = Maybe.withDefault "0" (List.head (List.drop 1 (String.split "," (getCoord s)))) + x = Maybe.withDefault "0" (List.head (String.split "," (getCoord s))) + y = Maybe.withDefault "0" (List.head (List.drop 1 (String.split "," (getCoord s)))) id = getID s - objectText = getObjectText s --Text of an ObjectIcon, for other Icons empty - color = getColor s --Color of a custom ObjectIcon, for others Nothing + text = getObjectText s --Text of an ObjectIcon, for other Icons empty + color = getColor s --Color of a custom ObjectIcon, for others Nothing + iconType = getIconType s + typeID = getTypeID s in - placeIcon (getIconType s) id xCor yCor color + case iconType of + "monster" -> + [ Svg.text_ [ SvgAtt.textAnchor "middle" + , SvgAtt.x (String.fromFloat (Maybe.withDefault 0 (String.toFloat x) - 3)) + , SvgAtt.y (String.fromFloat (Maybe.withDefault 0 (String.toFloat y) - 0.5)) + , SvgAtt.dominantBaseline "middle" + ] + [ Svg.text (String.fromInt id) ] + , Svg.image + [ SvgAtt.style "width:30px;height:30px;" + , SvgAtt.x (String.fromFloat (Maybe.withDefault 0 (String.toFloat x) - 17.5)) + , SvgAtt.y (String.fromFloat (Maybe.withDefault 0 (String.toFloat y) - 17.5)) + , SvgAtt.xlinkHref ("res/icons/enemy.png") + , SvgAtt.class "MonsterIcon" + , Svg.Events.onMouseOver (HighlightTableRow id text) + , Svg.Events.onMouseOut (HighlightTableRow 0 "Beschreibung") + , Svg.Events.onClick (DeleteIcon iconType id) + ] [] + ] + + "player" -> + [ Svg.text_ [ SvgAtt.textAnchor "middle" + , SvgAtt.x (String.fromFloat (Maybe.withDefault 0 (String.toFloat x) + 1)) + , SvgAtt.y (String.fromFloat (Maybe.withDefault 0 (String.toFloat y) + 2.5)) + , SvgAtt.dominantBaseline "middle" + ] + [ Svg.text (String.fromInt id) ] + , Svg.image + [ SvgAtt.style "width:25px;height:25px;" + , 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 ("res/icons/hero.png") + , SvgAtt.class "PlayerIcon" + , Svg.Events.onMouseOver (HighlightTableRow id text) + , Svg.Events.onMouseOut (HighlightTableRow 0 "Beschreibung") + , Svg.Events.onClick (DeleteIcon iconType id) + ] [] + ] + + "object" -> + case getIconPath typeID of + "custom" -> [ Svg.circle + [ SvgAtt.id (String.fromInt id) + , SvgAtt.cx x + , SvgAtt.cy y + , SvgAtt.r "10" + , SvgAtt.style (buildCustomObjectIconStyle color) + , Svg.Events.onMouseOver (ToolTipMsg text) + , Svg.Events.onMouseOut (ToolTipMsg "Beschreibung") + , SvgAtt.class "ObjectIcon" + , Svg.Events.onClick (DeleteIcon iconType id) + ] + [] + ] + + + _ -> [ Svg.image + [ SvgAtt.style "width:25px;height:25px;" + , 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 "Beschreibung") + , SvgAtt.class "ObjectIcon" + , Svg.Events.onClick (DeleteIcon iconType id) + ] [] + ] + + _ -> + [] getColor object = case object of - MonsterIcon i x y -> + MonsterIcon i x y n -> Nothing - PlayerIcon i x y -> + PlayerIcon i x y n -> Nothing - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> c getIconPath : Int -> String @@ -196,46 +272,53 @@ getIconPath id = getIconType object = case object of - MonsterIcon i x y -> + MonsterIcon i x y n -> "monster" - PlayerIcon i x y -> + PlayerIcon i x y n -> "player" - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> "object" getCoord object = case object of - MonsterIcon i x y -> + MonsterIcon i x y n -> x ++ "," ++ y - PlayerIcon i x y -> + PlayerIcon i x y n -> x ++ "," ++ y - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> x ++ "," ++ y getID object = case object of - MonsterIcon i x y -> + MonsterIcon i x y n -> i - PlayerIcon i x y -> + PlayerIcon i x y n -> i - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> + ident + +getTypeID object = + case object of + ObjectIcon i x y t c ident -> i + _ -> + 0 + getObjectText object = case object of - MonsterIcon i x y -> - "" + MonsterIcon i x y name -> + name - PlayerIcon i x y -> - "" - - ObjectIcon i x y t c -> + PlayerIcon i x y name -> + name + ObjectIcon i x y t c ident -> t @@ -311,23 +394,23 @@ mouseDrawEvents addCharacterIcon = case addCharacterIcon of DrawIcon characterIcon -> case characterIcon of - PlayerIcon i x y -> + PlayerIcon i x y n -> [ Svg.Events.onClick (AddCharacterIcon (MouseClick characterIcon)) - , onMouseMove (positionToCircleCenter i) + , onMouseMove (positionToIconCenter "player" n i) ] - MonsterIcon i x y -> + MonsterIcon i x y n -> [ Svg.Events.onClick (AddCharacterIcon (MouseClick characterIcon)) - , onMouseMove (positionToRectangleCorner i) + , onMouseMove (positionToIconCenter "monster" n i) ] - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> [ Svg.Events.onClick (ShowModal ObjectIconModal) - , onMouseMove (positionToIconCenter i) + , onMouseMove (positionToIconCenter "object" "" i) ] DrawingInactive -> - [ onMouseMove (positionToIconCenter 0) + [ onMouseMove (positionToIconCenter "object" "" 0) ] @@ -342,29 +425,31 @@ mousePosition = (Json.Decode.at [ "detail", "x" ] Json.Decode.float) (Json.Decode.at [ "detail", "y" ] Json.Decode.float) -positionToCircleCenter : Int -> MousePosition -> Msg -positionToCircleCenter i position = - AddCharacterIcon (MouseDraw (PlayerIcon i (String.fromFloat position.x) (String.fromFloat position.y))) +positionToIconCenter : String -> String -> Int -> MousePosition -> Msg +positionToIconCenter icon name i position = + case icon of + "player" -> + AddCharacterIcon (MouseDraw (PlayerIcon i (String.fromFloat position.x) (String.fromFloat position.y) name)) + "monster" -> + AddCharacterIcon (MouseDraw (MonsterIcon i (String.fromFloat position.x) (String.fromFloat position.y) name)) -positionToRectangleCorner : Int -> MousePosition -> Msg -positionToRectangleCorner i position = - AddCharacterIcon (MouseDraw (MonsterIcon i (String.fromFloat position.x) (String.fromFloat position.y))) + "object" -> + AddCharacterIcon (MouseDraw (ObjectIcon i (String.fromFloat position.x) (String.fromFloat position.y) "" Nothing 0 )) -positionToIconCenter : Int -> MousePosition -> Msg -positionToIconCenter i position = - AddCharacterIcon (MouseDraw (ObjectIcon i (String.fromFloat position.x) (String.fromFloat position.y) "" Nothing )) + _ -> + DoNothing newIconsView : AddCharacterIconState -> List (Svg.Svg Msg) newIconsView addCharacterIcon = case addCharacterIcon of DrawIcon characterIcon -> case characterIcon of - ObjectIcon i x y t c -> + ObjectIcon i x y t c ident -> [] - PlayerIcon i x y -> - (placeIcon "player" i x y Nothing) + PlayerIcon i x y n -> + (placeIcon characterIcon) ++ [ Svg.rect [ SvgAtt.width "800" , SvgAtt.height "600" @@ -375,8 +460,8 @@ newIconsView addCharacterIcon = [] ] - MonsterIcon i x y -> - (placeIcon "monster" i x y Nothing) + MonsterIcon i x y n -> + (placeIcon characterIcon) ++ [ Svg.rect [ SvgAtt.width "800" , SvgAtt.height "600" diff --git a/src/Main.elm b/src/Main.elm index 97f512f1fe2e2eae889c8bc5291bc9ea09cd5798..7fb4bf196b18ef0b51e86612e0cb12ec455b7a47 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -103,14 +103,14 @@ update msg model = ChangeIcon id -> case model.addCharacterIcon of - DrawIcon (ObjectIcon i x y t c) -> + DrawIcon (ObjectIcon i x y t c ident) -> case id of - 3 -> ( { model | addCharacterIcon = DrawIcon (ObjectIcon id x y t c) + 3 -> ( { model | addCharacterIcon = DrawIcon (ObjectIcon id x y t c ident) , radioCheckedID = id } , Cmd.none ) - _ -> ( { model | addCharacterIcon = DrawIcon (ObjectIcon id x y t Nothing) + _ -> ( { model | addCharacterIcon = DrawIcon (ObjectIcon id x y t Nothing ident) , radioCheckedID = id } , Cmd.none ) @@ -148,18 +148,18 @@ update msg model = case addCharacterIconMsg of MouseClick characterIcon -> case characterIcon of - PlayerIcon i x y -> + PlayerIcon i x y n -> if List.length model.characterList == List.length (List.filter (isNotId i) model.characterList) --wenn character mit ID noch nicht in Liste then ( { model | characterList = model.characterList ++ [ characterIcon ], addCharacterIcon = DrawingInactive }, Cmd.none ) else ( { model | addCharacterIcon = DrawingInactive }, Cmd.none ) - MonsterIcon i x y -> + MonsterIcon i x y n -> if List.length model.characterList == List.length (List.filter (isNotId i) model.characterList) --wenn character mit ID noch nicht in Liste then ( { model | characterList = model.characterList ++ [ characterIcon ], addCharacterIcon = DrawingInactive }, Cmd.none ) else ( { model | addCharacterIcon = DrawingInactive }, Cmd.none ) - ObjectIcon i x y t c -> - ( { model | objectIconList = model.objectIconList ++ [ ObjectIcon i x y model.iconText (Just model.colour) ] + ObjectIcon i x y t c ident -> + ( { model | objectIconList = (generateObjectIdents (model.objectIconList ++ [ ObjectIcon i x y model.iconText (Just model.colour) ident ])) , addCharacterIcon = DrawingInactive , showObjectIconModal = Modal.hidden , iconText = "" @@ -168,18 +168,18 @@ update msg model = MouseDraw characterIcon -> case characterIcon of - PlayerIcon i x y -> + PlayerIcon i x y name -> if List.length model.characterList > List.length (List.filter (isNotId i) model.characterList) --wenn character mit ID bereits in Liste then ( { model | characterList = List.filter (isNotId i) model.characterList, addCharacterIcon = DrawingInactive }, Cmd.none ) - else ( { model | addCharacterIcon = DrawIcon (PlayerIcon i x y) }, Cmd.none ) + else ( { model | addCharacterIcon = DrawIcon (PlayerIcon i x y name) }, Cmd.none ) - MonsterIcon i x y -> + MonsterIcon i x y name -> if List.length model.characterList > List.length (List.filter (isNotId i) model.characterList) --wenn character mit ID bereits in Liste then ( { model | characterList = List.filter (isNotId i) model.characterList, addCharacterIcon = DrawingInactive }, Cmd.none ) - else ( { model | addCharacterIcon = DrawIcon (MonsterIcon i x y) }, Cmd.none ) + else ( { model | addCharacterIcon = DrawIcon (MonsterIcon i x y name) }, Cmd.none ) - ObjectIcon i x y t c -> - ( { model | addCharacterIcon = DrawIcon (ObjectIcon i x y t c) }, Cmd.none ) + ObjectIcon i x y t c ident -> + ( { model | addCharacterIcon = DrawIcon (ObjectIcon i x y t c ident) }, Cmd.none ) --( { model | addCharacterIcon = DrawIcon s, characterList = (giveDungeonMap_CharacterIds model.characterList) }, Cmd.none ) @@ -214,7 +214,9 @@ update msg model = ( { model | showCustomEnemy = Modal.shown } , Cmd.none ) ObjectIconModal -> - ( { model | showObjectIconModal = Modal.shown } , Cmd.none ) + ( { model | showObjectIconModal = if model.mouseInIcon then Modal.hidden else Modal.shown + , mouseInIcon = False } + , Cmd.none ) ShowAttackModal id-> ( { model | showAttackModal = Modal.shown , characterId = id} , Cmd.none ) @@ -251,17 +253,52 @@ update msg model = ColorPickerMsg cpMsg -> case model.addCharacterIcon of - DrawIcon (ObjectIcon i x y t c) -> let - ( m, colour ) = ColorPicker.update cpMsg model.colour model.colorPicker - in - ( { model | colorPicker = m - , colour = colour |> Maybe.withDefault model.colour - } - , Cmd.none - ) + DrawIcon (ObjectIcon i x y t c ident) -> let + ( m, colour ) = ColorPicker.update cpMsg model.colour model.colorPicker + in + ( { model | colorPicker = m + , colour = colour |> Maybe.withDefault model.colour + } + , Cmd.none + ) _ -> ( model, Cmd.none ) + ToolTipMsg tooltip -> + case tooltip of + "" -> ( { model | activeTooltip = "Beschreibung" + , mouseInIcon = (if tooltip=="Beschreibung" then False else True) } + , Cmd.none + ) + + _ -> ( { model | activeTooltip = tooltip + , mouseInIcon = (if tooltip=="Beschreibung" then False else True) } + , Cmd.none + ) + + HighlightTableRow id name -> + ( { model | highlightedTableRow = id + , activeTooltip = name + , mouseInIcon = (if id==0 then False else True) } + , Cmd.none + ) + + DeleteIcon iconType id -> + case iconType of + "object" -> + ( { model | objectIconList = List.filter (isNotId id) model.objectIconList + , activeTooltip = "Beschreibung" } + , Cmd.none + ) + + + _ -> + ( { model | characterList = List.filter (isNotId id) model.characterList + , highlightedTableRow = 0 + , activeTooltip = "Beschreibung" } + , Cmd.none + ) + view : Model -> Html Msg view model = div [Html.Attributes.class "wrapper textFont", Html.Attributes.style "height" "100%"] @@ -315,18 +352,30 @@ giveDungeonMap_CharacterIds charList = putIdInCharIcon : Int -> CharacterIcon -> CharacterIcon putIdInCharIcon id charIcon = case charIcon of - PlayerIcon _ x y -> PlayerIcon (id+1) x y - MonsterIcon _ x y -> MonsterIcon (id+1) x y - ObjectIcon _ x y t c -> ObjectIcon (id+1) x y t c + PlayerIcon _ x y n -> PlayerIcon (id+1) x y n + MonsterIcon _ x y n -> MonsterIcon (id+1) x y n + ObjectIcon _ x y t c ident -> ObjectIcon (id+1) x y t c ident isNotId : Int -> CharacterIcon -> Bool isNotId id s = case s of - MonsterIcon i _ _ -> + MonsterIcon i _ _ _ -> id/=i - PlayerIcon i _ _ -> + PlayerIcon i _ _ _ -> id/=i - ObjectIcon i _ _ _ _-> - id/=i + ObjectIcon _ _ _ _ _ ident -> + id/=ident + +generateObjectIdents : List CharacterIcon -> List CharacterIcon +generateObjectIdents 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 + ) list diff --git a/src/Model.elm b/src/Model.elm index 0e2d5e73af1dda53ccf4615cc6ca0ff7e6583330..9a435f8184341e06804052e6359fd7f1ca6673dd 100644 --- a/src/Model.elm +++ b/src/Model.elm @@ -5,6 +5,7 @@ module Model exposing (..) import Bootstrap.Tab as Tab import Bootstrap.Dropdown as Dropdown import Bootstrap.Modal as Modal +import Bootstrap.Form.Textarea as Textarea import Http import Array import Array.Extra as Array @@ -41,6 +42,9 @@ type alias Model = , colorPicker : ColorPicker.State , colour : Color.Color , radioCheckedID : Int + , activeTooltip : String + , highlightedTableRow : Int + , mouseInIcon : Bool } init : () -> (Model, Cmd Msg) @@ -74,6 +78,9 @@ init _ = , colorPicker = ColorPicker.empty , colour = Color.rgb 255 0 0 , radioCheckedID = 0 + , activeTooltip = "Tooltip" + , highlightedTableRow = 0 + , mouseInIcon = False } , Cmd.none ) @@ -115,6 +122,9 @@ type Msg | ChangeIconText String | ChangeIcon Int | ColorPickerMsg ColorPicker.Msg + | ToolTipMsg String + | HighlightTableRow Int String + | DeleteIcon String Int type ModalType = AttackModal @@ -143,10 +153,11 @@ type AddCharacterIconMsg | MouseClick CharacterIcon type CharacterIcon - = PlayerIcon Int String String - | MonsterIcon Int String String - | ObjectIcon Int String String String (Maybe Color.Color) - -- type-ID x-coord y-coord Text custom-color + = PlayerIcon Int String String String + | MonsterIcon Int String String String + -- ID x-coord y-coord name + | ObjectIcon Int String String String (Maybe Color.Color) Int + -- type-ID x-coord y-coord Text custom-color ident -- ID in ObjectIcon type is not an identifier for a concrete ObjectIcon, its an identifier for the used png type alias MousePosition =