diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt index c8499669f9..54adba5893 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -70,6 +70,7 @@ import de.westnordost.streetcomplete.quests.charging_station_bicycles.AddChargin import de.westnordost.streetcomplete.quests.charging_station_capacity.AddChargingStationBicycleCapacity import de.westnordost.streetcomplete.quests.charging_station_capacity.AddChargingStationCapacity import de.westnordost.streetcomplete.quests.charging_station_operator.AddChargingStationOperator +import de.westnordost.streetcomplete.quests.charging_station_socket.AddChargingStationSocket import de.westnordost.streetcomplete.quests.clothing_bin_operator.AddClothingBinOperator import de.westnordost.streetcomplete.quests.construction.MarkCompletedBuildingConstruction import de.westnordost.streetcomplete.quests.construction.MarkCompletedHighwayConstruction @@ -434,6 +435,7 @@ fun questTypeRegistry( 87 to AddChargingStationCapacity(), // after question for bicycles because user has possibility to answer that it is only for bicycles 179 to AddChargingStationBicycleCapacity(), 88 to AddChargingStationOperator(), + 198 to AddChargingStationSocket(), // postboxes (collection times are further up, see comment) 89 to AddPostboxRoyalCypher(), // can be glanced across the road (if postbox facing the right way) diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocket.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocket.kt new file mode 100644 index 0000000000..9c5dc9d129 --- /dev/null +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocket.kt @@ -0,0 +1,136 @@ +package de.westnordost.streetcomplete.quests.charging_station_socket + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression +import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Way +import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType +import de.westnordost.streetcomplete.data.quest.AndroidQuest +import de.westnordost.streetcomplete.data.quest.NoCountriesExcept +import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.CAR +import de.westnordost.streetcomplete.osm.Tags +import de.westnordost.streetcomplete.resources.Res +import de.westnordost.streetcomplete.resources.quest_charging_station_socket_title +import de.westnordost.streetcomplete.util.math.contains + +class AddChargingStationSocket : + OsmElementQuestType>, + AndroidQuest { + + private val filter by lazy { + """ + nodes, ways with + amenity = charging_station + and bicycle != yes + and motorcar != no + """.toElementFilterExpression() + } + + override val enabledInCountries = NoCountriesExcept( + "AT","BE","BG","HR","CY","CZ","DE","DK","EE","ES","FI","FR","GB", + "GR","HU","IE","IS","IT","LI","LT","LU","LV","MT","NL","NO", + "PL","PT","RO","SE","SI","SK" + ) + + override val changesetComment = "Specify charging station sockets" + override val wikiLink = "Key:socket" + override val icon = R.drawable.quest_charger_socket + override val achievements = listOf(CAR) + + override val title = Res.string.quest_charging_station_socket_title + + override fun createForm() = AddChargingStationSocketForm() + + override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable { + return mapData + .filter { element -> filter.matches(element) } + .filter { element -> isApplicableTo(element, mapData) } + .asIterable() + } + + override fun isApplicableTo(element: Element): Boolean? { + // This variant must exist because OsmElementQuestType requires it. + // But we delegate real logic to the overloaded version. + return null + } + + private fun isApplicableTo( + element: Element, + mapData: MapDataWithGeometry + ): Boolean { + + if (!filter.matches(element)) return false + + // Skip charge_point nodes completely + if (element.tags["man_made"] == "charge_point") return false + + // Skip charging_station areas that contain charge_points + if (element is Way) { + + val geometry = mapData.getGeometry(element.type, element.id) + ?: return true + + val bounds = geometry.bounds + + val hasChargePointsInside = mapData + .filter { it.tags["man_made"] == "charge_point" } + .any { cp -> + val cpGeometry = mapData.getGeometry(cp.type, cp.id) + ?: return@any false + + bounds.contains(cpGeometry.center) + } + + if (hasChargePointsInside) return false + } + + val socketTags = element.tags + .filterKeys { it.startsWith("socket:") } + + if (socketTags.isEmpty()) return true + if (socketTags.keys.any { isDeprecatedSocketKey(it) }) return true + if (socketTags.values.any { it == "yes" }) return true + + return false + } + + override fun applyAnswerTo( + answer: Map, + tags: Tags, + geometry: ElementGeometry, + timestampEdited: Long + ) { + + // Cleanup deprecated keys + tags.keys + .filter { isDeprecatedSocketKey(it) } + .toList() + .forEach { tags.remove(it) } + + // Remove old socket:* keys + tags.keys + .filter { it.startsWith("socket:") } + .toList() + .forEach { tags.remove(it) } + + // Apply new values + answer.forEach { (type, count) -> + tags["socket:${type.osmKey}"] = count.toString() + } + + // type2/type2_cable=no logic + if (answer.containsKey(SocketType.TYPE2) + && !answer.containsKey(SocketType.TYPE2_CABLE) + ) { + tags["socket:type2_cable"] = "no" + } + } + + private fun isDeprecatedSocketKey(key: String): Boolean = + key.startsWith("socket:tesla") || + key == "socket:css" || + key == "socket:unknown" || + key == "socket:type" +} diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocketForm.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocketForm.kt new file mode 100644 index 0000000000..0922f1f8b9 --- /dev/null +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/AddChargingStationSocketForm.kt @@ -0,0 +1,64 @@ +package de.westnordost.streetcomplete.quests.charging_station_socket + +import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AlertDialog +import androidx.compose.material.Surface +import androidx.compose.runtime.mutableStateMapOf +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.databinding.ComposeViewBinding +import de.westnordost.streetcomplete.quests.AbstractOsmQuestForm +import de.westnordost.streetcomplete.ui.util.content + +class AddChargingStationSocketForm : + AbstractOsmQuestForm>() { + + override val contentLayoutResId = R.layout.compose_view + private val binding by contentViewBinding(ComposeViewBinding::bind) + + private val counts = mutableStateMapOf() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.composeViewBase.content { + Surface { + SocketTypeAndCountForm( + counts = counts, + onCountsChanged = { + counts.clear() + counts.putAll(it) + checkIsFormComplete() + } + ) + } + } + } + + override fun onClickOk() { + if (counts.values.any { it !in 1..50 }) { + confirmUnusualInput() + } else { + applyAnswer(counts.toMap()) + } + } + + private fun confirmUnusualInput() { + activity?.let { + AlertDialog.Builder(it) + .setTitle(R.string.quest_generic_confirmation_title) + .setMessage(R.string.quest_charging_station_socket_unusualInput_confirmation_description) + .setPositiveButton(R.string.quest_generic_confirmation_yes) { _, _ -> + applyAnswer(counts.toMap()) + } + .setNegativeButton(R.string.quest_generic_confirmation_no, null) + .show() + } + } + + override fun isFormComplete() = + counts.isNotEmpty() + + override fun isRejectingClose() = + counts.isNotEmpty() +} diff --git a/app/src/androidMain/res/drawable/quest_charger_socket.xml b/app/src/androidMain/res/drawable/quest_charger_socket.xml new file mode 100644 index 0000000000..e0ca2b17cf --- /dev/null +++ b/app/src/androidMain/res/drawable/quest_charger_socket.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/app/src/androidMain/res/values/strings.xml b/app/src/androidMain/res/values/strings.xml index ae6c346405..994dbe3ba1 100644 --- a/app/src/androidMain/res/values/strings.xml +++ b/app/src/androidMain/res/values/strings.xml @@ -1066,6 +1066,14 @@ A level counts as a roof level when its windows are in the roof. Subsequently, r Who is the operator of this charging station? + How many sockets does this charging station have? + Type 2 (Mennekes) + Type 2 (Mennekes) Cable + Type 2 Combo (CCS) + CHAdeMO + Household-plug + This number looks implausible. Are you sure that it is correct? + Who accepts donations for this clothing bin? Is this building completed? diff --git a/app/src/commonMain/composeResources/drawable/socket_chademo.xml b/app/src/commonMain/composeResources/drawable/socket_chademo.xml new file mode 100644 index 0000000000..f01a0c06e2 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_chademo.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_domestic.xml b/app/src/commonMain/composeResources/drawable/socket_domestic.xml new file mode 100644 index 0000000000..d3c09bf9d1 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_domestic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_c_black.xml b/app/src/commonMain/composeResources/drawable/socket_eu_c_black.xml new file mode 100644 index 0000000000..5ccaf18e6c --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_c_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_c_white.xml b/app/src/commonMain/composeResources/drawable/socket_eu_c_white.xml new file mode 100644 index 0000000000..41bce7b22b --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_c_white.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_chademo.xml b/app/src/commonMain/composeResources/drawable/socket_eu_chademo.xml new file mode 100644 index 0000000000..3812e59e4b --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_chademo.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_domestic.xml b/app/src/commonMain/composeResources/drawable/socket_eu_domestic.xml new file mode 100644 index 0000000000..3812e59e4b --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_domestic.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_k_black.xml b/app/src/commonMain/composeResources/drawable/socket_eu_k_black.xml new file mode 100644 index 0000000000..27402117de --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_k_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_l_black.xml b/app/src/commonMain/composeResources/drawable/socket_eu_l_black.xml new file mode 100644 index 0000000000..eca23eec4f --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_l_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_m_black.xml b/app/src/commonMain/composeResources/drawable/socket_eu_m_black.xml new file mode 100644 index 0000000000..3364848e03 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_m_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_n_black.xml b/app/src/commonMain/composeResources/drawable/socket_eu_n_black.xml new file mode 100644 index 0000000000..0bb074ccf4 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_n_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_type2.xml b/app/src/commonMain/composeResources/drawable/socket_eu_type2.xml new file mode 100644 index 0000000000..723f27cce3 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_type2.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_eu_type2_combo.xml b/app/src/commonMain/composeResources/drawable/socket_eu_type2_combo.xml new file mode 100644 index 0000000000..3e8584fd92 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_eu_type2_combo.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_type2.xml b/app/src/commonMain/composeResources/drawable/socket_type2.xml new file mode 100644 index 0000000000..55783472c7 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_type2.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_type2_cable.xml b/app/src/commonMain/composeResources/drawable/socket_type2_cable.xml new file mode 100644 index 0000000000..55783472c7 --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_type2_cable.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/app/src/commonMain/composeResources/drawable/socket_type2_combo.xml b/app/src/commonMain/composeResources/drawable/socket_type2_combo.xml new file mode 100644 index 0000000000..92751b01cc --- /dev/null +++ b/app/src/commonMain/composeResources/drawable/socket_type2_combo.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/app/src/commonMain/composeResources/values/strings.xml b/app/src/commonMain/composeResources/values/strings.xml index acdcfe7354..b3d8cd334a 100644 --- a/app/src/commonMain/composeResources/values/strings.xml +++ b/app/src/commonMain/composeResources/values/strings.xml @@ -1068,6 +1068,14 @@ A level counts as a roof level when its windows are in the roof. Subsequently, r Who is the operator of this charging station? + How many sockets does this charging station have? + Type 2 (Mennekes) + Type 2 (Mennekes) Cable + Type 2 Combo (CCS) + CHAdeMO + Household-plug + This number looks implausible. Are you sure that it is correct? + Who accepts donations for this clothing bin? Is this building completed? diff --git a/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketType.kt b/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketType.kt new file mode 100644 index 0000000000..278d68704d --- /dev/null +++ b/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketType.kt @@ -0,0 +1,63 @@ +package de.westnordost.streetcomplete.quests.charging_station_socket + +import de.westnordost.streetcomplete.resources.* +import org.jetbrains.compose.resources.DrawableResource +import org.jetbrains.compose.resources.StringResource + +enum class SocketType(val osmKey: String) { + TYPE2("type2"), + TYPE2_CABLE("type2_cable"), + TYPE2_COMBO("type2_combo"), + CHADEMO("chademo"), + DOMESTIC("domestic"); + + companion object { + val selectableValues = entries + } +} + +/* ---------------------------------------------------------- + Primary socket icon + ---------------------------------------------------------- */ + +val SocketType.icon: DrawableResource + get() = when (this) { + SocketType.TYPE2 -> Res.drawable.socket_type2 + SocketType.TYPE2_CABLE -> Res.drawable.socket_type2_cable + SocketType.TYPE2_COMBO -> Res.drawable.socket_type2_combo + SocketType.CHADEMO -> Res.drawable.socket_chademo + SocketType.DOMESTIC -> Res.drawable.socket_domestic + } + +/* ---------------------------------------------------------- + EU compatibility label (hexagon symbol) + Each socket gets its own EU-label icon. + ---------------------------------------------------------- */ + +val SocketType.euLabels: List + get() = when (this) { + SocketType.TYPE2 -> listOf(Res.drawable.socket_eu_c_white) + SocketType.TYPE2_CABLE -> listOf(Res.drawable.socket_eu_c_black) + SocketType.TYPE2_COMBO -> listOf( + Res.drawable.socket_eu_k_black, + Res.drawable.socket_eu_l_black + ) + SocketType.CHADEMO -> listOf( + Res.drawable.socket_eu_m_black, + Res.drawable.socket_eu_n_black + ) + SocketType.DOMESTIC -> emptyList() + } + +/* ---------------------------------------------------------- + Localized title + ---------------------------------------------------------- */ + +val SocketType.title: StringResource + get() = when (this) { + SocketType.TYPE2 -> Res.string.quest_charging_station_socket_type2 + SocketType.TYPE2_CABLE -> Res.string.quest_charging_station_socket_type2_cable + SocketType.TYPE2_COMBO -> Res.string.quest_charging_station_socket_type2_combo + SocketType.CHADEMO -> Res.string.quest_charging_station_socket_chademo + SocketType.DOMESTIC -> Res.string.quest_charging_station_socket_domestic + } diff --git a/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketTypeAndCountForm.kt b/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketTypeAndCountForm.kt new file mode 100644 index 0000000000..ff8a6fcaec --- /dev/null +++ b/app/src/commonMain/kotlin/de/westnordost/streetcomplete/quests/charging_station_socket/SocketTypeAndCountForm.kt @@ -0,0 +1,145 @@ +package de.westnordost.streetcomplete.quests.charging_station_socket + +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import de.westnordost.streetcomplete.ui.common.StepperButton +import org.jetbrains.compose.resources.painterResource +import org.jetbrains.compose.resources.stringResource +import androidx.compose.material.Icon + +@Composable +fun SocketTypeAndCountForm( + counts: Map, + onCountsChanged: (Map) -> Unit, + modifier: Modifier = Modifier +) { + Column( + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + SocketType.selectableValues.forEach { type -> + + val count = counts[type] ?: 0 + + SocketRow( + type = type, + count = count, + onIncrease = { + val newCount = count + 1 + if (newCount <= 50) { + val newMap = counts.toMutableMap() + newMap[type] = newCount + onCountsChanged(newMap) + } + }, + onDecrease = { + val newMap = counts.toMutableMap() + if (count <= 1) { + newMap.remove(type) + } else { + newMap[type] = count - 1 + } + onCountsChanged(newMap) + } + ) + } + } +} + +@Composable +private fun SocketRow( + type: SocketType, + count: Int, + onIncrease: () -> Unit, + onDecrease: () -> Unit +) { + Surface { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 6.dp), + verticalAlignment = Alignment.CenterVertically + ) { + + // LEFT: SOCKET ICON + EU HEX + LABEL + Row( + modifier = Modifier.weight(1f), + verticalAlignment = Alignment.CenterVertically + ) { + + // Socket icon (bigger) + Icon( + painter = painterResource(type.icon), + contentDescription = null, + modifier = Modifier.size(60.dp), + tint = Color.Unspecified + ) + + Spacer(Modifier.width(4.dp)) + + // EU Hex (smaller) + if (type.euLabels.isNotEmpty()) { + Spacer(Modifier.width(2.dp)) + + Row(horizontalArrangement = Arrangement.spacedBy(1.dp)) { + type.euLabels.forEach { label -> + Icon( + painter = painterResource(label), + contentDescription = null, + modifier = Modifier.size(32.dp), + tint = Color.Unspecified + ) + } + } + } + + Spacer(Modifier.width(12.dp)) + + Text( + text = stringResource(type.title), + style = MaterialTheme.typography.body1 + ) + } + + // RIGHT: COUNT + STEPPER + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + + // Number with Border + Box( + modifier = Modifier + .border( + width = 1.dp, + color = if (count > 0) MaterialTheme.colors.primary else Color.DarkGray, + shape = RoundedCornerShape(6.dp) + ) + .padding(horizontal = 16.dp, vertical = 20.dp), + contentAlignment = Alignment.Center + ) { + Text( + text = count.toString(), + style = MaterialTheme.typography.h6 + ) + } + + StepperButton( + onIncrease = onIncrease, + onDecrease = onDecrease, + increaseEnabled = count < 50, + decreaseEnabled = count > 0 + ) + } + } + } +} diff --git a/app/src/main/res/drawable/socket_eu_c_black.xml b/app/src/main/res/drawable/socket_eu_c_black.xml new file mode 100644 index 0000000000..5ccaf18e6c --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_c_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/socket_eu_c_white.xml b/app/src/main/res/drawable/socket_eu_c_white.xml new file mode 100644 index 0000000000..41bce7b22b --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_c_white.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/socket_eu_k_black.xml b/app/src/main/res/drawable/socket_eu_k_black.xml new file mode 100644 index 0000000000..27402117de --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_k_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/socket_eu_l_black.xml b/app/src/main/res/drawable/socket_eu_l_black.xml new file mode 100644 index 0000000000..eca23eec4f --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_l_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/socket_eu_m_black.xml b/app/src/main/res/drawable/socket_eu_m_black.xml new file mode 100644 index 0000000000..3364848e03 --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_m_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/socket_eu_n_black.xml b/app/src/main/res/drawable/socket_eu_n_black.xml new file mode 100644 index 0000000000..0bb074ccf4 --- /dev/null +++ b/app/src/main/res/drawable/socket_eu_n_black.xml @@ -0,0 +1,12 @@ + + + + diff --git a/res/graphics/charging station socket/chademo.svg b/res/graphics/charging station socket/chademo.svg new file mode 100644 index 0000000000..7e147384c5 --- /dev/null +++ b/res/graphics/charging station socket/chademo.svg @@ -0,0 +1,26 @@ + + + + + + + + M + + + + + N + + + + + + + + + + + + + diff --git a/res/graphics/charging station socket/domestic.svg b/res/graphics/charging station socket/domestic.svg new file mode 100644 index 0000000000..8ee54acadc --- /dev/null +++ b/res/graphics/charging station socket/domestic.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_c_black.svg b/res/graphics/charging station socket/socket_eu_c_black.svg new file mode 100644 index 0000000000..5ca056befb --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_c_black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_c_white.svg b/res/graphics/charging station socket/socket_eu_c_white.svg new file mode 100644 index 0000000000..dfa261c642 --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_c_white.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_k_black.svg b/res/graphics/charging station socket/socket_eu_k_black.svg new file mode 100644 index 0000000000..438118cd19 --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_k_black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_l_black.svg b/res/graphics/charging station socket/socket_eu_l_black.svg new file mode 100644 index 0000000000..48a45c6e2f --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_l_black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_m_black.svg b/res/graphics/charging station socket/socket_eu_m_black.svg new file mode 100644 index 0000000000..c21bbe47e5 --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_m_black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_n_black.svg b/res/graphics/charging station socket/socket_eu_n_black.svg new file mode 100644 index 0000000000..340dac058e --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_n_black.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/res/graphics/charging station socket/socket_eu_type2.svg b/res/graphics/charging station socket/socket_eu_type2.svg new file mode 100644 index 0000000000..5b5eb67ed0 --- /dev/null +++ b/res/graphics/charging station socket/socket_eu_type2.svg @@ -0,0 +1,8 @@ + + + + + + C + + \ No newline at end of file diff --git a/res/graphics/charging station socket/type2.svg b/res/graphics/charging station socket/type2.svg new file mode 100644 index 0000000000..4fab45b0b6 --- /dev/null +++ b/res/graphics/charging station socket/type2.svg @@ -0,0 +1,17 @@ + + + + C + + + + + + + + + + + + + diff --git a/res/graphics/charging station socket/type2_cable.svg b/res/graphics/charging station socket/type2_cable.svg new file mode 100644 index 0000000000..8433fb5a56 --- /dev/null +++ b/res/graphics/charging station socket/type2_cable.svg @@ -0,0 +1,20 @@ + + + + + + + C + + + + + + + + + + + + + diff --git a/res/graphics/charging station socket/type2_combo.svg b/res/graphics/charging station socket/type2_combo.svg new file mode 100644 index 0000000000..7befc6cb4d --- /dev/null +++ b/res/graphics/charging station socket/type2_combo.svg @@ -0,0 +1,29 @@ + + + + + + L + + + + + + K + + + + + + + + + + + + + + + + + diff --git a/res/graphics/quest/charger_socket.svg b/res/graphics/quest/charger_socket.svg new file mode 100644 index 0000000000..17332c8545 --- /dev/null +++ b/res/graphics/quest/charger_socket.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + +