Files
rog_app/lib/widgets/game_state_view.dart

222 lines
7.7 KiB
Dart

//import 'dart:ffi';
//import 'dart:math';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:rogapp/model/destination.dart';
import 'package:rogapp/pages/destination/destination_controller.dart';
import 'package:rogapp/pages/index/index_controller.dart';
import 'package:rogapp/services/DatabaseService.dart';
//import 'package:rogapp/utils/database_helper.dart';
import 'package:rogapp/widgets/GameState/CheckinState.dart';
import 'package:rogapp/widgets/GameState/ConnectionStatus.dart';
//import 'package:rogapp/widgets/GameState/DashboardWidget.dart';
import 'package:rogapp/widgets/GameState/game_on_off.dart';
//import 'package:rogapp/widgets/GameState/Colors.dart';
import 'package:rogapp/widgets/gps_status.dart';
import 'package:rogapp/utils/location_controller.dart';
class GameStateManager {
static final GameStateManager _instance = GameStateManager._internal();
factory GameStateManager() {
return _instance;
}
GameStateManager._internal();
final List<String> _logs = [];
final List<VoidCallback> _listeners = [];
List<String> get logs => _logs;
void addLog(String log) {
_logs.add(log);
_notifyListeners(); // Notify all listeners
}
void clearLogs() {
_logs.clear();
_notifyListeners(); // Notify all listeners
}
void addListener(VoidCallback listener) {
_listeners.add(listener);
}
void removeListener(VoidCallback listener) {
_listeners.remove(listener);
}
void _notifyListeners() {
for (var listener in _listeners) {
listener();
}
}
}
class GameStateWidget extends StatefulWidget {
const GameStateWidget({super.key});
@override
State<GameStateWidget> createState() => _GameStateWidgetState();
}
class _GameStateWidgetState extends State<GameStateWidget> {
final GameStateManager gameStateManager = GameStateManager();
final IndexController indexController = Get.find<IndexController>();
final DestinationController destinationController =
Get.find<DestinationController>();
@override
void initState() {
super.initState();
gameStateManager.addListener(_updateLogs);
}
@override
void dispose() {
gameStateManager.removeListener(_updateLogs);
super.dispose();
}
void _updateLogs() {
Future.delayed(Duration.zero, () {
if (mounted) {
setState(() {});
}
});
}
void toggleExpanded() {
setState(() {
isExpanded = !isExpanded;
});
}
void clearLogs() {
gameStateManager.clearLogs();
}
bool isExpanded = false;
@override
Widget build(BuildContext context) {
final DatabaseService dbService = DatabaseService();
//final LocationController locationController = Get.find<LocationController>();
return Container(
width: MediaQuery.of(context).size.width,
decoration: const BoxDecoration(color: Colors.black12),
child: GestureDetector(
onTap: toggleExpanded,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
color: isExpanded ? Colors.black54 : Colors.black12,
height: isExpanded ? 160.0 : 48.0, // Adjust sizes as needed
child: Column(
children: [
// Top bar with clear button
if (isExpanded)
Container(
padding: const EdgeInsets.symmetric(horizontal: 10.0),
color: Colors.blueGrey, // Adjust color as needed
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Text('ゲームステータス', style: TextStyle(color: Colors.white)),
IconButton(
icon: const Icon(Icons.clear, color: Colors.white),
onPressed: toggleExpanded,
),
],
),
),
// Log messages
Expanded(
child: SingleChildScrollView(
child: Wrap(
alignment: WrapAlignment.spaceEvenly,
children: [
Obx(() => Padding(
padding: const EdgeInsets.all(4.0),
child: GameStatusIndicator(
gameStarted: destinationController.isInRog.value,
minimized: !isExpanded,
),
)),
Padding(
padding: const EdgeInsets.all(4.0),
child: StreamBuilder<List<Destination>>(
stream: dbService.destinationUpdatesStream,
builder: (context, snapshot) {
if (snapshot.connectionState ==
ConnectionState.waiting) {
return const CircularProgressIndicator();
} else if (snapshot.hasError) {
return LocationVisitedWidget(
count: 0,
minimized: !isExpanded,
);
} else if (snapshot.hasData) {
return LocationVisitedWidget(
count: snapshot.data!.length,
minimized: !isExpanded,
);
} else {
return LocationVisitedWidget(
count: 0,
minimized: !isExpanded,
);
}
},
),
// child: LocationVisitedWidget(
// count:
// minimized: !isExpanded,
// ),
),
Padding(
padding: const EdgeInsets.all(4.0),
child: Obx(() => ConnectionStatusIndicator(
connectionStatus: (indexController
.connectionStatusName.value ==
"wifi" ||
indexController
.connectionStatusName.value ==
"mobile")
? indexController.connectionStatusName.value ==
"wifi"
? ConnectionStatus.wifi
: ConnectionStatus.mobile
: ConnectionStatus.none,
minimized: !isExpanded)),
), // Expanded view
Padding(
padding: const EdgeInsets.all(4.0),
child:GpsSignalStrengthIndicator(
locationController: Get.find<LocationController>(),
minimized: !isExpanded, // isExpanded はあなたのロジックに依存した変数),
)
),
],
),
// child: Obx(
// () => DashboardWidget(
// gameStarted: destinationController.isInRog.value,
// locationsVisited: 3,
// isMinimized: false,
// ),
),
),
],
),
),
),
);
}
}