Compare commits
111 Commits
minimal
...
33bd2b97a1
| Author | SHA1 | Date | |
|---|---|---|---|
| 33bd2b97a1 | |||
| 797f01f76b | |||
| 41264c4d76 | |||
| 4ef42216f8 | |||
| f6b2a6c7d4 | |||
| 8ad2e5988d | |||
| 1b4073f690 | |||
| dd9dd0d087 | |||
| a0c1efc522 | |||
| cd5befddb5 | |||
| 299769ec60 | |||
| accd0cad43 | |||
| 7e6b5f887a | |||
| dd36ab8399 | |||
| b37a33bc2f | |||
| e35608651b | |||
| c6eb97bbb2 | |||
| cb3a843566 | |||
| f5922d9034 | |||
| 1414d370f4 | |||
| e30c5f255c | |||
| e6a7d37519 | |||
| 2f329669e9 | |||
| 773650be82 | |||
| cd258744fc | |||
| eaee1ce820 | |||
| d7ff309c09 | |||
| d55ba7cfdb | |||
| 992f9f3414 | |||
| c3cb6d758c | |||
| cfa9e055f5 | |||
| 494b27bf9e | |||
| eda5f77e2d | |||
| b9e4df069f | |||
| 2fb095bd50 | |||
| 591b6f7aed | |||
| 8e050267e1 | |||
| c95cb75934 | |||
| 0b5ce75d6c | |||
| c67914f286 | |||
| 9145e0e27d | |||
| 445c53d21b | |||
| 56c07852f9 | |||
| fa0587178f | |||
| 8d1c84d9fb | |||
| 0af1b3139c | |||
| 6f084b2349 | |||
| 44cb728fab | |||
| 13e07b007a | |||
| 9c66dffe69 | |||
| d8fd352a62 | |||
| 23fde37e3d | |||
| 4e4cfda40b | |||
| 8a1e5b1ca8 | |||
| acc03f8e2b | |||
| 3abd306e89 | |||
| 4648b0424d | |||
| b04985b71f | |||
| 954ff36640 | |||
| 85b8c4705f | |||
| e8d65ba725 | |||
| 32ae1f5249 | |||
| 7a154b4390 | |||
| 7412d1e074 | |||
| 0508c50b97 | |||
| 0e2a8f89f3 | |||
| 7fdb6c05ee | |||
| 4db56e9c0f | |||
| 0ca29a5293 | |||
| 93dacc35ae | |||
| 167a321cd5 | |||
| 67c3a46cd5 | |||
| 63a86d75d6 | |||
| f760294a39 | |||
| a2b055fe8b | |||
| 14c8cb6f70 | |||
| cac0c1065f | |||
| 15c70acf7b | |||
| b54c29eb4b | |||
| aa7b13b76a | |||
| 30fea7cf8a | |||
| f64ac1ccfd | |||
| 48f4b833f6 | |||
| d67d17e971 | |||
| c2d9e366d1 | |||
| 6f3249631f | |||
| 720dd149a9 | |||
| 44a3fc21fb | |||
| 36751f6ef7 | |||
| 7b33468e3f | |||
| 0f3bf2c2c7 | |||
| 3f157d7ddf | |||
| 2ab96cc3d0 | |||
| 68bf3e9ab3 | |||
| ed892b915b | |||
| 75770c9f16 | |||
| 83ecc0ec8f | |||
| 9154798448 | |||
| 7a9adf8f06 | |||
| c756c4a5be | |||
| 547891437b | |||
| 4437b5368a | |||
| c0c739046a | |||
| b0a91e301e | |||
| b3a9e35f76 | |||
| 0c0234ad3c | |||
| 8e57515eaf | |||
| 64857d8a8b | |||
| bfb238323b | |||
| 3e06c4cd7f | |||
| 6c8ac75b19 |
30
.metadata
@ -4,7 +4,33 @@
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 5f105a6ca7a5ac7b8bc9b241f4c2d86f4188cf5c
|
||||
channel: stable
|
||||
revision: "300451adae589accbece3490f4396f10bdf15e6e"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
||||
# Tracks metadata for the flutter migrate command
|
||||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
- platform: android
|
||||
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
- platform: ios
|
||||
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
- platform: macos
|
||||
create_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
base_revision: 300451adae589accbece3490f4396f10bdf15e6e
|
||||
|
||||
# User provided section
|
||||
|
||||
# List of Local paths (relative to this file) that should be
|
||||
# ignored by the migrate tool.
|
||||
#
|
||||
# Files that are not part of the templates will be ignored by default.
|
||||
unmanaged_files:
|
||||
- 'lib/main.dart'
|
||||
- 'ios/Runner.xcodeproj/project.pbxproj'
|
||||
|
||||
@ -56,7 +56,7 @@ android {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.dvox.gifunavi"
|
||||
minSdkVersion 23
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
targetSdkVersion 33
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
multiDexEnabled true
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
||||
<uses-permission android:name="android.permission.CAMERA"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
<application
|
||||
android:label="岐阜ナビ"
|
||||
android:name="${applicationName}"
|
||||
|
||||
@ -0,0 +1,6 @@
|
||||
package com.dvox.rog_app
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
package com.example.rog_app
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity()
|
||||
@ -1,12 +1,12 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.6.10'
|
||||
ext.kotlin_version = '1.7.10'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
||||
classpath 'com.android.tools.build:gradle:7.3.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
@ -26,6 +26,6 @@ subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
||||
@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
|
||||
|
||||
262
assets/customIcon/SVG/gps_signal_high.svg
Normal file
@ -0,0 +1,262 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="100%" viewBox="0 0 228 218" enable-background="new 0 0 228 218" xml:space="preserve">
|
||||
<path fill="#FEFFFF" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M135.000000,219.000000
|
||||
C90.000000,219.000000 45.500004,219.000000 1.000006,219.000000
|
||||
C1.000004,146.333344 1.000004,73.666679 1.000002,1.000016
|
||||
C76.999992,1.000010 152.999985,1.000010 228.999969,1.000005
|
||||
C228.999985,73.666649 228.999985,146.333298 229.000000,218.999969
|
||||
C197.833328,219.000000 166.666672,219.000000 135.000000,219.000000
|
||||
M216.926804,106.758018
|
||||
C216.298935,102.247208 215.613327,97.743530 215.054062,93.224236
|
||||
C213.384537,79.733543 208.741623,67.187660 201.382111,55.946453
|
||||
C190.106430,38.723576 175.371307,25.233152 156.164032,16.917522
|
||||
C136.226349,8.285669 115.521500,6.060920 94.483315,10.365341
|
||||
C71.584160,15.050518 52.347744,26.579485 37.418335,44.891960
|
||||
C18.040327,68.661095 10.337969,95.891487 15.240112,125.970604
|
||||
C19.248966,150.568604 31.085663,171.387665 50.664322,187.317154
|
||||
C72.992050,205.483292 98.262016,213.677887 127.181602,210.145828
|
||||
C154.338058,206.829102 176.340363,194.057587 193.794693,173.621246
|
||||
C209.871979,154.797241 216.252472,132.119095 216.926804,106.758018
|
||||
z"/>
|
||||
<path fill="#46F805" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M216.958176,107.215469
|
||||
C216.252472,132.119095 209.871979,154.797241 193.794693,173.621246
|
||||
C176.340363,194.057587 154.338058,206.829102 127.181602,210.145828
|
||||
C98.262016,213.677887 72.992050,205.483292 50.664322,187.317154
|
||||
C31.085663,171.387665 19.248966,150.568604 15.240112,125.970604
|
||||
C10.337969,95.891487 18.040327,68.661095 37.418335,44.891960
|
||||
C52.347744,26.579485 71.584160,15.050518 94.483315,10.365341
|
||||
C115.521500,6.060920 136.226349,8.285669 156.164032,16.917522
|
||||
C175.371307,25.233152 190.106430,38.723576 201.382111,55.946453
|
||||
C208.741623,67.187660 213.384537,79.733543 215.054062,93.224236
|
||||
C215.613327,97.743530 216.298935,102.247208 216.958176,107.215469
|
||||
M170.257690,172.011200
|
||||
C183.606674,167.275955 189.974182,158.306335 190.006775,144.156921
|
||||
C190.022507,137.330933 190.101379,130.503281 189.985107,123.679214
|
||||
C189.732086,108.828865 178.083466,97.090584 163.199799,97.031158
|
||||
C131.734024,96.905518 100.267052,96.905540 68.801277,97.031151
|
||||
C53.919376,97.090553 42.259666,108.839653 42.012997,123.679176
|
||||
C41.899563,130.503326 41.978054,137.330917 41.992538,144.156891
|
||||
C42.029594,161.617020 53.294106,172.990005 70.629173,173.003494
|
||||
C100.763527,173.026962 130.897964,173.031647 161.032211,172.973877
|
||||
C163.834534,172.968506 166.635880,172.459641 170.257690,172.011200
|
||||
M180.093246,61.905071
|
||||
C184.279572,59.674881 183.508865,56.653019 181.091934,53.776775
|
||||
C179.638565,52.047207 177.595398,50.817970 175.840652,49.336220
|
||||
C153.985825,30.881453 128.938461,24.002581 100.797737,29.051197
|
||||
C82.948166,32.253517 67.393005,40.134453 54.408386,52.977425
|
||||
C51.930382,55.428398 50.713989,58.398716 52.726345,60.818832
|
||||
C55.025890,63.584339 58.128399,61.783146 60.586048,59.862011
|
||||
C60.976566,59.556744 61.297619,59.163155 61.654312,58.813999
|
||||
C74.537094,46.203491 90.294487,39.048336 107.886360,37.211983
|
||||
C131.251984,34.772926 152.417618,41.060593 170.434204,56.785332
|
||||
C172.967484,58.996365 176.321274,60.267330 180.093246,61.905071
|
||||
M164.998444,65.492867
|
||||
C148.321579,51.725647 129.498550,45.762684 107.793465,48.859478
|
||||
C92.612213,51.025478 79.778320,57.477722 68.698692,67.818382
|
||||
C66.542831,69.830460 64.352570,71.950378 67.375084,74.848778
|
||||
C70.268723,77.623604 72.852974,76.370232 75.459091,74.089806
|
||||
C78.417046,71.501518 81.399467,68.864319 84.693405,66.750366
|
||||
C97.781052,58.351074 111.966118,55.601196 127.467705,57.818993
|
||||
C139.441559,59.532078 149.680389,64.290848 158.627655,72.143814
|
||||
C161.600006,74.752632 164.947571,78.570702 168.577179,75.233856
|
||||
C172.700760,71.442871 167.955780,68.681625 164.998444,65.492867
|
||||
M85.156090,87.966469
|
||||
C86.030838,87.215935 86.905663,86.465485 87.780334,85.714859
|
||||
C99.589012,75.580788 113.011475,71.276520 127.971436,76.731949
|
||||
C134.837952,79.235947 140.830322,84.099312 147.314423,87.722153
|
||||
C148.576660,88.427399 150.783295,89.063324 151.657440,88.450951
|
||||
C152.877655,87.596153 153.735123,85.567230 153.833740,83.983795
|
||||
C153.907288,82.803261 152.775681,81.268318 151.766968,80.341606
|
||||
C136.591522,66.399719 118.981415,62.334915 99.581802,69.069458
|
||||
C92.821068,71.416435 86.716652,75.933937 80.742928,80.080284
|
||||
C79.159348,81.179443 79.172714,84.579338 78.452835,86.922836
|
||||
C80.440567,87.329514 82.428291,87.736198 85.156090,87.966469
|
||||
z"/>
|
||||
<path fill="#020500" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M169.847687,172.097870
|
||||
C166.635880,172.459641 163.834534,172.968506 161.032211,172.973877
|
||||
C130.897964,173.031647 100.763527,173.026962 70.629173,173.003494
|
||||
C53.294106,172.990005 42.029594,161.617020 41.992538,144.156891
|
||||
C41.978054,137.330917 41.899563,130.503326 42.012997,123.679176
|
||||
C42.259666,108.839653 53.919376,97.090553 68.801277,97.031151
|
||||
C100.267052,96.905540 131.734024,96.905518 163.199799,97.031158
|
||||
C178.083466,97.090584 189.732086,108.828865 189.985107,123.679214
|
||||
C190.101379,130.503281 190.022507,137.330933 190.006775,144.156921
|
||||
C189.974182,158.306335 183.606674,167.275955 169.847687,172.097870
|
||||
M98.500000,168.996811
|
||||
C119.999046,168.995728 141.498657,169.087769 162.996918,168.958588
|
||||
C175.874664,168.881226 185.742538,158.974380 185.969498,146.128601
|
||||
C186.099030,138.797882 186.080276,131.461731 185.974792,124.130249
|
||||
C185.785965,111.003746 175.915695,101.077690 162.750229,101.036942
|
||||
C131.585205,100.940483 100.419495,100.940758 69.254471,101.036804
|
||||
C56.089668,101.077377 46.218140,111.001488 46.024536,124.126472
|
||||
C45.918854,131.291275 45.934669,138.459747 46.020058,145.625076
|
||||
C46.180038,159.049927 56.034389,168.859863 69.501350,168.979355
|
||||
C78.833557,169.062180 88.167068,168.996262 98.500000,168.996811
|
||||
z"/>
|
||||
<path fill="#010101" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M179.694244,61.939251
|
||||
C176.321274,60.267330 172.967484,58.996365 170.434204,56.785332
|
||||
C152.417618,41.060593 131.251984,34.772926 107.886360,37.211983
|
||||
C90.294487,39.048336 74.537094,46.203491 61.654312,58.813999
|
||||
C61.297619,59.163155 60.976566,59.556744 60.586048,59.862011
|
||||
C58.128399,61.783146 55.025890,63.584339 52.726345,60.818832
|
||||
C50.713989,58.398716 51.930382,55.428398 54.408386,52.977425
|
||||
C67.393005,40.134453 82.948166,32.253517 100.797737,29.051197
|
||||
C128.938461,24.002581 153.985825,30.881453 175.840652,49.336220
|
||||
C177.595398,50.817970 179.638565,52.047207 181.091934,53.776775
|
||||
C183.508865,56.653019 184.279572,59.674881 179.694244,61.939251
|
||||
z"/>
|
||||
<path fill="#020202" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M165.255981,65.750282
|
||||
C167.955780,68.681625 172.700760,71.442871 168.577179,75.233856
|
||||
C164.947571,78.570702 161.600006,74.752632 158.627655,72.143814
|
||||
C149.680389,64.290848 139.441559,59.532078 127.467705,57.818993
|
||||
C111.966118,55.601196 97.781052,58.351074 84.693405,66.750366
|
||||
C81.399467,68.864319 78.417046,71.501518 75.459091,74.089806
|
||||
C72.852974,76.370232 70.268723,77.623604 67.375084,74.848778
|
||||
C64.352570,71.950378 66.542831,69.830460 68.698692,67.818382
|
||||
C79.778320,57.477722 92.612213,51.025478 107.793465,48.859478
|
||||
C129.498550,45.762684 148.321579,51.725647 165.255981,65.750282
|
||||
z"/>
|
||||
<path fill="#010101" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M84.786057,88.054672
|
||||
C82.428291,87.736198 80.440567,87.329514 78.452835,86.922836
|
||||
C79.172714,84.579338 79.159348,81.179443 80.742928,80.080284
|
||||
C86.716652,75.933937 92.821068,71.416435 99.581802,69.069458
|
||||
C118.981415,62.334915 136.591522,66.399719 151.766968,80.341606
|
||||
C152.775681,81.268318 153.907288,82.803261 153.833740,83.983795
|
||||
C153.735123,85.567230 152.877655,87.596153 151.657440,88.450951
|
||||
C150.783295,89.063324 148.576660,88.427399 147.314423,87.722153
|
||||
C140.830322,84.099312 134.837952,79.235947 127.971436,76.731949
|
||||
C113.011475,71.276520 99.589012,75.580788 87.780334,85.714859
|
||||
C86.905663,86.465485 86.030838,87.215935 84.786057,88.054672
|
||||
z"/>
|
||||
<path fill="#45F405" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M98.000000,168.996811
|
||||
C88.167068,168.996262 78.833557,169.062180 69.501350,168.979355
|
||||
C56.034389,168.859863 46.180038,159.049927 46.020058,145.625076
|
||||
C45.934669,138.459747 45.918854,131.291275 46.024536,124.126472
|
||||
C46.218140,111.001488 56.089668,101.077377 69.254471,101.036804
|
||||
C100.419495,100.940758 131.585205,100.940483 162.750229,101.036942
|
||||
C175.915695,101.077690 185.785965,111.003746 185.974792,124.130249
|
||||
C186.080276,131.461731 186.099030,138.797882 185.969498,146.128601
|
||||
C185.742538,158.974380 175.874664,168.881226 162.996918,168.958588
|
||||
C141.498657,169.087769 119.999046,168.995728 98.000000,168.996811
|
||||
M72.517471,156.298859
|
||||
C80.138840,159.353607 87.503647,157.838089 94.688698,154.830109
|
||||
C95.777313,154.374374 97.062141,152.817688 97.112732,151.717651
|
||||
C97.362045,146.296997 97.226082,140.858612 97.226082,135.358704
|
||||
C91.435829,135.358704 86.228844,135.358704 81.073105,135.358704
|
||||
C81.073105,136.997421 81.073105,138.269821 81.073105,140.145599
|
||||
C84.855919,140.145599 88.409081,140.145599 92.144981,140.145599
|
||||
C92.144981,143.241974 92.413750,145.774017 92.037720,148.206375
|
||||
C91.833107,149.529877 90.811729,151.316467 89.682938,151.813416
|
||||
C81.482758,155.423401 71.780396,152.478333 67.757477,145.417282
|
||||
C63.080647,137.208466 64.778267,124.736839 71.652496,119.923119
|
||||
C73.959686,118.307503 77.209213,117.011337 79.913063,117.201736
|
||||
C85.570892,117.600159 91.152313,119.083649 97.027321,120.169975
|
||||
C98.037239,117.505173 97.189743,115.156593 93.452667,114.222862
|
||||
C91.206703,113.661690 88.953072,113.120949 86.684349,112.662804
|
||||
C74.903259,110.283730 64.786530,115.311432 61.294830,125.569092
|
||||
C57.996853,135.257660 59.286362,150.979126 72.517471,156.298859
|
||||
M140.788330,119.740959
|
||||
C138.112366,128.469070 141.109146,133.963821 149.899292,136.252609
|
||||
C153.896698,137.293457 158.124466,137.712418 161.887756,139.278488
|
||||
C163.759872,140.057587 165.789642,142.695450 165.977692,144.661774
|
||||
C166.170288,146.675629 164.674255,149.437943 163.039337,150.870941
|
||||
C161.472122,152.244598 158.698685,153.069962 156.594650,152.843307
|
||||
C150.966522,152.237030 145.413147,150.937057 139.203979,149.797836
|
||||
C139.708023,151.318359 139.750885,153.912521 141.020294,154.855392
|
||||
C146.890152,159.215347 160.245956,159.017899 166.246948,154.847000
|
||||
C170.232544,152.076889 172.367737,148.268097 171.807266,143.340729
|
||||
C171.237473,138.331589 168.256500,135.199158 163.455536,133.913345
|
||||
C159.295914,132.799316 155.060211,131.971436 150.891037,130.890259
|
||||
C147.499298,130.010696 145.271240,127.852997 145.195877,124.221153
|
||||
C145.117767,120.457268 147.679672,118.578964 150.906433,117.576622
|
||||
C152.302765,117.142876 153.916183,116.814148 155.310913,117.076363
|
||||
C160.199585,117.995430 165.036011,119.192436 170.559433,120.433838
|
||||
C169.943695,118.554634 169.853897,115.591080 168.644943,115.027275
|
||||
C160.778381,111.358612 147.479202,109.327438 140.788330,119.740959
|
||||
M132.817932,132.896713
|
||||
C135.846466,124.082535 133.661346,116.655113 126.259239,114.718079
|
||||
C119.749092,113.014465 112.756485,113.154472 105.958328,112.478416
|
||||
C105.958328,128.098404 105.958328,142.348679 105.958328,156.683014
|
||||
C107.664940,156.683014 109.056923,156.683014 111.030914,156.683014
|
||||
C111.030914,151.333450 111.030914,146.281372 111.030914,141.143188
|
||||
C119.350121,140.867004 127.513252,141.644302 132.817932,132.896713
|
||||
z"/>
|
||||
<path fill="#060B04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M72.141678,156.177597
|
||||
C59.286362,150.979126 57.996853,135.257660 61.294830,125.569092
|
||||
C64.786530,115.311432 74.903259,110.283730 86.684349,112.662804
|
||||
C88.953072,113.120949 91.206703,113.661690 93.452667,114.222862
|
||||
C97.189743,115.156593 98.037239,117.505173 97.027321,120.169975
|
||||
C91.152313,119.083649 85.570892,117.600159 79.913063,117.201736
|
||||
C77.209213,117.011337 73.959686,118.307503 71.652496,119.923119
|
||||
C64.778267,124.736839 63.080647,137.208466 67.757477,145.417282
|
||||
C71.780396,152.478333 81.482758,155.423401 89.682938,151.813416
|
||||
C90.811729,151.316467 91.833107,149.529877 92.037720,148.206375
|
||||
C92.413750,145.774017 92.144981,143.241974 92.144981,140.145599
|
||||
C88.409081,140.145599 84.855919,140.145599 81.073105,140.145599
|
||||
C81.073105,138.269821 81.073105,136.997421 81.073105,135.358704
|
||||
C86.228844,135.358704 91.435829,135.358704 97.226082,135.358704
|
||||
C97.226082,140.858612 97.362045,146.296997 97.112732,151.717651
|
||||
C97.062141,152.817688 95.777313,154.374374 94.688698,154.830109
|
||||
C87.503647,157.838089 80.138840,159.353607 72.141678,156.177597
|
||||
z"/>
|
||||
<path fill="#060C04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M140.952881,119.380417
|
||||
C147.479202,109.327438 160.778381,111.358612 168.644943,115.027275
|
||||
C169.853897,115.591080 169.943695,118.554634 170.559433,120.433838
|
||||
C165.036011,119.192436 160.199585,117.995430 155.310913,117.076363
|
||||
C153.916183,116.814148 152.302765,117.142876 150.906433,117.576622
|
||||
C147.679672,118.578964 145.117767,120.457268 145.195877,124.221153
|
||||
C145.271240,127.852997 147.499298,130.010696 150.891037,130.890259
|
||||
C155.060211,131.971436 159.295914,132.799316 163.455536,133.913345
|
||||
C168.256500,135.199158 171.237473,138.331589 171.807266,143.340729
|
||||
C172.367737,148.268097 170.232544,152.076889 166.246948,154.847000
|
||||
C160.245956,159.017899 146.890152,159.215347 141.020294,154.855392
|
||||
C139.750885,153.912521 139.708023,151.318359 139.203979,149.797836
|
||||
C145.413147,150.937057 150.966522,152.237030 156.594650,152.843307
|
||||
C158.698685,153.069962 161.472122,152.244598 163.039337,150.870941
|
||||
C164.674255,149.437943 166.170288,146.675629 165.977692,144.661774
|
||||
C165.789642,142.695450 163.759872,140.057587 161.887756,139.278488
|
||||
C158.124466,137.712418 153.896698,137.293457 149.899292,136.252609
|
||||
C141.109146,133.963821 138.112366,128.469070 140.952881,119.380417
|
||||
z"/>
|
||||
<path fill="#050B04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M132.604187,133.225220
|
||||
C127.513252,141.644302 119.350121,140.867004 111.030914,141.143188
|
||||
C111.030914,146.281372 111.030914,151.333450 111.030914,156.683014
|
||||
C109.056923,156.683014 107.664940,156.683014 105.958328,156.683014
|
||||
C105.958328,142.348679 105.958328,128.098404 105.958328,112.478416
|
||||
C112.756485,113.154472 119.749092,113.014465 126.259239,114.718079
|
||||
C133.661346,116.655113 135.846466,124.082535 132.604187,133.225220
|
||||
M121.717529,118.245148
|
||||
C118.152855,118.245148 114.588173,118.245148 111.147324,118.245148
|
||||
C111.147324,124.415359 111.147324,130.005188 111.147324,135.548203
|
||||
C121.878319,136.871048 126.539490,135.156418 128.297501,129.385284
|
||||
C129.804199,124.439133 128.007614,121.018356 121.717529,118.245148
|
||||
z"/>
|
||||
<path fill="#45F405" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M122.127472,118.331490
|
||||
C128.007614,121.018356 129.804199,124.439133 128.297501,129.385284
|
||||
C126.539490,135.156418 121.878319,136.871048 111.147324,135.548203
|
||||
C111.147324,130.005188 111.147324,124.415359 111.147324,118.245148
|
||||
C114.588173,118.245148 118.152855,118.245148 122.127472,118.331490
|
||||
z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
330
assets/customIcon/SVG/gps_signal_low.svg
Normal file
@ -0,0 +1,330 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="100%" viewBox="0 0 228 218" enable-background="new 0 0 228 218" xml:space="preserve">
|
||||
<path fill="#FFFDFD" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M1.000000,79.000000
|
||||
C1.000000,52.666668 1.000000,26.833336 1.000000,1.000004
|
||||
C76.999992,1.000002 152.999985,1.000002 229.000000,1.000001
|
||||
C229.000000,73.666656 229.000000,146.333313 229.000000,218.999969
|
||||
C153.000015,218.999985 77.000031,218.999985 1.000022,219.000000
|
||||
C1.000000,172.500000 1.000000,126.000000 1.000000,79.000000
|
||||
M11.639966,126.773796
|
||||
C13.368825,133.145004 14.506862,139.750229 16.922529,145.849426
|
||||
C32.487865,185.149628 61.664894,208.079315 103.304634,213.091293
|
||||
C160.019211,219.917770 210.397430,180.915848 218.644272,124.403412
|
||||
C224.300415,85.644035 210.913300,53.167866 180.960480,28.411943
|
||||
C157.441650,8.973706 129.616989,1.812979 99.315132,6.280443
|
||||
C72.216248,10.275686 49.832855,23.236273 32.848125,44.679813
|
||||
C13.972346,68.510826 6.996265,95.803246 11.639966,126.773796
|
||||
z"/>
|
||||
<path fill="#FF2504" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M11.496333,126.355560
|
||||
C6.996265,95.803246 13.972346,68.510826 32.848125,44.679813
|
||||
C49.832855,23.236273 72.216248,10.275686 99.315132,6.280443
|
||||
C129.616989,1.812979 157.441650,8.973706 180.960480,28.411943
|
||||
C210.913300,53.167866 224.300415,85.644035 218.644272,124.403412
|
||||
C210.397430,180.915848 160.019211,219.917770 103.304634,213.091293
|
||||
C61.664894,208.079315 32.487865,185.149628 16.922529,145.849426
|
||||
C14.506862,139.750229 13.368825,133.145004 11.496333,126.355560
|
||||
M105.000961,124.105751
|
||||
C105.000961,124.105751 104.745796,124.369095 104.126457,124.851120
|
||||
C100.903809,128.180267 97.681160,131.509430 94.014862,135.415359
|
||||
C92.627441,136.750137 91.240021,138.084900 89.289009,139.650360
|
||||
C84.996109,144.049606 80.703217,148.448868 76.002815,153.427597
|
||||
C74.987877,154.413361 73.972946,155.399124 72.377853,156.613983
|
||||
C68.737885,160.356186 65.097916,164.098404 61.006866,168.430603
|
||||
C60.283661,169.104675 59.560459,169.778763 58.289165,170.704544
|
||||
C55.042290,173.982681 51.795414,177.260834 48.552605,180.534882
|
||||
C82.994301,214.508865 145.702423,218.280518 185.476105,177.128098
|
||||
C226.652496,134.524384 217.321259,73.152115 186.614212,43.774364
|
||||
C174.551575,55.470825 162.498383,67.158127 150.018738,79.426643
|
||||
C147.977737,81.422966 145.936737,83.419296 143.333710,85.661514
|
||||
C139.707977,89.386589 136.082260,93.111664 132.014343,97.419563
|
||||
C130.956894,98.429230 129.899445,99.438904 128.291153,100.697105
|
||||
C124.347298,104.744133 120.403442,108.791161 116.013718,113.416931
|
||||
C114.622208,114.761574 113.230698,116.106216 111.420296,117.562943
|
||||
C111.083664,118.011703 110.747025,118.460464 110.032127,119.481323
|
||||
C108.737732,120.750404 107.443336,122.019478 105.670601,123.352196
|
||||
C105.360893,123.514114 105.177956,123.767578 105.199974,124.123863
|
||||
C105.199974,124.123863 105.207138,124.202545 105.000961,124.105751
|
||||
M97.365318,121.754982
|
||||
C97.365318,121.754982 97.213715,121.963066 97.845581,121.442192
|
||||
C104.512207,114.685333 111.178833,107.928474 118.500191,100.945206
|
||||
C119.392036,99.910851 120.283882,98.876495 121.751778,97.570831
|
||||
C127.133148,92.088036 132.514511,86.605240 138.523697,80.844315
|
||||
C140.405289,78.845688 142.286880,76.847061 144.745758,74.576729
|
||||
C156.881119,62.501865 169.016479,50.427002 181.608673,37.897579
|
||||
C154.406204,14.610365 123.778397,6.216994 89.911461,15.453262
|
||||
C52.041664,25.781202 27.739298,51.061649 19.264135,89.561996
|
||||
C12.119747,122.016998 21.118900,150.817780 43.570446,176.293015
|
||||
C46.408489,172.817307 48.782036,169.910477 51.761181,166.756165
|
||||
C52.564640,166.119461 53.368103,165.482758 54.750069,164.576660
|
||||
C58.780914,160.442413 62.811756,156.308182 67.494316,151.947662
|
||||
C68.381996,150.919205 69.269676,149.890747 70.741211,148.598434
|
||||
C79.639664,139.629562 88.538116,130.660690 97.365318,121.754982
|
||||
z"/>
|
||||
<path fill="#FFFDFD" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M137.895889,81.122437
|
||||
C132.514511,86.605240 127.133148,92.088036 121.203033,97.351173
|
||||
C103.025848,97.091690 85.395264,96.869644 67.769722,97.076775
|
||||
C56.221268,97.212502 45.512978,105.498947 43.195145,116.814857
|
||||
C41.782555,123.711281 42.512241,131.023132 41.946785,138.121857
|
||||
C41.075527,149.059464 43.313717,158.896744 51.155586,167.003632
|
||||
C48.782036,169.910477 46.408489,172.817307 43.570446,176.293015
|
||||
C21.118900,150.817780 12.119747,122.016998 19.264135,89.561996
|
||||
C27.739298,51.061649 52.041664,25.781202 89.911461,15.453262
|
||||
C123.778397,6.216994 154.406204,14.610365 181.608673,37.897579
|
||||
C169.016479,50.427002 156.881119,62.501865 144.284332,74.402267
|
||||
C133.061005,67.261986 121.571854,64.977112 108.689606,66.768036
|
||||
C98.101250,68.240059 89.426727,72.794106 81.422020,79.212433
|
||||
C78.929924,81.210640 76.201401,83.903252 79.084648,87.474594
|
||||
C81.710503,90.727127 84.501549,88.788292 86.653313,86.752617
|
||||
C96.766685,77.184860 108.662163,72.732277 122.412636,75.177612
|
||||
C127.757095,76.128052 132.745361,79.081444 137.895889,81.122437
|
||||
z"/>
|
||||
<path fill="#FFFCFC" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M150.445175,78.845428
|
||||
C162.498383,67.158127 174.551575,55.470825 186.614212,43.774364
|
||||
C217.321259,73.152115 226.652496,134.524384 185.476105,177.128098
|
||||
C145.702423,218.280518 82.994301,214.508865 48.552605,180.534882
|
||||
C51.795414,177.260834 55.042290,173.982681 58.787811,170.854355
|
||||
C62.340233,171.669189 65.391464,172.898407 68.448189,172.912216
|
||||
C100.058250,173.055099 131.669632,173.100220 163.279694,172.959961
|
||||
C178.127716,172.894073 189.722794,161.139160 189.977921,146.287476
|
||||
C190.100784,139.135544 190.048309,131.979492 189.996063,124.825905
|
||||
C189.876923,108.510101 178.320450,97.086761 161.895279,96.994812
|
||||
C152.082382,96.939880 142.269440,96.889275 132.456543,96.836731
|
||||
C136.082260,93.111664 139.707977,89.386589 143.867645,85.763756
|
||||
C145.317841,86.476974 146.161362,87.386642 147.166794,87.631554
|
||||
C148.831512,88.037079 151.667770,88.712051 152.111969,88.032509
|
||||
C153.161255,86.427338 153.520279,84.047508 153.314774,82.068565
|
||||
C153.194168,80.907379 151.455826,79.914185 150.445175,78.845428
|
||||
z"/>
|
||||
<path fill="#FBFBFB" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M61.457951,167.840622
|
||||
C65.097916,164.098404 68.737885,160.356186 72.965790,156.733490
|
||||
C78.435059,156.932831 83.451775,157.772385 88.169090,156.931763
|
||||
C97.510834,155.267044 97.442612,154.883408 97.442383,145.498642
|
||||
C97.442314,142.849426 97.718674,140.155685 97.304199,137.572876
|
||||
C97.137787,136.535919 95.452484,135.742722 94.458511,134.838577
|
||||
C97.681160,131.509430 100.903809,128.180267 104.519241,124.784599
|
||||
C104.912018,124.718079 105.248154,124.516663 105.281403,125.014679
|
||||
C105.314659,135.928513 105.314659,146.344330 105.314659,156.741913
|
||||
C107.468216,156.741913 109.050301,156.741913 110.929352,156.741913
|
||||
C110.929352,154.017075 110.929352,151.549332 110.929352,149.081604
|
||||
C110.929352,146.478363 110.929352,143.875107 110.929352,141.477814
|
||||
C115.703285,140.967667 120.061005,140.971725 124.166908,139.956924
|
||||
C130.900314,138.292740 134.390732,132.935211 134.184189,125.804550
|
||||
C133.991272,119.144508 130.499237,115.135078 123.345245,113.628845
|
||||
C121.094315,113.154922 118.757233,113.090195 116.459587,112.838181
|
||||
C120.403442,108.791161 124.347298,104.744133 128.903076,100.829170
|
||||
C140.680008,100.977264 151.846390,100.889809 163.009689,101.036476
|
||||
C175.885803,101.205620 185.722183,111.017990 185.970047,123.852043
|
||||
C186.098740,130.515442 186.009277,137.183319 185.995560,143.849136
|
||||
C185.963165,159.598953 176.578308,168.986176 160.818161,168.993973
|
||||
C131.321793,169.008545 101.825294,169.037949 72.329208,168.947098
|
||||
C68.704353,168.935944 65.081650,168.226471 61.457951,167.840622
|
||||
M145.939529,114.214363
|
||||
C143.940674,116.751434 141.046677,119.002518 140.126068,121.884071
|
||||
C138.100525,128.224045 141.480881,133.802322 148.046112,135.837494
|
||||
C152.151184,137.110031 156.474060,137.662109 160.654282,138.715790
|
||||
C163.776978,139.502899 166.042191,141.207657 166.183472,144.858505
|
||||
C166.328384,148.603088 164.368378,150.845871 161.102890,151.965500
|
||||
C159.252457,152.599945 157.118576,153.201859 155.268021,152.891190
|
||||
C149.969879,152.001770 144.751236,150.638794 138.517899,149.241592
|
||||
C139.597397,151.333374 140.149109,154.458206 141.767899,155.175751
|
||||
C148.064041,157.966660 154.767532,159.103271 161.655319,157.079300
|
||||
C167.990829,155.217606 172.029266,150.378036 171.997452,144.605362
|
||||
C171.964813,138.681259 168.646240,134.974701 161.524139,133.154968
|
||||
C158.146896,132.292084 154.692505,131.735764 151.297012,130.938553
|
||||
C147.668518,130.086639 144.685089,127.702515 145.517548,124.081390
|
||||
C146.088058,121.599678 148.889816,118.651749 151.338333,117.828773
|
||||
C154.399582,116.799850 158.204224,117.310249 161.533524,117.954361
|
||||
C164.435913,118.515869 167.123947,120.185417 169.906693,121.365379
|
||||
C170.275177,121.140579 170.643661,120.915779 171.012146,120.690979
|
||||
C170.000900,118.592896 169.496750,115.277092 167.890350,114.608116
|
||||
C161.039520,111.755180 153.844528,110.492722 145.939529,114.214363
|
||||
z"/>
|
||||
<path fill="#FCFAFA" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M117.845451,101.171616
|
||||
C111.178833,107.928474 104.512207,114.685333 97.510864,121.242249
|
||||
C98.372559,117.041649 96.836845,114.757133 92.810448,113.911087
|
||||
C90.391205,113.402748 88.035027,112.548340 85.600800,112.165428
|
||||
C75.996300,110.654625 67.000435,114.554688 62.838375,121.894341
|
||||
C58.096054,130.257263 58.836342,144.041550 64.456787,150.647156
|
||||
C65.041946,151.334869 66.037476,151.673401 66.842606,152.173950
|
||||
C62.811756,156.308182 58.780914,160.442413 54.419048,164.361145
|
||||
C49.781567,159.034683 46.015305,153.674744 46.015427,146.584869
|
||||
C46.015564,138.781418 45.837093,130.972702 46.062771,123.175743
|
||||
C46.410538,111.160713 56.074387,101.270645 68.046333,101.101608
|
||||
C84.642395,100.867287 101.245415,101.124725 117.845451,101.171616
|
||||
z"/>
|
||||
<path fill="#050505" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M61.232410,168.135620
|
||||
C65.081650,168.226471 68.704353,168.935944 72.329208,168.947098
|
||||
C101.825294,169.037949 131.321793,169.008545 160.818161,168.993973
|
||||
C176.578308,168.986176 185.963165,159.598953 185.995560,143.849136
|
||||
C186.009277,137.183319 186.098740,130.515442 185.970047,123.852043
|
||||
C185.722183,111.017990 175.885803,101.205620 163.009689,101.036476
|
||||
C151.846390,100.889809 140.680008,100.977264 129.178497,100.704903
|
||||
C129.899445,99.438904 130.956894,98.429230 132.235443,97.128143
|
||||
C142.269440,96.889275 152.082382,96.939880 161.895279,96.994812
|
||||
C178.320450,97.086761 189.876923,108.510101 189.996063,124.825905
|
||||
C190.048309,131.979492 190.100784,139.135544 189.977921,146.287476
|
||||
C189.722794,161.139160 178.127716,172.894073 163.279694,172.959961
|
||||
C131.669632,173.100220 100.058250,173.055099 68.448189,172.912216
|
||||
C65.391464,172.898407 62.340233,171.669189 59.061852,170.728516
|
||||
C59.560459,169.778763 60.283661,169.104675 61.232410,168.135620
|
||||
z"/>
|
||||
<path fill="#010101" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M138.209793,80.983383
|
||||
C132.745361,79.081444 127.757095,76.128052 122.412636,75.177612
|
||||
C108.662163,72.732277 96.766685,77.184860 86.653313,86.752617
|
||||
C84.501549,88.788292 81.710503,90.727127 79.084648,87.474594
|
||||
C76.201401,83.903252 78.929924,81.210640 81.422020,79.212433
|
||||
C89.426727,72.794106 98.101250,68.240059 108.689606,66.768036
|
||||
C121.571854,64.977112 133.061005,67.261986 143.995697,74.538116
|
||||
C142.286880,76.847061 140.405289,78.845688 138.209793,80.983383
|
||||
z"/>
|
||||
<path fill="#FAF8F8" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M97.436569,121.691833
|
||||
C88.538116,130.660690 79.639664,139.629562 70.295746,148.418472
|
||||
C64.737686,141.993805 64.391373,134.882599 66.477417,127.548653
|
||||
C68.372246,120.886932 73.625763,116.536835 80.479477,117.208832
|
||||
C86.223137,117.771988 91.790909,120.129066 97.436569,121.691833
|
||||
z"/>
|
||||
<path fill="#060606" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M118.172821,101.058411
|
||||
C101.245415,101.124725 84.642395,100.867287 68.046333,101.101608
|
||||
C56.074387,101.270645 46.410538,111.160713 46.062771,123.175743
|
||||
C45.837093,130.972702 46.015564,138.781418 46.015427,146.584869
|
||||
C46.015305,153.674744 49.781567,159.034683 54.129795,164.495834
|
||||
C53.368103,165.482758 52.564640,166.119461 51.458385,166.879898
|
||||
C43.313717,158.896744 41.075527,149.059464 41.946785,138.121857
|
||||
C42.512241,131.023132 41.782555,123.711281 43.195145,116.814857
|
||||
C45.512978,105.498947 56.221268,97.212502 67.769722,97.076775
|
||||
C85.395264,96.869644 103.025848,97.091690 120.915009,97.486824
|
||||
C120.283882,98.876495 119.392036,99.910851 118.172821,101.058411
|
||||
z"/>
|
||||
<path fill="#0A0A0A" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M116.236649,113.127556
|
||||
C118.757233,113.090195 121.094315,113.154922 123.345245,113.628845
|
||||
C130.499237,115.135078 133.991272,119.144508 134.184189,125.804550
|
||||
C134.390732,132.935211 130.900314,138.292740 124.166908,139.956924
|
||||
C120.061005,140.971725 115.703285,140.967667 110.929352,141.477814
|
||||
C110.929352,143.875107 110.929352,146.478363 110.929352,149.081604
|
||||
C110.929352,151.549332 110.929352,154.017075 110.929352,156.741913
|
||||
C109.050301,156.741913 107.468216,156.741913 105.314659,156.741913
|
||||
C105.314659,146.344330 105.314659,135.928513 105.314552,124.930588
|
||||
C105.314445,124.348495 105.207138,124.202545 105.207138,124.202545
|
||||
C105.207138,124.202545 105.199974,124.123863 105.432587,124.200241
|
||||
C105.826439,123.947266 105.987694,123.617912 106.148941,123.288559
|
||||
C107.443336,122.019478 108.737732,120.750404 110.459549,119.536423
|
||||
C110.886978,125.002693 110.886978,130.413849 110.886978,136.127319
|
||||
C114.515312,135.959579 117.518089,136.096848 120.422874,135.627579
|
||||
C126.052094,134.718201 128.809967,131.341278 128.613159,126.167221
|
||||
C128.432465,121.417213 125.291023,118.551018 119.639153,118.037651
|
||||
C117.042809,117.801819 114.439392,117.644035 111.839188,117.450867
|
||||
C113.230698,116.106216 114.622208,114.761574 116.236649,113.127556
|
||||
z"/>
|
||||
<path fill="#0C0C0C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M97.400940,121.723404
|
||||
C91.790909,120.129066 86.223137,117.771988 80.479477,117.208832
|
||||
C73.625763,116.536835 68.372246,120.886932 66.477417,127.548653
|
||||
C64.391373,134.882599 64.737686,141.993805 70.003822,148.550400
|
||||
C69.269676,149.890747 68.381996,150.919205 67.168457,152.060806
|
||||
C66.037476,151.673401 65.041946,151.334869 64.456787,150.647156
|
||||
C58.836342,144.041550 58.096054,130.257263 62.838375,121.894341
|
||||
C67.000435,114.554688 75.996300,110.654625 85.600800,112.165428
|
||||
C88.035027,112.548340 90.391205,113.402748 92.810448,113.911087
|
||||
C96.836845,114.757133 98.372559,117.041649 97.194931,121.502686
|
||||
C97.213715,121.963066 97.365318,121.754982 97.400940,121.723404
|
||||
z"/>
|
||||
<path fill="#FBFBFB" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M111.629738,117.506897
|
||||
C114.439392,117.644035 117.042809,117.801819 119.639153,118.037651
|
||||
C125.291023,118.551018 128.432465,121.417213 128.613159,126.167221
|
||||
C128.809967,131.341278 126.052094,134.718201 120.422874,135.627579
|
||||
C117.518089,136.096848 114.515312,135.959579 110.886978,136.127319
|
||||
C110.886978,130.413849 110.886978,125.002693 110.648682,119.250374
|
||||
C110.747025,118.460464 111.083664,118.011703 111.629738,117.506897
|
||||
z"/>
|
||||
<path fill="#0A0A0A" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M94.236687,135.126968
|
||||
C95.452484,135.742722 97.137787,136.535919 97.304199,137.572876
|
||||
C97.718674,140.155685 97.442314,142.849426 97.442383,145.498642
|
||||
C97.442612,154.883408 97.510834,155.267044 88.169090,156.931763
|
||||
C83.451775,157.772385 78.435059,156.932831 73.255867,156.618927
|
||||
C73.972946,155.399124 74.987877,154.413361 76.630783,153.063126
|
||||
C80.869255,152.556152 84.515709,152.662720 88.072685,152.149353
|
||||
C89.508911,151.942062 91.964752,150.228165 91.869156,149.459534
|
||||
C91.450981,146.097366 94.279053,141.938400 89.852600,139.419662
|
||||
C91.240021,138.084900 92.627441,136.750137 94.236687,135.126968
|
||||
z"/>
|
||||
<path fill="#FAEEEE" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M89.570801,139.535004
|
||||
C94.279053,141.938400 91.450981,146.097366 91.869156,149.459534
|
||||
C91.964752,150.228165 89.508911,151.942062 88.072685,152.149353
|
||||
C84.515709,152.662720 80.869255,152.556152 76.834534,152.773392
|
||||
C80.703217,148.448868 84.996109,144.049606 89.570801,139.535004
|
||||
z"/>
|
||||
<path fill="#010101" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M150.231964,79.136032
|
||||
C151.455826,79.914185 153.194168,80.907379 153.314774,82.068565
|
||||
C153.520279,84.047508 153.161255,86.427338 152.111969,88.032509
|
||||
C151.667770,88.712051 148.831512,88.037079 147.166794,87.631554
|
||||
C146.161362,87.386642 145.317841,86.476974 144.148651,85.640808
|
||||
C145.936737,83.419296 147.977737,81.422966 150.231964,79.136032
|
||||
z"/>
|
||||
<path fill="#716A6A" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M105.909775,123.320374
|
||||
C105.987694,123.617912 105.826439,123.947266 105.393486,124.194603
|
||||
C105.177956,123.767578 105.360893,123.514114 105.909775,123.320374
|
||||
z"/>
|
||||
<path fill="#716A6A" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M105.104050,124.154144
|
||||
C105.207138,124.202545 105.314445,124.348495 105.281296,124.432579
|
||||
C105.248154,124.516663 104.912018,124.718079 104.828903,124.543587
|
||||
C104.745796,124.369095 105.000961,124.105751 105.104050,124.154144
|
||||
z"/>
|
||||
<path fill="#0C0C0C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M146.297729,114.064087
|
||||
C153.844528,110.492722 161.039520,111.755180 167.890350,114.608116
|
||||
C169.496750,115.277092 170.000900,118.592896 171.012146,120.690979
|
||||
C170.643661,120.915779 170.275177,121.140579 169.906693,121.365379
|
||||
C167.123947,120.185417 164.435913,118.515869 161.533524,117.954361
|
||||
C158.204224,117.310249 154.399582,116.799850 151.338333,117.828773
|
||||
C148.889816,118.651749 146.088058,121.599678 145.517548,124.081390
|
||||
C144.685089,127.702515 147.668518,130.086639 151.297012,130.938553
|
||||
C154.692505,131.735764 158.146896,132.292084 161.524139,133.154968
|
||||
C168.646240,134.974701 171.964813,138.681259 171.997452,144.605362
|
||||
C172.029266,150.378036 167.990829,155.217606 161.655319,157.079300
|
||||
C154.767532,159.103271 148.064041,157.966660 141.767899,155.175751
|
||||
C140.149109,154.458206 139.597397,151.333374 138.517899,149.241592
|
||||
C144.751236,150.638794 149.969879,152.001770 155.268021,152.891190
|
||||
C157.118576,153.201859 159.252457,152.599945 161.102890,151.965500
|
||||
C164.368378,150.845871 166.328384,148.603088 166.183472,144.858505
|
||||
C166.042191,141.207657 163.776978,139.502899 160.654282,138.715790
|
||||
C156.474060,137.662109 152.151184,137.110031 148.046112,135.837494
|
||||
C141.480881,133.802322 138.100525,128.224045 140.126068,121.884071
|
||||
C141.046677,119.002518 143.940674,116.751434 146.297729,114.064087
|
||||
z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 18 KiB |
223
assets/customIcon/SVG/gps_signal_middle.svg
Normal file
@ -0,0 +1,223 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="100%" viewBox="0 0 228 218" enable-background="new 0 0 228 218" xml:space="preserve">
|
||||
<path fill="#FFFFFE" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M128.000000,219.000000
|
||||
C85.333336,219.000000 43.166672,219.000000 1.000006,219.000000
|
||||
C1.000004,146.333344 1.000004,73.666679 1.000002,1.000015
|
||||
C76.999992,1.000010 152.999985,1.000010 228.999969,1.000005
|
||||
C228.999985,73.666649 228.999985,146.333298 229.000000,218.999969
|
||||
C195.500000,219.000000 162.000000,219.000000 128.000000,219.000000
|
||||
M211.356735,142.761169
|
||||
C216.959747,126.543365 218.578262,109.939430 215.393814,93.070824
|
||||
C205.220444,39.180355 158.749893,4.487432 104.144997,9.825882
|
||||
C45.162910,15.592267 3.768258,73.577332 16.267906,131.591431
|
||||
C24.812157,171.247498 65.187325,213.020203 113.266548,209.065552
|
||||
C121.365295,208.399429 129.848053,209.958374 137.619064,208.168915
|
||||
C173.556595,199.893402 197.924927,177.917084 211.356735,142.761169
|
||||
z"/>
|
||||
<path fill="#FFFF01" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M211.238464,143.136215
|
||||
C197.924927,177.917084 173.556595,199.893402 137.619064,208.168915
|
||||
C129.848053,209.958374 121.365295,208.399429 113.266548,209.065552
|
||||
C65.187325,213.020203 24.812157,171.247498 16.267906,131.591431
|
||||
C3.768258,73.577332 45.162910,15.592267 104.144997,9.825882
|
||||
C158.749893,4.487432 205.220444,39.180355 215.393814,93.070824
|
||||
C218.578262,109.939430 216.959747,126.543365 211.238464,143.136215
|
||||
M141.500000,173.010422
|
||||
C148.832275,173.007446 156.166840,173.120834 163.496338,172.976929
|
||||
C178.113113,172.689941 189.698883,161.108643 189.975906,146.496292
|
||||
C190.121170,138.833496 190.123276,131.163315 189.975250,123.500610
|
||||
C189.692978,108.888618 178.091858,97.117470 163.490646,97.044701
|
||||
C131.829178,96.886887 100.165825,96.886452 68.504356,97.045013
|
||||
C53.907982,97.118118 42.300411,108.912048 42.018955,123.506935
|
||||
C41.884029,130.503387 41.972092,137.504593 41.993484,144.503525
|
||||
C42.045700,161.586075 53.431450,172.984940 70.509674,173.003876
|
||||
C93.839752,173.029724 117.169891,173.010391 141.500000,173.010422
|
||||
M145.195145,53.059601
|
||||
C132.671616,48.831715 120.037170,46.583344 106.697777,48.901024
|
||||
C92.144775,51.429550 79.601631,57.560379 68.898666,67.630280
|
||||
C66.663559,69.733177 64.132935,71.886955 67.486404,74.962341
|
||||
C70.359642,77.597321 72.936218,76.566895 75.440186,74.077713
|
||||
C94.411148,55.218845 124.443062,51.774925 147.717285,64.416367
|
||||
C153.098404,67.339134 157.729401,71.637459 162.729340,75.270096
|
||||
C164.872406,76.827118 167.161926,77.076057 168.950348,74.908501
|
||||
C170.859512,72.594582 170.038712,70.591064 168.031189,68.451729
|
||||
C161.755615,61.764080 154.061371,57.273716 145.195145,53.059601
|
||||
M136.995056,70.495941
|
||||
C130.889023,68.996986 124.835899,66.539024 118.665939,66.198593
|
||||
C105.796410,65.488518 93.971779,68.992683 83.825935,77.538658
|
||||
C78.267273,82.220787 76.393448,85.115898 79.110603,87.473625
|
||||
C83.913605,91.641281 86.293518,86.724174 89.223190,84.267517
|
||||
C97.254776,77.532669 106.856201,74.010139 116.965042,74.302345
|
||||
C128.364182,74.631851 138.470352,79.663750 147.113617,87.418709
|
||||
C148.205200,88.398109 150.730148,87.779953 152.590988,87.901962
|
||||
C152.669205,85.706879 153.695923,82.371986 152.662857,81.512314
|
||||
C147.971252,77.608131 142.699188,74.401505 136.995056,70.495941
|
||||
z"/>
|
||||
<path fill="#060600" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M141.000000,173.010422
|
||||
C117.169891,173.010391 93.839752,173.029724 70.509674,173.003876
|
||||
C53.431450,172.984940 42.045700,161.586075 41.993484,144.503525
|
||||
C41.972092,137.504593 41.884029,130.503387 42.018955,123.506935
|
||||
C42.300411,108.912048 53.907982,97.118118 68.504356,97.045013
|
||||
C100.165825,96.886452 131.829178,96.886887 163.490646,97.044701
|
||||
C178.091858,97.117470 189.692978,108.888618 189.975250,123.500610
|
||||
C190.123276,131.163315 190.121170,138.833496 189.975906,146.496292
|
||||
C189.698883,161.108643 178.113113,172.689941 163.496338,172.976929
|
||||
C156.166840,173.120834 148.832275,173.007446 141.000000,173.010422
|
||||
M78.508835,168.996704
|
||||
C106.309456,168.996552 134.110138,169.031723 161.910675,168.981659
|
||||
C176.254440,168.955841 185.910965,159.193314 185.989548,144.777817
|
||||
C186.027679,137.786255 186.105927,130.792099 185.969147,123.802979
|
||||
C185.722504,111.200974 175.995682,101.137589 163.479416,101.071487
|
||||
C131.850861,100.904434 100.220337,100.912048 68.591660,101.066132
|
||||
C56.255783,101.126228 46.408096,110.969093 46.060596,123.234039
|
||||
C45.839100,131.051804 45.865570,138.884628 46.055489,146.704041
|
||||
C46.305157,156.983246 53.109276,165.737915 63.156441,168.017517
|
||||
C67.778450,169.066223 72.718353,168.713791 78.508835,168.996704
|
||||
z"/>
|
||||
<path fill="#020202" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M145.546295,53.242447
|
||||
C154.061371,57.273716 161.755615,61.764080 168.031189,68.451729
|
||||
C170.038712,70.591064 170.859512,72.594582 168.950348,74.908501
|
||||
C167.161926,77.076057 164.872406,76.827118 162.729340,75.270096
|
||||
C157.729401,71.637459 153.098404,67.339134 147.717285,64.416367
|
||||
C124.443062,51.774925 94.411148,55.218845 75.440186,74.077713
|
||||
C72.936218,76.566895 70.359642,77.597321 67.486404,74.962341
|
||||
C64.132935,71.886955 66.663559,69.733177 68.898666,67.630280
|
||||
C79.601631,57.560379 92.144775,51.429550 106.697777,48.901024
|
||||
C120.037170,46.583344 132.671616,48.831715 145.546295,53.242447
|
||||
z"/>
|
||||
<path fill="#010101" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M137.315521,70.719925
|
||||
C142.699188,74.401505 147.971252,77.608131 152.662857,81.512314
|
||||
C153.695923,82.371986 152.669205,85.706879 152.591003,87.901962
|
||||
C150.730148,87.779953 148.205200,88.398109 147.113617,87.418709
|
||||
C138.470352,79.663750 128.364182,74.631851 116.965042,74.302345
|
||||
C106.856201,74.010139 97.254776,77.532669 89.223190,84.267517
|
||||
C86.293518,86.724174 83.913605,91.641281 79.110603,87.473625
|
||||
C76.393448,85.115898 78.267273,82.220787 83.825935,77.538658
|
||||
C93.971779,68.992683 105.796410,65.488518 118.665939,66.198593
|
||||
C124.835899,66.539024 130.889023,68.996986 137.315521,70.719925
|
||||
z"/>
|
||||
<path fill="#FBFB00" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M78.011475,168.996704
|
||||
C72.718353,168.713791 67.778450,169.066223 63.156441,168.017517
|
||||
C53.109276,165.737915 46.305157,156.983246 46.055489,146.704041
|
||||
C45.865570,138.884628 45.839100,131.051804 46.060596,123.234039
|
||||
C46.408096,110.969093 56.255783,101.126228 68.591660,101.066132
|
||||
C100.220337,100.912048 131.850861,100.904434 163.479416,101.071487
|
||||
C175.995682,101.137589 185.722504,111.200974 185.969147,123.802979
|
||||
C186.105927,130.792099 186.027679,137.786255 185.989548,144.777817
|
||||
C185.910965,159.193314 176.254440,168.955841 161.910675,168.981659
|
||||
C134.110138,169.031723 106.309456,168.996552 78.011475,168.996704
|
||||
M87.464859,140.006775
|
||||
C88.918213,140.072632 90.371567,140.138504 92.160362,140.219574
|
||||
C92.160362,143.287308 92.291122,146.089172 92.088486,148.866714
|
||||
C92.018829,149.821472 91.349426,151.112457 90.558853,151.576294
|
||||
C81.942871,156.631027 68.790039,151.772293 66.436646,142.167770
|
||||
C65.335182,137.672531 65.465065,132.562943 66.324631,127.972939
|
||||
C67.619476,121.058601 73.356010,116.691696 80.442207,117.153847
|
||||
C86.015923,117.517365 91.503868,119.195900 97.106133,120.305405
|
||||
C98.236244,116.876221 96.421555,115.133743 92.807922,113.940582
|
||||
C80.451744,109.860825 68.681549,112.643951 63.315113,121.182526
|
||||
C57.711147,130.099014 58.783627,144.994049 65.765984,151.942963
|
||||
C73.431854,159.572113 84.768539,159.398056 95.419266,154.528183
|
||||
C96.244370,154.150925 97.146912,152.873581 97.172134,151.990555
|
||||
C97.331345,146.417328 97.252846,140.837326 97.252846,135.329025
|
||||
C91.375755,135.329025 86.148041,135.329025 80.673889,135.329025
|
||||
C80.860909,137.081635 81.009377,138.473007 81.173050,140.006775
|
||||
C83.200340,140.006775 84.852486,140.006775 87.464859,140.006775
|
||||
M139.947678,122.030350
|
||||
C139.522522,130.931564 142.041336,134.319275 150.803986,136.498367
|
||||
C154.491913,137.415466 158.403549,137.770721 161.832062,139.259674
|
||||
C163.723831,140.081253 165.802322,142.616837 166.012787,144.571777
|
||||
C166.229630,146.586014 164.761856,149.372406 163.139252,150.823853
|
||||
C161.587784,152.211655 158.813477,153.058212 156.709549,152.843063
|
||||
C151.078247,152.267166 145.518219,150.994385 139.438431,149.910889
|
||||
C139.763611,151.166870 139.628632,153.826248 140.847839,154.813782
|
||||
C146.681152,159.538620 161.469986,158.959030 167.268845,154.087006
|
||||
C170.825150,151.099106 172.520218,147.280319 171.694763,142.565140
|
||||
C170.889603,137.965790 167.985977,135.198471 163.667740,133.966095
|
||||
C160.010223,132.922272 156.265869,132.175049 152.546478,131.357864
|
||||
C148.259766,130.416016 144.700027,128.473053 145.284378,123.486549
|
||||
C145.853470,118.630081 149.849274,116.803444 154.055740,117.156929
|
||||
C159.359726,117.602646 164.575729,119.095253 169.992432,120.168457
|
||||
C171.146255,116.891342 170.007278,114.396408 165.476608,113.689087
|
||||
C163.029068,113.306984 160.661758,112.390205 158.211685,112.048996
|
||||
C150.104172,110.919937 143.696381,114.229126 139.947678,122.030350
|
||||
M132.343079,119.471489
|
||||
C125.193138,109.937660 115.030090,113.924957 105.881866,112.990257
|
||||
C105.881866,127.933136 105.881866,142.299973 105.881866,156.755585
|
||||
C107.588455,156.755585 108.995186,156.755585 110.873703,156.755585
|
||||
C110.873703,151.469147 110.873703,146.407013 110.873703,141.420410
|
||||
C131.606461,139.232544 137.422180,133.471283 132.343079,119.471489
|
||||
z"/>
|
||||
<path fill="#0B0B04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M86.984749,140.006775
|
||||
C84.852486,140.006775 83.200340,140.006775 81.173050,140.006775
|
||||
C81.009377,138.473007 80.860909,137.081635 80.673889,135.329025
|
||||
C86.148041,135.329025 91.375755,135.329025 97.252846,135.329025
|
||||
C97.252846,140.837326 97.331345,146.417328 97.172134,151.990555
|
||||
C97.146912,152.873581 96.244370,154.150925 95.419266,154.528183
|
||||
C84.768539,159.398056 73.431854,159.572113 65.765984,151.942963
|
||||
C58.783627,144.994049 57.711147,130.099014 63.315113,121.182526
|
||||
C68.681549,112.643951 80.451744,109.860825 92.807922,113.940582
|
||||
C96.421555,115.133743 98.236244,116.876221 97.106133,120.305405
|
||||
C91.503868,119.195900 86.015923,117.517365 80.442207,117.153847
|
||||
C73.356010,116.691696 67.619476,121.058601 66.324631,127.972939
|
||||
C65.465065,132.562943 65.335182,137.672531 66.436646,142.167770
|
||||
C68.790039,151.772293 81.942871,156.631027 90.558853,151.576294
|
||||
C91.349426,151.112457 92.018829,149.821472 92.088486,148.866714
|
||||
C92.291122,146.089172 92.160362,143.287308 92.160362,140.219574
|
||||
C90.371567,140.138504 88.918213,140.072632 86.984749,140.006775
|
||||
z"/>
|
||||
<path fill="#0D0D04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M140.018677,121.625992
|
||||
C143.696381,114.229126 150.104172,110.919937 158.211685,112.048996
|
||||
C160.661758,112.390205 163.029068,113.306984 165.476608,113.689087
|
||||
C170.007278,114.396408 171.146255,116.891342 169.992432,120.168457
|
||||
C164.575729,119.095253 159.359726,117.602646 154.055740,117.156929
|
||||
C149.849274,116.803444 145.853470,118.630081 145.284378,123.486549
|
||||
C144.700027,128.473053 148.259766,130.416016 152.546478,131.357864
|
||||
C156.265869,132.175049 160.010223,132.922272 163.667740,133.966095
|
||||
C167.985977,135.198471 170.889603,137.965790 171.694763,142.565140
|
||||
C172.520218,147.280319 170.825150,151.099106 167.268845,154.087006
|
||||
C161.469986,158.959030 146.681152,159.538620 140.847839,154.813782
|
||||
C139.628632,153.826248 139.763611,151.166870 139.438431,149.910889
|
||||
C145.518219,150.994385 151.078247,152.267166 156.709549,152.843063
|
||||
C158.813477,153.058212 161.587784,152.211655 163.139252,150.823853
|
||||
C164.761856,149.372406 166.229630,146.586014 166.012787,144.571777
|
||||
C165.802322,142.616837 163.723831,140.081253 161.832062,139.259674
|
||||
C158.403549,137.770721 154.491913,137.415466 150.803986,136.498367
|
||||
C142.041336,134.319275 139.522522,130.931564 140.018677,121.625992
|
||||
z"/>
|
||||
<path fill="#0B0B04" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M132.583527,119.784050
|
||||
C137.422180,133.471283 131.606461,139.232544 110.873703,141.420410
|
||||
C110.873703,146.407013 110.873703,151.469147 110.873703,156.755585
|
||||
C108.995186,156.755585 107.588455,156.755585 105.881866,156.755585
|
||||
C105.881866,142.299973 105.881866,127.933136 105.881866,112.990257
|
||||
C115.030090,113.924957 125.193138,109.937660 132.583527,119.784050
|
||||
M128.690262,124.987030
|
||||
C126.092094,118.336884 120.386665,116.326439 111.035500,118.718056
|
||||
C111.035500,124.338562 111.035500,129.937027 111.035500,135.500748
|
||||
C123.415474,137.236740 127.945847,134.709579 128.690262,124.987030
|
||||
z"/>
|
||||
<path fill="#FBFB00" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M128.721634,125.372940
|
||||
C127.945847,134.709579 123.415474,137.236740 111.035500,135.500748
|
||||
C111.035500,129.937027 111.035500,124.338562 111.035500,118.718056
|
||||
C120.386665,116.326439 126.092094,118.336884 128.721634,125.372940
|
||||
z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/customIcon/gps_signal.psd
Normal file
BIN
assets/customIcon/gps_signal_high.png
Normal file
|
After Width: | Height: | Size: 5.6 KiB |
BIN
assets/customIcon/gps_signal_low.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
assets/customIcon/gps_signal_middle.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
7
assets/customIcon/icomoon-old/Read Me.txt
Normal file
@ -0,0 +1,7 @@
|
||||
Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
|
||||
|
||||
To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs/#local-fonts
|
||||
|
||||
You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
|
||||
|
||||
You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
|
||||
152
assets/customIcon/icomoon-old/demo-files/demo.css
Normal file
@ -0,0 +1,152 @@
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
line-height: 1.5;
|
||||
color: #555;
|
||||
background: #fff;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
font-weight: normal;
|
||||
}
|
||||
small {
|
||||
font-size: .66666667em;
|
||||
}
|
||||
a {
|
||||
color: #e74c3c;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover, a:focus {
|
||||
box-shadow: 0 1px #e74c3c;
|
||||
}
|
||||
.bshadow0, input {
|
||||
box-shadow: inset 0 -2px #e7e7e7;
|
||||
}
|
||||
input:hover {
|
||||
box-shadow: inset 0 -2px #ccc;
|
||||
}
|
||||
input, fieldset {
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
input {
|
||||
color: inherit;
|
||||
line-height: 1.5;
|
||||
height: 1.5em;
|
||||
padding: .25em 0;
|
||||
}
|
||||
input:focus {
|
||||
outline: none;
|
||||
box-shadow: inset 0 -2px #449fdb;
|
||||
}
|
||||
.glyph {
|
||||
font-size: 16px;
|
||||
width: 15em;
|
||||
padding-bottom: 1em;
|
||||
margin-right: 4em;
|
||||
margin-bottom: 1em;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
}
|
||||
.liga {
|
||||
width: 80%;
|
||||
width: calc(100% - 2.5em);
|
||||
}
|
||||
.talign-right {
|
||||
text-align: right;
|
||||
}
|
||||
.talign-center {
|
||||
text-align: center;
|
||||
}
|
||||
.bgc1 {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
.fgc1 {
|
||||
color: #999;
|
||||
}
|
||||
.fgc0 {
|
||||
color: #000;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.mvm {
|
||||
margin-top: .75em;
|
||||
margin-bottom: .75em;
|
||||
}
|
||||
.mtn {
|
||||
margin-top: 0;
|
||||
}
|
||||
.mtl, .mal {
|
||||
margin-top: 1.5em;
|
||||
}
|
||||
.mbl, .mal {
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
.mal, .mhl {
|
||||
margin-left: 1.5em;
|
||||
margin-right: 1.5em;
|
||||
}
|
||||
.mhmm {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
.mls {
|
||||
margin-left: .25em;
|
||||
}
|
||||
.ptl {
|
||||
padding-top: 1.5em;
|
||||
}
|
||||
.pbs, .pvs {
|
||||
padding-bottom: .25em;
|
||||
}
|
||||
.pvs, .pts {
|
||||
padding-top: .25em;
|
||||
}
|
||||
.unit {
|
||||
float: left;
|
||||
}
|
||||
.unitRight {
|
||||
float: right;
|
||||
}
|
||||
.size1of2 {
|
||||
width: 50%;
|
||||
}
|
||||
.size1of1 {
|
||||
width: 100%;
|
||||
}
|
||||
.clearfix:before, .clearfix:after {
|
||||
content: " ";
|
||||
display: table;
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
}
|
||||
.hidden-true {
|
||||
display: none;
|
||||
}
|
||||
.textbox0 {
|
||||
width: 3em;
|
||||
background: #f1f1f1;
|
||||
padding: .25em .5em;
|
||||
line-height: 1.5;
|
||||
height: 1.5em;
|
||||
}
|
||||
#testDrive {
|
||||
display: block;
|
||||
padding-top: 24px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.fs0 {
|
||||
font-size: 16px;
|
||||
}
|
||||
.fs1 {
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
30
assets/customIcon/icomoon-old/demo-files/demo.js
Normal file
@ -0,0 +1,30 @@
|
||||
if (!('boxShadow' in document.body.style)) {
|
||||
document.body.setAttribute('class', 'noBoxShadow');
|
||||
}
|
||||
|
||||
document.body.addEventListener("click", function(e) {
|
||||
var target = e.target;
|
||||
if (target.tagName === "INPUT" &&
|
||||
target.getAttribute('class').indexOf('liga') === -1) {
|
||||
target.select();
|
||||
}
|
||||
});
|
||||
|
||||
(function() {
|
||||
var fontSize = document.getElementById('fontSize'),
|
||||
testDrive = document.getElementById('testDrive'),
|
||||
testText = document.getElementById('testText');
|
||||
function updateTest() {
|
||||
testDrive.innerHTML = testText.value || String.fromCharCode(160);
|
||||
if (window.icomoonLiga) {
|
||||
window.icomoonLiga(testDrive);
|
||||
}
|
||||
}
|
||||
function updateSize() {
|
||||
testDrive.style.fontSize = fontSize.value + 'px';
|
||||
}
|
||||
fontSize.addEventListener('change', updateSize, false);
|
||||
testText.addEventListener('input', updateTest, false);
|
||||
testText.addEventListener('change', updateTest, false);
|
||||
updateSize();
|
||||
}());
|
||||
80
assets/customIcon/icomoon-old/demo.html
Normal file
@ -0,0 +1,80 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>IcoMoon Demo</title>
|
||||
<meta name="description" content="An Icon Font Generated By IcoMoon.io">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="demo-files/demo.css">
|
||||
<link rel="stylesheet" href="style.css"></head>
|
||||
<body>
|
||||
<div class="bgc1 clearfix">
|
||||
<h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> icomoon <small class="fgc1">(Glyphs: 3)</small></h1>
|
||||
</div>
|
||||
<div class="clearfix mhl ptl">
|
||||
<h1 class="mvm mtn fgc1">Grid Size: Unknown</h1>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_middle"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span></span>
|
||||
<span class="mls"> icon-gps_signal_middle</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e900" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-false">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_low"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span><span class="path10"></span></span>
|
||||
<span class="mls"> icon-gps_signal_low</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e909" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-false">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_high"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span><span class="path10"></span></span>
|
||||
<span class="mls"> icon-gps_signal_high</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e913" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-false">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--[if gt IE 8]><!-->
|
||||
<div class="mhl clearfix mbl">
|
||||
<h1>Font Test Drive</h1>
|
||||
<label>
|
||||
Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
|
||||
min="8" value="48" />
|
||||
px
|
||||
</label>
|
||||
<input id="testText" type="text" class="phl size1of1 mvl"
|
||||
placeholder="Type some text to test..." value=""/>
|
||||
<div id="testDrive" class="icon-" style="font-family: icomoon">
|
||||
</div>
|
||||
</div>
|
||||
<!--<![endif]-->
|
||||
<div class="bgc1 clearfix">
|
||||
<p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
|
||||
</div>
|
||||
|
||||
<script src="demo-files/demo.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
assets/customIcon/icomoon-old/fonts/icomoon.eot
Normal file
39
assets/customIcon/icomoon-old/fonts/icomoon.svg
Normal file
@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Generated by IcoMoon</metadata>
|
||||
<defs>
|
||||
<font id="icomoon" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M476.771 924.771c199.666 13.278 355.46-61.878 467.376-225.468 108.605-206.743 88.252-399.332-61.064-577.761-127.939-124.994-280.599-169.618-457.982-133.872-231.133 67.546-353.261 221.776-366.385 462.679 9.428 217.043 114.333 366.572 314.716 448.587 34.697 10.24 69.143 18.852 103.339 25.835z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M504.954 741.578c110.963 8.694 205.688-25.752 284.183-103.339 4.721-17.168-1.541-28.129-18.789-32.881-30.823 26.775-64.489 49.478-100.991 68.11-81.37 34.44-162.788 34.44-244.257 0-35.044-21.006-68.708-43.709-100.991-68.11-11.273 4.217-18.319 12.046-21.138 23.486 29.204 38.979 66.782 67.945 112.734 86.899 29.725 10.931 59.477 19.542 89.248 25.835z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M514.349 657.028c80.403 7.114 148.513-17.937 204.33-75.156 6.247-23.475-2.367-33.652-25.835-30.532-96.19 87.544-193.264 89.11-291.229 4.697-18.12-11.933-30.646-8.019-37.578 11.743 2.069 12.747 8.332 22.925 18.789 30.532 39.091 31.31 82.932 50.882 131.523 58.716z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M260.697 506.716c184.765 0.783 369.523 0 554.275-2.349 26.431-4.496 44.436-19.371 54.018-44.624 4.462-91.056 2.894-181.873-4.697-272.44-9.131-15.191-22.443-25.365-39.927-30.532-191.023-3.133-382.043-3.133-573.064 0-26.722 3.227-43.163 18.098-49.321 44.624-3.132 84.55-3.132 169.101 0 253.651 8.958 30.138 28.53 47.362 58.716 51.67z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M237.211 492.624c197.291 0.783 394.574 0 591.853-2.349 15.294-7.455 25.473-19.198 30.532-35.229 3.133-84.55 3.133-169.101 0-253.651-6.017-17.554-17.76-29.297-35.229-35.229-192.587-3.133-385.174-3.133-577.761 0-17.469 5.933-29.212 17.676-35.229 35.229-3.132 86.115-3.132 172.234 0 258.349 7.828 11.724 16.439 22.683 25.835 32.881z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M345.248 440.954c28.354 0.658 56.537-0.907 84.55-4.697 0-14.092 0-28.183 0-42.275-4.942-0.7-9.639 0.080-14.092 2.349-12.498 31.307-34.419 40.702-65.761 28.183-25.779-24.083-36.739-53.835-32.881-89.248-3.754-35.765 7.207-65.513 32.881-89.248 49.484-5.209 65.924 15.928 49.321 63.413-4.239 5.641-9.72 9.559-16.44 11.743 20.355 3.133 40.71 3.133 61.064 0-5.643-4.242-9.558-9.719-11.743-16.44-1.566-23.486-3.132-46.972-4.697-70.459-1.566-1.564-3.132-3.133-4.697-4.697-6.167 5.040-13.213 8.173-21.138 9.394-77.32-18.3-116.464 13.016-117.431 93.945-1.181 48.762 19.174 84.776 61.064 108.037z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M472.073 436.257c30.471 5.421 61.788 6.205 93.945 2.349 45.267-6.67 61.708-32.505 49.321-77.505-5.482-18.005-17.225-29.748-35.229-35.229-19.977-0.939-39.551-3.288-58.716-7.046-3.133-21.922-3.133-43.839 0-65.761 5.702-7.276 12.748-12.753 21.138-16.44-23.486-3.133-46.972-3.133-70.459 0 5.068 4.491 10.545 8.403 16.44 11.743 3.133 57.931 3.133 115.867 0 173.798-4.88 5.684-10.362 10.381-16.44 14.092z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M692.844 440.954c27.066 1.649 53.68-0.7 79.853-7.046-4.434-12.772-5.998-26.079-4.697-39.927-4.697 0-9.394 0-14.092 0-7.765 33.707-28.118 43.886-61.064 30.532-18.939-21.626-17.375-41.979 4.697-61.064 22.326-11.546 43.464-24.858 63.413-39.927 24.599-57.264 5.81-88.581-56.367-93.945-17.925 3.791-35.934 6.924-54.018 9.394-0.77 12.622 0.014 25.149 2.349 37.578 1.945 2.147 4.293 3.716 7.046 4.697 6.656-15.285 17.615-27.028 32.881-35.229 43.637-7.619 60.078 10.386 49.321 54.018-22.984 18.277-47.254 34.717-72.807 49.321-24.567 39.56-16.741 70.092 23.486 91.596z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M519.046 426.862c58.077 5.369 79.214-19.681 63.413-75.156-17.779-16.271-38.917-22.537-63.413-18.789 0 31.317 0 62.628 0 93.945z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M472.073 943.56c-62.2-9.509-121.698-29.081-178.495-58.716-183.411-111.384-267.179-275.005-251.303-490.862 33.091-203.748 146.608-340.752 340.55-411.009 213.466-56.080 392.746-2.062 537.835 162.055 123.012 171.919 138.667 353.547 46.972 544.881-113.96 181.861-279.148 266.412-495.56 253.651zM669.358 619.45c-67.809 41.065-139.837 48.111-216.073 21.138-25.823-10.547-49.309-24.639-70.459-42.275-14.050-10.059-19.531-23.368-16.44-39.927 3.777-6.128 9.257-9.259 16.44-9.394 24.303 17.197 49.355 33.637 75.156 49.321 62.177 27.915 123.242 25.567 183.193-7.046-26.619-28.183-53.234-56.367-79.853-84.55-100.22 0.783-200.428 0-300.624-2.349-30.974-2.785-50.545-19.226-58.716-49.321-3.132-84.55-3.132-169.101 0-253.651 5.542-11.086 11.023-22.044 16.44-32.881-6.072-8.436-13.118-16.267-21.138-23.486-117.899 133.054-150.78 284.93-98.642 455.633 79.099 195.473 224.714 298.813 436.844 310.018 117.098-2.714 218.089-43.424 302.972-122.128-54.901-58.031-111.268-114.398-169.101-169.101zM260.697 154.422c187.896-0.784 375.785 0 563.67 2.349 26.244 6.384 41.12 22.824 44.624 49.321 3.133 84.55 3.133 169.101 0 253.651-9.582 25.252-27.587 40.128-54.018 44.624-67.307 2.348-134.637 3.131-201.982 2.349 18.789 21.921 39.142 42.275 61.064 61.064 9.254-13.214 21.781-18.694 37.578-16.44 14.026 18.322 10.898 33.196-9.394 44.624 53.135 56.268 107.938 111.070 164.404 164.404 57.809-59.207 96.171-129.666 115.083-211.376 34.623-240.701-56.973-413.715-274.789-519.046-142.665-52.083-280.449-41.12-413.358 32.881-24.842 17.004-48.328 35.793-70.459 56.367 11.913 12.706 24.439 24.449 37.578 35.229zM542.532 487.927c-17.225-15.656-34.445-31.317-51.67-46.972-6.449 0.737-12.715-0.047-18.789-2.349 2.555-3.368 5.688-5.717 9.394-7.046-50.104-53.234-101.774-104.904-155.009-155.009-14.272 44.69-11.923 88.534 7.046 131.523 32.897 33.454 60.297 29.541 82.202-11.743 4.453-2.269 9.15-3.049 14.092-2.349 0 14.092 0 28.183 0 42.275-90.584 23.622-139.122-10.822-145.615-103.339 3.54-15.393 5.889-31.049 7.046-46.972 1.991-11.861 7.471-21.255 16.44-28.183-25.052-28.183-51.67-54.803-79.853-79.853-6.123 6.985-11.603 14.815-16.44 23.486-3.132 86.115-3.132 172.234 0 258.349 6.848 11.555 15.459 21.734 25.835 30.532 102.575 3.896 204.349 3.113 305.321-2.349zM598.899 492.624c76.739 0.783 153.459 0 230.165-2.349 9.977-5.27 18.587-12.316 25.835-21.138 7.647-88.942 9.216-178.19 4.697-267.743-6.017-17.554-17.76-29.297-35.229-35.229-184.752-2.349-369.51-3.133-554.275-2.349 21.921 25.050 45.407 48.537 70.459 70.459 20.407-4.105 40.762-2.541 61.064 4.697 7.925-1.221 14.971-4.354 21.138-9.394 6.026 24.224 9.157 49.274 9.394 75.156 2.185 6.722 6.1 12.199 11.743 16.44-4.453 2.269-9.15 3.049-14.092 2.349 18.789 21.922 39.144 42.275 61.064 61.064 0.78-45.432 0-90.84-2.349-136.22-5.895-3.34-11.372-7.253-16.44-11.743 23.486-3.133 46.972-3.133 70.459 0-8.389 3.687-15.435 9.164-21.138 16.44-3.133 21.922-3.133 43.839 0 65.761 19.165 3.758 38.738 6.106 58.716 7.046 33.999 17.168 45.742 44.567 35.229 82.202-15.665 24.379-38.372 35.342-68.11 32.881 15.656 18.789 32.881 36.014 51.67 51.67zM533.138 426.862c42.172 0.892 60.176-19.461 54.018-61.064-1.625-11.029-7.107-19.639-16.44-25.835-16.722-5.81-33.947-8.159-51.67-7.046 0 26.619 0 53.234 0 79.853 3.133 6.261 7.83 10.959 14.092 14.092zM401.615 295.339c7.172-39.809-10.052-57.034-51.67-51.67 15.657 18.789 32.881 36.014 51.67 51.67z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M669.358 619.45c-7.83-10.96-17.225-20.355-28.183-28.183-59.951 32.613-121.015 34.961-183.193 7.046-25.801-15.684-50.853-32.124-75.156-49.321-7.184 0.135-12.664 3.267-16.44 9.394-3.090 16.559 2.39 29.868 16.44 39.927 21.15 17.636 44.636 31.728 70.459 42.275 76.236 26.973 148.264 19.928 216.073-21.138z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M702.239 595.963c20.292-11.427 23.42-26.302 9.394-44.624-15.797-2.254-28.324 3.227-37.578 16.44 7.83 10.96 17.225 20.355 28.183 28.183z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M561.321 506.716c-4.697-7.829-10.959-14.092-18.789-18.789-100.973 5.462-202.746 6.245-305.321 2.349-10.376-8.798-18.987-18.977-25.835-30.532-3.132-86.115-3.132-172.234 0-258.349 4.837-8.671 10.317-16.501 16.44-23.486-1.566-4.697-4.697-7.83-9.394-9.394-5.418 10.837-10.898 21.795-16.44 32.881-3.132 84.55-3.132 169.101 0 253.651 8.17 30.095 27.742 46.537 58.716 49.321 100.196 2.349 200.404 3.131 300.624 2.349z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M612.991 506.716c67.344 0.783 134.675 0 201.982-2.349 26.431-4.496 44.436-19.371 54.018-44.624 3.133-84.55 3.133-169.101 0-253.651-3.504-26.497-18.38-42.938-44.624-49.321-187.885-2.349-375.773-3.133-563.67-2.349 1.566 4.697 4.697 7.83 9.394 9.394 184.765-0.784 369.523 0 554.275 2.349 17.469 5.933 29.212 17.676 35.229 35.229 4.519 89.553 2.95 178.801-4.697 267.743-7.248 8.821-15.858 15.867-25.835 21.138-76.706 2.348-153.426 3.131-230.165 2.349 3.133 6.263 7.83 10.96 14.092 14.092z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M326.459 276.55c-4.697-7.83-10.96-14.092-18.789-18.789-8.969 6.928-14.45 16.323-16.44 28.183-1.157 15.924-3.506 31.58-7.046 46.972 6.493 92.517 55.031 126.962 145.615 103.339 0-14.092 0-28.183 0-42.275-4.942-0.7-9.639 0.080-14.092 2.349-21.905 41.284-49.305 45.197-82.202 11.743-18.969-42.989-21.318-86.833-7.046-131.523z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M490.862 440.954c-1.564-4.697-4.697-7.83-9.394-9.394-3.706 1.329-6.839 3.678-9.394 7.046 6.074 2.302 12.34 3.086 18.789 2.349z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M547.229 440.954c29.738 2.461 52.445-8.502 68.11-32.881 10.512-37.634-1.231-65.033-35.229-82.202-19.977-0.939-39.551-3.288-58.716-7.046-3.133-21.922-3.133-43.839 0-65.761 5.702-7.276 12.748-12.753 21.138-16.44-23.486-3.133-46.972-3.133-70.459 0 5.068 4.491 10.545 8.403 16.44 11.743 2.349 45.38 3.128 90.788 2.349 136.22 7.83 10.959 17.225 20.353 28.183 28.183 0-26.619 0-53.234 0-79.853 17.723-1.113 34.948 1.235 51.67 7.046 9.333 6.196 14.815 14.806 16.44 25.835 6.158 41.604-11.846 61.957-54.018 61.064 3.133 6.261 7.83 10.959 14.092 14.092z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M692.844 440.954c27.066 1.649 53.68-0.7 79.853-7.046-4.434-12.772-5.998-26.079-4.697-39.927-4.697 0-9.394 0-14.092 0-7.765 33.707-28.118 43.886-61.064 30.532-18.939-21.626-17.375-41.979 4.697-61.064 22.326-11.546 43.464-24.858 63.413-39.927 24.599-57.264 5.81-88.581-56.367-93.945-17.925 3.791-35.934 6.924-54.018 9.394-0.77 12.622 0.014 25.149 2.349 37.578 1.945 2.147 4.293 3.716 7.046 4.697 6.656-15.285 17.615-27.028 32.881-35.229 43.637-7.619 60.078 10.386 49.321 54.018-22.984 18.277-47.254 34.717-72.807 49.321-24.567 39.56-16.741 70.092 23.486 91.596z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M429.798 323.523c4.942 0.7 9.639-0.080 14.092-2.349-5.643-4.242-9.558-9.719-11.743-16.44-0.237-25.882-3.369-50.932-9.394-75.156-6.167 5.040-13.213 8.173-21.138 9.394-20.302-7.238-40.657-8.803-61.064-4.697 1.566 4.697 4.697 7.83 9.394 9.394 41.618-5.364 58.841 11.861 51.67 51.67 7.829 10.959 17.223 20.353 28.183 28.183z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M476.771 929.468c203.992 13.476 361.35-64.811 472.073-234.862 84.55-161.272 84.55-322.546 0-483.817-130.461-195.927-311.305-268.734-542.532-218.422-195.946 64.418-311.029 198.29-345.248 401.615-15.798 232.312 80.496 399.065 288.881 500.257 41.888 15.544 84.163 27.287 126.826 35.229z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M519.046 840.22c131.297 2.777 241.683-42.629 331.156-136.22 3.119-23.469-7.055-32.081-30.532-25.835-147.423 132.183-308.694 150.972-483.817 56.367-22.969-13.877-43.324-31.1-61.064-51.67-30.235-15.35-41.978-6.738-35.229 25.835 77.581 77.549 170.743 121.39 279.486 131.523z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M504.954 741.578c110.963 8.694 205.688-25.752 284.183-103.339 4.721-17.168-1.541-28.129-18.789-32.881-30.823 26.775-64.489 49.478-100.991 68.11-81.37 34.44-162.788 34.44-244.257 0-35.044-21.006-68.708-43.709-100.991-68.11-11.273 4.217-18.319 12.046-21.138 23.486 29.204 38.979 66.782 67.945 112.734 86.899 29.725 10.931 59.477 19.542 89.248 25.835z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M514.349 657.028c80.403 7.114 148.513-17.937 204.33-75.156 6.247-23.475-2.367-33.652-25.835-30.532-96.19 87.544-193.264 89.11-291.229 4.697-18.12-11.933-30.646-8.019-37.578 11.743 2.069 12.747 8.332 22.925 18.789 30.532 39.091 31.31 82.932 50.882 131.523 58.716z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M260.697 506.716c184.765 0.783 369.523 0 554.275-2.349 26.431-4.496 44.436-19.371 54.018-44.624 4.462-91.056 2.894-181.873-4.697-272.44-9.131-15.191-22.443-25.365-39.927-30.532-191.023-3.133-382.043-3.133-573.064 0-26.722 3.227-43.163 18.098-49.321 44.624-3.132 84.55-3.132 169.101 0 253.651 8.958 30.138 28.53 47.362 58.716 51.67z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M237.211 492.624c197.291 0.783 394.574 0 591.853-2.349 15.294-7.455 25.473-19.198 30.532-35.229 3.133-84.55 3.133-169.101 0-253.651-6.017-17.554-17.76-29.297-35.229-35.229-192.587-3.133-385.174-3.133-577.761 0-17.469 5.933-29.212 17.676-35.229 35.229-3.132 86.115-3.132 172.234 0 258.349 7.828 11.724 16.439 22.683 25.835 32.881z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M345.248 440.954c28.354 0.658 56.537-0.907 84.55-4.697 0-14.092 0-28.183 0-42.275-4.942-0.7-9.639 0.080-14.092 2.349-12.498 31.307-34.419 40.702-65.761 28.183-25.779-24.083-36.739-53.835-32.881-89.248-3.754-35.765 7.207-65.513 32.881-89.248 49.484-5.209 65.924 15.928 49.321 63.413-4.239 5.641-9.72 9.559-16.44 11.743 20.355 3.133 40.71 3.133 61.064 0-5.643-4.242-9.558-9.719-11.743-16.44-1.566-23.486-3.132-46.972-4.697-70.459-1.566-1.564-3.132-3.133-4.697-4.697-6.167 5.040-13.213 8.173-21.138 9.394-77.32-18.3-116.464 13.016-117.431 93.945-1.181 48.762 19.174 84.776 61.064 108.037z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M472.073 436.257c30.471 5.421 61.788 6.205 93.945 2.349 45.267-6.67 61.708-32.505 49.321-77.505-5.482-18.005-17.225-29.748-35.229-35.229-19.977-0.939-39.551-3.288-58.716-7.046-3.133-21.922-3.133-43.839 0-65.761 5.702-7.276 12.748-12.753 21.138-16.44-23.486-3.133-46.972-3.133-70.459 0 5.068 4.491 10.545 8.403 16.44 11.743 3.133 57.931 3.133 115.867 0 173.798-4.88 5.684-10.362 10.381-16.44 14.092z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M692.844 440.954c27.066 1.649 53.68-0.7 79.853-7.046-4.434-12.772-5.998-26.079-4.697-39.927-4.697 0-9.394 0-14.092 0-7.765 33.707-28.118 43.886-61.064 30.532-18.939-21.626-17.375-41.979 4.697-61.064 22.326-11.546 43.464-24.858 63.413-39.927 24.599-57.264 5.81-88.581-56.367-93.945-17.925 3.791-35.934 6.924-54.018 9.394-0.77 12.622 0.014 25.149 2.349 37.578 1.945 2.147 4.293 3.716 7.046 4.697 6.656-15.285 17.615-27.028 32.881-35.229 43.637-7.619 60.078 10.386 49.321 54.018-22.984 18.277-47.254 34.717-72.807 49.321-24.567 39.56-16.741 70.092 23.486 91.596z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M519.046 426.862c58.077 5.369 79.214-19.681 63.413-75.156-17.779-16.271-38.917-22.537-63.413-18.789 0 31.317 0 62.628 0 93.945z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
BIN
assets/customIcon/icomoon-old/fonts/icomoon.woff
Normal file
1
assets/customIcon/icomoon-old/selection.json
Normal file
169
assets/customIcon/icomoon-old/style.css
Normal file
@ -0,0 +1,169 @@
|
||||
@font-face {
|
||||
font-family: 'icomoon';
|
||||
src: url('fonts/icomoon.eot?tueyzw');
|
||||
src: url('fonts/icomoon.eot?tueyzw#iefix') format('embedded-opentype'),
|
||||
url('fonts/icomoon.ttf?tueyzw') format('truetype'),
|
||||
url('fonts/icomoon.woff?tueyzw') format('woff'),
|
||||
url('fonts/icomoon.svg?tueyzw#icomoon') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-display: block;
|
||||
}
|
||||
|
||||
[class^="icon-"], [class*=" icon-"] {
|
||||
/* use !important to prevent issues with browser extensions that change fonts */
|
||||
font-family: 'icomoon' !important;
|
||||
speak: never;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-gps_signal_middle .path1:before {
|
||||
content: "\e900";
|
||||
color: rgb(255, 254, 11);
|
||||
}
|
||||
.icon-gps_signal_middle .path2:before {
|
||||
content: "\e901";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_middle .path3:before {
|
||||
content: "\e902";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(0, 0, 0);
|
||||
}
|
||||
.icon-gps_signal_middle .path4:before {
|
||||
content: "\e903";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(5, 5, 5);
|
||||
}
|
||||
.icon-gps_signal_middle .path5:before {
|
||||
content: "\e904";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(254, 255, 0);
|
||||
}
|
||||
.icon-gps_signal_middle .path6:before {
|
||||
content: "\e905";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_middle .path7:before {
|
||||
content: "\e906";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(3, 3, 3);
|
||||
}
|
||||
.icon-gps_signal_middle .path8:before {
|
||||
content: "\e907";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_middle .path9:before {
|
||||
content: "\e908";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(254, 255, 0);
|
||||
}
|
||||
.icon-gps_signal_low .path1:before {
|
||||
content: "\e909";
|
||||
color: rgb(255, 65, 37);
|
||||
}
|
||||
.icon-gps_signal_low .path2:before {
|
||||
content: "\e90a";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(0, 0, 0);
|
||||
}
|
||||
.icon-gps_signal_low .path3:before {
|
||||
content: "\e90b";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(0, 0, 0);
|
||||
}
|
||||
.icon-gps_signal_low .path4:before {
|
||||
content: "\e90c";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(10, 10, 10);
|
||||
}
|
||||
.icon-gps_signal_low .path5:before {
|
||||
content: "\e90d";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(3, 3, 3);
|
||||
}
|
||||
.icon-gps_signal_low .path6:before {
|
||||
content: "\e90e";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_low .path7:before {
|
||||
content: "\e90f";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(5, 5, 5);
|
||||
}
|
||||
.icon-gps_signal_low .path8:before {
|
||||
content: "\e910";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(3, 3, 3);
|
||||
}
|
||||
.icon-gps_signal_low .path9:before {
|
||||
content: "\e911";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_low .path10:before {
|
||||
content: "\e912";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_high .path1:before {
|
||||
content: "\e913";
|
||||
color: rgb(22, 158, 213);
|
||||
}
|
||||
.icon-gps_signal_high .path2:before {
|
||||
content: "\e914";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_high .path3:before {
|
||||
content: "\e915";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_high .path4:before {
|
||||
content: "\e916";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(0, 0, 0);
|
||||
}
|
||||
.icon-gps_signal_high .path5:before {
|
||||
content: "\e917";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(5, 5, 5);
|
||||
}
|
||||
.icon-gps_signal_high .path6:before {
|
||||
content: "\e918";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(14, 157, 213);
|
||||
}
|
||||
.icon-gps_signal_high .path7:before {
|
||||
content: "\e919";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_high .path8:before {
|
||||
content: "\e91a";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(3, 3, 3);
|
||||
}
|
||||
.icon-gps_signal_high .path9:before {
|
||||
content: "\e91b";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_high .path10:before {
|
||||
content: "\e91c";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(14, 157, 213);
|
||||
}
|
||||
BIN
assets/customIcon/icomoon.zip
Normal file
7
assets/customIcon/icomoon/Read Me.txt
Normal file
@ -0,0 +1,7 @@
|
||||
Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
|
||||
|
||||
To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/docs/#local-fonts
|
||||
|
||||
You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
|
||||
|
||||
You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
|
||||
152
assets/customIcon/icomoon/demo-files/demo.css
Normal file
@ -0,0 +1,152 @@
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
line-height: 1.5;
|
||||
color: #555;
|
||||
background: #fff;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
font-weight: normal;
|
||||
}
|
||||
small {
|
||||
font-size: .66666667em;
|
||||
}
|
||||
a {
|
||||
color: #e74c3c;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover, a:focus {
|
||||
box-shadow: 0 1px #e74c3c;
|
||||
}
|
||||
.bshadow0, input {
|
||||
box-shadow: inset 0 -2px #e7e7e7;
|
||||
}
|
||||
input:hover {
|
||||
box-shadow: inset 0 -2px #ccc;
|
||||
}
|
||||
input, fieldset {
|
||||
font-family: sans-serif;
|
||||
font-size: 1em;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
input {
|
||||
color: inherit;
|
||||
line-height: 1.5;
|
||||
height: 1.5em;
|
||||
padding: .25em 0;
|
||||
}
|
||||
input:focus {
|
||||
outline: none;
|
||||
box-shadow: inset 0 -2px #449fdb;
|
||||
}
|
||||
.glyph {
|
||||
font-size: 16px;
|
||||
width: 15em;
|
||||
padding-bottom: 1em;
|
||||
margin-right: 4em;
|
||||
margin-bottom: 1em;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
}
|
||||
.liga {
|
||||
width: 80%;
|
||||
width: calc(100% - 2.5em);
|
||||
}
|
||||
.talign-right {
|
||||
text-align: right;
|
||||
}
|
||||
.talign-center {
|
||||
text-align: center;
|
||||
}
|
||||
.bgc1 {
|
||||
background: #f1f1f1;
|
||||
}
|
||||
.fgc1 {
|
||||
color: #999;
|
||||
}
|
||||
.fgc0 {
|
||||
color: #000;
|
||||
}
|
||||
p {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.mvm {
|
||||
margin-top: .75em;
|
||||
margin-bottom: .75em;
|
||||
}
|
||||
.mtn {
|
||||
margin-top: 0;
|
||||
}
|
||||
.mtl, .mal {
|
||||
margin-top: 1.5em;
|
||||
}
|
||||
.mbl, .mal {
|
||||
margin-bottom: 1.5em;
|
||||
}
|
||||
.mal, .mhl {
|
||||
margin-left: 1.5em;
|
||||
margin-right: 1.5em;
|
||||
}
|
||||
.mhmm {
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
}
|
||||
.mls {
|
||||
margin-left: .25em;
|
||||
}
|
||||
.ptl {
|
||||
padding-top: 1.5em;
|
||||
}
|
||||
.pbs, .pvs {
|
||||
padding-bottom: .25em;
|
||||
}
|
||||
.pvs, .pts {
|
||||
padding-top: .25em;
|
||||
}
|
||||
.unit {
|
||||
float: left;
|
||||
}
|
||||
.unitRight {
|
||||
float: right;
|
||||
}
|
||||
.size1of2 {
|
||||
width: 50%;
|
||||
}
|
||||
.size1of1 {
|
||||
width: 100%;
|
||||
}
|
||||
.clearfix:before, .clearfix:after {
|
||||
content: " ";
|
||||
display: table;
|
||||
}
|
||||
.clearfix:after {
|
||||
clear: both;
|
||||
}
|
||||
.hidden-true {
|
||||
display: none;
|
||||
}
|
||||
.textbox0 {
|
||||
width: 3em;
|
||||
background: #f1f1f1;
|
||||
padding: .25em .5em;
|
||||
line-height: 1.5;
|
||||
height: 1.5em;
|
||||
}
|
||||
#testDrive {
|
||||
display: block;
|
||||
padding-top: 24px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
.fs0 {
|
||||
font-size: 16px;
|
||||
}
|
||||
.fs1 {
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
30
assets/customIcon/icomoon/demo-files/demo.js
Normal file
@ -0,0 +1,30 @@
|
||||
if (!('boxShadow' in document.body.style)) {
|
||||
document.body.setAttribute('class', 'noBoxShadow');
|
||||
}
|
||||
|
||||
document.body.addEventListener("click", function(e) {
|
||||
var target = e.target;
|
||||
if (target.tagName === "INPUT" &&
|
||||
target.getAttribute('class').indexOf('liga') === -1) {
|
||||
target.select();
|
||||
}
|
||||
});
|
||||
|
||||
(function() {
|
||||
var fontSize = document.getElementById('fontSize'),
|
||||
testDrive = document.getElementById('testDrive'),
|
||||
testText = document.getElementById('testText');
|
||||
function updateTest() {
|
||||
testDrive.innerHTML = testText.value || String.fromCharCode(160);
|
||||
if (window.icomoonLiga) {
|
||||
window.icomoonLiga(testDrive);
|
||||
}
|
||||
}
|
||||
function updateSize() {
|
||||
testDrive.style.fontSize = fontSize.value + 'px';
|
||||
}
|
||||
fontSize.addEventListener('change', updateSize, false);
|
||||
testText.addEventListener('input', updateTest, false);
|
||||
testText.addEventListener('change', updateTest, false);
|
||||
updateSize();
|
||||
}());
|
||||
80
assets/customIcon/icomoon/demo.html
Normal file
@ -0,0 +1,80 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>IcoMoon Demo</title>
|
||||
<meta name="description" content="An Icon Font Generated By IcoMoon.io">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="demo-files/demo.css">
|
||||
<link rel="stylesheet" href="style.css"></head>
|
||||
<body>
|
||||
<div class="bgc1 clearfix">
|
||||
<h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> icomoon <small class="fgc1">(Glyphs: 3)</small></h1>
|
||||
</div>
|
||||
<div class="clearfix mhl ptl">
|
||||
<h1 class="mvm mtn fgc1">Grid Size: Unknown</h1>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_low"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span><span class="path10"></span><span class="path11"></span><span class="path12"></span><span class="path13"></span><span class="path14"></span><span class="path15"></span><span class="path16"></span><span class="path17"></span><span class="path18"></span><span class="path19"></span></span>
|
||||
<span class="mls"> icon-gps_signal_low</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e900" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-true">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_middle"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span><span class="path10"></span></span>
|
||||
<span class="mls"> icon-gps_signal_middle</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e913" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-true">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="glyph fs1">
|
||||
<div class="clearfix bshadow0 pbs">
|
||||
<span class="icon-gps_signal_high"><span class="path1"></span><span class="path2"></span><span class="path3"></span><span class="path4"></span><span class="path5"></span><span class="path6"></span><span class="path7"></span><span class="path8"></span><span class="path9"></span><span class="path10"></span><span class="path11"></span></span>
|
||||
<span class="mls"> icon-gps_signal_high</span>
|
||||
</div>
|
||||
<fieldset class="fs0 size1of1 clearfix hidden-false">
|
||||
<input type="text" readonly value="e91d" class="unit size1of2" />
|
||||
<input type="text" maxlength="1" readonly value="" class="unitRight size1of2 talign-right" />
|
||||
</fieldset>
|
||||
<div class="fs0 bshadow0 clearfix hidden-true">
|
||||
<span class="unit pvs fgc1">liga: </span>
|
||||
<input type="text" readonly value="" class="liga unitRight" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--[if gt IE 8]><!-->
|
||||
<div class="mhl clearfix mbl">
|
||||
<h1>Font Test Drive</h1>
|
||||
<label>
|
||||
Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
|
||||
min="8" value="48" />
|
||||
px
|
||||
</label>
|
||||
<input id="testText" type="text" class="phl size1of1 mvl"
|
||||
placeholder="Type some text to test..." value=""/>
|
||||
<div id="testDrive" class="icon-" style="font-family: icomoon">
|
||||
</div>
|
||||
</div>
|
||||
<!--<![endif]-->
|
||||
<div class="bgc1 clearfix">
|
||||
<p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
|
||||
</div>
|
||||
|
||||
<script src="demo-files/demo.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
assets/customIcon/icomoon/fonts/icomoon.eot
Normal file
50
assets/customIcon/icomoon/fonts/icomoon.svg
Normal file
@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Generated by IcoMoon</metadata>
|
||||
<defs>
|
||||
<font id="icomoon" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M4.697 588.917c0 123.694 0 245.040 0 366.385 356.991 0 713.982 0 1070.972 0 0-341.333 0-682.667 0-1024-356.991 0-713.982 0-1070.972 0 0 218.422 0 436.844 0 657.615zM54.676 364.512c8.121-29.927 13.467-60.954 24.814-89.603 73.114-184.603 210.166-292.309 405.758-315.852 266.402-32.066 503.041 151.136 541.779 416.589 26.568 182.062-36.314 334.611-177.010 450.896-110.474 91.306-241.173 124.942-383.508 103.957-127.29-18.767-232.431-79.646-312.212-180.371-88.664-111.94-121.433-240.139-99.62-385.616z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M54.001 366.477c-21.138 143.512 11.63 271.711 100.295 383.651 79.781 100.726 184.922 161.605 312.212 180.371 142.335 20.985 273.035-12.651 383.508-103.957 140.696-116.285 203.578-268.833 177.010-450.896-38.737-265.453-275.376-448.655-541.779-416.589-195.592 23.543-332.644 131.249-405.758 315.852-11.347 28.649-16.693 59.676-25.488 91.568zM493.216 377.045c0 0-1.199-1.237-4.108-3.501-15.138-15.638-30.275-31.276-47.497-49.623-6.517-6.27-13.034-12.539-22.199-19.893-20.165-20.664-40.33-41.329-62.409-64.715-4.767-4.63-9.535-9.261-17.027-14.967-17.098-17.578-34.196-35.156-53.412-55.506-3.397-3.166-6.794-6.333-12.766-10.681-15.251-15.398-30.503-30.797-45.735-46.176 161.781-159.584 456.337-177.301 643.164 16.003 193.416 200.12 149.585 488.401 5.346 626.396-56.661-54.941-113.278-109.839-171.898-167.468-9.587-9.377-19.174-18.754-31.401-29.287-17.031-17.498-34.062-34.995-53.17-55.23-4.967-4.743-9.934-9.485-17.489-15.395-18.525-19.010-37.051-38.020-57.67-59.748-6.536-6.316-13.073-12.632-21.576-19.475-1.581-2.108-3.163-4.216-6.521-9.011-6.080-5.961-12.16-11.922-20.487-18.182-1.455-0.761-2.314-1.951-2.211-3.625 0 0 0.034-0.37-0.935 0.085zM457.349 388.087c0 0-0.712-0.977 2.256 1.469 31.315 31.739 62.63 63.477 97.020 96.279 4.189 4.859 8.378 9.717 15.274 15.85 25.278 25.754 50.555 51.508 78.782 78.569 8.838 9.388 17.677 18.776 29.227 29.44 57.003 56.719 114.006 113.437 173.154 172.291-127.777 109.386-271.643 148.812-430.725 105.427-177.884-48.513-292.038-167.261-331.848-348.107-33.559-152.449 8.712-287.734 114.173-407.397 13.331 16.326 24.48 29.98 38.474 44.797 3.774 2.991 7.548 5.982 14.040 10.238 18.934 19.42 37.868 38.839 59.863 59.322 4.17 4.831 8.339 9.662 15.251 15.732 41.798 42.129 83.596 84.258 125.060 126.090z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M647.731 578.948c-25.278-25.754-50.555-51.508-78.41-76.23-85.383 1.219-168.198 2.262-250.989 1.289-54.246-0.638-104.545-39.561-115.433-92.715-6.635-32.394-3.208-66.74-5.864-100.084-4.093-51.377 6.421-97.585 43.256-135.665-11.149-13.654-22.298-27.308-35.629-43.635-105.46 119.663-147.732 254.948-114.173 407.397 39.81 180.846 153.964 299.594 331.848 348.107 159.081 43.385 302.948 3.959 430.725-105.427-59.149-58.854-116.151-115.572-175.322-171.472-52.719 33.54-106.686 44.272-167.197 35.86-49.736-6.914-90.483-28.306-128.083-58.454-11.706-9.386-24.523-22.034-10.979-38.809 12.334-15.278 25.445-6.171 35.552 3.391 47.505 44.942 103.381 65.857 167.97 54.371 25.104-4.464 48.535-18.337 72.729-27.924z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M706.678 589.643c56.617 54.898 113.234 109.796 169.895 164.737 144.239-137.995 188.070-426.275-5.346-626.396-186.827-193.303-481.382-175.587-643.164-16.003 15.232 15.379 30.484 30.777 48.077 45.472 16.687-3.827 31.019-9.601 45.377-9.666 148.48-0.671 296.967-0.883 445.447-0.224 69.745 0.309 124.21 55.525 125.408 125.287 0.577 33.594 0.331 67.208 0.085 100.81-0.56 76.639-54.843 130.298-131.996 130.73-46.094 0.258-92.187 0.496-138.281 0.743 17.031 17.498 34.062 34.995 53.601 52.013 6.812-3.35 10.774-7.623 15.497-8.774 7.82-1.905 21.142-5.075 23.229-1.883 4.929 7.54 6.615 18.719 5.65 28.014-0.567 5.454-8.732 10.12-13.479 15.14z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M288.683 171.611c17.098 17.578 34.196 35.156 54.055 52.173 25.691-0.936 49.255-4.88 71.414-0.931 43.88 7.82 43.56 9.622 43.559 53.704 0 12.444 1.298 25.097-0.649 37.229-0.782 4.871-8.698 8.597-13.367 12.844 15.138 15.638 30.275 31.276 47.258 47.226 1.845 0.312 3.424 1.259 3.58-1.081 0.156-51.265 0.156-100.191 0.156-149.031 10.116 0 17.547 0 26.374 0 0 12.799 0 24.391 0 35.982 0 12.228 0 24.456 0 35.717 22.424 2.396 42.894 2.377 62.18 7.144 31.628 7.817 48.024 32.983 47.054 66.477-0.906 31.284-17.309 50.117-50.913 57.192-10.573 2.226-21.551 2.53-32.344 3.714 18.525 19.010 37.051 38.020 58.45 56.409 55.319-0.696 107.77-0.285 160.207-0.974 60.482-0.795 106.686-46.886 107.85-107.17 0.605-31.3 0.184-62.62 0.12-93.931-0.152-73.981-44.235-118.075-118.264-118.112-138.552-0.068-277.104-0.207-415.655 0.22-17.027 0.052-34.044 3.385-51.065 5.197zM685.514 423.507c-9.389-11.917-22.983-22.491-27.307-36.027-9.514-29.78 6.364-55.983 37.202-65.543 19.283-5.977 39.588-8.571 59.224-13.52 14.668-3.697 25.308-11.705 25.972-28.854 0.681-17.589-8.526-28.124-23.865-33.383-8.692-2.98-18.715-5.807-27.408-4.348-24.887 4.178-49.4 10.58-78.679 17.143 5.071-9.826 7.662-24.504 15.266-27.874 29.575-13.11 61.062-18.449 93.416-8.941 29.759 8.745 48.729 31.477 48.58 58.593-0.153 27.827-15.741 45.238-49.196 53.785-15.864 4.053-32.090 6.666-48.039 10.411-17.044 4.002-31.058 15.2-27.148 32.21 2.68 11.657 15.84 25.504 27.342 29.37 14.379 4.833 32.251 2.436 47.889-0.59 13.633-2.638 26.26-10.48 39.331-16.022 1.731 1.056 3.462 2.112 5.193 3.168-4.75 9.855-7.118 25.43-14.664 28.573-32.18 13.401-65.977 19.331-103.108 1.85z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M553.549 484.772c-31.315-31.739-62.63-63.477-95.517-94.277 4.048 19.731-3.166 30.462-22.079 34.436-11.364 2.388-22.431 6.401-33.866 8.2-45.115 7.097-87.371-11.223-106.921-45.699-22.276-39.283-18.799-104.031 7.602-135.059 2.749-3.23 7.425-4.821 11.207-7.172-18.934-19.42-37.868-38.839-58.357-57.246-21.783 25.020-39.474 50.197-39.474 83.5 0.001 36.655-0.838 73.334 0.222 109.958 1.634 56.438 47.027 102.894 103.262 103.688 77.956 1.101 155.944-0.109 233.919-0.329z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M287.624 170.225c18.081-0.427 35.098-3.759 52.124-3.812 138.55-0.427 277.103-0.289 415.655-0.22 74.029 0.037 118.112 44.131 118.264 118.112 0.064 31.311 0.485 62.632-0.12 93.931-1.164 60.285-47.368 106.376-107.85 107.17-52.437 0.689-104.888 0.278-158.913 1.557 3.386 5.947 8.354 10.689 14.359 16.801 47.132 1.122 93.226 0.884 139.32 0.626 77.153-0.432 131.437-54.090 131.996-130.73 0.245-33.602 0.492-67.216-0.085-100.81-1.198-69.762-55.663-124.978-125.408-125.287-148.48-0.659-296.967-0.447-445.447 0.224-14.358 0.065-28.691 5.839-44.090 10.257 2.342 4.461 5.739 7.628 10.196 12.179z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M649.206 579.601c-25.668 8.934-49.099 22.807-74.203 27.271-64.589 11.486-120.465-9.429-167.97-54.371-10.107-9.562-23.218-18.669-35.552-3.391-13.543 16.775-0.727 29.423 10.979 38.809 37.6 30.148 78.346 51.54 128.083 58.454 60.511 8.412 114.478-2.32 165.841-36.498-8.027-10.846-16.865-20.234-27.178-30.275z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M457.684 388.383c-41.798-42.129-83.596-84.258-127.487-125.542-26.108 30.178-27.734 63.581-17.936 98.031 8.9 31.292 33.578 51.725 65.771 48.569 26.979-2.645 53.133-13.717 79.652-21.058z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M555.087 485.304c-79.512-0.311-157.501 0.898-235.457-0.203-56.235-0.794-101.629-47.25-103.262-103.688-1.060-36.624-0.222-73.304-0.222-109.958-0.001-33.303 17.69-58.48 38.115-84.132-3.578-4.636-7.352-7.627-12.548-11.199-38.258 37.499-48.771 83.707-44.678 135.084 2.656 33.344-0.771 67.69 5.864 100.084 10.887 53.154 61.187 92.077 115.433 92.715 82.792 0.973 165.607-0.070 249.637-1.926-2.965-6.528-7.154-11.386-12.881-16.777z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M545.992 428.612c11.84 0.175 22.818-0.129 33.391-2.355 33.604-7.075 50.007-25.908 50.913-57.192 0.97-33.494-15.425-58.66-47.054-66.477-19.286-4.767-39.756-4.748-62.18-7.144 0-11.261 0-23.489 0-35.717 0-11.592 0-23.183 0-35.982-8.826 0-16.258 0-26.374 0 0 48.84 0 97.766-0.001 149.426-0.001 2.734-0.505 3.42-0.505 3.42s-0.034 0.37 1.059 0.011c1.85 1.188 2.607 2.735 3.365 4.282 6.080 5.961 12.16 11.922 20.248 17.625 2.008-25.676 2.008-51.094 2.008-77.932 17.043 0.788 31.148 0.143 44.792 2.347 26.442 4.272 39.396 20.134 38.472 44.438-0.849 22.312-15.605 35.775-42.153 38.187-12.196 1.108-24.425 1.849-36.638 2.756 6.536 6.316 13.073 12.632 20.656 20.308z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M457.516 388.235c-26.352 7.489-52.505 18.561-79.484 21.206-32.194 3.157-56.871-17.277-65.771-48.569-9.799-34.449-8.172-67.852 16.564-98.65-3.448-6.296-7.618-11.127-13.318-16.489-5.312 1.82-9.989 3.41-12.737 6.64-26.401 31.028-29.878 95.776-7.602 135.059 19.55 34.476 61.806 52.796 106.921 45.699 11.434-1.799 22.502-5.812 33.866-8.2 18.913-3.974 26.127-14.705 20.595-35.66 0.088-2.163 0.8-1.185 0.968-1.037z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M524.353 408.041c13.198-0.644 25.427-1.385 37.622-2.493 26.548-2.411 41.304-15.875 42.153-38.187 0.924-24.304-12.030-40.166-38.472-44.438-13.644-2.204-27.749-1.559-44.792-2.347 0 26.838 0 52.255-1.119 79.275 0.462 3.71 2.043 5.818 4.608 8.19z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M442.653 325.275c5.711-2.892 13.627-6.618 14.409-11.489 1.947-12.132 0.649-24.785 0.649-37.229 0.001-44.083 0.322-45.885-43.559-53.704-22.158-3.949-45.723-0.005-70.051 1.469 3.368 5.73 8.136 10.36 15.853 16.702 19.909 2.381 37.037 1.881 53.745 4.292 6.746 0.974 18.282 9.024 17.833 12.635-1.964 15.793 11.32 35.329-9.472 47.16 6.517 6.27 13.034 12.539 20.593 20.164z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M420.736 304.57c22.116-11.289 8.832-30.825 10.796-46.618 0.449-3.61-11.087-11.661-17.833-12.635-16.708-2.411-33.836-1.911-52.788-2.931 18.172 20.313 38.337 40.978 59.825 62.184z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M705.677 588.278c5.749-3.655 13.914-8.32 14.481-13.775 0.965-9.296-0.721-20.474-5.65-28.014-2.087-3.192-15.409-0.021-23.229 1.883-4.723 1.15-8.685 5.423-14.177 9.351 8.399 10.435 17.986 19.812 28.575 30.555z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M497.484 380.734c0.366-1.398-0.391-2.945-2.425-4.106-1.012 2.006-0.153 3.196 2.425 4.106z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M493.7 376.817c0.484-0.227 0.988-0.913 0.833-1.308s-1.735-1.341-2.125-0.521c-0.39 0.82 0.808 2.057 1.292 1.829z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M687.197 424.213c35.449 16.776 69.246 10.846 101.426-2.555 7.546-3.142 9.914-18.717 14.664-28.573-1.731-1.056-3.462-2.112-5.193-3.168-13.071 5.543-25.698 13.385-39.331 16.022-15.639 3.026-33.51 5.423-47.889 0.59-11.501-3.866-24.662-17.713-27.342-29.37-3.91-17.009 10.104-28.208 27.148-32.21 15.949-3.745 32.176-6.358 48.039-10.411 33.454-8.548 49.042-25.958 49.196-53.785 0.149-27.116-18.82-49.848-48.58-58.593-32.354-9.507-63.842-4.168-93.416 8.941-7.604 3.37-10.195 18.049-15.266 27.874 29.28-6.563 53.793-12.965 78.679-17.143 8.693-1.459 18.716 1.368 27.408 4.348 15.339 5.259 24.545 15.794 23.865 33.383-0.664 17.149-11.304 25.157-25.972 28.854-19.636 4.949-39.941 7.543-59.224 13.52-30.839 9.56-46.717 35.762-37.202 65.543 4.324 13.535 17.918 24.109 28.99 36.732z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M601.248-68.697c-200.416 0-398.483 0-596.55 0 0 341.333 0 682.667 0 1024 356.991 0 713.982 0 1070.972 0 0-341.333 0-682.666 0-1024-157.358 0-314.716 0-474.422 0zM992.795 289.415c26.319 76.179 33.921 154.172 18.963 233.408-47.787 253.137-266.071 416.098-522.563 391.022-277.053-27.086-471.494-299.456-412.78-571.963 40.134-186.274 229.787-382.491 455.627-363.915 38.042 3.129 77.887-4.194 114.39 4.212 168.807 38.872 283.272 142.1 346.364 307.236z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M992.239 287.654c-62.537-163.374-177.001-266.603-345.809-305.475-36.502-8.406-76.348-1.083-114.39-4.212-225.84-18.576-415.492 177.641-455.627 363.915-58.714 272.507 135.727 544.877 412.78 571.963 256.493 25.076 474.776-137.885 522.563-391.022 14.958-79.236 7.356-157.229-19.519-235.17zM664.661 147.327c34.442 0.014 68.894-0.519 103.322 0.157 68.659 1.348 123.080 55.748 124.381 124.386 0.682 35.994 0.692 72.023-0.003 108.016-1.326 68.636-55.819 123.928-124.405 124.27-148.722 0.741-297.452 0.743-446.174-0.001-68.563-0.343-123.086-55.742-124.408-124.298-0.634-32.864-0.22-65.75-0.12-98.626 0.245-80.241 53.727-133.784 133.948-133.873 109.587-0.121 219.175-0.031 333.459-0.031zM682.018 710.766c-58.826 19.859-118.173 30.421-180.832 19.534-68.359-11.877-127.277-40.675-177.552-87.976-10.499-9.878-22.386-19.995-6.634-34.441 13.496-12.377 25.599-7.537 37.361 4.155 89.111 88.585 230.179 104.762 339.503 45.382 25.276-13.729 47.029-33.919 70.515-50.983 10.067-7.314 20.821-8.483 29.222 1.699 8.968 10.869 5.112 20.28-4.318 30.329-29.478 31.414-65.62 52.506-107.267 72.301zM643.5 628.863c-28.682 7.041-57.115 18.587-86.096 20.186-60.451 3.335-115.995-13.125-163.652-53.267-26.11-21.993-34.912-35.592-22.149-46.667 22.561-19.577 33.74 3.52 47.501 15.060 37.726 31.635 82.827 48.181 130.31 46.809 53.545-1.548 101.016-25.184 141.615-61.611 5.127-4.6 16.988-1.697 25.729-2.27 0.367 10.311 5.19 25.976 0.338 30.014-22.038 18.339-46.802 33.401-73.596 51.747z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M662.312 147.327c-111.936 0-221.523-0.091-331.111 0.031-80.221 0.089-133.702 53.632-133.948 133.873-0.1 32.876-0.514 65.762 0.12 98.626 1.322 68.556 55.846 123.955 124.408 124.298 148.722 0.745 297.452 0.743 446.174 0.001 68.586-0.342 123.079-55.634 124.405-124.27 0.695-35.994 0.685-72.022 0.003-108.016-1.301-68.638-55.722-123.038-124.381-124.386-34.428-0.676-68.881-0.143-105.671-0.157zM368.775 166.181c130.586 0.001 261.173-0.164 391.759 0.071 67.376 0.121 112.735 45.978 113.104 113.691 0.179 32.841 0.547 65.694-0.096 98.524-1.159 59.195-46.848 106.465-105.64 106.775-148.567 0.785-297.144 0.749-445.711 0.025-57.945-0.282-104.202-46.517-105.834-104.128-1.040-36.722-0.916-73.515-0.024-110.244 1.173-48.284 33.133-89.407 80.327-100.115 21.711-4.926 44.915-3.271 72.114-4.599z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M683.667 709.907c39.997-18.936 76.139-40.028 105.617-71.442 9.43-10.049 13.285-19.46 4.318-30.329-8.401-10.182-19.155-9.012-29.222-1.699-23.486 17.063-45.239 37.254-70.515 50.983-109.325 59.38-250.392 43.203-339.503-45.382-11.762-11.692-23.865-16.532-37.361-4.155-15.752 14.446-3.865 24.563 6.634 34.441 50.274 47.301 109.193 76.099 177.552 87.976 62.658 10.887 122.006 0.326 182.481-20.393z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M645.005 627.811c25.288-17.293 50.053-32.356 72.090-50.695 4.853-4.038 0.030-19.703-0.338-30.014-8.741 0.573-20.601-2.331-25.729 2.27-40.6 36.427-88.071 60.063-141.615 61.611-47.484 1.373-92.584-15.174-130.31-46.809-13.761-11.54-24.94-34.636-47.501-15.060-12.763 11.075-3.961 24.674 22.149 46.667 47.658 40.143 103.201 56.602 163.652 53.267 28.982-1.599 57.415-13.145 87.602-21.238z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M366.439 166.181c-24.863 1.329-48.067-0.327-69.778 4.599-47.194 10.708-79.155 51.831-80.327 100.115-0.892 36.73-1.016 73.522 0.024 110.244 1.632 57.611 47.889 103.846 105.834 104.128 148.568 0.724 297.144 0.76 445.711-0.025 58.792-0.31 104.481-47.581 105.64-106.775 0.642-32.83 0.275-65.683 0.096-98.524-0.369-67.713-45.728-113.57-113.104-113.691-130.586-0.235-261.173-0.070-394.095-0.071zM410.844 302.353c6.827-0.309 13.654-0.619 22.056-1 0-14.41 0.614-27.571-0.338-40.618-0.327-4.485-3.472-10.549-7.185-12.728-40.471-23.743-102.254-0.921-113.308 44.194-5.174 21.115-4.564 45.116-0.526 66.677 6.082 32.478 33.028 52.991 66.314 50.82 26.181-1.708 51.959-9.592 78.275-14.804 5.308 16.108-3.216 24.293-20.19 29.897-58.040 19.164-113.328 6.091-138.535-34.017-26.323-41.883-21.286-111.849 11.512-144.489 36.008-35.836 89.26-35.018 139.289-12.143 3.876 1.772 8.115 7.772 8.234 11.92 0.748 26.179 0.379 52.389 0.379 78.263-27.606 0-52.162 0-77.875 0 0.878-8.232 1.576-14.768 2.345-21.973 9.523 0 17.283 0 29.554 0zM657.369 386.793c-1.997-41.811 9.834-57.724 50.995-67.96 17.323-4.308 35.697-5.977 51.802-12.971 8.886-3.859 18.649-15.769 19.638-24.952 1.019-9.461-5.876-22.55-13.498-29.368-7.288-6.519-20.319-10.495-30.202-9.485-26.452 2.705-52.568 8.684-81.127 13.773 1.527-5.9 0.893-18.391 6.62-23.030 27.401-22.194 96.867-19.471 124.106 3.414 16.705 14.035 24.667 31.973 20.79 54.121-3.782 21.604-17.421 34.603-37.705 40.392-17.18 4.903-34.768 8.413-52.239 12.252-20.136 4.424-36.857 13.551-34.112 36.974 2.673 22.812 21.442 31.392 41.201 29.732 24.914-2.094 49.415-9.105 74.859-14.146 5.42 15.393 0.070 27.113-21.212 30.435-11.497 1.795-22.617 6.101-34.125 7.704-38.083 5.303-68.182-10.241-85.791-46.885zM621.648 398.813c-33.585 44.783-81.323 26.053-124.295 30.444 0-70.19 0-137.675 0-205.577 8.016 0 14.624 0 23.448 0 0 24.832 0 48.61 0 72.033 97.387 10.277 124.705 37.339 100.847 103.1z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M408.589 302.353c-10.016 0-17.776 0-27.299 0-0.769 7.204-1.466 13.74-2.345 21.973 25.713 0 50.269 0 77.875 0 0-25.874 0.369-52.085-0.379-78.263-0.118-4.148-4.358-10.148-8.234-11.92-50.029-22.875-103.28-23.693-139.289 12.143-32.798 32.641-37.836 102.606-11.512 144.489 25.207 40.108 80.495 53.181 138.535 34.017 16.974-5.605 25.498-13.789 20.19-29.897-26.315 5.212-52.093 13.096-78.275 14.804-33.286 2.171-60.232-18.342-66.314-50.82-4.038-21.56-4.648-45.561 0.526-66.677 11.054-45.115 72.837-67.938 113.308-44.194 3.714 2.179 6.858 8.243 7.185 12.728 0.952 13.047 0.338 26.208 0.338 40.618-8.402 0.381-15.229 0.69-24.311 1z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M657.702 388.693c17.275 34.745 47.374 50.289 85.457 44.986 11.509-1.603 22.628-5.909 34.125-7.704 21.282-3.322 26.632-15.042 21.212-30.435-25.444 5.041-49.944 12.052-74.859 14.146-19.759 1.66-38.528-6.92-41.201-29.732-2.745-23.423 13.976-32.549 34.112-36.974 17.471-3.839 35.059-7.348 52.239-12.252 20.284-5.789 33.923-18.788 37.705-40.392 3.877-22.148-4.085-40.086-20.79-54.121-27.239-22.885-96.705-25.608-124.106-3.414-5.727 4.639-5.093 17.13-6.62 23.030 28.558-5.089 54.675-11.068 81.127-13.773 9.883-1.011 22.914 2.966 30.202 9.485 7.622 6.818 14.516 19.906 13.498 29.368-0.989 9.183-10.752 21.093-19.638 24.952-16.105 6.994-34.478 8.663-51.802 12.971-41.16 10.236-52.992 26.149-50.661 69.859z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M622.778 397.345c22.728-64.292-4.59-91.354-101.976-101.631 0-23.423 0-47.201 0-72.033-8.824 0-15.432 0-23.448 0 0 67.902 0 135.386 0 205.577 42.971-4.391 90.71 14.339 125.424-31.912zM604.49 372.905c-12.204 31.237-39.004 40.681-82.929 29.447 0-26.401 0-52.698 0-78.832 58.152-8.154 79.432 3.716 82.929 49.386z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M604.637 371.092c-3.644-43.857-24.924-55.727-83.076-47.573 0 26.134 0 52.432 0 78.832 43.925 11.234 70.725 1.79 83.076-31.26z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M634.128-68.697c-211.376 0-420.404 0-629.431 0 0 341.333 0 682.667 0 1024 356.991 0 713.982 0 1070.972 0 0-341.333 0-682.666 0-1024-146.398 0-292.795 0-441.541 0zM1018.959 458.531c-2.949 21.188-6.17 42.343-8.797 63.572-7.842 63.369-29.651 122.3-64.221 175.103-52.965 80.9-122.179 144.268-212.401 183.329-93.652 40.546-190.908 50.996-289.73 30.777-107.563-22.007-197.921-76.162-268.048-162.18-91.023-111.65-127.203-239.557-104.177-380.846 18.831-115.543 74.43-213.335 166.396-288.16 104.879-85.331 223.578-123.823 359.421-107.232 127.561 15.579 230.911 75.57 312.898 171.565 75.519 88.421 105.49 194.946 108.657 314.073z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M1019.106 456.382c-3.315-116.979-33.286-223.503-108.805-311.924-81.987-95.995-185.338-155.986-312.898-171.565-135.842-16.591-254.542 21.901-359.421 107.232-91.966 74.825-147.566 172.617-166.396 288.16-23.027 141.289 13.153 269.197 104.177 380.846 70.127 86.018 160.485 140.173 268.048 162.18 98.822 20.219 196.077 9.769 289.73-30.777 90.221-39.061 159.436-102.428 212.401-183.329 34.569-52.803 56.378-111.734 64.221-175.103 2.627-21.228 5.847-42.383 8.944-65.72zM799.743 152.021c62.703 22.243 92.613 64.375 92.766 130.838 0.074 32.063 0.444 64.135-0.102 96.189-1.189 69.756-55.905 124.893-125.817 125.173-147.803 0.59-295.611 0.59-443.413 0-69.904-0.279-124.673-55.467-125.831-125.172-0.533-32.055-0.164-64.126-0.096-96.189 0.174-82.015 53.086-135.436 134.513-135.5 141.549-0.11 283.097-0.132 424.645 0.139 13.163 0.025 26.322 2.415 43.334 4.522zM845.943 669.217c19.664 10.476 16.044 24.67 4.691 38.181-6.827 8.124-16.424 13.898-24.667 20.858-102.658 86.687-220.311 118.998-352.495 95.284-83.844-15.042-156.91-52.061-217.902-112.387-11.64-11.513-17.353-25.465-7.901-36.833 10.802-12.99 25.375-4.53 36.919 4.494 1.834 1.434 3.342 3.283 5.018 4.923 60.514 59.235 134.53 92.844 217.163 101.47 109.754 11.457 209.174-18.078 293.803-91.941 11.899-10.386 27.653-16.356 45.371-24.049zM775.039 652.364c-78.335 64.668-166.752 92.678-268.706 78.131-71.31-10.174-131.594-40.482-183.638-89.055-10.127-9.451-20.415-19.409-6.217-33.024 13.592-13.034 25.731-7.147 37.973 3.565 13.894 12.158 27.903 24.545 43.376 34.475 61.476 39.454 128.107 52.37 200.921 41.953 56.244-8.047 104.338-30.4 146.366-67.287 13.962-12.254 29.686-30.189 46.735-14.515 19.369 17.807-2.919 30.777-16.81 45.756zM399.999 546.8c4.109 3.525 8.218 7.050 12.327 10.576 55.468 47.602 118.517 67.82 188.788 42.195 32.254-11.762 60.401-34.606 90.859-51.624 5.929-3.313 16.294-6.3 20.4-3.423 5.732 4.015 9.759 13.546 10.223 20.983 0.345 5.545-4.97 12.755-9.708 17.108-71.283 65.488-154.002 84.582-245.127 52.948-31.757-11.024-60.431-32.244-88.491-51.721-7.438-5.163-7.376-21.133-10.757-32.141 9.337-1.91 18.674-3.821 31.487-4.902z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M797.817 151.614c-15.087-1.699-28.245-4.090-41.408-4.115-141.548-0.271-283.097-0.249-424.645-0.139-81.427 0.063-134.339 53.485-134.513 135.5-0.068 32.063-0.437 64.134 0.096 96.189 1.159 69.705 55.927 124.893 125.831 125.172 147.803 0.59 295.611 0.59 443.413 0 69.912-0.279 124.629-55.417 125.817-125.173 0.546-32.054 0.176-64.126 0.102-96.189-0.153-66.463-30.063-108.596-94.692-131.246zM462.679 166.18c100.986 0.005 201.975-0.427 302.958 0.18 60.49 0.363 106.842 46.898 107.908 107.238 0.608 34.434 0.52 68.894 0.025 103.332-0.887 61.658-47.25 108.284-109.092 108.475-146.39 0.453-292.783 0.452-439.173 0.001-61.838-0.191-108.207-46.807-109.117-108.458-0.496-33.655-0.422-67.327-0.021-100.984 0.751-63.060 47.040-109.14 110.297-109.701 43.836-0.389 87.678-0.079 136.214-0.082z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M844.068 669.056c-15.844 7.853-31.597 13.823-43.497 24.209-84.628 73.863-184.049 103.398-293.803 91.941-82.633-8.626-156.65-42.235-217.163-101.47-1.675-1.64-3.184-3.489-5.018-4.923-11.544-9.024-26.117-17.485-36.919-4.494-9.453 11.368-3.739 25.32 7.901 36.833 60.992 60.327 134.058 97.345 217.902 112.387 132.184 23.715 249.838-8.597 352.495-95.284 8.242-6.96 17.84-12.734 24.667-20.858 11.353-13.51 14.973-27.705-6.565-38.341z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M776.248 651.155c12.682-13.769 34.97-26.74 15.6-44.547-17.049-15.674-32.774 2.26-46.735 14.515-42.028 36.887-90.122 59.24-146.366 67.287-72.815 10.418-139.446-2.499-200.921-41.953-15.472-9.93-29.482-22.317-43.376-34.475-12.242-10.712-24.38-16.599-37.973-3.565-14.197 13.615-3.909 23.572 6.217 33.024 52.044 48.573 112.328 78.88 183.638 89.055 101.954 14.546 190.371-13.463 269.916-79.34z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M398.261 546.385c-11.075 1.496-20.412 3.406-29.749 5.317 3.381 11.008 3.319 26.978 10.757 32.141 28.060 19.476 56.734 40.696 88.491 51.721 91.125 31.634 173.844 12.54 245.127-52.948 4.738-4.353 10.054-11.563 9.708-17.108-0.463-7.438-4.491-16.968-10.223-20.983-4.106-2.876-14.471 0.111-20.4 3.423-30.457 17.017-58.605 39.862-90.859 51.624-70.271 25.626-133.319 5.407-188.788-42.195-4.109-3.526-8.218-7.051-14.065-10.991z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M460.33 166.18c-46.188 0.003-90.030-0.307-133.865 0.082-63.258 0.561-109.546 46.641-110.297 109.701-0.401 33.657-0.475 67.329 0.021 100.984 0.909 61.651 47.278 108.267 109.117 108.458 146.39 0.451 292.783 0.452 439.173-0.001 61.841-0.191 108.205-46.817 109.092-108.475 0.495-34.438 0.584-68.898-0.025-103.332-1.066-60.34-47.418-106.875-107.908-107.238-100.983-0.607-201.972-0.174-305.307-0.18zM340.633 225.826c35.799-14.349 70.394-7.23 104.144 6.899 5.113 2.141 11.149 9.453 11.386 14.62 1.171 25.462 0.532 51.008 0.532 76.842-27.198 0-51.657 0-75.875 0 0-7.697 0-13.674 0-22.485 17.769 0 34.459 0 52.007 0 0-14.544 1.262-26.438-0.504-37.863-0.961-6.217-5.759-14.609-11.061-16.943-38.518-16.957-84.093-3.123-102.989 30.044-21.968 38.559-13.994 97.141 18.296 119.752 10.837 7.589 26.101 13.677 38.802 12.783 26.576-1.871 52.794-8.84 80.39-13.943 4.744 12.517 0.763 23.549-16.791 27.935-10.55 2.636-21.136 5.176-31.792 7.328-55.339 11.175-102.859-12.441-119.261-60.624-15.491-45.51-9.434-119.357 52.716-144.345zM661.318 397.547c-12.57-40.998 1.507-66.808 42.796-77.559 18.777-4.889 38.636-6.857 56.313-14.213 8.794-3.66 18.328-16.050 19.211-25.287 0.905-9.46-6.123-22.435-13.802-29.166-7.362-6.452-20.389-10.329-30.272-9.265-26.437 2.848-52.522 8.954-81.688 14.305 2.368-7.142 2.569-19.328 8.532-23.757 27.572-20.48 90.308-19.552 118.496 0.039 18.721 13.012 28.751 30.903 26.118 54.048-2.676 23.529-16.679 38.243-39.23 44.283-19.539 5.233-39.435 9.122-59.019 14.2-15.932 4.132-26.398 14.267-26.752 31.326-0.367 17.68 11.667 26.503 26.824 31.211 6.559 2.037 14.138 3.582 20.689 2.35 22.963-4.317 45.681-9.94 71.626-15.771-2.892 8.827-3.314 22.748-8.993 25.396-36.951 17.233-99.421 26.774-130.849-22.141zM623.879 335.751c14.226 41.402 3.962 76.291-30.808 85.39-30.58 8.002-63.426 7.345-95.358 10.52 0-73.371 0-140.308 0-207.64 8.016 0 14.555 0 23.827 0 0 25.128 0 48.859 0 72.994 39.077 1.297 77.422-2.354 102.339 38.736z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M338.867 226.395c-60.385 24.419-66.442 98.266-50.95 143.776 16.401 48.183 63.922 71.799 119.261 60.624 10.657-2.152 21.243-4.692 31.792-7.328 17.554-4.386 21.535-15.418 16.791-27.935-27.596 5.103-53.814 12.071-80.39 13.943-12.701 0.894-27.964-5.194-38.802-12.783-32.29-22.611-40.264-81.194-18.296-119.752 18.897-33.168 64.471-47.001 102.989-30.044 5.302 2.334 10.1 10.726 11.061 16.943 1.766 11.425 0.504 23.319 0.504 37.863-17.548 0-34.239 0-52.007 0 0 8.811 0 14.788 0 22.485 24.218 0 48.676 0 75.875 0 0-25.834 0.639-51.38-0.532-76.842-0.238-5.167-6.273-12.479-11.386-14.62-33.75-14.129-68.344-21.248-105.909-6.329z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M662.091 399.241c30.656 47.221 93.125 37.68 130.076 20.448 5.679-2.648 6.101-16.569 8.993-25.396-25.945 5.831-48.663 11.454-71.626 15.771-6.551 1.232-14.13-0.312-20.689-2.35-15.157-4.708-27.191-13.531-26.824-31.211 0.354-17.060 10.82-27.195 26.752-31.326 19.584-5.079 39.48-8.967 59.019-14.2 22.551-6.040 36.554-20.754 39.23-44.283 2.633-23.145-7.397-41.036-26.118-54.048-28.188-19.592-90.924-20.519-118.496-0.039-5.963 4.429-6.164 16.614-8.532 23.757 29.166-5.351 55.252-11.457 81.688-14.305 9.883-1.065 22.911 2.812 30.272 9.265 7.68 6.731 14.707 19.706 13.802 29.166-0.883 9.236-10.418 21.627-19.211 25.287-17.677 7.356-37.536 9.324-56.313 14.213-41.289 10.751-55.366 36.561-42.024 79.253z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M622.875 334.208c-23.913-39.547-62.258-35.895-101.335-37.193 0-24.135 0-47.866 0-72.994-9.272 0-15.811 0-23.827 0 0 67.332 0 134.269 0 207.64 31.933-3.176 64.779-2.518 95.358-10.52 34.77-9.099 45.034-43.987 29.804-86.933zM571.737 404.573c-16.744 0-33.488 0-49.651 0 0-28.983 0-55.24 0-81.277 50.406-6.214 72.301 1.84 80.559 28.949 7.077 23.233-1.362 39.302-30.908 52.328z" />
|
||||
<glyph unicode="" horiz-adv-x="1071" d="M573.663 404.168c27.62-12.621 36.059-28.689 28.982-51.922-8.258-27.108-30.152-35.162-80.559-28.949 0 26.037 0 52.294 0 81.277 16.163 0 32.907 0 51.576-0.406z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 28 KiB |
BIN
assets/customIcon/icomoon/fonts/icomoon.ttf
Normal file
BIN
assets/customIcon/icomoon/fonts/icomoon.woff
Normal file
1
assets/customIcon/icomoon/selection.json
Normal file
224
assets/customIcon/icomoon/style.css
Normal file
@ -0,0 +1,224 @@
|
||||
@font-face {
|
||||
font-family: 'icomoon';
|
||||
src: url('fonts/icomoon.eot?eq8f84');
|
||||
src: url('fonts/icomoon.eot?eq8f84#iefix') format('embedded-opentype'),
|
||||
url('fonts/icomoon.ttf?eq8f84') format('truetype'),
|
||||
url('fonts/icomoon.woff?eq8f84') format('woff'),
|
||||
url('fonts/icomoon.svg?eq8f84#icomoon') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
font-display: block;
|
||||
}
|
||||
|
||||
[class^="icon-"], [class*=" icon-"] {
|
||||
/* use !important to prevent issues with browser extensions that change fonts */
|
||||
font-family: 'icomoon' !important;
|
||||
speak: never;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-gps_signal_low .path1:before {
|
||||
content: "\e900";
|
||||
color: rgb(255, 253, 253);
|
||||
}
|
||||
.icon-gps_signal_low .path2:before {
|
||||
content: "\e901";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(255, 37, 4);
|
||||
}
|
||||
.icon-gps_signal_low .path3:before {
|
||||
content: "\e902";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(255, 253, 253);
|
||||
}
|
||||
.icon-gps_signal_low .path4:before {
|
||||
content: "\e903";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(255, 252, 252);
|
||||
}
|
||||
.icon-gps_signal_low .path5:before {
|
||||
content: "\e904";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(251, 251, 251);
|
||||
}
|
||||
.icon-gps_signal_low .path6:before {
|
||||
content: "\e905";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(252, 250, 250);
|
||||
}
|
||||
.icon-gps_signal_low .path7:before {
|
||||
content: "\e906";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(5, 5, 5);
|
||||
}
|
||||
.icon-gps_signal_low .path8:before {
|
||||
content: "\e907";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_low .path9:before {
|
||||
content: "\e908";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(250, 248, 248);
|
||||
}
|
||||
.icon-gps_signal_low .path10:before {
|
||||
content: "\e909";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(6, 6, 6);
|
||||
}
|
||||
.icon-gps_signal_low .path11:before {
|
||||
content: "\e90a";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(10, 10, 10);
|
||||
}
|
||||
.icon-gps_signal_low .path12:before {
|
||||
content: "\e90b";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(12, 12, 12);
|
||||
}
|
||||
.icon-gps_signal_low .path13:before {
|
||||
content: "\e90c";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(251, 251, 251);
|
||||
}
|
||||
.icon-gps_signal_low .path14:before {
|
||||
content: "\e90d";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(10, 10, 10);
|
||||
}
|
||||
.icon-gps_signal_low .path15:before {
|
||||
content: "\e90e";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(250, 238, 238);
|
||||
}
|
||||
.icon-gps_signal_low .path16:before {
|
||||
content: "\e90f";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_low .path17:before {
|
||||
content: "\e910";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(113, 106, 106);
|
||||
}
|
||||
.icon-gps_signal_low .path18:before {
|
||||
content: "\e911";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(113, 106, 106);
|
||||
}
|
||||
.icon-gps_signal_low .path19:before {
|
||||
content: "\e912";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(12, 12, 12);
|
||||
}
|
||||
.icon-gps_signal_middle .path1:before {
|
||||
content: "\e913";
|
||||
color: rgb(255, 255, 254);
|
||||
}
|
||||
.icon-gps_signal_middle .path2:before {
|
||||
content: "\e914";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(255, 255, 1);
|
||||
}
|
||||
.icon-gps_signal_middle .path3:before {
|
||||
content: "\e915";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(6, 6, 0);
|
||||
}
|
||||
.icon-gps_signal_middle .path4:before {
|
||||
content: "\e916";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_middle .path5:before {
|
||||
content: "\e917";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_middle .path6:before {
|
||||
content: "\e918";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(251, 251, 0);
|
||||
}
|
||||
.icon-gps_signal_middle .path7:before {
|
||||
content: "\e919";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(11, 11, 4);
|
||||
}
|
||||
.icon-gps_signal_middle .path8:before {
|
||||
content: "\e91a";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(13, 13, 4);
|
||||
}
|
||||
.icon-gps_signal_middle .path9:before {
|
||||
content: "\e91b";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(11, 11, 4);
|
||||
}
|
||||
.icon-gps_signal_middle .path10:before {
|
||||
content: "\e91c";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(251, 251, 0);
|
||||
}
|
||||
.icon-gps_signal_high .path1:before {
|
||||
content: "\e91d";
|
||||
color: rgb(254, 255, 255);
|
||||
}
|
||||
.icon-gps_signal_high .path2:before {
|
||||
content: "\e91e";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(70, 248, 5);
|
||||
}
|
||||
.icon-gps_signal_high .path3:before {
|
||||
content: "\e91f";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 5, 0);
|
||||
}
|
||||
.icon-gps_signal_high .path4:before {
|
||||
content: "\e920";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_high .path5:before {
|
||||
content: "\e921";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(2, 2, 2);
|
||||
}
|
||||
.icon-gps_signal_high .path6:before {
|
||||
content: "\e922";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(1, 1, 1);
|
||||
}
|
||||
.icon-gps_signal_high .path7:before {
|
||||
content: "\e923";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(69, 244, 5);
|
||||
}
|
||||
.icon-gps_signal_high .path8:before {
|
||||
content: "\e924";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(6, 11, 4);
|
||||
}
|
||||
.icon-gps_signal_high .path9:before {
|
||||
content: "\e925";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(6, 12, 4);
|
||||
}
|
||||
.icon-gps_signal_high .path10:before {
|
||||
content: "\e926";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(5, 11, 4);
|
||||
}
|
||||
.icon-gps_signal_high .path11:before {
|
||||
content: "\e927";
|
||||
margin-left: -1.0458984375em;
|
||||
color: rgb(69, 244, 5);
|
||||
}
|
||||
BIN
assets/fonts/icomoon.ttf
Normal file
BIN
assets/images/money.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
@ -21,6 +21,6 @@
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>11.0</string>
|
||||
<string>12.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
# Uncomment this line to define a global platform for your project
|
||||
# platform :ios, '11.0'
|
||||
platform :ios, '12.0'
|
||||
|
||||
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||
|
||||
147
ios/Podfile.lock
@ -4,175 +4,124 @@ PODS:
|
||||
- connectivity_plus (0.0.1):
|
||||
- Flutter
|
||||
- ReachabilitySwift
|
||||
- DKImagePickerController/Core (4.3.4):
|
||||
- DKImagePickerController/ImageDataManager
|
||||
- DKImagePickerController/Resource
|
||||
- DKImagePickerController/ImageDataManager (4.3.4)
|
||||
- DKImagePickerController/PhotoGallery (4.3.4):
|
||||
- DKImagePickerController/Core
|
||||
- DKPhotoGallery
|
||||
- DKImagePickerController/Resource (4.3.4)
|
||||
- DKPhotoGallery (0.0.17):
|
||||
- DKPhotoGallery/Core (= 0.0.17)
|
||||
- DKPhotoGallery/Model (= 0.0.17)
|
||||
- DKPhotoGallery/Preview (= 0.0.17)
|
||||
- DKPhotoGallery/Resource (= 0.0.17)
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Core (0.0.17):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Preview
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Model (0.0.17):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Preview (0.0.17):
|
||||
- DKPhotoGallery/Model
|
||||
- DKPhotoGallery/Resource
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- DKPhotoGallery/Resource (0.0.17):
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
- file_picker (0.0.1):
|
||||
- DKImagePickerController/PhotoGallery
|
||||
- device_info_plus (0.0.1):
|
||||
- Flutter
|
||||
- Flutter (1.0.0)
|
||||
- flutter_compass (0.0.1):
|
||||
- Flutter
|
||||
- flutter_keyboard_visibility (0.0.1):
|
||||
- Flutter
|
||||
- flutter_local_notifications (0.0.1):
|
||||
- Flutter
|
||||
- FMDB (2.7.5):
|
||||
- FMDB/standard (= 2.7.5)
|
||||
- FMDB/standard (2.7.5)
|
||||
- geolocator_apple (1.2.0):
|
||||
- Flutter
|
||||
- google_maps_flutter_ios (0.0.1):
|
||||
- image_gallery_saver (2.0.2):
|
||||
- Flutter
|
||||
- GoogleMaps
|
||||
- GoogleMaps (4.1.0):
|
||||
- GoogleMaps/Maps (= 4.1.0)
|
||||
- GoogleMaps/Base (4.1.0)
|
||||
- GoogleMaps/Maps (4.1.0):
|
||||
- GoogleMaps/Base
|
||||
- image_picker_ios (0.0.1):
|
||||
- Flutter
|
||||
- move_to_background (0.0.1):
|
||||
- isar_flutter_libs (1.0.0):
|
||||
- Flutter
|
||||
- path_provider_ios (0.0.1):
|
||||
- package_info_plus (0.4.5):
|
||||
- Flutter
|
||||
- permission_handler_apple (9.0.4):
|
||||
- path_provider_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- permission_handler_apple (9.3.0):
|
||||
- Flutter
|
||||
- pointer_interceptor_ios (0.0.1):
|
||||
- Flutter
|
||||
- ReachabilitySwift (5.0.0)
|
||||
- SDWebImage (5.15.5):
|
||||
- SDWebImage/Core (= 5.15.5)
|
||||
- SDWebImage/Core (5.15.5)
|
||||
- share_plus (0.0.1):
|
||||
- Flutter
|
||||
- shared_preferences_foundation (0.0.1):
|
||||
- Flutter
|
||||
- FlutterMacOS
|
||||
- sqflite (0.0.2):
|
||||
- sqflite (0.0.3):
|
||||
- Flutter
|
||||
- FMDB (>= 2.7.5)
|
||||
- SwiftyGif (5.4.4)
|
||||
- url_launcher_ios (0.0.1):
|
||||
- Flutter
|
||||
|
||||
DEPENDENCIES:
|
||||
- camera_avfoundation (from `.symlinks/plugins/camera_avfoundation/ios`)
|
||||
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_compass (from `.symlinks/plugins/flutter_compass/ios`)
|
||||
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
|
||||
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
|
||||
- google_maps_flutter_ios (from `.symlinks/plugins/google_maps_flutter_ios/ios`)
|
||||
- image_gallery_saver (from `.symlinks/plugins/image_gallery_saver/ios`)
|
||||
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
|
||||
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
|
||||
- path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`)
|
||||
- isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`)
|
||||
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
|
||||
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`)
|
||||
- pointer_interceptor_ios (from `.symlinks/plugins/pointer_interceptor_ios/ios`)
|
||||
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||
- sqflite (from `.symlinks/plugins/sqflite/ios`)
|
||||
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- DKImagePickerController
|
||||
- DKPhotoGallery
|
||||
- FMDB
|
||||
- GoogleMaps
|
||||
- ReachabilitySwift
|
||||
- SDWebImage
|
||||
- SwiftyGif
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
camera_avfoundation:
|
||||
:path: ".symlinks/plugins/camera_avfoundation/ios"
|
||||
connectivity_plus:
|
||||
:path: ".symlinks/plugins/connectivity_plus/ios"
|
||||
file_picker:
|
||||
:path: ".symlinks/plugins/file_picker/ios"
|
||||
device_info_plus:
|
||||
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||
Flutter:
|
||||
:path: Flutter
|
||||
flutter_compass:
|
||||
:path: ".symlinks/plugins/flutter_compass/ios"
|
||||
flutter_keyboard_visibility:
|
||||
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
|
||||
flutter_local_notifications:
|
||||
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||
geolocator_apple:
|
||||
:path: ".symlinks/plugins/geolocator_apple/ios"
|
||||
google_maps_flutter_ios:
|
||||
:path: ".symlinks/plugins/google_maps_flutter_ios/ios"
|
||||
image_gallery_saver:
|
||||
:path: ".symlinks/plugins/image_gallery_saver/ios"
|
||||
image_picker_ios:
|
||||
:path: ".symlinks/plugins/image_picker_ios/ios"
|
||||
move_to_background:
|
||||
:path: ".symlinks/plugins/move_to_background/ios"
|
||||
path_provider_ios:
|
||||
:path: ".symlinks/plugins/path_provider_ios/ios"
|
||||
isar_flutter_libs:
|
||||
:path: ".symlinks/plugins/isar_flutter_libs/ios"
|
||||
package_info_plus:
|
||||
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||
path_provider_foundation:
|
||||
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||
permission_handler_apple:
|
||||
:path: ".symlinks/plugins/permission_handler_apple/ios"
|
||||
share_plus:
|
||||
:path: ".symlinks/plugins/share_plus/ios"
|
||||
pointer_interceptor_ios:
|
||||
:path: ".symlinks/plugins/pointer_interceptor_ios/ios"
|
||||
shared_preferences_foundation:
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/ios"
|
||||
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||
sqflite:
|
||||
:path: ".symlinks/plugins/sqflite/ios"
|
||||
url_launcher_ios:
|
||||
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
camera_avfoundation: 07c77549ea54ad95d8581be86617c094a46280d9
|
||||
connectivity_plus: 413a8857dd5d9f1c399a39130850d02fe0feaf7e
|
||||
DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac
|
||||
DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179
|
||||
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
|
||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||
camera_avfoundation: 759172d1a77ae7be0de08fc104cfb79738b8a59e
|
||||
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
|
||||
device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_compass: cbbd285cea1584c7ac9c4e0c3e1f17cbea55e855
|
||||
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
|
||||
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
|
||||
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
|
||||
geolocator_apple: cc556e6844d508c95df1e87e3ea6fa4e58c50401
|
||||
google_maps_flutter_ios: 66201f392bf62d500f07670a30488a247b9bb5b9
|
||||
GoogleMaps: 008e2c80e38605b56b560e8deb73d4194ff30bef
|
||||
image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb
|
||||
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
|
||||
path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02
|
||||
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
||||
geolocator_apple: 9157311f654584b9bb72686c55fc02a97b73f461
|
||||
image_gallery_saver: cb43cc43141711190510e92c460eb1655cd343cb
|
||||
image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425
|
||||
isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073
|
||||
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
|
||||
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
|
||||
permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
|
||||
pointer_interceptor_ios: 9280618c0b2eeb80081a343924aa8ad756c21375
|
||||
ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
|
||||
SDWebImage: fd7e1a22f00303e058058278639bf6196ee431fe
|
||||
share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68
|
||||
shared_preferences_foundation: 986fc17f3d3251412d18b0265f9c64113a8c2472
|
||||
sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904
|
||||
SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f
|
||||
url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de
|
||||
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
|
||||
sqflite: 50a33e1d72bd59ee092a519a35d107502757ebed
|
||||
url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
|
||||
|
||||
PODFILE CHECKSUM: a1c2f8dde3796ecc1697a15e7c75eb5205d8a740
|
||||
PODFILE CHECKSUM: 7a34d5e980f9e05ecf4e24c79da64ca020615638
|
||||
|
||||
COCOAPODS: 1.12.0
|
||||
COCOAPODS: 1.15.2
|
||||
|
||||
@ -7,13 +7,13 @@
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
084EA8A81CF8B34528999293 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7C4F924DD034151EFC15038 /* Pods_Runner.framework */; };
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
EAFC0FFB27C8DC9071E67D5D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 853FC5087A11FEE54BE443C8 /* Pods_Runner.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
@ -30,14 +30,14 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
13E5CD9612AF4CC8B90A74C3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
37AC108B2188F1C5AA1C2C9E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
4310B59AA1289CC3AE4DBA82 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
853FC5087A11FEE54BE443C8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -45,8 +45,8 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
BEC4F75C6B655CA90D5B5E18 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
F1D3FD8F51C2EAF6C3A7EE25 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
D464128FC0D5DAEBC1011C26 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
D7C4F924DD034151EFC15038 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -54,7 +54,7 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
EAFC0FFB27C8DC9071E67D5D /* Pods_Runner.framework in Frameworks */,
|
||||
084EA8A81CF8B34528999293 /* Pods_Runner.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@ -64,9 +64,9 @@
|
||||
6C3C11D7BE49E5BED7989712 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
BEC4F75C6B655CA90D5B5E18 /* Pods-Runner.debug.xcconfig */,
|
||||
13E5CD9612AF4CC8B90A74C3 /* Pods-Runner.release.xcconfig */,
|
||||
F1D3FD8F51C2EAF6C3A7EE25 /* Pods-Runner.profile.xcconfig */,
|
||||
4310B59AA1289CC3AE4DBA82 /* Pods-Runner.debug.xcconfig */,
|
||||
37AC108B2188F1C5AA1C2C9E /* Pods-Runner.release.xcconfig */,
|
||||
D464128FC0D5DAEBC1011C26 /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
@ -89,7 +89,7 @@
|
||||
97C146F01CF9000F007C117D /* Runner */,
|
||||
97C146EF1CF9000F007C117D /* Products */,
|
||||
6C3C11D7BE49E5BED7989712 /* Pods */,
|
||||
E6F2437A5B5AAF08D2998197 /* Frameworks */,
|
||||
D3D7A1CBA3FB0154A6C84903 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@ -116,10 +116,10 @@
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
E6F2437A5B5AAF08D2998197 /* Frameworks */ = {
|
||||
D3D7A1CBA3FB0154A6C84903 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
853FC5087A11FEE54BE443C8 /* Pods_Runner.framework */,
|
||||
D7C4F924DD034151EFC15038 /* Pods_Runner.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
@ -131,15 +131,15 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||
buildPhases = (
|
||||
6B25D2836FC6A82461E36025 /* [CP] Check Pods Manifest.lock */,
|
||||
9ACF47601C5E8A391157E87A /* [CP] Check Pods Manifest.lock */,
|
||||
9740EEB61CF901F6004384FC /* Run Script */,
|
||||
97C146EA1CF9000F007C117D /* Sources */,
|
||||
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||
97C146EC1CF9000F007C117D /* Resources */,
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
ED4E40E6FE1C0A73CAC736F8 /* [CP] Embed Pods Frameworks */,
|
||||
FE7C2E909403F98AB3140FE6 /* [CP] Copy Pods Resources */,
|
||||
CD1CB185AC38B6B245F9A672 /* [CP] Embed Pods Frameworks */,
|
||||
4D62FB08D65E9D3D4D84B418 /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -156,7 +156,7 @@
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 1300;
|
||||
LastUpgradeCheck = 1510;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
97C146ED1CF9000F007C117D = {
|
||||
@ -214,7 +214,39 @@
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
6B25D2836FC6A82461E36025 /* [CP] Check Pods Manifest.lock */ = {
|
||||
4D62FB08D65E9D3D4D84B418 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||
};
|
||||
9ACF47601C5E8A391157E87A /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -236,22 +268,7 @@
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "Run Script";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||
};
|
||||
ED4E40E6FE1C0A73CAC736F8 /* [CP] Embed Pods Frameworks */ = {
|
||||
CD1CB185AC38B6B245F9A672 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@ -268,23 +285,6 @@
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
FE7C2E909403F98AB3140FE6 /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputFileListPaths = (
|
||||
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
@ -360,8 +360,9 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@ -375,16 +376,25 @@
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = D5SL68ATB9;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@ -438,7 +448,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@ -487,8 +497,9 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
@ -504,16 +515,25 @@
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = D5SL68ATB9;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@ -527,16 +547,25 @@
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
DEVELOPMENT_TEAM = D5SL68ATB9;
|
||||
CODE_SIGN_IDENTITY = "Apple Development";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CURRENT_PROJECT_VERSION = 453;
|
||||
DEVELOPMENT_TEAM = UMNEWT25JR;
|
||||
ENABLE_BITCODE = NO;
|
||||
FLUTTER_BUILD_NAME = 4.5.0;
|
||||
FLUTTER_BUILD_NUMBER = 453;
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "岐阜ナビ";
|
||||
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.healthcare-fitness";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 4.5.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dvox.gifunavi;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1300"
|
||||
LastUpgradeVersion = "1510"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import UIKit
|
||||
import Flutter
|
||||
import GoogleMaps
|
||||
|
||||
@UIApplicationMain
|
||||
@objc class AppDelegate: FlutterAppDelegate {
|
||||
@ -8,7 +7,6 @@ import GoogleMaps
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||
) -> Bool {
|
||||
GMSServices.provideAPIKey("AIzaSyAUBI1ablMKuJwGj2-kSuEhvYxvB1A-mOE")
|
||||
GeneratedPluginRegistrant.register(with: self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
@ -27,25 +27,25 @@
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>写真撮影のためカメラにアクセスします</string>
|
||||
<string>「岐阜ナビは旅のさまざまなチェックポイントで写真を撮影して共有するためにカメラへのアクセスが必要です。これにより、訪問を確認し、体験を向上させることができます。」</string>
|
||||
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
|
||||
<string>このアプリでは、位置情報の収集を行います。</string>
|
||||
<string>「岐阜ナビはアプリが閉じられているときでも位置情報へのアクセスが必要です。これにより、チェックポイントでの自動チェックインを提供し、旅の間のナビゲーション体験を向上させます。」</string>
|
||||
<key>NSLocationAlwaysUsageDescription</key>
|
||||
<string>このアプリでは、バックグラウンドで位置情報を収集します。</string>
|
||||
<string>「自動チェックインを有効にし、ナビゲーションを改善するために、岐阜ナビはアプリが使用されていないときでも継続的に位置情報へのアクセスを必要とします。」</string>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>このアプリでは、開始時点で位置情報を収集します。</string>
|
||||
<string>「岐阜ナビにアプリ使用中の位置情報へのアクセスを許可することで、チェックポイントでのチェックインを有効にし、位置に基づいた情報とガイダンスを提供します。」</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>プロフィールに動画を投稿してください。</string>
|
||||
<string>「岐阜ナビは、ナビゲーション体験を向上させるために、音声コマンドやオーディオフィードバックなどの機能にマイクへのアクセスが必要です。」</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>写真ライブラリへのアクセス警告</string>
|
||||
<string>「岐阜ナビはチェックポイントで撮影した写真を保存・管理し、他人と旅の様子を共有するために、写真ライブラリへのアクセスが必要です。」</string>
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>Need to save image in phone Album</string>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Main</string>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>ロゲイニングのゴールでは写真撮影が必要です。</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string> 収録音声の保存が必要です。</string>
|
||||
<string>「岐阜ナビはチェックポイントで撮影した写真を写真ライブラリに保存し、あなたの旅行の記録を保持し、友人と共有することができます。」</string>
|
||||
<key>UISupportedInterfaceOrientations</key>
|
||||
<array>
|
||||
<string>UIInterfaceOrientationPortrait</string>
|
||||
@ -65,5 +65,7 @@
|
||||
<true/>
|
||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||
<true/>
|
||||
<key>FLTEnableImpeller</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
12
ios/RunnerTests/RunnerTests.swift
Normal file
@ -0,0 +1,12 @@
|
||||
import Flutter
|
||||
import UIKit
|
||||
import XCTest
|
||||
|
||||
class RunnerTests: XCTestCase {
|
||||
|
||||
func testExample() {
|
||||
// If you add code to the Runner application, consider adding tests here.
|
||||
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,12 +0,0 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/common/state/game/game_controller.dart';
|
||||
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
|
||||
|
||||
class GameBinding extends Bindings{
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.lazyPut<AuthController>(() => AuthController());
|
||||
Get.put<GameController>(GameController());
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,25 +0,0 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/model/user.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
|
||||
|
||||
class GameController extends GetxController{
|
||||
|
||||
AuthController authController = Get.find<AuthController>();
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
ever(authController.authList, changeInAuth);
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
void changeInAuth(List<AuthResponse> change){
|
||||
if(change.isNotEmpty){
|
||||
Get.toNamed(AppPages.S_HOME);
|
||||
}
|
||||
else{
|
||||
Get.toNamed(AppPages.S_LOGIN);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,16 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rogapp/theme/theme.dart';
|
||||
|
||||
class UIs{
|
||||
static AppBar appBar(){
|
||||
return AppBar(
|
||||
title: const Icon(
|
||||
Icons.access_alarm,
|
||||
size:30,
|
||||
color: Pallete.WHITE_COLOR,
|
||||
),
|
||||
automaticallyImplyLeading:false,
|
||||
centerTitle: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,5 @@
|
||||
// ignore: non_constant_identifier_names
|
||||
// 不要
|
||||
String location_line_date = """
|
||||
{
|
||||
"type": "FeatureCollection",
|
||||
|
||||
262
lib/main.dart
@ -1,24 +1,56 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'dart:async';
|
||||
//import 'dart:convert';
|
||||
//import 'dart:developer';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/common/state/game/game_binding.dart';
|
||||
//import 'package:vm_service/vm_service.dart';
|
||||
//import 'package:dart_vm_info/dart_vm_info.dart';
|
||||
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_binding.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/theme/theme.dart';
|
||||
import 'package:rogapp/utils/location_controller.dart';
|
||||
import 'package:rogapp/utils/string_values.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:path/path.dart' as p;
|
||||
// import 'package:is_lock_screen/is_lock_screen.dart';
|
||||
|
||||
import 'package:rogapp/services/device_info_service.dart';
|
||||
import 'package:rogapp/services/error_service.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
//import 'dart:async';
|
||||
//import 'package:get/get.dart';
|
||||
|
||||
Map<String, dynamic> deviceInfo = {};
|
||||
|
||||
void saveGameState() async {
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
SharedPreferences pref = await SharedPreferences.getInstance();
|
||||
pref.setBool("is_in_rog", destinationController.isInRog.value);
|
||||
pref.setBool(
|
||||
"rogaining_counted", destinationController.rogainingCounted.value);
|
||||
pref.setBool("ready_for_goal", DestinationController.ready_for_goal);
|
||||
}
|
||||
|
||||
void restoreGame() async {
|
||||
SharedPreferences pref = await SharedPreferences.getInstance();
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isInRog.value = pref.getBool("is_in_rog") ?? false;
|
||||
destinationController.rogainingCounted.value =
|
||||
pref.getBool("rogaining_counted") ?? false;
|
||||
DestinationController.ready_for_goal =
|
||||
pref.getBool("ready_for_goal") ?? false;
|
||||
//print(
|
||||
// "--restored -- destinationController.isInRog.value ${pref.getBool("is_in_rog")} -- ${pref.getBool("rogaining_counted")}");
|
||||
}
|
||||
|
||||
void main() async {
|
||||
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await FlutterMapTileCaching.initialise();
|
||||
|
||||
FlutterMapTileCaching.initialise(await RootDirectory.normalCache);
|
||||
final StoreDirectory instanceA = FMTC.instance('OpenStreetMap (A)');
|
||||
await instanceA.manage.createAsync();
|
||||
await instanceA.metadata.addAsync(
|
||||
@ -34,12 +66,160 @@ void main() async {
|
||||
value: 'cacheFirst',
|
||||
);
|
||||
|
||||
runApp(MyApp());
|
||||
deviceInfo = await DeviceInfoService.getDeviceInfo();
|
||||
|
||||
FlutterError.onError = (FlutterErrorDetails details) {
|
||||
FlutterError.presentError(details);
|
||||
Get.log('Flutter error: ${details.exception}');
|
||||
Get.log('Stack trace: ${details.stack}');
|
||||
ErrorService.reportError(details.exception, details.stack ?? StackTrace.current, deviceInfo);
|
||||
};
|
||||
|
||||
//Get.put(LocationController());
|
||||
|
||||
// startMemoryMonitoring(); // 2024-4-8 Akira: メモリ使用量のチェックを開始 See #2810
|
||||
|
||||
runZonedGuarded(() {
|
||||
runApp(const ProviderScope(child: MyApp()));
|
||||
}, (error, stackTrace) {
|
||||
ErrorService.reportError(error, stackTrace, deviceInfo);
|
||||
});
|
||||
|
||||
//runApp(const MyApp());
|
||||
}
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
// メモリ使用量の解説:https://qiita.com/hukusuke1007/items/e4e987836412e9bc73b9
|
||||
|
||||
/*
|
||||
// 2024-4-8 Akira: メモリ使用量のチェックのため追加 See #2810
|
||||
// startMemoryMonitoring関数が5分ごとに呼び出され、メモリ使用量をチェックします。
|
||||
// メモリ使用量が閾値(ここでは500MB)を超えた場合、エラーメッセージとスタックトレースをレポートします。
|
||||
//
|
||||
void startMemoryMonitoring() {
|
||||
const threshold = 500 * 1024 * 1024; // 500MB
|
||||
|
||||
// メモリ使用量情報を取得
|
||||
final memoryUsage = MemoryUsage.fromJson(DartVMInfo.getAllocationProfile());
|
||||
|
||||
if (memoryUsage.heapUsage > threshold) {
|
||||
final now = DateTime.now().toIso8601String();
|
||||
final message = 'High memory usage detected at $now: ${memoryUsage.heapUsage} bytes';
|
||||
print(message);
|
||||
reportError(message, StackTrace.current);
|
||||
showMemoryWarningDialog();
|
||||
}
|
||||
|
||||
Timer(const Duration(minutes: 5), startMemoryMonitoring);
|
||||
}
|
||||
|
||||
class MemoryUsage {
|
||||
final int heapUsage;
|
||||
|
||||
MemoryUsage({required this.heapUsage});
|
||||
|
||||
factory MemoryUsage.fromJson(Map<String, dynamic> json) {
|
||||
return MemoryUsage(
|
||||
heapUsage: json['heapUsage'] as int,
|
||||
);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
// 2024-4-8 Akira: メモリ使用量のチェックのため追加 See #2810
|
||||
// reportError関数でエラーレポートを送信します。具体的な実装は、利用するエラー報告サービスによって異なります。
|
||||
void reportError(String message, StackTrace stackTrace) async {
|
||||
// エラーレポートの送信処理を実装
|
||||
// 例: SentryやFirebase Crashlyticsなどのエラー報告サービスを利用
|
||||
print("ReportError : ${message} . stacktrace : ${stackTrace}");
|
||||
}
|
||||
|
||||
// 2024-4-8 Akira: メモリ使用量のチェックのため追加 See #2810
|
||||
// showMemoryWarningDialog関数で、メモリ使用量が高い場合にユーザーに警告ダイアログを表示します。
|
||||
//
|
||||
void showMemoryWarningDialog() {
|
||||
if (Get.context != null) {
|
||||
showDialog(
|
||||
context: Get.context!,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('メモリ使用量の警告'),
|
||||
content: const Text('アプリのメモリ使用量が高くなっています。アプリを再起動することをお勧めします。'),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.of(context).pop(),
|
||||
child: const Text('OK'),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class MyApp extends StatefulWidget {
|
||||
const MyApp({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<MyApp> createState() => _MyAppState();
|
||||
}
|
||||
|
||||
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
|
||||
// This widget is the root of your application.
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (context.mounted) {
|
||||
restoreGame();
|
||||
}
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
// void saveGameState() async {
|
||||
// DestinationController destinationController = Get.find<DestinationController>();
|
||||
// SharedPreferences pref = await SharedPreferences.getInstance();
|
||||
// pref.setBool("is_in_rog", destinationController.is_in_rog.value);
|
||||
// pref.setBool("rogaining_counted", destinationController.rogaining_counted.value);
|
||||
// }
|
||||
|
||||
@override
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
LocationController locationController = Get.find<LocationController>();
|
||||
|
||||
//DestinationController destinationController =
|
||||
// Get.find<DestinationController>();
|
||||
switch (state) {
|
||||
case AppLifecycleState.resumed:
|
||||
locationController.resumePositionStream();
|
||||
//print("RESUMED");
|
||||
restoreGame();
|
||||
break;
|
||||
case AppLifecycleState.inactive:
|
||||
locationController.resumePositionStream();
|
||||
//print("INACTIVE");
|
||||
break;
|
||||
case AppLifecycleState.paused:
|
||||
locationController.resumePositionStream();
|
||||
//print("PAUSED");
|
||||
saveGameState();
|
||||
break;
|
||||
case AppLifecycleState.detached:
|
||||
locationController.resumePositionStream();
|
||||
//print("DETACHED");
|
||||
saveGameState();
|
||||
break;
|
||||
case AppLifecycleState.hidden:
|
||||
locationController.resumePositionStream();
|
||||
//print("DETACHED");
|
||||
saveGameState();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GetMaterialApp(
|
||||
@ -48,64 +228,20 @@ class MyApp extends StatelessWidget {
|
||||
//locale: const Locale('en', 'US'),
|
||||
fallbackLocale: const Locale('en', 'US'),
|
||||
title: 'ROGAINING',
|
||||
theme: AppTheme.theme,
|
||||
theme: ThemeData(
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: const Color.fromARGB(255, 36, 135, 221)),
|
||||
useMaterial3: true,
|
||||
),
|
||||
debugShowCheckedModeBanner: false,
|
||||
defaultTransition: Transition.cupertino,
|
||||
opaqueRoute: Get.isOpaqueRouteDefault,
|
||||
popGesture: Get.isPopGestureEnable,
|
||||
transitionDuration: const Duration(milliseconds: 230),
|
||||
initialBinding: GameBinding(),
|
||||
initialRoute: AppPages.S_LOGIN,
|
||||
initialBinding: IndexBinding(), //HomeBinding(),
|
||||
initialRoute: AppPages.PERMISSION,
|
||||
getPages: AppPages.routes,
|
||||
enableLog: true,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// class MyApp extends StatelessWidget {
|
||||
// MyApp({Key? key}) : super(key: key);
|
||||
|
||||
// // This widget is the root of your application.
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return MaterialApp(
|
||||
// title: 'Flutter Demo',
|
||||
// theme: ThemeData(
|
||||
// primaryColor: Color(0xfff00B074),
|
||||
// textTheme: const TextTheme(
|
||||
// bodyText1: TextStyle(
|
||||
// fontSize: 18.0,
|
||||
// fontFamily: 'Barlow-Medium',
|
||||
// color: Color(0xff464255)),
|
||||
// ),
|
||||
// ),
|
||||
// home: PermissionHandlerScreen(),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
|
||||
// class SplashScreen extends StatelessWidget {
|
||||
// const SplashScreen({Key? key}) : super(key: key);
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return WillPopScope(
|
||||
// onWillPop: () async {
|
||||
// SystemNavigator.pop();
|
||||
// return true;
|
||||
// },
|
||||
// child: Scaffold(
|
||||
// body: Center(
|
||||
// child: Text(
|
||||
// "Splash Screen",
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
|
||||
61
lib/main_nrog.dart
Normal file
@ -0,0 +1,61 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:rogapp/nrog/pages/permission_page.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
await FlutterMapTileCaching.initialise();
|
||||
final StoreDirectory instanceA = FMTC.instance('OpenStreetMap (A)');
|
||||
await instanceA.manage.createAsync();
|
||||
await instanceA.metadata.addAsync(
|
||||
key: 'sourceURL',
|
||||
value: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',
|
||||
);
|
||||
await instanceA.metadata.addAsync(
|
||||
key: 'validDuration',
|
||||
value: '14',
|
||||
);
|
||||
await instanceA.metadata.addAsync(
|
||||
key: 'behaviour',
|
||||
value: 'cacheFirst',
|
||||
);
|
||||
runApp(
|
||||
const ProviderScope(child: MyApp()),
|
||||
);
|
||||
}
|
||||
|
||||
class MyApp extends StatefulWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
@override
|
||||
State<MyApp> createState() => _MyAppState();
|
||||
}
|
||||
|
||||
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addObserver(this);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance.removeObserver(this);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
debugShowCheckedModeBanner: false,
|
||||
title: 'Flutter Demo',
|
||||
theme: ThemeData(
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: const Color.fromARGB(255, 124, 156, 9)),
|
||||
useMaterial3: true,
|
||||
),
|
||||
home: const PermissionPage());
|
||||
}
|
||||
}
|
||||
27
lib/model/auth_user.dart
Normal file
@ -0,0 +1,27 @@
|
||||
// プロパティの型がString?やint?などのオプショナル型になっています。
|
||||
// これらのプロパティが常に値を持つことが保証されている場合は、非オプショナル型を使用することで、不要なnullチェックを回避できます。
|
||||
//
|
||||
class AuthUser {
|
||||
AuthUser();
|
||||
|
||||
//AuthUser.from({required this.id, required this.email, required this.is_rogaining, required this.group, required this.zekken_number, required this.event_code, required this.team_name});
|
||||
|
||||
AuthUser.fromMap(Map<String, dynamic> map)
|
||||
: id = int.parse(map["id"].toString()),
|
||||
email = map["email"].toString(),
|
||||
is_rogaining = bool.parse(map["is_rogaining"].toString()),
|
||||
group = map["group"].toString(),
|
||||
zekken_number = map["zekken_number"].toString(),
|
||||
event_code = map["event_code"].toString(),
|
||||
team_name = map["team_name"].toString(),
|
||||
auth_token = map["token"];
|
||||
|
||||
int? id;
|
||||
String? email;
|
||||
bool? is_rogaining;
|
||||
String? group;
|
||||
String? zekken_number;
|
||||
String? event_code;
|
||||
String? team_name;
|
||||
String? auth_token;
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
|
||||
|
||||
// プロパティの型がString?やint?などのオプショナル型になっています。
|
||||
// これらのプロパティが常に値を持つことが保証されている場合は、非オプショナル型を使用することで、不要なnullチェックを回避できます。
|
||||
//
|
||||
class Destination {
|
||||
String? name;
|
||||
String? address;
|
||||
@ -23,9 +24,16 @@ class Destination {
|
||||
double? checkin_point;
|
||||
double? buy_point;
|
||||
int? hidden_location;
|
||||
String? checkin_image;
|
||||
String? buypoint_image;
|
||||
bool forced_checkin = false;
|
||||
int recipt_times = 0;
|
||||
String? tags;
|
||||
|
||||
Destination({
|
||||
this.name,
|
||||
bool use_qr_code = false; // QR code を使用するかどうか。default=false
|
||||
|
||||
Destination(
|
||||
{this.name,
|
||||
this.address,
|
||||
this.phone,
|
||||
this.email,
|
||||
@ -46,13 +54,20 @@ class Destination {
|
||||
this.cp,
|
||||
this.checkin_point,
|
||||
this.buy_point,
|
||||
this.hidden_location
|
||||
});
|
||||
this.hidden_location,
|
||||
this.checkin_image,
|
||||
this.buypoint_image,
|
||||
this.forced_checkin = false,
|
||||
this.recipt_times = 0,
|
||||
this.tags,
|
||||
this.use_qr_code = false});
|
||||
|
||||
factory Destination.fromMap(Map<String, dynamic> json) {
|
||||
|
||||
bool selec = json['selected'] == 0 ? false : true;
|
||||
bool checkin = json['checkedin'] == 0 ? false : true;
|
||||
bool forcedCheckin = json['forced_checkin'] == 0 ? false : true;
|
||||
bool useQrCode = json['use_qr_code'] == 1 ? true : false;
|
||||
//print("-----tags model----- ${json}");
|
||||
|
||||
return Destination(
|
||||
name: json['name'],
|
||||
@ -65,49 +80,59 @@ class Destination {
|
||||
series: json['series'],
|
||||
lat: json['lat'],
|
||||
lon: json['lon'],
|
||||
sub_loc_id : json['sub_loc_id'],
|
||||
sub_loc_id: json['sub_loc_id'],
|
||||
location_id: json['location_id'],
|
||||
list_order: json['list_order'],
|
||||
photos: json['photos'],
|
||||
checkin_radious: json['checkin_radious'],
|
||||
auto_checkin:json['auto_checkin'],
|
||||
auto_checkin: json['auto_checkin'],
|
||||
selected: selec,
|
||||
checkedin: checkin,
|
||||
cp: json['cp'],
|
||||
checkin_point: json['checkin_point'],
|
||||
buy_point: json['buy_point'],
|
||||
hidden_location: json['hidden_location']
|
||||
);
|
||||
hidden_location: json['hidden_location'],
|
||||
checkin_image: json['checkin_image'],
|
||||
buypoint_image: json["buypoint_image"],
|
||||
forced_checkin: forcedCheckin,
|
||||
recipt_times: json["recipt_times"],
|
||||
tags: json["tags"],
|
||||
use_qr_code: useQrCode);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap(){
|
||||
Map<String, dynamic> toMap() {
|
||||
int sel = selected == false ? 0 : 1;
|
||||
int check = checkedin == false ? 0 : 1;
|
||||
int forcedCheckin = forced_checkin == false ? 0 : 1;
|
||||
return {
|
||||
'name':name,
|
||||
'name': name,
|
||||
'address': address,
|
||||
'phone': phone,
|
||||
'email': email,
|
||||
'webcontents': webcontents,
|
||||
'videos': videos,
|
||||
'category':category,
|
||||
'series':series,
|
||||
'lat':lat,
|
||||
'lon':lon,
|
||||
'category': category,
|
||||
'series': series,
|
||||
'lat': lat,
|
||||
'lon': lon,
|
||||
'sub_loc_id': sub_loc_id,
|
||||
'location_id':location_id,
|
||||
'list_order':list_order,
|
||||
'photos':photos,
|
||||
'location_id': location_id,
|
||||
'list_order': list_order,
|
||||
'photos': photos,
|
||||
'checkin_radious': checkin_radious,
|
||||
'auto_checkin': auto_checkin,
|
||||
'selected': sel,
|
||||
'checkedin': check,
|
||||
'cp' : cp,
|
||||
'checkin_point' : checkin_point,
|
||||
'buy_point' : buy_point,
|
||||
'hidden_location' : hidden_location
|
||||
'cp': cp,
|
||||
'checkin_point': checkin_point,
|
||||
'buy_point': buy_point,
|
||||
'hidden_location': hidden_location,
|
||||
'checkin_image': checkin_image,
|
||||
'buypoint_image': buypoint_image,
|
||||
'forced_checkin': forcedCheckin,
|
||||
'recipt_times': recipt_times,
|
||||
'tags': tags,
|
||||
'use_qr_code': use_qr_code
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
8
lib/model/game_state_instance.dart
Normal file
@ -0,0 +1,8 @@
|
||||
enum LocationState { noGps, notInCheckin, withinCheckin }
|
||||
|
||||
enum GameState { notStarted, startedNotCounted, startedCounted, nodeGoal }
|
||||
|
||||
class GameInsStatetance {
|
||||
LocationState locationState = LocationState.noGps;
|
||||
GameState gameState = GameState.notStarted;
|
||||
}
|
||||
47
lib/model/gps_data.dart
Normal file
@ -0,0 +1,47 @@
|
||||
class GpsData {
|
||||
int id;
|
||||
String team_name;
|
||||
String event_code;
|
||||
double lat;
|
||||
double lon;
|
||||
int is_checkin;
|
||||
int created_at;
|
||||
int is_synced;
|
||||
|
||||
GpsData({
|
||||
required this.id,
|
||||
required this.team_name,
|
||||
required this.event_code,
|
||||
required this.lat,
|
||||
required this.lon,
|
||||
required this.created_at,
|
||||
this.is_checkin = 0,
|
||||
this.is_synced = 0,
|
||||
});
|
||||
|
||||
factory GpsData.fromMap(Map<String, dynamic> json) {
|
||||
return GpsData(
|
||||
id: json["id"],
|
||||
team_name: json["team_name"],
|
||||
event_code: json["event_code"],
|
||||
lat: json["lat"],
|
||||
lon: json["lon"],
|
||||
is_checkin: json["is_checkin"],
|
||||
created_at: json["created_at"],
|
||||
is_synced: json["is_synced"] ?? 0,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'id': id,
|
||||
'team_name': team_name,
|
||||
'event_code': event_code,
|
||||
'lat': lat,
|
||||
'lon': lon,
|
||||
'is_checkin': is_checkin,
|
||||
'created_at': created_at,
|
||||
'is_synced': is_synced,
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -1,591 +0,0 @@
|
||||
// ignore_for_file: public_member_api_docs, sort_constructors_first
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:unicode/unicode.dart';
|
||||
|
||||
class LocationResponse {
|
||||
List<Feature>? features;
|
||||
String? type;
|
||||
|
||||
LocationResponse({
|
||||
this.features,
|
||||
this.type,
|
||||
});
|
||||
|
||||
LocationResponse copyWith({
|
||||
List<Feature>? features,
|
||||
String? type,
|
||||
}) {
|
||||
return LocationResponse(
|
||||
features: features ?? this.features,
|
||||
type: type ?? this.type,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'features': features?.map((x) => x.toMap()).toList(),
|
||||
'type': type,
|
||||
};
|
||||
}
|
||||
|
||||
factory LocationResponse.fromMap(Map<String, dynamic> map) {
|
||||
return LocationResponse(
|
||||
features: List<Feature>.from(map['features']?.map((x) => Feature.fromMap(x)) ?? const []),
|
||||
type: map['type'],
|
||||
);
|
||||
}
|
||||
|
||||
String toJson() => json.encode(toMap());
|
||||
|
||||
factory LocationResponse.fromJson(String source) =>
|
||||
LocationResponse.fromMap(json.decode(source));
|
||||
|
||||
@override
|
||||
String toString() => 'LocationResponse(features: $features, type: $type)';
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other is LocationResponse &&
|
||||
listEquals(other.features, features) &&
|
||||
other.type == type;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => features.hashCode ^ type.hashCode;
|
||||
}
|
||||
|
||||
class Feature {
|
||||
Geometry? geometry;
|
||||
int? id;
|
||||
Properties? properties;
|
||||
String? type;
|
||||
int? location_id;
|
||||
double? latitude;
|
||||
double? longitude;
|
||||
|
||||
Feature({
|
||||
this.geometry,
|
||||
this.id,
|
||||
this.properties,
|
||||
this.type,
|
||||
this.location_id,
|
||||
this.latitude,
|
||||
this.longitude
|
||||
});
|
||||
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return <String, dynamic>{
|
||||
'id': id,
|
||||
'geometry': geometry?.toJson(),
|
||||
'properties': properties?.toJson(),
|
||||
'type': type,
|
||||
// Use the first coordinate as latitude and longitude.
|
||||
// You may need to adjust this based on your actual data structure.
|
||||
'location_id': properties?.location_id,
|
||||
'latitude': geometry?.coordinates?.first?.last,
|
||||
'longitude': geometry?.coordinates?.first?.first,
|
||||
};
|
||||
}
|
||||
|
||||
// factory Feature.fromMap(Map<String, dynamic> map) {
|
||||
// return Feature(
|
||||
// geometry: Geometry.fromMap(map['geometry']),
|
||||
// id: map['id'],
|
||||
// properties: Properties.fromMap(map['properties']),
|
||||
// type: map['type'],
|
||||
// );
|
||||
// }
|
||||
|
||||
factory Feature.fromMap(Map<String, dynamic> map) {
|
||||
Geometry? geometry = map['geometry'] != null
|
||||
? Geometry.fromMap(map['geometry'])
|
||||
: null;
|
||||
double? latitude = geometry?.coordinates?.isNotEmpty ?? false ? geometry!.coordinates![0][0] : null;
|
||||
double? longitude = geometry?.coordinates?.isNotEmpty ?? false ? geometry!.coordinates![0][1] : null;
|
||||
|
||||
return Feature(
|
||||
id: map['id'] as int?,
|
||||
geometry: Geometry.fromMap(map['geometry']),
|
||||
properties: Properties.fromMap(map['properties']),
|
||||
type: map['type'],
|
||||
location_id: Properties.fromMap(map['properties']).location_id,
|
||||
latitude: latitude,
|
||||
longitude: longitude,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
String toJson() => json.encode(toMap());
|
||||
|
||||
factory Feature.fromJson(String source) =>
|
||||
Feature.fromMap(json.decode(source));
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'Feature(geometry: $geometry, id: $id, properties: $properties, type: $type)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return other is Feature &&
|
||||
other.geometry == geometry &&
|
||||
other.id == id &&
|
||||
other.properties == properties &&
|
||||
other.type == type;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
return geometry.hashCode ^ id.hashCode ^ properties.hashCode ^ type.hashCode;
|
||||
}
|
||||
}
|
||||
|
||||
class Geometry {
|
||||
List<List<double>>? coordinates;
|
||||
String? type;
|
||||
|
||||
Geometry({
|
||||
this.coordinates,
|
||||
this.type,
|
||||
});
|
||||
|
||||
Geometry copyWith({
|
||||
List<List<double>>? coordinates,
|
||||
String? type,
|
||||
}) {
|
||||
return Geometry(
|
||||
coordinates: coordinates ?? this.coordinates,
|
||||
type: type ?? this.type,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
'coordinates': coordinates,
|
||||
'type': type,
|
||||
};
|
||||
}
|
||||
|
||||
factory Geometry.fromMap(Map<String, dynamic> map) {
|
||||
return Geometry(
|
||||
coordinates: map['coordinates'] != null
|
||||
? List<List<double>>.from(
|
||||
map['coordinates'].map((x) => List<double>.from(x.map((x) => x.toDouble()))))
|
||||
: null,
|
||||
type: map['type'],
|
||||
);
|
||||
}
|
||||
|
||||
String toJson() => json.encode(toMap());
|
||||
|
||||
factory Geometry.fromJson(String source) =>
|
||||
Geometry.fromMap(json.decode(source) as Map<String, dynamic>);
|
||||
|
||||
@override
|
||||
String toString() => 'Geometry(coordinates: $coordinates, type: $type)';
|
||||
|
||||
@override
|
||||
bool operator ==(covariant Geometry other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return listEquals(other.coordinates, coordinates) && other.type == type;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode => coordinates.hashCode ^ type.hashCode;
|
||||
}
|
||||
|
||||
class Properties {
|
||||
final int location_id;
|
||||
final String? sub_loc_id;
|
||||
final double? cp;
|
||||
final String? location_name;
|
||||
final String? category;
|
||||
final String? subcategory;
|
||||
final String? zip;
|
||||
final String? address;
|
||||
final String? prefecture;
|
||||
final String? area;
|
||||
final String? city;
|
||||
final double? latitude;
|
||||
final double? longitude;
|
||||
final String? photos;
|
||||
final String? videos;
|
||||
final String? webcontents;
|
||||
final String? status;
|
||||
final String? portal;
|
||||
final String? group;
|
||||
final String? phone;
|
||||
final String? fax;
|
||||
final String? email;
|
||||
final String? facility;
|
||||
final String? remark;
|
||||
final String? tags;
|
||||
final dynamic? event_name;
|
||||
final bool? event_active;
|
||||
final bool? hidden_location;
|
||||
final bool? auto_checkin;
|
||||
final double? checkin_radius;
|
||||
final double? checkin_point;
|
||||
final double? buy_point;
|
||||
final String? evaluation_value;
|
||||
final bool? shop_closed;
|
||||
final bool? shop_shutdown;
|
||||
final String? opening_hours_mon;
|
||||
final String? opening_hours_tue;
|
||||
final String? opening_hours_wed;
|
||||
final String? opening_hours_thu;
|
||||
final String? opening_hours_fri;
|
||||
final String? opening_hours_sat;
|
||||
final String? opening_hours_sun;
|
||||
final String? parammeters;
|
||||
Properties({
|
||||
required this.location_id,
|
||||
this.sub_loc_id,
|
||||
this.cp,
|
||||
this.location_name,
|
||||
this.category,
|
||||
this.subcategory,
|
||||
this.zip,
|
||||
this.address,
|
||||
this.prefecture,
|
||||
this.area,
|
||||
this.city,
|
||||
this.latitude,
|
||||
this.longitude,
|
||||
this.photos,
|
||||
this.videos,
|
||||
this.webcontents,
|
||||
this.status,
|
||||
this.portal,
|
||||
this.group,
|
||||
this.phone,
|
||||
this.fax,
|
||||
this.email,
|
||||
this.facility,
|
||||
this.remark,
|
||||
this.tags,
|
||||
this.event_name,
|
||||
this.event_active,
|
||||
this.hidden_location,
|
||||
this.auto_checkin,
|
||||
this.checkin_radius,
|
||||
this.checkin_point,
|
||||
this.buy_point,
|
||||
this.evaluation_value,
|
||||
this.shop_closed,
|
||||
this.shop_shutdown,
|
||||
this.opening_hours_mon,
|
||||
this.opening_hours_tue,
|
||||
this.opening_hours_wed,
|
||||
this.opening_hours_thu,
|
||||
this.opening_hours_fri,
|
||||
this.opening_hours_sat,
|
||||
this.opening_hours_sun,
|
||||
this.parammeters,
|
||||
});
|
||||
|
||||
|
||||
String toJson() => json.encode(toMap());
|
||||
|
||||
Properties copyWith({
|
||||
int? location_id,
|
||||
String? sub_loc_id,
|
||||
double? cp,
|
||||
String? location_name,
|
||||
String? category,
|
||||
String? subcategory,
|
||||
String? zip,
|
||||
String? address,
|
||||
String? prefecture,
|
||||
String? area,
|
||||
String? city,
|
||||
double? latitude,
|
||||
double? longitude,
|
||||
String? photos,
|
||||
String? videos,
|
||||
String? webcontents,
|
||||
String? status,
|
||||
String? portal,
|
||||
String? group,
|
||||
String? phone,
|
||||
String? fax,
|
||||
String? email,
|
||||
String? facility,
|
||||
String? remark,
|
||||
String? tags,
|
||||
dynamic? event_name,
|
||||
bool? event_active,
|
||||
bool? hidden_location,
|
||||
bool? auto_checkin,
|
||||
double? checkin_radius,
|
||||
double? checkin_point,
|
||||
double? buy_point,
|
||||
String? evaluation_value,
|
||||
bool? shop_closed,
|
||||
bool? shop_shutdown,
|
||||
String? opening_hours_mon,
|
||||
String? opening_hours_tue,
|
||||
String? opening_hours_wed,
|
||||
String? opening_hours_thu,
|
||||
String? opening_hours_fri,
|
||||
String? opening_hours_sat,
|
||||
String? opening_hours_sun,
|
||||
String? parammeters,
|
||||
}) {
|
||||
return Properties(
|
||||
location_id: location_id ?? this.location_id,
|
||||
sub_loc_id: sub_loc_id ?? this.sub_loc_id,
|
||||
cp: cp ?? this.cp,
|
||||
location_name: location_name ?? this.location_name,
|
||||
category: category ?? this.category,
|
||||
subcategory: subcategory ?? this.subcategory,
|
||||
zip: zip ?? this.zip,
|
||||
address: address ?? this.address,
|
||||
prefecture: prefecture ?? this.prefecture,
|
||||
area: area ?? this.area,
|
||||
city: city ?? this.city,
|
||||
latitude: latitude ?? this.latitude,
|
||||
longitude: longitude ?? this.longitude,
|
||||
photos: photos ?? this.photos,
|
||||
videos: videos ?? this.videos,
|
||||
webcontents: webcontents ?? this.webcontents,
|
||||
status: status ?? this.status,
|
||||
portal: portal ?? this.portal,
|
||||
group: group ?? this.group,
|
||||
phone: phone ?? this.phone,
|
||||
fax: fax ?? this.fax,
|
||||
email: email ?? this.email,
|
||||
facility: facility ?? this.facility,
|
||||
remark: remark ?? this.remark,
|
||||
tags: tags ?? this.tags,
|
||||
event_name: event_name ?? this.event_name,
|
||||
event_active: event_active ?? this.event_active,
|
||||
hidden_location: hidden_location ?? this.hidden_location,
|
||||
auto_checkin: auto_checkin ?? this.auto_checkin,
|
||||
checkin_radius: checkin_radius ?? this.checkin_radius,
|
||||
checkin_point: checkin_point ?? this.checkin_point,
|
||||
buy_point: buy_point ?? this.buy_point,
|
||||
evaluation_value: evaluation_value ?? this.evaluation_value,
|
||||
shop_closed: shop_closed ?? this.shop_closed,
|
||||
shop_shutdown: shop_shutdown ?? this.shop_shutdown,
|
||||
opening_hours_mon: opening_hours_mon ?? this.opening_hours_mon,
|
||||
opening_hours_tue: opening_hours_tue ?? this.opening_hours_tue,
|
||||
opening_hours_wed: opening_hours_wed ?? this.opening_hours_wed,
|
||||
opening_hours_thu: opening_hours_thu ?? this.opening_hours_thu,
|
||||
opening_hours_fri: opening_hours_fri ?? this.opening_hours_fri,
|
||||
opening_hours_sat: opening_hours_sat ?? this.opening_hours_sat,
|
||||
opening_hours_sun: opening_hours_sun ?? this.opening_hours_sun,
|
||||
parammeters: parammeters ?? this.parammeters,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return <String, dynamic>{
|
||||
'location_id': location_id,
|
||||
'sub_loc_id': sub_loc_id,
|
||||
'cp': cp,
|
||||
'location_name': location_name,
|
||||
'category': category,
|
||||
'subcategory': subcategory,
|
||||
'zip': zip,
|
||||
'address': address,
|
||||
'prefecture': prefecture,
|
||||
'area': area,
|
||||
'city': city,
|
||||
'latitude': latitude,
|
||||
'longitude': longitude,
|
||||
'photos': photos,
|
||||
'videos': videos,
|
||||
'webcontents': webcontents,
|
||||
'status': status,
|
||||
'portal': portal,
|
||||
'group': group,
|
||||
'phone': phone,
|
||||
'fax': fax,
|
||||
'email': email,
|
||||
'facility': facility,
|
||||
'remark': remark,
|
||||
'tags': tags,
|
||||
'event_name': event_name,
|
||||
'event_active': event_active,
|
||||
'hidden_location': hidden_location,
|
||||
'auto_checkin': auto_checkin,
|
||||
'checkin_radius': checkin_radius,
|
||||
'checkin_point': checkin_point,
|
||||
'buy_point': buy_point,
|
||||
'evaluation_value': evaluation_value,
|
||||
'shop_closed': shop_closed,
|
||||
'shop_shutdown': shop_shutdown,
|
||||
'opening_hours_mon': opening_hours_mon,
|
||||
'opening_hours_tue': opening_hours_tue,
|
||||
'opening_hours_wed': opening_hours_wed,
|
||||
'opening_hours_thu': opening_hours_thu,
|
||||
'opening_hours_fri': opening_hours_fri,
|
||||
'opening_hours_sat': opening_hours_sat,
|
||||
'opening_hours_sun': opening_hours_sun,
|
||||
'parammeters': parammeters,
|
||||
};
|
||||
}
|
||||
|
||||
factory Properties.fromMap(Map<String, dynamic> map) {
|
||||
return Properties(
|
||||
location_id: map['location_id'] as int,
|
||||
sub_loc_id: map['sub_loc_id'] != null ? map['sub_loc_id'] as String : null,
|
||||
cp: map['cp'] != null ? map['cp'] as double : null,
|
||||
location_name: map['location_name'] != null ? map['location_name'] as String : null,
|
||||
category: map['category'] != null ? map['category'] as String : null,
|
||||
subcategory: map['subcategory'] != null ? map['subcategory'] as String : null,
|
||||
zip: map['zip'] != null ? map['zip'] as String : null,
|
||||
address: map['address'] != null ? map['address'] as String : null,
|
||||
prefecture: map['prefecture'] != null ? map['prefecture'] as String : null,
|
||||
area: map['area'] != null ? map['area'] as String : null,
|
||||
city: map['city'] != null ? map['city'] as String : null,
|
||||
latitude: map['latitude'] != null ? map['latitude'] as double : null,
|
||||
longitude: map['longitude'] != null ? map['longitude'] as double : null,
|
||||
photos: map['photos'] != null ? map['photos'] as String : null,
|
||||
videos: map['videos'] != null ? map['videos'] as String : null,
|
||||
webcontents: map['webcontents'] != null ? map['webcontents'] as String : null,
|
||||
status: map['status'] != null ? map['status'] as String : null,
|
||||
portal: map['portal'] != null ? map['portal'] as String : null,
|
||||
group: map['group'] != null ? map['group'] as String : null,
|
||||
phone: map['phone'] != null ? map['phone'] as String : null,
|
||||
fax: map['fax'] != null ? map['fax'] as String : null,
|
||||
email: map['email'] != null ? map['email'] as String : null,
|
||||
facility: map['facility'] != null ? map['facility'] as String : null,
|
||||
remark: map['remark'] != null ? map['remark'] as String : null,
|
||||
tags: map['tags'] != null ? map['tags'] as String : null,
|
||||
event_name: map['event_name'] != null ? map['event_name'] as dynamic : null,
|
||||
event_active: map['event_active'] != null ? map['event_active'] as bool : null,
|
||||
hidden_location: map['hidden_location'] != null ? map['hidden_location'] as bool : null,
|
||||
auto_checkin: map['auto_checkin'] != null ? map['auto_checkin'] as bool : null,
|
||||
checkin_radius: map['checkin_radius'] != null ? map['checkin_radius'] as double : null,
|
||||
checkin_point: map['checkin_point'] != null ? map['checkin_point'] as double : null,
|
||||
buy_point: map['buy_point'] != null ? map['buy_point'] as double : null,
|
||||
evaluation_value: map['evaluation_value'] != null ? map['evaluation_value'] as String : null,
|
||||
shop_closed: map['shop_closed'] != null ? map['shop_closed'] as bool : null,
|
||||
shop_shutdown: map['shop_shutdown'] != null ? map['shop_shutdown'] as bool : null,
|
||||
opening_hours_mon: map['opening_hours_mon'] != null ? map['opening_hours_mon'] as String : null,
|
||||
opening_hours_tue: map['opening_hours_tue'] != null ? map['opening_hours_tue'] as String : null,
|
||||
opening_hours_wed: map['opening_hours_wed'] != null ? map['opening_hours_wed'] as String : null,
|
||||
opening_hours_thu: map['opening_hours_thu'] != null ? map['opening_hours_thu'] as String : null,
|
||||
opening_hours_fri: map['opening_hours_fri'] != null ? map['opening_hours_fri'] as String : null,
|
||||
opening_hours_sat: map['opening_hours_sat'] != null ? map['opening_hours_sat'] as String : null,
|
||||
opening_hours_sun: map['opening_hours_sun'] != null ? map['opening_hours_sun'] as String : null,
|
||||
parammeters: map['parammeters'] != null ? map['parammeters'] as String : null,
|
||||
);
|
||||
}
|
||||
|
||||
factory Properties.fromJson(String source) => Properties.fromMap(json.decode(source) as Map<String, dynamic>);
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'Properties(location_id: $location_id, sub_loc_id: $sub_loc_id, cp: $cp, location_name: $location_name, category: $category, subcategory: $subcategory, zip: $zip, address: $address, prefecture: $prefecture, area: $area, city: $city, latitude: $latitude, longitude: $longitude, photos: $photos, videos: $videos, webcontents: $webcontents, status: $status, portal: $portal, group: $group, phone: $phone, fax: $fax, email: $email, facility: $facility, remark: $remark, tags: $tags, event_name: $event_name, event_active: $event_active, hidden_location: $hidden_location, auto_checkin: $auto_checkin, checkin_radius: $checkin_radius, checkin_point: $checkin_point, buy_point: $buy_point, evaluation_value: $evaluation_value, shop_closed: $shop_closed, shop_shutdown: $shop_shutdown, opening_hours_mon: $opening_hours_mon, opening_hours_tue: $opening_hours_tue, opening_hours_wed: $opening_hours_wed, opening_hours_thu: $opening_hours_thu, opening_hours_fri: $opening_hours_fri, opening_hours_sat: $opening_hours_sat, opening_hours_sun: $opening_hours_sun, parammeters: $parammeters)';
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(covariant Properties other) {
|
||||
if (identical(this, other)) return true;
|
||||
|
||||
return
|
||||
other.location_id == location_id &&
|
||||
other.sub_loc_id == sub_loc_id &&
|
||||
other.cp == cp &&
|
||||
other.location_name == location_name &&
|
||||
other.category == category &&
|
||||
other.subcategory == subcategory &&
|
||||
other.zip == zip &&
|
||||
other.address == address &&
|
||||
other.prefecture == prefecture &&
|
||||
other.area == area &&
|
||||
other.city == city &&
|
||||
other.latitude == latitude &&
|
||||
other.longitude == longitude &&
|
||||
other.photos == photos &&
|
||||
other.videos == videos &&
|
||||
other.webcontents == webcontents &&
|
||||
other.status == status &&
|
||||
other.portal == portal &&
|
||||
other.group == group &&
|
||||
other.phone == phone &&
|
||||
other.fax == fax &&
|
||||
other.email == email &&
|
||||
other.facility == facility &&
|
||||
other.remark == remark &&
|
||||
other.tags == tags &&
|
||||
other.event_name == event_name &&
|
||||
other.event_active == event_active &&
|
||||
other.hidden_location == hidden_location &&
|
||||
other.auto_checkin == auto_checkin &&
|
||||
other.checkin_radius == checkin_radius &&
|
||||
other.checkin_point == checkin_point &&
|
||||
other.buy_point == buy_point &&
|
||||
other.evaluation_value == evaluation_value &&
|
||||
other.shop_closed == shop_closed &&
|
||||
other.shop_shutdown == shop_shutdown &&
|
||||
other.opening_hours_mon == opening_hours_mon &&
|
||||
other.opening_hours_tue == opening_hours_tue &&
|
||||
other.opening_hours_wed == opening_hours_wed &&
|
||||
other.opening_hours_thu == opening_hours_thu &&
|
||||
other.opening_hours_fri == opening_hours_fri &&
|
||||
other.opening_hours_sat == opening_hours_sat &&
|
||||
other.opening_hours_sun == opening_hours_sun &&
|
||||
other.parammeters == parammeters;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
return location_id.hashCode ^
|
||||
sub_loc_id.hashCode ^
|
||||
cp.hashCode ^
|
||||
location_name.hashCode ^
|
||||
category.hashCode ^
|
||||
subcategory.hashCode ^
|
||||
zip.hashCode ^
|
||||
address.hashCode ^
|
||||
prefecture.hashCode ^
|
||||
area.hashCode ^
|
||||
city.hashCode ^
|
||||
latitude.hashCode ^
|
||||
longitude.hashCode ^
|
||||
photos.hashCode ^
|
||||
videos.hashCode ^
|
||||
webcontents.hashCode ^
|
||||
status.hashCode ^
|
||||
portal.hashCode ^
|
||||
group.hashCode ^
|
||||
phone.hashCode ^
|
||||
fax.hashCode ^
|
||||
email.hashCode ^
|
||||
facility.hashCode ^
|
||||
remark.hashCode ^
|
||||
tags.hashCode ^
|
||||
event_name.hashCode ^
|
||||
event_active.hashCode ^
|
||||
hidden_location.hashCode ^
|
||||
auto_checkin.hashCode ^
|
||||
checkin_radius.hashCode ^
|
||||
checkin_point.hashCode ^
|
||||
buy_point.hashCode ^
|
||||
evaluation_value.hashCode ^
|
||||
shop_closed.hashCode ^
|
||||
shop_shutdown.hashCode ^
|
||||
opening_hours_mon.hashCode ^
|
||||
opening_hours_tue.hashCode ^
|
||||
opening_hours_wed.hashCode ^
|
||||
opening_hours_thu.hashCode ^
|
||||
opening_hours_fri.hashCode ^
|
||||
opening_hours_sat.hashCode ^
|
||||
opening_hours_sun.hashCode ^
|
||||
parammeters.hashCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
6
lib/model/map_state_instance.dart
Normal file
@ -0,0 +1,6 @@
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
|
||||
class MapStateInstance {
|
||||
MapController? mapController;
|
||||
LatLngBounds? currentBounds;
|
||||
}
|
||||
@ -1,45 +0,0 @@
|
||||
class AuthResponse {
|
||||
final User user;
|
||||
final String token;
|
||||
|
||||
AuthResponse({required this.user, required this.token});
|
||||
|
||||
factory AuthResponse.fromJson(Map<String, dynamic> json) {
|
||||
return AuthResponse(
|
||||
user: User.fromJson(json['user']),
|
||||
token: json['token'],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class User {
|
||||
final int id;
|
||||
final String email;
|
||||
final bool isRogaining;
|
||||
final String group;
|
||||
final String zekkenNumber;
|
||||
final String eventCode;
|
||||
final String teamName;
|
||||
|
||||
User({
|
||||
required this.id,
|
||||
required this.email,
|
||||
required this.isRogaining,
|
||||
required this.group,
|
||||
required this.zekkenNumber,
|
||||
required this.eventCode,
|
||||
required this.teamName,
|
||||
});
|
||||
|
||||
factory User.fromJson(Map<String, dynamic> json) {
|
||||
return User(
|
||||
id: json['id'],
|
||||
email: json['email'],
|
||||
isRogaining: json['is_rogaining'],
|
||||
group: json['group'],
|
||||
zekkenNumber: json['zekken_number'],
|
||||
eventCode: json['event_code'],
|
||||
teamName: json['team_name'],
|
||||
);
|
||||
}
|
||||
}
|
||||
229
lib/nrog/pages/auth_page.dart
Normal file
@ -0,0 +1,229 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
import 'package:keyboard_dismisser/keyboard_dismisser.dart';
|
||||
import 'package:rogapp/model/auth_user.dart';
|
||||
import 'package:rogapp/nrog/pages/home_page.dart';
|
||||
import 'package:rogapp/provider/auth_provider.dart';
|
||||
import 'package:rogapp/services/auth_service.dart';
|
||||
import 'package:rogapp/widgets/c_form_text_field.dart';
|
||||
import 'package:rogapp/widgets/c_password_text_filed.dart';
|
||||
|
||||
class AuthPage extends ConsumerStatefulWidget {
|
||||
const AuthPage({super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<AuthPage> createState() => _AuthPageState();
|
||||
}
|
||||
|
||||
class _AuthPageState extends ConsumerState<AuthPage> {
|
||||
final _formkey = GlobalKey<FormState>();
|
||||
final FocusNode focusEmail = FocusNode();
|
||||
final FocusNode focusPwd = FocusNode();
|
||||
var _authMode = 'login';
|
||||
bool _isLoginProgress = false;
|
||||
|
||||
final TextEditingController _emailTextEditingController =
|
||||
TextEditingController();
|
||||
final TextEditingController _passwordTextEditingController =
|
||||
TextEditingController();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_emailTextEditingController.addListener(() => setState(() {}));
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
checkUser();
|
||||
});
|
||||
}
|
||||
|
||||
void _submit() async {
|
||||
setState(() {
|
||||
_isLoginProgress = true;
|
||||
});
|
||||
if (_formkey.currentState!.validate()) {
|
||||
AuthService authService = AuthService();
|
||||
AuthUser? user = await authService.userLogin(
|
||||
_emailTextEditingController.text,
|
||||
_passwordTextEditingController.text);
|
||||
if (user != null) {
|
||||
setState(() {
|
||||
ref.read(authUserStateProvider.notifier).addLogin(user);
|
||||
});
|
||||
}
|
||||
}
|
||||
setState(() {
|
||||
_isLoginProgress = false;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _submitToken(String token) async {
|
||||
setState(() {
|
||||
_isLoginProgress = true;
|
||||
});
|
||||
AuthService authService = AuthService();
|
||||
AuthUser? user = await authService.userFromToken(token);
|
||||
//////////////print("---user is ${user} ---");
|
||||
if (user != null) {
|
||||
setState(() {
|
||||
_isLoginProgress = false;
|
||||
ref.read(authUserStateProvider.notifier).addLogin(user);
|
||||
});
|
||||
} else {}
|
||||
}
|
||||
|
||||
void checkUser() async {
|
||||
String? token =
|
||||
await ref.read(authUserStateProvider.notifier).tokenFromDevice();
|
||||
//////////////print("--- red token is ${token} ---");
|
||||
if (token != null) {
|
||||
await _submitToken(token);
|
||||
final id = ref.read(authUserStateProvider).id;
|
||||
if (id != null) {
|
||||
if (context.mounted) {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (ctx) => const HomePage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (ref.read(authUserStateProvider).id != null) {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (ctx) => const HomePage()));
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: true,
|
||||
body: KeyboardDismisser(
|
||||
gestures: const [
|
||||
GestureType.onTap,
|
||||
//GestureType.onVerticalDragDown
|
||||
],
|
||||
child: Center(
|
||||
child: SizedBox(
|
||||
child: Stack(
|
||||
clipBehavior: Clip.none,
|
||||
children: [
|
||||
buildAuthCard(),
|
||||
buildLogo(),
|
||||
],
|
||||
),
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Positioned buildLogo() {
|
||||
return Positioned(
|
||||
top: -170,
|
||||
left: MediaQuery.of(context).size.width / 2 - 100,
|
||||
child: Center(
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
width: 200,
|
||||
height: 200,
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
image: DecorationImage(
|
||||
image: AssetImage('assets/images/appicon.png'),
|
||||
fit: BoxFit.fill),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildAuthCard() {
|
||||
return Card(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Form(
|
||||
key: _formkey,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 40, bottom: 10, left: 12, right: 12),
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(10.0),
|
||||
child: CFormTextField(
|
||||
cFocus: focusEmail,
|
||||
cController: _emailTextEditingController),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(10),
|
||||
child: CPasswordTextField(
|
||||
cController: _passwordTextEditingController,
|
||||
cFocusNode: focusPwd,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 12,
|
||||
),
|
||||
buildControlls(),
|
||||
// SizedBox(height: MediaQuery.of(context).viewInsets.bottom,)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildControlls() {
|
||||
if (_isLoginProgress) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
|
||||
final usr = ref.read(authUserStateProvider);
|
||||
return Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 12.0),
|
||||
child: ElevatedButton(
|
||||
onPressed: _submit,
|
||||
child: Text(_authMode == "login" ? "Submit" : "Register",
|
||||
style: GoogleFonts.lato(
|
||||
color: Theme.of(context).colorScheme.secondary))),
|
||||
)
|
||||
],
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
if (_authMode == 'login') {
|
||||
_authMode = 'register';
|
||||
} else {
|
||||
_authMode = 'login';
|
||||
}
|
||||
});
|
||||
},
|
||||
child: Text(
|
||||
_authMode == "login"
|
||||
? "${usr.id} Dont have account, please Register"
|
||||
: "Already Registered, Login",
|
||||
style: GoogleFonts.lato(
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
decoration: TextDecoration.underline,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
119
lib/nrog/pages/home_page.dart
Normal file
@ -0,0 +1,119 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:flutter_map_location_marker/flutter_map_location_marker.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rogapp/provider/map_state_provider.dart';
|
||||
import 'package:rogapp/widgets/base_layer_widget.dart';
|
||||
|
||||
class HomePage extends ConsumerStatefulWidget {
|
||||
const HomePage({super.key});
|
||||
|
||||
@override
|
||||
ConsumerState<HomePage> createState() => _HomePageState();
|
||||
}
|
||||
|
||||
class _HomePageState extends ConsumerState<HomePage> {
|
||||
StreamSubscription? subscription;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final mapStateInstance = ref.watch(mapStateNotifierProvider);
|
||||
return Scaffold(
|
||||
//drawer: DrawerPage(),
|
||||
appBar: AppBar(
|
||||
title: const Text("Rogaining"),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
//Get.toNamed(AppPages.HISTORY);
|
||||
},
|
||||
icon: const Icon(Icons.history)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
// final tk = indexController.currentUser[0]["token"];
|
||||
// if (tk != null) {
|
||||
// destinationController.fixMapBound(tk);
|
||||
// }
|
||||
},
|
||||
icon: const Icon(Icons.refresh)),
|
||||
InkWell(
|
||||
onTap: () {
|
||||
//Get.toNamed(AppPages.SEARCH);
|
||||
},
|
||||
child: Container(
|
||||
height: 32,
|
||||
width: 75,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue,
|
||||
borderRadius: BorderRadius.circular(25),
|
||||
),
|
||||
child: const Center(
|
||||
child: Icon(Icons.search),
|
||||
),
|
||||
),
|
||||
),
|
||||
//CatWidget(indexController: indexController,),
|
||||
],
|
||||
),
|
||||
body: Center(
|
||||
child: FlutterMap(
|
||||
mapController: mapStateInstance.mapController,
|
||||
options: MapOptions(
|
||||
maxZoom: 18.4,
|
||||
onMapReady: () {
|
||||
// indexController.is_mapController_loaded.value = true;
|
||||
subscription = mapStateInstance.mapController?.mapEventStream
|
||||
.listen((MapEvent mapEvent) {
|
||||
if (mapEvent is MapEventMoveStart) {
|
||||
//print(DateTime.now().toString() + ' [MapEventMoveStart] START');
|
||||
// do something
|
||||
}
|
||||
// if (mapEvent is MapEventMoveEnd &&
|
||||
// indexController.currentUser.isEmpty) {
|
||||
//print(DateTime.now().toString() + ' [MapEventMoveStart] END');
|
||||
// indexController.loadLocationsBound();
|
||||
//indexController.rogMapController!.move(c.center, c.zoom);
|
||||
// }
|
||||
});
|
||||
},
|
||||
center: LatLng(37.15319600454702, 139.58765950528198),
|
||||
//bounds:
|
||||
zoom: 18,
|
||||
interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag,
|
||||
|
||||
onPositionChanged: (MapPosition pos, isvalue) {
|
||||
//indexController.currentBound = [pos.bounds!];
|
||||
},
|
||||
// onTap: (_, __) => popupController
|
||||
// .hideAllPopups(), // Hide popup when the map is tapped.
|
||||
),
|
||||
children: [
|
||||
const BaseLayer(),
|
||||
CurrentLocationLayer(
|
||||
followOnLocationUpdate: FollowOnLocationUpdate.once,
|
||||
turnOnHeadingUpdate: TurnOnHeadingUpdate.never,
|
||||
style: const LocationMarkerStyle(
|
||||
marker: DefaultLocationMarker(
|
||||
child: Icon(
|
||||
Icons.navigation,
|
||||
color: Colors.yellowAccent,
|
||||
),
|
||||
),
|
||||
markerSize: Size(27, 27),
|
||||
markerDirection: MarkerDirection.heading,
|
||||
),
|
||||
),
|
||||
const MarkerLayer(markers: [])
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
126
lib/nrog/pages/permission_page.dart
Normal file
@ -0,0 +1,126 @@
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/nrog/pages/auth_page.dart';
|
||||
|
||||
class PermissionPage extends StatefulWidget {
|
||||
const PermissionPage({super.key});
|
||||
|
||||
@override
|
||||
State<PermissionPage> createState() => _PermissionPageState();
|
||||
}
|
||||
|
||||
class _PermissionPageState extends State<PermissionPage> {
|
||||
bool hasNavigated = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_checkPermissionStatus();
|
||||
});
|
||||
}
|
||||
|
||||
_checkPermissionStatus() async {
|
||||
PermissionStatus status = await Permission.location.status;
|
||||
|
||||
if (status.isGranted == false) {
|
||||
if (context.mounted) {
|
||||
showAlert(context);
|
||||
}
|
||||
} else if (status.isPermanentlyDenied) {
|
||||
await requestPermission();
|
||||
} else {
|
||||
if (mounted) {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (_) => const AuthPage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Text(""),
|
||||
);
|
||||
}
|
||||
|
||||
void showAlert(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('ロケーション許可'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('このアプリでは、位置情報の収集を行います。'),
|
||||
Text(
|
||||
'岐阜ナビアプリではチェックポイントの自動チェックインの機能を可能にするために、現在地のデータが収集されます。アプリを閉じている時や、使用していないときにも収集されます。位置情報は、個人を特定できない統計的な情報として、ユーザーの個人情報とは一切結びつかない形で送信されます。お知らせの配信、位置情報の利用を許可しない場合は、この後表示されるダイアログで「許可しない」を選択してください。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () {
|
||||
requestPermission();
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
|
||||
Future<void> requestPermission() async {
|
||||
PermissionStatus permission = await Permission.location.status;
|
||||
if (permission == PermissionStatus.permanentlyDenied) {
|
||||
showPermanentAlert();
|
||||
} else {
|
||||
PermissionStatus newPermission = await Permission.location.request();
|
||||
if (newPermission != PermissionStatus.granted) {
|
||||
exit(0);
|
||||
} else {
|
||||
if (context.mounted) {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (_) => const AuthPage()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void showPermanentAlert() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('無効'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('位置情報が無効になっています'),
|
||||
Text(
|
||||
'このアプリケーションへの位置情報アクセスが無効になっています。続行するには設定>プライバシーとセキュリティ>位置情報サービス>岐阜ナビ で有効にしてください。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () async {
|
||||
await openAppSettings().then(
|
||||
(value) async {
|
||||
if (value) {
|
||||
if (await Permission
|
||||
.location.status.isPermanentlyDenied ==
|
||||
true &&
|
||||
await Permission.location.status.isGranted ==
|
||||
false) {
|
||||
requestPermission(); /* opens app settings until permission is granted */
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -4,122 +4,436 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/model/location_response.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/services/external_service.dart';
|
||||
import 'package:rogapp/utils/const.dart';
|
||||
import 'package:qr_code_scanner/qr_code_scanner.dart';
|
||||
|
||||
// 関数 getTagText は、特定の条件に基づいて文字列から特定の部分を抽出し、返却するためのものです。
|
||||
// 関数は2つのパラメータを受け取り、条件分岐を通じて結果を返します。
|
||||
//
|
||||
// この関数は、タグのリスト(空白を含む文字列)を適切に解析し、条件に応じて特定のタグを抽出するために設計されています。
|
||||
// 異なる種類の空白文字(半角、全角)で異なる分割を行い、与えられた条件(isRecept)に応じて適切なタグを選択して返却します。
|
||||
//
|
||||
String getTagText(bool isRecept, String? tags) {
|
||||
// bool isRecept: 真偽値を受け取り、この値によって処理の分岐が行われます。
|
||||
// String? tags: オプショナルな文字列(null が許容される)。空白文字を含む可能性のあるタグのリストを表します。
|
||||
|
||||
// 空のチェック:
|
||||
// tags が null または空文字列 ("") の場合、何も含まれていないことを意味し、関数はただちに空文字列を返します。
|
||||
//
|
||||
if (tags == null || tags.isEmpty) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// タグの分割:
|
||||
// tags が空ではない場合、文字列を空白文字で分割します。
|
||||
// ここで2種類の空白文字(半角 " " と全角 " ")に対応するため、2回分割を行っています。
|
||||
// tts: 半角スペース " " で分割した結果のリスト。
|
||||
// ttt: 全角スペース " " で分割した結果のリスト。
|
||||
//
|
||||
List<String> tts = tags.split(" ");
|
||||
List<String> ttt = tags.split(" ");
|
||||
|
||||
// 条件分岐:
|
||||
// isRecept の値によって、処理が分岐します。
|
||||
//
|
||||
if (isRecept) {
|
||||
// isRecept が true の場合:
|
||||
// 全角スペースで分割した結果 (ttt) の長さが半角スペースで分割した結果 (tts) の長さより大きく、
|
||||
// かつ ttt が1つ以上の要素を持つ場合、ttt[1] (全角スペースで分割後の2番目の要素)を返します。
|
||||
if (ttt.length > tts.length && ttt.length > 1) {
|
||||
return ttt[1];
|
||||
}
|
||||
}
|
||||
if (!isRecept) {
|
||||
// isRecept が false の場合:
|
||||
// 全角スペースで分割したリストが半角スペースで分割したリストよりも長い場合、ttt[0] (全角スペースで分割後の最初の要素)を返します。
|
||||
// 上記の条件に当てはまらない場合、半角スペースで分割したリストの最初の要素 tts[0] を返します。
|
||||
//
|
||||
if (ttt.length > tts.length && ttt.length > 1) {
|
||||
return ttt[0];
|
||||
}
|
||||
}
|
||||
if (!isRecept) {
|
||||
// 最終的な返却:
|
||||
// 上記の条件に何も該当しない場合(主に isRecept が true であり、全角スペースの条件に該当しない場合)、空文字列 "" を返します。
|
||||
return tts[0];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
// 要修正:画像の読み込みエラーが発生した場合のエラーハンドリングが不十分です。エラーメッセージを表示するなどの処理を追加してください。
|
||||
// getDisplayImage は、Destination オブジェクトを受け取り、特定の条件に基づいて表示する画像を返す機能を持っています。
|
||||
// Flutterの Image ウィジェットを使用して、適切な画像を表示します。
|
||||
//
|
||||
// この関数は、提供された Destination オブジェクトに基づいて適切な画像を動的に選択し、
|
||||
// その画像を表示するための Image ウィジェットを生成します。
|
||||
// デフォルトの画像、完全なURL、またはサーバーURLと組み合わされた画像パスを使用して、条件に応じた画像の取得を試みます。
|
||||
// また、エラー発生時にはデフォルト画像にフォールバックすることでユーザー体験を向上させます。
|
||||
//
|
||||
Image getDisplayImage(Destination destination) {
|
||||
// Destination destination: これは Destination クラスのインスタンスで、
|
||||
// CheckPointのデータを持っているオブジェクトです。
|
||||
// このクラスには少なくとも phone と photos というプロパティが含まれている
|
||||
//
|
||||
|
||||
// サーバーURLの取得:
|
||||
// serverUrl 変数には ConstValues.currentServer() メソッドから現在のサーバーのURLが取得されます。
|
||||
// これは画像を取得する際の基本URLとして使用される可能性があります。
|
||||
//
|
||||
String serverUrl = ConstValues.currentServer();
|
||||
|
||||
// デフォルト画像の設定:
|
||||
// img 変数にはデフォルトの画像が設定されます。
|
||||
// これは、アセットから "assets/images/empty_image.png" をロードするための Image.asset コンストラクタを使用しています。
|
||||
//
|
||||
Image img = Image.asset("assets/images/empty_image.png");
|
||||
|
||||
// 電話番号のチェック:
|
||||
// destination.phone が null の場合、関数は img(デフォルト画像)を返します。
|
||||
// これは、phone プロパティが画像URLの代用として何らかの形で使用されることを示唆していますが、
|
||||
// それが null であればデフォルト画像を使用するという意味です。
|
||||
//
|
||||
if (destination.phone == null) {
|
||||
return img;
|
||||
}
|
||||
|
||||
// 画像URLの構築と画像の返却:
|
||||
// destination.photos が http を含む場合、これはすでに完全なURLとして提供されていることを意味します。
|
||||
// このURLを NetworkImage コンストラクタに渡し、Image ウィジェットを生成して返します。
|
||||
// そうでない場合は、serverUrl と destination.photos を組み合わせたURLを生成して NetworkImage に渡し、画像を取得します。
|
||||
//
|
||||
if (destination.photos!.contains('http')) {
|
||||
return Image(
|
||||
image: NetworkImage(
|
||||
destination.phone!,
|
||||
),
|
||||
errorBuilder:
|
||||
(BuildContext context, Object exception, StackTrace? stackTrace) {
|
||||
return Image.asset("assets/images/empty_image.png");
|
||||
},
|
||||
);
|
||||
} else {
|
||||
return Image(
|
||||
image: NetworkImage(
|
||||
'$serverUrl/media/compressed/${destination.photos}',
|
||||
),
|
||||
errorBuilder:
|
||||
(BuildContext context, Object exception, StackTrace? stackTrace) {
|
||||
return Image.asset("assets/images/empty_image.png");
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// getFinishImage は、ImageProvider 型のオブジェクトを返す関数で、Flutterアプリケーションで使用される画像を提供します。
|
||||
// この関数は、DestinationController というクラスのインスタンスに依存しており、特定の状態に基づいて適切な画像を返します。
|
||||
//
|
||||
// この関数は、アプリケーションの現在の状態に依存して動的に画像を提供します。
|
||||
// DestinationController の photos リストに基づいて画像を選択し、リストが空の場合はデフォルトの画像を提供します。
|
||||
// これにより、画像の動的な管理が可能になり、ユーザーインターフェースの柔軟性が向上します。
|
||||
// また、ImageProvider クラスを使用することで、
|
||||
// 画像の具体的な取得方法(ファイルからの読み込みやアセットからのロードなど)を抽象化し、
|
||||
// Flutterの Image ウィジェットで直接使用できる形式で画像を返します。
|
||||
//
|
||||
ImageProvider getFinishImage() {
|
||||
|
||||
// DestinationControllerの取得:
|
||||
// destinationController は Get.find<DestinationController>() を使用して取得されます。
|
||||
// これは、GetXというFlutterの状態管理ライブラリの機能を使用して、
|
||||
// 現在のアプリケーションコンテキストから DestinationController タイプのインスタンスを取得するものです。
|
||||
// これにより、アプリケーションの他の部分で共有されている DestinationController の現在のインスタンスにアクセスします。
|
||||
//
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
|
||||
// 画像の決定:
|
||||
// destinationController.photos リストが空でないかどうかをチェックします。
|
||||
// このリストは、ファイルパスまたは画像リソースへの参照を含む可能性があります。
|
||||
//
|
||||
if (destinationController.photos.isNotEmpty) {
|
||||
// リストが空でない場合、最初の要素 (destinationController.photos[0]) が使用されます。
|
||||
// FileImage コンストラクタを使用して、このパスから ImageProvider を生成します。
|
||||
// これは、ローカルファイルシステム上の画像ファイルを参照するためのものです。
|
||||
//
|
||||
return FileImage(destinationController.photos[0]);
|
||||
|
||||
} else {
|
||||
// destinationController.photos が空の場合、
|
||||
// AssetImage を使用してアプリケーションのアセットからデフォルトの画像('assets/images/empty_image.png')を
|
||||
// ロードします。これはビルド時にアプリケーションに組み込まれる静的なリソースです。
|
||||
//
|
||||
return const AssetImage('assets/images/empty_image.png');
|
||||
}
|
||||
}
|
||||
|
||||
// getReceiptImage は、ImageProvider 型を返す関数です。
|
||||
// この関数は DestinationController オブジェクトに依存しており、条件に応じて特定の画像を返します。
|
||||
// この関数は getFinishImage 関数と非常に似ており、ほぼ同じロジックを使用していますが、返されるデフォルトの画像が異なります。
|
||||
//
|
||||
ImageProvider getReceiptImage() {
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
if (destinationController.photos.isNotEmpty) {
|
||||
return FileImage(destinationController.photos[0]);
|
||||
} else {
|
||||
return const AssetImage('assets/images/money.png');
|
||||
}
|
||||
}
|
||||
|
||||
// CameraPageクラスは、目的地に応じて適切なカメラ機能とアクションボタンを提供します。
|
||||
// 手動チェックイン、ゴール撮影、購入ポイント撮影など、様々なシナリオに対応しています。
|
||||
// また、ロゲイニングが開始されていない場合は、StartRogainingウィジェットを表示して、ユーザーにロゲイニングの開始を促します。
|
||||
// CameraPageクラスは、IndexControllerとDestinationControllerを使用して、
|
||||
// 現在の状態や目的地の情報を取得し、適切なUIを構築します。
|
||||
// また、写真の撮影や購入ポイントの処理など、様々な機能を提供しています。
|
||||
//
|
||||
class CameraPage extends StatelessWidget {
|
||||
Feature? destination;
|
||||
CameraPage({Key? key, this.destination}) : super(key: key);
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
bool? manulaCheckin = false; // 手動チェックインを示すブール値(デフォルトはfalse)
|
||||
bool? buyPointPhoto = false; // 購入ポイントの写真を示すブール値(デフォルトはfalse)
|
||||
Destination destination; // 目的地オブジェクト
|
||||
Destination? dbDest; // データベースから取得した目的地オブジェクト(オプショナル)
|
||||
String? initImage; // 初期画像のパス(オプショナル)
|
||||
bool? buyQrCode = false;
|
||||
|
||||
CameraPage(
|
||||
{Key? key,
|
||||
required this.destination,
|
||||
this.dbDest,
|
||||
this.manulaCheckin,
|
||||
this.buyPointPhoto,
|
||||
this.initImage})
|
||||
: super(key: key);
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
var settingGoal = false.obs;
|
||||
|
||||
Timer? timer;
|
||||
|
||||
ImageProvider getFinishImage(){
|
||||
if(destinationController.photos.isNotEmpty){
|
||||
return FileImage(destinationController.photos[0]);
|
||||
}
|
||||
else{
|
||||
return AssetImage('assets/images/empty_image.png');
|
||||
}
|
||||
}
|
||||
// 現在の状態に基づいて、適切なアクションボタンを返します。
|
||||
// 要修正:エラーハンドリングが不十分です。例外が発生した場合の処理を追加することをお勧めします。
|
||||
//
|
||||
Widget getAction(BuildContext context) {
|
||||
|
||||
Widget getAction(BuildContext context){
|
||||
if(destinationController.is_at_goal.value && destinationController.is_in_rog.value){
|
||||
//print("----cccheckin is --- ${dbDest?.checkedin} ----");
|
||||
|
||||
if (manulaCheckin == true) {
|
||||
// manulaCheckinがtrueの場合は、撮影ボタンとチェックインボタンを表示します。
|
||||
return Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: (){
|
||||
destinationController.openCamera(context);
|
||||
onPressed: () {
|
||||
destinationController.openCamera(context, destination);
|
||||
},
|
||||
child: Text("take_photo of the clock".tr)
|
||||
),
|
||||
Obx(() =>
|
||||
destinationController.photos.isNotEmpty ?
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
primary: Colors.red
|
||||
),
|
||||
onPressed: (){
|
||||
int user_id = indexController.currentUser[0]["user"]["id"];
|
||||
//print("--- Pressed -----");
|
||||
String _team = indexController.currentUser[0]["user"]['team_name'];
|
||||
//print("--- _team : ${_team}-----");
|
||||
String _event_code = indexController.currentUser[0]["user"]["event_code"];
|
||||
//print("--- _event_code : ${_event_code}-----");
|
||||
String _token = indexController.currentUser[0]["token"];
|
||||
//print("--- _token : ${_token}-----");
|
||||
DateTime now = DateTime.now();
|
||||
String formattedDate = DateFormat('yyyy-MM-dd HH:mm:ss').format(now);
|
||||
|
||||
ExternalService().makeGoal(user_id, _token, _team, destinationController.photos[0].path, formattedDate, _event_code).then((value){
|
||||
print("---called ext api ${value['status']} ------");
|
||||
if(value['status'] == 'OK'){
|
||||
child: const Text("撮影")),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
await destinationController.makeCheckin(destination, true,
|
||||
destinationController.photos[0].path);
|
||||
Get.back();
|
||||
destinationController.skip_gps = false;
|
||||
Get.snackbar("目標が保存されました", "目標が正常に追加されました");
|
||||
destinationController.resetRogaining();
|
||||
}
|
||||
else{
|
||||
print("---- status ${value['status']} ---- ");
|
||||
Get.snackbar("目標が追加されていません", "please_try_again");
|
||||
}
|
||||
});
|
||||
destinationController.rogainingCounted.value = true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
Get.snackbar("チェックインしました。",
|
||||
"${destination.sub_loc_id} : ${destination.name}");
|
||||
},
|
||||
child: Text("finish_goal".tr)
|
||||
):
|
||||
Container()
|
||||
)
|
||||
child: const Text("チェックイン"))
|
||||
: Container())
|
||||
],
|
||||
);
|
||||
}
|
||||
else{
|
||||
|
||||
if (destinationController.isAtGoal.value &&
|
||||
destinationController.isInRog.value &&
|
||||
destination.cp == -1) {
|
||||
// isAtGoalがtrueで、isInRogがtrue、destination.cpが-1の場合は、ゴール用の撮影ボタンとゴール完了ボタンを表示します。
|
||||
//goal
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Obx(() =>
|
||||
ElevatedButton(
|
||||
onPressed: (){
|
||||
destinationController.openCamera(context);
|
||||
onPressed: () {
|
||||
if (settingGoal.value == false) {
|
||||
destinationController.openCamera(context, destination);
|
||||
}
|
||||
},
|
||||
child: destinationController.photos.length > 0 ? Text("再撮影") : Text("撮影")
|
||||
)
|
||||
),
|
||||
Obx(() =>
|
||||
destinationController.photos.isNotEmpty ?
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
primary: Colors.red
|
||||
),
|
||||
onPressed: (){
|
||||
print("##### current destination ${indexController.currentDestinationFeature[0].sub_loc_id} #######");
|
||||
destinationController.makeCheckin(indexController.currentDestinationFeature[0], true, destinationController.photos[0].path);
|
||||
Get.back();
|
||||
destinationController.rogaining_counted.value = true;
|
||||
destinationController.skip_gps = false;
|
||||
destinationController.is_photo_shoot.value = false;
|
||||
Get.snackbar("チェックインした", "正常にチェックインしました");
|
||||
child: Text("take_photo of the clock".tr)),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? settingGoal.value == false
|
||||
? ElevatedButton(
|
||||
style:
|
||||
ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
// print(
|
||||
// "----- user isss ${indexController.currentUser[0]} -----");
|
||||
|
||||
// ExternalService().makeGoal(user_id, _token, _team, destinationController.photos[0].path, formattedDate, _event_code).then((value){
|
||||
// print("---called ext api ${value['status']} ------");
|
||||
// if(value['status'] == 'OK'){
|
||||
// Get.back();
|
||||
// destinationController.skip_gps = false;
|
||||
// Get.snackbar("Checked in", "Checked in successfuly");
|
||||
// }
|
||||
// else{
|
||||
// print("---- status ${value['status']} ---- ");
|
||||
// Get.snackbar("Checkin not added", "please_try_again");
|
||||
// }
|
||||
// });
|
||||
settingGoal.value = true;
|
||||
try {
|
||||
int userId =
|
||||
indexController.currentUser[0]["user"]["id"];
|
||||
//print("--- Pressed -----");
|
||||
String team = indexController.currentUser[0]["user"]
|
||||
['team_name'];
|
||||
//print("--- _team : ${_team}-----");
|
||||
String eventCode = indexController.currentUser[0]
|
||||
["user"]["event_code"];
|
||||
//print("--- _event_code : ${_event_code}-----");
|
||||
String token =
|
||||
indexController.currentUser[0]["token"];
|
||||
//print("--- _token : ${_token}-----");
|
||||
DateTime now = DateTime.now();
|
||||
String formattedDate =
|
||||
DateFormat('yyyy-MM-dd HH:mm:ss').format(now);
|
||||
|
||||
await ExternalService()
|
||||
.makeGoal(
|
||||
userId,
|
||||
token,
|
||||
team,
|
||||
destinationController.photos[0].path,
|
||||
formattedDate,
|
||||
eventCode)
|
||||
.then((value) {
|
||||
// print(
|
||||
// "---called ext api ${value['status']} ------");
|
||||
if (value['status'] == 'OK') {
|
||||
Get.back();
|
||||
destinationController.skipGps = false;
|
||||
Get.snackbar("目標が保存されました", "目標が正常に追加されました");
|
||||
destinationController.resetRogaining(
|
||||
isgoal: true);
|
||||
} else {
|
||||
//print("---- status ${value['status']} ---- ");
|
||||
Get.snackbar("目標が追加されていません", "please_try_again");
|
||||
}
|
||||
});
|
||||
} on Exception catch (_) {
|
||||
settingGoal.value = false;
|
||||
} finally {
|
||||
settingGoal.value = false;
|
||||
}
|
||||
},
|
||||
child: Text("チェックイン")
|
||||
):
|
||||
Container()
|
||||
child: Text("finish_goal".tr))
|
||||
: const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
)
|
||||
: Container())
|
||||
],
|
||||
);
|
||||
|
||||
} else if (destinationController.isInRog.value &&
|
||||
dbDest?.checkedin != null &&
|
||||
destination.cp != -1 &&
|
||||
dbDest?.checkedin == true) {
|
||||
// isInRogがtrueで、dbDest?.checkedinがtrue、destination.cpが-1以外の場合は、購入ポイントの撮影ボタンと完了ボタンを表示します。
|
||||
//make buypoint image
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Obx(() => ElevatedButton(
|
||||
onPressed: () {
|
||||
destinationController.openCamera(context, destination);
|
||||
},
|
||||
child: destinationController.photos.isNotEmpty
|
||||
? const Text("再撮影")
|
||||
: const Text("撮影"))),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
// print(
|
||||
// "##### current destination ${indexController.currentDestinationFeature[0].sub_loc_id} #######");
|
||||
await destinationController.makeBuyPoint(
|
||||
destination, destinationController.photos[0].path);
|
||||
Get.back();
|
||||
destinationController.rogainingCounted.value = true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
Get.snackbar("お買い物加点を行いました。",
|
||||
"${destination.sub_loc_id} : ${destination.name}");
|
||||
},
|
||||
child: const Text("レシートの写真を撮ってください"))
|
||||
: Container())
|
||||
],
|
||||
);
|
||||
|
||||
} else if (destinationController.isInRog.value &&
|
||||
dbDest?.checkedin != null &&
|
||||
destination.cp != -1 &&
|
||||
destination.use_qr_code == true &&
|
||||
dbDest?.checkedin == true) {
|
||||
// isInRogがtrueで、dbDest?.checkedinがtrue、destination.cpが-1以外、qrCode == true の場合は、
|
||||
// QRCode 撮影ボタンを表示
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Obx(() => ElevatedButton(
|
||||
onPressed: () {
|
||||
destinationController.openCamera(context, destination);
|
||||
},
|
||||
child: destinationController.photos.isNotEmpty
|
||||
? const Text("再QR読込")
|
||||
: const Text("QR読込"))),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
// print(
|
||||
// "##### current destination ${indexController.currentDestinationFeature[0].sub_loc_id} #######");
|
||||
await destinationController.makeBuyPoint(
|
||||
destination, destinationController.photos[0].path);
|
||||
Get.back();
|
||||
destinationController.rogainingCounted.value = true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
Get.snackbar("お買い物加点を行いました。",
|
||||
"${destination.sub_loc_id} : ${destination.name}");
|
||||
},
|
||||
child: const Text("QRコードを読み取ってください"))
|
||||
: Container())
|
||||
],
|
||||
);
|
||||
} else {
|
||||
// それ以外の場合は、撮影ボタンとチェックインボタンを表示します。
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Obx(() => ElevatedButton(
|
||||
onPressed: () {
|
||||
destinationController.openCamera(context, destination);
|
||||
},
|
||||
child: destinationController.photos.isNotEmpty
|
||||
? const Text("再撮影")
|
||||
: const Text("撮影"))),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
// print(
|
||||
// "##### current destination ${indexController.currentDestinationFeature[0].sub_loc_id} #######");
|
||||
await destinationController.makeCheckin(
|
||||
indexController.currentDestinationFeature[0],
|
||||
true,
|
||||
destinationController.photos[0].path);
|
||||
Get.back();
|
||||
destinationController.rogainingCounted.value = true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
Get.snackbar(
|
||||
"チェックインしました",
|
||||
indexController.currentDestinationFeature[0].name ??
|
||||
"");
|
||||
},
|
||||
child: const Text("チェックイン"))
|
||||
: Container())
|
||||
],
|
||||
);
|
||||
}
|
||||
@ -131,126 +445,285 @@ class CameraPage extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if(destinationController.is_in_rog.value){
|
||||
//print("---- photos ${destination.photos} ----");
|
||||
if (buyPointPhoto == true) {
|
||||
// buyPointPhotoがtrueの場合は、BuyPointCameraウィジェットを返します。
|
||||
//print("--- buy point camera ${destination.toString()}");
|
||||
return BuyPointCamera(destination: destination);
|
||||
}else if(destination.use_qr_code){
|
||||
return QRCodeScannerPage(destination: destination);
|
||||
} else if (destinationController.isInRog.value) {
|
||||
// isInRogがtrueの場合は、カメラページのUIを構築します。
|
||||
// AppBarには、目的地の情報を表示します。
|
||||
// ボディには、目的地の画像、タグ、アクションボタンを表示します。
|
||||
//print("-----tags camera page----- ${destination.tags}");
|
||||
//print("--- in normal camera ${destination.toString()}");
|
||||
return Scaffold(
|
||||
appBar:
|
||||
destinationController.is_in_rog.value && destinationController.rogaining_counted.value == true ?
|
||||
AppBar(
|
||||
title: destination!.properties!.cp == -1 ?
|
||||
Text("finishing_rogaining".tr)
|
||||
:
|
||||
Text("cp_pls_take_photo".tr)
|
||||
,
|
||||
appBar: destinationController.isInRog.value &&
|
||||
destinationController.rogainingCounted.value == true
|
||||
? AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
title: destination.cp == -1
|
||||
? Text("finishing_rogaining".tr)
|
||||
: Text("${destination.sub_loc_id} : ${destination.name}"),
|
||||
leading: IconButton(
|
||||
icon: Text("cancel".tr),
|
||||
onPressed: (){
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
destinationController.skip_10s = true;
|
||||
timer = Timer.periodic(Duration(seconds: 10), (Timer t){
|
||||
timer =
|
||||
Timer.periodic(const Duration(seconds: 10), (Timer t) {
|
||||
destinationController.skip_10s = false;
|
||||
});
|
||||
},
|
||||
),
|
||||
centerTitle: true,
|
||||
)
|
||||
:
|
||||
AppBar(
|
||||
title: Text("チェックポイント"),
|
||||
: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
title: Text("${destination.sub_loc_id} : ${destination.name}"),
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Center(
|
||||
child: Obx(
|
||||
() => Container(
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: 370,
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: destinationController.photos.isEmpty
|
||||
? getDisplayImage(destination).image
|
||||
: getFinishImage(),
|
||||
fit: BoxFit.cover)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 8.0),
|
||||
child: Text(getTagText(
|
||||
false,
|
||||
destination.tags,
|
||||
))
|
||||
// child: Obx(() => destinationController.photos.isEmpty == true
|
||||
// ? const Text("撮影してチェックインしてください。")
|
||||
// : const Text("チェックインをタップしてください。")),
|
||||
),
|
||||
getAction(context),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
// isInRogがfalseの場合は、StartRogainingウィジェットを返します。
|
||||
return StartRogaining();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ロゲイニングが開始されていない場合に表示されるウィジェットです。
|
||||
// "You have not started rogaining yet."というメッセージと、戻るボタンを表示します。
|
||||
//
|
||||
class StartRogaining extends StatelessWidget {
|
||||
StartRogaining({Key? key}) : super(key: key);
|
||||
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
title: Text(
|
||||
"Not started yet".tr,
|
||||
),
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text("You have not started rogaining yet.".tr,
|
||||
style: const TextStyle(fontSize: 24)),
|
||||
const SizedBox(
|
||||
height: 40.0,
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
destinationController.skipGps = false;
|
||||
},
|
||||
child: const Text("Back"),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 購入ポイントの写真撮影用のウィジェットです。
|
||||
// 目的地の画像、タグ、撮影ボタン、完了ボタン、購入なしボタンを表示します。
|
||||
// 撮影ボタンをタップすると、カメラが起動します。
|
||||
// 完了ボタンをタップすると、購入ポイントの処理が行われます。
|
||||
// 購入なしボタンをタップすると、購入ポイントがキャンセルされます。
|
||||
//
|
||||
class BuyPointCamera extends StatelessWidget {
|
||||
BuyPointCamera({Key? key, required this.destination}) : super(key: key);
|
||||
|
||||
Destination destination;
|
||||
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
//print("in camera purchase 1 ${destinationController.isInRog.value}");
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
automaticallyImplyLeading: false,
|
||||
title: Text(
|
||||
"${destination.sub_loc_id} : ${destination.name}",
|
||||
),
|
||||
),
|
||||
body: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Center(
|
||||
child: Obx(() =>
|
||||
Container(
|
||||
child: Obx(
|
||||
() => Container(
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: 370,
|
||||
decoration: BoxDecoration(
|
||||
image:
|
||||
DecorationImage(
|
||||
image: getFinishImage(),
|
||||
fit: BoxFit.cover
|
||||
image: DecorationImage(
|
||||
// 要修正:getReceiptImage関数の戻り値がnullの場合のエラーハンドリングが不十分です。適切なデフォルト画像を表示するなどの処理を追加してください。
|
||||
//
|
||||
image: getReceiptImage(), fit: BoxFit.cover)),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(getTagText(true, destination.tags)),
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Obx(() => Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
ElevatedButton(
|
||||
onPressed: () {
|
||||
// print(
|
||||
// "in camera purchase 2 ${destinationController.isInRog.value}");
|
||||
destinationController.openCamera(
|
||||
context, destination);
|
||||
},
|
||||
child: destinationController.photos.isNotEmpty
|
||||
? const Text("再撮影")
|
||||
: const Text("撮影")),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
ElevatedButton(
|
||||
onPressed: () async {
|
||||
await destinationController
|
||||
.cancelBuyPoint(destination);
|
||||
Navigator.of(Get.context!).pop();
|
||||
//Get.back();
|
||||
destinationController.rogainingCounted.value = true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
},
|
||||
child: const Text("買い物なし"))
|
||||
],
|
||||
)),
|
||||
Obx(() => destinationController.photos.isNotEmpty
|
||||
? Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
// ElevatedButton(
|
||||
// style: ElevatedButton.styleFrom(
|
||||
// backgroundColor: Colors.red),
|
||||
// onPressed: () async {},
|
||||
// child: const Text("買物なし")),
|
||||
// const SizedBox(
|
||||
// width: 10,
|
||||
// ),
|
||||
ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.red),
|
||||
onPressed: () async {
|
||||
// print(
|
||||
// "in camera purchase 3 ${destinationController.isInRog.value}");
|
||||
await destinationController.makeBuyPoint(
|
||||
destination,
|
||||
destinationController.photos[0].path);
|
||||
Get.back();
|
||||
// print(
|
||||
// "in camera purchase 4 ${destinationController.isInRog.value}");
|
||||
destinationController.rogainingCounted.value =
|
||||
true;
|
||||
destinationController.skipGps = false;
|
||||
destinationController.isPhotoShoot.value = false;
|
||||
Get.snackbar("お買い物加点を行いました",
|
||||
"${destination.sub_loc_id} : ${destination.name}");
|
||||
},
|
||||
child: const Text("完了"))
|
||||
],
|
||||
)
|
||||
: Container())
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
getAction(context),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
else {
|
||||
return StartRogaining();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class StartRogaining extends StatelessWidget {
|
||||
StartRogaining({Key? key}) : super(key: key);
|
||||
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
class QRCodeScannerPage extends StatefulWidget {
|
||||
@override
|
||||
_QRCodeScannerPageState createState() => _QRCodeScannerPageState();
|
||||
}
|
||||
|
||||
class _QRCodeScannerPageState extends State<QRCodeScannerPage> {
|
||||
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
|
||||
QRViewController? controller;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _onQRViewCreated(QRViewController controller) {
|
||||
this.controller = controller;
|
||||
controller.scannedDataStream.listen((scanData) {
|
||||
// QRコードのデータを処理する
|
||||
debugPrint("scan data = ${scanData}");
|
||||
String? qrCodeData = scanData.code;
|
||||
// qrCodeDataを使用してチェックポイントの処理を行う
|
||||
// 例えば、qrCodeDataからCPのIDと店名を取得し、加点処理を行う
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("Not started yet".tr,),
|
||||
),
|
||||
body: Container(
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text("You have not started rogaining yet.".tr, style: TextStyle(fontSize: 24)),
|
||||
SizedBox(height: 40.0,),
|
||||
ElevatedButton(
|
||||
onPressed: (){
|
||||
Get.back();
|
||||
destinationController.skip_gps = false;
|
||||
},
|
||||
child: Text("Back"),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class NotAtGoal extends StatelessWidget {
|
||||
NotAtGoal({Key? key}) : super(key: key);
|
||||
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("Not reached the goal yet".tr,),
|
||||
),
|
||||
body: Container(
|
||||
child: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text("You have not reached the goal yet.".tr, style: TextStyle(fontSize: 24)),
|
||||
SizedBox(height: 40.0,),
|
||||
ElevatedButton(
|
||||
onPressed: (){
|
||||
Get.back();
|
||||
destinationController.skip_gps = false;
|
||||
},
|
||||
child: Text("Back"),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
body: QRView(
|
||||
key: qrKey,
|
||||
onQRViewCreated: _onQRViewCreated,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
class ChangePasswordPage extends StatelessWidget {
|
||||
ChangePasswordPage({Key? key}) : super(key: key);
|
||||
@ -18,15 +17,18 @@ class ChangePasswordPage extends StatelessWidget {
|
||||
backgroundColor: Colors.white,
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
|
||||
backgroundColor: Colors.white,
|
||||
leading:
|
||||
IconButton( onPressed: (){
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},icon:Icon(Icons.arrow_back_ios,size: 20,color: Colors.black,)),
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back_ios,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
)),
|
||||
),
|
||||
body:
|
||||
Container(
|
||||
body: SizedBox(
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
@ -36,128 +38,145 @@ class ChangePasswordPage extends StatelessWidget {
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
child: Text("change_password".tr, style: TextStyle(fontSize: 24.0),),
|
||||
Text(
|
||||
"change_password".tr,
|
||||
style: const TextStyle(fontSize: 24.0),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 30,
|
||||
),
|
||||
SizedBox(height: 30,),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 40
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Column(
|
||||
children: [
|
||||
makeInput(label: "old_password".tr, controller: oldPasswordController),
|
||||
makeInput(label: "new_password".tr, controller: newPasswordController, obsureText: true),
|
||||
makeInput(
|
||||
label: "old_password".tr,
|
||||
controller: oldPasswordController),
|
||||
makeInput(
|
||||
label: "new_password".tr,
|
||||
controller: newPasswordController,
|
||||
obsureText: true),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 40),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(top: 3,left: 3),
|
||||
padding: const EdgeInsets.only(top: 3, left: 3),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(40),
|
||||
),
|
||||
child: Obx((() =>
|
||||
indexController.is_loading == true ? MaterialButton(
|
||||
child: Obx(
|
||||
(() => indexController.isLoading.value == true
|
||||
? MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
|
||||
},
|
||||
height: 60,
|
||||
onPressed: () {},
|
||||
color: Colors.grey[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: CircularProgressIndicator(),
|
||||
) :
|
||||
Column(
|
||||
borderRadius: BorderRadius.circular(40)),
|
||||
child: const CircularProgressIndicator(),
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
if(oldPasswordController.text.isEmpty || newPasswordController.text.isEmpty){
|
||||
height: 60,
|
||||
onPressed: () {
|
||||
if (oldPasswordController
|
||||
.text.isEmpty ||
|
||||
newPasswordController
|
||||
.text.isEmpty) {
|
||||
Get.snackbar(
|
||||
"no_values".tr,
|
||||
"values_required".tr,
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(
|
||||
Icons.assistant_photo_outlined,
|
||||
size: 40.0,
|
||||
color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(
|
||||
milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
indexController.is_loading.value = true;
|
||||
indexController.changePassword(oldPasswordController.text, newPasswordController.text, context);
|
||||
indexController.isLoading.value = true;
|
||||
indexController.changePassword(
|
||||
oldPasswordController.text,
|
||||
newPasswordController.text,
|
||||
context);
|
||||
//indexController.login(oldPasswordController.text, newPasswordController.text, context);
|
||||
},
|
||||
color: Colors.indigoAccent[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("ログイン",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10.0,
|
||||
),
|
||||
SizedBox(height: 10.0,),
|
||||
|
||||
],
|
||||
)
|
||||
)),
|
||||
),
|
||||
)),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
)
|
||||
),
|
||||
SizedBox(height: 20,),
|
||||
Row(
|
||||
const Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
||||
],
|
||||
children: [],
|
||||
)
|
||||
],
|
||||
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
);
|
||||
));
|
||||
}
|
||||
|
||||
Widget makeInput({label, required TextEditingController controller, obsureText = false}){
|
||||
Widget makeInput(
|
||||
{label, required TextEditingController controller, obsureText = false}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label,style:TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Colors.black87
|
||||
),),
|
||||
SizedBox(height: 5,),
|
||||
Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
fontSize: 15, fontWeight: FontWeight.w400, color: Colors.black87),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
TextField(
|
||||
controller: controller,
|
||||
obscureText: obsureText,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: EdgeInsets.symmetric(vertical: 0,horizontal: 10),
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 0, horizontal: 10),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: (Colors.grey[400])!,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 30.0,)
|
||||
const SizedBox(
|
||||
height: 30.0,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,10 +1,11 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/main.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
|
||||
class DestinationBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.put<DestinationController>(DestinationController());
|
||||
restoreGame();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,217 +0,0 @@
|
||||
import 'dart:developer';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:camera_camera/camera_camera.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rogapp/pages/camera/camera_page.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/destination_map/destination_map_page.dart';
|
||||
import 'package:rogapp/pages/drawer/drawer_page.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/services/external_service.dart';
|
||||
import 'package:rogapp/widgets/destination_widget.dart';
|
||||
import 'package:timeline_tile/timeline_tile.dart';
|
||||
|
||||
class DestnationPage extends StatelessWidget {
|
||||
DestnationPage({Key? key}) : super(key: key);
|
||||
|
||||
final DestinationController destinationController = Get.find<DestinationController>();
|
||||
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
final List<int> _items = List<int>.generate(50, (int index) => index);
|
||||
|
||||
Future<void> showCurrentPosition() async {
|
||||
LocationPermission permission = await Geolocator.checkPermission();
|
||||
if (permission != LocationPermission.whileInUse ||
|
||||
permission != LocationPermission.always) {
|
||||
permission = await Geolocator.requestPermission();
|
||||
}
|
||||
Position position = await Geolocator.getCurrentPosition(
|
||||
desiredAccuracy: LocationAccuracy.high);
|
||||
indexController.rogMapController?.move(LatLng(position.latitude, position.longitude), 14);
|
||||
}
|
||||
|
||||
Image getImage(int index){
|
||||
if(destinationController.destinations[index].photos == null || destinationController.destinations[index].photos == ""){
|
||||
return Image(image: AssetImage('assets/images/empty_image.png'));
|
||||
}
|
||||
else{
|
||||
return Image(image: NetworkImage(destinationController.destinations[index].photos!));
|
||||
}
|
||||
}
|
||||
|
||||
Widget getRoutingImage(int route){
|
||||
switch (route) {
|
||||
case 0:
|
||||
return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 35.0,);
|
||||
case 1:
|
||||
return Image(image: AssetImage('assets/images/p4_8_car.png'), width: 35.0,);
|
||||
case 2:
|
||||
return Image(image: AssetImage('assets/images/p4_10_train.png'), width: 35.0,);
|
||||
default:
|
||||
return Image(image: AssetImage('assets/images/p4_9_man.png'), width: 35.0,);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final ColorScheme colorScheme = Theme.of(context).colorScheme;
|
||||
final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
|
||||
final Color evenItemColor = colorScheme.primary.withOpacity(0.15);
|
||||
return WillPopScope(
|
||||
onWillPop: () async {
|
||||
indexController.switchPage(AppPages.INITIAL);
|
||||
return false;
|
||||
},
|
||||
child: Scaffold(
|
||||
drawer: DrawerPage(),
|
||||
bottomNavigationBar: BottomAppBar(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left:13.0),
|
||||
child: InkWell(
|
||||
child: Obx((() => getRoutingImage(destinationController.travelMode.value))),
|
||||
onTap: (){
|
||||
Get.bottomSheet(
|
||||
Obx(() =>
|
||||
ListView(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top:30.0, bottom: 30),
|
||||
child: Center(child: Text("select_travel_mode".tr, style: TextStyle(fontSize: 22.0, color:Colors.red, fontWeight:FontWeight.bold),),),
|
||||
),
|
||||
ListTile(
|
||||
selected: destinationController.travelMode == 0 ? true : false,
|
||||
selectedTileColor: Colors.amber.shade200,
|
||||
leading: Image(image: AssetImage('assets/images/p4_9_man.png'),),
|
||||
title: Text("walking".tr),
|
||||
onTap:(){
|
||||
destinationController.travelMode.value = 0;
|
||||
destinationController.PopulateDestinations();
|
||||
Get.back();
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
selected: destinationController.travelMode == 1 ? true : false,
|
||||
selectedTileColor: Colors.amber.shade200,
|
||||
leading: Image(image: AssetImage('assets/images/p4_8_car.png'),),
|
||||
title: Text("driving".tr),
|
||||
onTap:(){
|
||||
destinationController.travelMode.value = 1;
|
||||
destinationController.PopulateDestinations();
|
||||
Get.back();
|
||||
},
|
||||
),
|
||||
// ListTile(
|
||||
// selected: destinationController.travelMode == 2 ? true : false,
|
||||
// selectedTileColor: Colors.amber.shade200,
|
||||
// leading: Image(image: AssetImage('assets/images/p4_10_train.png'),),
|
||||
// title: Text("transit".tr),
|
||||
// onTap:(){
|
||||
// destinationController.travelMode.value = 2;
|
||||
// destinationController.PopulateDestinations();
|
||||
// Get.back();
|
||||
// },
|
||||
// ),
|
||||
],
|
||||
|
||||
),
|
||||
),
|
||||
isScrollControlled:false,
|
||||
backgroundColor: Colors.white,
|
||||
);
|
||||
//destinationController.PopulateDestinations();
|
||||
}
|
||||
),
|
||||
)
|
||||
,
|
||||
IconButton(
|
||||
icon: const Icon(Icons.travel_explore, size: 35,),
|
||||
onPressed: (){
|
||||
indexController.switchPage(AppPages.INITIAL);
|
||||
}
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: (){
|
||||
//print("######");
|
||||
indexController.toggleDestinationMode();
|
||||
},
|
||||
tooltip: 'Increment',
|
||||
child: Obx(() =>
|
||||
indexController.desination_mode == 1 ?
|
||||
Image(image: AssetImage('assets/images/list2.png'))
|
||||
:
|
||||
Image(image: AssetImage('assets/images/map.png'))
|
||||
),
|
||||
elevation: 4.0,
|
||||
),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
|
||||
appBar:AppBar(
|
||||
automaticallyImplyLeading: true,
|
||||
title: Text("app_title".tr),
|
||||
actions: [
|
||||
InkWell(
|
||||
onTap: (){
|
||||
Get.toNamed(AppPages.CAMERA_PAGE);
|
||||
},
|
||||
child: destinationController.is_in_rog == true ?
|
||||
Image.asset("assets/images/basic-walking.gif",height: 10.0,)
|
||||
:
|
||||
destinationController.is_at_goal == true ?
|
||||
IconButton(
|
||||
onPressed:(){Get.toNamed(AppPages.CAMERA_PAGE);},
|
||||
icon: Icon(Icons.assistant_photo),
|
||||
)
|
||||
:
|
||||
IconButton(
|
||||
onPressed:(){Get.toNamed(AppPages.CAMERA_PAGE);},
|
||||
icon: Icon(Icons.accessibility),
|
||||
),
|
||||
),
|
||||
// Obx(() =>
|
||||
// Text(indexController.connectionStatusName.value)
|
||||
// ),
|
||||
Obx(() =>
|
||||
ToggleButtons(
|
||||
disabledColor: Colors.grey.shade200,
|
||||
selectedColor: Colors.red,
|
||||
children: <Widget>[
|
||||
Icon(Icons.explore, size: 35.0,
|
||||
)],
|
||||
onPressed: (int index) {
|
||||
destinationController.is_gps_selected.value = !destinationController.is_gps_selected.value;
|
||||
if(destinationController.is_gps_selected.value){
|
||||
destinationController.chekcs = 0;
|
||||
destinationController.skip_gps = false;
|
||||
//destinationController.resetRogaining();
|
||||
}
|
||||
},
|
||||
isSelected: [destinationController.is_gps_selected.value],
|
||||
),
|
||||
),
|
||||
// IconButton(onPressed: (){
|
||||
// showCurrentPosition();
|
||||
// },
|
||||
// icon: Icon(Icons.location_on_outlined))
|
||||
],
|
||||
),
|
||||
body: Obx(() =>
|
||||
indexController.desination_mode.value == 0 ?
|
||||
DestinationWidget():
|
||||
DestinationMapPage()
|
||||
)
|
||||
),
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,102 +1,131 @@
|
||||
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/plugin_api.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:flutter_map_location_marker/flutter_map_location_marker.dart';
|
||||
import 'package:flutter_map_marker_popup/flutter_map_marker_popup.dart';
|
||||
import 'package:flutter_map_tile_caching/flutter_map_tile_caching.dart';
|
||||
//import 'package:flutter_map_marker_popup/flutter_map_marker_popup.dart';
|
||||
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
|
||||
import 'package:geojson/geojson.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/services/destination_service.dart';
|
||||
import 'package:rogapp/utils/text_util.dart';
|
||||
import 'package:rogapp/widgets/base_layer_widget.dart';
|
||||
import 'package:rogapp/widgets/bottom_sheet_new.dart';
|
||||
import 'package:rogapp/widgets/bottom_sheet_widget.dart';
|
||||
import 'package:rogapp/widgets/bread_crum_widget.dart';
|
||||
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_start.dart';
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_goal.dart';
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_normal_point.dart';
|
||||
|
||||
// FlutterMapウィジェットを使用して、地図を表示します。
|
||||
// IndexControllerから目的地のリストを取得し、マーカーとしてマップ上に表示します。
|
||||
// マーカーがタップされると、BottomSheetウィジェットを表示します。
|
||||
// 現在地の表示、ルートの表示、ベースレイヤーの表示などの機能を提供します。
|
||||
// 主なロジック:
|
||||
// FlutterMapウィジェットを使用して、地図を表示します。
|
||||
// IndexControllerから目的地のリストを取得し、MarkerLayerを使用してマーカーを表示します。
|
||||
// getMarkerShapeメソッドを使用して、マーカーの見た目をカスタマイズします。目的地の種類に応じて、異なるマーカーを表示します。
|
||||
// マーカーがタップされると、festuretoDestinationメソッドを使用してGeoJSONFeatureをDestinationオブジェクトに変換し、showModalBottomSheetを使用してBottomSheetウィジェットを表示します。
|
||||
// CurrentLocationLayerを使用して、現在地をマップ上に表示します。
|
||||
// PolylineLayerを使用して、ルートをマップ上に表示します。getPointsメソッドを使用して、ルートの座標を取得します。
|
||||
// BaseLayerを使用して、マップのベースレイヤーを表示します。
|
||||
//
|
||||
class DestinationMapPage extends StatelessWidget {
|
||||
DestinationMapPage({Key? key}) : super(key: key);
|
||||
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
final DestinationController destinationController = Get.find<DestinationController>();
|
||||
final DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
StreamSubscription? subscription;
|
||||
final PopupController _popupLayerController = PopupController();
|
||||
//final PopupController _popupLayerController = PopupController();
|
||||
|
||||
List<LatLng>? getPoints(){
|
||||
print("##### --- route point ${indexController.routePoints.length}");
|
||||
List<LatLng>? getPoints() {
|
||||
//print("##### --- route point ${indexController.routePoints.length}");
|
||||
List<LatLng> pts = [];
|
||||
for(PointLatLng p in indexController.routePoints){
|
||||
for (PointLatLng p in indexController.routePoints) {
|
||||
LatLng l = LatLng(p.latitude, p.longitude);
|
||||
pts.add(l);
|
||||
}
|
||||
return pts;
|
||||
}
|
||||
|
||||
// 要検討:マーカーのタップイベントを処理する際に、エラーハンドリングが不十分です。例外が発生した場合の処理を追加することをお勧めします。
|
||||
//
|
||||
List<Marker>? getMarkers() {
|
||||
List<Marker> pts = [];
|
||||
int index = -1;
|
||||
//int index = -1;
|
||||
for (int i = 0; i < destinationController.destinations.length; i++) {
|
||||
Destination d = destinationController.destinations[i];
|
||||
print("^^^^ ${d} ^^^^");
|
||||
//print("^^^^ $d ^^^^");
|
||||
Marker m = Marker(
|
||||
point: LatLng(d.lat!, d.lon!),
|
||||
anchorPos: AnchorPos.align(AnchorAlign.center),
|
||||
builder:(cts){
|
||||
|
||||
return InkWell(
|
||||
onTap: (){
|
||||
print("-- Destination is --- ${d.name} ------");
|
||||
if(d != null){
|
||||
if(indexController.currentDestinationFeature.length > 0) {
|
||||
alignment: Alignment.center,
|
||||
child: InkWell(
|
||||
onTap: () {
|
||||
//print("-- Destination is --- ${d.name} ------");
|
||||
if (indexController.currentDestinationFeature.isNotEmpty) {
|
||||
indexController.currentDestinationFeature.clear();
|
||||
}
|
||||
indexController.currentDestinationFeature.add(d);
|
||||
//indexController.getAction();
|
||||
|
||||
showModalBottomSheet(context: Get.context!, isScrollControlled: true,
|
||||
builder:((context) => BottomSheetNew())
|
||||
).whenComplete((){
|
||||
print("---- set skip gps to false -----");
|
||||
destinationController.skip_gps = false;
|
||||
});
|
||||
Widget bottomSheet = BottomSheetNew(destination: d);
|
||||
/*
|
||||
if (d.cp == -1 || d.cp == 0) {
|
||||
bottomSheet = BottomSheetStart(destination: d);
|
||||
} else if (d.cp == -2 || d.cp == 0) {
|
||||
bottomSheet = BottomSheetGoal(destination: d);
|
||||
} else {
|
||||
bottomSheet = BottomSheetNormalPoint(destination: d);
|
||||
}
|
||||
*/
|
||||
|
||||
showModalBottomSheet(
|
||||
context: Get.context!,
|
||||
isScrollControlled: true,
|
||||
constraints:
|
||||
BoxConstraints.loose(Size(Get.width, Get.height * 0.85)),
|
||||
builder: ((context) => bottomSheet ),
|
||||
|
||||
).whenComplete(() {
|
||||
//print("---- set skip gps to false -----");
|
||||
destinationController.skipGps = false;
|
||||
});
|
||||
},
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Container(
|
||||
width:20,
|
||||
height:20,
|
||||
width: 20,
|
||||
height: 20,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.red,
|
||||
shape: BoxShape.circle,
|
||||
border: new Border.all(
|
||||
border: Border.all(
|
||||
color: Colors.white,
|
||||
width: d.checkin_radious != null ? d.checkin_radious! : 1,
|
||||
),
|
||||
),
|
||||
child: new Center(
|
||||
child: new Text(
|
||||
child: Center(
|
||||
child: Text(
|
||||
(i + 1).toString(),
|
||||
style: TextStyle(color: Colors.white),
|
||||
style: const TextStyle(color: Colors.white),
|
||||
),
|
||||
),
|
||||
),
|
||||
//Container( color: Colors.yellow, child: Text(TextUtils.getDisplayText(d), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),)),
|
||||
Container(
|
||||
color: Colors.yellow,
|
||||
child: Text(
|
||||
TextUtils.getDisplayText(d),
|
||||
style: const TextStyle(
|
||||
fontSize: 15.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
overflow: TextOverflow.visible),
|
||||
)),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
});
|
||||
));
|
||||
|
||||
pts.add(m);
|
||||
}
|
||||
@ -105,8 +134,7 @@ class DestinationMapPage extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Obx((() =>
|
||||
Stack(
|
||||
return Obx((() => Stack(
|
||||
children: [
|
||||
// indexController.is_rog_mapcontroller_loaded.value == false ?
|
||||
// Center(child: CircularProgressIndicator())
|
||||
@ -116,322 +144,64 @@ class DestinationMapPage extends StatelessWidget {
|
||||
// child: BreadCrumbWidget(mapController:indexController.rogMapController),
|
||||
// ),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top:0.0),
|
||||
padding: const EdgeInsets.only(top: 0.0),
|
||||
//child: TravelMap(),
|
||||
child:
|
||||
TravelMap(),
|
||||
child: travelMap(),
|
||||
),
|
||||
],
|
||||
)
|
||||
));
|
||||
)));
|
||||
}
|
||||
|
||||
FlutterMap TravelMap() {
|
||||
// 要検討:MapOptionsのboundsプロパティにハードコードされた座標が使用されています。これを動的に設定できるようにすることを検討してください。
|
||||
//
|
||||
FlutterMap travelMap() {
|
||||
return FlutterMap(
|
||||
mapController: indexController.rogMapController,
|
||||
options: MapOptions(
|
||||
onMapReady: (){
|
||||
indexController.is_rog_mapcontroller_loaded.value = true;
|
||||
subscription = indexController.rogMapController!.mapEventStream.listen((MapEvent mapEvent) {
|
||||
if (mapEvent is MapEventMoveStart) {
|
||||
}
|
||||
onMapReady: () {
|
||||
indexController.isRogMapcontrollerLoaded.value = true;
|
||||
subscription = indexController.rogMapController.mapEventStream
|
||||
.listen((MapEvent mapEvent) {
|
||||
if (mapEvent is MapEventMoveStart) {}
|
||||
if (mapEvent is MapEventMoveEnd) {
|
||||
//destinationController.is_gps_selected.value = true;
|
||||
//indexController.mapController!.move(c.center, c.zoom);
|
||||
LatLngBounds bounds = indexController.rogMapController!.bounds!;
|
||||
LatLngBounds bounds = indexController.rogMapController.bounds!;
|
||||
indexController.currentBound.clear();
|
||||
indexController.currentBound.add(bounds);
|
||||
if(indexController.currentUser.length <= 0){
|
||||
if (indexController.currentUser.isEmpty) {
|
||||
indexController.loadLocationsBound();
|
||||
}
|
||||
}
|
||||
});
|
||||
} ,
|
||||
bounds: indexController.currentBound.length > 0 ? indexController.currentBound[0]: LatLngBounds.fromPoints([LatLng(35.03999881162295, 136.40587119778962), LatLng(36.642756778706904, 137.95226720406063)]),
|
||||
zoom: 1,
|
||||
},
|
||||
bounds: indexController.currentBound.isNotEmpty
|
||||
? indexController.currentBound[0]
|
||||
: LatLngBounds.fromPoints([
|
||||
const LatLng(35.03999881162295, 136.40587119778962),
|
||||
const LatLng(36.642756778706904, 137.95226720406063)
|
||||
]),
|
||||
initialZoom: 1,
|
||||
maxZoom: 42,
|
||||
interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag,
|
||||
),
|
||||
children: [
|
||||
BaseLayer(),
|
||||
Obx(() =>
|
||||
indexController.routePointLenght > 0 ?
|
||||
PolylineLayer(
|
||||
const BaseLayer(),
|
||||
Obx(
|
||||
() => indexController.routePointLenght > 0
|
||||
? PolylineLayer(
|
||||
polylines: [
|
||||
Polyline(
|
||||
points: getPoints()!,
|
||||
strokeWidth: 6.0,
|
||||
color: Colors.indigo
|
||||
),
|
||||
color: Colors.indigo),
|
||||
],
|
||||
)
|
||||
|
||||
:
|
||||
Container(),
|
||||
: Container(),
|
||||
),
|
||||
CurrentLocationLayer(),
|
||||
MarkerLayer(
|
||||
markers: getMarkers()!
|
||||
),
|
||||
MarkerLayer(markers: getMarkers()!),
|
||||
],
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// class DestinationMapPage extends StatefulWidget {
|
||||
// DestinationMapPage({ Key? key }) : super(key: key);
|
||||
|
||||
|
||||
// @override
|
||||
// State<DestinationMapPage> createState() => _DestinationMapPageState();
|
||||
// }
|
||||
|
||||
//class _DestinationMapPageState extends State<DestinationMapPage> {
|
||||
// final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
// final DestinationController destinationController = Get.find<DestinationController>();
|
||||
// StreamSubscription? subscription;
|
||||
// final PopupController _popupLayerController = PopupController();
|
||||
|
||||
// List<LatLng>? getPoints(List<PointLatLng> ptts){
|
||||
// //print("##### --- route point ${indexController.routePoints.length}");
|
||||
// List<LatLng> pts = [];
|
||||
// for(PointLatLng p in ptts){
|
||||
// LatLng l = LatLng(p.latitude, p.longitude);
|
||||
// pts.add(l);
|
||||
// }
|
||||
// return pts;
|
||||
// }
|
||||
|
||||
// String getDisplaytext(Destination dp){
|
||||
// String txt = "";
|
||||
// if(dp.cp! > 0){
|
||||
// txt = "${dp.cp}";
|
||||
// if(dp.checkin_point != null && dp.checkin_point! > 0){
|
||||
// txt = txt + "{${dp.checkin_point}}";
|
||||
// }
|
||||
// if(dp.buy_point != null && dp.buy_point! > 0){
|
||||
// txt = txt + "[${dp.buy_point}]";
|
||||
// }
|
||||
// }
|
||||
// return txt;
|
||||
// }
|
||||
|
||||
// List<Marker>? getMarkers() {
|
||||
// List<Marker> pts = [];
|
||||
// int index = -1;
|
||||
// for (int i = 0; i < destinationController.destinations.length; i++) {
|
||||
// Destination d = destinationController.destinations[i];
|
||||
// //for(Destination d in destinationController.destinations){
|
||||
// //print("-----lat ${lat}, ----- lon ${lan}");
|
||||
// Marker m = Marker(
|
||||
// point: LatLng(d.lat!, d.lon!),
|
||||
// anchorPos: AnchorPos.align(AnchorAlign.center),
|
||||
// builder:(cts){
|
||||
|
||||
// return InkWell(
|
||||
// onTap: (){
|
||||
// print("-- Destination is --- ${d.name} ------");
|
||||
// if(d != null){
|
||||
// if(indexController.currentDestinationFeature.length > 0) {
|
||||
// indexController.currentDestinationFeature.clear();
|
||||
// }
|
||||
// indexController.currentDestinationFeature.add(d);
|
||||
// //indexController.getAction();
|
||||
|
||||
// showModalBottomSheet(context: context, isScrollControlled: true,
|
||||
// //builder:((context) => BottomSheetWidget())
|
||||
// builder:((context) => BottomSheetNew())
|
||||
// );
|
||||
// }
|
||||
// },
|
||||
// child: Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// Container(
|
||||
// width:20,
|
||||
// height:20,
|
||||
// decoration: BoxDecoration(
|
||||
// color: Colors.red,
|
||||
// shape: BoxShape.circle,
|
||||
// border: new Border.all(
|
||||
// color: Colors.white,
|
||||
// width: d.checkin_radious != null ? d.checkin_radious! : 1,
|
||||
// ),
|
||||
// ),
|
||||
// child: new Center(
|
||||
// child: new Text(
|
||||
// (i + 1).toString(),
|
||||
// style: TextStyle(color: Colors.white),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// Container( color: Colors.yellow, child: Text(getDisplaytext(d), style: TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),)),
|
||||
// ],
|
||||
// ),
|
||||
// );
|
||||
|
||||
// //return Icon(Icons.pin_drop);
|
||||
// // return IconButton(
|
||||
// // onPressed: ()async {
|
||||
// // Destination? fs = await destinationController.getDEstinationForLatLong(d.lat!, d.lon!);
|
||||
// // print("-- Destination is --- ${fs!.name} ------");
|
||||
// // if(fs != null){
|
||||
// // if(indexController.currentDestinationFeature.length > 0) {
|
||||
// // indexController.currentDestinationFeature.clear();
|
||||
// // }
|
||||
// // indexController.currentDestinationFeature.add(fs);
|
||||
// // //indexController.getAction();
|
||||
|
||||
// // showModalBottomSheet(context: context, isScrollControlled: true,
|
||||
// // //builder:((context) => BottomSheetWidget())
|
||||
// // builder:((context) => BottomSheetNew())
|
||||
// // );
|
||||
// // }
|
||||
// // },
|
||||
// // icon: Container(
|
||||
// // width: 60,
|
||||
// // height: 60,
|
||||
// // decoration: BoxDecoration(
|
||||
// // borderRadius: BorderRadius.circular(d.checkin_radious ?? 0),
|
||||
// // color: Colors.transparent,
|
||||
// // border: BoxBorder()
|
||||
// // ),
|
||||
// // child: Icon(Icons.pin_drop)
|
||||
// // )
|
||||
// // );
|
||||
|
||||
// });
|
||||
|
||||
// pts.add(m);
|
||||
// }
|
||||
// return pts;
|
||||
// }
|
||||
|
||||
// @override
|
||||
// void initState() {
|
||||
|
||||
// //indexController.routePoints.clear();
|
||||
// DestinationService.getDestinationLine(destinationController.destinations)?.then((value){
|
||||
// //print("---- loading destination points ------ ${value}");
|
||||
// setState(() {
|
||||
// indexController.routePoints = value;
|
||||
// });
|
||||
// });
|
||||
// super.initState();
|
||||
// }
|
||||
|
||||
// void reload(){
|
||||
// setState(() {
|
||||
|
||||
// });
|
||||
// }
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Obx((() =>
|
||||
// Stack(
|
||||
// children: [
|
||||
// indexController.is_rog_mapcontroller_loaded.value == false ?
|
||||
// Center(child: CircularProgressIndicator())
|
||||
// :
|
||||
// BreadCrumbWidget(mapController:indexController.rogMapController),
|
||||
// Padding(
|
||||
// padding: const EdgeInsets.only(top:50.0),
|
||||
// //child: TravelMap(),
|
||||
// child:
|
||||
// TravelMap(indexController.routePoints),
|
||||
// ),
|
||||
// // Positioned(
|
||||
// // bottom: 200,
|
||||
// // left: 10,
|
||||
// // child: Container(
|
||||
// // color: Colors.white,
|
||||
// // child: Row(
|
||||
// // children: [
|
||||
// // Text(destinationController.gps[0]),
|
||||
// // Text(destinationController.locationPermission[0])
|
||||
// // ],
|
||||
// // ),
|
||||
// // )
|
||||
// // ),
|
||||
// ],
|
||||
// )
|
||||
// ));
|
||||
// }
|
||||
|
||||
// FlutterMap TravelMap(List<PointLatLng> ptts) {
|
||||
// return FlutterMap(
|
||||
// options: MapOptions(
|
||||
// onMapCreated: (c){
|
||||
// indexController.rogMapController = c;
|
||||
// indexController.rogMapController!.onReady.then((_) {
|
||||
// indexController.is_rog_mapcontroller_loaded.value = true;
|
||||
// subscription = indexController.rogMapController!.mapEventStream.listen((MapEvent mapEvent) {
|
||||
// if (mapEvent is MapEventMoveStart) {
|
||||
// //print(DateTime.now().toString() + ' [MapEventMoveStart] START');
|
||||
// // do something
|
||||
// }
|
||||
// if (mapEvent is MapEventMoveEnd) {
|
||||
// destinationController.isSelected.value = false;
|
||||
// //print(DateTime.now().toString() + ' [MapEventMoveStart] END');
|
||||
// //indexController.loadLocationsBound();
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
// } ,
|
||||
// bounds: indexController.currentBound.length > 0 ? indexController.currentBound[0]: LatLngBounds.fromPoints([LatLng(35.03999881162295, 136.40587119778962), LatLng(36.642756778706904, 137.95226720406063)]),
|
||||
// zoom: 1,
|
||||
// maxZoom: 42,
|
||||
// interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag,
|
||||
// //plugins: [LocationMarkerPlugin(),]
|
||||
// ),
|
||||
// children: [
|
||||
// TileLayerWidget(
|
||||
// options: TileLayerOptions(
|
||||
// urlTemplate: 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png',
|
||||
// subdomains: ['a', 'b', 'c'],
|
||||
// ),
|
||||
// ),
|
||||
// //Obx(() =>
|
||||
// indexController.routePoints.length > 0 ?
|
||||
// PolylineLayerWidget(
|
||||
// options: PolylineLayerOptions(
|
||||
// polylines: [
|
||||
// Polyline(
|
||||
// points: getPoints(ptts)!,
|
||||
// strokeWidth: 6.0,
|
||||
// color: Colors.indigo
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// )
|
||||
// :
|
||||
// Container(),
|
||||
// //),
|
||||
// // PopupMarkerLayerWidget(
|
||||
// // options: PopupMarkerLayerOptions(
|
||||
// // popupController: _popupLayerController,
|
||||
// // markers: _markers,
|
||||
// // markerRotateAlignment:
|
||||
// // PopupMarkerLayerOptions.rotationAlignmentFor(AnchorAlign.top),
|
||||
// // popupBuilder: (BuildContext context, Marker marker) =>
|
||||
|
||||
// // examplePopup(marker),
|
||||
// // ),
|
||||
// // ),
|
||||
// LocationMarkerLayerWidget(),
|
||||
// MarkerLayerWidget(
|
||||
// options: MarkerLayerOptions(
|
||||
// markers: getMarkers()!
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
|
||||
// );
|
||||
// }
|
||||
//}
|
||||
@ -1,4 +1,3 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
@ -8,12 +7,14 @@ import 'package:rogapp/services/auth_service.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
class DrawerPage extends StatelessWidget {
|
||||
DrawerPage({ Key? key }) : super(key: key);
|
||||
DrawerPage({Key? key}) : super(key: key);
|
||||
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
// 要検討:URLの起動に失敗した場合のエラーハンドリングが不十分です。適切なエラーメッセージを表示するなどの処理を追加してください。
|
||||
//
|
||||
void _launchURL(url) async {
|
||||
if (!await launch(url)) throw 'Could not launch $url';
|
||||
if (!await launchUrl(url)) throw 'Could not launch $url';
|
||||
}
|
||||
|
||||
@override
|
||||
@ -28,71 +29,129 @@ class DrawerPage extends StatelessWidget {
|
||||
Container(
|
||||
height: 100,
|
||||
color: Colors.amber,
|
||||
child: Obx(() =>
|
||||
Center(
|
||||
child: Obx(() => Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child:
|
||||
indexController.currentUser.length == 0 ?
|
||||
Flexible(child: Text("drawer_title".tr, style: TextStyle(color: Colors.black, fontSize: 20),))
|
||||
:
|
||||
Text(indexController.currentUser[0]['user']['email'], style: TextStyle(color: Colors.black, fontSize: 20),),
|
||||
),
|
||||
)
|
||||
child: indexController.currentUser.isEmpty
|
||||
? Flexible(
|
||||
child: Text(
|
||||
"drawer_title".tr,
|
||||
style: const TextStyle(
|
||||
color: Colors.black, fontSize: 20),
|
||||
))
|
||||
: Text(
|
||||
indexController.currentUser[0]['user']['email'],
|
||||
style: const TextStyle(
|
||||
color: Colors.black, fontSize: 20),
|
||||
),
|
||||
),
|
||||
Obx(() =>
|
||||
indexController.currentUser.length == 0 ?
|
||||
ListTile(
|
||||
)),
|
||||
),
|
||||
Obx(() => indexController.currentUser.isEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.login),
|
||||
title: Text("login".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
},
|
||||
) :
|
||||
ListTile(
|
||||
)
|
||||
: ListTile(
|
||||
leading: const Icon(Icons.login),
|
||||
title: Text("logout".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
indexController.logout();
|
||||
Get.toNamed(AppPages.TRAVEL);
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
},
|
||||
)
|
||||
),
|
||||
indexController.currentUser.length > 0 ?
|
||||
ListTile(
|
||||
)),
|
||||
indexController.currentUser.isNotEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.password),
|
||||
title: Text("change_password".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
Get.toNamed(AppPages.CHANGE_PASSWORD);
|
||||
},
|
||||
) :
|
||||
Container(width: 0, height: 0,),
|
||||
indexController.currentUser.length == 0 ?
|
||||
ListTile(
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
indexController.currentUser.isEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.person),
|
||||
title: Text("sign_up".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
Get.toNamed(AppPages.REGISTER);
|
||||
},
|
||||
) :
|
||||
Container(width: 0, height: 0,),
|
||||
indexController.currentUser.length > 0 ?
|
||||
ListTile(
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
indexController.currentUser.isNotEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.password),
|
||||
title: const Text("リセット"),
|
||||
onTap: () {
|
||||
// 要検討:リセット操作の確認メッセージをローカライズすることを検討してください。
|
||||
//
|
||||
Get.defaultDialog(
|
||||
title: "よろしいですか、リセットしますか?",
|
||||
middleText: "これにより、すべてのゲーム データが削除され、すべての状態が削除されます",
|
||||
textConfirm: "確認する",
|
||||
textCancel: "キャンセルする",
|
||||
onCancel: () => Get.back(),
|
||||
onConfirm: () {
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
destinationController.resetRogaining();
|
||||
destinationController.deleteDBDestinations();
|
||||
Get.back();
|
||||
},
|
||||
);
|
||||
},
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
indexController.currentUser.isNotEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.delete_forever),
|
||||
title: Text("delete_account".tr),
|
||||
onTap: (){
|
||||
String _token = indexController.currentUser[0]['token'];
|
||||
AuthService.deleteUser(_token).then((value){
|
||||
if(value.isNotEmpty){
|
||||
onTap: () {
|
||||
String token = indexController.currentUser[0]['token'];
|
||||
AuthService.deleteUser(token).then((value) {
|
||||
if (value.isNotEmpty) {
|
||||
indexController.logout();
|
||||
Get.toNamed(AppPages.TRAVEL);
|
||||
Get.snackbar("accounted_deleted".tr, "account_deleted_message".tr);
|
||||
Get.snackbar("accounted_deleted".tr,
|
||||
"account_deleted_message".tr);
|
||||
}
|
||||
});
|
||||
},
|
||||
) :
|
||||
Container(width: 0, height: 0,),
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
indexController.currentUser.isNotEmpty
|
||||
? ListTile(
|
||||
// 要検討:アカウント削除のリクエストが失敗した場合のエラーハンドリングを追加することをお勧めします。
|
||||
//
|
||||
leading: const Icon(Icons.delete_forever),
|
||||
title: Text("ユーザーデータを削除する".tr),
|
||||
onTap: () {
|
||||
String token = indexController.currentUser[0]['token'];
|
||||
AuthService.deleteUser(token).then((value) {
|
||||
Get.snackbar("ユーザーデータを削除する",
|
||||
"データを削除するためにユーザーの同意が設定されています アプリとサーバーでユーザーデータが削除されました");
|
||||
});
|
||||
},
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
// ListTile(
|
||||
// leading: const Icon(Icons.person),
|
||||
// title: Text("profile".tr),
|
||||
@ -108,19 +167,22 @@ class DrawerPage extends StatelessWidget {
|
||||
// title: Text("point_rank".tr),
|
||||
// onTap: (){},
|
||||
// ),
|
||||
indexController.currentUser.length > 0 ?
|
||||
ListTile(
|
||||
indexController.currentUser.isNotEmpty
|
||||
? ListTile(
|
||||
leading: const Icon(Icons.featured_video),
|
||||
title: Text("rog_web".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
_launchURL("https://www.gifuai.net/?page_id=17397");
|
||||
},
|
||||
) :
|
||||
Container(width: 0, height: 0,),
|
||||
)
|
||||
: const SizedBox(
|
||||
width: 0,
|
||||
height: 0,
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.privacy_tip),
|
||||
title: Text("privacy".tr),
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
_launchURL("https://rogaining.sumasen.net/api/privacy/");
|
||||
},
|
||||
)
|
||||
|
||||
156
lib/pages/gps/gps_page.dart
Normal file
@ -0,0 +1,156 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rogapp/model/gps_data.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/utils/database_gps.dart';
|
||||
import 'package:rogapp/widgets/base_layer_widget.dart';
|
||||
|
||||
class GpsPage extends StatefulWidget {
|
||||
const GpsPage({super.key});
|
||||
|
||||
@override
|
||||
State<GpsPage> createState() => _GpsPageState();
|
||||
}
|
||||
|
||||
class _GpsPageState extends State<GpsPage> {
|
||||
var gpsData = [].obs;
|
||||
MapController? mapController;
|
||||
StreamSubscription? subscription;
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
final DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
loadGpsData();
|
||||
}
|
||||
|
||||
// 要検討:GPSデータの読み込みに失敗した場合のエラーハンドリングが不十分です。適切なエラーメッセージを表示するなどの処理を追加してください。
|
||||
//
|
||||
void loadGpsData() async {
|
||||
final team_name = indexController.currentUser[0]["user"]['team_name'];
|
||||
final event_code = indexController.currentUser[0]["user"]["event_code"];
|
||||
GpsDatabaseHelper db = GpsDatabaseHelper.instance;
|
||||
var data = await db.getGPSData(team_name, event_code);
|
||||
gpsData.value = data;
|
||||
|
||||
//print("--- gps data ${data} ----");
|
||||
}
|
||||
|
||||
// 要検討:マーカーの形状を決定する際に、マジックナンバーが使用されています。定数を使用するなどして、コードの可読性を向上させることを検討してください。
|
||||
//
|
||||
Widget getMarkerShape(GpsData i) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () {},
|
||||
child: Container(
|
||||
height: 22,
|
||||
width: 22,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: Colors.transparent,
|
||||
border: Border.all(
|
||||
color:
|
||||
i.is_checkin == 0 ? Colors.blueAccent : Colors.green,
|
||||
width: i.is_checkin == 0 ? 0.4 : 2,
|
||||
style: BorderStyle.solid)),
|
||||
child: const Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [
|
||||
Icon(
|
||||
Icons.circle,
|
||||
size: 6.0,
|
||||
),
|
||||
],
|
||||
)),
|
||||
),
|
||||
Container(
|
||||
color: Colors.transparent,
|
||||
child: i.is_checkin == 1
|
||||
? Text(
|
||||
DateTime.fromMicrosecondsSinceEpoch(i.created_at)
|
||||
.hour
|
||||
.toString() +
|
||||
":" +
|
||||
DateTime.fromMicrosecondsSinceEpoch(i.created_at)
|
||||
.minute
|
||||
.toString(),
|
||||
// ":" +
|
||||
// DateTime.fromMicrosecondsSinceEpoch(i.created_at)
|
||||
// .second
|
||||
// .toString(),
|
||||
style: const TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Colors.black,
|
||||
))
|
||||
: Container()),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("GPS way points"),
|
||||
),
|
||||
body: Container(
|
||||
child: Obx(
|
||||
() => FlutterMap(
|
||||
mapController: mapController,
|
||||
options: MapOptions(
|
||||
maxZoom: 18.4,
|
||||
onMapReady: () {},
|
||||
//center: LatLng(37.15319600454702, 139.58765950528198),
|
||||
bounds: indexController.currentBound.isNotEmpty
|
||||
? indexController.currentBound[0]
|
||||
: LatLngBounds.fromPoints([
|
||||
LatLng(35.03999881162295, 136.40587119778962),
|
||||
LatLng(36.642756778706904, 137.95226720406063)
|
||||
]),
|
||||
zoom: 1,
|
||||
interactiveFlags: InteractiveFlag.pinchZoom | InteractiveFlag.drag,
|
||||
onPositionChanged: (MapPosition pos, bool hasGesture) {
|
||||
if (hasGesture) {
|
||||
indexController.currentBound = [pos.bounds!];
|
||||
}
|
||||
},
|
||||
onTap: (tapPos, cord) {}, // Hide popup when the map is tapped.
|
||||
),
|
||||
children: [
|
||||
const BaseLayer(),
|
||||
MarkerLayer(
|
||||
markers: gpsData.map((i) {
|
||||
return Marker(
|
||||
width: 30.0, // Fixed width
|
||||
height: 30.0, // Fixed height
|
||||
point: LatLng(i.lat, i.lon),
|
||||
child: getMarkerShape(i),
|
||||
alignment: Alignment.center);
|
||||
}).toList(),
|
||||
),
|
||||
// MarkerLayer(
|
||||
// markers: gpsData.map((i) {
|
||||
// return Marker(
|
||||
// alignment: Alignment.center,
|
||||
// height: 32.0,
|
||||
// width: 120.0,
|
||||
// point: LatLng(i.lat, i.lon),
|
||||
// child: getMarkerShape(i));
|
||||
// }).toList(),
|
||||
// )
|
||||
],
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
||||
153
lib/pages/history/history_page.dart
Normal file
@ -0,0 +1,153 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/utils/database_helper.dart';
|
||||
|
||||
class HistoryPage extends StatefulWidget {
|
||||
const HistoryPage({super.key});
|
||||
|
||||
@override
|
||||
State<HistoryPage> createState() => _HistoryPageState();
|
||||
}
|
||||
|
||||
class _HistoryPageState extends State<HistoryPage> {
|
||||
DatabaseHelper db = DatabaseHelper.instance;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text("通過履歴"),
|
||||
),
|
||||
body: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
FutureBuilder(
|
||||
// 要検討:スナップショットのエラーハンドリングが行われていますが、具体的なエラーメッセージを表示するようにすることをお勧めします。
|
||||
//
|
||||
future: db.getDestinations(),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<List<Destination>> snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
if (snapshot.hasError) {
|
||||
return Center(
|
||||
child: Text(
|
||||
'${snapshot.error} occurred',
|
||||
style: const TextStyle(fontSize: 18),
|
||||
),
|
||||
);
|
||||
} else if (snapshot.hasData) {
|
||||
final dests = snapshot.data;
|
||||
if (dests!.isNotEmpty) {
|
||||
debugPrint("----- history -----");
|
||||
return SizedBox(
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: MediaQuery.of(context).size.height,
|
||||
child: ListView.builder(
|
||||
itemCount: dests.length,
|
||||
itemBuilder: (ctx, index) {
|
||||
//print("--- photo ${dests[index].checkin_image!} ----");
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: CustomWidget(
|
||||
// 要検討:画像のサイズがハードコードされています。画像のサイズを動的に設定できるようにすることを検討してください。
|
||||
title: dests[index].name!,
|
||||
subtitle:
|
||||
"${dests[index].sub_loc_id} : ${dests[index].name}",
|
||||
image1: dests[index].checkin_image != null
|
||||
? Image.file(
|
||||
File(dests[index].checkin_image!))
|
||||
: null,
|
||||
image2:
|
||||
dests[index].buypoint_image != null
|
||||
? Image.file(File(
|
||||
dests[index].buypoint_image!))
|
||||
: null,
|
||||
),
|
||||
);
|
||||
}));
|
||||
} else {
|
||||
return const Center(child: Text("No checkin yet"));
|
||||
}
|
||||
}
|
||||
} else if (snapshot.connectionState ==
|
||||
ConnectionState.waiting) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
return Container();
|
||||
}),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class CustomWidget extends StatelessWidget {
|
||||
final Image? image1;
|
||||
final Image? image2;
|
||||
final String title;
|
||||
final String subtitle;
|
||||
|
||||
const CustomWidget({
|
||||
super.key,
|
||||
this.image1,
|
||||
this.image2,
|
||||
required this.title,
|
||||
required this.subtitle,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(
|
||||
width:
|
||||
104, // 50 (width of each image) + 2 (space between images) + 2*1 (padding on both sides)
|
||||
child: Row(
|
||||
children: [
|
||||
if (image1 != null)
|
||||
SizedBox(
|
||||
width: 50,
|
||||
height: 100,
|
||||
child: image1,
|
||||
),
|
||||
if (image1 != null && image2 != null) const SizedBox(width: 2),
|
||||
if (image2 != null)
|
||||
SizedBox(
|
||||
width: 50,
|
||||
height: 100,
|
||||
child: image2,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
title,
|
||||
style:
|
||||
const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
||||
maxLines:
|
||||
null, // Allows the text to wrap onto an unlimited number of lines
|
||||
),
|
||||
Text(
|
||||
subtitle,
|
||||
style: const TextStyle(fontSize: 16),
|
||||
maxLines:
|
||||
null, // Allows the text to wrap onto an unlimited number of lines
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -2,7 +2,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/search/search_page.dart';
|
||||
|
||||
// 要検討:SearchPageへのナビゲーションにNavigator.pushを使用していますが、一貫性のためにGet.toやGet.toNamedを使用することを検討してください。
|
||||
//
|
||||
class HomePage extends GetView{
|
||||
const HomePage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@ -1,12 +1,13 @@
|
||||
|
||||
import 'package:flutter_map/plugin_api.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/utils/location_controller.dart';
|
||||
|
||||
class IndexBinding extends Bindings {
|
||||
@override
|
||||
void dependencies() {
|
||||
Get.put<IndexController>(IndexController());
|
||||
Get.put<LocationController>(LocationController());
|
||||
Get.put<DestinationController>(DestinationController());
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,26 +4,22 @@ import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:flutter_map/plugin_api.dart';
|
||||
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
|
||||
import 'package:geojson/geojson.dart';
|
||||
import 'package:geojson_vi/geojson_vi.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/pages/destination/destination_binding.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/destination/destination_page.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/services/action_service.dart';
|
||||
import 'package:rogapp/services/auth_service.dart';
|
||||
import 'package:rogapp/services/cat_service.dart';
|
||||
import 'package:rogapp/services/location_service.dart';
|
||||
import 'package:rogapp/services/perfecture_service.dart';
|
||||
import 'package:rogapp/utils/database_helper.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
|
||||
class IndexController extends GetxController {
|
||||
List<GeoJsonFeatureCollection> locations = <GeoJsonFeatureCollection>[].obs;
|
||||
List<GeoJsonFeature> currentFeature = <GeoJsonFeature>[].obs;
|
||||
List<GeoJSONFeatureCollection> locations = <GeoJSONFeatureCollection>[].obs;
|
||||
List<GeoJSONFeature> currentFeature = <GeoJSONFeature>[].obs;
|
||||
List<Destination> currentDestinationFeature = <Destination>[].obs;
|
||||
List<dynamic> perfectures = <dynamic>[].obs;
|
||||
List<LatLngBounds> currentBound = <LatLngBounds>[].obs;
|
||||
@ -39,127 +35,121 @@ class IndexController extends GetxController {
|
||||
List<PointLatLng> routePoints = <PointLatLng>[].obs;
|
||||
var routePointLenght = 0.obs;
|
||||
|
||||
var is_loading = false.obs;
|
||||
double currentLat = 0.0, currentLon = 0.0;
|
||||
|
||||
var is_mapController_loaded = false.obs;
|
||||
var is_rog_mapcontroller_loaded = false.obs;
|
||||
var isLoading = false.obs;
|
||||
|
||||
var is_custom_area_selected = false.obs;
|
||||
var isRogMapcontrollerLoaded = false.obs;
|
||||
|
||||
var isCustomAreaSelected = false.obs;
|
||||
|
||||
RxBool isMapControllerReady = RxBool(false); // MapControllerの初期化状態を管理するフラグ
|
||||
//final mapControllerReadyStream = Stream<bool>.value(false); // MapControllerの初期化状態を通知するためのストリーム
|
||||
|
||||
MapController mapController = MapController();
|
||||
MapController rogMapController = MapController();
|
||||
|
||||
String? userToken;
|
||||
|
||||
// mode = 0 is map mode, mode = 1 list mode
|
||||
var mode = 0.obs;
|
||||
|
||||
// master mode, rog or selection
|
||||
var rog_mode = 1.obs;
|
||||
var rogMode = 1.obs;
|
||||
|
||||
var desination_mode = 1.obs;
|
||||
var desinationMode = 1.obs;
|
||||
|
||||
bool showPopup = true;
|
||||
|
||||
|
||||
String dropdownValue = "9";
|
||||
String subDropdownValue = "-1";
|
||||
String areaDropdownValue = "-1";
|
||||
String cateogory = "-all-";
|
||||
|
||||
late Worker _ever;
|
||||
|
||||
ConnectivityResult connectionStatus = ConnectivityResult.none;
|
||||
var connectionStatusName = "".obs;
|
||||
final Connectivity _connectivity = Connectivity();
|
||||
late StreamSubscription<ConnectivityResult> _connectivitySubscription;
|
||||
|
||||
void toggleMode(){
|
||||
if(mode.value==0){
|
||||
void toggleMode() {
|
||||
if (mode.value == 0) {
|
||||
mode += 1;
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
mode -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void toggleDestinationMode(){
|
||||
if(desination_mode.value==0){
|
||||
desination_mode.value += 1;
|
||||
}
|
||||
else{
|
||||
desination_mode.value -= 1;
|
||||
void toggleDestinationMode() {
|
||||
if (desinationMode.value == 0) {
|
||||
desinationMode.value += 1;
|
||||
} else {
|
||||
desinationMode.value -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
void switchPage(String page){
|
||||
//print("######## ${currentUser[0]["user"]["id"]}");
|
||||
void switchPage(String page) {
|
||||
////print("######## ${currentUser[0]["user"]["id"]}");
|
||||
switch (page) {
|
||||
case AppPages.INITIAL :{
|
||||
rog_mode.value = 0;
|
||||
print("-- rog mode is ctrl is ${rog_mode.value}");
|
||||
case AppPages.INDEX:
|
||||
{
|
||||
rogMode.value = 0;
|
||||
//print("-- rog mode is ctrl is ${rog_mode.value}");
|
||||
Get.toNamed(page);
|
||||
}
|
||||
break;
|
||||
case AppPages.TRAVEL : {
|
||||
rog_mode.value = 1;
|
||||
case AppPages.TRAVEL:
|
||||
{
|
||||
rogMode.value = 1;
|
||||
//Get.back();
|
||||
Get.off(DestnationPage(), binding: DestinationBinding());
|
||||
|
||||
//Get.off(DestnationPage(), binding: DestinationBinding());
|
||||
}
|
||||
break;
|
||||
case AppPages.LOGIN :{
|
||||
rog_mode.value = 2;
|
||||
case AppPages.LOGIN:
|
||||
{
|
||||
rogMode.value = 2;
|
||||
Get.toNamed(page);
|
||||
}
|
||||
break;
|
||||
default:{
|
||||
rog_mode.value = 0;
|
||||
Get.toNamed(AppPages.INITIAL);
|
||||
default:
|
||||
{
|
||||
rogMode.value = 1;
|
||||
Get.toNamed(AppPages.INDEX);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
_ever = ever(rog_mode, (_) => print("$_ has been changed (ever)"));
|
||||
|
||||
if(perfectures.length == 0){
|
||||
PerfectureService.loadPerfectures().then((value){
|
||||
perfectures.add(value);
|
||||
loadAreaFor("9");
|
||||
|
||||
//loadSubPerfFor("9");
|
||||
});
|
||||
_connectivitySubscription =
|
||||
_connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
_connectivitySubscription = _connectivity.onConnectivityChanged.listen(_updateConnectionStatus);
|
||||
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
@override
|
||||
void onClose() {
|
||||
_connectivitySubscription.cancel();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _updateConnectionStatus(ConnectivityResult result) async {
|
||||
Future<void> _updateConnectionStatus(ConnectivityResult result) async {
|
||||
connectionStatus = result;
|
||||
connectionStatusName.value = result.name;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> initConnectivity() async {
|
||||
Future<void> initConnectivity() async {
|
||||
late ConnectivityResult result;
|
||||
// Platform messages may fail, so we use a try/catch PlatformException.
|
||||
try {
|
||||
result = await _connectivity.checkConnectivity();
|
||||
} on PlatformException catch (e) {
|
||||
print('Couldn\'t check connectivity status --- $e');
|
||||
} on PlatformException catch (_) {
|
||||
//print('Couldn\'t check connectivity status --- $e');
|
||||
return;
|
||||
}
|
||||
|
||||
return _updateConnectionStatus(result);
|
||||
}
|
||||
|
||||
LatLngBounds boundsFromLatLngList(List<LatLng> list) {
|
||||
LatLngBounds boundsFromLatLngList(List<LatLng> list) {
|
||||
double? x0, x1, y0, y1;
|
||||
for (LatLng latLng in list) {
|
||||
if (x0 == null || x1 == null || y0 == null || y1 == null) {
|
||||
@ -174,126 +164,94 @@ LatLngBounds boundsFromLatLngList(List<LatLng> list) {
|
||||
}
|
||||
|
||||
return LatLngBounds(LatLng(x1!, y1!), LatLng(x0!, y0!));
|
||||
}
|
||||
|
||||
|
||||
List<LatLng> getLocationsList(){
|
||||
List<LatLng> locs = [];
|
||||
for(int i=0; i<= locations[0].collection.length - 1; i++){
|
||||
GeoJsonMultiPoint p = locations[0].collection[i].geometry as GeoJsonMultiPoint;
|
||||
|
||||
LatLng latLng = LatLng(p.geoSerie!.geoPoints[0].latitude, p.geoSerie!.geoPoints[0].longitude);
|
||||
locs.add(latLng);
|
||||
}
|
||||
return locs;
|
||||
}
|
||||
|
||||
|
||||
void login(String email, String password, BuildContext context){
|
||||
AuthService.login(email, password).then((value){
|
||||
print("------- logged in user details ######## ${value} ###### --------");
|
||||
if(value.isNotEmpty){
|
||||
currentUser.clear();
|
||||
currentUser.add(value);
|
||||
is_loading.value = false;
|
||||
Navigator.pop(context);
|
||||
loadUserDetails();
|
||||
loadLocationsBound();
|
||||
cats.clear();
|
||||
if(currentFeature.isNotEmpty){
|
||||
getAction();
|
||||
}
|
||||
|
||||
if(currentUser.length > 0){
|
||||
rog_mode.value = 0 ;
|
||||
}
|
||||
else{
|
||||
rog_mode.value = 1;
|
||||
}
|
||||
|
||||
if(rog_mode.value == 1){
|
||||
switchPage(AppPages.TRAVEL);
|
||||
}
|
||||
else{
|
||||
switchPage(AppPages.INITIAL);
|
||||
}
|
||||
//Get.toNamed(AppPages.INITIAL);
|
||||
}else{
|
||||
is_loading.value = false;
|
||||
// 要検討:エラーハンドリングが行われていますが、エラーメッセージをローカライズすることを検討してください。
|
||||
//
|
||||
void login(String email, String password, BuildContext context) {
|
||||
AuthService.login(email, password).then((value) {
|
||||
print("------- logged in user details ######## $value ###### --------");
|
||||
if (value.isNotEmpty) {
|
||||
// Navigator.pop(context);
|
||||
print("--------- user details login ----- $value");
|
||||
//await Future.delayed(const Duration(milliseconds: 500)); // Added Akira:2024-4-6, #2800
|
||||
changeUser(value);
|
||||
} else {
|
||||
isLoading.value = false;
|
||||
Get.snackbar(
|
||||
"Failed",
|
||||
"User login failed, please try again.",
|
||||
icon: Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
"ログイン失敗",
|
||||
"ログインIDかパスワードを確認して下さい。",
|
||||
icon: const Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(seconds: 3),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
void changePassword(String oldpassword, String newpassword, BuildContext context){
|
||||
String _token = currentUser[0]['token'];
|
||||
//print("------- change password ######## ${currentUser[0]['token']} ###### --------");
|
||||
AuthService.changePassword(oldpassword, newpassword, _token).then((value){
|
||||
print("------- change password ######## ${value} ###### --------");
|
||||
if(value.isNotEmpty){
|
||||
is_loading.value = false;
|
||||
// 要検討:エラーハンドリングが行われていますが、エラーメッセージをローカライズすることを検討してください。
|
||||
//
|
||||
void changePassword(
|
||||
String oldpassword, String newpassword, BuildContext context) {
|
||||
String token = currentUser[0]['token'];
|
||||
////print("------- change password ######## ${currentUser[0]['token']} ###### --------");
|
||||
AuthService.changePassword(oldpassword, newpassword, token).then((value) {
|
||||
////print("------- change password ######## $value ###### --------");
|
||||
if (value.isNotEmpty) {
|
||||
isLoading.value = false;
|
||||
Navigator.pop(context);
|
||||
if(rog_mode.value == 1){
|
||||
if (rogMode.value == 1) {
|
||||
switchPage(AppPages.TRAVEL);
|
||||
} else {
|
||||
switchPage(AppPages.INDEX);
|
||||
}
|
||||
else{
|
||||
switchPage(AppPages.INITIAL);
|
||||
}
|
||||
}else{
|
||||
} else {
|
||||
Get.snackbar(
|
||||
'failed'.tr,
|
||||
'password_change_failed_please_try_again'.tr,
|
||||
icon: Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
}
|
||||
|
||||
});
|
||||
is_loading.value = false;
|
||||
isLoading.value = false;
|
||||
}
|
||||
|
||||
void logout() async{
|
||||
void logout() async {
|
||||
locations.clear();
|
||||
DatabaseHelper db = DatabaseHelper.instance;
|
||||
db.deleteAllDestinations().then((value){
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
if(destinationController != null){
|
||||
destinationController.PopulateDestinations();
|
||||
}
|
||||
db.deleteAllDestinations().then((value) {
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
destinationController.populateDestinations();
|
||||
});
|
||||
currentUser.clear();
|
||||
cats.clear();
|
||||
}
|
||||
|
||||
void register(String email, String password, BuildContext context){
|
||||
AuthService.register(email, password).then((value){
|
||||
if(value.isNotEmpty){
|
||||
// 要検討:エラーハンドリングが行われていますが、エラーメッセージをローカライズすることを検討してください。
|
||||
//
|
||||
void register(String email, String password, BuildContext context) {
|
||||
AuthService.register(email, password).then((value) {
|
||||
if (value.isNotEmpty) {
|
||||
currentUser.clear();
|
||||
currentUser.add(value);
|
||||
is_loading.value = false;
|
||||
isLoading.value = false;
|
||||
Navigator.pop(context);
|
||||
loadUserDetails();
|
||||
Get.toNamed(AppPages.INITIAL);
|
||||
}else{
|
||||
is_loading.value = false;
|
||||
Get.toNamed(AppPages.INDEX);
|
||||
} else {
|
||||
isLoading.value = false;
|
||||
Get.snackbar(
|
||||
'failed'.tr,
|
||||
'user_registration_failed_please_try_again'.tr,
|
||||
icon: Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(Icons.error, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
@ -301,384 +259,223 @@ void login(String email, String password, BuildContext context){
|
||||
});
|
||||
}
|
||||
|
||||
void makeAction(BuildContext context){
|
||||
int user_id = currentUser[0]["user"]["id"] as int;
|
||||
int location_id = currentFeature[0].properties!["location_id"] as int;
|
||||
bool wanttogo = currentAction[0][0]["wanttogo"];
|
||||
bool like = currentAction[0][0]["like"];
|
||||
bool checkin = currentAction[0][0]["checkin"];
|
||||
if(user_id > 0){
|
||||
ActionService.makeAction(user_id, location_id, wanttogo, like, checkin).then((value){
|
||||
});
|
||||
void saveToDevice(String val) async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString("user_token", val);
|
||||
print("saveToDevice: ${val}");
|
||||
}
|
||||
|
||||
void changeUser(Map<String, dynamic> value, {bool replace = true}) {
|
||||
print("---- change user to $value -----");
|
||||
currentUser.clear();
|
||||
currentUser.add(value);
|
||||
if (replace) {
|
||||
saveToDevice(currentUser[0]["token"]);
|
||||
}
|
||||
|
||||
String getCatText(){
|
||||
String _cat = 'all'.tr;
|
||||
if(currentUser.length > 0){
|
||||
Map<String, dynamic> _urs = currentUser[0];
|
||||
print('-- is_rogaining :-- ${_urs['user']['is_rogaining']} ------');
|
||||
if(_urs['user']['is_rogaining'] == true){
|
||||
_cat = 'rogaining'.tr;
|
||||
}
|
||||
else {
|
||||
_cat = 'sight_seeing'.tr;
|
||||
}
|
||||
}
|
||||
return _cat;
|
||||
}
|
||||
|
||||
void loadCatsv2(){
|
||||
dynamic initVal = {'category':getCatText()};
|
||||
LatLngBounds bounds = mapController!.bounds!;
|
||||
if(bounds.southEast != null && bounds.southWest != null && bounds.northEast != null && bounds.southEast != null ){
|
||||
CatService.loadCats(bounds.southWest!.latitude, bounds.southWest!.longitude, bounds.northWest.latitude, bounds.northWest.longitude, bounds.northEast!.latitude, bounds.northEast!.longitude, bounds.southEast.latitude, bounds.southEast.longitude).then((value) {
|
||||
cats.clear();
|
||||
cats.add(initVal);
|
||||
for(dynamic cat in value!){
|
||||
if(cat['category'] != null){
|
||||
cats.add(cat!);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void loadCatForCity(String city){
|
||||
dynamic initVal = {'category':getCatText()};
|
||||
LatLngBounds bounds = mapController!.bounds!;
|
||||
if(bounds.southEast != null && bounds.southWest != null && bounds.northEast != null && bounds.southEast != null ){
|
||||
CatService.loadCatByCity(city).then((value) {
|
||||
cats.clear();
|
||||
cats.add(initVal);
|
||||
for(dynamic cat in value!){
|
||||
if(cat['category'] != null){
|
||||
cats.add(cat!);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void refreshLocationForCat(){
|
||||
isLoading.value = false;
|
||||
loadLocationsBound();
|
||||
// if(subDropdownValue == "-1"){
|
||||
// LocationService.loadLocationsFor(dropdownValue, currentCat[0]).then((value){
|
||||
// locations.clear();
|
||||
// locations.add(value!);
|
||||
// is_loading.value = false;
|
||||
// });
|
||||
// print("loading main------");
|
||||
// }
|
||||
// else{
|
||||
// LocationService.loadLocationsSubFor(subDropdownValue, currentCat[0]).then((value){
|
||||
// locations.clear();
|
||||
// locations.add(value!);
|
||||
// is_loading.value = false;
|
||||
// });
|
||||
// print("loading sub------");
|
||||
// }
|
||||
if (currentUser.isNotEmpty) {
|
||||
rogMode.value = 0;
|
||||
} else {
|
||||
rogMode.value = 1;
|
||||
}
|
||||
print('--- c rog mode --- ${rogMode.value}');
|
||||
Get.toNamed(AppPages.INDEX);
|
||||
}
|
||||
|
||||
void loadAreaFor(String perf){
|
||||
areas.clear();
|
||||
dynamic initVal = {'id':'-1', 'area_nm':'----'};
|
||||
PerfectureService.loadGifuAreas(perf).then((value){
|
||||
value!.add(initVal);
|
||||
areas.add(value);
|
||||
loadUserDetailsForToken(String token) async {
|
||||
AuthService.userForToken(token).then((value) {
|
||||
print("----token val-- $value ------");
|
||||
if (value![0]["user"].isEmpty) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
return;
|
||||
}
|
||||
changeUser(value[0], replace: false);
|
||||
});
|
||||
}
|
||||
|
||||
void loadUserDetails(){
|
||||
if(currentUser.length > 0){
|
||||
int user_id = currentUser[0]["user"]["id"] as int;
|
||||
AuthService.UserDetails(user_id).then((value){
|
||||
print("--------- user details ----- ${value}");
|
||||
if(value != null && value.isNotEmpty){
|
||||
bool paid = value![0]["paid"] as bool;
|
||||
if(paid){
|
||||
loadCustomAreas();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void loadCustomAreas(){
|
||||
customAreas.clear();
|
||||
PerfectureService.loadCustomAreas().then((value){
|
||||
print("--- loading custom areas ${value}");
|
||||
customAreas.add(value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void loadSubPerfFor(String perf){
|
||||
subPerfs.clear();
|
||||
dynamic initVal = {'id':'-1', 'adm2_ja':'----'};
|
||||
PerfectureService.loadSubPerfectures(perf).then((value){
|
||||
value!.add(initVal);
|
||||
subPerfs.add(value);
|
||||
subDropdownValue = getSubInitialVal();
|
||||
});
|
||||
}
|
||||
|
||||
String getSubInitialVal(){
|
||||
int min = 0;
|
||||
if(subPerfs.length > 0){
|
||||
min = int.parse(subPerfs[0][0]['id'].toString());
|
||||
for(var sub in subPerfs[0]){
|
||||
int x = int.parse(sub['id'].toString()); // as int;
|
||||
if(x < min){
|
||||
min = x;
|
||||
}
|
||||
}
|
||||
}
|
||||
return min.toString();
|
||||
}
|
||||
|
||||
void loadLocationforPerf(String perf, MapController mapController) async {
|
||||
String cat = currentCat.isNotEmpty == true ? currentCat[0] : "";
|
||||
print(currentCat);
|
||||
// LocationService.loadLocationsFor(perf, cat).then((value){
|
||||
// locations.clear();
|
||||
// locations.add(value!);
|
||||
// mapController.fitBounds(currentBound[0]);
|
||||
// });
|
||||
locations.clear();
|
||||
mapController.fitBounds(currentBound[0]);
|
||||
}
|
||||
|
||||
void loadLocationforSubPerf(String subperf, MapController mapController) async {
|
||||
String cat = currentCat.isNotEmpty == true ? currentCat[0] : "";
|
||||
if(currentCat.isNotEmpty && currentCat[0] == "-all-"){
|
||||
cat = "";
|
||||
}
|
||||
LocationService.loadLocationsSubFor(subperf, cat).then((value){
|
||||
locations.clear();
|
||||
locations.add(value!);
|
||||
});
|
||||
}
|
||||
|
||||
void loadCustomLocation(String customarea) async {
|
||||
String cat = currentCat.isNotEmpty == true ? currentCat[0] : "";
|
||||
if(currentCat.isNotEmpty && currentCat[0] == "-all-"){
|
||||
cat = "";
|
||||
}
|
||||
print("----- ${customarea}");
|
||||
LocationService.loadCustomLocations(customarea, cat).then((value){
|
||||
locations.clear();
|
||||
locations.add(value!);
|
||||
List<LatLng> locs = getLocationsList();
|
||||
LatLngBounds bounds = boundsFromLatLngList(locs);
|
||||
mapController!.fitBounds(bounds);
|
||||
setBound(bounds);
|
||||
Future.delayed(Duration(microseconds: 400), () {
|
||||
mapController!.fitBounds(bounds);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
void loadLocationsBound(){
|
||||
if(is_custom_area_selected.value == true){
|
||||
/* Old code
|
||||
void loadLocationsBound() {
|
||||
if (isCustomAreaSelected.value == true) {
|
||||
return;
|
||||
}
|
||||
locations.clear();
|
||||
String cat = currentCat.isNotEmpty ? currentCat[0] : "";
|
||||
if(currentCat.isNotEmpty && currentCat[0] == "-all-"){
|
||||
if (currentCat.isNotEmpty && currentCat[0] == "-all-") {
|
||||
cat = "";
|
||||
}
|
||||
LatLngBounds bounds = mapController!.bounds!;
|
||||
LatLngBounds bounds = mapController.bounds!;
|
||||
currentBound.clear();
|
||||
currentBound.add(bounds);
|
||||
//print(currentCat);
|
||||
if(bounds.southEast != null && bounds.southWest != null && bounds.northEast != null && bounds.southEast != null ){
|
||||
LocationService.loadLocationsBound(bounds.southWest!.latitude, bounds.southWest!.longitude, bounds.northWest.latitude, bounds.northWest.longitude, bounds.northEast!.latitude, bounds.northEast!.longitude, bounds.southEast.latitude, bounds.southEast.longitude, cat).then((value){
|
||||
//print("---value length ------ ${value!.collection.length}");
|
||||
if(value == null){
|
||||
////print(currentCat);
|
||||
LocationService.loadLocationsBound(
|
||||
bounds.southWest.latitude,
|
||||
bounds.southWest.longitude,
|
||||
bounds.northWest.latitude,
|
||||
bounds.northWest.longitude,
|
||||
bounds.northEast.latitude,
|
||||
bounds.northEast.longitude,
|
||||
bounds.southEast.latitude,
|
||||
bounds.southEast.longitude,
|
||||
cat)
|
||||
.then((value) {
|
||||
////print("---value length ------ ${value!.collection.length}");
|
||||
if (value == null) {
|
||||
return;
|
||||
}
|
||||
if(value != null && value.collection.isEmpty){
|
||||
if(showPopup == false) {
|
||||
if (value.features.isEmpty) {
|
||||
if (showPopup == false) {
|
||||
return;
|
||||
}
|
||||
Get.snackbar(
|
||||
"Too many Points",
|
||||
"please zoom in",
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(Icons.assistant_photo_outlined,
|
||||
size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(seconds: 2),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
showPopup = false;
|
||||
//Get.showSnackbar(GetSnackBar(message: "Too many points, please zoom in",));
|
||||
}
|
||||
if(value != null && value.collection.isNotEmpty){
|
||||
//print("---- added---");
|
||||
if (value.features.isNotEmpty) {
|
||||
////print("---- added---");
|
||||
locations.add(value);
|
||||
loadCatsv2();
|
||||
}
|
||||
});
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// 2024-04-03 Akira .. Update the code . See ticket 2800.
|
||||
//
|
||||
// 2024-4-8 Akira : See 2809
|
||||
// IndexControllerクラスでは、Future.delayedの呼び出しをunawaitedで囲んで、非同期処理の結果を待たずに先に進むようにしました。これにより、メモリリークを防ぐことができます
|
||||
//
|
||||
// 要検討:Future.delayedを使用して非同期処理を待たずに先に進むようにしていますが、これによってメモリリークが発生する可能性があります。非同期処理の結果を適切に処理することを検討してください。
|
||||
//
|
||||
void loadLocationsBound() async {
|
||||
if (isCustomAreaSelected.value == true) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Akira 追加:2024-4-6 #2800
|
||||
//await waitForMapControllerReady(); // MapControllerの初期化が完了するまで待機
|
||||
// Akira 追加:2024-4-6 #2800
|
||||
// ==> remove 2024-4-8
|
||||
|
||||
locations.clear();
|
||||
String cat = currentCat.isNotEmpty ? currentCat[0] : "";
|
||||
if (currentCat.isNotEmpty && currentCat[0] == "-all-") {
|
||||
cat = "";
|
||||
}
|
||||
/*
|
||||
// Akira Add 2024-4-6
|
||||
if( mapController.controller == null ) {
|
||||
print("操作が完了する前にMapControllerまたはウィジェットが破棄されました。");
|
||||
isLoading.value = true; // ローディング状態をtrueに設定
|
||||
return;
|
||||
}
|
||||
//
|
||||
*/
|
||||
|
||||
LatLngBounds bounds = mapController.bounds!;
|
||||
currentBound.clear();
|
||||
currentBound.add(bounds);
|
||||
|
||||
isLoading.value = true; // ローディング状態をtrueに設定
|
||||
|
||||
// unawaited( Future.delayed(const Duration(seconds: 1), () async {
|
||||
// remove
|
||||
|
||||
//print("bounds --- (${bounds.southWest.latitude},${bounds.southWest.longitude}),(${bounds.northWest.latitude},${bounds.northWest.longitude}),(${bounds.northEast.latitude},${bounds.northEast.longitude}),(${bounds.southEast.latitude},${bounds.southEast.longitude})");
|
||||
|
||||
// 要検討:APIからのレスポンスがnullの場合のエラーハンドリングが不十分です。適切なエラーメッセージを表示するなどの処理を追加してください。
|
||||
try {
|
||||
final value = await LocationService.loadLocationsBound(
|
||||
bounds.southWest.latitude,
|
||||
bounds.southWest.longitude,
|
||||
bounds.northWest.latitude,
|
||||
bounds.northWest.longitude,
|
||||
bounds.northEast.latitude,
|
||||
bounds.northEast.longitude,
|
||||
bounds.southEast.latitude,
|
||||
bounds.southEast.longitude,
|
||||
cat
|
||||
);
|
||||
if (value == null) {
|
||||
// APIからのレスポンスがnullの場合
|
||||
print("LocationService.loadLocationsBound からの回答がnullのため、マップをリロード");
|
||||
DestinationController destinationController = Get.find<DestinationController>(); // 追加
|
||||
final tk = currentUser[0]["token"]; // 追加
|
||||
if (tk != null) { // 追加
|
||||
destinationController.fixMapBound(tk); // 追加
|
||||
} // 追加
|
||||
return;
|
||||
}
|
||||
isLoading.value = false; // ローディング状態をfalseに設定
|
||||
|
||||
if (value != null && value.features.isEmpty) {
|
||||
if (showPopup == false) {
|
||||
return;
|
||||
}
|
||||
Get.snackbar(
|
||||
"Too many Points",
|
||||
"please zoom in",
|
||||
icon: const Icon(
|
||||
Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: const Duration(seconds: 3),
|
||||
backgroundColor: Colors.yellow,
|
||||
);
|
||||
showPopup = false;
|
||||
}
|
||||
if (value != null && value.features.isNotEmpty) {
|
||||
locations.add(value);
|
||||
}
|
||||
} catch ( e) {
|
||||
print("Error in loadLocationsBound: $e");
|
||||
// エラーが発生した場合のリトライ処理や適切なエラーメッセージの表示を行う
|
||||
// 例えば、一定時間後に再度loadLocationsBound()を呼び出すなど
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void setBound(LatLngBounds bounds){
|
||||
|
||||
//===Akira 追加:2024-4-6 #2800
|
||||
// 要検討:MapControllerの初期化が完了するまで待機していますが、タイムアウトを設定することを検討してください。
|
||||
// 初期化に時間がかかりすぎる場合、ユーザーにわかりやすいメッセージを表示するようにしてください。
|
||||
//
|
||||
Future<void> waitForMapControllerReady() async {
|
||||
if (!isMapControllerReady.value) {
|
||||
await Future.doWhile(() async {
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
return !isMapControllerReady.value;
|
||||
});
|
||||
}
|
||||
}
|
||||
//===Akira 追加:2024-4-6 #2800
|
||||
|
||||
void setBound(LatLngBounds bounds) {
|
||||
currentBound.clear();
|
||||
currentBound.add(bounds);
|
||||
}
|
||||
|
||||
void zoomtoMainPerf(String id){
|
||||
GeoJSONFeature? getFeatureForLatLong(double lat, double long) {
|
||||
if (locations.isNotEmpty) {
|
||||
GeoJSONFeature? foundFeature;
|
||||
|
||||
PerfectureService.getMainPerfExt(id).then((value){
|
||||
LatLng lat1 = LatLng(value![1], value[0]);
|
||||
LatLng lat2 = LatLng(value[3], value[2]);
|
||||
LatLngBounds bound = LatLngBounds(lat1, lat2);
|
||||
mapController!.fitBounds(bound);
|
||||
setBound(bound);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
void zoomtoSubPerf(String id){
|
||||
|
||||
print("zooooom");
|
||||
|
||||
PerfectureService.getSubExt(id).then((value){
|
||||
LatLng lat1 = LatLng(value![1], value[0]);
|
||||
LatLng lat2 = LatLng(value[3], value[2]);
|
||||
LatLngBounds bound = LatLngBounds(lat1, lat2);
|
||||
mapController!.fitBounds(bound);
|
||||
setBound(bound);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
void populateForPerf(String perf, MapController mapController){
|
||||
loadSubPerfFor(perf);
|
||||
loadLocationforPerf(perf, mapController);
|
||||
zoomtoMainPerf(perf);
|
||||
is_loading.value = false;
|
||||
}
|
||||
|
||||
void populateForSubPerf(String subperf, MapController mapController){
|
||||
//subDropdownValue = subperf;
|
||||
loadLocationforSubPerf(subperf, mapController);
|
||||
zoomtoSubPerf(subperf);
|
||||
is_loading.value = false;
|
||||
}
|
||||
|
||||
void populateSubPerForArea(String area, MapController mapController){
|
||||
loadSubPerfFor(area);
|
||||
//loadCustomLocation("cus", mapController);
|
||||
//zoomtoSubPerf(subperf);
|
||||
is_loading.value = false;
|
||||
}
|
||||
|
||||
|
||||
GeoJsonFeature? getFeatureForLatLong(double lat, double long){
|
||||
if(locations.length > 0){
|
||||
for(GeoJsonFeature i in locations[0].collection){
|
||||
GeoJsonMultiPoint p = i.geometry as GeoJsonMultiPoint;
|
||||
if(p.geoSerie!.geoPoints[0].latitude == lat && p.geoSerie!.geoPoints[0].longitude == long){
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void getAction(){
|
||||
//print(currentUser[0]["user"]["id"]);
|
||||
//print(currentFeature[0].properties!["location_id"]);
|
||||
if(currentUser.length == 0){
|
||||
return;
|
||||
}
|
||||
int user_id = currentUser[0]["user"]["id"] as int;
|
||||
print("---- loc id ${currentFeature[0].properties}");
|
||||
int location_id = currentFeature[0].properties!["location_id"] as int;
|
||||
ActionService.userAction(user_id, location_id).then((value){
|
||||
print("------${value}");
|
||||
if(value != null && value.length > 0){
|
||||
currentAction.clear();
|
||||
currentAction.add(value);
|
||||
print("------${currentAction[0]}");
|
||||
}else{
|
||||
List<dynamic> initval = [{"user": user_id, "location": location_id, "wanttogo": false, "like": false, "checkin": false}];
|
||||
currentAction.clear();
|
||||
currentAction.add(initval);
|
||||
locations[0].features.forEach((i) {
|
||||
GeoJSONMultiPoint p = i!.geometry as GeoJSONMultiPoint;
|
||||
if (p.coordinates[0][1] == lat && p.coordinates[0][0] == long) {
|
||||
foundFeature = i;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void makeNext(GeoJsonFeature fs){
|
||||
|
||||
if(rog_mode == 1){
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
return foundFeature;
|
||||
}
|
||||
else {
|
||||
GeoJsonFeature<GeoJsonMultiPoint> pt = fs as GeoJsonFeature<GeoJsonMultiPoint>;
|
||||
|
||||
for(int i=0; i<= locations[0].collection.length - 1; i++){
|
||||
GeoJsonMultiPoint p = locations[0].collection[i].geometry as GeoJsonMultiPoint;
|
||||
|
||||
if(p.geoSerie!.geoPoints[0].latitude == pt.geometry!.geoSerie!.geoPoints[0].latitude && p.geoSerie!.geoPoints[0].longitude == pt.geometry!.geoSerie!.geoPoints[0].longitude ){
|
||||
|
||||
if(currentFeature.length > 0){
|
||||
currentFeature.clear();
|
||||
return null;
|
||||
}
|
||||
if(i >= locations[0].collection.length - 1 ){
|
||||
currentFeature.add(locations[0].collection[0] as GeoJsonFeature);
|
||||
getAction();
|
||||
}
|
||||
else{
|
||||
currentFeature.add(locations[0].collection[i + 1] as GeoJsonFeature);
|
||||
getAction();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void makePrevious(GeoJsonFeature fs){
|
||||
|
||||
if(rog_mode == 1){
|
||||
DestinationController destinationController = Get.find<DestinationController>();
|
||||
}
|
||||
else {
|
||||
|
||||
GeoJsonFeature<GeoJsonMultiPoint> pt = fs as GeoJsonFeature<GeoJsonMultiPoint>;
|
||||
|
||||
for(int i=0; i<= locations[0].collection.length - 1; i++){
|
||||
GeoJsonMultiPoint p = locations[0].collection[i].geometry as GeoJsonMultiPoint;
|
||||
|
||||
if(p.geoSerie!.geoPoints[0].latitude == pt.geometry!.geoSerie!.geoPoints[0].latitude && p.geoSerie!.geoPoints[0].longitude == pt.geometry!.geoSerie!.geoPoints[0].longitude ){
|
||||
|
||||
if(currentFeature.length > 0){
|
||||
currentFeature.clear();
|
||||
}
|
||||
if(i == 0 ){
|
||||
currentFeature.add(locations[0].collection[locations[0].collection.length -1] as GeoJsonFeature);
|
||||
getAction();
|
||||
}
|
||||
else{
|
||||
currentFeature.add(locations[0].collection[i - 1] as GeoJsonFeature);
|
||||
getAction();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -1,48 +1,89 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/drawer/drawer_page.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/services/maxtrix_service.dart';
|
||||
import 'package:rogapp/utils/database_helper.dart';
|
||||
import 'package:rogapp/widgets/bread_crum_widget.dart';
|
||||
import 'package:rogapp/widgets/cat_widget.dart';
|
||||
import 'package:rogapp/widgets/list_widget.dart';
|
||||
import 'package:rogapp/widgets/map_widget.dart';
|
||||
import 'package:rogapp/utils/location_controller.dart';
|
||||
|
||||
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
|
||||
// index_page.dartファイルの主な内容です。
|
||||
// このファイルは、アプリのメインページのUIを構築し、各機能へのナビゲーションを提供しています。
|
||||
// また、IndexControllerとDestinationControllerを使用して、状態管理と各種機能の実装を行っています。
|
||||
//
|
||||
// MapWidgetとListWidgetは、それぞれ別のファイルで定義されているウィジェットであり、マップモードとリストモードの表示を担当しています。
|
||||
//
|
||||
// 全体的に、index_page.dartはアプリのメインページの構造を定義し、他のコンポーネントやページへの橋渡しを行っているファイルです。
|
||||
//
|
||||
|
||||
// 要検討:GPSデータの表示アイコンをタップした際のエラーハンドリングを追加することをお勧めします。
|
||||
// MapWidgetとListWidgetの切り替えにObxを使用していますが、パフォーマンスを考慮して、必要な場合にのみウィジェットを再構築するようにしてください。
|
||||
// DestinationControllerのisSimulationModeを使用してGPS信号の強弱をシミュレーションしていますが、本番環境では適切に実際のGPS信号を使用するようにしてください。
|
||||
|
||||
// IndexPageクラスは、GetView<IndexController>を継承したStatelessWidgetです。このクラスは、アプリのメインページを表すウィジェットです。
|
||||
//
|
||||
class IndexPage extends GetView<IndexController> {
|
||||
IndexPage({Key? key}) : super(key: key);
|
||||
|
||||
// IndexControllerとDestinationControllerのインスタンスを取得しています。
|
||||
//
|
||||
final LocationController locationController = Get.find<LocationController>();
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
final DestinationController destinationController = Get.find<DestinationController>();
|
||||
final DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
|
||||
// buildメソッドは、ウィジェットのUIを構築するメソッドです。
|
||||
// ここでは、WillPopScopeウィジェットを使用して、端末の戻るボタンが押された際の動作を制御しています。
|
||||
//
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return WillPopScope(
|
||||
onWillPop: () async {
|
||||
indexController.switchPage(AppPages.INITIAL);
|
||||
return false;
|
||||
},
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
child: Scaffold(
|
||||
//drawer: const DrawerPage(),
|
||||
//
|
||||
// Scaffoldウィジェットを使用して、アプリのメインページのレイアウトを構築しています。
|
||||
//
|
||||
drawer: DrawerPage(),
|
||||
appBar: AppBar(
|
||||
leading: IconButton(
|
||||
icon: Icon(Icons.arrow_back_ios),
|
||||
onPressed: (){
|
||||
indexController.switchPage(AppPages.TRAVEL);
|
||||
},
|
||||
),
|
||||
//automaticallyImplyLeading: false,
|
||||
title: Text("add_location".tr),
|
||||
actions: [
|
||||
// IconButton(
|
||||
// onPressed: () {
|
||||
// DatabaseService ds = DatabaseService();
|
||||
// ds.updateDatabase();
|
||||
// },
|
||||
// icon: const Icon(Icons.ten_k_sharp)),
|
||||
|
||||
//
|
||||
// AppBarには、タイトルとアクションアイコンが含まれています。
|
||||
// アクションアイコンには、GPSデータの表示、履歴の表示、マップの更新、検索などの機能が含まれています。
|
||||
//
|
||||
IconButton(
|
||||
onPressed: () async {
|
||||
// GpsDatabaseHelper db = GpsDatabaseHelper.instance;
|
||||
// List<GpsData> data = await db.getGPSData(
|
||||
// indexController.currentUser[0]["user"]['team_name'],
|
||||
// indexController.currentUser[0]["user"]["event_code"]);
|
||||
// print("GPS data is ${data.length}");
|
||||
Get.toNamed(AppPages.GPS);
|
||||
},
|
||||
icon: const Icon(Icons.telegram)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.HISTORY);
|
||||
},
|
||||
icon: const Icon(Icons.history)),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
final tk = indexController.currentUser[0]["token"];
|
||||
if (tk != null) {
|
||||
destinationController.fixMapBound(tk);
|
||||
}
|
||||
},
|
||||
icon: const Icon(Icons.refresh)),
|
||||
InkWell(
|
||||
onTap: (){
|
||||
onTap: () {
|
||||
Get.toNamed(AppPages.SEARCH);
|
||||
},
|
||||
child: Container(
|
||||
@ -51,128 +92,160 @@ class IndexPage extends GetView<IndexController> {
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.blue,
|
||||
borderRadius: BorderRadius.circular(25),
|
||||
|
||||
),
|
||||
child: const Center(child: Icon(Icons.search),),
|
||||
child: const Center(
|
||||
child: Icon(Icons.search),
|
||||
),
|
||||
),
|
||||
),
|
||||
//CatWidget(indexController: indexController,),
|
||||
],
|
||||
),
|
||||
bottomNavigationBar: BottomAppBar(
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0),
|
||||
child: InkWell(
|
||||
child:
|
||||
Obx(() =>
|
||||
destinationController.is_gps_selected == true ?
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0),
|
||||
child: InkWell(
|
||||
child: Image(image: AssetImage('assets/images/route3_off.png'), width: 35, height: 35,),
|
||||
onTap: (){
|
||||
indexController.switchPage(AppPages.TRAVEL);
|
||||
//
|
||||
// デバッグ時のみリロードボタンの横にGPS信号レベルの設定ボタンを設置し、
|
||||
// タップすることでGPS信号の強弱をシミュレーションできるようにする
|
||||
// Akira 2024-4-5
|
||||
//
|
||||
Obx(() {
|
||||
if (locationController.isSimulationMode) {
|
||||
return DropdownButton<String>(
|
||||
value: locationController.getSimulatedSignalStrength(),
|
||||
onChanged: (value) {
|
||||
//debugPrint("DropDown changed!");
|
||||
locationController.setSimulatedSignalStrength(value!);
|
||||
},
|
||||
),
|
||||
) :
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0),
|
||||
child: InkWell(
|
||||
child: Image(image: AssetImage('assets/images/route2_on.png'),width: 35, height: 35,),
|
||||
onTap: (){
|
||||
indexController.switchPage(AppPages.TRAVEL);
|
||||
items: ['low', 'medium', 'high', 'real']
|
||||
.map<DropdownMenuItem<String>>((String value) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: value,
|
||||
child: Text(value),
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
} else {
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
locationController.setSimulatedSignalStrength('high');
|
||||
},
|
||||
),
|
||||
)
|
||||
)
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: (){
|
||||
indexController.toggleMode();
|
||||
if(indexController.currentCat.isNotEmpty){
|
||||
print(indexController.currentCat[0].toString());
|
||||
child: const Icon(Icons.info),
|
||||
);
|
||||
}
|
||||
|
||||
}),
|
||||
/*
|
||||
Obx(() => locationController.isSimulationMode
|
||||
? DropdownButton<String>(
|
||||
value: locationController.getSimulatedSignalStrength(),
|
||||
onChanged: (value) {
|
||||
locationController.setSimulatedSignalStrength(value!);
|
||||
},
|
||||
tooltip: 'Increment',
|
||||
child: Obx(() =>
|
||||
indexController.mode == 0 ?
|
||||
Image(image: AssetImage('assets/images/list2.png'))
|
||||
:
|
||||
Image(image: AssetImage('assets/images/map.png')),
|
||||
items: ['low', 'medium', 'high','real']
|
||||
.map<DropdownMenuItem<String>>((String value) {
|
||||
return DropdownMenuItem<String>(
|
||||
value: value,
|
||||
child: Text(value),
|
||||
);
|
||||
}).toList(),
|
||||
)
|
||||
: Container(),
|
||||
),
|
||||
*/
|
||||
],
|
||||
),
|
||||
// bottomNavigationBar: BottomAppBar(
|
||||
// child: Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: <Widget>[
|
||||
// Obx(
|
||||
// () => destinationController.isInRog.value == true
|
||||
// ? IconButton(
|
||||
// onPressed: () {},
|
||||
// icon: const Icon(
|
||||
// Icons.run_circle,
|
||||
// size: 44,
|
||||
// color: Colors.green,
|
||||
// ))
|
||||
// : IconButton(
|
||||
// onPressed: () {},
|
||||
// icon: const Icon(
|
||||
// Icons.run_circle,
|
||||
// size: 44,
|
||||
// color: Colors.black12,
|
||||
// )),
|
||||
// ),
|
||||
// Padding(
|
||||
// padding:
|
||||
// const EdgeInsets.only(right: 10.0, top: 4.0, bottom: 4.0),
|
||||
// child: InkWell(
|
||||
// child: Obx(() => destinationController
|
||||
// .isGpsSelected.value ==
|
||||
// true
|
||||
// ? Padding(
|
||||
// padding: const EdgeInsets.only(
|
||||
// right: 10.0, top: 4.0, bottom: 4.0),
|
||||
// child: InkWell(
|
||||
// child: const Image(
|
||||
// image:
|
||||
// AssetImage('assets/images/route3_off.png'),
|
||||
// width: 35,
|
||||
// height: 35,
|
||||
// ),
|
||||
// onTap: () {
|
||||
// //indexController.switchPage(AppPages.TRAVEL);
|
||||
// },
|
||||
// ),
|
||||
// )
|
||||
// : Padding(
|
||||
// padding: const EdgeInsets.only(
|
||||
// right: 10.0, top: 4.0, bottom: 4.0),
|
||||
// child: InkWell(
|
||||
// child: const Image(
|
||||
// image:
|
||||
// AssetImage('assets/images/route2_on.png'),
|
||||
// width: 35,
|
||||
// height: 35,
|
||||
// ),
|
||||
// onTap: () {
|
||||
// //indexController.switchPage(AppPages.TRAVEL);
|
||||
// },
|
||||
// ),
|
||||
// ))),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
|
||||
//
|
||||
// マップモードとリストモードを切り替えるためのボタンです。
|
||||
//
|
||||
floatingActionButton: FloatingActionButton(
|
||||
onPressed: () {
|
||||
indexController.toggleMode();
|
||||
},
|
||||
elevation: 1.0,
|
||||
//
|
||||
// Obxウィジェットを使用して、indexController.mode.valueの値に基づいて、MapWidgetまたはListWidgetを表示しています。
|
||||
//
|
||||
child: Obx(
|
||||
() => indexController.mode.value == 0
|
||||
? const Image(image: AssetImage('assets/images/list2.png'))
|
||||
: const Image(image: AssetImage('assets/images/map.png')),
|
||||
),
|
||||
elevation: 4.0,
|
||||
),
|
||||
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
|
||||
//
|
||||
// bodyには、SafeAreaウィジェットを使用して、画面の安全な領域内にUIを構築しています。
|
||||
//
|
||||
body: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
// Container(
|
||||
// padding: const EdgeInsets.symmetric(horizontal: 8.0),
|
||||
// alignment: Alignment.centerLeft,
|
||||
// height: 50.0,
|
||||
// //child: SingleChildScrollView(
|
||||
// // scrollDirection: Axis.horizontal,
|
||||
// // child:Row(
|
||||
// // mainAxisAlignment: MainAxisAlignment.start,
|
||||
// // children: [
|
||||
// // TextButton(child:Text("Main Pef >", style: TextStyle(fontSize:16.0, fontWeight: FontWeight.bold),), onPressed: (){Get.toNamed(AppPages.MAINPERF);},),
|
||||
// // TextButton(child:Text("Sub Pef >", style: TextStyle(fontSize:16.0, fontWeight: FontWeight.bold),), onPressed: (){Get.toNamed(AppPages.SUBPERF);},),
|
||||
// // TextButton(child:Text("Cities >", style: TextStyle(fontSize:16.0, fontWeight: FontWeight.bold),), onPressed: (){Get.toNamed(AppPages.CITY);},),
|
||||
// // TextButton(child:Text("Categories", style: TextStyle(fontSize:16.0, fontWeight: FontWeight.bold),), onPressed: (){Get.toNamed(AppPages.CATEGORY);},),
|
||||
// // ],
|
||||
// // )
|
||||
// // ),
|
||||
// child: SingleChildScrollView(
|
||||
// scrollDirection: Axis.horizontal,
|
||||
// child: Obx(() =>
|
||||
// Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
// children: [
|
||||
// indexController.is_mapController_loaded.value == false ?
|
||||
// Center(child: CircularProgressIndicator())
|
||||
// :
|
||||
// BreadCrumbWidget(mapController: indexController.mapController),
|
||||
// Container(width: 24.0,),
|
||||
// // Row(
|
||||
// // children: [
|
||||
// // indexController.currentCat.isNotEmpty ? Text(indexController.currentCat[0].toString()): Text(""),
|
||||
// // indexController.currentCat.isNotEmpty ?
|
||||
// // IconButton(
|
||||
// // onPressed: (){
|
||||
// // indexController.currentCat.clear();
|
||||
// // indexController.loadLocationsBound();
|
||||
// // },
|
||||
// // icon: Icon(Icons.cancel, color: Colors.red,)
|
||||
// // ) :
|
||||
// // Container(width: 0, height: 0,)
|
||||
// // ],
|
||||
// // )
|
||||
// ],
|
||||
// )
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
Expanded(
|
||||
child: Obx(() =>
|
||||
indexController.mode == 0 ?
|
||||
MapWidget() :
|
||||
ListWidget(),
|
||||
)
|
||||
|
||||
)
|
||||
child: Obx(
|
||||
() => indexController.mode.value == 0
|
||||
? MapWidget()
|
||||
: const ListWidget(),
|
||||
))
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,6 +2,9 @@ import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
// 要検討:ログインボタンとサインアップボタンの配色を見直すことを検討してください。現在の配色では、ボタンの役割がわかりにくい可能性があります。
|
||||
// ボタンのテキストをローカライズすることを検討してください。
|
||||
//
|
||||
class LandingPage extends StatefulWidget {
|
||||
const LandingPage({ Key? key }) : super(key: key);
|
||||
|
||||
@ -17,18 +20,18 @@ class _LandingPageState extends State<LandingPage> {
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
height: MediaQuery.of(context).size.height,
|
||||
padding: EdgeInsets.symmetric(horizontal: 30,vertical: 30),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 30,vertical: 30),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
const Text(
|
||||
"こんにちは!",
|
||||
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 40),
|
||||
),
|
||||
SizedBox(height: 30,),
|
||||
const SizedBox(height: 30,),
|
||||
Text("ログインを有効にして本人確認を行うと、サーバーが改善されます",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
@ -38,11 +41,11 @@ class _LandingPageState extends State<LandingPage> {
|
||||
),
|
||||
Container(
|
||||
height: MediaQuery.of(context).size.height/3,
|
||||
decoration: BoxDecoration(
|
||||
decoration: const BoxDecoration(
|
||||
image:DecorationImage(image: AssetImage('assets/images/gradient_japanese_temple.jpg'))
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20.0,),
|
||||
const SizedBox(height: 20.0,),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
@ -51,18 +54,18 @@ class _LandingPageState extends State<LandingPage> {
|
||||
},
|
||||
color: Colors.indigoAccent[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
side: const BorderSide(
|
||||
color: Colors.black,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("ログイン",style: TextStyle(
|
||||
child: const Text("ログイン",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 15.0,),
|
||||
const SizedBox(height: 15.0,),
|
||||
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
@ -74,7 +77,7 @@ class _LandingPageState extends State<LandingPage> {
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("サインアップ",style: TextStyle(
|
||||
child: const Text("サインアップ",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,
|
||||
|
||||
),),
|
||||
|
||||
@ -1,16 +1,17 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class LoadingPage extends StatelessWidget {
|
||||
const LoadingPage({ Key? key }) : super(key: key);
|
||||
const LoadingPage({Key? key}) : super(key: key);
|
||||
|
||||
// 要検討:ローディングインジケーターの値を固定値(0.8)にしていますが、実際のローディング進捗に合わせて動的に変更することを検討してください。
|
||||
//
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
alignment: Alignment.topCenter,
|
||||
margin: EdgeInsets.only(top: 20),
|
||||
child: CircularProgressIndicator(
|
||||
alignment: Alignment.center,
|
||||
margin: const EdgeInsets.only(top: 20),
|
||||
child: const CircularProgressIndicator(
|
||||
value: 0.8,
|
||||
)
|
||||
);
|
||||
));
|
||||
}
|
||||
}
|
||||
@ -1,16 +1,20 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
// 要検討:ログインボタンとサインアップボタンの配色を見直すことを検討してください。現在の配色では、ボタンの役割がわかりにくい可能性があります。
|
||||
// エラーメッセージをローカライズすることを検討してください。
|
||||
// ログイン処理中にエラーが発生した場合のエラーハンドリングを追加することをお勧めします。
|
||||
//
|
||||
class LoginPage extends StatelessWidget {
|
||||
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
TextEditingController emailController = TextEditingController();
|
||||
TextEditingController passwordController = TextEditingController();
|
||||
|
||||
LoginPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@ -19,14 +23,25 @@ class LoginPage extends StatelessWidget {
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
leading:
|
||||
IconButton( onPressed: (){
|
||||
Navigator.pop(context);
|
||||
},icon:Icon(Icons.arrow_back_ios,size: 20,color: Colors.black,)),
|
||||
automaticallyImplyLeading: false,
|
||||
),
|
||||
body:
|
||||
indexController.currentUser.length == 0 ?
|
||||
Container(
|
||||
/* 2024-04-03 Updated by Akira . See https://wiki.sumasen.net/issues/2796?issue_count=1&issue_position=1
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back_ios,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
)),
|
||||
),
|
||||
*/
|
||||
body: indexController.currentUser.isEmpty
|
||||
? SizedBox(
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
@ -36,124 +51,190 @@ class LoginPage extends StatelessWidget {
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
height: MediaQuery.of(context).size.height/6,
|
||||
decoration: BoxDecoration(
|
||||
image:DecorationImage(image: AssetImage('assets/images/login_image.jpg'))
|
||||
height: MediaQuery.of(context).size.height / 6,
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage(
|
||||
'assets/images/login_image.jpg'))),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
SizedBox(height: 5,),
|
||||
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 40
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Column(
|
||||
children: [
|
||||
makeInput(label: "email".tr, controller: emailController),
|
||||
makeInput(label: "password".tr, controller: passwordController, obsureText: true),
|
||||
makeInput(
|
||||
label: "email".tr, controller: emailController),
|
||||
makeInput(
|
||||
label: "password".tr,
|
||||
controller: passwordController,
|
||||
obsureText: true),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 40),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(top: 3,left: 3),
|
||||
padding: const EdgeInsets.only(top: 3, left: 3),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(40),
|
||||
),
|
||||
child: Obx((() =>
|
||||
indexController.is_loading == true ? MaterialButton(
|
||||
child: Obx(
|
||||
(() => indexController.isLoading.value == true
|
||||
? MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
|
||||
},
|
||||
height: 60,
|
||||
onPressed: () {},
|
||||
color: Colors.grey[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: CircularProgressIndicator(),
|
||||
) :
|
||||
Column(
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const CircularProgressIndicator(),
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:40,
|
||||
onPressed: (){
|
||||
if(emailController.text.isEmpty || passwordController.text.isEmpty){
|
||||
height: 40,
|
||||
onPressed: () async {
|
||||
if (emailController.text.isEmpty ||
|
||||
passwordController
|
||||
.text.isEmpty) {
|
||||
Get.snackbar(
|
||||
"no_values".tr,
|
||||
"email_and_password_required".tr,
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
"email_and_password_required"
|
||||
.tr,
|
||||
icon: const Icon(
|
||||
Icons
|
||||
.assistant_photo_outlined,
|
||||
size: 40.0,
|
||||
color: Colors.blue),
|
||||
snackPosition:
|
||||
SnackPosition.TOP,
|
||||
duration: const Duration(
|
||||
seconds: 3),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
indexController.is_loading.value = true;
|
||||
indexController.login(emailController.text, passwordController.text, context);
|
||||
indexController.isLoading.value =
|
||||
true;
|
||||
indexController.login(
|
||||
emailController.text,
|
||||
passwordController.text,
|
||||
context);
|
||||
/*
|
||||
try {
|
||||
bool isLoggedIn = await indexController.login(emailController.text, passwordController.text,context);
|
||||
if (isLoggedIn) {
|
||||
Get.offAllNamed(AppPages.INDEX);
|
||||
} else {
|
||||
Get.snackbar(
|
||||
"Login Failed",
|
||||
"Invalid email or password",
|
||||
icon: const Icon(Icons.error, color: Colors.red),
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
Get.snackbar(
|
||||
"Error",
|
||||
"An error occurred during login",
|
||||
icon: const Icon(Icons.error, color: Colors.red),
|
||||
snackPosition: SnackPosition.BOTTOM,
|
||||
);
|
||||
} finally {
|
||||
indexController.isLoading.value = false;
|
||||
}
|
||||
*/ // ここまで
|
||||
},
|
||||
color: Colors.indigoAccent[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
child: Text("ログイン",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
/*
|
||||
child: Obx(
|
||||
() => indexController.isLoading.value
|
||||
? const CircularProgressIndicator(color: Colors.white)
|
||||
: const Text(
|
||||
"ログイン",
|
||||
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 16, color: Colors.white70),
|
||||
),
|
||||
),
|
||||
*/ // ここまで
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5.0,
|
||||
),
|
||||
SizedBox(height: 5.0,),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:40,
|
||||
onPressed: (){
|
||||
height: 40,
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.REGISTER);
|
||||
},
|
||||
color: Colors.redAccent,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("sign_up".tr,style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: Text(
|
||||
"sign_up".tr,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 2.0,
|
||||
),
|
||||
SizedBox(height: 2.0,),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:40,
|
||||
onPressed: (){
|
||||
height: 40,
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
},
|
||||
color: Colors.grey,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("cancel".tr,style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: Text(
|
||||
"cancel".tr,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
)),
|
||||
),
|
||||
)),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
)
|
||||
),
|
||||
SizedBox(height: 5,),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text("rogaining_user_need_tosign_up".tr, style: TextStyle(
|
||||
child: Text(
|
||||
"rogaining_user_need_tosign_up".tr,
|
||||
style: const TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
@ -164,59 +245,81 @@ class LoginPage extends StatelessWidget {
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text("app_developed_by_gifu_dx".tr, style: TextStyle(
|
||||
overflow: TextOverflow.ellipsis, fontSize: 10.0
|
||||
),),
|
||||
child: Text(
|
||||
"app_developed_by_gifu_dx".tr,
|
||||
style: const TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
fontSize: 10.0),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
const Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
"※第8回と第9回は、岐阜県からの「清流の国ぎふ」SDGs推進ネットワーク連携促進補助金を受けています",
|
||||
style: TextStyle(
|
||||
fontSize:
|
||||
12, // Consider adjusting the font size if the text is too small.
|
||||
// Removed overflow: TextOverflow.ellipsis to allow text wrapping.
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
|
||||
),
|
||||
],
|
||||
),
|
||||
):
|
||||
Container(
|
||||
child: TextButton(
|
||||
onPressed: (){
|
||||
: TextButton(
|
||||
onPressed: () {
|
||||
indexController.currentUser.clear();
|
||||
},
|
||||
child: Text("Already Logged in, Click to logout"),
|
||||
child: const Text("Already Logged in, Click to logout"),
|
||||
),
|
||||
)
|
||||
,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget makeInput({label, required TextEditingController controller, obsureText = false}){
|
||||
Widget makeInput(
|
||||
{label, required TextEditingController controller, obsureText = false}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label,style:TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Colors.black87
|
||||
),),
|
||||
SizedBox(height: 5,),
|
||||
Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
fontSize: 15, fontWeight: FontWeight.w400, color: Colors.black87),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
TextField(
|
||||
controller: controller,
|
||||
obscureText: obsureText,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: EdgeInsets.symmetric(vertical: 0,horizontal: 10),
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 0, horizontal: 10),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: (Colors.grey[400])!,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 30.0,)
|
||||
const SizedBox(
|
||||
height: 30.0,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@ -3,6 +3,10 @@ import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
// 要検討:ログインボタンとサインアップボタンの配色を見直すことを検討してください。現在の配色では、ボタンの役割がわかりにくい可能性があります。
|
||||
// エラーメッセージをローカライズすることを検討してください。
|
||||
// ポップアップを閉じるボタンを追加することを検討してください。
|
||||
//
|
||||
class LoginPopupPage extends StatelessWidget {
|
||||
LoginPopupPage({Key? key}) : super(key: key);
|
||||
|
||||
@ -19,14 +23,18 @@ class LoginPopupPage extends StatelessWidget {
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
leading:
|
||||
IconButton( onPressed: (){
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},icon:Icon(Icons.arrow_back_ios,size: 20,color: Colors.black,)),
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back_ios,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
)),
|
||||
),
|
||||
body:
|
||||
indexController.currentUser.length == 0 ?
|
||||
Container(
|
||||
body: indexController.currentUser.isEmpty
|
||||
? SizedBox(
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
@ -36,174 +44,207 @@ class LoginPopupPage extends StatelessWidget {
|
||||
Column(
|
||||
children: [
|
||||
Container(
|
||||
height: MediaQuery.of(context).size.height/5,
|
||||
decoration: BoxDecoration(
|
||||
image:DecorationImage(image: AssetImage('assets/images/login_image.jpg'))
|
||||
height: MediaQuery.of(context).size.height / 5,
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage(
|
||||
'assets/images/login_image.jpg'))),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
SizedBox(height: 5,),
|
||||
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 40
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Column(
|
||||
children: [
|
||||
makeInput(label: "email".tr, controller: emailController),
|
||||
makeInput(label: "password".tr, controller: passwordController, obsureText: true),
|
||||
makeInput(
|
||||
label: "email".tr, controller: emailController),
|
||||
makeInput(
|
||||
label: "password".tr,
|
||||
controller: passwordController,
|
||||
obsureText: true),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 40),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(top: 3,left: 3),
|
||||
padding: const EdgeInsets.only(top: 3, left: 3),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(40),
|
||||
),
|
||||
child: Obx((() =>
|
||||
indexController.is_loading == true ? MaterialButton(
|
||||
child: Obx(
|
||||
(() => indexController.isLoading.value == true
|
||||
? MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
|
||||
},
|
||||
height: 60,
|
||||
onPressed: () {},
|
||||
color: Colors.grey[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: CircularProgressIndicator(),
|
||||
) :
|
||||
Column(
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const CircularProgressIndicator(),
|
||||
)
|
||||
: Column(
|
||||
children: [
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
if(emailController.text.isEmpty || passwordController.text.isEmpty){
|
||||
height: 60,
|
||||
onPressed: () {
|
||||
if (emailController.text.isEmpty ||
|
||||
passwordController
|
||||
.text.isEmpty) {
|
||||
Get.snackbar(
|
||||
"no_values".tr,
|
||||
"email_and_password_required".tr,
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
"email_and_password_required"
|
||||
.tr,
|
||||
icon: const Icon(
|
||||
Icons
|
||||
.assistant_photo_outlined,
|
||||
size: 40.0,
|
||||
color: Colors.blue),
|
||||
snackPosition:
|
||||
SnackPosition.TOP,
|
||||
duration: const Duration(
|
||||
milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
indexController.is_loading.value = true;
|
||||
indexController.login(emailController.text, passwordController.text, context);
|
||||
indexController.isLoading.value =
|
||||
true;
|
||||
indexController.login(
|
||||
emailController.text,
|
||||
passwordController.text,
|
||||
context);
|
||||
},
|
||||
color: Colors.indigoAccent[400],
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("ログイン",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 19.0,
|
||||
),
|
||||
SizedBox(height: 19.0,),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:50,
|
||||
onPressed: (){
|
||||
height: 50,
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.REGISTER);
|
||||
},
|
||||
color: Colors.redAccent,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("sign_up".tr,style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: Text(
|
||||
"sign_up".tr,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 19.0,
|
||||
),
|
||||
SizedBox(height: 19.0,),
|
||||
MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:50,
|
||||
onPressed: (){
|
||||
height: 50,
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.TRAVEL);
|
||||
},
|
||||
color: Colors.grey,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("cancel".tr,style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,color: Colors.white70
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(40)),
|
||||
child: Text(
|
||||
"cancel".tr,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
color: Colors.white70),
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
)),
|
||||
),
|
||||
)),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
)
|
||||
),
|
||||
SizedBox(height: 20,),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text("rogaining_user_need_tosign_up".tr, style: TextStyle(
|
||||
child: Text(
|
||||
"rogaining_user_need_tosign_up".tr,
|
||||
style: const TextStyle(
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
|
||||
),
|
||||
],
|
||||
),
|
||||
):
|
||||
Container(
|
||||
child: TextButton(
|
||||
onPressed: (){
|
||||
)
|
||||
: TextButton(
|
||||
onPressed: () {
|
||||
indexController.currentUser.clear();
|
||||
},
|
||||
child: Text("Already Logged in, Click to logout"),
|
||||
child: const Text("Already Logged in, Click to logout"),
|
||||
),
|
||||
)
|
||||
,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Widget makeInput({label, required TextEditingController controller, obsureText = false}){
|
||||
Widget makeInput(
|
||||
{label, required TextEditingController controller, obsureText = false}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label,style:TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Colors.black87
|
||||
),),
|
||||
SizedBox(height: 5,),
|
||||
Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
fontSize: 15, fontWeight: FontWeight.w400, color: Colors.black87),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
TextField(
|
||||
controller: controller,
|
||||
obscureText: obsureText,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: EdgeInsets.symmetric(vertical: 0,horizontal: 10),
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 0, horizontal: 10),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: (Colors.grey[400])!,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 30.0,)
|
||||
const SizedBox(
|
||||
height: 30.0,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,31 +1,31 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:get/get.dart';
|
||||
// import 'package:rogapp/pages/index/index_controller.dart';
|
||||
|
||||
class MainPerfPage extends StatelessWidget {
|
||||
MainPerfPage({Key? key}) : super(key: key);
|
||||
// class MainPerfPage extends StatelessWidget {
|
||||
// MainPerfPage({Key? key}) : super(key: key);
|
||||
|
||||
IndexController indexController = Get.find<IndexController>();
|
||||
// IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("Select Main Perfecture"),
|
||||
),
|
||||
body: ListView.builder(
|
||||
itemCount: indexController.perfectures.length,
|
||||
itemBuilder: (context, index){
|
||||
return ListTile(
|
||||
onTap: (){
|
||||
indexController.dropdownValue = indexController.perfectures[index][0]["id"].toString();
|
||||
indexController.populateForPerf(indexController.dropdownValue, indexController.mapController!);
|
||||
Get.back();
|
||||
},
|
||||
title: Text(indexController.perfectures[index][0]["adm1_ja"].toString()),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// return Scaffold(
|
||||
// appBar: AppBar(
|
||||
// title: const Text("Select Main Perfecture"),
|
||||
// ),
|
||||
// body: ListView.builder(
|
||||
// itemCount: indexController.perfectures.length,
|
||||
// itemBuilder: (context, index){
|
||||
// return ListTile(
|
||||
// onTap: (){
|
||||
// indexController.dropdownValue = indexController.perfectures[index][0]["id"].toString();
|
||||
// indexController.populateForPerf(indexController.dropdownValue, indexController.mapController);
|
||||
// Get.back();
|
||||
// },
|
||||
// title: Text(indexController.perfectures[index][0]["adm1_ja"].toString()),
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
// }
|
||||
@ -1,233 +1,136 @@
|
||||
import 'dart:ffi';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'dart:io';
|
||||
|
||||
class PermissionHandlerScreen extends StatefulWidget {
|
||||
const PermissionHandlerScreen({super.key});
|
||||
const PermissionHandlerScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PermissionHandlerScreen> createState() => _PermissionHandlerScreenState();
|
||||
State<PermissionHandlerScreen> createState() =>
|
||||
_PermissionHandlerScreenState();
|
||||
}
|
||||
|
||||
class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
|
||||
|
||||
@override
|
||||
void initState(){
|
||||
void initState() {
|
||||
super.initState();
|
||||
_checkPermissions();
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_checkPermissionStatus();
|
||||
});
|
||||
}
|
||||
|
||||
void _checkPermissions() async {
|
||||
// You can ask for multiple permissions at once.
|
||||
Map<Permission, PermissionStatus> statuses = await [
|
||||
Permission.location,
|
||||
Permission.camera,
|
||||
].request();
|
||||
_checkPermissionStatus() async {
|
||||
PermissionStatus status = await Permission.location.status;
|
||||
|
||||
bool isCameraGranted = statuses[Permission.camera]!.isGranted;
|
||||
bool isLocationGranted = statuses[Permission.location]!.isGranted;
|
||||
if (status.isGranted == false) {
|
||||
if (context.mounted) {
|
||||
showAlert(context);
|
||||
}
|
||||
} else if (status.isPermanentlyDenied) {
|
||||
await requestPermission();
|
||||
} else {
|
||||
if (mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!isCameraGranted || !isLocationGranted) {
|
||||
bool isCameraPermanentlyDenied = statuses[Permission.camera]!.isPermanentlyDenied;
|
||||
bool isLocationPermanentlyDenied = statuses[Permission.location]!.isPermanentlyDenied;
|
||||
|
||||
if (isCameraPermanentlyDenied || isLocationPermanentlyDenied) {
|
||||
void showAlert(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: const Text('Permissions not granted'),
|
||||
content: const Text(
|
||||
'This app needs camera and location permissions to function. Please open settings and grant permissions.'),
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('ロケーション許可'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('ぎふナビ "アプリへようこそ!\n'),
|
||||
Text('収集データ:\n'),
|
||||
Text(
|
||||
'岐阜ナビアプリをより快適にご利用いただくために、チェックポイントでの自動チェックインのための位置情報を収集しています。また、撮影した画像やチェックインした時間を収集し、チャレンジの勝者を決定します。\n'),
|
||||
Text('お客様のデータの使用方法:\n'),
|
||||
Text(
|
||||
'お客様のデータは、アプリを改善し、競争力のある魅力的な体験を提供するのに役立ちます。お客様の位置情報と画像は、個人を特定できない統計データとして処理され、いかなる個人情報にもリンクされないようにしています\n'),
|
||||
Text('お客様の管理:\n'),
|
||||
Text(
|
||||
'お客様はご自身のデータを完全に管理することができます。アプリの設定でいつでも同意を撤回することができます。位置情報の収集に同意しなくても、ぎふナビを楽しむことはできますが、自動チェックインや競技への参加など、一部の機能が制限されることを覚えておいてください。位置情報、画像、時刻情報の利用に同意する場合は「許可」を選択してください。許可しない場合は、「許可しない」を選択してください。あなたの選択は、アプリの他の機能を使用することに影響しません。\n'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('Open settings'),
|
||||
child: const Text('OK'),
|
||||
onPressed: () {
|
||||
openAppSettings();
|
||||
Get.back();
|
||||
requestPermission();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
} else {
|
||||
// ask permissions again
|
||||
_checkPermissions();
|
||||
));
|
||||
}
|
||||
} else {
|
||||
Get.toNamed(AppPages.INITIAL);
|
||||
}
|
||||
}
|
||||
|
||||
// 要検討:位置情報の許可が拒否された場合、適切なエラーメッセージを表示することを検討してください。
|
||||
//
|
||||
Future<void> requestPermission() async {
|
||||
PermissionStatus permission = await Permission.location.status;
|
||||
if (permission == PermissionStatus.permanentlyDenied) {
|
||||
showPermanentAlert();
|
||||
} else {
|
||||
PermissionStatus newPermission = await Permission.location.request();
|
||||
if (newPermission != PermissionStatus.granted) {
|
||||
exit(0);
|
||||
} else {
|
||||
if (context.mounted) {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return const Scaffold(
|
||||
body: Center(
|
||||
child: Text('Checking permissions...'),
|
||||
),
|
||||
body: Text(""),
|
||||
);
|
||||
}
|
||||
|
||||
// 要検討:ユーザーが位置情報の許可を拒否し続けた場合の対処方法を明確にすることをお勧めします。
|
||||
//
|
||||
void showPermanentAlert() {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AlertDialog(
|
||||
title: const Text('無効'),
|
||||
content: const SingleChildScrollView(
|
||||
child: ListBody(
|
||||
children: <Widget>[
|
||||
Text('位置情報が無効になっています'),
|
||||
Text(
|
||||
'このアプリケーションへの位置情報アクセスが無効になっています。続行するには設定>プライバシーとセキュリティ>位置情報サービス>岐阜ナビ で有効にしてください。'),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: <Widget>[
|
||||
ElevatedButton(
|
||||
child: const Text('OK'),
|
||||
onPressed: () async {
|
||||
await openAppSettings().then(
|
||||
(value) async {
|
||||
if (value) {
|
||||
if (await Permission
|
||||
.location.status.isPermanentlyDenied ==
|
||||
true &&
|
||||
await Permission.location.status.isGranted ==
|
||||
false) {
|
||||
requestPermission(); /* opens app settings until permission is granted */
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// import 'package:flutter/material.dart';
|
||||
// import 'package:get/get.dart';
|
||||
// import 'package:permission_handler/permission_handler.dart';
|
||||
// import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
// class PermissionHandlerScreen extends StatefulWidget {
|
||||
// PermissionHandlerScreen({Key? key}) : super(key: key);
|
||||
|
||||
// @override
|
||||
// State<PermissionHandlerScreen> createState() => _PermissionHandlerScreenState();
|
||||
// }
|
||||
|
||||
// class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
|
||||
|
||||
|
||||
// Future<void> _showMyDialog() async {
|
||||
// return showDialog<void>(
|
||||
// context: context,
|
||||
// barrierDismissible: false, // user must tap button!
|
||||
// builder: (BuildContext context) {
|
||||
// return AlertDialog(
|
||||
// title: const Text('ロケーション許可'),
|
||||
// content: SingleChildScrollView(
|
||||
// child: ListBody(
|
||||
// children: const <Widget>[
|
||||
// Text( 'このアプリでは、位置情報の収集を行います。'),
|
||||
// Text( 'このアプリでは、開始時点で位置情報を収集します。'),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// actions: <Widget>[
|
||||
// TextButton(
|
||||
// child: const Text('わかった'),
|
||||
// onPressed: () {
|
||||
// //Navigator.of(context).pop();
|
||||
// Get.toNamed(AppPages.TRAVEL);
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
// @override
|
||||
// void initState() {
|
||||
// // TODO: implement initState
|
||||
// super.initState();
|
||||
|
||||
// //permissionServiceCall();
|
||||
// }
|
||||
|
||||
// Future<PermissionStatus> checkLocationPermission() async {
|
||||
// return await Permission.location.status;
|
||||
// }
|
||||
|
||||
// permissionServiceCall() async {
|
||||
// await permissionServices().then(
|
||||
// (value) {
|
||||
// if (value != null) {
|
||||
// if (value[Permission.location]!.isGranted ) {
|
||||
// /* ========= New Screen Added ============= */
|
||||
|
||||
// Get.toNamed(AppPages.TRAVEL);
|
||||
|
||||
// // Navigator.pushReplacement(
|
||||
// // context,
|
||||
// // MaterialPageRoute(builder: (context) => SplashScreen()),
|
||||
// // );
|
||||
// }
|
||||
// else{
|
||||
// _showMyDialog();
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
// );
|
||||
// }
|
||||
|
||||
|
||||
// /*Permission services*/
|
||||
// Future<Map<Permission, PermissionStatus>> permissionServices() async {
|
||||
// // You can request multiple permissions at once.
|
||||
// Map<Permission, PermissionStatus> statuses = await [
|
||||
// Permission.location,
|
||||
|
||||
// //add more permission to request here.
|
||||
// ].request();
|
||||
|
||||
// if (statuses[Permission.location]!.isPermanentlyDenied) {
|
||||
// await openAppSettings().then(
|
||||
// (value) async {
|
||||
// if (value) {
|
||||
// if (await Permission.location.status.isPermanentlyDenied == true &&
|
||||
// await Permission.location.status.isGranted == false) {
|
||||
// // openAppSettings();
|
||||
// permissionServiceCall(); /* opens app settings until permission is granted */
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
// );
|
||||
// } else {
|
||||
// if (statuses[Permission.location]!.isDenied) {
|
||||
// permissionServiceCall();
|
||||
// }
|
||||
// }
|
||||
|
||||
// /*{Permission.camera: PermissionStatus.granted, Permission.storage: PermissionStatus.granted}*/
|
||||
// return statuses;
|
||||
// }
|
||||
|
||||
|
||||
|
||||
// @override
|
||||
// Widget build(BuildContext context) {
|
||||
// var status = Permission.location.status.then((value){
|
||||
// if(value.isGranted == false){
|
||||
// Future.delayed(Duration.zero, () => showAlert(context));
|
||||
// }
|
||||
// else {
|
||||
// Get.toNamed(AppPages.TRAVEL);
|
||||
// }
|
||||
// });
|
||||
// return Scaffold(
|
||||
// body: Container(
|
||||
// child: Text(""),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
|
||||
// void showAlert(BuildContext context) {
|
||||
// showDialog(
|
||||
// context: context,
|
||||
// builder: (_) => AlertDialog(
|
||||
// title: const Text('ロケーション許可'),
|
||||
// content: SingleChildScrollView(
|
||||
// child: ListBody(
|
||||
// children: const <Widget>[
|
||||
// Text( 'このアプリでは、位置情報の収集を行います。'),
|
||||
// Text('岐阜ナビアプリではチェックポイントの自動チェックインの機能を可能にするために、現在地のデータが収集されます。アプリを閉じている時や、使用していないときにも収集されます。位置情報は、個人を特定できない統計的な情報として、ユーザーの個人情報とは一切結びつかない形で送信されます。お知らせの配信、位置情報の利用を許可しない場合は、この後表示されるダイアログで「許可しない」を選択してください。'),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// actions: <Widget>[
|
||||
// TextButton(
|
||||
// child: const Text('わかった'),
|
||||
// onPressed: () {
|
||||
// permissionServiceCall();
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// )
|
||||
// );
|
||||
// }
|
||||
|
||||
|
||||
// }
|
||||
@ -1,7 +1,4 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/src/foundation/key.dart';
|
||||
import 'package:flutter/src/widgets/container.dart';
|
||||
import 'package:flutter/src/widgets/framework.dart';
|
||||
|
||||
class ProgressPage extends StatelessWidget {
|
||||
const ProgressPage({Key? key}) : super(key: key);
|
||||
@ -10,7 +7,7 @@ class ProgressPage extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
color: Colors.transparent,
|
||||
child: Center(
|
||||
child: const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
),
|
||||
);
|
||||
|
||||
@ -1,18 +1,17 @@
|
||||
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
|
||||
class RegisterPage extends StatelessWidget {
|
||||
|
||||
final IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
TextEditingController emailController = TextEditingController();
|
||||
TextEditingController passwordController = TextEditingController();
|
||||
TextEditingController confirmPasswordController = TextEditingController();
|
||||
|
||||
RegisterPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@ -21,14 +20,19 @@ class RegisterPage extends StatelessWidget {
|
||||
appBar: AppBar(
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
leading:
|
||||
IconButton( onPressed: (){
|
||||
leading: IconButton(
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},icon:Icon(Icons.arrow_back_ios,size: 20,color: Colors.black,)),
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.arrow_back_ios,
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
)),
|
||||
),
|
||||
body: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
child: Container(
|
||||
child: SizedBox(
|
||||
height: MediaQuery.of(context).size.height,
|
||||
width: double.infinity,
|
||||
child: Column(
|
||||
@ -39,102 +43,123 @@ class RegisterPage extends StatelessWidget {
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Text ("サインアップ", style: TextStyle(
|
||||
const Text(
|
||||
"サインアップ",
|
||||
style: TextStyle(
|
||||
fontSize: 30,
|
||||
fontWeight: FontWeight.bold,
|
||||
),),
|
||||
SizedBox(height: 20,),
|
||||
Text("アカウントを作成し、無料です",style: TextStyle(
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
Text(
|
||||
"アカウントを作成し、無料です",
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
color: Colors.grey[700],
|
||||
),),
|
||||
SizedBox(height: 30,)
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 30,
|
||||
)
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 40
|
||||
),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Column(
|
||||
children: [
|
||||
makeInput(label: "Eメール", controller: emailController),
|
||||
makeInput(label: "パスワード", controller: passwordController,obsureText: true),
|
||||
makeInput(label: "パスワードを認証する", controller: confirmPasswordController,obsureText: true)
|
||||
makeInput(
|
||||
label: "パスワード",
|
||||
controller: passwordController,
|
||||
obsureText: true),
|
||||
makeInput(
|
||||
label: "パスワードを認証する",
|
||||
controller: confirmPasswordController,
|
||||
obsureText: true)
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 40),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40),
|
||||
child: Container(
|
||||
padding: EdgeInsets.only(top: 3,left: 3),
|
||||
padding: const EdgeInsets.only(top: 3, left: 3),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(40),
|
||||
border: Border(
|
||||
border: const Border(
|
||||
bottom: BorderSide(color: Colors.black),
|
||||
top: BorderSide(color: Colors.black),
|
||||
right: BorderSide(color: Colors.black),
|
||||
left: BorderSide(color: Colors.black)
|
||||
)
|
||||
),
|
||||
left: BorderSide(color: Colors.black))),
|
||||
child: MaterialButton(
|
||||
minWidth: double.infinity,
|
||||
height:60,
|
||||
onPressed: (){
|
||||
if(passwordController.text != confirmPasswordController.text){
|
||||
height: 60,
|
||||
onPressed: () {
|
||||
if (passwordController.text !=
|
||||
confirmPasswordController.text) {
|
||||
Get.snackbar(
|
||||
"No match",
|
||||
"Passwords does not match",
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(Icons.assistant_photo_outlined,
|
||||
size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
}
|
||||
if(emailController.text.isEmpty || passwordController.text.isEmpty){
|
||||
if (emailController.text.isEmpty ||
|
||||
passwordController.text.isEmpty) {
|
||||
Get.snackbar(
|
||||
"no_values".tr,
|
||||
"email_and_password_required".tr,
|
||||
icon: Icon(Icons.assistant_photo_outlined, size: 40.0, color: Colors.blue),
|
||||
icon: const Icon(Icons.assistant_photo_outlined,
|
||||
size: 40.0, color: Colors.blue),
|
||||
snackPosition: SnackPosition.TOP,
|
||||
duration: Duration(milliseconds: 800),
|
||||
duration: const Duration(milliseconds: 800),
|
||||
backgroundColor: Colors.yellow,
|
||||
//icon:Image(image:AssetImage("assets/images/dora.png"))
|
||||
);
|
||||
return;
|
||||
}
|
||||
indexController.is_loading.value = true;
|
||||
indexController.register(emailController.text, passwordController.text, context);
|
||||
indexController.isLoading.value = true;
|
||||
indexController.register(emailController.text,
|
||||
passwordController.text, context);
|
||||
},
|
||||
color: Colors.redAccent,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(40)
|
||||
),
|
||||
child: Text("sign_up".tr,style: TextStyle(
|
||||
fontWeight: FontWeight.w600,fontSize: 16,
|
||||
|
||||
),),
|
||||
borderRadius: BorderRadius.circular(40)),
|
||||
child: Text(
|
||||
"sign_up".tr,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20,),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 20,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Flexible(child: Text("すでにアカウントをお持ちですか?")),
|
||||
const Flexible(child: Text("すでにアカウントをお持ちですか?")),
|
||||
TextButton(
|
||||
onPressed: (){
|
||||
onPressed: () {
|
||||
Get.toNamed(AppPages.LOGIN);
|
||||
},
|
||||
child: Text("ログイン",style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 18
|
||||
),),
|
||||
child: const Text(
|
||||
"ログイン",
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600, fontSize: 18),
|
||||
),
|
||||
),
|
||||
],
|
||||
)
|
||||
],
|
||||
|
||||
),
|
||||
],
|
||||
),
|
||||
@ -145,34 +170,38 @@ class RegisterPage extends StatelessWidget {
|
||||
}
|
||||
}
|
||||
|
||||
Widget makeInput({label, required TextEditingController controller, obsureText = false}){
|
||||
Widget makeInput(
|
||||
{label, required TextEditingController controller, obsureText = false}) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(label,style:TextStyle(
|
||||
fontSize: 15,
|
||||
fontWeight: FontWeight.w400,
|
||||
color: Colors.black87
|
||||
),),
|
||||
SizedBox(height: 5,),
|
||||
Text(
|
||||
label,
|
||||
style: const TextStyle(
|
||||
fontSize: 15, fontWeight: FontWeight.w400, color: Colors.black87),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 5,
|
||||
),
|
||||
TextField(
|
||||
controller: controller,
|
||||
obscureText: obsureText,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: EdgeInsets.symmetric(vertical: 0,horizontal: 10),
|
||||
contentPadding:
|
||||
const EdgeInsets.symmetric(vertical: 0, horizontal: 10),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderSide: BorderSide(
|
||||
color: (Colors.grey[400])!,
|
||||
),
|
||||
),
|
||||
border: OutlineInputBorder(
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!
|
||||
borderSide: BorderSide(color: (Colors.grey[400])!),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 30,)
|
||||
|
||||
const SizedBox(
|
||||
height: 30,
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,26 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:geojson/geojson.dart';
|
||||
import 'package:geojson_vi/geojson_vi.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:get/get_state_manager/get_state_manager.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
|
||||
class SearchBarController extends GetxController {
|
||||
List<GeoJSONFeature> searchResults = <GeoJSONFeature>[].obs;
|
||||
|
||||
List<GeoJsonFeature> searchResults = <GeoJsonFeature>[].obs;
|
||||
|
||||
|
||||
@override
|
||||
@override
|
||||
void onInit() {
|
||||
IndexController indexController = Get.find<IndexController>();
|
||||
if(indexController.locations.isNotEmpty){
|
||||
for(int i=0; i<= indexController.locations[0].collection.length - 1; i++){
|
||||
GeoJsonFeature p = indexController.locations[0].collection[i];
|
||||
if (indexController.locations.isNotEmpty) {
|
||||
for (int i = 0;
|
||||
i <= indexController.locations[0].features.length - 1;
|
||||
i++) {
|
||||
GeoJSONFeature p = indexController.locations[0].features[i]!;
|
||||
searchResults.add(p);
|
||||
}
|
||||
}
|
||||
super.onInit();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -1,10 +1,14 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||
import 'package:geojson/geojson.dart';
|
||||
import 'package:geojson_vi/geojson_vi.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/model/destination.dart';
|
||||
import 'package:rogapp/pages/destination/destination_controller.dart';
|
||||
import 'package:rogapp/pages/index/index_controller.dart';
|
||||
import 'package:rogapp/pages/search/search_controller.dart';
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_start.dart';
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_goal.dart';
|
||||
//import 'package:rogapp/widgets/bottom_sheets/bottom_sheet_normal_point.dart';
|
||||
import 'package:rogapp/widgets/bottom_sheet_new.dart';
|
||||
|
||||
class SearchPage extends StatelessWidget {
|
||||
@ -13,14 +17,16 @@ class SearchPage extends StatelessWidget {
|
||||
SearchBarController searchController = Get.find<SearchBarController>();
|
||||
IndexController indexController = Get.find<IndexController>();
|
||||
|
||||
Image getImage(int index){
|
||||
if(searchController.searchResults[index].properties!["photos"] == null || searchController.searchResults[index].properties!["photos"] == ""){
|
||||
return Image(image: AssetImage('assets/images/empty_image.png'));
|
||||
}
|
||||
else{
|
||||
Image getImage(int index) {
|
||||
if (searchController.searchResults[index].properties!["photos"] == null ||
|
||||
searchController.searchResults[index].properties!["photos"] == "") {
|
||||
return const Image(image: AssetImage('assets/images/empty_image.png'));
|
||||
} else {
|
||||
return Image(
|
||||
image: NetworkImage(searchController.searchResults[index].properties!["photos"]),
|
||||
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
|
||||
image: NetworkImage(
|
||||
searchController.searchResults[index].properties!["photos"]),
|
||||
errorBuilder:
|
||||
(BuildContext context, Object exception, StackTrace? stackTrace) {
|
||||
return Image.asset("assets/images/empty_image.png");
|
||||
},
|
||||
);
|
||||
@ -34,64 +40,84 @@ class SearchPage extends StatelessWidget {
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
leading: IconButton(
|
||||
onPressed:(){
|
||||
Navigator.pop(context);
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
},
|
||||
icon: const Icon(Icons.arrow_back_ios_new, color: Colors.black,)),
|
||||
title: TypeAheadField(
|
||||
textFieldConfiguration: TextFieldConfiguration(
|
||||
autofocus: true,
|
||||
icon: const Icon(
|
||||
Icons.arrow_back_ios_new,
|
||||
color: Colors.black,
|
||||
)),
|
||||
centerTitle: true,
|
||||
//title: const CupertinoSearchTextField(),
|
||||
),
|
||||
suggestionsCallback: (pattern) async{
|
||||
return searchController.searchResults.where((GeoJsonFeature element) => element.properties!["location_name"].toString().contains(pattern));
|
||||
body: SingleChildScrollView(
|
||||
child: TypeAheadField<GeoJSONFeature>(
|
||||
// textFieldConfiguration: TextFieldConfiguration(
|
||||
// autofocus: true,
|
||||
// style: DefaultTextStyle.of(context).style.copyWith(
|
||||
// fontStyle: FontStyle.normal,
|
||||
// fontSize: 15.0,
|
||||
// ),
|
||||
// decoration: InputDecoration(
|
||||
// border: const OutlineInputBorder(),
|
||||
// hintText: "検索",
|
||||
// prefixIcon: const Icon(Icons.search),
|
||||
// suffixIcon: IconButton(
|
||||
// icon: const Icon(Icons.clear),
|
||||
// onPressed: () {
|
||||
// // clear the text field
|
||||
// },
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
onSelected: (GeoJSONFeature suggestion) {
|
||||
indexController.currentFeature.clear();
|
||||
indexController.currentFeature.add(suggestion);
|
||||
DestinationController destinationController =
|
||||
Get.find<DestinationController>();
|
||||
Destination des =
|
||||
destinationController.festuretoDestination(suggestion);
|
||||
Get.back();
|
||||
|
||||
Widget bottomSheet = BottomSheetNew(destination: des);
|
||||
/*
|
||||
if (des.cp == -1 || des.cp == 0) {
|
||||
bottomSheet = BottomSheetStart(destination: des);
|
||||
} else if (des.cp == -2 || des.cp == 0) {
|
||||
bottomSheet = BottomSheetGoal(destination: des);
|
||||
} else {
|
||||
bottomSheet = BottomSheetNormalPoint(destination: des);
|
||||
}
|
||||
*/
|
||||
showModalBottomSheet(
|
||||
constraints:
|
||||
BoxConstraints.loose(Size(Get.width, Get.height * 0.75)),
|
||||
isScrollControlled: true,
|
||||
context: context,
|
||||
builder: ((context) => bottomSheet)
|
||||
);
|
||||
},
|
||||
|
||||
suggestionsCallback: (pattern) async {
|
||||
return searchController.searchResults
|
||||
.where((GeoJSONFeature element) => element
|
||||
.properties!["location_name"]
|
||||
.toString()
|
||||
.contains(pattern))
|
||||
.toList();
|
||||
//return await
|
||||
},
|
||||
itemBuilder: (context, GeoJsonFeature suggestion){
|
||||
itemBuilder: (context, GeoJSONFeature suggestion) {
|
||||
return ListTile(
|
||||
title: Text(suggestion.properties!["location_name"]),
|
||||
subtitle: suggestion.properties!["category"] != null ? Text(suggestion.properties!["category"]) : Text(""),
|
||||
subtitle: suggestion.properties!["category"] != null
|
||||
? Text(suggestion.properties!["category"])
|
||||
: const Text(""),
|
||||
//leading: getImage(index),
|
||||
);
|
||||
},
|
||||
onSuggestionSelected: (GeoJsonFeature suggestion){
|
||||
indexController.currentFeature.clear();
|
||||
indexController.currentFeature.add(suggestion);
|
||||
Get.back();
|
||||
showModalBottomSheet(
|
||||
isScrollControlled: true,
|
||||
context: context,
|
||||
//builder: (context) => BottomSheetWidget(),
|
||||
builder:((context) => BottomSheetNew())
|
||||
);
|
||||
},
|
||||
),
|
||||
//title: const CupertinoSearchTextField(),
|
||||
|
||||
),
|
||||
//body:
|
||||
// Obx(() =>
|
||||
// ListView.builder(
|
||||
// itemCount: searchController.searchResults.length,
|
||||
// itemBuilder: (context, index){
|
||||
// return ListTile(
|
||||
// title: searchController.searchResults[index].properties!["location_name"] != null ? Text(searchController.searchResults[index].properties!["location_name"]) : Text(""),
|
||||
// subtitle: searchController.searchResults[index].properties!["category"] != null ? Text(searchController.searchResults[index].properties!["category"]) : Text(""),
|
||||
// leading: getImage(index),
|
||||
// onTap: (){
|
||||
// indexController.currentFeature.clear();
|
||||
// indexController.currentFeature.add(searchController.searchResults[index]);
|
||||
// Get.back();
|
||||
// showModalBottomSheet(
|
||||
// isScrollControlled: true,
|
||||
// context: context,
|
||||
// //builder: (context) => BottomSheetWidget(),
|
||||
// builder:((context) => BottomSheetNew())
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// )
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -9,9 +9,10 @@ class SubPerfPage extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
debugPrint("SubPerfPage ---->");
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text("Select Sub Perfecture"),
|
||||
title: const Text("Select Sub Perfecture"),
|
||||
),
|
||||
body: ListView.builder(
|
||||
itemCount: indexController.subPerfs.length,
|
||||
|
||||
31
lib/provider/auth_provider.dart
Normal file
@ -0,0 +1,31 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:rogapp/model/auth_user.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
final authUserStateProvider =
|
||||
StateNotifierProvider<AuthUserState, AuthUser>((ref) {
|
||||
return AuthUserState();
|
||||
});
|
||||
|
||||
class AuthUserState extends StateNotifier<AuthUser> {
|
||||
AuthUserState() : super(AuthUser());
|
||||
|
||||
Future<void> saveToDevice(String val) async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString("user_token", val);
|
||||
}
|
||||
|
||||
Future<String?> tokenFromDevice() async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
return prefs.getString("user_token");
|
||||
}
|
||||
|
||||
Future<void> addLogin(AuthUser user) async {
|
||||
state = user;
|
||||
await saveToDevice(user.auth_token!);
|
||||
}
|
||||
|
||||
void removeLogin() {
|
||||
state = AuthUser();
|
||||
}
|
||||
}
|
||||
22
lib/provider/game_state_provider.dart
Normal file
@ -0,0 +1,22 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:rogapp/model/game_state_instance.dart';
|
||||
|
||||
final gameStateNotifierProvider =
|
||||
StateNotifierProvider<GameStaticState, GameInsStatetance>((ref) {
|
||||
return GameStaticState();
|
||||
});
|
||||
|
||||
class GameStaticState extends StateNotifier<GameInsStatetance> {
|
||||
GameStaticState() : super(GameInsStatetance());
|
||||
|
||||
@override
|
||||
GameInsStatetance get state => super.state;
|
||||
|
||||
void startGame(GameInsStatetance gi) {
|
||||
state = gi;
|
||||
}
|
||||
|
||||
void doCheckin() {}
|
||||
|
||||
void makeGoal() {}
|
||||
}
|
||||
18
lib/provider/map_state_provider.dart
Normal file
@ -0,0 +1,18 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:rogapp/model/map_state_instance.dart';
|
||||
|
||||
final mapStateNotifierProvider =
|
||||
StateNotifierProvider<MapState, MapStateInstance>((ref) {
|
||||
return MapState();
|
||||
});
|
||||
|
||||
class MapState extends StateNotifier<MapStateInstance> {
|
||||
MapState() : super(MapStateInstance());
|
||||
|
||||
@override
|
||||
MapStateInstance get state => super.state;
|
||||
|
||||
void startGame(MapStateInstance mi) {
|
||||
state = mi;
|
||||
}
|
||||
}
|
||||
@ -1,11 +1,12 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:get/get_navigation/src/routes/get_route.dart';
|
||||
import 'package:rogapp/pages/camera/camera_page.dart';
|
||||
import 'package:rogapp/pages/category/category_page.dart';
|
||||
import 'package:rogapp/pages/changepassword/change_password_page.dart';
|
||||
import 'package:rogapp/pages/city/city_page.dart';
|
||||
import 'package:rogapp/pages/destination/destination_binding.dart';
|
||||
import 'package:rogapp/pages/destination/destination_page.dart';
|
||||
import 'package:rogapp/pages/gps/gps_page.dart';
|
||||
import 'package:rogapp/pages/history/history_page.dart';
|
||||
import 'package:rogapp/pages/home/home_binding.dart';
|
||||
import 'package:rogapp/pages/home/home_page.dart';
|
||||
|
||||
import 'package:rogapp/pages/index/index_page.dart';
|
||||
@ -19,25 +20,14 @@ import 'package:rogapp/pages/register/register_page.dart';
|
||||
import 'package:rogapp/pages/search/search_binding.dart';
|
||||
import 'package:rogapp/pages/search/search_page.dart';
|
||||
import 'package:rogapp/pages/subperf/subperf_page.dart';
|
||||
import 'package:rogapp/screens/auth/views/login/login_screen.dart';
|
||||
import 'package:rogapp/screens/auth/views/register/register_screen.dart';
|
||||
import 'package:rogapp/screens/home/home_screen.dart';
|
||||
import 'package:rogapp/spa/spa_binding.dart';
|
||||
import 'package:rogapp/spa/spa_page.dart';
|
||||
|
||||
import '../screens/home/home_binding.dart';
|
||||
|
||||
|
||||
part 'app_routes.dart';
|
||||
|
||||
class AppPages {
|
||||
|
||||
static const S_HOME = Routes.S_HOME;
|
||||
static const S_LOGIN = Routes.S_LOGIN;
|
||||
static const S_REGISTER= Routes.S_REGISTER;
|
||||
|
||||
// ignore: constant_identifier_names
|
||||
static const INITIAL = Routes.INDEX;
|
||||
static const INDEX = Routes.INDEX;
|
||||
// ignore: constant_identifier_names
|
||||
static const SPA = Routes.SPA;
|
||||
static const LANDING = Routes.LANDING;
|
||||
@ -56,45 +46,18 @@ class AppPages {
|
||||
static const CHANGE_PASSWORD = Routes.CHANGE_PASSWORD;
|
||||
static const CAMERA_PAGE = Routes.CAMERA_PAGE;
|
||||
static const PROGRESS = Routes.PROGRESS;
|
||||
static const HISTORY = Routes.HISTORY;
|
||||
static const GPS = Routes.GPS;
|
||||
|
||||
static final routes = [
|
||||
// GetPage(
|
||||
// name: Routes.HOME,
|
||||
// page: () => HomePage(),
|
||||
// binding: HomeBinding(),
|
||||
// ),
|
||||
// GetPage(
|
||||
// name: Routes.MAP,
|
||||
// page: () => MapPage(),
|
||||
// binding: MapBinding(),
|
||||
// )
|
||||
GetPage(
|
||||
name: Routes.S_HOME,
|
||||
page: () => HomeScreen(),
|
||||
binding: HomeBinding()
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.S_LOGIN,
|
||||
page: () => LoginScreen(),
|
||||
//binding: IndexBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.S_REGISTER,
|
||||
page: () => RegisterScreen(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.INDEX,
|
||||
page: () => IndexPage(),
|
||||
//binding: IndexBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.SPA,
|
||||
page: () => const SpaPage(),
|
||||
binding: SpaBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.LANDING,
|
||||
page: () => LandingPage(),
|
||||
page: () => const LandingPage(),
|
||||
//binding: SpaBinding(),
|
||||
),
|
||||
GetPage(
|
||||
@ -107,62 +70,44 @@ class AppPages {
|
||||
page: () => RegisterPage(),
|
||||
//binding: SpaBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.TRAVEL,
|
||||
page: () => DestnationPage(),
|
||||
binding: DestinationBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.LOADING,
|
||||
page: () => LoadingPage(),
|
||||
//binding: DestinationBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.DESTINATION_MAP,
|
||||
page: () => DestnationPage(),
|
||||
page: () => const LoadingPage(),
|
||||
//binding: DestinationBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.HOME,
|
||||
page: () => HomePage(),
|
||||
page: () => const HomePage(),
|
||||
binding: HomeBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.PERMISSION,
|
||||
page: () => PermissionHandlerScreen(),
|
||||
page: () => const PermissionHandlerScreen(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.SEARCH,
|
||||
page: () => SearchPage(),
|
||||
binding: SearchBinding(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.MAINPERF,
|
||||
page: () => MainPerfPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.SUBPERF,
|
||||
page: () => SubPerfPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.CITY,
|
||||
page: () => CityPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.CATEOGORY,
|
||||
page: () => CategoryPage(),
|
||||
page: () => const CityPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.CHANGE_PASSWORD,
|
||||
page: () => ChangePasswordPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.CAMERA_PAGE,
|
||||
page: () => CameraPage(),
|
||||
name: Routes.PROGRESS,
|
||||
page: () => const ProgressPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.PROGRESS,
|
||||
page: () => ProgressPage(),
|
||||
name: Routes.HISTORY,
|
||||
page: () => const HistoryPage(),
|
||||
),
|
||||
GetPage(
|
||||
name: Routes.GPS,
|
||||
page: () => const GpsPage(),
|
||||
)
|
||||
];
|
||||
}
|
||||
@ -1,9 +1,6 @@
|
||||
part of 'app_pages.dart';
|
||||
|
||||
abstract class Routes {
|
||||
static const S_HOME = '/s_home';
|
||||
static const S_LOGIN = '/s_login';
|
||||
static const S_REGISTER = '/s_register';
|
||||
// Main Menu Route
|
||||
// static const HOME = '/';
|
||||
// static const MAP = '/map';
|
||||
@ -27,4 +24,6 @@ abstract class Routes {
|
||||
static const CHANGE_PASSWORD = '/change_password';
|
||||
static const CAMERA_PAGE = '/camera_page';
|
||||
static const PROGRESS = '/progress';
|
||||
static const HISTORY = '/history';
|
||||
static const GPS = '/gp';
|
||||
}
|
||||
|
||||
@ -1,36 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rogapp/theme/pallete.dart';
|
||||
|
||||
class AuthTextField extends StatelessWidget {
|
||||
final TextEditingController controller;
|
||||
final String hinttext;
|
||||
final bool isObsque;
|
||||
const AuthTextField({super.key, required this.controller, required this.hinttext, this.isObsque = false});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return TextFormField(
|
||||
controller: controller,
|
||||
decoration: InputDecoration(
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
borderSide: const BorderSide(
|
||||
color: Pallete.BLUE_COLOR,
|
||||
width: 2
|
||||
)
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
borderSide: const BorderSide(
|
||||
color: Pallete.BROWN_COLOR,
|
||||
)
|
||||
),
|
||||
contentPadding: const EdgeInsets.all(22),
|
||||
hintText: hinttext,
|
||||
hintStyle: const TextStyle(
|
||||
fontSize: 18,
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
|
||||
import 'package:rogapp/theme/theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class RoundedSmallButton extends StatelessWidget {
|
||||
final VoidCallback onTap;
|
||||
final String label;
|
||||
final Color backgroundColor;
|
||||
final Color textColor;
|
||||
|
||||
const RoundedSmallButton({
|
||||
super.key,
|
||||
required this.onTap,
|
||||
required this.label,
|
||||
this.backgroundColor = Pallete.WHITE_COLOR,
|
||||
this.textColor = Pallete.BACKGROUND_COLOR,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return InkWell(
|
||||
onTap: onTap,
|
||||
child: Chip(
|
||||
label: Text(label, style: TextStyle(color: textColor, fontSize: 16),),
|
||||
backgroundColor: backgroundColor,
|
||||
labelPadding:const EdgeInsets.symmetric(horizontal: 10, vertical: 3),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,45 +0,0 @@
|
||||
import 'dart:convert' as convert;
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/model/user.dart';
|
||||
import 'package:rogapp/utils/const.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
|
||||
class AuthController extends GetxController{
|
||||
var isLoading = false.obs;
|
||||
var authList = List<AuthResponse>.empty(growable: true).obs;
|
||||
|
||||
void signinUser(String email, String password) async {
|
||||
try{
|
||||
isLoading(true);
|
||||
String serverUrl = ConstValues.currentServer();
|
||||
String url = '$serverUrl/api/login/';
|
||||
final http.Response response = await http.post(
|
||||
Uri.parse(url),
|
||||
headers: <String, String>{
|
||||
'Content-Type': 'application/json; charset=UTF-8',
|
||||
},
|
||||
body: convert.jsonEncode(<String, String>{
|
||||
'email': email,
|
||||
'password': password
|
||||
}),
|
||||
);
|
||||
if (response.statusCode == 200) {
|
||||
print(response.body);
|
||||
AuthResponse authResponse = AuthResponse.fromJson(convert.jsonDecode(convert.utf8.decode(response.body.codeUnits)));
|
||||
print(authResponse.user.eventCode.toString());
|
||||
authList.assign(authResponse);
|
||||
}
|
||||
else{
|
||||
throw("Unable to Login, please check your creadentials");
|
||||
}
|
||||
}
|
||||
catch(e){
|
||||
Get.snackbar("Error", e.toString(), snackPosition: SnackPosition.BOTTOM);
|
||||
}
|
||||
finally{
|
||||
isLoading(false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,5 +0,0 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class LoginController extends GetxController{
|
||||
|
||||
}
|
||||
@ -1,75 +0,0 @@
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:rogapp/common/ui/widgets/uis.dart';
|
||||
import 'package:rogapp/routes/app_pages.dart';
|
||||
import 'package:rogapp/screens/auth/common/uis/auth_text_field.dart';
|
||||
import 'package:rogapp/screens/auth/common/uis/rounded_small_button.dart';
|
||||
import 'package:rogapp/screens/auth/controller/auth_controller.dart';
|
||||
import 'package:rogapp/theme/theme.dart';
|
||||
|
||||
class LoginScreen extends StatelessWidget {
|
||||
final emailController = TextEditingController();
|
||||
final passwordController = TextEditingController();
|
||||
LoginScreen({super.key});
|
||||
|
||||
final AuthController authController = Get.find<AuthController>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: UIs.appBar(),
|
||||
body: Obx((){
|
||||
if(authController.isLoading.value) {
|
||||
return const Center(child: CircularProgressIndicator(),);
|
||||
} else {
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Column(
|
||||
children: [
|
||||
Container(
|
||||
height: MediaQuery.of(context).size.height/6,
|
||||
decoration: const BoxDecoration(
|
||||
image:DecorationImage(image: AssetImage('assets/images/login_image.jpg'))
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 5,),
|
||||
AuthTextField(controller: emailController, hinttext: 'Email',),
|
||||
const SizedBox(height: 25,),
|
||||
AuthTextField(controller: passwordController, hinttext: 'Password',),
|
||||
const SizedBox(height: 40,),
|
||||
Align(
|
||||
alignment: Alignment.topRight,
|
||||
child: RoundedSmallButton(onTap: (){
|
||||
authController.signinUser(emailController.text, passwordController.text);
|
||||
},
|
||||
label: 'Done',),
|
||||
),
|
||||
const SizedBox(height: 40,),
|
||||
RichText(
|
||||
text: TextSpan(
|
||||
text: "Don't have an account?",
|
||||
style: const TextStyle(fontSize: 16, color: Pallete.BROWN_COLOR),
|
||||
children: [
|
||||
TextSpan(
|
||||
text: " Signup",
|
||||
style: const TextStyle(color: Pallete.BLUE_COLOR, fontSize: 16),
|
||||
recognizer: TapGestureRecognizer()..onTap = (){
|
||||
Get.toNamed(AppPages.S_REGISTER);
|
||||
},
|
||||
),
|
||||
]
|
||||
)
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||