Raihan Rizal 4 months ago
commit
3580e5f402
100 changed files with 3910 additions and 0 deletions
  1. 43 0
      .gitignore
  2. 45 0
      .metadata
  3. 16 0
      README.md
  4. 28 0
      analysis_options.yaml
  5. 13 0
      android/.gitignore
  6. 67 0
      android/app/build.gradle
  7. 7 0
      android/app/src/debug/AndroidManifest.xml
  8. 44 0
      android/app/src/main/AndroidManifest.xml
  9. 5 0
      android/app/src/main/kotlin/com/example/flutter_canvas_editor/MainActivity.kt
  10. 12 0
      android/app/src/main/res/drawable-v21/launch_background.xml
  11. 12 0
      android/app/src/main/res/drawable/launch_background.xml
  12. BIN
      android/app/src/main/res/mipmap-hdpi/ic_launcher.png
  13. BIN
      android/app/src/main/res/mipmap-mdpi/ic_launcher.png
  14. BIN
      android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
  15. BIN
      android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
  16. BIN
      android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
  17. 18 0
      android/app/src/main/res/values-night/styles.xml
  18. 18 0
      android/app/src/main/res/values/styles.xml
  19. 7 0
      android/app/src/profile/AndroidManifest.xml
  20. 18 0
      android/build.gradle
  21. 3 0
      android/gradle.properties
  22. 5 0
      android/gradle/wrapper/gradle-wrapper.properties
  23. 26 0
      android/settings.gradle
  24. 34 0
      ios/.gitignore
  25. 26 0
      ios/Flutter/AppFrameworkInfo.plist
  26. 1 0
      ios/Flutter/Debug.xcconfig
  27. 1 0
      ios/Flutter/Release.xcconfig
  28. 616 0
      ios/Runner.xcodeproj/project.pbxproj
  29. 7 0
      ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  30. 8 0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  31. 8 0
      ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  32. 98 0
      ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  33. 7 0
      ios/Runner.xcworkspace/contents.xcworkspacedata
  34. 8 0
      ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  35. 8 0
      ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  36. 13 0
      ios/Runner/AppDelegate.swift
  37. 122 0
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  38. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
  39. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
  40. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
  41. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
  42. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
  43. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
  44. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
  45. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
  46. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
  47. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
  48. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
  49. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
  50. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
  51. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
  52. BIN
      ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
  53. 23 0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  54. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
  55. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
  56. BIN
      ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
  57. 5 0
      ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  58. 37 0
      ios/Runner/Base.lproj/LaunchScreen.storyboard
  59. 26 0
      ios/Runner/Base.lproj/Main.storyboard
  60. 49 0
      ios/Runner/Info.plist
  61. 1 0
      ios/Runner/Runner-Bridging-Header.h
  62. 12 0
      ios/RunnerTests/RunnerTests.swift
  63. 78 0
      lib/arc_curves_painter.dart
  64. 73 0
      lib/battery/animated_battery.dart
  65. 120 0
      lib/battery/battery_painter.dart
  66. 51 0
      lib/common/common_scaffold.dart
  67. 66 0
      lib/grid/grid_painter.dart
  68. 49 0
      lib/grid/grid_widget.dart
  69. 125 0
      lib/main.dart
  70. 59 0
      lib/ovals_painter.dart
  71. 96 0
      lib/polygon_painter.dart
  72. 1 0
      linux/.gitignore
  73. 145 0
      linux/CMakeLists.txt
  74. 88 0
      linux/flutter/CMakeLists.txt
  75. 11 0
      linux/flutter/generated_plugin_registrant.cc
  76. 15 0
      linux/flutter/generated_plugin_registrant.h
  77. 23 0
      linux/flutter/generated_plugins.cmake
  78. 6 0
      linux/main.cc
  79. 124 0
      linux/my_application.cc
  80. 18 0
      linux/my_application.h
  81. 7 0
      macos/.gitignore
  82. 1 0
      macos/Flutter/Flutter-Debug.xcconfig
  83. 1 0
      macos/Flutter/Flutter-Release.xcconfig
  84. 10 0
      macos/Flutter/GeneratedPluginRegistrant.swift
  85. 705 0
      macos/Runner.xcodeproj/project.pbxproj
  86. 8 0
      macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  87. 98 0
      macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  88. 7 0
      macos/Runner.xcworkspace/contents.xcworkspacedata
  89. 8 0
      macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  90. 9 0
      macos/Runner/AppDelegate.swift
  91. 68 0
      macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  92. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
  93. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
  94. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
  95. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
  96. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
  97. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
  98. BIN
      macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
  99. 343 0
      macos/Runner/Base.lproj/MainMenu.xib
  100. 0 0
      macos/Runner/Configs/AppInfo.xcconfig

+ 43 - 0
.gitignore

@@ -0,0 +1,43 @@
1
+# Miscellaneous
2
+*.class
3
+*.log
4
+*.pyc
5
+*.swp
6
+.DS_Store
7
+.atom/
8
+.buildlog/
9
+.history
10
+.svn/
11
+migrate_working_dir/
12
+
13
+# IntelliJ related
14
+*.iml
15
+*.ipr
16
+*.iws
17
+.idea/
18
+
19
+# The .vscode folder contains launch configuration and tasks you configure in
20
+# VS Code which you may wish to be included in version control, so this line
21
+# is commented out by default.
22
+#.vscode/
23
+
24
+# Flutter/Dart/Pub related
25
+**/doc/api/
26
+**/ios/Flutter/.last_build_id
27
+.dart_tool/
28
+.flutter-plugins
29
+.flutter-plugins-dependencies
30
+.pub-cache/
31
+.pub/
32
+/build/
33
+
34
+# Symbolication related
35
+app.*.symbols
36
+
37
+# Obfuscation related
38
+app.*.map.json
39
+
40
+# Android Studio will place build artifacts here
41
+/android/app/debug
42
+/android/app/profile
43
+/android/app/release

+ 45 - 0
.metadata

@@ -0,0 +1,45 @@
1
+# This file tracks properties of this Flutter project.
2
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
3
+#
4
+# This file should be version controlled and should not be manually edited.
5
+
6
+version:
7
+  revision: "ba393198430278b6595976de84fe170f553cc728"
8
+  channel: "stable"
9
+
10
+project_type: app
11
+
12
+# Tracks metadata for the flutter migrate command
13
+migration:
14
+  platforms:
15
+    - platform: root
16
+      create_revision: ba393198430278b6595976de84fe170f553cc728
17
+      base_revision: ba393198430278b6595976de84fe170f553cc728
18
+    - platform: android
19
+      create_revision: ba393198430278b6595976de84fe170f553cc728
20
+      base_revision: ba393198430278b6595976de84fe170f553cc728
21
+    - platform: ios
22
+      create_revision: ba393198430278b6595976de84fe170f553cc728
23
+      base_revision: ba393198430278b6595976de84fe170f553cc728
24
+    - platform: linux
25
+      create_revision: ba393198430278b6595976de84fe170f553cc728
26
+      base_revision: ba393198430278b6595976de84fe170f553cc728
27
+    - platform: macos
28
+      create_revision: ba393198430278b6595976de84fe170f553cc728
29
+      base_revision: ba393198430278b6595976de84fe170f553cc728
30
+    - platform: web
31
+      create_revision: ba393198430278b6595976de84fe170f553cc728
32
+      base_revision: ba393198430278b6595976de84fe170f553cc728
33
+    - platform: windows
34
+      create_revision: ba393198430278b6595976de84fe170f553cc728
35
+      base_revision: ba393198430278b6595976de84fe170f553cc728
36
+
37
+  # User provided section
38
+
39
+  # List of Local paths (relative to this file) that should be
40
+  # ignored by the migrate tool.
41
+  #
42
+  # Files that are not part of the templates will be ignored by default.
43
+  unmanaged_files:
44
+    - 'lib/main.dart'
45
+    - 'ios/Runner.xcodeproj/project.pbxproj'

+ 16 - 0
README.md

@@ -0,0 +1,16 @@
1
+# flutter_canvas_editor
2
+
3
+A new Flutter project.
4
+
5
+## Getting Started
6
+
7
+This project is a starting point for a Flutter application.
8
+
9
+A few resources to get you started if this is your first Flutter project:
10
+
11
+- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
12
+- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
13
+
14
+For help getting started with Flutter development, view the
15
+[online documentation](https://docs.flutter.dev/), which offers tutorials,
16
+samples, guidance on mobile development, and a full API reference.

+ 28 - 0
analysis_options.yaml

@@ -0,0 +1,28 @@
1
+# This file configures the analyzer, which statically analyzes Dart code to
2
+# check for errors, warnings, and lints.
3
+#
4
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6
+# invoked from the command line by running `flutter analyze`.
7
+
8
+# The following line activates a set of recommended lints for Flutter apps,
9
+# packages, and plugins designed to encourage good coding practices.
10
+include: package:flutter_lints/flutter.yaml
11
+
12
+linter:
13
+  # The lint rules applied to this project can be customized in the
14
+  # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15
+  # included above or to enable additional rules. A list of all available lints
16
+  # and their documentation is published at https://dart.dev/lints.
17
+  #
18
+  # Instead of disabling a lint rule for the entire project in the
19
+  # section below, it can also be suppressed for a single line of code
20
+  # or a specific dart file by using the `// ignore: name_of_lint` and
21
+  # `// ignore_for_file: name_of_lint` syntax on the line or in the file
22
+  # producing the lint.
23
+  rules:
24
+    # avoid_print: false  # Uncomment to disable the `avoid_print` rule
25
+    # prefer_single_quotes: true  # Uncomment to enable the `prefer_single_quotes` rule
26
+
27
+# Additional information about this file can be found at
28
+# https://dart.dev/guides/language/analysis-options

+ 13 - 0
android/.gitignore

@@ -0,0 +1,13 @@
1
+gradle-wrapper.jar
2
+/.gradle
3
+/captures/
4
+/gradlew
5
+/gradlew.bat
6
+/local.properties
7
+GeneratedPluginRegistrant.java
8
+
9
+# Remember to never publicly share your keystore.
10
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11
+key.properties
12
+**/*.keystore
13
+**/*.jks

+ 67 - 0
android/app/build.gradle

@@ -0,0 +1,67 @@
1
+plugins {
2
+    id "com.android.application"
3
+    id "kotlin-android"
4
+    id "dev.flutter.flutter-gradle-plugin"
5
+}
6
+
7
+def localProperties = new Properties()
8
+def localPropertiesFile = rootProject.file('local.properties')
9
+if (localPropertiesFile.exists()) {
10
+    localPropertiesFile.withReader('UTF-8') { reader ->
11
+        localProperties.load(reader)
12
+    }
13
+}
14
+
15
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
16
+if (flutterVersionCode == null) {
17
+    flutterVersionCode = '1'
18
+}
19
+
20
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
21
+if (flutterVersionName == null) {
22
+    flutterVersionName = '1.0'
23
+}
24
+
25
+android {
26
+    namespace "com.example.flutter_canvas_editor"
27
+    compileSdk flutter.compileSdkVersion
28
+    ndkVersion flutter.ndkVersion
29
+
30
+    compileOptions {
31
+        sourceCompatibility JavaVersion.VERSION_1_8
32
+        targetCompatibility JavaVersion.VERSION_1_8
33
+    }
34
+
35
+    kotlinOptions {
36
+        jvmTarget = '1.8'
37
+    }
38
+
39
+    sourceSets {
40
+        main.java.srcDirs += 'src/main/kotlin'
41
+    }
42
+
43
+    defaultConfig {
44
+        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
45
+        applicationId "com.example.flutter_canvas_editor"
46
+        // You can update the following values to match your application needs.
47
+        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
48
+        minSdkVersion flutter.minSdkVersion
49
+        targetSdkVersion flutter.targetSdkVersion
50
+        versionCode flutterVersionCode.toInteger()
51
+        versionName flutterVersionName
52
+    }
53
+
54
+    buildTypes {
55
+        release {
56
+            // TODO: Add your own signing config for the release build.
57
+            // Signing with the debug keys for now, so `flutter run --release` works.
58
+            signingConfig signingConfigs.debug
59
+        }
60
+    }
61
+}
62
+
63
+flutter {
64
+    source '../..'
65
+}
66
+
67
+dependencies {}

+ 7 - 0
android/app/src/debug/AndroidManifest.xml

@@ -0,0 +1,7 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+    <!-- The INTERNET permission is required for development. Specifically,
3
+         the Flutter tool needs it to communicate with the running application
4
+         to allow setting breakpoints, to provide hot reload, etc.
5
+    -->
6
+    <uses-permission android:name="android.permission.INTERNET"/>
7
+</manifest>

+ 44 - 0
android/app/src/main/AndroidManifest.xml

@@ -0,0 +1,44 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+    <application
3
+        android:label="flutter_canvas_editor"
4
+        android:name="${applicationName}"
5
+        android:icon="@mipmap/ic_launcher">
6
+        <activity
7
+            android:name=".MainActivity"
8
+            android:exported="true"
9
+            android:launchMode="singleTop"
10
+            android:theme="@style/LaunchTheme"
11
+            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
12
+            android:hardwareAccelerated="true"
13
+            android:windowSoftInputMode="adjustResize">
14
+            <!-- Specifies an Android theme to apply to this Activity as soon as
15
+                 the Android process has started. This theme is visible to the user
16
+                 while the Flutter UI initializes. After that, this theme continues
17
+                 to determine the Window background behind the Flutter UI. -->
18
+            <meta-data
19
+              android:name="io.flutter.embedding.android.NormalTheme"
20
+              android:resource="@style/NormalTheme"
21
+              />
22
+            <intent-filter>
23
+                <action android:name="android.intent.action.MAIN"/>
24
+                <category android:name="android.intent.category.LAUNCHER"/>
25
+            </intent-filter>
26
+        </activity>
27
+        <!-- Don't delete the meta-data below.
28
+             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
29
+        <meta-data
30
+            android:name="flutterEmbedding"
31
+            android:value="2" />
32
+    </application>
33
+    <!-- Required to query activities that can process text, see:
34
+         https://developer.android.com/training/package-visibility?hl=en and
35
+         https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
36
+
37
+         In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
38
+    <queries>
39
+        <intent>
40
+            <action android:name="android.intent.action.PROCESS_TEXT"/>
41
+            <data android:mimeType="text/plain"/>
42
+        </intent>
43
+    </queries>
44
+</manifest>

+ 5 - 0
android/app/src/main/kotlin/com/example/flutter_canvas_editor/MainActivity.kt

@@ -0,0 +1,5 @@
1
+package com.example.flutter_canvas_editor
2
+
3
+import io.flutter.embedding.android.FlutterActivity
4
+
5
+class MainActivity: FlutterActivity()

+ 12 - 0
android/app/src/main/res/drawable-v21/launch_background.xml

@@ -0,0 +1,12 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Modify this file to customize your launch splash screen -->
3
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
4
+    <item android:drawable="?android:colorBackground" />
5
+
6
+    <!-- You can insert your own image assets here -->
7
+    <!-- <item>
8
+        <bitmap
9
+            android:gravity="center"
10
+            android:src="@mipmap/launch_image" />
11
+    </item> -->
12
+</layer-list>

+ 12 - 0
android/app/src/main/res/drawable/launch_background.xml

@@ -0,0 +1,12 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<!-- Modify this file to customize your launch splash screen -->
3
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
4
+    <item android:drawable="@android:color/white" />
5
+
6
+    <!-- You can insert your own image assets here -->
7
+    <!-- <item>
8
+        <bitmap
9
+            android:gravity="center"
10
+            android:src="@mipmap/launch_image" />
11
+    </item> -->
12
+</layer-list>

BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png


BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png


+ 18 - 0
android/app/src/main/res/values-night/styles.xml

@@ -0,0 +1,18 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<resources>
3
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
4
+    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
5
+        <!-- Show a splash screen on the activity. Automatically removed when
6
+             the Flutter engine draws its first frame -->
7
+        <item name="android:windowBackground">@drawable/launch_background</item>
8
+    </style>
9
+    <!-- Theme applied to the Android Window as soon as the process has started.
10
+         This theme determines the color of the Android Window while your
11
+         Flutter UI initializes, as well as behind your Flutter UI while its
12
+         running.
13
+
14
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
15
+    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
16
+        <item name="android:windowBackground">?android:colorBackground</item>
17
+    </style>
18
+</resources>

+ 18 - 0
android/app/src/main/res/values/styles.xml

@@ -0,0 +1,18 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<resources>
3
+    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
4
+    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
5
+        <!-- Show a splash screen on the activity. Automatically removed when
6
+             the Flutter engine draws its first frame -->
7
+        <item name="android:windowBackground">@drawable/launch_background</item>
8
+    </style>
9
+    <!-- Theme applied to the Android Window as soon as the process has started.
10
+         This theme determines the color of the Android Window while your
11
+         Flutter UI initializes, as well as behind your Flutter UI while its
12
+         running.
13
+
14
+         This Theme is only used starting with V2 of Flutter's Android embedding. -->
15
+    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
16
+        <item name="android:windowBackground">?android:colorBackground</item>
17
+    </style>
18
+</resources>

+ 7 - 0
android/app/src/profile/AndroidManifest.xml

@@ -0,0 +1,7 @@
1
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+    <!-- The INTERNET permission is required for development. Specifically,
3
+         the Flutter tool needs it to communicate with the running application
4
+         to allow setting breakpoints, to provide hot reload, etc.
5
+    -->
6
+    <uses-permission android:name="android.permission.INTERNET"/>
7
+</manifest>

+ 18 - 0
android/build.gradle

@@ -0,0 +1,18 @@
1
+allprojects {
2
+    repositories {
3
+        google()
4
+        mavenCentral()
5
+    }
6
+}
7
+
8
+rootProject.buildDir = '../build'
9
+subprojects {
10
+    project.buildDir = "${rootProject.buildDir}/${project.name}"
11
+}
12
+subprojects {
13
+    project.evaluationDependsOn(':app')
14
+}
15
+
16
+tasks.register("clean", Delete) {
17
+    delete rootProject.buildDir
18
+}

+ 3 - 0
android/gradle.properties

@@ -0,0 +1,3 @@
1
+org.gradle.jvmargs=-Xmx4G
2
+android.useAndroidX=true
3
+android.enableJetifier=true

+ 5 - 0
android/gradle/wrapper/gradle-wrapper.properties

@@ -0,0 +1,5 @@
1
+distributionBase=GRADLE_USER_HOME
2
+distributionPath=wrapper/dists
3
+zipStoreBase=GRADLE_USER_HOME
4
+zipStorePath=wrapper/dists
5
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-all.zip

+ 26 - 0
android/settings.gradle

@@ -0,0 +1,26 @@
1
+pluginManagement {
2
+    def flutterSdkPath = {
3
+        def properties = new Properties()
4
+        file("local.properties").withInputStream { properties.load(it) }
5
+        def flutterSdkPath = properties.getProperty("flutter.sdk")
6
+        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7
+        return flutterSdkPath
8
+    }
9
+    settings.ext.flutterSdkPath = flutterSdkPath()
10
+
11
+    includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle")
12
+
13
+    repositories {
14
+        google()
15
+        mavenCentral()
16
+        gradlePluginPortal()
17
+    }
18
+}
19
+
20
+plugins {
21
+    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
22
+    id "com.android.application" version "7.3.0" apply false
23
+    id "org.jetbrains.kotlin.android" version "1.7.10" apply false
24
+}
25
+
26
+include ":app"

+ 34 - 0
ios/.gitignore

@@ -0,0 +1,34 @@
1
+**/dgph
2
+*.mode1v3
3
+*.mode2v3
4
+*.moved-aside
5
+*.pbxuser
6
+*.perspectivev3
7
+**/*sync/
8
+.sconsign.dblite
9
+.tags*
10
+**/.vagrant/
11
+**/DerivedData/
12
+Icon?
13
+**/Pods/
14
+**/.symlinks/
15
+profile
16
+xcuserdata
17
+**/.generated/
18
+Flutter/App.framework
19
+Flutter/Flutter.framework
20
+Flutter/Flutter.podspec
21
+Flutter/Generated.xcconfig
22
+Flutter/ephemeral/
23
+Flutter/app.flx
24
+Flutter/app.zip
25
+Flutter/flutter_assets/
26
+Flutter/flutter_export_environment.sh
27
+ServiceDefinitions.json
28
+Runner/GeneratedPluginRegistrant.*
29
+
30
+# Exceptions to above rules.
31
+!default.mode1v3
32
+!default.mode2v3
33
+!default.pbxuser
34
+!default.perspectivev3

+ 26 - 0
ios/Flutter/AppFrameworkInfo.plist

@@ -0,0 +1,26 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+  <key>CFBundleDevelopmentRegion</key>
6
+  <string>en</string>
7
+  <key>CFBundleExecutable</key>
8
+  <string>App</string>
9
+  <key>CFBundleIdentifier</key>
10
+  <string>io.flutter.flutter.app</string>
11
+  <key>CFBundleInfoDictionaryVersion</key>
12
+  <string>6.0</string>
13
+  <key>CFBundleName</key>
14
+  <string>App</string>
15
+  <key>CFBundlePackageType</key>
16
+  <string>FMWK</string>
17
+  <key>CFBundleShortVersionString</key>
18
+  <string>1.0</string>
19
+  <key>CFBundleSignature</key>
20
+  <string>????</string>
21
+  <key>CFBundleVersion</key>
22
+  <string>1.0</string>
23
+  <key>MinimumOSVersion</key>
24
+  <string>12.0</string>
25
+</dict>
26
+</plist>

+ 1 - 0
ios/Flutter/Debug.xcconfig

@@ -0,0 +1 @@
1
+#include "Generated.xcconfig"

+ 1 - 0
ios/Flutter/Release.xcconfig

@@ -0,0 +1 @@
1
+#include "Generated.xcconfig"

+ 616 - 0
ios/Runner.xcodeproj/project.pbxproj

@@ -0,0 +1,616 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 54;
7
+	objects = {
8
+
9
+/* Begin PBXBuildFile section */
10
+		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11
+		331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
12
+		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
13
+		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
14
+		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
15
+		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
16
+		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
17
+/* End PBXBuildFile section */
18
+
19
+/* Begin PBXContainerItemProxy section */
20
+		331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
21
+			isa = PBXContainerItemProxy;
22
+			containerPortal = 97C146E61CF9000F007C117D /* Project object */;
23
+			proxyType = 1;
24
+			remoteGlobalIDString = 97C146ED1CF9000F007C117D;
25
+			remoteInfo = Runner;
26
+		};
27
+/* End PBXContainerItemProxy section */
28
+
29
+/* Begin PBXCopyFilesBuildPhase section */
30
+		9705A1C41CF9048500538489 /* Embed Frameworks */ = {
31
+			isa = PBXCopyFilesBuildPhase;
32
+			buildActionMask = 2147483647;
33
+			dstPath = "";
34
+			dstSubfolderSpec = 10;
35
+			files = (
36
+			);
37
+			name = "Embed Frameworks";
38
+			runOnlyForDeploymentPostprocessing = 0;
39
+		};
40
+/* End PBXCopyFilesBuildPhase section */
41
+
42
+/* Begin PBXFileReference section */
43
+		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
44
+		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
45
+		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
46
+		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
47
+		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
48
+		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
49
+		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
50
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
51
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
52
+		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
53
+		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
54
+		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
55
+		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
56
+		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
57
+		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
58
+/* End PBXFileReference section */
59
+
60
+/* Begin PBXFrameworksBuildPhase section */
61
+		97C146EB1CF9000F007C117D /* Frameworks */ = {
62
+			isa = PBXFrameworksBuildPhase;
63
+			buildActionMask = 2147483647;
64
+			files = (
65
+			);
66
+			runOnlyForDeploymentPostprocessing = 0;
67
+		};
68
+/* End PBXFrameworksBuildPhase section */
69
+
70
+/* Begin PBXGroup section */
71
+		331C8082294A63A400263BE5 /* RunnerTests */ = {
72
+			isa = PBXGroup;
73
+			children = (
74
+				331C807B294A618700263BE5 /* RunnerTests.swift */,
75
+			);
76
+			path = RunnerTests;
77
+			sourceTree = "<group>";
78
+		};
79
+		9740EEB11CF90186004384FC /* Flutter */ = {
80
+			isa = PBXGroup;
81
+			children = (
82
+				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
83
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
84
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
85
+				9740EEB31CF90195004384FC /* Generated.xcconfig */,
86
+			);
87
+			name = Flutter;
88
+			sourceTree = "<group>";
89
+		};
90
+		97C146E51CF9000F007C117D = {
91
+			isa = PBXGroup;
92
+			children = (
93
+				9740EEB11CF90186004384FC /* Flutter */,
94
+				97C146F01CF9000F007C117D /* Runner */,
95
+				97C146EF1CF9000F007C117D /* Products */,
96
+				331C8082294A63A400263BE5 /* RunnerTests */,
97
+			);
98
+			sourceTree = "<group>";
99
+		};
100
+		97C146EF1CF9000F007C117D /* Products */ = {
101
+			isa = PBXGroup;
102
+			children = (
103
+				97C146EE1CF9000F007C117D /* Runner.app */,
104
+				331C8081294A63A400263BE5 /* RunnerTests.xctest */,
105
+			);
106
+			name = Products;
107
+			sourceTree = "<group>";
108
+		};
109
+		97C146F01CF9000F007C117D /* Runner */ = {
110
+			isa = PBXGroup;
111
+			children = (
112
+				97C146FA1CF9000F007C117D /* Main.storyboard */,
113
+				97C146FD1CF9000F007C117D /* Assets.xcassets */,
114
+				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
115
+				97C147021CF9000F007C117D /* Info.plist */,
116
+				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
117
+				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
118
+				74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
119
+				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
120
+			);
121
+			path = Runner;
122
+			sourceTree = "<group>";
123
+		};
124
+/* End PBXGroup section */
125
+
126
+/* Begin PBXNativeTarget section */
127
+		331C8080294A63A400263BE5 /* RunnerTests */ = {
128
+			isa = PBXNativeTarget;
129
+			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
130
+			buildPhases = (
131
+				331C807D294A63A400263BE5 /* Sources */,
132
+				331C807F294A63A400263BE5 /* Resources */,
133
+			);
134
+			buildRules = (
135
+			);
136
+			dependencies = (
137
+				331C8086294A63A400263BE5 /* PBXTargetDependency */,
138
+			);
139
+			name = RunnerTests;
140
+			productName = RunnerTests;
141
+			productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
142
+			productType = "com.apple.product-type.bundle.unit-test";
143
+		};
144
+		97C146ED1CF9000F007C117D /* Runner */ = {
145
+			isa = PBXNativeTarget;
146
+			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
147
+			buildPhases = (
148
+				9740EEB61CF901F6004384FC /* Run Script */,
149
+				97C146EA1CF9000F007C117D /* Sources */,
150
+				97C146EB1CF9000F007C117D /* Frameworks */,
151
+				97C146EC1CF9000F007C117D /* Resources */,
152
+				9705A1C41CF9048500538489 /* Embed Frameworks */,
153
+				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
154
+			);
155
+			buildRules = (
156
+			);
157
+			dependencies = (
158
+			);
159
+			name = Runner;
160
+			productName = Runner;
161
+			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
162
+			productType = "com.apple.product-type.application";
163
+		};
164
+/* End PBXNativeTarget section */
165
+
166
+/* Begin PBXProject section */
167
+		97C146E61CF9000F007C117D /* Project object */ = {
168
+			isa = PBXProject;
169
+			attributes = {
170
+				BuildIndependentTargetsInParallel = YES;
171
+				LastUpgradeCheck = 1510;
172
+				ORGANIZATIONNAME = "";
173
+				TargetAttributes = {
174
+					331C8080294A63A400263BE5 = {
175
+						CreatedOnToolsVersion = 14.0;
176
+						TestTargetID = 97C146ED1CF9000F007C117D;
177
+					};
178
+					97C146ED1CF9000F007C117D = {
179
+						CreatedOnToolsVersion = 7.3.1;
180
+						LastSwiftMigration = 1100;
181
+					};
182
+				};
183
+			};
184
+			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
185
+			compatibilityVersion = "Xcode 9.3";
186
+			developmentRegion = en;
187
+			hasScannedForEncodings = 0;
188
+			knownRegions = (
189
+				en,
190
+				Base,
191
+			);
192
+			mainGroup = 97C146E51CF9000F007C117D;
193
+			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
194
+			projectDirPath = "";
195
+			projectRoot = "";
196
+			targets = (
197
+				97C146ED1CF9000F007C117D /* Runner */,
198
+				331C8080294A63A400263BE5 /* RunnerTests */,
199
+			);
200
+		};
201
+/* End PBXProject section */
202
+
203
+/* Begin PBXResourcesBuildPhase section */
204
+		331C807F294A63A400263BE5 /* Resources */ = {
205
+			isa = PBXResourcesBuildPhase;
206
+			buildActionMask = 2147483647;
207
+			files = (
208
+			);
209
+			runOnlyForDeploymentPostprocessing = 0;
210
+		};
211
+		97C146EC1CF9000F007C117D /* Resources */ = {
212
+			isa = PBXResourcesBuildPhase;
213
+			buildActionMask = 2147483647;
214
+			files = (
215
+				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
216
+				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
217
+				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
218
+				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
219
+			);
220
+			runOnlyForDeploymentPostprocessing = 0;
221
+		};
222
+/* End PBXResourcesBuildPhase section */
223
+
224
+/* Begin PBXShellScriptBuildPhase section */
225
+		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
226
+			isa = PBXShellScriptBuildPhase;
227
+			alwaysOutOfDate = 1;
228
+			buildActionMask = 2147483647;
229
+			files = (
230
+			);
231
+			inputPaths = (
232
+				"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
233
+			);
234
+			name = "Thin Binary";
235
+			outputPaths = (
236
+			);
237
+			runOnlyForDeploymentPostprocessing = 0;
238
+			shellPath = /bin/sh;
239
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
240
+		};
241
+		9740EEB61CF901F6004384FC /* Run Script */ = {
242
+			isa = PBXShellScriptBuildPhase;
243
+			alwaysOutOfDate = 1;
244
+			buildActionMask = 2147483647;
245
+			files = (
246
+			);
247
+			inputPaths = (
248
+			);
249
+			name = "Run Script";
250
+			outputPaths = (
251
+			);
252
+			runOnlyForDeploymentPostprocessing = 0;
253
+			shellPath = /bin/sh;
254
+			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
255
+		};
256
+/* End PBXShellScriptBuildPhase section */
257
+
258
+/* Begin PBXSourcesBuildPhase section */
259
+		331C807D294A63A400263BE5 /* Sources */ = {
260
+			isa = PBXSourcesBuildPhase;
261
+			buildActionMask = 2147483647;
262
+			files = (
263
+				331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
264
+			);
265
+			runOnlyForDeploymentPostprocessing = 0;
266
+		};
267
+		97C146EA1CF9000F007C117D /* Sources */ = {
268
+			isa = PBXSourcesBuildPhase;
269
+			buildActionMask = 2147483647;
270
+			files = (
271
+				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
272
+				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
273
+			);
274
+			runOnlyForDeploymentPostprocessing = 0;
275
+		};
276
+/* End PBXSourcesBuildPhase section */
277
+
278
+/* Begin PBXTargetDependency section */
279
+		331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
280
+			isa = PBXTargetDependency;
281
+			target = 97C146ED1CF9000F007C117D /* Runner */;
282
+			targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
283
+		};
284
+/* End PBXTargetDependency section */
285
+
286
+/* Begin PBXVariantGroup section */
287
+		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
288
+			isa = PBXVariantGroup;
289
+			children = (
290
+				97C146FB1CF9000F007C117D /* Base */,
291
+			);
292
+			name = Main.storyboard;
293
+			sourceTree = "<group>";
294
+		};
295
+		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
296
+			isa = PBXVariantGroup;
297
+			children = (
298
+				97C147001CF9000F007C117D /* Base */,
299
+			);
300
+			name = LaunchScreen.storyboard;
301
+			sourceTree = "<group>";
302
+		};
303
+/* End PBXVariantGroup section */
304
+
305
+/* Begin XCBuildConfiguration section */
306
+		249021D3217E4FDB00AE95B9 /* Profile */ = {
307
+			isa = XCBuildConfiguration;
308
+			buildSettings = {
309
+				ALWAYS_SEARCH_USER_PATHS = NO;
310
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
311
+				CLANG_ANALYZER_NONNULL = YES;
312
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
313
+				CLANG_CXX_LIBRARY = "libc++";
314
+				CLANG_ENABLE_MODULES = YES;
315
+				CLANG_ENABLE_OBJC_ARC = YES;
316
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
317
+				CLANG_WARN_BOOL_CONVERSION = YES;
318
+				CLANG_WARN_COMMA = YES;
319
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
320
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
321
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
322
+				CLANG_WARN_EMPTY_BODY = YES;
323
+				CLANG_WARN_ENUM_CONVERSION = YES;
324
+				CLANG_WARN_INFINITE_RECURSION = YES;
325
+				CLANG_WARN_INT_CONVERSION = YES;
326
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
327
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
328
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
329
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
330
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
331
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
332
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
333
+				CLANG_WARN_UNREACHABLE_CODE = YES;
334
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
335
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
336
+				COPY_PHASE_STRIP = NO;
337
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
338
+				ENABLE_NS_ASSERTIONS = NO;
339
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
340
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
341
+				GCC_C_LANGUAGE_STANDARD = gnu99;
342
+				GCC_NO_COMMON_BLOCKS = YES;
343
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
344
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
345
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
346
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
347
+				GCC_WARN_UNUSED_FUNCTION = YES;
348
+				GCC_WARN_UNUSED_VARIABLE = YES;
349
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
350
+				MTL_ENABLE_DEBUG_INFO = NO;
351
+				SDKROOT = iphoneos;
352
+				SUPPORTED_PLATFORMS = iphoneos;
353
+				TARGETED_DEVICE_FAMILY = "1,2";
354
+				VALIDATE_PRODUCT = YES;
355
+			};
356
+			name = Profile;
357
+		};
358
+		249021D4217E4FDB00AE95B9 /* Profile */ = {
359
+			isa = XCBuildConfiguration;
360
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
361
+			buildSettings = {
362
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
363
+				CLANG_ENABLE_MODULES = YES;
364
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
365
+				ENABLE_BITCODE = NO;
366
+				INFOPLIST_FILE = Runner/Info.plist;
367
+				LD_RUNPATH_SEARCH_PATHS = (
368
+					"$(inherited)",
369
+					"@executable_path/Frameworks",
370
+				);
371
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor;
372
+				PRODUCT_NAME = "$(TARGET_NAME)";
373
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
374
+				SWIFT_VERSION = 5.0;
375
+				VERSIONING_SYSTEM = "apple-generic";
376
+			};
377
+			name = Profile;
378
+		};
379
+		331C8088294A63A400263BE5 /* Debug */ = {
380
+			isa = XCBuildConfiguration;
381
+			buildSettings = {
382
+				BUNDLE_LOADER = "$(TEST_HOST)";
383
+				CODE_SIGN_STYLE = Automatic;
384
+				CURRENT_PROJECT_VERSION = 1;
385
+				GENERATE_INFOPLIST_FILE = YES;
386
+				MARKETING_VERSION = 1.0;
387
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
388
+				PRODUCT_NAME = "$(TARGET_NAME)";
389
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
390
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
391
+				SWIFT_VERSION = 5.0;
392
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
393
+			};
394
+			name = Debug;
395
+		};
396
+		331C8089294A63A400263BE5 /* Release */ = {
397
+			isa = XCBuildConfiguration;
398
+			buildSettings = {
399
+				BUNDLE_LOADER = "$(TEST_HOST)";
400
+				CODE_SIGN_STYLE = Automatic;
401
+				CURRENT_PROJECT_VERSION = 1;
402
+				GENERATE_INFOPLIST_FILE = YES;
403
+				MARKETING_VERSION = 1.0;
404
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
405
+				PRODUCT_NAME = "$(TARGET_NAME)";
406
+				SWIFT_VERSION = 5.0;
407
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
408
+			};
409
+			name = Release;
410
+		};
411
+		331C808A294A63A400263BE5 /* Profile */ = {
412
+			isa = XCBuildConfiguration;
413
+			buildSettings = {
414
+				BUNDLE_LOADER = "$(TEST_HOST)";
415
+				CODE_SIGN_STYLE = Automatic;
416
+				CURRENT_PROJECT_VERSION = 1;
417
+				GENERATE_INFOPLIST_FILE = YES;
418
+				MARKETING_VERSION = 1.0;
419
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
420
+				PRODUCT_NAME = "$(TARGET_NAME)";
421
+				SWIFT_VERSION = 5.0;
422
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
423
+			};
424
+			name = Profile;
425
+		};
426
+		97C147031CF9000F007C117D /* Debug */ = {
427
+			isa = XCBuildConfiguration;
428
+			buildSettings = {
429
+				ALWAYS_SEARCH_USER_PATHS = NO;
430
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
431
+				CLANG_ANALYZER_NONNULL = YES;
432
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
433
+				CLANG_CXX_LIBRARY = "libc++";
434
+				CLANG_ENABLE_MODULES = YES;
435
+				CLANG_ENABLE_OBJC_ARC = YES;
436
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
437
+				CLANG_WARN_BOOL_CONVERSION = YES;
438
+				CLANG_WARN_COMMA = YES;
439
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
440
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
441
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
442
+				CLANG_WARN_EMPTY_BODY = YES;
443
+				CLANG_WARN_ENUM_CONVERSION = YES;
444
+				CLANG_WARN_INFINITE_RECURSION = YES;
445
+				CLANG_WARN_INT_CONVERSION = YES;
446
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
447
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
448
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
449
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
450
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
451
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
452
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
453
+				CLANG_WARN_UNREACHABLE_CODE = YES;
454
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
455
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
456
+				COPY_PHASE_STRIP = NO;
457
+				DEBUG_INFORMATION_FORMAT = dwarf;
458
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
459
+				ENABLE_TESTABILITY = YES;
460
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
461
+				GCC_C_LANGUAGE_STANDARD = gnu99;
462
+				GCC_DYNAMIC_NO_PIC = NO;
463
+				GCC_NO_COMMON_BLOCKS = YES;
464
+				GCC_OPTIMIZATION_LEVEL = 0;
465
+				GCC_PREPROCESSOR_DEFINITIONS = (
466
+					"DEBUG=1",
467
+					"$(inherited)",
468
+				);
469
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
470
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
471
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
472
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
473
+				GCC_WARN_UNUSED_FUNCTION = YES;
474
+				GCC_WARN_UNUSED_VARIABLE = YES;
475
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
476
+				MTL_ENABLE_DEBUG_INFO = YES;
477
+				ONLY_ACTIVE_ARCH = YES;
478
+				SDKROOT = iphoneos;
479
+				TARGETED_DEVICE_FAMILY = "1,2";
480
+			};
481
+			name = Debug;
482
+		};
483
+		97C147041CF9000F007C117D /* Release */ = {
484
+			isa = XCBuildConfiguration;
485
+			buildSettings = {
486
+				ALWAYS_SEARCH_USER_PATHS = NO;
487
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
488
+				CLANG_ANALYZER_NONNULL = YES;
489
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
490
+				CLANG_CXX_LIBRARY = "libc++";
491
+				CLANG_ENABLE_MODULES = YES;
492
+				CLANG_ENABLE_OBJC_ARC = YES;
493
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
494
+				CLANG_WARN_BOOL_CONVERSION = YES;
495
+				CLANG_WARN_COMMA = YES;
496
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
497
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
498
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
499
+				CLANG_WARN_EMPTY_BODY = YES;
500
+				CLANG_WARN_ENUM_CONVERSION = YES;
501
+				CLANG_WARN_INFINITE_RECURSION = YES;
502
+				CLANG_WARN_INT_CONVERSION = YES;
503
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
504
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
505
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
506
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
507
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
508
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
509
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
510
+				CLANG_WARN_UNREACHABLE_CODE = YES;
511
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
512
+				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
513
+				COPY_PHASE_STRIP = NO;
514
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
515
+				ENABLE_NS_ASSERTIONS = NO;
516
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
517
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
518
+				GCC_C_LANGUAGE_STANDARD = gnu99;
519
+				GCC_NO_COMMON_BLOCKS = YES;
520
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
521
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
522
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
523
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
524
+				GCC_WARN_UNUSED_FUNCTION = YES;
525
+				GCC_WARN_UNUSED_VARIABLE = YES;
526
+				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
527
+				MTL_ENABLE_DEBUG_INFO = NO;
528
+				SDKROOT = iphoneos;
529
+				SUPPORTED_PLATFORMS = iphoneos;
530
+				SWIFT_COMPILATION_MODE = wholemodule;
531
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
532
+				TARGETED_DEVICE_FAMILY = "1,2";
533
+				VALIDATE_PRODUCT = YES;
534
+			};
535
+			name = Release;
536
+		};
537
+		97C147061CF9000F007C117D /* Debug */ = {
538
+			isa = XCBuildConfiguration;
539
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
540
+			buildSettings = {
541
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
542
+				CLANG_ENABLE_MODULES = YES;
543
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
544
+				ENABLE_BITCODE = NO;
545
+				INFOPLIST_FILE = Runner/Info.plist;
546
+				LD_RUNPATH_SEARCH_PATHS = (
547
+					"$(inherited)",
548
+					"@executable_path/Frameworks",
549
+				);
550
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor;
551
+				PRODUCT_NAME = "$(TARGET_NAME)";
552
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
553
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
554
+				SWIFT_VERSION = 5.0;
555
+				VERSIONING_SYSTEM = "apple-generic";
556
+			};
557
+			name = Debug;
558
+		};
559
+		97C147071CF9000F007C117D /* Release */ = {
560
+			isa = XCBuildConfiguration;
561
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
562
+			buildSettings = {
563
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
564
+				CLANG_ENABLE_MODULES = YES;
565
+				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
566
+				ENABLE_BITCODE = NO;
567
+				INFOPLIST_FILE = Runner/Info.plist;
568
+				LD_RUNPATH_SEARCH_PATHS = (
569
+					"$(inherited)",
570
+					"@executable_path/Frameworks",
571
+				);
572
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor;
573
+				PRODUCT_NAME = "$(TARGET_NAME)";
574
+				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
575
+				SWIFT_VERSION = 5.0;
576
+				VERSIONING_SYSTEM = "apple-generic";
577
+			};
578
+			name = Release;
579
+		};
580
+/* End XCBuildConfiguration section */
581
+
582
+/* Begin XCConfigurationList section */
583
+		331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
584
+			isa = XCConfigurationList;
585
+			buildConfigurations = (
586
+				331C8088294A63A400263BE5 /* Debug */,
587
+				331C8089294A63A400263BE5 /* Release */,
588
+				331C808A294A63A400263BE5 /* Profile */,
589
+			);
590
+			defaultConfigurationIsVisible = 0;
591
+			defaultConfigurationName = Release;
592
+		};
593
+		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
594
+			isa = XCConfigurationList;
595
+			buildConfigurations = (
596
+				97C147031CF9000F007C117D /* Debug */,
597
+				97C147041CF9000F007C117D /* Release */,
598
+				249021D3217E4FDB00AE95B9 /* Profile */,
599
+			);
600
+			defaultConfigurationIsVisible = 0;
601
+			defaultConfigurationName = Release;
602
+		};
603
+		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
604
+			isa = XCConfigurationList;
605
+			buildConfigurations = (
606
+				97C147061CF9000F007C117D /* Debug */,
607
+				97C147071CF9000F007C117D /* Release */,
608
+				249021D4217E4FDB00AE95B9 /* Profile */,
609
+			);
610
+			defaultConfigurationIsVisible = 0;
611
+			defaultConfigurationName = Release;
612
+		};
613
+/* End XCConfigurationList section */
614
+	};
615
+	rootObject = 97C146E61CF9000F007C117D /* Project object */;
616
+}

+ 7 - 0
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "self:">
6
+   </FileRef>
7
+</Workspace>

+ 8 - 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 8 - 0
ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>PreviewsEnabled</key>
6
+	<false/>
7
+</dict>
8
+</plist>

+ 98 - 0
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

@@ -0,0 +1,98 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "1510"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "97C146ED1CF9000F007C117D"
18
+               BuildableName = "Runner.app"
19
+               BlueprintName = "Runner"
20
+               ReferencedContainer = "container:Runner.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+      </BuildActionEntries>
24
+   </BuildAction>
25
+   <TestAction
26
+      buildConfiguration = "Debug"
27
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+      shouldUseLaunchSchemeArgsEnv = "YES">
30
+      <MacroExpansion>
31
+         <BuildableReference
32
+            BuildableIdentifier = "primary"
33
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
34
+            BuildableName = "Runner.app"
35
+            BlueprintName = "Runner"
36
+            ReferencedContainer = "container:Runner.xcodeproj">
37
+         </BuildableReference>
38
+      </MacroExpansion>
39
+      <Testables>
40
+         <TestableReference
41
+            skipped = "NO"
42
+            parallelizable = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "331C8080294A63A400263BE5"
46
+               BuildableName = "RunnerTests.xctest"
47
+               BlueprintName = "RunnerTests"
48
+               ReferencedContainer = "container:Runner.xcodeproj">
49
+            </BuildableReference>
50
+         </TestableReference>
51
+      </Testables>
52
+   </TestAction>
53
+   <LaunchAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      launchStyle = "0"
58
+      useCustomWorkingDirectory = "NO"
59
+      ignoresPersistentStateOnLaunch = "NO"
60
+      debugDocumentVersioning = "YES"
61
+      debugServiceExtension = "internal"
62
+      allowLocationSimulation = "YES">
63
+      <BuildableProductRunnable
64
+         runnableDebuggingMode = "0">
65
+         <BuildableReference
66
+            BuildableIdentifier = "primary"
67
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
68
+            BuildableName = "Runner.app"
69
+            BlueprintName = "Runner"
70
+            ReferencedContainer = "container:Runner.xcodeproj">
71
+         </BuildableReference>
72
+      </BuildableProductRunnable>
73
+   </LaunchAction>
74
+   <ProfileAction
75
+      buildConfiguration = "Profile"
76
+      shouldUseLaunchSchemeArgsEnv = "YES"
77
+      savedToolIdentifier = ""
78
+      useCustomWorkingDirectory = "NO"
79
+      debugDocumentVersioning = "YES">
80
+      <BuildableProductRunnable
81
+         runnableDebuggingMode = "0">
82
+         <BuildableReference
83
+            BuildableIdentifier = "primary"
84
+            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
85
+            BuildableName = "Runner.app"
86
+            BlueprintName = "Runner"
87
+            ReferencedContainer = "container:Runner.xcodeproj">
88
+         </BuildableReference>
89
+      </BuildableProductRunnable>
90
+   </ProfileAction>
91
+   <AnalyzeAction
92
+      buildConfiguration = "Debug">
93
+   </AnalyzeAction>
94
+   <ArchiveAction
95
+      buildConfiguration = "Release"
96
+      revealArchiveInOrganizer = "YES">
97
+   </ArchiveAction>
98
+</Scheme>

+ 7 - 0
ios/Runner.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:Runner.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

+ 8 - 0
ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 8 - 0
ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>PreviewsEnabled</key>
6
+	<false/>
7
+</dict>
8
+</plist>

+ 13 - 0
ios/Runner/AppDelegate.swift

@@ -0,0 +1,13 @@
1
+import UIKit
2
+import Flutter
3
+
4
+@UIApplicationMain
5
+@objc class AppDelegate: FlutterAppDelegate {
6
+  override func application(
7
+    _ application: UIApplication,
8
+    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9
+  ) -> Bool {
10
+    GeneratedPluginRegistrant.register(with: self)
11
+    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12
+  }
13
+}

+ 122 - 0
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,122 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "size" : "20x20",
5
+      "idiom" : "iphone",
6
+      "filename" : "Icon-App-20x20@2x.png",
7
+      "scale" : "2x"
8
+    },
9
+    {
10
+      "size" : "20x20",
11
+      "idiom" : "iphone",
12
+      "filename" : "Icon-App-20x20@3x.png",
13
+      "scale" : "3x"
14
+    },
15
+    {
16
+      "size" : "29x29",
17
+      "idiom" : "iphone",
18
+      "filename" : "Icon-App-29x29@1x.png",
19
+      "scale" : "1x"
20
+    },
21
+    {
22
+      "size" : "29x29",
23
+      "idiom" : "iphone",
24
+      "filename" : "Icon-App-29x29@2x.png",
25
+      "scale" : "2x"
26
+    },
27
+    {
28
+      "size" : "29x29",
29
+      "idiom" : "iphone",
30
+      "filename" : "Icon-App-29x29@3x.png",
31
+      "scale" : "3x"
32
+    },
33
+    {
34
+      "size" : "40x40",
35
+      "idiom" : "iphone",
36
+      "filename" : "Icon-App-40x40@2x.png",
37
+      "scale" : "2x"
38
+    },
39
+    {
40
+      "size" : "40x40",
41
+      "idiom" : "iphone",
42
+      "filename" : "Icon-App-40x40@3x.png",
43
+      "scale" : "3x"
44
+    },
45
+    {
46
+      "size" : "60x60",
47
+      "idiom" : "iphone",
48
+      "filename" : "Icon-App-60x60@2x.png",
49
+      "scale" : "2x"
50
+    },
51
+    {
52
+      "size" : "60x60",
53
+      "idiom" : "iphone",
54
+      "filename" : "Icon-App-60x60@3x.png",
55
+      "scale" : "3x"
56
+    },
57
+    {
58
+      "size" : "20x20",
59
+      "idiom" : "ipad",
60
+      "filename" : "Icon-App-20x20@1x.png",
61
+      "scale" : "1x"
62
+    },
63
+    {
64
+      "size" : "20x20",
65
+      "idiom" : "ipad",
66
+      "filename" : "Icon-App-20x20@2x.png",
67
+      "scale" : "2x"
68
+    },
69
+    {
70
+      "size" : "29x29",
71
+      "idiom" : "ipad",
72
+      "filename" : "Icon-App-29x29@1x.png",
73
+      "scale" : "1x"
74
+    },
75
+    {
76
+      "size" : "29x29",
77
+      "idiom" : "ipad",
78
+      "filename" : "Icon-App-29x29@2x.png",
79
+      "scale" : "2x"
80
+    },
81
+    {
82
+      "size" : "40x40",
83
+      "idiom" : "ipad",
84
+      "filename" : "Icon-App-40x40@1x.png",
85
+      "scale" : "1x"
86
+    },
87
+    {
88
+      "size" : "40x40",
89
+      "idiom" : "ipad",
90
+      "filename" : "Icon-App-40x40@2x.png",
91
+      "scale" : "2x"
92
+    },
93
+    {
94
+      "size" : "76x76",
95
+      "idiom" : "ipad",
96
+      "filename" : "Icon-App-76x76@1x.png",
97
+      "scale" : "1x"
98
+    },
99
+    {
100
+      "size" : "76x76",
101
+      "idiom" : "ipad",
102
+      "filename" : "Icon-App-76x76@2x.png",
103
+      "scale" : "2x"
104
+    },
105
+    {
106
+      "size" : "83.5x83.5",
107
+      "idiom" : "ipad",
108
+      "filename" : "Icon-App-83.5x83.5@2x.png",
109
+      "scale" : "2x"
110
+    },
111
+    {
112
+      "size" : "1024x1024",
113
+      "idiom" : "ios-marketing",
114
+      "filename" : "Icon-App-1024x1024@1x.png",
115
+      "scale" : "1x"
116
+    }
117
+  ],
118
+  "info" : {
119
+    "version" : 1,
120
+    "author" : "xcode"
121
+  }
122
+}

BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png


BIN
ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png


+ 23 - 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json

@@ -0,0 +1,23 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "universal",
5
+      "filename" : "LaunchImage.png",
6
+      "scale" : "1x"
7
+    },
8
+    {
9
+      "idiom" : "universal",
10
+      "filename" : "LaunchImage@2x.png",
11
+      "scale" : "2x"
12
+    },
13
+    {
14
+      "idiom" : "universal",
15
+      "filename" : "LaunchImage@3x.png",
16
+      "scale" : "3x"
17
+    }
18
+  ],
19
+  "info" : {
20
+    "version" : 1,
21
+    "author" : "xcode"
22
+  }
23
+}

BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png


BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png


BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png


+ 5 - 0
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md

@@ -0,0 +1,5 @@
1
+# Launch Screen Assets
2
+
3
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4
+
5
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

+ 37 - 0
ios/Runner/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,37 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
6
+    </dependencies>
7
+    <scenes>
8
+        <!--View Controller-->
9
+        <scene sceneID="EHf-IW-A2E">
10
+            <objects>
11
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
12
+                    <layoutGuides>
13
+                        <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
14
+                        <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
15
+                    </layoutGuides>
16
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
17
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
18
+                        <subviews>
19
+                            <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
20
+                            </imageView>
21
+                        </subviews>
22
+                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
23
+                        <constraints>
24
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
25
+                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
26
+                        </constraints>
27
+                    </view>
28
+                </viewController>
29
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
30
+            </objects>
31
+            <point key="canvasLocation" x="53" y="375"/>
32
+        </scene>
33
+    </scenes>
34
+    <resources>
35
+        <image name="LaunchImage" width="168" height="185"/>
36
+    </resources>
37
+</document>

+ 26 - 0
ios/Runner/Base.lproj/Main.storyboard

@@ -0,0 +1,26 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
3
+    <dependencies>
4
+        <deployment identifier="iOS"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
6
+    </dependencies>
7
+    <scenes>
8
+        <!--Flutter View Controller-->
9
+        <scene sceneID="tne-QT-ifu">
10
+            <objects>
11
+                <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
12
+                    <layoutGuides>
13
+                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
14
+                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
15
+                    </layoutGuides>
16
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
17
+                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
18
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
19
+                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
20
+                    </view>
21
+                </viewController>
22
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
23
+            </objects>
24
+        </scene>
25
+    </scenes>
26
+</document>

+ 49 - 0
ios/Runner/Info.plist

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>CFBundleDevelopmentRegion</key>
6
+	<string>$(DEVELOPMENT_LANGUAGE)</string>
7
+	<key>CFBundleDisplayName</key>
8
+	<string>Flutter Canvas Editor</string>
9
+	<key>CFBundleExecutable</key>
10
+	<string>$(EXECUTABLE_NAME)</string>
11
+	<key>CFBundleIdentifier</key>
12
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
13
+	<key>CFBundleInfoDictionaryVersion</key>
14
+	<string>6.0</string>
15
+	<key>CFBundleName</key>
16
+	<string>flutter_canvas_editor</string>
17
+	<key>CFBundlePackageType</key>
18
+	<string>APPL</string>
19
+	<key>CFBundleShortVersionString</key>
20
+	<string>$(FLUTTER_BUILD_NAME)</string>
21
+	<key>CFBundleSignature</key>
22
+	<string>????</string>
23
+	<key>CFBundleVersion</key>
24
+	<string>$(FLUTTER_BUILD_NUMBER)</string>
25
+	<key>LSRequiresIPhoneOS</key>
26
+	<true/>
27
+	<key>UILaunchStoryboardName</key>
28
+	<string>LaunchScreen</string>
29
+	<key>UIMainStoryboardFile</key>
30
+	<string>Main</string>
31
+	<key>UISupportedInterfaceOrientations</key>
32
+	<array>
33
+		<string>UIInterfaceOrientationPortrait</string>
34
+		<string>UIInterfaceOrientationLandscapeLeft</string>
35
+		<string>UIInterfaceOrientationLandscapeRight</string>
36
+	</array>
37
+	<key>UISupportedInterfaceOrientations~ipad</key>
38
+	<array>
39
+		<string>UIInterfaceOrientationPortrait</string>
40
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
41
+		<string>UIInterfaceOrientationLandscapeLeft</string>
42
+		<string>UIInterfaceOrientationLandscapeRight</string>
43
+	</array>
44
+	<key>CADisableMinimumFrameDurationOnPhone</key>
45
+	<true/>
46
+	<key>UIApplicationSupportsIndirectInputEvents</key>
47
+	<true/>
48
+</dict>
49
+</plist>

+ 1 - 0
ios/Runner/Runner-Bridging-Header.h

@@ -0,0 +1 @@
1
+#import "GeneratedPluginRegistrant.h"

+ 12 - 0
ios/RunnerTests/RunnerTests.swift

@@ -0,0 +1,12 @@
1
+import Flutter
2
+import UIKit
3
+import XCTest
4
+
5
+class RunnerTests: XCTestCase {
6
+
7
+  func testExample() {
8
+    // If you add code to the Runner application, consider adding tests here.
9
+    // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
10
+  }
11
+
12
+}

+ 78 - 0
lib/arc_curves_painter.dart

@@ -0,0 +1,78 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+import 'dart:math' as math;
30
+
31
+import 'package:flutter/material.dart';
32
+
33
+class ArcsCurvesPainter extends CustomPainter {
34
+  final curvesPaint = Paint()
35
+    ..strokeWidth = 5
36
+    ..color = Colors.greenAccent[700]!
37
+    ..style = PaintingStyle.stroke;
38
+
39
+  @override
40
+  void paint(Canvas canvas, Size size) {
41
+    const arcCenter = Offset(200, 80);
42
+    final arcRect = Rect.fromCircle(center: arcCenter, radius: 75);
43
+    final startAngle = degreesToRadians(10);
44
+    final sweepAngle = degreesToRadians(-90);
45
+    canvas.drawArc(arcRect, startAngle, sweepAngle, false, curvesPaint);
46
+
47
+    // Quadratic Bézier
48
+    final qCurve1 = Path()
49
+      ..moveTo(50, 150)
50
+      ..relativeQuadraticBezierTo(100, -100, 300, 0);
51
+    canvas.drawPath(qCurve1, curvesPaint..color = Colors.deepPurpleAccent);
52
+
53
+    final qCurve2 = Path()
54
+      ..moveTo(0, 150)
55
+      ..relativeQuadraticBezierTo(150, 300, 300, 100);
56
+    canvas.drawPath(qCurve2, curvesPaint..color = Colors.blue);
57
+
58
+    // Cubic Bézier
59
+    final cCurve1 = Path()
60
+      ..moveTo(0, 450)
61
+      ..relativeCubicTo(50, -100, 250, -100, 300, 0);
62
+    canvas.drawPath(cCurve1, curvesPaint..color = Colors.black);
63
+
64
+    final cCurve2 = Path()
65
+      ..moveTo(380, 300)
66
+      ..relativeCubicTo(0, 450, -300, 300, -150, 250);
67
+    canvas.drawPath(cCurve2, curvesPaint..color = Colors.pink);
68
+
69
+
70
+  }
71
+
72
+  @override
73
+  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
74
+
75
+  double degreesToRadians(double degrees) {
76
+    return (degrees * math.pi) / 180;
77
+  }
78
+}

+ 73 - 0
lib/battery/animated_battery.dart

@@ -0,0 +1,73 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+
30
+import 'battery_painter.dart';
31
+import 'package:flutter/material.dart';
32
+
33
+class AnimatedBattery extends StatefulWidget {
34
+
35
+  const AnimatedBattery({Key? key}) : super(key: key);
36
+
37
+  @override
38
+  _AnimatedBatteryState createState() => _AnimatedBatteryState();
39
+}
40
+
41
+class _AnimatedBatteryState extends State<AnimatedBattery>
42
+    with SingleTickerProviderStateMixin {
43
+  final duration = const Duration(seconds: 5);
44
+  late AnimationController _ctrl;
45
+
46
+  @override
47
+  void initState() {
48
+    _ctrl = AnimationController(duration: duration, vsync: this)
49
+      ..addListener(() => setState(() {}))
50
+      ..forward()
51
+      ..addStatusListener((status) {
52
+        if (status == AnimationStatus.completed) {
53
+          _ctrl.reverse();
54
+        } else if (status == AnimationStatus.dismissed) {
55
+          _ctrl.forward();
56
+        }
57
+      });
58
+    super.initState();
59
+  }
60
+
61
+  @override
62
+  Widget build(BuildContext context) {
63
+    return CustomPaint(
64
+      painter: BatteryPainter(charge: _ctrl.value),
65
+    );
66
+  }
67
+
68
+  @override
69
+  void dispose() {
70
+    _ctrl.dispose();
71
+    super.dispose();
72
+  }
73
+}

+ 120 - 0
lib/battery/battery_painter.dart

@@ -0,0 +1,120 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+
30
+import 'package:flutter/material.dart';
31
+import 'dart:math' as math;
32
+
33
+class BatteryPainter extends CustomPainter {
34
+  final margin = 30.0; // The space between the battery and the parent widget
35
+  final padding = 10.0; // The space between the charge & pin and the border
36
+  final pinWidth = 22.0; // The width of the pin
37
+  final minCharge = 0.2; // The minimum charge until the battery disappears
38
+  final double charge;
39
+  final borderPaint = Paint()
40
+    ..color = Colors.black
41
+    ..strokeWidth = 4
42
+    ..isAntiAlias = true
43
+    ..style = PaintingStyle.stroke;
44
+
45
+  final pinPaint = Paint()
46
+    ..color = Colors.black
47
+    ..isAntiAlias = true
48
+    ..style = PaintingStyle.fill;
49
+
50
+  final chargePaint = Paint()
51
+    ..color = Colors.greenAccent[700]!
52
+    ..isAntiAlias = true
53
+    ..style = PaintingStyle.fill;
54
+
55
+  BatteryPainter({required this.charge});
56
+
57
+  @override
58
+  void paint(Canvas canvas, Size size) {
59
+    RRect _borderRRect(Size size) {
60
+      // 1
61
+      final symmetricalMargin = margin * 2;
62
+      // 2
63
+      final width = size.width - symmetricalMargin - padding - pinWidth;
64
+      // 3
65
+      final height = width / 2;
66
+      // 4
67
+      final top = (size.height / 2) - (height / 2);
68
+      // 5
69
+      final radius = Radius.circular(height * 0.2);
70
+      // 6
71
+      final bounds = Rect.fromLTWH(margin, top, width, height);
72
+      // 7
73
+      return RRect.fromRectAndRadius(bounds, radius);
74
+    }
75
+
76
+    final bdr = _borderRRect(size);
77
+    canvas.drawRRect(bdr, borderPaint);
78
+
79
+    Rect _pinRect(RRect bdr) {
80
+      // 1
81
+      final center = Offset(bdr.right + padding, bdr.top + (bdr.height / 2.0));
82
+      // 2
83
+      final height = bdr.height * 0.38;
84
+      // 3
85
+      final width = pinWidth * 2;
86
+      // 4
87
+      return Rect.fromCenter(center: center, width: width, height: height);
88
+    
89
+    }
90
+
91
+    // Battery pin
92
+    final pinRect = _pinRect(bdr);
93
+    canvas.drawArc(pinRect, math.pi / 2, -math.pi, true, pinPaint);
94
+
95
+    RRect _chargeRRect(RRect bdr) {
96
+        final percent = minCharge * ((charge / minCharge).round());
97
+
98
+        final left = bdr.left + padding;
99
+        final top = bdr.top + padding;
100
+        final right = bdr.right - padding;
101
+        final bottom = bdr.bottom - padding;
102
+        final height = bottom - top;
103
+        final width = right - left;
104
+        final radius = Radius.circular(height * 0.15);
105
+        final rect = Rect.fromLTWH(left, top, width * percent, height);
106
+        return RRect.fromRectAndRadius(rect, radius);
107
+    }
108
+
109
+    // Battery charge progress
110
+    final chargeRRect = _chargeRRect(bdr);
111
+    canvas.drawRRect(chargeRRect, chargePaint);
112
+
113
+
114
+  }
115
+
116
+  @override
117
+  bool shouldRepaint(covariant BatteryPainter oldDelegate) {
118
+    return oldDelegate.charge != charge;
119
+  }
120
+}

+ 51 - 0
lib/common/common_scaffold.dart

@@ -0,0 +1,51 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+
30
+import 'package:flutter/material.dart';
31
+
32
+class CommonScaffold extends StatelessWidget {
33
+  final String title;
34
+  final Widget child;
35
+
36
+  const CommonScaffold({required this.title, required this.child, Key? key})
37
+      : super(key: key);
38
+
39
+  @override
40
+  Widget build(BuildContext context) {
41
+    return Scaffold(
42
+      backgroundColor: Colors.white,
43
+      appBar: AppBar(
44
+        backgroundColor: Colors.white,
45
+        foregroundColor: Colors.black,
46
+        title: Text(title),
47
+      ),
48
+      body: SizedBox.expand(child: child),
49
+    );
50
+  }
51
+}

+ 66 - 0
lib/grid/grid_painter.dart

@@ -0,0 +1,66 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+import 'package:flutter/material.dart';
30
+
31
+class GridPainter extends CustomPainter {
32
+  final double boxSize = 50;
33
+
34
+  @override
35
+  void paint(Canvas canvas, Size size) {
36
+    final vLines = (size.width ~/ boxSize) + 1;
37
+    final hLines = (size.height ~/ boxSize) + 1;
38
+
39
+    final paint = Paint()
40
+      ..strokeWidth = 1
41
+      ..color = Colors.red
42
+      ..style = PaintingStyle.stroke;
43
+
44
+    final path = Path();
45
+
46
+    // Draw vertical lines
47
+    for (var i = 0; i < vLines; ++i) {
48
+      final x = boxSize * i;
49
+      path.moveTo(x, 0);
50
+      path.relativeLineTo(0, size.height);
51
+    }
52
+
53
+    // Draw horizontal lines
54
+    for (var i = 0; i < hLines; ++i) {
55
+      final y = boxSize * i;
56
+      path.moveTo(0, y);
57
+      path.relativeLineTo(size.width, 0);
58
+    }
59
+    canvas.drawPath(path, paint);
60
+  }
61
+
62
+  @override
63
+  bool shouldRepaint(covariant CustomPainter oldDelegate) {
64
+    return false;
65
+  }
66
+}

+ 49 - 0
lib/grid/grid_widget.dart

@@ -0,0 +1,49 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+import 'package:flutter/material.dart';
30
+import 'grid_painter.dart';
31
+
32
+class GridWidget extends StatelessWidget {
33
+  final CustomPainter foreground;
34
+
35
+  const GridWidget(this.foreground, {Key? key}) : super(key: key);
36
+
37
+  @override
38
+  Widget build(BuildContext context) {
39
+    return Padding(
40
+      padding: const EdgeInsets.all(5),
41
+      child: SafeArea(
42
+        child: CustomPaint(
43
+          foregroundPainter: foreground,
44
+          painter: GridPainter(),
45
+        ),
46
+      ),
47
+    );
48
+  }
49
+}

+ 125 - 0
lib/main.dart

@@ -0,0 +1,125 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+import 'arc_curves_painter.dart';
30
+import 'common/common_scaffold.dart';
31
+import 'grid/grid_widget.dart';
32
+import 'ovals_painter.dart';
33
+import 'polygon_painter.dart';
34
+
35
+import 'battery/animated_battery.dart';
36
+import 'package:flutter/material.dart';
37
+import 'package:flutter/services.dart';
38
+
39
+void main() {
40
+  runApp(const MyApp());
41
+}
42
+
43
+class MyApp extends StatelessWidget {
44
+  const MyApp({Key? key}) : super(key: key);
45
+
46
+  @override
47
+  Widget build(BuildContext context) {
48
+    SystemChrome.setPreferredOrientations([
49
+      DeviceOrientation.portraitUp,
50
+      DeviceOrientation.portraitDown,
51
+    ]);
52
+    return MaterialApp(
53
+      title: 'Canvas Basics',
54
+      debugShowCheckedModeBanner: false,
55
+      theme: ThemeData(
56
+        primarySwatch: Colors.blue,
57
+      ),
58
+      home: HomeWidget(),
59
+    );
60
+  }
61
+}
62
+
63
+class HomeWidget extends StatelessWidget {
64
+  HomeWidget({Key? key}) : super(key: key);
65
+
66
+  final items = <Item>[
67
+    Item('Polygons', GridWidget(PolygonPainter())),
68
+    Item('Ovals and Circles', GridWidget(OvalPainter())),
69
+    Item('Arc and Curves', GridWidget(ArcsCurvesPainter())),
70
+    Item('Animated Battery', const AnimatedBattery()),
71
+  ];
72
+
73
+  @override
74
+  Widget build(BuildContext context) {
75
+    return CommonScaffold(
76
+      title: 'Canvas Basics',
77
+      child: Column(
78
+        mainAxisSize: MainAxisSize.max,
79
+        mainAxisAlignment: MainAxisAlignment.center,
80
+        crossAxisAlignment: CrossAxisAlignment.center,
81
+        children: items.map((e) => ItemWidget(e)).toList(),
82
+      ),
83
+    );
84
+  }
85
+}
86
+
87
+// TODO: Rename project
88
+
89
+class ItemWidget extends StatelessWidget {
90
+  final Item item;
91
+
92
+  const ItemWidget(this.item, {Key? key}) : super(key: key);
93
+
94
+  @override
95
+  Widget build(BuildContext context) {
96
+    return Container(
97
+      width: double.infinity,
98
+      margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 7),
99
+      child: TextButton(
100
+        style: TextButton.styleFrom(
101
+            foregroundColor: Colors.white, backgroundColor: const Color(0xFF158443),
102
+            padding: const EdgeInsets.symmetric(vertical: 15)),
103
+        onPressed: () {
104
+          final widget = CommonScaffold(title: item.title, child: item.widget);
105
+          Navigator.of(context)
106
+              .push(MaterialPageRoute<void>(builder: (_) => widget));
107
+        },
108
+        child: Text(
109
+          item.title,
110
+          style: const TextStyle(
111
+            fontSize: 18,
112
+            fontWeight: FontWeight.bold,
113
+          ),
114
+        ),
115
+      ),
116
+    );
117
+  }
118
+}
119
+
120
+class Item {
121
+  final String title;
122
+  final Widget widget;
123
+
124
+  Item(this.title, this.widget);
125
+}

+ 59 - 0
lib/ovals_painter.dart

@@ -0,0 +1,59 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+import 'package:flutter/material.dart';
30
+
31
+class OvalPainter extends CustomPainter {
32
+  @override
33
+  void paint(Canvas canvas, Size size) {
34
+    final paint = Paint()
35
+      ..strokeWidth = 4
36
+      ..color = Colors.blueAccent
37
+      ..style = PaintingStyle.stroke;
38
+
39
+    
40
+    const circleRadius = 75.0;
41
+    const circleCenter = Offset(200, 150);
42
+    canvas.drawCircle(circleCenter, circleRadius, paint);
43
+
44
+    const ovalCenter = Offset(200, 275);
45
+    final oval = Rect.fromCenter(center: ovalCenter, width: 250, height: 100);
46
+    canvas.drawOval(oval, paint);
47
+
48
+    var concentricCircleRadius = 100.0;
49
+    const center = Offset(200, 500);
50
+    while (concentricCircleRadius > 0) {
51
+      canvas.drawCircle(center, concentricCircleRadius, paint);
52
+      concentricCircleRadius -= 10;
53
+    }
54
+
55
+  }
56
+
57
+  @override
58
+  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
59
+}

+ 96 - 0
lib/polygon_painter.dart

@@ -0,0 +1,96 @@
1
+// Copyright (c) 2021 Razeware LLC
2
+//
3
+// Permission is hereby granted, free of charge, to any person obtaining a copy
4
+// of this software and associated documentation files (the "Software"), to deal
5
+// in the Software without restriction, including without limitation the rights
6
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+// copies of the Software, and to permit persons to whom the Software is
8
+// furnished to do so, subject to the following conditions:
9
+//
10
+// The above copyright notice and this permission notice shall be included in
11
+// all copies or substantial portions of the Software.
12
+//
13
+// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish,
14
+// distribute, sublicense, create a derivative work, and/or sell copies of the
15
+// Software in any work that is designed, intended, or marketed for pedagogical
16
+// or instructional purposes related to programming, coding, application
17
+// development, or information technology.  Permission for such use, copying,
18
+// modification, merger, publication, distribution, sublicensing, creation of
19
+// derivative works, or sale is expressly withheld.
20
+//
21
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+// THE SOFTWARE.
28
+
29
+
30
+import 'package:flutter/material.dart';
31
+
32
+class PolygonPainter extends CustomPainter {
33
+  @override
34
+  void paint(Canvas canvas, Size size) {
35
+    final paint = Paint()
36
+      ..strokeWidth = 5
37
+      ..color = Colors.indigoAccent
38
+      ..style = PaintingStyle.fill;
39
+
40
+    final triangle = Path();
41
+    triangle.moveTo(150, 0);
42
+    triangle.relativeLineTo(100, 100);
43
+    triangle.relativeLineTo(-150, 0);
44
+    triangle.close();
45
+
46
+    final square1 = Path();
47
+    square1.moveTo(50, 150);
48
+    square1.relativeLineTo(100, 0);
49
+    square1.relativeLineTo(0, 100);
50
+    square1.relativeLineTo(-100, 0);
51
+    square1.close();
52
+
53
+    const square2 = Rect.fromLTWH(200, 150, 100, 100);
54
+
55
+    final hexagon = Path()
56
+    // 1
57
+      ..moveTo(175, 300)
58
+    // 2
59
+      ..relativeLineTo(75, 50)
60
+    // 3
61
+      ..relativeLineTo(0, 75)
62
+    // 4
63
+      ..relativeLineTo(-75, 50)
64
+    // 5
65
+      ..relativeLineTo(-75, -50)
66
+    // 6
67
+      ..relativeLineTo(0, -75)
68
+    // 7
69
+      ..close();
70
+
71
+    final cross = Path()
72
+      ..moveTo(150, 500)
73
+      ..relativeLineTo(50, 0)
74
+      ..relativeLineTo(0, 50)
75
+      ..relativeLineTo(50, 0)
76
+      ..relativeLineTo(0, 50)
77
+      ..relativeLineTo(-50, 0)
78
+      ..relativeLineTo(0, 50)
79
+      ..relativeLineTo(-50, 0)
80
+      ..relativeLineTo(0, -50)
81
+      ..relativeLineTo(-50, 0)
82
+      ..relativeLineTo(0, -50)
83
+      ..relativeLineTo(50, 0)
84
+      ..close();
85
+  
86
+  
87
+    canvas.drawPath(triangle, paint);
88
+    canvas.drawPath(square1, paint);
89
+    canvas.drawRect(square2, paint);
90
+    canvas.drawPath(cross, paint);
91
+    canvas.drawPath(hexagon, paint);  
92
+  }
93
+
94
+  @override
95
+  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
96
+}

+ 1 - 0
linux/.gitignore

@@ -0,0 +1 @@
1
+flutter/ephemeral

+ 145 - 0
linux/CMakeLists.txt

@@ -0,0 +1,145 @@
1
+# Project-level configuration.
2
+cmake_minimum_required(VERSION 3.10)
3
+project(runner LANGUAGES CXX)
4
+
5
+# The name of the executable created for the application. Change this to change
6
+# the on-disk name of your application.
7
+set(BINARY_NAME "flutter_canvas_editor")
8
+# The unique GTK application identifier for this application. See:
9
+# https://wiki.gnome.org/HowDoI/ChooseApplicationID
10
+set(APPLICATION_ID "com.example.flutter_canvas_editor")
11
+
12
+# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
13
+# versions of CMake.
14
+cmake_policy(SET CMP0063 NEW)
15
+
16
+# Load bundled libraries from the lib/ directory relative to the binary.
17
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
18
+
19
+# Root filesystem for cross-building.
20
+if(FLUTTER_TARGET_PLATFORM_SYSROOT)
21
+  set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
22
+  set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
23
+  set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
24
+  set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
25
+  set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
26
+  set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
27
+endif()
28
+
29
+# Define build configuration options.
30
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
31
+  set(CMAKE_BUILD_TYPE "Debug" CACHE
32
+    STRING "Flutter build mode" FORCE)
33
+  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
34
+    "Debug" "Profile" "Release")
35
+endif()
36
+
37
+# Compilation settings that should be applied to most targets.
38
+#
39
+# Be cautious about adding new options here, as plugins use this function by
40
+# default. In most cases, you should add new options to specific targets instead
41
+# of modifying this function.
42
+function(APPLY_STANDARD_SETTINGS TARGET)
43
+  target_compile_features(${TARGET} PUBLIC cxx_std_14)
44
+  target_compile_options(${TARGET} PRIVATE -Wall -Werror)
45
+  target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>")
46
+  target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>")
47
+endfunction()
48
+
49
+# Flutter library and tool build rules.
50
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
51
+add_subdirectory(${FLUTTER_MANAGED_DIR})
52
+
53
+# System-level dependencies.
54
+find_package(PkgConfig REQUIRED)
55
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
56
+
57
+add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
58
+
59
+# Define the application target. To change its name, change BINARY_NAME above,
60
+# not the value here, or `flutter run` will no longer work.
61
+#
62
+# Any new source files that you add to the application should be added here.
63
+add_executable(${BINARY_NAME}
64
+  "main.cc"
65
+  "my_application.cc"
66
+  "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
67
+)
68
+
69
+# Apply the standard set of build settings. This can be removed for applications
70
+# that need different build settings.
71
+apply_standard_settings(${BINARY_NAME})
72
+
73
+# Add dependency libraries. Add any application-specific dependencies here.
74
+target_link_libraries(${BINARY_NAME} PRIVATE flutter)
75
+target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
76
+
77
+# Run the Flutter tool portions of the build. This must not be removed.
78
+add_dependencies(${BINARY_NAME} flutter_assemble)
79
+
80
+# Only the install-generated bundle's copy of the executable will launch
81
+# correctly, since the resources must in the right relative locations. To avoid
82
+# people trying to run the unbundled copy, put it in a subdirectory instead of
83
+# the default top-level location.
84
+set_target_properties(${BINARY_NAME}
85
+  PROPERTIES
86
+  RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
87
+)
88
+
89
+
90
+# Generated plugin build rules, which manage building the plugins and adding
91
+# them to the application.
92
+include(flutter/generated_plugins.cmake)
93
+
94
+
95
+# === Installation ===
96
+# By default, "installing" just makes a relocatable bundle in the build
97
+# directory.
98
+set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
99
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
100
+  set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
101
+endif()
102
+
103
+# Start with a clean build bundle directory every time.
104
+install(CODE "
105
+  file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
106
+  " COMPONENT Runtime)
107
+
108
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
109
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
110
+
111
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
112
+  COMPONENT Runtime)
113
+
114
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
115
+  COMPONENT Runtime)
116
+
117
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
118
+  COMPONENT Runtime)
119
+
120
+foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
121
+  install(FILES "${bundled_library}"
122
+    DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
123
+    COMPONENT Runtime)
124
+endforeach(bundled_library)
125
+
126
+# Copy the native assets provided by the build.dart from all packages.
127
+set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
128
+install(DIRECTORY "${NATIVE_ASSETS_DIR}"
129
+   DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
130
+   COMPONENT Runtime)
131
+
132
+# Fully re-copy the assets directory on each build to avoid having stale files
133
+# from a previous install.
134
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
135
+install(CODE "
136
+  file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
137
+  " COMPONENT Runtime)
138
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
139
+  DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
140
+
141
+# Install the AOT library on non-Debug builds only.
142
+if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
143
+  install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
144
+    COMPONENT Runtime)
145
+endif()

+ 88 - 0
linux/flutter/CMakeLists.txt

@@ -0,0 +1,88 @@
1
+# This file controls Flutter-level build steps. It should not be edited.
2
+cmake_minimum_required(VERSION 3.10)
3
+
4
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
5
+
6
+# Configuration provided via flutter tool.
7
+include(${EPHEMERAL_DIR}/generated_config.cmake)
8
+
9
+# TODO: Move the rest of this into files in ephemeral. See
10
+# https://github.com/flutter/flutter/issues/57146.
11
+
12
+# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
13
+# which isn't available in 3.10.
14
+function(list_prepend LIST_NAME PREFIX)
15
+    set(NEW_LIST "")
16
+    foreach(element ${${LIST_NAME}})
17
+        list(APPEND NEW_LIST "${PREFIX}${element}")
18
+    endforeach(element)
19
+    set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
20
+endfunction()
21
+
22
+# === Flutter Library ===
23
+# System-level dependencies.
24
+find_package(PkgConfig REQUIRED)
25
+pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
26
+pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
27
+pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
28
+
29
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
30
+
31
+# Published to parent scope for install step.
32
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
33
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
34
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
35
+set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
36
+
37
+list(APPEND FLUTTER_LIBRARY_HEADERS
38
+  "fl_basic_message_channel.h"
39
+  "fl_binary_codec.h"
40
+  "fl_binary_messenger.h"
41
+  "fl_dart_project.h"
42
+  "fl_engine.h"
43
+  "fl_json_message_codec.h"
44
+  "fl_json_method_codec.h"
45
+  "fl_message_codec.h"
46
+  "fl_method_call.h"
47
+  "fl_method_channel.h"
48
+  "fl_method_codec.h"
49
+  "fl_method_response.h"
50
+  "fl_plugin_registrar.h"
51
+  "fl_plugin_registry.h"
52
+  "fl_standard_message_codec.h"
53
+  "fl_standard_method_codec.h"
54
+  "fl_string_codec.h"
55
+  "fl_value.h"
56
+  "fl_view.h"
57
+  "flutter_linux.h"
58
+)
59
+list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
60
+add_library(flutter INTERFACE)
61
+target_include_directories(flutter INTERFACE
62
+  "${EPHEMERAL_DIR}"
63
+)
64
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
65
+target_link_libraries(flutter INTERFACE
66
+  PkgConfig::GTK
67
+  PkgConfig::GLIB
68
+  PkgConfig::GIO
69
+)
70
+add_dependencies(flutter flutter_assemble)
71
+
72
+# === Flutter tool backend ===
73
+# _phony_ is a non-existent file to force this command to run every time,
74
+# since currently there's no way to get a full input/output list from the
75
+# flutter tool.
76
+add_custom_command(
77
+  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
78
+    ${CMAKE_CURRENT_BINARY_DIR}/_phony_
79
+  COMMAND ${CMAKE_COMMAND} -E env
80
+    ${FLUTTER_TOOL_ENVIRONMENT}
81
+    "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
82
+      ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
83
+  VERBATIM
84
+)
85
+add_custom_target(flutter_assemble DEPENDS
86
+  "${FLUTTER_LIBRARY}"
87
+  ${FLUTTER_LIBRARY_HEADERS}
88
+)

+ 11 - 0
linux/flutter/generated_plugin_registrant.cc

@@ -0,0 +1,11 @@
1
+//
2
+//  Generated file. Do not edit.
3
+//
4
+
5
+// clang-format off
6
+
7
+#include "generated_plugin_registrant.h"
8
+
9
+
10
+void fl_register_plugins(FlPluginRegistry* registry) {
11
+}

+ 15 - 0
linux/flutter/generated_plugin_registrant.h

@@ -0,0 +1,15 @@
1
+//
2
+//  Generated file. Do not edit.
3
+//
4
+
5
+// clang-format off
6
+
7
+#ifndef GENERATED_PLUGIN_REGISTRANT_
8
+#define GENERATED_PLUGIN_REGISTRANT_
9
+
10
+#include <flutter_linux/flutter_linux.h>
11
+
12
+// Registers Flutter plugins.
13
+void fl_register_plugins(FlPluginRegistry* registry);
14
+
15
+#endif  // GENERATED_PLUGIN_REGISTRANT_

+ 23 - 0
linux/flutter/generated_plugins.cmake

@@ -0,0 +1,23 @@
1
+#
2
+# Generated file, do not edit.
3
+#
4
+
5
+list(APPEND FLUTTER_PLUGIN_LIST
6
+)
7
+
8
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
9
+)
10
+
11
+set(PLUGIN_BUNDLED_LIBRARIES)
12
+
13
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
14
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
15
+  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
16
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
17
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
18
+endforeach(plugin)
19
+
20
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
21
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
22
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
23
+endforeach(ffi_plugin)

+ 6 - 0
linux/main.cc

@@ -0,0 +1,6 @@
1
+#include "my_application.h"
2
+
3
+int main(int argc, char** argv) {
4
+  g_autoptr(MyApplication) app = my_application_new();
5
+  return g_application_run(G_APPLICATION(app), argc, argv);
6
+}

+ 124 - 0
linux/my_application.cc

@@ -0,0 +1,124 @@
1
+#include "my_application.h"
2
+
3
+#include <flutter_linux/flutter_linux.h>
4
+#ifdef GDK_WINDOWING_X11
5
+#include <gdk/gdkx.h>
6
+#endif
7
+
8
+#include "flutter/generated_plugin_registrant.h"
9
+
10
+struct _MyApplication {
11
+  GtkApplication parent_instance;
12
+  char** dart_entrypoint_arguments;
13
+};
14
+
15
+G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
16
+
17
+// Implements GApplication::activate.
18
+static void my_application_activate(GApplication* application) {
19
+  MyApplication* self = MY_APPLICATION(application);
20
+  GtkWindow* window =
21
+      GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
22
+
23
+  // Use a header bar when running in GNOME as this is the common style used
24
+  // by applications and is the setup most users will be using (e.g. Ubuntu
25
+  // desktop).
26
+  // If running on X and not using GNOME then just use a traditional title bar
27
+  // in case the window manager does more exotic layout, e.g. tiling.
28
+  // If running on Wayland assume the header bar will work (may need changing
29
+  // if future cases occur).
30
+  gboolean use_header_bar = TRUE;
31
+#ifdef GDK_WINDOWING_X11
32
+  GdkScreen* screen = gtk_window_get_screen(window);
33
+  if (GDK_IS_X11_SCREEN(screen)) {
34
+    const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
35
+    if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
36
+      use_header_bar = FALSE;
37
+    }
38
+  }
39
+#endif
40
+  if (use_header_bar) {
41
+    GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
42
+    gtk_widget_show(GTK_WIDGET(header_bar));
43
+    gtk_header_bar_set_title(header_bar, "flutter_canvas_editor");
44
+    gtk_header_bar_set_show_close_button(header_bar, TRUE);
45
+    gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
46
+  } else {
47
+    gtk_window_set_title(window, "flutter_canvas_editor");
48
+  }
49
+
50
+  gtk_window_set_default_size(window, 1280, 720);
51
+  gtk_widget_show(GTK_WIDGET(window));
52
+
53
+  g_autoptr(FlDartProject) project = fl_dart_project_new();
54
+  fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
55
+
56
+  FlView* view = fl_view_new(project);
57
+  gtk_widget_show(GTK_WIDGET(view));
58
+  gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
59
+
60
+  fl_register_plugins(FL_PLUGIN_REGISTRY(view));
61
+
62
+  gtk_widget_grab_focus(GTK_WIDGET(view));
63
+}
64
+
65
+// Implements GApplication::local_command_line.
66
+static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
67
+  MyApplication* self = MY_APPLICATION(application);
68
+  // Strip out the first argument as it is the binary name.
69
+  self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
70
+
71
+  g_autoptr(GError) error = nullptr;
72
+  if (!g_application_register(application, nullptr, &error)) {
73
+     g_warning("Failed to register: %s", error->message);
74
+     *exit_status = 1;
75
+     return TRUE;
76
+  }
77
+
78
+  g_application_activate(application);
79
+  *exit_status = 0;
80
+
81
+  return TRUE;
82
+}
83
+
84
+// Implements GApplication::startup.
85
+static void my_application_startup(GApplication* application) {
86
+  //MyApplication* self = MY_APPLICATION(object);
87
+
88
+  // Perform any actions required at application startup.
89
+
90
+  G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
91
+}
92
+
93
+// Implements GApplication::shutdown.
94
+static void my_application_shutdown(GApplication* application) {
95
+  //MyApplication* self = MY_APPLICATION(object);
96
+
97
+  // Perform any actions required at application shutdown.
98
+
99
+  G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
100
+}
101
+
102
+// Implements GObject::dispose.
103
+static void my_application_dispose(GObject* object) {
104
+  MyApplication* self = MY_APPLICATION(object);
105
+  g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
106
+  G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
107
+}
108
+
109
+static void my_application_class_init(MyApplicationClass* klass) {
110
+  G_APPLICATION_CLASS(klass)->activate = my_application_activate;
111
+  G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
112
+  G_APPLICATION_CLASS(klass)->startup = my_application_startup;
113
+  G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
114
+  G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
115
+}
116
+
117
+static void my_application_init(MyApplication* self) {}
118
+
119
+MyApplication* my_application_new() {
120
+  return MY_APPLICATION(g_object_new(my_application_get_type(),
121
+                                     "application-id", APPLICATION_ID,
122
+                                     "flags", G_APPLICATION_NON_UNIQUE,
123
+                                     nullptr));
124
+}

+ 18 - 0
linux/my_application.h

@@ -0,0 +1,18 @@
1
+#ifndef FLUTTER_MY_APPLICATION_H_
2
+#define FLUTTER_MY_APPLICATION_H_
3
+
4
+#include <gtk/gtk.h>
5
+
6
+G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
7
+                     GtkApplication)
8
+
9
+/**
10
+ * my_application_new:
11
+ *
12
+ * Creates a new Flutter-based application.
13
+ *
14
+ * Returns: a new #MyApplication.
15
+ */
16
+MyApplication* my_application_new();
17
+
18
+#endif  // FLUTTER_MY_APPLICATION_H_

+ 7 - 0
macos/.gitignore

@@ -0,0 +1,7 @@
1
+# Flutter-related
2
+**/Flutter/ephemeral/
3
+**/Pods/
4
+
5
+# Xcode-related
6
+**/dgph
7
+**/xcuserdata/

+ 1 - 0
macos/Flutter/Flutter-Debug.xcconfig

@@ -0,0 +1 @@
1
+#include "ephemeral/Flutter-Generated.xcconfig"

+ 1 - 0
macos/Flutter/Flutter-Release.xcconfig

@@ -0,0 +1 @@
1
+#include "ephemeral/Flutter-Generated.xcconfig"

+ 10 - 0
macos/Flutter/GeneratedPluginRegistrant.swift

@@ -0,0 +1,10 @@
1
+//
2
+//  Generated file. Do not edit.
3
+//
4
+
5
+import FlutterMacOS
6
+import Foundation
7
+
8
+
9
+func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
10
+}

+ 705 - 0
macos/Runner.xcodeproj/project.pbxproj

@@ -0,0 +1,705 @@
1
+// !$*UTF8*$!
2
+{
3
+	archiveVersion = 1;
4
+	classes = {
5
+	};
6
+	objectVersion = 54;
7
+	objects = {
8
+
9
+/* Begin PBXAggregateTarget section */
10
+		33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
11
+			isa = PBXAggregateTarget;
12
+			buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
13
+			buildPhases = (
14
+				33CC111E2044C6BF0003C045 /* ShellScript */,
15
+			);
16
+			dependencies = (
17
+			);
18
+			name = "Flutter Assemble";
19
+			productName = FLX;
20
+		};
21
+/* End PBXAggregateTarget section */
22
+
23
+/* Begin PBXBuildFile section */
24
+		331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
25
+		335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
26
+		33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
27
+		33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
28
+		33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
29
+		33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
30
+/* End PBXBuildFile section */
31
+
32
+/* Begin PBXContainerItemProxy section */
33
+		331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
34
+			isa = PBXContainerItemProxy;
35
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
36
+			proxyType = 1;
37
+			remoteGlobalIDString = 33CC10EC2044A3C60003C045;
38
+			remoteInfo = Runner;
39
+		};
40
+		33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
41
+			isa = PBXContainerItemProxy;
42
+			containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
43
+			proxyType = 1;
44
+			remoteGlobalIDString = 33CC111A2044C6BA0003C045;
45
+			remoteInfo = FLX;
46
+		};
47
+/* End PBXContainerItemProxy section */
48
+
49
+/* Begin PBXCopyFilesBuildPhase section */
50
+		33CC110E2044A8840003C045 /* Bundle Framework */ = {
51
+			isa = PBXCopyFilesBuildPhase;
52
+			buildActionMask = 2147483647;
53
+			dstPath = "";
54
+			dstSubfolderSpec = 10;
55
+			files = (
56
+			);
57
+			name = "Bundle Framework";
58
+			runOnlyForDeploymentPostprocessing = 0;
59
+		};
60
+/* End PBXCopyFilesBuildPhase section */
61
+
62
+/* Begin PBXFileReference section */
63
+		331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
64
+		331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
65
+		333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
66
+		335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
67
+		33CC10ED2044A3C60003C045 /* flutter_canvas_editor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "flutter_canvas_editor.app"; sourceTree = BUILT_PRODUCTS_DIR; };
68
+		33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
69
+		33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
70
+		33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
71
+		33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
72
+		33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
73
+		33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
74
+		33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
75
+		33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
76
+		33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
77
+		33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
78
+		33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
79
+		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
80
+		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
81
+/* End PBXFileReference section */
82
+
83
+/* Begin PBXFrameworksBuildPhase section */
84
+		331C80D2294CF70F00263BE5 /* Frameworks */ = {
85
+			isa = PBXFrameworksBuildPhase;
86
+			buildActionMask = 2147483647;
87
+			files = (
88
+			);
89
+			runOnlyForDeploymentPostprocessing = 0;
90
+		};
91
+		33CC10EA2044A3C60003C045 /* Frameworks */ = {
92
+			isa = PBXFrameworksBuildPhase;
93
+			buildActionMask = 2147483647;
94
+			files = (
95
+			);
96
+			runOnlyForDeploymentPostprocessing = 0;
97
+		};
98
+/* End PBXFrameworksBuildPhase section */
99
+
100
+/* Begin PBXGroup section */
101
+		331C80D6294CF71000263BE5 /* RunnerTests */ = {
102
+			isa = PBXGroup;
103
+			children = (
104
+				331C80D7294CF71000263BE5 /* RunnerTests.swift */,
105
+			);
106
+			path = RunnerTests;
107
+			sourceTree = "<group>";
108
+		};
109
+		33BA886A226E78AF003329D5 /* Configs */ = {
110
+			isa = PBXGroup;
111
+			children = (
112
+				33E5194F232828860026EE4D /* AppInfo.xcconfig */,
113
+				9740EEB21CF90195004384FC /* Debug.xcconfig */,
114
+				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
115
+				333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
116
+			);
117
+			path = Configs;
118
+			sourceTree = "<group>";
119
+		};
120
+		33CC10E42044A3C60003C045 = {
121
+			isa = PBXGroup;
122
+			children = (
123
+				33FAB671232836740065AC1E /* Runner */,
124
+				33CEB47122A05771004F2AC0 /* Flutter */,
125
+				331C80D6294CF71000263BE5 /* RunnerTests */,
126
+				33CC10EE2044A3C60003C045 /* Products */,
127
+				D73912EC22F37F3D000D13A0 /* Frameworks */,
128
+			);
129
+			sourceTree = "<group>";
130
+		};
131
+		33CC10EE2044A3C60003C045 /* Products */ = {
132
+			isa = PBXGroup;
133
+			children = (
134
+				33CC10ED2044A3C60003C045 /* flutter_canvas_editor.app */,
135
+				331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
136
+			);
137
+			name = Products;
138
+			sourceTree = "<group>";
139
+		};
140
+		33CC11242044D66E0003C045 /* Resources */ = {
141
+			isa = PBXGroup;
142
+			children = (
143
+				33CC10F22044A3C60003C045 /* Assets.xcassets */,
144
+				33CC10F42044A3C60003C045 /* MainMenu.xib */,
145
+				33CC10F72044A3C60003C045 /* Info.plist */,
146
+			);
147
+			name = Resources;
148
+			path = ..;
149
+			sourceTree = "<group>";
150
+		};
151
+		33CEB47122A05771004F2AC0 /* Flutter */ = {
152
+			isa = PBXGroup;
153
+			children = (
154
+				335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
155
+				33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
156
+				33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
157
+				33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
158
+			);
159
+			path = Flutter;
160
+			sourceTree = "<group>";
161
+		};
162
+		33FAB671232836740065AC1E /* Runner */ = {
163
+			isa = PBXGroup;
164
+			children = (
165
+				33CC10F02044A3C60003C045 /* AppDelegate.swift */,
166
+				33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
167
+				33E51913231747F40026EE4D /* DebugProfile.entitlements */,
168
+				33E51914231749380026EE4D /* Release.entitlements */,
169
+				33CC11242044D66E0003C045 /* Resources */,
170
+				33BA886A226E78AF003329D5 /* Configs */,
171
+			);
172
+			path = Runner;
173
+			sourceTree = "<group>";
174
+		};
175
+		D73912EC22F37F3D000D13A0 /* Frameworks */ = {
176
+			isa = PBXGroup;
177
+			children = (
178
+			);
179
+			name = Frameworks;
180
+			sourceTree = "<group>";
181
+		};
182
+/* End PBXGroup section */
183
+
184
+/* Begin PBXNativeTarget section */
185
+		331C80D4294CF70F00263BE5 /* RunnerTests */ = {
186
+			isa = PBXNativeTarget;
187
+			buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
188
+			buildPhases = (
189
+				331C80D1294CF70F00263BE5 /* Sources */,
190
+				331C80D2294CF70F00263BE5 /* Frameworks */,
191
+				331C80D3294CF70F00263BE5 /* Resources */,
192
+			);
193
+			buildRules = (
194
+			);
195
+			dependencies = (
196
+				331C80DA294CF71000263BE5 /* PBXTargetDependency */,
197
+			);
198
+			name = RunnerTests;
199
+			productName = RunnerTests;
200
+			productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
201
+			productType = "com.apple.product-type.bundle.unit-test";
202
+		};
203
+		33CC10EC2044A3C60003C045 /* Runner */ = {
204
+			isa = PBXNativeTarget;
205
+			buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
206
+			buildPhases = (
207
+				33CC10E92044A3C60003C045 /* Sources */,
208
+				33CC10EA2044A3C60003C045 /* Frameworks */,
209
+				33CC10EB2044A3C60003C045 /* Resources */,
210
+				33CC110E2044A8840003C045 /* Bundle Framework */,
211
+				3399D490228B24CF009A79C7 /* ShellScript */,
212
+			);
213
+			buildRules = (
214
+			);
215
+			dependencies = (
216
+				33CC11202044C79F0003C045 /* PBXTargetDependency */,
217
+			);
218
+			name = Runner;
219
+			productName = Runner;
220
+			productReference = 33CC10ED2044A3C60003C045 /* flutter_canvas_editor.app */;
221
+			productType = "com.apple.product-type.application";
222
+		};
223
+/* End PBXNativeTarget section */
224
+
225
+/* Begin PBXProject section */
226
+		33CC10E52044A3C60003C045 /* Project object */ = {
227
+			isa = PBXProject;
228
+			attributes = {
229
+				BuildIndependentTargetsInParallel = YES;
230
+				LastSwiftUpdateCheck = 0920;
231
+				LastUpgradeCheck = 1510;
232
+				ORGANIZATIONNAME = "";
233
+				TargetAttributes = {
234
+					331C80D4294CF70F00263BE5 = {
235
+						CreatedOnToolsVersion = 14.0;
236
+						TestTargetID = 33CC10EC2044A3C60003C045;
237
+					};
238
+					33CC10EC2044A3C60003C045 = {
239
+						CreatedOnToolsVersion = 9.2;
240
+						LastSwiftMigration = 1100;
241
+						ProvisioningStyle = Automatic;
242
+						SystemCapabilities = {
243
+							com.apple.Sandbox = {
244
+								enabled = 1;
245
+							};
246
+						};
247
+					};
248
+					33CC111A2044C6BA0003C045 = {
249
+						CreatedOnToolsVersion = 9.2;
250
+						ProvisioningStyle = Manual;
251
+					};
252
+				};
253
+			};
254
+			buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
255
+			compatibilityVersion = "Xcode 9.3";
256
+			developmentRegion = en;
257
+			hasScannedForEncodings = 0;
258
+			knownRegions = (
259
+				en,
260
+				Base,
261
+			);
262
+			mainGroup = 33CC10E42044A3C60003C045;
263
+			productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
264
+			projectDirPath = "";
265
+			projectRoot = "";
266
+			targets = (
267
+				33CC10EC2044A3C60003C045 /* Runner */,
268
+				331C80D4294CF70F00263BE5 /* RunnerTests */,
269
+				33CC111A2044C6BA0003C045 /* Flutter Assemble */,
270
+			);
271
+		};
272
+/* End PBXProject section */
273
+
274
+/* Begin PBXResourcesBuildPhase section */
275
+		331C80D3294CF70F00263BE5 /* Resources */ = {
276
+			isa = PBXResourcesBuildPhase;
277
+			buildActionMask = 2147483647;
278
+			files = (
279
+			);
280
+			runOnlyForDeploymentPostprocessing = 0;
281
+		};
282
+		33CC10EB2044A3C60003C045 /* Resources */ = {
283
+			isa = PBXResourcesBuildPhase;
284
+			buildActionMask = 2147483647;
285
+			files = (
286
+				33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
287
+				33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
288
+			);
289
+			runOnlyForDeploymentPostprocessing = 0;
290
+		};
291
+/* End PBXResourcesBuildPhase section */
292
+
293
+/* Begin PBXShellScriptBuildPhase section */
294
+		3399D490228B24CF009A79C7 /* ShellScript */ = {
295
+			isa = PBXShellScriptBuildPhase;
296
+			alwaysOutOfDate = 1;
297
+			buildActionMask = 2147483647;
298
+			files = (
299
+			);
300
+			inputFileListPaths = (
301
+			);
302
+			inputPaths = (
303
+			);
304
+			outputFileListPaths = (
305
+			);
306
+			outputPaths = (
307
+			);
308
+			runOnlyForDeploymentPostprocessing = 0;
309
+			shellPath = /bin/sh;
310
+			shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
311
+		};
312
+		33CC111E2044C6BF0003C045 /* ShellScript */ = {
313
+			isa = PBXShellScriptBuildPhase;
314
+			buildActionMask = 2147483647;
315
+			files = (
316
+			);
317
+			inputFileListPaths = (
318
+				Flutter/ephemeral/FlutterInputs.xcfilelist,
319
+			);
320
+			inputPaths = (
321
+				Flutter/ephemeral/tripwire,
322
+			);
323
+			outputFileListPaths = (
324
+				Flutter/ephemeral/FlutterOutputs.xcfilelist,
325
+			);
326
+			outputPaths = (
327
+			);
328
+			runOnlyForDeploymentPostprocessing = 0;
329
+			shellPath = /bin/sh;
330
+			shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
331
+		};
332
+/* End PBXShellScriptBuildPhase section */
333
+
334
+/* Begin PBXSourcesBuildPhase section */
335
+		331C80D1294CF70F00263BE5 /* Sources */ = {
336
+			isa = PBXSourcesBuildPhase;
337
+			buildActionMask = 2147483647;
338
+			files = (
339
+				331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
340
+			);
341
+			runOnlyForDeploymentPostprocessing = 0;
342
+		};
343
+		33CC10E92044A3C60003C045 /* Sources */ = {
344
+			isa = PBXSourcesBuildPhase;
345
+			buildActionMask = 2147483647;
346
+			files = (
347
+				33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
348
+				33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
349
+				335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
350
+			);
351
+			runOnlyForDeploymentPostprocessing = 0;
352
+		};
353
+/* End PBXSourcesBuildPhase section */
354
+
355
+/* Begin PBXTargetDependency section */
356
+		331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
357
+			isa = PBXTargetDependency;
358
+			target = 33CC10EC2044A3C60003C045 /* Runner */;
359
+			targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
360
+		};
361
+		33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
362
+			isa = PBXTargetDependency;
363
+			target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
364
+			targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
365
+		};
366
+/* End PBXTargetDependency section */
367
+
368
+/* Begin PBXVariantGroup section */
369
+		33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
370
+			isa = PBXVariantGroup;
371
+			children = (
372
+				33CC10F52044A3C60003C045 /* Base */,
373
+			);
374
+			name = MainMenu.xib;
375
+			path = Runner;
376
+			sourceTree = "<group>";
377
+		};
378
+/* End PBXVariantGroup section */
379
+
380
+/* Begin XCBuildConfiguration section */
381
+		331C80DB294CF71000263BE5 /* Debug */ = {
382
+			isa = XCBuildConfiguration;
383
+			buildSettings = {
384
+				BUNDLE_LOADER = "$(TEST_HOST)";
385
+				CURRENT_PROJECT_VERSION = 1;
386
+				GENERATE_INFOPLIST_FILE = YES;
387
+				MARKETING_VERSION = 1.0;
388
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
389
+				PRODUCT_NAME = "$(TARGET_NAME)";
390
+				SWIFT_VERSION = 5.0;
391
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_canvas_editor.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_canvas_editor";
392
+			};
393
+			name = Debug;
394
+		};
395
+		331C80DC294CF71000263BE5 /* Release */ = {
396
+			isa = XCBuildConfiguration;
397
+			buildSettings = {
398
+				BUNDLE_LOADER = "$(TEST_HOST)";
399
+				CURRENT_PROJECT_VERSION = 1;
400
+				GENERATE_INFOPLIST_FILE = YES;
401
+				MARKETING_VERSION = 1.0;
402
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
403
+				PRODUCT_NAME = "$(TARGET_NAME)";
404
+				SWIFT_VERSION = 5.0;
405
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_canvas_editor.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_canvas_editor";
406
+			};
407
+			name = Release;
408
+		};
409
+		331C80DD294CF71000263BE5 /* Profile */ = {
410
+			isa = XCBuildConfiguration;
411
+			buildSettings = {
412
+				BUNDLE_LOADER = "$(TEST_HOST)";
413
+				CURRENT_PROJECT_VERSION = 1;
414
+				GENERATE_INFOPLIST_FILE = YES;
415
+				MARKETING_VERSION = 1.0;
416
+				PRODUCT_BUNDLE_IDENTIFIER = com.example.flutterCanvasEditor.RunnerTests;
417
+				PRODUCT_NAME = "$(TARGET_NAME)";
418
+				SWIFT_VERSION = 5.0;
419
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/flutter_canvas_editor.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/flutter_canvas_editor";
420
+			};
421
+			name = Profile;
422
+		};
423
+		338D0CE9231458BD00FA5F75 /* Profile */ = {
424
+			isa = XCBuildConfiguration;
425
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
426
+			buildSettings = {
427
+				ALWAYS_SEARCH_USER_PATHS = NO;
428
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
429
+				CLANG_ANALYZER_NONNULL = YES;
430
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
431
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
432
+				CLANG_CXX_LIBRARY = "libc++";
433
+				CLANG_ENABLE_MODULES = YES;
434
+				CLANG_ENABLE_OBJC_ARC = YES;
435
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
436
+				CLANG_WARN_BOOL_CONVERSION = YES;
437
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
438
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
439
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
440
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
441
+				CLANG_WARN_EMPTY_BODY = YES;
442
+				CLANG_WARN_ENUM_CONVERSION = YES;
443
+				CLANG_WARN_INFINITE_RECURSION = YES;
444
+				CLANG_WARN_INT_CONVERSION = YES;
445
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
446
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
447
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
448
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
449
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
450
+				CODE_SIGN_IDENTITY = "-";
451
+				COPY_PHASE_STRIP = NO;
452
+				DEAD_CODE_STRIPPING = YES;
453
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
454
+				ENABLE_NS_ASSERTIONS = NO;
455
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
456
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
457
+				GCC_C_LANGUAGE_STANDARD = gnu11;
458
+				GCC_NO_COMMON_BLOCKS = YES;
459
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
460
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
461
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
462
+				GCC_WARN_UNUSED_FUNCTION = YES;
463
+				GCC_WARN_UNUSED_VARIABLE = YES;
464
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
465
+				MTL_ENABLE_DEBUG_INFO = NO;
466
+				SDKROOT = macosx;
467
+				SWIFT_COMPILATION_MODE = wholemodule;
468
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
469
+			};
470
+			name = Profile;
471
+		};
472
+		338D0CEA231458BD00FA5F75 /* Profile */ = {
473
+			isa = XCBuildConfiguration;
474
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
475
+			buildSettings = {
476
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
477
+				CLANG_ENABLE_MODULES = YES;
478
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
479
+				CODE_SIGN_STYLE = Automatic;
480
+				COMBINE_HIDPI_IMAGES = YES;
481
+				INFOPLIST_FILE = Runner/Info.plist;
482
+				LD_RUNPATH_SEARCH_PATHS = (
483
+					"$(inherited)",
484
+					"@executable_path/../Frameworks",
485
+				);
486
+				PROVISIONING_PROFILE_SPECIFIER = "";
487
+				SWIFT_VERSION = 5.0;
488
+			};
489
+			name = Profile;
490
+		};
491
+		338D0CEB231458BD00FA5F75 /* Profile */ = {
492
+			isa = XCBuildConfiguration;
493
+			buildSettings = {
494
+				CODE_SIGN_STYLE = Manual;
495
+				PRODUCT_NAME = "$(TARGET_NAME)";
496
+			};
497
+			name = Profile;
498
+		};
499
+		33CC10F92044A3C60003C045 /* Debug */ = {
500
+			isa = XCBuildConfiguration;
501
+			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
502
+			buildSettings = {
503
+				ALWAYS_SEARCH_USER_PATHS = NO;
504
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
505
+				CLANG_ANALYZER_NONNULL = YES;
506
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
507
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
508
+				CLANG_CXX_LIBRARY = "libc++";
509
+				CLANG_ENABLE_MODULES = YES;
510
+				CLANG_ENABLE_OBJC_ARC = YES;
511
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
512
+				CLANG_WARN_BOOL_CONVERSION = YES;
513
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
514
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
515
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
516
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
517
+				CLANG_WARN_EMPTY_BODY = YES;
518
+				CLANG_WARN_ENUM_CONVERSION = YES;
519
+				CLANG_WARN_INFINITE_RECURSION = YES;
520
+				CLANG_WARN_INT_CONVERSION = YES;
521
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
522
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
523
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
524
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
525
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
526
+				CODE_SIGN_IDENTITY = "-";
527
+				COPY_PHASE_STRIP = NO;
528
+				DEAD_CODE_STRIPPING = YES;
529
+				DEBUG_INFORMATION_FORMAT = dwarf;
530
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
531
+				ENABLE_TESTABILITY = YES;
532
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
533
+				GCC_C_LANGUAGE_STANDARD = gnu11;
534
+				GCC_DYNAMIC_NO_PIC = NO;
535
+				GCC_NO_COMMON_BLOCKS = YES;
536
+				GCC_OPTIMIZATION_LEVEL = 0;
537
+				GCC_PREPROCESSOR_DEFINITIONS = (
538
+					"DEBUG=1",
539
+					"$(inherited)",
540
+				);
541
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
542
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
543
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
544
+				GCC_WARN_UNUSED_FUNCTION = YES;
545
+				GCC_WARN_UNUSED_VARIABLE = YES;
546
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
547
+				MTL_ENABLE_DEBUG_INFO = YES;
548
+				ONLY_ACTIVE_ARCH = YES;
549
+				SDKROOT = macosx;
550
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
551
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
552
+			};
553
+			name = Debug;
554
+		};
555
+		33CC10FA2044A3C60003C045 /* Release */ = {
556
+			isa = XCBuildConfiguration;
557
+			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
558
+			buildSettings = {
559
+				ALWAYS_SEARCH_USER_PATHS = NO;
560
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
561
+				CLANG_ANALYZER_NONNULL = YES;
562
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
563
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
564
+				CLANG_CXX_LIBRARY = "libc++";
565
+				CLANG_ENABLE_MODULES = YES;
566
+				CLANG_ENABLE_OBJC_ARC = YES;
567
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
568
+				CLANG_WARN_BOOL_CONVERSION = YES;
569
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
570
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
571
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
572
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
573
+				CLANG_WARN_EMPTY_BODY = YES;
574
+				CLANG_WARN_ENUM_CONVERSION = YES;
575
+				CLANG_WARN_INFINITE_RECURSION = YES;
576
+				CLANG_WARN_INT_CONVERSION = YES;
577
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
578
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
579
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
580
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
581
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
582
+				CODE_SIGN_IDENTITY = "-";
583
+				COPY_PHASE_STRIP = NO;
584
+				DEAD_CODE_STRIPPING = YES;
585
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
586
+				ENABLE_NS_ASSERTIONS = NO;
587
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
588
+				ENABLE_USER_SCRIPT_SANDBOXING = NO;
589
+				GCC_C_LANGUAGE_STANDARD = gnu11;
590
+				GCC_NO_COMMON_BLOCKS = YES;
591
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
592
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
593
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
594
+				GCC_WARN_UNUSED_FUNCTION = YES;
595
+				GCC_WARN_UNUSED_VARIABLE = YES;
596
+				MACOSX_DEPLOYMENT_TARGET = 10.14;
597
+				MTL_ENABLE_DEBUG_INFO = NO;
598
+				SDKROOT = macosx;
599
+				SWIFT_COMPILATION_MODE = wholemodule;
600
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
601
+			};
602
+			name = Release;
603
+		};
604
+		33CC10FC2044A3C60003C045 /* Debug */ = {
605
+			isa = XCBuildConfiguration;
606
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
607
+			buildSettings = {
608
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
609
+				CLANG_ENABLE_MODULES = YES;
610
+				CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
611
+				CODE_SIGN_STYLE = Automatic;
612
+				COMBINE_HIDPI_IMAGES = YES;
613
+				INFOPLIST_FILE = Runner/Info.plist;
614
+				LD_RUNPATH_SEARCH_PATHS = (
615
+					"$(inherited)",
616
+					"@executable_path/../Frameworks",
617
+				);
618
+				PROVISIONING_PROFILE_SPECIFIER = "";
619
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
620
+				SWIFT_VERSION = 5.0;
621
+			};
622
+			name = Debug;
623
+		};
624
+		33CC10FD2044A3C60003C045 /* Release */ = {
625
+			isa = XCBuildConfiguration;
626
+			baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
627
+			buildSettings = {
628
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
629
+				CLANG_ENABLE_MODULES = YES;
630
+				CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
631
+				CODE_SIGN_STYLE = Automatic;
632
+				COMBINE_HIDPI_IMAGES = YES;
633
+				INFOPLIST_FILE = Runner/Info.plist;
634
+				LD_RUNPATH_SEARCH_PATHS = (
635
+					"$(inherited)",
636
+					"@executable_path/../Frameworks",
637
+				);
638
+				PROVISIONING_PROFILE_SPECIFIER = "";
639
+				SWIFT_VERSION = 5.0;
640
+			};
641
+			name = Release;
642
+		};
643
+		33CC111C2044C6BA0003C045 /* Debug */ = {
644
+			isa = XCBuildConfiguration;
645
+			buildSettings = {
646
+				CODE_SIGN_STYLE = Manual;
647
+				PRODUCT_NAME = "$(TARGET_NAME)";
648
+			};
649
+			name = Debug;
650
+		};
651
+		33CC111D2044C6BA0003C045 /* Release */ = {
652
+			isa = XCBuildConfiguration;
653
+			buildSettings = {
654
+				CODE_SIGN_STYLE = Automatic;
655
+				PRODUCT_NAME = "$(TARGET_NAME)";
656
+			};
657
+			name = Release;
658
+		};
659
+/* End XCBuildConfiguration section */
660
+
661
+/* Begin XCConfigurationList section */
662
+		331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
663
+			isa = XCConfigurationList;
664
+			buildConfigurations = (
665
+				331C80DB294CF71000263BE5 /* Debug */,
666
+				331C80DC294CF71000263BE5 /* Release */,
667
+				331C80DD294CF71000263BE5 /* Profile */,
668
+			);
669
+			defaultConfigurationIsVisible = 0;
670
+			defaultConfigurationName = Release;
671
+		};
672
+		33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
673
+			isa = XCConfigurationList;
674
+			buildConfigurations = (
675
+				33CC10F92044A3C60003C045 /* Debug */,
676
+				33CC10FA2044A3C60003C045 /* Release */,
677
+				338D0CE9231458BD00FA5F75 /* Profile */,
678
+			);
679
+			defaultConfigurationIsVisible = 0;
680
+			defaultConfigurationName = Release;
681
+		};
682
+		33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
683
+			isa = XCConfigurationList;
684
+			buildConfigurations = (
685
+				33CC10FC2044A3C60003C045 /* Debug */,
686
+				33CC10FD2044A3C60003C045 /* Release */,
687
+				338D0CEA231458BD00FA5F75 /* Profile */,
688
+			);
689
+			defaultConfigurationIsVisible = 0;
690
+			defaultConfigurationName = Release;
691
+		};
692
+		33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
693
+			isa = XCConfigurationList;
694
+			buildConfigurations = (
695
+				33CC111C2044C6BA0003C045 /* Debug */,
696
+				33CC111D2044C6BA0003C045 /* Release */,
697
+				338D0CEB231458BD00FA5F75 /* Profile */,
698
+			);
699
+			defaultConfigurationIsVisible = 0;
700
+			defaultConfigurationName = Release;
701
+		};
702
+/* End XCConfigurationList section */
703
+	};
704
+	rootObject = 33CC10E52044A3C60003C045 /* Project object */;
705
+}

+ 8 - 0
macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 98 - 0
macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

@@ -0,0 +1,98 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Scheme
3
+   LastUpgradeVersion = "1510"
4
+   version = "1.3">
5
+   <BuildAction
6
+      parallelizeBuildables = "YES"
7
+      buildImplicitDependencies = "YES">
8
+      <BuildActionEntries>
9
+         <BuildActionEntry
10
+            buildForTesting = "YES"
11
+            buildForRunning = "YES"
12
+            buildForProfiling = "YES"
13
+            buildForArchiving = "YES"
14
+            buildForAnalyzing = "YES">
15
+            <BuildableReference
16
+               BuildableIdentifier = "primary"
17
+               BlueprintIdentifier = "33CC10EC2044A3C60003C045"
18
+               BuildableName = "flutter_canvas_editor.app"
19
+               BlueprintName = "Runner"
20
+               ReferencedContainer = "container:Runner.xcodeproj">
21
+            </BuildableReference>
22
+         </BuildActionEntry>
23
+      </BuildActionEntries>
24
+   </BuildAction>
25
+   <TestAction
26
+      buildConfiguration = "Debug"
27
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
28
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
29
+      shouldUseLaunchSchemeArgsEnv = "YES">
30
+      <MacroExpansion>
31
+         <BuildableReference
32
+            BuildableIdentifier = "primary"
33
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
34
+            BuildableName = "flutter_canvas_editor.app"
35
+            BlueprintName = "Runner"
36
+            ReferencedContainer = "container:Runner.xcodeproj">
37
+         </BuildableReference>
38
+      </MacroExpansion>
39
+      <Testables>
40
+         <TestableReference
41
+            skipped = "NO"
42
+            parallelizable = "YES">
43
+            <BuildableReference
44
+               BuildableIdentifier = "primary"
45
+               BlueprintIdentifier = "331C80D4294CF70F00263BE5"
46
+               BuildableName = "RunnerTests.xctest"
47
+               BlueprintName = "RunnerTests"
48
+               ReferencedContainer = "container:Runner.xcodeproj">
49
+            </BuildableReference>
50
+         </TestableReference>
51
+      </Testables>
52
+   </TestAction>
53
+   <LaunchAction
54
+      buildConfiguration = "Debug"
55
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
56
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
57
+      launchStyle = "0"
58
+      useCustomWorkingDirectory = "NO"
59
+      ignoresPersistentStateOnLaunch = "NO"
60
+      debugDocumentVersioning = "YES"
61
+      debugServiceExtension = "internal"
62
+      allowLocationSimulation = "YES">
63
+      <BuildableProductRunnable
64
+         runnableDebuggingMode = "0">
65
+         <BuildableReference
66
+            BuildableIdentifier = "primary"
67
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
68
+            BuildableName = "flutter_canvas_editor.app"
69
+            BlueprintName = "Runner"
70
+            ReferencedContainer = "container:Runner.xcodeproj">
71
+         </BuildableReference>
72
+      </BuildableProductRunnable>
73
+   </LaunchAction>
74
+   <ProfileAction
75
+      buildConfiguration = "Profile"
76
+      shouldUseLaunchSchemeArgsEnv = "YES"
77
+      savedToolIdentifier = ""
78
+      useCustomWorkingDirectory = "NO"
79
+      debugDocumentVersioning = "YES">
80
+      <BuildableProductRunnable
81
+         runnableDebuggingMode = "0">
82
+         <BuildableReference
83
+            BuildableIdentifier = "primary"
84
+            BlueprintIdentifier = "33CC10EC2044A3C60003C045"
85
+            BuildableName = "flutter_canvas_editor.app"
86
+            BlueprintName = "Runner"
87
+            ReferencedContainer = "container:Runner.xcodeproj">
88
+         </BuildableReference>
89
+      </BuildableProductRunnable>
90
+   </ProfileAction>
91
+   <AnalyzeAction
92
+      buildConfiguration = "Debug">
93
+   </AnalyzeAction>
94
+   <ArchiveAction
95
+      buildConfiguration = "Release"
96
+      revealArchiveInOrganizer = "YES">
97
+   </ArchiveAction>
98
+</Scheme>

+ 7 - 0
macos/Runner.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<Workspace
3
+   version = "1.0">
4
+   <FileRef
5
+      location = "group:Runner.xcodeproj">
6
+   </FileRef>
7
+</Workspace>

+ 8 - 0
macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+<plist version="1.0">
4
+<dict>
5
+	<key>IDEDidComputeMac32BitWarning</key>
6
+	<true/>
7
+</dict>
8
+</plist>

+ 9 - 0
macos/Runner/AppDelegate.swift

@@ -0,0 +1,9 @@
1
+import Cocoa
2
+import FlutterMacOS
3
+
4
+@NSApplicationMain
5
+class AppDelegate: FlutterAppDelegate {
6
+  override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
7
+    return true
8
+  }
9
+}

+ 68 - 0
macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,68 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "size" : "16x16",
5
+      "idiom" : "mac",
6
+      "filename" : "app_icon_16.png",
7
+      "scale" : "1x"
8
+    },
9
+    {
10
+      "size" : "16x16",
11
+      "idiom" : "mac",
12
+      "filename" : "app_icon_32.png",
13
+      "scale" : "2x"
14
+    },
15
+    {
16
+      "size" : "32x32",
17
+      "idiom" : "mac",
18
+      "filename" : "app_icon_32.png",
19
+      "scale" : "1x"
20
+    },
21
+    {
22
+      "size" : "32x32",
23
+      "idiom" : "mac",
24
+      "filename" : "app_icon_64.png",
25
+      "scale" : "2x"
26
+    },
27
+    {
28
+      "size" : "128x128",
29
+      "idiom" : "mac",
30
+      "filename" : "app_icon_128.png",
31
+      "scale" : "1x"
32
+    },
33
+    {
34
+      "size" : "128x128",
35
+      "idiom" : "mac",
36
+      "filename" : "app_icon_256.png",
37
+      "scale" : "2x"
38
+    },
39
+    {
40
+      "size" : "256x256",
41
+      "idiom" : "mac",
42
+      "filename" : "app_icon_256.png",
43
+      "scale" : "1x"
44
+    },
45
+    {
46
+      "size" : "256x256",
47
+      "idiom" : "mac",
48
+      "filename" : "app_icon_512.png",
49
+      "scale" : "2x"
50
+    },
51
+    {
52
+      "size" : "512x512",
53
+      "idiom" : "mac",
54
+      "filename" : "app_icon_512.png",
55
+      "scale" : "1x"
56
+    },
57
+    {
58
+      "size" : "512x512",
59
+      "idiom" : "mac",
60
+      "filename" : "app_icon_1024.png",
61
+      "scale" : "2x"
62
+    }
63
+  ],
64
+  "info" : {
65
+    "version" : 1,
66
+    "author" : "xcode"
67
+  }
68
+}

BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png


BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png


+ 343 - 0
macos/Runner/Base.lproj/MainMenu.xib

@@ -0,0 +1,343 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
3
+    <dependencies>
4
+        <deployment identifier="macosx"/>
5
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
6
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
7
+    </dependencies>
8
+    <objects>
9
+        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
10
+            <connections>
11
+                <outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
12
+            </connections>
13
+        </customObject>
14
+        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
15
+        <customObject id="-3" userLabel="Application" customClass="NSObject"/>
16
+        <customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Runner" customModuleProvider="target">
17
+            <connections>
18
+                <outlet property="applicationMenu" destination="uQy-DD-JDr" id="XBo-yE-nKs"/>
19
+                <outlet property="mainFlutterWindow" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
20
+            </connections>
21
+        </customObject>
22
+        <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
23
+        <menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
24
+            <items>
25
+                <menuItem title="APP_NAME" id="1Xt-HY-uBw">
26
+                    <modifierMask key="keyEquivalentModifierMask"/>
27
+                    <menu key="submenu" title="APP_NAME" systemMenu="apple" id="uQy-DD-JDr">
28
+                        <items>
29
+                            <menuItem title="About APP_NAME" id="5kV-Vb-QxS">
30
+                                <modifierMask key="keyEquivalentModifierMask"/>
31
+                                <connections>
32
+                                    <action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
33
+                                </connections>
34
+                            </menuItem>
35
+                            <menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
36
+                            <menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
37
+                            <menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
38
+                            <menuItem title="Services" id="NMo-om-nkz">
39
+                                <modifierMask key="keyEquivalentModifierMask"/>
40
+                                <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
41
+                            </menuItem>
42
+                            <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
43
+                            <menuItem title="Hide APP_NAME" keyEquivalent="h" id="Olw-nP-bQN">
44
+                                <connections>
45
+                                    <action selector="hide:" target="-1" id="PnN-Uc-m68"/>
46
+                                </connections>
47
+                            </menuItem>
48
+                            <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
49
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
50
+                                <connections>
51
+                                    <action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
52
+                                </connections>
53
+                            </menuItem>
54
+                            <menuItem title="Show All" id="Kd2-mp-pUS">
55
+                                <modifierMask key="keyEquivalentModifierMask"/>
56
+                                <connections>
57
+                                    <action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
58
+                                </connections>
59
+                            </menuItem>
60
+                            <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
61
+                            <menuItem title="Quit APP_NAME" keyEquivalent="q" id="4sb-4s-VLi">
62
+                                <connections>
63
+                                    <action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
64
+                                </connections>
65
+                            </menuItem>
66
+                        </items>
67
+                    </menu>
68
+                </menuItem>
69
+                <menuItem title="Edit" id="5QF-Oa-p0T">
70
+                    <modifierMask key="keyEquivalentModifierMask"/>
71
+                    <menu key="submenu" title="Edit" id="W48-6f-4Dl">
72
+                        <items>
73
+                            <menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
74
+                                <connections>
75
+                                    <action selector="undo:" target="-1" id="M6e-cu-g7V"/>
76
+                                </connections>
77
+                            </menuItem>
78
+                            <menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
79
+                                <connections>
80
+                                    <action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
81
+                                </connections>
82
+                            </menuItem>
83
+                            <menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
84
+                            <menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
85
+                                <connections>
86
+                                    <action selector="cut:" target="-1" id="YJe-68-I9s"/>
87
+                                </connections>
88
+                            </menuItem>
89
+                            <menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
90
+                                <connections>
91
+                                    <action selector="copy:" target="-1" id="G1f-GL-Joy"/>
92
+                                </connections>
93
+                            </menuItem>
94
+                            <menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
95
+                                <connections>
96
+                                    <action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
97
+                                </connections>
98
+                            </menuItem>
99
+                            <menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
100
+                                <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
101
+                                <connections>
102
+                                    <action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
103
+                                </connections>
104
+                            </menuItem>
105
+                            <menuItem title="Delete" id="pa3-QI-u2k">
106
+                                <modifierMask key="keyEquivalentModifierMask"/>
107
+                                <connections>
108
+                                    <action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
109
+                                </connections>
110
+                            </menuItem>
111
+                            <menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
112
+                                <connections>
113
+                                    <action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
114
+                                </connections>
115
+                            </menuItem>
116
+                            <menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
117
+                            <menuItem title="Find" id="4EN-yA-p0u">
118
+                                <modifierMask key="keyEquivalentModifierMask"/>
119
+                                <menu key="submenu" title="Find" id="1b7-l0-nxx">
120
+                                    <items>
121
+                                        <menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
122
+                                            <connections>
123
+                                                <action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
124
+                                            </connections>
125
+                                        </menuItem>
126
+                                        <menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
127
+                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
128
+                                            <connections>
129
+                                                <action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
130
+                                            </connections>
131
+                                        </menuItem>
132
+                                        <menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
133
+                                            <connections>
134
+                                                <action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
135
+                                            </connections>
136
+                                        </menuItem>
137
+                                        <menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
138
+                                            <connections>
139
+                                                <action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
140
+                                            </connections>
141
+                                        </menuItem>
142
+                                        <menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
143
+                                            <connections>
144
+                                                <action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
145
+                                            </connections>
146
+                                        </menuItem>
147
+                                        <menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
148
+                                            <connections>
149
+                                                <action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
150
+                                            </connections>
151
+                                        </menuItem>
152
+                                    </items>
153
+                                </menu>
154
+                            </menuItem>
155
+                            <menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
156
+                                <modifierMask key="keyEquivalentModifierMask"/>
157
+                                <menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
158
+                                    <items>
159
+                                        <menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
160
+                                            <connections>
161
+                                                <action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
162
+                                            </connections>
163
+                                        </menuItem>
164
+                                        <menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
165
+                                            <connections>
166
+                                                <action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
167
+                                            </connections>
168
+                                        </menuItem>
169
+                                        <menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
170
+                                        <menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
171
+                                            <modifierMask key="keyEquivalentModifierMask"/>
172
+                                            <connections>
173
+                                                <action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
174
+                                            </connections>
175
+                                        </menuItem>
176
+                                        <menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
177
+                                            <modifierMask key="keyEquivalentModifierMask"/>
178
+                                            <connections>
179
+                                                <action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
180
+                                            </connections>
181
+                                        </menuItem>
182
+                                        <menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
183
+                                            <modifierMask key="keyEquivalentModifierMask"/>
184
+                                            <connections>
185
+                                                <action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
186
+                                            </connections>
187
+                                        </menuItem>
188
+                                    </items>
189
+                                </menu>
190
+                            </menuItem>
191
+                            <menuItem title="Substitutions" id="9ic-FL-obx">
192
+                                <modifierMask key="keyEquivalentModifierMask"/>
193
+                                <menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
194
+                                    <items>
195
+                                        <menuItem title="Show Substitutions" id="z6F-FW-3nz">
196
+                                            <modifierMask key="keyEquivalentModifierMask"/>
197
+                                            <connections>
198
+                                                <action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
199
+                                            </connections>
200
+                                        </menuItem>
201
+                                        <menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
202
+                                        <menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
203
+                                            <modifierMask key="keyEquivalentModifierMask"/>
204
+                                            <connections>
205
+                                                <action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
206
+                                            </connections>
207
+                                        </menuItem>
208
+                                        <menuItem title="Smart Quotes" id="hQb-2v-fYv">
209
+                                            <modifierMask key="keyEquivalentModifierMask"/>
210
+                                            <connections>
211
+                                                <action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
212
+                                            </connections>
213
+                                        </menuItem>
214
+                                        <menuItem title="Smart Dashes" id="rgM-f4-ycn">
215
+                                            <modifierMask key="keyEquivalentModifierMask"/>
216
+                                            <connections>
217
+                                                <action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
218
+                                            </connections>
219
+                                        </menuItem>
220
+                                        <menuItem title="Smart Links" id="cwL-P1-jid">
221
+                                            <modifierMask key="keyEquivalentModifierMask"/>
222
+                                            <connections>
223
+                                                <action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
224
+                                            </connections>
225
+                                        </menuItem>
226
+                                        <menuItem title="Data Detectors" id="tRr-pd-1PS">
227
+                                            <modifierMask key="keyEquivalentModifierMask"/>
228
+                                            <connections>
229
+                                                <action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
230
+                                            </connections>
231
+                                        </menuItem>
232
+                                        <menuItem title="Text Replacement" id="HFQ-gK-NFA">
233
+                                            <modifierMask key="keyEquivalentModifierMask"/>
234
+                                            <connections>
235
+                                                <action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
236
+                                            </connections>
237
+                                        </menuItem>
238
+                                    </items>
239
+                                </menu>
240
+                            </menuItem>
241
+                            <menuItem title="Transformations" id="2oI-Rn-ZJC">
242
+                                <modifierMask key="keyEquivalentModifierMask"/>
243
+                                <menu key="submenu" title="Transformations" id="c8a-y6-VQd">
244
+                                    <items>
245
+                                        <menuItem title="Make Upper Case" id="vmV-6d-7jI">
246
+                                            <modifierMask key="keyEquivalentModifierMask"/>
247
+                                            <connections>
248
+                                                <action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
249
+                                            </connections>
250
+                                        </menuItem>
251
+                                        <menuItem title="Make Lower Case" id="d9M-CD-aMd">
252
+                                            <modifierMask key="keyEquivalentModifierMask"/>
253
+                                            <connections>
254
+                                                <action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
255
+                                            </connections>
256
+                                        </menuItem>
257
+                                        <menuItem title="Capitalize" id="UEZ-Bs-lqG">
258
+                                            <modifierMask key="keyEquivalentModifierMask"/>
259
+                                            <connections>
260
+                                                <action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
261
+                                            </connections>
262
+                                        </menuItem>
263
+                                    </items>
264
+                                </menu>
265
+                            </menuItem>
266
+                            <menuItem title="Speech" id="xrE-MZ-jX0">
267
+                                <modifierMask key="keyEquivalentModifierMask"/>
268
+                                <menu key="submenu" title="Speech" id="3rS-ZA-NoH">
269
+                                    <items>
270
+                                        <menuItem title="Start Speaking" id="Ynk-f8-cLZ">
271
+                                            <modifierMask key="keyEquivalentModifierMask"/>
272
+                                            <connections>
273
+                                                <action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
274
+                                            </connections>
275
+                                        </menuItem>
276
+                                        <menuItem title="Stop Speaking" id="Oyz-dy-DGm">
277
+                                            <modifierMask key="keyEquivalentModifierMask"/>
278
+                                            <connections>
279
+                                                <action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
280
+                                            </connections>
281
+                                        </menuItem>
282
+                                    </items>
283
+                                </menu>
284
+                            </menuItem>
285
+                        </items>
286
+                    </menu>
287
+                </menuItem>
288
+                <menuItem title="View" id="H8h-7b-M4v">
289
+                    <modifierMask key="keyEquivalentModifierMask"/>
290
+                    <menu key="submenu" title="View" id="HyV-fh-RgO">
291
+                        <items>
292
+                            <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
293
+                                <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
294
+                                <connections>
295
+                                    <action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
296
+                                </connections>
297
+                            </menuItem>
298
+                        </items>
299
+                    </menu>
300
+                </menuItem>
301
+                <menuItem title="Window" id="aUF-d1-5bR">
302
+                    <modifierMask key="keyEquivalentModifierMask"/>
303
+                    <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
304
+                        <items>
305
+                            <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
306
+                                <connections>
307
+                                    <action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
308
+                                </connections>
309
+                            </menuItem>
310
+                            <menuItem title="Zoom" id="R4o-n2-Eq4">
311
+                                <modifierMask key="keyEquivalentModifierMask"/>
312
+                                <connections>
313
+                                    <action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
314
+                                </connections>
315
+                            </menuItem>
316
+                            <menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
317
+                            <menuItem title="Bring All to Front" id="LE2-aR-0XJ">
318
+                                <modifierMask key="keyEquivalentModifierMask"/>
319
+                                <connections>
320
+                                    <action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
321
+                                </connections>
322
+                            </menuItem>
323
+                        </items>
324
+                    </menu>
325
+                </menuItem>
326
+                <menuItem title="Help" id="EPT-qC-fAb">
327
+                    <modifierMask key="keyEquivalentModifierMask"/>
328
+                    <menu key="submenu" title="Help" systemMenu="help" id="rJ0-wn-3NY"/>
329
+                </menuItem>
330
+            </items>
331
+            <point key="canvasLocation" x="142" y="-258"/>
332
+        </menu>
333
+        <window title="APP_NAME" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MainFlutterWindow" customModule="Runner" customModuleProvider="target">
334
+            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
335
+            <rect key="contentRect" x="335" y="390" width="800" height="600"/>
336
+            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1577"/>
337
+            <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
338
+                <rect key="frame" x="0.0" y="0.0" width="800" height="600"/>
339
+                <autoresizingMask key="autoresizingMask"/>
340
+            </view>
341
+        </window>
342
+    </objects>
343
+</document>

+ 0 - 0
macos/Runner/Configs/AppInfo.xcconfig


Some files were not shown because too many files changed in this diff