From 426fc2b34e595a23a801e6b11650b76c66646dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lopes?= <158082419+joaolopes15@users.noreply.github.com> Date: Sun, 30 Nov 2025 18:11:03 +0000 Subject: [PATCH 1/5] taping off the search bar now unfocus it --- packages/uni_app/lib/view/map/map.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/uni_app/lib/view/map/map.dart b/packages/uni_app/lib/view/map/map.dart index 5bb598369..9cfc22726 100644 --- a/packages/uni_app/lib/view/map/map.dart +++ b/packages/uni_app/lib/view/map/map.dart @@ -87,8 +87,10 @@ class MapPageStateView extends ConsumerState { bounds: bounds, ), onTap: - (tapPosition, latlng) => - _popupLayerController.hideAllPopups(), + (tapPosition, latlng) { + _popupLayerController.hideAllPopups(); + FocusScope.of(context).unfocus(); + }, interactionOptions: const InteractionOptions( flags: InteractiveFlag.all - InteractiveFlag.rotate, ), From 71ef4c574c170bacb372f2e4de609f32d59c1046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lopes?= <158082419+joaolopes15@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:41:10 +0000 Subject: [PATCH 2/5] changed several parameters in the search bar like hintText and the logo size --- .../lib/generated/intl/messages_en.dart | 2 +- .../lib/generated/intl/messages_pt_PT.dart | 2 +- packages/uni_app/lib/generated/l10n.dart | 6 ++--- packages/uni_app/lib/l10n/intl_en.arb | 2 +- packages/uni_app/lib/l10n/intl_pt_PT.arb | 2 +- packages/uni_app/lib/view/map/map.dart | 23 +++++++++++++------ 6 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/uni_app/lib/generated/intl/messages_en.dart b/packages/uni_app/lib/generated/intl/messages_en.dart index 6fb90730a..2d5b27a37 100644 --- a/packages/uni_app/lib/generated/intl/messages_en.dart +++ b/packages/uni_app/lib/generated/intl/messages_en.dart @@ -403,7 +403,7 @@ class MessageLookup extends MessageLookupByLibrary { "save": MessageLookupByLibrary.simpleMessage("Save"), "schedule": MessageLookupByLibrary.simpleMessage("Schedule"), "school_calendar": MessageLookupByLibrary.simpleMessage("School Calendar"), - "search": MessageLookupByLibrary.simpleMessage("Search"), + "search_here": MessageLookupByLibrary.simpleMessage("Search here"), "see_more": MessageLookupByLibrary.simpleMessage("See more"), "select_all": MessageLookupByLibrary.simpleMessage("Select All"), "semester": MessageLookupByLibrary.simpleMessage("Semester"), diff --git a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart index 0d32594cb..b8d91c23a 100644 --- a/packages/uni_app/lib/generated/intl/messages_pt_PT.dart +++ b/packages/uni_app/lib/generated/intl/messages_pt_PT.dart @@ -423,7 +423,7 @@ class MessageLookup extends MessageLookupByLibrary { "school_calendar": MessageLookupByLibrary.simpleMessage( "Calendário Escolar", ), - "search": MessageLookupByLibrary.simpleMessage("Pesquisar"), + "search_here": MessageLookupByLibrary.simpleMessage("Pesquisar aqui"), "see_more": MessageLookupByLibrary.simpleMessage("Ver mais"), "select_all": MessageLookupByLibrary.simpleMessage("Selecionar Todos"), "semester": MessageLookupByLibrary.simpleMessage("Semestre"), diff --git a/packages/uni_app/lib/generated/l10n.dart b/packages/uni_app/lib/generated/l10n.dart index d713a336e..a773afe06 100644 --- a/packages/uni_app/lib/generated/l10n.dart +++ b/packages/uni_app/lib/generated/l10n.dart @@ -1483,9 +1483,9 @@ class S { return Intl.message('See more', name: 'see_more', desc: '', args: []); } - /// `Search` - String get search { - return Intl.message('Search', name: 'search', desc: '', args: []); + /// `Search_here` + String get search_here { + return Intl.message('Search here', name: 'search_here', desc: '', args: []); } /// `Do you really want to log out? Your local data will be deleted and you will have to log in again.` diff --git a/packages/uni_app/lib/l10n/intl_en.arb b/packages/uni_app/lib/l10n/intl_en.arb index e7e9a27a7..e0602cfdf 100644 --- a/packages/uni_app/lib/l10n/intl_en.arb +++ b/packages/uni_app/lib/l10n/intl_en.arb @@ -350,7 +350,7 @@ "@year": {}, "see_more": "See more", "@see_more": {}, - "search": "Search", + "search_here": "Search here", "@search": {}, "confirm_logout": "Do you really want to log out? Your local data will be deleted and you will have to log in again.", "@confirm_logout": {}, diff --git a/packages/uni_app/lib/l10n/intl_pt_PT.arb b/packages/uni_app/lib/l10n/intl_pt_PT.arb index 10587cafd..d39239b94 100644 --- a/packages/uni_app/lib/l10n/intl_pt_PT.arb +++ b/packages/uni_app/lib/l10n/intl_pt_PT.arb @@ -350,7 +350,7 @@ "@widget_prompt": {}, "year": "Ano", "@year": {}, - "search": "Pesquisar", + "search_here": "Pesquisar aqui", "@search": {}, "confirm_logout": "Tens a certeza de que queres terminar sessão? Os teus dados locais serão apagados e terás de iniciar sessão novamente.", "@confirm_logout": {}, diff --git a/packages/uni_app/lib/view/map/map.dart b/packages/uni_app/lib/view/map/map.dart index 9cfc22726..c8c214cf5 100644 --- a/packages/uni_app/lib/view/map/map.dart +++ b/packages/uni_app/lib/view/map/map.dart @@ -156,14 +156,15 @@ class MapPageStateView extends ConsumerState { ), SafeArea( child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 20, - vertical: 10, + padding: const EdgeInsets.only( + left: 10, + right: 10, + top: 24, ), child: PhysicalModel( borderRadius: BorderRadius.circular(10), - color: Colors.white, - elevation: 3, + color: const Color(0xFFFFF5F3), + elevation: 4, child: TextFormField( key: searchFormKey, onChanged: (text) { @@ -181,7 +182,8 @@ class MapPageStateView extends ConsumerState { child: SvgPicture.asset( 'assets/images/logo_dark.svg', semanticsLabel: 'search', - width: 10, + width: 44, + height: 25, ), ), border: OutlineInputBorder( @@ -189,7 +191,14 @@ class MapPageStateView extends ConsumerState { borderSide: BorderSide.none, ), contentPadding: const EdgeInsets.all(10), - hintText: '${S.of(context).search}...', + hintText: S.of(context).search_here, + hintStyle: const TextStyle( + fontFamily: 'Roboto', + fontSize: 9, + fontWeight: FontWeight.w400, + color: Color(0xFF7F7F7F), + ) + ), ), ), From 05c39a17a983797b804ba4bde4d674fbc6439017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lopes?= <158082419+joaolopes15@users.noreply.github.com> Date: Mon, 1 Dec 2025 22:22:11 +0000 Subject: [PATCH 3/5] removed duplicated code --- packages/uni_app/lib/view/map/map.dart | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/packages/uni_app/lib/view/map/map.dart b/packages/uni_app/lib/view/map/map.dart index c8c214cf5..f9f47858b 100644 --- a/packages/uni_app/lib/view/map/map.dart +++ b/packages/uni_app/lib/view/map/map.dart @@ -130,30 +130,6 @@ class MapPageStateView extends ConsumerState { ), ), ), - PopupMarkerLayer( - options: PopupMarkerLayerOptions( - markers: - filteredLocations.map((location) { - return LocationMarker(location.latlng, location); - }).toList(), - popupController: _popupLayerController, - popupDisplayOptions: PopupDisplayOptions( - animation: const PopupAnimation.fade( - duration: Duration(milliseconds: 400), - ), - builder: (_, marker) { - if (marker is LocationMarker) { - return marker.locationGroup.isFloorless - ? FloorlessLocationMarkerPopup( - marker.locationGroup, - ) - : LocationMarkerPopup(marker.locationGroup); - } - return const Card(child: Text('')); - }, - ), - ), - ), SafeArea( child: Padding( padding: const EdgeInsets.only( From eb36ce1321a3be5e5c31e5d46ec683b576d96b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lopes?= <158082419+joaolopes15@users.noreply.github.com> Date: Mon, 1 Dec 2025 23:29:06 +0000 Subject: [PATCH 4/5] fixed initial camera positioning --- packages/uni_app/lib/view/map/map.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/uni_app/lib/view/map/map.dart b/packages/uni_app/lib/view/map/map.dart index f9f47858b..9845b4cf6 100644 --- a/packages/uni_app/lib/view/map/map.dart +++ b/packages/uni_app/lib/view/map/map.dart @@ -82,7 +82,7 @@ class MapPageStateView extends ConsumerState { minZoom: 16, maxZoom: 19, initialCenter: bounds.center, - initialCameraFit: CameraFit.insideBounds(bounds: bounds), + initialZoom: 17, cameraConstraint: CameraConstraint.containCenter( bounds: bounds, ), From 99027fe569ce8d9a6c6a1d33d7ea51141f7b0242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Lopes?= <158082419+joaolopes15@users.noreply.github.com> Date: Mon, 8 Dec 2025 13:17:02 +0000 Subject: [PATCH 5/5] added a floor selector widget(loctions info still wrong), and formatted the code --- packages/uni_app/lib/view/map/map.dart | 43 +++++++++++--- .../lib/view/map/widgets/floor_selector.dart | 57 +++++++++++++++++++ 2 files changed, 92 insertions(+), 8 deletions(-) create mode 100644 packages/uni_app/lib/view/map/widgets/floor_selector.dart diff --git a/packages/uni_app/lib/view/map/map.dart b/packages/uni_app/lib/view/map/map.dart index 9845b4cf6..d7596e5a2 100644 --- a/packages/uni_app/lib/view/map/map.dart +++ b/packages/uni_app/lib/view/map/map.dart @@ -10,6 +10,7 @@ import 'package:uni/generated/l10n.dart'; import 'package:uni/model/entities/location_group.dart'; import 'package:uni/model/providers/riverpod/default_consumer.dart'; import 'package:uni/model/providers/riverpod/faculty_locations_provider.dart'; +import 'package:uni/view/map/widgets/floor_selector.dart'; import 'package:uni/view/map/widgets/floorless_marker_popup.dart'; import 'package:uni/view/map/widgets/marker.dart'; import 'package:uni/view/map/widgets/marker_popup.dart'; @@ -29,12 +30,14 @@ class MapPageStateView extends ConsumerState { var _searchTerms = ''; late final PopupController _popupLayerController; LatLngBounds? _bounds; + int? _selectedFloor; @override void initState() { super.initState(); _searchTerms = ''; _popupLayerController = PopupController(); + _selectedFloor = null; } @override @@ -67,6 +70,16 @@ class MapPageStateView extends ConsumerState { }); } + if (_selectedFloor != null) { + filteredLocations.retainWhere((location) { + return location.floors.containsKey(_selectedFloor); + }); + } + + final allFloors = + locations.expand((group) => group.floors.keys).toSet().toList() + ..sort((a, b) => b.compareTo(a)); + return AnnotatedRegion( value: AppSystemOverlayStyles.base.copyWith( statusBarIconBrightness: Brightness.dark, @@ -86,11 +99,10 @@ class MapPageStateView extends ConsumerState { cameraConstraint: CameraConstraint.containCenter( bounds: bounds, ), - onTap: - (tapPosition, latlng) { - _popupLayerController.hideAllPopups(); - FocusScope.of(context).unfocus(); - }, + onTap: (tapPosition, latlng) { + _popupLayerController.hideAllPopups(); + FocusScope.of(context).unfocus(); + }, interactionOptions: const InteractionOptions( flags: InteractiveFlag.all - InteractiveFlag.rotate, ), @@ -130,12 +142,28 @@ class MapPageStateView extends ConsumerState { ), ), ), + Positioned( + right: 10, + top: 400, + child: SafeArea( + child: FloorSelector( + floors: allFloors, + selectedFloor: _selectedFloor, + onFloorSelected: (floor) { + setState(() { + _selectedFloor = floor; + _popupLayerController.hideAllPopups(); + }); + }, + ), + ), + ), SafeArea( child: Padding( padding: const EdgeInsets.only( left: 10, right: 10, - top: 24, + top: 12, ), child: PhysicalModel( borderRadius: BorderRadius.circular(10), @@ -173,8 +201,7 @@ class MapPageStateView extends ConsumerState { fontSize: 9, fontWeight: FontWeight.w400, color: Color(0xFF7F7F7F), - ) - + ), ), ), ), diff --git a/packages/uni_app/lib/view/map/widgets/floor_selector.dart b/packages/uni_app/lib/view/map/widgets/floor_selector.dart new file mode 100644 index 000000000..4770e6fa3 --- /dev/null +++ b/packages/uni_app/lib/view/map/widgets/floor_selector.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:uni_ui/theme.dart'; + +class FloorSelector extends StatelessWidget { + const FloorSelector({ + required this.floors, + required this.selectedFloor, + required this.onFloorSelected, + super.key, + }); + + final List floors; + final int? selectedFloor; + final void Function(int?) onFloorSelected; + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: const Color(0xFFFFF5F3), + borderRadius: BorderRadius.circular(8), + boxShadow: const [BoxShadow(color: Color(0x40000000), blurRadius: 4)], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: + floors.map((floor) { + final isSelected = selectedFloor == floor; + return InkWell( + onTap: () => onFloorSelected(isSelected ? null : floor), + child: Container( + width: 50, + height: 50, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), + color: + isSelected + ? const Color(0x40B14D54) + : Colors.transparent, + ), + child: Center( + child: Text( + floor.toString(), + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: isSelected ? primaryVibrant : grayText, + ), + ), + ), + ), + ); + }).toList(), + ), + ); + } +}