Compare commits

..

4 Commits

Author SHA1 Message Date
stopflock
e2830a189b Merge pull request #11 from stopflock/camera-edits
Everything But Camera Edits
2025-08-17 12:16:42 -05:00
stopflock
d9beeb9d83 Revert "Move tag camera and download buttons to a bar instead of floating"
This reverts commit 6aaddb4fe2.
2025-08-17 12:13:57 -05:00
stopflock
446b70eaff move buttons to fake bottom bar 2025-08-17 11:57:51 -05:00
stopflock
2829730705 add a really dumb script to build apk and ipa locally 2025-08-17 11:57:43 -05:00
4 changed files with 89 additions and 62 deletions

16
do_builds.sh Executable file
View File

@@ -0,0 +1,16 @@
#!/bin/bash
appver=$(cat lib/dev_config.dart | grep "kClientVersion" | cut -d '=' -f 2 | tr -d ';' | tr -d "\'" | tr -d " ")
echo
echo "Building app version ${appver}..."
flutter build ios --no-codesign
flutter build apk
echo
echo "Converting .app to .ipa..."
./app2ipa.sh build/ios/iphoneos/Runner.app
echo
echo "Moving files..."
cp build/app/outputs/flutter-apk/app-release.apk ../flockmap_v${appver}.apk
mv Runner.ipa ../flockmap_v${appver}.ipa
echo
echo "Done."

View File

@@ -10,17 +10,20 @@ const double kTileEstimateKb = 25.0;
const double kDirectionConeHalfAngle = 20.0; // degrees
const double kDirectionConeBaseLength = 0.0012; // multiplier
// Margin (bottom) for positioning the floating bottom button bar
const double kBottomButtonBarMargin = 4.0;
// Map overlay (attribution, scale bar, zoom) vertical offset from bottom edge
const double kAttributionBottomOffset = 110.0;
const double kZoomIndicatorBottomOffset = 142.0;
const double kScaleBarBottomOffset = 170.0;
// Add Camera pin vertical offset (for pin tip to match coordinate on map)
const double kAddPinYOffset = -16.0;
// Bottom overlay vertical positions (distance from bottom of screen)
const double kAttributionBottom = 5.0;
const double kScaleBarBottom = 40.0;
const double kZoomIndicatorBottom = 70.0;
// Client name and version for OSM uploads ("created_by" tag)
const String kClientName = 'FlockMap';
const String kClientVersion = '0.8.1';
const String kClientVersion = '0.8.2';
// Marker/camera interaction
const int kCameraMinZoomLevel = 10; // Minimum zoom to show cameras or warning

View File

@@ -27,12 +27,10 @@ class _HomeScreenState extends State<HomeScreen> {
void _openAddCameraSheet() {
final appState = context.read<AppState>();
appState.startAddSession();
final session = appState.session!; // guaranteed nonnull now
final session = appState.session!; // guaranteed nonnull now
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (ctx) => AddCameraSheet(session: session),
_scaffoldKey.currentState!.showBottomSheet(
(ctx) => AddCameraSheet(session: session),
);
}
@@ -61,55 +59,65 @@ class _HomeScreenState extends State<HomeScreen> {
),
],
),
body: MapView(
controller: _mapController,
followMe: _followMe,
onUserGesture: () {
if (_followMe) setState(() => _followMe = false);
},
),
bottomNavigationBar: BottomAppBar(
elevation: 10,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Expanded(
child: ElevatedButton.icon(
icon: const Icon(Icons.add_location_alt),
label: const Text('Tag Camera'),
onPressed: () {
if (appState.session == null) {
_openAddCameraSheet();
}
},
style: ElevatedButton.styleFrom(
minimumSize: const Size(0, 48),
textStyle: const TextStyle(fontSize: 16),
),
),
),
const SizedBox(width: 12),
Expanded(
child: ElevatedButton.icon(
icon: const Icon(Icons.download_for_offline),
label: const Text('Download'),
onPressed: appState.session == null
? () => showDialog(
context: context,
builder: (ctx) => DownloadAreaDialog(controller: _mapController),
)
: null, // Disabled while camera sheet active
style: ElevatedButton.styleFrom(
minimumSize: const Size(0, 48),
textStyle: const TextStyle(fontSize: 16),
),
),
),
],
body: Stack(
children: [
MapView(
controller: _mapController,
followMe: _followMe,
onUserGesture: () {
if (_followMe) setState(() => _followMe = false);
},
),
),
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).padding.bottom + kBottomButtonBarMargin,
left: 8,
right: 8,
),
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
boxShadow: [BoxShadow(color: Colors.black26, blurRadius: 10, offset: Offset(0, -2))],
),
margin: EdgeInsets.only(bottom: kBottomButtonBarMargin),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 6),
child: Row(
children: [
Expanded(
child: ElevatedButton.icon(
icon: Icon(Icons.add_location_alt),
label: Text('Tag Camera'),
onPressed: _openAddCameraSheet,
style: ElevatedButton.styleFrom(
minimumSize: Size(0, 48),
textStyle: TextStyle(fontSize: 16),
),
),
),
SizedBox(width: 12),
Expanded(
child: ElevatedButton.icon(
icon: Icon(Icons.download_for_offline),
label: Text('Download'),
onPressed: () => showDialog(
context: context,
builder: (ctx) => DownloadAreaDialog(controller: _mapController),
),
style: ElevatedButton.styleFrom(
minimumSize: Size(0, 48),
textStyle: TextStyle(fontSize: 16),
),
),
),
],
),
),
),
),
],
),
),
);

View File

@@ -311,7 +311,7 @@ class _MapViewState extends State<MapView> {
// Built-in scale bar from flutter_map
Scalebar(
alignment: Alignment.bottomLeft,
padding: EdgeInsets.only(left: 8, bottom: kScaleBarBottom), // from dev_config, above attribution & BottomAppBar
padding: EdgeInsets.only(left: 8, bottom: kScaleBarBottomOffset), // from dev_config
textStyle: TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
lineColor: Colors.black,
strokeWidth: 3,
@@ -353,7 +353,7 @@ class _MapViewState extends State<MapView> {
// Zoom indicator, positioned above scale bar
Positioned(
left: 10,
bottom: kZoomIndicatorBottom, // from dev_config
bottom: kZoomIndicatorBottomOffset,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 2),
decoration: BoxDecoration(
@@ -377,7 +377,7 @@ class _MapViewState extends State<MapView> {
),
// Attribution overlay
Positioned(
bottom: kAttributionBottom, // from dev_config
bottom: kAttributionBottomOffset,
left: 10,
child: Container(
color: Colors.white70,