diff --git a/lib/common/ui/widgets/uis.dart b/lib/common/ui/widgets/uis.dart new file mode 100644 index 0000000..daf0d64 --- /dev/null +++ b/lib/common/ui/widgets/uis.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; +import 'package:rogapp/theme/theme.dart'; + +class UIs{ + static AppBar appBar(){ + return AppBar( + title: const Icon( + Icons.access_alarm, + size:30, + color: Pallete.WHITE_COLOR, + ), + centerTitle: true, + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 76825a8..9660469 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:rogapp/pages/index/index_binding.dart'; import 'package:rogapp/routes/app_pages.dart'; +import 'package:rogapp/theme/theme.dart'; import 'package:rogapp/utils/string_values.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:path/path.dart' as p; @@ -46,18 +47,14 @@ class MyApp extends StatelessWidget { //locale: const Locale('en', 'US'), fallbackLocale: const Locale('en', 'US'), title: 'ROGAINING', - theme: ThemeData( - primarySwatch: Colors.blue, - visualDensity: VisualDensity.adaptivePlatformDensity, - textTheme: GoogleFonts.muliTextTheme(), - ), + theme: AppTheme.theme, debugShowCheckedModeBanner: false, defaultTransition: Transition.cupertino, opaqueRoute: Get.isOpaqueRouteDefault, popGesture: Get.isPopGestureEnable, transitionDuration: const Duration(milliseconds: 230), - initialBinding: IndexBinding(), //HomeBinding(), - initialRoute: AppPages.PERMISSION, + //initialBinding: IndexBinding(), //HomeBinding(), + initialRoute: AppPages.S_LOGIN, getPages: AppPages.routes, enableLog: true, ); diff --git a/lib/pages/permission/permission.dart b/lib/pages/permission/permission.dart index 307e1ac..029cfa2 100644 --- a/lib/pages/permission/permission.dart +++ b/lib/pages/permission/permission.dart @@ -1,156 +1,233 @@ +import 'dart:ffi'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:rogapp/routes/app_pages.dart'; class PermissionHandlerScreen extends StatefulWidget { - PermissionHandlerScreen({Key? key}) : super(key: key); + const PermissionHandlerScreen({super.key}); @override State createState() => _PermissionHandlerScreenState(); } class _PermissionHandlerScreenState extends State { - - - Future _showMyDialog() async { - return showDialog( - context: context, - barrierDismissible: false, // user must tap button! - builder: (BuildContext context) { - return AlertDialog( - title: const Text('ロケーション許可'), - content: SingleChildScrollView( - child: ListBody( - children: const [ - Text( 'このアプリでは、位置情報の収集を行います。'), - Text( 'このアプリでは、開始時点で位置情報を収集します。'), - ], - ), - ), - actions: [ - TextButton( - child: const Text('わかった'), - onPressed: () { - //Navigator.of(context).pop(); - Get.toNamed(AppPages.TRAVEL); - }, - ), - ], - ); - }, - ); - } @override - void initState() { - // TODO: implement initState + void initState(){ super.initState(); - - //permissionServiceCall(); + _checkPermissions(); } - Future checkLocationPermission() async { - return await Permission.location.status; - } +void _checkPermissions() async { + // You can ask for multiple permissions at once. + Map statuses = await [ + Permission.location, + Permission.camera, + ].request(); - permissionServiceCall() async { - await permissionServices().then( - (value) { - if (value != null) { - if (value[Permission.location]!.isGranted ) { - /* ========= New Screen Added ============= */ + bool isCameraGranted = statuses[Permission.camera]!.isGranted; + bool isLocationGranted = statuses[Permission.location]!.isGranted; - Get.toNamed(AppPages.TRAVEL); + if (!isCameraGranted || !isLocationGranted) { + bool isCameraPermanentlyDenied = statuses[Permission.camera]!.isPermanentlyDenied; + bool isLocationPermanentlyDenied = statuses[Permission.location]!.isPermanentlyDenied; - // Navigator.pushReplacement( - // context, - // MaterialPageRoute(builder: (context) => SplashScreen()), - // ); - } - else{ - _showMyDialog(); - } - } - }, - ); - } - - - /*Permission services*/ - Future> permissionServices() async { - // You can request multiple permissions at once. - Map statuses = await [ - Permission.location, - - //add more permission to request here. - ].request(); - - if (statuses[Permission.location]!.isPermanentlyDenied) { - await openAppSettings().then( - (value) async { - if (value) { - if (await Permission.location.status.isPermanentlyDenied == true && - await Permission.location.status.isGranted == false) { - // openAppSettings(); - permissionServiceCall(); /* opens app settings until permission is granted */ - } - } + if (isCameraPermanentlyDenied || isLocationPermanentlyDenied) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: const Text('Permissions not granted'), + content: const Text( + 'This app needs camera and location permissions to function. Please open settings and grant permissions.'), + actions: [ + ElevatedButton( + child: const Text('Open settings'), + onPressed: () { + openAppSettings(); + }, + ), + ], + ); }, ); } else { - if (statuses[Permission.location]!.isDenied) { - permissionServiceCall(); - } + // ask permissions again + _checkPermissions(); } - - /*{Permission.camera: PermissionStatus.granted, Permission.storage: PermissionStatus.granted}*/ - return statuses; + } else { + Get.toNamed(AppPages.INITIAL); } - +} @override Widget build(BuildContext context) { - var status = Permission.location.status.then((value){ - if(value.isGranted == false){ - Future.delayed(Duration.zero, () => showAlert(context)); - } - else { - Get.toNamed(AppPages.TRAVEL); - } - }); - return Scaffold( - body: Container( - child: Text(""), - ), - ); - } - - void showAlert(BuildContext context) { - showDialog( - context: context, - builder: (_) => AlertDialog( - title: const Text('ロケーション許可'), - content: SingleChildScrollView( - child: ListBody( - children: const [ - Text( 'このアプリでは、位置情報の収集を行います。'), - Text('岐阜ナビアプリではチェックポイントの自動チェックインの機能を可能にするために、現在地のデータが収集されます。アプリを閉じている時や、使用していないときにも収集されます。位置情報は、個人を特定できない統計的な情報として、ユーザーの個人情報とは一切結びつかない形で送信されます。お知らせの配信、位置情報の利用を許可しない場合は、この後表示されるダイアログで「許可しない」を選択してください。'), - ], - ), - ), - actions: [ - TextButton( - child: const Text('わかった'), - onPressed: () { - permissionServiceCall(); - }, - ), - ], - ) + return const Scaffold( + body: Center( + child: Text('Checking permissions...'), + ), ); } +} -} \ No newline at end of file + +// import 'package:flutter/material.dart'; +// import 'package:get/get.dart'; +// import 'package:permission_handler/permission_handler.dart'; +// import 'package:rogapp/routes/app_pages.dart'; + +// class PermissionHandlerScreen extends StatefulWidget { +// PermissionHandlerScreen({Key? key}) : super(key: key); + +// @override +// State createState() => _PermissionHandlerScreenState(); +// } + +// class _PermissionHandlerScreenState extends State { + + +// Future _showMyDialog() async { +// return showDialog( +// context: context, +// barrierDismissible: false, // user must tap button! +// builder: (BuildContext context) { +// return AlertDialog( +// title: const Text('ロケーション許可'), +// content: SingleChildScrollView( +// child: ListBody( +// children: const [ +// Text( 'このアプリでは、位置情報の収集を行います。'), +// Text( 'このアプリでは、開始時点で位置情報を収集します。'), +// ], +// ), +// ), +// actions: [ +// TextButton( +// child: const Text('わかった'), +// onPressed: () { +// //Navigator.of(context).pop(); +// Get.toNamed(AppPages.TRAVEL); +// }, +// ), +// ], +// ); +// }, +// ); +// } + +// @override +// void initState() { +// // TODO: implement initState +// super.initState(); + +// //permissionServiceCall(); +// } + +// Future checkLocationPermission() async { +// return await Permission.location.status; +// } + +// permissionServiceCall() async { +// await permissionServices().then( +// (value) { +// if (value != null) { +// if (value[Permission.location]!.isGranted ) { +// /* ========= New Screen Added ============= */ + +// Get.toNamed(AppPages.TRAVEL); + +// // Navigator.pushReplacement( +// // context, +// // MaterialPageRoute(builder: (context) => SplashScreen()), +// // ); +// } +// else{ +// _showMyDialog(); +// } +// } +// }, +// ); +// } + + +// /*Permission services*/ +// Future> permissionServices() async { +// // You can request multiple permissions at once. +// Map statuses = await [ +// Permission.location, + +// //add more permission to request here. +// ].request(); + +// if (statuses[Permission.location]!.isPermanentlyDenied) { +// await openAppSettings().then( +// (value) async { +// if (value) { +// if (await Permission.location.status.isPermanentlyDenied == true && +// await Permission.location.status.isGranted == false) { +// // openAppSettings(); +// permissionServiceCall(); /* opens app settings until permission is granted */ +// } +// } +// }, +// ); +// } else { +// if (statuses[Permission.location]!.isDenied) { +// permissionServiceCall(); +// } +// } + +// /*{Permission.camera: PermissionStatus.granted, Permission.storage: PermissionStatus.granted}*/ +// return statuses; +// } + + + +// @override +// Widget build(BuildContext context) { +// var status = Permission.location.status.then((value){ +// if(value.isGranted == false){ +// Future.delayed(Duration.zero, () => showAlert(context)); +// } +// else { +// Get.toNamed(AppPages.TRAVEL); +// } +// }); +// return Scaffold( +// body: Container( +// child: Text(""), +// ), +// ); +// } + +// void showAlert(BuildContext context) { +// showDialog( +// context: context, +// builder: (_) => AlertDialog( +// title: const Text('ロケーション許可'), +// content: SingleChildScrollView( +// child: ListBody( +// children: const [ +// Text( 'このアプリでは、位置情報の収集を行います。'), +// Text('岐阜ナビアプリではチェックポイントの自動チェックインの機能を可能にするために、現在地のデータが収集されます。アプリを閉じている時や、使用していないときにも収集されます。位置情報は、個人を特定できない統計的な情報として、ユーザーの個人情報とは一切結びつかない形で送信されます。お知らせの配信、位置情報の利用を許可しない場合は、この後表示されるダイアログで「許可しない」を選択してください。'), +// ], +// ), +// ), +// actions: [ +// TextButton( +// child: const Text('わかった'), +// onPressed: () { +// permissionServiceCall(); +// }, +// ), +// ], +// ) +// ); +// } + + +// } \ No newline at end of file diff --git a/lib/routes/app_pages.dart b/lib/routes/app_pages.dart index 2f48fdc..b6de674 100644 --- a/lib/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -20,6 +20,9 @@ import 'package:rogapp/pages/register/register_page.dart'; import 'package:rogapp/pages/search/search_binding.dart'; import 'package:rogapp/pages/search/search_page.dart'; import 'package:rogapp/pages/subperf/subperf_page.dart'; +import 'package:rogapp/screens/auth/views/login/login_screen.dart'; +import 'package:rogapp/screens/auth/views/register/register_screen.dart'; +import 'package:rogapp/screens/home/home_screen.dart'; import 'package:rogapp/spa/spa_binding.dart'; import 'package:rogapp/spa/spa_page.dart'; @@ -28,6 +31,10 @@ part 'app_routes.dart'; class AppPages { + static const S_HOME = Routes.S_HOME; + static const S_LOGIN = Routes.S_LOGIN; + static const S_REGISTER= Routes.S_REGISTER; + // ignore: constant_identifier_names static const INITIAL = Routes.INDEX; // ignore: constant_identifier_names @@ -60,6 +67,20 @@ class AppPages { // page: () => MapPage(), // binding: MapBinding(), // ) + GetPage( + name: Routes.S_HOME, + page: () => HomeScreen(), + //binding: IndexBinding(), + ), + GetPage( + name: Routes.S_LOGIN, + page: () => LoginScreen(), + //binding: IndexBinding(), + ), + GetPage( + name: Routes.S_REGISTER, + page: () => RegisterScreen(), + ), GetPage( name: Routes.INDEX, page: () => IndexPage(), diff --git a/lib/routes/app_routes.dart b/lib/routes/app_routes.dart index b48d014..84dd8f9 100644 --- a/lib/routes/app_routes.dart +++ b/lib/routes/app_routes.dart @@ -1,6 +1,9 @@ part of 'app_pages.dart'; abstract class Routes { + static const S_HOME = '/s_home'; + static const S_LOGIN = '/s_login'; + static const S_REGISTER = '/s_register'; // Main Menu Route // static const HOME = '/'; // static const MAP = '/map'; diff --git a/lib/screens/auth/common/uis/auth_text_field.dart b/lib/screens/auth/common/uis/auth_text_field.dart new file mode 100644 index 0000000..f71eca8 --- /dev/null +++ b/lib/screens/auth/common/uis/auth_text_field.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +import 'package:rogapp/theme/pallete.dart'; + +class AuthTextField extends StatelessWidget { + final TextEditingController controller; + final String hinttext; + final bool isObsque; + const AuthTextField({super.key, required this.controller, required this.hinttext, this.isObsque = false}); + + @override + Widget build(BuildContext context) { + return TextFormField( + controller: controller, + decoration: InputDecoration( + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide( + color: Pallete.BLUE_COLOR, + width: 2 + ) + ), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + borderSide: const BorderSide( + color: Pallete.BROWN_COLOR, + ) + ), + contentPadding: const EdgeInsets.all(22), + hintText: hinttext, + hintStyle: const TextStyle( + fontSize: 18, + ) + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/auth/common/uis/rounded_small_button.dart b/lib/screens/auth/common/uis/rounded_small_button.dart new file mode 100644 index 0000000..cf7ac69 --- /dev/null +++ b/lib/screens/auth/common/uis/rounded_small_button.dart @@ -0,0 +1,30 @@ + +import 'package:rogapp/theme/theme.dart'; +import 'package:flutter/material.dart'; + +class RoundedSmallButton extends StatelessWidget { + final VoidCallback onTap; + final String label; + final Color backgroundColor; + final Color textColor; + + const RoundedSmallButton({ + super.key, + required this.onTap, + required this.label, + this.backgroundColor = Pallete.WHITE_COLOR, + this.textColor = Pallete.BACKGROUND_COLOR, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: onTap, + child: Chip( + label: Text(label, style: TextStyle(color: textColor, fontSize: 16),), + backgroundColor: backgroundColor, + labelPadding:const EdgeInsets.symmetric(horizontal: 10, vertical: 3), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/auth/views/login/login_binding.dart b/lib/screens/auth/views/login/login_binding.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/auth/views/login/login_controller.dart b/lib/screens/auth/views/login/login_controller.dart new file mode 100644 index 0000000..a234c23 --- /dev/null +++ b/lib/screens/auth/views/login/login_controller.dart @@ -0,0 +1,5 @@ +import 'package:get/get.dart'; + +class LoginController extends GetxController{ + +} \ No newline at end of file diff --git a/lib/screens/auth/views/login/login_screen.dart b/lib/screens/auth/views/login/login_screen.dart new file mode 100644 index 0000000..4d896ba --- /dev/null +++ b/lib/screens/auth/views/login/login_screen.dart @@ -0,0 +1,67 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:rogapp/common/ui/widgets/uis.dart'; +import 'package:rogapp/routes/app_pages.dart'; +import 'package:rogapp/screens/auth/common/uis/auth_text_field.dart'; +import 'package:rogapp/screens/auth/common/uis/rounded_small_button.dart'; +import 'package:rogapp/theme/theme.dart'; + +class LoginScreen extends StatelessWidget { + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + LoginScreen({super.key}); + + void login(){ + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: UIs.appBar(), + body: Center( + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Container( + height: MediaQuery.of(context).size.height/6, + decoration: const BoxDecoration( + image:DecorationImage(image: AssetImage('assets/images/login_image.jpg')) + ), + ), + const SizedBox(height: 5,), + AuthTextField(controller: emailController, hinttext: 'Email',), + const SizedBox(height: 25,), + AuthTextField(controller: passwordController, hinttext: 'Password',), + const SizedBox(height: 40,), + Align( + alignment: Alignment.topRight, + child: RoundedSmallButton(onTap: login, label: 'Done',), + ), + const SizedBox(height: 40,), + RichText( + text: TextSpan( + text: "Don't have an account?", + style: const TextStyle(fontSize: 16, color: Pallete.BROWN_COLOR), + children: [ + TextSpan( + text: " Signup", + style: const TextStyle(color: Pallete.BLUE_COLOR, fontSize: 16), + recognizer: TapGestureRecognizer()..onTap = (){ + Get.toNamed(AppPages.S_REGISTER); + }, + ), + ] + ) + ) + ], + ), + ), + ), + ) + ); + } +} \ No newline at end of file diff --git a/lib/screens/auth/views/register/register_binding.dart b/lib/screens/auth/views/register/register_binding.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/auth/views/register/register_controller.dart b/lib/screens/auth/views/register/register_controller.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/auth/views/register/register_screen.dart b/lib/screens/auth/views/register/register_screen.dart new file mode 100644 index 0000000..45f84fc --- /dev/null +++ b/lib/screens/auth/views/register/register_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class RegisterScreen extends StatelessWidget { + const RegisterScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Container(); + } +} \ No newline at end of file diff --git a/lib/screens/home/home_binding.dart b/lib/screens/home/home_binding.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/home/home_controller.dart b/lib/screens/home/home_controller.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/screens/home/home_screen.dart b/lib/screens/home/home_screen.dart new file mode 100644 index 0000000..f118f9f --- /dev/null +++ b/lib/screens/home/home_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Placeholder(); + } +} \ No newline at end of file diff --git a/lib/services/action_service.dart b/lib/services/action_service.dart index 9fb1d2c..dbbf822 100644 --- a/lib/services/action_service.dart +++ b/lib/services/action_service.dart @@ -11,8 +11,7 @@ class ActionService{ String server_url = ConstValues.currentServer(); String url = "${server_url}/api/makeaction/?user_id=${user_id}&location_id=${location_id}&wanttogo=${wanttogo}&like=${like}&checkin=${checkin}"; //String url = "http://localhost:8100/api/makeaction/?user_id=${user_id}&location_id=${location_id}&wanttogo=${wanttogo}&like=${like}&checkin=${checkin}"; - print('++++++++${url}'); - print("url is ------ ${url}"); + print('@@@@@@+++ action_service MAKEACTION - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { @@ -31,7 +30,7 @@ class ActionService{ List cats = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/useraction/?user_id=${user_id}&location_id=${location_id}'; - print('++++++++${url}'); + print('@@@@@@+++ action_service USERACTION - GET, @@@@@@ ${url}'); //String url = 'http://localhost:8100/api/useraction/?user_id=${user_id}&location_id=${location_id}'; final response = await http.get(Uri.parse(url), headers: { diff --git a/lib/services/auth_service.dart b/lib/services/auth_service.dart index 3e31372..cfb954c 100644 --- a/lib/services/auth_service.dart +++ b/lib/services/auth_service.dart @@ -10,7 +10,7 @@ class AuthService{ Map changePassword = {}; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/change-password/'; - print('++++++++${url}'); + print('@@@@@@+++ auth_service CHANGE PASSWORD - PUT with old_password : ${oldpassword} new_password : ${newpassword}, @@@@@@ ${url}'); final http.Response response = await http.put( Uri.parse(url), headers: { @@ -31,11 +31,11 @@ class AuthService{ static Future> login(String email, String password) async { - print("------- in logged email ${email} pwd ${password} ###### --------"); + //print("------- in logged email ${email} pwd ${password} ###### --------"); Map cats = {}; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/login/'; - print('++++++++${url}'); + print('@@@@@@+++ auth_service LOGIN - POST with email : ${email} password : ${password}, @@@@@@ ${url}'); //String url = 'http://localhost:8100/api/login/'; final http.Response response = await http.post( Uri.parse(url), @@ -59,7 +59,7 @@ class AuthService{ Map cats = {}; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/register/'; - print('++++++++${url}'); + print('@@@@@@+++ auth_service REGISTER - POST with email : ${email} password : ${password}, @@@@@@ ${url}'); final http.Response response = await http.post( Uri.parse(url), headers: { @@ -81,7 +81,7 @@ class AuthService{ Map cats = {}; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/delete-account/'; - print('++++++++${url}'); + print('@@@@@@+++ auth_service DELETE USER - GET with Authorization : Token ${token}, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { @@ -101,8 +101,7 @@ class AuthService{ List cats = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/userdetials?user_id=${userid}'; - print('++++++++${url}'); - print("---- UserDetails url is ${url}"); + print('@@@@@@+++ auth_service USER DETAILS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', diff --git a/lib/services/cat_service.dart b/lib/services/cat_service.dart index 50e54f3..7c3132b 100644 --- a/lib/services/cat_service.dart +++ b/lib/services/cat_service.dart @@ -11,7 +11,7 @@ class CatService{ List cats = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/cats/?ln1=${lon1}&la1=${lat1}&ln2=${lon2}&la2=${lat2}&ln3=${lon3}&la3=${lat3}&ln4=${lon4}&la4=${lat4}'; - print('++++++++${url}'); + print('@@@@@@+++ cat_service LOADCATS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -30,7 +30,7 @@ class CatService{ List cats = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/catbycity/?${cityname}'; - print('++++++++${url}'); + print('@@@@@@+++ cat_service CHANGE PASSWORD - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', diff --git a/lib/services/destination_service.dart b/lib/services/destination_service.dart index e45f966..af505ff 100644 --- a/lib/services/destination_service.dart +++ b/lib/services/destination_service.dart @@ -15,7 +15,7 @@ class DestinationService{ List cats = []; String server_url = ConstValues.currentServer(); String url = "${server_url}/api/destinations/?user_id=${user_id}"; - print('++++++++${url}'); + print('@@@@@@+++ destination_service GETDESTINATIONS - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { @@ -33,7 +33,7 @@ class DestinationService{ Map cats = {}; String server_url = ConstValues.currentServer(); String url = "${server_url}/api/delete_destination/?dest_id=${dest_id}"; - print('++++++++${url}'); + print('@@@@@@+++ destination_service DELETEDESTINATION - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { @@ -52,7 +52,7 @@ class DestinationService{ int cats = 0; String server_url = ConstValues.currentServer(); String url = "${server_url}/api/updateorder/?user_action_id=${action_id}&order=${order}&dir=${dir}"; - print('++++++++${url}'); + print('@@@@@@+++ destination_service UPDATEORDER - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { diff --git a/lib/services/external_service.dart b/lib/services/external_service.dart index cabda6b..3c87132 100644 --- a/lib/services/external_service.dart +++ b/lib/services/external_service.dart @@ -57,7 +57,7 @@ class ExternalService { } else { String url = 'https://natnats.mobilous.com/start_from_rogapp'; - print('++++++++${url}'); + print('@@@@@@+++ external_service STARTROGAINING - POST with team_name : ${_team} event_code : ${_event_code}, @@@@@@ ${url}'); final http.Response response = await http.post( Uri.parse(url), headers: { @@ -82,7 +82,6 @@ class ExternalService { Future> makeCheckpoint(int user_id, String token, String checkin_time, String teamname, int cp, String eventcode, String imageurl) async { Map _res = {}; String url = 'https://natnats.mobilous.com/checkin_from_rogapp'; - print('++++++++${url}'); final IndexController indexController = Get.find(); if(imageurl != null){ @@ -106,7 +105,7 @@ class ExternalService { String url1 = "${server_url}/api/checkinimage/"; final im1Bytes = File(imageurl!).readAsBytesSync(); String im1_64 = base64Encode(im1Bytes); - + print('@@@@@@+++ external_service MAKECHECKPOINT - POST with user : ${user_id.toString()} team_name : ${teamname} event_code : ${eventcode} checkinimage : ${im1_64} checkintime : ${checkin_time} cp_number : ${cp.toString()}, @@@@@@ ${url1}'); final http.Response response = await http.post( Uri.parse(url1), headers: { @@ -130,6 +129,8 @@ class ExternalService { if(response.statusCode == 201){ //print('---- toekn is ${token} -----'); + String imgUrl = _res["checkinimage"].toString().replaceAll('http://localhost:8100', 'http://rogaining.sumasen.net'); + print('@@@@@@+++ external_service MAKECHECKPOINT - POST with team_name : ${teamname} event_code : ${eventcode} checkinimage : ${imgUrl} cp_number : ${cp.toString()}, @@@@@@ ${url}'); final http.Response response2 = await http.post( Uri.parse(url), headers: { @@ -166,6 +167,7 @@ class ExternalService { db.insertRogaining(_rog); } else { + print('@@@@@@+++ external_service MAKECHECKPOINT - POST with team_name : ${teamname} event_code : ${eventcode} cp_number : ${cp.toString()} image : "", @@@@@@ ${url}'); final http.Response response3 = await http.post( Uri.parse(url), headers: { @@ -214,7 +216,7 @@ class ExternalService { String url1 = "${server_url}/api/goalimage/"; final im1Bytes = File(image!).readAsBytesSync(); String im1_64 = base64Encode(im1Bytes); - + print('@@@@@@+++ external_service MAKEGOAL - POST with user : ${user_id.toString()} team_name : ${teamname} event_code : ${eventcode} goaltime : ${goal_time} cp_number : -1 goalimage : ${im1_64}, @@@@@@ ${url1}'); final http.Response response = await http.post( Uri.parse(url1), headers: { @@ -233,11 +235,10 @@ class ExternalService { ); String url = 'https://natnats.mobilous.com/goal_from_rogapp'; - print('++++++++${url}'); if (response.statusCode == 201) { Map _res = json.decode(utf8.decode(response.bodyBytes)); - print('----_res : ${_res} ----'); - print('---- image url ${_res["goalimage"]} ----'); + String imgUrl = _res["goalimage"].toString().replaceAll('http://localhost:8100', 'http://rogaining.sumasen.net'); + print('@@@@@@+++ external_service MAKEGOAL - POST with team_name : ${teamname} event_code : ${eventcode} goal_time : ${goal_time} goalimage : ${imgUrl}, @@@@@@ ${url}'); final http.Response response2 = await http.post( Uri.parse(url), headers: { @@ -265,7 +266,7 @@ class ExternalService { static Future> usersEventCode(String teamcode, String password) async { Map _res = {}; String url = "https://natnats.mobilous.com/check_event_code?zekken_number=${teamcode}&password=${password}"; - print('++++++++${url}'); + print('@@@@@@+++ external_service USEREVENTCODE - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { diff --git a/lib/services/location_service.dart b/lib/services/location_service.dart index 40b9d8a..39ff066 100644 --- a/lib/services/location_service.dart +++ b/lib/services/location_service.dart @@ -61,7 +61,7 @@ class LocationService{ url = '${server_url}/api/inperf/?perf=' + perfecture; } } - print('++++++++${url}'); + print('@@@@@@+++ location_service LOADLOCATIONFOR - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -80,7 +80,7 @@ class LocationService{ List ext = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/locsext/'; - print('++++++++${url}'); + print('@@@@@@+++ location_service GETLOCATIONEXT - POST, with token : ${token} @@@@@@ ${url}'); final response = await http.post(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -125,7 +125,7 @@ class LocationService{ url = '${server_url}/api/insubperf?subperf=' + subperfecture; } } - print('++++++++${url}'); + print('@@@@@@+++ location_service LOADLOCATIONSUBFOR - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -169,7 +169,7 @@ class LocationService{ url = '${server_url}/api/inbound?ln1=${lon1}&la1=${lat1}&ln2=${lon2}&la2=${lat2}&ln3=${lon3}&la3=${lat3}&ln4=${lon4}&la4=${lat4}'; } } - print('++++++++${url}'); + print('@@@@@@+++ location_service LOADLOCATIONSBOUNDS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -224,7 +224,7 @@ class LocationService{ url = '${server_url}/api/customarea?name=${name}'; } } - print('++++++++${url}'); + print('@@@@@@+++ location_service LOADCUSTOMLOCATIONS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', diff --git a/lib/services/maxtrix_service.dart b/lib/services/maxtrix_service.dart index 8d6accd..781e5cb 100644 --- a/lib/services/maxtrix_service.dart +++ b/lib/services/maxtrix_service.dart @@ -54,7 +54,7 @@ class MatrixService{ Map cats = {}; String url = "https://maps.googleapis.com/maps/api/directions/json?destination=${destination}&mode=${_mode}&waypoints=${locs}&origin=${origin}&key=AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE"; - print('++++++++${url}'); + print('@@@@@@+++ matrix_service GETDESTINATIONS - GET, @@@@@@ ${url}'); final http.Response response = await http.get( Uri.parse(url), headers: { diff --git a/lib/services/perfecture_service.dart b/lib/services/perfecture_service.dart index 5fa099f..fe543c1 100644 --- a/lib/services/perfecture_service.dart +++ b/lib/services/perfecture_service.dart @@ -9,7 +9,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/perf_main/'; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service LOADPERFECTURES - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -27,7 +27,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/subperfinmain/?area=' + area; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service LOADSUBPERFECTURES - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -46,7 +46,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/mainperfext/?perf=' + id; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service GETMAINPERFEXT - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -64,7 +64,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/allgifuareas/?perf=' + perf; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service LOADGIFUAREAS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -82,7 +82,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/customareanames'; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service LOADCUSTOMAREAS - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', @@ -101,7 +101,7 @@ class PerfectureService{ List perfs = []; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/perfext/?sub_perf=' + id; - print('++++++++${url}'); + print('@@@@@@+++ perfeture_service GETSUBEXT - GET, @@@@@@ ${url}'); final response = await http.get(Uri.parse(url), headers: { 'Content-Type': 'application/json; charset=UTF-8', diff --git a/lib/services/reacking_service.dart b/lib/services/reacking_service.dart index 15236ac..4627979 100644 --- a/lib/services/reacking_service.dart +++ b/lib/services/reacking_service.dart @@ -12,8 +12,8 @@ class TrackingService { Map cats = {}; String server_url = ConstValues.currentServer(); String url = '${server_url}/api/track/'; - print('++++++++${url}'); final geom = '{"type": "MULTIPOINT", "coordinates": [[${lon}, ${lat}]]}'; + print('@@@@@@+++ tracking_service ADDTRAACK - POST, with user_id : ${user_id} geom : ${geom} @@@@@@ ${url}'); final http.Response response = await http.post( Uri.parse(url), headers: { diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart new file mode 100644 index 0000000..02d7eae --- /dev/null +++ b/lib/theme/app_theme.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:rogapp/theme/pallete.dart'; + +class AppTheme { + static ThemeData theme = ThemeData.light(useMaterial3: true).copyWith( + scaffoldBackgroundColor: Pallete.WHITE_COLOR, + primaryColor: Pallete.BLUE_COLOR, + secondaryHeaderColor: Pallete.GREEN_COLOR, + appBarTheme: const AppBarTheme( + color: Pallete.BACKGROUND_COLOR, + elevation: 0 + ), + floatingActionButtonTheme: const FloatingActionButtonThemeData( + backgroundColor: Pallete.BLUE_COLOR + ), + ); +} \ No newline at end of file diff --git a/lib/theme/pallete.dart b/lib/theme/pallete.dart new file mode 100644 index 0000000..a026c45 --- /dev/null +++ b/lib/theme/pallete.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Pallete { + static const Color BACKGROUND_COLOR = Color.fromRGBO(191, 33, 46, 1); + static const Color SEARCHBAR_COLOR = Color.fromRGBO(191, 33, 120, 1); + static const Color BLUE_COLOR = Color.fromRGBO(36, 163, 191, 1); + static const Color GREEN_COLOR = Color.fromRGBO(31, 140, 58, 1); + static const Color BROWN_COLOR = Color.fromRGBO(191, 135, 31, 1); + static const Color WHITE_COLOR = Colors.white; +} \ No newline at end of file diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart new file mode 100644 index 0000000..71ecb13 --- /dev/null +++ b/lib/theme/theme.dart @@ -0,0 +1,3 @@ + +export 'pallete.dart'; +export 'app_theme.dart'; \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 4fa69e3..ed14e02 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,7 +18,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.12+12 environment: - sdk: ">=2.16.0 <3.0.0" + sdk: ">=2.17.0 <3.0.0" # Dependencies specify other packages that your package needs in order to work. # To automatically upgrade your package dependencies to the latest versions diff --git a/web/favicon.png b/web/favicon.png deleted file mode 100644 index 8aaa46a..0000000 Binary files a/web/favicon.png and /dev/null differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png deleted file mode 100644 index b749bfe..0000000 Binary files a/web/icons/Icon-192.png and /dev/null differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48..0000000 Binary files a/web/icons/Icon-512.png and /dev/null differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png deleted file mode 100644 index eb9b4d7..0000000 Binary files a/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png deleted file mode 100644 index d69c566..0000000 Binary files a/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/web/index.html b/web/index.html deleted file mode 100644 index 4c51063..0000000 --- a/web/index.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - 岐阜ナビ - - - - - - - diff --git a/web/manifest.json b/web/manifest.json deleted file mode 100644 index 43af7f9..0000000 --- a/web/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "rogapp", - "short_name": "rogapp", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} diff --git a/windows/.gitignore b/windows/.gitignore deleted file mode 100644 index ec4098a..0000000 --- a/windows/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -flutter/ephemeral/ - -# Visual Studio user-specific files. -*.suo -*.user -*.userosscache -*.sln.docstates - -# Visual Studio build-related files. -x64/ -x86/ - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt deleted file mode 100644 index 93f03df..0000000 --- a/windows/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(rogapp LANGUAGES CXX) - -set(BINARY_NAME "rogapp") - -cmake_policy(SET CMP0063 NEW) - -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Configure build options. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() - -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") -endfunction() - -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") - -# Flutter library and tool build rules. -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build -add_subdirectory("runner") - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# Support files are copied into place next to the executable, so that it can -# run in place. This is done instead of making a separate bundle (as on Linux) -# so that building and running from within Visual Studio will work. -set(BUILD_BUNDLE_DIR "$") -# Make the "install" step default, as it's required to run. -set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - CONFIGURATIONS Profile;Release - COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt deleted file mode 100644 index d4b5770..0000000 --- a/windows/flutter/CMakeLists.txt +++ /dev/null @@ -1,103 +0,0 @@ -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - windows-x64 $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc deleted file mode 100644 index bf5dc77..0000000 --- a/windows/flutter/generated_plugin_registrant.cc +++ /dev/null @@ -1,26 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#include "generated_plugin_registrant.h" - -#include -#include -#include -#include -#include - -void RegisterPlugins(flutter::PluginRegistry* registry) { - ConnectivityPlusWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin")); - GeolocatorWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("GeolocatorWindows")); - PermissionHandlerWindowsPluginRegisterWithRegistrar( - registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); - SharePlusWindowsPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); - UrlLauncherWindowsRegisterWithRegistrar( - registry->GetRegistrarForPlugin("UrlLauncherWindows")); -} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h deleted file mode 100644 index dc139d8..0000000 --- a/windows/flutter/generated_plugin_registrant.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Generated file. Do not edit. -// - -// clang-format off - -#ifndef GENERATED_PLUGIN_REGISTRANT_ -#define GENERATED_PLUGIN_REGISTRANT_ - -#include - -// Registers Flutter plugins. -void RegisterPlugins(flutter::PluginRegistry* registry); - -#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake deleted file mode 100644 index 17df843..0000000 --- a/windows/flutter/generated_plugins.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# -# Generated file, do not edit. -# - -list(APPEND FLUTTER_PLUGIN_LIST - connectivity_plus - geolocator_windows - permission_handler_windows - share_plus - url_launcher_windows -) - -list(APPEND FLUTTER_FFI_PLUGIN_LIST -) - -set(PLUGIN_BUNDLED_LIBRARIES) - -foreach(plugin ${FLUTTER_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) - target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) - list(APPEND PLUGIN_BUNDLED_LIBRARIES $) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) -endforeach(plugin) - -foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) - add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) - list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) -endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt deleted file mode 100644 index 945bda7..0000000 --- a/windows/runner/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) -apply_standard_settings(${BINARY_NAME}) -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") -add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc deleted file mode 100644 index bea7343..0000000 --- a/windows/runner/Runner.rc +++ /dev/null @@ -1,121 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#pragma code_page(65001) -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#ifdef FLUTTER_BUILD_NUMBER -#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER -#else -#define VERSION_AS_NUMBER 1,0,0 -#endif - -#ifdef FLUTTER_BUILD_NAME -#define VERSION_AS_STRING #FLUTTER_BUILD_NAME -#else -#define VERSION_AS_STRING "1.0.0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_AS_NUMBER - PRODUCTVERSION VERSION_AS_NUMBER - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "rogapp" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "rogapp" "\0" - VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "rogapp.exe" "\0" - VALUE "ProductName", "rogapp" "\0" - VALUE "ProductVersion", VERSION_AS_STRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp deleted file mode 100644 index 3a11b51..0000000 --- a/windows/runner/flutter_window.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h deleted file mode 100644 index 28c2383..0000000 --- a/windows/runner/flutter_window.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp deleted file mode 100644 index e2fbaf4..0000000 --- a/windows/runner/main.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.CreateAndShow(L"rogapp", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} diff --git a/windows/runner/resource.h b/windows/runner/resource.h deleted file mode 100644 index ddc7f3e..0000000 --- a/windows/runner/resource.h +++ /dev/null @@ -1,16 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico deleted file mode 100644 index c04e20c..0000000 Binary files a/windows/runner/resources/app_icon.ico and /dev/null differ diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest deleted file mode 100644 index 2c680b8..0000000 --- a/windows/runner/runner.exe.manifest +++ /dev/null @@ -1,20 +0,0 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp deleted file mode 100644 index 05b53c0..0000000 --- a/windows/runner/utils.cpp +++ /dev/null @@ -1,64 +0,0 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr); - if (target_length == 0) { - return std::string(); - } - std::string utf8_string; - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, utf8_string.data(), - target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} diff --git a/windows/runner/utils.h b/windows/runner/utils.h deleted file mode 100644 index 3f0e05c..0000000 --- a/windows/runner/utils.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp deleted file mode 100644 index 97f4439..0000000 --- a/windows/runner/win32_window.cpp +++ /dev/null @@ -1,245 +0,0 @@ -#include "win32_window.h" - -#include - -#include "resource.h" - -namespace { - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - FreeLibrary(user32_module); - } -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::CreateAndShow(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - return OnCreate(); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h deleted file mode 100644 index d9bcac1..0000000 --- a/windows/runner/win32_window.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates and shows a win32 window with |title| and position and size using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size to will treat the width height passed in to this function - // as logical pixels and scale to appropriate for the default monitor. Returns - // true if the window was created successfully. - bool CreateAndShow(const std::wstring& title, - const Point& origin, - const Size& size); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responsponds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_