deflock-ify icons

This commit is contained in:
stopflock
2025-08-26 20:52:03 -05:00
parent d56a6e8e7c
commit ebf7f93dd5
5 changed files with 84 additions and 21 deletions
+42
View File
@@ -0,0 +1,42 @@
import 'package:flutter/material.dart';
import '../dev_config.dart';
enum CameraIconType {
real, // Blue ring - real cameras from OSM
mock, // White ring - add camera mock point
pending, // Purple ring - submitted/pending cameras
}
/// Simple camera icon with grey dot and colored ring
class CameraIcon extends StatelessWidget {
final CameraIconType type;
const CameraIcon({super.key, required this.type});
Color get _ringColor {
switch (type) {
case CameraIconType.real:
return kCameraRingColorReal;
case CameraIconType.mock:
return kCameraRingColorMock;
case CameraIconType.pending:
return kCameraRingColorPending;
}
}
@override
Widget build(BuildContext context) {
return Container(
width: kCameraIconDiameter,
height: kCameraIconDiameter,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.black.withOpacity(kCameraDotOpacity),
border: Border.all(
color: _ringColor,
width: kCameraRingThickness,
),
),
);
}
}
+5 -5
View File
@@ -6,6 +6,7 @@ import 'package:latlong2/latlong.dart';
import '../../dev_config.dart';
import '../../models/osm_camera_node.dart';
import '../camera_tag_sheet.dart';
import '../camera_icon.dart';
/// Smart marker widget for camera with single/double tap distinction
class CameraMapMarker extends StatefulWidget {
@@ -52,9 +53,8 @@ class _CameraMapMarkerState extends State<CameraMapMarker> {
return GestureDetector(
onTap: _onTap,
onDoubleTap: _onDoubleTap,
child: Icon(
Icons.videocam,
color: isPending ? Colors.purple : Colors.orange,
child: CameraIcon(
type: isPending ? CameraIconType.pending : CameraIconType.real,
),
);
}
@@ -73,8 +73,8 @@ class CameraMarkersBuilder {
.where(_isValidCameraCoordinate)
.map((n) => Marker(
point: n.coord,
width: 24,
height: 24,
width: kCameraIconDiameter,
height: kCameraIconDiameter,
child: CameraMapMarker(node: n, mapController: mapController),
)),
+18 -9
View File
@@ -33,7 +33,6 @@ class DirectionConesBuilder {
n.coord,
n.directionDeg!,
zoom,
isPending: _isPendingUpload(n),
))
);
@@ -58,9 +57,13 @@ class DirectionConesBuilder {
double bearingDeg,
double zoom, {
bool isPending = false,
bool isSession = false,
}) {
final halfAngle = kDirectionConeHalfAngle;
final length = kDirectionConeBaseLength * math.pow(2, 15 - zoom);
// Number of points to create the arc (more = smoother curve)
const int arcPoints = 12;
LatLng project(double deg) {
final rad = deg * math.pi / 180;
@@ -70,16 +73,22 @@ class DirectionConesBuilder {
return LatLng(origin.latitude + dLat, origin.longitude + dLon);
}
final left = project(bearingDeg - halfAngle);
final right = project(bearingDeg + halfAngle);
// Use purple color for pending uploads
final color = isPending ? Colors.purple : Colors.redAccent;
// Build pizza slice with curved edge
final points = <LatLng>[origin];
// Add arc points from left to right
for (int i = 0; i <= arcPoints; i++) {
final angle = bearingDeg - halfAngle + (i * 2 * halfAngle / arcPoints);
points.add(project(angle));
}
// Close the shape back to origin
points.add(origin);
return Polygon(
points: [origin, left, right, origin],
color: color.withOpacity(0.25),
borderColor: color,
points: points,
color: kDirectionConeColor.withOpacity(0.25),
borderColor: kDirectionConeColor,
borderStrokeWidth: 1,
);
}
+2 -1
View File
@@ -3,6 +3,7 @@ import 'package:flutter_map/flutter_map.dart';
import '../../app_state.dart';
import '../../dev_config.dart';
import '../camera_icon.dart';
import 'layer_selector_button.dart';
/// Widget that renders all map overlay UI elements
@@ -135,7 +136,7 @@ class MapOverlays extends StatelessWidget {
child: Center(
child: Transform.translate(
offset: const Offset(0, kAddPinYOffset),
child: const Icon(Icons.place, size: 40, color: Colors.redAccent),
child: const CameraIcon(type: CameraIconType.mock),
),
),
),