diff --git a/README.md b/README.md index ed8e4f1b..c0b8a79e 100644 --- a/README.md +++ b/README.md @@ -1,109 +1,16 @@ +# flutter_examples -# Syncfusion Flutter Examples +This project contains the Syncfusion Flutter UI widgets examples. -This repository contains the demos of Syncfusion Flutter UI widgets. This is the best place to check our widgets to get more insight about the usage of APIs. You can also check our widgets by installing the [sample browser application](https://play.google.com/store/apps/details?id=com.syncfusion.flutter.examples&hl=en) from Google Play Store, in which you can browse the demos for all the available widgets and view the source code of each example within the app itself. +## Getting Started - +This project is a starting point for a Flutter application. +A few resources to get you started if this is your first Flutter project: -## Table of contents -- [Requirements to run the demo](#requirements-to-run-the-demo) -- [Repository structure](#repository-structure) -- [Widgets catalog](#widgets-catalog) -- [How to run this project](#how-to-run-this-project) -- [Get the demo application](#get-the-demo-application) -- [Useful links](#useful-links) -- [Support and feedback](#support-and-feedback) -- [About Syncfusion](#about-syncfusion) +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) - -## Requirements to run the demo ## - -* [Flutter SDK](https://flutter.dev/docs/get-started/install) -* [Android studio](https://developer.android.com/studio/install) or [Visual studio code](https://code.visualstudio.com/download) -* Install Flutter extension in Android studio or in [VS code](https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter) - -## Repository structure ## - -This repository contains sample browser project. Each widgets sample will be found inside the lib/samples folder. Run this project to see the demo samples of all the Flutter widgets in single application. - -## Widgets catalog ## - -| Samples | Package | Description | -|---------|----------|-------------| -| DATA VISUALIZATION | -| [Cartesian Charts](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts) | [syncfusion_flutter_charts](https://pub.dev/packages/syncfusion_flutter_charts) | Plot over 30 chart types ranging from line charts to financial charts. | -| [Circular Charts](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/circular_charts) | [syncfusion_flutter_charts](https://pub.dev/packages/syncfusion_flutter_charts) | Visualize the data using pie, doughnut, and radial bar charts. | -| [Pyramid Chart](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/pyramid_charts) | [syncfusion_flutter_charts](https://pub.dev/packages/syncfusion_flutter_charts) | Visualize the organized data using pyramid chart. | -| [Funnel Chart](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/funnel_charts) | [syncfusion_flutter_charts](https://pub.dev/packages/syncfusion_flutter_charts) | Visualize the sequential data using funnel chart. | -| [Radial Gauge](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge) | [syncfusion_flutter_gauges](https://pub.dev/packages/syncfusion_flutter_gauges) | Visualize one or multiple measures on a circular scale with pointers and ranges. | -| [Barcodes](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes) | [syncfusion_flutter_barcodes](https://pub.dev/packages/syncfusion_flutter_barcodes) | Generate and display data in machine-readable 1D and 2D barcodes. | -| [Maps](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps) | [syncfusion_flutter_maps](https://pub.dev/packages/syncfusion_flutter_maps) | Easily visualize data over a geographical area. | -| [Circular ProgressBar](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar) | [syncfusion_flutter_gauges](https://pub.dev/packages/syncfusion_flutter_gauges) | Designed using Radial Gauge widget. Indicates the progress of a task with customizable visuals. | -| GRIDS | -| [DataGrid](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/datagrid) | [syncfusion_flutter_datagrid](https://pub.dev/packages/syncfusion_flutter_datagrid) | Displays large amounts of data with different data types in a tabular view | -| CALENDAR | -| [Event Calendar](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar) | [syncfusion_flutter_calendar](https://pub.dev/packages/syncfusion_flutter_calendar) | Allows you to easily visualize and schedule appointments. | -| [Date Range Picker](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker) | [syncfusion_flutter_datepicker](https://pub.dev/packages/syncfusion_flutter_datepicker) | Allows to easily select dates or range of dates. | -| VIEWER | -| [PDF Viewer](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/pdf_viewer) | [syncfusion_flutter_pdfviewer](https://pub.dev/packages/syncfusion_flutter_pdfviewer) | View the PDF document seamlessly and efficiently | -| FILE FORMATS | -| [PDF](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/pdf) | [syncfusion_flutter_pdf](https://pub.dev/packages/syncfusion_flutter_pdf) | Create PDF document with text, images and tables. | -| [XlsIO](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/xlsio) | [syncfusion_flutter_xlsio](https://pub.dev/packages/syncfusion_flutter_xlsio) | Create Excel documents with text, numbers, cell formatting, formulas, charts, images, and more. | -| SLIDERS | -| [Slider](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider) | [syncfusion_flutter_sliders](https://pub.dev/packages/syncfusion_flutter_sliders) | Select a date or numeric value. | -| [Range Slider](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_slider) | [syncfusion_flutter_sliders](https://pub.dev/packages/syncfusion_flutter_sliders) | Select a date or numeric range. | -| [Range Selector](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector) | [syncfusion_flutter_sliders](https://pub.dev/packages/syncfusion_flutter_sliders) | Visualize data and select a date or numeric range. | -| SIGNATURE PAD | -| [Signature Pad](https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/signature_pad) | [syncfusion_flutter_signaturepad](https://pub.dev/packages/syncfusion_flutter_signaturepad) | Captures the signature and save it as an image to sync across devices and documents. | - -## How to run this project ## - -**Step 1** - -Download or clone the [flutter-examples](https://github.com/syncfusion/flutter-examples) repository into your machine. - -**Step 2** - -Run the following command to get the required packages. - -```dart -$ flutter pub get -``` - -**Step 3** - -Run your application either using `F5` or `Run > Start Debugging`. - -## Get the demo application ## - -Explore the full capabilities of our Flutter widgets on your device by installing our sample browser applications from the below app stores, and view samples code in GitHub. - -

- - -

-

- -

- -## Useful links ## -Take a look at the following to learn more about Syncfusion Flutter widgets: - -* [Syncfusion Flutter product page](https://www.syncfusion.com/flutter-widgets) -* [User guide documentation](https://help.syncfusion.com/flutter/introduction/overview) -* [API reference](https://help.syncfusion.com/flutter/introduction/api-reference) -* [Source](https://github.com/syncfusion/flutter-widgets) -* [Knowledge base](https://www.syncfusion.com/kb/flutter) -* [Video tutorials](https://www.syncfusion.com/tutorial-videos/flutter) - -## Support and feedback ## - -* For any other queries, reach our [Syncfusion support team](https://www.syncfusion.com/support/directtrac/incidents/newincident) or post the queries through the [Community forums](https://www.syncfusion.com/forums) and submit a feature request or a bug through our [Feedback portal](https://www.syncfusion.com/feedback/flutter). -* To renew the subscription, click [renew](https://www.syncfusion.com/sales/products) or contact our sales team at salessupport@syncfusion.com | Toll Free: 1-888-9 DOTNET. - -## About Syncfusion - -Founded in 2001 and headquartered in Research Triangle Park, N.C., Syncfusion has more than 20,000 customers and more than 1 million users, including large financial institutions, Fortune 500 companies, and global IT consultancies. - -Today we provide 1,000+ controls and frameworks for web ([ASP.NET Core](https://www.syncfusion.com/aspnet-core-ui-controls), [ASP.NET MVC](https://www.syncfusion.com/aspnet-mvc-ui-controls), [ASP.NET WebForms](https://www.syncfusion.com/jquery/aspnet-web-forms-ui-controls), [JavaScript](https://www.syncfusion.com/javascript-ui-controls), [Angular](https://www.syncfusion.com/angular-ui-components), [React](https://www.syncfusion.com/react-ui-components), [Vue](https://www.syncfusion.com/vue-ui-components), and [Blazor](https://www.syncfusion.com/blazor-components), mobile ([Xamarin](https://www.syncfusion.com/xamarin-ui-controls), [Flutter](https://www.syncfusion.com/flutter-widgets), [UWP](https://www.syncfusion.com/uwp-ui-controls), and [JavaScript](https://www.syncfusion.com/javascript-ui-controls)), and desktop development ([WinForms](https://www.syncfusion.com/winforms-ui-controls), [WPF](https://www.syncfusion.com/wpf-ui-controls), and [UWP](https://www.syncfusion.com/uwp-ui-controls)). We provide ready-to deploy enterprise software for dashboards, reports, data integration, and big data processing. Many customers have saved millions in licensing fees by deploying our software. +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/android/app/build.gradle b/android/app/build.gradle index e8b5522e..14aa8c59 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -25,7 +25,7 @@ apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 28 + compileSdkVersion 29 lintOptions { disable 'InvalidPackage' @@ -35,7 +35,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.syncfusion.flutter_examples" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" diff --git a/android/app/src/main/java/com/syncfusion/flutter_examples/MainActivity.java b/android/app/src/main/java/com/syncfusion/flutter_examples/MainActivity.java index 0bf4909c..d2cc6a8e 100644 --- a/android/app/src/main/java/com/syncfusion/flutter_examples/MainActivity.java +++ b/android/app/src/main/java/com/syncfusion/flutter_examples/MainActivity.java @@ -20,7 +20,7 @@ import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { - + @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); diff --git a/assets/australia.json b/assets/australia.json new file mode 100644 index 00000000..bd1919a2 --- /dev/null +++ b/assets/australia.json @@ -0,0 +1,117 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": 0, + "properties": { + "STATE_CODE": "1", + "STATE_NAME": "New South Wales" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 151.145550, -33.824079 ], [ 151.143844, -33.829174 ], [ 151.169325, -33.839309 ], [ 151.180206, -33.836165 ], [ 151.174277, -33.843006 ], [ 151.143088, -33.835565 ], [ 151.135902, -33.836469 ], [ 151.148783, -33.839386 ], [ 151.133837, -33.844837 ], [ 151.112863, -33.829724 ], [ 151.108625, -33.835555 ], [ 151.092828, -33.819609 ], [ 151.070345, -33.816445 ], [ 151.051336, -33.823662 ], [ 151.084007, -33.822080 ], [ 151.075192, -33.832683 ], [ 151.080873, -33.845750 ], [ 151.083228, -33.827897 ], [ 151.093817, -33.824443 ], [ 151.089778, -33.833044 ], [ 151.098921, -33.831641 ], [ 151.093602, -33.839764 ], [ 151.102215, -33.838102 ], [ 151.099653, -33.844209 ], [ 151.104144, -33.834387 ], [ 151.120767, -33.841788 ], [ 151.113783, -33.853971 ], [ 151.122305, -33.856994 ], [ 151.119070, -33.864711 ], [ 151.128397, -33.860961 ], [ 151.122165, -33.848934 ], [ 151.126983, -33.844195 ], [ 151.142064, -33.845845 ], [ 151.142273, -33.853358 ], [ 151.149526, -33.846908 ], [ 151.144434, -33.843531 ], [ 151.154043, -33.842070 ], [ 151.164849, -33.855249 ], [ 151.144520, -33.863162 ], [ 151.149559, -33.866131 ], [ 151.141168, -33.869844 ], [ 151.150870, -33.872265 ], [ 151.185490, -33.846008 ], [ 151.190538, -33.852375 ], [ 151.184547, -33.853645 ], [ 151.196507, -33.859694 ], [ 151.173504, -33.871203 ], [ 151.189337, -33.875840 ], [ 151.185985, -33.868381 ], [ 151.194011, -33.862376 ], [ 151.201538, -33.873175 ], [ 151.200176, -33.855383 ], [ 151.208045, -33.853512 ], [ 151.209700, -33.861004 ], [ 151.222724, -33.859227 ], [ 151.220606, -33.869096 ], [ 151.229928, -33.858256 ], [ 151.231825, -33.874752 ], [ 151.240091, -33.866392 ], [ 151.246131, -33.873421 ], [ 151.252331, -33.863738 ], [ 151.254657, -33.870793 ], [ 151.266971, -33.870651 ], [ 151.264376, -33.850885 ], [ 151.277581, -33.851090 ], [ 151.281068, -33.832821 ], [ 151.287848, -33.850202 ], [ 151.285699, -33.891955 ], [ 151.274326, -33.893627 ], [ 151.271398, -33.914235 ], [ 151.257621, -33.922461 ], [ 151.265693, -33.941447 ], [ 151.257087, -33.952320 ], [ 151.265965, -33.968030 ], [ 151.251886, -33.964671 ], [ 151.258952, -33.975768 ], [ 151.251185, -33.978936 ], [ 151.249211, -34.001814 ], [ 151.230804, -33.992554 ], [ 151.226024, -33.976737 ], [ 151.208864, -33.982165 ], [ 151.220080, -33.967204 ], [ 151.207515, -33.969846 ], [ 151.211072, -33.961847 ], [ 151.192349, -33.954223 ], [ 151.192722, -33.973925 ], [ 151.186067, -33.952356 ], [ 151.181720, -33.967898 ], [ 151.168033, -33.949774 ], [ 151.139781, -34.003281 ], [ 151.122700, -34.000518 ], [ 151.130740, -33.983977 ], [ 151.118302, -33.990491 ], [ 151.112694, -34.005369 ], [ 151.117358, -34.013775 ], [ 151.107858, -34.014364 ], [ 151.109517, -34.022705 ], [ 151.126957, -34.009899 ], [ 151.137635, -34.037053 ], [ 151.159864, -34.032201 ], [ 151.141756, -34.014559 ], [ 151.157393, -34.013218 ], [ 151.162119, -34.000028 ], [ 151.178624, -34.012843 ], [ 151.158315, -34.014511 ], [ 151.159558, -34.023258 ], [ 151.196318, -34.021228 ], [ 151.206430, -34.014045 ], [ 151.186751, -34.007530 ], [ 151.221931, -34.001214 ], [ 151.231455, -34.011663 ], [ 151.230295, -34.026401 ], [ 151.214520, -34.041930 ], [ 151.185918, -34.034563 ], [ 151.165543, -34.040719 ], [ 151.155880, -34.051861 ], [ 151.153407, -34.073152 ], [ 151.147416, -34.073366 ], [ 151.148906, -34.054581 ], [ 151.140341, -34.073794 ], [ 151.133934, -34.055550 ], [ 151.129658, -34.069298 ], [ 151.111637, -34.072455 ], [ 151.114401, -34.059429 ], [ 151.105961, -34.059439 ], [ 151.112134, -34.043153 ], [ 151.105231, -34.042091 ], [ 151.101770, -34.058999 ], [ 151.096978, -34.047053 ], [ 151.092183, -34.057661 ], [ 151.077022, -34.053923 ], [ 151.089079, -34.058214 ], [ 151.088837, -34.065546 ], [ 151.061128, -34.064351 ], [ 151.057465, -34.073609 ], [ 151.063033, -34.064650 ], [ 151.088446, -34.069568 ], [ 151.095785, -34.058002 ], [ 151.101980, -34.065367 ], [ 151.105556, -34.079512 ], [ 151.078582, -34.089316 ], [ 151.099223, -34.089631 ], [ 151.110204, -34.078284 ], [ 151.132195, -34.075984 ], [ 151.124191, -34.092213 ], [ 151.135161, -34.082260 ], [ 151.133150, -34.073528 ], [ 151.136951, -34.081700 ], [ 151.150032, -34.083695 ], [ 151.168974, -34.074918 ], [ 151.171761, -34.086503 ], [ 151.151792, -34.115075 ], [ 151.135794, -34.120303 ], [ 151.127882, -34.137919 ], [ 151.118696, -34.137011 ], [ 151.111440, -34.148009 ], [ 151.045254, -34.186193 ], [ 150.988696, -34.231862 ], [ 150.928023, -34.316624 ], [ 150.924432, -34.327458 ], [ 150.930286, -34.331102 ], [ 150.919412, -34.358542 ], [ 150.931300, -34.368752 ], [ 150.902085, -34.407696 ], [ 150.904246, -34.420780 ], [ 150.910846, -34.421307 ], [ 150.902392, -34.433215 ], [ 150.901079, -34.459318 ], [ 150.909810, -34.464763 ], [ 150.898757, -34.462019 ], [ 150.894896, -34.451032 ], [ 150.884085, -34.457706 ], [ 150.907936, -34.475512 ], [ 150.913644, -34.464800 ], [ 150.921906, -34.493851 ], [ 150.908840, -34.493170 ], [ 150.891364, -34.506365 ], [ 150.874570, -34.538312 ], [ 150.862742, -34.529093 ], [ 150.873463, -34.498847 ], [ 150.886849, -34.497801 ], [ 150.886605, -34.491595 ], [ 150.832395, -34.486299 ], [ 150.837644, -34.500485 ], [ 150.811748, -34.507363 ], [ 150.819484, -34.517631 ], [ 150.808930, -34.524891 ], [ 150.812573, -34.530276 ], [ 150.807644, -34.525073 ], [ 150.813506, -34.534186 ], [ 150.796795, -34.546199 ], [ 150.810358, -34.549251 ], [ 150.795312, -34.555201 ], [ 150.804238, -34.561351 ], [ 150.816440, -34.553547 ], [ 150.832287, -34.556869 ], [ 150.837573, -34.542704 ], [ 150.862037, -34.537457 ], [ 150.873652, -34.544441 ], [ 150.868446, -34.570207 ], [ 150.877301, -34.579955 ], [ 150.875128, -34.589351 ], [ 150.904456, -34.596968 ], [ 150.887547, -34.598338 ], [ 150.876885, -34.608024 ], [ 150.866629, -34.604505 ], [ 150.855877, -34.614649 ], [ 150.862068, -34.628953 ], [ 150.856594, -34.646030 ], [ 150.865478, -34.648890 ], [ 150.854772, -34.663378 ], [ 150.864679, -34.671917 ], [ 150.855094, -34.676398 ], [ 150.860942, -34.688143 ], [ 150.833299, -34.738644 ], [ 150.837007, -34.754547 ], [ 150.822899, -34.773159 ], [ 150.825135, -34.782505 ], [ 150.811494, -34.772974 ], [ 150.782121, -34.791323 ], [ 150.760547, -34.820646 ], [ 150.749538, -34.855160 ], [ 150.751467, -34.890586 ], [ 150.760049, -34.900442 ], [ 150.770895, -34.895815 ], [ 150.768621, -34.926048 ], [ 150.785753, -34.930429 ], [ 150.776325, -34.947837 ], [ 150.784718, -34.986574 ], [ 150.810238, -35.012456 ], [ 150.821423, -35.014745 ], [ 150.829846, -35.002907 ], [ 150.849715, -35.012891 ], [ 150.831646, -35.041184 ], [ 150.842983, -35.050636 ], [ 150.833758, -35.074355 ], [ 150.805821, -35.094438 ], [ 150.786259, -35.072542 ], [ 150.776154, -35.083012 ], [ 150.775738, -35.054144 ], [ 150.787111, -35.036227 ], [ 150.767252, -35.015173 ], [ 150.778271, -35.002448 ], [ 150.750987, -34.990845 ], [ 150.726267, -34.996650 ], [ 150.728397, -35.007549 ], [ 150.692061, -35.014115 ], [ 150.671130, -35.037153 ], [ 150.679510, -35.049259 ], [ 150.676828, -35.069026 ], [ 150.697959, -35.071135 ], [ 150.691608, -35.083161 ], [ 150.701604, -35.122862 ], [ 150.661053, -35.117824 ], [ 150.657742, -35.105186 ], [ 150.647068, -35.101652 ], [ 150.638256, -35.116681 ], [ 150.614193, -35.116536 ], [ 150.620558, -35.106175 ], [ 150.595250, -35.101546 ], [ 150.587140, -35.088315 ], [ 150.586233, -35.093915 ], [ 150.576903, -35.088371 ], [ 150.579468, -35.099236 ], [ 150.563048, -35.093674 ], [ 150.549499, -35.103040 ], [ 150.565456, -35.102507 ], [ 150.568716, -35.112856 ], [ 150.541380, -35.118777 ], [ 150.544818, -35.122930 ], [ 150.565494, -35.119567 ], [ 150.574358, -35.122863 ], [ 150.569959, -35.130350 ], [ 150.586461, -35.120235 ], [ 150.598912, -35.127192 ], [ 150.585885, -35.138164 ], [ 150.605105, -35.156175 ], [ 150.601334, -35.170066 ], [ 150.591249, -35.172472 ], [ 150.597420, -35.190064 ], [ 150.572751, -35.193035 ], [ 150.540543, -35.215675 ], [ 150.530200, -35.235074 ], [ 150.545226, -35.248436 ], [ 150.478024, -35.291824 ], [ 150.471901, -35.316547 ], [ 150.487294, -35.324977 ], [ 150.475899, -35.330281 ], [ 150.475586, -35.346446 ], [ 150.485034, -35.353284 ], [ 150.474882, -35.356554 ], [ 150.492479, -35.366331 ], [ 150.478544, -35.367845 ], [ 150.452093, -35.389968 ], [ 150.449098, -35.406757 ], [ 150.423084, -35.420975 ], [ 150.410745, -35.436522 ], [ 150.415734, -35.445422 ], [ 150.406091, -35.445871 ], [ 150.403749, -35.458115 ], [ 150.392847, -35.464609 ], [ 150.390874, -35.498431 ], [ 150.401584, -35.506192 ], [ 150.406331, -35.533928 ], [ 150.396202, -35.533120 ], [ 150.385042, -35.546132 ], [ 150.386919, -35.562708 ], [ 150.375839, -35.563551 ], [ 150.376802, -35.571802 ], [ 150.364873, -35.570642 ], [ 150.346391, -35.587906 ], [ 150.340029, -35.597308 ], [ 150.345640, -35.604252 ], [ 150.322605, -35.613539 ], [ 150.326048, -35.637215 ], [ 150.313561, -35.635562 ], [ 150.299254, -35.647388 ], [ 150.297430, -35.663088 ], [ 150.307557, -35.668763 ], [ 150.299687, -35.678853 ], [ 150.306552, -35.686106 ], [ 150.299061, -35.683723 ], [ 150.297440, -35.696100 ], [ 150.280941, -35.703348 ], [ 150.276600, -35.723524 ], [ 150.270352, -35.719129 ], [ 150.265411, -35.726463 ], [ 150.262428, -35.717863 ], [ 150.251028, -35.719400 ], [ 150.250492, -35.711488 ], [ 150.233969, -35.702933 ], [ 150.212214, -35.711807 ], [ 150.210273, -35.702356 ], [ 150.177263, -35.703075 ], [ 150.214480, -35.737926 ], [ 150.211872, -35.759990 ], [ 150.234944, -35.771762 ], [ 150.237379, -35.791939 ], [ 150.230108, -35.801106 ], [ 150.237153, -35.801716 ], [ 150.224191, -35.808749 ], [ 150.230793, -35.818402 ], [ 150.224934, -35.827793 ], [ 150.235278, -35.835527 ], [ 150.217544, -35.830701 ], [ 150.210168, -35.835846 ], [ 150.199136, -35.828596 ], [ 150.186699, -35.833116 ], [ 150.189893, -35.838464 ], [ 150.177660, -35.850199 ], [ 150.191359, -35.860505 ], [ 150.169215, -35.862520 ], [ 150.150243, -35.891139 ], [ 150.152075, -35.907795 ], [ 150.161817, -35.908667 ], [ 150.155057, -35.945862 ], [ 150.160404, -35.953897 ], [ 150.151067, -35.978860 ], [ 150.154079, -35.991911 ], [ 150.164327, -35.993640 ], [ 150.157407, -36.007989 ], [ 150.164553, -36.013024 ], [ 150.149238, -36.028810 ], [ 150.144535, -36.056992 ], [ 150.134469, -36.065940 ], [ 150.133960, -36.090214 ], [ 150.141502, -36.094435 ], [ 150.124334, -36.141924 ], [ 150.125418, -36.160140 ], [ 150.135854, -36.172495 ], [ 150.130935, -36.199788 ], [ 150.142489, -36.217796 ], [ 150.148569, -36.266969 ], [ 150.130773, -36.288866 ], [ 150.139723, -36.304902 ], [ 150.089788, -36.353992 ], [ 150.066831, -36.398525 ], [ 150.067640, -36.419410 ], [ 150.084760, -36.429194 ], [ 150.054818, -36.488115 ], [ 150.062206, -36.506550 ], [ 150.055537, -36.540206 ], [ 150.068288, -36.554137 ], [ 150.055783, -36.570668 ], [ 150.056813, -36.582939 ], [ 150.044143, -36.589002 ], [ 149.999881, -36.665002 ], [ 149.999328, -36.685645 ], [ 149.992487, -36.687797 ], [ 149.997116, -36.692217 ], [ 149.982757, -36.702281 ], [ 149.979306, -36.722228 ], [ 149.991869, -36.725572 ], [ 149.981850, -36.737080 ], [ 149.977198, -36.769631 ], [ 149.940621, -36.811683 ], [ 149.934352, -36.844126 ], [ 149.950011, -36.855390 ], [ 149.939116, -36.857512 ], [ 149.930172, -36.873988 ], [ 149.935305, -36.884159 ], [ 149.929592, -36.894714 ], [ 149.938102, -36.902453 ], [ 149.919697, -36.895441 ], [ 149.904788, -36.914648 ], [ 149.913436, -36.944592 ], [ 149.945918, -36.949130 ], [ 149.933505, -36.959335 ], [ 149.926665, -36.992060 ], [ 149.930788, -37.007831 ], [ 149.947732, -37.017556 ], [ 149.939898, -37.031216 ], [ 149.944652, -37.053996 ], [ 149.923414, -37.046306 ], [ 149.909916, -37.062083 ], [ 149.914847, -37.076119 ], [ 149.901876, -37.069158 ], [ 149.872514, -37.083208 ], [ 149.878305, -37.101044 ], [ 149.893487, -37.097087 ], [ 149.911385, -37.111800 ], [ 149.929726, -37.110113 ], [ 149.926203, -37.100315 ], [ 149.953789, -37.100888 ], [ 149.952320, -37.108727 ], [ 149.971312, -37.117834 ], [ 149.968962, -37.125682 ], [ 149.987616, -37.141124 ], [ 150.004869, -37.141269 ], [ 150.009550, -37.161268 ], [ 150.002958, -37.168505 ], [ 150.020860, -37.185414 ], [ 150.015523, -37.201106 ], [ 150.023399, -37.211966 ], [ 150.010766, -37.211813 ], [ 150.027744, -37.222497 ], [ 150.030825, -37.237860 ], [ 150.051842, -37.262255 ], [ 150.013021, -37.255478 ], [ 149.986780, -37.239932 ], [ 149.966025, -37.249843 ], [ 149.944008, -37.277729 ], [ 149.950848, -37.295648 ], [ 149.969726, -37.309697 ], [ 149.972162, -37.328523 ], [ 149.949831, -37.374669 ], [ 149.956554, -37.423509 ], [ 149.975410, -37.445450 ], [ 149.976679, -37.505060 ], [ 148.194946, -36.796253 ], [ 148.182473, -36.804895 ], [ 148.179595, -36.796326 ], [ 148.156663, -36.790013 ], [ 148.126771, -36.796451 ], [ 148.120152, -36.806079 ], [ 148.108888, -36.800865 ], [ 148.097983, -36.787161 ], [ 148.126081, -36.759417 ], [ 148.120472, -36.756303 ], [ 148.132654, -36.750847 ], [ 148.136703, -36.738436 ], [ 148.130703, -36.734683 ], [ 148.170243, -36.712799 ], [ 148.211171, -36.650519 ], [ 148.219547, -36.619558 ], [ 148.214196, -36.610490 ], [ 148.202781, -36.611915 ], [ 148.217563, -36.598239 ], [ 148.205990, -36.586932 ], [ 148.190330, -36.584891 ], [ 148.190134, -36.576620 ], [ 148.169411, -36.573696 ], [ 148.160713, -36.579776 ], [ 148.150489, -36.558336 ], [ 148.133410, -36.566921 ], [ 148.124337, -36.550642 ], [ 148.139815, -36.525445 ], [ 148.117630, -36.495476 ], [ 148.126424, -36.485274 ], [ 148.119093, -36.481884 ], [ 148.124663, -36.464713 ], [ 148.087601, -36.451895 ], [ 148.080280, -36.422101 ], [ 148.059945, -36.415538 ], [ 148.058163, -36.400804 ], [ 148.037583, -36.390225 ], [ 148.045966, -36.367038 ], [ 148.037836, -36.366246 ], [ 148.048959, -36.355632 ], [ 148.055613, -36.334386 ], [ 148.051243, -36.324557 ], [ 148.058941, -36.320046 ], [ 148.035011, -36.310577 ], [ 148.043928, -36.299479 ], [ 148.035234, -36.292329 ], [ 148.040119, -36.284157 ], [ 148.033753, -36.282230 ], [ 148.032828, -36.265860 ], [ 148.038676, -36.259221 ], [ 148.028840, -36.247044 ], [ 148.034900, -36.234116 ], [ 148.026096, -36.223042 ], [ 148.040620, -36.206951 ], [ 148.021819, -36.176462 ], [ 148.034795, -36.162983 ], [ 148.022899, -36.153457 ], [ 148.035191, -36.152536 ], [ 148.037726, -36.140797 ], [ 148.002388, -36.140057 ], [ 148.000537, -36.124355 ], [ 147.990652, -36.121272 ], [ 147.998229, -36.115919 ], [ 147.991074, -36.111251 ], [ 147.999218, -36.098655 ], [ 147.980247, -36.086482 ], [ 147.982389, -36.077891 ], [ 147.992889, -36.081071 ], [ 147.989467, -36.068478 ], [ 147.999692, -36.046204 ], [ 147.991260, -36.052559 ], [ 147.981774, -36.040254 ], [ 147.973234, -36.046314 ], [ 147.974260, -36.038505 ], [ 147.964964, -36.046853 ], [ 147.958994, -36.040974 ], [ 147.934261, -36.047637 ], [ 147.923974, -36.042491 ], [ 147.923752, -36.035709 ], [ 147.931559, -36.035267 ], [ 147.911490, -36.026597 ], [ 147.917083, -36.011204 ], [ 147.908543, -36.001473 ], [ 147.912342, -35.995198 ], [ 147.895698, -35.993018 ], [ 147.897506, -35.999861 ], [ 147.882880, -36.001798 ], [ 147.873121, -35.991006 ], [ 147.817498, -35.979741 ], [ 147.806153, -35.965057 ], [ 147.776849, -35.968614 ], [ 147.766797, -35.964158 ], [ 147.773261, -35.958863 ], [ 147.741292, -35.956490 ], [ 147.718672, -35.945513 ], [ 147.708415, -35.928545 ], [ 147.680010, -35.944439 ], [ 147.646777, -35.946008 ], [ 147.637771, -35.962110 ], [ 147.601438, -35.979118 ], [ 147.591893, -35.969859 ], [ 147.549115, -35.964550 ], [ 147.547654, -35.978625 ], [ 147.558887, -35.972489 ], [ 147.584027, -35.984648 ], [ 147.551873, -36.004095 ], [ 147.521359, -35.986936 ], [ 147.514925, -35.976369 ], [ 147.525267, -35.963338 ], [ 147.511421, -35.962412 ], [ 147.494112, -35.943549 ], [ 147.481553, -35.949223 ], [ 147.478835, -35.942689 ], [ 147.464072, -35.944137 ], [ 147.450685, -35.960804 ], [ 147.404631, -35.943495 ], [ 147.390342, -35.949266 ], [ 147.392344, -35.973533 ], [ 147.383679, -35.972352 ], [ 147.358193, -35.991276 ], [ 147.355287, -36.009832 ], [ 147.345681, -36.018772 ], [ 147.352825, -36.031749 ], [ 147.319949, -36.060987 ], [ 147.285177, -36.039439 ], [ 147.242378, -36.038482 ], [ 147.206299, -36.050136 ], [ 147.164456, -36.030798 ], [ 147.144361, -36.037765 ], [ 147.127391, -36.018047 ], [ 147.123357, -35.994498 ], [ 147.111931, -36.000922 ], [ 147.116280, -36.007635 ], [ 147.106820, -36.004825 ], [ 147.109228, -36.012549 ], [ 147.098074, -36.010246 ], [ 147.106364, -36.016455 ], [ 147.097671, -36.015823 ], [ 147.099095, -36.026194 ], [ 147.092140, -36.027650 ], [ 147.103712, -36.032854 ], [ 147.097003, -36.046784 ], [ 147.091582, -36.043861 ], [ 147.095444, -36.052710 ], [ 147.090400, -36.049226 ], [ 147.061812, -36.066155 ], [ 147.052963, -36.107881 ], [ 147.042344, -36.104305 ], [ 147.034141, -36.115239 ], [ 147.022777, -36.099895 ], [ 147.013473, -36.104721 ], [ 147.016319, -36.089798 ], [ 147.006396, -36.089115 ], [ 147.007444, -36.083732 ], [ 146.981298, -36.094876 ], [ 146.972589, -36.082113 ], [ 146.956824, -36.078061 ], [ 146.952498, -36.110788 ], [ 146.943705, -36.115989 ], [ 146.926804, -36.097178 ], [ 146.924058, -36.108315 ], [ 146.907763, -36.111284 ], [ 146.906910, -36.084946 ], [ 146.880556, -36.087524 ], [ 146.872952, -36.073681 ], [ 146.864530, -36.073084 ], [ 146.857158, -36.084918 ], [ 146.836700, -36.082073 ], [ 146.825026, -36.088724 ], [ 146.825542, -36.070847 ], [ 146.816301, -36.074377 ], [ 146.818380, -36.067834 ], [ 146.803936, -36.055194 ], [ 146.794570, -36.058545 ], [ 146.796181, -36.065138 ], [ 146.762818, -36.059519 ], [ 146.762315, -36.051665 ], [ 146.749851, -36.061277 ], [ 146.752929, -36.042113 ], [ 146.730065, -36.044724 ], [ 146.731645, -36.023725 ], [ 146.708878, -36.029435 ], [ 146.707141, -36.036122 ], [ 146.689603, -36.030446 ], [ 146.695002, -36.034315 ], [ 146.685812, -36.040576 ], [ 146.675365, -36.028599 ], [ 146.680199, -36.022376 ], [ 146.655996, -36.026252 ], [ 146.650336, -36.018411 ], [ 146.658574, -36.014488 ], [ 146.650178, -36.013796 ], [ 146.650868, -36.007735 ], [ 146.614299, -35.996480 ], [ 146.607820, -35.986372 ], [ 146.618716, -35.975937 ], [ 146.612520, -35.972858 ], [ 146.584147, -35.974987 ], [ 146.583967, -35.983864 ], [ 146.560301, -35.976391 ], [ 146.552029, -35.979592 ], [ 146.555958, -35.989182 ], [ 146.549581, -35.992457 ], [ 146.532293, -35.984299 ], [ 146.519681, -35.960604 ], [ 146.502585, -35.958235 ], [ 146.500674, -35.979244 ], [ 146.492480, -35.985012 ], [ 146.502134, -35.983188 ], [ 146.499726, -35.990870 ], [ 146.467407, -35.984240 ], [ 146.469966, -35.976201 ], [ 146.454595, -35.962247 ], [ 146.444738, -35.977991 ], [ 146.437159, -35.967015 ], [ 146.421673, -35.965831 ], [ 146.425169, -35.973027 ], [ 146.402962, -35.988780 ], [ 146.399134, -36.007199 ], [ 146.380606, -36.012895 ], [ 146.379594, -36.028127 ], [ 146.387557, -36.035639 ], [ 146.368684, -36.050862 ], [ 146.338890, -36.026395 ], [ 146.325022, -36.033543 ], [ 146.329072, -36.043144 ], [ 146.315875, -36.038453 ], [ 146.312986, -36.045568 ], [ 146.300963, -36.036590 ], [ 146.299009, -36.047859 ], [ 146.291396, -36.038952 ], [ 146.283023, -36.041488 ], [ 146.293104, -36.029503 ], [ 146.282181, -36.026188 ], [ 146.291125, -36.020163 ], [ 146.278803, -36.015850 ], [ 146.282895, -36.011048 ], [ 146.275030, -36.012441 ], [ 146.272859, -36.026631 ], [ 146.257183, -36.012053 ], [ 146.244593, -36.018340 ], [ 146.250889, -36.023130 ], [ 146.241433, -36.023524 ], [ 146.242980, -36.028784 ], [ 146.222171, -36.029921 ], [ 146.211155, -36.038860 ], [ 146.211581, -36.028559 ], [ 146.204747, -36.039158 ], [ 146.199244, -36.027453 ], [ 146.185976, -36.042071 ], [ 146.173104, -36.019293 ], [ 146.154680, -36.025159 ], [ 146.145863, -36.013776 ], [ 146.131357, -36.019413 ], [ 146.132045, -36.010095 ], [ 146.140650, -36.008954 ], [ 146.134761, -36.002547 ], [ 146.118718, -36.018014 ], [ 146.107678, -36.014369 ], [ 146.112378, -36.006811 ], [ 146.091470, -36.009477 ], [ 146.092199, -36.021266 ], [ 146.075639, -36.018177 ], [ 146.073550, -36.009637 ], [ 146.059295, -36.014548 ], [ 146.052346, -35.995465 ], [ 146.048421, -36.003158 ], [ 146.031488, -35.994714 ], [ 146.016143, -36.006962 ], [ 146.005866, -36.003569 ], [ 145.972070, -36.015747 ], [ 145.971314, -36.005651 ], [ 145.958336, -36.006973 ], [ 145.964818, -35.996770 ], [ 145.945744, -35.983809 ], [ 145.951071, -35.976626 ], [ 145.944304, -35.966495 ], [ 145.953701, -35.961500 ], [ 145.928000, -35.973947 ], [ 145.925821, -35.964563 ], [ 145.902934, -35.968856 ], [ 145.900756, -35.961529 ], [ 145.910314, -35.955962 ], [ 145.902693, -35.952496 ], [ 145.854042, -35.959927 ], [ 145.847975, -35.968689 ], [ 145.858624, -35.974814 ], [ 145.845548, -35.973460 ], [ 145.848589, -35.980899 ], [ 145.840021, -35.983244 ], [ 145.827548, -35.975438 ], [ 145.828252, -35.982982 ], [ 145.811353, -35.984102 ], [ 145.816680, -35.988200 ], [ 145.811662, -35.991769 ], [ 145.807980, -35.983762 ], [ 145.793445, -35.982817 ], [ 145.792732, -35.972801 ], [ 145.777006, -35.972559 ], [ 145.778211, -35.960243 ], [ 145.746109, -35.964239 ], [ 145.731027, -35.958734 ], [ 145.734238, -35.951348 ], [ 145.716766, -35.950594 ], [ 145.726300, -35.942312 ], [ 145.720274, -35.934449 ], [ 145.697327, -35.936501 ], [ 145.695763, -35.925792 ], [ 145.703269, -35.925702 ], [ 145.698181, -35.920977 ], [ 145.685852, -35.930615 ], [ 145.673992, -35.925924 ], [ 145.679053, -35.916829 ], [ 145.669121, -35.919586 ], [ 145.657449, -35.900686 ], [ 145.639730, -35.894239 ], [ 145.629570, -35.880105 ], [ 145.620321, -35.883884 ], [ 145.628134, -35.875409 ], [ 145.614857, -35.872570 ], [ 145.628320, -35.867775 ], [ 145.626347, -35.862758 ], [ 145.601748, -35.867857 ], [ 145.606474, -35.874998 ], [ 145.601134, -35.875008 ], [ 145.598028, -35.861458 ], [ 145.586792, -35.861245 ], [ 145.593230, -35.849077 ], [ 145.564011, -35.834190 ], [ 145.566840, -35.826497 ], [ 145.557997, -35.828230 ], [ 145.562836, -35.813449 ], [ 145.546741, -35.812894 ], [ 145.538763, -35.821813 ], [ 145.541889, -35.808905 ], [ 145.535398, -35.801983 ], [ 145.522510, -35.818486 ], [ 145.502556, -35.809449 ], [ 145.491977, -35.815076 ], [ 145.472128, -35.809230 ], [ 145.463440, -35.826274 ], [ 145.450658, -35.821418 ], [ 145.442293, -35.835642 ], [ 145.412575, -35.830601 ], [ 145.410625, -35.848613 ], [ 145.387150, -35.850142 ], [ 145.355400, -35.867067 ], [ 145.324453, -35.850686 ], [ 145.296542, -35.860566 ], [ 145.272698, -35.845203 ], [ 145.258317, -35.850588 ], [ 145.260717, -35.835426 ], [ 145.246178, -35.830321 ], [ 145.225029, -35.832184 ], [ 145.222760, -35.842440 ], [ 145.189806, -35.834267 ], [ 145.181014, -35.842026 ], [ 145.153456, -35.843045 ], [ 145.159170, -35.831077 ], [ 145.139579, -35.828538 ], [ 145.136636, -35.834270 ], [ 145.127683, -35.820716 ], [ 145.126435, -35.829671 ], [ 145.114092, -35.820548 ], [ 145.091922, -35.835957 ], [ 145.089998, -35.825457 ], [ 145.061056, -35.837309 ], [ 145.049713, -35.833671 ], [ 145.018998, -35.856647 ], [ 144.992263, -35.852338 ], [ 144.991436, -35.858984 ], [ 144.968187, -35.865528 ], [ 144.974954, -35.883845 ], [ 144.948917, -35.931602 ], [ 144.957378, -35.961005 ], [ 144.931005, -35.968470 ], [ 144.923606, -35.988768 ], [ 144.945759, -36.004312 ], [ 144.945499, -36.012186 ], [ 144.961831, -36.018216 ], [ 144.967808, -36.042078 ], [ 144.985932, -36.056509 ], [ 144.981909, -36.072316 ], [ 144.948290, -36.082904 ], [ 144.932614, -36.067049 ], [ 144.863460, -36.059112 ], [ 144.861373, -36.071838 ], [ 144.857534, -36.065171 ], [ 144.856474, -36.073553 ], [ 144.847176, -36.072881 ], [ 144.850851, -36.080645 ], [ 144.841901, -36.083098 ], [ 144.841922, -36.100576 ], [ 144.819903, -36.107947 ], [ 144.809893, -36.102428 ], [ 144.816340, -36.109865 ], [ 144.806398, -36.107457 ], [ 144.813362, -36.113912 ], [ 144.807870, -36.123628 ], [ 144.794782, -36.117285 ], [ 144.777064, -36.129837 ], [ 144.771896, -36.116132 ], [ 144.748239, -36.121746 ], [ 144.740569, -36.107576 ], [ 144.726379, -36.117781 ], [ 144.717445, -36.112113 ], [ 144.725675, -36.089438 ], [ 144.715385, -36.086214 ], [ 144.706461, -36.092948 ], [ 144.698886, -36.087259 ], [ 144.697522, -36.094047 ], [ 144.683907, -36.095138 ], [ 144.689004, -36.061417 ], [ 144.667856, -36.068596 ], [ 144.664631, -36.077042 ], [ 144.658022, -36.070380 ], [ 144.654966, -36.075349 ], [ 144.653191, -36.053240 ], [ 144.643921, -36.056664 ], [ 144.632744, -36.048097 ], [ 144.624999, -36.052081 ], [ 144.626288, -36.061800 ], [ 144.618300, -36.059708 ], [ 144.628221, -36.065259 ], [ 144.617670, -36.077192 ], [ 144.608432, -36.063641 ], [ 144.617551, -36.046904 ], [ 144.615473, -36.031593 ], [ 144.605957, -36.036542 ], [ 144.608761, -36.041808 ], [ 144.598917, -36.037411 ], [ 144.590991, -36.043318 ], [ 144.582515, -36.038135 ], [ 144.586445, -36.027182 ], [ 144.571127, -36.024079 ], [ 144.563385, -36.007806 ], [ 144.557655, -36.014107 ], [ 144.553661, -36.002984 ], [ 144.516140, -35.995438 ], [ 144.512009, -35.988895 ], [ 144.521099, -35.970266 ], [ 144.509950, -35.973945 ], [ 144.513047, -35.965202 ], [ 144.501128, -35.970606 ], [ 144.501900, -35.958039 ], [ 144.493963, -35.968592 ], [ 144.488638, -35.957123 ], [ 144.481230, -35.958609 ], [ 144.487583, -35.949511 ], [ 144.479758, -35.953295 ], [ 144.479415, -35.945275 ], [ 144.466691, -35.945927 ], [ 144.472233, -35.940725 ], [ 144.464123, -35.940942 ], [ 144.466553, -35.933602 ], [ 144.460553, -35.939596 ], [ 144.446974, -35.935531 ], [ 144.426505, -35.918744 ], [ 144.423428, -35.906005 ], [ 144.416979, -35.910472 ], [ 144.424381, -35.900194 ], [ 144.407927, -35.904013 ], [ 144.418183, -35.893220 ], [ 144.403628, -35.880666 ], [ 144.410936, -35.871189 ], [ 144.401926, -35.868020 ], [ 144.411388, -35.859003 ], [ 144.398635, -35.862667 ], [ 144.388885, -35.858480 ], [ 144.390318, -35.850553 ], [ 144.381433, -35.852423 ], [ 144.384314, -35.841922 ], [ 144.372936, -35.838150 ], [ 144.382044, -35.833175 ], [ 144.372189, -35.831950 ], [ 144.384118, -35.819565 ], [ 144.364806, -35.820937 ], [ 144.377484, -35.814346 ], [ 144.366709, -35.811253 ], [ 144.376850, -35.792979 ], [ 144.362329, -35.795834 ], [ 144.355338, -35.788479 ], [ 144.360283, -35.784811 ], [ 144.351546, -35.785069 ], [ 144.349111, -35.767142 ], [ 144.318651, -35.766574 ], [ 144.327832, -35.752646 ], [ 144.295276, -35.754379 ], [ 144.301278, -35.742986 ], [ 144.296060, -35.737091 ], [ 144.264496, -35.751403 ], [ 144.248150, -35.721034 ], [ 144.215952, -35.706477 ], [ 144.221647, -35.693952 ], [ 144.213483, -35.686671 ], [ 144.195139, -35.685858 ], [ 144.186788, -35.670431 ], [ 144.162351, -35.671526 ], [ 144.152629, -35.642678 ], [ 144.142927, -35.647253 ], [ 144.131488, -35.640761 ], [ 144.117546, -35.625926 ], [ 144.105015, -35.590780 ], [ 144.062285, -35.576768 ], [ 144.063958, -35.570545 ], [ 144.046800, -35.563141 ], [ 144.039215, -35.549257 ], [ 144.034082, -35.555971 ], [ 144.012702, -35.554073 ], [ 144.009646, -35.563307 ], [ 143.989865, -35.554663 ], [ 143.999221, -35.545367 ], [ 143.996841, -35.536250 ], [ 143.974476, -35.532309 ], [ 143.962441, -35.513980 ], [ 143.972536, -35.509249 ], [ 143.970101, -35.500078 ], [ 143.933355, -35.506610 ], [ 143.935045, -35.499288 ], [ 143.906183, -35.499958 ], [ 143.907733, -35.494162 ], [ 143.876584, -35.486166 ], [ 143.871380, -35.477828 ], [ 143.858784, -35.479978 ], [ 143.855435, -35.461838 ], [ 143.813021, -35.446265 ], [ 143.818018, -35.437545 ], [ 143.790117, -35.422477 ], [ 143.762852, -35.423066 ], [ 143.765962, -35.415858 ], [ 143.758802, -35.415427 ], [ 143.768823, -35.401809 ], [ 143.751004, -35.387835 ], [ 143.709175, -35.392538 ], [ 143.711685, -35.384690 ], [ 143.703349, -35.389408 ], [ 143.702284, -35.377882 ], [ 143.693148, -35.383917 ], [ 143.684521, -35.368446 ], [ 143.682627, -35.374091 ], [ 143.667922, -35.371554 ], [ 143.668081, -35.385735 ], [ 143.657140, -35.384999 ], [ 143.642338, -35.401037 ], [ 143.629381, -35.392368 ], [ 143.633019, -35.383467 ], [ 143.620416, -35.387682 ], [ 143.616037, -35.368884 ], [ 143.603015, -35.365407 ], [ 143.598448, -35.352111 ], [ 143.562074, -35.337244 ], [ 143.569019, -35.302447 ], [ 143.577937, -35.303197 ], [ 143.590860, -35.281659 ], [ 143.583507, -35.265005 ], [ 143.571690, -35.267959 ], [ 143.574076, -35.256505 ], [ 143.563717, -35.243545 ], [ 143.580984, -35.220036 ], [ 143.570828, -35.206905 ], [ 143.547023, -35.206173 ], [ 143.548335, -35.213790 ], [ 143.529155, -35.219921 ], [ 143.518322, -35.211620 ], [ 143.471482, -35.219293 ], [ 143.449486, -35.189112 ], [ 143.394677, -35.192377 ], [ 143.386969, -35.183462 ], [ 143.391820, -35.172567 ], [ 143.381936, -35.173120 ], [ 143.390647, -35.145107 ], [ 143.361967, -35.116900 ], [ 143.360762, -35.103032 ], [ 143.348103, -35.105440 ], [ 143.340858, -35.095714 ], [ 143.345023, -35.087020 ], [ 143.337446, -35.080418 ], [ 143.345520, -35.074056 ], [ 143.339058, -35.068191 ], [ 143.350838, -35.064702 ], [ 143.337663, -35.061294 ], [ 143.337264, -35.048645 ], [ 143.330492, -35.053880 ], [ 143.336543, -35.043219 ], [ 143.328679, -35.045900 ], [ 143.322081, -35.036727 ], [ 143.335987, -35.037375 ], [ 143.331864, -35.023804 ], [ 143.338117, -35.010891 ], [ 143.329708, -34.995744 ], [ 143.318825, -34.992943 ], [ 143.323717, -34.979085 ], [ 143.317704, -34.952598 ], [ 143.322014, -34.942339 ], [ 143.339492, -34.943632 ], [ 143.342789, -34.932533 ], [ 143.340526, -34.913740 ], [ 143.321389, -34.888460 ], [ 143.341732, -34.881120 ], [ 143.338404, -34.870312 ], [ 143.352563, -34.858235 ], [ 143.345210, -34.853463 ], [ 143.354957, -34.846039 ], [ 143.341191, -34.846309 ], [ 143.359559, -34.816899 ], [ 143.347559, -34.807302 ], [ 143.347876, -34.791635 ], [ 143.318269, -34.790842 ], [ 143.308844, -34.779939 ], [ 143.294285, -34.790822 ], [ 143.284327, -34.785245 ], [ 143.286873, -34.794985 ], [ 143.276736, -34.792260 ], [ 143.273005, -34.776412 ], [ 143.252130, -34.772803 ], [ 143.274016, -34.752685 ], [ 143.265285, -34.748558 ], [ 143.248933, -34.757853 ], [ 143.240660, -34.745460 ], [ 143.228775, -34.747789 ], [ 143.224384, -34.758733 ], [ 143.213847, -34.738496 ], [ 143.218847, -34.729471 ], [ 143.200006, -34.733418 ], [ 143.199179, -34.717034 ], [ 143.179282, -34.717329 ], [ 143.180987, -34.709482 ], [ 143.173197, -34.719709 ], [ 143.165360, -34.718136 ], [ 143.161689, -34.697916 ], [ 143.147400, -34.714757 ], [ 143.133463, -34.700577 ], [ 143.117841, -34.703076 ], [ 143.127791, -34.692661 ], [ 143.107243, -34.701466 ], [ 143.111605, -34.687127 ], [ 143.121272, -34.687401 ], [ 143.112525, -34.680819 ], [ 143.092828, -34.701273 ], [ 143.076222, -34.695958 ], [ 143.070763, -34.678380 ], [ 143.054822, -34.698855 ], [ 143.040422, -34.685888 ], [ 143.039468, -34.702611 ], [ 143.029424, -34.691851 ], [ 143.032502, -34.682928 ], [ 143.010179, -34.693658 ], [ 143.017281, -34.673660 ], [ 142.994573, -34.673872 ], [ 142.989313, -34.662579 ], [ 142.975282, -34.670861 ], [ 142.982428, -34.682740 ], [ 142.972708, -34.695207 ], [ 142.959264, -34.664982 ], [ 142.948867, -34.669674 ], [ 142.932606, -34.655515 ], [ 142.922267, -34.656482 ], [ 142.923844, -34.647856 ], [ 142.901526, -34.654958 ], [ 142.893269, -34.665679 ], [ 142.900176, -34.671464 ], [ 142.886815, -34.679808 ], [ 142.886457, -34.672085 ], [ 142.875881, -34.674859 ], [ 142.872151, -34.664119 ], [ 142.860551, -34.665162 ], [ 142.871867, -34.650292 ], [ 142.855209, -34.639522 ], [ 142.868177, -34.627306 ], [ 142.852466, -34.619195 ], [ 142.840679, -34.625752 ], [ 142.838240, -34.613044 ], [ 142.825038, -34.608780 ], [ 142.823118, -34.600251 ], [ 142.818507, -34.612357 ], [ 142.804997, -34.608401 ], [ 142.810259, -34.589093 ], [ 142.797919, -34.597628 ], [ 142.787687, -34.590178 ], [ 142.810104, -34.560855 ], [ 142.791428, -34.546389 ], [ 142.782512, -34.564933 ], [ 142.769991, -34.568882 ], [ 142.784068, -34.580393 ], [ 142.748291, -34.576759 ], [ 142.746897, -34.587779 ], [ 142.763405, -34.590436 ], [ 142.759173, -34.600136 ], [ 142.743192, -34.602811 ], [ 142.723616, -34.592285 ], [ 142.714821, -34.600442 ], [ 142.699980, -34.599380 ], [ 142.703966, -34.613507 ], [ 142.689504, -34.618298 ], [ 142.708789, -34.622664 ], [ 142.700788, -34.624516 ], [ 142.689206, -34.652547 ], [ 142.708607, -34.662167 ], [ 142.710754, -34.675769 ], [ 142.684144, -34.670884 ], [ 142.678899, -34.680848 ], [ 142.691089, -34.701397 ], [ 142.684489, -34.714057 ], [ 142.699406, -34.724474 ], [ 142.678646, -34.722345 ], [ 142.676553, -34.729046 ], [ 142.686657, -34.733929 ], [ 142.678954, -34.739202 ], [ 142.667412, -34.735908 ], [ 142.661412, -34.721707 ], [ 142.637334, -34.735043 ], [ 142.618316, -34.728751 ], [ 142.620498, -34.757128 ], [ 142.646364, -34.763315 ], [ 142.639323, -34.780272 ], [ 142.616821, -34.785499 ], [ 142.567176, -34.766928 ], [ 142.556744, -34.775373 ], [ 142.533560, -34.753067 ], [ 142.524215, -34.759380 ], [ 142.507428, -34.748839 ], [ 142.511671, -34.740888 ], [ 142.499559, -34.739117 ], [ 142.518864, -34.703671 ], [ 142.499060, -34.700026 ], [ 142.514170, -34.690931 ], [ 142.498646, -34.681025 ], [ 142.497078, -34.669376 ], [ 142.479002, -34.673551 ], [ 142.471582, -34.666869 ], [ 142.472261, -34.650003 ], [ 142.483644, -34.636435 ], [ 142.452327, -34.633498 ], [ 142.463988, -34.626677 ], [ 142.459160, -34.616289 ], [ 142.468257, -34.612934 ], [ 142.461307, -34.606565 ], [ 142.471264, -34.592677 ], [ 142.458363, -34.587575 ], [ 142.472705, -34.576695 ], [ 142.467968, -34.564295 ], [ 142.448847, -34.559483 ], [ 142.458747, -34.581498 ], [ 142.451622, -34.584265 ], [ 142.444922, -34.575490 ], [ 142.430178, -34.574793 ], [ 142.426062, -34.562348 ], [ 142.407693, -34.567972 ], [ 142.405558, -34.541508 ], [ 142.390211, -34.549119 ], [ 142.376705, -34.540985 ], [ 142.378183, -34.532145 ], [ 142.367695, -34.530446 ], [ 142.400571, -34.522747 ], [ 142.374942, -34.515284 ], [ 142.394681, -34.493484 ], [ 142.377726, -34.491397 ], [ 142.369722, -34.503819 ], [ 142.359576, -34.498779 ], [ 142.364268, -34.484715 ], [ 142.384163, -34.478091 ], [ 142.379267, -34.466704 ], [ 142.353334, -34.469582 ], [ 142.367936, -34.435415 ], [ 142.359897, -34.431933 ], [ 142.364539, -34.422704 ], [ 142.351836, -34.422288 ], [ 142.360695, -34.411768 ], [ 142.350969, -34.396629 ], [ 142.363897, -34.385680 ], [ 142.373927, -34.388151 ], [ 142.368057, -34.370650 ], [ 142.378269, -34.364750 ], [ 142.363530, -34.362158 ], [ 142.389752, -34.362799 ], [ 142.384459, -34.346915 ], [ 142.397000, -34.343802 ], [ 142.396566, -34.337749 ], [ 142.367747, -34.326908 ], [ 142.330924, -34.339378 ], [ 142.294386, -34.323450 ], [ 142.283873, -34.326567 ], [ 142.284023, -34.310760 ], [ 142.298886, -34.305703 ], [ 142.286132, -34.296536 ], [ 142.273673, -34.304021 ], [ 142.267332, -34.295284 ], [ 142.253057, -34.306139 ], [ 142.235894, -34.306973 ], [ 142.232465, -34.296749 ], [ 142.248845, -34.284983 ], [ 142.248993, -34.265054 ], [ 142.232290, -34.255036 ], [ 142.243579, -34.245768 ], [ 142.244030, -34.232457 ], [ 142.235334, -34.223748 ], [ 142.244111, -34.210930 ], [ 142.236518, -34.203765 ], [ 142.233130, -34.214407 ], [ 142.220713, -34.182046 ], [ 142.198195, -34.183432 ], [ 142.183613, -34.175672 ], [ 142.167293, -34.183487 ], [ 142.166529, -34.171395 ], [ 142.159255, -34.171482 ], [ 142.166629, -34.153134 ], [ 142.148290, -34.148718 ], [ 142.138001, -34.160131 ], [ 142.120113, -34.156891 ], [ 142.119613, -34.174909 ], [ 142.082770, -34.173545 ], [ 142.077538, -34.157346 ], [ 142.065345, -34.150611 ], [ 142.075638, -34.131418 ], [ 142.027564, -34.122981 ], [ 142.023852, -34.115054 ], [ 142.029400, -34.118211 ], [ 142.042265, -34.105298 ], [ 142.037535, -34.099426 ], [ 142.012927, -34.105246 ], [ 142.022207, -34.124950 ], [ 141.977651, -34.112702 ], [ 141.969742, -34.119898 ], [ 141.970437, -34.136107 ], [ 141.945003, -34.119477 ], [ 141.934053, -34.138257 ], [ 141.925629, -34.134605 ], [ 141.929784, -34.125790 ], [ 141.922592, -34.114570 ], [ 141.903505, -34.111150 ], [ 141.884744, -34.114984 ], [ 141.888789, -34.124415 ], [ 141.876627, -34.137418 ], [ 141.867763, -34.128652 ], [ 141.853257, -34.131233 ], [ 141.850694, -34.124307 ], [ 141.841383, -34.132452 ], [ 141.786445, -34.111685 ], [ 141.776886, -34.116878 ], [ 141.777897, -34.101774 ], [ 141.756947, -34.112097 ], [ 141.752623, -34.106242 ], [ 141.761836, -34.097537 ], [ 141.746343, -34.103403 ], [ 141.731459, -34.090957 ], [ 141.725469, -34.094023 ], [ 141.729871, -34.105577 ], [ 141.719012, -34.114894 ], [ 141.708284, -34.096352 ], [ 141.677450, -34.101225 ], [ 141.632653, -34.121484 ], [ 141.627982, -34.145417 ], [ 141.611817, -34.139023 ], [ 141.618538, -34.156287 ], [ 141.604580, -34.149115 ], [ 141.583902, -34.151965 ], [ 141.602959, -34.162254 ], [ 141.589383, -34.177353 ], [ 141.604947, -34.183933 ], [ 141.603285, -34.191228 ], [ 141.589743, -34.186893 ], [ 141.583921, -34.198816 ], [ 141.560468, -34.190900 ], [ 141.547738, -34.200841 ], [ 141.533546, -34.191434 ], [ 141.533863, -34.210697 ], [ 141.510071, -34.216479 ], [ 141.506149, -34.210498 ], [ 141.518577, -34.203159 ], [ 141.506669, -34.190619 ], [ 141.518744, -34.180910 ], [ 141.496794, -34.155523 ], [ 141.465933, -34.165754 ], [ 141.450241, -34.161077 ], [ 141.444539, -34.168015 ], [ 141.432802, -34.159940 ], [ 141.433901, -34.145904 ], [ 141.407404, -34.146400 ], [ 141.408248, -34.127856 ], [ 141.388118, -34.134730 ], [ 141.381587, -34.122143 ], [ 141.369693, -34.120204 ], [ 141.368758, -34.127115 ], [ 141.358972, -34.110723 ], [ 141.348504, -34.112311 ], [ 141.346407, -34.124348 ], [ 141.324937, -34.138782 ], [ 141.325922, -34.126866 ], [ 141.313530, -34.124860 ], [ 141.317451, -34.112413 ], [ 141.300790, -34.113718 ], [ 141.283701, -34.103874 ], [ 141.259566, -34.078134 ], [ 141.242543, -34.087341 ], [ 141.247217, -34.073209 ], [ 141.241808, -34.061315 ], [ 141.228468, -34.073651 ], [ 141.222119, -34.061677 ], [ 141.205907, -34.061723 ], [ 141.187449, -34.079294 ], [ 141.193531, -34.089576 ], [ 141.184951, -34.091951 ], [ 141.174668, -34.073334 ], [ 141.165854, -34.083212 ], [ 141.153670, -34.082118 ], [ 141.153180, -34.068915 ], [ 141.143847, -34.067799 ], [ 141.153443, -34.064189 ], [ 141.153111, -34.054521 ], [ 141.142973, -34.063534 ], [ 141.137307, -34.057561 ], [ 141.120338, -34.064866 ], [ 141.094238, -34.050656 ], [ 141.087257, -34.057173 ], [ 141.097587, -34.070035 ], [ 141.089218, -34.076696 ], [ 141.084910, -34.062288 ], [ 141.071951, -34.062910 ], [ 141.065601, -34.050062 ], [ 141.042463, -34.061101 ], [ 141.043580, -34.043200 ], [ 141.036145, -34.036050 ], [ 141.024324, -34.059906 ], [ 141.001935, -34.039284 ], [ 141.003776, -34.027604 ], [ 141.012366, -34.024736 ], [ 141.002957, -34.022537 ], [ 140.999278, -28.999103 ], [ 148.958308, -28.999064 ], [ 148.976321, -28.976413 ], [ 148.998297, -28.972645 ], [ 149.009223, -28.956919 ], [ 149.032686, -28.955958 ], [ 149.048320, -28.916989 ], [ 149.058652, -28.910358 ], [ 149.063984, -28.888645 ], [ 149.055338, -28.884099 ], [ 149.080061, -28.858362 ], [ 149.080762, -28.841801 ], [ 149.097078, -28.831680 ], [ 149.103225, -28.838124 ], [ 149.112444, -28.829575 ], [ 149.128192, -28.835262 ], [ 149.143444, -28.822215 ], [ 149.139757, -28.807197 ], [ 149.160386, -28.810739 ], [ 149.179183, -28.802996 ], [ 149.192360, -28.780600 ], [ 149.188805, -28.775118 ], [ 149.224974, -28.764462 ], [ 149.246912, -28.738899 ], [ 149.253764, -28.742235 ], [ 149.262342, -28.734297 ], [ 149.269197, -28.743452 ], [ 149.297081, -28.709947 ], [ 149.317964, -28.714058 ], [ 149.329862, -28.698194 ], [ 149.346685, -28.696672 ], [ 149.358975, -28.684330 ], [ 149.387389, -28.695803 ], [ 149.393867, -28.677292 ], [ 149.405469, -28.675241 ], [ 149.423022, -28.655209 ], [ 149.417037, -28.651315 ], [ 149.426129, -28.650136 ], [ 149.432856, -28.635031 ], [ 149.428298, -28.629225 ], [ 149.442976, -28.620323 ], [ 149.439518, -28.612053 ], [ 149.452554, -28.594867 ], [ 149.474862, -28.593894 ], [ 149.481514, -28.582818 ], [ 149.502704, -28.580399 ], [ 149.502977, -28.574351 ], [ 149.513949, -28.581674 ], [ 149.528925, -28.574220 ], [ 149.552587, -28.580137 ], [ 149.568553, -28.571079 ], [ 149.587938, -28.572815 ], [ 149.610654, -28.600880 ], [ 149.625491, -28.593342 ], [ 149.642282, -28.599207 ], [ 149.647886, -28.612110 ], [ 149.655991, -28.615489 ], [ 149.660712, -28.609311 ], [ 149.674008, -28.624156 ], [ 149.666654, -28.631859 ], [ 149.703104, -28.633712 ], [ 149.709917, -28.620299 ], [ 149.703900, -28.616464 ], [ 149.721169, -28.609183 ], [ 149.744970, -28.618388 ], [ 149.754943, -28.609441 ], [ 149.784005, -28.614132 ], [ 149.811439, -28.605773 ], [ 149.819292, -28.615843 ], [ 149.830360, -28.603748 ], [ 149.844852, -28.610477 ], [ 149.862300, -28.602199 ], [ 149.899141, -28.621909 ], [ 149.917404, -28.608056 ], [ 149.936331, -28.610132 ], [ 149.941892, -28.617922 ], [ 149.950561, -28.608040 ], [ 149.976953, -28.613464 ], [ 150.016091, -28.580656 ], [ 150.045836, -28.582399 ], [ 150.048740, -28.589196 ], [ 150.073281, -28.576562 ], [ 150.079904, -28.584396 ], [ 150.085176, -28.575843 ], [ 150.092923, -28.578618 ], [ 150.091932, -28.564239 ], [ 150.110908, -28.570297 ], [ 150.121475, -28.559734 ], [ 150.138555, -28.565316 ], [ 150.152280, -28.550210 ], [ 150.154090, -28.557155 ], [ 150.169233, -28.550587 ], [ 150.171551, -28.563890 ], [ 150.182694, -28.556287 ], [ 150.177890, -28.563474 ], [ 150.186598, -28.565211 ], [ 150.186688, -28.572795 ], [ 150.192465, -28.566742 ], [ 150.212287, -28.574181 ], [ 150.213149, -28.567549 ], [ 150.229074, -28.567687 ], [ 150.230399, -28.555713 ], [ 150.238805, -28.559711 ], [ 150.236053, -28.553810 ], [ 150.289648, -28.537157 ], [ 150.320591, -28.557182 ], [ 150.327556, -28.571045 ], [ 150.351300, -28.575348 ], [ 150.352542, -28.587759 ], [ 150.369675, -28.598511 ], [ 150.363767, -28.607510 ], [ 150.370045, -28.620680 ], [ 150.387493, -28.625354 ], [ 150.387879, -28.633924 ], [ 150.401823, -28.627281 ], [ 150.413973, -28.633892 ], [ 150.415222, -28.650834 ], [ 150.429277, -28.651122 ], [ 150.445551, -28.665141 ], [ 150.460085, -28.668912 ], [ 150.487084, -28.657421 ], [ 150.514810, -28.661759 ], [ 150.525002, -28.654311 ], [ 150.539200, -28.660519 ], [ 150.527008, -28.668879 ], [ 150.544079, -28.671524 ], [ 150.552333, -28.668026 ], [ 150.548167, -28.658494 ], [ 150.554094, -28.653064 ], [ 150.561392, -28.661817 ], [ 150.580641, -28.655465 ], [ 150.600191, -28.670758 ], [ 150.625827, -28.668979 ], [ 150.632541, -28.676572 ], [ 150.673400, -28.650180 ], [ 150.681695, -28.661351 ], [ 150.708625, -28.651951 ], [ 150.728255, -28.634490 ], [ 150.752343, -28.633464 ], [ 150.795757, -28.655236 ], [ 150.818847, -28.657336 ], [ 150.819279, -28.666631 ], [ 150.848417, -28.673119 ], [ 150.874008, -28.693797 ], [ 150.906384, -28.687706 ], [ 150.930908, -28.705519 ], [ 150.938189, -28.730938 ], [ 151.010650, -28.740805 ], [ 151.028277, -28.761415 ], [ 151.028963, -28.770497 ], [ 151.019308, -28.772049 ], [ 151.024763, -28.793127 ], [ 151.041903, -28.799153 ], [ 151.037362, -28.827649 ], [ 151.045321, -28.844482 ], [ 151.054835, -28.849373 ], [ 151.083206, -28.834380 ], [ 151.102759, -28.836369 ], [ 151.104400, -28.844291 ], [ 151.132965, -28.860242 ], [ 151.200196, -28.884349 ], [ 151.208752, -28.901470 ], [ 151.234722, -28.904656 ], [ 151.243908, -28.924297 ], [ 151.274808, -28.938926 ], [ 151.282340, -28.954080 ], [ 151.272148, -28.973172 ], [ 151.282556, -28.980593 ], [ 151.276414, -28.986967 ], [ 151.283956, -29.005871 ], [ 151.271058, -29.030275 ], [ 151.284865, -29.037356 ], [ 151.288861, -29.050251 ], [ 151.275509, -29.077791 ], [ 151.279649, -29.100769 ], [ 151.315471, -29.134499 ], [ 151.308844, -29.147526 ], [ 151.314762, -29.165531 ], [ 151.339310, -29.177266 ], [ 151.393784, -29.177893 ], [ 151.410638, -29.152566 ], [ 151.428307, -29.147477 ], [ 151.451744, -29.126859 ], [ 151.463025, -29.098943 ], [ 151.486066, -29.088818 ], [ 151.502292, -29.070805 ], [ 151.491490, -29.056244 ], [ 151.498230, -29.019909 ], [ 151.536094, -28.980619 ], [ 151.545566, -28.952998 ], [ 151.566806, -28.941731 ], [ 151.577091, -28.945031 ], [ 151.609616, -28.923279 ], [ 151.634688, -28.929234 ], [ 151.644389, -28.916839 ], [ 151.674758, -28.907595 ], [ 151.706536, -28.871784 ], [ 151.733860, -28.871578 ], [ 151.743471, -28.918646 ], [ 151.772735, -28.938251 ], [ 151.770227, -28.955846 ], [ 151.777834, -28.959885 ], [ 151.806394, -28.944636 ], [ 151.813804, -28.959374 ], [ 151.832232, -28.959829 ], [ 151.839557, -28.942665 ], [ 151.837909, -28.916547 ], [ 151.849363, -28.907850 ], [ 151.900358, -28.914966 ], [ 151.916048, -28.929307 ], [ 151.968198, -28.916567 ], [ 151.997593, -28.895483 ], [ 152.001090, -28.909730 ], [ 152.009703, -28.907663 ], [ 152.038126, -28.864696 ], [ 152.036909, -28.851794 ], [ 152.025956, -28.858253 ], [ 152.015064, -28.850626 ], [ 152.017057, -28.838514 ], [ 152.037291, -28.819231 ], [ 152.034743, -28.790710 ], [ 152.041726, -28.778581 ], [ 152.036326, -28.756992 ], [ 152.047714, -28.740329 ], [ 152.042726, -28.731623 ], [ 152.076049, -28.708175 ], [ 152.066079, -28.697454 ], [ 152.066354, -28.680968 ], [ 152.052567, -28.681940 ], [ 152.039150, -28.664448 ], [ 152.010168, -28.664951 ], [ 151.990804, -28.624400 ], [ 151.985979, -28.581498 ], [ 151.957677, -28.563409 ], [ 151.955645, -28.518904 ], [ 151.982893, -28.503395 ], [ 151.988951, -28.525613 ], [ 152.016864, -28.525281 ], [ 152.045672, -28.494966 ], [ 152.067033, -28.485590 ], [ 152.070200, -28.468003 ], [ 152.121134, -28.462669 ], [ 152.160504, -28.433123 ], [ 152.184519, -28.438872 ], [ 152.190266, -28.433948 ], [ 152.217189, -28.449236 ], [ 152.267606, -28.390047 ], [ 152.288432, -28.393151 ], [ 152.309659, -28.363168 ], [ 152.341582, -28.367860 ], [ 152.355946, -28.361197 ], [ 152.386160, -28.368554 ], [ 152.417259, -28.333089 ], [ 152.409517, -28.315734 ], [ 152.414572, -28.298101 ], [ 152.444831, -28.298822 ], [ 152.442877, -28.290442 ], [ 152.463586, -28.259373 ], [ 152.508643, -28.249249 ], [ 152.534221, -28.262631 ], [ 152.525981, -28.306250 ], [ 152.548142, -28.321019 ], [ 152.555508, -28.316663 ], [ 152.556437, -28.323355 ], [ 152.568635, -28.323575 ], [ 152.579242, -28.338976 ], [ 152.601700, -28.307381 ], [ 152.600303, -28.283836 ], [ 152.614517, -28.269555 ], [ 152.624513, -28.298204 ], [ 152.638288, -28.310997 ], [ 152.667228, -28.311752 ], [ 152.679339, -28.330416 ], [ 152.722880, -28.344096 ], [ 152.751062, -28.363914 ], [ 152.775455, -28.346625 ], [ 152.804226, -28.353594 ], [ 152.831138, -28.320265 ], [ 152.880013, -28.309607 ], [ 152.933856, -28.338311 ], [ 152.972614, -28.331853 ], [ 153.008199, -28.341717 ], [ 153.046060, -28.339455 ], [ 153.108829, -28.357543 ], [ 153.129890, -28.330665 ], [ 153.124665, -28.318641 ], [ 153.143405, -28.311993 ], [ 153.154794, -28.295691 ], [ 153.168505, -28.294163 ], [ 153.161067, -28.279824 ], [ 153.174911, -28.274777 ], [ 153.177921, -28.247520 ], [ 153.231833, -28.265110 ], [ 153.245848, -28.245832 ], [ 153.262409, -28.246788 ], [ 153.278912, -28.233636 ], [ 153.330213, -28.237064 ], [ 153.339580, -28.250311 ], [ 153.361237, -28.248350 ], [ 153.389527, -28.234935 ], [ 153.406610, -28.210415 ], [ 153.435600, -28.187207 ], [ 153.457134, -28.180540 ], [ 153.476931, -28.157020 ], [ 153.534643, -28.177630 ], [ 153.542419, -28.168567 ], [ 153.556101, -28.168449 ], [ 153.544390, -28.169618 ], [ 153.546326, -28.184622 ], [ 153.538953, -28.183100 ], [ 153.545506, -28.183393 ], [ 153.542434, -28.178038 ], [ 153.528129, -28.190800 ], [ 153.508776, -28.190014 ], [ 153.511639, -28.201256 ], [ 153.507945, -28.194172 ], [ 153.493754, -28.207082 ], [ 153.500088, -28.205997 ], [ 153.500738, -28.213867 ], [ 153.494688, -28.220227 ], [ 153.518655, -28.221669 ], [ 153.509758, -28.217616 ], [ 153.517015, -28.193591 ], [ 153.535176, -28.191657 ], [ 153.537846, -28.183815 ], [ 153.542877, -28.194353 ], [ 153.554370, -28.192899 ], [ 153.561819, -28.208462 ], [ 153.554756, -28.209336 ], [ 153.559427, -28.216900 ], [ 153.541705, -28.234473 ], [ 153.552827, -28.234553 ], [ 153.539410, -28.236277 ], [ 153.541272, -28.243385 ], [ 153.554731, -28.236006 ], [ 153.565200, -28.204997 ], [ 153.549948, -28.171380 ], [ 153.556465, -28.170067 ], [ 153.571431, -28.199438 ], [ 153.568614, -28.238466 ], [ 153.586296, -28.258206 ], [ 153.571396, -28.327130 ], [ 153.580705, -28.362971 ], [ 153.555192, -28.452871 ], [ 153.553350, -28.531179 ], [ 153.568497, -28.589701 ], [ 153.590668, -28.624827 ], [ 153.618008, -28.642001 ], [ 153.638727, -28.636102 ], [ 153.617653, -28.678142 ], [ 153.618866, -28.722255 ], [ 153.595813, -28.775189 ], [ 153.608834, -28.843251 ], [ 153.592039, -28.875592 ], [ 153.577043, -28.868449 ], [ 153.574869, -28.840165 ], [ 153.563443, -28.847083 ], [ 153.571057, -28.849291 ], [ 153.576789, -28.869838 ], [ 153.526945, -28.872891 ], [ 153.570746, -28.885070 ], [ 153.572912, -28.876931 ], [ 153.590086, -28.877612 ], [ 153.539511, -28.923112 ], [ 153.463999, -29.018714 ], [ 153.432800, -29.100830 ], [ 153.435275, -29.113103 ], [ 153.451395, -29.118875 ], [ 153.448568, -29.133389 ], [ 153.456659, -29.140191 ], [ 153.400519, -29.201378 ], [ 153.344322, -29.296579 ], [ 153.344441, -29.344446 ], [ 153.353928, -29.357709 ], [ 153.362896, -29.355398 ], [ 153.376682, -29.365596 ], [ 153.363282, -29.421572 ], [ 153.372817, -29.425122 ], [ 153.363994, -29.430211 ], [ 153.372774, -29.440342 ], [ 153.358370, -29.466503 ], [ 153.368842, -29.484052 ], [ 153.358735, -29.496081 ], [ 153.362578, -29.525400 ], [ 153.349468, -29.539915 ], [ 153.332441, -29.586645 ], [ 153.334558, -29.604816 ], [ 153.342784, -29.608281 ], [ 153.326894, -29.632866 ], [ 153.320590, -29.661397 ], [ 153.333974, -29.674551 ], [ 153.305161, -29.715407 ], [ 153.291992, -29.753621 ], [ 153.303944, -29.774537 ], [ 153.288043, -29.798317 ], [ 153.294417, -29.825080 ], [ 153.282471, -29.833830 ], [ 153.267648, -29.865250 ], [ 153.267554, -29.885679 ], [ 153.276875, -29.893112 ], [ 153.272771, -29.916864 ], [ 153.261147, -29.930649 ], [ 153.260047, -29.952097 ], [ 153.233366, -29.979753 ], [ 153.197084, -30.040577 ], [ 153.196340, -30.054904 ], [ 153.206343, -30.058314 ], [ 153.207861, -30.068526 ], [ 153.199641, -30.103902 ], [ 153.213714, -30.109724 ], [ 153.199564, -30.141272 ], [ 153.206858, -30.156386 ], [ 153.166987, -30.198029 ], [ 153.140185, -30.255886 ], [ 153.147838, -30.277603 ], [ 153.139825, -30.299669 ], [ 153.154572, -30.305148 ], [ 153.142501, -30.303102 ], [ 153.140125, -30.309882 ], [ 153.152929, -30.309492 ], [ 153.136083, -30.315935 ], [ 153.113451, -30.340617 ], [ 153.104516, -30.376997 ], [ 153.075807, -30.410593 ], [ 153.076319, -30.431890 ], [ 153.045956, -30.467008 ], [ 153.031711, -30.499017 ], [ 153.025013, -30.533623 ], [ 153.029590, -30.546964 ], [ 153.017103, -30.564111 ], [ 153.010084, -30.607866 ], [ 153.020362, -30.647583 ], [ 152.997491, -30.678914 ], [ 152.988454, -30.731967 ], [ 153.001661, -30.748638 ], [ 152.997264, -30.786115 ], [ 153.013744, -30.860782 ], [ 153.037184, -30.882482 ], [ 153.060289, -30.886687 ], [ 153.069048, -30.881776 ], [ 153.066370, -30.875077 ], [ 153.075491, -30.877935 ], [ 153.088672, -30.911293 ], [ 153.090540, -30.922062 ], [ 153.056592, -30.959548 ], [ 153.038958, -31.003181 ], [ 153.041007, -31.041426 ], [ 153.054389, -31.053706 ], [ 153.065814, -31.046969 ], [ 153.064737, -31.056619 ], [ 153.053565, -31.069897 ], [ 153.055280, -31.079436 ], [ 153.006635, -31.123408 ], [ 152.977360, -31.171432 ], [ 152.976390, -31.184027 ], [ 152.984243, -31.186655 ], [ 152.966471, -31.212969 ], [ 152.960197, -31.242051 ], [ 152.971160, -31.252606 ], [ 152.964537, -31.306340 ], [ 152.976418, -31.314141 ], [ 152.937730, -31.360849 ], [ 152.914979, -31.409392 ], [ 152.937829, -31.475760 ], [ 152.876935, -31.529605 ], [ 152.845329, -31.572928 ], [ 152.840123, -31.589380 ], [ 152.848288, -31.601575 ], [ 152.833993, -31.632314 ], [ 152.849523, -31.641347 ], [ 152.804917, -31.681860 ], [ 152.792759, -31.710722 ], [ 152.805630, -31.730320 ], [ 152.763950, -31.768836 ], [ 152.736092, -31.811104 ], [ 152.736650, -31.836518 ], [ 152.754557, -31.845077 ], [ 152.690985, -31.877659 ], [ 152.608794, -31.947140 ], [ 152.565872, -32.004019 ], [ 152.569525, -32.009961 ], [ 152.547924, -32.028103 ], [ 152.541556, -32.046409 ], [ 152.547890, -32.073587 ], [ 152.512818, -32.116957 ], [ 152.505650, -32.145060 ], [ 152.508886, -32.172395 ], [ 152.536228, -32.182798 ], [ 152.543249, -32.201587 ], [ 152.570872, -32.215633 ], [ 152.566357, -32.229514 ], [ 152.536688, -32.259276 ], [ 152.523695, -32.294410 ], [ 152.523441, -32.311726 ], [ 152.536380, -32.328984 ], [ 152.551690, -32.334610 ], [ 152.534505, -32.355650 ], [ 152.533712, -32.379770 ], [ 152.522735, -32.388081 ], [ 152.516316, -32.408505 ], [ 152.519552, -32.428291 ], [ 152.537527, -32.433604 ], [ 152.539907, -32.443464 ], [ 152.418854, -32.482549 ], [ 152.335630, -32.527079 ], [ 152.302933, -32.559295 ], [ 152.285026, -32.594775 ], [ 152.231255, -32.615845 ], [ 152.195678, -32.647922 ], [ 152.186671, -32.685393 ], [ 152.191883, -32.694347 ], [ 152.208707, -32.695583 ], [ 152.205043, -32.701220 ], [ 152.191753, -32.700480 ], [ 152.173103, -32.678340 ], [ 152.145532, -32.677430 ], [ 152.129490, -32.685677 ], [ 152.127617, -32.676114 ], [ 152.137652, -32.670980 ], [ 152.121898, -32.657751 ], [ 152.114385, -32.681105 ], [ 152.068787, -32.689564 ], [ 152.050357, -32.676504 ], [ 152.061384, -32.669615 ], [ 152.061467, -32.650000 ], [ 152.043790, -32.660358 ], [ 152.042612, -32.679646 ], [ 152.029803, -32.664021 ], [ 151.994013, -32.668876 ], [ 151.991680, -32.659583 ], [ 151.984275, -32.664883 ], [ 151.968364, -32.654379 ], [ 151.963409, -32.671408 ], [ 151.957776, -32.666832 ], [ 151.956364, -32.674973 ], [ 151.944606, -32.676772 ], [ 151.954872, -32.677334 ], [ 151.960137, -32.697447 ], [ 151.977628, -32.687684 ], [ 151.978206, -32.705855 ], [ 151.969262, -32.714807 ], [ 151.944489, -32.717050 ], [ 151.946428, -32.733945 ], [ 151.936455, -32.736885 ], [ 151.987309, -32.725755 ], [ 151.988084, -32.719213 ], [ 151.997967, -32.727457 ], [ 152.021508, -32.720380 ], [ 152.048507, -32.728703 ], [ 152.058568, -32.716154 ], [ 152.059998, -32.735879 ], [ 152.069545, -32.735976 ], [ 152.071941, -32.726715 ], [ 152.059497, -32.710303 ], [ 152.063803, -32.698469 ], [ 152.091073, -32.728176 ], [ 152.102071, -32.726871 ], [ 152.103643, -32.716227 ], [ 152.145766, -32.719509 ], [ 152.161846, -32.709604 ], [ 152.176160, -32.719839 ], [ 152.187501, -32.711553 ], [ 152.186850, -32.741132 ], [ 152.170981, -32.744437 ], [ 152.172615, -32.761656 ], [ 152.121561, -32.769243 ], [ 152.116236, -32.777911 ], [ 152.123304, -32.784799 ], [ 152.111698, -32.787974 ], [ 152.115602, -32.792876 ], [ 152.053106, -32.785310 ], [ 151.885443, -32.838213 ], [ 151.801417, -32.884920 ], [ 151.786574, -32.919935 ], [ 151.777611, -32.911426 ], [ 151.793943, -32.882876 ], [ 151.783797, -32.884869 ], [ 151.774851, -32.902307 ], [ 151.774609, -32.889578 ], [ 151.733832, -32.877639 ], [ 151.768029, -32.894878 ], [ 151.776972, -32.923560 ], [ 151.770255, -32.916329 ], [ 151.764245, -32.922065 ], [ 151.761465, -32.907660 ], [ 151.763509, -32.924458 ], [ 151.785514, -32.925525 ], [ 151.803968, -32.915741 ], [ 151.737709, -32.963353 ], [ 151.726931, -32.978167 ], [ 151.728705, -33.010750 ], [ 151.668856, -33.051945 ], [ 151.658193, -33.070693 ], [ 151.661120, -33.083830 ], [ 151.640292, -33.084991 ], [ 151.641187, -33.064539 ], [ 151.649545, -33.062843 ], [ 151.638894, -33.055128 ], [ 151.651868, -33.053377 ], [ 151.657496, -33.036095 ], [ 151.633459, -33.028544 ], [ 151.628274, -33.015497 ], [ 151.640583, -33.003987 ], [ 151.629554, -32.993874 ], [ 151.643250, -32.984246 ], [ 151.643898, -32.974847 ], [ 151.616572, -32.962553 ], [ 151.608070, -32.966099 ], [ 151.621060, -32.976261 ], [ 151.616745, -33.005668 ], [ 151.589056, -32.989255 ], [ 151.584081, -32.996124 ], [ 151.592570, -32.998229 ], [ 151.589852, -33.004481 ], [ 151.597706, -32.997245 ], [ 151.595758, -33.010552 ], [ 151.619654, -33.047954 ], [ 151.613787, -33.050514 ], [ 151.593563, -33.026737 ], [ 151.577324, -33.032883 ], [ 151.600043, -33.041140 ], [ 151.594665, -33.043292 ], [ 151.600064, -33.059344 ], [ 151.585937, -33.047209 ], [ 151.581997, -33.056642 ], [ 151.588520, -33.059987 ], [ 151.580757, -33.068462 ], [ 151.611159, -33.072148 ], [ 151.613787, -33.082133 ], [ 151.607169, -33.085181 ], [ 151.594108, -33.071742 ], [ 151.571749, -33.075132 ], [ 151.549206, -33.062517 ], [ 151.550349, -33.073672 ], [ 151.541549, -33.072959 ], [ 151.525678, -33.090967 ], [ 151.512457, -33.090022 ], [ 151.509516, -33.102519 ], [ 151.537841, -33.104583 ], [ 151.548437, -33.088561 ], [ 151.565141, -33.100586 ], [ 151.568733, -33.114279 ], [ 151.550304, -33.114624 ], [ 151.552476, -33.120858 ], [ 151.538059, -33.114729 ], [ 151.541834, -33.126061 ], [ 151.525946, -33.130739 ], [ 151.522107, -33.124081 ], [ 151.509848, -33.137719 ], [ 151.527274, -33.139059 ], [ 151.522881, -33.147104 ], [ 151.530182, -33.160823 ], [ 151.541180, -33.143798 ], [ 151.544865, -33.157420 ], [ 151.567870, -33.175275 ], [ 151.571936, -33.154804 ], [ 151.552814, -33.145742 ], [ 151.557224, -33.131612 ], [ 151.566724, -33.136290 ], [ 151.583901, -33.122911 ], [ 151.581410, -33.102652 ], [ 151.590516, -33.120140 ], [ 151.584364, -33.126462 ], [ 151.591254, -33.131842 ], [ 151.587921, -33.149910 ], [ 151.597195, -33.161559 ], [ 151.603313, -33.131872 ], [ 151.614959, -33.124545 ], [ 151.617358, -33.100809 ], [ 151.627493, -33.093656 ], [ 151.636071, -33.069334 ], [ 151.640623, -33.095894 ], [ 151.654694, -33.093899 ], [ 151.642990, -33.095275 ], [ 151.642009, -33.087240 ], [ 151.657848, -33.092206 ], [ 151.665749, -33.086915 ], [ 151.647040, -33.111626 ], [ 151.653510, -33.120664 ], [ 151.647489, -33.121138 ], [ 151.643037, -33.140524 ], [ 151.630001, -33.154232 ], [ 151.638668, -33.175835 ], [ 151.622819, -33.188011 ], [ 151.625142, -33.198030 ], [ 151.599754, -33.210699 ], [ 151.566629, -33.244307 ], [ 151.563591, -33.271727 ], [ 151.579025, -33.282227 ], [ 151.525332, -33.314954 ], [ 151.503129, -33.343895 ], [ 151.502808, -33.326908 ], [ 151.545637, -33.277746 ], [ 151.537339, -33.266962 ], [ 151.520419, -33.262676 ], [ 151.539206, -33.261537 ], [ 151.553239, -33.244192 ], [ 151.557901, -33.252009 ], [ 151.562175, -33.237346 ], [ 151.547632, -33.233061 ], [ 151.534677, -33.239427 ], [ 151.527336, -33.220286 ], [ 151.508584, -33.222659 ], [ 151.519037, -33.261667 ], [ 151.494578, -33.263796 ], [ 151.488073, -33.280616 ], [ 151.475091, -33.282436 ], [ 151.465006, -33.301936 ], [ 151.452510, -33.298624 ], [ 151.441615, -33.307060 ], [ 151.449002, -33.319884 ], [ 151.468581, -33.328497 ], [ 151.441795, -33.329918 ], [ 151.439052, -33.341660 ], [ 151.448791, -33.354628 ], [ 151.474091, -33.365857 ], [ 151.494014, -33.336508 ], [ 151.504234, -33.345265 ], [ 151.504443, -33.362511 ], [ 151.487366, -33.374543 ], [ 151.485003, -33.398629 ], [ 151.444997, -33.435403 ], [ 151.452589, -33.451147 ], [ 151.435481, -33.468021 ], [ 151.446881, -33.486472 ], [ 151.427905, -33.494641 ], [ 151.417169, -33.523284 ], [ 151.364297, -33.530711 ], [ 151.345402, -33.547164 ], [ 151.335924, -33.522342 ], [ 151.346747, -33.527254 ], [ 151.363400, -33.520863 ], [ 151.347599, -33.506378 ], [ 151.350263, -33.515864 ], [ 151.336359, -33.515189 ], [ 151.312461, -33.530086 ], [ 151.309740, -33.554623 ], [ 151.273893, -33.550947 ], [ 151.258662, -33.570636 ], [ 151.245917, -33.555585 ], [ 151.255013, -33.535301 ], [ 151.236771, -33.528081 ], [ 151.237267, -33.510917 ], [ 151.247042, -33.508309 ], [ 151.245737, -33.499693 ], [ 151.259087, -33.499089 ], [ 151.265719, -33.484947 ], [ 151.231401, -33.507395 ], [ 151.227008, -33.530454 ], [ 151.226676, -33.521859 ], [ 151.210233, -33.521154 ], [ 151.197561, -33.495174 ], [ 151.206701, -33.481240 ], [ 151.212717, -33.486223 ], [ 151.214263, -33.476384 ], [ 151.237683, -33.475590 ], [ 151.237478, -33.453752 ], [ 151.229342, -33.456264 ], [ 151.232011, -33.473148 ], [ 151.214715, -33.470455 ], [ 151.191913, -33.488793 ], [ 151.193563, -33.512028 ], [ 151.204685, -33.520701 ], [ 151.199445, -33.536131 ], [ 151.181942, -33.500830 ], [ 151.170437, -33.502055 ], [ 151.164381, -33.515279 ], [ 151.159804, -33.511002 ], [ 151.162607, -33.493346 ], [ 151.153503, -33.486741 ], [ 151.162184, -33.470601 ], [ 151.172142, -33.469454 ], [ 151.153539, -33.455007 ], [ 151.172882, -33.438060 ], [ 151.166434, -33.426707 ], [ 151.145703, -33.447874 ], [ 151.148157, -33.461168 ], [ 151.138847, -33.469669 ], [ 151.114844, -33.463841 ], [ 151.097050, -33.480337 ], [ 151.079385, -33.445388 ], [ 151.072760, -33.449154 ], [ 151.074647, -33.459803 ], [ 151.069064, -33.456876 ], [ 151.076489, -33.461394 ], [ 151.079761, -33.448845 ], [ 151.085611, -33.475512 ], [ 151.102507, -33.484221 ], [ 151.122384, -33.466638 ], [ 151.138404, -33.475394 ], [ 151.155530, -33.467097 ], [ 151.143281, -33.490999 ], [ 151.131294, -33.491264 ], [ 151.155275, -33.498950 ], [ 151.153931, -33.523913 ], [ 151.140763, -33.524378 ], [ 151.133765, -33.513375 ], [ 151.125504, -33.517763 ], [ 151.121259, -33.510594 ], [ 151.130175, -33.505090 ], [ 151.111449, -33.507042 ], [ 151.121711, -33.521528 ], [ 151.131303, -33.519283 ], [ 151.126370, -33.531096 ], [ 151.135789, -33.522252 ], [ 151.143350, -33.529813 ], [ 151.137583, -33.541965 ], [ 151.127088, -33.537627 ], [ 151.116951, -33.546207 ], [ 151.128267, -33.541631 ], [ 151.138763, -33.550485 ], [ 151.144903, -33.542073 ], [ 151.151460, -33.561950 ], [ 151.130975, -33.567866 ], [ 151.131477, -33.578359 ], [ 151.120054, -33.586003 ], [ 151.102778, -33.587778 ], [ 151.116067, -33.587465 ], [ 151.120785, -33.599548 ], [ 151.125734, -33.600316 ], [ 151.118642, -33.590379 ], [ 151.123430, -33.585845 ], [ 151.144343, -33.587085 ], [ 151.133713, -33.570960 ], [ 151.150150, -33.568554 ], [ 151.162249, -33.575775 ], [ 151.151753, -33.551425 ], [ 151.169581, -33.558510 ], [ 151.148863, -33.536804 ], [ 151.170059, -33.538633 ], [ 151.164184, -33.529131 ], [ 151.175085, -33.514246 ], [ 151.186148, -33.536773 ], [ 151.199940, -33.541837 ], [ 151.198530, -33.549974 ], [ 151.225898, -33.547030 ], [ 151.228985, -33.541529 ], [ 151.202188, -33.544055 ], [ 151.231422, -33.538989 ], [ 151.221956, -33.569449 ], [ 151.211241, -33.567209 ], [ 151.212894, -33.572681 ], [ 151.224131, -33.574986 ], [ 151.231023, -33.561429 ], [ 151.247080, -33.579071 ], [ 151.232759, -33.594043 ], [ 151.186312, -33.592116 ], [ 151.209258, -33.594065 ], [ 151.213153, -33.607756 ], [ 151.163926, -33.625865 ], [ 151.170368, -33.629078 ], [ 151.158467, -33.641126 ], [ 151.162978, -33.646504 ], [ 151.149449, -33.655463 ], [ 151.158845, -33.652388 ], [ 151.159690, -33.660497 ], [ 151.173247, -33.626361 ], [ 151.218503, -33.609099 ], [ 151.228875, -33.618176 ], [ 151.219376, -33.599658 ], [ 151.236764, -33.602641 ], [ 151.243540, -33.594445 ], [ 151.256728, -33.605445 ], [ 151.251948, -33.598074 ], [ 151.262623, -33.597718 ], [ 151.250085, -33.588022 ], [ 151.273011, -33.588959 ], [ 151.283609, -33.572979 ], [ 151.292976, -33.571875 ], [ 151.310837, -33.579569 ], [ 151.292518, -33.605329 ], [ 151.304428, -33.603191 ], [ 151.302857, -33.620541 ], [ 151.282910, -33.621850 ], [ 151.290538, -33.628413 ], [ 151.270419, -33.631536 ], [ 151.282663, -33.636655 ], [ 151.269812, -33.656249 ], [ 151.284916, -33.644351 ], [ 151.304603, -33.660531 ], [ 151.301046, -33.667283 ], [ 151.312041, -33.666731 ], [ 151.301965, -33.651961 ], [ 151.309411, -33.639235 ], [ 151.304670, -33.635343 ], [ 151.314897, -33.631082 ], [ 151.316085, -33.614179 ], [ 151.332148, -33.623364 ], [ 151.315979, -33.601569 ], [ 151.322838, -33.579441 ], [ 151.335315, -33.582332 ], [ 151.325275, -33.597025 ], [ 151.343021, -33.624508 ], [ 151.309786, -33.686350 ], [ 151.315268, -33.696384 ], [ 151.310084, -33.703966 ], [ 151.307770, -33.703902 ], [ 151.300198, -33.727048 ], [ 151.317714, -33.741980 ], [ 151.291375, -33.746666 ], [ 151.303191, -33.746821 ], [ 151.297447, -33.753568 ], [ 151.302525, -33.768177 ], [ 151.293171, -33.773222 ], [ 151.295954, -33.781772 ], [ 151.287866, -33.791943 ], [ 151.307405, -33.807083 ], [ 151.301448, -33.823391 ], [ 151.285578, -33.818900 ], [ 151.291085, -33.808050 ], [ 151.282571, -33.809236 ], [ 151.281754, -33.798739 ], [ 151.265818, -33.798401 ], [ 151.275120, -33.810006 ], [ 151.261106, -33.817937 ], [ 151.250481, -33.800292 ], [ 151.235145, -33.803407 ], [ 151.230781, -33.772720 ], [ 151.224654, -33.783754 ], [ 151.204366, -33.772481 ], [ 151.213378, -33.784277 ], [ 151.232505, -33.787491 ], [ 151.214736, -33.789889 ], [ 151.222836, -33.794260 ], [ 151.217667, -33.797279 ], [ 151.230871, -33.795676 ], [ 151.230544, -33.802375 ], [ 151.217526, -33.805385 ], [ 151.230558, -33.805497 ], [ 151.232130, -33.813652 ], [ 151.219385, -33.818789 ], [ 151.238973, -33.816961 ], [ 151.235118, -33.811573 ], [ 151.245898, -33.803343 ], [ 151.252506, -33.827195 ], [ 151.268876, -33.827056 ], [ 151.254319, -33.844043 ], [ 151.246155, -33.842673 ], [ 151.246701, -33.853448 ], [ 151.232521, -33.836312 ], [ 151.232899, -33.848749 ], [ 151.224781, -33.839354 ], [ 151.224854, -33.846640 ], [ 151.215204, -33.841088 ], [ 151.218865, -33.852803 ], [ 151.207956, -33.844141 ], [ 151.203597, -33.850528 ], [ 151.199094, -33.841172 ], [ 151.192949, -33.847731 ], [ 151.189009, -33.833486 ], [ 151.187598, -33.843118 ], [ 151.181118, -33.842257 ], [ 151.181633, -33.829520 ], [ 151.173094, -33.828188 ], [ 151.168980, -33.836077 ], [ 151.152033, -33.821841 ], [ 151.145874, -33.828989 ], [ 151.145550, -33.824079 ] ], [ [ 151.145228, -33.819212 ], [ 151.144157, -33.802992 ], [ 151.143724, -33.816767 ], [ 151.136883, -33.815139 ], [ 151.145228, -33.819212 ] ], [ [ 151.306067, -33.703855 ], [ 151.297748, -33.703626 ], [ 151.293722, -33.714532 ], [ 151.281190, -33.708689 ], [ 151.269693, -33.714981 ], [ 151.274725, -33.723664 ], [ 151.282554, -33.713518 ], [ 151.293206, -33.721428 ], [ 151.299954, -33.704976 ], [ 151.306067, -33.703855 ] ], [ [ 151.696572, -32.844091 ], [ 151.696455, -32.832942 ], [ 151.726219, -32.838129 ], [ 151.728160, -32.846910 ], [ 151.746513, -32.853629 ], [ 151.773765, -32.856276 ], [ 151.783752, -32.884307 ], [ 151.794071, -32.880601 ], [ 151.792438, -32.856892 ], [ 151.818614, -32.830965 ], [ 151.808691, -32.820564 ], [ 151.783973, -32.820293 ], [ 151.770283, -32.828355 ], [ 151.768297, -32.852278 ], [ 151.756742, -32.852628 ], [ 151.727293, -32.835469 ], [ 151.685247, -32.824087 ], [ 151.696572, -32.844091 ] ], [ [ 151.700776, -32.851517 ], [ 151.711837, -32.871054 ], [ 151.732806, -32.879605 ], [ 151.700776, -32.851517 ] ], [ [ 151.585876, -33.207801 ], [ 151.577003, -33.196558 ], [ 151.557077, -33.197317 ], [ 151.563648, -33.207493 ], [ 151.554302, -33.227804 ], [ 151.568557, -33.232948 ], [ 151.585876, -33.207801 ] ], [ [ 151.455178, -33.417566 ], [ 151.443990, -33.423311 ], [ 151.448047, -33.429788 ], [ 151.455178, -33.417566 ] ], [ [ 151.435641, -33.456501 ], [ 151.422558, -33.460044 ], [ 151.429533, -33.463040 ], [ 151.425744, -33.471373 ], [ 151.435641, -33.456501 ] ], [ [ 151.382814, -33.471893 ], [ 151.365287, -33.477195 ], [ 151.373431, -33.490622 ], [ 151.352561, -33.488875 ], [ 151.335922, -33.474252 ], [ 151.359859, -33.469491 ], [ 151.353753, -33.459686 ], [ 151.369466, -33.438742 ], [ 151.351264, -33.445212 ], [ 151.345341, -33.440610 ], [ 151.341916, -33.450655 ], [ 151.338695, -33.429917 ], [ 151.318424, -33.431432 ], [ 151.332110, -33.436342 ], [ 151.328932, -33.451560 ], [ 151.318610, -33.451542 ], [ 151.313467, -33.460629 ], [ 151.324561, -33.483225 ], [ 151.336551, -33.484434 ], [ 151.333613, -33.502023 ], [ 151.344635, -33.507517 ], [ 151.352265, -33.501627 ], [ 151.341328, -33.489082 ], [ 151.352491, -33.501436 ], [ 151.358572, -33.489780 ], [ 151.369910, -33.493748 ], [ 151.366009, -33.502470 ], [ 151.377349, -33.499620 ], [ 151.382048, -33.490067 ], [ 151.372977, -33.486403 ], [ 151.382814, -33.471893 ] ], [ [ 151.316571, -33.486321 ], [ 151.323983, -33.482929 ], [ 151.307118, -33.467896 ], [ 151.304525, -33.481579 ], [ 151.316571, -33.486321 ] ], [ [ 151.033594, -33.984756 ], [ 151.032810, -33.992545 ], [ 151.066072, -33.991887 ], [ 151.039851, -34.005495 ], [ 151.048829, -34.020580 ], [ 151.051443, -34.016762 ], [ 151.046488, -34.007610 ], [ 151.058809, -34.008153 ], [ 151.059507, -33.998177 ], [ 151.069702, -33.995968 ], [ 151.072161, -34.006090 ], [ 151.075292, -33.997841 ], [ 151.089410, -33.997472 ], [ 151.077713, -34.012580 ], [ 151.090471, -34.011887 ], [ 151.094428, -33.997849 ], [ 151.097649, -34.005821 ], [ 151.109528, -34.006689 ], [ 151.115510, -33.997327 ], [ 151.102494, -34.000906 ], [ 151.103798, -33.989403 ], [ 151.086437, -33.990453 ], [ 151.085403, -33.992662 ], [ 151.071663, -33.994262 ], [ 151.074759, -33.984036 ], [ 151.054461, -33.985123 ], [ 151.061823, -33.975238 ], [ 151.049359, -33.980172 ], [ 151.052862, -33.991004 ], [ 151.036530, -33.990931 ], [ 151.033594, -33.984756 ] ], [ [ 151.033626, -33.984447 ], [ 151.046513, -33.970533 ], [ 151.044672, -33.947705 ], [ 151.044340, -33.970126 ], [ 151.024802, -33.977307 ], [ 151.022601, -33.964096 ], [ 151.015331, -33.982597 ], [ 151.034336, -33.977395 ], [ 151.033626, -33.984447 ] ], [ [ 149.399284, -35.319175 ], [ 149.394790, -35.303157 ], [ 149.361948, -35.308998 ], [ 149.341384, -35.286648 ], [ 149.322394, -35.286708 ], [ 149.315286, -35.276286 ], [ 149.272048, -35.273644 ], [ 149.273132, -35.259287 ], [ 149.234884, -35.242822 ], [ 149.246790, -35.229217 ], [ 149.238597, -35.222127 ], [ 149.214063, -35.219507 ], [ 149.204883, -35.229549 ], [ 149.208568, -35.211501 ], [ 149.189701, -35.203308 ], [ 149.197037, -35.185499 ], [ 149.183629, -35.175618 ], [ 149.189097, -35.165677 ], [ 149.167696, -35.159881 ], [ 149.164312, -35.142046 ], [ 149.146775, -35.144856 ], [ 149.149637, -35.138669 ], [ 149.138600, -35.135257 ], [ 149.138819, -35.128466 ], [ 149.120902, -35.124517 ], [ 148.807854, -35.309647 ], [ 148.793247, -35.339156 ], [ 148.808702, -35.382373 ], [ 148.795719, -35.392920 ], [ 148.796119, -35.406549 ], [ 148.785764, -35.408748 ], [ 148.788868, -35.426382 ], [ 148.767058, -35.465405 ], [ 148.774354, -35.486003 ], [ 148.762675, -35.495505 ], [ 148.772364, -35.529329 ], [ 148.769231, -35.544096 ], [ 148.778231, -35.558852 ], [ 148.773039, -35.568157 ], [ 148.788758, -35.588179 ], [ 148.768473, -35.603186 ], [ 148.783462, -35.628342 ], [ 148.767495, -35.647323 ], [ 148.798434, -35.666492 ], [ 148.791182, -35.703449 ], [ 148.822423, -35.720900 ], [ 148.835715, -35.741884 ], [ 148.856132, -35.753518 ], [ 148.855652, -35.760874 ], [ 148.872491, -35.721422 ], [ 148.877693, -35.714936 ], [ 148.886633, -35.719136 ], [ 148.894087, -35.751288 ], [ 148.903348, -35.757798 ], [ 148.894887, -35.771654 ], [ 148.897776, -35.794650 ], [ 148.886623, -35.810063 ], [ 148.907065, -35.829563 ], [ 148.909367, -35.853065 ], [ 148.959133, -35.895456 ], [ 149.012198, -35.899697 ], [ 149.048811, -35.920410 ], [ 149.064408, -35.874932 ], [ 149.095682, -35.845716 ], [ 149.093517, -35.824221 ], [ 149.101481, -35.803698 ], [ 149.090716, -35.765600 ], [ 149.109483, -35.696640 ], [ 149.095379, -35.679285 ], [ 149.097495, -35.647313 ], [ 149.087612, -35.639697 ], [ 149.078043, -35.586127 ], [ 149.084514, -35.580594 ], [ 149.142510, -35.592570 ], [ 149.131376, -35.554173 ], [ 149.151279, -35.506926 ], [ 149.135550, -35.454422 ], [ 149.155134, -35.436628 ], [ 149.139052, -35.432543 ], [ 149.146586, -35.414836 ], [ 149.207546, -35.345305 ], [ 149.254815, -35.330079 ], [ 149.336502, -35.339914 ], [ 149.352134, -35.351317 ], [ 149.399284, -35.319175 ] ] ], [ [ [ 152.328627, -32.617406 ], [ 152.315824, -32.617576 ], [ 152.319219, -32.627907 ], [ 152.312026, -32.626782 ], [ 152.305258, -32.607247 ], [ 152.328627, -32.617406 ] ] ], [ [ [ 152.228700, -32.687163 ], [ 152.223921, -32.692407 ], [ 152.222668, -32.684061 ], [ 152.228700, -32.687163 ] ] ], [ [ [ 152.203513, -32.747611 ], [ 152.184939, -32.749721 ], [ 152.192662, -32.739777 ], [ 152.203513, -32.747611 ] ] ], [ [ [ 151.982089, -32.670746 ], [ 151.979795, -32.677524 ], [ 151.973989, -32.665379 ], [ 151.982089, -32.670746 ] ] ], [ [ [ 151.975014, -32.679871 ], [ 151.965513, -32.674177 ], [ 151.969517, -32.667628 ], [ 151.975014, -32.679871 ] ] ], [ [ [ 150.421112, -35.531174 ], [ 150.411333, -35.530274 ], [ 150.420570, -35.525966 ], [ 150.421112, -35.531174 ] ] ], [ [ [ 150.230948, -36.250533 ], [ 150.229090, -36.258943 ], [ 150.222919, -36.256370 ], [ 150.224006, -36.243903 ], [ 150.230948, -36.250533 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 1, + "properties": { + "STATE_CODE": "2", + "STATE_NAME": "Victoria" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 145.131889, -38.390694 ], [ 145.129935, -38.390452 ], [ 145.096149, -38.402507 ], [ 145.076384, -38.425446 ], [ 145.050185, -38.430022 ], [ 145.025135, -38.475332 ], [ 145.032399, -38.486451 ], [ 145.010999, -38.479662 ], [ 144.976631, -38.490335 ], [ 144.948813, -38.488548 ], [ 144.937410, -38.497082 ], [ 144.918641, -38.497017 ], [ 144.911152, -38.489253 ], [ 144.887256, -38.498852 ], [ 144.886653, -38.477217 ], [ 144.838574, -38.430328 ], [ 144.741749, -38.353947 ], [ 144.651908, -38.304077 ], [ 144.680224, -38.305219 ], [ 144.734143, -38.322480 ], [ 144.766733, -38.356385 ], [ 144.814684, -38.368549 ], [ 144.850929, -38.368747 ], [ 144.923174, -38.349256 ], [ 144.988387, -38.316711 ], [ 144.994327, -38.304469 ], [ 144.982830, -38.296413 ], [ 145.025610, -38.253352 ], [ 145.032420, -38.212673 ], [ 145.044952, -38.213405 ], [ 145.061688, -38.201202 ], [ 145.087550, -38.164238 ], [ 145.118468, -38.145695 ], [ 145.124504, -38.108031 ], [ 145.119793, -38.074099 ], [ 145.125612, -38.071656 ], [ 145.119588, -38.073219 ], [ 145.099517, -38.026878 ], [ 145.062214, -37.990841 ], [ 145.051408, -37.986726 ], [ 145.037916, -37.996447 ], [ 145.017945, -37.981804 ], [ 144.985526, -37.926238 ], [ 144.985912, -37.893195 ], [ 144.970308, -37.860787 ], [ 144.935592, -37.842548 ], [ 144.929856, -37.847323 ], [ 144.925849, -37.839845 ], [ 144.913404, -37.841967 ], [ 144.912499, -37.849458 ], [ 144.905739, -37.840155 ], [ 144.907213, -37.849526 ], [ 144.897148, -37.842552 ], [ 144.905593, -37.851732 ], [ 144.895277, -37.848421 ], [ 144.903624, -37.861466 ], [ 144.915524, -37.865543 ], [ 144.904253, -37.872525 ], [ 144.878621, -37.868083 ], [ 144.868582, -37.858712 ], [ 144.814390, -37.875144 ], [ 144.797950, -37.905305 ], [ 144.799170, -37.923170 ], [ 144.735586, -37.943135 ], [ 144.651639, -38.001638 ], [ 144.592488, -38.004581 ], [ 144.558663, -38.037541 ], [ 144.515692, -38.045604 ], [ 144.506846, -38.091508 ], [ 144.487431, -38.078280 ], [ 144.470912, -38.083542 ], [ 144.464016, -38.076715 ], [ 144.444841, -38.091800 ], [ 144.397943, -38.073816 ], [ 144.380690, -38.085264 ], [ 144.381575, -38.097352 ], [ 144.361606, -38.105136 ], [ 144.366582, -38.109905 ], [ 144.355617, -38.137201 ], [ 144.365166, -38.144831 ], [ 144.384800, -38.143255 ], [ 144.402640, -38.155458 ], [ 144.416599, -38.155329 ], [ 144.425598, -38.123813 ], [ 144.442823, -38.149522 ], [ 144.478136, -38.164482 ], [ 144.557972, -38.154858 ], [ 144.631382, -38.107385 ], [ 144.692223, -38.119967 ], [ 144.720200, -38.146631 ], [ 144.719630, -38.173256 ], [ 144.706371, -38.210220 ], [ 144.695743, -38.219760 ], [ 144.703393, -38.201527 ], [ 144.686582, -38.197462 ], [ 144.623171, -38.251465 ], [ 144.637022, -38.266100 ], [ 144.632984, -38.269788 ], [ 144.672246, -38.265268 ], [ 144.659776, -38.273912 ], [ 144.620173, -38.275913 ], [ 144.613879, -38.292253 ], [ 144.538709, -38.271631 ], [ 144.508432, -38.274791 ], [ 144.494878, -38.282627 ], [ 144.499893, -38.290490 ], [ 144.428618, -38.281629 ], [ 144.332286, -38.323258 ], [ 144.327444, -38.340177 ], [ 144.303480, -38.348258 ], [ 144.279510, -38.372347 ], [ 144.256633, -38.382747 ], [ 144.254013, -38.395472 ], [ 144.200022, -38.406675 ], [ 144.180587, -38.418909 ], [ 144.184016, -38.428699 ], [ 144.133818, -38.434529 ], [ 144.104758, -38.469255 ], [ 144.036497, -38.475775 ], [ 143.979728, -38.532276 ], [ 143.977136, -38.542552 ], [ 143.986836, -38.548451 ], [ 143.974348, -38.565237 ], [ 143.923066, -38.593108 ], [ 143.910271, -38.623094 ], [ 143.870284, -38.655271 ], [ 143.866226, -38.671668 ], [ 143.842147, -38.679003 ], [ 143.837008, -38.692793 ], [ 143.756722, -38.706707 ], [ 143.681545, -38.737487 ], [ 143.670413, -38.752384 ], [ 143.679941, -38.760838 ], [ 143.666695, -38.768315 ], [ 143.666012, -38.779379 ], [ 143.646427, -38.791286 ], [ 143.616031, -38.795509 ], [ 143.554064, -38.855695 ], [ 143.510919, -38.857580 ], [ 143.428687, -38.783354 ], [ 143.403133, -38.780987 ], [ 143.356589, -38.753950 ], [ 143.327535, -38.757208 ], [ 143.302169, -38.750179 ], [ 143.267387, -38.763093 ], [ 143.259696, -38.772964 ], [ 143.232964, -38.766436 ], [ 143.080833, -38.651018 ], [ 143.054990, -38.647870 ], [ 143.055030, -38.641398 ], [ 143.015378, -38.624500 ], [ 142.947884, -38.619768 ], [ 142.937026, -38.627336 ], [ 142.900650, -38.610166 ], [ 142.857631, -38.605289 ], [ 142.852333, -38.591827 ], [ 142.787658, -38.569124 ], [ 142.684028, -38.495133 ], [ 142.563319, -38.422004 ], [ 142.492181, -38.393871 ], [ 142.478862, -38.395027 ], [ 142.480598, -38.401392 ], [ 142.471653, -38.404310 ], [ 142.372518, -38.349483 ], [ 142.309371, -38.356322 ], [ 142.285960, -38.366494 ], [ 142.261528, -38.364586 ], [ 142.244323, -38.378032 ], [ 142.243958, -38.387985 ], [ 142.255037, -38.391190 ], [ 142.244905, -38.396468 ], [ 142.145800, -38.391487 ], [ 142.002670, -38.310335 ], [ 141.929505, -38.278215 ], [ 141.881510, -38.265811 ], [ 141.742014, -38.253109 ], [ 141.679524, -38.267864 ], [ 141.601621, -38.313185 ], [ 141.607931, -38.342272 ], [ 141.623594, -38.341701 ], [ 141.625059, -38.361992 ], [ 141.650257, -38.393048 ], [ 141.627968, -38.393458 ], [ 141.626417, -38.406344 ], [ 141.614846, -38.393020 ], [ 141.573078, -38.389705 ], [ 141.557894, -38.405684 ], [ 141.555861, -38.426270 ], [ 141.542787, -38.432968 ], [ 141.521271, -38.414710 ], [ 141.528466, -38.404854 ], [ 141.519235, -38.390029 ], [ 141.461020, -38.362096 ], [ 141.434371, -38.360306 ], [ 141.407068, -38.369077 ], [ 141.413232, -38.396287 ], [ 141.374319, -38.386757 ], [ 141.364091, -38.377011 ], [ 141.365531, -38.365317 ], [ 141.397693, -38.338554 ], [ 141.392104, -38.319729 ], [ 141.357610, -38.274759 ], [ 141.295280, -38.220641 ], [ 141.227776, -38.170649 ], [ 141.150129, -38.126841 ], [ 141.028512, -38.071588 ], [ 140.965735, -38.055989 ], [ 140.973872, -37.462093 ], [ 140.963103, -35.748535 ], [ 140.963616, -33.980648 ], [ 140.969273, -33.997216 ], [ 140.980575, -33.999996 ], [ 140.975320, -34.009321 ], [ 140.986747, -34.010237 ], [ 140.980453, -34.016013 ], [ 140.988431, -34.030777 ], [ 140.998139, -34.019698 ], [ 141.012311, -34.024655 ], [ 141.003776, -34.027604 ], [ 141.001870, -34.039103 ], [ 141.023262, -34.059699 ], [ 141.034336, -34.035735 ], [ 141.043439, -34.042704 ], [ 141.042463, -34.061101 ], [ 141.065601, -34.050062 ], [ 141.071951, -34.062910 ], [ 141.084910, -34.062288 ], [ 141.089218, -34.076696 ], [ 141.097587, -34.070035 ], [ 141.087257, -34.057173 ], [ 141.094238, -34.050656 ], [ 141.120338, -34.064866 ], [ 141.137307, -34.057561 ], [ 141.142973, -34.063534 ], [ 141.153111, -34.054521 ], [ 141.153443, -34.064189 ], [ 141.143847, -34.067799 ], [ 141.153180, -34.068915 ], [ 141.153670, -34.082118 ], [ 141.165854, -34.083212 ], [ 141.174668, -34.073334 ], [ 141.186230, -34.091977 ], [ 141.194437, -34.087608 ], [ 141.187449, -34.079294 ], [ 141.205907, -34.061723 ], [ 141.222119, -34.061677 ], [ 141.228468, -34.073651 ], [ 141.241808, -34.061315 ], [ 141.247217, -34.073209 ], [ 141.242543, -34.087341 ], [ 141.259566, -34.078134 ], [ 141.283701, -34.103874 ], [ 141.300790, -34.113718 ], [ 141.317451, -34.112413 ], [ 141.313530, -34.124860 ], [ 141.325922, -34.126866 ], [ 141.324937, -34.138782 ], [ 141.346407, -34.124348 ], [ 141.348504, -34.112311 ], [ 141.358972, -34.110723 ], [ 141.368758, -34.127115 ], [ 141.369693, -34.120204 ], [ 141.381587, -34.122143 ], [ 141.388118, -34.134730 ], [ 141.408248, -34.127856 ], [ 141.407404, -34.146400 ], [ 141.433901, -34.145904 ], [ 141.432802, -34.159940 ], [ 141.444539, -34.168015 ], [ 141.450643, -34.161004 ], [ 141.482801, -34.163425 ], [ 141.494967, -34.154611 ], [ 141.518744, -34.180910 ], [ 141.506669, -34.190619 ], [ 141.518577, -34.203159 ], [ 141.506149, -34.210498 ], [ 141.510071, -34.216479 ], [ 141.533863, -34.210697 ], [ 141.533546, -34.191434 ], [ 141.547738, -34.200841 ], [ 141.560468, -34.190900 ], [ 141.583921, -34.198816 ], [ 141.589743, -34.186893 ], [ 141.603285, -34.191228 ], [ 141.604947, -34.183933 ], [ 141.589383, -34.177353 ], [ 141.602959, -34.162254 ], [ 141.584484, -34.151403 ], [ 141.604580, -34.149115 ], [ 141.618538, -34.156287 ], [ 141.611817, -34.139023 ], [ 141.627982, -34.145417 ], [ 141.632653, -34.121484 ], [ 141.677450, -34.101225 ], [ 141.707415, -34.096068 ], [ 141.720288, -34.114589 ], [ 141.729935, -34.105442 ], [ 141.729691, -34.090896 ], [ 141.746343, -34.103403 ], [ 141.761836, -34.097537 ], [ 141.752623, -34.106242 ], [ 141.756947, -34.112097 ], [ 141.777897, -34.101774 ], [ 141.776886, -34.116878 ], [ 141.786445, -34.111685 ], [ 141.841383, -34.132452 ], [ 141.850694, -34.124307 ], [ 141.853257, -34.131233 ], [ 141.867763, -34.128652 ], [ 141.876627, -34.137418 ], [ 141.888789, -34.124415 ], [ 141.884744, -34.114984 ], [ 141.900686, -34.111198 ], [ 141.922592, -34.114570 ], [ 141.929784, -34.125790 ], [ 141.925629, -34.134605 ], [ 141.932990, -34.138238 ], [ 141.945003, -34.119477 ], [ 141.970437, -34.136107 ], [ 141.969742, -34.119898 ], [ 141.978235, -34.112616 ], [ 142.021240, -34.125258 ], [ 142.012927, -34.105246 ], [ 142.036848, -34.099306 ], [ 142.042265, -34.105298 ], [ 142.029400, -34.118211 ], [ 142.023852, -34.115054 ], [ 142.027564, -34.122981 ], [ 142.075638, -34.131418 ], [ 142.065345, -34.150611 ], [ 142.077538, -34.157346 ], [ 142.082770, -34.173545 ], [ 142.119613, -34.174909 ], [ 142.120343, -34.156705 ], [ 142.135161, -34.160738 ], [ 142.146367, -34.148972 ], [ 142.165577, -34.152124 ], [ 142.159255, -34.171482 ], [ 142.166529, -34.171395 ], [ 142.166148, -34.182923 ], [ 142.178309, -34.183743 ], [ 142.183613, -34.175672 ], [ 142.198580, -34.183496 ], [ 142.219102, -34.181064 ], [ 142.233130, -34.214407 ], [ 142.235645, -34.204042 ], [ 142.243720, -34.209870 ], [ 142.235334, -34.223748 ], [ 142.244030, -34.232457 ], [ 142.243579, -34.245768 ], [ 142.232290, -34.255036 ], [ 142.248993, -34.265054 ], [ 142.248845, -34.284983 ], [ 142.232465, -34.296749 ], [ 142.235894, -34.306973 ], [ 142.253057, -34.306139 ], [ 142.267332, -34.295284 ], [ 142.273673, -34.304021 ], [ 142.286132, -34.296536 ], [ 142.298886, -34.305703 ], [ 142.284023, -34.310760 ], [ 142.283873, -34.326567 ], [ 142.294386, -34.323450 ], [ 142.330924, -34.339378 ], [ 142.368436, -34.326913 ], [ 142.396798, -34.338095 ], [ 142.384459, -34.346915 ], [ 142.389752, -34.362799 ], [ 142.363530, -34.362158 ], [ 142.378269, -34.364750 ], [ 142.368057, -34.370650 ], [ 142.373927, -34.388151 ], [ 142.363897, -34.385680 ], [ 142.350969, -34.396629 ], [ 142.360695, -34.411768 ], [ 142.351836, -34.422288 ], [ 142.364539, -34.422704 ], [ 142.359897, -34.431933 ], [ 142.367936, -34.435415 ], [ 142.353334, -34.469582 ], [ 142.379267, -34.466704 ], [ 142.384163, -34.478091 ], [ 142.364268, -34.484715 ], [ 142.359576, -34.498779 ], [ 142.369722, -34.503819 ], [ 142.377726, -34.491397 ], [ 142.394681, -34.493484 ], [ 142.374942, -34.515284 ], [ 142.400571, -34.522747 ], [ 142.367695, -34.530446 ], [ 142.378183, -34.532145 ], [ 142.376705, -34.540985 ], [ 142.390211, -34.549119 ], [ 142.405558, -34.541508 ], [ 142.407693, -34.567972 ], [ 142.426062, -34.562348 ], [ 142.430178, -34.574793 ], [ 142.444922, -34.575490 ], [ 142.451622, -34.584265 ], [ 142.458747, -34.581498 ], [ 142.448847, -34.559483 ], [ 142.467968, -34.564295 ], [ 142.472705, -34.576695 ], [ 142.458363, -34.587575 ], [ 142.471264, -34.592677 ], [ 142.461307, -34.606565 ], [ 142.468257, -34.612934 ], [ 142.459160, -34.616289 ], [ 142.463988, -34.626677 ], [ 142.452390, -34.633650 ], [ 142.471077, -34.640135 ], [ 142.483148, -34.635824 ], [ 142.471654, -34.651796 ], [ 142.472932, -34.670098 ], [ 142.497078, -34.669376 ], [ 142.498646, -34.681025 ], [ 142.514170, -34.690931 ], [ 142.499060, -34.700026 ], [ 142.518864, -34.703671 ], [ 142.499673, -34.739364 ], [ 142.511671, -34.740888 ], [ 142.507428, -34.748839 ], [ 142.524612, -34.759584 ], [ 142.533406, -34.753025 ], [ 142.538793, -34.762876 ], [ 142.550140, -34.762660 ], [ 142.556744, -34.775373 ], [ 142.567176, -34.766928 ], [ 142.615780, -34.785261 ], [ 142.632212, -34.784136 ], [ 142.644440, -34.775338 ], [ 142.646391, -34.763394 ], [ 142.620498, -34.757128 ], [ 142.618316, -34.728751 ], [ 142.637334, -34.735043 ], [ 142.661412, -34.721707 ], [ 142.667412, -34.735908 ], [ 142.678954, -34.739202 ], [ 142.686657, -34.733929 ], [ 142.676553, -34.729046 ], [ 142.678646, -34.722345 ], [ 142.698961, -34.725138 ], [ 142.684489, -34.714057 ], [ 142.691089, -34.701397 ], [ 142.678929, -34.680153 ], [ 142.684960, -34.670774 ], [ 142.710436, -34.676748 ], [ 142.709066, -34.662674 ], [ 142.689172, -34.651925 ], [ 142.700788, -34.624516 ], [ 142.708902, -34.621788 ], [ 142.689383, -34.616640 ], [ 142.703692, -34.613953 ], [ 142.700852, -34.598276 ], [ 142.714821, -34.600442 ], [ 142.722756, -34.592360 ], [ 142.743966, -34.602960 ], [ 142.761766, -34.598485 ], [ 142.762411, -34.589287 ], [ 142.745699, -34.586273 ], [ 142.748291, -34.576759 ], [ 142.784068, -34.580393 ], [ 142.769991, -34.568882 ], [ 142.782512, -34.564933 ], [ 142.791428, -34.546389 ], [ 142.810104, -34.560855 ], [ 142.787687, -34.590178 ], [ 142.797919, -34.597628 ], [ 142.810259, -34.589093 ], [ 142.804997, -34.608401 ], [ 142.818507, -34.612357 ], [ 142.823118, -34.600251 ], [ 142.825038, -34.608780 ], [ 142.838240, -34.613044 ], [ 142.840679, -34.625752 ], [ 142.852466, -34.619195 ], [ 142.868177, -34.627306 ], [ 142.855209, -34.639522 ], [ 142.871867, -34.650292 ], [ 142.860551, -34.665162 ], [ 142.872151, -34.664119 ], [ 142.875881, -34.674859 ], [ 142.886457, -34.672085 ], [ 142.886815, -34.679808 ], [ 142.900176, -34.671464 ], [ 142.893269, -34.665679 ], [ 142.901526, -34.654958 ], [ 142.923844, -34.647856 ], [ 142.922267, -34.656482 ], [ 142.932606, -34.655515 ], [ 142.948867, -34.669674 ], [ 142.959264, -34.664982 ], [ 142.972708, -34.695207 ], [ 142.982428, -34.682740 ], [ 142.975282, -34.670861 ], [ 142.989313, -34.662579 ], [ 142.994573, -34.673872 ], [ 143.017281, -34.673660 ], [ 143.010179, -34.693658 ], [ 143.032502, -34.682928 ], [ 143.029424, -34.691851 ], [ 143.039468, -34.702611 ], [ 143.040422, -34.685888 ], [ 143.054822, -34.698855 ], [ 143.070763, -34.678380 ], [ 143.076222, -34.695958 ], [ 143.092828, -34.701273 ], [ 143.112525, -34.680819 ], [ 143.121272, -34.687401 ], [ 143.111605, -34.687127 ], [ 143.107243, -34.701466 ], [ 143.127791, -34.692661 ], [ 143.117841, -34.703076 ], [ 143.133463, -34.700577 ], [ 143.147400, -34.714757 ], [ 143.161689, -34.697916 ], [ 143.165360, -34.718136 ], [ 143.173197, -34.719709 ], [ 143.180987, -34.709482 ], [ 143.179282, -34.717329 ], [ 143.199179, -34.717034 ], [ 143.200006, -34.733418 ], [ 143.218847, -34.729471 ], [ 143.213847, -34.738496 ], [ 143.224384, -34.758733 ], [ 143.228775, -34.747789 ], [ 143.240660, -34.745460 ], [ 143.248933, -34.757853 ], [ 143.265285, -34.748558 ], [ 143.274016, -34.752685 ], [ 143.252130, -34.772803 ], [ 143.273005, -34.776412 ], [ 143.276736, -34.792260 ], [ 143.286873, -34.794985 ], [ 143.284327, -34.785245 ], [ 143.294285, -34.790822 ], [ 143.308844, -34.779939 ], [ 143.318269, -34.790842 ], [ 143.347876, -34.791635 ], [ 143.347559, -34.807302 ], [ 143.359559, -34.816899 ], [ 143.341191, -34.846309 ], [ 143.354957, -34.846039 ], [ 143.345210, -34.853463 ], [ 143.352563, -34.858235 ], [ 143.338404, -34.870312 ], [ 143.341732, -34.881120 ], [ 143.321389, -34.888460 ], [ 143.340526, -34.913740 ], [ 143.342789, -34.932533 ], [ 143.339492, -34.943632 ], [ 143.322014, -34.942339 ], [ 143.317704, -34.952598 ], [ 143.323717, -34.979085 ], [ 143.318825, -34.992943 ], [ 143.329708, -34.995744 ], [ 143.338117, -35.010891 ], [ 143.331864, -35.023804 ], [ 143.335987, -35.037375 ], [ 143.322081, -35.036727 ], [ 143.328679, -35.045900 ], [ 143.336543, -35.043219 ], [ 143.330492, -35.053880 ], [ 143.337264, -35.048645 ], [ 143.337663, -35.061294 ], [ 143.350838, -35.064702 ], [ 143.339058, -35.068191 ], [ 143.345520, -35.074056 ], [ 143.337446, -35.080418 ], [ 143.345023, -35.087020 ], [ 143.340858, -35.095714 ], [ 143.348103, -35.105440 ], [ 143.360762, -35.103032 ], [ 143.361967, -35.116900 ], [ 143.390647, -35.145107 ], [ 143.381936, -35.173120 ], [ 143.391820, -35.172567 ], [ 143.386969, -35.183462 ], [ 143.394677, -35.192377 ], [ 143.449486, -35.189112 ], [ 143.471482, -35.219293 ], [ 143.518322, -35.211620 ], [ 143.529155, -35.219921 ], [ 143.548335, -35.213790 ], [ 143.547023, -35.206173 ], [ 143.570828, -35.206905 ], [ 143.580984, -35.220036 ], [ 143.563717, -35.243545 ], [ 143.574076, -35.256505 ], [ 143.571690, -35.267959 ], [ 143.583507, -35.265005 ], [ 143.590860, -35.281659 ], [ 143.577937, -35.303197 ], [ 143.569019, -35.302447 ], [ 143.562074, -35.337244 ], [ 143.598448, -35.352111 ], [ 143.603015, -35.365407 ], [ 143.616037, -35.368884 ], [ 143.620416, -35.387682 ], [ 143.633019, -35.383467 ], [ 143.629381, -35.392368 ], [ 143.642338, -35.401037 ], [ 143.657140, -35.384999 ], [ 143.668081, -35.385735 ], [ 143.667922, -35.371554 ], [ 143.682627, -35.374091 ], [ 143.684521, -35.368446 ], [ 143.693148, -35.383917 ], [ 143.702284, -35.377882 ], [ 143.703349, -35.389408 ], [ 143.711685, -35.384690 ], [ 143.709175, -35.392538 ], [ 143.751004, -35.387835 ], [ 143.768823, -35.401809 ], [ 143.758802, -35.415427 ], [ 143.765962, -35.415858 ], [ 143.762852, -35.423066 ], [ 143.790117, -35.422477 ], [ 143.818018, -35.437545 ], [ 143.813021, -35.446265 ], [ 143.855435, -35.461838 ], [ 143.858784, -35.479978 ], [ 143.871380, -35.477828 ], [ 143.876584, -35.486166 ], [ 143.907733, -35.494162 ], [ 143.906183, -35.499958 ], [ 143.935045, -35.499288 ], [ 143.933355, -35.506610 ], [ 143.970101, -35.500078 ], [ 143.972536, -35.509249 ], [ 143.962441, -35.513980 ], [ 143.974476, -35.532309 ], [ 143.996841, -35.536250 ], [ 143.999221, -35.545367 ], [ 143.989865, -35.554663 ], [ 144.009646, -35.563307 ], [ 144.012702, -35.554073 ], [ 144.034082, -35.555971 ], [ 144.039215, -35.549257 ], [ 144.046800, -35.563141 ], [ 144.063958, -35.570545 ], [ 144.062285, -35.576768 ], [ 144.105015, -35.590780 ], [ 144.117546, -35.625926 ], [ 144.131488, -35.640761 ], [ 144.142927, -35.647253 ], [ 144.152629, -35.642678 ], [ 144.162351, -35.671526 ], [ 144.186788, -35.670431 ], [ 144.195139, -35.685858 ], [ 144.213483, -35.686671 ], [ 144.221647, -35.693952 ], [ 144.215952, -35.706477 ], [ 144.248150, -35.721034 ], [ 144.264496, -35.751403 ], [ 144.296060, -35.737091 ], [ 144.301278, -35.742986 ], [ 144.295276, -35.754379 ], [ 144.327832, -35.752646 ], [ 144.318651, -35.766574 ], [ 144.349111, -35.767142 ], [ 144.351546, -35.785069 ], [ 144.360283, -35.784811 ], [ 144.355338, -35.788479 ], [ 144.362329, -35.795834 ], [ 144.376850, -35.792979 ], [ 144.366709, -35.811253 ], [ 144.377484, -35.814346 ], [ 144.364806, -35.820937 ], [ 144.384118, -35.819565 ], [ 144.372189, -35.831950 ], [ 144.382044, -35.833175 ], [ 144.372936, -35.838150 ], [ 144.384314, -35.841922 ], [ 144.381433, -35.852423 ], [ 144.390318, -35.850553 ], [ 144.388885, -35.858480 ], [ 144.398635, -35.862667 ], [ 144.411388, -35.859003 ], [ 144.401926, -35.868020 ], [ 144.410936, -35.871189 ], [ 144.403628, -35.880666 ], [ 144.418183, -35.893220 ], [ 144.407927, -35.904013 ], [ 144.424381, -35.900194 ], [ 144.416979, -35.910472 ], [ 144.423428, -35.906005 ], [ 144.426505, -35.918744 ], [ 144.446974, -35.935531 ], [ 144.460553, -35.939596 ], [ 144.466553, -35.933602 ], [ 144.464123, -35.940942 ], [ 144.472233, -35.940725 ], [ 144.466691, -35.945927 ], [ 144.479415, -35.945275 ], [ 144.479758, -35.953295 ], [ 144.487583, -35.949511 ], [ 144.481230, -35.958609 ], [ 144.488638, -35.957123 ], [ 144.493963, -35.968592 ], [ 144.501900, -35.958039 ], [ 144.501128, -35.970606 ], [ 144.513047, -35.965202 ], [ 144.509950, -35.973945 ], [ 144.521099, -35.970266 ], [ 144.512009, -35.988895 ], [ 144.516140, -35.995438 ], [ 144.553661, -36.002984 ], [ 144.557655, -36.014107 ], [ 144.563385, -36.007806 ], [ 144.571127, -36.024079 ], [ 144.586445, -36.027182 ], [ 144.582515, -36.038135 ], [ 144.590991, -36.043318 ], [ 144.598917, -36.037411 ], [ 144.608761, -36.041808 ], [ 144.605957, -36.036542 ], [ 144.615473, -36.031593 ], [ 144.617551, -36.046904 ], [ 144.608432, -36.063641 ], [ 144.617670, -36.077192 ], [ 144.628221, -36.065259 ], [ 144.618300, -36.059708 ], [ 144.626288, -36.061800 ], [ 144.624999, -36.052081 ], [ 144.632744, -36.048097 ], [ 144.643921, -36.056664 ], [ 144.653191, -36.053240 ], [ 144.654966, -36.075349 ], [ 144.658022, -36.070380 ], [ 144.664631, -36.077042 ], [ 144.667856, -36.068596 ], [ 144.689004, -36.061417 ], [ 144.683907, -36.095138 ], [ 144.697522, -36.094047 ], [ 144.698886, -36.087259 ], [ 144.706461, -36.092948 ], [ 144.715385, -36.086214 ], [ 144.725675, -36.089438 ], [ 144.717445, -36.112113 ], [ 144.726379, -36.117781 ], [ 144.740569, -36.107576 ], [ 144.748239, -36.121746 ], [ 144.771896, -36.116132 ], [ 144.777064, -36.129837 ], [ 144.794782, -36.117285 ], [ 144.807870, -36.123628 ], [ 144.813362, -36.113912 ], [ 144.806398, -36.107457 ], [ 144.816340, -36.109865 ], [ 144.809893, -36.102428 ], [ 144.819903, -36.107947 ], [ 144.841922, -36.100576 ], [ 144.841901, -36.083098 ], [ 144.850851, -36.080645 ], [ 144.847176, -36.072881 ], [ 144.856474, -36.073553 ], [ 144.857534, -36.065171 ], [ 144.861373, -36.071838 ], [ 144.863460, -36.059112 ], [ 144.932614, -36.067049 ], [ 144.948290, -36.082904 ], [ 144.981909, -36.072316 ], [ 144.985932, -36.056509 ], [ 144.967808, -36.042078 ], [ 144.961831, -36.018216 ], [ 144.945499, -36.012186 ], [ 144.945759, -36.004312 ], [ 144.923606, -35.988768 ], [ 144.931005, -35.968470 ], [ 144.957378, -35.961005 ], [ 144.948917, -35.931602 ], [ 144.974954, -35.883845 ], [ 144.968187, -35.865528 ], [ 144.991436, -35.858984 ], [ 144.992263, -35.852338 ], [ 145.018998, -35.856647 ], [ 145.049713, -35.833671 ], [ 145.061056, -35.837309 ], [ 145.089998, -35.825457 ], [ 145.091922, -35.835957 ], [ 145.114092, -35.820548 ], [ 145.126435, -35.829671 ], [ 145.127683, -35.820716 ], [ 145.136636, -35.834270 ], [ 145.139579, -35.828538 ], [ 145.159170, -35.831077 ], [ 145.153456, -35.843045 ], [ 145.181014, -35.842026 ], [ 145.189806, -35.834267 ], [ 145.222760, -35.842440 ], [ 145.225029, -35.832184 ], [ 145.246178, -35.830321 ], [ 145.260717, -35.835426 ], [ 145.258317, -35.850588 ], [ 145.272698, -35.845203 ], [ 145.296542, -35.860566 ], [ 145.324453, -35.850686 ], [ 145.355400, -35.867067 ], [ 145.387150, -35.850142 ], [ 145.410625, -35.848613 ], [ 145.412575, -35.830601 ], [ 145.442293, -35.835642 ], [ 145.450658, -35.821418 ], [ 145.463440, -35.826274 ], [ 145.472128, -35.809230 ], [ 145.491977, -35.815076 ], [ 145.502556, -35.809449 ], [ 145.522510, -35.818486 ], [ 145.535398, -35.801983 ], [ 145.541889, -35.808905 ], [ 145.538763, -35.821813 ], [ 145.546741, -35.812894 ], [ 145.562836, -35.813449 ], [ 145.557997, -35.828230 ], [ 145.566840, -35.826497 ], [ 145.564011, -35.834190 ], [ 145.593230, -35.849077 ], [ 145.586792, -35.861245 ], [ 145.598028, -35.861458 ], [ 145.601134, -35.875008 ], [ 145.606474, -35.874998 ], [ 145.601748, -35.867857 ], [ 145.626347, -35.862758 ], [ 145.628320, -35.867775 ], [ 145.614857, -35.872570 ], [ 145.628134, -35.875409 ], [ 145.620321, -35.883884 ], [ 145.629570, -35.880105 ], [ 145.639730, -35.894239 ], [ 145.657449, -35.900686 ], [ 145.669121, -35.919586 ], [ 145.679053, -35.916829 ], [ 145.673992, -35.925924 ], [ 145.685852, -35.930615 ], [ 145.698181, -35.920977 ], [ 145.703269, -35.925702 ], [ 145.695763, -35.925792 ], [ 145.697327, -35.936501 ], [ 145.720274, -35.934449 ], [ 145.726300, -35.942312 ], [ 145.716766, -35.950594 ], [ 145.734238, -35.951348 ], [ 145.731027, -35.958734 ], [ 145.746109, -35.964239 ], [ 145.778211, -35.960243 ], [ 145.777006, -35.972559 ], [ 145.792732, -35.972801 ], [ 145.793445, -35.982817 ], [ 145.807980, -35.983762 ], [ 145.811662, -35.991769 ], [ 145.816680, -35.988200 ], [ 145.811353, -35.984102 ], [ 145.828252, -35.982982 ], [ 145.827548, -35.975438 ], [ 145.840021, -35.983244 ], [ 145.848589, -35.980899 ], [ 145.845548, -35.973460 ], [ 145.858624, -35.974814 ], [ 145.847975, -35.968689 ], [ 145.854042, -35.959927 ], [ 145.902693, -35.952496 ], [ 145.910314, -35.955962 ], [ 145.900756, -35.961529 ], [ 145.902934, -35.968856 ], [ 145.925821, -35.964563 ], [ 145.928000, -35.973947 ], [ 145.953701, -35.961500 ], [ 145.944304, -35.966495 ], [ 145.951071, -35.976626 ], [ 145.945744, -35.983809 ], [ 145.964818, -35.996770 ], [ 145.958336, -36.006973 ], [ 145.971314, -36.005651 ], [ 145.972070, -36.015747 ], [ 146.005866, -36.003569 ], [ 146.016143, -36.006962 ], [ 146.031488, -35.994714 ], [ 146.048421, -36.003158 ], [ 146.052346, -35.995465 ], [ 146.059295, -36.014548 ], [ 146.073550, -36.009637 ], [ 146.075639, -36.018177 ], [ 146.092199, -36.021266 ], [ 146.091470, -36.009477 ], [ 146.112378, -36.006811 ], [ 146.107678, -36.014369 ], [ 146.118718, -36.018014 ], [ 146.134761, -36.002547 ], [ 146.140650, -36.008954 ], [ 146.132045, -36.010095 ], [ 146.131357, -36.019413 ], [ 146.145863, -36.013776 ], [ 146.154680, -36.025159 ], [ 146.173104, -36.019293 ], [ 146.185976, -36.042071 ], [ 146.199244, -36.027453 ], [ 146.204747, -36.039158 ], [ 146.211581, -36.028559 ], [ 146.211155, -36.038860 ], [ 146.222171, -36.029921 ], [ 146.242980, -36.028784 ], [ 146.241433, -36.023524 ], [ 146.250889, -36.023130 ], [ 146.244593, -36.018340 ], [ 146.257183, -36.012053 ], [ 146.272859, -36.026631 ], [ 146.275030, -36.012441 ], [ 146.282895, -36.011048 ], [ 146.278803, -36.015850 ], [ 146.291125, -36.020163 ], [ 146.282181, -36.026188 ], [ 146.293104, -36.029503 ], [ 146.283023, -36.041488 ], [ 146.291396, -36.038952 ], [ 146.299009, -36.047859 ], [ 146.300963, -36.036590 ], [ 146.312986, -36.045568 ], [ 146.315875, -36.038453 ], [ 146.329072, -36.043144 ], [ 146.325022, -36.033543 ], [ 146.338890, -36.026395 ], [ 146.368684, -36.050862 ], [ 146.387557, -36.035639 ], [ 146.379594, -36.028127 ], [ 146.380606, -36.012895 ], [ 146.399134, -36.007199 ], [ 146.402962, -35.988780 ], [ 146.425169, -35.973027 ], [ 146.421673, -35.965831 ], [ 146.437159, -35.967015 ], [ 146.444738, -35.977991 ], [ 146.454595, -35.962247 ], [ 146.469966, -35.976201 ], [ 146.467407, -35.984240 ], [ 146.499726, -35.990870 ], [ 146.502134, -35.983188 ], [ 146.492480, -35.985012 ], [ 146.500674, -35.979244 ], [ 146.502585, -35.958235 ], [ 146.519681, -35.960604 ], [ 146.532293, -35.984299 ], [ 146.549581, -35.992457 ], [ 146.555958, -35.989182 ], [ 146.552029, -35.979592 ], [ 146.560301, -35.976391 ], [ 146.583967, -35.983864 ], [ 146.584147, -35.974987 ], [ 146.612520, -35.972858 ], [ 146.618716, -35.975937 ], [ 146.607820, -35.986372 ], [ 146.614299, -35.996480 ], [ 146.650868, -36.007735 ], [ 146.650178, -36.013796 ], [ 146.658574, -36.014488 ], [ 146.650336, -36.018411 ], [ 146.655996, -36.026252 ], [ 146.680199, -36.022376 ], [ 146.675365, -36.028599 ], [ 146.685812, -36.040576 ], [ 146.695002, -36.034315 ], [ 146.689603, -36.030446 ], [ 146.707141, -36.036122 ], [ 146.708878, -36.029435 ], [ 146.731645, -36.023725 ], [ 146.730065, -36.044724 ], [ 146.752929, -36.042113 ], [ 146.749851, -36.061277 ], [ 146.762315, -36.051665 ], [ 146.762818, -36.059519 ], [ 146.796181, -36.065138 ], [ 146.794570, -36.058545 ], [ 146.803936, -36.055194 ], [ 146.818380, -36.067834 ], [ 146.816301, -36.074377 ], [ 146.825542, -36.070847 ], [ 146.825026, -36.088724 ], [ 146.836700, -36.082073 ], [ 146.857158, -36.084918 ], [ 146.864530, -36.073084 ], [ 146.872952, -36.073681 ], [ 146.880556, -36.087524 ], [ 146.906910, -36.084946 ], [ 146.907763, -36.111284 ], [ 146.924058, -36.108315 ], [ 146.926804, -36.097178 ], [ 146.943705, -36.115989 ], [ 146.952498, -36.110788 ], [ 146.956824, -36.078061 ], [ 146.972589, -36.082113 ], [ 146.981298, -36.094876 ], [ 147.007444, -36.083732 ], [ 147.006396, -36.089115 ], [ 147.016319, -36.089798 ], [ 147.013473, -36.104721 ], [ 147.022777, -36.099895 ], [ 147.034141, -36.115239 ], [ 147.042344, -36.104305 ], [ 147.052963, -36.107881 ], [ 147.061812, -36.066155 ], [ 147.090400, -36.049226 ], [ 147.095444, -36.052710 ], [ 147.091582, -36.043861 ], [ 147.097003, -36.046784 ], [ 147.103712, -36.032854 ], [ 147.092140, -36.027650 ], [ 147.099095, -36.026194 ], [ 147.097671, -36.015823 ], [ 147.106364, -36.016455 ], [ 147.098074, -36.010246 ], [ 147.109228, -36.012549 ], [ 147.106820, -36.004825 ], [ 147.116280, -36.007635 ], [ 147.111931, -36.000922 ], [ 147.123357, -35.994498 ], [ 147.127391, -36.018047 ], [ 147.144361, -36.037765 ], [ 147.164456, -36.030798 ], [ 147.206299, -36.050136 ], [ 147.242378, -36.038482 ], [ 147.285177, -36.039439 ], [ 147.319949, -36.060987 ], [ 147.352825, -36.031749 ], [ 147.345681, -36.018772 ], [ 147.355287, -36.009832 ], [ 147.358193, -35.991276 ], [ 147.383679, -35.972352 ], [ 147.392344, -35.973533 ], [ 147.390342, -35.949266 ], [ 147.404631, -35.943495 ], [ 147.450685, -35.960804 ], [ 147.464072, -35.944137 ], [ 147.478835, -35.942689 ], [ 147.481553, -35.949223 ], [ 147.494112, -35.943549 ], [ 147.511421, -35.962412 ], [ 147.525267, -35.963338 ], [ 147.514925, -35.976369 ], [ 147.521359, -35.986936 ], [ 147.551873, -36.004095 ], [ 147.584027, -35.984648 ], [ 147.558887, -35.972489 ], [ 147.547654, -35.978625 ], [ 147.549115, -35.964550 ], [ 147.591893, -35.969859 ], [ 147.601438, -35.979118 ], [ 147.637771, -35.962110 ], [ 147.646777, -35.946008 ], [ 147.680010, -35.944439 ], [ 147.708415, -35.928545 ], [ 147.718672, -35.945513 ], [ 147.741292, -35.956490 ], [ 147.773261, -35.958863 ], [ 147.766797, -35.964158 ], [ 147.776849, -35.968614 ], [ 147.806153, -35.965057 ], [ 147.817498, -35.979741 ], [ 147.873121, -35.991006 ], [ 147.882880, -36.001798 ], [ 147.897506, -35.999861 ], [ 147.895698, -35.993018 ], [ 147.912342, -35.995198 ], [ 147.908543, -36.001473 ], [ 147.917083, -36.011204 ], [ 147.911490, -36.026597 ], [ 147.931559, -36.035267 ], [ 147.923752, -36.035709 ], [ 147.923974, -36.042491 ], [ 147.934261, -36.047637 ], [ 147.958994, -36.040974 ], [ 147.964964, -36.046853 ], [ 147.974260, -36.038505 ], [ 147.973234, -36.046314 ], [ 147.981774, -36.040254 ], [ 147.991260, -36.052559 ], [ 147.999692, -36.046204 ], [ 147.989467, -36.068478 ], [ 147.992889, -36.081071 ], [ 147.982389, -36.077891 ], [ 147.980247, -36.086482 ], [ 147.999218, -36.098655 ], [ 147.991074, -36.111251 ], [ 147.998229, -36.115919 ], [ 147.990652, -36.121272 ], [ 148.000537, -36.124355 ], [ 148.002388, -36.140057 ], [ 148.037726, -36.140797 ], [ 148.035191, -36.152536 ], [ 148.022899, -36.153457 ], [ 148.034795, -36.162983 ], [ 148.021819, -36.176462 ], [ 148.040620, -36.206951 ], [ 148.026096, -36.223042 ], [ 148.034900, -36.234116 ], [ 148.028840, -36.247044 ], [ 148.038676, -36.259221 ], [ 148.032828, -36.265860 ], [ 148.033753, -36.282230 ], [ 148.040119, -36.284157 ], [ 148.035234, -36.292329 ], [ 148.043928, -36.299479 ], [ 148.035011, -36.310577 ], [ 148.058941, -36.320046 ], [ 148.051243, -36.324557 ], [ 148.055613, -36.334386 ], [ 148.048959, -36.355632 ], [ 148.037836, -36.366246 ], [ 148.045966, -36.367038 ], [ 148.037583, -36.390225 ], [ 148.058163, -36.400804 ], [ 148.059945, -36.415538 ], [ 148.080280, -36.422101 ], [ 148.087601, -36.451895 ], [ 148.124663, -36.464713 ], [ 148.119093, -36.481884 ], [ 148.126424, -36.485274 ], [ 148.117630, -36.495476 ], [ 148.139815, -36.525445 ], [ 148.124337, -36.550642 ], [ 148.133410, -36.566921 ], [ 148.150489, -36.558336 ], [ 148.160713, -36.579776 ], [ 148.169411, -36.573696 ], [ 148.190134, -36.576620 ], [ 148.190330, -36.584891 ], [ 148.205990, -36.586932 ], [ 148.217563, -36.598239 ], [ 148.202781, -36.611915 ], [ 148.214196, -36.610490 ], [ 148.219547, -36.619558 ], [ 148.211171, -36.650519 ], [ 148.170243, -36.712799 ], [ 148.130703, -36.734683 ], [ 148.136703, -36.738436 ], [ 148.132654, -36.750847 ], [ 148.120472, -36.756303 ], [ 148.126081, -36.759417 ], [ 148.097983, -36.787161 ], [ 148.108888, -36.800865 ], [ 148.120152, -36.806079 ], [ 148.126771, -36.796451 ], [ 148.156663, -36.790013 ], [ 148.179595, -36.796326 ], [ 148.182473, -36.804895 ], [ 148.194946, -36.796253 ], [ 149.976679, -37.505060 ], [ 149.964395, -37.517956 ], [ 149.924770, -37.526348 ], [ 149.906609, -37.542865 ], [ 149.819715, -37.544829 ], [ 149.775248, -37.557838 ], [ 149.760994, -37.566909 ], [ 149.765416, -37.573855 ], [ 149.738748, -37.585037 ], [ 149.706531, -37.643525 ], [ 149.682392, -37.664158 ], [ 149.677329, -37.685082 ], [ 149.616596, -37.700613 ], [ 149.600828, -37.712062 ], [ 149.595839, -37.726576 ], [ 149.566290, -37.724577 ], [ 149.525501, -37.737284 ], [ 149.516419, -37.749082 ], [ 149.496934, -37.753367 ], [ 149.495556, -37.768225 ], [ 149.484958, -37.775441 ], [ 149.461888, -37.769302 ], [ 149.431022, -37.777377 ], [ 149.340379, -37.776913 ], [ 149.292448, -37.787460 ], [ 149.275498, -37.803777 ], [ 149.265391, -37.798457 ], [ 149.265928, -37.789319 ], [ 149.246711, -37.780474 ], [ 149.124226, -37.777287 ], [ 148.926358, -37.781403 ], [ 148.884150, -37.789958 ], [ 148.808733, -37.786417 ], [ 148.749187, -37.797037 ], [ 148.727786, -37.815437 ], [ 148.717029, -37.804438 ], [ 148.691027, -37.801441 ], [ 148.626577, -37.808219 ], [ 148.448176, -37.801720 ], [ 148.289615, -37.810988 ], [ 148.179178, -37.831635 ], [ 147.951982, -37.894066 ], [ 147.788216, -37.955322 ], [ 147.642131, -38.036875 ], [ 147.476303, -38.151750 ], [ 147.067248, -38.475119 ], [ 146.883139, -38.634634 ], [ 146.887146, -38.620153 ], [ 146.925517, -38.594225 ], [ 146.898674, -38.612218 ], [ 146.886424, -38.614398 ], [ 146.882549, -38.604607 ], [ 146.844005, -38.604835 ], [ 146.842214, -38.615343 ], [ 146.851407, -38.612415 ], [ 146.880623, -38.616834 ], [ 146.878210, -38.626484 ], [ 146.815353, -38.648874 ], [ 146.793687, -38.644809 ], [ 146.791507, -38.633329 ], [ 146.785908, -38.646241 ], [ 146.766508, -38.650138 ], [ 146.776554, -38.654217 ], [ 146.753518, -38.652583 ], [ 146.742174, -38.664925 ], [ 146.712913, -38.647777 ], [ 146.716388, -38.660899 ], [ 146.696106, -38.669995 ], [ 146.697708, -38.675350 ], [ 146.657551, -38.671491 ], [ 146.670659, -38.662910 ], [ 146.653120, -38.642985 ], [ 146.645934, -38.650711 ], [ 146.652795, -38.658737 ], [ 146.641029, -38.668902 ], [ 146.584420, -38.677087 ], [ 146.593670, -38.684768 ], [ 146.582693, -38.698475 ], [ 146.580423, -38.679462 ], [ 146.576824, -38.692143 ], [ 146.572005, -38.677700 ], [ 146.572140, -38.683307 ], [ 146.562535, -38.678240 ], [ 146.546510, -38.684520 ], [ 146.563125, -38.683180 ], [ 146.566746, -38.691119 ], [ 146.562451, -38.698048 ], [ 146.552764, -38.689290 ], [ 146.551209, -38.703789 ], [ 146.539161, -38.698269 ], [ 146.541200, -38.685376 ], [ 146.514712, -38.694242 ], [ 146.494669, -38.679739 ], [ 146.492968, -38.696760 ], [ 146.463062, -38.702080 ], [ 146.437202, -38.694436 ], [ 146.439100, -38.699711 ], [ 146.410331, -38.711911 ], [ 146.411203, -38.721218 ], [ 146.387054, -38.720748 ], [ 146.380986, -38.685645 ], [ 146.350706, -38.672920 ], [ 146.331821, -38.681068 ], [ 146.338840, -38.690666 ], [ 146.291719, -38.695268 ], [ 146.260560, -38.687323 ], [ 146.252627, -38.697512 ], [ 146.243754, -38.695281 ], [ 146.243941, -38.682832 ], [ 146.227605, -38.689144 ], [ 146.231156, -38.695179 ], [ 146.212059, -38.692854 ], [ 146.229248, -38.701188 ], [ 146.202718, -38.713350 ], [ 146.213181, -38.719708 ], [ 146.199527, -38.716096 ], [ 146.192048, -38.726245 ], [ 146.200636, -38.733016 ], [ 146.210668, -38.728486 ], [ 146.204663, -38.735404 ], [ 146.210699, -38.737946 ], [ 146.195376, -38.735871 ], [ 146.192597, -38.728737 ], [ 146.185560, -38.743370 ], [ 146.218497, -38.771826 ], [ 146.233048, -38.809044 ], [ 146.272814, -38.806048 ], [ 146.263936, -38.823443 ], [ 146.270271, -38.860140 ], [ 146.292728, -38.876466 ], [ 146.287195, -38.894454 ], [ 146.292616, -38.904551 ], [ 146.323098, -38.903579 ], [ 146.352575, -38.868224 ], [ 146.393215, -38.850494 ], [ 146.414861, -38.852078 ], [ 146.420730, -38.803807 ], [ 146.435645, -38.795912 ], [ 146.437960, -38.778922 ], [ 146.467056, -38.780916 ], [ 146.478636, -38.791780 ], [ 146.467850, -38.871049 ], [ 146.484472, -38.883179 ], [ 146.480599, -38.891390 ], [ 146.487410, -38.894269 ], [ 146.489295, -38.910464 ], [ 146.474089, -38.916245 ], [ 146.450981, -38.947851 ], [ 146.436110, -38.981022 ], [ 146.445691, -39.003708 ], [ 146.431755, -39.010977 ], [ 146.437194, -39.021014 ], [ 146.475392, -39.025666 ], [ 146.464000, -39.028932 ], [ 146.470757, -39.035718 ], [ 146.460439, -39.036915 ], [ 146.477728, -39.043765 ], [ 146.474460, -39.054940 ], [ 146.483350, -39.061028 ], [ 146.479770, -39.066834 ], [ 146.455289, -39.054116 ], [ 146.431120, -39.065527 ], [ 146.425291, -39.083549 ], [ 146.441603, -39.089754 ], [ 146.434851, -39.107727 ], [ 146.426860, -39.108278 ], [ 146.431753, -39.114822 ], [ 146.424079, -39.114799 ], [ 146.426510, -39.129986 ], [ 146.416015, -39.125521 ], [ 146.389544, -39.133959 ], [ 146.387825, -39.125091 ], [ 146.374563, -39.136721 ], [ 146.345818, -39.125384 ], [ 146.342561, -39.110600 ], [ 146.321444, -39.087887 ], [ 146.321430, -39.077981 ], [ 146.340665, -39.076953 ], [ 146.342982, -39.060987 ], [ 146.352339, -39.058857 ], [ 146.316942, -39.052255 ], [ 146.326362, -39.041118 ], [ 146.316484, -39.033666 ], [ 146.304711, -39.039363 ], [ 146.303027, -39.023470 ], [ 146.283915, -39.024887 ], [ 146.291848, -39.013118 ], [ 146.274329, -38.996389 ], [ 146.248966, -38.996020 ], [ 146.267295, -38.991191 ], [ 146.269497, -38.972960 ], [ 146.233903, -38.918669 ], [ 146.189408, -38.873545 ], [ 146.133534, -38.837409 ], [ 146.083966, -38.815933 ], [ 146.033608, -38.813189 ], [ 146.009458, -38.825703 ], [ 145.997901, -38.846406 ], [ 146.006286, -38.877920 ], [ 145.979368, -38.895077 ], [ 145.940007, -38.896113 ], [ 145.921197, -38.909610 ], [ 145.910638, -38.892758 ], [ 145.914922, -38.872133 ], [ 145.869527, -38.776148 ], [ 145.818249, -38.712973 ], [ 145.765547, -38.666752 ], [ 145.729472, -38.644840 ], [ 145.714004, -38.645141 ], [ 145.688938, -38.651209 ], [ 145.672021, -38.671595 ], [ 145.656874, -38.676923 ], [ 145.638566, -38.672436 ], [ 145.606696, -38.678782 ], [ 145.560625, -38.651407 ], [ 145.537514, -38.611090 ], [ 145.483686, -38.556001 ], [ 145.423688, -38.536479 ], [ 145.372012, -38.536297 ], [ 145.363420, -38.520970 ], [ 145.419170, -38.513190 ], [ 145.434480, -38.493623 ], [ 145.432528, -38.480368 ], [ 145.417718, -38.471373 ], [ 145.428272, -38.460830 ], [ 145.433813, -38.434868 ], [ 145.416381, -38.406995 ], [ 145.453556, -38.412660 ], [ 145.481275, -38.407126 ], [ 145.489876, -38.415096 ], [ 145.515409, -38.415475 ], [ 145.548933, -38.371688 ], [ 145.552463, -38.352450 ], [ 145.545145, -38.339536 ], [ 145.515332, -38.337800 ], [ 145.522134, -38.298944 ], [ 145.497964, -38.274077 ], [ 145.488988, -38.233414 ], [ 145.459991, -38.228038 ], [ 145.438385, -38.214401 ], [ 145.410917, -38.228048 ], [ 145.347072, -38.213570 ], [ 145.341337, -38.229565 ], [ 145.324841, -38.242155 ], [ 145.298309, -38.248493 ], [ 145.274132, -38.244101 ], [ 145.278629, -38.234400 ], [ 145.271575, -38.222965 ], [ 145.254773, -38.223062 ], [ 145.253302, -38.235679 ], [ 145.261731, -38.242426 ], [ 145.225654, -38.272428 ], [ 145.223020, -38.306462 ], [ 145.206203, -38.303800 ], [ 145.199986, -38.293078 ], [ 145.192934, -38.296557 ], [ 145.199945, -38.310851 ], [ 145.192849, -38.324507 ], [ 145.218781, -38.347604 ], [ 145.213463, -38.365909 ], [ 145.221952, -38.377797 ], [ 145.210923, -38.378673 ], [ 145.196407, -38.366586 ], [ 145.183986, -38.374587 ], [ 145.215199, -38.383113 ], [ 145.234486, -38.409689 ], [ 145.131889, -38.390694 ] ], [ [ 146.840680, -38.615832 ], [ 146.825352, -38.609723 ], [ 146.798097, -38.620209 ], [ 146.799439, -38.628656 ], [ 146.794402, -38.626652 ], [ 146.791910, -38.632399 ], [ 146.800977, -38.632991 ], [ 146.803176, -38.620368 ], [ 146.819121, -38.613196 ], [ 146.825275, -38.620739 ], [ 146.840680, -38.615832 ] ] ], [ [ [ 149.918469, -37.568333 ], [ 149.906303, -37.567536 ], [ 149.904809, -37.548305 ], [ 149.918469, -37.568333 ] ] ], [ [ [ 146.879039, -38.638149 ], [ 146.828437, -38.679496 ], [ 146.858094, -38.652723 ], [ 146.835528, -38.654171 ], [ 146.879039, -38.638149 ] ] ], [ [ [ 146.826421, -38.683449 ], [ 146.787947, -38.680680 ], [ 146.752869, -38.689586 ], [ 146.798672, -38.675767 ], [ 146.826421, -38.683449 ] ] ], [ [ [ 146.815451, -38.659376 ], [ 146.786029, -38.669118 ], [ 146.794058, -38.656820 ], [ 146.815451, -38.659376 ] ] ], [ [ [ 146.739461, -38.672911 ], [ 146.726511, -38.672302 ], [ 146.715490, -38.683892 ], [ 146.709894, -38.676575 ], [ 146.720620, -38.676460 ], [ 146.727793, -38.661227 ], [ 146.739461, -38.672911 ] ] ], [ [ [ 146.715739, -38.687077 ], [ 146.696231, -38.690865 ], [ 146.707733, -38.676730 ], [ 146.715739, -38.687077 ] ] ], [ [ [ 146.685401, -38.677859 ], [ 146.676565, -38.684137 ], [ 146.683364, -38.689702 ], [ 146.668862, -38.684012 ], [ 146.685401, -38.677859 ] ] ], [ [ [ 146.677547, -38.708481 ], [ 146.626289, -38.724626 ], [ 146.601830, -38.722403 ], [ 146.606399, -38.717974 ], [ 146.601021, -38.716540 ], [ 146.595562, -38.720188 ], [ 146.602819, -38.726884 ], [ 146.585294, -38.715426 ], [ 146.618435, -38.697518 ], [ 146.614453, -38.701181 ], [ 146.636787, -38.698702 ], [ 146.630293, -38.705779 ], [ 146.642945, -38.699638 ], [ 146.677547, -38.708481 ] ] ], [ [ [ 146.669254, -38.718406 ], [ 146.652636, -38.727206 ], [ 146.629740, -38.724665 ], [ 146.669254, -38.718406 ] ] ], [ [ [ 146.620487, -38.757880 ], [ 146.597634, -38.759484 ], [ 146.545340, -38.790889 ], [ 146.494759, -38.774837 ], [ 146.464605, -38.739122 ], [ 146.471343, -38.728367 ], [ 146.495000, -38.729122 ], [ 146.509663, -38.718527 ], [ 146.503076, -38.726791 ], [ 146.515585, -38.730698 ], [ 146.508177, -38.737230 ], [ 146.541851, -38.728365 ], [ 146.508245, -38.752904 ], [ 146.523886, -38.752655 ], [ 146.500179, -38.762913 ], [ 146.547905, -38.757144 ], [ 146.541720, -38.756131 ], [ 146.576886, -38.735022 ], [ 146.591910, -38.742404 ], [ 146.584271, -38.747864 ], [ 146.602930, -38.744193 ], [ 146.601349, -38.752087 ], [ 146.620487, -38.757880 ] ] ], [ [ [ 146.623101, -38.757696 ], [ 146.667725, -38.747737 ], [ 146.656002, -38.755387 ], [ 146.623101, -38.757696 ] ] ], [ [ [ 146.634077, -38.697163 ], [ 146.621698, -38.694456 ], [ 146.626852, -38.690059 ], [ 146.634077, -38.697163 ] ] ], [ [ [ 146.501883, -38.716446 ], [ 146.493338, -38.725194 ], [ 146.468395, -38.717321 ], [ 146.438615, -38.727515 ], [ 146.451102, -38.710531 ], [ 146.501883, -38.716446 ] ] ], [ [ [ 146.329832, -39.141577 ], [ 146.325447, -39.147280 ], [ 146.312072, -39.134765 ], [ 146.329832, -39.141577 ] ] ], [ [ [ 146.246238, -39.024357 ], [ 146.240787, -39.029639 ], [ 146.236406, -39.022245 ], [ 146.241110, -39.016688 ], [ 146.246238, -39.024357 ] ] ], [ [ [ 146.241476, -39.089053 ], [ 146.235550, -39.097594 ], [ 146.222171, -39.071320 ], [ 146.241476, -39.089053 ] ] ], [ [ [ 145.503419, -38.354364 ], [ 145.476252, -38.366455 ], [ 145.406087, -38.372763 ], [ 145.390367, -38.385129 ], [ 145.386038, -38.406628 ], [ 145.363825, -38.405562 ], [ 145.352532, -38.419991 ], [ 145.287996, -38.395663 ], [ 145.275541, -38.394869 ], [ 145.281426, -38.404317 ], [ 145.272813, -38.409592 ], [ 145.265575, -38.402882 ], [ 145.276670, -38.391631 ], [ 145.273510, -38.357488 ], [ 145.287229, -38.309622 ], [ 145.297586, -38.309340 ], [ 145.285955, -38.305325 ], [ 145.289378, -38.284665 ], [ 145.297026, -38.282054 ], [ 145.330360, -38.292367 ], [ 145.351993, -38.311261 ], [ 145.452370, -38.306856 ], [ 145.503419, -38.354364 ] ] ], [ [ [ 145.364351, -38.553403 ], [ 145.360927, -38.566071 ], [ 145.351273, -38.567099 ], [ 145.342160, -38.559018 ], [ 145.344009, -38.549380 ], [ 145.316751, -38.524459 ], [ 145.271133, -38.504866 ], [ 145.240044, -38.506828 ], [ 145.221203, -38.529953 ], [ 145.203572, -38.517309 ], [ 145.170660, -38.509575 ], [ 145.116156, -38.518351 ], [ 145.127384, -38.505541 ], [ 145.147128, -38.503198 ], [ 145.165431, -38.465358 ], [ 145.200057, -38.451025 ], [ 145.290603, -38.450182 ], [ 145.302496, -38.453855 ], [ 145.275161, -38.454122 ], [ 145.273250, -38.460288 ], [ 145.310365, -38.460544 ], [ 145.290741, -38.480490 ], [ 145.293145, -38.488543 ], [ 145.305573, -38.485438 ], [ 145.297319, -38.506446 ], [ 145.359160, -38.509312 ], [ 145.363649, -38.515623 ], [ 145.347089, -38.520963 ], [ 145.340937, -38.535771 ], [ 145.364351, -38.553403 ] ] ], [ [ [ 145.346151, -38.508609 ], [ 145.332958, -38.499493 ], [ 145.336761, -38.493663 ], [ 145.346151, -38.508609 ] ] ], [ [ [ 144.702137, -38.243412 ], [ 144.667849, -38.255016 ], [ 144.672019, -38.264367 ], [ 144.663095, -38.252993 ], [ 144.678720, -38.237599 ], [ 144.678828, -38.250631 ], [ 144.702137, -38.243412 ] ] ], [ [ [ 142.014239, -38.412576 ], [ 141.999012, -38.425446 ], [ 141.993481, -38.417372 ], [ 142.014239, -38.412576 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 2, + "properties": { + "STATE_CODE": "3", + "STATE_NAME": "Queensland" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 141.663509, -15.003962 ], [ 141.590263, -14.857313 ], [ 141.566982, -14.740314 ], [ 141.553601, -14.592565 ], [ 141.525610, -14.487086 ], [ 141.552048, -14.375277 ], [ 141.601637, -14.242417 ], [ 141.593972, -14.155358 ], [ 141.599046, -14.101668 ], [ 141.568572, -14.051248 ], [ 141.481812, -13.953329 ], [ 141.468182, -13.923139 ], [ 141.467192, -13.864249 ], [ 141.523282, -13.572129 ], [ 141.550602, -13.506939 ], [ 141.593261, -13.459149 ], [ 141.625401, -13.378009 ], [ 141.682104, -13.302759 ], [ 141.695390, -13.270078 ], [ 141.690764, -13.236639 ], [ 141.679924, -13.217539 ], [ 141.657764, -13.204199 ], [ 141.645073, -13.168930 ], [ 141.629493, -13.159430 ], [ 141.613943, -13.091950 ], [ 141.617772, -13.039960 ], [ 141.604512, -13.020400 ], [ 141.588712, -13.017231 ], [ 141.583162, -12.996721 ], [ 141.599741, -12.952071 ], [ 141.635980, -12.908750 ], [ 141.640990, -12.918390 ], [ 141.652750, -12.916760 ], [ 141.670290, -12.894130 ], [ 141.710019, -12.878980 ], [ 141.739899, -12.853470 ], [ 141.762458, -12.816610 ], [ 141.795327, -12.729140 ], [ 141.803777, -12.679530 ], [ 141.820167, -12.671810 ], [ 141.827282, -12.676820 ], [ 141.817508, -12.700095 ], [ 141.830572, -12.686330 ], [ 141.854522, -12.686230 ], [ 141.863112, -12.693410 ], [ 141.877741, -12.671310 ], [ 141.859246, -12.664557 ], [ 141.839532, -12.668280 ], [ 141.827326, -12.648550 ], [ 141.859272, -12.637740 ], [ 141.886082, -12.617290 ], [ 141.893743, -12.593527 ], [ 141.879236, -12.583900 ], [ 141.819877, -12.601460 ], [ 141.811457, -12.584220 ], [ 141.793507, -12.582200 ], [ 141.768407, -12.565660 ], [ 141.769747, -12.552661 ], [ 141.760047, -12.539141 ], [ 141.709417, -12.518951 ], [ 141.702007, -12.519571 ], [ 141.695757, -12.533801 ], [ 141.694807, -12.556981 ], [ 141.654488, -12.563411 ], [ 141.643238, -12.577601 ], [ 141.625708, -12.583261 ], [ 141.600688, -12.571791 ], [ 141.591918, -12.558962 ], [ 141.673419, -12.369542 ], [ 141.714829, -12.234722 ], [ 141.735389, -12.218212 ], [ 141.810380, -12.048632 ], [ 141.850440, -11.984452 ], [ 141.879980, -11.954412 ], [ 141.909020, -11.955462 ], [ 141.895850, -11.964312 ], [ 141.886500, -11.985032 ], [ 141.914170, -12.032331 ], [ 141.922475, -12.107571 ], [ 141.944354, -12.148747 ], [ 141.915249, -12.165088 ], [ 141.929601, -12.167335 ], [ 141.947961, -12.151173 ], [ 141.928906, -12.104043 ], [ 141.932345, -12.070881 ], [ 141.957978, -12.042323 ], [ 141.994195, -12.059651 ], [ 142.012235, -12.039111 ], [ 142.000825, -12.012891 ], [ 141.971675, -11.980111 ], [ 141.942845, -11.976481 ], [ 141.942175, -11.945512 ], [ 141.961964, -11.820772 ], [ 141.977424, -11.776973 ], [ 142.001893, -11.753273 ], [ 142.015953, -11.673083 ], [ 142.026003, -11.662313 ], [ 142.051312, -11.554844 ], [ 142.088582, -11.464734 ], [ 142.100492, -11.463214 ], [ 142.097332, -11.445034 ], [ 142.119961, -11.368544 ], [ 142.126801, -11.268365 ], [ 142.116221, -11.224665 ], [ 142.128580, -11.221675 ], [ 142.137680, -11.206955 ], [ 142.147500, -11.138305 ], [ 142.157281, -11.121775 ], [ 142.147351, -11.098745 ], [ 142.152941, -11.093865 ], [ 142.144731, -11.039075 ], [ 142.125936, -10.981375 ], [ 142.132786, -10.948445 ], [ 142.193636, -10.914974 ], [ 142.221806, -10.922214 ], [ 142.248187, -10.909323 ], [ 142.284486, -10.917763 ], [ 142.313237, -10.901143 ], [ 142.315016, -10.915153 ], [ 142.334127, -10.890193 ], [ 142.351137, -10.883343 ], [ 142.365382, -10.846412 ], [ 142.390446, -10.826413 ], [ 142.424926, -10.742142 ], [ 142.422807, -10.727902 ], [ 142.438257, -10.708162 ], [ 142.459356, -10.720282 ], [ 142.498206, -10.716813 ], [ 142.530935, -10.687543 ], [ 142.540634, -10.696253 ], [ 142.541305, -10.709483 ], [ 142.551724, -10.708363 ], [ 142.556824, -10.726463 ], [ 142.567004, -10.722073 ], [ 142.573964, -10.732813 ], [ 142.581064, -10.724803 ], [ 142.583224, -10.733843 ], [ 142.609273, -10.749023 ], [ 142.597024, -10.758393 ], [ 142.599654, -10.764393 ], [ 142.578574, -10.795782 ], [ 142.566455, -10.795322 ], [ 142.549255, -10.831822 ], [ 142.517215, -10.843762 ], [ 142.510445, -10.861152 ], [ 142.516095, -10.909442 ], [ 142.501115, -10.917702 ], [ 142.503365, -10.930662 ], [ 142.488695, -10.944083 ], [ 142.497815, -10.939062 ], [ 142.500065, -10.954432 ], [ 142.482115, -10.978373 ], [ 142.498655, -10.968122 ], [ 142.512395, -10.939722 ], [ 142.525665, -10.934882 ], [ 142.543325, -10.907892 ], [ 142.555785, -10.913442 ], [ 142.542645, -10.902232 ], [ 142.557545, -10.874102 ], [ 142.558225, -10.880092 ], [ 142.571019, -10.877778 ], [ 142.568985, -10.872312 ], [ 142.575055, -10.869602 ], [ 142.593516, -10.888215 ], [ 142.585455, -10.874932 ], [ 142.592885, -10.875162 ], [ 142.589235, -10.868152 ], [ 142.616544, -10.892262 ], [ 142.616744, -10.915102 ], [ 142.604285, -10.912142 ], [ 142.619144, -10.916462 ], [ 142.609294, -10.933852 ], [ 142.614774, -10.941882 ], [ 142.629875, -10.945182 ], [ 142.638005, -10.937162 ], [ 142.646005, -10.939311 ], [ 142.644395, -10.945761 ], [ 142.649785, -10.940001 ], [ 142.667844, -10.944651 ], [ 142.680704, -10.971581 ], [ 142.698134, -10.977901 ], [ 142.716333, -10.961072 ], [ 142.752619, -11.007101 ], [ 142.749459, -11.026831 ], [ 142.756439, -11.042091 ], [ 142.786058, -11.074181 ], [ 142.787679, -11.126760 ], [ 142.799359, -11.157230 ], [ 142.783159, -11.222670 ], [ 142.793549, -11.278550 ], [ 142.802399, -11.291450 ], [ 142.819809, -11.291810 ], [ 142.828869, -11.314440 ], [ 142.840358, -11.319459 ], [ 142.868658, -11.381579 ], [ 142.832959, -11.433529 ], [ 142.826833, -11.476509 ], [ 142.839668, -11.492619 ], [ 142.834328, -11.559689 ], [ 142.852167, -11.586389 ], [ 142.859487, -11.635889 ], [ 142.862418, -11.750998 ], [ 142.850378, -11.806098 ], [ 142.854158, -11.822658 ], [ 142.847488, -11.823918 ], [ 142.856358, -11.845518 ], [ 142.881798, -11.871858 ], [ 142.901078, -11.872128 ], [ 142.909318, -11.890098 ], [ 142.928968, -11.904377 ], [ 142.922478, -11.892658 ], [ 142.945898, -11.900438 ], [ 142.974597, -11.932917 ], [ 143.015387, -11.937648 ], [ 143.060916, -11.923668 ], [ 143.066136, -11.928258 ], [ 143.066476, -11.920118 ], [ 143.093195, -11.904088 ], [ 143.098295, -11.892178 ], [ 143.109465, -11.906108 ], [ 143.122104, -11.905138 ], [ 143.147504, -11.919368 ], [ 143.149524, -11.948888 ], [ 143.161964, -11.954358 ], [ 143.167454, -11.973298 ], [ 143.209833, -11.962188 ], [ 143.213153, -11.954438 ], [ 143.224633, -11.954128 ], [ 143.244062, -11.968728 ], [ 143.228083, -11.989087 ], [ 143.216553, -11.974818 ], [ 143.185584, -11.990818 ], [ 143.101208, -12.145645 ], [ 143.092949, -12.157625 ], [ 143.078709, -12.159225 ], [ 143.084929, -12.172775 ], [ 143.094913, -12.173455 ], [ 143.087593, -12.201015 ], [ 143.095072, -12.203964 ], [ 143.097043, -12.218295 ], [ 143.086043, -12.242135 ], [ 143.094903, -12.259070 ], [ 143.081253, -12.288905 ], [ 143.078573, -12.337485 ], [ 143.084633, -12.348225 ], [ 143.115583, -12.338685 ], [ 143.128013, -12.347365 ], [ 143.180291, -12.343105 ], [ 143.182601, -12.350445 ], [ 143.194901, -12.349076 ], [ 143.215040, -12.362706 ], [ 143.230120, -12.382005 ], [ 143.247370, -12.379146 ], [ 143.249800, -12.390095 ], [ 143.266129, -12.394355 ], [ 143.273859, -12.407105 ], [ 143.272460, -12.507515 ], [ 143.296890, -12.532535 ], [ 143.303150, -12.551605 ], [ 143.331360, -12.565215 ], [ 143.354819, -12.563915 ], [ 143.393429, -12.595554 ], [ 143.414238, -12.593244 ], [ 143.418829, -12.615954 ], [ 143.438448, -12.611814 ], [ 143.438164, -12.623334 ], [ 143.402469, -12.662274 ], [ 143.402929, -12.678584 ], [ 143.418729, -12.676014 ], [ 143.418861, -12.681659 ], [ 143.390015, -12.714834 ], [ 143.382110, -12.749964 ], [ 143.357726, -12.798353 ], [ 143.351337, -12.899033 ], [ 143.359586, -12.890613 ], [ 143.375846, -12.899373 ], [ 143.391466, -12.884773 ], [ 143.392776, -12.897983 ], [ 143.401416, -12.900213 ], [ 143.405120, -12.867803 ], [ 143.449499, -12.848823 ], [ 143.475459, -12.864103 ], [ 143.502498, -12.858603 ], [ 143.533628, -12.838973 ], [ 143.544117, -12.842773 ], [ 143.512348, -12.903583 ], [ 143.498648, -12.949623 ], [ 143.512858, -12.962453 ], [ 143.504298, -12.986533 ], [ 143.515448, -13.007853 ], [ 143.503408, -13.109882 ], [ 143.507368, -13.152892 ], [ 143.523068, -13.176492 ], [ 143.515869, -13.259291 ], [ 143.533418, -13.341301 ], [ 143.557388, -13.365201 ], [ 143.580587, -13.371951 ], [ 143.598187, -13.422310 ], [ 143.579913, -13.485720 ], [ 143.584876, -13.478674 ], [ 143.579608, -13.510310 ], [ 143.587831, -13.532395 ], [ 143.543529, -13.638879 ], [ 143.550189, -13.631199 ], [ 143.543030, -13.719418 ], [ 143.531740, -13.754558 ], [ 143.545560, -13.800278 ], [ 143.591350, -13.857577 ], [ 143.601575, -13.914237 ], [ 143.622395, -13.967536 ], [ 143.681059, -14.014576 ], [ 143.703690, -14.126626 ], [ 143.698480, -14.180085 ], [ 143.703800, -14.208565 ], [ 143.730390, -14.266395 ], [ 143.745771, -14.333114 ], [ 143.781071, -14.399224 ], [ 143.819120, -14.441843 ], [ 143.884420, -14.482093 ], [ 143.932300, -14.483533 ], [ 143.948280, -14.495552 ], [ 143.960259, -14.484892 ], [ 144.029259, -14.481322 ], [ 144.095208, -14.445142 ], [ 144.130827, -14.402042 ], [ 144.141677, -14.405022 ], [ 144.151137, -14.389712 ], [ 144.168306, -14.381412 ], [ 144.196716, -14.339412 ], [ 144.196065, -14.260973 ], [ 144.208905, -14.262473 ], [ 144.216345, -14.254143 ], [ 144.231915, -14.269092 ], [ 144.244555, -14.264172 ], [ 144.262295, -14.290752 ], [ 144.281934, -14.302552 ], [ 144.293414, -14.297952 ], [ 144.315604, -14.308632 ], [ 144.343043, -14.307922 ], [ 144.359763, -14.291142 ], [ 144.374703, -14.291072 ], [ 144.396752, -14.273062 ], [ 144.436141, -14.258592 ], [ 144.465391, -14.227732 ], [ 144.491450, -14.166023 ], [ 144.516210, -14.166643 ], [ 144.558109, -14.228472 ], [ 144.577539, -14.235062 ], [ 144.576479, -14.247362 ], [ 144.596249, -14.260612 ], [ 144.581119, -14.306081 ], [ 144.587040, -14.360741 ], [ 144.622369, -14.362041 ], [ 144.644159, -14.348301 ], [ 144.651099, -14.358361 ], [ 144.620731, -14.437460 ], [ 144.614721, -14.430670 ], [ 144.621871, -14.445820 ], [ 144.618812, -14.475390 ], [ 144.665112, -14.511040 ], [ 144.679311, -14.546729 ], [ 144.693331, -14.553299 ], [ 144.692962, -14.567079 ], [ 144.695181, -14.555449 ], [ 144.715111, -14.561019 ], [ 144.774260, -14.545499 ], [ 144.782671, -14.593619 ], [ 144.838781, -14.614338 ], [ 144.910229, -14.614048 ], [ 144.923899, -14.638778 ], [ 144.923840, -14.663168 ], [ 144.942680, -14.663748 ], [ 144.950221, -14.677187 ], [ 144.956112, -14.744837 ], [ 144.961102, -14.738857 ], [ 144.981992, -14.749587 ], [ 144.980012, -14.755117 ], [ 144.993822, -14.751967 ], [ 144.994052, -14.763596 ], [ 145.004272, -14.751736 ], [ 145.004732, -14.772406 ], [ 145.021562, -14.782686 ], [ 145.024112, -14.795106 ], [ 145.090172, -14.802785 ], [ 145.135112, -14.834964 ], [ 145.190621, -14.843184 ], [ 145.188641, -14.837424 ], [ 145.229631, -14.831414 ], [ 145.220029, -14.882814 ], [ 145.264669, -14.926825 ], [ 145.282239, -14.955165 ], [ 145.298157, -14.963165 ], [ 145.314186, -14.953105 ], [ 145.332776, -14.955005 ], [ 145.340665, -14.945055 ], [ 145.351825, -14.951025 ], [ 145.354425, -14.982535 ], [ 145.289367, -15.042444 ], [ 145.233790, -15.139043 ], [ 145.240000, -15.150834 ], [ 145.238210, -15.195553 ], [ 145.263337, -15.251053 ], [ 145.271207, -15.258093 ], [ 145.314836, -15.258792 ], [ 145.339456, -15.226402 ], [ 145.356166, -15.276531 ], [ 145.329736, -15.278191 ], [ 145.285636, -15.316242 ], [ 145.282996, -15.328312 ], [ 145.297105, -15.343302 ], [ 145.284765, -15.363112 ], [ 145.287255, -15.375332 ], [ 145.247296, -15.416212 ], [ 145.240617, -15.460111 ], [ 145.228487, -15.461961 ], [ 145.240813, -15.466201 ], [ 145.251703, -15.457451 ], [ 145.261600, -15.459583 ], [ 145.283008, -15.498540 ], [ 145.272518, -15.517910 ], [ 145.272019, -15.541291 ], [ 145.287289, -15.559111 ], [ 145.304239, -15.551411 ], [ 145.322768, -15.570271 ], [ 145.319399, -15.586971 ], [ 145.328879, -15.601031 ], [ 145.316379, -15.605362 ], [ 145.319130, -15.632262 ], [ 145.312750, -15.646802 ], [ 145.333050, -15.662612 ], [ 145.335500, -15.681492 ], [ 145.361279, -15.719592 ], [ 145.368609, -15.762102 ], [ 145.351779, -15.806742 ], [ 145.358289, -15.830392 ], [ 145.376669, -15.838852 ], [ 145.356410, -15.890132 ], [ 145.357340, -15.910472 ], [ 145.362645, -15.922011 ], [ 145.382119, -15.924162 ], [ 145.413839, -15.951002 ], [ 145.434348, -15.998091 ], [ 145.450718, -16.009321 ], [ 145.463617, -16.035981 ], [ 145.464827, -16.066401 ], [ 145.476887, -16.076101 ], [ 145.451968, -16.141161 ], [ 145.439888, -16.141941 ], [ 145.450448, -16.142751 ], [ 145.441278, -16.174651 ], [ 145.444913, -16.200870 ], [ 145.469257, -16.210901 ], [ 145.470347, -16.235841 ], [ 145.481937, -16.241411 ], [ 145.478937, -16.267991 ], [ 145.488897, -16.276681 ], [ 145.447568, -16.289641 ], [ 145.418168, -16.338301 ], [ 145.412129, -16.376181 ], [ 145.419868, -16.387931 ], [ 145.404883, -16.433469 ], [ 145.410108, -16.459290 ], [ 145.432268, -16.476570 ], [ 145.442218, -16.472370 ], [ 145.468583, -16.479899 ], [ 145.470043, -16.514379 ], [ 145.500033, -16.552869 ], [ 145.513664, -16.584406 ], [ 145.522083, -16.586255 ], [ 145.523001, -16.600962 ], [ 145.564978, -16.643166 ], [ 145.581937, -16.687196 ], [ 145.621530, -16.699544 ], [ 145.651225, -16.729489 ], [ 145.670996, -16.737356 ], [ 145.682708, -16.775579 ], [ 145.695344, -16.775609 ], [ 145.714992, -16.802725 ], [ 145.724854, -16.803881 ], [ 145.744836, -16.845446 ], [ 145.774867, -16.870016 ], [ 145.765473, -16.869253 ], [ 145.777029, -16.880369 ], [ 145.768622, -16.882253 ], [ 145.762438, -16.897883 ], [ 145.764944, -16.907311 ], [ 145.782282, -16.916654 ], [ 145.779215, -16.940451 ], [ 145.785005, -16.941120 ], [ 145.793096, -16.910558 ], [ 145.810054, -16.909296 ], [ 145.848883, -16.871187 ], [ 145.869750, -16.906641 ], [ 145.906489, -16.897216 ], [ 145.919205, -16.864294 ], [ 145.957650, -16.896578 ], [ 145.956178, -16.905488 ], [ 145.944284, -16.906528 ], [ 145.931008, -16.922994 ], [ 145.934326, -16.947528 ], [ 145.900704, -16.981681 ], [ 145.889406, -17.057605 ], [ 145.916021, -17.087024 ], [ 145.929016, -17.117334 ], [ 145.949206, -17.130704 ], [ 145.952926, -17.157714 ], [ 145.964546, -17.168464 ], [ 145.961341, -17.190143 ], [ 145.971611, -17.242033 ], [ 145.995681, -17.273253 ], [ 146.020756, -17.346753 ], [ 146.050956, -17.384523 ], [ 146.073196, -17.394723 ], [ 146.064886, -17.458893 ], [ 146.077936, -17.478233 ], [ 146.076972, -17.504552 ], [ 146.051617, -17.505453 ], [ 146.057537, -17.507143 ], [ 146.056347, -17.520933 ], [ 146.036087, -17.523053 ], [ 146.032707, -17.512255 ], [ 146.027815, -17.550271 ], [ 146.033216, -17.525349 ], [ 146.058607, -17.524883 ], [ 146.060287, -17.511283 ], [ 146.068176, -17.510403 ], [ 146.092116, -17.561573 ], [ 146.127926, -17.592542 ], [ 146.128606, -17.599332 ], [ 146.112666, -17.608882 ], [ 146.125846, -17.612542 ], [ 146.126126, -17.601472 ], [ 146.132366, -17.601382 ], [ 146.140586, -17.639712 ], [ 146.149046, -17.648552 ], [ 146.113397, -17.692952 ], [ 146.104528, -17.727952 ], [ 146.111788, -17.771592 ], [ 146.090909, -17.799982 ], [ 146.105828, -17.815632 ], [ 146.099739, -17.833242 ], [ 146.106509, -17.852022 ], [ 146.119588, -17.855802 ], [ 146.097949, -17.896852 ], [ 146.091528, -17.955120 ], [ 146.101389, -17.976861 ], [ 146.094319, -17.973781 ], [ 146.073860, -17.989941 ], [ 146.041036, -18.043660 ], [ 146.027261, -18.091021 ], [ 146.008032, -18.120531 ], [ 146.016188, -18.245019 ], [ 146.081542, -18.314669 ], [ 146.085113, -18.331279 ], [ 146.102762, -18.348539 ], [ 146.133202, -18.368729 ], [ 146.141122, -18.364079 ], [ 146.159162, -18.396929 ], [ 146.161223, -18.424498 ], [ 146.173552, -18.434868 ], [ 146.167503, -18.445338 ], [ 146.190742, -18.443998 ], [ 146.200462, -18.452338 ], [ 146.188522, -18.460048 ], [ 146.189373, -18.473828 ], [ 146.213052, -18.472768 ], [ 146.225892, -18.498278 ], [ 146.257262, -18.494938 ], [ 146.267952, -18.505198 ], [ 146.290691, -18.506847 ], [ 146.313471, -18.521937 ], [ 146.337881, -18.526627 ], [ 146.345431, -18.559257 ], [ 146.321141, -18.557277 ], [ 146.334071, -18.565267 ], [ 146.322262, -18.577727 ], [ 146.339171, -18.564467 ], [ 146.341551, -18.570227 ], [ 146.338922, -18.606837 ], [ 146.319377, -18.646066 ], [ 146.332142, -18.640977 ], [ 146.339212, -18.623337 ], [ 146.338512, -18.630337 ], [ 146.301843, -18.705106 ], [ 146.273274, -18.811606 ], [ 146.273046, -18.860081 ], [ 146.289834, -18.891896 ], [ 146.321254, -18.923686 ], [ 146.335829, -18.955955 ], [ 146.363769, -18.967975 ], [ 146.380119, -18.997654 ], [ 146.396268, -18.998504 ], [ 146.454158, -19.073694 ], [ 146.472922, -19.076499 ], [ 146.490402, -19.095135 ], [ 146.516612, -19.099867 ], [ 146.562233, -19.142458 ], [ 146.597675, -19.148266 ], [ 146.619064, -19.166734 ], [ 146.678484, -19.190592 ], [ 146.714220, -19.193935 ], [ 146.723095, -19.181596 ], [ 146.751196, -19.184335 ], [ 146.730586, -19.181629 ], [ 146.736162, -19.180332 ], [ 146.767909, -19.184747 ], [ 146.790875, -19.240479 ], [ 146.805157, -19.238539 ], [ 146.820076, -19.253125 ], [ 146.833297, -19.243609 ], [ 146.826132, -19.255370 ], [ 146.835727, -19.242859 ], [ 146.846774, -19.255496 ], [ 146.835115, -19.270653 ], [ 146.847858, -19.273273 ], [ 146.842853, -19.274131 ], [ 146.882572, -19.303572 ], [ 146.942462, -19.295367 ], [ 146.958030, -19.308763 ], [ 146.960511, -19.293305 ], [ 146.978229, -19.284667 ], [ 147.001846, -19.249380 ], [ 147.002298, -19.234673 ], [ 147.021775, -19.215849 ], [ 147.016266, -19.182294 ], [ 147.039992, -19.206935 ], [ 147.044939, -19.237325 ], [ 147.060578, -19.256310 ], [ 147.061436, -19.276699 ], [ 147.046654, -19.274518 ], [ 147.039126, -19.296994 ], [ 147.047864, -19.299327 ], [ 147.064978, -19.342182 ], [ 147.113928, -19.387779 ], [ 147.110219, -19.397100 ], [ 147.126100, -19.422471 ], [ 147.135756, -19.417600 ], [ 147.135054, -19.406806 ], [ 147.161539, -19.405439 ], [ 147.212841, -19.423941 ], [ 147.234598, -19.418630 ], [ 147.246905, -19.432460 ], [ 147.304177, -19.407635 ], [ 147.410445, -19.425960 ], [ 147.441009, -19.421161 ], [ 147.455161, -19.395188 ], [ 147.446045, -19.365197 ], [ 147.417069, -19.333208 ], [ 147.421087, -19.322341 ], [ 147.457200, -19.374345 ], [ 147.486996, -19.465523 ], [ 147.501095, -19.485051 ], [ 147.510235, -19.484808 ], [ 147.500249, -19.469631 ], [ 147.507735, -19.476318 ], [ 147.559283, -19.550510 ], [ 147.580988, -19.624886 ], [ 147.574092, -19.629301 ], [ 147.585439, -19.648531 ], [ 147.600985, -19.646408 ], [ 147.615437, -19.673100 ], [ 147.616991, -19.685965 ], [ 147.599654, -19.687040 ], [ 147.586804, -19.725095 ], [ 147.601361, -19.757456 ], [ 147.663298, -19.809681 ], [ 147.671351, -19.828357 ], [ 147.705920, -19.832018 ], [ 147.699507, -19.835572 ], [ 147.707429, -19.840872 ], [ 147.703843, -19.836084 ], [ 147.738402, -19.847056 ], [ 147.760707, -19.841212 ], [ 147.773234, -19.826567 ], [ 147.766767, -19.815720 ], [ 147.780695, -19.817997 ], [ 147.776332, -19.807068 ], [ 147.782421, -19.805358 ], [ 147.771729, -19.803795 ], [ 147.767967, -19.794397 ], [ 147.777875, -19.788982 ], [ 147.769586, -19.791693 ], [ 147.771169, -19.786103 ], [ 147.767568, -19.790298 ], [ 147.767896, -19.783452 ], [ 147.744959, -19.769102 ], [ 147.761022, -19.727363 ], [ 147.752342, -19.706598 ], [ 147.823550, -19.709652 ], [ 147.851391, -19.739251 ], [ 147.845667, -19.782071 ], [ 147.864839, -19.850986 ], [ 147.917833, -19.908314 ], [ 147.992180, -19.927621 ], [ 148.017560, -19.913135 ], [ 148.026229, -19.894015 ], [ 148.080109, -19.881865 ], [ 148.097219, -19.924945 ], [ 148.111949, -19.941575 ], [ 148.164528, -19.957954 ], [ 148.186208, -19.944074 ], [ 148.220127, -19.956044 ], [ 148.239247, -19.984565 ], [ 148.255476, -19.986003 ], [ 148.260137, -19.976814 ], [ 148.266897, -19.985984 ], [ 148.267497, -20.023654 ], [ 148.259240, -20.012547 ], [ 148.248892, -20.017802 ], [ 148.251479, -20.024241 ], [ 148.248641, -20.017995 ], [ 148.239668, -20.021594 ], [ 148.228018, -20.035494 ], [ 148.230578, -20.045324 ], [ 148.270267, -20.070613 ], [ 148.266597, -20.078323 ], [ 148.274777, -20.072213 ], [ 148.283517, -20.077473 ], [ 148.274217, -20.086573 ], [ 148.277677, -20.099563 ], [ 148.303397, -20.110673 ], [ 148.320827, -20.136103 ], [ 148.338647, -20.139583 ], [ 148.352527, -20.162703 ], [ 148.369406, -20.156962 ], [ 148.396116, -20.169042 ], [ 148.396146, -20.161722 ], [ 148.421776, -20.160522 ], [ 148.434856, -20.168462 ], [ 148.441666, -20.149432 ], [ 148.465955, -20.138392 ], [ 148.478765, -20.116602 ], [ 148.443805, -20.111202 ], [ 148.441465, -20.074542 ], [ 148.452014, -20.059357 ], [ 148.474521, -20.064583 ], [ 148.487234, -20.081482 ], [ 148.494194, -20.079252 ], [ 148.495044, -20.088462 ], [ 148.513314, -20.093272 ], [ 148.529864, -20.093762 ], [ 148.540884, -20.076322 ], [ 148.562873, -20.066731 ], [ 148.566083, -20.082151 ], [ 148.552724, -20.094191 ], [ 148.554834, -20.113871 ], [ 148.567884, -20.118811 ], [ 148.566974, -20.132731 ], [ 148.578393, -20.127301 ], [ 148.579903, -20.134421 ], [ 148.565994, -20.150001 ], [ 148.576944, -20.154511 ], [ 148.570314, -20.170281 ], [ 148.598013, -20.166331 ], [ 148.582774, -20.181651 ], [ 148.582644, -20.197641 ], [ 148.599234, -20.201281 ], [ 148.619933, -20.176701 ], [ 148.601154, -20.210931 ], [ 148.614644, -20.220381 ], [ 148.630043, -20.219521 ], [ 148.628603, -20.190981 ], [ 148.639393, -20.170921 ], [ 148.646263, -20.178171 ], [ 148.642903, -20.213891 ], [ 148.652973, -20.216140 ], [ 148.677932, -20.178690 ], [ 148.660643, -20.216700 ], [ 148.667703, -20.233350 ], [ 148.662783, -20.247480 ], [ 148.678973, -20.230980 ], [ 148.685113, -20.241400 ], [ 148.673151, -20.282328 ], [ 148.689291, -20.278935 ], [ 148.693727, -20.270449 ], [ 148.702819, -20.273368 ], [ 148.708756, -20.262698 ], [ 148.738593, -20.281753 ], [ 148.733082, -20.253784 ], [ 148.753196, -20.264379 ], [ 148.752342, -20.235680 ], [ 148.769282, -20.235960 ], [ 148.777648, -20.274114 ], [ 148.801845, -20.277982 ], [ 148.790971, -20.278788 ], [ 148.793544, -20.291250 ], [ 148.766376, -20.286925 ], [ 148.769116, -20.299708 ], [ 148.792996, -20.313718 ], [ 148.791925, -20.321269 ], [ 148.816349, -20.321452 ], [ 148.822346, -20.331937 ], [ 148.807002, -20.342616 ], [ 148.816608, -20.343832 ], [ 148.818407, -20.354473 ], [ 148.825698, -20.337722 ], [ 148.840711, -20.351944 ], [ 148.837212, -20.366232 ], [ 148.827887, -20.365425 ], [ 148.831062, -20.384403 ], [ 148.816384, -20.384908 ], [ 148.820008, -20.392198 ], [ 148.823733, -20.386794 ], [ 148.839583, -20.391641 ], [ 148.838684, -20.430952 ], [ 148.846807, -20.431738 ], [ 148.880240, -20.472264 ], [ 148.902785, -20.467044 ], [ 148.911230, -20.479457 ], [ 148.890949, -20.477035 ], [ 148.884123, -20.488102 ], [ 148.919725, -20.513640 ], [ 148.930143, -20.533787 ], [ 148.906041, -20.535454 ], [ 148.899025, -20.545231 ], [ 148.884806, -20.523211 ], [ 148.856860, -20.527893 ], [ 148.856562, -20.515517 ], [ 148.850387, -20.510276 ], [ 148.846327, -20.515312 ], [ 148.844955, -20.503168 ], [ 148.821488, -20.496763 ], [ 148.823216, -20.477737 ], [ 148.831079, -20.475004 ], [ 148.817398, -20.459189 ], [ 148.823336, -20.449580 ], [ 148.831756, -20.450811 ], [ 148.824021, -20.426102 ], [ 148.820537, -20.443540 ], [ 148.813447, -20.439920 ], [ 148.813726, -20.420824 ], [ 148.800674, -20.423677 ], [ 148.790881, -20.415232 ], [ 148.793852, -20.453660 ], [ 148.785911, -20.430393 ], [ 148.756130, -20.418920 ], [ 148.775656, -20.431747 ], [ 148.784429, -20.451789 ], [ 148.782173, -20.464256 ], [ 148.763609, -20.479701 ], [ 148.752566, -20.472877 ], [ 148.736461, -20.482013 ], [ 148.692808, -20.441293 ], [ 148.684255, -20.436008 ], [ 148.680172, -20.441259 ], [ 148.692066, -20.446153 ], [ 148.692698, -20.462628 ], [ 148.713484, -20.483623 ], [ 148.715093, -20.494840 ], [ 148.662046, -20.585768 ], [ 148.690309, -20.599090 ], [ 148.686869, -20.620521 ], [ 148.699939, -20.639731 ], [ 148.718060, -20.642498 ], [ 148.727163, -20.633001 ], [ 148.730859, -20.644586 ], [ 148.706317, -20.670681 ], [ 148.732576, -20.688476 ], [ 148.730798, -20.716657 ], [ 148.758577, -20.724379 ], [ 148.766828, -20.734395 ], [ 148.777901, -20.732122 ], [ 148.780810, -20.762469 ], [ 148.802670, -20.775879 ], [ 148.829660, -20.776589 ], [ 148.840790, -20.791109 ], [ 148.814660, -20.791019 ], [ 148.820430, -20.799629 ], [ 148.813280, -20.803679 ], [ 148.796290, -20.796999 ], [ 148.800820, -20.806699 ], [ 148.787301, -20.816599 ], [ 148.811190, -20.814179 ], [ 148.820245, -20.832048 ], [ 148.823860, -20.821449 ], [ 148.838890, -20.824539 ], [ 148.849440, -20.846558 ], [ 148.832470, -20.849719 ], [ 148.847055, -20.855967 ], [ 148.843075, -20.875967 ], [ 148.866225, -20.867587 ], [ 148.875450, -20.883038 ], [ 148.874915, -20.862527 ], [ 148.884825, -20.848777 ], [ 148.880975, -20.856047 ], [ 148.892585, -20.862157 ], [ 148.890180, -20.877908 ], [ 148.915065, -20.891977 ], [ 148.927934, -20.883797 ], [ 148.938464, -20.888287 ], [ 148.951184, -20.875587 ], [ 148.971014, -20.900376 ], [ 148.995409, -20.892247 ], [ 149.005394, -20.912346 ], [ 149.017403, -20.912206 ], [ 149.029033, -20.897706 ], [ 149.046113, -20.903015 ], [ 149.046153, -20.919995 ], [ 149.058963, -20.928685 ], [ 149.028223, -20.923366 ], [ 149.011654, -20.935396 ], [ 149.030694, -20.956846 ], [ 149.015949, -20.954407 ], [ 149.021634, -20.962556 ], [ 149.015164, -20.967326 ], [ 149.019894, -20.975846 ], [ 149.014244, -20.991906 ], [ 149.041614, -20.989315 ], [ 149.050123, -20.978825 ], [ 149.064828, -20.985346 ], [ 149.066118, -20.995176 ], [ 149.067978, -20.984136 ], [ 149.085758, -20.989966 ], [ 149.064883, -20.974855 ], [ 149.088933, -20.975915 ], [ 149.108093, -20.998435 ], [ 149.128642, -21.006634 ], [ 149.122743, -21.033304 ], [ 149.131763, -21.031464 ], [ 149.132972, -20.996144 ], [ 149.158072, -21.000314 ], [ 149.157542, -21.016234 ], [ 149.170522, -21.042154 ], [ 149.174732, -21.032668 ], [ 149.186722, -21.034064 ], [ 149.205562, -21.076763 ], [ 149.227032, -21.062793 ], [ 149.223252, -21.103103 ], [ 149.231109, -21.109737 ], [ 149.223573, -21.118223 ], [ 149.222753, -21.147693 ], [ 149.209083, -21.131273 ], [ 149.216853, -21.122653 ], [ 149.209433, -21.130033 ], [ 149.196026, -21.125687 ], [ 149.192723, -21.132243 ], [ 149.204033, -21.132753 ], [ 149.199243, -21.137633 ], [ 149.163474, -21.132023 ], [ 149.152814, -21.143013 ], [ 149.172634, -21.134123 ], [ 149.215163, -21.145353 ], [ 149.199823, -21.158963 ], [ 149.192474, -21.182703 ], [ 149.195984, -21.211013 ], [ 149.185574, -21.198633 ], [ 149.173918, -21.198783 ], [ 149.214069, -21.241534 ], [ 149.199274, -21.268113 ], [ 149.181725, -21.274403 ], [ 149.179245, -21.284683 ], [ 149.201364, -21.277253 ], [ 149.189155, -21.294003 ], [ 149.198084, -21.296443 ], [ 149.224904, -21.263713 ], [ 149.255873, -21.244713 ], [ 149.273993, -21.277593 ], [ 149.298663, -21.273292 ], [ 149.291203, -21.318022 ], [ 149.301543, -21.335132 ], [ 149.297233, -21.340672 ], [ 149.315143, -21.354472 ], [ 149.308573, -21.364672 ], [ 149.311850, -21.374250 ], [ 149.318603, -21.369572 ], [ 149.317293, -21.392722 ], [ 149.306444, -21.391423 ], [ 149.302154, -21.400023 ], [ 149.276174, -21.389093 ], [ 149.283194, -21.394693 ], [ 149.276359, -21.400724 ], [ 149.288904, -21.401673 ], [ 149.282184, -21.409603 ], [ 149.295364, -21.415743 ], [ 149.331263, -21.410262 ], [ 149.338223, -21.426922 ], [ 149.335483, -21.432352 ], [ 149.322024, -21.418312 ], [ 149.312554, -21.426832 ], [ 149.297954, -21.426223 ], [ 149.289124, -21.463072 ], [ 149.298454, -21.470812 ], [ 149.274255, -21.477703 ], [ 149.289045, -21.491282 ], [ 149.290455, -21.506842 ], [ 149.300485, -21.511112 ], [ 149.307665, -21.499432 ], [ 149.326874, -21.505092 ], [ 149.309214, -21.496712 ], [ 149.334729, -21.486543 ], [ 149.339589, -21.474553 ], [ 149.357094, -21.496232 ], [ 149.350059, -21.509373 ], [ 149.395788, -21.493103 ], [ 149.373619, -21.535083 ], [ 149.398989, -21.540593 ], [ 149.392779, -21.549993 ], [ 149.400439, -21.560443 ], [ 149.408694, -21.558751 ], [ 149.400444, -21.558961 ], [ 149.400979, -21.549823 ], [ 149.414233, -21.546251 ], [ 149.437813, -21.553781 ], [ 149.444238, -21.577572 ], [ 149.422019, -21.575102 ], [ 149.436898, -21.579872 ], [ 149.432349, -21.584292 ], [ 149.449683, -21.578201 ], [ 149.443393, -21.593361 ], [ 149.453323, -21.581671 ], [ 149.453323, -21.562711 ], [ 149.465008, -21.561192 ], [ 149.457373, -21.555811 ], [ 149.472358, -21.559562 ], [ 149.457713, -21.553101 ], [ 149.468202, -21.534871 ], [ 149.484592, -21.531711 ], [ 149.486188, -21.570652 ], [ 149.477748, -21.571612 ], [ 149.473293, -21.589341 ], [ 149.453473, -21.602891 ], [ 149.438644, -21.639991 ], [ 149.455934, -21.679621 ], [ 149.444764, -21.687921 ], [ 149.452744, -21.688321 ], [ 149.458184, -21.708031 ], [ 149.449284, -21.713171 ], [ 149.470634, -21.708411 ], [ 149.479704, -21.742890 ], [ 149.455057, -21.731123 ], [ 149.439715, -21.743471 ], [ 149.425215, -21.743441 ], [ 149.421650, -21.771692 ], [ 149.430795, -21.745901 ], [ 149.434306, -21.818100 ], [ 149.438966, -21.810400 ], [ 149.458355, -21.817500 ], [ 149.463105, -21.822210 ], [ 149.455936, -21.830100 ], [ 149.471685, -21.838520 ], [ 149.462276, -21.875930 ], [ 149.465736, -21.902540 ], [ 149.459826, -21.904040 ], [ 149.465416, -21.925680 ], [ 149.485256, -21.958500 ], [ 149.490087, -21.989500 ], [ 149.523372, -22.027111 ], [ 149.517052, -22.075320 ], [ 149.543228, -22.134179 ], [ 149.553658, -22.140479 ], [ 149.558938, -22.168229 ], [ 149.566948, -22.171939 ], [ 149.554378, -22.187319 ], [ 149.562268, -22.191469 ], [ 149.574128, -22.233208 ], [ 149.598798, -22.253918 ], [ 149.603203, -22.271639 ], [ 149.597293, -22.281469 ], [ 149.629358, -22.297178 ], [ 149.656283, -22.336049 ], [ 149.658283, -22.354889 ], [ 149.684217, -22.345097 ], [ 149.710507, -22.369737 ], [ 149.713257, -22.356637 ], [ 149.731057, -22.347777 ], [ 149.766696, -22.371347 ], [ 149.746857, -22.386997 ], [ 149.743592, -22.421438 ], [ 149.752103, -22.436384 ], [ 149.774279, -22.415920 ], [ 149.784309, -22.380323 ], [ 149.811071, -22.382068 ], [ 149.849895, -22.416176 ], [ 149.888260, -22.492757 ], [ 149.962830, -22.539457 ], [ 149.991289, -22.586706 ], [ 149.991370, -22.601826 ], [ 150.003914, -22.608705 ], [ 150.018199, -22.639636 ], [ 150.046749, -22.661066 ], [ 150.010519, -22.581976 ], [ 150.002839, -22.530116 ], [ 149.984749, -22.506977 ], [ 149.976789, -22.473387 ], [ 149.912858, -22.342687 ], [ 149.961867, -22.343817 ], [ 149.932098, -22.333577 ], [ 149.971857, -22.329777 ], [ 149.914938, -22.321237 ], [ 149.922368, -22.305077 ], [ 149.915778, -22.295177 ], [ 149.917967, -22.274397 ], [ 149.931137, -22.264297 ], [ 149.955936, -22.185317 ], [ 150.001079, -22.143836 ], [ 150.035524, -22.146437 ], [ 150.030279, -22.136456 ], [ 150.042988, -22.126106 ], [ 150.052448, -22.135446 ], [ 150.059018, -22.132686 ], [ 150.065568, -22.152926 ], [ 150.080833, -22.151857 ], [ 150.099653, -22.212336 ], [ 150.092564, -22.217556 ], [ 150.151598, -22.259825 ], [ 150.157403, -22.304966 ], [ 150.192233, -22.325246 ], [ 150.178843, -22.340896 ], [ 150.177423, -22.360496 ], [ 150.205838, -22.369094 ], [ 150.217108, -22.393924 ], [ 150.293686, -22.403134 ], [ 150.300536, -22.397664 ], [ 150.301027, -22.421344 ], [ 150.322206, -22.426824 ], [ 150.331906, -22.440323 ], [ 150.383866, -22.465443 ], [ 150.402890, -22.481274 ], [ 150.405021, -22.498314 ], [ 150.424345, -22.498903 ], [ 150.435425, -22.508913 ], [ 150.430725, -22.517263 ], [ 150.439275, -22.512443 ], [ 150.448670, -22.534734 ], [ 150.450725, -22.522673 ], [ 150.483905, -22.534313 ], [ 150.497645, -22.560233 ], [ 150.501670, -22.543484 ], [ 150.488680, -22.529174 ], [ 150.486200, -22.521384 ], [ 150.491779, -22.521424 ], [ 150.502094, -22.537953 ], [ 150.544769, -22.561384 ], [ 150.537870, -22.572384 ], [ 150.514800, -22.557444 ], [ 150.522485, -22.567523 ], [ 150.515765, -22.572433 ], [ 150.532524, -22.573123 ], [ 150.530390, -22.581344 ], [ 150.544059, -22.573554 ], [ 150.529840, -22.602304 ], [ 150.538025, -22.598413 ], [ 150.548565, -22.617093 ], [ 150.537365, -22.590183 ], [ 150.547444, -22.576043 ], [ 150.559934, -22.603412 ], [ 150.551534, -22.566492 ], [ 150.562364, -22.564322 ], [ 150.573019, -22.577264 ], [ 150.591803, -22.574782 ], [ 150.588413, -22.559092 ], [ 150.597558, -22.559433 ], [ 150.585279, -22.555244 ], [ 150.581708, -22.545414 ], [ 150.587458, -22.544174 ], [ 150.569588, -22.527184 ], [ 150.568933, -22.504732 ], [ 150.552458, -22.483994 ], [ 150.574145, -22.482119 ], [ 150.556283, -22.477022 ], [ 150.533073, -22.450022 ], [ 150.534573, -22.445182 ], [ 150.590022, -22.464062 ], [ 150.575547, -22.451013 ], [ 150.539083, -22.442962 ], [ 150.539942, -22.426962 ], [ 150.556417, -22.430584 ], [ 150.541432, -22.422692 ], [ 150.544817, -22.408894 ], [ 150.529952, -22.402422 ], [ 150.539347, -22.351894 ], [ 150.561946, -22.316763 ], [ 150.604135, -22.335093 ], [ 150.625910, -22.327672 ], [ 150.645790, -22.345502 ], [ 150.640065, -22.363963 ], [ 150.617505, -22.347693 ], [ 150.642500, -22.379642 ], [ 150.623376, -22.388433 ], [ 150.615216, -22.381843 ], [ 150.618636, -22.389643 ], [ 150.610936, -22.388893 ], [ 150.630696, -22.399413 ], [ 150.643870, -22.391262 ], [ 150.657780, -22.414242 ], [ 150.650201, -22.421522 ], [ 150.627986, -22.421043 ], [ 150.646286, -22.423983 ], [ 150.627336, -22.441673 ], [ 150.655290, -22.422112 ], [ 150.650306, -22.439003 ], [ 150.666336, -22.454103 ], [ 150.661376, -22.419463 ], [ 150.672305, -22.402503 ], [ 150.650465, -22.368993 ], [ 150.667129, -22.346542 ], [ 150.680935, -22.366263 ], [ 150.678459, -22.374691 ], [ 150.687049, -22.377111 ], [ 150.693215, -22.430603 ], [ 150.716555, -22.443822 ], [ 150.753324, -22.446292 ], [ 150.747379, -22.453011 ], [ 150.758515, -22.468872 ], [ 150.748255, -22.477502 ], [ 150.740880, -22.473381 ], [ 150.730955, -22.485062 ], [ 150.723931, -22.518601 ], [ 150.697536, -22.506053 ], [ 150.696196, -22.489583 ], [ 150.685971, -22.492441 ], [ 150.678336, -22.473233 ], [ 150.671906, -22.472853 ], [ 150.681416, -22.484753 ], [ 150.673656, -22.482333 ], [ 150.674301, -22.494732 ], [ 150.644267, -22.474283 ], [ 150.673771, -22.501042 ], [ 150.664957, -22.508883 ], [ 150.667047, -22.522543 ], [ 150.688867, -22.544663 ], [ 150.679552, -22.573452 ], [ 150.685717, -22.577683 ], [ 150.681407, -22.567843 ], [ 150.691721, -22.553582 ], [ 150.717236, -22.553633 ], [ 150.724826, -22.563153 ], [ 150.718972, -22.600202 ], [ 150.732174, -22.623428 ], [ 150.714551, -22.633365 ], [ 150.715323, -22.623442 ], [ 150.694127, -22.606373 ], [ 150.707253, -22.636196 ], [ 150.727109, -22.633811 ], [ 150.733302, -22.641393 ], [ 150.728307, -22.633119 ], [ 150.736141, -22.623572 ], [ 150.748397, -22.635896 ], [ 150.758852, -22.626706 ], [ 150.748735, -22.633605 ], [ 150.738273, -22.624083 ], [ 150.751641, -22.621591 ], [ 150.743647, -22.617273 ], [ 150.741311, -22.603831 ], [ 150.748526, -22.610123 ], [ 150.752966, -22.604593 ], [ 150.740966, -22.600573 ], [ 150.742876, -22.587843 ], [ 150.748196, -22.591483 ], [ 150.744116, -22.584923 ], [ 150.753556, -22.589483 ], [ 150.748401, -22.580311 ], [ 150.756040, -22.576950 ], [ 150.762627, -22.552274 ], [ 150.774148, -22.552404 ], [ 150.756248, -22.539397 ], [ 150.754424, -22.523769 ], [ 150.783941, -22.529159 ], [ 150.789315, -22.536857 ], [ 150.780256, -22.545318 ], [ 150.790639, -22.555007 ], [ 150.784333, -22.555674 ], [ 150.779138, -22.577601 ], [ 150.777735, -22.638967 ], [ 150.786458, -22.650021 ], [ 150.803730, -22.646849 ], [ 150.804404, -22.671503 ], [ 150.812327, -22.679697 ], [ 150.835158, -22.684207 ], [ 150.821845, -22.715349 ], [ 150.825062, -22.730958 ], [ 150.812284, -22.749195 ], [ 150.805956, -22.791219 ], [ 150.815439, -22.798389 ], [ 150.806843, -22.804534 ], [ 150.810789, -22.817808 ], [ 150.803827, -22.815856 ], [ 150.796933, -22.825270 ], [ 150.789701, -22.865746 ], [ 150.786974, -22.922219 ], [ 150.799992, -22.933073 ], [ 150.777351, -22.961919 ], [ 150.771499, -23.055917 ], [ 150.749647, -23.128814 ], [ 150.774816, -23.165245 ], [ 150.794481, -23.162962 ], [ 150.792261, -23.175039 ], [ 150.799901, -23.182910 ], [ 150.793094, -23.187063 ], [ 150.791628, -23.208575 ], [ 150.787931, -23.201702 ], [ 150.798692, -23.227819 ], [ 150.819339, -23.221535 ], [ 150.821390, -23.235928 ], [ 150.828377, -23.236169 ], [ 150.825005, -23.280195 ], [ 150.789579, -23.309769 ], [ 150.767831, -23.303035 ], [ 150.775645, -23.323231 ], [ 150.792315, -23.321955 ], [ 150.799482, -23.339702 ], [ 150.793388, -23.336312 ], [ 150.790968, -23.357574 ], [ 150.810145, -23.406846 ], [ 150.871371, -23.480594 ], [ 150.860914, -23.502002 ], [ 150.850034, -23.506892 ], [ 150.796150, -23.501093 ], [ 150.789945, -23.510082 ], [ 150.878143, -23.552292 ], [ 150.876483, -23.565282 ], [ 150.834244, -23.553782 ], [ 150.833894, -23.562492 ], [ 150.866233, -23.575472 ], [ 150.857223, -23.620772 ], [ 150.874813, -23.576802 ], [ 150.934553, -23.543952 ], [ 150.959092, -23.553452 ], [ 150.959182, -23.598612 ], [ 150.932532, -23.609672 ], [ 150.925310, -23.622773 ], [ 150.968042, -23.605122 ], [ 150.975392, -23.555412 ], [ 151.026551, -23.572012 ], [ 151.037969, -23.623571 ], [ 151.041751, -23.619812 ], [ 151.046681, -23.629691 ], [ 151.040249, -23.636971 ], [ 151.047795, -23.629886 ], [ 151.068466, -23.638407 ], [ 151.084687, -23.647362 ], [ 151.079727, -23.653631 ], [ 151.085843, -23.648383 ], [ 151.092258, -23.654291 ], [ 151.086404, -23.657055 ], [ 151.097211, -23.658864 ], [ 151.088649, -23.660247 ], [ 151.109457, -23.661357 ], [ 151.121765, -23.671403 ], [ 151.134643, -23.698387 ], [ 151.111054, -23.696442 ], [ 151.117694, -23.700295 ], [ 151.109567, -23.704094 ], [ 151.124057, -23.704255 ], [ 151.123751, -23.713047 ], [ 151.132696, -23.707310 ], [ 151.151126, -23.728410 ], [ 151.159405, -23.747610 ], [ 151.144189, -23.770023 ], [ 151.172920, -23.815879 ], [ 151.191392, -23.821402 ], [ 151.192115, -23.831685 ], [ 151.193076, -23.825214 ], [ 151.236605, -23.817992 ], [ 151.244858, -23.826859 ], [ 151.235699, -23.820160 ], [ 151.232966, -23.830597 ], [ 151.271431, -23.837320 ], [ 151.278032, -23.854385 ], [ 151.296245, -23.853841 ], [ 151.297620, -23.860351 ], [ 151.318017, -23.854590 ], [ 151.315069, -23.882733 ], [ 151.302712, -23.873515 ], [ 151.304569, -23.900085 ], [ 151.324134, -23.875064 ], [ 151.354824, -23.935767 ], [ 151.366421, -23.937440 ], [ 151.426636, -23.987175 ], [ 151.429165, -24.023516 ], [ 151.435432, -24.026444 ], [ 151.424559, -24.046020 ], [ 151.435346, -24.058123 ], [ 151.437907, -24.076862 ], [ 151.447977, -24.062355 ], [ 151.442315, -24.058465 ], [ 151.448235, -24.047253 ], [ 151.440366, -24.035194 ], [ 151.443492, -24.026038 ], [ 151.457268, -24.037436 ], [ 151.455317, -24.056819 ], [ 151.460416, -24.064995 ], [ 151.461950, -24.055050 ], [ 151.466803, -24.059308 ], [ 151.465782, -24.071957 ], [ 151.471780, -24.072820 ], [ 151.471903, -24.063899 ], [ 151.480530, -24.064534 ], [ 151.484324, -24.074710 ], [ 151.493784, -24.067012 ], [ 151.479508, -24.060672 ], [ 151.474802, -24.033643 ], [ 151.470354, -24.038215 ], [ 151.441582, -24.015814 ], [ 151.440501, -23.992033 ], [ 151.467554, -23.994732 ], [ 151.543937, -24.029292 ], [ 151.544387, -24.037532 ], [ 151.526828, -24.035102 ], [ 151.501059, -24.045001 ], [ 151.526838, -24.060272 ], [ 151.517318, -24.070282 ], [ 151.524738, -24.088932 ], [ 151.547727, -24.089352 ], [ 151.545417, -24.113282 ], [ 151.552067, -24.110252 ], [ 151.552807, -24.081702 ], [ 151.555147, -24.109132 ], [ 151.559857, -24.099782 ], [ 151.563632, -24.111411 ], [ 151.560467, -24.073602 ], [ 151.580087, -24.087102 ], [ 151.575937, -24.077602 ], [ 151.555317, -24.069972 ], [ 151.564917, -24.036932 ], [ 151.573657, -24.035722 ], [ 151.582697, -24.049862 ], [ 151.610386, -24.042502 ], [ 151.621031, -24.055050 ], [ 151.634676, -24.055782 ], [ 151.645036, -24.080412 ], [ 151.651950, -24.073650 ], [ 151.657295, -24.090502 ], [ 151.665305, -24.084652 ], [ 151.671165, -24.098552 ], [ 151.675510, -24.088500 ], [ 151.678260, -24.110300 ], [ 151.682465, -24.104111 ], [ 151.684115, -24.088881 ], [ 151.664655, -24.060492 ], [ 151.685655, -24.067321 ], [ 151.677475, -24.049582 ], [ 151.669105, -24.051932 ], [ 151.651965, -24.032242 ], [ 151.637586, -24.032872 ], [ 151.646830, -24.027580 ], [ 151.632866, -24.011302 ], [ 151.634283, -24.004774 ], [ 151.630156, -24.013102 ], [ 151.604366, -24.008841 ], [ 151.610556, -23.979251 ], [ 151.644285, -23.977381 ], [ 151.673050, -23.989380 ], [ 151.697639, -24.011580 ], [ 151.730299, -24.022499 ], [ 151.704559, -24.039820 ], [ 151.711524, -24.052371 ], [ 151.702789, -24.056410 ], [ 151.715804, -24.058141 ], [ 151.720819, -24.068980 ], [ 151.715844, -24.087261 ], [ 151.732154, -24.061911 ], [ 151.725309, -24.049800 ], [ 151.738344, -24.046791 ], [ 151.741424, -24.042291 ], [ 151.734919, -24.041920 ], [ 151.744894, -24.032021 ], [ 151.738409, -24.003259 ], [ 151.753378, -24.018399 ], [ 151.764638, -24.015229 ], [ 151.767938, -24.060169 ], [ 151.786728, -24.117659 ], [ 151.771478, -24.129529 ], [ 151.784248, -24.124319 ], [ 151.785098, -24.129399 ], [ 151.784748, -24.121949 ], [ 151.793108, -24.126259 ], [ 151.804748, -24.145809 ], [ 151.840618, -24.170699 ], [ 151.821308, -24.165369 ], [ 151.835928, -24.176899 ], [ 151.875817, -24.171549 ], [ 151.849138, -24.218469 ], [ 151.878977, -24.193679 ], [ 151.869007, -24.189599 ], [ 151.882817, -24.175509 ], [ 151.886317, -24.149438 ], [ 151.906147, -24.208049 ], [ 151.920427, -24.210888 ], [ 151.943407, -24.240148 ], [ 152.005857, -24.433677 ], [ 152.040527, -24.497587 ], [ 152.057576, -24.511996 ], [ 152.044022, -24.525050 ], [ 152.058583, -24.517771 ], [ 152.064714, -24.522190 ], [ 152.092274, -24.566083 ], [ 152.148304, -24.626559 ], [ 152.206262, -24.657206 ], [ 152.274277, -24.711928 ], [ 152.347777, -24.738073 ], [ 152.333650, -24.743637 ], [ 152.365042, -24.736684 ], [ 152.346558, -24.732477 ], [ 152.378880, -24.732047 ], [ 152.396717, -24.750630 ], [ 152.391174, -24.747755 ], [ 152.377633, -24.768278 ], [ 152.381350, -24.796634 ], [ 152.384354, -24.763064 ], [ 152.412788, -24.757738 ], [ 152.421184, -24.775327 ], [ 152.468174, -24.816086 ], [ 152.494549, -24.916321 ], [ 152.486776, -24.930450 ], [ 152.486069, -24.970557 ], [ 152.550688, -25.073693 ], [ 152.542139, -25.069324 ], [ 152.533094, -25.078387 ], [ 152.536084, -25.081100 ], [ 152.533678, -25.089609 ], [ 152.546227, -25.073848 ], [ 152.577064, -25.119009 ], [ 152.633032, -25.151782 ], [ 152.617739, -25.173267 ], [ 152.577962, -25.166879 ], [ 152.555448, -25.171668 ], [ 152.540259, -25.190003 ], [ 152.547030, -25.205000 ], [ 152.548334, -25.188253 ], [ 152.557037, -25.182103 ], [ 152.614968, -25.183275 ], [ 152.649715, -25.227158 ], [ 152.644218, -25.233911 ], [ 152.651022, -25.229992 ], [ 152.663543, -25.244018 ], [ 152.722444, -25.269610 ], [ 152.806173, -25.264371 ], [ 152.804595, -25.247609 ], [ 152.813880, -25.243491 ], [ 152.827847, -25.247807 ], [ 152.834364, -25.276345 ], [ 152.859720, -25.283695 ], [ 152.899632, -25.280881 ], [ 152.914399, -25.293372 ], [ 152.901449, -25.314013 ], [ 152.917988, -25.363276 ], [ 152.909563, -25.378182 ], [ 152.924357, -25.430789 ], [ 152.909435, -25.418816 ], [ 152.896511, -25.418902 ], [ 152.889863, -25.426966 ], [ 152.908245, -25.429336 ], [ 152.871627, -25.443527 ], [ 152.850713, -25.484874 ], [ 152.823736, -25.494003 ], [ 152.848540, -25.498311 ], [ 152.885249, -25.461935 ], [ 152.927981, -25.447936 ], [ 152.934231, -25.431864 ], [ 152.956344, -25.433649 ], [ 152.948351, -25.451845 ], [ 152.941699, -25.451856 ], [ 152.946577, -25.461248 ], [ 152.926372, -25.469691 ], [ 152.896595, -25.498879 ], [ 152.895778, -25.504799 ], [ 152.903208, -25.500974 ], [ 152.909950, -25.529443 ], [ 152.897264, -25.533855 ], [ 152.902572, -25.541591 ], [ 152.875293, -25.556387 ], [ 152.861913, -25.553437 ], [ 152.877920, -25.561303 ], [ 152.877635, -25.566320 ], [ 152.883284, -25.562123 ], [ 152.884657, -25.568976 ], [ 152.880632, -25.575447 ], [ 152.877291, -25.572368 ], [ 152.875166, -25.609736 ], [ 152.892110, -25.617972 ], [ 152.901161, -25.646862 ], [ 152.896449, -25.658074 ], [ 152.911482, -25.674799 ], [ 152.883661, -25.673677 ], [ 152.878424, -25.683629 ], [ 152.920244, -25.706340 ], [ 152.907195, -25.728034 ], [ 152.916792, -25.733561 ], [ 152.912192, -25.738460 ], [ 152.937548, -25.744364 ], [ 152.937109, -25.759688 ], [ 152.956670, -25.757463 ], [ 152.973290, -25.762300 ], [ 152.976007, -25.771169 ], [ 152.971981, -25.794120 ], [ 152.950656, -25.801675 ], [ 152.939799, -25.795193 ], [ 152.936701, -25.815048 ], [ 152.941105, -25.819768 ], [ 152.949192, -25.818440 ], [ 152.944386, -25.810479 ], [ 152.978301, -25.809483 ], [ 152.983162, -25.824584 ], [ 152.987162, -25.803433 ], [ 153.020496, -25.829565 ], [ 153.025888, -25.852149 ], [ 153.015011, -25.853800 ], [ 153.016583, -25.865548 ], [ 152.993584, -25.881116 ], [ 153.010355, -25.877364 ], [ 153.009254, -25.885447 ], [ 153.022094, -25.866297 ], [ 153.031811, -25.877608 ], [ 153.029973, -25.888788 ], [ 153.025816, -25.896685 ], [ 153.019815, -25.891322 ], [ 153.003841, -25.899235 ], [ 153.009335, -25.903938 ], [ 153.001382, -25.907307 ], [ 153.016418, -25.903843 ], [ 153.006708, -25.917686 ], [ 153.015653, -25.930923 ], [ 152.997193, -25.934884 ], [ 153.031298, -25.934041 ], [ 152.998456, -25.953359 ], [ 153.003359, -25.961146 ], [ 153.009004, -25.956614 ], [ 152.999139, -25.969023 ], [ 153.007302, -25.968118 ], [ 153.005557, -25.981332 ], [ 153.016279, -25.982746 ], [ 153.011199, -25.990006 ], [ 153.016521, -25.997320 ], [ 153.018696, -25.986753 ], [ 153.026671, -25.987973 ], [ 153.014780, -25.976872 ], [ 153.031164, -25.978048 ], [ 153.023982, -25.959046 ], [ 153.030050, -25.955821 ], [ 153.039089, -25.969612 ], [ 153.042294, -25.951060 ], [ 153.032250, -25.946145 ], [ 153.040705, -25.935971 ], [ 153.049083, -25.944123 ], [ 153.046251, -25.931613 ], [ 153.056353, -25.931338 ], [ 153.027653, -25.922316 ], [ 153.024576, -25.908171 ], [ 153.034727, -25.905047 ], [ 153.029748, -25.911331 ], [ 153.037302, -25.912291 ], [ 153.051400, -25.898159 ], [ 153.050271, -25.908878 ], [ 153.058282, -25.914447 ], [ 153.052986, -25.906195 ], [ 153.057335, -25.887497 ], [ 153.066124, -25.885597 ], [ 153.061091, -25.871078 ], [ 153.047323, -25.861882 ], [ 153.046452, -25.849378 ], [ 153.054275, -25.827039 ], [ 153.071615, -25.822673 ], [ 153.046437, -25.808007 ], [ 153.072249, -25.811775 ], [ 153.085906, -25.888748 ], [ 153.119893, -25.933571 ], [ 153.161979, -25.949801 ], [ 153.176516, -25.945843 ], [ 153.182262, -25.928339 ], [ 153.192335, -25.932922 ], [ 153.152157, -26.006326 ], [ 153.113189, -26.103510 ], [ 153.076557, -26.224779 ], [ 153.061367, -26.313167 ], [ 153.063427, -26.346903 ], [ 153.077224, -26.379318 ], [ 153.092898, -26.386399 ], [ 153.107715, -26.376908 ], [ 153.119947, -26.379249 ], [ 153.091911, -26.517650 ], [ 153.102645, -26.546541 ], [ 153.098687, -26.642594 ], [ 153.108823, -26.670734 ], [ 153.127094, -26.683675 ], [ 153.139398, -26.679196 ], [ 153.136998, -26.773419 ], [ 153.151353, -26.802186 ], [ 153.124729, -26.806371 ], [ 153.119430, -26.833292 ], [ 153.109102, -26.841653 ], [ 153.112183, -26.869574 ], [ 153.102459, -26.881422 ], [ 153.094822, -26.878696 ], [ 153.101710, -26.883961 ], [ 153.092061, -26.895315 ], [ 153.083224, -26.894516 ], [ 153.069828, -26.908013 ], [ 153.061082, -26.892914 ], [ 153.061998, -26.928299 ], [ 153.043135, -26.946226 ], [ 153.066360, -26.965067 ], [ 153.065016, -26.976283 ], [ 153.043374, -26.969362 ], [ 153.045258, -26.985946 ], [ 153.024597, -26.988098 ], [ 153.060155, -26.988809 ], [ 153.075697, -27.017376 ], [ 153.085032, -27.016644 ], [ 153.083213, -27.028424 ], [ 153.100416, -27.032684 ], [ 153.111963, -27.051015 ], [ 153.107325, -27.057968 ], [ 153.096659, -27.053288 ], [ 153.100203, -27.062537 ], [ 153.110051, -27.062250 ], [ 153.098900, -27.063962 ], [ 153.126057, -27.062782 ], [ 153.144158, -27.075363 ], [ 153.132981, -27.085943 ], [ 153.099109, -27.090624 ], [ 153.066494, -27.110509 ], [ 153.043352, -27.149381 ], [ 153.035471, -27.148811 ], [ 153.037897, -27.127727 ], [ 153.022017, -27.124097 ], [ 153.035161, -27.131197 ], [ 153.033133, -27.153997 ], [ 153.043356, -27.156184 ], [ 153.030614, -27.158517 ], [ 153.036581, -27.165439 ], [ 153.029627, -27.182670 ], [ 153.037481, -27.196644 ], [ 153.088845, -27.206278 ], [ 153.106349, -27.190870 ], [ 153.116631, -27.198260 ], [ 153.117923, -27.233565 ], [ 153.107842, -27.261695 ], [ 153.092921, -27.255942 ], [ 153.077528, -27.262641 ], [ 153.068411, -27.247135 ], [ 153.075715, -27.227985 ], [ 153.053859, -27.230291 ], [ 153.077877, -27.264359 ], [ 153.063699, -27.283303 ], [ 153.069598, -27.313956 ], [ 153.086758, -27.325287 ], [ 153.082602, -27.333821 ], [ 153.094306, -27.343033 ], [ 153.155628, -27.362939 ], [ 153.160525, -27.377412 ], [ 153.146237, -27.387932 ], [ 153.150412, -27.394649 ], [ 153.141523, -27.415904 ], [ 153.109678, -27.438948 ], [ 153.090074, -27.445666 ], [ 153.049781, -27.440183 ], [ 153.053307, -27.460432 ], [ 153.053493, -27.442264 ], [ 153.088144, -27.450227 ], [ 153.110598, -27.443217 ], [ 153.142465, -27.421564 ], [ 153.154775, -27.401874 ], [ 153.165017, -27.400598 ], [ 153.157990, -27.391940 ], [ 153.177300, -27.362169 ], [ 153.191259, -27.367309 ], [ 153.179168, -27.383072 ], [ 153.183347, -27.393561 ], [ 153.165137, -27.397288 ], [ 153.174157, -27.407389 ], [ 153.173696, -27.415885 ], [ 153.167551, -27.413546 ], [ 153.175427, -27.440383 ], [ 153.191389, -27.450929 ], [ 153.189305, -27.459984 ], [ 153.192153, -27.451931 ], [ 153.194716, -27.456362 ], [ 153.188581, -27.475775 ], [ 153.194586, -27.478986 ], [ 153.201022, -27.472780 ], [ 153.207301, -27.481805 ], [ 153.231516, -27.481781 ], [ 153.241007, -27.465030 ], [ 153.241638, -27.480719 ], [ 153.260585, -27.484399 ], [ 153.261627, -27.516181 ], [ 153.290715, -27.510992 ], [ 153.277905, -27.540517 ], [ 153.281099, -27.549513 ], [ 153.290254, -27.565182 ], [ 153.307839, -27.565002 ], [ 153.305318, -27.574890 ], [ 153.317869, -27.581545 ], [ 153.297344, -27.594969 ], [ 153.311751, -27.621266 ], [ 153.315098, -27.639420 ], [ 153.308149, -27.656447 ], [ 153.320757, -27.674298 ], [ 153.315871, -27.679951 ], [ 153.323032, -27.700306 ], [ 153.301490, -27.706760 ], [ 153.293164, -27.691750 ], [ 153.298842, -27.710656 ], [ 153.318216, -27.711817 ], [ 153.327968, -27.697024 ], [ 153.348100, -27.695121 ], [ 153.356505, -27.711694 ], [ 153.383078, -27.708796 ], [ 153.369041, -27.703081 ], [ 153.366158, -27.693146 ], [ 153.378633, -27.674634 ], [ 153.366053, -27.670557 ], [ 153.367568, -27.648676 ], [ 153.401058, -27.644826 ], [ 153.402865, -27.634174 ], [ 153.415913, -27.641576 ], [ 153.388259, -27.657371 ], [ 153.397494, -27.696919 ], [ 153.385484, -27.708533 ], [ 153.392498, -27.707768 ], [ 153.412276, -27.740923 ], [ 153.439283, -27.735760 ], [ 153.426636, -27.778544 ], [ 153.384271, -27.784379 ], [ 153.385483, -27.785974 ], [ 153.406446, -27.782969 ], [ 153.411637, -27.790509 ], [ 153.394902, -27.818661 ], [ 153.373671, -27.814022 ], [ 153.392070, -27.794167 ], [ 153.390442, -27.792498 ], [ 153.391554, -27.793961 ], [ 153.381539, -27.801307 ], [ 153.371244, -27.800938 ], [ 153.381149, -27.801654 ], [ 153.373182, -27.807325 ], [ 153.370365, -27.800907 ], [ 153.366521, -27.800769 ], [ 153.371704, -27.817867 ], [ 153.385794, -27.829136 ], [ 153.377288, -27.835064 ], [ 153.376473, -27.845482 ], [ 153.392663, -27.839186 ], [ 153.385722, -27.840543 ], [ 153.381797, -27.834071 ], [ 153.395478, -27.831592 ], [ 153.396430, -27.838450 ], [ 153.393036, -27.839113 ], [ 153.395584, -27.864190 ], [ 153.398364, -27.857462 ], [ 153.401922, -27.863237 ], [ 153.395150, -27.872758 ], [ 153.400190, -27.872353 ], [ 153.400120, -27.868649 ], [ 153.410678, -27.870379 ], [ 153.400363, -27.881550 ], [ 153.400211, -27.873449 ], [ 153.396297, -27.886195 ], [ 153.407553, -27.907035 ], [ 153.410302, -27.954956 ], [ 153.421129, -27.974506 ], [ 153.418980, -27.982992 ], [ 153.427548, -27.971494 ], [ 153.421281, -27.940901 ], [ 153.434598, -27.934002 ], [ 153.429127, -27.938144 ], [ 153.431462, -28.002705 ], [ 153.450361, -28.083606 ], [ 153.477935, -28.125574 ], [ 153.486379, -28.125653 ], [ 153.514318, -28.161019 ], [ 153.552140, -28.164275 ], [ 153.534643, -28.177630 ], [ 153.476931, -28.157020 ], [ 153.457134, -28.180540 ], [ 153.435600, -28.187207 ], [ 153.406610, -28.210415 ], [ 153.389527, -28.234935 ], [ 153.356812, -28.249619 ], [ 153.335180, -28.248412 ], [ 153.330213, -28.237064 ], [ 153.278912, -28.233636 ], [ 153.262409, -28.246788 ], [ 153.245848, -28.245832 ], [ 153.231833, -28.265110 ], [ 153.178049, -28.247458 ], [ 153.174911, -28.274777 ], [ 153.161067, -28.279824 ], [ 153.168505, -28.294163 ], [ 153.154794, -28.295691 ], [ 153.143405, -28.311993 ], [ 153.124665, -28.318641 ], [ 153.129890, -28.330665 ], [ 153.108829, -28.357543 ], [ 153.046060, -28.339455 ], [ 153.008199, -28.341717 ], [ 152.972614, -28.331853 ], [ 152.933856, -28.338311 ], [ 152.880013, -28.309607 ], [ 152.831138, -28.320265 ], [ 152.804226, -28.353594 ], [ 152.775455, -28.346625 ], [ 152.751062, -28.363914 ], [ 152.722880, -28.344096 ], [ 152.679339, -28.330416 ], [ 152.667228, -28.311752 ], [ 152.638288, -28.310997 ], [ 152.624513, -28.298204 ], [ 152.614517, -28.269555 ], [ 152.600303, -28.283836 ], [ 152.601700, -28.307381 ], [ 152.579242, -28.338976 ], [ 152.568635, -28.323575 ], [ 152.556437, -28.323355 ], [ 152.555508, -28.316663 ], [ 152.548142, -28.321019 ], [ 152.525981, -28.306250 ], [ 152.534221, -28.262631 ], [ 152.508643, -28.249249 ], [ 152.463586, -28.259373 ], [ 152.442877, -28.290442 ], [ 152.444831, -28.298822 ], [ 152.414572, -28.298101 ], [ 152.409517, -28.315734 ], [ 152.417259, -28.333089 ], [ 152.386160, -28.368554 ], [ 152.355946, -28.361197 ], [ 152.341582, -28.367860 ], [ 152.309659, -28.363168 ], [ 152.288432, -28.393151 ], [ 152.267606, -28.390047 ], [ 152.217189, -28.449236 ], [ 152.190266, -28.433948 ], [ 152.184519, -28.438872 ], [ 152.160504, -28.433123 ], [ 152.121134, -28.462669 ], [ 152.070200, -28.468003 ], [ 152.067033, -28.485590 ], [ 152.045672, -28.494966 ], [ 152.016864, -28.525281 ], [ 151.988951, -28.525613 ], [ 151.982893, -28.503395 ], [ 151.955645, -28.518904 ], [ 151.957677, -28.563409 ], [ 151.985979, -28.581498 ], [ 151.990804, -28.624400 ], [ 152.010168, -28.664951 ], [ 152.039150, -28.664448 ], [ 152.052567, -28.681940 ], [ 152.066354, -28.680968 ], [ 152.066079, -28.697454 ], [ 152.076049, -28.708175 ], [ 152.042726, -28.731623 ], [ 152.047714, -28.740329 ], [ 152.036326, -28.756992 ], [ 152.041726, -28.778581 ], [ 152.034743, -28.790710 ], [ 152.037291, -28.819231 ], [ 152.017057, -28.838514 ], [ 152.015064, -28.850626 ], [ 152.025956, -28.858253 ], [ 152.036909, -28.851794 ], [ 152.038126, -28.864696 ], [ 152.009703, -28.907663 ], [ 152.001090, -28.909730 ], [ 151.997593, -28.895483 ], [ 151.968198, -28.916567 ], [ 151.916048, -28.929307 ], [ 151.900358, -28.914966 ], [ 151.849363, -28.907850 ], [ 151.837909, -28.916547 ], [ 151.839557, -28.942665 ], [ 151.832232, -28.959829 ], [ 151.813804, -28.959374 ], [ 151.806394, -28.944636 ], [ 151.777834, -28.959885 ], [ 151.770227, -28.955846 ], [ 151.772735, -28.938251 ], [ 151.743471, -28.918646 ], [ 151.733860, -28.871578 ], [ 151.706536, -28.871784 ], [ 151.674758, -28.907595 ], [ 151.644389, -28.916839 ], [ 151.634688, -28.929234 ], [ 151.609616, -28.923279 ], [ 151.577091, -28.945031 ], [ 151.566806, -28.941731 ], [ 151.545566, -28.952998 ], [ 151.536094, -28.980619 ], [ 151.498230, -29.019909 ], [ 151.491490, -29.056244 ], [ 151.502292, -29.070805 ], [ 151.486066, -29.088818 ], [ 151.463025, -29.098943 ], [ 151.451744, -29.126859 ], [ 151.428307, -29.147477 ], [ 151.410638, -29.152566 ], [ 151.393784, -29.177893 ], [ 151.339310, -29.177266 ], [ 151.314762, -29.165531 ], [ 151.308844, -29.147526 ], [ 151.315471, -29.134499 ], [ 151.279649, -29.100769 ], [ 151.275509, -29.077791 ], [ 151.288861, -29.050251 ], [ 151.284865, -29.037356 ], [ 151.271058, -29.030275 ], [ 151.283956, -29.005871 ], [ 151.276414, -28.986967 ], [ 151.282556, -28.980593 ], [ 151.272148, -28.973172 ], [ 151.282340, -28.954080 ], [ 151.274808, -28.938926 ], [ 151.243908, -28.924297 ], [ 151.234722, -28.904656 ], [ 151.208752, -28.901470 ], [ 151.200196, -28.884349 ], [ 151.132965, -28.860242 ], [ 151.104400, -28.844291 ], [ 151.102759, -28.836369 ], [ 151.083206, -28.834380 ], [ 151.054835, -28.849373 ], [ 151.045321, -28.844482 ], [ 151.037362, -28.827649 ], [ 151.041903, -28.799153 ], [ 151.024763, -28.793127 ], [ 151.019308, -28.772049 ], [ 151.028963, -28.770497 ], [ 151.028277, -28.761415 ], [ 151.010650, -28.740805 ], [ 150.938189, -28.730938 ], [ 150.930908, -28.705519 ], [ 150.906384, -28.687706 ], [ 150.874008, -28.693797 ], [ 150.848417, -28.673119 ], [ 150.819279, -28.666631 ], [ 150.818847, -28.657336 ], [ 150.795757, -28.655236 ], [ 150.752343, -28.633464 ], [ 150.728255, -28.634490 ], [ 150.708625, -28.651951 ], [ 150.681695, -28.661351 ], [ 150.673400, -28.650180 ], [ 150.632541, -28.676572 ], [ 150.625827, -28.668979 ], [ 150.600191, -28.670758 ], [ 150.580641, -28.655465 ], [ 150.561392, -28.661817 ], [ 150.554094, -28.653064 ], [ 150.548167, -28.658494 ], [ 150.552333, -28.668026 ], [ 150.544079, -28.671524 ], [ 150.527008, -28.668879 ], [ 150.539200, -28.660519 ], [ 150.525002, -28.654311 ], [ 150.514810, -28.661759 ], [ 150.487084, -28.657421 ], [ 150.460085, -28.668912 ], [ 150.445551, -28.665141 ], [ 150.429277, -28.651122 ], [ 150.415222, -28.650834 ], [ 150.413973, -28.633892 ], [ 150.401823, -28.627281 ], [ 150.387879, -28.633924 ], [ 150.387493, -28.625354 ], [ 150.370045, -28.620680 ], [ 150.363767, -28.607510 ], [ 150.369675, -28.598511 ], [ 150.352542, -28.587759 ], [ 150.351300, -28.575348 ], [ 150.327556, -28.571045 ], [ 150.320591, -28.557182 ], [ 150.289648, -28.537157 ], [ 150.236053, -28.553810 ], [ 150.238805, -28.559711 ], [ 150.230399, -28.555713 ], [ 150.229074, -28.567687 ], [ 150.213149, -28.567549 ], [ 150.212287, -28.574181 ], [ 150.192465, -28.566742 ], [ 150.186688, -28.572795 ], [ 150.186598, -28.565211 ], [ 150.177890, -28.563474 ], [ 150.182694, -28.556287 ], [ 150.171551, -28.563890 ], [ 150.169233, -28.550587 ], [ 150.154090, -28.557155 ], [ 150.152280, -28.550210 ], [ 150.138555, -28.565316 ], [ 150.121475, -28.559734 ], [ 150.110908, -28.570297 ], [ 150.091932, -28.564239 ], [ 150.092923, -28.578618 ], [ 150.085176, -28.575843 ], [ 150.079904, -28.584396 ], [ 150.073281, -28.576562 ], [ 150.048740, -28.589196 ], [ 150.045836, -28.582399 ], [ 150.016091, -28.580656 ], [ 149.976953, -28.613464 ], [ 149.950561, -28.608040 ], [ 149.941892, -28.617922 ], [ 149.936331, -28.610132 ], [ 149.917404, -28.608056 ], [ 149.899141, -28.621909 ], [ 149.862300, -28.602199 ], [ 149.844852, -28.610477 ], [ 149.830360, -28.603748 ], [ 149.819292, -28.615843 ], [ 149.811439, -28.605773 ], [ 149.784005, -28.614132 ], [ 149.754943, -28.609441 ], [ 149.744970, -28.618388 ], [ 149.721169, -28.609183 ], [ 149.703900, -28.616464 ], [ 149.709917, -28.620299 ], [ 149.703104, -28.633712 ], [ 149.666654, -28.631859 ], [ 149.674008, -28.624156 ], [ 149.660712, -28.609311 ], [ 149.655991, -28.615489 ], [ 149.647886, -28.612110 ], [ 149.642282, -28.599207 ], [ 149.625491, -28.593342 ], [ 149.610654, -28.600880 ], [ 149.587938, -28.572815 ], [ 149.568553, -28.571079 ], [ 149.552587, -28.580137 ], [ 149.528925, -28.574220 ], [ 149.513949, -28.581674 ], [ 149.502977, -28.574351 ], [ 149.502704, -28.580399 ], [ 149.481514, -28.582818 ], [ 149.474862, -28.593894 ], [ 149.452554, -28.594867 ], [ 149.439518, -28.612053 ], [ 149.442976, -28.620323 ], [ 149.428298, -28.629225 ], [ 149.432856, -28.635031 ], [ 149.426129, -28.650136 ], [ 149.417037, -28.651315 ], [ 149.423022, -28.655209 ], [ 149.405469, -28.675241 ], [ 149.393867, -28.677292 ], [ 149.387389, -28.695803 ], [ 149.358975, -28.684330 ], [ 149.346685, -28.696672 ], [ 149.329862, -28.698194 ], [ 149.317964, -28.714058 ], [ 149.297081, -28.709947 ], [ 149.269197, -28.743452 ], [ 149.262342, -28.734297 ], [ 149.253764, -28.742235 ], [ 149.246912, -28.738899 ], [ 149.224974, -28.764462 ], [ 149.188805, -28.775118 ], [ 149.192360, -28.780600 ], [ 149.179183, -28.802996 ], [ 149.160386, -28.810739 ], [ 149.139757, -28.807197 ], [ 149.143444, -28.822215 ], [ 149.128192, -28.835262 ], [ 149.112444, -28.829575 ], [ 149.103225, -28.838124 ], [ 149.097078, -28.831680 ], [ 149.080762, -28.841801 ], [ 149.080061, -28.858362 ], [ 149.055338, -28.884099 ], [ 149.063984, -28.888645 ], [ 149.058652, -28.910358 ], [ 149.048320, -28.916989 ], [ 149.032686, -28.955958 ], [ 149.009223, -28.956919 ], [ 148.998297, -28.972645 ], [ 148.976321, -28.976413 ], [ 148.958308, -28.999064 ], [ 140.999278, -28.999103 ], [ 140.999394, -25.996376 ], [ 137.999054, -25.996867 ], [ 138.001180, -16.544509 ], [ 138.047224, -16.578320 ], [ 138.116737, -16.648019 ], [ 138.175687, -16.686169 ], [ 138.272896, -16.719388 ], [ 138.323615, -16.750458 ], [ 138.329075, -16.736358 ], [ 138.362114, -16.740338 ], [ 138.427904, -16.777257 ], [ 138.450593, -16.773217 ], [ 138.479513, -16.783607 ], [ 138.471573, -16.775447 ], [ 138.486433, -16.783067 ], [ 138.539991, -16.781957 ], [ 138.628959, -16.767936 ], [ 138.657419, -16.778186 ], [ 138.658579, -16.784176 ], [ 138.650929, -16.778886 ], [ 138.681159, -16.800166 ], [ 138.822848, -16.852805 ], [ 138.844638, -16.867985 ], [ 138.880648, -16.877314 ], [ 138.883798, -16.884774 ], [ 138.915967, -16.876014 ], [ 138.945167, -16.888944 ], [ 138.979207, -16.887294 ], [ 139.038676, -16.912443 ], [ 139.034787, -16.927983 ], [ 139.043217, -16.950193 ], [ 139.079236, -16.977793 ], [ 139.086716, -16.998513 ], [ 139.157926, -17.029233 ], [ 139.140556, -17.078693 ], [ 139.155047, -17.163892 ], [ 139.201159, -17.270472 ], [ 139.237670, -17.319781 ], [ 139.305800, -17.364841 ], [ 139.341510, -17.374580 ], [ 139.417410, -17.374600 ], [ 139.450490, -17.393830 ], [ 139.436441, -17.422510 ], [ 139.452500, -17.395510 ], [ 139.476900, -17.400899 ], [ 139.535320, -17.441359 ], [ 139.552360, -17.460479 ], [ 139.550341, -17.468949 ], [ 139.590950, -17.482358 ], [ 139.603281, -17.505418 ], [ 139.646690, -17.538138 ], [ 139.712300, -17.553468 ], [ 139.721619, -17.548398 ], [ 139.751769, -17.563677 ], [ 139.757299, -17.577017 ], [ 139.808928, -17.578087 ], [ 139.821768, -17.570617 ], [ 139.839198, -17.589827 ], [ 139.833888, -17.605417 ], [ 139.845078, -17.604747 ], [ 139.847208, -17.596047 ], [ 139.937737, -17.630976 ], [ 139.948817, -17.673796 ], [ 140.004377, -17.714575 ], [ 140.093435, -17.722545 ], [ 140.199923, -17.702984 ], [ 140.216683, -17.709174 ], [ 140.384571, -17.677883 ], [ 140.447920, -17.641683 ], [ 140.462210, -17.648873 ], [ 140.479180, -17.644873 ], [ 140.565939, -17.601542 ], [ 140.593629, -17.597832 ], [ 140.709837, -17.509932 ], [ 140.735497, -17.512221 ], [ 140.769436, -17.477701 ], [ 140.828396, -17.465341 ], [ 140.828816, -17.455171 ], [ 140.887415, -17.382311 ], [ 140.893405, -17.349411 ], [ 140.900835, -17.348651 ], [ 140.893715, -17.342291 ], [ 140.904994, -17.316241 ], [ 140.899394, -17.302821 ], [ 140.909664, -17.277411 ], [ 140.912554, -17.233131 ], [ 140.925543, -17.198591 ], [ 140.940433, -17.184611 ], [ 140.953912, -17.098541 ], [ 140.962232, -17.092841 ], [ 140.946891, -17.040591 ], [ 140.958021, -16.998141 ], [ 140.973590, -16.969841 ], [ 141.011220, -16.940721 ], [ 141.064849, -16.870241 ], [ 141.082288, -16.803161 ], [ 141.093878, -16.803771 ], [ 141.128817, -16.779761 ], [ 141.204446, -16.691990 ], [ 141.221186, -16.656100 ], [ 141.233035, -16.587980 ], [ 141.251375, -16.557730 ], [ 141.270655, -16.557750 ], [ 141.296484, -16.496210 ], [ 141.304864, -16.457120 ], [ 141.287214, -16.425691 ], [ 141.286073, -16.408171 ], [ 141.320833, -16.342451 ], [ 141.351082, -16.218871 ], [ 141.412370, -16.122771 ], [ 141.432770, -16.074761 ], [ 141.409660, -16.023891 ], [ 141.392669, -15.951202 ], [ 141.373379, -15.916912 ], [ 141.397569, -15.909632 ], [ 141.409308, -15.871292 ], [ 141.434677, -15.657593 ], [ 141.479496, -15.498773 ], [ 141.497286, -15.479172 ], [ 141.541205, -15.351972 ], [ 141.548655, -15.350862 ], [ 141.545115, -15.332542 ], [ 141.569345, -15.296572 ], [ 141.580144, -15.235252 ], [ 141.575594, -15.205402 ], [ 141.580104, -15.212542 ], [ 141.585964, -15.201712 ], [ 141.580264, -15.198752 ], [ 141.632334, -15.161722 ], [ 141.642174, -15.126282 ], [ 141.631654, -15.103872 ], [ 141.641753, -15.075092 ], [ 141.660193, -15.054692 ], [ 141.667143, -15.023522 ], [ 141.663509, -15.003962 ] ], [ [ 141.663264, -15.002642 ], [ 141.659633, -14.983102 ], [ 141.652643, -14.973722 ], [ 141.663264, -15.002642 ] ], [ [ 153.418782, -27.983775 ], [ 153.414918, -27.999034 ], [ 153.418593, -27.991038 ], [ 153.426410, -27.998556 ], [ 153.428083, -27.988700 ], [ 153.421946, -27.991747 ], [ 153.418782, -27.983775 ] ], [ [ 153.384533, -27.873611 ], [ 153.381187, -27.861126 ], [ 153.380745, -27.873915 ], [ 153.384533, -27.873611 ] ], [ [ 153.380463, -27.882054 ], [ 153.380240, -27.888522 ], [ 153.351138, -27.890017 ], [ 153.357695, -27.891006 ], [ 153.352334, -27.902052 ], [ 153.342355, -27.894883 ], [ 153.348417, -27.901758 ], [ 153.343328, -27.910546 ], [ 153.348841, -27.919290 ], [ 153.357839, -27.911845 ], [ 153.358452, -27.893345 ], [ 153.381965, -27.891385 ], [ 153.380463, -27.882054 ] ], [ [ 153.380611, -27.858976 ], [ 153.379578, -27.855123 ], [ 153.365183, -27.849873 ], [ 153.367590, -27.848937 ], [ 153.360362, -27.848540 ], [ 153.380611, -27.858976 ] ], [ [ 153.189041, -27.489295 ], [ 153.187270, -27.491334 ], [ 153.192737, -27.495081 ], [ 153.189041, -27.489295 ] ], [ [ 153.053206, -27.470205 ], [ 153.049071, -27.474133 ], [ 153.036853, -27.462407 ], [ 153.035625, -27.465476 ], [ 153.042924, -27.477473 ], [ 153.053158, -27.474863 ], [ 153.053206, -27.470205 ] ], [ [ 153.034401, -27.468537 ], [ 153.030055, -27.479401 ], [ 153.016591, -27.467591 ], [ 153.003576, -27.474761 ], [ 152.994671, -27.489960 ], [ 153.015100, -27.492494 ], [ 153.020615, -27.500563 ], [ 153.000384, -27.506686 ], [ 152.997869, -27.514944 ], [ 153.008303, -27.520945 ], [ 153.001187, -27.509937 ], [ 153.023266, -27.500330 ], [ 153.015508, -27.490914 ], [ 152.996449, -27.488859 ], [ 153.005487, -27.475966 ], [ 153.016242, -27.469481 ], [ 153.031672, -27.481851 ], [ 153.034401, -27.468537 ] ], [ [ 153.008332, -27.520989 ], [ 152.996948, -27.521667 ], [ 152.970607, -27.504557 ], [ 152.965751, -27.514410 ], [ 152.973545, -27.542577 ], [ 152.938563, -27.525358 ], [ 152.926836, -27.529063 ], [ 152.924928, -27.540832 ], [ 152.903432, -27.544263 ], [ 152.906095, -27.554386 ], [ 152.894252, -27.560344 ], [ 152.900985, -27.566915 ], [ 152.893180, -27.577266 ], [ 152.905339, -27.600726 ], [ 152.896640, -27.601187 ], [ 152.874073, -27.578570 ], [ 152.862014, -27.596959 ], [ 152.855671, -27.595594 ], [ 152.862395, -27.598111 ], [ 152.874271, -27.579575 ], [ 152.895854, -27.601917 ], [ 152.906082, -27.601893 ], [ 152.894645, -27.579249 ], [ 152.902405, -27.566557 ], [ 152.895476, -27.560735 ], [ 152.907246, -27.555607 ], [ 152.904281, -27.544945 ], [ 152.924542, -27.542538 ], [ 152.928825, -27.529015 ], [ 152.940604, -27.528123 ], [ 152.974146, -27.544639 ], [ 152.967828, -27.515666 ], [ 152.972495, -27.505962 ], [ 152.995168, -27.524705 ], [ 153.009663, -27.523049 ], [ 153.008332, -27.520989 ] ], [ [ 152.937083, -25.760620 ], [ 152.936869, -25.768090 ], [ 152.941918, -25.765354 ], [ 152.937083, -25.760620 ] ], [ [ 152.525074, -25.071108 ], [ 152.523429, -25.068824 ], [ 152.507522, -25.077532 ], [ 152.523325, -25.069521 ], [ 152.525074, -25.071108 ] ], [ [ 150.574294, -22.482161 ], [ 150.607817, -22.500843 ], [ 150.587402, -22.487502 ], [ 150.601857, -22.486143 ], [ 150.590708, -22.484483 ], [ 150.593027, -22.475803 ], [ 150.587052, -22.485802 ], [ 150.574294, -22.482161 ] ], [ [ 142.594143, -10.889247 ], [ 142.587955, -10.888612 ], [ 142.583365, -10.901272 ], [ 142.588755, -10.889512 ], [ 142.595275, -10.891112 ], [ 142.594143, -10.889247 ] ], [ [ 149.451231, -21.729296 ], [ 149.435825, -21.721941 ], [ 149.432715, -21.727041 ], [ 149.451231, -21.729296 ] ], [ [ 151.636498, -24.000305 ], [ 151.641625, -24.002631 ], [ 151.638165, -23.996941 ], [ 151.636498, -24.000305 ] ] ], [ [ [ 143.587838, -13.532380 ], [ 143.585163, -13.517198 ], [ 143.591058, -13.524640 ], [ 143.587838, -13.532380 ] ] ], [ [ [ 147.420305, -19.321215 ], [ 147.384578, -19.302496 ], [ 147.414341, -19.312627 ], [ 147.420305, -19.321215 ] ] ], [ [ [ 153.546708, -27.434827 ], [ 153.527186, -27.461592 ], [ 153.480873, -27.580785 ], [ 153.458708, -27.670620 ], [ 153.453997, -27.728758 ], [ 153.438435, -27.733191 ], [ 153.446265, -27.716514 ], [ 153.439943, -27.715469 ], [ 153.432158, -27.728161 ], [ 153.436187, -27.734647 ], [ 153.412751, -27.738998 ], [ 153.392899, -27.707127 ], [ 153.402075, -27.692963 ], [ 153.398836, -27.662602 ], [ 153.421663, -27.642054 ], [ 153.407077, -27.611009 ], [ 153.413532, -27.599202 ], [ 153.412537, -27.511639 ], [ 153.398385, -27.496423 ], [ 153.409129, -27.476010 ], [ 153.423033, -27.470118 ], [ 153.440450, -27.411344 ], [ 153.436199, -27.405505 ], [ 153.432456, -27.411206 ], [ 153.438495, -27.394897 ], [ 153.455838, -27.388291 ], [ 153.483166, -27.415556 ], [ 153.543327, -27.425346 ], [ 153.546708, -27.434827 ] ] ], [ [ [ 153.468489, -27.028478 ], [ 153.434044, -27.131235 ], [ 153.419661, -27.203570 ], [ 153.417580, -27.274423 ], [ 153.437286, -27.333965 ], [ 153.427959, -27.363640 ], [ 153.418640, -27.355020 ], [ 153.421218, -27.331066 ], [ 153.365502, -27.201245 ], [ 153.373262, -27.176285 ], [ 153.361611, -27.135660 ], [ 153.370134, -27.103027 ], [ 153.361400, -27.061041 ], [ 153.402396, -27.035267 ], [ 153.387805, -27.047619 ], [ 153.407102, -27.040074 ], [ 153.388730, -27.050345 ], [ 153.454481, -27.022003 ], [ 153.468489, -27.028478 ] ] ], [ [ [ 153.445354, -27.757379 ], [ 153.427189, -27.868386 ], [ 153.425530, -27.923964 ], [ 153.431489, -27.933127 ], [ 153.426455, -27.933921 ], [ 153.418943, -27.921140 ], [ 153.423500, -27.873558 ], [ 153.409414, -27.857256 ], [ 153.406535, -27.833970 ], [ 153.437815, -27.778226 ], [ 153.437091, -27.753164 ], [ 153.445354, -27.757379 ] ] ], [ [ [ 153.419051, -27.931575 ], [ 153.416219, -27.940147 ], [ 153.411533, -27.931464 ], [ 153.419051, -27.931575 ] ] ], [ [ [ 153.397645, -27.823099 ], [ 153.390059, -27.829920 ], [ 153.382115, -27.822919 ], [ 153.397645, -27.823099 ] ] ], [ [ [ 153.390463, -27.620217 ], [ 153.372437, -27.630754 ], [ 153.383042, -27.615850 ], [ 153.390463, -27.620217 ] ] ], [ [ [ 153.376281, -27.618272 ], [ 153.362416, -27.632403 ], [ 153.346774, -27.622307 ], [ 153.360837, -27.580348 ], [ 153.367779, -27.591278 ], [ 153.360363, -27.614320 ], [ 153.368145, -27.616073 ], [ 153.368250, -27.605871 ], [ 153.376281, -27.618272 ] ] ], [ [ [ 153.374756, -27.498101 ], [ 153.345019, -27.514230 ], [ 153.336635, -27.498094 ], [ 153.359110, -27.485742 ], [ 153.374756, -27.498101 ] ] ], [ [ [ 153.361765, -27.683956 ], [ 153.349681, -27.681842 ], [ 153.353855, -27.649222 ], [ 153.361765, -27.683956 ] ] ], [ [ [ 152.950180, -25.573919 ], [ 152.949924, -25.561256 ], [ 152.959530, -25.560827 ], [ 152.951004, -25.551935 ], [ 152.988700, -25.512107 ], [ 152.993434, -25.484536 ], [ 152.983831, -25.468563 ], [ 152.986802, -25.448296 ], [ 153.007945, -25.411261 ], [ 153.034132, -25.384775 ], [ 153.051422, -25.345320 ], [ 153.039991, -25.276699 ], [ 153.051353, -25.262671 ], [ 153.045751, -25.247605 ], [ 153.051534, -25.244659 ], [ 153.038673, -25.223162 ], [ 152.995353, -25.230323 ], [ 152.992301, -25.220705 ], [ 153.029533, -25.176303 ], [ 153.076841, -25.152851 ], [ 153.160286, -25.083602 ], [ 153.222258, -24.995656 ], [ 153.234004, -24.942465 ], [ 153.226223, -24.912011 ], [ 153.169105, -24.832034 ], [ 153.144138, -24.816753 ], [ 153.118924, -24.815058 ], [ 153.176828, -24.743396 ], [ 153.249730, -24.697620 ], [ 153.264622, -24.697089 ], [ 153.266901, -24.704360 ], [ 153.259634, -24.823713 ], [ 153.270255, -24.893474 ], [ 153.304181, -24.949901 ], [ 153.325286, -24.963937 ], [ 153.350721, -24.963441 ], [ 153.352266, -24.999593 ], [ 153.360352, -25.006351 ], [ 153.188220, -25.370615 ], [ 153.107901, -25.560023 ], [ 153.078329, -25.668662 ], [ 153.089358, -25.757713 ], [ 153.077662, -25.792340 ], [ 153.038935, -25.792544 ], [ 153.015095, -25.769062 ], [ 152.990494, -25.717780 ], [ 152.991996, -25.697164 ], [ 152.982456, -25.676569 ], [ 152.987170, -25.671992 ], [ 152.980329, -25.670686 ], [ 152.983046, -25.660247 ], [ 152.969830, -25.639832 ], [ 152.974675, -25.624680 ], [ 152.961913, -25.605494 ], [ 152.955499, -25.613069 ], [ 152.955870, -25.598860 ], [ 152.959554, -25.601948 ], [ 152.955282, -25.595525 ], [ 152.964234, -25.576680 ], [ 152.956113, -25.589134 ], [ 152.952425, -25.584519 ], [ 152.952676, -25.594422 ], [ 152.942505, -25.585859 ], [ 152.950180, -25.573919 ] ] ], [ [ [ 153.352586, -27.632497 ], [ 153.347064, -27.638539 ], [ 153.335139, -27.621186 ], [ 153.352586, -27.632497 ] ] ], [ [ [ 153.341562, -27.605001 ], [ 153.336830, -27.620871 ], [ 153.333440, -27.614301 ], [ 153.341562, -27.605001 ] ] ], [ [ [ 153.341439, -27.648566 ], [ 153.329074, -27.670436 ], [ 153.322939, -27.651959 ], [ 153.328599, -27.635049 ], [ 153.341439, -27.648566 ] ] ], [ [ [ 153.339912, -27.690426 ], [ 153.327446, -27.694839 ], [ 153.319590, -27.680217 ], [ 153.326488, -27.677403 ], [ 153.339912, -27.690426 ] ] ], [ [ [ 153.338770, -27.566762 ], [ 153.335164, -27.574963 ], [ 153.318673, -27.573471 ], [ 153.330106, -27.563115 ], [ 153.338770, -27.566762 ] ] ], [ [ [ 153.241558, -27.391140 ], [ 153.239130, -27.397299 ], [ 153.225927, -27.391912 ], [ 153.235054, -27.377650 ], [ 153.241558, -27.391140 ] ] ], [ [ [ 153.207558, -27.081683 ], [ 153.197319, -27.096589 ], [ 153.165720, -27.099444 ], [ 153.155417, -27.072152 ], [ 153.135343, -27.054075 ], [ 153.132554, -27.036280 ], [ 153.099075, -27.013777 ], [ 153.093119, -26.991818 ], [ 153.098616, -26.985759 ], [ 153.079019, -26.972384 ], [ 153.090917, -26.944968 ], [ 153.075200, -26.920269 ], [ 153.077223, -26.910150 ], [ 153.129999, -26.874151 ], [ 153.129951, -26.814082 ], [ 153.130523, -26.872422 ], [ 153.141534, -26.918363 ], [ 153.168082, -27.001748 ], [ 153.207558, -27.081683 ] ] ], [ [ [ 153.188501, -27.401757 ], [ 153.178023, -27.396700 ], [ 153.183789, -27.393430 ], [ 153.188501, -27.401757 ] ] ], [ [ [ 153.085530, -27.008147 ], [ 153.077628, -27.009800 ], [ 153.078823, -27.001741 ], [ 153.085530, -27.008147 ] ] ], [ [ [ 152.993723, -25.334914 ], [ 152.977217, -25.309973 ], [ 152.959055, -25.302812 ], [ 152.943013, -25.272831 ], [ 152.988579, -25.313966 ], [ 152.993723, -25.334914 ] ] ], [ [ [ 152.969339, -25.477287 ], [ 152.961200, -25.491444 ], [ 152.960351, -25.477359 ], [ 152.969339, -25.477287 ] ] ], [ [ [ 152.964241, -25.620138 ], [ 152.957638, -25.637489 ], [ 152.952811, -25.616189 ], [ 152.964241, -25.620138 ] ] ], [ [ [ 152.955833, -25.494834 ], [ 152.935971, -25.522798 ], [ 152.915032, -25.529163 ], [ 152.909266, -25.499854 ], [ 152.942185, -25.478995 ], [ 152.952524, -25.482803 ], [ 152.955833, -25.494834 ] ] ], [ [ [ 152.949727, -25.558276 ], [ 152.941926, -25.583345 ], [ 152.937963, -25.562785 ], [ 152.949727, -25.558276 ] ] ], [ [ [ 152.938475, -25.610550 ], [ 152.928925, -25.598976 ], [ 152.931179, -25.586306 ], [ 152.938475, -25.610550 ] ] ], [ [ [ 152.930181, -25.618306 ], [ 152.927026, -25.624367 ], [ 152.921184, -25.614228 ], [ 152.930181, -25.618306 ] ] ], [ [ [ 152.927744, -25.583076 ], [ 152.924186, -25.598071 ], [ 152.920360, -25.574699 ], [ 152.927744, -25.583076 ] ] ], [ [ [ 152.921850, -25.560239 ], [ 152.920682, -25.568012 ], [ 152.915030, -25.562742 ], [ 152.921850, -25.560239 ] ] ], [ [ [ 152.912179, -25.549367 ], [ 152.906687, -25.563753 ], [ 152.902534, -25.555341 ], [ 152.912179, -25.549367 ] ] ], [ [ [ 152.903871, -25.570965 ], [ 152.889168, -25.569880 ], [ 152.898518, -25.560080 ], [ 152.903871, -25.570965 ] ] ], [ [ [ 152.901002, -25.592536 ], [ 152.891518, -25.594610 ], [ 152.888908, -25.579162 ], [ 152.898973, -25.578439 ], [ 152.901002, -25.592536 ] ] ], [ [ [ 151.664085, -24.047172 ], [ 151.660625, -24.052692 ], [ 151.648860, -24.044520 ], [ 151.664085, -24.047172 ] ] ], [ [ [ 151.547662, -24.078401 ], [ 151.536212, -24.082191 ], [ 151.541652, -24.074651 ], [ 151.547662, -24.078401 ] ] ], [ [ [ 151.462018, -24.043970 ], [ 151.459437, -24.056450 ], [ 151.459686, -24.039352 ], [ 151.462018, -24.043970 ] ] ], [ [ [ 151.439928, -24.047055 ], [ 151.436493, -24.054062 ], [ 151.428035, -24.039902 ], [ 151.434802, -24.036193 ], [ 151.434560, -24.046440 ], [ 151.436791, -24.037108 ], [ 151.439928, -24.047055 ] ] ], [ [ [ 151.394220, -23.864592 ], [ 151.389260, -23.875615 ], [ 151.373897, -23.881055 ], [ 151.366349, -23.874802 ], [ 151.362915, -23.859744 ], [ 151.370687, -23.842698 ], [ 151.364155, -23.847460 ], [ 151.360707, -23.824056 ], [ 151.353963, -23.818983 ], [ 151.336418, -23.824672 ], [ 151.339784, -23.806141 ], [ 151.328042, -23.798079 ], [ 151.323601, -23.777510 ], [ 151.332707, -23.768365 ], [ 151.332516, -23.754008 ], [ 151.340820, -23.785146 ], [ 151.373704, -23.812615 ], [ 151.394220, -23.864592 ] ] ], [ [ [ 151.315280, -23.759224 ], [ 151.296673, -23.753960 ], [ 151.290901, -23.759258 ], [ 151.285269, -23.797420 ], [ 151.264781, -23.777910 ], [ 151.276278, -23.764664 ], [ 151.262620, -23.774577 ], [ 151.262505, -23.758800 ], [ 151.274567, -23.752530 ], [ 151.262054, -23.757379 ], [ 151.262094, -23.749114 ], [ 151.252553, -23.756860 ], [ 151.260182, -23.757130 ], [ 151.258900, -23.776659 ], [ 151.245224, -23.779691 ], [ 151.245684, -23.767420 ], [ 151.241960, -23.775067 ], [ 151.245212, -23.794140 ], [ 151.227272, -23.790330 ], [ 151.221974, -23.799438 ], [ 151.214545, -23.794370 ], [ 151.215777, -23.783396 ], [ 151.198446, -23.779682 ], [ 151.172194, -23.745155 ], [ 151.129744, -23.669241 ], [ 151.104231, -23.658133 ], [ 151.103401, -23.649587 ], [ 151.096724, -23.657269 ], [ 151.092083, -23.644795 ], [ 151.047671, -23.622893 ], [ 151.045781, -23.616412 ], [ 151.052181, -23.621582 ], [ 151.053861, -23.615582 ], [ 151.044911, -23.614272 ], [ 151.032541, -23.570402 ], [ 151.012611, -23.553672 ], [ 150.989632, -23.497612 ], [ 150.979467, -23.488793 ], [ 151.013912, -23.473622 ], [ 151.017102, -23.452263 ], [ 151.051631, -23.456172 ], [ 151.047941, -23.452463 ], [ 151.056971, -23.447673 ], [ 151.080941, -23.466642 ], [ 151.071931, -23.473682 ], [ 151.077851, -23.482802 ], [ 151.072741, -23.488362 ], [ 151.084980, -23.487852 ], [ 151.086770, -23.479932 ], [ 151.125690, -23.498932 ], [ 151.123070, -23.490702 ], [ 151.155149, -23.511312 ], [ 151.202419, -23.512072 ], [ 151.199289, -23.520102 ], [ 151.191449, -23.518682 ], [ 151.195519, -23.523402 ], [ 151.182639, -23.520872 ], [ 151.193459, -23.527472 ], [ 151.183689, -23.531252 ], [ 151.193119, -23.530982 ], [ 151.183389, -23.541312 ], [ 151.217398, -23.518422 ], [ 151.218528, -23.503502 ], [ 151.235158, -23.483652 ], [ 151.225618, -23.609492 ], [ 151.248449, -23.656938 ], [ 151.266969, -23.665706 ], [ 151.264228, -23.671256 ], [ 151.272240, -23.662863 ], [ 151.286574, -23.684109 ], [ 151.296245, -23.738597 ], [ 151.315280, -23.759224 ] ] ], [ [ [ 151.288596, -23.805152 ], [ 151.286117, -23.818702 ], [ 151.281871, -23.801427 ], [ 151.288596, -23.805152 ] ] ], [ [ [ 151.162989, -23.396661 ], [ 151.156079, -23.405621 ], [ 151.145019, -23.398901 ], [ 151.162989, -23.396661 ] ] ], [ [ [ 150.994716, -23.181226 ], [ 150.986712, -23.184132 ], [ 150.988037, -23.192356 ], [ 150.977597, -23.183280 ], [ 150.939011, -23.198290 ], [ 150.931780, -23.178545 ], [ 150.934829, -23.168652 ], [ 150.951112, -23.171192 ], [ 150.956240, -23.156287 ], [ 150.975542, -23.148842 ], [ 150.975532, -23.171202 ], [ 150.994716, -23.181226 ] ] ], [ [ [ 150.975637, -23.215244 ], [ 150.964892, -23.215732 ], [ 150.972552, -23.209152 ], [ 150.975637, -23.215244 ] ] ], [ [ [ 150.914408, -23.079684 ], [ 150.913228, -23.087584 ], [ 150.901108, -23.079164 ], [ 150.889409, -23.083164 ], [ 150.884619, -23.077424 ], [ 150.892078, -23.054474 ], [ 150.914408, -23.079684 ] ] ], [ [ [ 150.871819, -23.505923 ], [ 150.864524, -23.517002 ], [ 150.850544, -23.511742 ], [ 150.871819, -23.505923 ] ] ], [ [ [ 150.865299, -23.527853 ], [ 150.846954, -23.532642 ], [ 150.837854, -23.521162 ], [ 150.865299, -23.527853 ] ] ], [ [ [ 150.698291, -21.953413 ], [ 150.691421, -21.953504 ], [ 150.690421, -21.967213 ], [ 150.677381, -21.965404 ], [ 150.686121, -21.945934 ], [ 150.698291, -21.953413 ] ] ], [ [ [ 150.676942, -22.090083 ], [ 150.669862, -22.094403 ], [ 150.669412, -22.082893 ], [ 150.676942, -22.090083 ] ] ], [ [ [ 150.662604, -22.334683 ], [ 150.660625, -22.339523 ], [ 150.656205, -22.330923 ], [ 150.662604, -22.334683 ] ] ], [ [ [ 150.647652, -22.008794 ], [ 150.641792, -22.008334 ], [ 150.644912, -22.001774 ], [ 150.647652, -22.008794 ] ] ], [ [ [ 150.560790, -22.294982 ], [ 150.554526, -22.305104 ], [ 150.544256, -22.299504 ], [ 150.542506, -22.321134 ], [ 150.527506, -22.316634 ], [ 150.529136, -22.324424 ], [ 150.516517, -22.325794 ], [ 150.522997, -22.333504 ], [ 150.510567, -22.340064 ], [ 150.504797, -22.334274 ], [ 150.482958, -22.349334 ], [ 150.475678, -22.335184 ], [ 150.489957, -22.325064 ], [ 150.478482, -22.320653 ], [ 150.500037, -22.303084 ], [ 150.485957, -22.311024 ], [ 150.472637, -22.294924 ], [ 150.463972, -22.301153 ], [ 150.459157, -22.296624 ], [ 150.470567, -22.281264 ], [ 150.482787, -22.278744 ], [ 150.472187, -22.276654 ], [ 150.475472, -22.261113 ], [ 150.500496, -22.269634 ], [ 150.478307, -22.255394 ], [ 150.492306, -22.255474 ], [ 150.486166, -22.243274 ], [ 150.497726, -22.240754 ], [ 150.490056, -22.227524 ], [ 150.474746, -22.232034 ], [ 150.470236, -22.221624 ], [ 150.479211, -22.206573 ], [ 150.518936, -22.224244 ], [ 150.534876, -22.275424 ], [ 150.552550, -22.279932 ], [ 150.560790, -22.294982 ] ] ], [ [ [ 150.528487, -22.373564 ], [ 150.515397, -22.372124 ], [ 150.520907, -22.366524 ], [ 150.528487, -22.373564 ] ] ], [ [ [ 150.500430, -22.546404 ], [ 150.498065, -22.554493 ], [ 150.496965, -22.540503 ], [ 150.500430, -22.546404 ] ] ], [ [ [ 150.465407, -22.247854 ], [ 150.454737, -22.247324 ], [ 150.463372, -22.259213 ], [ 150.443962, -22.274063 ], [ 150.438068, -22.268054 ], [ 150.427463, -22.275733 ], [ 150.429888, -22.288394 ], [ 150.421668, -22.299374 ], [ 150.415543, -22.279583 ], [ 150.442557, -22.254554 ], [ 150.430468, -22.251084 ], [ 150.440702, -22.231533 ], [ 150.464031, -22.225173 ], [ 150.454132, -22.234233 ], [ 150.465407, -22.247854 ] ] ], [ [ [ 150.450148, -22.314584 ], [ 150.449608, -22.321014 ], [ 150.442518, -22.313624 ], [ 150.450148, -22.314584 ] ] ], [ [ [ 150.373931, -22.020774 ], [ 150.369171, -22.024234 ], [ 150.359471, -22.013784 ], [ 150.366871, -22.011364 ], [ 150.373931, -22.020774 ] ] ], [ [ [ 150.364129, -21.720525 ], [ 150.345734, -21.742986 ], [ 150.348159, -21.763955 ], [ 150.338865, -21.769956 ], [ 150.325355, -21.768746 ], [ 150.299780, -21.746385 ], [ 150.313830, -21.739395 ], [ 150.339779, -21.741345 ], [ 150.364129, -21.720525 ] ] ], [ [ [ 150.350514, -21.667046 ], [ 150.339094, -21.668406 ], [ 150.340044, -21.674376 ], [ 150.325844, -21.658617 ], [ 150.338449, -21.656015 ], [ 150.350514, -21.667046 ] ] ], [ [ [ 150.323344, -22.235664 ], [ 150.319740, -22.244885 ], [ 150.303570, -22.249705 ], [ 150.297570, -22.243685 ], [ 150.314164, -22.233104 ], [ 150.323344, -22.235664 ] ] ], [ [ [ 150.301974, -21.664917 ], [ 150.274145, -21.680887 ], [ 150.253435, -21.667817 ], [ 150.243060, -21.675306 ], [ 150.242585, -21.654277 ], [ 150.250415, -21.650997 ], [ 150.247320, -21.619046 ], [ 150.263890, -21.641166 ], [ 150.290874, -21.643787 ], [ 150.301974, -21.664917 ] ] ], [ [ [ 150.282671, -22.351765 ], [ 150.272352, -22.352345 ], [ 150.261852, -22.371075 ], [ 150.259382, -22.363615 ], [ 150.251002, -22.364555 ], [ 150.273131, -22.347165 ], [ 150.282671, -22.351765 ] ] ], [ [ [ 150.280543, -21.483377 ], [ 150.272984, -21.490567 ], [ 150.262894, -21.483637 ], [ 150.266488, -21.476826 ], [ 150.280543, -21.483377 ] ] ], [ [ [ 150.276454, -21.516627 ], [ 150.257514, -21.528507 ], [ 150.245184, -21.517197 ], [ 150.276454, -21.516627 ] ] ], [ [ [ 150.186054, -21.977925 ], [ 150.178019, -21.982756 ], [ 150.180269, -21.998436 ], [ 150.168750, -22.004146 ], [ 150.151544, -21.971365 ], [ 150.159929, -21.977567 ], [ 150.179144, -21.970035 ], [ 150.186054, -21.977925 ] ] ], [ [ [ 150.149904, -21.961135 ], [ 150.142650, -21.960847 ], [ 150.143035, -21.980425 ], [ 150.139894, -21.958436 ], [ 150.149904, -21.961135 ] ] ], [ [ [ 150.139395, -21.998185 ], [ 150.125470, -22.001377 ], [ 150.128085, -21.987656 ], [ 150.139395, -21.998185 ] ] ], [ [ [ 150.120384, -21.918196 ], [ 150.118280, -21.931267 ], [ 150.108305, -21.932066 ], [ 150.108315, -21.922226 ], [ 150.120384, -21.918196 ] ] ], [ [ [ 150.040373, -22.111437 ], [ 150.013514, -22.109927 ], [ 150.020694, -22.126907 ], [ 150.008694, -22.128017 ], [ 149.975295, -22.158827 ], [ 149.945206, -22.172048 ], [ 149.933226, -22.152358 ], [ 149.950645, -22.134258 ], [ 149.970075, -22.134027 ], [ 149.978464, -22.117627 ], [ 149.992244, -22.113497 ], [ 150.001074, -22.122257 ], [ 150.001074, -22.105247 ], [ 150.010469, -22.100986 ], [ 150.040373, -22.111437 ] ] ], [ [ [ 150.019029, -22.620936 ], [ 150.016019, -22.628796 ], [ 150.012739, -22.618846 ], [ 150.019029, -22.620936 ] ] ], [ [ [ 149.931706, -22.187348 ], [ 149.919657, -22.200488 ], [ 149.925351, -22.175176 ], [ 149.931706, -22.187348 ] ] ], [ [ [ 149.929990, -22.133736 ], [ 149.920646, -22.154668 ], [ 149.918597, -22.205008 ], [ 149.909107, -22.223548 ], [ 149.896082, -22.234766 ], [ 149.869738, -22.226308 ], [ 149.865953, -22.219087 ], [ 149.879147, -22.206808 ], [ 149.861842, -22.169687 ], [ 149.871547, -22.146748 ], [ 149.869726, -22.118548 ], [ 149.874366, -22.100698 ], [ 149.883196, -22.099418 ], [ 149.881596, -22.067948 ], [ 149.901375, -22.052068 ], [ 149.910245, -22.058238 ], [ 149.904275, -22.076878 ], [ 149.918786, -22.122748 ], [ 149.929990, -22.133736 ] ] ], [ [ [ 149.917109, -21.506599 ], [ 149.907149, -21.500140 ], [ 149.909249, -21.492560 ], [ 149.917109, -21.506599 ] ] ], [ [ [ 149.915512, -22.235726 ], [ 149.909877, -22.256048 ], [ 149.898632, -22.260256 ], [ 149.904807, -22.234738 ], [ 149.912887, -22.227258 ], [ 149.915512, -22.235726 ] ] ], [ [ [ 149.911386, -21.018141 ], [ 149.897586, -21.020951 ], [ 149.894196, -21.004851 ], [ 149.903786, -21.002861 ], [ 149.911386, -21.018141 ] ] ], [ [ [ 149.909770, -22.474037 ], [ 149.905170, -22.476877 ], [ 149.897945, -22.462916 ], [ 149.909770, -22.474037 ] ] ], [ [ [ 149.900687, -22.235998 ], [ 149.894552, -22.244246 ], [ 149.888822, -22.237956 ], [ 149.900687, -22.235998 ] ] ], [ [ [ 149.896530, -21.497860 ], [ 149.888105, -21.499388 ], [ 149.891104, -21.485268 ], [ 149.896530, -21.497860 ] ] ], [ [ [ 149.894853, -22.256316 ], [ 149.884703, -22.263246 ], [ 149.877633, -22.255037 ], [ 149.894853, -22.256316 ] ] ], [ [ [ 149.892748, -22.247988 ], [ 149.877008, -22.251448 ], [ 149.874518, -22.238138 ], [ 149.884572, -22.235717 ], [ 149.892748, -22.247988 ] ] ], [ [ [ 149.880610, -21.993587 ], [ 149.861750, -22.013057 ], [ 149.844036, -22.004219 ], [ 149.880610, -21.993587 ] ] ], [ [ [ 149.842112, -21.659429 ], [ 149.833932, -21.662210 ], [ 149.831507, -21.647438 ], [ 149.842112, -21.659429 ] ] ], [ [ [ 149.837414, -21.379099 ], [ 149.833235, -21.383199 ], [ 149.821925, -21.371669 ], [ 149.837414, -21.379099 ] ] ], [ [ [ 149.818927, -21.605799 ], [ 149.791507, -21.616409 ], [ 149.788652, -21.609220 ], [ 149.780737, -21.612649 ], [ 149.784962, -21.600560 ], [ 149.805862, -21.590910 ], [ 149.818927, -21.605799 ] ] ], [ [ [ 149.804274, -21.832029 ], [ 149.793214, -21.839349 ], [ 149.793499, -21.830308 ], [ 149.804274, -21.832029 ] ] ], [ [ [ 149.763432, -22.405678 ], [ 149.753502, -22.411808 ], [ 149.755527, -22.400847 ], [ 149.763432, -22.405678 ] ] ], [ [ [ 149.717587, -21.455980 ], [ 149.706187, -21.448060 ], [ 149.709967, -21.438990 ], [ 149.717587, -21.455980 ] ] ], [ [ [ 149.694666, -21.323900 ], [ 149.685572, -21.332441 ], [ 149.663957, -21.310590 ], [ 149.666177, -21.302440 ], [ 149.690581, -21.312211 ], [ 149.694666, -21.323900 ] ] ], [ [ [ 149.664699, -21.974970 ], [ 149.664029, -21.981860 ], [ 149.657829, -21.978400 ], [ 149.654943, -21.966109 ], [ 149.664699, -21.974970 ] ] ], [ [ [ 149.653888, -21.928900 ], [ 149.651308, -21.936480 ], [ 149.642548, -21.931920 ], [ 149.653888, -21.928900 ] ] ], [ [ [ 149.626443, -20.770392 ], [ 149.612939, -20.778103 ], [ 149.622148, -20.760803 ], [ 149.626443, -20.770392 ] ] ], [ [ [ 149.626129, -20.868733 ], [ 149.617274, -20.884202 ], [ 149.606434, -20.879402 ], [ 149.596730, -20.885163 ], [ 149.578110, -20.869193 ], [ 149.584695, -20.861222 ], [ 149.605700, -20.864983 ], [ 149.603464, -20.846492 ], [ 149.623224, -20.856302 ], [ 149.626129, -20.868733 ] ] ], [ [ [ 149.588542, -22.138270 ], [ 149.572642, -22.124980 ], [ 149.577227, -22.119209 ], [ 149.588542, -22.138270 ] ] ], [ [ [ 149.582530, -21.974440 ], [ 149.566220, -21.992050 ], [ 149.558565, -21.987569 ], [ 149.576795, -21.967929 ], [ 149.582530, -21.974440 ] ] ], [ [ [ 149.500380, -21.829431 ], [ 149.486900, -21.836521 ], [ 149.469020, -21.821731 ], [ 149.485795, -21.817890 ], [ 149.500380, -21.829431 ] ] ], [ [ [ 149.498568, -21.597772 ], [ 149.493318, -21.605032 ], [ 149.485418, -21.597402 ], [ 149.498568, -21.597772 ] ] ], [ [ [ 149.483695, -20.741003 ], [ 149.472275, -20.747213 ], [ 149.466275, -20.726713 ], [ 149.483695, -20.741003 ] ] ], [ [ [ 149.469552, -20.928214 ], [ 149.466927, -20.937362 ], [ 149.464232, -20.925944 ], [ 149.469552, -20.928214 ] ] ], [ [ [ 149.460697, -20.914972 ], [ 149.451302, -20.934264 ], [ 149.447002, -20.930074 ], [ 149.441893, -20.941254 ], [ 149.432608, -20.937133 ], [ 149.426493, -20.945544 ], [ 149.422453, -20.939184 ], [ 149.435058, -20.927893 ], [ 149.427638, -20.926733 ], [ 149.425488, -20.906803 ], [ 149.446757, -20.902893 ], [ 149.460697, -20.914972 ] ] ], [ [ [ 149.422713, -20.919684 ], [ 149.418983, -20.926774 ], [ 149.414143, -20.918624 ], [ 149.405488, -20.924243 ], [ 149.385858, -20.904113 ], [ 149.414178, -20.896853 ], [ 149.422713, -20.919684 ] ] ], [ [ [ 149.412301, -20.772914 ], [ 149.397802, -20.779164 ], [ 149.390066, -20.769333 ], [ 149.412301, -20.772914 ] ] ], [ [ [ 149.300993, -20.796835 ], [ 149.276558, -20.793444 ], [ 149.273648, -20.778404 ], [ 149.291153, -20.774485 ], [ 149.300993, -20.796835 ] ] ], [ [ [ 149.289968, -20.809974 ], [ 149.286084, -20.820335 ], [ 149.279784, -20.810395 ], [ 149.264904, -20.823325 ], [ 149.268254, -20.810095 ], [ 149.249279, -20.805914 ], [ 149.274388, -20.796364 ], [ 149.289968, -20.809974 ] ] ], [ [ [ 149.209084, -20.690576 ], [ 149.203544, -20.698776 ], [ 149.197274, -20.689826 ], [ 149.209084, -20.690576 ] ] ], [ [ [ 149.193939, -20.671615 ], [ 149.186794, -20.675596 ], [ 149.189194, -20.689206 ], [ 149.172544, -20.672256 ], [ 149.181574, -20.666186 ], [ 149.193939, -20.671615 ] ] ], [ [ [ 149.178166, -20.247617 ], [ 149.171886, -20.250407 ], [ 149.173006, -20.241187 ], [ 149.178166, -20.247617 ] ] ], [ [ [ 149.166659, -20.683335 ], [ 149.156454, -20.674447 ], [ 149.158119, -20.683265 ], [ 149.145790, -20.693805 ], [ 149.138505, -20.694717 ], [ 149.136085, -20.686447 ], [ 149.148255, -20.684937 ], [ 149.145509, -20.673485 ], [ 149.154749, -20.662175 ], [ 149.163614, -20.665237 ], [ 149.166659, -20.683335 ] ] ], [ [ [ 149.157156, -20.237227 ], [ 149.154846, -20.243217 ], [ 149.150576, -20.238927 ], [ 149.157156, -20.237227 ] ] ], [ [ [ 149.132848, -20.467096 ], [ 149.132283, -20.482017 ], [ 149.120703, -20.469427 ], [ 149.132848, -20.467096 ] ] ], [ [ [ 149.126855, -20.348028 ], [ 149.124097, -20.357030 ], [ 149.117759, -20.355752 ], [ 149.118181, -20.343800 ], [ 149.126855, -20.348028 ] ] ], [ [ [ 149.124987, -20.271127 ], [ 149.119157, -20.271557 ], [ 149.123377, -20.264907 ], [ 149.124987, -20.271127 ] ] ], [ [ [ 149.124414, -20.543977 ], [ 149.118354, -20.542247 ], [ 149.114959, -20.552936 ], [ 149.095989, -20.547206 ], [ 149.112639, -20.537796 ], [ 149.124414, -20.543977 ] ] ], [ [ [ 149.111722, -20.274368 ], [ 149.111042, -20.287828 ], [ 149.104912, -20.266228 ], [ 149.111722, -20.274368 ] ] ], [ [ [ 149.104678, -20.481176 ], [ 149.095279, -20.480566 ], [ 149.098289, -20.490736 ], [ 149.082009, -20.484337 ], [ 149.066939, -20.525967 ], [ 149.065174, -20.516248 ], [ 149.043585, -20.522198 ], [ 149.046830, -20.513387 ], [ 149.036720, -20.503027 ], [ 149.049950, -20.509647 ], [ 149.065369, -20.502147 ], [ 149.068674, -20.477368 ], [ 149.075639, -20.481527 ], [ 149.074269, -20.464827 ], [ 149.082334, -20.459778 ], [ 149.074279, -20.451827 ], [ 149.080398, -20.436397 ], [ 149.089288, -20.448847 ], [ 149.084249, -20.459287 ], [ 149.104678, -20.481176 ] ] ], [ [ [ 149.103562, -20.250888 ], [ 149.101762, -20.266448 ], [ 149.088262, -20.280968 ], [ 149.093412, -20.300868 ], [ 149.084942, -20.304488 ], [ 149.085482, -20.294728 ], [ 149.075233, -20.301178 ], [ 149.077132, -20.293298 ], [ 149.070243, -20.293108 ], [ 149.075582, -20.270188 ], [ 149.089492, -20.265148 ], [ 149.094352, -20.270868 ], [ 149.103562, -20.250888 ] ] ], [ [ [ 149.089709, -20.522086 ], [ 149.080839, -20.525626 ], [ 149.079169, -20.515797 ], [ 149.089709, -20.522086 ] ] ], [ [ [ 149.089090, -20.660006 ], [ 149.066665, -20.641137 ], [ 149.055225, -20.618427 ], [ 149.089090, -20.660006 ] ] ], [ [ [ 149.074593, -20.303888 ], [ 149.070078, -20.309447 ], [ 149.065883, -20.303818 ], [ 149.074593, -20.303888 ] ] ], [ [ [ 149.064619, -20.453027 ], [ 149.052794, -20.450558 ], [ 149.034049, -20.460247 ], [ 149.024314, -20.441408 ], [ 149.036719, -20.430407 ], [ 149.040079, -20.438137 ], [ 149.052999, -20.436267 ], [ 149.064619, -20.453027 ] ] ], [ [ [ 149.062018, -20.293457 ], [ 149.046818, -20.309537 ], [ 149.043363, -20.302179 ], [ 149.034643, -20.308699 ], [ 149.032913, -20.300499 ], [ 149.022073, -20.321399 ], [ 148.990261, -20.300760 ], [ 148.978533, -20.313661 ], [ 148.986585, -20.322515 ], [ 148.963191, -20.328759 ], [ 148.962392, -20.303594 ], [ 148.949900, -20.303021 ], [ 148.974867, -20.268843 ], [ 148.968451, -20.265306 ], [ 148.966294, -20.280216 ], [ 148.959159, -20.287995 ], [ 148.957395, -20.280696 ], [ 148.937560, -20.307124 ], [ 148.932188, -20.294449 ], [ 148.923039, -20.295794 ], [ 148.928952, -20.286217 ], [ 148.912699, -20.290958 ], [ 148.912940, -20.281900 ], [ 148.927148, -20.281475 ], [ 148.936299, -20.263722 ], [ 148.942787, -20.268185 ], [ 148.962034, -20.244859 ], [ 148.954794, -20.239519 ], [ 148.958474, -20.227639 ], [ 148.942114, -20.243359 ], [ 148.937944, -20.239610 ], [ 148.939884, -20.225860 ], [ 148.952054, -20.219399 ], [ 148.960263, -20.187339 ], [ 148.955973, -20.158030 ], [ 148.978318, -20.161928 ], [ 148.973203, -20.174369 ], [ 148.983768, -20.185078 ], [ 148.976173, -20.205229 ], [ 148.996058, -20.203178 ], [ 148.991628, -20.250372 ], [ 149.010783, -20.232919 ], [ 149.004478, -20.255478 ], [ 149.025938, -20.234908 ], [ 149.014993, -20.269729 ], [ 149.025338, -20.255418 ], [ 149.040648, -20.284588 ], [ 149.062018, -20.293457 ] ] ], [ [ [ 149.044232, -20.155939 ], [ 149.036602, -20.164879 ], [ 149.038652, -20.182929 ], [ 149.020662, -20.160819 ], [ 149.036332, -20.159379 ], [ 149.038132, -20.150229 ], [ 149.044232, -20.155939 ] ] ], [ [ [ 149.036284, -20.397008 ], [ 149.034079, -20.403797 ], [ 149.023064, -20.397438 ], [ 149.036284, -20.397008 ] ] ], [ [ [ 148.996016, -20.352742 ], [ 148.989086, -20.356558 ], [ 148.990664, -20.349645 ], [ 148.996016, -20.352742 ] ] ], [ [ [ 148.982644, -20.351870 ], [ 148.977171, -20.364386 ], [ 148.965653, -20.366564 ], [ 148.967053, -20.352980 ], [ 148.956302, -20.361372 ], [ 148.952834, -20.377405 ], [ 148.948581, -20.368537 ], [ 148.955269, -20.356846 ], [ 148.944880, -20.364437 ], [ 148.946392, -20.332614 ], [ 148.958925, -20.347499 ], [ 148.976357, -20.344230 ], [ 148.982644, -20.351870 ] ] ], [ [ [ 148.967942, -20.067660 ], [ 148.948543, -20.083500 ], [ 148.949993, -20.092520 ], [ 148.959293, -20.094590 ], [ 148.957333, -20.106260 ], [ 148.945423, -20.093750 ], [ 148.937013, -20.101700 ], [ 148.951263, -20.156550 ], [ 148.931544, -20.178260 ], [ 148.930024, -20.132760 ], [ 148.915044, -20.174200 ], [ 148.902224, -20.166120 ], [ 148.915574, -20.123430 ], [ 148.887624, -20.169160 ], [ 148.881699, -20.161629 ], [ 148.884284, -20.122680 ], [ 148.889319, -20.111419 ], [ 148.904124, -20.109910 ], [ 148.911564, -20.100440 ], [ 148.911883, -20.088060 ], [ 148.902224, -20.079580 ], [ 148.906818, -20.071299 ], [ 148.922663, -20.062110 ], [ 148.926433, -20.081670 ], [ 148.926713, -20.073270 ], [ 148.942668, -20.063779 ], [ 148.959347, -20.059799 ], [ 148.967942, -20.067660 ] ] ], [ [ [ 148.941687, -20.376094 ], [ 148.928113, -20.369498 ], [ 148.927809, -20.337306 ], [ 148.935578, -20.339826 ], [ 148.941687, -20.376094 ] ] ], [ [ [ 148.929134, -20.318732 ], [ 148.927129, -20.325538 ], [ 148.923918, -20.311178 ], [ 148.929134, -20.318732 ] ] ], [ [ [ 148.927724, -20.852097 ], [ 148.917864, -20.854737 ], [ 148.917764, -20.847327 ], [ 148.927724, -20.852097 ] ] ], [ [ [ 148.924298, -20.255996 ], [ 148.921284, -20.271186 ], [ 148.908498, -20.274167 ], [ 148.909994, -20.257550 ], [ 148.924298, -20.255996 ] ] ], [ [ [ 148.915139, -20.852698 ], [ 148.897579, -20.854978 ], [ 148.891499, -20.829298 ], [ 148.902424, -20.826817 ], [ 148.915139, -20.852698 ] ] ], [ [ [ 148.898053, -20.050450 ], [ 148.894654, -20.062590 ], [ 148.881000, -20.061911 ], [ 148.880974, -20.037000 ], [ 148.898053, -20.050450 ] ] ], [ [ [ 148.882793, -20.601334 ], [ 148.876062, -20.599328 ], [ 148.878675, -20.590579 ], [ 148.882793, -20.601334 ] ] ], [ [ [ 148.875858, -20.613492 ], [ 148.866008, -20.619010 ], [ 148.864236, -20.607159 ], [ 148.875858, -20.613492 ] ] ], [ [ [ 148.875368, -20.385240 ], [ 148.875253, -20.394064 ], [ 148.866487, -20.396576 ], [ 148.851674, -20.381613 ], [ 148.844541, -20.335626 ], [ 148.853481, -20.316017 ], [ 148.850643, -20.347399 ], [ 148.875368, -20.385240 ] ] ], [ [ [ 148.850490, -20.261236 ], [ 148.839770, -20.280417 ], [ 148.826745, -20.285208 ], [ 148.830208, -20.255839 ], [ 148.850490, -20.261236 ] ] ], [ [ [ 148.829856, -20.235810 ], [ 148.829826, -20.241230 ], [ 148.822706, -20.238230 ], [ 148.810081, -20.214139 ], [ 148.829856, -20.235810 ] ] ], [ [ [ 148.614098, -20.148852 ], [ 148.600258, -20.152502 ], [ 148.607568, -20.137532 ], [ 148.614098, -20.148852 ] ] ], [ [ [ 148.576033, -20.101301 ], [ 148.569743, -20.103801 ], [ 148.570723, -20.096471 ], [ 148.576033, -20.101301 ] ] ], [ [ [ 148.478544, -20.001782 ], [ 148.474689, -20.049703 ], [ 148.457315, -20.051822 ], [ 148.444535, -20.044432 ], [ 148.438000, -20.021094 ], [ 148.445214, -19.973952 ], [ 148.457744, -19.974672 ], [ 148.467394, -19.995912 ], [ 148.478544, -20.001782 ] ] ], [ [ [ 148.294237, -20.031863 ], [ 148.286087, -20.040683 ], [ 148.277657, -20.038033 ], [ 148.282627, -20.026973 ], [ 148.284787, -20.033643 ], [ 148.294237, -20.031863 ] ] ], [ [ [ 146.883736, -19.113600 ], [ 146.872826, -19.153078 ], [ 146.850816, -19.160137 ], [ 146.846112, -19.181760 ], [ 146.804245, -19.161279 ], [ 146.779033, -19.129171 ], [ 146.789986, -19.115137 ], [ 146.815500, -19.117516 ], [ 146.832454, -19.104830 ], [ 146.849446, -19.117944 ], [ 146.864249, -19.115523 ], [ 146.862175, -19.102522 ], [ 146.883736, -19.113600 ] ] ], [ [ [ 146.693728, -18.755685 ], [ 146.693758, -18.761905 ], [ 146.687918, -18.757185 ], [ 146.647918, -18.776445 ], [ 146.632788, -18.762605 ], [ 146.616789, -18.764925 ], [ 146.609879, -18.757955 ], [ 146.587109, -18.758495 ], [ 146.579689, -18.770715 ], [ 146.568499, -18.762966 ], [ 146.566909, -18.750546 ], [ 146.576989, -18.749946 ], [ 146.578326, -18.725158 ], [ 146.589049, -18.712046 ], [ 146.572429, -18.677646 ], [ 146.594969, -18.682536 ], [ 146.597889, -18.698226 ], [ 146.619628, -18.707746 ], [ 146.641868, -18.749695 ], [ 146.685337, -18.738215 ], [ 146.693728, -18.755685 ] ] ], [ [ [ 146.643071, -19.031949 ], [ 146.629061, -19.033123 ], [ 146.633503, -19.022390 ], [ 146.643071, -19.031949 ] ] ], [ [ [ 146.621541, -19.031736 ], [ 146.598030, -19.035242 ], [ 146.614807, -19.025230 ], [ 146.621541, -19.031736 ] ] ], [ [ [ 146.567539, -18.670886 ], [ 146.556349, -18.687876 ], [ 146.538559, -18.658106 ], [ 146.547909, -18.652196 ], [ 146.567539, -18.670886 ] ] ], [ [ [ 146.551020, -18.842345 ], [ 146.548550, -18.848685 ], [ 146.532130, -18.835185 ], [ 146.551020, -18.842345 ] ] ], [ [ [ 146.526880, -18.672386 ], [ 146.519810, -18.714776 ], [ 146.508610, -18.700016 ], [ 146.518510, -18.684276 ], [ 146.505850, -18.659806 ], [ 146.520559, -18.660766 ], [ 146.526880, -18.672386 ] ] ], [ [ [ 146.508094, -18.622835 ], [ 146.503350, -18.656076 ], [ 146.489405, -18.667525 ], [ 146.486975, -18.650135 ], [ 146.500069, -18.633606 ], [ 146.483639, -18.614446 ], [ 146.494729, -18.598936 ], [ 146.481289, -18.585416 ], [ 146.484314, -18.567436 ], [ 146.497164, -18.581735 ], [ 146.508094, -18.622835 ] ] ], [ [ [ 146.505109, -18.554046 ], [ 146.500409, -18.563326 ], [ 146.489009, -18.557826 ], [ 146.490599, -18.539177 ], [ 146.502228, -18.543096 ], [ 146.505109, -18.554046 ] ] ], [ [ [ 146.237398, -18.282148 ], [ 146.230510, -18.272299 ], [ 146.232619, -18.265509 ], [ 146.244209, -18.266169 ], [ 146.232479, -18.257489 ], [ 146.227819, -18.234449 ], [ 146.216459, -18.227359 ], [ 146.224469, -18.213669 ], [ 146.223009, -18.194580 ], [ 146.231169, -18.197159 ], [ 146.231689, -18.219529 ], [ 146.250529, -18.237119 ], [ 146.274539, -18.239889 ], [ 146.298758, -18.231479 ], [ 146.305528, -18.241969 ], [ 146.285969, -18.271729 ], [ 146.275559, -18.317509 ], [ 146.290009, -18.325618 ], [ 146.306059, -18.355748 ], [ 146.318119, -18.351988 ], [ 146.331399, -18.362348 ], [ 146.339609, -18.380748 ], [ 146.334419, -18.386298 ], [ 146.327309, -18.381458 ], [ 146.324160, -18.400218 ], [ 146.358419, -18.418328 ], [ 146.336320, -18.432278 ], [ 146.323921, -18.486427 ], [ 146.301201, -18.494057 ], [ 146.289691, -18.487417 ], [ 146.247902, -18.488858 ], [ 146.224192, -18.478958 ], [ 146.200902, -18.437418 ], [ 146.206982, -18.397758 ], [ 146.191301, -18.366709 ], [ 146.151691, -18.312989 ], [ 146.101022, -18.285950 ], [ 146.070812, -18.246670 ], [ 146.103791, -18.234430 ], [ 146.127081, -18.234620 ], [ 146.196340, -18.277899 ], [ 146.247000, -18.295879 ], [ 146.237973, -18.282971 ], [ 146.239780, -18.293069 ], [ 146.225640, -18.277299 ], [ 146.237398, -18.282148 ] ] ], [ [ [ 146.287188, -18.142350 ], [ 146.277138, -18.138760 ], [ 146.282088, -18.135130 ], [ 146.287188, -18.142350 ] ] ], [ [ [ 146.208762, -18.460688 ], [ 146.206062, -18.471768 ], [ 146.189963, -18.470778 ], [ 146.192782, -18.459698 ], [ 146.208762, -18.460688 ] ] ], [ [ [ 146.179222, -18.396718 ], [ 146.178302, -18.373169 ], [ 146.193842, -18.395858 ], [ 146.195662, -18.418338 ], [ 146.192602, -18.429418 ], [ 146.180032, -18.417458 ], [ 146.179950, -18.415342 ], [ 146.172582, -18.420298 ], [ 146.167942, -18.407988 ], [ 146.179842, -18.412587 ], [ 146.179589, -18.406121 ], [ 146.178722, -18.409668 ], [ 146.167232, -18.404718 ], [ 146.145022, -18.358089 ], [ 146.163362, -18.368999 ], [ 146.171062, -18.365619 ], [ 146.179222, -18.396718 ] ] ], [ [ [ 146.192099, -18.166390 ], [ 146.176050, -18.180990 ], [ 146.152400, -18.175380 ], [ 146.160520, -18.152200 ], [ 146.171980, -18.151170 ], [ 146.192099, -18.166390 ] ] ], [ [ [ 146.187042, -18.430448 ], [ 146.177702, -18.434408 ], [ 146.182302, -18.426268 ], [ 146.187042, -18.430448 ] ] ], [ [ [ 146.180752, -18.419718 ], [ 146.176392, -18.432378 ], [ 146.170572, -18.423468 ], [ 146.180752, -18.419718 ] ] ], [ [ [ 146.178178, -17.966971 ], [ 146.134149, -17.935401 ], [ 146.151528, -17.927661 ], [ 146.173178, -17.945931 ], [ 146.178178, -17.966971 ] ] ], [ [ [ 146.016754, -17.155424 ], [ 146.011805, -17.165024 ], [ 146.004885, -17.154394 ], [ 146.016754, -17.155424 ] ] ], [ [ [ 146.005128, -16.924182 ], [ 146.000307, -16.936674 ], [ 145.985538, -16.942179 ], [ 145.990790, -16.925325 ], [ 146.005128, -16.924182 ] ] ], [ [ [ 145.477366, -14.670246 ], [ 145.467406, -14.679976 ], [ 145.470666, -14.685506 ], [ 145.448257, -14.680236 ], [ 145.444866, -14.667366 ], [ 145.455786, -14.672086 ], [ 145.450626, -14.647026 ], [ 145.467116, -14.654336 ], [ 145.477366, -14.670246 ] ] ], [ [ [ 144.989702, -14.502708 ], [ 144.978802, -14.511518 ], [ 144.950633, -14.499318 ], [ 144.978692, -14.492998 ], [ 144.989702, -14.502708 ] ] ], [ [ [ 144.817504, -14.431719 ], [ 144.810894, -14.437809 ], [ 144.804174, -14.432829 ], [ 144.815534, -14.425169 ], [ 144.817504, -14.431719 ] ] ], [ [ [ 144.532854, -14.118902 ], [ 144.531924, -14.124552 ], [ 144.525444, -14.120252 ], [ 144.525464, -14.112122 ], [ 144.532854, -14.118902 ] ] ], [ [ [ 144.338099, -14.095325 ], [ 144.335647, -14.102323 ], [ 144.326277, -14.102303 ], [ 144.327687, -14.095183 ], [ 144.338099, -14.095325 ] ] ], [ [ [ 144.338124, -14.095252 ], [ 144.328497, -14.093843 ], [ 144.331877, -14.085953 ], [ 144.340426, -14.088683 ], [ 144.338124, -14.095252 ] ] ], [ [ [ 144.283659, -14.194862 ], [ 144.240279, -14.191333 ], [ 144.232459, -14.175403 ], [ 144.251439, -14.175913 ], [ 144.250329, -14.160443 ], [ 144.272898, -14.158703 ], [ 144.283659, -14.194862 ] ] ], [ [ [ 144.278709, -14.226112 ], [ 144.269759, -14.238612 ], [ 144.245390, -14.221042 ], [ 144.266099, -14.225052 ], [ 144.276419, -14.216622 ], [ 144.278709, -14.226112 ] ] ], [ [ [ 144.268188, -14.148073 ], [ 144.245039, -14.151733 ], [ 144.209520, -14.184813 ], [ 144.228599, -14.154733 ], [ 144.231219, -14.132833 ], [ 144.237239, -14.129703 ], [ 144.243449, -14.142923 ], [ 144.268188, -14.148073 ] ] ], [ [ [ 144.231310, -14.209942 ], [ 144.202540, -14.230392 ], [ 144.222410, -14.206292 ], [ 144.231310, -14.209942 ] ] ], [ [ [ 144.063809, -9.912760 ], [ 144.057899, -9.923740 ], [ 144.039199, -9.923150 ], [ 144.051549, -9.908430 ], [ 144.063809, -9.912760 ] ] ], [ [ [ 143.784510, -9.577153 ], [ 143.775831, -9.598423 ], [ 143.760011, -9.597023 ], [ 143.759251, -9.580523 ], [ 143.772461, -9.580473 ], [ 143.777661, -9.570963 ], [ 143.784510, -9.577153 ] ] ], [ [ [ 143.779395, -14.221694 ], [ 143.772635, -14.220164 ], [ 143.775035, -14.214054 ], [ 143.779395, -14.221694 ] ] ], [ [ [ 143.721987, -13.866067 ], [ 143.717843, -13.870137 ], [ 143.715161, -13.862125 ], [ 143.721987, -13.866067 ] ] ], [ [ [ 143.501861, -12.526884 ], [ 143.475112, -12.521365 ], [ 143.454362, -12.504375 ], [ 143.475222, -12.520465 ], [ 143.501861, -12.526884 ] ] ], [ [ [ 143.422975, -9.750263 ], [ 143.398315, -9.754583 ], [ 143.404565, -9.748233 ], [ 143.422975, -9.750263 ] ] ], [ [ [ 143.415166, -12.289466 ], [ 143.403683, -12.287791 ], [ 143.413206, -12.284046 ], [ 143.415166, -12.289466 ] ] ], [ [ [ 143.401295, -12.868873 ], [ 143.392476, -12.875953 ], [ 143.389006, -12.868853 ], [ 143.401295, -12.868873 ] ] ], [ [ [ 143.400826, -12.895923 ], [ 143.393566, -12.894363 ], [ 143.394896, -12.876513 ], [ 143.400826, -12.895923 ] ] ], [ [ [ 143.390646, -12.878563 ], [ 143.383976, -12.883323 ], [ 143.379126, -12.876673 ], [ 143.390646, -12.878563 ] ] ], [ [ [ 143.388316, -12.869873 ], [ 143.376686, -12.870463 ], [ 143.385076, -12.864793 ], [ 143.388316, -12.869873 ] ] ], [ [ [ 143.378456, -12.886273 ], [ 143.374456, -12.895763 ], [ 143.358766, -12.887003 ], [ 143.378456, -12.886273 ] ] ], [ [ [ 143.275986, -11.985288 ], [ 143.267332, -11.989577 ], [ 143.262231, -11.975052 ], [ 143.275986, -11.985288 ] ] ], [ [ [ 142.977396, -9.804980 ], [ 142.971796, -9.805440 ], [ 142.975476, -9.795090 ], [ 142.977396, -9.804980 ] ] ], [ [ [ 142.948447, -9.853910 ], [ 142.912558, -9.866849 ], [ 142.897758, -9.853439 ], [ 142.900448, -9.846079 ], [ 142.917257, -9.842999 ], [ 142.948447, -9.853910 ] ] ], [ [ [ 142.867649, -10.039029 ], [ 142.857599, -10.053148 ], [ 142.826040, -10.024858 ], [ 142.832880, -10.018308 ], [ 142.857289, -10.019578 ], [ 142.867649, -10.039029 ] ] ], [ [ [ 142.800857, -9.375672 ], [ 142.794837, -9.389352 ], [ 142.754198, -9.400472 ], [ 142.743739, -9.419021 ], [ 142.707250, -9.428321 ], [ 142.651571, -9.427961 ], [ 142.609372, -9.414711 ], [ 142.596612, -9.403411 ], [ 142.603782, -9.383171 ], [ 142.646921, -9.364721 ], [ 142.707499, -9.381752 ], [ 142.743128, -9.366912 ], [ 142.800857, -9.375672 ] ] ], [ [ [ 142.783441, -9.904118 ], [ 142.768611, -9.904698 ], [ 142.764381, -9.894078 ], [ 142.781371, -9.895868 ], [ 142.783441, -9.904118 ] ] ], [ [ [ 142.725479, -9.368282 ], [ 142.698850, -9.377342 ], [ 142.667300, -9.369791 ], [ 142.688930, -9.358252 ], [ 142.725479, -9.368282 ] ] ], [ [ [ 142.705703, -10.953042 ], [ 142.692314, -10.958571 ], [ 142.686954, -10.936972 ], [ 142.666714, -10.936282 ], [ 142.651164, -10.923612 ], [ 142.651864, -10.914792 ], [ 142.690173, -10.920132 ], [ 142.705703, -10.953042 ] ] ], [ [ [ 142.666442, -10.629033 ], [ 142.654073, -10.651403 ], [ 142.638413, -10.653193 ], [ 142.650883, -10.638623 ], [ 142.632273, -10.627073 ], [ 142.639373, -10.618263 ], [ 142.666442, -10.629033 ] ] ], [ [ [ 142.649234, -9.764488 ], [ 142.647984, -9.772568 ], [ 142.621995, -9.772588 ], [ 142.628365, -9.757778 ], [ 142.649234, -9.764488 ] ] ], [ [ [ 142.639044, -10.920432 ], [ 142.635264, -10.926992 ], [ 142.620744, -10.918722 ], [ 142.634024, -10.914212 ], [ 142.639044, -10.920432 ] ] ], [ [ [ 142.627853, -10.598243 ], [ 142.615163, -10.600713 ], [ 142.609233, -10.592683 ], [ 142.619973, -10.589754 ], [ 142.627853, -10.598243 ] ] ], [ [ [ 142.622543, -10.743163 ], [ 142.611903, -10.745413 ], [ 142.584394, -10.714403 ], [ 142.595253, -10.712833 ], [ 142.608843, -10.726303 ], [ 142.615023, -10.720883 ], [ 142.615453, -10.738183 ], [ 142.622543, -10.743163 ] ] ], [ [ [ 142.551753, -9.419591 ], [ 142.531603, -9.435991 ], [ 142.528863, -9.410781 ], [ 142.551753, -9.419591 ] ] ], [ [ [ 142.517682, -10.192006 ], [ 142.513112, -10.195276 ], [ 142.504112, -10.183846 ], [ 142.517682, -10.192006 ] ] ], [ [ [ 142.514652, -10.158086 ], [ 142.508252, -10.163276 ], [ 142.502222, -10.157276 ], [ 142.514652, -10.158086 ] ] ], [ [ [ 142.490332, -10.243286 ], [ 142.480023, -10.260396 ], [ 142.474043, -10.250256 ], [ 142.490332, -10.243286 ] ] ], [ [ [ 142.410957, -10.711573 ], [ 142.385637, -10.750123 ], [ 142.393437, -10.730423 ], [ 142.389727, -10.717993 ], [ 142.396547, -10.709253 ], [ 142.410957, -10.711573 ] ] ], [ [ [ 142.344168, -10.172237 ], [ 142.331609, -10.199197 ], [ 142.278669, -10.259777 ], [ 142.241128, -10.234258 ], [ 142.226388, -10.230358 ], [ 142.218088, -10.238878 ], [ 142.183887, -10.189480 ], [ 142.205827, -10.166549 ], [ 142.210747, -10.170829 ], [ 142.206037, -10.161699 ], [ 142.219837, -10.128859 ], [ 142.236927, -10.121329 ], [ 142.253827, -10.125449 ], [ 142.265887, -10.115789 ], [ 142.288637, -10.127798 ], [ 142.300147, -10.124018 ], [ 142.312078, -10.138558 ], [ 142.325528, -10.135108 ], [ 142.330418, -10.158157 ], [ 142.344168, -10.172237 ] ] ], [ [ [ 142.326393, -10.611193 ], [ 142.302723, -10.634243 ], [ 142.267664, -10.642303 ], [ 142.236094, -10.607263 ], [ 142.243174, -10.606453 ], [ 142.240974, -10.597863 ], [ 142.257124, -10.579483 ], [ 142.306333, -10.570583 ], [ 142.326393, -10.611193 ] ] ], [ [ [ 142.321023, -10.531173 ], [ 142.315813, -10.541373 ], [ 142.300273, -10.542343 ], [ 142.284103, -10.527934 ], [ 142.304293, -10.520614 ], [ 142.312232, -10.505544 ], [ 142.321023, -10.531173 ] ] ], [ [ [ 142.319433, -9.567913 ], [ 142.306693, -9.574293 ], [ 142.283773, -9.569863 ], [ 142.258312, -9.553914 ], [ 142.290603, -9.551303 ], [ 142.319433, -9.567913 ] ] ], [ [ [ 142.304918, -10.721873 ], [ 142.290218, -10.733913 ], [ 142.281688, -10.716313 ], [ 142.295108, -10.701673 ], [ 142.304918, -10.721873 ] ] ], [ [ [ 142.294921, -9.262735 ], [ 142.284021, -9.284645 ], [ 142.245401, -9.290786 ], [ 142.160671, -9.281257 ], [ 142.131871, -9.264447 ], [ 142.222421, -9.229597 ], [ 142.242551, -9.258916 ], [ 142.266541, -9.250686 ], [ 142.294921, -9.262735 ] ] ], [ [ [ 142.277423, -10.706483 ], [ 142.264814, -10.727223 ], [ 142.255044, -10.713813 ], [ 142.242914, -10.711143 ], [ 142.245694, -10.720063 ], [ 142.230224, -10.739463 ], [ 142.227404, -10.720703 ], [ 142.206854, -10.726433 ], [ 142.195723, -10.746274 ], [ 142.187943, -10.746184 ], [ 142.186313, -10.765974 ], [ 142.177863, -10.770874 ], [ 142.158273, -10.761334 ], [ 142.150053, -10.764874 ], [ 142.138633, -10.737094 ], [ 142.112843, -10.719665 ], [ 142.119103, -10.710815 ], [ 142.109633, -10.685085 ], [ 142.119713, -10.690575 ], [ 142.110464, -10.661784 ], [ 142.122544, -10.652124 ], [ 142.121934, -10.642974 ], [ 142.139994, -10.642574 ], [ 142.152494, -10.622854 ], [ 142.168724, -10.623354 ], [ 142.186914, -10.597964 ], [ 142.203704, -10.594844 ], [ 142.210184, -10.616523 ], [ 142.245394, -10.647253 ], [ 142.249704, -10.667023 ], [ 142.277423, -10.706483 ] ] ], [ [ [ 142.250871, -9.229096 ], [ 142.242411, -9.234726 ], [ 142.233540, -9.221187 ], [ 142.250871, -9.229096 ] ] ], [ [ [ 142.232533, -10.573924 ], [ 142.210654, -10.589044 ], [ 142.205594, -10.581494 ], [ 142.221487, -10.569771 ], [ 142.232533, -10.573924 ] ] ], [ [ [ 142.229863, -10.534034 ], [ 142.213993, -10.566314 ], [ 142.194943, -10.574864 ], [ 142.184063, -10.568354 ], [ 142.182853, -10.552644 ], [ 142.204073, -10.544074 ], [ 142.213013, -10.521654 ], [ 142.229863, -10.534034 ] ] ], [ [ [ 142.201174, -9.948772 ], [ 142.178455, -9.972832 ], [ 142.164694, -9.951742 ], [ 142.187014, -9.942382 ], [ 142.201174, -9.948772 ] ] ], [ [ [ 142.192476, -10.105890 ], [ 142.187847, -10.148420 ], [ 142.170987, -10.157860 ], [ 142.163427, -10.180960 ], [ 142.153917, -10.172620 ], [ 142.134317, -10.178800 ], [ 142.121646, -10.148091 ], [ 142.108876, -10.148811 ], [ 142.087466, -10.130111 ], [ 142.091896, -10.122861 ], [ 142.085356, -10.112592 ], [ 142.112755, -10.082542 ], [ 142.114185, -10.068512 ], [ 142.127895, -10.072881 ], [ 142.161975, -10.063601 ], [ 142.168266, -10.069001 ], [ 142.181926, -10.059341 ], [ 142.192476, -10.105890 ] ] ], [ [ [ 142.188430, -9.232797 ], [ 142.156401, -9.246727 ], [ 142.164350, -9.223927 ], [ 142.188430, -9.232797 ] ] ], [ [ [ 142.178983, -10.585664 ], [ 142.169004, -10.605944 ], [ 142.146333, -10.595054 ], [ 142.178983, -10.585664 ] ] ], [ [ [ 142.173227, -10.207719 ], [ 142.168848, -10.228199 ], [ 142.163437, -10.216909 ], [ 142.173227, -10.207719 ] ] ], [ [ [ 142.170973, -10.553585 ], [ 142.157783, -10.570035 ], [ 142.145653, -10.565665 ], [ 142.170973, -10.553585 ] ] ], [ [ [ 142.140715, -10.373367 ], [ 142.134365, -10.386847 ], [ 142.125905, -10.384057 ], [ 142.124654, -10.353408 ], [ 142.132764, -10.354288 ], [ 142.140715, -10.373367 ] ] ], [ [ [ 142.115326, -10.991465 ], [ 142.107635, -10.998365 ], [ 142.098845, -10.989496 ], [ 142.099596, -10.975245 ], [ 142.108716, -10.967305 ], [ 142.114906, -10.971235 ], [ 142.099295, -10.986556 ], [ 142.115326, -10.991465 ] ] ], [ [ [ 142.076853, -10.265380 ], [ 142.065883, -10.262480 ], [ 142.073973, -10.259180 ], [ 142.076853, -10.265380 ] ] ], [ [ [ 142.060474, -10.353859 ], [ 142.048074, -10.365769 ], [ 142.048604, -10.354689 ], [ 142.060474, -10.353859 ] ] ], [ [ [ 139.887477, -16.653029 ], [ 139.855767, -16.677089 ], [ 139.848137, -16.663479 ], [ 139.868217, -16.658209 ], [ 139.871947, -16.645349 ], [ 139.887477, -16.653029 ] ] ], [ [ [ 139.813616, -16.491310 ], [ 139.806556, -16.496790 ], [ 139.802206, -16.487970 ], [ 139.813616, -16.491310 ] ] ], [ [ [ 139.734697, -16.477391 ], [ 139.730877, -16.501301 ], [ 139.723347, -16.490971 ], [ 139.709537, -16.490181 ], [ 139.701237, -16.474411 ], [ 139.717717, -16.450141 ], [ 139.726367, -16.450781 ], [ 139.734697, -16.477391 ] ] ], [ [ [ 139.712128, -16.530531 ], [ 139.689608, -16.534981 ], [ 139.683758, -16.520471 ], [ 139.657218, -16.519401 ], [ 139.639278, -16.532321 ], [ 139.626268, -16.530421 ], [ 139.595979, -16.554211 ], [ 139.589039, -16.532241 ], [ 139.579709, -16.527081 ], [ 139.578299, -16.502671 ], [ 139.558499, -16.490752 ], [ 139.566579, -16.474502 ], [ 139.546629, -16.460532 ], [ 139.560819, -16.480272 ], [ 139.540659, -16.488212 ], [ 139.531339, -16.515482 ], [ 139.506779, -16.511992 ], [ 139.475020, -16.526232 ], [ 139.485560, -16.542112 ], [ 139.514320, -16.545152 ], [ 139.506800, -16.576682 ], [ 139.483700, -16.556022 ], [ 139.453080, -16.569502 ], [ 139.458300, -16.575382 ], [ 139.467430, -16.568582 ], [ 139.473070, -16.583162 ], [ 139.455270, -16.580312 ], [ 139.471200, -16.588132 ], [ 139.465631, -16.627932 ], [ 139.439141, -16.630692 ], [ 139.447111, -16.633152 ], [ 139.451261, -16.666262 ], [ 139.438131, -16.674752 ], [ 139.417381, -16.672402 ], [ 139.401991, -16.640432 ], [ 139.393081, -16.637272 ], [ 139.380071, -16.647112 ], [ 139.375851, -16.642032 ], [ 139.383012, -16.656382 ], [ 139.368602, -16.672102 ], [ 139.373892, -16.686342 ], [ 139.365692, -16.693352 ], [ 139.358742, -16.684572 ], [ 139.350562, -16.688952 ], [ 139.321982, -16.710182 ], [ 139.313053, -16.730232 ], [ 139.305073, -16.724132 ], [ 139.274583, -16.733523 ], [ 139.254353, -16.723583 ], [ 139.230023, -16.731153 ], [ 139.221573, -16.709793 ], [ 139.199764, -16.707653 ], [ 139.195023, -16.661933 ], [ 139.166244, -16.667973 ], [ 139.151014, -16.633843 ], [ 139.161923, -16.608643 ], [ 139.212783, -16.568533 ], [ 139.218522, -16.535753 ], [ 139.239262, -16.523663 ], [ 139.241832, -16.504333 ], [ 139.292081, -16.477193 ], [ 139.304131, -16.462833 ], [ 139.338331, -16.464503 ], [ 139.363620, -16.452393 ], [ 139.420420, -16.444882 ], [ 139.465389, -16.446072 ], [ 139.535249, -16.408552 ], [ 139.548048, -16.390702 ], [ 139.604468, -16.403041 ], [ 139.650178, -16.449501 ], [ 139.676387, -16.450611 ], [ 139.680237, -16.468881 ], [ 139.690287, -16.468001 ], [ 139.698507, -16.478801 ], [ 139.700878, -16.514421 ], [ 139.712128, -16.530531 ] ] ], [ [ [ 139.639482, -17.074420 ], [ 139.611912, -17.120940 ], [ 139.614462, -17.139480 ], [ 139.603772, -17.138330 ], [ 139.596492, -17.132900 ], [ 139.595112, -17.112220 ], [ 139.614042, -17.106260 ], [ 139.625512, -17.062090 ], [ 139.639482, -17.074420 ] ] ], [ [ [ 139.472553, -17.095950 ], [ 139.427284, -17.105591 ], [ 139.425524, -17.123461 ], [ 139.439824, -17.135691 ], [ 139.434554, -17.139451 ], [ 139.411174, -17.122191 ], [ 139.394114, -17.082971 ], [ 139.423344, -17.078611 ], [ 139.450443, -17.055281 ], [ 139.456743, -17.031281 ], [ 139.468593, -17.029171 ], [ 139.461633, -17.025261 ], [ 139.469723, -17.023851 ], [ 139.472983, -17.035581 ], [ 139.486073, -17.036241 ], [ 139.490133, -17.044571 ], [ 139.486953, -17.034701 ], [ 139.473763, -17.030381 ], [ 139.477453, -17.019511 ], [ 139.490573, -17.015811 ], [ 139.494582, -17.000981 ], [ 139.500462, -17.002301 ], [ 139.492632, -16.996501 ], [ 139.494472, -16.979621 ], [ 139.543542, -17.031350 ], [ 139.556342, -17.034310 ], [ 139.549272, -17.047970 ], [ 139.554432, -17.069730 ], [ 139.577982, -17.093550 ], [ 139.522693, -17.102760 ], [ 139.514473, -17.111860 ], [ 139.518683, -17.123160 ], [ 139.509863, -17.123150 ], [ 139.478003, -17.115791 ], [ 139.472553, -17.095950 ] ], [ [ 139.479806, -17.093717 ], [ 139.484533, -17.092811 ], [ 139.480753, -17.084631 ], [ 139.479806, -17.093717 ] ] ], [ [ [ 139.560553, -17.114420 ], [ 139.549473, -17.129210 ], [ 139.552203, -17.114520 ], [ 139.560553, -17.114420 ] ] ], [ [ [ 139.477661, -16.679452 ], [ 139.464551, -16.700382 ], [ 139.453651, -16.707512 ], [ 139.441331, -16.703682 ], [ 139.438391, -16.694532 ], [ 139.452441, -16.674392 ], [ 139.467561, -16.667032 ], [ 139.477661, -16.679452 ] ] ], [ [ [ 139.283660, -16.264043 ], [ 139.273720, -16.275354 ], [ 139.272900, -16.264384 ], [ 139.283660, -16.264043 ] ] ], [ [ [ 139.279795, -16.993792 ], [ 139.262625, -16.999202 ], [ 139.260655, -16.989832 ], [ 139.265475, -16.984412 ], [ 139.279795, -16.993792 ] ] ], [ [ [ 139.265675, -17.058282 ], [ 139.250745, -17.055642 ], [ 139.247865, -17.045382 ], [ 139.233225, -17.046142 ], [ 139.222885, -17.031722 ], [ 139.214685, -17.036402 ], [ 139.207345, -17.003332 ], [ 139.243075, -17.029472 ], [ 139.265675, -17.058282 ] ] ], [ [ [ 139.188754, -16.681543 ], [ 139.182644, -16.698383 ], [ 139.188624, -16.719283 ], [ 139.173964, -16.728443 ], [ 139.184754, -16.733643 ], [ 139.169974, -16.730693 ], [ 139.162344, -16.748893 ], [ 139.141354, -16.754083 ], [ 139.145954, -16.691933 ], [ 139.171284, -16.671033 ], [ 139.188754, -16.681543 ] ] ], [ [ [ 139.152225, -16.821893 ], [ 139.128405, -16.826063 ], [ 139.113855, -16.837583 ], [ 139.113255, -16.849443 ], [ 139.094725, -16.843103 ], [ 139.090625, -16.826713 ], [ 139.094865, -16.812703 ], [ 139.132535, -16.797813 ], [ 139.152225, -16.821893 ] ] ], [ [ [ 139.076836, -16.902193 ], [ 139.046216, -16.885333 ], [ 139.073676, -16.891113 ], [ 139.076836, -16.902193 ] ] ], [ [ [ 139.067596, -16.865003 ], [ 139.058906, -16.876863 ], [ 139.063146, -16.860593 ], [ 139.067596, -16.865003 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 3, + "properties": { + "STATE_CODE": "4", + "STATE_NAME": "South Australia" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 138.500217, -34.843571 ], [ 138.510797, -34.842304 ], [ 138.516160, -34.810835 ], [ 138.532889, -34.815026 ], [ 138.530822, -34.822573 ], [ 138.545732, -34.810610 ], [ 138.566280, -34.825093 ], [ 138.547525, -34.809537 ], [ 138.553914, -34.789902 ], [ 138.543501, -34.774809 ], [ 138.541428, -34.752951 ], [ 138.529750, -34.745246 ], [ 138.532602, -34.737353 ], [ 138.491739, -34.721322 ], [ 138.475866, -34.698481 ], [ 138.463876, -34.697038 ], [ 138.454697, -34.682072 ], [ 138.436150, -34.672481 ], [ 138.444655, -34.670494 ], [ 138.430566, -34.668154 ], [ 138.436243, -34.653886 ], [ 138.445781, -34.653393 ], [ 138.426467, -34.621629 ], [ 138.413243, -34.620852 ], [ 138.416988, -34.614387 ], [ 138.408432, -34.600260 ], [ 138.364309, -34.578149 ], [ 138.349516, -34.557529 ], [ 138.344385, -34.531212 ], [ 138.265632, -34.476802 ], [ 138.246978, -34.400897 ], [ 138.225222, -34.365908 ], [ 138.230858, -34.343908 ], [ 138.223029, -34.311262 ], [ 138.192401, -34.272173 ], [ 138.146203, -34.265618 ], [ 138.167524, -34.245335 ], [ 138.165702, -34.221296 ], [ 138.102306, -34.138883 ], [ 138.077415, -34.133551 ], [ 138.043720, -34.174353 ], [ 138.029348, -34.221086 ], [ 138.012405, -34.231329 ], [ 138.001543, -34.257058 ], [ 138.021736, -34.285070 ], [ 138.007096, -34.349032 ], [ 137.917537, -34.428156 ], [ 137.898839, -34.493836 ], [ 137.887583, -34.507362 ], [ 137.875809, -34.597683 ], [ 137.907676, -34.615868 ], [ 137.876810, -34.668410 ], [ 137.880758, -34.695263 ], [ 137.868851, -34.722633 ], [ 137.864947, -34.766080 ], [ 137.857788, -34.771200 ], [ 137.865023, -34.777911 ], [ 137.831700, -34.812719 ], [ 137.800063, -34.877546 ], [ 137.796073, -34.906192 ], [ 137.805024, -34.912187 ], [ 137.790290, -34.922297 ], [ 137.757304, -34.996570 ], [ 137.763990, -35.040599 ], [ 137.733807, -35.044159 ], [ 137.724730, -35.053743 ], [ 137.745477, -35.074885 ], [ 137.743274, -35.102896 ], [ 137.758661, -35.114743 ], [ 137.697314, -35.141537 ], [ 137.677887, -35.167742 ], [ 137.637498, -35.168201 ], [ 137.554817, -35.117455 ], [ 137.525835, -35.112928 ], [ 137.510698, -35.119016 ], [ 137.464103, -35.099218 ], [ 137.422840, -35.098095 ], [ 137.352267, -35.133960 ], [ 137.340748, -35.149462 ], [ 137.342809, -35.161720 ], [ 137.334579, -35.163878 ], [ 137.347808, -35.163004 ], [ 137.334887, -35.167858 ], [ 137.298110, -35.168308 ], [ 137.264701, -35.159041 ], [ 137.237741, -35.164515 ], [ 137.203511, -35.191922 ], [ 137.190399, -35.208941 ], [ 137.190574, -35.229175 ], [ 137.173992, -35.237359 ], [ 137.111428, -35.242931 ], [ 137.076687, -35.226357 ], [ 137.001389, -35.223207 ], [ 136.982979, -35.235541 ], [ 136.982700, -35.249550 ], [ 136.969755, -35.252080 ], [ 136.966855, -35.267030 ], [ 136.945243, -35.269335 ], [ 136.944022, -35.282153 ], [ 136.899750, -35.285811 ], [ 136.883000, -35.300346 ], [ 136.870503, -35.286886 ], [ 136.848565, -35.282106 ], [ 136.821927, -35.245280 ], [ 136.834107, -35.241945 ], [ 136.829351, -35.233226 ], [ 136.846425, -35.228823 ], [ 136.845740, -35.190101 ], [ 136.865972, -35.194123 ], [ 136.888337, -35.185252 ], [ 136.897610, -35.156673 ], [ 136.913125, -35.153594 ], [ 136.941123, -35.129111 ], [ 136.941788, -35.105674 ], [ 136.961072, -35.082302 ], [ 136.930287, -35.029050 ], [ 136.944086, -35.022033 ], [ 136.943678, -35.012642 ], [ 136.968239, -35.000414 ], [ 136.976385, -34.941240 ], [ 137.012553, -34.920480 ], [ 137.013614, -34.892979 ], [ 137.093376, -34.919948 ], [ 137.146064, -34.918200 ], [ 137.194414, -34.901017 ], [ 137.224498, -34.904483 ], [ 137.276479, -34.893900 ], [ 137.291011, -34.901020 ], [ 137.309245, -34.927825 ], [ 137.346955, -34.929800 ], [ 137.356422, -34.946584 ], [ 137.374945, -34.953745 ], [ 137.415350, -34.938659 ], [ 137.448758, -34.910318 ], [ 137.457725, -34.884498 ], [ 137.459607, -34.807630 ], [ 137.509440, -34.617955 ], [ 137.506741, -34.582015 ], [ 137.473817, -34.511303 ], [ 137.486637, -34.481665 ], [ 137.483189, -34.439275 ], [ 137.463169, -34.426672 ], [ 137.446005, -34.436891 ], [ 137.427025, -34.472597 ], [ 137.415149, -34.459593 ], [ 137.416933, -34.444675 ], [ 137.438119, -34.427953 ], [ 137.446657, -34.398039 ], [ 137.465117, -34.400688 ], [ 137.476080, -34.392463 ], [ 137.483663, -34.343124 ], [ 137.500299, -34.312000 ], [ 137.499904, -34.226504 ], [ 137.449856, -34.135518 ], [ 137.506757, -34.137625 ], [ 137.522273, -34.129251 ], [ 137.526001, -34.108290 ], [ 137.567535, -34.043536 ], [ 137.552323, -34.014424 ], [ 137.527125, -34.004388 ], [ 137.538706, -33.992451 ], [ 137.558632, -33.988852 ], [ 137.563706, -33.971636 ], [ 137.575722, -33.967168 ], [ 137.600263, -33.936313 ], [ 137.630640, -33.921822 ], [ 137.625460, -33.895162 ], [ 137.600358, -33.876794 ], [ 137.643791, -33.830437 ], [ 137.725471, -33.769922 ], [ 137.736431, -33.737836 ], [ 137.755144, -33.714222 ], [ 137.800547, -33.683113 ], [ 137.834527, -33.642457 ], [ 137.857277, -33.631321 ], [ 137.879023, -33.596782 ], [ 137.892462, -33.587902 ], [ 137.919659, -33.587330 ], [ 137.924238, -33.597412 ], [ 137.913797, -33.612915 ], [ 137.903569, -33.614486 ], [ 137.905083, -33.596919 ], [ 137.893230, -33.625613 ], [ 137.917547, -33.624978 ], [ 137.935597, -33.580101 ], [ 137.935352, -33.552675 ], [ 137.946766, -33.554549 ], [ 137.951782, -33.573302 ], [ 137.964795, -33.574318 ], [ 137.977463, -33.558834 ], [ 137.971121, -33.539426 ], [ 137.962976, -33.550773 ], [ 137.939426, -33.547918 ], [ 137.941430, -33.518107 ], [ 137.949068, -33.512444 ], [ 137.932892, -33.499684 ], [ 137.906643, -33.434132 ], [ 137.870496, -33.396540 ], [ 137.875500, -33.362386 ], [ 137.883258, -33.359406 ], [ 137.890944, -33.366841 ], [ 137.882871, -33.357762 ], [ 137.891216, -33.353978 ], [ 137.883687, -33.352400 ], [ 137.881243, -33.323158 ], [ 137.874140, -33.316092 ], [ 137.878627, -33.329884 ], [ 137.865600, -33.317356 ], [ 137.858829, -33.320776 ], [ 137.873503, -33.330279 ], [ 137.851830, -33.326180 ], [ 137.842526, -33.316505 ], [ 137.844915, -33.304670 ], [ 137.817427, -33.286669 ], [ 137.811132, -33.266254 ], [ 137.826750, -33.248593 ], [ 137.821262, -33.244931 ], [ 137.837982, -33.207238 ], [ 137.852958, -33.209589 ], [ 137.853601, -33.196834 ], [ 137.907816, -33.171441 ], [ 137.925484, -33.176496 ], [ 137.939986, -33.158150 ], [ 137.958306, -33.167765 ], [ 137.963533, -33.160505 ], [ 137.954364, -33.154713 ], [ 137.987635, -33.143951 ], [ 138.000807, -33.131649 ], [ 138.007072, -33.133387 ], [ 138.001337, -33.144027 ], [ 138.013031, -33.153719 ], [ 138.011854, -33.178027 ], [ 138.024228, -33.181884 ], [ 138.036289, -33.169499 ], [ 138.014093, -33.178089 ], [ 138.018263, -33.159353 ], [ 138.028292, -33.155010 ], [ 138.020918, -33.149031 ], [ 138.048044, -33.135837 ], [ 138.054408, -33.115096 ], [ 138.036705, -33.102965 ], [ 138.024630, -33.105780 ], [ 138.030634, -33.098370 ], [ 138.039252, -33.101157 ], [ 138.045942, -33.086700 ], [ 138.018784, -33.035621 ], [ 137.952082, -33.006010 ], [ 137.956632, -32.981391 ], [ 137.912322, -32.853486 ], [ 137.900890, -32.777649 ], [ 137.916527, -32.768858 ], [ 137.916821, -32.759413 ], [ 137.936655, -32.766652 ], [ 137.944458, -32.757655 ], [ 137.887464, -32.715447 ], [ 137.837571, -32.695810 ], [ 137.860025, -32.689400 ], [ 137.867648, -32.663933 ], [ 137.852028, -32.640869 ], [ 137.836291, -32.637649 ], [ 137.802716, -32.608002 ], [ 137.821820, -32.580580 ], [ 137.828519, -32.591178 ], [ 137.825333, -32.603699 ], [ 137.829153, -32.594097 ], [ 137.839055, -32.603632 ], [ 137.829893, -32.594301 ], [ 137.838248, -32.587284 ], [ 137.829686, -32.584703 ], [ 137.835770, -32.574669 ], [ 137.823014, -32.560252 ], [ 137.782259, -32.550341 ], [ 137.789296, -32.545782 ], [ 137.781840, -32.543439 ], [ 137.785277, -32.528520 ], [ 137.768971, -32.523867 ], [ 137.772488, -32.505119 ], [ 137.758759, -32.491348 ], [ 137.770628, -32.480322 ], [ 137.757935, -32.456053 ], [ 137.766047, -32.439510 ], [ 137.750360, -32.415371 ], [ 137.752415, -32.431290 ], [ 137.763815, -32.442118 ], [ 137.753371, -32.457178 ], [ 137.764511, -32.476162 ], [ 137.751739, -32.503471 ], [ 137.762010, -32.510099 ], [ 137.749653, -32.531560 ], [ 137.764897, -32.596744 ], [ 137.750393, -32.673305 ], [ 137.757119, -32.694254 ], [ 137.749747, -32.708266 ], [ 137.753152, -32.721238 ], [ 137.781324, -32.713734 ], [ 137.809507, -32.748590 ], [ 137.793206, -32.779971 ], [ 137.798497, -32.784695 ], [ 137.798826, -32.779387 ], [ 137.803563, -32.796932 ], [ 137.810557, -32.845255 ], [ 137.800485, -32.868142 ], [ 137.791768, -32.870953 ], [ 137.798263, -32.893540 ], [ 137.789289, -32.915205 ], [ 137.758283, -32.907355 ], [ 137.749516, -32.921517 ], [ 137.786511, -32.999915 ], [ 137.759169, -32.988972 ], [ 137.760331, -32.995383 ], [ 137.721268, -32.990512 ], [ 137.713268, -32.974483 ], [ 137.691496, -32.959560 ], [ 137.661043, -32.950959 ], [ 137.641418, -32.955318 ], [ 137.611458, -32.974561 ], [ 137.595198, -32.998551 ], [ 137.596336, -33.006782 ], [ 137.603230, -33.001786 ], [ 137.595789, -33.012108 ], [ 137.599742, -33.021089 ], [ 137.585736, -33.022086 ], [ 137.596979, -33.036150 ], [ 137.552961, -33.058059 ], [ 137.557292, -33.065908 ], [ 137.538685, -33.082123 ], [ 137.536023, -33.094818 ], [ 137.499752, -33.109622 ], [ 137.486076, -33.124658 ], [ 137.457600, -33.135572 ], [ 137.451979, -33.130701 ], [ 137.442264, -33.152177 ], [ 137.434062, -33.230088 ], [ 137.397534, -33.285300 ], [ 137.389738, -33.285318 ], [ 137.393686, -33.289890 ], [ 137.383491, -33.290892 ], [ 137.385368, -33.298338 ], [ 137.374434, -33.292726 ], [ 137.384526, -33.298507 ], [ 137.377221, -33.344211 ], [ 137.385585, -33.372166 ], [ 137.360741, -33.414838 ], [ 137.360521, -33.439166 ], [ 137.314614, -33.471529 ], [ 137.305001, -33.500116 ], [ 137.295283, -33.507413 ], [ 137.278833, -33.565015 ], [ 137.263916, -33.577687 ], [ 137.252397, -33.608277 ], [ 137.213306, -33.661082 ], [ 137.182092, -33.673153 ], [ 137.168508, -33.690294 ], [ 137.124328, -33.700746 ], [ 137.069734, -33.698743 ], [ 137.037280, -33.708010 ], [ 137.025511, -33.719722 ], [ 136.991674, -33.724793 ], [ 136.951489, -33.755299 ], [ 136.857218, -33.798387 ], [ 136.799629, -33.803330 ], [ 136.778484, -33.831012 ], [ 136.730460, -33.834978 ], [ 136.668362, -33.878689 ], [ 136.592684, -33.899562 ], [ 136.572195, -33.923038 ], [ 136.574750, -33.943438 ], [ 136.497478, -33.992615 ], [ 136.434749, -34.011595 ], [ 136.363136, -34.069349 ], [ 136.346688, -34.099496 ], [ 136.356851, -34.122758 ], [ 136.331378, -34.148126 ], [ 136.324390, -34.181602 ], [ 136.278006, -34.220835 ], [ 136.260573, -34.267704 ], [ 136.233584, -34.296136 ], [ 136.187841, -34.334840 ], [ 136.138538, -34.341141 ], [ 136.112245, -34.359384 ], [ 136.103780, -34.382528 ], [ 136.130148, -34.407111 ], [ 136.116359, -34.408422 ], [ 136.091801, -34.429572 ], [ 136.116687, -34.425739 ], [ 136.114089, -34.459054 ], [ 136.121769, -34.467421 ], [ 136.109917, -34.478434 ], [ 136.117536, -34.489264 ], [ 136.112519, -34.515817 ], [ 136.096279, -34.524595 ], [ 136.092173, -34.542734 ], [ 136.083513, -34.532224 ], [ 136.091281, -34.520841 ], [ 136.073225, -34.506203 ], [ 136.082900, -34.495306 ], [ 136.056326, -34.479020 ], [ 136.025020, -34.484048 ], [ 136.015488, -34.499011 ], [ 136.021803, -34.516206 ], [ 136.008306, -34.507749 ], [ 135.993143, -34.518560 ], [ 135.974127, -34.504699 ], [ 135.932310, -34.528521 ], [ 135.928238, -34.538091 ], [ 135.934827, -34.543962 ], [ 135.922751, -34.549984 ], [ 135.902127, -34.592584 ], [ 135.913887, -34.611309 ], [ 135.933423, -34.609826 ], [ 135.937413, -34.649020 ], [ 135.912623, -34.631482 ], [ 135.913136, -34.620512 ], [ 135.891144, -34.615732 ], [ 135.861765, -34.633575 ], [ 135.853962, -34.665381 ], [ 135.853777, -34.715444 ], [ 135.884862, -34.724936 ], [ 135.870055, -34.744430 ], [ 135.892100, -34.744097 ], [ 135.891409, -34.751447 ], [ 135.864720, -34.769666 ], [ 135.863448, -34.754873 ], [ 135.846373, -34.752882 ], [ 135.785731, -34.809330 ], [ 135.834373, -34.819008 ], [ 135.860612, -34.807459 ], [ 135.893494, -34.805599 ], [ 135.928895, -34.768824 ], [ 135.949624, -34.765659 ], [ 135.956396, -34.757148 ], [ 135.960864, -34.783816 ], [ 135.980602, -34.784618 ], [ 135.990068, -34.769453 ], [ 135.983633, -34.757852 ], [ 135.991260, -34.750348 ], [ 135.979243, -34.730501 ], [ 135.995092, -34.725326 ], [ 136.006531, -34.735939 ], [ 136.014332, -34.756514 ], [ 136.001927, -34.787262 ], [ 136.015783, -34.794216 ], [ 136.004306, -34.798810 ], [ 136.008467, -34.805694 ], [ 135.993522, -34.827790 ], [ 135.959953, -34.848601 ], [ 135.962670, -34.875450 ], [ 135.993163, -34.929897 ], [ 135.986455, -34.933799 ], [ 135.992985, -34.944914 ], [ 135.987292, -34.958681 ], [ 135.997972, -34.959234 ], [ 136.004524, -34.980343 ], [ 136.002630, -34.985854 ], [ 135.987209, -34.981705 ], [ 135.976579, -34.994656 ], [ 135.960257, -34.991911 ], [ 135.960935, -35.004769 ], [ 135.954463, -35.006352 ], [ 135.943382, -35.002954 ], [ 135.941340, -34.985684 ], [ 135.948555, -34.980702 ], [ 135.931669, -34.970804 ], [ 135.928877, -34.948295 ], [ 135.867748, -34.919894 ], [ 135.856062, -34.927288 ], [ 135.853755, -34.886649 ], [ 135.792090, -34.860956 ], [ 135.751833, -34.856150 ], [ 135.712711, -34.865101 ], [ 135.705738, -34.905736 ], [ 135.679212, -34.913706 ], [ 135.688404, -34.923310 ], [ 135.685876, -34.944856 ], [ 135.668666, -34.946723 ], [ 135.653561, -34.936363 ], [ 135.618827, -34.944466 ], [ 135.622174, -34.924155 ], [ 135.614720, -34.924474 ], [ 135.624044, -34.906359 ], [ 135.604931, -34.891673 ], [ 135.604502, -34.878667 ], [ 135.540650, -34.814131 ], [ 135.495893, -34.782583 ], [ 135.494109, -34.765676 ], [ 135.474340, -34.744108 ], [ 135.379698, -34.687117 ], [ 135.350491, -34.680472 ], [ 135.325022, -34.686375 ], [ 135.320817, -34.680297 ], [ 135.329374, -34.669383 ], [ 135.347275, -34.666046 ], [ 135.341687, -34.629108 ], [ 135.321377, -34.607997 ], [ 135.297102, -34.603172 ], [ 135.283699, -34.576035 ], [ 135.252430, -34.551870 ], [ 135.225242, -34.543618 ], [ 135.206611, -34.549956 ], [ 135.208808, -34.558634 ], [ 135.173727, -34.555002 ], [ 135.149892, -34.568884 ], [ 135.143498, -34.591838 ], [ 135.109197, -34.588234 ], [ 135.125345, -34.576533 ], [ 135.123290, -34.557401 ], [ 135.134241, -34.544351 ], [ 135.129869, -34.527798 ], [ 135.143601, -34.519773 ], [ 135.138982, -34.503296 ], [ 135.159564, -34.488896 ], [ 135.173227, -34.464768 ], [ 135.186580, -34.459933 ], [ 135.194978, -34.434060 ], [ 135.206319, -34.429307 ], [ 135.217378, -34.433353 ], [ 135.211506, -34.440781 ], [ 135.212554, -34.481453 ], [ 135.221384, -34.498630 ], [ 135.353900, -34.522063 ], [ 135.316249, -34.520659 ], [ 135.297586, -34.552295 ], [ 135.309491, -34.563690 ], [ 135.354688, -34.580068 ], [ 135.350464, -34.603510 ], [ 135.361623, -34.620736 ], [ 135.391139, -34.623034 ], [ 135.402196, -34.633402 ], [ 135.392045, -34.637662 ], [ 135.390367, -34.630065 ], [ 135.374297, -34.628815 ], [ 135.376859, -34.640746 ], [ 135.363762, -34.637309 ], [ 135.365757, -34.642091 ], [ 135.438272, -34.633633 ], [ 135.451066, -34.626783 ], [ 135.451529, -34.614405 ], [ 135.474023, -34.622819 ], [ 135.494016, -34.613292 ], [ 135.510428, -34.620955 ], [ 135.516760, -34.612968 ], [ 135.508040, -34.594986 ], [ 135.478234, -34.597360 ], [ 135.458070, -34.586440 ], [ 135.443137, -34.600557 ], [ 135.472966, -34.616650 ], [ 135.431694, -34.603432 ], [ 135.444031, -34.570027 ], [ 135.435742, -34.541643 ], [ 135.445784, -34.537188 ], [ 135.428658, -34.527388 ], [ 135.420340, -34.539237 ], [ 135.410348, -34.538834 ], [ 135.414586, -34.520801 ], [ 135.405086, -34.507235 ], [ 135.395231, -34.524262 ], [ 135.401244, -34.533371 ], [ 135.391444, -34.534024 ], [ 135.422190, -34.548857 ], [ 135.406384, -34.555048 ], [ 135.413637, -34.587853 ], [ 135.396341, -34.593077 ], [ 135.422243, -34.601453 ], [ 135.389235, -34.595065 ], [ 135.398323, -34.555670 ], [ 135.376918, -34.515206 ], [ 135.395769, -34.496803 ], [ 135.388359, -34.441275 ], [ 135.358934, -34.418703 ], [ 135.365597, -34.384994 ], [ 135.349857, -34.368618 ], [ 135.357365, -34.366161 ], [ 135.359840, -34.344051 ], [ 135.346224, -34.267559 ], [ 135.303512, -34.184088 ], [ 135.280030, -34.170303 ], [ 135.267879, -34.177283 ], [ 135.255685, -34.155217 ], [ 135.241237, -34.150131 ], [ 135.244041, -34.140787 ], [ 135.279477, -34.119738 ], [ 135.272741, -34.094594 ], [ 135.281119, -34.070257 ], [ 135.264772, -34.032148 ], [ 135.271551, -34.019591 ], [ 135.252174, -33.981334 ], [ 135.194027, -33.919801 ], [ 135.182152, -33.877771 ], [ 135.170374, -33.872562 ], [ 135.161747, -33.877516 ], [ 135.145846, -33.852366 ], [ 135.082236, -33.804127 ], [ 135.040271, -33.755003 ], [ 134.878917, -33.653908 ], [ 134.886099, -33.643037 ], [ 134.879138, -33.636109 ], [ 134.860762, -33.643979 ], [ 134.830247, -33.626318 ], [ 134.842694, -33.621398 ], [ 134.840484, -33.592900 ], [ 134.863402, -33.546591 ], [ 134.845066, -33.436490 ], [ 134.802047, -33.328782 ], [ 134.760683, -33.309046 ], [ 134.736774, -33.273849 ], [ 134.719308, -33.263939 ], [ 134.696622, -33.263480 ], [ 134.688007, -33.250199 ], [ 134.658294, -33.233584 ], [ 134.691346, -33.229487 ], [ 134.698500, -33.221831 ], [ 134.711261, -33.227607 ], [ 134.708922, -33.233074 ], [ 134.719097, -33.229984 ], [ 134.722438, -33.218774 ], [ 134.709636, -33.214788 ], [ 134.718293, -33.207371 ], [ 134.717401, -33.195677 ], [ 134.702148, -33.174670 ], [ 134.666654, -33.161002 ], [ 134.632418, -33.162198 ], [ 134.595151, -33.138790 ], [ 134.558351, -33.161347 ], [ 134.576362, -33.189315 ], [ 134.598184, -33.196556 ], [ 134.613473, -33.189094 ], [ 134.625540, -33.195113 ], [ 134.640753, -33.182719 ], [ 134.647444, -33.195390 ], [ 134.623148, -33.197901 ], [ 134.631218, -33.213751 ], [ 134.663776, -33.223077 ], [ 134.642472, -33.224337 ], [ 134.630838, -33.245163 ], [ 134.595760, -33.203417 ], [ 134.547666, -33.189870 ], [ 134.506204, -33.161407 ], [ 134.450885, -33.144657 ], [ 134.415463, -33.148863 ], [ 134.391888, -33.166091 ], [ 134.388550, -33.177345 ], [ 134.368885, -33.175899 ], [ 134.358474, -33.125341 ], [ 134.324366, -33.090625 ], [ 134.307047, -33.088982 ], [ 134.292566, -33.075920 ], [ 134.289983, -33.060373 ], [ 134.299682, -33.049216 ], [ 134.293337, -33.039983 ], [ 134.281484, -33.039420 ], [ 134.284078, -33.028506 ], [ 134.275541, -33.024783 ], [ 134.264013, -33.032125 ], [ 134.278535, -33.036229 ], [ 134.271537, -33.042322 ], [ 134.281739, -33.050437 ], [ 134.262433, -33.060006 ], [ 134.261001, -33.073092 ], [ 134.266137, -33.088020 ], [ 134.284236, -33.100396 ], [ 134.278781, -33.107431 ], [ 134.292343, -33.118565 ], [ 134.312594, -33.112010 ], [ 134.321623, -33.118288 ], [ 134.316547, -33.125254 ], [ 134.358470, -33.148298 ], [ 134.344935, -33.161236 ], [ 134.352804, -33.157392 ], [ 134.344837, -33.162215 ], [ 134.351334, -33.190301 ], [ 134.328367, -33.199477 ], [ 134.260225, -33.152631 ], [ 134.266773, -33.138511 ], [ 134.261749, -33.098203 ], [ 134.247206, -33.087270 ], [ 134.230283, -33.043313 ], [ 134.192038, -33.035167 ], [ 134.167922, -33.055687 ], [ 134.165246, -33.041359 ], [ 134.138526, -33.018087 ], [ 134.167286, -33.009282 ], [ 134.193542, -33.013532 ], [ 134.204837, -32.995309 ], [ 134.201879, -32.963783 ], [ 134.189083, -32.942369 ], [ 134.167393, -32.926769 ], [ 134.144060, -32.928168 ], [ 134.141184, -32.944267 ], [ 134.123646, -32.932117 ], [ 134.129270, -32.926433 ], [ 134.119181, -32.914597 ], [ 134.106442, -32.912380 ], [ 134.080901, -32.926517 ], [ 134.081098, -32.918626 ], [ 134.060530, -32.907934 ], [ 134.070384, -32.909397 ], [ 134.078646, -32.899120 ], [ 134.071527, -32.883815 ], [ 134.096119, -32.878643 ], [ 134.099301, -32.867198 ], [ 134.116860, -32.868108 ], [ 134.138498, -32.839715 ], [ 134.118901, -32.783386 ], [ 134.060323, -32.722498 ], [ 134.080595, -32.709573 ], [ 134.107069, -32.721285 ], [ 134.174283, -32.717947 ], [ 134.204935, -32.725202 ], [ 134.215088, -32.730782 ], [ 134.152814, -32.723976 ], [ 134.164646, -32.736988 ], [ 134.200135, -32.746691 ], [ 134.189241, -32.769701 ], [ 134.196647, -32.795305 ], [ 134.221859, -32.789845 ], [ 134.240950, -32.748056 ], [ 134.260472, -32.734768 ], [ 134.290382, -32.692865 ], [ 134.283746, -32.684940 ], [ 134.294307, -32.661955 ], [ 134.279388, -32.648207 ], [ 134.277802, -32.608656 ], [ 134.266342, -32.573809 ], [ 134.214223, -32.511148 ], [ 134.163101, -32.469053 ], [ 134.121275, -32.454073 ], [ 134.092181, -32.457869 ], [ 134.102837, -32.450116 ], [ 134.081033, -32.455382 ], [ 134.082349, -32.465578 ], [ 134.073909, -32.460686 ], [ 134.081218, -32.457310 ], [ 134.062832, -32.455795 ], [ 134.057125, -32.440708 ], [ 134.061924, -32.456321 ], [ 134.086216, -32.470786 ], [ 134.036977, -32.459813 ], [ 133.995073, -32.484451 ], [ 133.991564, -32.505353 ], [ 133.954956, -32.494361 ], [ 133.922739, -32.494850 ], [ 133.907426, -32.508794 ], [ 133.908794, -32.517545 ], [ 133.896190, -32.523342 ], [ 133.893695, -32.541219 ], [ 133.861052, -32.531912 ], [ 133.849000, -32.541726 ], [ 133.857120, -32.519484 ], [ 133.846992, -32.503696 ], [ 133.862406, -32.483536 ], [ 133.850620, -32.461417 ], [ 133.867482, -32.420449 ], [ 133.866818, -32.399186 ], [ 133.897186, -32.399574 ], [ 133.886749, -32.402351 ], [ 133.893665, -32.408599 ], [ 133.889012, -32.411510 ], [ 133.905579, -32.413412 ], [ 133.887446, -32.423126 ], [ 133.919317, -32.428318 ], [ 133.946930, -32.411577 ], [ 133.951086, -32.388513 ], [ 133.932709, -32.379879 ], [ 133.931014, -32.361804 ], [ 133.901989, -32.318217 ], [ 133.880096, -32.306173 ], [ 133.869360, -32.280505 ], [ 133.842866, -32.256313 ], [ 133.818172, -32.247234 ], [ 133.827154, -32.242835 ], [ 133.821407, -32.233970 ], [ 133.806014, -32.231165 ], [ 133.808341, -32.243115 ], [ 133.769731, -32.263826 ], [ 133.755353, -32.235325 ], [ 133.762215, -32.224313 ], [ 133.756726, -32.205846 ], [ 133.745056, -32.201553 ], [ 133.736068, -32.207596 ], [ 133.733206, -32.198675 ], [ 133.714932, -32.194992 ], [ 133.679113, -32.202643 ], [ 133.692908, -32.155240 ], [ 133.674713, -32.142638 ], [ 133.648205, -32.152014 ], [ 133.642718, -32.144576 ], [ 133.670702, -32.134991 ], [ 133.666883, -32.103832 ], [ 133.643775, -32.095913 ], [ 133.630550, -32.100079 ], [ 133.628220, -32.090614 ], [ 133.613619, -32.086022 ], [ 133.592256, -32.087258 ], [ 133.572514, -32.117454 ], [ 133.584683, -32.140992 ], [ 133.555852, -32.158998 ], [ 133.553457, -32.169582 ], [ 133.522105, -32.155301 ], [ 133.525112, -32.137132 ], [ 133.519074, -32.135729 ], [ 133.525297, -32.127439 ], [ 133.504770, -32.141927 ], [ 133.519030, -32.143533 ], [ 133.511304, -32.153307 ], [ 133.496786, -32.150609 ], [ 133.502926, -32.131086 ], [ 133.483142, -32.126292 ], [ 133.480031, -32.115968 ], [ 133.489479, -32.109820 ], [ 133.472790, -32.100107 ], [ 133.451048, -32.112658 ], [ 133.451453, -32.136008 ], [ 133.438088, -32.123040 ], [ 133.395110, -32.141578 ], [ 133.398041, -32.156673 ], [ 133.392332, -32.159361 ], [ 133.400865, -32.169053 ], [ 133.414843, -32.169899 ], [ 133.411752, -32.177752 ], [ 133.464309, -32.172158 ], [ 133.491804, -32.195616 ], [ 133.487729, -32.206108 ], [ 133.485628, -32.196247 ], [ 133.446240, -32.178520 ], [ 133.425612, -32.184688 ], [ 133.423492, -32.197973 ], [ 133.389785, -32.200207 ], [ 133.371437, -32.188838 ], [ 133.322792, -32.179875 ], [ 133.278238, -32.183530 ], [ 133.275245, -32.194901 ], [ 133.253192, -32.210870 ], [ 133.230029, -32.190844 ], [ 133.164662, -32.170052 ], [ 133.146617, -32.174835 ], [ 133.147535, -32.194517 ], [ 133.125756, -32.208783 ], [ 133.138132, -32.174878 ], [ 133.088342, -32.127021 ], [ 133.006622, -32.083401 ], [ 132.979569, -32.106513 ], [ 132.981570, -32.081999 ], [ 132.963634, -32.065239 ], [ 132.903772, -32.036233 ], [ 132.826487, -31.981566 ], [ 132.746588, -31.949342 ], [ 132.734266, -31.956579 ], [ 132.686927, -31.950662 ], [ 132.660581, -31.957185 ], [ 132.655504, -31.948156 ], [ 132.595204, -31.934328 ], [ 132.531329, -31.934945 ], [ 132.478447, -31.946285 ], [ 132.446417, -31.970725 ], [ 132.437926, -32.000986 ], [ 132.461607, -32.010634 ], [ 132.473232, -32.030092 ], [ 132.415452, -31.998806 ], [ 132.393408, -32.001747 ], [ 132.383915, -32.015743 ], [ 132.380460, -32.009867 ], [ 132.343188, -32.014498 ], [ 132.335197, -32.029089 ], [ 132.285618, -32.022479 ], [ 132.271202, -32.033754 ], [ 132.200614, -32.027280 ], [ 132.176409, -32.018313 ], [ 132.166219, -32.004709 ], [ 132.151178, -32.003035 ], [ 132.112775, -31.946543 ], [ 132.072997, -31.917740 ], [ 131.758577, -31.720260 ], [ 131.442176, -31.571825 ], [ 131.244776, -31.492277 ], [ 131.148637, -31.463654 ], [ 131.128507, -31.464717 ], [ 131.081798, -31.490898 ], [ 131.057558, -31.521546 ], [ 131.026398, -31.537626 ], [ 130.806132, -31.605630 ], [ 130.734472, -31.606052 ], [ 130.567923, -31.585733 ], [ 130.488804, -31.593044 ], [ 130.275063, -31.573662 ], [ 130.152187, -31.576538 ], [ 130.120404, -31.586414 ], [ 129.918215, -31.590296 ], [ 129.843095, -31.607747 ], [ 129.527784, -31.622684 ], [ 129.052810, -31.674180 ], [ 129.001340, -31.687068 ], [ 129.001854, -25.998613 ], [ 140.999394, -25.996376 ], [ 141.002937, -33.998510 ], [ 141.002956, -34.021892 ], [ 140.989765, -34.031708 ], [ 140.980453, -34.016013 ], [ 140.986747, -34.010237 ], [ 140.975320, -34.009321 ], [ 140.980575, -33.999996 ], [ 140.969273, -33.997216 ], [ 140.963616, -33.980648 ], [ 140.963103, -35.748535 ], [ 140.973872, -37.462093 ], [ 140.965735, -38.055989 ], [ 140.873073, -38.051014 ], [ 140.837839, -38.041051 ], [ 140.807612, -38.049008 ], [ 140.782998, -38.045520 ], [ 140.770478, -38.059708 ], [ 140.716881, -38.051013 ], [ 140.662442, -38.061474 ], [ 140.642658, -38.041452 ], [ 140.620936, -38.040256 ], [ 140.608192, -38.027659 ], [ 140.590339, -38.023614 ], [ 140.579385, -38.029701 ], [ 140.567291, -38.008596 ], [ 140.517006, -37.989960 ], [ 140.491164, -37.960870 ], [ 140.454015, -37.935846 ], [ 140.396450, -37.919006 ], [ 140.388676, -37.901501 ], [ 140.375888, -37.897846 ], [ 140.353977, -37.849536 ], [ 140.328417, -37.818170 ], [ 140.318866, -37.789123 ], [ 140.247890, -37.686113 ], [ 140.178709, -37.617223 ], [ 140.112713, -37.578417 ], [ 140.107588, -37.565571 ], [ 140.120189, -37.569746 ], [ 140.131312, -37.556224 ], [ 140.120840, -37.530865 ], [ 140.049823, -37.478617 ], [ 140.020089, -37.476952 ], [ 140.011347, -37.493125 ], [ 139.993117, -37.485890 ], [ 139.996576, -37.476743 ], [ 139.960106, -37.443363 ], [ 139.949224, -37.441820 ], [ 139.946727, -37.429330 ], [ 139.890441, -37.375874 ], [ 139.865514, -37.335612 ], [ 139.840749, -37.322190 ], [ 139.761627, -37.199707 ], [ 139.740010, -37.182126 ], [ 139.743061, -37.155849 ], [ 139.776534, -37.165216 ], [ 139.788459, -37.157799 ], [ 139.795818, -37.137468 ], [ 139.791482, -37.112869 ], [ 139.768416, -37.081579 ], [ 139.743931, -37.074190 ], [ 139.740535, -37.021304 ], [ 139.669972, -36.957431 ], [ 139.675909, -36.942056 ], [ 139.698355, -36.940110 ], [ 139.732390, -36.916809 ], [ 139.787616, -36.894859 ], [ 139.842891, -36.839575 ], [ 139.863159, -36.753479 ], [ 139.861979, -36.692328 ], [ 139.851109, -36.647474 ], [ 139.782926, -36.458816 ], [ 139.655207, -36.221918 ], [ 139.523020, -36.043505 ], [ 139.377020, -35.892234 ], [ 139.211957, -35.754559 ], [ 139.055313, -35.649577 ], [ 138.883656, -35.557290 ], [ 138.762908, -35.520673 ], [ 138.710269, -35.513587 ], [ 138.692927, -35.522923 ], [ 138.684432, -35.538108 ], [ 138.631522, -35.543844 ], [ 138.626004, -35.557911 ], [ 138.598220, -35.579469 ], [ 138.603774, -35.594283 ], [ 138.565936, -35.608529 ], [ 138.522360, -35.642968 ], [ 138.494522, -35.633530 ], [ 138.431096, -35.629274 ], [ 138.410026, -35.640576 ], [ 138.275956, -35.639375 ], [ 138.232054, -35.659589 ], [ 138.191358, -35.665090 ], [ 138.156886, -35.658167 ], [ 138.096166, -35.625221 ], [ 138.093913, -35.603403 ], [ 138.108686, -35.592452 ], [ 138.127430, -35.555371 ], [ 138.165488, -35.519377 ], [ 138.193862, -35.523650 ], [ 138.244540, -35.500848 ], [ 138.294318, -35.468183 ], [ 138.341253, -35.392864 ], [ 138.441044, -35.349994 ], [ 138.447529, -35.320045 ], [ 138.443202, -35.272135 ], [ 138.459911, -35.261545 ], [ 138.469930, -35.239157 ], [ 138.469061, -35.109436 ], [ 138.493568, -35.084609 ], [ 138.517614, -35.032130 ], [ 138.510356, -34.969695 ], [ 138.476060, -34.856766 ], [ 138.490256, -34.810966 ], [ 138.477997, -34.782940 ], [ 138.496325, -34.764612 ], [ 138.515343, -34.770168 ], [ 138.511546, -34.818085 ], [ 138.500217, -34.843571 ] ] ], [ [ [ 138.546309, -34.799042 ], [ 138.518591, -34.805594 ], [ 138.522502, -34.769668 ], [ 138.514615, -34.756904 ], [ 138.546309, -34.799042 ] ] ], [ [ [ 138.544072, -34.805970 ], [ 138.524303, -34.810078 ], [ 138.537721, -34.801407 ], [ 138.544072, -34.805970 ] ] ], [ [ [ 138.134901, -35.841399 ], [ 138.110893, -35.848409 ], [ 138.040822, -35.904274 ], [ 137.911134, -35.859789 ], [ 137.874263, -35.870569 ], [ 137.856083, -35.859755 ], [ 137.803232, -35.850616 ], [ 137.741097, -35.853115 ], [ 137.726115, -35.876742 ], [ 137.660289, -35.884899 ], [ 137.611978, -35.913111 ], [ 137.598172, -35.942693 ], [ 137.605102, -35.964858 ], [ 137.620444, -35.978592 ], [ 137.602643, -36.009290 ], [ 137.586640, -36.019559 ], [ 137.535973, -36.025864 ], [ 137.504002, -36.055873 ], [ 137.485394, -36.057029 ], [ 137.482780, -36.065675 ], [ 137.460723, -36.074971 ], [ 137.420237, -36.041416 ], [ 137.405605, -36.038791 ], [ 137.406806, -36.032412 ], [ 137.379444, -36.013892 ], [ 137.371018, -35.998416 ], [ 137.278364, -35.994258 ], [ 137.257945, -35.982221 ], [ 137.209490, -35.973988 ], [ 137.180849, -35.983985 ], [ 137.179962, -35.993958 ], [ 137.189772, -35.997078 ], [ 137.161316, -36.016479 ], [ 137.162682, -36.024739 ], [ 137.145803, -36.020706 ], [ 137.130947, -36.033985 ], [ 137.102588, -36.018171 ], [ 137.092381, -36.025105 ], [ 137.057620, -36.020100 ], [ 137.036082, -36.027651 ], [ 136.997279, -36.017338 ], [ 136.942162, -36.026688 ], [ 136.915453, -36.043576 ], [ 136.854045, -36.016575 ], [ 136.831686, -36.019765 ], [ 136.816740, -36.038845 ], [ 136.781837, -36.031408 ], [ 136.774976, -36.043631 ], [ 136.757990, -36.049731 ], [ 136.727088, -36.045071 ], [ 136.705236, -36.064064 ], [ 136.696256, -36.054659 ], [ 136.705634, -36.051282 ], [ 136.708435, -36.036926 ], [ 136.665620, -35.975745 ], [ 136.625028, -35.954423 ], [ 136.598350, -35.961762 ], [ 136.581743, -35.950849 ], [ 136.579779, -35.930728 ], [ 136.550767, -35.901930 ], [ 136.538853, -35.899329 ], [ 136.550604, -35.885701 ], [ 136.534410, -35.886475 ], [ 136.532942, -35.876557 ], [ 136.541723, -35.858230 ], [ 136.563908, -35.849535 ], [ 136.560478, -35.828319 ], [ 136.579361, -35.792374 ], [ 136.573788, -35.765890 ], [ 136.587436, -35.748857 ], [ 136.697258, -35.739468 ], [ 136.720292, -35.720286 ], [ 136.758786, -35.722716 ], [ 136.778416, -35.712210 ], [ 136.783664, -35.700213 ], [ 136.861710, -35.693844 ], [ 136.952722, -35.674107 ], [ 137.069652, -35.669155 ], [ 137.121780, -35.651733 ], [ 137.141189, -35.629762 ], [ 137.163470, -35.633111 ], [ 137.184955, -35.621209 ], [ 137.203466, -35.624715 ], [ 137.239456, -35.604191 ], [ 137.285143, -35.598036 ], [ 137.313489, -35.579240 ], [ 137.446932, -35.596223 ], [ 137.490998, -35.579767 ], [ 137.518809, -35.595531 ], [ 137.545784, -35.587221 ], [ 137.564368, -35.571125 ], [ 137.591737, -35.564088 ], [ 137.605438, -35.571510 ], [ 137.621661, -35.561188 ], [ 137.634199, -35.565733 ], [ 137.626677, -35.597161 ], [ 137.615658, -35.589155 ], [ 137.598203, -35.595276 ], [ 137.569625, -35.618675 ], [ 137.569756, -35.632430 ], [ 137.589341, -35.643213 ], [ 137.641217, -35.638891 ], [ 137.643690, -35.654125 ], [ 137.605689, -35.678765 ], [ 137.603349, -35.692678 ], [ 137.579197, -35.709027 ], [ 137.577915, -35.725671 ], [ 137.596038, -35.735349 ], [ 137.626884, -35.731666 ], [ 137.696260, -35.739791 ], [ 137.780334, -35.723932 ], [ 137.803452, -35.757605 ], [ 137.771947, -35.780922 ], [ 137.772751, -35.788005 ], [ 137.746078, -35.800946 ], [ 137.754379, -35.842984 ], [ 137.762208, -35.838863 ], [ 137.754157, -35.833933 ], [ 137.772401, -35.822796 ], [ 137.796662, -35.834287 ], [ 137.814758, -35.822033 ], [ 137.798297, -35.810204 ], [ 137.770736, -35.814085 ], [ 137.758373, -35.806042 ], [ 137.762804, -35.798023 ], [ 137.778092, -35.796203 ], [ 137.777351, -35.784445 ], [ 137.822554, -35.800182 ], [ 137.852159, -35.794950 ], [ 137.892535, -35.757945 ], [ 137.893642, -35.728166 ], [ 137.900608, -35.719757 ], [ 137.940728, -35.716206 ], [ 138.005581, -35.726301 ], [ 138.045983, -35.742821 ], [ 138.067790, -35.759784 ], [ 138.066857, -35.780365 ], [ 138.076950, -35.795898 ], [ 138.106517, -35.809476 ], [ 138.125725, -35.802350 ], [ 138.119071, -35.819876 ], [ 138.123264, -35.834240 ], [ 138.134901, -35.841399 ] ] ], [ [ [ 137.381767, -34.497301 ], [ 137.371478, -34.505908 ], [ 137.365230, -34.529483 ], [ 137.351512, -34.534103 ], [ 137.340983, -34.526330 ], [ 137.338346, -34.488509 ], [ 137.361392, -34.462878 ], [ 137.374861, -34.468847 ], [ 137.381767, -34.497301 ] ] ], [ [ [ 136.867216, -35.371310 ], [ 136.858413, -35.378187 ], [ 136.854350, -35.371055 ], [ 136.860653, -35.365574 ], [ 136.867216, -35.371310 ] ] ], [ [ [ 136.494692, -35.166527 ], [ 136.489641, -35.176526 ], [ 136.468701, -35.163436 ], [ 136.453071, -35.166073 ], [ 136.441521, -35.148699 ], [ 136.453826, -35.144714 ], [ 136.453584, -35.134301 ], [ 136.494692, -35.166527 ] ] ], [ [ [ 136.359072, -34.663679 ], [ 136.345884, -34.671253 ], [ 136.344484, -34.682606 ], [ 136.329893, -34.658364 ], [ 136.344605, -34.650539 ], [ 136.359072, -34.663679 ] ] ], [ [ [ 136.305585, -34.505339 ], [ 136.284472, -34.515536 ], [ 136.287571, -34.530193 ], [ 136.278582, -34.537655 ], [ 136.286523, -34.545408 ], [ 136.274889, -34.549303 ], [ 136.270571, -34.542143 ], [ 136.279936, -34.503890 ], [ 136.305585, -34.505339 ] ] ], [ [ [ 136.279752, -34.681504 ], [ 136.269174, -34.683330 ], [ 136.266890, -34.673204 ], [ 136.279752, -34.681504 ] ] ], [ [ [ 136.204543, -35.052982 ], [ 136.200019, -35.065410 ], [ 136.189400, -35.052299 ], [ 136.176914, -35.061493 ], [ 136.163326, -35.055160 ], [ 136.146785, -35.026593 ], [ 136.159193, -35.020844 ], [ 136.156605, -35.006405 ], [ 136.111885, -34.977026 ], [ 136.109902, -34.968740 ], [ 136.084155, -34.966901 ], [ 136.089183, -34.956008 ], [ 136.078739, -34.952161 ], [ 136.082766, -34.945430 ], [ 136.107292, -34.932450 ], [ 136.129531, -34.952374 ], [ 136.149943, -34.987895 ], [ 136.176086, -35.005754 ], [ 136.189708, -35.004449 ], [ 136.192501, -35.044324 ], [ 136.204543, -35.052982 ] ] ], [ [ [ 136.185876, -34.646672 ], [ 136.180123, -34.647575 ], [ 136.181304, -34.640457 ], [ 136.185876, -34.646672 ] ] ], [ [ [ 136.073126, -35.227388 ], [ 136.071020, -35.238131 ], [ 136.055516, -35.235491 ], [ 136.063705, -35.222945 ], [ 136.073126, -35.227388 ] ] ], [ [ [ 136.069945, -34.962707 ], [ 136.050632, -34.968220 ], [ 136.059975, -34.957347 ], [ 136.069945, -34.962707 ] ] ], [ [ [ 136.038216, -34.907363 ], [ 136.027948, -34.916969 ], [ 136.032156, -34.905921 ], [ 136.038216, -34.907363 ] ] ], [ [ [ 136.014585, -34.882591 ], [ 136.010196, -34.891351 ], [ 136.000885, -34.880386 ], [ 136.008219, -34.865101 ], [ 136.014585, -34.882591 ] ] ], [ [ [ 135.983063, -35.033605 ], [ 135.974090, -35.037425 ], [ 135.965616, -35.022049 ], [ 135.974324, -35.027879 ], [ 135.978900, -35.019936 ], [ 135.983063, -35.033605 ] ] ], [ [ [ 135.960402, -34.583104 ], [ 135.952445, -34.593633 ], [ 135.946140, -34.568367 ], [ 135.955741, -34.569560 ], [ 135.960402, -34.583104 ] ] ], [ [ [ 135.953064, -34.723721 ], [ 135.937263, -34.719738 ], [ 135.929026, -34.732851 ], [ 135.923401, -34.701869 ], [ 135.911382, -34.695469 ], [ 135.916855, -34.673059 ], [ 135.921373, -34.683079 ], [ 135.938574, -34.687447 ], [ 135.939865, -34.711598 ], [ 135.953064, -34.723721 ] ] ], [ [ [ 135.626345, -34.982111 ], [ 135.617531, -35.001798 ], [ 135.617360, -34.980197 ], [ 135.626345, -34.982111 ] ] ], [ [ [ 134.813029, -33.594219 ], [ 134.806786, -33.610433 ], [ 134.776026, -33.595175 ], [ 134.813029, -33.594219 ] ] ], [ [ [ 134.681803, -33.208100 ], [ 134.676802, -33.216999 ], [ 134.666412, -33.214363 ], [ 134.670760, -33.202427 ], [ 134.681803, -33.208100 ] ] ], [ [ [ 134.547689, -33.721441 ], [ 134.506727, -33.723013 ], [ 134.496082, -33.745812 ], [ 134.446961, -33.772204 ], [ 134.458137, -33.750746 ], [ 134.453848, -33.740567 ], [ 134.467848, -33.733433 ], [ 134.471997, -33.690427 ], [ 134.483397, -33.694013 ], [ 134.527562, -33.677685 ], [ 134.537786, -33.712614 ], [ 134.547689, -33.721441 ] ] ], [ [ [ 134.279578, -32.679966 ], [ 134.259737, -32.678381 ], [ 134.274970, -32.674265 ], [ 134.279578, -32.679966 ] ] ], [ [ [ 133.857514, -32.387369 ], [ 133.788077, -32.358797 ], [ 133.814528, -32.355451 ], [ 133.806843, -32.358759 ], [ 133.840764, -32.371959 ], [ 133.857514, -32.387369 ] ] ], [ [ [ 133.835456, -32.359889 ], [ 133.816229, -32.354720 ], [ 133.829955, -32.352285 ], [ 133.835456, -32.359889 ] ] ], [ [ [ 133.683520, -32.440256 ], [ 133.657781, -32.454898 ], [ 133.669125, -32.436420 ], [ 133.683520, -32.440256 ] ] ], [ [ [ 133.673997, -32.232494 ], [ 133.644302, -32.237600 ], [ 133.614344, -32.256815 ], [ 133.615093, -32.270341 ], [ 133.628394, -32.271360 ], [ 133.611962, -32.282841 ], [ 133.600296, -32.307921 ], [ 133.580315, -32.306581 ], [ 133.572989, -32.319107 ], [ 133.549729, -32.308098 ], [ 133.540236, -32.279000 ], [ 133.551372, -32.273134 ], [ 133.550914, -32.263677 ], [ 133.567216, -32.266873 ], [ 133.593579, -32.251043 ], [ 133.575415, -32.264464 ], [ 133.581729, -32.268444 ], [ 133.623823, -32.239292 ], [ 133.673997, -32.232494 ] ] ], [ [ [ 133.654949, -32.451097 ], [ 133.639648, -32.463219 ], [ 133.625508, -32.457157 ], [ 133.634055, -32.449993 ], [ 133.654949, -32.451097 ] ] ], [ [ [ 133.530727, -32.304603 ], [ 133.501381, -32.318356 ], [ 133.513051, -32.302166 ], [ 133.530727, -32.304603 ] ] ], [ [ [ 133.487081, -32.371099 ], [ 133.483864, -32.382613 ], [ 133.475630, -32.381062 ], [ 133.477016, -32.370624 ], [ 133.487081, -32.371099 ] ] ], [ [ [ 133.381916, -32.394907 ], [ 133.366691, -32.402932 ], [ 133.367743, -32.393433 ], [ 133.381916, -32.394907 ] ] ], [ [ [ 133.311036, -32.510125 ], [ 133.304489, -32.521998 ], [ 133.287616, -32.528476 ], [ 133.287642, -32.517276 ], [ 133.277379, -32.517608 ], [ 133.283384, -32.511092 ], [ 133.267768, -32.500490 ], [ 133.288553, -32.490551 ], [ 133.292226, -32.502113 ], [ 133.310109, -32.499284 ], [ 133.311036, -32.510125 ] ] ], [ [ [ 133.298957, -32.557689 ], [ 133.291466, -32.567595 ], [ 133.275341, -32.565373 ], [ 133.286040, -32.564128 ], [ 133.283701, -32.554077 ], [ 133.298957, -32.557689 ] ] ], [ [ [ 133.289921, -32.585392 ], [ 133.276318, -32.584805 ], [ 133.284988, -32.578711 ], [ 133.289921, -32.585392 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 4, + "properties": { + "STATE_CODE": "5", + "STATE_NAME": "Western Australia" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 113.394175, -26.393030 ], [ 113.382303, -26.385244 ], [ 113.382563, -26.360994 ], [ 113.370693, -26.357564 ], [ 113.354662, -26.300853 ], [ 113.336382, -26.300353 ], [ 113.354172, -26.276373 ], [ 113.357451, -26.245352 ], [ 113.366341, -26.237572 ], [ 113.364601, -26.210722 ], [ 113.375871, -26.205202 ], [ 113.386501, -26.212652 ], [ 113.378510, -26.165042 ], [ 113.380540, -26.119591 ], [ 113.387300, -26.111471 ], [ 113.373429, -26.097131 ], [ 113.377939, -26.078641 ], [ 113.358699, -26.065091 ], [ 113.367579, -26.054151 ], [ 113.356979, -26.033270 ], [ 113.363739, -26.017480 ], [ 113.386319, -26.060820 ], [ 113.385559, -26.092181 ], [ 113.400300, -26.105721 ], [ 113.396720, -26.113951 ], [ 113.429170, -26.138551 ], [ 113.424420, -26.161001 ], [ 113.436930, -26.167541 ], [ 113.444680, -26.163261 ], [ 113.448311, -26.212552 ], [ 113.459571, -26.221802 ], [ 113.462211, -26.253382 ], [ 113.479871, -26.271092 ], [ 113.482772, -26.320722 ], [ 113.498812, -26.336053 ], [ 113.487802, -26.357043 ], [ 113.506592, -26.363913 ], [ 113.502232, -26.400233 ], [ 113.496452, -26.378133 ], [ 113.484682, -26.383553 ], [ 113.502253, -26.420313 ], [ 113.485333, -26.430584 ], [ 113.476963, -26.477054 ], [ 113.486493, -26.484834 ], [ 113.503293, -26.468814 ], [ 113.506003, -26.409143 ], [ 113.528272, -26.362212 ], [ 113.512462, -26.336502 ], [ 113.515962, -26.322062 ], [ 113.507072, -26.323982 ], [ 113.493912, -26.310342 ], [ 113.513692, -26.302102 ], [ 113.518311, -26.284501 ], [ 113.511541, -26.276831 ], [ 113.530451, -26.284381 ], [ 113.537211, -26.279520 ], [ 113.545491, -26.302750 ], [ 113.540512, -26.324751 ], [ 113.559482, -26.353482 ], [ 113.548712, -26.380912 ], [ 113.567072, -26.433343 ], [ 113.561713, -26.461323 ], [ 113.552323, -26.469113 ], [ 113.563013, -26.493923 ], [ 113.575554, -26.495823 ], [ 113.577194, -26.504623 ], [ 113.559825, -26.547154 ], [ 113.558225, -26.574004 ], [ 113.571785, -26.578164 ], [ 113.583745, -26.600184 ], [ 113.596295, -26.601934 ], [ 113.598086, -26.614194 ], [ 113.607105, -26.606204 ], [ 113.588235, -26.585584 ], [ 113.589205, -26.560214 ], [ 113.599215, -26.544634 ], [ 113.593394, -26.511933 ], [ 113.609824, -26.514733 ], [ 113.614084, -26.489423 ], [ 113.618465, -26.518418 ], [ 113.618064, -26.489683 ], [ 113.630553, -26.463272 ], [ 113.638153, -26.502853 ], [ 113.628695, -26.540193 ], [ 113.633505, -26.563643 ], [ 113.625615, -26.571213 ], [ 113.642026, -26.619454 ], [ 113.653905, -26.594623 ], [ 113.663695, -26.596193 ], [ 113.657086, -26.616164 ], [ 113.666416, -26.630354 ], [ 113.657807, -26.654165 ], [ 113.664009, -26.674456 ], [ 113.680928, -26.658415 ], [ 113.704918, -26.662085 ], [ 113.688937, -26.649034 ], [ 113.699957, -26.639314 ], [ 113.697557, -26.632554 ], [ 113.690737, -26.643904 ], [ 113.686397, -26.637874 ], [ 113.696146, -26.619244 ], [ 113.686806, -26.601673 ], [ 113.697006, -26.611464 ], [ 113.714186, -26.606803 ], [ 113.738446, -26.617583 ], [ 113.769357, -26.587282 ], [ 113.787617, -26.605053 ], [ 113.807717, -26.610972 ], [ 113.814227, -26.603852 ], [ 113.812366, -26.576002 ], [ 113.833105, -26.551251 ], [ 113.863654, -26.536721 ], [ 113.882864, -26.508470 ], [ 113.887384, -26.449700 ], [ 113.870232, -26.391340 ], [ 113.885442, -26.371449 ], [ 113.880661, -26.335378 ], [ 113.836641, -26.280818 ], [ 113.797750, -26.252269 ], [ 113.688050, -26.217539 ], [ 113.687479, -26.186189 ], [ 113.663129, -26.165389 ], [ 113.639458, -26.121969 ], [ 113.614819, -26.108689 ], [ 113.620809, -26.100899 ], [ 113.580300, -26.097219 ], [ 113.573540, -26.086279 ], [ 113.585899, -26.071049 ], [ 113.580019, -26.071839 ], [ 113.567249, -26.044329 ], [ 113.575338, -26.014548 ], [ 113.560576, -25.998749 ], [ 113.559108, -25.946398 ], [ 113.517617, -25.919578 ], [ 113.525307, -25.884177 ], [ 113.512917, -25.852117 ], [ 113.461056, -25.809357 ], [ 113.478696, -25.783337 ], [ 113.466285, -25.768077 ], [ 113.479255, -25.764046 ], [ 113.460525, -25.733766 ], [ 113.462295, -25.725766 ], [ 113.473245, -25.730526 ], [ 113.471405, -25.720146 ], [ 113.459465, -25.715606 ], [ 113.472435, -25.709316 ], [ 113.458624, -25.702856 ], [ 113.444665, -25.709476 ], [ 113.456855, -25.713116 ], [ 113.446485, -25.723016 ], [ 113.460265, -25.739746 ], [ 113.459475, -25.752606 ], [ 113.449625, -25.756417 ], [ 113.464335, -25.751146 ], [ 113.454205, -25.764887 ], [ 113.467135, -25.773837 ], [ 113.469346, -25.785457 ], [ 113.414475, -25.724737 ], [ 113.415234, -25.683786 ], [ 113.431983, -25.625725 ], [ 113.449083, -25.610885 ], [ 113.472752, -25.558264 ], [ 113.488952, -25.547814 ], [ 113.499732, -25.513773 ], [ 113.511082, -25.503303 ], [ 113.525233, -25.607794 ], [ 113.537754, -25.625765 ], [ 113.558634, -25.635505 ], [ 113.574684, -25.636894 ], [ 113.581314, -25.620774 ], [ 113.592765, -25.683625 ], [ 113.606655, -25.714325 ], [ 113.626415, -25.733535 ], [ 113.659025, -25.748575 ], [ 113.691116, -25.789215 ], [ 113.721766, -25.793645 ], [ 113.721717, -25.868086 ], [ 113.761857, -25.878595 ], [ 113.758477, -25.905095 ], [ 113.731638, -25.949526 ], [ 113.729936, -26.001947 ], [ 113.738917, -25.999667 ], [ 113.734327, -26.013658 ], [ 113.699924, -26.044962 ], [ 113.706085, -26.061982 ], [ 113.703642, -26.096375 ], [ 113.706197, -26.112390 ], [ 113.704968, -26.123560 ], [ 113.703554, -26.097609 ], [ 113.701118, -26.131910 ], [ 113.728259, -26.187239 ], [ 113.724900, -26.194689 ], [ 113.703210, -26.199769 ], [ 113.721020, -26.196729 ], [ 113.728180, -26.206749 ], [ 113.742320, -26.206839 ], [ 113.752800, -26.197909 ], [ 113.753519, -26.185049 ], [ 113.762220, -26.212209 ], [ 113.773990, -26.214889 ], [ 113.789980, -26.207408 ], [ 113.813279, -26.178818 ], [ 113.836409, -26.140187 ], [ 113.835199, -26.115607 ], [ 113.845569, -26.113657 ], [ 113.836329, -26.116727 ], [ 113.837649, -26.138657 ], [ 113.883738, -26.060216 ], [ 113.879018, -26.068116 ], [ 113.885248, -26.029306 ], [ 113.865247, -25.955965 ], [ 113.877217, -25.945125 ], [ 113.887457, -25.959105 ], [ 113.906417, -25.960115 ], [ 113.914427, -25.982435 ], [ 113.902487, -25.998745 ], [ 113.893518, -26.035146 ], [ 113.908458, -26.054496 ], [ 113.904588, -26.088906 ], [ 113.910849, -26.122376 ], [ 113.924519, -26.133386 ], [ 113.938879, -26.129846 ], [ 113.947559, -26.143006 ], [ 113.934310, -26.203947 ], [ 113.959511, -26.244227 ], [ 113.950481, -26.267597 ], [ 113.967251, -26.293926 ], [ 113.972862, -26.342507 ], [ 114.053862, -26.419217 ], [ 114.082562, -26.454547 ], [ 114.074362, -26.451227 ], [ 114.075132, -26.459277 ], [ 114.072592, -26.452337 ], [ 114.076792, -26.466587 ], [ 114.089562, -26.467617 ], [ 114.094812, -26.459327 ], [ 114.089562, -26.458487 ], [ 114.156462, -26.410107 ], [ 114.166352, -26.390016 ], [ 114.210282, -26.372056 ], [ 114.219851, -26.357256 ], [ 114.215901, -26.341546 ], [ 114.237651, -26.312765 ], [ 114.231651, -26.300875 ], [ 114.237980, -26.283905 ], [ 114.204030, -26.244795 ], [ 114.205530, -26.224064 ], [ 114.191890, -26.203644 ], [ 114.188290, -26.180263 ], [ 114.191179, -26.168333 ], [ 114.210679, -26.157803 ], [ 114.223509, -26.119022 ], [ 114.230689, -26.124612 ], [ 114.219899, -26.139513 ], [ 114.225349, -26.165043 ], [ 114.241339, -26.165863 ], [ 114.254709, -26.144892 ], [ 114.236019, -26.117782 ], [ 114.239278, -26.072702 ], [ 114.209147, -26.031612 ], [ 114.194667, -25.983571 ], [ 114.218447, -25.968891 ], [ 114.225667, -25.973651 ], [ 114.223607, -25.987401 ], [ 114.245047, -25.992551 ], [ 114.265307, -25.982131 ], [ 114.257567, -25.983341 ], [ 114.252867, -25.972951 ], [ 114.247036, -25.936501 ], [ 114.266835, -25.887740 ], [ 114.232095, -25.875670 ], [ 114.227045, -25.862000 ], [ 114.205395, -25.853020 ], [ 114.198745, -25.835630 ], [ 114.167955, -25.811270 ], [ 114.175545, -25.812650 ], [ 114.172095, -25.806440 ], [ 114.134484, -25.778099 ], [ 114.132524, -25.772338 ], [ 114.146304, -25.780169 ], [ 114.119404, -25.755256 ], [ 114.114114, -25.743165 ], [ 114.122245, -25.735975 ], [ 114.113586, -25.725455 ], [ 114.119555, -25.728185 ], [ 114.091091, -25.696372 ], [ 114.035389, -25.662525 ], [ 114.048427, -25.667324 ], [ 114.019199, -25.624117 ], [ 114.019650, -25.632347 ], [ 114.004183, -25.618519 ], [ 114.015360, -25.620488 ], [ 113.990189, -25.589920 ], [ 113.982191, -25.560829 ], [ 113.991660, -25.575140 ], [ 113.991640, -25.564880 ], [ 113.954523, -25.493408 ], [ 113.934010, -25.475488 ], [ 113.939220, -25.470638 ], [ 113.939731, -25.480228 ], [ 113.941210, -25.473228 ], [ 113.948421, -25.477168 ], [ 113.944179, -25.458678 ], [ 113.902050, -25.410088 ], [ 113.913600, -25.413468 ], [ 113.908130, -25.406708 ], [ 113.913840, -25.400948 ], [ 113.891109, -25.372988 ], [ 113.896689, -25.357417 ], [ 113.891339, -25.337007 ], [ 113.856719, -25.292457 ], [ 113.868629, -25.299337 ], [ 113.864909, -25.287607 ], [ 113.871479, -25.290317 ], [ 113.842578, -25.264597 ], [ 113.842088, -25.255907 ], [ 113.848158, -25.256927 ], [ 113.839617, -25.216997 ], [ 113.817067, -25.173566 ], [ 113.802207, -25.157316 ], [ 113.739897, -25.127367 ], [ 113.712426, -25.103316 ], [ 113.665985, -25.022706 ], [ 113.664234, -24.958656 ], [ 113.679944, -24.932985 ], [ 113.691924, -24.928535 ], [ 113.677804, -24.924985 ], [ 113.665146, -24.895891 ], [ 113.652354, -24.905115 ], [ 113.651491, -24.897891 ], [ 113.655190, -24.882163 ], [ 113.644444, -24.878065 ], [ 113.666133, -24.861964 ], [ 113.706889, -24.850707 ], [ 113.676463, -24.848724 ], [ 113.646983, -24.864515 ], [ 113.617533, -24.858645 ], [ 113.615863, -24.844545 ], [ 113.620883, -24.831784 ], [ 113.620213, -24.849725 ], [ 113.632723, -24.797444 ], [ 113.623242, -24.746034 ], [ 113.489939, -24.575957 ], [ 113.427619, -24.515616 ], [ 113.419178, -24.491706 ], [ 113.406958, -24.484176 ], [ 113.399528, -24.411406 ], [ 113.406196, -24.303065 ], [ 113.390165, -24.223995 ], [ 113.409115, -24.223505 ], [ 113.443343, -24.181694 ], [ 113.442382, -24.136784 ], [ 113.419422, -24.090333 ], [ 113.428122, -24.080733 ], [ 113.422151, -24.042933 ], [ 113.429991, -24.032653 ], [ 113.446941, -24.032173 ], [ 113.458700, -24.013642 ], [ 113.470909, -23.966452 ], [ 113.464999, -23.925572 ], [ 113.470308, -23.898561 ], [ 113.513827, -23.847330 ], [ 113.520177, -23.797639 ], [ 113.531906, -23.774839 ], [ 113.567276, -23.752229 ], [ 113.591695, -23.698938 ], [ 113.596614, -23.663358 ], [ 113.614153, -23.646688 ], [ 113.613213, -23.630908 ], [ 113.636191, -23.618921 ], [ 113.650858, -23.599586 ], [ 113.700470, -23.575201 ], [ 113.725870, -23.545007 ], [ 113.753260, -23.528236 ], [ 113.778119, -23.478055 ], [ 113.783468, -23.416074 ], [ 113.776938, -23.378934 ], [ 113.788108, -23.365153 ], [ 113.794447, -23.296052 ], [ 113.770376, -23.217841 ], [ 113.774436, -23.194561 ], [ 113.763826, -23.177771 ], [ 113.770855, -23.130650 ], [ 113.760475, -23.121300 ], [ 113.789665, -23.106740 ], [ 113.812495, -23.082769 ], [ 113.829426, -23.030908 ], [ 113.829485, -22.994887 ], [ 113.819755, -22.977056 ], [ 113.826185, -22.956016 ], [ 113.816655, -22.906935 ], [ 113.801184, -22.886805 ], [ 113.793804, -22.842664 ], [ 113.755254, -22.756224 ], [ 113.709393, -22.715284 ], [ 113.677123, -22.723044 ], [ 113.670493, -22.717134 ], [ 113.686423, -22.664414 ], [ 113.668262, -22.628723 ], [ 113.673612, -22.596863 ], [ 113.654082, -22.578773 ], [ 113.665302, -22.550123 ], [ 113.693132, -22.540952 ], [ 113.713761, -22.517962 ], [ 113.707921, -22.496702 ], [ 113.722981, -22.496212 ], [ 113.737741, -22.471031 ], [ 113.749380, -22.408421 ], [ 113.765470, -22.384350 ], [ 113.780310, -22.376760 ], [ 113.820809, -22.305849 ], [ 113.866887, -22.151067 ], [ 113.933246, -21.998885 ], [ 113.933596, -21.973225 ], [ 113.963945, -21.938004 ], [ 113.995084, -21.875463 ], [ 114.023922, -21.851153 ], [ 114.072079, -21.827572 ], [ 114.078749, -21.815962 ], [ 114.108020, -21.803272 ], [ 114.131572, -21.805571 ], [ 114.165205, -21.785761 ], [ 114.191014, -21.814581 ], [ 114.148873, -21.866652 ], [ 114.138063, -21.957822 ], [ 114.080266, -22.154135 ], [ 114.084757, -22.191275 ], [ 114.133007, -22.261584 ], [ 114.123738, -22.279275 ], [ 114.126418, -22.313925 ], [ 114.117078, -22.314915 ], [ 114.115818, -22.331156 ], [ 114.149498, -22.301463 ], [ 114.178468, -22.305374 ], [ 114.178218, -22.353442 ], [ 114.135518, -22.393165 ], [ 114.140118, -22.398025 ], [ 114.129918, -22.399916 ], [ 114.147038, -22.396805 ], [ 114.140929, -22.409195 ], [ 114.128189, -22.407806 ], [ 114.122099, -22.415806 ], [ 114.128329, -22.441656 ], [ 114.121799, -22.472668 ], [ 114.138590, -22.497539 ], [ 114.135628, -22.500663 ], [ 114.143910, -22.506699 ], [ 114.143810, -22.538059 ], [ 114.151040, -22.517099 ], [ 114.161800, -22.534049 ], [ 114.160730, -22.523779 ], [ 114.188800, -22.520809 ], [ 114.218610, -22.497188 ], [ 114.216210, -22.486008 ], [ 114.230690, -22.473288 ], [ 114.225630, -22.457368 ], [ 114.241170, -22.459207 ], [ 114.282370, -22.433786 ], [ 114.317440, -22.440617 ], [ 114.322790, -22.503707 ], [ 114.324040, -22.479567 ], [ 114.327180, -22.489727 ], [ 114.338960, -22.492117 ], [ 114.340320, -22.516307 ], [ 114.345030, -22.490207 ], [ 114.354850, -22.500606 ], [ 114.357650, -22.494287 ], [ 114.358740, -22.503896 ], [ 114.362760, -22.492827 ], [ 114.367850, -22.500166 ], [ 114.377080, -22.498146 ], [ 114.364580, -22.490347 ], [ 114.383770, -22.490786 ], [ 114.372610, -22.483027 ], [ 114.386080, -22.484616 ], [ 114.377110, -22.476147 ], [ 114.383560, -22.464757 ], [ 114.403830, -22.469407 ], [ 114.390000, -22.461037 ], [ 114.380310, -22.441277 ], [ 114.392980, -22.446257 ], [ 114.391730, -22.439037 ], [ 114.405300, -22.438947 ], [ 114.386270, -22.434067 ], [ 114.386040, -22.426617 ], [ 114.407880, -22.429237 ], [ 114.392360, -22.421547 ], [ 114.390439, -22.402587 ], [ 114.402089, -22.403047 ], [ 114.394809, -22.401687 ], [ 114.393369, -22.390967 ], [ 114.423330, -22.395737 ], [ 114.396409, -22.382957 ], [ 114.401290, -22.359597 ], [ 114.408706, -22.361450 ], [ 114.407000, -22.350917 ], [ 114.423020, -22.351497 ], [ 114.440830, -22.367537 ], [ 114.445690, -22.363706 ], [ 114.436600, -22.357147 ], [ 114.451640, -22.362576 ], [ 114.430900, -22.351727 ], [ 114.443280, -22.342937 ], [ 114.423140, -22.345967 ], [ 114.408720, -22.331167 ], [ 114.414680, -22.316167 ], [ 114.426440, -22.319787 ], [ 114.416510, -22.310527 ], [ 114.423059, -22.300597 ], [ 114.439679, -22.303997 ], [ 114.433620, -22.294967 ], [ 114.460880, -22.329296 ], [ 114.449019, -22.300057 ], [ 114.461390, -22.292616 ], [ 114.437260, -22.289326 ], [ 114.429760, -22.275436 ], [ 114.439830, -22.264945 ], [ 114.460930, -22.271896 ], [ 114.450380, -22.259655 ], [ 114.472570, -22.264406 ], [ 114.448690, -22.253554 ], [ 114.443970, -22.242045 ], [ 114.454045, -22.244557 ], [ 114.451370, -22.238325 ], [ 114.463731, -22.244985 ], [ 114.458602, -22.245694 ], [ 114.481870, -22.251497 ], [ 114.452220, -22.235045 ], [ 114.453200, -22.207968 ], [ 114.469320, -22.217947 ], [ 114.466420, -22.204248 ], [ 114.478420, -22.204818 ], [ 114.488990, -22.219118 ], [ 114.500461, -22.220498 ], [ 114.471760, -22.190368 ], [ 114.481568, -22.188030 ], [ 114.453600, -22.166098 ], [ 114.455660, -22.159548 ], [ 114.489460, -22.157647 ], [ 114.490690, -22.171057 ], [ 114.499520, -22.162957 ], [ 114.507990, -22.183507 ], [ 114.500850, -22.150317 ], [ 114.505820, -22.158217 ], [ 114.506910, -22.152916 ], [ 114.514900, -22.156646 ], [ 114.501340, -22.129886 ], [ 114.519389, -22.123235 ], [ 114.526329, -22.141576 ], [ 114.518059, -22.105855 ], [ 114.527749, -22.101794 ], [ 114.531389, -22.095344 ], [ 114.525809, -22.100324 ], [ 114.523149, -22.093434 ], [ 114.535739, -22.078764 ], [ 114.520239, -22.082714 ], [ 114.517339, -22.066464 ], [ 114.542519, -22.060823 ], [ 114.551599, -22.066463 ], [ 114.547849, -22.052133 ], [ 114.558978, -22.020301 ], [ 114.574359, -22.043662 ], [ 114.564189, -22.026842 ], [ 114.575438, -22.015781 ], [ 114.570598, -22.001781 ], [ 114.585028, -21.996880 ], [ 114.589378, -22.019481 ], [ 114.586568, -22.003811 ], [ 114.601358, -21.987720 ], [ 114.605908, -22.006860 ], [ 114.604868, -21.987490 ], [ 114.615748, -21.976190 ], [ 114.612938, -21.961520 ], [ 114.626148, -21.973580 ], [ 114.615218, -21.947629 ], [ 114.637127, -21.944579 ], [ 114.619328, -21.944779 ], [ 114.621497, -21.935879 ], [ 114.639367, -21.917348 ], [ 114.651637, -21.922518 ], [ 114.664297, -21.910538 ], [ 114.647597, -21.919928 ], [ 114.642507, -21.909328 ], [ 114.648076, -21.844517 ], [ 114.675486, -21.827656 ], [ 114.686136, -21.832946 ], [ 114.693166, -21.839366 ], [ 114.685247, -21.867827 ], [ 114.697647, -21.843086 ], [ 114.693386, -21.830816 ], [ 114.683356, -21.828996 ], [ 114.698796, -21.813726 ], [ 114.720886, -21.798786 ], [ 114.778396, -21.790546 ], [ 114.857156, -21.734465 ], [ 114.860906, -21.738045 ], [ 114.858956, -21.732655 ], [ 114.903446, -21.705314 ], [ 114.914256, -21.688344 ], [ 114.936136, -21.690764 ], [ 114.973136, -21.669643 ], [ 114.988376, -21.673993 ], [ 114.972296, -21.670773 ], [ 114.945196, -21.690393 ], [ 114.958346, -21.686173 ], [ 114.962986, -21.692613 ], [ 114.963037, -21.685830 ], [ 114.958696, -21.683693 ], [ 114.966276, -21.677233 ], [ 114.973816, -21.681793 ], [ 114.967966, -21.675413 ], [ 114.974716, -21.671553 ], [ 114.984046, -21.679543 ], [ 115.029006, -21.684683 ], [ 115.016716, -21.692863 ], [ 115.026126, -21.688193 ], [ 115.027846, -21.694883 ], [ 115.029496, -21.686713 ], [ 115.040396, -21.692212 ], [ 115.037106, -21.684883 ], [ 115.043246, -21.682142 ], [ 115.030336, -21.685583 ], [ 115.054706, -21.677582 ], [ 115.055956, -21.686052 ], [ 115.057116, -21.675882 ], [ 115.108956, -21.631741 ], [ 115.131126, -21.644862 ], [ 115.131686, -21.659842 ], [ 115.142186, -21.659042 ], [ 115.132206, -21.644852 ], [ 115.160617, -21.626211 ], [ 115.176586, -21.636612 ], [ 115.161576, -21.625072 ], [ 115.178526, -21.611331 ], [ 115.194926, -21.628312 ], [ 115.193786, -21.620291 ], [ 115.210136, -21.627892 ], [ 115.186866, -21.612421 ], [ 115.211046, -21.597741 ], [ 115.219856, -21.616211 ], [ 115.219776, -21.602551 ], [ 115.234417, -21.596221 ], [ 115.229977, -21.592561 ], [ 115.242317, -21.576801 ], [ 115.252147, -21.585001 ], [ 115.243107, -21.587071 ], [ 115.245947, -21.595891 ], [ 115.244677, -21.588201 ], [ 115.298207, -21.594131 ], [ 115.327218, -21.580300 ], [ 115.328417, -21.583160 ], [ 115.331168, -21.575990 ], [ 115.381689, -21.548140 ], [ 115.399119, -21.556059 ], [ 115.401449, -21.547009 ], [ 115.418299, -21.539879 ], [ 115.414159, -21.534689 ], [ 115.381169, -21.543289 ], [ 115.404719, -21.528238 ], [ 115.416339, -21.532568 ], [ 115.408099, -21.527878 ], [ 115.412909, -21.524798 ], [ 115.433338, -21.529188 ], [ 115.428139, -21.545369 ], [ 115.436598, -21.530188 ], [ 115.435319, -21.542018 ], [ 115.440673, -21.538140 ], [ 115.439559, -21.538188 ], [ 115.438168, -21.529608 ], [ 115.457316, -21.508477 ], [ 115.458668, -21.527558 ], [ 115.443498, -21.532848 ], [ 115.447400, -21.537850 ], [ 115.444495, -21.537976 ], [ 115.446529, -21.543788 ], [ 115.448352, -21.539071 ], [ 115.455690, -21.548478 ], [ 115.456349, -21.539778 ], [ 115.445068, -21.532838 ], [ 115.459058, -21.531058 ], [ 115.463870, -21.547228 ], [ 115.460388, -21.531728 ], [ 115.467747, -21.514737 ], [ 115.476168, -21.527107 ], [ 115.475580, -21.547188 ], [ 115.477278, -21.530037 ], [ 115.491459, -21.537397 ], [ 115.492430, -21.545807 ], [ 115.498209, -21.536058 ], [ 115.493239, -21.534337 ], [ 115.493444, -21.527910 ], [ 115.492399, -21.534347 ], [ 115.480899, -21.530127 ], [ 115.475037, -21.505767 ], [ 115.496198, -21.510937 ], [ 115.495312, -21.516397 ], [ 115.499928, -21.508877 ], [ 115.510698, -21.509527 ], [ 115.510869, -21.524847 ], [ 115.520308, -21.509176 ], [ 115.495158, -21.501457 ], [ 115.491127, -21.495497 ], [ 115.494612, -21.492555 ], [ 115.492557, -21.492437 ], [ 115.492747, -21.485766 ], [ 115.506617, -21.477336 ], [ 115.516477, -21.483476 ], [ 115.528267, -21.464786 ], [ 115.515287, -21.481206 ], [ 115.508427, -21.475996 ], [ 115.526357, -21.459466 ], [ 115.506267, -21.474406 ], [ 115.509716, -21.457936 ], [ 115.516966, -21.454696 ], [ 115.518147, -21.461466 ], [ 115.518576, -21.446576 ], [ 115.549255, -21.434726 ], [ 115.558646, -21.437695 ], [ 115.565447, -21.457255 ], [ 115.561056, -21.438835 ], [ 115.571627, -21.448805 ], [ 115.563346, -21.438955 ], [ 115.572695, -21.427545 ], [ 115.562156, -21.435905 ], [ 115.550914, -21.413065 ], [ 115.583583, -21.384845 ], [ 115.591003, -21.397405 ], [ 115.580864, -21.401885 ], [ 115.585784, -21.406185 ], [ 115.592693, -21.397865 ], [ 115.597464, -21.410855 ], [ 115.593073, -21.391655 ], [ 115.609033, -21.382045 ], [ 115.602163, -21.379385 ], [ 115.595733, -21.389515 ], [ 115.588783, -21.379895 ], [ 115.605012, -21.361104 ], [ 115.617963, -21.377344 ], [ 115.619193, -21.366854 ], [ 115.608763, -21.356264 ], [ 115.621074, -21.351674 ], [ 115.627954, -21.363184 ], [ 115.637415, -21.345554 ], [ 115.627454, -21.354744 ], [ 115.618084, -21.345684 ], [ 115.640326, -21.327134 ], [ 115.652917, -21.346364 ], [ 115.648726, -21.337434 ], [ 115.662207, -21.342214 ], [ 115.649696, -21.336644 ], [ 115.668266, -21.333764 ], [ 115.648386, -21.331674 ], [ 115.652546, -21.315654 ], [ 115.683226, -21.319314 ], [ 115.678946, -21.309984 ], [ 115.703144, -21.279463 ], [ 115.705095, -21.299573 ], [ 115.716284, -21.276673 ], [ 115.719964, -21.288723 ], [ 115.735854, -21.283833 ], [ 115.737974, -21.274923 ], [ 115.744593, -21.278637 ], [ 115.744104, -21.277313 ], [ 115.756344, -21.253863 ], [ 115.752614, -21.284013 ], [ 115.762314, -21.271823 ], [ 115.770344, -21.284603 ], [ 115.761724, -21.268093 ], [ 115.769244, -21.267891 ], [ 115.767424, -21.254113 ], [ 115.783794, -21.256743 ], [ 115.779274, -21.288553 ], [ 115.787864, -21.265673 ], [ 115.794433, -21.262797 ], [ 115.787544, -21.251563 ], [ 115.791894, -21.246493 ], [ 115.804654, -21.245843 ], [ 115.816655, -21.265623 ], [ 115.808864, -21.248903 ], [ 115.831246, -21.251437 ], [ 115.819345, -21.247453 ], [ 115.829245, -21.239803 ], [ 115.830964, -21.225243 ], [ 115.844875, -21.227893 ], [ 115.833533, -21.205602 ], [ 115.850303, -21.191862 ], [ 115.856418, -21.194914 ], [ 115.854553, -21.176072 ], [ 115.869993, -21.157362 ], [ 115.876543, -21.164142 ], [ 115.869043, -21.151712 ], [ 115.877983, -21.135362 ], [ 115.887543, -21.138812 ], [ 115.881502, -21.121142 ], [ 115.893376, -21.117304 ], [ 115.889342, -21.112682 ], [ 115.918152, -21.078751 ], [ 115.925732, -21.077861 ], [ 115.923423, -21.093551 ], [ 115.917776, -21.093008 ], [ 115.923783, -21.095691 ], [ 115.927662, -21.077411 ], [ 115.989382, -21.040109 ], [ 116.069422, -21.017038 ], [ 116.097092, -21.000447 ], [ 116.093712, -21.024268 ], [ 116.105226, -21.037917 ], [ 116.095522, -21.024498 ], [ 116.103222, -21.001127 ], [ 116.130452, -20.997017 ], [ 116.146142, -21.012727 ], [ 116.140302, -20.991917 ], [ 116.164532, -20.968736 ], [ 116.176822, -20.977626 ], [ 116.188102, -20.967896 ], [ 116.189741, -20.901295 ], [ 116.226741, -20.883454 ], [ 116.210131, -20.888494 ], [ 116.214021, -20.879854 ], [ 116.207011, -20.889604 ], [ 116.191030, -20.888425 ], [ 116.204590, -20.833754 ], [ 116.236371, -20.860333 ], [ 116.256172, -20.857773 ], [ 116.241431, -20.865733 ], [ 116.246722, -20.865953 ], [ 116.241341, -20.876574 ], [ 116.252972, -20.866163 ], [ 116.259561, -20.867633 ], [ 116.255571, -20.880183 ], [ 116.272441, -20.868933 ], [ 116.289290, -20.877023 ], [ 116.286000, -20.881323 ], [ 116.297340, -20.877113 ], [ 116.297932, -20.880271 ], [ 116.302630, -20.876313 ], [ 116.329030, -20.868003 ], [ 116.345391, -20.838822 ], [ 116.366911, -20.841922 ], [ 116.399031, -20.822181 ], [ 116.400171, -20.830301 ], [ 116.439771, -20.826671 ], [ 116.453791, -20.844471 ], [ 116.459009, -20.842679 ], [ 116.453162, -20.840171 ], [ 116.442401, -20.824181 ], [ 116.459450, -20.822651 ], [ 116.464803, -20.825627 ], [ 116.466860, -20.814951 ], [ 116.480531, -20.808011 ], [ 116.488152, -20.815441 ], [ 116.483151, -20.804281 ], [ 116.492420, -20.799511 ], [ 116.502271, -20.807821 ], [ 116.500650, -20.798501 ], [ 116.489290, -20.797171 ], [ 116.513780, -20.778531 ], [ 116.527729, -20.782771 ], [ 116.527830, -20.791521 ], [ 116.535647, -20.785559 ], [ 116.513390, -20.771760 ], [ 116.524128, -20.758061 ], [ 116.531508, -20.768751 ], [ 116.535250, -20.767390 ], [ 116.532098, -20.767851 ], [ 116.525909, -20.752861 ], [ 116.549777, -20.748361 ], [ 116.551857, -20.755011 ], [ 116.553368, -20.746431 ], [ 116.578324, -20.741690 ], [ 116.560572, -20.746810 ], [ 116.579184, -20.745190 ], [ 116.583064, -20.751720 ], [ 116.590204, -20.740420 ], [ 116.594494, -20.744670 ], [ 116.587394, -20.752420 ], [ 116.597554, -20.745670 ], [ 116.605204, -20.753820 ], [ 116.591744, -20.734510 ], [ 116.601645, -20.728406 ], [ 116.574794, -20.731100 ], [ 116.590744, -20.717199 ], [ 116.573714, -20.708299 ], [ 116.579034, -20.692129 ], [ 116.593494, -20.684569 ], [ 116.592914, -20.705949 ], [ 116.607454, -20.686469 ], [ 116.628384, -20.683609 ], [ 116.636794, -20.674709 ], [ 116.647994, -20.682339 ], [ 116.602277, -20.728017 ], [ 116.623084, -20.715189 ], [ 116.616084, -20.729109 ], [ 116.624034, -20.734039 ], [ 116.630624, -20.710729 ], [ 116.636114, -20.726199 ], [ 116.629904, -20.732089 ], [ 116.633662, -20.734922 ], [ 116.633634, -20.734839 ], [ 116.639594, -20.725949 ], [ 116.654034, -20.732319 ], [ 116.652501, -20.735413 ], [ 116.662944, -20.733249 ], [ 116.663774, -20.741369 ], [ 116.663514, -20.732049 ], [ 116.642074, -20.721939 ], [ 116.668238, -20.726694 ], [ 116.682624, -20.714229 ], [ 116.684744, -20.723029 ], [ 116.688884, -20.705779 ], [ 116.666704, -20.722209 ], [ 116.656594, -20.717859 ], [ 116.661214, -20.713889 ], [ 116.650224, -20.715859 ], [ 116.666794, -20.711709 ], [ 116.644934, -20.714529 ], [ 116.642474, -20.704719 ], [ 116.668054, -20.684839 ], [ 116.696484, -20.683088 ], [ 116.692134, -20.677608 ], [ 116.721668, -20.646594 ], [ 116.721658, -20.637941 ], [ 116.740594, -20.641238 ], [ 116.765153, -20.633147 ], [ 116.746393, -20.621328 ], [ 116.770663, -20.588797 ], [ 116.780043, -20.583177 ], [ 116.784493, -20.589277 ], [ 116.798162, -20.575437 ], [ 116.778143, -20.576797 ], [ 116.789782, -20.560137 ], [ 116.810581, -20.549857 ], [ 116.815071, -20.539557 ], [ 116.804531, -20.541537 ], [ 116.811161, -20.529187 ], [ 116.867491, -20.526156 ], [ 116.819793, -20.581637 ], [ 116.822893, -20.597997 ], [ 116.819273, -20.606307 ], [ 116.808093, -20.606417 ], [ 116.814903, -20.607177 ], [ 116.812813, -20.614757 ], [ 116.797913, -20.630087 ], [ 116.802423, -20.640447 ], [ 116.787262, -20.665297 ], [ 116.792573, -20.675388 ], [ 116.787843, -20.686928 ], [ 116.797442, -20.667567 ], [ 116.799803, -20.680658 ], [ 116.828193, -20.708718 ], [ 116.898773, -20.724107 ], [ 116.923653, -20.712327 ], [ 116.927533, -20.725087 ], [ 116.919903, -20.740687 ], [ 116.927913, -20.725687 ], [ 116.931653, -20.730926 ], [ 116.927073, -20.720087 ], [ 116.952673, -20.724336 ], [ 116.926423, -20.713207 ], [ 116.956812, -20.701226 ], [ 116.945572, -20.698196 ], [ 116.956322, -20.683326 ], [ 116.965442, -20.683266 ], [ 116.973632, -20.671016 ], [ 116.979252, -20.687446 ], [ 116.979152, -20.671095 ], [ 116.982442, -20.670807 ], [ 116.976262, -20.668966 ], [ 116.990212, -20.658155 ], [ 117.036232, -20.648204 ], [ 117.029502, -20.658244 ], [ 117.038022, -20.659494 ], [ 117.038802, -20.667574 ], [ 117.066372, -20.639543 ], [ 117.084502, -20.636063 ], [ 117.094351, -20.623993 ], [ 117.105332, -20.654783 ], [ 117.128192, -20.654393 ], [ 117.138272, -20.626753 ], [ 117.171421, -20.593562 ], [ 117.182811, -20.592332 ], [ 117.175851, -20.606112 ], [ 117.180651, -20.616122 ], [ 117.191201, -20.613342 ], [ 117.199223, -20.631731 ], [ 117.192972, -20.638582 ], [ 117.176194, -20.632304 ], [ 117.181592, -20.639662 ], [ 117.156852, -20.657153 ], [ 117.181362, -20.645062 ], [ 117.175908, -20.664591 ], [ 117.190092, -20.673322 ], [ 117.189132, -20.665082 ], [ 117.200422, -20.666552 ], [ 117.171942, -20.700593 ], [ 117.182642, -20.691842 ], [ 117.187154, -20.695515 ], [ 117.195172, -20.680332 ], [ 117.214452, -20.705982 ], [ 117.227292, -20.706772 ], [ 117.217282, -20.713322 ], [ 117.216423, -20.724842 ], [ 117.228972, -20.705532 ], [ 117.211932, -20.697732 ], [ 117.223092, -20.695142 ], [ 117.242282, -20.702532 ], [ 117.245012, -20.714202 ], [ 117.244762, -20.704312 ], [ 117.276731, -20.723394 ], [ 117.284682, -20.720252 ], [ 117.283923, -20.735322 ], [ 117.292012, -20.723622 ], [ 117.287933, -20.734912 ], [ 117.299922, -20.726502 ], [ 117.297992, -20.738032 ], [ 117.302672, -20.726802 ], [ 117.347532, -20.735652 ], [ 117.357832, -20.743033 ], [ 117.346672, -20.759303 ], [ 117.340148, -20.759110 ], [ 117.337302, -20.774213 ], [ 117.340472, -20.764283 ], [ 117.349652, -20.763033 ], [ 117.349702, -20.778983 ], [ 117.357872, -20.775772 ], [ 117.350712, -20.771633 ], [ 117.352302, -20.757123 ], [ 117.366722, -20.745742 ], [ 117.362752, -20.734332 ], [ 117.369832, -20.734222 ], [ 117.382811, -20.750712 ], [ 117.377051, -20.758842 ], [ 117.381762, -20.784363 ], [ 117.390151, -20.760982 ], [ 117.397962, -20.771023 ], [ 117.397352, -20.758832 ], [ 117.386081, -20.760442 ], [ 117.388341, -20.752732 ], [ 117.403842, -20.760062 ], [ 117.387441, -20.744782 ], [ 117.395171, -20.730592 ], [ 117.426992, -20.731132 ], [ 117.436492, -20.746492 ], [ 117.429782, -20.758012 ], [ 117.441062, -20.753602 ], [ 117.441422, -20.745352 ], [ 117.457401, -20.757222 ], [ 117.461121, -20.751662 ], [ 117.434562, -20.740502 ], [ 117.442572, -20.730602 ], [ 117.544521, -20.707741 ], [ 117.551302, -20.710321 ], [ 117.552551, -20.704001 ], [ 117.573301, -20.694031 ], [ 117.594911, -20.703641 ], [ 117.585011, -20.694171 ], [ 117.590691, -20.688011 ], [ 117.598871, -20.694771 ], [ 117.589961, -20.679771 ], [ 117.630731, -20.663771 ], [ 117.648330, -20.661990 ], [ 117.618871, -20.678851 ], [ 117.616571, -20.687271 ], [ 117.625961, -20.677101 ], [ 117.641691, -20.677981 ], [ 117.637162, -20.693351 ], [ 117.645072, -20.689441 ], [ 117.646552, -20.702141 ], [ 117.628292, -20.709091 ], [ 117.643982, -20.711651 ], [ 117.651362, -20.703931 ], [ 117.656312, -20.715471 ], [ 117.654322, -20.688911 ], [ 117.667362, -20.672281 ], [ 117.664152, -20.684141 ], [ 117.675362, -20.699031 ], [ 117.666782, -20.679391 ], [ 117.680432, -20.666601 ], [ 117.689442, -20.668720 ], [ 117.686822, -20.677311 ], [ 117.697292, -20.687000 ], [ 117.688182, -20.691541 ], [ 117.700652, -20.686770 ], [ 117.704112, -20.694550 ], [ 117.713972, -20.682220 ], [ 117.736281, -20.678890 ], [ 117.737391, -20.686570 ], [ 117.739281, -20.677640 ], [ 117.746241, -20.682290 ], [ 117.747311, -20.674120 ], [ 117.769461, -20.666080 ], [ 117.770181, -20.676330 ], [ 117.774191, -20.670090 ], [ 117.793421, -20.679300 ], [ 117.809731, -20.674170 ], [ 117.794851, -20.675340 ], [ 117.774281, -20.663540 ], [ 117.782781, -20.654370 ], [ 117.794181, -20.655580 ], [ 117.814141, -20.632140 ], [ 117.854120, -20.606039 ], [ 117.864570, -20.607469 ], [ 117.859369, -20.597439 ], [ 117.867469, -20.581939 ], [ 117.897989, -20.585259 ], [ 117.884729, -20.578269 ], [ 117.891418, -20.573049 ], [ 117.878379, -20.581109 ], [ 117.871029, -20.571759 ], [ 117.881738, -20.551958 ], [ 117.895298, -20.551798 ], [ 117.890138, -20.558178 ], [ 117.903338, -20.553688 ], [ 117.900368, -20.561948 ], [ 117.915899, -20.567298 ], [ 117.912169, -20.576598 ], [ 117.920299, -20.566728 ], [ 117.930279, -20.570878 ], [ 117.914649, -20.562688 ], [ 117.924569, -20.561048 ], [ 117.912258, -20.555528 ], [ 117.919848, -20.543578 ], [ 117.941329, -20.546668 ], [ 117.943769, -20.556818 ], [ 117.934539, -20.558548 ], [ 117.941779, -20.566988 ], [ 117.949509, -20.551828 ], [ 117.945399, -20.546198 ], [ 117.957759, -20.547847 ], [ 117.960229, -20.561958 ], [ 117.959329, -20.549418 ], [ 117.970579, -20.544407 ], [ 117.975049, -20.550487 ], [ 117.972849, -20.541687 ], [ 117.964119, -20.546917 ], [ 117.970969, -20.525207 ], [ 117.959679, -20.546817 ], [ 117.942719, -20.536837 ], [ 117.959189, -20.517007 ], [ 117.948409, -20.519987 ], [ 117.951369, -20.511617 ], [ 117.961689, -20.506646 ], [ 117.949409, -20.510437 ], [ 117.942939, -20.530507 ], [ 117.931528, -20.526597 ], [ 117.942168, -20.510907 ], [ 117.940918, -20.479916 ], [ 117.965299, -20.491116 ], [ 117.952538, -20.479196 ], [ 117.992309, -20.472155 ], [ 118.017779, -20.458715 ], [ 118.050079, -20.422104 ], [ 118.103248, -20.394765 ], [ 118.109758, -20.401053 ], [ 118.110288, -20.387724 ], [ 118.160907, -20.357893 ], [ 118.181566, -20.336413 ], [ 118.196726, -20.337923 ], [ 118.200207, -20.360063 ], [ 118.184787, -20.345573 ], [ 118.172967, -20.350943 ], [ 118.172297, -20.359123 ], [ 118.182097, -20.355983 ], [ 118.175987, -20.354883 ], [ 118.183717, -20.346713 ], [ 118.184127, -20.356003 ], [ 118.199827, -20.368943 ], [ 118.180077, -20.358133 ], [ 118.198227, -20.369453 ], [ 118.169527, -20.368983 ], [ 118.165128, -20.382943 ], [ 118.205457, -20.376413 ], [ 118.196158, -20.403754 ], [ 118.213937, -20.373203 ], [ 118.224707, -20.370553 ], [ 118.215487, -20.370943 ], [ 118.232717, -20.368144 ], [ 118.240166, -20.371944 ], [ 118.235996, -20.375234 ], [ 118.244226, -20.369774 ], [ 118.257216, -20.377723 ], [ 118.257336, -20.358853 ], [ 118.281016, -20.353423 ], [ 118.283496, -20.367413 ], [ 118.297766, -20.351633 ], [ 118.308396, -20.364343 ], [ 118.314806, -20.356053 ], [ 118.318336, -20.365403 ], [ 118.315396, -20.354693 ], [ 118.288766, -20.348633 ], [ 118.346126, -20.329892 ], [ 118.353606, -20.355253 ], [ 118.344056, -20.360053 ], [ 118.359136, -20.358723 ], [ 118.363596, -20.373963 ], [ 118.368666, -20.351432 ], [ 118.379196, -20.369622 ], [ 118.379086, -20.351372 ], [ 118.400626, -20.348642 ], [ 118.409436, -20.358522 ], [ 118.403846, -20.364302 ], [ 118.411626, -20.361082 ], [ 118.408896, -20.349152 ], [ 118.416856, -20.339562 ], [ 118.439586, -20.338452 ], [ 118.428016, -20.344722 ], [ 118.450305, -20.346742 ], [ 118.448915, -20.337152 ], [ 118.455845, -20.335072 ], [ 118.477516, -20.349491 ], [ 118.493035, -20.343631 ], [ 118.489266, -20.350991 ], [ 118.495915, -20.343641 ], [ 118.479395, -20.329151 ], [ 118.487515, -20.325971 ], [ 118.494955, -20.328141 ], [ 118.486585, -20.330461 ], [ 118.491045, -20.334271 ], [ 118.510725, -20.330641 ], [ 118.506386, -20.348781 ], [ 118.517905, -20.330811 ], [ 118.506205, -20.327661 ], [ 118.536745, -20.311651 ], [ 118.539555, -20.319231 ], [ 118.530895, -20.323911 ], [ 118.541859, -20.329756 ], [ 118.540485, -20.321721 ], [ 118.548125, -20.310611 ], [ 118.557315, -20.313610 ], [ 118.547335, -20.304851 ], [ 118.526265, -20.305361 ], [ 118.561962, -20.294396 ], [ 118.573745, -20.301600 ], [ 118.563712, -20.310819 ], [ 118.570425, -20.320140 ], [ 118.565445, -20.318050 ], [ 118.566425, -20.325760 ], [ 118.558485, -20.316671 ], [ 118.563285, -20.329571 ], [ 118.552016, -20.346311 ], [ 118.556246, -20.349761 ], [ 118.574425, -20.327960 ], [ 118.571295, -20.345211 ], [ 118.576025, -20.337790 ], [ 118.578566, -20.357681 ], [ 118.580215, -20.337260 ], [ 118.595936, -20.354490 ], [ 118.596675, -20.344940 ], [ 118.603086, -20.351540 ], [ 118.612845, -20.347550 ], [ 118.602866, -20.349050 ], [ 118.587415, -20.335390 ], [ 118.605635, -20.331240 ], [ 118.617285, -20.342430 ], [ 118.608505, -20.331600 ], [ 118.629555, -20.334370 ], [ 118.606775, -20.324590 ], [ 118.591765, -20.329670 ], [ 118.573033, -20.316187 ], [ 118.591016, -20.308092 ], [ 118.597995, -20.286556 ], [ 118.598190, -20.308261 ], [ 118.640369, -20.298496 ], [ 118.641810, -20.312455 ], [ 118.667325, -20.325349 ], [ 118.655135, -20.331120 ], [ 118.674455, -20.332280 ], [ 118.665685, -20.342860 ], [ 118.678345, -20.340319 ], [ 118.678655, -20.330279 ], [ 118.687325, -20.327159 ], [ 118.676765, -20.326659 ], [ 118.690255, -20.315799 ], [ 118.768224, -20.281728 ], [ 118.797844, -20.278908 ], [ 118.805914, -20.288098 ], [ 118.805964, -20.281098 ], [ 118.820704, -20.278028 ], [ 118.820874, -20.287848 ], [ 118.822624, -20.276008 ], [ 118.845254, -20.286293 ], [ 118.827794, -20.272658 ], [ 118.832404, -20.262298 ], [ 118.847263, -20.262328 ], [ 118.829794, -20.258898 ], [ 118.842063, -20.230647 ], [ 118.851303, -20.225507 ], [ 118.874524, -20.242347 ], [ 118.869544, -20.253377 ], [ 118.882655, -20.261126 ], [ 118.871454, -20.253727 ], [ 118.878214, -20.242516 ], [ 118.860273, -20.225447 ], [ 118.896502, -20.167756 ], [ 118.959141, -20.127025 ], [ 118.993830, -20.035794 ], [ 119.068349, -20.015393 ], [ 119.093699, -19.988453 ], [ 119.088349, -19.970373 ], [ 119.099709, -19.959323 ], [ 119.147090, -19.978573 ], [ 119.160630, -20.012123 ], [ 119.158680, -20.004063 ], [ 119.168420, -20.015163 ], [ 119.207070, -20.023673 ], [ 119.210560, -20.017253 ], [ 119.172150, -20.007733 ], [ 119.171590, -19.956573 ], [ 119.218269, -19.953213 ], [ 119.238089, -19.961353 ], [ 119.239959, -19.971703 ], [ 119.248449, -19.970593 ], [ 119.241549, -19.971063 ], [ 119.242619, -19.964513 ], [ 119.320780, -19.990369 ], [ 119.373371, -19.991488 ], [ 119.381250, -19.996448 ], [ 119.371671, -20.008108 ], [ 119.415161, -19.994507 ], [ 119.443042, -20.017226 ], [ 119.466093, -20.013336 ], [ 119.471004, -20.005676 ], [ 119.512931, -20.046507 ], [ 119.569839, -20.070986 ], [ 119.572449, -20.077196 ], [ 119.562789, -20.078977 ], [ 119.569339, -20.080347 ], [ 119.655498, -20.046535 ], [ 119.673188, -20.032005 ], [ 119.680508, -20.003815 ], [ 119.700867, -19.995104 ], [ 119.709368, -20.021334 ], [ 119.696675, -20.035020 ], [ 119.704818, -20.037234 ], [ 119.702678, -20.029904 ], [ 119.714498, -20.022464 ], [ 119.724888, -20.026204 ], [ 119.733008, -20.013354 ], [ 119.745323, -20.011060 ], [ 119.741138, -20.005914 ], [ 119.746508, -20.003214 ], [ 119.741308, -19.984394 ], [ 119.752745, -19.983716 ], [ 119.730067, -19.976184 ], [ 119.757368, -19.963594 ], [ 119.755358, -19.971724 ], [ 119.765198, -19.976433 ], [ 119.772538, -19.969753 ], [ 119.764148, -19.955563 ], [ 119.791508, -19.968123 ], [ 119.787758, -19.973303 ], [ 119.861547, -19.962162 ], [ 119.866227, -19.969592 ], [ 119.884437, -19.955312 ], [ 119.972766, -19.933001 ], [ 120.081236, -19.926479 ], [ 120.087397, -19.925279 ], [ 120.080296, -19.921249 ], [ 120.133206, -19.912429 ], [ 120.195936, -19.913908 ], [ 120.631003, -19.770045 ], [ 120.981888, -19.621038 ], [ 121.113922, -19.538571 ], [ 121.210132, -19.466302 ], [ 121.333221, -19.341653 ], [ 121.412999, -19.237982 ], [ 121.511139, -19.093872 ], [ 121.525358, -19.053121 ], [ 121.518018, -19.042821 ], [ 121.540748, -19.021291 ], [ 121.564597, -18.969260 ], [ 121.553177, -18.943460 ], [ 121.578207, -18.950890 ], [ 121.600087, -18.940679 ], [ 121.575957, -18.947380 ], [ 121.600707, -18.903179 ], [ 121.602727, -18.869179 ], [ 121.618176, -18.864369 ], [ 121.628106, -18.841579 ], [ 121.637696, -18.847709 ], [ 121.631316, -18.840009 ], [ 121.642666, -18.818009 ], [ 121.651446, -18.819059 ], [ 121.653186, -18.835929 ], [ 121.654906, -18.813189 ], [ 121.645466, -18.795880 ], [ 121.655526, -18.767209 ], [ 121.634496, -18.743309 ], [ 121.619796, -18.742019 ], [ 121.618145, -18.706309 ], [ 121.628835, -18.700249 ], [ 121.630775, -18.721939 ], [ 121.635465, -18.704219 ], [ 121.639355, -18.709989 ], [ 121.657264, -18.707108 ], [ 121.665014, -18.720258 ], [ 121.681173, -18.720618 ], [ 121.677753, -18.715638 ], [ 121.698082, -18.698637 ], [ 121.717273, -18.706368 ], [ 121.737335, -18.696819 ], [ 121.741115, -18.704738 ], [ 121.751867, -18.674829 ], [ 121.766926, -18.673049 ], [ 121.786896, -18.653888 ], [ 121.788186, -18.660788 ], [ 121.793046, -18.657178 ], [ 121.783805, -18.610838 ], [ 121.790825, -18.609258 ], [ 121.729385, -18.575678 ], [ 121.764754, -18.552828 ], [ 121.790934, -18.503848 ], [ 121.798384, -18.509858 ], [ 121.795278, -18.518299 ], [ 121.817024, -18.491818 ], [ 121.810174, -18.481068 ], [ 121.803245, -18.508058 ], [ 121.788974, -18.484188 ], [ 121.815214, -18.451138 ], [ 121.839983, -18.443727 ], [ 121.851664, -18.461707 ], [ 121.872013, -18.471687 ], [ 121.903643, -18.464057 ], [ 121.946672, -18.439267 ], [ 121.982593, -18.404847 ], [ 122.017415, -18.390527 ], [ 122.063513, -18.325816 ], [ 122.083382, -18.327636 ], [ 122.130022, -18.307426 ], [ 122.166232, -18.266645 ], [ 122.168122, -18.273425 ], [ 122.177943, -18.266075 ], [ 122.172143, -18.262915 ], [ 122.183033, -18.239416 ], [ 122.198293, -18.230706 ], [ 122.201603, -18.235346 ], [ 122.190603, -18.241216 ], [ 122.200653, -18.237606 ], [ 122.199113, -18.243136 ], [ 122.185043, -18.247885 ], [ 122.199823, -18.249696 ], [ 122.212013, -18.228566 ], [ 122.204913, -18.217376 ], [ 122.214613, -18.204036 ], [ 122.315051, -18.172326 ], [ 122.370266, -18.116445 ], [ 122.380958, -18.070664 ], [ 122.372597, -17.993713 ], [ 122.378069, -17.989814 ], [ 122.351888, -17.975223 ], [ 122.335949, -17.979884 ], [ 122.301692, -17.973614 ], [ 122.250641, -17.952334 ], [ 122.210771, -17.989225 ], [ 122.207141, -18.008875 ], [ 122.175331, -17.974005 ], [ 122.189731, -17.970715 ], [ 122.204931, -17.945275 ], [ 122.212870, -17.873734 ], [ 122.198700, -17.774314 ], [ 122.199649, -17.684823 ], [ 122.187585, -17.665576 ], [ 122.184069, -17.667663 ], [ 122.172549, -17.601233 ], [ 122.145169, -17.560353 ], [ 122.150017, -17.355372 ], [ 122.162007, -17.341572 ], [ 122.173206, -17.263592 ], [ 122.187296, -17.240411 ], [ 122.201656, -17.245921 ], [ 122.211056, -17.240371 ], [ 122.214916, -17.228171 ], [ 122.204706, -17.240381 ], [ 122.206566, -17.229191 ], [ 122.226375, -17.186451 ], [ 122.234365, -17.181021 ], [ 122.225685, -17.192331 ], [ 122.229335, -17.198201 ], [ 122.234025, -17.185761 ], [ 122.243095, -17.196031 ], [ 122.239425, -17.184171 ], [ 122.247055, -17.173311 ], [ 122.241045, -17.169251 ], [ 122.251615, -17.157600 ], [ 122.258775, -17.155660 ], [ 122.246565, -17.163931 ], [ 122.257395, -17.169000 ], [ 122.254905, -17.160640 ], [ 122.274645, -17.150440 ], [ 122.279825, -17.157440 ], [ 122.282035, -17.145120 ], [ 122.318985, -17.158950 ], [ 122.317205, -17.151270 ], [ 122.288145, -17.139570 ], [ 122.313526, -17.136127 ], [ 122.317864, -17.129680 ], [ 122.311984, -17.127090 ], [ 122.292595, -17.130290 ], [ 122.293266, -17.119348 ], [ 122.267215, -17.137010 ], [ 122.253805, -17.131720 ], [ 122.253195, -17.119850 ], [ 122.295524, -17.067230 ], [ 122.351043, -17.036949 ], [ 122.369773, -17.008089 ], [ 122.366353, -16.997639 ], [ 122.469652, -16.936298 ], [ 122.460552, -16.956878 ], [ 122.440732, -16.967098 ], [ 122.447202, -16.969788 ], [ 122.443472, -16.980528 ], [ 122.431033, -16.983388 ], [ 122.444433, -16.987758 ], [ 122.467632, -16.968838 ], [ 122.461432, -16.977778 ], [ 122.468742, -16.986348 ], [ 122.472122, -16.976958 ], [ 122.481052, -16.981348 ], [ 122.475032, -16.968148 ], [ 122.485552, -16.951627 ], [ 122.476882, -16.957178 ], [ 122.485512, -16.937277 ], [ 122.476892, -16.921707 ], [ 122.480221, -16.894587 ], [ 122.489682, -16.918507 ], [ 122.503291, -16.915987 ], [ 122.503082, -16.923677 ], [ 122.519782, -16.933687 ], [ 122.507952, -16.954367 ], [ 122.527572, -16.947677 ], [ 122.554002, -16.962397 ], [ 122.572342, -16.955677 ], [ 122.587612, -16.957217 ], [ 122.602102, -16.971297 ], [ 122.612161, -16.965257 ], [ 122.595622, -16.964307 ], [ 122.591361, -16.954947 ], [ 122.597471, -16.954927 ], [ 122.585581, -16.948077 ], [ 122.582201, -16.933217 ], [ 122.570371, -16.929367 ], [ 122.569461, -16.903267 ], [ 122.556531, -16.896417 ], [ 122.551491, -16.864457 ], [ 122.543501, -16.861427 ], [ 122.533801, -16.836947 ], [ 122.549350, -16.819836 ], [ 122.551040, -16.834526 ], [ 122.560550, -16.835516 ], [ 122.551140, -16.828876 ], [ 122.564290, -16.829286 ], [ 122.565370, -16.837986 ], [ 122.567810, -16.829056 ], [ 122.571230, -16.836156 ], [ 122.571300, -16.822606 ], [ 122.553290, -16.805366 ], [ 122.574110, -16.785766 ], [ 122.577490, -16.777286 ], [ 122.569490, -16.771426 ], [ 122.579430, -16.762136 ], [ 122.609939, -16.765655 ], [ 122.620140, -16.794666 ], [ 122.637410, -16.800705 ], [ 122.693508, -16.777244 ], [ 122.706578, -16.787474 ], [ 122.734458, -16.777653 ], [ 122.757428, -16.746053 ], [ 122.764968, -16.752013 ], [ 122.742698, -16.772203 ], [ 122.761948, -16.765513 ], [ 122.766738, -16.754373 ], [ 122.771638, -16.761563 ], [ 122.769657, -16.752673 ], [ 122.777207, -16.760883 ], [ 122.773527, -16.751413 ], [ 122.788947, -16.763552 ], [ 122.786637, -16.771692 ], [ 122.792097, -16.760602 ], [ 122.781597, -16.747423 ], [ 122.803017, -16.762142 ], [ 122.800607, -16.767022 ], [ 122.810187, -16.766172 ], [ 122.809847, -16.774302 ], [ 122.813617, -16.770112 ], [ 122.845567, -16.792031 ], [ 122.827587, -16.773562 ], [ 122.833417, -16.772412 ], [ 122.823467, -16.769852 ], [ 122.833387, -16.758282 ], [ 122.821407, -16.756982 ], [ 122.838417, -16.744482 ], [ 122.810017, -16.752842 ], [ 122.790807, -16.733722 ], [ 122.775687, -16.735473 ], [ 122.773087, -16.704523 ], [ 122.785297, -16.704153 ], [ 122.784137, -16.695973 ], [ 122.773757, -16.694013 ], [ 122.762787, -16.710333 ], [ 122.743868, -16.700123 ], [ 122.741798, -16.683403 ], [ 122.771107, -16.628613 ], [ 122.778997, -16.584943 ], [ 122.771287, -16.590313 ], [ 122.810106, -16.545303 ], [ 122.817926, -16.539172 ], [ 122.794756, -16.571693 ], [ 122.811576, -16.558293 ], [ 122.833406, -16.560702 ], [ 122.816486, -16.556122 ], [ 122.847726, -16.546502 ], [ 122.861415, -16.519102 ], [ 122.884225, -16.530251 ], [ 122.861255, -16.509952 ], [ 122.853885, -16.512692 ], [ 122.863075, -16.499102 ], [ 122.867225, -16.509362 ], [ 122.884095, -16.508041 ], [ 122.904375, -16.488521 ], [ 122.905705, -16.473601 ], [ 122.895845, -16.468221 ], [ 122.898075, -16.447201 ], [ 122.901774, -16.436671 ], [ 122.911494, -16.437081 ], [ 122.901524, -16.434981 ], [ 122.925294, -16.389451 ], [ 122.955224, -16.401741 ], [ 122.987654, -16.380900 ], [ 122.992024, -16.387550 ], [ 122.982414, -16.405900 ], [ 122.993694, -16.393410 ], [ 122.991634, -16.380090 ], [ 123.038893, -16.359210 ], [ 123.020273, -16.378210 ], [ 123.034123, -16.385610 ], [ 123.034884, -16.400200 ], [ 123.014754, -16.405770 ], [ 123.023984, -16.419970 ], [ 123.034054, -16.420760 ], [ 123.031004, -16.430560 ], [ 123.043074, -16.439860 ], [ 123.076683, -16.440339 ], [ 123.047244, -16.462969 ], [ 123.045014, -16.473789 ], [ 123.042844, -16.458959 ], [ 123.023824, -16.462700 ], [ 123.015404, -16.451750 ], [ 122.982984, -16.465130 ], [ 122.979094, -16.477090 ], [ 122.995694, -16.477570 ], [ 122.997494, -16.485810 ], [ 122.971064, -16.516110 ], [ 123.006694, -16.522200 ], [ 123.008024, -16.528429 ], [ 122.989784, -16.532510 ], [ 122.981074, -16.552460 ], [ 122.985014, -16.558750 ], [ 122.968734, -16.561880 ], [ 122.954425, -16.580140 ], [ 122.960695, -16.590610 ], [ 122.984734, -16.593090 ], [ 122.986564, -16.607089 ], [ 122.996504, -16.601849 ], [ 122.988314, -16.625609 ], [ 122.995744, -16.640849 ], [ 123.023274, -16.604569 ], [ 123.027104, -16.617049 ], [ 123.038664, -16.621359 ], [ 123.036184, -16.671528 ], [ 123.050614, -16.690788 ], [ 123.078734, -16.693248 ], [ 123.083754, -16.664818 ], [ 123.084883, -16.698287 ], [ 123.094023, -16.709127 ], [ 123.126613, -16.711067 ], [ 123.138833, -16.688477 ], [ 123.145053, -16.708437 ], [ 123.132633, -16.738037 ], [ 123.118743, -16.731557 ], [ 123.103453, -16.745297 ], [ 123.107823, -16.772587 ], [ 123.102533, -16.783717 ], [ 123.110683, -16.779057 ], [ 123.109923, -16.794197 ], [ 123.119853, -16.787297 ], [ 123.134833, -16.790736 ], [ 123.156963, -16.805666 ], [ 123.161403, -16.817926 ], [ 123.162123, -16.846646 ], [ 123.173493, -16.858976 ], [ 123.163393, -16.858986 ], [ 123.153544, -16.878438 ], [ 123.149104, -16.924718 ], [ 123.168634, -16.924948 ], [ 123.234835, -16.969948 ], [ 123.263354, -17.011833 ], [ 123.278176, -17.035544 ], [ 123.290602, -17.107721 ], [ 123.344578, -17.162732 ], [ 123.383408, -17.240033 ], [ 123.394348, -17.280663 ], [ 123.392728, -17.316253 ], [ 123.405198, -17.327513 ], [ 123.425168, -17.325463 ], [ 123.442709, -17.345443 ], [ 123.459279, -17.350613 ], [ 123.483280, -17.397063 ], [ 123.514260, -17.418462 ], [ 123.512290, -17.435522 ], [ 123.514790, -17.429542 ], [ 123.515570, -17.437172 ], [ 123.524190, -17.433202 ], [ 123.523150, -17.452292 ], [ 123.537510, -17.454392 ], [ 123.533859, -17.481901 ], [ 123.540999, -17.463792 ], [ 123.545209, -17.469231 ], [ 123.543548, -17.501081 ], [ 123.562707, -17.503891 ], [ 123.576869, -17.523841 ], [ 123.572390, -17.555842 ], [ 123.580350, -17.584192 ], [ 123.593140, -17.573752 ], [ 123.589930, -17.552611 ], [ 123.597050, -17.542691 ], [ 123.591339, -17.529441 ], [ 123.600118, -17.515581 ], [ 123.579648, -17.483621 ], [ 123.582759, -17.424752 ], [ 123.564479, -17.405802 ], [ 123.580988, -17.350152 ], [ 123.593778, -17.361531 ], [ 123.602928, -17.339401 ], [ 123.623806, -17.198661 ], [ 123.641706, -17.193651 ], [ 123.646226, -17.183951 ], [ 123.608086, -17.139381 ], [ 123.590635, -17.100991 ], [ 123.583544, -17.033260 ], [ 123.600693, -17.010619 ], [ 123.647972, -16.999738 ], [ 123.659322, -17.010179 ], [ 123.660033, -17.039649 ], [ 123.679143, -17.045069 ], [ 123.680253, -17.059229 ], [ 123.689193, -17.060029 ], [ 123.704423, -17.042679 ], [ 123.740863, -17.068349 ], [ 123.761123, -17.087749 ], [ 123.773073, -17.129039 ], [ 123.786093, -17.138809 ], [ 123.789214, -17.152289 ], [ 123.829924, -17.178389 ], [ 123.836234, -17.191629 ], [ 123.851974, -17.195409 ], [ 123.862494, -17.216569 ], [ 123.888704, -17.221728 ], [ 123.912493, -17.211858 ], [ 123.914863, -17.205648 ], [ 123.887704, -17.202518 ], [ 123.885523, -17.186579 ], [ 123.829603, -17.134649 ], [ 123.834243, -17.118049 ], [ 123.796449, -17.004007 ], [ 123.820389, -16.997896 ], [ 123.802559, -16.986377 ], [ 123.826870, -16.957277 ], [ 123.894389, -16.907427 ], [ 123.902589, -16.887496 ], [ 123.915838, -16.886506 ], [ 123.928378, -16.871306 ], [ 123.951508, -16.867516 ], [ 123.959268, -16.852416 ], [ 123.949288, -16.836416 ], [ 123.951418, -16.818116 ], [ 123.942228, -16.822806 ], [ 123.942128, -16.852076 ], [ 123.920968, -16.852076 ], [ 123.903628, -16.863777 ], [ 123.893328, -16.857227 ], [ 123.883959, -16.877897 ], [ 123.796120, -16.911838 ], [ 123.760959, -16.875858 ], [ 123.758339, -16.837748 ], [ 123.717589, -16.784868 ], [ 123.711529, -16.752718 ], [ 123.681509, -16.751687 ], [ 123.617760, -16.679497 ], [ 123.599940, -16.679007 ], [ 123.587610, -16.667597 ], [ 123.571380, -16.672767 ], [ 123.552161, -16.659717 ], [ 123.523001, -16.667826 ], [ 123.502801, -16.658826 ], [ 123.520551, -16.650066 ], [ 123.506591, -16.643146 ], [ 123.573871, -16.625236 ], [ 123.555651, -16.612606 ], [ 123.572451, -16.608006 ], [ 123.563031, -16.600806 ], [ 123.563381, -16.588255 ], [ 123.581141, -16.594516 ], [ 123.588392, -16.582825 ], [ 123.602002, -16.582145 ], [ 123.589242, -16.567454 ], [ 123.619432, -16.573783 ], [ 123.615142, -16.554332 ], [ 123.588582, -16.538302 ], [ 123.578622, -16.549843 ], [ 123.526052, -16.544414 ], [ 123.520752, -16.548174 ], [ 123.533852, -16.550474 ], [ 123.542202, -16.572025 ], [ 123.517742, -16.566135 ], [ 123.511602, -16.597756 ], [ 123.494272, -16.570805 ], [ 123.498082, -16.565075 ], [ 123.513442, -16.568415 ], [ 123.503112, -16.566025 ], [ 123.491002, -16.546015 ], [ 123.463692, -16.534805 ], [ 123.460392, -16.524605 ], [ 123.468072, -16.518225 ], [ 123.428532, -16.511196 ], [ 123.428542, -16.498866 ], [ 123.442233, -16.500465 ], [ 123.431082, -16.502966 ], [ 123.445302, -16.509875 ], [ 123.496582, -16.514535 ], [ 123.492952, -16.501725 ], [ 123.502072, -16.504064 ], [ 123.495132, -16.494055 ], [ 123.472503, -16.484015 ], [ 123.469553, -16.475055 ], [ 123.461443, -16.477015 ], [ 123.473462, -16.470005 ], [ 123.544012, -16.504553 ], [ 123.534132, -16.508644 ], [ 123.546352, -16.504233 ], [ 123.594543, -16.525902 ], [ 123.584313, -16.517452 ], [ 123.643023, -16.530040 ], [ 123.637033, -16.518010 ], [ 123.607623, -16.504871 ], [ 123.588483, -16.510472 ], [ 123.582963, -16.498562 ], [ 123.602723, -16.490701 ], [ 123.625213, -16.490440 ], [ 123.632873, -16.498639 ], [ 123.662934, -16.491090 ], [ 123.648273, -16.479889 ], [ 123.651363, -16.474949 ], [ 123.619823, -16.464731 ], [ 123.599233, -16.448731 ], [ 123.568233, -16.445533 ], [ 123.542982, -16.427224 ], [ 123.505342, -16.419995 ], [ 123.497942, -16.409865 ], [ 123.502772, -16.407085 ], [ 123.582213, -16.427682 ], [ 123.547842, -16.408504 ], [ 123.563072, -16.407953 ], [ 123.511242, -16.391335 ], [ 123.518632, -16.389254 ], [ 123.509122, -16.380235 ], [ 123.535882, -16.397994 ], [ 123.567482, -16.399853 ], [ 123.556682, -16.403153 ], [ 123.571732, -16.408373 ], [ 123.571922, -16.400803 ], [ 123.597992, -16.405662 ], [ 123.605162, -16.415552 ], [ 123.591802, -16.417132 ], [ 123.607993, -16.425752 ], [ 123.621393, -16.429971 ], [ 123.629572, -16.422992 ], [ 123.665523, -16.436630 ], [ 123.676563, -16.433560 ], [ 123.671683, -16.428321 ], [ 123.681483, -16.432690 ], [ 123.697213, -16.414851 ], [ 123.679752, -16.416171 ], [ 123.688282, -16.404832 ], [ 123.647942, -16.385393 ], [ 123.629232, -16.356753 ], [ 123.658682, -16.362873 ], [ 123.651362, -16.369483 ], [ 123.663532, -16.383373 ], [ 123.673022, -16.383112 ], [ 123.662962, -16.367993 ], [ 123.681402, -16.375382 ], [ 123.716902, -16.372392 ], [ 123.698871, -16.359133 ], [ 123.710621, -16.354033 ], [ 123.700111, -16.351003 ], [ 123.697421, -16.337533 ], [ 123.679991, -16.335583 ], [ 123.662391, -16.313513 ], [ 123.640321, -16.308693 ], [ 123.627141, -16.290494 ], [ 123.611370, -16.287084 ], [ 123.624441, -16.317263 ], [ 123.593361, -16.311233 ], [ 123.598751, -16.322803 ], [ 123.550201, -16.283154 ], [ 123.549571, -16.262805 ], [ 123.566061, -16.276294 ], [ 123.582130, -16.272024 ], [ 123.583880, -16.260614 ], [ 123.599290, -16.264084 ], [ 123.576061, -16.245294 ], [ 123.616630, -16.261804 ], [ 123.603510, -16.250954 ], [ 123.609660, -16.243774 ], [ 123.590900, -16.247684 ], [ 123.580100, -16.239224 ], [ 123.601920, -16.232404 ], [ 123.586550, -16.224924 ], [ 123.582250, -16.233704 ], [ 123.563700, -16.216245 ], [ 123.601120, -16.216364 ], [ 123.581690, -16.205884 ], [ 123.563870, -16.210365 ], [ 123.572460, -16.192125 ], [ 123.556690, -16.177745 ], [ 123.569260, -16.172315 ], [ 123.570700, -16.180805 ], [ 123.584180, -16.164424 ], [ 123.613340, -16.160494 ], [ 123.635770, -16.176164 ], [ 123.620430, -16.157694 ], [ 123.655260, -16.168304 ], [ 123.659840, -16.153424 ], [ 123.675750, -16.163214 ], [ 123.665350, -16.151204 ], [ 123.683460, -16.153614 ], [ 123.679770, -16.160594 ], [ 123.693420, -16.151104 ], [ 123.696830, -16.162244 ], [ 123.689840, -16.160004 ], [ 123.696040, -16.173274 ], [ 123.700980, -16.169474 ], [ 123.701410, -16.190264 ], [ 123.702140, -16.171174 ], [ 123.713630, -16.167543 ], [ 123.703110, -16.153894 ], [ 123.708970, -16.152243 ], [ 123.723430, -16.170893 ], [ 123.713160, -16.154083 ], [ 123.728460, -16.156813 ], [ 123.703089, -16.128683 ], [ 123.726609, -16.140513 ], [ 123.737900, -16.160613 ], [ 123.741819, -16.153523 ], [ 123.747239, -16.162773 ], [ 123.750909, -16.157443 ], [ 123.770559, -16.170593 ], [ 123.790550, -16.200473 ], [ 123.803160, -16.203513 ], [ 123.796800, -16.209233 ], [ 123.806650, -16.206143 ], [ 123.814610, -16.219653 ], [ 123.800370, -16.216153 ], [ 123.798560, -16.222923 ], [ 123.788610, -16.209503 ], [ 123.789070, -16.223643 ], [ 123.771590, -16.216153 ], [ 123.775690, -16.228843 ], [ 123.785020, -16.233443 ], [ 123.788330, -16.228263 ], [ 123.795030, -16.238833 ], [ 123.796940, -16.263033 ], [ 123.791090, -16.263553 ], [ 123.783300, -16.243033 ], [ 123.783490, -16.262143 ], [ 123.777140, -16.251803 ], [ 123.769470, -16.259543 ], [ 123.742960, -16.253123 ], [ 123.740651, -16.263273 ], [ 123.778031, -16.285833 ], [ 123.782711, -16.297653 ], [ 123.783191, -16.284063 ], [ 123.795821, -16.299763 ], [ 123.784441, -16.303063 ], [ 123.796371, -16.316123 ], [ 123.810051, -16.320673 ], [ 123.799531, -16.303973 ], [ 123.825361, -16.322823 ], [ 123.842971, -16.326223 ], [ 123.835221, -16.319613 ], [ 123.843921, -16.315043 ], [ 123.865940, -16.327873 ], [ 123.856671, -16.330173 ], [ 123.858461, -16.340583 ], [ 123.864591, -16.336113 ], [ 123.860141, -16.350323 ], [ 123.867621, -16.351733 ], [ 123.865471, -16.342443 ], [ 123.876441, -16.347053 ], [ 123.878721, -16.355203 ], [ 123.865791, -16.362233 ], [ 123.878831, -16.371253 ], [ 123.876081, -16.377674 ], [ 123.851431, -16.371734 ], [ 123.836461, -16.354373 ], [ 123.850571, -16.376474 ], [ 123.842031, -16.382834 ], [ 123.854090, -16.435165 ], [ 123.871100, -16.447055 ], [ 123.867030, -16.412874 ], [ 123.883040, -16.416724 ], [ 123.888370, -16.409534 ], [ 123.899970, -16.422833 ], [ 123.889541, -16.394503 ], [ 123.899381, -16.392203 ], [ 123.895031, -16.365043 ], [ 123.884350, -16.353663 ], [ 123.908970, -16.362923 ], [ 123.885720, -16.342823 ], [ 123.917020, -16.352203 ], [ 123.892810, -16.333713 ], [ 123.883800, -16.304033 ], [ 123.895360, -16.307393 ], [ 123.905800, -16.335163 ], [ 123.941310, -16.359833 ], [ 123.975710, -16.378943 ], [ 123.983840, -16.379503 ], [ 123.987590, -16.370433 ], [ 123.977280, -16.340413 ], [ 123.955150, -16.325003 ], [ 123.949330, -16.304383 ], [ 123.933580, -16.297723 ], [ 123.960979, -16.279823 ], [ 124.000079, -16.291832 ], [ 123.993739, -16.281402 ], [ 123.961179, -16.268633 ], [ 123.963819, -16.260183 ], [ 123.953369, -16.264743 ], [ 123.950239, -16.260533 ], [ 123.962469, -16.252823 ], [ 123.950729, -16.257713 ], [ 123.945749, -16.250903 ], [ 123.951989, -16.246193 ], [ 123.941669, -16.249173 ], [ 123.925899, -16.229623 ], [ 123.915949, -16.231473 ], [ 123.909909, -16.210293 ], [ 123.939909, -16.233563 ], [ 123.972119, -16.245312 ], [ 123.970069, -16.253662 ], [ 123.979929, -16.248302 ], [ 123.995519, -16.261632 ], [ 124.002819, -16.254562 ], [ 123.999819, -16.264722 ], [ 124.009939, -16.257442 ], [ 124.017819, -16.268342 ], [ 124.014949, -16.259392 ], [ 124.026209, -16.255742 ], [ 124.042379, -16.268952 ], [ 124.041969, -16.278332 ], [ 124.052429, -16.271962 ], [ 124.068258, -16.284152 ], [ 124.056988, -16.271422 ], [ 124.075478, -16.270972 ], [ 124.104808, -16.277832 ], [ 124.101428, -16.285392 ], [ 124.107838, -16.278642 ], [ 124.124448, -16.280432 ], [ 124.124538, -16.288902 ], [ 124.179728, -16.309581 ], [ 124.175048, -16.328211 ], [ 124.194858, -16.342561 ], [ 124.185658, -16.352681 ], [ 124.194648, -16.356571 ], [ 124.193538, -16.366401 ], [ 124.199308, -16.360561 ], [ 124.196978, -16.377041 ], [ 124.199698, -16.372541 ], [ 124.205838, -16.383881 ], [ 124.195858, -16.389021 ], [ 124.204878, -16.386921 ], [ 124.210088, -16.397011 ], [ 124.201848, -16.404761 ], [ 124.211488, -16.398491 ], [ 124.222718, -16.418441 ], [ 124.256728, -16.409591 ], [ 124.264078, -16.413811 ], [ 124.261098, -16.419421 ], [ 124.282927, -16.414481 ], [ 124.294697, -16.423921 ], [ 124.300137, -16.414911 ], [ 124.311227, -16.420161 ], [ 124.324957, -16.414921 ], [ 124.322697, -16.421461 ], [ 124.334247, -16.428531 ], [ 124.331847, -16.439481 ], [ 124.315098, -16.441541 ], [ 124.322198, -16.448811 ], [ 124.308098, -16.455421 ], [ 124.319158, -16.468691 ], [ 124.332338, -16.458471 ], [ 124.344978, -16.465571 ], [ 124.353438, -16.454171 ], [ 124.363677, -16.458231 ], [ 124.361077, -16.448671 ], [ 124.373397, -16.442741 ], [ 124.390137, -16.445191 ], [ 124.390297, -16.458981 ], [ 124.407297, -16.478611 ], [ 124.391618, -16.504581 ], [ 124.400878, -16.497341 ], [ 124.405888, -16.503581 ], [ 124.399068, -16.506421 ], [ 124.415218, -16.509951 ], [ 124.407528, -16.525511 ], [ 124.392268, -16.533011 ], [ 124.406438, -16.533871 ], [ 124.410298, -16.543251 ], [ 124.426248, -16.531701 ], [ 124.427598, -16.517921 ], [ 124.435528, -16.525531 ], [ 124.429807, -16.498491 ], [ 124.441167, -16.497531 ], [ 124.442637, -16.508911 ], [ 124.444657, -16.502741 ], [ 124.449367, -16.506741 ], [ 124.443527, -16.494941 ], [ 124.449237, -16.501181 ], [ 124.448047, -16.496081 ], [ 124.468217, -16.498551 ], [ 124.440067, -16.482831 ], [ 124.441377, -16.475411 ], [ 124.419097, -16.485221 ], [ 124.402777, -16.469661 ], [ 124.401897, -16.429011 ], [ 124.388797, -16.415221 ], [ 124.346447, -16.424751 ], [ 124.336527, -16.418821 ], [ 124.344267, -16.416381 ], [ 124.348867, -16.389161 ], [ 124.365657, -16.378731 ], [ 124.387487, -16.345620 ], [ 124.402547, -16.352240 ], [ 124.407377, -16.373290 ], [ 124.426237, -16.366820 ], [ 124.431257, -16.394080 ], [ 124.449537, -16.388620 ], [ 124.449227, -16.410910 ], [ 124.494416, -16.404300 ], [ 124.494537, -16.411680 ], [ 124.501276, -16.400800 ], [ 124.513646, -16.408560 ], [ 124.599746, -16.414300 ], [ 124.745415, -16.389979 ], [ 124.840514, -16.434320 ], [ 124.917184, -16.420818 ], [ 124.922285, -16.391137 ], [ 124.947665, -16.393327 ], [ 124.953335, -16.371327 ], [ 124.943945, -16.383957 ], [ 124.917735, -16.388077 ], [ 124.901265, -16.416048 ], [ 124.881884, -16.408779 ], [ 124.874394, -16.416219 ], [ 124.830524, -16.409070 ], [ 124.814465, -16.416409 ], [ 124.787665, -16.385858 ], [ 124.725195, -16.372199 ], [ 124.715185, -16.355839 ], [ 124.693485, -16.344719 ], [ 124.673426, -16.350389 ], [ 124.570956, -16.329290 ], [ 124.506596, -16.342850 ], [ 124.480476, -16.356440 ], [ 124.477586, -16.344970 ], [ 124.464286, -16.341230 ], [ 124.457436, -16.352840 ], [ 124.424167, -16.359580 ], [ 124.411657, -16.357260 ], [ 124.405937, -16.334210 ], [ 124.394547, -16.338530 ], [ 124.410707, -16.293630 ], [ 124.402947, -16.298110 ], [ 124.385157, -16.276100 ], [ 124.398967, -16.274020 ], [ 124.407867, -16.250670 ], [ 124.402667, -16.237990 ], [ 124.378747, -16.227020 ], [ 124.379037, -16.216630 ], [ 124.400167, -16.201700 ], [ 124.388757, -16.190910 ], [ 124.400967, -16.182720 ], [ 124.398577, -16.169479 ], [ 124.427696, -16.182809 ], [ 124.434656, -16.178809 ], [ 124.449676, -16.122029 ], [ 124.443286, -16.113529 ], [ 124.448916, -16.110279 ], [ 124.444346, -16.065389 ], [ 124.453276, -16.078429 ], [ 124.462736, -16.079479 ], [ 124.464066, -16.071809 ], [ 124.477236, -16.078539 ], [ 124.479966, -16.094139 ], [ 124.458426, -16.102519 ], [ 124.486616, -16.122199 ], [ 124.514136, -16.164669 ], [ 124.517026, -16.173599 ], [ 124.501436, -16.182689 ], [ 124.501496, -16.189239 ], [ 124.516776, -16.177439 ], [ 124.508166, -16.206029 ], [ 124.518836, -16.178819 ], [ 124.526396, -16.194759 ], [ 124.525136, -16.188199 ], [ 124.532616, -16.189359 ], [ 124.525406, -16.181199 ], [ 124.536686, -16.184239 ], [ 124.526976, -16.162009 ], [ 124.541436, -16.157619 ], [ 124.560716, -16.119458 ], [ 124.599256, -16.127398 ], [ 124.646945, -16.098108 ], [ 124.634105, -16.091848 ], [ 124.622976, -16.099708 ], [ 124.618106, -16.089758 ], [ 124.607146, -16.113428 ], [ 124.592446, -16.116078 ], [ 124.588116, -16.109518 ], [ 124.580536, -16.023228 ], [ 124.595486, -16.027418 ], [ 124.579456, -16.000528 ], [ 124.591275, -15.997678 ], [ 124.588885, -15.973497 ], [ 124.615185, -15.983727 ], [ 124.619885, -15.996267 ], [ 124.616235, -15.982487 ], [ 124.637135, -15.984137 ], [ 124.634041, -15.998570 ], [ 124.642635, -15.988417 ], [ 124.639015, -15.980897 ], [ 124.605575, -15.969967 ], [ 124.615545, -15.964507 ], [ 124.598445, -15.967607 ], [ 124.596865, -15.942977 ], [ 124.605985, -15.944427 ], [ 124.610495, -15.927357 ], [ 124.626005, -15.920887 ], [ 124.616065, -15.912997 ], [ 124.621185, -15.906097 ], [ 124.605295, -15.898437 ], [ 124.607845, -15.891317 ], [ 124.629415, -15.881557 ], [ 124.654555, -15.853597 ], [ 124.668465, -15.862727 ], [ 124.681575, -15.888916 ], [ 124.686845, -15.881886 ], [ 124.677845, -15.877276 ], [ 124.675825, -15.862816 ], [ 124.686535, -15.856586 ], [ 124.682005, -15.849516 ], [ 124.711935, -15.839466 ], [ 124.704515, -15.814056 ], [ 124.741585, -15.822276 ], [ 124.700815, -15.784466 ], [ 124.704275, -15.768976 ], [ 124.719004, -15.770066 ], [ 124.709155, -15.762296 ], [ 124.702985, -15.766496 ], [ 124.704344, -15.750216 ], [ 124.701695, -15.763896 ], [ 124.696434, -15.759046 ], [ 124.700775, -15.767746 ], [ 124.691195, -15.765166 ], [ 124.697865, -15.769216 ], [ 124.693585, -15.783006 ], [ 124.675385, -15.784746 ], [ 124.678965, -15.769706 ], [ 124.704784, -15.741066 ], [ 124.688694, -15.745626 ], [ 124.660445, -15.781617 ], [ 124.633865, -15.790477 ], [ 124.632785, -15.778957 ], [ 124.631765, -15.790487 ], [ 124.625685, -15.786087 ], [ 124.629485, -15.795637 ], [ 124.607895, -15.810867 ], [ 124.572015, -15.861227 ], [ 124.531746, -15.957318 ], [ 124.520326, -15.972368 ], [ 124.513546, -15.968078 ], [ 124.516376, -15.979718 ], [ 124.498596, -15.998068 ], [ 124.490246, -15.987488 ], [ 124.492126, -15.975498 ], [ 124.498076, -15.977248 ], [ 124.491966, -15.959128 ], [ 124.497006, -15.943248 ], [ 124.508266, -15.946368 ], [ 124.512456, -15.934418 ], [ 124.506116, -15.927868 ], [ 124.499316, -15.935708 ], [ 124.498016, -15.928318 ], [ 124.492426, -15.935968 ], [ 124.487306, -15.920408 ], [ 124.476696, -15.941578 ], [ 124.480476, -15.896948 ], [ 124.474886, -15.885678 ], [ 124.478906, -15.893378 ], [ 124.499406, -15.889778 ], [ 124.483656, -15.889818 ], [ 124.489946, -15.886058 ], [ 124.475166, -15.873708 ], [ 124.484256, -15.866628 ], [ 124.475256, -15.868398 ], [ 124.477616, -15.863378 ], [ 124.460946, -15.854118 ], [ 124.459346, -15.817708 ], [ 124.476646, -15.820258 ], [ 124.460276, -15.816018 ], [ 124.461202, -15.802971 ], [ 124.443376, -15.809198 ], [ 124.458276, -15.811438 ], [ 124.451256, -15.831348 ], [ 124.444636, -15.829048 ], [ 124.439056, -15.870368 ], [ 124.429536, -15.867388 ], [ 124.424846, -15.847618 ], [ 124.417516, -15.876798 ], [ 124.409286, -15.863848 ], [ 124.410286, -15.805898 ], [ 124.385946, -15.717558 ], [ 124.395926, -15.731178 ], [ 124.407656, -15.720058 ], [ 124.423796, -15.732568 ], [ 124.419216, -15.723958 ], [ 124.437256, -15.711468 ], [ 124.416856, -15.720398 ], [ 124.411476, -15.715068 ], [ 124.417826, -15.711408 ], [ 124.409026, -15.710998 ], [ 124.397346, -15.726028 ], [ 124.402536, -15.698618 ], [ 124.393216, -15.677308 ], [ 124.386356, -15.672178 ], [ 124.375976, -15.680098 ], [ 124.368816, -15.671878 ], [ 124.379266, -15.660198 ], [ 124.385716, -15.669318 ], [ 124.390236, -15.662408 ], [ 124.402466, -15.685178 ], [ 124.412666, -15.681428 ], [ 124.414366, -15.637228 ], [ 124.421516, -15.667358 ], [ 124.430726, -15.673888 ], [ 124.429656, -15.664268 ], [ 124.443686, -15.669738 ], [ 124.444656, -15.654828 ], [ 124.457196, -15.656338 ], [ 124.436506, -15.643498 ], [ 124.433775, -15.623017 ], [ 124.450455, -15.602767 ], [ 124.452465, -15.616207 ], [ 124.482955, -15.618837 ], [ 124.500625, -15.636687 ], [ 124.488215, -15.621527 ], [ 124.497125, -15.615687 ], [ 124.454365, -15.613547 ], [ 124.459585, -15.608557 ], [ 124.453875, -15.591877 ], [ 124.450685, -15.601137 ], [ 124.433465, -15.608447 ], [ 124.430595, -15.588087 ], [ 124.409575, -15.609457 ], [ 124.416035, -15.620168 ], [ 124.404585, -15.615128 ], [ 124.430035, -15.574467 ], [ 124.424655, -15.559357 ], [ 124.430075, -15.560787 ], [ 124.417525, -15.549247 ], [ 124.425115, -15.540787 ], [ 124.436315, -15.546987 ], [ 124.446425, -15.528717 ], [ 124.458595, -15.539507 ], [ 124.461995, -15.532067 ], [ 124.465785, -15.536897 ], [ 124.461695, -15.511707 ], [ 124.470145, -15.506397 ], [ 124.472685, -15.512367 ], [ 124.473045, -15.503557 ], [ 124.486525, -15.497277 ], [ 124.496185, -15.516547 ], [ 124.510425, -15.525127 ], [ 124.500265, -15.516417 ], [ 124.505805, -15.504087 ], [ 124.498575, -15.505807 ], [ 124.492535, -15.486177 ], [ 124.468615, -15.504257 ], [ 124.455825, -15.508487 ], [ 124.461595, -15.498187 ], [ 124.446375, -15.506277 ], [ 124.476645, -15.477897 ], [ 124.498065, -15.474967 ], [ 124.507385, -15.483737 ], [ 124.508594, -15.470327 ], [ 124.518254, -15.468737 ], [ 124.521494, -15.485127 ], [ 124.529804, -15.477197 ], [ 124.528974, -15.484437 ], [ 124.551694, -15.490806 ], [ 124.554674, -15.502796 ], [ 124.579944, -15.499606 ], [ 124.580334, -15.520056 ], [ 124.595824, -15.523406 ], [ 124.599064, -15.506476 ], [ 124.617474, -15.503846 ], [ 124.620644, -15.514456 ], [ 124.614444, -15.519576 ], [ 124.628764, -15.525666 ], [ 124.632144, -15.516306 ], [ 124.624364, -15.512756 ], [ 124.638794, -15.503916 ], [ 124.621544, -15.500666 ], [ 124.626384, -15.472426 ], [ 124.617854, -15.466096 ], [ 124.628214, -15.462806 ], [ 124.633404, -15.436696 ], [ 124.645724, -15.424696 ], [ 124.653784, -15.435186 ], [ 124.645674, -15.434136 ], [ 124.642194, -15.463116 ], [ 124.667524, -15.483746 ], [ 124.677064, -15.478196 ], [ 124.674194, -15.498086 ], [ 124.679864, -15.480336 ], [ 124.686104, -15.480916 ], [ 124.682054, -15.473216 ], [ 124.690774, -15.468026 ], [ 124.686664, -15.455806 ], [ 124.676554, -15.462826 ], [ 124.671644, -15.452896 ], [ 124.668904, -15.428606 ], [ 124.687084, -15.413716 ], [ 124.678184, -15.411636 ], [ 124.676174, -15.400686 ], [ 124.723743, -15.376745 ], [ 124.727203, -15.363405 ], [ 124.744773, -15.361785 ], [ 124.726643, -15.360495 ], [ 124.723483, -15.352805 ], [ 124.704723, -15.359836 ], [ 124.705333, -15.343555 ], [ 124.688763, -15.357496 ], [ 124.666774, -15.361946 ], [ 124.661984, -15.354946 ], [ 124.662084, -15.347946 ], [ 124.672353, -15.346246 ], [ 124.656463, -15.336876 ], [ 124.661913, -15.324886 ], [ 124.666473, -15.334256 ], [ 124.674243, -15.324526 ], [ 124.691033, -15.333196 ], [ 124.707193, -15.320805 ], [ 124.692483, -15.309125 ], [ 124.696883, -15.296465 ], [ 124.667313, -15.296636 ], [ 124.679283, -15.288586 ], [ 124.672743, -15.278996 ], [ 124.678893, -15.270166 ], [ 124.672843, -15.269046 ], [ 124.674673, -15.255036 ], [ 124.681763, -15.254006 ], [ 124.678763, -15.264066 ], [ 124.701373, -15.278375 ], [ 124.705033, -15.253395 ], [ 124.770573, -15.302065 ], [ 124.761793, -15.326155 ], [ 124.736123, -15.343165 ], [ 124.753253, -15.354425 ], [ 124.759363, -15.333275 ], [ 124.783853, -15.311885 ], [ 124.783233, -15.294465 ], [ 124.810393, -15.308755 ], [ 124.817193, -15.323535 ], [ 124.831293, -15.325915 ], [ 124.836983, -15.324725 ], [ 124.822163, -15.311885 ], [ 124.846793, -15.299055 ], [ 124.836373, -15.316365 ], [ 124.847703, -15.328535 ], [ 124.849473, -15.335425 ], [ 124.840523, -15.340645 ], [ 124.847663, -15.353175 ], [ 124.860933, -15.351775 ], [ 124.862333, -15.359115 ], [ 124.875693, -15.343495 ], [ 124.888623, -15.356435 ], [ 124.907062, -15.360235 ], [ 124.915252, -15.373315 ], [ 124.932372, -15.374735 ], [ 124.937082, -15.389855 ], [ 124.925322, -15.388875 ], [ 124.926742, -15.393845 ], [ 124.945192, -15.395785 ], [ 124.940572, -15.383625 ], [ 124.945912, -15.383725 ], [ 124.971323, -15.420935 ], [ 124.978842, -15.409605 ], [ 124.979942, -15.421805 ], [ 125.003773, -15.440144 ], [ 125.002983, -15.448394 ], [ 124.984083, -15.469585 ], [ 124.952193, -15.475225 ], [ 124.958033, -15.479725 ], [ 124.952943, -15.489225 ], [ 124.960243, -15.479945 ], [ 124.984463, -15.476015 ], [ 124.961793, -15.488745 ], [ 124.973223, -15.491195 ], [ 124.981343, -15.483485 ], [ 124.981743, -15.495005 ], [ 124.982983, -15.484275 ], [ 124.996233, -15.476995 ], [ 124.995723, -15.495635 ], [ 124.986903, -15.505835 ], [ 124.995973, -15.500835 ], [ 124.999513, -15.510445 ], [ 124.997823, -15.496305 ], [ 125.001393, -15.503625 ], [ 125.010163, -15.496494 ], [ 124.999793, -15.495054 ], [ 125.004033, -15.476634 ], [ 125.009493, -15.473224 ], [ 125.011283, -15.480144 ], [ 125.018333, -15.471494 ], [ 125.025963, -15.485704 ], [ 125.017603, -15.505324 ], [ 125.022903, -15.505934 ], [ 125.015273, -15.519864 ], [ 125.002103, -15.517755 ], [ 125.014113, -15.521784 ], [ 125.004593, -15.528485 ], [ 125.011343, -15.528575 ], [ 125.017103, -15.544665 ], [ 125.013013, -15.530545 ], [ 125.017843, -15.522114 ], [ 125.025553, -15.525814 ], [ 125.022053, -15.514764 ], [ 125.026773, -15.511124 ], [ 125.029373, -15.522184 ], [ 125.030123, -15.513814 ], [ 125.033158, -15.516397 ], [ 125.030933, -15.504444 ], [ 125.039873, -15.497854 ], [ 125.044243, -15.511504 ], [ 125.045003, -15.497044 ], [ 125.054793, -15.498594 ], [ 125.041693, -15.486434 ], [ 125.046883, -15.473764 ], [ 125.052273, -15.482554 ], [ 125.049203, -15.472624 ], [ 125.062622, -15.460934 ], [ 125.088652, -15.463214 ], [ 125.123099, -15.484205 ], [ 125.121240, -15.491535 ], [ 125.137358, -15.495446 ], [ 125.140927, -15.509086 ], [ 125.174716, -15.534266 ], [ 125.202236, -15.543866 ], [ 125.225298, -15.572295 ], [ 125.291007, -15.604725 ], [ 125.305398, -15.622804 ], [ 125.421186, -15.696025 ], [ 125.300717, -15.613775 ], [ 125.276688, -15.588135 ], [ 125.287617, -15.583565 ], [ 125.271448, -15.588054 ], [ 125.254859, -15.580894 ], [ 125.225236, -15.552796 ], [ 125.225865, -15.540026 ], [ 125.217086, -15.553396 ], [ 125.188466, -15.521966 ], [ 125.146096, -15.497106 ], [ 125.141497, -15.481946 ], [ 125.101922, -15.463394 ], [ 125.081702, -15.446414 ], [ 125.087702, -15.441514 ], [ 125.070032, -15.440244 ], [ 125.082532, -15.412294 ], [ 125.084312, -15.377714 ], [ 125.095002, -15.371304 ], [ 125.088822, -15.369454 ], [ 125.090851, -15.354984 ], [ 125.111261, -15.338864 ], [ 125.137341, -15.339444 ], [ 125.140451, -15.333104 ], [ 125.143821, -15.347914 ], [ 125.144531, -15.333874 ], [ 125.152091, -15.332494 ], [ 125.138811, -15.331304 ], [ 125.144261, -15.326534 ], [ 125.156011, -15.324564 ], [ 125.159121, -15.335264 ], [ 125.164091, -15.330574 ], [ 125.156381, -15.323464 ], [ 125.162971, -15.321034 ], [ 125.155061, -15.321404 ], [ 125.162561, -15.316964 ], [ 125.160361, -15.310094 ], [ 125.154771, -15.317424 ], [ 125.157741, -15.306144 ], [ 125.152511, -15.322434 ], [ 125.146541, -15.314114 ], [ 125.149591, -15.322104 ], [ 125.143451, -15.317884 ], [ 125.130531, -15.327834 ], [ 125.136771, -15.316854 ], [ 125.128651, -15.323994 ], [ 125.124781, -15.316554 ], [ 125.126571, -15.326604 ], [ 125.120651, -15.328774 ], [ 125.117001, -15.319294 ], [ 125.118781, -15.328894 ], [ 125.088561, -15.337704 ], [ 125.098371, -15.318464 ], [ 125.110131, -15.320234 ], [ 125.110341, -15.314584 ], [ 125.099171, -15.314174 ], [ 125.115521, -15.302024 ], [ 125.101911, -15.302634 ], [ 125.110011, -15.292444 ], [ 125.102481, -15.299354 ], [ 125.101861, -15.290434 ], [ 125.107671, -15.263074 ], [ 125.118921, -15.255614 ], [ 125.105101, -15.261394 ], [ 125.100321, -15.285924 ], [ 125.094301, -15.265044 ], [ 125.088141, -15.266764 ], [ 125.090001, -15.247804 ], [ 125.086621, -15.264394 ], [ 125.077451, -15.247674 ], [ 125.073421, -15.253924 ], [ 125.081001, -15.255604 ], [ 125.095661, -15.283114 ], [ 125.094991, -15.289674 ], [ 125.086821, -15.283764 ], [ 125.087541, -15.290154 ], [ 125.079761, -15.290854 ], [ 125.094301, -15.292044 ], [ 125.081251, -15.314354 ], [ 125.065431, -15.316214 ], [ 125.052142, -15.302394 ], [ 125.039642, -15.301394 ], [ 125.036012, -15.295534 ], [ 125.044951, -15.283864 ], [ 125.034942, -15.288194 ], [ 125.030672, -15.274794 ], [ 125.026372, -15.300314 ], [ 124.984202, -15.319974 ], [ 124.979122, -15.329394 ], [ 124.920082, -15.356465 ], [ 124.897912, -15.339925 ], [ 124.898232, -15.332125 ], [ 124.907792, -15.335035 ], [ 124.902412, -15.329635 ], [ 124.906782, -15.317425 ], [ 124.891472, -15.327745 ], [ 124.883052, -15.315905 ], [ 124.895232, -15.305355 ], [ 124.880122, -15.310485 ], [ 124.876132, -15.302025 ], [ 124.893842, -15.271805 ], [ 124.903252, -15.268955 ], [ 124.904642, -15.275725 ], [ 124.904602, -15.255504 ], [ 124.912982, -15.256384 ], [ 124.914052, -15.271194 ], [ 124.922812, -15.270484 ], [ 124.918802, -15.254564 ], [ 124.931922, -15.247404 ], [ 124.918652, -15.245294 ], [ 124.933372, -15.231134 ], [ 124.927432, -15.229224 ], [ 124.951502, -15.225084 ], [ 124.969492, -15.212154 ], [ 124.979172, -15.219914 ], [ 124.972102, -15.227244 ], [ 124.981512, -15.224204 ], [ 125.005642, -15.241934 ], [ 125.004551, -15.224464 ], [ 125.019861, -15.213574 ], [ 125.021981, -15.218534 ], [ 125.028521, -15.197044 ], [ 125.046801, -15.188714 ], [ 125.041481, -15.178584 ], [ 125.060211, -15.180784 ], [ 125.056031, -15.164434 ], [ 125.048641, -15.166364 ], [ 125.045811, -15.157674 ], [ 125.020161, -15.169504 ], [ 125.022781, -15.156164 ], [ 125.013821, -15.154504 ], [ 125.005831, -15.163344 ], [ 125.014251, -15.175854 ], [ 124.992821, -15.197844 ], [ 124.981971, -15.190984 ], [ 124.994911, -15.162004 ], [ 124.984821, -15.175954 ], [ 124.985371, -15.166124 ], [ 124.976101, -15.176314 ], [ 124.978281, -15.168174 ], [ 124.970141, -15.164254 ], [ 124.971241, -15.182994 ], [ 124.961052, -15.195574 ], [ 124.971102, -15.208304 ], [ 124.939892, -15.197104 ], [ 124.935172, -15.187414 ], [ 124.942822, -15.205114 ], [ 124.935902, -15.209734 ], [ 124.943782, -15.213134 ], [ 124.923002, -15.225734 ], [ 124.917152, -15.215134 ], [ 124.917542, -15.228244 ], [ 124.900982, -15.240224 ], [ 124.909902, -15.238994 ], [ 124.907942, -15.245664 ], [ 124.875772, -15.261915 ], [ 124.891822, -15.230334 ], [ 124.868842, -15.243635 ], [ 124.867492, -15.221605 ], [ 124.881142, -15.208434 ], [ 124.867672, -15.204085 ], [ 124.864272, -15.194945 ], [ 124.896372, -15.173444 ], [ 124.854812, -15.183565 ], [ 124.861542, -15.169044 ], [ 124.847462, -15.177935 ], [ 124.844662, -15.173195 ], [ 124.837712, -15.183155 ], [ 124.845792, -15.162704 ], [ 124.833912, -15.157965 ], [ 124.868992, -15.144884 ], [ 124.870682, -15.126234 ], [ 124.877902, -15.130614 ], [ 124.893082, -15.114314 ], [ 124.906811, -15.115854 ], [ 124.910381, -15.106804 ], [ 124.922051, -15.116714 ], [ 124.926441, -15.108684 ], [ 124.943241, -15.125574 ], [ 124.951681, -15.113234 ], [ 124.949461, -15.123544 ], [ 124.961471, -15.118744 ], [ 124.974441, -15.135314 ], [ 124.981151, -15.126474 ], [ 124.985051, -15.133284 ], [ 124.987731, -15.114254 ], [ 124.997071, -15.122814 ], [ 124.997581, -15.104844 ], [ 125.008631, -15.104694 ], [ 125.011141, -15.093504 ], [ 125.029861, -15.113284 ], [ 125.047701, -15.077114 ], [ 125.029411, -15.066214 ], [ 125.035511, -15.051964 ], [ 125.020271, -15.047044 ], [ 125.026201, -15.031344 ], [ 125.014181, -15.035084 ], [ 125.023540, -15.022064 ], [ 125.018950, -15.007954 ], [ 125.025170, -14.992374 ], [ 125.011970, -14.983164 ], [ 125.028000, -14.984254 ], [ 125.033060, -14.996014 ], [ 125.044620, -14.984444 ], [ 125.055650, -14.999784 ], [ 125.054480, -14.988094 ], [ 125.074290, -14.975763 ], [ 125.074720, -14.984233 ], [ 125.092830, -14.988153 ], [ 125.059010, -15.028274 ], [ 125.067320, -15.041464 ], [ 125.083470, -15.040613 ], [ 125.072370, -15.064904 ], [ 125.100800, -15.064473 ], [ 125.096550, -15.056263 ], [ 125.105520, -15.033183 ], [ 125.125670, -15.043503 ], [ 125.133410, -15.058953 ], [ 125.125620, -15.058983 ], [ 125.122050, -15.091643 ], [ 125.138470, -15.102933 ], [ 125.145020, -15.134713 ], [ 125.163240, -15.151363 ], [ 125.174300, -15.130073 ], [ 125.224260, -15.121173 ], [ 125.212490, -15.116363 ], [ 125.223400, -15.113043 ], [ 125.221980, -15.106273 ], [ 125.227010, -15.113823 ], [ 125.225450, -15.103433 ], [ 125.240530, -15.102513 ], [ 125.244450, -15.112953 ], [ 125.241960, -15.104263 ], [ 125.266000, -15.099983 ], [ 125.265040, -15.112673 ], [ 125.271020, -15.113733 ], [ 125.281100, -15.097543 ], [ 125.289720, -15.099653 ], [ 125.282300, -15.143623 ], [ 125.305860, -15.142163 ], [ 125.306790, -15.151633 ], [ 125.325340, -15.152463 ], [ 125.334930, -15.162923 ], [ 125.331580, -15.146453 ], [ 125.345979, -15.143103 ], [ 125.368199, -15.155863 ], [ 125.378299, -15.142613 ], [ 125.411869, -15.157572 ], [ 125.443089, -15.148722 ], [ 125.481329, -15.154802 ], [ 125.480176, -15.143002 ], [ 125.476659, -15.150472 ], [ 125.448139, -15.137622 ], [ 125.479907, -15.140257 ], [ 125.479299, -15.134032 ], [ 125.397089, -15.131702 ], [ 125.375949, -15.116982 ], [ 125.380459, -15.112322 ], [ 125.357649, -15.108373 ], [ 125.377529, -15.108842 ], [ 125.373079, -15.103322 ], [ 125.401919, -15.084662 ], [ 125.402149, -15.063762 ], [ 125.370129, -15.073742 ], [ 125.367399, -15.062462 ], [ 125.375479, -15.052712 ], [ 125.387009, -15.056492 ], [ 125.401919, -15.042532 ], [ 125.411479, -15.047452 ], [ 125.428438, -15.026812 ], [ 125.459278, -15.014902 ], [ 125.462448, -15.000202 ], [ 125.474788, -15.004772 ], [ 125.481598, -14.998582 ], [ 125.475118, -15.001492 ], [ 125.471498, -14.992512 ], [ 125.449898, -14.999932 ], [ 125.448429, -15.007052 ], [ 125.441378, -14.999442 ], [ 125.443938, -15.013852 ], [ 125.420979, -15.021652 ], [ 125.408979, -14.998582 ], [ 125.409369, -15.025102 ], [ 125.385939, -15.032552 ], [ 125.365369, -14.991422 ], [ 125.363489, -15.005782 ], [ 125.352929, -15.008882 ], [ 125.347199, -15.000892 ], [ 125.337329, -15.002632 ], [ 125.339509, -14.986812 ], [ 125.318749, -15.005873 ], [ 125.303589, -14.996303 ], [ 125.301659, -15.003353 ], [ 125.295459, -14.995933 ], [ 125.285599, -14.999193 ], [ 125.278089, -14.978823 ], [ 125.295989, -14.976633 ], [ 125.304639, -14.961642 ], [ 125.288589, -14.965993 ], [ 125.271199, -14.959593 ], [ 125.265069, -14.976143 ], [ 125.254389, -14.978403 ], [ 125.250369, -14.965523 ], [ 125.262409, -14.945913 ], [ 125.257649, -14.943753 ], [ 125.239579, -14.942323 ], [ 125.234219, -14.965343 ], [ 125.231559, -14.960593 ], [ 125.227699, -14.968933 ], [ 125.222109, -14.963673 ], [ 125.222459, -14.970493 ], [ 125.213719, -14.969813 ], [ 125.207809, -14.947173 ], [ 125.213589, -14.951833 ], [ 125.214899, -14.942803 ], [ 125.220569, -14.948583 ], [ 125.218789, -14.929273 ], [ 125.225759, -14.924003 ], [ 125.232979, -14.931573 ], [ 125.230709, -14.919133 ], [ 125.239259, -14.923253 ], [ 125.244539, -14.913953 ], [ 125.255039, -14.926583 ], [ 125.256299, -14.899833 ], [ 125.269899, -14.933283 ], [ 125.287209, -14.928732 ], [ 125.294689, -14.937972 ], [ 125.307689, -14.920222 ], [ 125.294619, -14.903582 ], [ 125.303349, -14.898192 ], [ 125.308079, -14.908702 ], [ 125.307089, -14.891202 ], [ 125.311399, -14.900052 ], [ 125.318919, -14.897002 ], [ 125.316739, -14.887622 ], [ 125.333978, -14.881312 ], [ 125.305039, -14.881492 ], [ 125.305659, -14.869632 ], [ 125.295889, -14.875282 ], [ 125.286669, -14.852972 ], [ 125.273949, -14.870092 ], [ 125.271689, -14.853712 ], [ 125.264099, -14.865422 ], [ 125.254279, -14.852522 ], [ 125.250949, -14.872263 ], [ 125.235519, -14.867573 ], [ 125.249119, -14.834542 ], [ 125.244139, -14.831702 ], [ 125.231739, -14.854463 ], [ 125.224569, -14.848003 ], [ 125.223559, -14.866613 ], [ 125.210099, -14.864883 ], [ 125.208909, -14.842863 ], [ 125.200539, -14.844073 ], [ 125.196869, -14.833333 ], [ 125.186169, -14.837353 ], [ 125.184119, -14.826953 ], [ 125.195269, -14.827563 ], [ 125.189499, -14.803773 ], [ 125.205169, -14.791023 ], [ 125.201709, -14.785133 ], [ 125.192979, -14.791203 ], [ 125.195479, -14.776193 ], [ 125.189429, -14.782683 ], [ 125.190029, -14.775383 ], [ 125.166789, -14.790513 ], [ 125.169699, -14.778803 ], [ 125.154659, -14.766543 ], [ 125.150789, -14.775103 ], [ 125.141429, -14.747673 ], [ 125.146709, -14.752173 ], [ 125.159799, -14.732123 ], [ 125.188979, -14.747033 ], [ 125.187739, -14.738673 ], [ 125.195288, -14.738372 ], [ 125.182908, -14.726913 ], [ 125.179848, -14.709853 ], [ 125.199248, -14.706542 ], [ 125.201138, -14.697972 ], [ 125.211478, -14.721712 ], [ 125.217468, -14.705712 ], [ 125.210558, -14.692252 ], [ 125.212858, -14.668662 ], [ 125.218438, -14.666872 ], [ 125.218748, -14.675232 ], [ 125.234358, -14.661182 ], [ 125.245648, -14.682222 ], [ 125.245558, -14.675562 ], [ 125.262108, -14.693082 ], [ 125.268238, -14.691002 ], [ 125.254288, -14.668482 ], [ 125.261008, -14.670652 ], [ 125.260828, -14.657782 ], [ 125.271388, -14.655222 ], [ 125.273688, -14.661332 ], [ 125.279288, -14.653672 ], [ 125.308418, -14.649942 ], [ 125.288448, -14.623222 ], [ 125.280348, -14.640212 ], [ 125.257406, -14.630754 ], [ 125.267378, -14.642792 ], [ 125.247968, -14.652992 ], [ 125.236098, -14.632812 ], [ 125.228338, -14.658452 ], [ 125.204228, -14.651462 ], [ 125.218878, -14.643842 ], [ 125.217988, -14.636682 ], [ 125.225558, -14.640832 ], [ 125.227768, -14.627512 ], [ 125.234988, -14.631122 ], [ 125.232118, -14.623082 ], [ 125.243828, -14.614362 ], [ 125.256529, -14.629695 ], [ 125.249018, -14.611132 ], [ 125.260868, -14.615552 ], [ 125.255378, -14.597692 ], [ 125.265497, -14.589492 ], [ 125.274497, -14.595092 ], [ 125.282477, -14.578602 ], [ 125.303577, -14.579582 ], [ 125.300407, -14.558232 ], [ 125.325707, -14.584412 ], [ 125.328237, -14.559242 ], [ 125.335667, -14.555772 ], [ 125.347587, -14.564732 ], [ 125.350097, -14.543852 ], [ 125.342577, -14.538972 ], [ 125.342057, -14.521583 ], [ 125.364136, -14.505743 ], [ 125.355047, -14.551771 ], [ 125.368927, -14.563561 ], [ 125.354587, -14.584062 ], [ 125.374667, -14.585501 ], [ 125.374447, -14.575771 ], [ 125.385837, -14.568241 ], [ 125.391607, -14.576161 ], [ 125.394427, -14.565111 ], [ 125.400087, -14.572811 ], [ 125.399597, -14.547181 ], [ 125.410267, -14.545631 ], [ 125.410657, -14.566631 ], [ 125.415187, -14.563941 ], [ 125.415487, -14.579181 ], [ 125.424977, -14.586431 ], [ 125.413447, -14.600511 ], [ 125.427247, -14.600781 ], [ 125.438227, -14.613791 ], [ 125.427157, -14.630582 ], [ 125.429947, -14.641492 ], [ 125.450027, -14.623762 ], [ 125.437247, -14.594601 ], [ 125.463416, -14.605291 ], [ 125.452366, -14.579181 ], [ 125.466636, -14.576061 ], [ 125.471196, -14.564451 ], [ 125.483426, -14.568031 ], [ 125.467386, -14.559241 ], [ 125.466526, -14.535531 ], [ 125.480456, -14.532192 ], [ 125.491386, -14.560332 ], [ 125.495646, -14.530434 ], [ 125.488606, -14.519234 ], [ 125.515286, -14.512984 ], [ 125.520306, -14.500245 ], [ 125.528766, -14.502753 ], [ 125.519936, -14.509164 ], [ 125.529546, -14.511893 ], [ 125.529056, -14.522282 ], [ 125.541376, -14.509891 ], [ 125.560606, -14.514799 ], [ 125.557786, -14.530709 ], [ 125.544676, -14.534960 ], [ 125.547995, -14.548409 ], [ 125.529916, -14.546101 ], [ 125.534786, -14.563911 ], [ 125.550415, -14.556540 ], [ 125.557345, -14.565930 ], [ 125.569426, -14.558280 ], [ 125.599326, -14.562640 ], [ 125.572466, -14.547679 ], [ 125.580975, -14.527829 ], [ 125.596486, -14.536559 ], [ 125.600125, -14.517499 ], [ 125.613705, -14.510638 ], [ 125.602375, -14.498308 ], [ 125.588215, -14.505729 ], [ 125.597975, -14.496718 ], [ 125.591035, -14.493659 ], [ 125.600655, -14.494019 ], [ 125.594484, -14.458782 ], [ 125.599454, -14.461622 ], [ 125.601264, -14.433523 ], [ 125.621944, -14.412914 ], [ 125.616884, -14.395855 ], [ 125.622704, -14.385715 ], [ 125.610414, -14.390425 ], [ 125.608014, -14.374955 ], [ 125.588564, -14.369935 ], [ 125.587904, -14.357856 ], [ 125.603694, -14.343566 ], [ 125.582784, -14.321836 ], [ 125.582253, -14.305357 ], [ 125.598783, -14.273786 ], [ 125.583923, -14.260127 ], [ 125.573683, -14.261647 ], [ 125.592142, -14.243746 ], [ 125.608253, -14.262376 ], [ 125.605922, -14.242996 ], [ 125.596212, -14.237326 ], [ 125.609042, -14.243676 ], [ 125.629212, -14.233576 ], [ 125.633382, -14.240246 ], [ 125.626292, -14.244856 ], [ 125.640962, -14.247506 ], [ 125.641522, -14.265886 ], [ 125.649142, -14.259596 ], [ 125.648562, -14.243426 ], [ 125.655072, -14.266816 ], [ 125.665032, -14.263116 ], [ 125.666713, -14.288186 ], [ 125.695303, -14.292425 ], [ 125.703273, -14.304065 ], [ 125.718123, -14.288635 ], [ 125.717913, -14.277455 ], [ 125.730063, -14.280985 ], [ 125.714523, -14.296635 ], [ 125.721573, -14.298465 ], [ 125.723753, -14.312235 ], [ 125.712684, -14.315156 ], [ 125.710864, -14.327676 ], [ 125.697204, -14.325386 ], [ 125.704594, -14.333646 ], [ 125.725694, -14.324545 ], [ 125.717564, -14.334116 ], [ 125.726354, -14.341815 ], [ 125.705854, -14.340977 ], [ 125.699584, -14.347627 ], [ 125.695464, -14.338767 ], [ 125.693454, -14.345807 ], [ 125.669514, -14.331757 ], [ 125.663374, -14.335537 ], [ 125.672954, -14.345197 ], [ 125.668294, -14.357267 ], [ 125.673864, -14.350957 ], [ 125.678024, -14.356727 ], [ 125.666304, -14.366966 ], [ 125.666134, -14.383836 ], [ 125.657274, -14.379206 ], [ 125.651544, -14.386005 ], [ 125.670704, -14.420364 ], [ 125.660844, -14.424744 ], [ 125.659294, -14.441673 ], [ 125.677584, -14.451981 ], [ 125.674995, -14.470029 ], [ 125.682415, -14.469369 ], [ 125.688726, -14.499406 ], [ 125.676255, -14.523458 ], [ 125.675275, -14.556720 ], [ 125.652015, -14.602050 ], [ 125.646906, -14.648196 ], [ 125.669335, -14.609220 ], [ 125.708916, -14.486577 ], [ 125.731015, -14.476989 ], [ 125.747165, -14.484740 ], [ 125.765385, -14.472240 ], [ 125.774405, -14.479710 ], [ 125.781145, -14.467760 ], [ 125.794595, -14.466420 ], [ 125.797984, -14.445320 ], [ 125.806095, -14.444320 ], [ 125.816165, -14.451670 ], [ 125.802565, -14.479080 ], [ 125.852075, -14.456690 ], [ 125.859125, -14.474980 ], [ 125.828055, -14.480920 ], [ 125.817205, -14.497590 ], [ 125.849884, -14.535910 ], [ 125.828664, -14.542770 ], [ 125.850194, -14.564020 ], [ 125.835584, -14.568060 ], [ 125.830574, -14.585090 ], [ 125.849264, -14.591680 ], [ 125.851414, -14.612131 ], [ 125.876234, -14.606260 ], [ 125.881294, -14.623330 ], [ 125.894764, -14.623090 ], [ 125.910034, -14.661590 ], [ 125.921304, -14.639820 ], [ 125.928484, -14.645810 ], [ 125.920994, -14.650920 ], [ 125.930556, -14.646090 ], [ 125.927334, -14.639710 ], [ 125.933824, -14.642650 ], [ 125.932689, -14.645013 ], [ 125.936734, -14.642970 ], [ 125.930514, -14.633170 ], [ 125.933034, -14.609250 ], [ 125.919144, -14.582810 ], [ 125.902694, -14.576490 ], [ 125.903864, -14.564420 ], [ 125.920684, -14.552100 ], [ 125.920584, -14.537240 ], [ 125.932514, -14.530610 ], [ 125.945674, -14.538730 ], [ 125.949224, -14.523500 ], [ 125.955594, -14.531290 ], [ 125.964754, -14.519230 ], [ 125.972524, -14.545740 ], [ 125.981893, -14.540460 ], [ 126.000293, -14.554990 ], [ 126.013863, -14.534170 ], [ 126.005733, -14.525030 ], [ 126.015463, -14.519480 ], [ 126.041913, -14.536720 ], [ 126.050933, -14.529640 ], [ 126.042223, -14.508710 ], [ 126.053453, -14.503950 ], [ 126.042893, -14.494360 ], [ 126.046333, -14.472220 ], [ 126.031503, -14.470550 ], [ 126.024763, -14.457800 ], [ 126.019604, -14.411380 ], [ 125.985464, -14.419530 ], [ 125.976674, -14.393300 ], [ 125.992424, -14.402570 ], [ 125.996134, -14.396370 ], [ 126.006154, -14.399770 ], [ 126.009843, -14.387790 ], [ 126.021753, -14.377610 ], [ 126.027903, -14.382000 ], [ 126.045812, -14.359160 ], [ 126.069332, -14.362279 ], [ 126.075451, -14.352209 ], [ 126.081902, -14.358909 ], [ 126.088431, -14.351209 ], [ 126.084231, -14.342819 ], [ 126.072891, -14.343749 ], [ 126.073901, -14.325669 ], [ 126.086411, -14.330619 ], [ 126.090221, -14.323149 ], [ 126.080491, -14.320909 ], [ 126.082891, -14.303509 ], [ 126.073041, -14.297769 ], [ 126.053401, -14.254209 ], [ 126.081261, -14.234159 ], [ 126.096542, -14.239239 ], [ 126.093932, -14.243999 ], [ 126.133220, -14.231448 ], [ 126.139799, -14.219798 ], [ 126.136639, -14.204338 ], [ 126.147759, -14.209168 ], [ 126.160189, -14.176488 ], [ 126.141279, -14.157778 ], [ 126.169718, -14.146188 ], [ 126.153278, -14.140128 ], [ 126.152198, -14.125679 ], [ 126.133328, -14.118039 ], [ 126.126217, -14.096930 ], [ 126.104427, -14.075750 ], [ 126.087797, -14.086170 ], [ 126.064057, -14.073350 ], [ 126.032518, -14.095100 ], [ 126.004138, -14.069511 ], [ 125.993078, -14.068211 ], [ 125.992058, -14.050161 ], [ 125.976228, -14.039641 ], [ 125.982957, -14.016401 ], [ 125.972917, -13.998672 ], [ 125.983847, -13.989812 ], [ 125.984127, -14.006141 ], [ 126.014357, -14.025441 ], [ 126.005357, -14.040031 ], [ 126.010148, -14.065431 ], [ 126.029287, -14.034671 ], [ 126.026707, -14.016721 ], [ 126.040027, -14.025160 ], [ 126.034767, -14.038300 ], [ 126.055987, -14.026600 ], [ 126.043337, -14.003241 ], [ 126.021867, -13.996861 ], [ 126.031706, -13.988411 ], [ 126.038526, -13.991581 ], [ 126.038186, -13.981531 ], [ 126.065356, -13.988221 ], [ 126.074746, -14.041470 ], [ 126.083056, -14.034670 ], [ 126.102616, -14.040840 ], [ 126.086386, -14.019080 ], [ 126.095626, -14.014770 ], [ 126.089946, -14.007550 ], [ 126.096645, -13.998580 ], [ 126.086406, -13.987680 ], [ 126.107235, -13.976750 ], [ 126.100415, -13.972790 ], [ 126.083866, -13.982030 ], [ 126.082265, -13.969610 ], [ 126.046546, -13.954331 ], [ 126.051416, -13.948011 ], [ 126.036036, -13.943481 ], [ 126.031316, -13.932181 ], [ 126.021126, -13.939281 ], [ 126.011206, -13.925722 ], [ 126.038725, -13.921011 ], [ 126.050266, -13.941691 ], [ 126.062745, -13.942951 ], [ 126.065075, -13.927261 ], [ 126.094815, -13.895340 ], [ 126.100705, -13.900080 ], [ 126.085315, -13.920950 ], [ 126.107865, -13.919060 ], [ 126.085635, -13.945680 ], [ 126.104965, -13.925600 ], [ 126.132355, -13.944490 ], [ 126.134225, -13.918970 ], [ 126.158385, -13.915040 ], [ 126.152835, -13.926550 ], [ 126.161615, -13.924300 ], [ 126.148425, -13.949690 ], [ 126.136855, -13.949570 ], [ 126.126205, -13.964010 ], [ 126.141355, -13.959850 ], [ 126.158695, -13.970140 ], [ 126.130935, -13.986940 ], [ 126.135785, -13.989430 ], [ 126.128665, -14.000910 ], [ 126.110075, -14.013830 ], [ 126.109766, -14.028290 ], [ 126.126785, -14.027040 ], [ 126.117255, -14.018670 ], [ 126.187035, -13.968129 ], [ 126.215825, -13.967579 ], [ 126.221025, -13.987908 ], [ 126.193385, -13.980099 ], [ 126.157755, -13.997800 ], [ 126.144305, -14.014990 ], [ 126.154145, -14.019150 ], [ 126.173325, -14.009720 ], [ 126.185025, -14.015809 ], [ 126.200705, -14.000949 ], [ 126.202245, -14.012578 ], [ 126.220415, -14.017498 ], [ 126.224715, -14.026419 ], [ 126.217475, -14.042929 ], [ 126.160256, -14.057540 ], [ 126.149526, -14.067510 ], [ 126.150826, -14.080160 ], [ 126.159126, -14.068730 ], [ 126.191856, -14.066269 ], [ 126.170376, -14.082140 ], [ 126.162547, -14.098990 ], [ 126.165707, -14.114239 ], [ 126.178147, -14.091379 ], [ 126.214206, -14.076488 ], [ 126.205797, -14.091539 ], [ 126.221697, -14.110478 ], [ 126.211997, -14.115918 ], [ 126.216517, -14.120878 ], [ 126.179398, -14.130359 ], [ 126.185678, -14.140388 ], [ 126.208928, -14.136488 ], [ 126.185969, -14.166938 ], [ 126.196429, -14.182728 ], [ 126.207869, -14.177048 ], [ 126.204649, -14.185188 ], [ 126.243279, -14.175718 ], [ 126.233119, -14.186808 ], [ 126.248049, -14.185637 ], [ 126.240099, -14.198087 ], [ 126.248120, -14.210717 ], [ 126.233399, -14.203647 ], [ 126.216000, -14.236568 ], [ 126.230710, -14.237088 ], [ 126.240970, -14.223397 ], [ 126.253630, -14.239177 ], [ 126.270600, -14.221057 ], [ 126.272530, -14.207147 ], [ 126.269720, -14.236537 ], [ 126.282170, -14.216727 ], [ 126.300850, -14.233617 ], [ 126.312679, -14.201277 ], [ 126.318689, -14.197867 ], [ 126.323849, -14.207487 ], [ 126.339398, -14.192717 ], [ 126.360798, -14.189937 ], [ 126.353697, -14.177307 ], [ 126.323087, -14.158197 ], [ 126.320887, -14.140977 ], [ 126.305488, -14.154747 ], [ 126.304048, -14.138817 ], [ 126.297568, -14.138837 ], [ 126.315217, -14.119016 ], [ 126.314457, -14.097326 ], [ 126.345006, -14.098007 ], [ 126.343836, -14.058816 ], [ 126.334326, -14.050036 ], [ 126.371905, -14.045167 ], [ 126.394325, -14.051776 ], [ 126.387615, -14.037886 ], [ 126.396554, -14.014916 ], [ 126.425344, -14.012066 ], [ 126.438364, -13.982726 ], [ 126.446014, -14.002306 ], [ 126.454354, -14.005216 ], [ 126.485223, -13.995696 ], [ 126.495853, -13.977166 ], [ 126.495263, -13.957636 ], [ 126.511483, -13.964726 ], [ 126.536992, -13.934446 ], [ 126.554362, -13.951825 ], [ 126.565248, -13.944527 ], [ 126.565932, -13.954755 ], [ 126.539223, -13.964375 ], [ 126.508963, -14.008846 ], [ 126.491033, -14.008576 ], [ 126.487414, -14.028476 ], [ 126.497194, -14.045846 ], [ 126.483544, -14.047366 ], [ 126.449465, -14.083736 ], [ 126.454675, -14.103526 ], [ 126.478804, -14.109646 ], [ 126.481304, -14.097426 ], [ 126.492184, -14.098746 ], [ 126.511864, -14.086026 ], [ 126.513734, -14.075496 ], [ 126.525444, -14.081666 ], [ 126.525144, -14.092406 ], [ 126.499484, -14.100186 ], [ 126.499154, -14.130286 ], [ 126.517254, -14.147236 ], [ 126.515445, -14.157416 ], [ 126.537854, -14.147156 ], [ 126.555814, -14.151036 ], [ 126.569774, -14.139795 ], [ 126.574924, -14.154575 ], [ 126.562614, -14.169996 ], [ 126.570464, -14.194595 ], [ 126.564995, -14.216765 ], [ 126.575465, -14.228705 ], [ 126.601665, -14.235825 ], [ 126.610414, -14.198385 ], [ 126.606984, -14.180095 ], [ 126.633614, -14.191215 ], [ 126.651414, -14.173455 ], [ 126.647314, -14.137545 ], [ 126.660983, -14.114764 ], [ 126.644843, -14.077095 ], [ 126.663253, -14.078134 ], [ 126.685593, -14.103694 ], [ 126.689353, -14.091244 ], [ 126.686294, -14.131034 ], [ 126.693834, -14.134724 ], [ 126.719663, -14.120604 ], [ 126.717883, -14.104104 ], [ 126.710223, -14.100294 ], [ 126.718163, -14.090204 ], [ 126.729743, -14.092184 ], [ 126.737163, -14.070444 ], [ 126.723133, -14.065204 ], [ 126.762732, -14.050093 ], [ 126.747153, -14.031294 ], [ 126.753093, -14.016123 ], [ 126.745913, -14.014683 ], [ 126.757773, -14.016353 ], [ 126.753993, -14.011363 ], [ 126.738623, -14.013934 ], [ 126.723313, -14.029374 ], [ 126.701862, -14.021224 ], [ 126.695932, -13.999014 ], [ 126.706052, -13.973334 ], [ 126.728763, -13.996574 ], [ 126.751553, -13.991793 ], [ 126.750702, -13.972143 ], [ 126.768062, -13.975383 ], [ 126.772132, -13.983173 ], [ 126.786802, -13.970273 ], [ 126.796982, -13.972513 ], [ 126.789767, -13.975674 ], [ 126.791802, -13.983813 ], [ 126.798032, -13.976013 ], [ 126.807192, -13.986383 ], [ 126.793432, -13.989343 ], [ 126.801312, -13.992613 ], [ 126.810312, -13.984123 ], [ 126.810002, -13.997903 ], [ 126.817372, -13.982073 ], [ 126.838291, -13.971073 ], [ 126.878691, -13.982063 ], [ 126.882141, -13.998573 ], [ 126.905371, -13.985232 ], [ 126.865071, -13.945582 ], [ 126.840061, -13.937523 ], [ 126.839461, -13.927693 ], [ 126.805571, -13.930473 ], [ 126.809481, -13.916793 ], [ 126.799571, -13.883033 ], [ 126.772811, -13.860723 ], [ 126.758402, -13.826063 ], [ 126.760452, -13.808213 ], [ 126.743302, -13.791753 ], [ 126.766621, -13.776463 ], [ 126.757742, -13.786983 ], [ 126.767112, -13.787083 ], [ 126.764342, -13.791493 ], [ 126.778191, -13.781523 ], [ 126.789172, -13.791303 ], [ 126.794021, -13.776413 ], [ 126.818740, -13.769352 ], [ 126.818201, -13.784383 ], [ 126.831500, -13.786842 ], [ 126.826231, -13.808542 ], [ 126.842320, -13.816982 ], [ 126.847370, -13.797762 ], [ 126.872940, -13.799002 ], [ 126.851590, -13.774482 ], [ 126.851319, -13.758212 ], [ 126.868430, -13.761342 ], [ 126.870490, -13.751392 ], [ 126.881000, -13.748662 ], [ 126.897790, -13.758672 ], [ 126.897580, -13.766352 ], [ 126.920470, -13.768332 ], [ 126.921769, -13.776122 ], [ 126.944399, -13.767592 ], [ 126.914390, -13.741232 ], [ 126.954289, -13.747572 ], [ 126.963289, -13.741672 ], [ 126.969558, -13.752502 ], [ 126.984018, -13.754161 ], [ 126.977909, -13.761412 ], [ 126.985739, -13.787482 ], [ 126.996269, -13.790842 ], [ 126.998279, -13.768691 ], [ 127.002059, -13.793992 ], [ 127.012349, -13.795772 ], [ 127.013479, -13.785372 ], [ 127.030769, -13.803962 ], [ 127.017699, -13.803552 ], [ 127.006070, -13.823782 ], [ 127.030460, -13.816962 ], [ 127.025980, -13.827032 ], [ 127.036640, -13.832081 ], [ 127.047079, -13.805722 ], [ 127.055820, -13.828181 ], [ 127.045780, -13.833411 ], [ 127.044320, -13.848891 ], [ 127.057510, -13.847831 ], [ 127.068570, -13.835941 ], [ 127.081420, -13.839971 ], [ 127.081120, -13.854541 ], [ 127.065080, -13.864191 ], [ 127.076660, -13.869811 ], [ 127.060580, -13.907921 ], [ 127.069350, -13.896161 ], [ 127.102850, -13.884301 ], [ 127.098640, -13.903301 ], [ 127.109320, -13.913881 ], [ 127.100760, -13.914021 ], [ 127.093860, -13.927381 ], [ 127.104610, -13.925311 ], [ 127.111470, -13.934441 ], [ 127.107690, -13.944621 ], [ 127.122740, -13.948191 ], [ 127.113770, -13.962791 ], [ 127.117500, -13.970581 ], [ 127.127200, -13.965691 ], [ 127.142880, -13.982251 ], [ 127.145030, -13.966870 ], [ 127.153130, -13.967070 ], [ 127.148230, -13.956130 ], [ 127.157640, -13.933730 ], [ 127.178780, -13.925860 ], [ 127.166250, -13.917880 ], [ 127.169810, -13.910640 ], [ 127.190729, -13.904010 ], [ 127.195539, -13.922300 ], [ 127.186230, -13.938830 ], [ 127.189890, -13.957230 ], [ 127.195220, -13.959470 ], [ 127.198750, -13.944770 ], [ 127.207750, -13.973590 ], [ 127.214300, -13.966490 ], [ 127.207020, -13.956610 ], [ 127.210440, -13.944620 ], [ 127.226629, -13.942520 ], [ 127.235169, -13.907810 ], [ 127.246709, -13.900420 ], [ 127.249049, -13.906850 ], [ 127.265579, -13.901930 ], [ 127.282769, -13.919260 ], [ 127.275789, -13.937970 ], [ 127.290699, -13.933810 ], [ 127.318129, -13.961160 ], [ 127.334408, -13.963249 ], [ 127.345758, -13.954949 ], [ 127.345279, -13.939549 ], [ 127.329579, -13.933659 ], [ 127.321859, -13.914700 ], [ 127.347398, -13.906579 ], [ 127.359788, -13.908669 ], [ 127.360578, -13.918919 ], [ 127.377458, -13.928029 ], [ 127.374108, -13.939149 ], [ 127.395568, -13.939479 ], [ 127.410758, -13.961389 ], [ 127.430068, -13.942949 ], [ 127.424978, -13.966699 ], [ 127.444448, -13.972489 ], [ 127.439628, -13.980189 ], [ 127.455478, -13.980239 ], [ 127.454258, -13.990069 ], [ 127.467208, -14.000889 ], [ 127.448538, -14.024779 ], [ 127.459268, -14.035099 ], [ 127.452509, -14.058779 ], [ 127.477548, -14.062309 ], [ 127.482908, -14.085069 ], [ 127.493398, -14.060719 ], [ 127.504618, -14.074668 ], [ 127.515198, -14.073068 ], [ 127.514428, -14.066278 ], [ 127.523668, -14.069278 ], [ 127.508498, -14.087828 ], [ 127.514828, -14.094188 ], [ 127.521018, -14.085418 ], [ 127.537568, -14.086318 ], [ 127.523918, -14.119788 ], [ 127.543498, -14.099808 ], [ 127.549568, -14.110468 ], [ 127.556778, -14.104638 ], [ 127.589128, -14.144257 ], [ 127.615928, -14.143657 ], [ 127.624628, -14.160547 ], [ 127.648428, -14.169617 ], [ 127.634228, -14.179437 ], [ 127.669848, -14.190547 ], [ 127.665328, -14.209727 ], [ 127.677248, -14.211607 ], [ 127.671778, -14.221567 ], [ 127.683728, -14.212327 ], [ 127.692188, -14.231927 ], [ 127.691198, -14.242767 ], [ 127.684628, -14.236627 ], [ 127.683198, -14.243397 ], [ 127.710598, -14.252707 ], [ 127.719348, -14.276646 ], [ 127.738237, -14.281346 ], [ 127.737617, -14.287785 ], [ 127.762677, -14.303185 ], [ 127.779667, -14.333224 ], [ 127.780117, -14.344414 ], [ 127.765877, -14.352134 ], [ 127.760697, -14.367134 ], [ 127.782117, -14.350534 ], [ 127.788277, -14.388424 ], [ 127.797077, -14.390954 ], [ 127.806517, -14.382534 ], [ 127.810467, -14.402104 ], [ 127.819307, -14.395824 ], [ 127.828427, -14.402544 ], [ 127.819757, -14.440574 ], [ 127.834657, -14.451954 ], [ 127.850137, -14.484474 ], [ 127.880247, -14.470844 ], [ 127.882267, -14.484754 ], [ 127.902097, -14.505064 ], [ 127.929266, -14.502854 ], [ 127.949346, -14.524204 ], [ 127.952566, -14.529414 ], [ 127.938877, -14.530134 ], [ 127.940227, -14.543374 ], [ 127.927367, -14.557995 ], [ 127.953527, -14.570555 ], [ 127.952637, -14.586036 ], [ 127.962707, -14.590376 ], [ 127.984806, -14.579635 ], [ 127.993046, -14.556164 ], [ 128.000516, -14.570555 ], [ 128.027856, -14.579275 ], [ 128.069336, -14.620711 ], [ 128.069376, -14.650229 ], [ 128.085937, -14.646890 ], [ 128.086787, -14.638980 ], [ 128.101917, -14.656341 ], [ 128.130907, -14.664140 ], [ 128.137237, -14.677620 ], [ 128.131267, -14.687091 ], [ 128.150207, -14.685579 ], [ 128.161137, -14.708009 ], [ 128.184217, -14.714649 ], [ 128.201207, -14.706468 ], [ 128.221707, -14.721238 ], [ 128.214227, -14.733188 ], [ 128.225111, -14.740276 ], [ 128.218437, -14.754568 ], [ 128.200627, -14.737549 ], [ 128.183877, -14.744259 ], [ 128.175206, -14.791808 ], [ 128.193996, -14.828048 ], [ 128.192446, -14.838658 ], [ 128.151186, -14.841889 ], [ 128.118506, -14.861340 ], [ 128.122946, -14.871040 ], [ 128.139096, -14.870769 ], [ 128.107867, -14.946912 ], [ 128.113357, -14.993273 ], [ 128.100067, -15.011153 ], [ 128.101407, -15.037263 ], [ 128.094407, -15.044714 ], [ 128.103087, -15.064504 ], [ 128.092127, -15.070924 ], [ 128.074948, -15.103994 ], [ 128.083549, -15.152394 ], [ 128.098879, -15.167344 ], [ 128.091670, -15.214224 ], [ 128.080241, -15.233044 ], [ 128.087771, -15.237614 ], [ 128.081921, -15.258505 ], [ 128.092781, -15.281025 ], [ 128.065941, -15.301185 ], [ 128.044771, -15.288255 ], [ 128.040359, -15.292772 ], [ 128.066031, -15.312265 ], [ 128.067131, -15.335325 ], [ 128.086630, -15.366225 ], [ 128.089360, -15.390305 ], [ 128.077360, -15.433896 ], [ 128.052410, -15.479496 ], [ 128.019490, -15.494326 ], [ 127.995530, -15.514146 ], [ 127.998780, -15.518106 ], [ 128.018420, -15.501776 ], [ 128.068120, -15.492076 ], [ 128.096400, -15.467166 ], [ 128.114330, -15.427996 ], [ 128.124710, -15.375356 ], [ 128.128171, -15.291725 ], [ 128.116130, -15.260055 ], [ 128.100201, -15.250185 ], [ 128.115140, -15.234624 ], [ 128.110080, -15.209634 ], [ 128.128299, -15.183684 ], [ 128.188169, -15.228784 ], [ 128.258018, -15.306325 ], [ 128.256028, -15.316375 ], [ 128.281608, -15.345915 ], [ 128.281309, -15.390565 ], [ 128.296279, -15.431045 ], [ 128.292269, -15.459855 ], [ 128.321489, -15.487814 ], [ 128.327369, -15.505114 ], [ 128.341638, -15.501284 ], [ 128.329629, -15.501044 ], [ 128.324288, -15.483854 ], [ 128.299139, -15.460205 ], [ 128.307258, -15.413995 ], [ 128.295269, -15.401315 ], [ 128.292298, -15.363675 ], [ 128.300758, -15.319724 ], [ 128.278108, -15.278554 ], [ 128.239588, -15.247524 ], [ 128.220238, -15.203753 ], [ 128.221067, -15.130853 ], [ 128.194027, -15.093513 ], [ 128.228166, -15.003152 ], [ 128.265466, -14.982582 ], [ 128.289216, -14.974082 ], [ 128.307286, -14.994602 ], [ 128.324676, -15.036072 ], [ 128.331196, -15.035402 ], [ 128.314716, -14.995872 ], [ 128.292496, -14.966752 ], [ 128.295856, -14.937371 ], [ 128.313916, -14.925681 ], [ 128.323066, -14.933171 ], [ 128.328045, -14.974102 ], [ 128.361855, -15.066602 ], [ 128.373975, -15.061442 ], [ 128.364115, -15.040862 ], [ 128.358105, -14.991272 ], [ 128.378605, -15.000572 ], [ 128.410375, -15.032072 ], [ 128.387495, -14.997802 ], [ 128.349105, -14.967962 ], [ 128.358205, -14.885031 ], [ 128.368655, -14.889931 ], [ 128.401045, -14.938512 ], [ 128.418915, -14.950322 ], [ 128.429984, -14.980532 ], [ 128.448614, -15.002052 ], [ 128.455874, -14.995642 ], [ 128.438024, -14.974452 ], [ 128.419215, -14.927722 ], [ 128.417765, -14.904322 ], [ 128.402385, -14.878961 ], [ 128.421665, -14.881731 ], [ 128.473884, -14.956702 ], [ 128.501724, -14.978472 ], [ 128.511423, -15.013612 ], [ 128.518983, -15.014752 ], [ 128.507784, -14.973742 ], [ 128.470344, -14.931262 ], [ 128.477134, -14.911612 ], [ 128.466974, -14.889092 ], [ 128.427475, -14.841061 ], [ 128.395465, -14.821751 ], [ 128.380945, -14.823400 ], [ 128.393426, -14.804450 ], [ 128.418545, -14.795261 ], [ 128.436395, -14.812151 ], [ 128.465935, -14.799691 ], [ 128.475265, -14.786151 ], [ 128.485125, -14.791381 ], [ 128.506635, -14.781042 ], [ 128.535895, -14.786992 ], [ 128.528475, -14.779962 ], [ 128.550455, -14.767932 ], [ 128.554145, -14.780822 ], [ 128.588494, -14.797402 ], [ 128.587074, -14.807682 ], [ 128.596034, -14.800692 ], [ 128.623444, -14.803922 ], [ 128.627874, -14.798952 ], [ 128.608834, -14.789872 ], [ 128.613484, -14.787402 ], [ 128.678874, -14.795782 ], [ 128.718104, -14.816083 ], [ 128.718904, -14.826593 ], [ 128.738404, -14.839283 ], [ 128.777323, -14.840583 ], [ 128.767903, -14.853113 ], [ 128.777203, -14.847483 ], [ 128.787763, -14.860493 ], [ 128.789163, -14.851453 ], [ 128.793573, -14.860273 ], [ 128.808563, -14.856453 ], [ 128.818893, -14.866523 ], [ 128.827503, -14.855683 ], [ 128.830403, -14.864053 ], [ 128.832733, -14.858293 ], [ 128.906063, -14.855543 ], [ 128.914072, -14.858483 ], [ 128.912912, -14.867303 ], [ 128.916392, -14.862673 ], [ 128.931732, -14.872743 ], [ 128.953922, -14.872753 ], [ 128.967402, -14.884743 ], [ 128.972172, -14.876613 ], [ 129.001242, -14.879473 ], [ 129.001340, -31.687068 ], [ 128.896362, -31.717043 ], [ 128.706703, -31.808653 ], [ 128.642335, -31.850935 ], [ 128.551750, -31.878161 ], [ 128.494827, -31.911905 ], [ 128.314269, -31.979367 ], [ 128.022372, -32.073979 ], [ 127.705705, -32.136702 ], [ 127.585376, -32.175053 ], [ 127.548597, -32.190753 ], [ 127.518817, -32.214124 ], [ 127.452078, -32.222294 ], [ 127.325960, -32.256526 ], [ 127.213371, -32.276387 ], [ 127.089312, -32.280569 ], [ 126.956523, -32.297599 ], [ 126.772578, -32.292341 ], [ 126.734240, -32.305883 ], [ 126.672789, -32.308371 ], [ 126.422025, -32.284084 ], [ 126.203139, -32.232277 ], [ 126.160689, -32.237738 ], [ 126.081171, -32.275120 ], [ 126.037052, -32.268591 ], [ 125.951010, -32.290542 ], [ 125.801225, -32.366725 ], [ 125.532060, -32.549232 ], [ 125.485070, -32.559642 ], [ 125.439021, -32.582893 ], [ 125.315272, -32.607915 ], [ 125.230343, -32.643236 ], [ 125.102415, -32.715398 ], [ 125.026186, -32.728859 ], [ 124.993076, -32.762700 ], [ 124.928047, -32.794161 ], [ 124.894578, -32.832831 ], [ 124.814039, -32.872863 ], [ 124.741000, -32.900144 ], [ 124.393573, -32.949078 ], [ 124.305384, -32.980910 ], [ 124.238655, -33.017591 ], [ 124.154307, -33.096063 ], [ 124.101189, -33.176154 ], [ 124.079110, -33.249225 ], [ 123.998000, -33.426375 ], [ 123.976020, -33.558606 ], [ 123.935731, -33.576858 ], [ 123.930731, -33.586658 ], [ 123.875072, -33.599018 ], [ 123.866822, -33.618738 ], [ 123.877712, -33.633178 ], [ 123.810233, -33.664769 ], [ 123.774417, -33.698186 ], [ 123.756934, -33.723069 ], [ 123.747493, -33.765330 ], [ 123.749193, -33.783140 ], [ 123.764154, -33.795240 ], [ 123.742364, -33.809171 ], [ 123.707623, -33.816420 ], [ 123.693654, -33.831491 ], [ 123.656293, -33.846950 ], [ 123.639134, -33.877000 ], [ 123.573375, -33.887731 ], [ 123.558005, -33.906052 ], [ 123.553025, -33.927792 ], [ 123.534286, -33.940132 ], [ 123.512086, -33.942523 ], [ 123.508005, -33.922102 ], [ 123.474015, -33.906182 ], [ 123.412296, -33.893833 ], [ 123.371446, -33.895893 ], [ 123.330286, -33.918783 ], [ 123.328676, -33.934673 ], [ 123.299967, -33.953684 ], [ 123.303027, -33.961144 ], [ 123.286897, -33.979874 ], [ 123.275427, -33.975864 ], [ 123.251957, -33.997484 ], [ 123.227257, -33.988924 ], [ 123.212948, -34.001854 ], [ 123.163068, -34.016635 ], [ 123.151988, -34.010635 ], [ 123.165398, -34.008405 ], [ 123.172148, -33.989535 ], [ 123.148458, -33.976295 ], [ 123.162437, -33.968564 ], [ 123.161067, -33.945934 ], [ 123.134157, -33.917684 ], [ 123.139767, -33.911514 ], [ 123.133887, -33.904374 ], [ 123.083117, -33.871534 ], [ 123.022718, -33.856644 ], [ 123.004848, -33.870814 ], [ 123.002258, -33.885514 ], [ 122.979058, -33.887415 ], [ 122.975888, -33.902315 ], [ 122.970008, -33.890045 ], [ 122.935088, -33.886105 ], [ 122.829389, -33.909975 ], [ 122.812679, -33.889385 ], [ 122.773819, -33.877735 ], [ 122.754619, -33.881275 ], [ 122.747759, -33.895826 ], [ 122.669819, -33.888616 ], [ 122.653460, -33.889316 ], [ 122.649270, -33.897436 ], [ 122.618690, -33.892836 ], [ 122.598010, -33.902436 ], [ 122.601400, -33.913366 ], [ 122.591650, -33.909656 ], [ 122.581650, -33.916316 ], [ 122.585580, -33.932886 ], [ 122.597360, -33.937277 ], [ 122.580720, -33.945177 ], [ 122.576530, -33.955217 ], [ 122.582630, -33.958037 ], [ 122.571530, -33.961417 ], [ 122.575040, -33.948337 ], [ 122.560820, -33.944847 ], [ 122.557570, -33.936617 ], [ 122.536050, -33.935267 ], [ 122.509660, -33.953417 ], [ 122.500720, -33.936507 ], [ 122.491110, -33.938987 ], [ 122.444431, -33.919227 ], [ 122.364201, -33.913517 ], [ 122.349301, -33.921837 ], [ 122.354151, -33.933118 ], [ 122.326281, -33.928908 ], [ 122.274502, -33.959478 ], [ 122.268242, -33.968148 ], [ 122.280641, -33.989818 ], [ 122.277312, -34.000749 ], [ 122.264102, -33.995879 ], [ 122.249432, -34.004599 ], [ 122.243791, -33.994139 ], [ 122.227021, -33.988009 ], [ 122.211532, -34.008729 ], [ 122.209432, -34.000759 ], [ 122.197792, -34.000309 ], [ 122.200762, -34.008499 ], [ 122.188992, -34.008159 ], [ 122.193252, -34.017189 ], [ 122.171452, -34.011419 ], [ 122.165303, -34.002439 ], [ 122.156563, -34.013559 ], [ 122.136743, -34.006599 ], [ 122.113573, -34.017199 ], [ 122.112523, -34.000369 ], [ 122.093293, -34.002839 ], [ 122.093193, -33.993929 ], [ 122.109852, -33.992519 ], [ 122.118982, -33.980029 ], [ 122.085382, -33.902798 ], [ 122.030782, -33.844979 ], [ 122.001002, -33.829299 ], [ 121.986272, -33.829229 ], [ 121.982962, -33.839139 ], [ 121.956102, -33.833489 ], [ 121.915102, -33.838259 ], [ 121.893972, -33.863519 ], [ 121.901804, -33.872580 ], [ 121.908096, -33.867508 ], [ 121.900482, -33.878999 ], [ 121.874532, -33.876839 ], [ 121.863402, -33.881959 ], [ 121.864832, -33.890649 ], [ 121.829272, -33.888879 ], [ 121.789874, -33.909049 ], [ 121.756933, -33.885968 ], [ 121.763143, -33.886908 ], [ 121.695084, -33.861210 ], [ 121.676684, -33.863118 ], [ 121.674814, -33.874485 ], [ 121.644684, -33.898179 ], [ 121.646554, -33.887368 ], [ 121.627666, -33.869310 ], [ 121.546584, -33.827990 ], [ 121.531603, -33.825729 ], [ 121.504836, -33.839601 ], [ 121.467732, -33.822859 ], [ 121.459999, -33.828358 ], [ 121.435524, -33.820080 ], [ 121.428551, -33.830231 ], [ 121.361874, -33.815443 ], [ 121.350196, -33.820250 ], [ 121.349451, -33.830252 ], [ 121.323819, -33.821575 ], [ 121.298993, -33.825045 ], [ 121.296339, -33.840199 ], [ 121.275900, -33.842241 ], [ 121.268492, -33.850711 ], [ 121.198696, -33.844581 ], [ 121.177135, -33.877608 ], [ 121.172767, -33.867086 ], [ 121.099835, -33.848509 ], [ 121.083487, -33.851131 ], [ 121.079426, -33.862300 ], [ 121.013914, -33.860947 ], [ 121.007921, -33.872749 ], [ 120.939765, -33.862264 ], [ 120.918118, -33.870538 ], [ 120.906146, -33.861448 ], [ 120.868536, -33.856260 ], [ 120.841095, -33.865697 ], [ 120.840007, -33.873364 ], [ 120.811364, -33.886397 ], [ 120.813474, -33.892650 ], [ 120.779753, -33.885942 ], [ 120.712683, -33.893222 ], [ 120.671874, -33.885044 ], [ 120.639000, -33.891729 ], [ 120.593472, -33.886246 ], [ 120.553370, -33.903171 ], [ 120.562314, -33.920466 ], [ 120.558378, -33.926413 ], [ 120.518014, -33.935412 ], [ 120.494711, -33.953202 ], [ 120.471276, -33.956781 ], [ 120.469348, -33.966734 ], [ 120.447181, -33.963548 ], [ 120.436570, -33.971882 ], [ 120.315466, -33.942267 ], [ 120.231065, -33.932406 ], [ 120.176725, -33.934825 ], [ 120.126592, -33.954487 ], [ 120.042168, -33.923368 ], [ 120.011342, -33.936773 ], [ 119.991368, -33.935898 ], [ 119.984181, -33.954596 ], [ 119.967498, -33.956070 ], [ 119.944395, -33.977887 ], [ 119.920455, -33.968332 ], [ 119.850753, -33.969836 ], [ 119.816370, -33.983476 ], [ 119.788001, -34.005408 ], [ 119.781732, -34.026733 ], [ 119.750434, -34.040828 ], [ 119.733850, -34.060742 ], [ 119.710912, -34.061702 ], [ 119.681199, -34.081399 ], [ 119.650299, -34.087697 ], [ 119.634353, -34.102267 ], [ 119.640269, -34.112630 ], [ 119.597462, -34.134587 ], [ 119.578523, -34.160146 ], [ 119.587825, -34.170846 ], [ 119.534915, -34.221382 ], [ 119.503722, -34.288015 ], [ 119.482109, -34.279528 ], [ 119.457120, -34.289075 ], [ 119.461742, -34.295256 ], [ 119.469828, -34.288846 ], [ 119.486654, -34.295244 ], [ 119.503207, -34.290350 ], [ 119.499148, -34.330005 ], [ 119.507448, -34.359128 ], [ 119.528815, -34.364261 ], [ 119.541840, -34.382834 ], [ 119.569888, -34.376625 ], [ 119.576278, -34.387181 ], [ 119.547440, -34.389647 ], [ 119.502718, -34.411473 ], [ 119.478108, -34.402160 ], [ 119.492468, -34.393046 ], [ 119.482512, -34.375228 ], [ 119.453434, -34.378806 ], [ 119.441935, -34.366471 ], [ 119.415734, -34.373289 ], [ 119.398674, -34.386873 ], [ 119.407986, -34.395823 ], [ 119.390842, -34.419446 ], [ 119.403232, -34.426487 ], [ 119.397248, -34.440185 ], [ 119.402417, -34.452500 ], [ 119.418618, -34.458921 ], [ 119.390190, -34.459595 ], [ 119.382143, -34.485365 ], [ 119.355734, -34.474705 ], [ 119.366190, -34.462483 ], [ 119.346392, -34.446224 ], [ 119.289851, -34.451980 ], [ 119.271141, -34.469061 ], [ 119.279837, -34.476825 ], [ 119.277469, -34.490228 ], [ 119.288592, -34.493436 ], [ 119.284847, -34.513085 ], [ 119.277191, -34.515537 ], [ 119.278860, -34.523533 ], [ 119.266819, -34.515404 ], [ 119.257808, -34.518870 ], [ 119.254490, -34.534600 ], [ 119.222245, -34.531332 ], [ 119.239360, -34.516177 ], [ 119.217883, -34.497961 ], [ 119.180712, -34.485889 ], [ 119.173540, -34.494425 ], [ 119.152230, -34.494511 ], [ 119.117503, -34.470120 ], [ 119.069109, -34.458813 ], [ 119.058059, -34.463512 ], [ 118.960905, -34.451277 ], [ 118.911791, -34.462878 ], [ 118.900958, -34.476440 ], [ 118.912935, -34.488036 ], [ 118.905782, -34.496859 ], [ 118.914168, -34.503178 ], [ 118.856164, -34.501178 ], [ 118.811598, -34.509473 ], [ 118.755351, -34.545573 ], [ 118.739631, -34.573564 ], [ 118.745441, -34.593669 ], [ 118.781709, -34.609001 ], [ 118.751991, -34.622448 ], [ 118.745957, -34.638323 ], [ 118.722385, -34.656893 ], [ 118.701391, -34.654836 ], [ 118.666082, -34.667801 ], [ 118.645197, -34.691221 ], [ 118.620074, -34.686600 ], [ 118.579204, -34.705715 ], [ 118.561918, -34.703689 ], [ 118.519837, -34.717451 ], [ 118.440144, -34.760757 ], [ 118.400428, -34.823854 ], [ 118.397075, -34.876645 ], [ 118.422406, -34.881459 ], [ 118.427747, -34.898744 ], [ 118.402601, -34.905161 ], [ 118.403425, -34.916704 ], [ 118.389714, -34.915000 ], [ 118.390579, -34.907659 ], [ 118.378616, -34.902794 ], [ 118.339161, -34.902690 ], [ 118.331264, -34.898061 ], [ 118.334039, -34.891437 ], [ 118.320910, -34.904264 ], [ 118.298682, -34.903639 ], [ 118.299691, -34.911858 ], [ 118.259873, -34.908552 ], [ 118.254962, -34.918009 ], [ 118.223654, -34.919858 ], [ 118.206810, -34.934990 ], [ 118.210999, -34.943949 ], [ 118.175323, -34.940093 ], [ 118.172558, -34.967746 ], [ 118.182607, -34.972948 ], [ 118.190393, -34.967373 ], [ 118.210700, -34.978845 ], [ 118.212122, -34.989093 ], [ 118.199929, -35.003500 ], [ 118.205900, -35.009216 ], [ 118.194646, -35.023122 ], [ 118.187455, -35.024623 ], [ 118.192117, -35.013490 ], [ 118.176980, -35.013817 ], [ 118.167453, -34.995229 ], [ 118.108758, -34.985902 ], [ 118.071820, -34.993908 ], [ 118.034801, -35.020426 ], [ 118.004005, -35.020806 ], [ 117.998839, -35.010009 ], [ 117.961875, -35.013130 ], [ 117.948802, -35.001889 ], [ 117.979710, -34.990929 ], [ 117.973420, -34.960262 ], [ 117.976718, -34.951961 ], [ 117.948930, -34.943650 ], [ 117.946188, -34.980004 ], [ 117.939387, -34.985854 ], [ 117.948679, -34.998172 ], [ 117.918679, -35.016578 ], [ 117.919537, -35.035785 ], [ 117.859596, -35.026856 ], [ 117.848248, -35.044897 ], [ 117.854368, -35.056429 ], [ 117.867860, -35.057210 ], [ 117.887888, -35.077541 ], [ 117.909290, -35.084445 ], [ 117.927854, -35.072885 ], [ 117.927755, -35.062451 ], [ 117.910393, -35.053563 ], [ 117.920354, -35.040870 ], [ 117.918972, -35.051111 ], [ 117.938926, -35.059312 ], [ 117.934674, -35.075488 ], [ 117.943593, -35.091664 ], [ 117.979115, -35.096385 ], [ 118.002260, -35.087523 ], [ 118.021209, -35.107929 ], [ 118.005966, -35.098825 ], [ 117.976193, -35.098641 ], [ 117.967210, -35.104098 ], [ 117.969247, -35.114578 ], [ 117.948254, -35.128275 ], [ 117.940863, -35.114699 ], [ 117.924451, -35.121839 ], [ 117.904428, -35.114680 ], [ 117.898808, -35.123447 ], [ 117.885538, -35.110087 ], [ 117.865886, -35.109255 ], [ 117.838897, -35.087320 ], [ 117.762152, -35.054515 ], [ 117.709380, -35.044846 ], [ 117.699847, -35.051865 ], [ 117.685596, -35.043346 ], [ 117.644602, -35.062122 ], [ 117.651390, -35.083771 ], [ 117.637161, -35.088609 ], [ 117.628417, -35.112842 ], [ 117.641724, -35.125584 ], [ 117.639695, -35.134481 ], [ 117.629383, -35.127747 ], [ 117.611236, -35.133337 ], [ 117.605589, -35.115308 ], [ 117.548633, -35.082535 ], [ 117.514358, -35.074613 ], [ 117.512349, -35.083117 ], [ 117.485260, -35.088970 ], [ 117.479131, -35.073569 ], [ 117.397478, -35.031978 ], [ 117.362834, -35.019570 ], [ 117.332467, -35.022812 ], [ 117.356851, -35.005152 ], [ 117.395747, -34.998141 ], [ 117.398633, -35.008141 ], [ 117.428481, -35.021619 ], [ 117.465766, -35.020544 ], [ 117.451558, -35.010066 ], [ 117.468887, -35.006501 ], [ 117.479563, -34.993528 ], [ 117.471867, -34.975857 ], [ 117.455199, -34.966957 ], [ 117.429064, -34.986071 ], [ 117.404886, -34.973502 ], [ 117.369155, -34.969487 ], [ 117.354753, -34.993050 ], [ 117.348802, -34.987004 ], [ 117.334227, -34.993712 ], [ 117.337073, -35.004901 ], [ 117.326428, -35.017387 ], [ 117.337031, -35.034639 ], [ 117.326067, -35.043897 ], [ 117.272123, -35.021075 ], [ 117.247599, -35.029324 ], [ 117.195241, -35.017104 ], [ 117.164713, -35.026958 ], [ 117.164299, -35.044770 ], [ 117.153613, -35.047796 ], [ 117.150469, -35.061480 ], [ 117.097947, -35.032434 ], [ 117.073378, -35.031838 ], [ 117.070851, -35.038305 ], [ 117.060220, -35.028717 ], [ 117.033503, -35.025066 ], [ 117.018925, -35.035512 ], [ 116.956844, -35.019364 ], [ 116.934394, -35.034983 ], [ 116.921228, -35.064349 ], [ 116.884551, -35.047809 ], [ 116.865924, -35.048489 ], [ 116.861987, -35.056622 ], [ 116.846365, -35.049388 ], [ 116.844353, -35.040290 ], [ 116.826937, -35.043292 ], [ 116.810454, -35.025767 ], [ 116.768273, -35.014721 ], [ 116.741921, -35.022506 ], [ 116.737367, -35.030423 ], [ 116.745407, -35.037401 ], [ 116.726477, -35.041398 ], [ 116.707198, -35.028956 ], [ 116.658079, -35.051438 ], [ 116.645501, -35.047159 ], [ 116.630374, -35.060835 ], [ 116.629858, -35.046301 ], [ 116.610312, -35.033281 ], [ 116.572295, -35.033018 ], [ 116.574846, -35.024375 ], [ 116.532847, -35.004438 ], [ 116.517875, -35.002217 ], [ 116.498432, -35.015451 ], [ 116.481664, -35.016156 ], [ 116.468516, -34.995666 ], [ 116.383109, -34.948639 ], [ 116.370284, -34.934423 ], [ 116.289466, -34.899747 ], [ 116.261291, -34.879922 ], [ 116.189752, -34.861078 ], [ 116.133605, -34.844361 ], [ 116.096924, -34.848358 ], [ 116.029668, -34.836755 ], [ 116.002145, -34.842218 ], [ 115.996733, -34.830896 ], [ 116.002664, -34.812392 ], [ 115.961779, -34.762200 ], [ 115.962426, -34.743911 ], [ 115.947190, -34.720824 ], [ 115.743010, -34.538714 ], [ 115.669869, -34.480925 ], [ 115.577862, -34.422088 ], [ 115.558774, -34.415108 ], [ 115.540859, -34.423087 ], [ 115.542264, -34.414241 ], [ 115.520254, -34.396852 ], [ 115.478856, -34.381740 ], [ 115.417910, -34.342289 ], [ 115.345406, -34.316212 ], [ 115.262563, -34.306793 ], [ 115.168887, -34.321749 ], [ 115.165290, -34.301376 ], [ 115.201944, -34.277636 ], [ 115.169115, -34.279554 ], [ 115.165207, -34.273688 ], [ 115.176676, -34.265659 ], [ 115.156042, -34.275190 ], [ 115.160423, -34.294769 ], [ 115.143848, -34.289482 ], [ 115.148446, -34.298620 ], [ 115.160073, -34.298014 ], [ 115.164672, -34.322840 ], [ 115.172977, -34.322976 ], [ 115.166376, -34.356796 ], [ 115.157864, -34.369036 ], [ 115.140164, -34.368932 ], [ 115.133997, -34.376086 ], [ 115.137026, -34.364311 ], [ 115.124006, -34.355632 ], [ 115.119138, -34.340947 ], [ 115.050556, -34.275425 ], [ 115.034056, -34.270426 ], [ 115.033996, -34.259112 ], [ 115.023750, -34.253029 ], [ 115.032890, -34.237263 ], [ 115.024410, -34.222803 ], [ 115.039132, -34.198194 ], [ 115.019226, -34.139158 ], [ 114.991097, -34.098468 ], [ 115.004140, -34.081449 ], [ 114.997143, -34.068884 ], [ 115.000795, -34.015397 ], [ 114.979878, -33.961428 ], [ 114.991902, -33.953541 ], [ 114.992227, -33.932673 ], [ 114.975950, -33.864183 ], [ 114.986936, -33.863803 ], [ 114.993979, -33.848482 ], [ 115.000101, -33.794171 ], [ 114.975079, -33.698053 ], [ 114.990486, -33.696245 ], [ 114.994782, -33.669383 ], [ 115.019396, -33.656495 ], [ 115.028268, -33.634152 ], [ 115.003842, -33.561071 ], [ 115.011321, -33.556435 ], [ 115.003732, -33.530913 ], [ 115.054693, -33.543890 ], [ 115.065085, -33.558402 ], [ 115.088836, -33.568289 ], [ 115.102544, -33.586192 ], [ 115.104741, -33.605905 ], [ 115.123254, -33.623884 ], [ 115.206710, -33.651040 ], [ 115.299974, -33.654816 ], [ 115.367242, -33.639391 ], [ 115.427540, -33.608303 ], [ 115.573649, -33.453763 ], [ 115.598960, -33.409616 ], [ 115.635818, -33.308760 ], [ 115.646148, -33.300987 ], [ 115.636594, -33.312083 ], [ 115.647727, -33.306299 ], [ 115.639797, -33.318730 ], [ 115.666260, -33.322086 ], [ 115.657587, -33.317936 ], [ 115.670186, -33.306926 ], [ 115.681022, -33.275255 ], [ 115.687753, -33.108628 ], [ 115.673712, -32.998787 ], [ 115.632637, -32.833887 ], [ 115.608247, -32.666719 ], [ 115.627811, -32.599548 ], [ 115.671224, -32.562310 ], [ 115.700593, -32.520285 ], [ 115.710538, -32.520568 ], [ 115.717609, -32.557609 ], [ 115.671098, -32.575175 ], [ 115.665989, -32.586427 ], [ 115.672846, -32.593901 ], [ 115.645158, -32.608198 ], [ 115.641006, -32.618505 ], [ 115.655459, -32.672297 ], [ 115.671585, -32.700305 ], [ 115.672598, -32.728078 ], [ 115.683490, -32.750622 ], [ 115.696618, -32.754281 ], [ 115.692719, -32.767689 ], [ 115.712431, -32.787720 ], [ 115.713302, -32.772867 ], [ 115.725870, -32.781745 ], [ 115.726835, -32.753347 ], [ 115.710236, -32.741358 ], [ 115.713900, -32.728879 ], [ 115.697351, -32.690617 ], [ 115.686051, -32.682910 ], [ 115.684698, -32.653378 ], [ 115.667165, -32.634585 ], [ 115.666353, -32.615729 ], [ 115.676878, -32.616449 ], [ 115.704125, -32.643751 ], [ 115.724219, -32.631880 ], [ 115.747016, -32.646339 ], [ 115.773706, -32.635900 ], [ 115.767298, -32.627021 ], [ 115.775445, -32.624448 ], [ 115.770639, -32.617785 ], [ 115.777500, -32.596343 ], [ 115.762888, -32.590770 ], [ 115.766264, -32.581562 ], [ 115.755304, -32.564816 ], [ 115.718518, -32.564406 ], [ 115.720931, -32.527227 ], [ 115.712251, -32.525898 ], [ 115.721732, -32.523097 ], [ 115.711740, -32.521401 ], [ 115.723856, -32.519919 ], [ 115.737900, -32.501939 ], [ 115.750188, -32.439620 ], [ 115.743892, -32.403490 ], [ 115.712858, -32.370174 ], [ 115.736117, -32.362418 ], [ 115.743340, -32.333568 ], [ 115.730675, -32.310271 ], [ 115.701554, -32.305276 ], [ 115.701971, -32.282413 ], [ 115.684747, -32.265981 ], [ 115.706381, -32.275911 ], [ 115.736703, -32.269668 ], [ 115.756059, -32.250033 ], [ 115.755697, -32.223666 ], [ 115.774567, -32.193807 ], [ 115.765778, -32.140146 ], [ 115.737340, -32.134952 ], [ 115.755948, -32.129549 ], [ 115.762755, -32.109293 ], [ 115.742605, -32.064983 ], [ 115.749349, -32.070524 ], [ 115.742713, -32.062433 ], [ 115.739558, -32.063556 ], [ 115.740895, -32.056980 ], [ 115.732237, -32.055678 ], [ 115.760307, -32.040541 ], [ 115.761910, -32.026658 ], [ 115.777515, -32.028549 ], [ 115.786705, -32.010957 ], [ 115.813354, -32.022324 ], [ 115.814353, -32.029068 ], [ 115.826885, -32.021260 ], [ 115.828810, -32.006402 ], [ 115.846419, -32.001719 ], [ 115.860631, -32.045816 ], [ 115.860730, -32.037752 ], [ 115.871800, -32.031126 ], [ 115.857253, -32.031184 ], [ 115.845083, -31.965227 ], [ 115.863766, -31.974657 ], [ 115.883729, -31.969067 ], [ 115.891098, -31.962323 ], [ 115.885924, -31.940556 ], [ 115.898730, -31.953675 ], [ 115.914832, -31.951167 ], [ 115.918992, -31.944270 ], [ 115.910120, -31.935993 ], [ 115.936307, -31.931023 ], [ 115.941252, -31.920401 ], [ 115.951409, -31.923068 ], [ 115.964464, -31.908432 ], [ 115.958636, -31.895333 ], [ 115.974023, -31.893722 ], [ 115.958093, -31.895192 ], [ 115.961648, -31.911327 ], [ 115.950687, -31.922417 ], [ 115.941162, -31.919770 ], [ 115.936201, -31.929980 ], [ 115.908899, -31.934846 ], [ 115.914072, -31.950320 ], [ 115.899614, -31.951452 ], [ 115.897619, -31.940933 ], [ 115.884725, -31.938378 ], [ 115.883369, -31.966952 ], [ 115.855654, -31.958692 ], [ 115.842509, -31.963201 ], [ 115.822208, -31.976327 ], [ 115.828920, -31.987108 ], [ 115.804136, -32.002921 ], [ 115.791780, -32.004937 ], [ 115.786605, -31.991033 ], [ 115.773792, -31.989209 ], [ 115.771548, -32.009255 ], [ 115.779784, -32.018867 ], [ 115.755784, -32.025531 ], [ 115.758386, -32.038878 ], [ 115.724374, -32.054056 ], [ 115.750832, -32.022301 ], [ 115.751671, -31.848348 ], [ 115.743804, -31.827846 ], [ 115.732048, -31.823784 ], [ 115.740716, -31.824089 ], [ 115.733569, -31.823462 ], [ 115.727443, -31.806066 ], [ 115.729627, -31.765771 ], [ 115.685783, -31.653709 ], [ 115.635222, -31.565635 ], [ 115.579799, -31.496324 ], [ 115.539123, -31.408290 ], [ 115.441094, -31.277796 ], [ 115.399236, -31.180369 ], [ 115.383226, -31.121401 ], [ 115.326427, -31.027856 ], [ 115.328329, -31.010648 ], [ 115.312809, -30.973147 ], [ 115.219791, -30.832686 ], [ 115.204504, -30.823381 ], [ 115.189756, -30.824950 ], [ 115.183259, -30.771888 ], [ 115.102005, -30.601752 ], [ 115.103602, -30.591548 ], [ 115.087663, -30.578365 ], [ 115.094402, -30.548793 ], [ 115.075140, -30.517769 ], [ 115.057946, -30.510248 ], [ 115.071196, -30.478059 ], [ 115.050572, -30.424339 ], [ 115.042000, -30.337814 ], [ 115.020472, -30.317383 ], [ 115.046093, -30.291215 ], [ 115.042629, -30.273825 ], [ 115.028083, -30.237420 ], [ 114.994298, -30.231289 ], [ 114.998978, -30.223438 ], [ 114.991893, -30.183963 ], [ 114.998686, -30.182588 ], [ 115.006220, -30.159243 ], [ 115.001771, -30.132213 ], [ 114.984038, -30.079087 ], [ 114.963037, -30.072159 ], [ 114.965309, -30.054523 ], [ 114.954846, -30.048851 ], [ 114.969522, -30.007584 ], [ 114.962836, -29.973929 ], [ 114.977788, -29.945078 ], [ 114.982742, -29.911024 ], [ 114.980980, -29.845405 ], [ 114.964830, -29.808755 ], [ 114.959298, -29.770488 ], [ 114.957949, -29.683704 ], [ 114.977133, -29.557390 ], [ 114.997224, -29.513595 ], [ 114.997569, -29.493548 ], [ 114.956340, -29.397405 ], [ 114.954247, -29.352185 ], [ 114.926874, -29.312732 ], [ 114.914436, -29.277415 ], [ 114.922057, -29.270183 ], [ 114.920793, -29.255486 ], [ 114.872084, -29.116741 ], [ 114.831984, -29.066018 ], [ 114.637438, -28.877710 ], [ 114.623990, -28.843587 ], [ 114.628663, -28.830535 ], [ 114.612243, -28.795347 ], [ 114.576178, -28.784586 ], [ 114.587491, -28.770820 ], [ 114.605975, -28.774909 ], [ 114.614754, -28.762725 ], [ 114.618976, -28.719306 ], [ 114.605724, -28.686676 ], [ 114.612666, -28.665159 ], [ 114.596573, -28.611563 ], [ 114.533698, -28.494488 ], [ 114.454641, -28.410260 ], [ 114.465639, -28.407306 ], [ 114.451766, -28.410371 ], [ 114.432984, -28.394242 ], [ 114.405422, -28.335375 ], [ 114.341731, -28.267219 ], [ 114.323321, -28.233061 ], [ 114.238740, -28.187246 ], [ 114.197237, -28.126849 ], [ 114.174711, -28.110972 ], [ 114.144551, -27.972384 ], [ 114.105399, -27.850373 ], [ 114.124357, -27.772902 ], [ 114.151587, -27.733461 ], [ 114.157686, -27.708541 ], [ 114.165846, -27.708291 ], [ 114.181666, -27.680310 ], [ 114.169976, -27.674650 ], [ 114.173456, -27.658880 ], [ 114.165566, -27.668100 ], [ 114.172456, -27.687620 ], [ 114.163386, -27.706981 ], [ 114.104253, -27.503189 ], [ 113.965158, -27.230748 ], [ 113.783098, -26.929048 ], [ 113.584357, -26.671426 ], [ 113.296693, -26.400195 ], [ 113.308233, -26.387455 ], [ 113.294223, -26.363865 ], [ 113.299632, -26.342435 ], [ 113.277522, -26.294014 ], [ 113.236421, -26.233494 ], [ 113.156270, -26.151674 ], [ 113.162540, -26.143564 ], [ 113.197250, -26.173983 ], [ 113.260891, -26.191223 ], [ 113.269961, -26.241773 ], [ 113.280371, -26.221593 ], [ 113.273041, -26.182663 ], [ 113.282190, -26.173203 ], [ 113.291130, -26.125722 ], [ 113.291559, -26.085442 ], [ 113.284199, -26.076302 ], [ 113.291609, -26.047761 ], [ 113.284619, -26.040081 ], [ 113.299268, -26.015961 ], [ 113.319890, -26.126202 ], [ 113.325441, -26.204832 ], [ 113.317771, -26.241713 ], [ 113.333482, -26.311444 ], [ 113.324332, -26.318994 ], [ 113.331212, -26.329154 ], [ 113.326702, -26.337274 ], [ 113.338722, -26.347434 ], [ 113.356012, -26.330974 ], [ 113.365273, -26.354104 ], [ 113.357123, -26.373504 ], [ 113.369893, -26.383654 ], [ 113.368383, -26.399225 ], [ 113.380413, -26.398774 ], [ 113.383303, -26.387494 ], [ 113.392573, -26.402274 ], [ 113.394175, -26.393030 ] ], [ [ 113.394560, -26.393282 ], [ 113.399893, -26.418244 ], [ 113.397963, -26.395514 ], [ 113.394560, -26.393282 ] ], [ [ 117.976842, -34.951647 ], [ 117.981459, -34.940024 ], [ 117.973842, -34.938553 ], [ 117.976842, -34.951647 ] ], [ [ 125.035068, -15.518022 ], [ 125.039513, -15.521804 ], [ 125.044273, -15.518854 ], [ 125.035068, -15.518022 ] ], [ [ 121.794599, -18.520144 ], [ 121.788124, -18.537738 ], [ 121.798334, -18.529968 ], [ 121.794599, -18.520144 ] ], [ [ 118.850525, -20.288689 ], [ 118.854834, -20.290648 ], [ 118.860274, -20.282098 ], [ 118.850525, -20.288689 ] ], [ [ 117.549725, -20.718291 ], [ 117.542282, -20.736201 ], [ 117.547552, -20.728181 ], [ 117.555702, -20.730841 ], [ 117.548262, -20.725691 ], [ 117.549725, -20.718291 ] ], [ [ 117.175305, -20.666749 ], [ 117.173282, -20.673993 ], [ 117.171982, -20.654672 ], [ 117.167292, -20.657382 ], [ 117.168002, -20.682233 ], [ 117.183842, -20.672712 ], [ 117.175562, -20.673882 ], [ 117.175305, -20.666749 ] ], [ [ 116.986246, -20.671940 ], [ 116.986892, -20.678945 ], [ 116.987201, -20.672225 ], [ 116.986246, -20.671940 ] ], [ [ 116.675721, -20.732565 ], [ 116.684754, -20.750459 ], [ 116.685855, -20.737179 ], [ 116.675721, -20.732565 ] ], [ [ 116.652363, -20.735693 ], [ 116.648021, -20.744457 ], [ 116.657564, -20.740319 ], [ 116.652363, -20.735693 ] ], [ [ 116.647620, -20.745267 ], [ 116.647024, -20.746469 ], [ 116.653634, -20.749079 ], [ 116.647620, -20.745267 ] ], [ [ 116.635949, -20.741603 ], [ 116.629764, -20.751170 ], [ 116.639924, -20.753219 ], [ 116.635949, -20.741603 ] ], [ [ 116.467914, -20.827356 ], [ 116.474380, -20.830951 ], [ 116.481050, -20.826031 ], [ 116.467914, -20.827356 ] ], [ [ 116.475066, -20.849566 ], [ 116.477603, -20.851601 ], [ 116.485251, -20.843561 ], [ 116.494862, -20.850981 ], [ 116.485241, -20.842201 ], [ 116.477713, -20.850701 ], [ 116.475066, -20.849566 ] ], [ [ 116.105599, -21.038434 ], [ 116.098903, -21.051678 ], [ 116.106463, -21.039628 ], [ 116.105599, -21.038434 ] ], [ [ 115.856421, -21.194944 ], [ 115.852203, -21.202932 ], [ 115.860393, -21.204192 ], [ 115.865343, -21.193362 ], [ 115.857023, -21.201022 ], [ 115.856421, -21.194944 ] ], [ [ 115.837066, -21.252095 ], [ 115.844386, -21.252924 ], [ 115.839835, -21.243884 ], [ 115.837066, -21.252095 ] ], [ [ 115.796082, -21.265486 ], [ 115.796144, -21.277203 ], [ 115.799054, -21.270333 ], [ 115.796082, -21.265486 ] ], [ [ 115.745603, -21.281369 ], [ 115.738704, -21.285483 ], [ 115.748584, -21.289433 ], [ 115.745603, -21.281369 ] ], [ [ 115.330103, -21.587178 ], [ 115.333837, -21.596080 ], [ 115.341628, -21.595990 ], [ 115.330103, -21.587178 ] ], [ [ 113.618798, -26.520622 ], [ 113.621535, -26.538733 ], [ 113.626274, -26.524293 ], [ 113.618798, -26.520622 ] ], [ [ 115.916775, -21.092912 ], [ 115.915002, -21.092741 ], [ 115.911913, -21.101581 ], [ 115.916775, -21.092912 ] ], [ [ 116.540430, -20.766632 ], [ 116.542108, -20.778411 ], [ 116.542417, -20.766341 ], [ 116.540430, -20.766632 ] ], [ [ 117.173242, -20.631200 ], [ 117.165632, -20.628352 ], [ 117.165392, -20.634562 ], [ 117.173242, -20.631200 ] ], [ [ 117.339756, -20.759099 ], [ 117.320242, -20.758523 ], [ 117.332612, -20.761223 ], [ 117.331982, -20.770573 ], [ 117.339756, -20.759099 ] ], [ [ 122.293413, -17.119248 ], [ 122.301624, -17.120900 ], [ 122.303484, -17.112420 ], [ 122.293413, -17.119248 ] ], [ [ 124.461531, -15.798338 ], [ 124.462486, -15.784878 ], [ 124.457736, -15.782938 ], [ 124.461531, -15.798338 ] ], [ [ 115.877589, -32.027661 ], [ 115.883354, -32.024210 ], [ 115.893076, -32.020538 ], [ 115.889384, -32.017527 ], [ 115.877589, -32.027661 ] ] ], [ [ [ 126.565501, -13.944357 ], [ 126.571232, -13.940515 ], [ 126.577382, -13.953835 ], [ 126.565501, -13.944357 ] ] ], [ [ [ 128.473074, -14.909232 ], [ 128.466514, -14.928312 ], [ 128.448335, -14.904182 ], [ 128.445495, -14.879882 ], [ 128.473074, -14.909232 ] ] ], [ [ [ 128.442715, -14.878632 ], [ 128.440015, -14.885962 ], [ 128.428115, -14.863211 ], [ 128.442715, -14.878632 ] ] ], [ [ [ 128.334215, -14.758380 ], [ 128.310046, -14.762809 ], [ 128.301726, -14.751819 ], [ 128.308476, -14.745969 ], [ 128.297097, -14.745699 ], [ 128.294696, -14.735520 ], [ 128.319876, -14.741370 ], [ 128.334215, -14.758380 ] ] ], [ [ [ 128.201837, -15.140613 ], [ 128.193878, -15.166403 ], [ 128.197088, -15.193993 ], [ 128.126268, -15.156214 ], [ 128.114008, -15.121604 ], [ 128.125237, -15.095523 ], [ 128.124787, -15.040363 ], [ 128.152337, -15.051723 ], [ 128.160857, -15.092653 ], [ 128.196757, -15.125043 ], [ 128.201837, -15.140613 ] ] ], [ [ [ 128.113189, -15.171674 ], [ 128.099050, -15.195714 ], [ 128.104589, -15.165434 ], [ 128.113189, -15.171674 ] ] ], [ [ [ 127.874997, -14.454995 ], [ 127.850857, -14.479504 ], [ 127.838567, -14.457404 ], [ 127.852287, -14.451034 ], [ 127.853527, -14.435674 ], [ 127.863297, -14.430414 ], [ 127.873117, -14.438604 ], [ 127.874997, -14.454995 ] ] ], [ [ [ 127.823297, -14.366694 ], [ 127.811177, -14.377584 ], [ 127.805377, -14.357554 ], [ 127.810847, -14.352944 ], [ 127.823297, -14.366694 ] ] ], [ [ [ 127.716148, -14.237427 ], [ 127.702088, -14.242037 ], [ 127.709898, -14.233497 ], [ 127.716148, -14.237427 ] ] ], [ [ [ 127.175689, -13.903610 ], [ 127.156580, -13.898700 ], [ 127.164319, -13.896190 ], [ 127.162769, -13.882860 ], [ 127.175689, -13.903610 ] ] ], [ [ [ 126.882891, -13.990389 ], [ 126.880651, -13.976183 ], [ 126.845671, -13.963713 ], [ 126.820001, -13.966813 ], [ 126.832251, -13.961483 ], [ 126.819291, -13.960263 ], [ 126.819851, -13.953943 ], [ 126.854921, -13.957593 ], [ 126.869491, -13.967983 ], [ 126.866481, -13.955883 ], [ 126.883291, -13.973143 ], [ 126.887941, -13.986803 ], [ 126.882891, -13.990389 ] ] ], [ [ [ 126.882947, -13.990749 ], [ 126.893852, -13.987820 ], [ 126.883232, -13.992553 ], [ 126.882947, -13.990749 ] ] ], [ [ [ 126.897513, -13.986188 ], [ 126.892161, -13.981922 ], [ 126.900801, -13.984722 ], [ 126.897513, -13.986188 ] ] ], [ [ [ 126.824461, -13.945683 ], [ 126.818571, -13.949533 ], [ 126.815661, -13.941183 ], [ 126.824461, -13.945683 ] ] ], [ [ [ 126.700442, -13.943074 ], [ 126.676642, -13.961404 ], [ 126.693602, -13.931334 ], [ 126.700442, -13.943074 ] ] ], [ [ [ 126.634981, -13.871325 ], [ 126.620552, -13.882635 ], [ 126.614971, -13.862425 ], [ 126.625481, -13.853265 ], [ 126.634981, -13.871325 ] ] ], [ [ [ 126.619282, -13.890545 ], [ 126.611322, -13.900945 ], [ 126.617802, -13.908055 ], [ 126.608682, -13.913715 ], [ 126.593742, -13.898365 ], [ 126.559632, -13.903145 ], [ 126.568182, -13.896585 ], [ 126.563892, -13.891285 ], [ 126.545512, -13.893555 ], [ 126.536152, -13.907566 ], [ 126.527362, -13.901366 ], [ 126.513832, -13.906686 ], [ 126.502832, -13.886356 ], [ 126.504902, -13.869076 ], [ 126.522702, -13.866126 ], [ 126.527332, -13.873916 ], [ 126.547102, -13.871866 ], [ 126.575452, -13.887315 ], [ 126.588052, -13.885945 ], [ 126.599402, -13.897235 ], [ 126.619282, -13.890545 ] ] ], [ [ [ 126.608022, -13.945115 ], [ 126.604452, -13.952905 ], [ 126.595412, -13.941965 ], [ 126.600722, -13.935855 ], [ 126.608022, -13.945115 ] ] ], [ [ [ 126.593125, -14.215295 ], [ 126.590605, -14.222875 ], [ 126.577495, -14.217165 ], [ 126.575684, -14.197625 ], [ 126.586004, -14.200855 ], [ 126.593125, -14.215295 ] ] ], [ [ [ 126.586905, -14.223455 ], [ 126.574985, -14.226215 ], [ 126.569845, -14.213465 ], [ 126.574895, -14.203735 ], [ 126.574715, -14.216505 ], [ 126.586905, -14.223455 ] ] ], [ [ [ 126.403784, -13.989066 ], [ 126.394104, -14.009166 ], [ 126.384284, -14.011456 ], [ 126.362484, -13.982636 ], [ 126.376474, -13.974616 ], [ 126.403784, -13.989066 ] ] ], [ [ [ 126.321075, -13.942087 ], [ 126.314825, -13.961857 ], [ 126.299795, -13.967608 ], [ 126.309624, -13.927187 ], [ 126.321075, -13.942087 ] ] ], [ [ [ 126.318984, -13.886197 ], [ 126.314484, -13.894776 ], [ 126.301534, -13.883367 ], [ 126.303843, -13.866997 ], [ 126.318984, -13.886197 ] ] ], [ [ [ 126.317374, -13.909457 ], [ 126.312164, -13.923117 ], [ 126.300144, -13.920747 ], [ 126.303384, -13.903917 ], [ 126.312514, -13.900646 ], [ 126.317374, -13.909457 ] ] ], [ [ [ 126.299029, -14.163357 ], [ 126.285279, -14.171187 ], [ 126.291609, -14.159537 ], [ 126.299029, -14.163357 ] ] ], [ [ [ 126.295165, -13.941298 ], [ 126.283835, -13.945698 ], [ 126.272154, -13.927738 ], [ 126.295165, -13.941298 ] ] ], [ [ [ 126.243438, -14.148258 ], [ 126.236298, -14.161728 ], [ 126.230478, -14.150328 ], [ 126.243438, -14.148258 ] ] ], [ [ [ 126.194915, -13.935049 ], [ 126.164605, -13.963590 ], [ 126.155925, -13.960540 ], [ 126.174215, -13.932659 ], [ 126.189715, -13.927369 ], [ 126.194915, -13.935049 ] ] ], [ [ [ 126.152473, -13.752440 ], [ 126.150383, -13.759670 ], [ 126.145423, -13.748600 ], [ 126.152473, -13.752440 ] ] ], [ [ [ 126.046801, -14.327979 ], [ 126.041031, -14.337930 ], [ 126.023412, -14.328470 ], [ 126.017662, -14.353220 ], [ 125.993282, -14.336330 ], [ 125.998272, -14.325160 ], [ 125.985082, -14.313300 ], [ 125.992391, -14.302030 ], [ 125.986611, -14.289270 ], [ 126.008991, -14.280940 ], [ 126.004271, -14.302750 ], [ 126.018061, -14.307020 ], [ 126.023491, -14.300460 ], [ 126.046801, -14.327979 ] ] ], [ [ [ 126.043171, -14.233439 ], [ 126.036361, -14.242379 ], [ 126.006511, -14.249320 ], [ 125.993481, -14.243690 ], [ 126.018390, -14.225240 ], [ 126.043171, -14.233439 ] ] ], [ [ [ 126.004694, -14.438180 ], [ 125.994703, -14.448160 ], [ 125.982774, -14.446460 ], [ 125.988004, -14.435690 ], [ 126.004694, -14.438180 ] ] ], [ [ [ 125.995333, -14.376510 ], [ 125.983294, -14.377510 ], [ 125.984294, -14.388830 ], [ 125.971004, -14.388220 ], [ 125.982953, -14.364310 ], [ 125.994543, -14.362290 ], [ 125.995333, -14.376510 ] ] ], [ [ [ 125.994222, -14.321660 ], [ 125.976263, -14.337900 ], [ 125.976392, -14.328190 ], [ 125.994222, -14.321660 ] ] ], [ [ [ 125.970583, -14.346920 ], [ 125.960154, -14.350970 ], [ 125.956544, -14.374210 ], [ 125.944484, -14.388761 ], [ 125.924224, -14.377221 ], [ 125.943004, -14.365851 ], [ 125.934784, -14.360871 ], [ 125.949044, -14.345650 ], [ 125.943153, -14.336061 ], [ 125.958893, -14.335060 ], [ 125.952653, -14.326590 ], [ 125.959372, -14.322190 ], [ 125.970583, -14.346920 ] ] ], [ [ [ 125.794190, -14.160684 ], [ 125.787580, -14.171164 ], [ 125.778000, -14.157944 ], [ 125.794190, -14.160684 ] ] ], [ [ [ 125.773283, -14.326554 ], [ 125.761373, -14.323784 ], [ 125.767393, -14.319544 ], [ 125.773283, -14.326554 ] ] ], [ [ [ 125.756964, -14.451010 ], [ 125.736515, -14.476589 ], [ 125.717745, -14.477008 ], [ 125.718135, -14.453759 ], [ 125.727185, -14.449820 ], [ 125.721525, -14.441010 ], [ 125.727955, -14.409532 ], [ 125.754125, -14.416470 ], [ 125.738805, -14.429190 ], [ 125.749075, -14.452010 ], [ 125.753845, -14.445360 ], [ 125.756964, -14.451010 ] ] ], [ [ [ 125.739871, -14.183934 ], [ 125.730941, -14.192834 ], [ 125.722521, -14.182884 ], [ 125.730171, -14.174664 ], [ 125.739871, -14.183934 ] ] ], [ [ [ 125.720544, -14.351845 ], [ 125.711384, -14.355436 ], [ 125.708274, -14.347987 ], [ 125.720544, -14.351845 ] ] ], [ [ [ 125.705490, -14.135555 ], [ 125.701890, -14.144005 ], [ 125.694260, -14.139815 ], [ 125.692140, -14.107645 ], [ 125.704380, -14.116245 ], [ 125.705490, -14.135555 ] ] ], [ [ [ 125.683201, -14.168455 ], [ 125.677281, -14.176345 ], [ 125.669431, -14.165715 ], [ 125.678251, -14.157615 ], [ 125.683201, -14.168455 ] ] ], [ [ [ 125.681354, -14.370387 ], [ 125.680644, -14.377946 ], [ 125.670674, -14.379616 ], [ 125.669664, -14.367766 ], [ 125.681354, -14.370387 ] ] ], [ [ [ 125.644138, -13.946925 ], [ 125.628488, -13.961835 ], [ 125.625588, -13.931445 ], [ 125.633808, -13.932185 ], [ 125.634118, -13.946145 ], [ 125.644138, -13.946925 ] ] ], [ [ [ 125.584894, -14.357516 ], [ 125.580004, -14.364495 ], [ 125.573424, -14.357146 ], [ 125.579004, -14.348696 ], [ 125.584894, -14.357516 ] ] ], [ [ [ 125.562656, -14.486250 ], [ 125.559276, -14.494250 ], [ 125.523476, -14.485014 ], [ 125.523526, -14.467294 ], [ 125.511285, -14.454954 ], [ 125.517325, -14.449893 ], [ 125.511425, -14.444453 ], [ 125.529795, -14.422604 ], [ 125.538085, -14.444303 ], [ 125.530305, -14.447553 ], [ 125.544305, -14.455833 ], [ 125.538116, -14.474552 ], [ 125.562656, -14.486250 ] ] ], [ [ [ 125.560821, -14.105266 ], [ 125.551441, -14.107607 ], [ 125.554701, -14.099607 ], [ 125.560821, -14.105266 ] ] ], [ [ [ 125.520985, -14.425064 ], [ 125.516085, -14.434874 ], [ 125.500805, -14.430424 ], [ 125.520985, -14.425064 ] ] ], [ [ [ 125.505796, -14.508106 ], [ 125.491656, -14.506826 ], [ 125.503966, -14.499867 ], [ 125.499546, -14.505837 ], [ 125.505796, -14.508106 ] ] ], [ [ [ 125.497126, -14.499057 ], [ 125.473326, -14.511963 ], [ 125.451116, -14.496881 ], [ 125.444556, -14.481282 ], [ 125.474416, -14.497404 ], [ 125.484076, -14.484795 ], [ 125.481156, -14.491555 ], [ 125.488466, -14.488976 ], [ 125.485086, -14.494386 ], [ 125.497126, -14.499057 ] ] ], [ [ [ 125.443567, -14.574971 ], [ 125.433117, -14.580811 ], [ 125.439187, -14.568081 ], [ 125.443567, -14.574971 ] ] ], [ [ [ 125.441706, -14.539630 ], [ 125.438086, -14.547070 ], [ 125.426266, -14.544551 ], [ 125.431996, -14.531811 ], [ 125.441706, -14.539630 ] ] ], [ [ [ 125.435636, -14.553950 ], [ 125.419127, -14.564851 ], [ 125.424866, -14.548731 ], [ 125.435636, -14.553950 ] ] ], [ [ [ 125.414346, -14.539891 ], [ 125.404597, -14.541551 ], [ 125.408906, -14.535241 ], [ 125.414346, -14.539891 ] ] ], [ [ [ 125.411194, -14.336557 ], [ 125.407465, -14.344787 ], [ 125.404024, -14.334387 ], [ 125.411194, -14.336557 ] ] ], [ [ [ 125.367019, -15.078622 ], [ 125.347169, -15.083683 ], [ 125.356989, -15.072342 ], [ 125.367019, -15.078622 ] ] ], [ [ [ 125.366769, -15.010392 ], [ 125.358039, -15.029862 ], [ 125.355519, -15.014512 ], [ 125.366769, -15.010392 ] ] ], [ [ [ 125.345986, -14.493265 ], [ 125.340726, -14.504754 ], [ 125.337846, -14.498084 ], [ 125.345986, -14.493265 ] ] ], [ [ [ 125.330117, -14.553492 ], [ 125.320707, -14.556052 ], [ 125.321547, -14.550522 ], [ 125.330117, -14.553492 ] ] ], [ [ [ 125.320404, -14.267368 ], [ 125.315524, -14.272998 ], [ 125.313024, -14.261668 ], [ 125.320404, -14.267368 ] ] ], [ [ [ 125.310294, -14.276588 ], [ 125.302704, -14.293157 ], [ 125.290444, -14.288927 ], [ 125.293064, -14.269748 ], [ 125.310294, -14.276588 ] ] ], [ [ [ 125.306299, -15.069983 ], [ 125.301669, -15.072823 ], [ 125.299649, -15.063573 ], [ 125.306299, -15.069983 ] ] ], [ [ [ 125.278637, -14.581192 ], [ 125.267707, -14.587812 ], [ 125.254407, -14.577592 ], [ 125.265887, -14.577412 ], [ 125.267917, -14.563762 ], [ 125.278637, -14.581192 ] ] ], [ [ [ 125.273006, -14.478315 ], [ 125.270596, -14.483325 ], [ 125.264806, -14.470716 ], [ 125.248106, -14.472005 ], [ 125.248596, -14.464555 ], [ 125.261716, -14.461106 ], [ 125.273006, -14.478315 ] ] ], [ [ [ 125.271636, -14.414625 ], [ 125.259176, -14.428695 ], [ 125.249796, -14.428435 ], [ 125.256086, -14.418634 ], [ 125.245306, -14.418925 ], [ 125.253916, -14.411284 ], [ 125.271636, -14.414625 ] ] ], [ [ [ 125.254420, -15.085573 ], [ 125.246990, -15.095033 ], [ 125.227860, -15.096083 ], [ 125.230620, -15.084993 ], [ 125.243350, -15.078283 ], [ 125.254420, -15.085573 ] ] ], [ [ [ 125.253459, -14.977953 ], [ 125.247509, -14.982893 ], [ 125.251199, -14.992503 ], [ 125.232469, -14.996953 ], [ 125.228769, -14.991073 ], [ 125.242279, -14.985243 ], [ 125.239519, -14.977223 ], [ 125.245669, -14.979393 ], [ 125.249309, -14.967773 ], [ 125.253459, -14.977953 ] ] ], [ [ [ 125.244016, -14.422425 ], [ 125.237846, -14.429735 ], [ 125.237566, -14.413595 ], [ 125.244016, -14.422425 ] ] ], [ [ [ 125.230870, -15.070653 ], [ 125.229870, -15.084263 ], [ 125.216590, -15.097823 ], [ 125.228860, -15.099573 ], [ 125.218710, -15.104593 ], [ 125.212870, -15.098403 ], [ 125.216620, -15.105393 ], [ 125.196230, -15.120613 ], [ 125.175080, -15.122053 ], [ 125.164860, -15.099273 ], [ 125.175310, -15.097663 ], [ 125.169910, -15.084793 ], [ 125.174880, -15.078903 ], [ 125.164440, -15.082783 ], [ 125.144500, -15.041743 ], [ 125.156610, -15.048243 ], [ 125.156400, -15.026103 ], [ 125.166600, -15.020533 ], [ 125.163850, -15.029463 ], [ 125.178460, -15.048163 ], [ 125.176510, -15.066243 ], [ 125.202220, -15.057663 ], [ 125.230870, -15.070653 ] ] ], [ [ [ 125.229669, -14.908543 ], [ 125.223979, -14.909533 ], [ 125.226209, -14.902203 ], [ 125.229669, -14.908543 ] ] ], [ [ [ 125.229005, -14.300197 ], [ 125.211565, -14.314797 ], [ 125.220835, -14.286498 ], [ 125.229005, -14.300197 ] ] ], [ [ [ 125.216127, -14.495703 ], [ 125.207657, -14.496563 ], [ 125.211747, -14.517362 ], [ 125.208927, -14.526492 ], [ 125.201507, -14.525562 ], [ 125.201067, -14.547802 ], [ 125.194538, -14.556352 ], [ 125.184238, -14.551122 ], [ 125.180488, -14.559682 ], [ 125.187178, -14.569532 ], [ 125.199618, -14.562472 ], [ 125.204308, -14.576152 ], [ 125.197318, -14.583462 ], [ 125.208578, -14.583062 ], [ 125.196098, -14.590252 ], [ 125.207818, -14.597172 ], [ 125.210428, -14.591432 ], [ 125.214278, -14.607242 ], [ 125.199798, -14.612882 ], [ 125.197598, -14.601872 ], [ 125.185268, -14.609952 ], [ 125.180868, -14.634432 ], [ 125.167358, -14.619812 ], [ 125.154988, -14.636582 ], [ 125.147568, -14.635873 ], [ 125.152118, -14.655543 ], [ 125.135078, -14.651963 ], [ 125.136108, -14.628263 ], [ 125.130158, -14.637383 ], [ 125.112678, -14.627933 ], [ 125.108088, -14.642813 ], [ 125.092618, -14.625923 ], [ 125.100998, -14.619413 ], [ 125.094768, -14.612833 ], [ 125.094218, -14.567283 ], [ 125.102508, -14.568373 ], [ 125.096118, -14.546213 ], [ 125.107438, -14.556773 ], [ 125.110858, -14.545383 ], [ 125.120078, -14.557393 ], [ 125.132168, -14.551683 ], [ 125.138838, -14.564133 ], [ 125.134088, -14.576723 ], [ 125.142898, -14.564152 ], [ 125.151588, -14.565772 ], [ 125.134418, -14.545163 ], [ 125.141498, -14.538852 ], [ 125.144128, -14.546152 ], [ 125.143858, -14.530172 ], [ 125.149658, -14.533942 ], [ 125.153148, -14.526422 ], [ 125.146658, -14.525662 ], [ 125.149587, -14.519242 ], [ 125.140768, -14.522022 ], [ 125.142218, -14.515862 ], [ 125.132618, -14.529103 ], [ 125.131648, -14.512163 ], [ 125.117638, -14.507133 ], [ 125.118047, -14.493923 ], [ 125.141107, -14.472682 ], [ 125.160467, -14.471193 ], [ 125.151167, -14.452742 ], [ 125.162737, -14.456403 ], [ 125.165357, -14.439934 ], [ 125.184986, -14.459215 ], [ 125.180127, -14.483923 ], [ 125.190257, -14.473014 ], [ 125.207817, -14.487873 ], [ 125.204747, -14.499712 ], [ 125.208137, -14.492733 ], [ 125.216127, -14.495703 ] ] ], [ [ [ 125.208469, -14.952713 ], [ 125.201039, -14.953033 ], [ 125.206939, -14.958813 ], [ 125.200839, -14.966503 ], [ 125.188339, -14.962123 ], [ 125.198359, -14.953013 ], [ 125.197829, -14.941163 ], [ 125.208469, -14.952713 ] ] ], [ [ [ 125.189519, -14.870783 ], [ 125.186479, -14.875513 ], [ 125.179419, -14.868493 ], [ 125.179029, -14.852003 ], [ 125.189519, -14.870783 ] ] ], [ [ [ 125.147098, -14.663083 ], [ 125.135118, -14.670033 ], [ 125.129448, -14.665833 ], [ 125.147098, -14.663083 ] ] ], [ [ [ 125.145279, -14.761083 ], [ 125.144209, -14.767173 ], [ 125.137499, -14.761163 ], [ 125.137649, -14.748823 ], [ 125.145279, -14.761083 ] ] ], [ [ [ 125.134169, -14.752003 ], [ 125.126939, -14.760773 ], [ 125.124719, -14.755143 ], [ 125.134169, -14.752003 ] ] ], [ [ [ 125.053062, -15.309484 ], [ 125.048582, -15.323504 ], [ 125.040172, -15.315404 ], [ 125.053062, -15.309484 ] ] ], [ [ [ 125.036382, -15.327504 ], [ 125.018162, -15.371744 ], [ 124.995482, -15.375774 ], [ 124.992842, -15.357024 ], [ 125.021452, -15.321454 ], [ 125.036382, -15.327504 ] ] ], [ [ [ 125.032029, -14.782033 ], [ 125.027290, -14.792623 ], [ 125.020470, -14.786943 ], [ 125.023809, -14.780003 ], [ 125.017019, -14.780153 ], [ 125.025799, -14.765293 ], [ 125.032029, -14.782033 ] ] ], [ [ [ 125.015991, -15.206014 ], [ 125.011141, -15.213934 ], [ 125.005661, -15.209554 ], [ 125.006561, -15.203224 ], [ 125.015991, -15.206014 ] ] ], [ [ [ 125.014792, -15.430614 ], [ 125.005743, -15.439344 ], [ 125.004213, -15.433814 ], [ 125.014792, -15.430614 ] ] ], [ [ [ 124.999898, -14.516733 ], [ 124.991718, -14.529003 ], [ 124.985957, -14.520054 ], [ 124.984757, -14.528064 ], [ 124.979556, -14.524204 ], [ 124.976755, -14.507024 ], [ 124.990016, -14.498614 ], [ 124.990436, -14.484504 ], [ 124.999898, -14.516733 ] ] ], [ [ [ 124.995535, -14.440154 ], [ 124.975183, -14.452354 ], [ 124.979514, -14.444024 ], [ 124.972482, -14.437215 ], [ 124.984242, -14.427335 ], [ 124.995535, -14.440154 ] ] ], [ [ [ 124.985909, -14.395155 ], [ 124.983332, -14.424285 ], [ 124.972380, -14.411575 ], [ 124.973269, -14.397575 ], [ 124.959339, -14.401686 ], [ 124.973459, -14.383465 ], [ 124.985909, -14.395155 ] ] ], [ [ [ 124.984961, -15.055514 ], [ 124.971241, -15.086854 ], [ 124.952331, -15.098544 ], [ 124.964711, -15.082124 ], [ 124.962221, -15.066994 ], [ 124.955951, -15.070634 ], [ 124.969101, -15.042004 ], [ 124.976771, -15.040514 ], [ 124.984961, -15.055514 ] ] ], [ [ [ 124.984292, -15.343044 ], [ 124.980372, -15.352214 ], [ 124.950852, -15.364285 ], [ 124.953592, -15.352075 ], [ 124.976482, -15.339794 ], [ 124.984292, -15.343044 ] ] ], [ [ [ 124.962261, -15.044964 ], [ 124.944811, -15.075294 ], [ 124.939781, -15.067174 ], [ 124.951161, -15.063864 ], [ 124.943581, -15.057114 ], [ 124.953181, -15.043634 ], [ 124.962261, -15.044964 ] ] ], [ [ [ 124.959291, -15.029154 ], [ 124.939721, -15.049214 ], [ 124.941421, -15.038134 ], [ 124.915941, -15.029174 ], [ 124.911031, -15.020374 ], [ 124.920521, -15.008934 ], [ 124.897731, -15.004474 ], [ 124.905801, -14.994274 ], [ 124.913811, -14.996124 ], [ 124.920641, -14.980224 ], [ 124.901451, -14.983184 ], [ 124.894051, -14.996354 ], [ 124.891421, -14.987874 ], [ 124.878431, -15.004645 ], [ 124.883361, -14.996865 ], [ 124.876791, -14.986335 ], [ 124.885201, -14.978474 ], [ 124.879171, -14.975615 ], [ 124.889371, -14.959404 ], [ 124.890041, -14.965394 ], [ 124.897721, -14.961824 ], [ 124.898121, -14.974814 ], [ 124.921541, -14.967274 ], [ 124.930100, -14.948324 ], [ 124.917120, -14.941364 ], [ 124.917220, -14.922394 ], [ 124.926610, -14.926624 ], [ 124.931380, -14.947994 ], [ 124.938320, -14.947924 ], [ 124.935030, -14.961104 ], [ 124.946160, -14.965454 ], [ 124.930281, -15.007664 ], [ 124.938981, -15.002554 ], [ 124.939261, -15.015534 ], [ 124.948391, -15.001394 ], [ 124.958631, -15.005434 ], [ 124.945431, -15.018914 ], [ 124.948491, -15.027414 ], [ 124.959291, -15.029154 ] ] ], [ [ [ 124.932023, -14.521355 ], [ 124.924752, -14.515106 ], [ 124.931482, -14.514016 ], [ 124.932023, -14.521355 ] ] ], [ [ [ 124.927240, -14.895464 ], [ 124.921190, -14.897014 ], [ 124.923330, -14.888554 ], [ 124.927240, -14.895464 ] ] ], [ [ [ 124.890821, -14.948914 ], [ 124.889291, -14.955814 ], [ 124.876681, -14.941944 ], [ 124.890821, -14.948914 ] ] ], [ [ [ 124.872741, -14.939674 ], [ 124.868081, -14.941905 ], [ 124.865241, -14.930375 ], [ 124.872741, -14.939674 ] ] ], [ [ [ 124.866401, -15.023084 ], [ 124.857221, -15.021415 ], [ 124.854461, -15.031144 ], [ 124.844441, -15.024615 ], [ 124.859861, -15.011125 ], [ 124.866401, -15.023084 ] ] ], [ [ [ 124.863282, -15.286805 ], [ 124.860803, -15.313025 ], [ 124.841723, -15.314545 ], [ 124.854373, -15.303435 ], [ 124.848993, -15.293395 ], [ 124.863282, -15.286805 ] ] ], [ [ [ 124.858813, -15.342855 ], [ 124.848583, -15.349215 ], [ 124.843673, -15.342565 ], [ 124.853083, -15.337335 ], [ 124.858813, -15.342855 ] ] ], [ [ [ 124.857362, -15.256205 ], [ 124.842192, -15.280085 ], [ 124.834092, -15.272505 ], [ 124.838133, -15.281335 ], [ 124.812313, -15.289535 ], [ 124.811783, -15.306145 ], [ 124.790783, -15.287335 ], [ 124.792683, -15.260545 ], [ 124.799743, -15.260125 ], [ 124.809582, -15.229095 ], [ 124.827892, -15.245325 ], [ 124.834182, -15.247225 ], [ 124.830432, -15.237635 ], [ 124.836362, -15.237725 ], [ 124.857362, -15.256205 ] ] ], [ [ [ 124.807562, -15.216445 ], [ 124.801532, -15.222565 ], [ 124.783483, -15.218875 ], [ 124.799962, -15.203805 ], [ 124.805452, -15.211815 ], [ 124.799412, -15.214435 ], [ 124.807562, -15.216445 ] ] ], [ [ [ 124.789892, -15.013104 ], [ 124.774842, -15.035395 ], [ 124.775712, -15.013475 ], [ 124.789892, -15.013104 ] ] ], [ [ [ 124.779958, -14.949326 ], [ 124.773547, -14.952336 ], [ 124.773406, -14.937207 ], [ 124.779958, -14.949326 ] ] ], [ [ [ 124.762606, -14.954537 ], [ 124.745544, -14.951498 ], [ 124.746664, -14.939308 ], [ 124.759305, -14.942657 ], [ 124.762606, -14.954537 ] ] ], [ [ [ 124.748464, -14.910178 ], [ 124.738864, -14.941978 ], [ 124.733124, -14.911448 ], [ 124.748464, -14.910178 ] ] ], [ [ [ 124.732153, -14.860388 ], [ 124.716284, -14.872048 ], [ 124.714853, -14.859608 ], [ 124.732153, -14.860388 ] ] ], [ [ [ 124.720185, -16.376959 ], [ 124.691966, -16.377899 ], [ 124.679485, -16.368609 ], [ 124.696565, -16.369569 ], [ 124.710845, -16.360269 ], [ 124.720185, -16.376959 ] ] ], [ [ [ 124.703176, -16.356879 ], [ 124.691196, -16.364699 ], [ 124.672976, -16.356169 ], [ 124.692305, -16.349269 ], [ 124.703176, -16.356879 ] ] ], [ [ [ 124.694165, -14.953678 ], [ 124.685694, -14.950238 ], [ 124.683924, -14.937348 ], [ 124.694165, -14.953678 ] ] ], [ [ [ 124.671904, -14.945068 ], [ 124.665364, -14.949998 ], [ 124.658704, -14.937878 ], [ 124.671904, -14.945068 ] ] ], [ [ [ 124.655675, -15.788517 ], [ 124.648465, -15.799037 ], [ 124.628885, -15.804497 ], [ 124.655675, -15.788517 ] ] ], [ [ [ 124.654744, -15.397336 ], [ 124.615564, -15.427346 ], [ 124.608674, -15.420916 ], [ 124.566554, -15.444256 ], [ 124.524634, -15.448387 ], [ 124.523894, -15.435657 ], [ 124.517624, -15.441167 ], [ 124.510744, -15.434277 ], [ 124.520404, -15.431097 ], [ 124.513764, -15.426367 ], [ 124.529464, -15.413237 ], [ 124.532394, -15.425097 ], [ 124.536924, -15.416616 ], [ 124.540424, -15.420676 ], [ 124.541144, -15.433226 ], [ 124.547354, -15.425026 ], [ 124.538894, -15.412886 ], [ 124.560184, -15.400536 ], [ 124.557604, -15.391506 ], [ 124.589804, -15.381926 ], [ 124.591044, -15.369026 ], [ 124.572724, -15.378716 ], [ 124.567464, -15.371076 ], [ 124.566904, -15.382446 ], [ 124.554574, -15.388566 ], [ 124.546884, -15.383836 ], [ 124.552044, -15.364566 ], [ 124.545094, -15.359996 ], [ 124.537314, -15.375936 ], [ 124.527974, -15.357357 ], [ 124.528584, -15.375047 ], [ 124.522184, -15.378897 ], [ 124.535234, -15.383166 ], [ 124.515434, -15.380597 ], [ 124.516154, -15.392687 ], [ 124.507194, -15.397557 ], [ 124.504024, -15.380727 ], [ 124.512384, -15.365227 ], [ 124.498114, -15.369697 ], [ 124.503074, -15.377167 ], [ 124.483514, -15.385467 ], [ 124.479384, -15.398247 ], [ 124.486404, -15.403187 ], [ 124.475814, -15.405037 ], [ 124.465554, -15.403057 ], [ 124.484304, -15.380607 ], [ 124.479164, -15.376897 ], [ 124.483804, -15.361557 ], [ 124.466914, -15.372887 ], [ 124.461124, -15.355297 ], [ 124.481634, -15.345647 ], [ 124.492114, -15.358227 ], [ 124.497304, -15.348007 ], [ 124.481172, -15.335778 ], [ 124.490760, -15.321049 ], [ 124.504931, -15.326718 ], [ 124.500272, -15.336587 ], [ 124.517102, -15.333808 ], [ 124.499950, -15.319529 ], [ 124.498379, -15.307679 ], [ 124.513908, -15.306809 ], [ 124.515209, -15.313589 ], [ 124.535558, -15.303619 ], [ 124.520658, -15.305559 ], [ 124.523437, -15.293920 ], [ 124.515888, -15.303980 ], [ 124.516577, -15.298780 ], [ 124.504378, -15.304330 ], [ 124.494807, -15.292220 ], [ 124.511657, -15.277540 ], [ 124.522357, -15.274930 ], [ 124.522487, -15.282840 ], [ 124.527597, -15.273010 ], [ 124.541867, -15.280100 ], [ 124.541777, -15.264630 ], [ 124.551737, -15.264410 ], [ 124.558047, -15.249800 ], [ 124.571307, -15.245379 ], [ 124.558057, -15.255230 ], [ 124.568317, -15.266960 ], [ 124.562527, -15.280420 ], [ 124.569047, -15.281310 ], [ 124.568717, -15.295330 ], [ 124.556209, -15.314279 ], [ 124.566790, -15.320188 ], [ 124.571429, -15.313179 ], [ 124.589939, -15.312249 ], [ 124.589402, -15.336427 ], [ 124.580033, -15.342687 ], [ 124.605013, -15.341826 ], [ 124.626164, -15.374786 ], [ 124.619514, -15.381606 ], [ 124.624504, -15.393576 ], [ 124.654744, -15.397336 ] ] ], [ [ [ 124.649573, -15.167056 ], [ 124.643892, -15.174187 ], [ 124.643403, -15.162326 ], [ 124.649573, -15.167056 ] ] ], [ [ [ 124.649556, -16.349799 ], [ 124.564936, -16.344170 ], [ 124.607566, -16.341659 ], [ 124.649556, -16.349799 ] ] ], [ [ [ 124.640042, -15.281537 ], [ 124.618059, -15.290728 ], [ 124.612108, -15.283619 ], [ 124.620109, -15.265298 ], [ 124.640042, -15.281537 ] ] ], [ [ [ 124.620814, -15.432536 ], [ 124.614084, -15.447686 ], [ 124.605804, -15.443066 ], [ 124.605944, -15.452226 ], [ 124.602074, -15.441376 ], [ 124.594394, -15.441616 ], [ 124.620814, -15.432536 ] ] ], [ [ [ 124.596685, -15.910887 ], [ 124.585095, -15.952487 ], [ 124.577675, -15.948737 ], [ 124.557336, -15.964968 ], [ 124.532026, -15.966558 ], [ 124.545596, -15.936848 ], [ 124.576155, -15.920527 ], [ 124.573445, -15.910697 ], [ 124.580555, -15.917217 ], [ 124.593165, -15.905357 ], [ 124.596685, -15.910887 ] ] ], [ [ [ 124.577047, -15.268419 ], [ 124.570767, -15.269109 ], [ 124.566897, -15.256119 ], [ 124.577047, -15.268419 ] ] ], [ [ [ 124.547187, -15.231620 ], [ 124.532767, -15.236730 ], [ 124.543927, -15.227110 ], [ 124.547187, -15.231620 ] ] ], [ [ [ 124.515977, -15.211880 ], [ 124.509827, -15.223530 ], [ 124.498257, -15.214830 ], [ 124.506657, -15.205340 ], [ 124.515977, -15.211880 ] ] ], [ [ [ 124.500764, -15.456317 ], [ 124.487065, -15.464857 ], [ 124.496084, -15.451147 ], [ 124.500764, -15.456317 ] ] ], [ [ [ 124.495897, -15.207720 ], [ 124.493707, -15.213490 ], [ 124.488437, -15.206180 ], [ 124.495897, -15.207720 ] ] ], [ [ [ 124.485236, -15.967748 ], [ 124.476876, -15.981708 ], [ 124.474296, -15.975138 ], [ 124.485236, -15.967748 ] ] ], [ [ [ 124.481200, -15.318149 ], [ 124.470119, -15.313909 ], [ 124.476849, -15.310269 ], [ 124.481200, -15.318149 ] ] ], [ [ [ 124.476936, -15.987438 ], [ 124.470426, -15.993798 ], [ 124.470956, -15.983858 ], [ 124.476936, -15.987438 ] ] ], [ [ [ 124.470356, -16.004588 ], [ 124.457266, -16.029738 ], [ 124.462076, -16.000708 ], [ 124.470356, -16.004588 ] ] ], [ [ [ 124.470006, -15.914168 ], [ 124.467356, -15.942188 ], [ 124.462556, -15.939618 ], [ 124.455506, -15.955468 ], [ 124.449006, -15.984638 ], [ 124.450866, -15.938658 ], [ 124.460256, -15.918608 ], [ 124.454396, -15.919778 ], [ 124.452936, -15.907808 ], [ 124.460756, -15.908108 ], [ 124.460936, -15.897038 ], [ 124.467986, -15.906048 ], [ 124.464816, -15.917468 ], [ 124.470006, -15.914168 ] ] ], [ [ [ 124.464676, -16.355810 ], [ 124.454767, -16.373840 ], [ 124.435217, -16.373420 ], [ 124.433257, -16.368090 ], [ 124.464676, -16.355810 ] ] ], [ [ [ 124.461438, -15.300740 ], [ 124.434411, -15.321639 ], [ 124.443309, -15.306580 ], [ 124.420530, -15.315599 ], [ 124.427479, -15.305580 ], [ 124.418749, -15.307310 ], [ 124.412778, -15.292861 ], [ 124.402820, -15.312860 ], [ 124.397559, -15.307120 ], [ 124.391872, -15.332458 ], [ 124.383651, -15.320299 ], [ 124.373792, -15.329359 ], [ 124.352571, -15.322219 ], [ 124.342849, -15.309830 ], [ 124.355578, -15.292151 ], [ 124.367059, -15.308370 ], [ 124.369298, -15.288371 ], [ 124.378138, -15.286071 ], [ 124.379568, -15.294431 ], [ 124.382448, -15.287191 ], [ 124.407118, -15.285161 ], [ 124.417487, -15.263880 ], [ 124.441057, -15.249770 ], [ 124.457167, -15.269660 ], [ 124.452827, -15.278970 ], [ 124.442147, -15.272220 ], [ 124.449857, -15.290400 ], [ 124.441868, -15.298230 ], [ 124.461438, -15.300740 ] ] ], [ [ [ 124.455956, -15.860358 ], [ 124.447816, -15.844018 ], [ 124.451316, -15.834678 ], [ 124.455956, -15.860358 ] ] ], [ [ [ 124.455566, -15.875828 ], [ 124.447916, -15.886258 ], [ 124.447346, -15.874628 ], [ 124.442506, -15.878938 ], [ 124.444796, -15.870118 ], [ 124.455566, -15.875828 ] ] ], [ [ [ 124.404655, -15.530977 ], [ 124.400245, -15.534157 ], [ 124.400175, -15.524597 ], [ 124.404655, -15.530977 ] ] ], [ [ [ 124.401214, -15.342458 ], [ 124.389584, -15.344878 ], [ 124.392113, -15.337978 ], [ 124.401214, -15.342458 ] ] ], [ [ [ 124.399517, -15.227580 ], [ 124.392407, -15.250541 ], [ 124.392567, -15.234161 ], [ 124.385377, -15.239281 ], [ 124.384157, -15.228321 ], [ 124.399517, -15.227580 ] ] ], [ [ [ 124.395807, -16.320910 ], [ 124.386087, -16.322330 ], [ 124.389507, -16.316470 ], [ 124.395807, -16.320910 ] ] ], [ [ [ 124.374885, -15.390807 ], [ 124.366735, -15.391738 ], [ 124.372815, -15.397697 ], [ 124.366655, -15.398858 ], [ 124.337664, -15.376048 ], [ 124.352854, -15.360738 ], [ 124.366854, -15.366328 ], [ 124.363455, -15.386788 ], [ 124.374885, -15.390807 ] ] ], [ [ [ 124.367487, -16.365071 ], [ 124.358647, -16.375991 ], [ 124.361517, -16.364251 ], [ 124.367487, -16.365071 ] ] ], [ [ [ 124.358567, -16.346941 ], [ 124.353247, -16.358101 ], [ 124.347557, -16.349601 ], [ 124.355447, -16.340941 ], [ 124.358567, -16.346941 ] ] ], [ [ [ 124.351247, -16.359221 ], [ 124.350987, -16.364311 ], [ 124.341057, -16.359851 ], [ 124.342037, -16.352961 ], [ 124.351247, -16.359221 ] ] ], [ [ [ 124.349922, -15.330469 ], [ 124.339571, -15.332319 ], [ 124.336132, -15.344419 ], [ 124.318151, -15.356860 ], [ 124.303549, -15.351781 ], [ 124.336511, -15.325890 ], [ 124.340420, -15.313900 ], [ 124.349922, -15.330469 ] ] ], [ [ [ 124.286928, -15.301911 ], [ 124.278358, -15.312451 ], [ 124.271968, -15.303931 ], [ 124.263218, -15.310701 ], [ 124.265798, -15.304931 ], [ 124.256868, -15.301672 ], [ 124.241709, -15.319702 ], [ 124.231809, -15.318722 ], [ 124.232548, -15.297482 ], [ 124.266018, -15.282451 ], [ 124.276368, -15.279701 ], [ 124.286928, -15.301911 ] ] ], [ [ [ 124.259448, -16.384971 ], [ 124.251398, -16.401081 ], [ 124.237928, -16.400781 ], [ 124.223418, -16.380921 ], [ 124.216088, -16.354321 ], [ 124.222048, -16.355151 ], [ 124.221628, -16.347571 ], [ 124.245138, -16.389071 ], [ 124.247428, -16.378801 ], [ 124.259448, -16.384971 ] ] ], [ [ [ 124.235186, -15.968719 ], [ 124.201066, -15.965000 ], [ 124.185326, -15.924550 ], [ 124.192806, -15.933740 ], [ 124.190016, -15.916690 ], [ 124.204916, -15.923499 ], [ 124.211296, -15.954350 ], [ 124.233136, -15.952689 ], [ 124.235186, -15.968719 ] ] ], [ [ [ 124.229576, -15.938239 ], [ 124.219276, -15.943049 ], [ 124.212446, -15.918649 ], [ 124.226726, -15.927069 ], [ 124.229576, -15.938239 ] ] ], [ [ [ 124.229139, -15.320422 ], [ 124.224849, -15.325302 ], [ 124.213549, -15.318032 ], [ 124.227139, -15.314222 ], [ 124.229139, -15.320422 ] ] ], [ [ [ 124.220096, -15.946089 ], [ 124.212096, -15.949600 ], [ 124.211806, -15.935249 ], [ 124.220096, -15.946089 ] ] ], [ [ [ 124.208339, -15.330552 ], [ 124.206859, -15.337762 ], [ 124.188569, -15.337282 ], [ 124.208339, -15.330552 ] ] ], [ [ [ 124.187286, -15.953430 ], [ 124.174836, -15.948380 ], [ 124.176896, -15.937980 ], [ 124.187286, -15.953430 ] ] ], [ [ [ 124.146301, -33.843288 ], [ 124.140392, -33.862008 ], [ 124.130122, -33.862808 ], [ 124.136721, -33.852088 ], [ 124.130631, -33.841948 ], [ 124.146301, -33.843288 ] ] ], [ [ [ 124.144068, -16.249811 ], [ 124.110018, -16.249942 ], [ 124.109728, -16.258302 ], [ 124.097608, -16.251112 ], [ 124.105018, -16.246072 ], [ 124.102148, -16.237122 ], [ 124.114068, -16.239792 ], [ 124.113078, -16.229162 ], [ 124.118968, -16.241292 ], [ 124.124388, -16.235562 ], [ 124.144068, -16.249811 ] ] ], [ [ [ 124.103397, -16.120371 ], [ 124.098437, -16.126902 ], [ 124.097567, -16.117621 ], [ 124.103397, -16.120371 ] ] ], [ [ [ 124.099247, -16.094241 ], [ 124.094427, -16.114892 ], [ 124.089367, -16.099522 ], [ 124.086357, -16.116312 ], [ 124.078087, -16.110722 ], [ 124.072067, -16.119952 ], [ 124.063217, -16.114012 ], [ 124.076967, -16.103932 ], [ 124.058717, -16.105732 ], [ 124.076517, -16.093842 ], [ 124.069147, -16.081432 ], [ 124.099247, -16.094241 ] ] ], [ [ [ 124.098587, -16.158092 ], [ 124.093747, -16.164502 ], [ 124.066688, -16.153372 ], [ 124.066397, -16.144892 ], [ 124.073767, -16.144482 ], [ 124.069247, -16.138352 ], [ 124.074877, -16.135562 ], [ 124.084397, -16.146252 ], [ 124.079237, -16.131632 ], [ 124.088377, -16.145032 ], [ 124.094597, -16.142132 ], [ 124.089737, -16.151932 ], [ 124.098587, -16.158092 ] ] ], [ [ [ 124.094238, -16.230632 ], [ 124.085888, -16.237922 ], [ 124.074708, -16.230392 ], [ 124.094238, -16.230632 ] ] ], [ [ [ 124.084958, -16.167502 ], [ 124.077888, -16.174802 ], [ 124.068238, -16.166382 ], [ 124.080318, -16.161482 ], [ 124.084958, -16.167502 ] ] ], [ [ [ 124.080308, -16.248622 ], [ 124.074418, -16.255032 ], [ 124.060478, -16.240252 ], [ 124.080308, -16.248622 ] ] ], [ [ [ 123.940059, -16.276973 ], [ 123.925390, -16.282063 ], [ 123.905780, -16.276383 ], [ 123.912019, -16.270663 ], [ 123.900430, -16.271833 ], [ 123.897149, -16.256993 ], [ 123.861510, -16.236163 ], [ 123.885529, -16.246063 ], [ 123.876859, -16.232433 ], [ 123.940059, -16.276973 ] ] ], [ [ [ 123.892899, -16.186323 ], [ 123.890639, -16.190943 ], [ 123.883089, -16.183423 ], [ 123.892899, -16.186323 ] ] ], [ [ [ 123.891156, -34.102025 ], [ 123.885492, -34.108128 ], [ 123.885055, -34.101146 ], [ 123.891156, -34.102025 ] ] ], [ [ [ 123.890659, -16.202923 ], [ 123.872759, -16.218163 ], [ 123.877589, -16.199543 ], [ 123.867479, -16.191333 ], [ 123.874049, -16.188333 ], [ 123.881639, -16.197803 ], [ 123.883989, -16.188743 ], [ 123.890659, -16.202923 ] ] ], [ [ [ 123.886440, -16.280093 ], [ 123.879110, -16.289763 ], [ 123.879050, -16.281963 ], [ 123.863550, -16.273593 ], [ 123.857400, -16.253203 ], [ 123.886440, -16.280093 ] ] ], [ [ [ 123.885180, -16.319723 ], [ 123.864830, -16.289883 ], [ 123.876620, -16.293813 ], [ 123.872830, -16.299433 ], [ 123.885180, -16.319723 ] ] ], [ [ [ 123.883869, -16.173713 ], [ 123.881699, -16.182053 ], [ 123.876259, -16.174673 ], [ 123.883869, -16.173713 ] ] ], [ [ [ 123.874299, -16.201783 ], [ 123.862589, -16.202493 ], [ 123.865439, -16.197193 ], [ 123.874299, -16.201783 ] ] ], [ [ [ 123.857080, -16.278523 ], [ 123.849690, -16.280953 ], [ 123.847660, -16.271673 ], [ 123.857080, -16.278523 ] ] ], [ [ [ 123.845020, -16.235593 ], [ 123.843450, -16.241913 ], [ 123.837620, -16.224343 ], [ 123.845020, -16.235593 ] ] ], [ [ [ 123.842349, -16.189003 ], [ 123.838279, -16.214513 ], [ 123.830889, -16.203043 ], [ 123.842349, -16.189003 ] ] ], [ [ [ 123.835450, -16.246713 ], [ 123.831540, -16.252443 ], [ 123.825960, -16.248113 ], [ 123.826470, -16.257383 ], [ 123.819480, -16.253933 ], [ 123.817950, -16.269303 ], [ 123.804110, -16.245233 ], [ 123.815660, -16.249053 ], [ 123.810500, -16.236123 ], [ 123.827670, -16.239753 ], [ 123.822620, -16.227513 ], [ 123.831330, -16.235033 ], [ 123.831070, -16.223673 ], [ 123.835450, -16.246713 ] ] ], [ [ [ 123.819970, -16.208163 ], [ 123.818710, -16.218663 ], [ 123.811580, -16.204033 ], [ 123.819970, -16.208163 ] ] ], [ [ [ 123.813379, -16.199013 ], [ 123.796979, -16.187073 ], [ 123.807839, -16.188513 ], [ 123.813379, -16.199013 ] ] ], [ [ [ 123.808799, -16.200053 ], [ 123.791370, -16.200253 ], [ 123.771889, -16.165513 ], [ 123.777249, -16.163553 ], [ 123.784209, -16.180413 ], [ 123.808799, -16.200053 ] ] ], [ [ [ 123.797439, -16.145363 ], [ 123.782319, -16.149433 ], [ 123.789029, -16.159833 ], [ 123.774489, -16.148133 ], [ 123.778049, -16.142393 ], [ 123.759169, -16.149023 ], [ 123.776589, -16.160263 ], [ 123.766099, -16.158573 ], [ 123.709179, -16.113923 ], [ 123.705399, -16.118983 ], [ 123.682889, -16.112013 ], [ 123.710649, -16.106253 ], [ 123.732069, -16.117843 ], [ 123.776899, -16.125653 ], [ 123.777599, -16.112543 ], [ 123.788699, -16.113653 ], [ 123.790799, -16.128133 ], [ 123.784449, -16.132263 ], [ 123.797439, -16.145363 ] ] ], [ [ [ 123.754498, -16.263279 ], [ 123.765171, -16.269683 ], [ 123.756501, -16.271653 ], [ 123.742781, -16.261033 ], [ 123.754498, -16.263279 ] ] ], [ [ [ 123.702957, -15.940013 ], [ 123.692467, -15.952793 ], [ 123.701587, -15.959333 ], [ 123.691657, -15.957873 ], [ 123.689218, -15.967143 ], [ 123.684417, -15.958903 ], [ 123.690807, -15.935283 ], [ 123.696647, -15.936513 ], [ 123.691497, -15.926243 ], [ 123.702957, -15.940013 ] ] ], [ [ [ 123.698311, -16.355403 ], [ 123.688241, -16.356223 ], [ 123.678741, -16.344953 ], [ 123.698311, -16.355403 ] ] ], [ [ [ 123.683302, -17.034349 ], [ 123.676103, -17.043359 ], [ 123.664652, -17.028399 ], [ 123.677482, -17.021669 ], [ 123.683302, -17.034349 ] ] ], [ [ [ 123.672201, -16.356203 ], [ 123.653421, -16.348023 ], [ 123.668871, -16.348833 ], [ 123.672201, -16.356203 ] ] ], [ [ [ 123.665822, -16.416291 ], [ 123.648352, -16.417952 ], [ 123.622162, -16.400552 ], [ 123.665822, -16.416291 ] ] ], [ [ [ 123.658141, -16.344673 ], [ 123.630121, -16.335963 ], [ 123.648151, -16.335663 ], [ 123.658141, -16.344673 ] ] ], [ [ [ 123.639979, -16.099334 ], [ 123.625179, -16.106674 ], [ 123.585069, -16.081454 ], [ 123.639979, -16.099334 ] ] ], [ [ [ 123.629252, -16.354043 ], [ 123.606411, -16.342883 ], [ 123.600111, -16.327793 ], [ 123.627811, -16.345093 ], [ 123.629252, -16.354043 ] ] ], [ [ [ 123.627372, -16.420602 ], [ 123.620393, -16.428342 ], [ 123.606902, -16.417832 ], [ 123.627372, -16.420602 ] ] ], [ [ [ 123.595100, -16.160564 ], [ 123.582230, -16.160784 ], [ 123.576040, -16.146844 ], [ 123.590330, -16.144694 ], [ 123.595100, -16.160564 ] ] ], [ [ [ 123.580080, -16.241364 ], [ 123.564521, -16.241345 ], [ 123.547171, -16.219825 ], [ 123.580080, -16.241364 ] ] ], [ [ [ 123.576361, -16.263834 ], [ 123.566721, -16.268834 ], [ 123.572311, -16.258484 ], [ 123.576361, -16.263834 ] ] ], [ [ [ 123.572981, -16.249674 ], [ 123.565961, -16.261934 ], [ 123.546281, -16.251925 ], [ 123.564581, -16.259884 ], [ 123.564251, -16.245075 ], [ 123.572981, -16.249674 ] ] ], [ [ [ 123.564059, -16.078104 ], [ 123.550269, -16.077084 ], [ 123.557100, -16.096584 ], [ 123.547950, -16.099894 ], [ 123.552430, -16.095974 ], [ 123.543880, -16.085394 ], [ 123.535440, -16.087574 ], [ 123.538520, -16.095744 ], [ 123.525630, -16.086694 ], [ 123.522529, -16.069034 ], [ 123.537589, -16.058314 ], [ 123.564059, -16.078104 ] ] ], [ [ [ 123.561677, -34.337796 ], [ 123.559537, -34.360006 ], [ 123.533998, -34.378066 ], [ 123.533847, -34.368826 ], [ 123.544717, -34.364646 ], [ 123.543077, -34.356416 ], [ 123.561677, -34.337796 ] ] ], [ [ [ 123.559471, -16.605066 ], [ 123.550661, -16.607476 ], [ 123.552861, -16.597216 ], [ 123.559471, -16.605066 ] ] ], [ [ [ 123.553747, -17.264932 ], [ 123.545267, -17.290322 ], [ 123.538447, -17.242032 ], [ 123.543667, -17.232562 ], [ 123.551857, -17.241422 ], [ 123.553747, -17.264932 ] ] ], [ [ [ 123.551969, -16.046464 ], [ 123.530189, -16.050444 ], [ 123.508429, -16.024304 ], [ 123.517089, -16.026814 ], [ 123.522089, -16.017254 ], [ 123.529389, -16.023654 ], [ 123.521999, -16.026864 ], [ 123.527059, -16.035044 ], [ 123.533539, -16.030014 ], [ 123.540419, -16.044094 ], [ 123.551969, -16.046464 ] ] ], [ [ [ 123.551777, -17.305272 ], [ 123.545948, -17.318472 ], [ 123.542967, -17.303652 ], [ 123.551777, -17.305272 ] ] ], [ [ [ 123.547791, -16.265395 ], [ 123.546661, -16.273515 ], [ 123.525681, -16.277285 ], [ 123.503391, -16.258435 ], [ 123.524391, -16.265185 ], [ 123.539511, -16.262715 ], [ 123.539231, -16.255145 ], [ 123.547791, -16.265395 ] ] ], [ [ [ 123.546407, -17.297342 ], [ 123.540857, -17.301152 ], [ 123.537257, -17.291982 ], [ 123.546407, -17.297342 ] ] ], [ [ [ 123.546280, -16.202865 ], [ 123.545270, -16.210425 ], [ 123.539280, -16.187655 ], [ 123.546280, -16.202865 ] ] ], [ [ [ 123.538491, -16.592456 ], [ 123.522781, -16.604856 ], [ 123.517852, -16.580845 ], [ 123.527242, -16.579575 ], [ 123.529242, -16.591466 ], [ 123.538491, -16.592456 ] ] ], [ [ [ 123.536827, -34.009693 ], [ 123.527637, -34.023343 ], [ 123.523697, -34.006883 ], [ 123.536827, -34.009693 ] ] ], [ [ [ 123.535228, -17.321252 ], [ 123.531288, -17.332192 ], [ 123.528237, -17.307092 ], [ 123.535228, -17.321252 ] ] ], [ [ [ 123.534940, -16.152795 ], [ 123.534660, -16.157885 ], [ 123.526010, -16.144695 ], [ 123.534940, -16.152795 ] ] ], [ [ [ 123.531241, -16.258465 ], [ 123.497041, -16.249675 ], [ 123.491331, -16.259115 ], [ 123.505771, -16.266375 ], [ 123.506631, -16.274295 ], [ 123.489791, -16.284765 ], [ 123.479781, -16.244095 ], [ 123.447401, -16.228875 ], [ 123.447621, -16.218245 ], [ 123.457311, -16.208955 ], [ 123.479011, -16.214355 ], [ 123.473831, -16.220145 ], [ 123.488041, -16.224835 ], [ 123.478071, -16.226895 ], [ 123.490671, -16.243285 ], [ 123.531241, -16.258465 ] ] ], [ [ [ 123.531181, -16.609346 ], [ 123.509541, -16.640466 ], [ 123.480531, -16.633756 ], [ 123.456542, -16.617146 ], [ 123.489181, -16.615486 ], [ 123.508221, -16.631406 ], [ 123.502321, -16.623556 ], [ 123.512281, -16.611776 ], [ 123.531181, -16.609346 ] ] ], [ [ [ 123.526168, -17.344372 ], [ 123.523859, -17.358492 ], [ 123.515738, -17.335962 ], [ 123.526168, -17.344372 ] ] ], [ [ [ 123.525160, -16.147515 ], [ 123.523141, -16.162975 ], [ 123.505261, -16.161915 ], [ 123.511501, -16.145465 ], [ 123.519380, -16.140905 ], [ 123.525160, -16.147515 ] ] ], [ [ [ 123.521711, -16.275895 ], [ 123.515061, -16.298675 ], [ 123.512521, -16.282485 ], [ 123.521711, -16.275895 ] ] ], [ [ [ 123.493402, -16.600296 ], [ 123.478422, -16.609996 ], [ 123.483812, -16.598066 ], [ 123.493402, -16.600296 ] ] ], [ [ [ 123.460991, -16.167835 ], [ 123.428301, -16.162225 ], [ 123.454281, -16.154745 ], [ 123.460991, -16.167835 ] ] ], [ [ [ 123.459381, -16.269815 ], [ 123.442801, -16.267716 ], [ 123.446951, -16.274316 ], [ 123.438251, -16.278296 ], [ 123.434571, -16.271026 ], [ 123.438761, -16.262366 ], [ 123.459381, -16.269815 ] ] ], [ [ [ 123.457898, -17.335873 ], [ 123.456149, -17.342233 ], [ 123.447099, -17.338233 ], [ 123.443528, -17.324653 ], [ 123.457898, -17.335873 ] ] ], [ [ [ 123.455532, -16.530435 ], [ 123.429332, -16.524876 ], [ 123.441432, -16.521825 ], [ 123.455532, -16.530435 ] ] ], [ [ [ 123.446000, -16.088115 ], [ 123.434270, -16.091845 ], [ 123.442120, -16.113625 ], [ 123.424490, -16.087795 ], [ 123.432320, -16.087425 ], [ 123.432670, -16.076455 ], [ 123.446000, -16.088115 ] ] ], [ [ [ 123.435441, -16.277706 ], [ 123.422101, -16.278036 ], [ 123.432481, -16.269996 ], [ 123.435441, -16.277706 ] ] ], [ [ [ 123.430001, -16.283646 ], [ 123.421051, -16.289446 ], [ 123.416521, -16.274476 ], [ 123.430001, -16.283646 ] ] ], [ [ [ 123.423888, -17.322183 ], [ 123.403658, -17.319363 ], [ 123.399528, -17.300693 ], [ 123.423888, -17.322183 ] ] ], [ [ [ 123.422520, -16.131755 ], [ 123.414170, -16.136875 ], [ 123.408070, -16.126415 ], [ 123.400270, -16.134485 ], [ 123.389340, -16.129065 ], [ 123.395360, -16.123915 ], [ 123.389900, -16.119465 ], [ 123.400460, -16.116735 ], [ 123.393510, -16.109665 ], [ 123.401350, -16.108835 ], [ 123.402570, -16.117825 ], [ 123.422520, -16.131755 ] ] ], [ [ [ 123.422142, -16.343036 ], [ 123.414762, -16.343536 ], [ 123.418862, -16.332376 ], [ 123.422142, -16.343036 ] ] ], [ [ [ 123.419370, -16.084585 ], [ 123.404970, -16.086375 ], [ 123.406320, -16.080165 ], [ 123.389240, -16.069825 ], [ 123.419370, -16.084585 ] ] ], [ [ [ 123.403002, -16.372136 ], [ 123.399642, -16.380576 ], [ 123.383322, -16.373186 ], [ 123.403002, -16.372136 ] ] ], [ [ [ 123.400362, -16.527766 ], [ 123.387832, -16.527196 ], [ 123.380082, -16.517176 ], [ 123.398282, -16.513056 ], [ 123.400362, -16.527766 ] ] ], [ [ [ 123.391252, -16.582626 ], [ 123.387972, -16.604636 ], [ 123.362992, -16.583596 ], [ 123.348152, -16.544906 ], [ 123.352412, -16.530136 ], [ 123.358612, -16.530986 ], [ 123.364682, -16.556026 ], [ 123.391252, -16.582626 ] ] ], [ [ [ 123.376390, -16.058285 ], [ 123.358170, -16.056755 ], [ 123.361620, -16.050045 ], [ 123.376390, -16.058285 ] ] ], [ [ [ 123.361102, -16.427126 ], [ 123.359682, -16.439096 ], [ 123.344842, -16.447086 ], [ 123.346332, -16.417256 ], [ 123.361102, -16.427126 ] ] ], [ [ [ 123.357412, -16.361407 ], [ 123.335932, -16.358717 ], [ 123.334682, -16.332817 ], [ 123.349362, -16.339737 ], [ 123.357412, -16.361407 ] ] ], [ [ [ 123.350751, -16.162046 ], [ 123.341751, -16.161166 ], [ 123.345991, -16.169566 ], [ 123.335841, -16.166986 ], [ 123.319851, -16.152916 ], [ 123.327241, -16.150846 ], [ 123.322151, -16.145366 ], [ 123.333871, -16.154416 ], [ 123.344341, -16.149206 ], [ 123.350751, -16.162046 ] ] ], [ [ [ 123.327591, -16.139886 ], [ 123.309431, -16.142756 ], [ 123.307981, -16.136636 ], [ 123.327591, -16.139886 ] ] ], [ [ [ 123.318522, -16.322257 ], [ 123.309302, -16.320357 ], [ 123.308972, -16.307007 ], [ 123.318522, -16.322257 ] ] ], [ [ [ 123.316771, -16.134916 ], [ 123.301891, -16.137596 ], [ 123.289971, -16.125946 ], [ 123.316771, -16.134916 ] ] ], [ [ [ 123.313760, -16.033365 ], [ 123.294920, -16.045956 ], [ 123.277530, -16.043406 ], [ 123.313760, -16.033365 ] ] ], [ [ [ 123.305812, -16.306977 ], [ 123.302082, -16.316207 ], [ 123.299972, -16.306237 ], [ 123.305812, -16.306977 ] ] ], [ [ [ 123.297452, -16.300787 ], [ 123.295872, -16.306087 ], [ 123.290882, -16.301627 ], [ 123.297452, -16.300787 ] ] ], [ [ [ 123.225803, -16.407458 ], [ 123.213343, -16.422588 ], [ 123.199383, -16.424708 ], [ 123.213083, -16.393198 ], [ 123.225803, -16.407458 ] ] ], [ [ [ 123.216378, -34.088235 ], [ 123.207209, -34.119455 ], [ 123.205889, -34.107725 ], [ 123.192979, -34.117396 ], [ 123.193819, -34.108595 ], [ 123.180809, -34.107556 ], [ 123.173159, -34.124456 ], [ 123.170619, -34.113736 ], [ 123.161119, -34.116876 ], [ 123.157479, -34.110326 ], [ 123.170288, -34.090396 ], [ 123.201728, -34.092945 ], [ 123.214638, -34.080895 ], [ 123.216378, -34.088235 ] ] ], [ [ [ 123.211453, -16.392728 ], [ 123.192493, -16.432768 ], [ 123.185353, -16.432468 ], [ 123.183843, -16.421258 ], [ 123.176563, -16.433508 ], [ 123.166583, -16.425149 ], [ 123.178863, -16.406059 ], [ 123.168163, -16.389109 ], [ 123.187163, -16.386368 ], [ 123.191143, -16.397038 ], [ 123.205893, -16.387128 ], [ 123.211453, -16.392728 ] ] ], [ [ [ 123.188488, -34.078365 ], [ 123.183178, -34.087155 ], [ 123.178728, -34.079815 ], [ 123.188488, -34.078365 ] ] ], [ [ [ 123.167983, -16.405039 ], [ 123.152423, -16.423529 ], [ 123.159363, -16.400659 ], [ 123.167983, -16.405039 ] ] ], [ [ [ 123.166635, -15.528529 ], [ 123.152765, -15.532459 ], [ 123.153605, -15.511449 ], [ 123.166635, -15.528529 ] ] ], [ [ [ 123.158473, -16.397139 ], [ 123.143453, -16.389409 ], [ 123.152723, -16.387129 ], [ 123.158473, -16.397139 ] ] ], [ [ [ 123.135823, -16.400859 ], [ 123.124963, -16.408539 ], [ 123.124903, -16.423799 ], [ 123.118043, -16.409369 ], [ 123.126113, -16.398379 ], [ 123.135823, -16.400859 ] ] ], [ [ [ 123.129223, -16.434929 ], [ 123.104123, -16.437479 ], [ 123.090913, -16.425919 ], [ 123.107323, -16.424289 ], [ 123.129223, -16.434929 ] ] ], [ [ [ 122.862299, -33.982616 ], [ 122.813979, -34.003036 ], [ 122.843339, -33.983116 ], [ 122.862299, -33.982616 ] ] ], [ [ [ 122.813069, -34.008576 ], [ 122.799569, -34.014226 ], [ 122.798419, -34.004466 ], [ 122.807739, -34.000696 ], [ 122.813069, -34.008576 ] ] ], [ [ [ 122.654920, -33.996987 ], [ 122.651940, -34.002627 ], [ 122.647340, -33.998237 ], [ 122.654920, -33.996987 ] ] ], [ [ [ 122.261105, -34.124150 ], [ 122.252565, -34.127881 ], [ 122.256164, -34.142961 ], [ 122.249174, -34.145101 ], [ 122.246334, -34.161311 ], [ 122.235684, -34.158881 ], [ 122.239143, -34.126411 ], [ 122.231214, -34.126531 ], [ 122.238464, -34.119920 ], [ 122.231354, -34.108620 ], [ 122.261105, -34.124150 ] ] ], [ [ [ 122.151673, -34.033439 ], [ 122.128523, -34.029409 ], [ 122.147073, -34.027169 ], [ 122.151673, -34.033439 ] ] ], [ [ [ 122.126503, -16.852570 ], [ 122.101863, -16.855070 ], [ 122.112663, -16.858450 ], [ 122.092593, -16.854631 ], [ 122.126503, -16.852570 ] ] ], [ [ [ 122.109584, -34.064350 ], [ 122.097724, -34.064620 ], [ 122.103624, -34.059040 ], [ 122.109584, -34.064350 ] ] ], [ [ [ 122.059017, -34.145891 ], [ 122.038627, -34.141572 ], [ 122.050357, -34.137912 ], [ 122.059017, -34.145891 ] ] ], [ [ [ 122.026873, -33.963460 ], [ 122.004353, -33.970920 ], [ 122.002263, -33.958060 ], [ 122.026873, -33.963460 ] ] ], [ [ [ 122.011284, -34.024181 ], [ 121.993355, -34.042161 ], [ 121.982475, -34.036721 ], [ 122.011284, -34.024181 ] ] ], [ [ [ 122.004794, -33.987270 ], [ 121.987044, -33.988881 ], [ 121.995353, -33.980460 ], [ 122.004794, -33.987270 ] ] ], [ [ [ 121.992693, -33.973120 ], [ 121.981824, -33.979161 ], [ 121.976315, -33.972832 ], [ 121.992693, -33.973120 ] ] ], [ [ [ 121.984127, -34.117533 ], [ 121.973548, -34.120163 ], [ 121.975807, -34.113843 ], [ 121.984127, -34.117533 ] ] ], [ [ [ 121.979725, -34.049472 ], [ 121.953565, -34.055912 ], [ 121.957795, -34.045022 ], [ 121.979725, -34.049472 ] ] ], [ [ [ 121.910222, -33.917719 ], [ 121.903813, -33.924559 ], [ 121.896672, -33.920019 ], [ 121.910222, -33.917719 ] ] ], [ [ [ 121.883822, -33.920179 ], [ 121.874292, -33.926889 ], [ 121.868372, -33.922459 ], [ 121.883822, -33.920179 ] ] ], [ [ [ 121.803543, -33.924811 ], [ 121.795934, -33.928591 ], [ 121.788424, -33.920549 ], [ 121.803543, -33.924811 ] ] ], [ [ [ 121.689596, -34.005122 ], [ 121.669176, -34.002433 ], [ 121.669706, -33.994753 ], [ 121.679996, -33.994373 ], [ 121.689596, -34.005122 ] ] ], [ [ [ 121.616807, -34.018844 ], [ 121.605967, -34.039344 ], [ 121.593107, -34.028943 ], [ 121.605567, -34.028834 ], [ 121.607917, -34.013664 ], [ 121.616807, -34.018844 ] ] ], [ [ [ 119.613867, -34.375885 ], [ 119.605835, -34.378036 ], [ 119.598657, -34.368456 ], [ 119.613867, -34.375885 ] ] ], [ [ [ 118.527655, -20.312141 ], [ 118.510665, -20.323751 ], [ 118.499545, -20.318621 ], [ 118.511755, -20.309091 ], [ 118.527655, -20.312141 ] ] ], [ [ [ 118.486712, -34.921999 ], [ 118.477923, -34.936849 ], [ 118.466729, -34.935495 ], [ 118.436860, -34.910698 ], [ 118.441545, -34.904050 ], [ 118.456806, -34.904944 ], [ 118.486712, -34.921999 ] ] ], [ [ [ 118.069948, -35.064917 ], [ 118.044119, -35.066411 ], [ 118.039712, -35.059841 ], [ 118.069948, -35.064917 ] ] ], [ [ [ 117.874168, -20.516177 ], [ 117.862358, -20.532148 ], [ 117.845238, -20.539198 ], [ 117.874168, -20.516177 ] ] ], [ [ [ 117.744051, -20.627250 ], [ 117.734171, -20.653710 ], [ 117.711371, -20.642980 ], [ 117.717111, -20.607560 ], [ 117.733961, -20.626600 ], [ 117.744051, -20.627250 ] ] ], [ [ [ 117.089441, -20.616303 ], [ 117.058322, -20.638793 ], [ 117.037842, -20.635984 ], [ 117.072522, -20.616283 ], [ 117.089441, -20.616303 ] ] ], [ [ [ 117.084729, -20.446752 ], [ 117.075959, -20.465602 ], [ 117.074439, -20.433752 ], [ 117.068689, -20.430922 ], [ 117.081849, -20.431522 ], [ 117.084729, -20.446752 ] ] ], [ [ [ 116.975219, -20.439783 ], [ 116.973819, -20.445323 ], [ 116.960049, -20.430173 ], [ 116.966129, -20.425953 ], [ 116.975219, -20.439783 ] ] ], [ [ [ 116.952899, -20.420053 ], [ 116.929889, -20.418394 ], [ 116.849338, -20.378805 ], [ 116.831809, -20.354075 ], [ 116.838499, -20.352006 ], [ 116.952899, -20.420053 ] ] ], [ [ [ 116.886349, -20.480536 ], [ 116.878981, -20.505426 ], [ 116.866120, -20.518596 ], [ 116.856071, -20.511616 ], [ 116.837001, -20.520006 ], [ 116.816122, -20.517866 ], [ 116.854348, -20.445166 ], [ 116.885701, -20.423638 ], [ 116.873118, -20.456576 ], [ 116.862718, -20.459796 ], [ 116.862549, -20.469736 ], [ 116.870429, -20.465736 ], [ 116.869809, -20.480076 ], [ 116.860889, -20.489386 ], [ 116.867641, -20.495326 ], [ 116.886349, -20.480536 ] ] ], [ [ [ 116.844128, -20.457306 ], [ 116.837418, -20.458476 ], [ 116.843008, -20.452006 ], [ 116.844128, -20.457306 ] ] ], [ [ [ 116.838758, -20.426296 ], [ 116.825078, -20.458326 ], [ 116.798329, -20.472587 ], [ 116.799148, -20.451467 ], [ 116.815558, -20.450246 ], [ 116.823238, -20.434626 ], [ 116.838758, -20.426296 ] ] ], [ [ [ 116.820204, -20.416699 ], [ 116.811248, -20.414596 ], [ 116.823788, -20.409215 ], [ 116.821180, -20.416644 ], [ 116.834138, -20.415925 ], [ 116.812378, -20.440776 ], [ 116.818088, -20.416816 ], [ 116.820204, -20.416699 ] ] ], [ [ [ 116.827288, -20.465986 ], [ 116.799342, -20.518307 ], [ 116.786862, -20.515777 ], [ 116.805340, -20.481466 ], [ 116.802588, -20.474646 ], [ 116.827288, -20.465986 ] ] ], [ [ [ 116.697464, -20.644838 ], [ 116.683404, -20.662178 ], [ 116.675484, -20.661878 ], [ 116.674544, -20.651818 ], [ 116.697464, -20.644838 ] ] ], [ [ [ 116.692212, -20.505437 ], [ 116.690013, -20.518997 ], [ 116.677213, -20.523237 ], [ 116.678052, -20.503697 ], [ 116.692212, -20.505437 ] ] ], [ [ [ 116.680673, -20.584068 ], [ 116.670073, -20.596538 ], [ 116.677403, -20.599438 ], [ 116.667374, -20.628388 ], [ 116.649934, -20.621248 ], [ 116.635363, -20.632378 ], [ 116.649333, -20.599118 ], [ 116.668153, -20.596998 ], [ 116.680673, -20.584068 ] ] ], [ [ [ 116.676393, -20.548978 ], [ 116.635343, -20.607768 ], [ 116.600103, -20.612219 ], [ 116.605703, -20.604778 ], [ 116.597172, -20.602749 ], [ 116.613433, -20.593078 ], [ 116.624243, -20.572368 ], [ 116.643363, -20.560428 ], [ 116.649633, -20.567058 ], [ 116.671023, -20.545658 ], [ 116.676393, -20.548978 ] ] ], [ [ [ 116.671183, -20.518177 ], [ 116.661653, -20.526998 ], [ 116.656143, -20.517418 ], [ 116.671183, -20.518177 ] ] ], [ [ [ 116.662114, -20.675499 ], [ 116.656864, -20.680709 ], [ 116.650934, -20.672049 ], [ 116.662114, -20.675499 ] ] ], [ [ [ 116.650012, -20.548878 ], [ 116.645513, -20.558268 ], [ 116.635382, -20.555068 ], [ 116.650012, -20.548878 ] ] ], [ [ [ 116.635012, -20.458967 ], [ 116.627712, -20.460247 ], [ 116.626842, -20.453697 ], [ 116.635012, -20.458967 ] ] ], [ [ [ 116.619152, -20.473828 ], [ 116.588972, -20.500838 ], [ 116.566062, -20.485748 ], [ 116.609222, -20.453887 ], [ 116.606662, -20.467338 ], [ 116.619152, -20.473828 ] ] ], [ [ [ 116.586122, -20.575539 ], [ 116.585083, -20.583829 ], [ 116.574182, -20.586250 ], [ 116.575902, -20.594709 ], [ 116.562552, -20.586530 ], [ 116.555012, -20.590060 ], [ 116.549921, -20.604760 ], [ 116.560741, -20.602939 ], [ 116.560861, -20.609339 ], [ 116.552761, -20.620890 ], [ 116.530061, -20.615450 ], [ 116.501421, -20.621540 ], [ 116.463222, -20.609611 ], [ 116.485902, -20.585140 ], [ 116.512871, -20.582660 ], [ 116.512692, -20.594630 ], [ 116.523752, -20.601140 ], [ 116.533102, -20.598160 ], [ 116.542451, -20.572950 ], [ 116.552262, -20.568389 ], [ 116.555462, -20.585430 ], [ 116.566212, -20.576010 ], [ 116.573562, -20.583090 ], [ 116.586122, -20.575539 ] ] ], [ [ [ 116.505132, -35.027943 ], [ 116.498890, -35.036317 ], [ 116.490810, -35.033270 ], [ 116.505132, -35.027943 ] ] ], [ [ [ 116.451572, -20.664521 ], [ 116.434102, -20.655321 ], [ 116.448522, -20.651661 ], [ 116.451572, -20.664521 ] ] ], [ [ [ 116.248732, -20.813223 ], [ 116.247312, -20.818873 ], [ 116.242102, -20.803763 ], [ 116.248732, -20.813223 ] ] ], [ [ [ 116.179151, -20.945226 ], [ 116.175971, -20.956346 ], [ 116.174191, -20.934856 ], [ 116.179151, -20.945226 ] ] ], [ [ [ 116.157821, -20.937576 ], [ 116.152371, -20.948326 ], [ 116.147511, -20.934226 ], [ 116.157821, -20.937576 ] ] ], [ [ [ 115.902311, -20.955348 ], [ 115.881630, -20.949709 ], [ 115.885110, -20.938648 ], [ 115.900861, -20.937628 ], [ 115.902311, -20.955348 ] ] ], [ [ [ 115.700388, -32.226360 ], [ 115.686935, -32.232409 ], [ 115.700088, -32.244553 ], [ 115.680808, -32.244161 ], [ 115.660534, -32.156225 ], [ 115.674637, -32.165189 ], [ 115.683319, -32.205863 ], [ 115.700388, -32.226360 ] ] ], [ [ [ 115.694669, -32.305286 ], [ 115.689953, -32.309051 ], [ 115.689832, -32.301809 ], [ 115.694669, -32.305286 ] ] ], [ [ [ 115.585513, -20.403446 ], [ 115.579164, -20.409306 ], [ 115.582974, -20.420365 ], [ 115.577234, -20.419685 ], [ 115.570543, -20.401956 ], [ 115.546023, -20.381486 ], [ 115.559922, -20.378006 ], [ 115.566963, -20.393486 ], [ 115.585513, -20.403446 ] ] ], [ [ [ 115.583248, -20.661117 ], [ 115.565858, -20.640997 ], [ 115.581458, -20.651297 ], [ 115.583248, -20.661117 ] ] ], [ [ [ 115.558403, -32.003453 ], [ 115.551173, -32.012473 ], [ 115.531653, -32.014954 ], [ 115.527643, -32.027634 ], [ 115.507593, -32.012964 ], [ 115.449783, -32.026185 ], [ 115.456893, -32.015734 ], [ 115.477243, -32.013764 ], [ 115.511343, -31.987614 ], [ 115.539653, -31.988183 ], [ 115.545093, -32.000753 ], [ 115.558403, -32.003453 ] ] ], [ [ [ 115.551205, -20.442445 ], [ 115.548445, -20.446994 ], [ 115.543165, -20.440365 ], [ 115.547655, -20.435316 ], [ 115.551205, -20.442445 ] ] ], [ [ [ 115.549115, -20.432686 ], [ 115.543065, -20.436895 ], [ 115.543944, -20.415346 ], [ 115.549115, -20.432686 ] ] ], [ [ [ 115.547284, -21.387085 ], [ 115.542674, -21.394745 ], [ 115.542614, -21.381985 ], [ 115.547284, -21.387085 ] ] ], [ [ [ 115.531971, -20.478538 ], [ 115.534555, -20.466331 ], [ 115.539175, -20.470976 ], [ 115.533972, -20.477622 ], [ 115.541565, -20.474146 ], [ 115.532206, -20.486096 ], [ 115.536506, -20.491406 ], [ 115.530276, -20.490716 ], [ 115.535906, -20.492756 ], [ 115.532176, -20.504946 ], [ 115.525006, -20.493306 ], [ 115.521147, -20.506046 ], [ 115.517185, -20.441486 ], [ 115.530605, -20.440945 ], [ 115.524495, -20.437775 ], [ 115.533224, -20.413636 ], [ 115.531565, -20.430646 ], [ 115.537824, -20.422106 ], [ 115.539475, -20.433506 ], [ 115.533945, -20.445575 ], [ 115.543775, -20.443445 ], [ 115.545795, -20.454625 ], [ 115.540635, -20.467636 ], [ 115.534689, -20.465696 ], [ 115.538135, -20.449415 ], [ 115.525805, -20.447145 ], [ 115.533224, -20.451215 ], [ 115.531655, -20.457535 ], [ 115.524355, -20.454245 ], [ 115.529116, -20.470516 ], [ 115.521426, -20.483366 ], [ 115.531971, -20.478538 ] ] ], [ [ [ 115.526096, -20.410539 ], [ 115.540844, -20.402356 ], [ 115.526464, -20.411026 ], [ 115.526096, -20.410539 ] ] ], [ [ [ 115.539503, -20.371706 ], [ 115.512763, -20.364835 ], [ 115.517503, -20.358425 ], [ 115.532533, -20.361036 ], [ 115.539503, -20.371706 ] ] ], [ [ [ 115.529804, -20.423036 ], [ 115.523554, -20.427775 ], [ 115.526214, -20.415766 ], [ 115.529804, -20.423036 ] ] ], [ [ [ 115.525987, -20.399742 ], [ 115.517734, -20.401076 ], [ 115.520154, -20.389006 ], [ 115.525987, -20.399742 ] ] ], [ [ [ 115.476919, -20.733548 ], [ 115.470930, -20.741349 ], [ 115.475910, -20.766069 ], [ 115.469190, -20.766989 ], [ 115.470650, -20.777599 ], [ 115.453530, -20.805620 ], [ 115.447580, -20.802200 ], [ 115.447450, -20.828890 ], [ 115.424520, -20.838070 ], [ 115.420731, -20.863700 ], [ 115.374991, -20.894811 ], [ 115.365461, -20.871111 ], [ 115.332781, -20.867751 ], [ 115.320411, -20.875101 ], [ 115.333751, -20.876111 ], [ 115.321031, -20.891581 ], [ 115.306821, -20.860441 ], [ 115.321540, -20.808271 ], [ 115.433089, -20.666898 ], [ 115.468679, -20.680238 ], [ 115.458339, -20.692378 ], [ 115.476919, -20.733548 ] ] ], [ [ [ 115.465286, -21.493407 ], [ 115.437428, -21.528148 ], [ 115.420108, -21.520118 ], [ 115.435077, -21.503197 ], [ 115.465286, -21.493407 ] ] ], [ [ [ 115.361458, -21.485118 ], [ 115.351067, -21.483258 ], [ 115.356037, -21.468328 ], [ 115.361458, -21.485118 ] ] ], [ [ [ 115.337102, -20.966192 ], [ 115.324002, -20.973882 ], [ 115.316621, -20.948202 ], [ 115.337102, -20.966192 ] ] ], [ [ [ 115.335951, -20.905681 ], [ 115.316531, -20.938272 ], [ 115.324671, -20.919921 ], [ 115.320791, -20.895991 ], [ 115.335951, -20.905681 ] ] ], [ [ [ 115.248307, -21.568981 ], [ 115.212386, -21.599761 ], [ 115.229236, -21.569531 ], [ 115.248307, -21.568981 ] ] ], [ [ [ 115.024964, -21.458280 ], [ 115.016784, -21.465200 ], [ 114.971534, -21.459380 ], [ 114.995974, -21.450830 ], [ 115.024964, -21.458280 ] ] ], [ [ [ 114.766554, -21.522192 ], [ 114.766454, -21.528852 ], [ 114.757644, -21.528192 ], [ 114.766554, -21.522192 ] ] ], [ [ [ 114.697414, -21.625864 ], [ 114.682334, -21.630744 ], [ 114.687744, -21.620234 ], [ 114.663904, -21.592164 ], [ 114.685544, -21.604994 ], [ 114.697414, -21.625864 ] ] ], [ [ [ 114.582488, -21.990900 ], [ 114.570718, -22.000991 ], [ 114.566138, -21.986731 ], [ 114.579208, -21.983900 ], [ 114.582488, -21.990900 ] ] ], [ [ [ 114.539751, -22.052841 ], [ 114.533689, -22.061613 ], [ 114.500758, -22.012392 ], [ 114.510348, -21.993762 ], [ 114.540818, -22.007431 ], [ 114.532308, -22.022862 ], [ 114.542278, -22.028422 ], [ 114.545549, -22.044452 ], [ 114.539967, -22.052529 ], [ 114.545549, -22.048512 ], [ 114.548459, -22.057203 ], [ 114.540339, -22.060033 ], [ 114.539751, -22.052841 ] ] ], [ [ [ 114.491409, -22.118596 ], [ 114.490200, -22.135416 ], [ 114.484259, -22.135296 ], [ 114.491409, -22.118596 ] ] ], [ [ [ 114.489950, -22.147037 ], [ 114.489100, -22.153137 ], [ 114.482680, -22.150307 ], [ 114.489950, -22.147037 ] ] ], [ [ [ 114.392474, -21.628267 ], [ 114.369784, -21.651857 ], [ 114.358194, -21.651177 ], [ 114.375333, -21.628037 ], [ 114.392474, -21.628267 ] ] ], [ [ [ 114.351554, -21.665957 ], [ 114.334524, -21.675208 ], [ 114.306014, -21.711648 ], [ 114.317614, -21.685588 ], [ 114.345634, -21.660427 ], [ 114.351554, -21.665957 ] ] ], [ [ [ 114.188829, -22.422416 ], [ 114.181899, -22.423746 ], [ 114.181579, -22.410655 ], [ 114.188829, -22.422416 ] ] ], [ [ [ 114.172859, -22.447197 ], [ 114.166589, -22.473808 ], [ 114.147600, -22.489439 ], [ 114.172859, -22.447197 ] ] ], [ [ [ 114.005403, -28.900650 ], [ 113.967223, -28.938511 ], [ 113.957454, -28.967091 ], [ 113.962024, -28.985081 ], [ 113.954074, -28.977151 ], [ 113.966653, -28.932831 ], [ 114.005403, -28.900650 ] ] ], [ [ [ 113.921806, -25.883864 ], [ 113.920576, -25.896384 ], [ 113.907856, -25.898194 ], [ 113.858346, -25.868224 ], [ 113.873556, -25.871034 ], [ 113.853716, -25.846234 ], [ 113.855826, -25.810704 ], [ 113.880736, -25.800773 ], [ 113.909406, -25.817443 ], [ 113.921806, -25.883864 ] ] ], [ [ [ 113.878802, -26.029192 ], [ 113.837327, -26.002146 ], [ 113.857318, -26.006946 ], [ 113.852708, -26.009096 ], [ 113.878802, -26.029192 ] ] ], [ [ [ 113.880375, -26.030403 ], [ 113.882768, -26.032246 ], [ 113.879468, -26.043006 ], [ 113.880375, -26.030403 ] ] ], [ [ [ 113.872160, -26.064486 ], [ 113.871888, -26.064306 ], [ 113.877828, -26.048446 ], [ 113.872160, -26.064486 ] ] ], [ [ [ 113.868412, -26.384130 ], [ 113.858452, -26.356419 ], [ 113.865251, -26.348729 ], [ 113.868412, -26.384130 ] ] ], [ [ [ 113.787881, -28.713950 ], [ 113.784091, -28.722910 ], [ 113.779911, -28.709280 ], [ 113.787881, -28.713950 ] ] ], [ [ [ 113.775116, -26.543621 ], [ 113.769866, -26.549051 ], [ 113.759405, -26.535202 ], [ 113.772445, -26.531451 ], [ 113.775116, -26.543621 ] ] ], [ [ [ 113.744660, -28.426357 ], [ 113.730150, -28.443847 ], [ 113.719390, -28.445377 ], [ 113.718080, -28.430017 ], [ 113.744660, -28.426357 ] ] ], [ [ [ 113.720956, -26.061620 ], [ 113.705277, -26.094241 ], [ 113.716946, -26.057681 ], [ 113.720956, -26.061620 ] ] ], [ [ [ 113.708480, -28.462717 ], [ 113.696290, -28.469778 ], [ 113.696100, -28.483998 ], [ 113.685790, -28.485128 ], [ 113.682070, -28.454007 ], [ 113.700620, -28.440297 ], [ 113.708480, -28.462717 ] ] ], [ [ [ 113.641118, -24.886206 ], [ 113.638364, -24.901785 ], [ 113.634714, -24.886565 ], [ 113.619694, -24.872405 ], [ 113.628374, -24.877555 ], [ 113.628463, -24.870905 ], [ 113.643794, -24.871075 ], [ 113.641268, -24.885360 ], [ 113.653384, -24.886265 ], [ 113.644383, -24.891154 ], [ 113.641118, -24.886206 ] ] ], [ [ [ 113.603089, -28.297866 ], [ 113.598259, -28.307996 ], [ 113.588319, -28.300346 ], [ 113.594939, -28.289316 ], [ 113.603089, -28.297866 ] ] ], [ [ [ 113.340322, -26.322034 ], [ 113.331982, -26.316854 ], [ 113.336912, -26.309703 ], [ 113.340322, -26.322034 ] ] ], [ [ [ 113.236900, -26.104322 ], [ 113.227650, -26.105323 ], [ 113.236620, -26.118873 ], [ 113.223110, -26.125513 ], [ 113.229080, -26.143573 ], [ 113.216280, -26.162503 ], [ 113.208580, -26.134853 ], [ 113.180850, -26.122613 ], [ 113.157499, -26.055893 ], [ 113.135968, -26.022343 ], [ 113.048587, -25.931073 ], [ 113.022966, -25.860412 ], [ 112.967386, -25.783252 ], [ 112.976935, -25.773151 ], [ 112.979595, -25.749471 ], [ 112.942504, -25.657950 ], [ 112.929794, -25.643200 ], [ 112.921124, -25.588190 ], [ 112.928673, -25.526509 ], [ 112.970672, -25.480388 ], [ 112.986462, -25.497298 ], [ 113.022632, -25.498978 ], [ 113.005593, -25.535998 ], [ 113.009403, -25.561188 ], [ 113.038883, -25.618339 ], [ 113.054074, -25.695490 ], [ 113.071105, -25.720410 ], [ 113.063705, -25.728270 ], [ 113.076785, -25.768620 ], [ 113.097226, -25.789150 ], [ 113.114756, -25.838651 ], [ 113.109726, -25.867971 ], [ 113.121127, -25.880431 ], [ 113.156007, -25.887821 ], [ 113.126497, -25.922432 ], [ 113.136678, -25.977432 ], [ 113.151278, -25.976932 ], [ 113.157568, -25.968952 ], [ 113.150727, -25.941282 ], [ 113.168057, -25.943272 ], [ 113.166998, -25.979822 ], [ 113.203978, -26.003292 ], [ 113.202548, -26.027322 ], [ 113.210899, -26.038172 ], [ 113.219779, -26.036722 ], [ 113.219739, -26.058382 ], [ 113.236900, -26.104322 ] ] ], [ [ [ 113.166282, -24.780890 ], [ 113.161353, -24.821071 ], [ 113.137763, -24.871071 ], [ 113.140994, -24.921172 ], [ 113.149784, -24.935052 ], [ 113.133574, -24.952212 ], [ 113.118985, -24.986862 ], [ 113.130594, -24.916552 ], [ 113.124404, -24.887552 ], [ 113.127983, -24.844101 ], [ 113.157122, -24.754600 ], [ 113.166282, -24.780890 ] ] ], [ [ [ 113.128236, -25.060023 ], [ 113.110716, -25.106763 ], [ 113.104217, -25.174774 ], [ 113.091118, -25.187904 ], [ 113.088818, -25.237545 ], [ 113.076049, -25.273245 ], [ 113.069298, -25.231425 ], [ 113.087368, -25.192054 ], [ 113.094766, -25.121114 ], [ 113.087656, -25.069843 ], [ 113.101645, -25.032683 ], [ 113.116485, -25.016173 ], [ 113.118365, -24.992162 ], [ 113.124565, -25.012383 ], [ 113.117265, -25.031073 ], [ 113.128236, -25.060023 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 5, + "properties": { + "STATE_CODE": "6", + "STATE_NAME": "Tasmania" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 148.481887, -40.434930 ], [ 148.472864, -40.442869 ], [ 148.437309, -40.439959 ], [ 148.430872, -40.465255 ], [ 148.413814, -40.462027 ], [ 148.400890, -40.473003 ], [ 148.397954, -40.489456 ], [ 148.377985, -40.476560 ], [ 148.350555, -40.492835 ], [ 148.336511, -40.482745 ], [ 148.336025, -40.464909 ], [ 148.309927, -40.426733 ], [ 148.293766, -40.434247 ], [ 148.273419, -40.428985 ], [ 148.274015, -40.436305 ], [ 148.226774, -40.466084 ], [ 148.195969, -40.435512 ], [ 148.164299, -40.450325 ], [ 148.142490, -40.448104 ], [ 148.151251, -40.453808 ], [ 148.140784, -40.460478 ], [ 148.142035, -40.450014 ], [ 148.127716, -40.439690 ], [ 148.085808, -40.457369 ], [ 148.046262, -40.448934 ], [ 148.039924, -40.441365 ], [ 148.045407, -40.434479 ], [ 148.024284, -40.429927 ], [ 148.034193, -40.424505 ], [ 148.017714, -40.414137 ], [ 147.988670, -40.421157 ], [ 147.989826, -40.406039 ], [ 147.983558, -40.402756 ], [ 147.992100, -40.394906 ], [ 147.987266, -40.387096 ], [ 148.001542, -40.375999 ], [ 148.047993, -40.355496 ], [ 148.060493, -40.358765 ], [ 148.081524, -40.339214 ], [ 148.089710, -40.345745 ], [ 148.143798, -40.336171 ], [ 148.145049, -40.342982 ], [ 148.166134, -40.347910 ], [ 148.183895, -40.344876 ], [ 148.191856, -40.356219 ], [ 148.207251, -40.342389 ], [ 148.210703, -40.317825 ], [ 148.225822, -40.321880 ], [ 148.229441, -40.330725 ], [ 148.243538, -40.325385 ], [ 148.266865, -40.340703 ], [ 148.282245, -40.319638 ], [ 148.300134, -40.321763 ], [ 148.317240, -40.311564 ], [ 148.331004, -40.299877 ], [ 148.329790, -40.290762 ], [ 148.363014, -40.322235 ], [ 148.370948, -40.341445 ], [ 148.398253, -40.357759 ], [ 148.410536, -40.371926 ], [ 148.407079, -40.377997 ], [ 148.424169, -40.371445 ], [ 148.451490, -40.376693 ], [ 148.448510, -40.405524 ], [ 148.458517, -40.409354 ], [ 148.464819, -40.427090 ], [ 148.481887, -40.434930 ] ] ], [ [ [ 148.363358, -39.947817 ], [ 148.361477, -39.953567 ], [ 148.351889, -39.950722 ], [ 148.363358, -39.947817 ] ] ], [ [ [ 144.754462, -41.061823 ], [ 144.745688, -41.055616 ], [ 144.695616, -41.047835 ], [ 144.683698, -41.037541 ], [ 144.680014, -41.049585 ], [ 144.661089, -41.053436 ], [ 144.638921, -41.045355 ], [ 144.607340, -41.008782 ], [ 144.625825, -41.004986 ], [ 144.632840, -40.993842 ], [ 144.630894, -40.952478 ], [ 144.612249, -40.944652 ], [ 144.611738, -40.935732 ], [ 144.655803, -40.913869 ], [ 144.649198, -40.900148 ], [ 144.683765, -40.907252 ], [ 144.704305, -40.876330 ], [ 144.706464, -40.867127 ], [ 144.698764, -40.862325 ], [ 144.711558, -40.858335 ], [ 144.713028, -40.835548 ], [ 144.697187, -40.809128 ], [ 144.706188, -40.794200 ], [ 144.697440, -40.783046 ], [ 144.707424, -40.776209 ], [ 144.710200, -40.761442 ], [ 144.703203, -40.750765 ], [ 144.691266, -40.755082 ], [ 144.678363, -40.716896 ], [ 144.697721, -40.689591 ], [ 144.686330, -40.682024 ], [ 144.686043, -40.672218 ], [ 144.725587, -40.641690 ], [ 144.748798, -40.689576 ], [ 144.738129, -40.682246 ], [ 144.736348, -40.690121 ], [ 144.771754, -40.705922 ], [ 144.765880, -40.743571 ], [ 144.779798, -40.729181 ], [ 144.778436, -40.713336 ], [ 144.785517, -40.708478 ], [ 144.804672, -40.713687 ], [ 144.810597, -40.727310 ], [ 144.836544, -40.718704 ], [ 144.840595, -40.743286 ], [ 144.848902, -40.738766 ], [ 144.907807, -40.750791 ], [ 144.924173, -40.763765 ], [ 144.927970, -40.758715 ], [ 144.979247, -40.743338 ], [ 145.001751, -40.762191 ], [ 145.000608, -40.775090 ], [ 145.010179, -40.766719 ], [ 145.016244, -40.766570 ], [ 145.007589, -40.778464 ], [ 145.024186, -40.770578 ], [ 145.015635, -40.779288 ], [ 145.023561, -40.778019 ], [ 145.018760, -40.789466 ], [ 145.037635, -40.787331 ], [ 145.038842, -40.780598 ], [ 145.052654, -40.786872 ], [ 145.070136, -40.809455 ], [ 145.065285, -40.819235 ], [ 145.077273, -40.808352 ], [ 145.090359, -40.813041 ], [ 145.085700, -40.824405 ], [ 145.100233, -40.827444 ], [ 145.096327, -40.815085 ], [ 145.108542, -40.814422 ], [ 145.111520, -40.831661 ], [ 145.118606, -40.828989 ], [ 145.121380, -40.837964 ], [ 145.131606, -40.819294 ], [ 145.164147, -40.825593 ], [ 145.167158, -40.818999 ], [ 145.133840, -40.802853 ], [ 145.112783, -40.801398 ], [ 145.110431, -40.794288 ], [ 145.187798, -40.804082 ], [ 145.256920, -40.789850 ], [ 145.216107, -40.810913 ], [ 145.241386, -40.813700 ], [ 145.258989, -40.805760 ], [ 145.269441, -40.758245 ], [ 145.268471, -40.746962 ], [ 145.250876, -40.729975 ], [ 145.252619, -40.715537 ], [ 145.260340, -40.712323 ], [ 145.275913, -40.735562 ], [ 145.295972, -40.738660 ], [ 145.294779, -40.754827 ], [ 145.308672, -40.764172 ], [ 145.288926, -40.766309 ], [ 145.271209, -40.801069 ], [ 145.266141, -40.797910 ], [ 145.269072, -40.811055 ], [ 145.284774, -40.820553 ], [ 145.280752, -40.829918 ], [ 145.293602, -40.826904 ], [ 145.280080, -40.793723 ], [ 145.312878, -40.835213 ], [ 145.309232, -40.843426 ], [ 145.311445, -40.842656 ], [ 145.321458, -40.849701 ], [ 145.315594, -40.837688 ], [ 145.343865, -40.851039 ], [ 145.391893, -40.849714 ], [ 145.395375, -40.863249 ], [ 145.403784, -40.854994 ], [ 145.446049, -40.871230 ], [ 145.446687, -40.886104 ], [ 145.435370, -40.894268 ], [ 145.448017, -40.887259 ], [ 145.446352, -40.877989 ], [ 145.452602, -40.879127 ], [ 145.447250, -40.874037 ], [ 145.481613, -40.868816 ], [ 145.502628, -40.851704 ], [ 145.511598, -40.853572 ], [ 145.522323, -40.887648 ], [ 145.537742, -40.891482 ], [ 145.546148, -40.909124 ], [ 145.560472, -40.916817 ], [ 145.583882, -40.913801 ], [ 145.595208, -40.923991 ], [ 145.619738, -40.925300 ], [ 145.621800, -40.932104 ], [ 145.653703, -40.940308 ], [ 145.729340, -40.944952 ], [ 145.733111, -40.956280 ], [ 145.724572, -40.968982 ], [ 145.741271, -40.985375 ], [ 145.696461, -40.974734 ], [ 145.768533, -40.996881 ], [ 145.800869, -41.026184 ], [ 145.838866, -41.038859 ], [ 145.829824, -41.050013 ], [ 145.836074, -41.056969 ], [ 145.830052, -41.050060 ], [ 145.841021, -41.038702 ], [ 145.877089, -41.036858 ], [ 145.878743, -41.042890 ], [ 145.921368, -41.051361 ], [ 145.910543, -41.049456 ], [ 145.909331, -41.057579 ], [ 145.924255, -41.066550 ], [ 145.923258, -41.078016 ], [ 145.924900, -41.066182 ], [ 145.958099, -41.063036 ], [ 145.984517, -41.074802 ], [ 145.973762, -41.087750 ], [ 145.985844, -41.074108 ], [ 146.046556, -41.101926 ], [ 146.064334, -41.102699 ], [ 146.077354, -41.115568 ], [ 146.119656, -41.118948 ], [ 146.128806, -41.135313 ], [ 146.167434, -41.146616 ], [ 146.167658, -41.156277 ], [ 146.154381, -41.154331 ], [ 146.152360, -41.161853 ], [ 146.168523, -41.157470 ], [ 146.169309, -41.145346 ], [ 146.185035, -41.153937 ], [ 146.248447, -41.157119 ], [ 146.243600, -41.177217 ], [ 146.249708, -41.176144 ], [ 146.247845, -41.181915 ], [ 146.250711, -41.174882 ], [ 146.250678, -41.196567 ], [ 146.255419, -41.151820 ], [ 146.287310, -41.160682 ], [ 146.332690, -41.156626 ], [ 146.316034, -41.182843 ], [ 146.336510, -41.160280 ], [ 146.356860, -41.158478 ], [ 146.366804, -41.165248 ], [ 146.366830, -41.192633 ], [ 146.348483, -41.203811 ], [ 146.356190, -41.203896 ], [ 146.347735, -41.217352 ], [ 146.364183, -41.208433 ], [ 146.367967, -41.216687 ], [ 146.359806, -41.222149 ], [ 146.371122, -41.217406 ], [ 146.368173, -41.227409 ], [ 146.384725, -41.228853 ], [ 146.388562, -41.238242 ], [ 146.386350, -41.228360 ], [ 146.388846, -41.235943 ], [ 146.395550, -41.233506 ], [ 146.391798, -41.227809 ], [ 146.400488, -41.233444 ], [ 146.400335, -41.228252 ], [ 146.362334, -41.200687 ], [ 146.369695, -41.193808 ], [ 146.369814, -41.167473 ], [ 146.395613, -41.172722 ], [ 146.465277, -41.159568 ], [ 146.519351, -41.136185 ], [ 146.531894, -41.118429 ], [ 146.545716, -41.129549 ], [ 146.541777, -41.155056 ], [ 146.561994, -41.167384 ], [ 146.547982, -41.168461 ], [ 146.540374, -41.179138 ], [ 146.553638, -41.171486 ], [ 146.568919, -41.177839 ], [ 146.572984, -41.189146 ], [ 146.562407, -41.197311 ], [ 146.575723, -41.220171 ], [ 146.561097, -41.238444 ], [ 146.572988, -41.239339 ], [ 146.565167, -41.251030 ], [ 146.577930, -41.240574 ], [ 146.568773, -41.233048 ], [ 146.583418, -41.222754 ], [ 146.585031, -41.205090 ], [ 146.586218, -41.216474 ], [ 146.596177, -41.219731 ], [ 146.593914, -41.251432 ], [ 146.606795, -41.259365 ], [ 146.595039, -41.250654 ], [ 146.599562, -41.233032 ], [ 146.608866, -41.233748 ], [ 146.599365, -41.225783 ], [ 146.600374, -41.215640 ], [ 146.609228, -41.212040 ], [ 146.587867, -41.214271 ], [ 146.595480, -41.209322 ], [ 146.578055, -41.197681 ], [ 146.583255, -41.190846 ], [ 146.578354, -41.184684 ], [ 146.584768, -41.167896 ], [ 146.607877, -41.168591 ], [ 146.595022, -41.164375 ], [ 146.609586, -41.158450 ], [ 146.601657, -41.151886 ], [ 146.566707, -41.163766 ], [ 146.564451, -41.146471 ], [ 146.594907, -41.144835 ], [ 146.633371, -41.125721 ], [ 146.648005, -41.110049 ], [ 146.642073, -41.097728 ], [ 146.647095, -41.093819 ], [ 146.679081, -41.100766 ], [ 146.713516, -41.075036 ], [ 146.707594, -41.063722 ], [ 146.744522, -41.084775 ], [ 146.768439, -41.078863 ], [ 146.798656, -41.106840 ], [ 146.788144, -41.112045 ], [ 146.813642, -41.112687 ], [ 146.806548, -41.112835 ], [ 146.810304, -41.130746 ], [ 146.820089, -41.137656 ], [ 146.800853, -41.134292 ], [ 146.778275, -41.151478 ], [ 146.763244, -41.149663 ], [ 146.770639, -41.165274 ], [ 146.790177, -41.146078 ], [ 146.806961, -41.140575 ], [ 146.817942, -41.145442 ], [ 146.825045, -41.152269 ], [ 146.821114, -41.170147 ], [ 146.837927, -41.176520 ], [ 146.829891, -41.186615 ], [ 146.839009, -41.200033 ], [ 146.844989, -41.186343 ], [ 146.857579, -41.193030 ], [ 146.834072, -41.163131 ], [ 146.860116, -41.172137 ], [ 146.877814, -41.149989 ], [ 146.923150, -41.169772 ], [ 146.928784, -41.178903 ], [ 146.908609, -41.188807 ], [ 146.916475, -41.190252 ], [ 146.915606, -41.197787 ], [ 146.907239, -41.206215 ], [ 146.897505, -41.202552 ], [ 146.933817, -41.231375 ], [ 146.945779, -41.260201 ], [ 146.974730, -41.251689 ], [ 146.967584, -41.263312 ], [ 146.978294, -41.273239 ], [ 146.977252, -41.288199 ], [ 146.962052, -41.294391 ], [ 146.970107, -41.297668 ], [ 146.970630, -41.309220 ], [ 146.987032, -41.321197 ], [ 147.004923, -41.321225 ], [ 147.033772, -41.355800 ], [ 147.036248, -41.347026 ], [ 147.058436, -41.335689 ], [ 147.076859, -41.340994 ], [ 147.068964, -41.354366 ], [ 147.073927, -41.383968 ], [ 147.082486, -41.395963 ], [ 147.111975, -41.401055 ], [ 147.115750, -41.413719 ], [ 147.123053, -41.409566 ], [ 147.112220, -41.421941 ], [ 147.127813, -41.437589 ], [ 147.121852, -41.443637 ], [ 147.143215, -41.429298 ], [ 147.145933, -41.417212 ], [ 147.156018, -41.417372 ], [ 147.154668, -41.416017 ], [ 147.144418, -41.417371 ], [ 147.142100, -41.429361 ], [ 147.127020, -41.432141 ], [ 147.118043, -41.420156 ], [ 147.127757, -41.410785 ], [ 147.079002, -41.365619 ], [ 147.075280, -41.354539 ], [ 147.088938, -41.353673 ], [ 147.075168, -41.354129 ], [ 147.082595, -41.344650 ], [ 147.073644, -41.330184 ], [ 147.046204, -41.336631 ], [ 147.040017, -41.318655 ], [ 146.978166, -41.308780 ], [ 146.978762, -41.298750 ], [ 147.013751, -41.283580 ], [ 147.015391, -41.276387 ], [ 146.976761, -41.243418 ], [ 146.976587, -41.233247 ], [ 146.969149, -41.239463 ], [ 146.945667, -41.228867 ], [ 146.944659, -41.206560 ], [ 146.921478, -41.220309 ], [ 146.911996, -41.211971 ], [ 146.932453, -41.199955 ], [ 146.922110, -41.194557 ], [ 146.937295, -41.181782 ], [ 146.965420, -41.190060 ], [ 146.900329, -41.136987 ], [ 146.877290, -41.130625 ], [ 146.850922, -41.139972 ], [ 146.827795, -41.136306 ], [ 146.833886, -41.125238 ], [ 146.827320, -41.131375 ], [ 146.817572, -41.121689 ], [ 146.832008, -41.103020 ], [ 146.816849, -41.109696 ], [ 146.803965, -41.069733 ], [ 146.786601, -41.054124 ], [ 146.812350, -41.061188 ], [ 146.833608, -41.039533 ], [ 146.874802, -41.018839 ], [ 146.893736, -41.029678 ], [ 146.959263, -41.027492 ], [ 146.947676, -41.025577 ], [ 146.996952, -40.984845 ], [ 147.020898, -40.980265 ], [ 147.031969, -40.990365 ], [ 147.058662, -40.988018 ], [ 147.072775, -40.999683 ], [ 147.116036, -40.994577 ], [ 147.158998, -41.013690 ], [ 147.134424, -41.034902 ], [ 147.154308, -41.022045 ], [ 147.157889, -41.031400 ], [ 147.161713, -41.007969 ], [ 147.176454, -41.009312 ], [ 147.194406, -40.999118 ], [ 147.199892, -40.999626 ], [ 147.224750, -40.989143 ], [ 147.249447, -40.953479 ], [ 147.279843, -40.941692 ], [ 147.284804, -40.951930 ], [ 147.302561, -40.957694 ], [ 147.345618, -40.939475 ], [ 147.360544, -40.975327 ], [ 147.355430, -40.982280 ], [ 147.367462, -40.976086 ], [ 147.384266, -40.980446 ], [ 147.401375, -41.011332 ], [ 147.434541, -41.011899 ], [ 147.397054, -41.002901 ], [ 147.441482, -41.002915 ], [ 147.490728, -40.979349 ], [ 147.525579, -40.950690 ], [ 147.568087, -40.898606 ], [ 147.582835, -40.893163 ], [ 147.575525, -40.890794 ], [ 147.590706, -40.871601 ], [ 147.583618, -40.863407 ], [ 147.598926, -40.856219 ], [ 147.594815, -40.849136 ], [ 147.626820, -40.845020 ], [ 147.669685, -40.821027 ], [ 147.706460, -40.860312 ], [ 147.757456, -40.857606 ], [ 147.751958, -40.875958 ], [ 147.756472, -40.865117 ], [ 147.780002, -40.879821 ], [ 147.822023, -40.886929 ], [ 147.882618, -40.868134 ], [ 147.873879, -40.882913 ], [ 147.904155, -40.877669 ], [ 147.912854, -40.869078 ], [ 147.885044, -40.877794 ], [ 147.887073, -40.863556 ], [ 147.932900, -40.815249 ], [ 147.947832, -40.791051 ], [ 147.943548, -40.775918 ], [ 147.952995, -40.776350 ], [ 147.958845, -40.764770 ], [ 147.958797, -40.754978 ], [ 147.942752, -40.752717 ], [ 147.938760, -40.739958 ], [ 147.958594, -40.746525 ], [ 147.974703, -40.737601 ], [ 148.006658, -40.743739 ], [ 148.019026, -40.753568 ], [ 148.032537, -40.750995 ], [ 148.038015, -40.761407 ], [ 148.032761, -40.764985 ], [ 148.043411, -40.774421 ], [ 148.048767, -40.774525 ], [ 148.037523, -40.762116 ], [ 148.057849, -40.771625 ], [ 148.079273, -40.769059 ], [ 148.140873, -40.830521 ], [ 148.175264, -40.829650 ], [ 148.148166, -40.834712 ], [ 148.121389, -40.825800 ], [ 148.115275, -40.813961 ], [ 148.117239, -40.820586 ], [ 148.108118, -40.820586 ], [ 148.111816, -40.828161 ], [ 148.126180, -40.836042 ], [ 148.130598, -40.828903 ], [ 148.158045, -40.840496 ], [ 148.173803, -40.838722 ], [ 148.178370, -40.820913 ], [ 148.197595, -40.839431 ], [ 148.222758, -40.846040 ], [ 148.219803, -40.862333 ], [ 148.226812, -40.876383 ], [ 148.261912, -40.892453 ], [ 148.257882, -40.904223 ], [ 148.267382, -40.900505 ], [ 148.274334, -40.920672 ], [ 148.301975, -40.941664 ], [ 148.302958, -40.957324 ], [ 148.298476, -40.954737 ], [ 148.323833, -40.987847 ], [ 148.349459, -40.992895 ], [ 148.330583, -41.000004 ], [ 148.301579, -41.029206 ], [ 148.296827, -41.061945 ], [ 148.286325, -41.048437 ], [ 148.293865, -41.028949 ], [ 148.249497, -41.051097 ], [ 148.282190, -41.052229 ], [ 148.298152, -41.063829 ], [ 148.269515, -41.126026 ], [ 148.268043, -41.151794 ], [ 148.275981, -41.151410 ], [ 148.284900, -41.168601 ], [ 148.252870, -41.190939 ], [ 148.271941, -41.180612 ], [ 148.275504, -41.206764 ], [ 148.285286, -41.209251 ], [ 148.279291, -41.230436 ], [ 148.293500, -41.235988 ], [ 148.303167, -41.250461 ], [ 148.312111, -41.246739 ], [ 148.317434, -41.254969 ], [ 148.329319, -41.248609 ], [ 148.338352, -41.259955 ], [ 148.330490, -41.275557 ], [ 148.309885, -41.288513 ], [ 148.307776, -41.302225 ], [ 148.290613, -41.304037 ], [ 148.295442, -41.282706 ], [ 148.281601, -41.276556 ], [ 148.271225, -41.307471 ], [ 148.276134, -41.312281 ], [ 148.268627, -41.314087 ], [ 148.276992, -41.315201 ], [ 148.270611, -41.320652 ], [ 148.263206, -41.315376 ], [ 148.268695, -41.321956 ], [ 148.258976, -41.325101 ], [ 148.255553, -41.321714 ], [ 148.247498, -41.327717 ], [ 148.235763, -41.322759 ], [ 148.271580, -41.339573 ], [ 148.309474, -41.316973 ], [ 148.332008, -41.276489 ], [ 148.339386, -41.282044 ], [ 148.356003, -41.273877 ], [ 148.359084, -41.279556 ], [ 148.327304, -41.306454 ], [ 148.301340, -41.366183 ], [ 148.295770, -41.370327 ], [ 148.288801, -41.363257 ], [ 148.293740, -41.369317 ], [ 148.279124, -41.371733 ], [ 148.279404, -41.378774 ], [ 148.289102, -41.380463 ], [ 148.295704, -41.371693 ], [ 148.267230, -41.461698 ], [ 148.266176, -41.451924 ], [ 148.262956, -41.460234 ], [ 148.260123, -41.460119 ], [ 148.266477, -41.462171 ], [ 148.271000, -41.502425 ], [ 148.263539, -41.476971 ], [ 148.262266, -41.489300 ], [ 148.253898, -41.477769 ], [ 148.249273, -41.486025 ], [ 148.262503, -41.491472 ], [ 148.267130, -41.506367 ], [ 148.275621, -41.503499 ], [ 148.288018, -41.558195 ], [ 148.299263, -41.558037 ], [ 148.316653, -41.575378 ], [ 148.320296, -41.621392 ], [ 148.293183, -41.658961 ], [ 148.289053, -41.684514 ], [ 148.295230, -41.693173 ], [ 148.284073, -41.719999 ], [ 148.304770, -41.748176 ], [ 148.284295, -41.757798 ], [ 148.264411, -41.807216 ], [ 148.272561, -41.848887 ], [ 148.287446, -41.865809 ], [ 148.310938, -41.873282 ], [ 148.304019, -41.891300 ], [ 148.319268, -41.903099 ], [ 148.323590, -41.917201 ], [ 148.302524, -41.936900 ], [ 148.309800, -41.961411 ], [ 148.297936, -41.965853 ], [ 148.289377, -41.982665 ], [ 148.284634, -42.038985 ], [ 148.297974, -42.057080 ], [ 148.309610, -42.057028 ], [ 148.325642, -42.096220 ], [ 148.333105, -42.105520 ], [ 148.340522, -42.102683 ], [ 148.345388, -42.118468 ], [ 148.334397, -42.127459 ], [ 148.338090, -42.133001 ], [ 148.319607, -42.132453 ], [ 148.324203, -42.149314 ], [ 148.297735, -42.166374 ], [ 148.306679, -42.175619 ], [ 148.315592, -42.169199 ], [ 148.345442, -42.183595 ], [ 148.357126, -42.180358 ], [ 148.342897, -42.211152 ], [ 148.346237, -42.223782 ], [ 148.327871, -42.229921 ], [ 148.320421, -42.264362 ], [ 148.308013, -42.266702 ], [ 148.314562, -42.275988 ], [ 148.293006, -42.281850 ], [ 148.288021, -42.259614 ], [ 148.261350, -42.254341 ], [ 148.251453, -42.242275 ], [ 148.251433, -42.230326 ], [ 148.269671, -42.227026 ], [ 148.291896, -42.191683 ], [ 148.277914, -42.173142 ], [ 148.259352, -42.165458 ], [ 148.272561, -42.148554 ], [ 148.297604, -42.140164 ], [ 148.298424, -42.125640 ], [ 148.283392, -42.128068 ], [ 148.268426, -42.109987 ], [ 148.247575, -42.116841 ], [ 148.236793, -42.101073 ], [ 148.241674, -42.091033 ], [ 148.208443, -42.077391 ], [ 148.213229, -42.071434 ], [ 148.224647, -42.076886 ], [ 148.221071, -42.068837 ], [ 148.197645, -42.067186 ], [ 148.186970, -42.077836 ], [ 148.157191, -42.074206 ], [ 148.159399, -42.060094 ], [ 148.174600, -42.054347 ], [ 148.172684, -42.043377 ], [ 148.214310, -42.035654 ], [ 148.242997, -42.002619 ], [ 148.243310, -41.988302 ], [ 148.214088, -41.985999 ], [ 148.217545, -42.002982 ], [ 148.197438, -42.020801 ], [ 148.173422, -42.008975 ], [ 148.170989, -41.997075 ], [ 148.163207, -41.997963 ], [ 148.144293, -42.017103 ], [ 148.146047, -42.041537 ], [ 148.133264, -42.043949 ], [ 148.142924, -42.051580 ], [ 148.150709, -42.044665 ], [ 148.146761, -42.034651 ], [ 148.154976, -42.035182 ], [ 148.162850, -42.039652 ], [ 148.157816, -42.049836 ], [ 148.165017, -42.051771 ], [ 148.152399, -42.062255 ], [ 148.129500, -42.061124 ], [ 148.114646, -42.073634 ], [ 148.126791, -42.074003 ], [ 148.093656, -42.081067 ], [ 148.093054, -42.080769 ], [ 148.095293, -42.082548 ], [ 148.150762, -42.074493 ], [ 148.167508, -42.084963 ], [ 148.211365, -42.084914 ], [ 148.235198, -42.097901 ], [ 148.123932, -42.092425 ], [ 148.046666, -42.118418 ], [ 148.070034, -42.112076 ], [ 148.085092, -42.125511 ], [ 148.071290, -42.154190 ], [ 148.083882, -42.167915 ], [ 148.013583, -42.239350 ], [ 148.013167, -42.249462 ], [ 148.028151, -42.260610 ], [ 148.014807, -42.268237 ], [ 148.015615, -42.285468 ], [ 148.000346, -42.309933 ], [ 147.977559, -42.307399 ], [ 147.970437, -42.332961 ], [ 147.953660, -42.332503 ], [ 147.958992, -42.334999 ], [ 147.944744, -42.336101 ], [ 147.949717, -42.337844 ], [ 147.944064, -42.342377 ], [ 147.938966, -42.332802 ], [ 147.943687, -42.343173 ], [ 147.935790, -42.336659 ], [ 147.931130, -42.343481 ], [ 147.943869, -42.349591 ], [ 147.954982, -42.343902 ], [ 147.962057, -42.357330 ], [ 147.960252, -42.341271 ], [ 147.985851, -42.337244 ], [ 147.975780, -42.334204 ], [ 147.977951, -42.325680 ], [ 147.988072, -42.324824 ], [ 147.996058, -42.311551 ], [ 148.018485, -42.315007 ], [ 148.015516, -42.327770 ], [ 148.026889, -42.349507 ], [ 148.007557, -42.364513 ], [ 148.008659, -42.373624 ], [ 147.987756, -42.389042 ], [ 147.980497, -42.405386 ], [ 147.998904, -42.433180 ], [ 147.976956, -42.441039 ], [ 148.010295, -42.441393 ], [ 148.010253, -42.462346 ], [ 148.000487, -42.467763 ], [ 147.988523, -42.498345 ], [ 147.994435, -42.489971 ], [ 147.997042, -42.501569 ], [ 148.010483, -42.510352 ], [ 147.995850, -42.517787 ], [ 147.994823, -42.526537 ], [ 147.983241, -42.515998 ], [ 147.968728, -42.520332 ], [ 147.948970, -42.553230 ], [ 147.932352, -42.550122 ], [ 147.925191, -42.538160 ], [ 147.930358, -42.530803 ], [ 147.914208, -42.516288 ], [ 147.923733, -42.496786 ], [ 147.913896, -42.510941 ], [ 147.905278, -42.506046 ], [ 147.909414, -42.514562 ], [ 147.897307, -42.524029 ], [ 147.913282, -42.530651 ], [ 147.913370, -42.548512 ], [ 147.888446, -42.545260 ], [ 147.875079, -42.554772 ], [ 147.878981, -42.554155 ], [ 147.881807, -42.566941 ], [ 147.902503, -42.565956 ], [ 147.917260, -42.590013 ], [ 147.945502, -42.606319 ], [ 147.931612, -42.631559 ], [ 147.957712, -42.652588 ], [ 147.929750, -42.644901 ], [ 147.939925, -42.654511 ], [ 147.957056, -42.653182 ], [ 147.953484, -42.661070 ], [ 147.962992, -42.669542 ], [ 147.962163, -42.679592 ], [ 147.938763, -42.700692 ], [ 147.936205, -42.711749 ], [ 147.947273, -42.709103 ], [ 147.941925, -42.713710 ], [ 147.946552, -42.728010 ], [ 147.900001, -42.743854 ], [ 147.879125, -42.769865 ], [ 147.869535, -42.818752 ], [ 147.884098, -42.845520 ], [ 147.870476, -42.836870 ], [ 147.864558, -42.814657 ], [ 147.855542, -42.849130 ], [ 147.844038, -42.845775 ], [ 147.843156, -42.859893 ], [ 147.835115, -42.860940 ], [ 147.844716, -42.874234 ], [ 147.832438, -42.865739 ], [ 147.827178, -42.880452 ], [ 147.791443, -42.892620 ], [ 147.790526, -42.903081 ], [ 147.772468, -42.898760 ], [ 147.766796, -42.906849 ], [ 147.742442, -42.895011 ], [ 147.728321, -42.898855 ], [ 147.721994, -42.886558 ], [ 147.669116, -42.901907 ], [ 147.668377, -42.891581 ], [ 147.655799, -42.886089 ], [ 147.647453, -42.892773 ], [ 147.640092, -42.879568 ], [ 147.656291, -42.881943 ], [ 147.684198, -42.864377 ], [ 147.700950, -42.871601 ], [ 147.684131, -42.862707 ], [ 147.653331, -42.878770 ], [ 147.605973, -42.869225 ], [ 147.607277, -42.855797 ], [ 147.621625, -42.844509 ], [ 147.596730, -42.813354 ], [ 147.603343, -42.798117 ], [ 147.594183, -42.781572 ], [ 147.585385, -42.778262 ], [ 147.595193, -42.784521 ], [ 147.592203, -42.801039 ], [ 147.565140, -42.794264 ], [ 147.565486, -42.788376 ], [ 147.559597, -42.797335 ], [ 147.550349, -42.785344 ], [ 147.537323, -42.783209 ], [ 147.539103, -42.771505 ], [ 147.529172, -42.783821 ], [ 147.539722, -42.801170 ], [ 147.535210, -42.805304 ], [ 147.527690, -42.805102 ], [ 147.520850, -42.785432 ], [ 147.513046, -42.782890 ], [ 147.487252, -42.803107 ], [ 147.452924, -42.781526 ], [ 147.468533, -42.771074 ], [ 147.454175, -42.768118 ], [ 147.459073, -42.776787 ], [ 147.448442, -42.775934 ], [ 147.445127, -42.783309 ], [ 147.434631, -42.774071 ], [ 147.437091, -42.785770 ], [ 147.459999, -42.809509 ], [ 147.485406, -42.807940 ], [ 147.489816, -42.815033 ], [ 147.477549, -42.812896 ], [ 147.471699, -42.820715 ], [ 147.481114, -42.826743 ], [ 147.491197, -42.827953 ], [ 147.513154, -42.811323 ], [ 147.522242, -42.827978 ], [ 147.578578, -42.825114 ], [ 147.613374, -42.845948 ], [ 147.564561, -42.837869 ], [ 147.529161, -42.847302 ], [ 147.503627, -42.864290 ], [ 147.511077, -42.876070 ], [ 147.494968, -42.911283 ], [ 147.530507, -42.931312 ], [ 147.538225, -42.959998 ], [ 147.541801, -42.959318 ], [ 147.554079, -42.985644 ], [ 147.523747, -42.992724 ], [ 147.528800, -43.006036 ], [ 147.520732, -43.021104 ], [ 147.441208, -43.036948 ], [ 147.418833, -43.050494 ], [ 147.408385, -43.046474 ], [ 147.404190, -43.036572 ], [ 147.415475, -43.020382 ], [ 147.397036, -43.006683 ], [ 147.404070, -42.984539 ], [ 147.391983, -42.975700 ], [ 147.408787, -42.962914 ], [ 147.403757, -42.977578 ], [ 147.417869, -42.984372 ], [ 147.417537, -43.002823 ], [ 147.430092, -43.027571 ], [ 147.452226, -43.032634 ], [ 147.468801, -43.026716 ], [ 147.474064, -43.018685 ], [ 147.468829, -42.999289 ], [ 147.478482, -42.982108 ], [ 147.465332, -42.970171 ], [ 147.445379, -42.978391 ], [ 147.446060, -42.964527 ], [ 147.464751, -42.923450 ], [ 147.476991, -42.918590 ], [ 147.491424, -42.927146 ], [ 147.485493, -42.912981 ], [ 147.479007, -42.906310 ], [ 147.435127, -42.908656 ], [ 147.421401, -42.939748 ], [ 147.408930, -42.938809 ], [ 147.409231, -42.918964 ], [ 147.417327, -42.908852 ], [ 147.404688, -42.884267 ], [ 147.366546, -42.882554 ], [ 147.365664, -42.870159 ], [ 147.352402, -42.875777 ], [ 147.350539, -42.860591 ], [ 147.358626, -42.848680 ], [ 147.350217, -42.853124 ], [ 147.337784, -42.845709 ], [ 147.347047, -42.835200 ], [ 147.333777, -42.841081 ], [ 147.335053, -42.833706 ], [ 147.317373, -42.824903 ], [ 147.319935, -42.816675 ], [ 147.281622, -42.801062 ], [ 147.292742, -42.789744 ], [ 147.284152, -42.777749 ], [ 147.264677, -42.778498 ], [ 147.260522, -42.765294 ], [ 147.266683, -42.755655 ], [ 147.256084, -42.748636 ], [ 147.265584, -42.738953 ], [ 147.262597, -42.730198 ], [ 147.264674, -42.738990 ], [ 147.252229, -42.751215 ], [ 147.256732, -42.757012 ], [ 147.198991, -42.725319 ], [ 147.183970, -42.732291 ], [ 147.179101, -42.739844 ], [ 147.185980, -42.740918 ], [ 147.149948, -42.751834 ], [ 147.139875, -42.767072 ], [ 147.114552, -42.773108 ], [ 147.138788, -42.770094 ], [ 147.154535, -42.752804 ], [ 147.198323, -42.740440 ], [ 147.232614, -42.751868 ], [ 147.253504, -42.765787 ], [ 147.252635, -42.786616 ], [ 147.283207, -42.789994 ], [ 147.258954, -42.791834 ], [ 147.265856, -42.796527 ], [ 147.253629, -42.806203 ], [ 147.262415, -42.811660 ], [ 147.255703, -42.814863 ], [ 147.277379, -42.825828 ], [ 147.298018, -42.818736 ], [ 147.306722, -42.823546 ], [ 147.295007, -42.829230 ], [ 147.301890, -42.833834 ], [ 147.305266, -42.826403 ], [ 147.322112, -42.832089 ], [ 147.313057, -42.849206 ], [ 147.327849, -42.844610 ], [ 147.319663, -42.855131 ], [ 147.336789, -42.864589 ], [ 147.341196, -42.877063 ], [ 147.331528, -42.884938 ], [ 147.339448, -42.886795 ], [ 147.332239, -42.900220 ], [ 147.360963, -42.914127 ], [ 147.355850, -42.951108 ], [ 147.344532, -42.954768 ], [ 147.338563, -42.974427 ], [ 147.328311, -42.977505 ], [ 147.329554, -42.977814 ], [ 147.324150, -43.006165 ], [ 147.344282, -43.051679 ], [ 147.314057, -43.059471 ], [ 147.284934, -43.008305 ], [ 147.270527, -43.024591 ], [ 147.265438, -43.021382 ], [ 147.269284, -43.024685 ], [ 147.279920, -43.026748 ], [ 147.255547, -43.073251 ], [ 147.279037, -43.074919 ], [ 147.301233, -43.087908 ], [ 147.285290, -43.110991 ], [ 147.257671, -43.106513 ], [ 147.271491, -43.114800 ], [ 147.269388, -43.121944 ], [ 147.246385, -43.122312 ], [ 147.262770, -43.130832 ], [ 147.252761, -43.132332 ], [ 147.256247, -43.138576 ], [ 147.241628, -43.148676 ], [ 147.247989, -43.151727 ], [ 147.238584, -43.154448 ], [ 147.248407, -43.166291 ], [ 147.240921, -43.181955 ], [ 147.255438, -43.188368 ], [ 147.260974, -43.223517 ], [ 147.240448, -43.256604 ], [ 147.242512, -43.268099 ], [ 147.219485, -43.281036 ], [ 147.188996, -43.276249 ], [ 147.167749, -43.283386 ], [ 147.142145, -43.271216 ], [ 147.142102, -43.253558 ], [ 147.151165, -43.241125 ], [ 147.143969, -43.249994 ], [ 147.124126, -43.242804 ], [ 147.097077, -43.250251 ], [ 147.100029, -43.245309 ], [ 147.088927, -43.243168 ], [ 147.099297, -43.237920 ], [ 147.091474, -43.219886 ], [ 147.117825, -43.210600 ], [ 147.101984, -43.206790 ], [ 147.105621, -43.198464 ], [ 147.094445, -43.188042 ], [ 147.109018, -43.185291 ], [ 147.093042, -43.181487 ], [ 147.096410, -43.171690 ], [ 147.082510, -43.162950 ], [ 147.086478, -43.192828 ], [ 147.071807, -43.202332 ], [ 147.083322, -43.206701 ], [ 147.063161, -43.217345 ], [ 147.061925, -43.225100 ], [ 147.027771, -43.209647 ], [ 147.010348, -43.190295 ], [ 146.984409, -43.189432 ], [ 146.983458, -43.177597 ], [ 146.994548, -43.173192 ], [ 146.997206, -43.146956 ], [ 147.018802, -43.112250 ], [ 147.021804, -43.091959 ], [ 147.040930, -43.069763 ], [ 147.044775, -43.047391 ], [ 147.029687, -43.058653 ], [ 146.991347, -43.118735 ], [ 146.993008, -43.128655 ], [ 146.972450, -43.138584 ], [ 146.980690, -43.158917 ], [ 146.959536, -43.156129 ], [ 146.949969, -43.163840 ], [ 146.962154, -43.157924 ], [ 146.974454, -43.169317 ], [ 146.964153, -43.190302 ], [ 146.971896, -43.204000 ], [ 146.995390, -43.206465 ], [ 146.990318, -43.217152 ], [ 147.001700, -43.214512 ], [ 147.037075, -43.243826 ], [ 147.064544, -43.249102 ], [ 147.068004, -43.263638 ], [ 147.097614, -43.280188 ], [ 147.100133, -43.290217 ], [ 147.080573, -43.292427 ], [ 147.065330, -43.332813 ], [ 147.045042, -43.312302 ], [ 147.011916, -43.315833 ], [ 147.002616, -43.322737 ], [ 147.004160, -43.335497 ], [ 146.982438, -43.330102 ], [ 146.978811, -43.339465 ], [ 146.985438, -43.333194 ], [ 147.007713, -43.343484 ], [ 147.019319, -43.333896 ], [ 147.032711, -43.347950 ], [ 147.059306, -43.353063 ], [ 147.046012, -43.380001 ], [ 147.016661, -43.403277 ], [ 147.025445, -43.411434 ], [ 147.012442, -43.422070 ], [ 147.026432, -43.435817 ], [ 147.017624, -43.443455 ], [ 147.003066, -43.433992 ], [ 146.986909, -43.440799 ], [ 146.973022, -43.431905 ], [ 146.950553, -43.447380 ], [ 146.947603, -43.434340 ], [ 146.923638, -43.415583 ], [ 146.923631, -43.439837 ], [ 146.920564, -43.438301 ], [ 146.915635, -43.447067 ], [ 146.941796, -43.439960 ], [ 146.946158, -43.446016 ], [ 146.937105, -43.447455 ], [ 146.948668, -43.453098 ], [ 146.959684, -43.447703 ], [ 146.983224, -43.454706 ], [ 146.996446, -43.461872 ], [ 147.001794, -43.479652 ], [ 146.980777, -43.487256 ], [ 146.982585, -43.475028 ], [ 146.972545, -43.468638 ], [ 146.942028, -43.478121 ], [ 146.928992, -43.496670 ], [ 146.943785, -43.498142 ], [ 146.943704, -43.512025 ], [ 146.976749, -43.487591 ], [ 146.977883, -43.494017 ], [ 146.954158, -43.511810 ], [ 146.952825, -43.532988 ], [ 146.921402, -43.539295 ], [ 146.924100, -43.530301 ], [ 146.917257, -43.546296 ], [ 146.903669, -43.538941 ], [ 146.911372, -43.531859 ], [ 146.903086, -43.516884 ], [ 146.910848, -43.514149 ], [ 146.900596, -43.516220 ], [ 146.889195, -43.553185 ], [ 146.877370, -43.558031 ], [ 146.891543, -43.553458 ], [ 146.903731, -43.562043 ], [ 146.887025, -43.566028 ], [ 146.891940, -43.580554 ], [ 146.916790, -43.568788 ], [ 146.923853, -43.580994 ], [ 146.920965, -43.600042 ], [ 146.873612, -43.623367 ], [ 146.870924, -43.638637 ], [ 146.844807, -43.633052 ], [ 146.826624, -43.643092 ], [ 146.838710, -43.630761 ], [ 146.831278, -43.615117 ], [ 146.785144, -43.600290 ], [ 146.780704, -43.609456 ], [ 146.762359, -43.615342 ], [ 146.746118, -43.609990 ], [ 146.723444, -43.631932 ], [ 146.711246, -43.626075 ], [ 146.705475, -43.633411 ], [ 146.686091, -43.596701 ], [ 146.670225, -43.594409 ], [ 146.660118, -43.607720 ], [ 146.652777, -43.596177 ], [ 146.658246, -43.578529 ], [ 146.640129, -43.587436 ], [ 146.644963, -43.580366 ], [ 146.623660, -43.562383 ], [ 146.608514, -43.569083 ], [ 146.610038, -43.559801 ], [ 146.599361, -43.561932 ], [ 146.607548, -43.550207 ], [ 146.575188, -43.524626 ], [ 146.578282, -43.485135 ], [ 146.559389, -43.464884 ], [ 146.548678, -43.475434 ], [ 146.548896, -43.492071 ], [ 146.556142, -43.496624 ], [ 146.551411, -43.510393 ], [ 146.596074, -43.543486 ], [ 146.542175, -43.523268 ], [ 146.531671, -43.531364 ], [ 146.508740, -43.524066 ], [ 146.486456, -43.543857 ], [ 146.474034, -43.534580 ], [ 146.469323, -43.542581 ], [ 146.452673, -43.534433 ], [ 146.405565, -43.539816 ], [ 146.391538, -43.530271 ], [ 146.372640, -43.535039 ], [ 146.369404, -43.518967 ], [ 146.368715, -43.530489 ], [ 146.367572, -43.520236 ], [ 146.344725, -43.512831 ], [ 146.325709, -43.520608 ], [ 146.317811, -43.536247 ], [ 146.290137, -43.544660 ], [ 146.276438, -43.528807 ], [ 146.266651, -43.528637 ], [ 146.272905, -43.498450 ], [ 146.216007, -43.485565 ], [ 146.209073, -43.490101 ], [ 146.224483, -43.491138 ], [ 146.209782, -43.506969 ], [ 146.209618, -43.534836 ], [ 146.193091, -43.539985 ], [ 146.177565, -43.511374 ], [ 146.161542, -43.516419 ], [ 146.159132, -43.499961 ], [ 146.148004, -43.501487 ], [ 146.142256, -43.504229 ], [ 146.147154, -43.528280 ], [ 146.136493, -43.518296 ], [ 146.129045, -43.525878 ], [ 146.110436, -43.523627 ], [ 146.109879, -43.557075 ], [ 146.094856, -43.556623 ], [ 146.090730, -43.542489 ], [ 146.079451, -43.540973 ], [ 146.069952, -43.556499 ], [ 146.046171, -43.552375 ], [ 146.031119, -43.570953 ], [ 146.042820, -43.508548 ], [ 146.027455, -43.488205 ], [ 146.029154, -43.464307 ], [ 146.005742, -43.463896 ], [ 146.018031, -43.455094 ], [ 146.000932, -43.437706 ], [ 145.997379, -43.406945 ], [ 145.971237, -43.403446 ], [ 145.976372, -43.395226 ], [ 145.964525, -43.382612 ], [ 145.948061, -43.381290 ], [ 145.934257, -43.390884 ], [ 145.921467, -43.381296 ], [ 145.930329, -43.379369 ], [ 145.932098, -43.369962 ], [ 145.946340, -43.371779 ], [ 145.953241, -43.359387 ], [ 145.970756, -43.369699 ], [ 145.975790, -43.363094 ], [ 145.968754, -43.359850 ], [ 145.977466, -43.355573 ], [ 145.993483, -43.373943 ], [ 145.983727, -43.388246 ], [ 145.993652, -43.394252 ], [ 146.001901, -43.365475 ], [ 145.993134, -43.365324 ], [ 145.989245, -43.347892 ], [ 145.975078, -43.349155 ], [ 145.986817, -43.329322 ], [ 146.006720, -43.339682 ], [ 146.003097, -43.344958 ], [ 146.068006, -43.353142 ], [ 146.077830, -43.358501 ], [ 146.071152, -43.366087 ], [ 146.083506, -43.371526 ], [ 146.091597, -43.364480 ], [ 146.058308, -43.344498 ], [ 146.089613, -43.350323 ], [ 146.086187, -43.342035 ], [ 146.095070, -43.351757 ], [ 146.101272, -43.345942 ], [ 146.130541, -43.355464 ], [ 146.137172, -43.373080 ], [ 146.126699, -43.373707 ], [ 146.140057, -43.406634 ], [ 146.144480, -43.408668 ], [ 146.143864, -43.408139 ], [ 146.134626, -43.376545 ], [ 146.147363, -43.377846 ], [ 146.156942, -43.392091 ], [ 146.164367, -43.381980 ], [ 146.176766, -43.382146 ], [ 146.155376, -43.362813 ], [ 146.210264, -43.363576 ], [ 146.209070, -43.375634 ], [ 146.223327, -43.389074 ], [ 146.225431, -43.375946 ], [ 146.212893, -43.364055 ], [ 146.226678, -43.361102 ], [ 146.222831, -43.332528 ], [ 146.231605, -43.322462 ], [ 146.217837, -43.326101 ], [ 146.219224, -43.321101 ], [ 146.208616, -43.330501 ], [ 146.189056, -43.315211 ], [ 146.176365, -43.326664 ], [ 146.176098, -43.298348 ], [ 146.168445, -43.291051 ], [ 146.153352, -43.298753 ], [ 146.157620, -43.311349 ], [ 146.141136, -43.322429 ], [ 146.136408, -43.345624 ], [ 146.111866, -43.348394 ], [ 146.091112, -43.339321 ], [ 146.087437, -43.325456 ], [ 146.084282, -43.340223 ], [ 146.071827, -43.327454 ], [ 146.069806, -43.309550 ], [ 146.057121, -43.300805 ], [ 146.065661, -43.297668 ], [ 146.064467, -43.289388 ], [ 146.064396, -43.297422 ], [ 146.053259, -43.300716 ], [ 146.061233, -43.307124 ], [ 146.049175, -43.321093 ], [ 146.058972, -43.333562 ], [ 146.039043, -43.332707 ], [ 146.028734, -43.342392 ], [ 146.003770, -43.335344 ], [ 145.997197, -43.330642 ], [ 146.006010, -43.320746 ], [ 145.983475, -43.322635 ], [ 145.983105, -43.304793 ], [ 145.968445, -43.302955 ], [ 145.957873, -43.290461 ], [ 145.963553, -43.285668 ], [ 145.953416, -43.281066 ], [ 145.973150, -43.272992 ], [ 145.966548, -43.265709 ], [ 145.968161, -43.247580 ], [ 145.979953, -43.234805 ], [ 145.968897, -43.228063 ], [ 145.946408, -43.230004 ], [ 145.932470, -43.212550 ], [ 145.917305, -43.211356 ], [ 145.913922, -43.217833 ], [ 145.924841, -43.224941 ], [ 145.928463, -43.245190 ], [ 145.907490, -43.248351 ], [ 145.897146, -43.264139 ], [ 145.871797, -43.258673 ], [ 145.875670, -43.273186 ], [ 145.862489, -43.273027 ], [ 145.880696, -43.289684 ], [ 145.897572, -43.281734 ], [ 145.901083, -43.265460 ], [ 145.923948, -43.267433 ], [ 145.920125, -43.291979 ], [ 145.926633, -43.300487 ], [ 145.899177, -43.300300 ], [ 145.895180, -43.314535 ], [ 145.878681, -43.310800 ], [ 145.870537, -43.322614 ], [ 145.850545, -43.306778 ], [ 145.841230, -43.315266 ], [ 145.843549, -43.304268 ], [ 145.853364, -43.300159 ], [ 145.850504, -43.292605 ], [ 145.839212, -43.294696 ], [ 145.815667, -43.278516 ], [ 145.820562, -43.250098 ], [ 145.806481, -43.248873 ], [ 145.804119, -43.235503 ], [ 145.811115, -43.234820 ], [ 145.796684, -43.219055 ], [ 145.807892, -43.209456 ], [ 145.789868, -43.200831 ], [ 145.795265, -43.192405 ], [ 145.787729, -43.188264 ], [ 145.768731, -43.185621 ], [ 145.761563, -43.193252 ], [ 145.757941, -43.164892 ], [ 145.733547, -43.137475 ], [ 145.721643, -43.136352 ], [ 145.724969, -43.122477 ], [ 145.736226, -43.116731 ], [ 145.715424, -43.111763 ], [ 145.716158, -43.106017 ], [ 145.708473, -43.118483 ], [ 145.694264, -43.118494 ], [ 145.683356, -43.100387 ], [ 145.673376, -43.106727 ], [ 145.664951, -43.096247 ], [ 145.676833, -43.091171 ], [ 145.669752, -43.081184 ], [ 145.674848, -43.070464 ], [ 145.691198, -43.067500 ], [ 145.684530, -43.068549 ], [ 145.682228, -43.050468 ], [ 145.660026, -43.043816 ], [ 145.647633, -43.048506 ], [ 145.637775, -43.032387 ], [ 145.643957, -43.024771 ], [ 145.609928, -43.009179 ], [ 145.602935, -42.997170 ], [ 145.607522, -42.990680 ], [ 145.599921, -42.990497 ], [ 145.590637, -42.972519 ], [ 145.561365, -42.971100 ], [ 145.494879, -42.991523 ], [ 145.503499, -42.976446 ], [ 145.493596, -42.973962 ], [ 145.498664, -42.963180 ], [ 145.492197, -42.955964 ], [ 145.504398, -42.948712 ], [ 145.492952, -42.946921 ], [ 145.490462, -42.929234 ], [ 145.481562, -42.931079 ], [ 145.487621, -42.913388 ], [ 145.476049, -42.914216 ], [ 145.451969, -42.897817 ], [ 145.436027, -42.873448 ], [ 145.443736, -42.869094 ], [ 145.436868, -42.854475 ], [ 145.420851, -42.837089 ], [ 145.425995, -42.828930 ], [ 145.419727, -42.814809 ], [ 145.426322, -42.814915 ], [ 145.407195, -42.784572 ], [ 145.414582, -42.780799 ], [ 145.382637, -42.768704 ], [ 145.380590, -42.748167 ], [ 145.391332, -42.743028 ], [ 145.388789, -42.735584 ], [ 145.396699, -42.736405 ], [ 145.394176, -42.721288 ], [ 145.383267, -42.728225 ], [ 145.374018, -42.694586 ], [ 145.365816, -42.689161 ], [ 145.366210, -42.656512 ], [ 145.338303, -42.651025 ], [ 145.333637, -42.657772 ], [ 145.327771, -42.646095 ], [ 145.335780, -42.632571 ], [ 145.311810, -42.620658 ], [ 145.290029, -42.622514 ], [ 145.285383, -42.632372 ], [ 145.262948, -42.621623 ], [ 145.262981, -42.612750 ], [ 145.280830, -42.614927 ], [ 145.301714, -42.599051 ], [ 145.295363, -42.595223 ], [ 145.304261, -42.586043 ], [ 145.299221, -42.577243 ], [ 145.304412, -42.571212 ], [ 145.277783, -42.563253 ], [ 145.280694, -42.552910 ], [ 145.267469, -42.528593 ], [ 145.252826, -42.522088 ], [ 145.261198, -42.503988 ], [ 145.235847, -42.471242 ], [ 145.254044, -42.448059 ], [ 145.234628, -42.417479 ], [ 145.244960, -42.406157 ], [ 145.235868, -42.404423 ], [ 145.237556, -42.390086 ], [ 145.235520, -42.394714 ], [ 145.224319, -42.386391 ], [ 145.226423, -42.366887 ], [ 145.215295, -42.365895 ], [ 145.223181, -42.355295 ], [ 145.196129, -42.327835 ], [ 145.194008, -42.312137 ], [ 145.213811, -42.298368 ], [ 145.213726, -42.277729 ], [ 145.205880, -42.254422 ], [ 145.189167, -42.242615 ], [ 145.190110, -42.208012 ], [ 145.173943, -42.209927 ], [ 145.165516, -42.196975 ], [ 145.196371, -42.197058 ], [ 145.199959, -42.207932 ], [ 145.208754, -42.207399 ], [ 145.207299, -42.200093 ], [ 145.224859, -42.228420 ], [ 145.221007, -42.242017 ], [ 145.235782, -42.244082 ], [ 145.237054, -42.263355 ], [ 145.256062, -42.267325 ], [ 145.253472, -42.288472 ], [ 145.289586, -42.282895 ], [ 145.292655, -42.295823 ], [ 145.299572, -42.296653 ], [ 145.317507, -42.285349 ], [ 145.310036, -42.320457 ], [ 145.330972, -42.330395 ], [ 145.337962, -42.344410 ], [ 145.340304, -42.337055 ], [ 145.353490, -42.343875 ], [ 145.393513, -42.374271 ], [ 145.415589, -42.371743 ], [ 145.453279, -42.404432 ], [ 145.446640, -42.437442 ], [ 145.459181, -42.458265 ], [ 145.461906, -42.500602 ], [ 145.473909, -42.525843 ], [ 145.481796, -42.525698 ], [ 145.472315, -42.500994 ], [ 145.480201, -42.475379 ], [ 145.473209, -42.473547 ], [ 145.464043, -42.442595 ], [ 145.473877, -42.440561 ], [ 145.452654, -42.442002 ], [ 145.458028, -42.434789 ], [ 145.491948, -42.422257 ], [ 145.531057, -42.449533 ], [ 145.554740, -42.440410 ], [ 145.608150, -42.453045 ], [ 145.618204, -42.445481 ], [ 145.614933, -42.440769 ], [ 145.616414, -42.445469 ], [ 145.608294, -42.450703 ], [ 145.557118, -42.436072 ], [ 145.534238, -42.447447 ], [ 145.524527, -42.443517 ], [ 145.513056, -42.434502 ], [ 145.534827, -42.405480 ], [ 145.536235, -42.387129 ], [ 145.549886, -42.387960 ], [ 145.542560, -42.369195 ], [ 145.557614, -42.357028 ], [ 145.543745, -42.352124 ], [ 145.530178, -42.372616 ], [ 145.512366, -42.374196 ], [ 145.502588, -42.364012 ], [ 145.519607, -42.368087 ], [ 145.526736, -42.360539 ], [ 145.517507, -42.339768 ], [ 145.499460, -42.332343 ], [ 145.494117, -42.321867 ], [ 145.496399, -42.334343 ], [ 145.490711, -42.335429 ], [ 145.497868, -42.342384 ], [ 145.480540, -42.347241 ], [ 145.489854, -42.352491 ], [ 145.484933, -42.356658 ], [ 145.492642, -42.355928 ], [ 145.480852, -42.364480 ], [ 145.478337, -42.348707 ], [ 145.467560, -42.346129 ], [ 145.463377, -42.323460 ], [ 145.432466, -42.314304 ], [ 145.422990, -42.289975 ], [ 145.399698, -42.277471 ], [ 145.377435, -42.251744 ], [ 145.364827, -42.251677 ], [ 145.360909, -42.233798 ], [ 145.371811, -42.224361 ], [ 145.363995, -42.209866 ], [ 145.372257, -42.202138 ], [ 145.346049, -42.206790 ], [ 145.356292, -42.194100 ], [ 145.372907, -42.195406 ], [ 145.356296, -42.191240 ], [ 145.359658, -42.177352 ], [ 145.346900, -42.168585 ], [ 145.329134, -42.173299 ], [ 145.325976, -42.160731 ], [ 145.333926, -42.151760 ], [ 145.323060, -42.156568 ], [ 145.307823, -42.148906 ], [ 145.303570, -42.152810 ], [ 145.315747, -42.157760 ], [ 145.318164, -42.176185 ], [ 145.293762, -42.179167 ], [ 145.268149, -42.202388 ], [ 145.285037, -42.210097 ], [ 145.283538, -42.198016 ], [ 145.290158, -42.196647 ], [ 145.289682, -42.227293 ], [ 145.268076, -42.232105 ], [ 145.249216, -42.220926 ], [ 145.223136, -42.218705 ], [ 145.249852, -42.190408 ], [ 145.259570, -42.168154 ], [ 145.263729, -42.112306 ], [ 145.249201, -42.046231 ], [ 145.251857, -42.060057 ], [ 145.190559, -41.946133 ], [ 145.202413, -41.958922 ], [ 145.196877, -41.948587 ], [ 145.204115, -41.936815 ], [ 145.194810, -41.948900 ], [ 145.173969, -41.928457 ], [ 145.124435, -41.900499 ], [ 145.109202, -41.877107 ], [ 145.071460, -41.854712 ], [ 145.068595, -41.836180 ], [ 145.056788, -41.824076 ], [ 145.028205, -41.812958 ], [ 145.032888, -41.806018 ], [ 145.010635, -41.790175 ], [ 145.004506, -41.768898 ], [ 145.010145, -41.767371 ], [ 144.994948, -41.762164 ], [ 144.999131, -41.755101 ], [ 144.980118, -41.739562 ], [ 144.985053, -41.735538 ], [ 144.978577, -41.738103 ], [ 144.954941, -41.716772 ], [ 144.938055, -41.724409 ], [ 144.927021, -41.720933 ], [ 144.911220, -41.691228 ], [ 144.926369, -41.672804 ], [ 144.924912, -41.665608 ], [ 145.005252, -41.617822 ], [ 145.050122, -41.625880 ], [ 145.034811, -41.616962 ], [ 145.051069, -41.608013 ], [ 145.050574, -41.601303 ], [ 145.050935, -41.607848 ], [ 145.034052, -41.616718 ], [ 145.004696, -41.616497 ], [ 144.974744, -41.628734 ], [ 144.920865, -41.667596 ], [ 144.908044, -41.656246 ], [ 144.906663, -41.642018 ], [ 144.897118, -41.639508 ], [ 144.905872, -41.628820 ], [ 144.888303, -41.583194 ], [ 144.832007, -41.508620 ], [ 144.839571, -41.505567 ], [ 144.821311, -41.500773 ], [ 144.813581, -41.477462 ], [ 144.792487, -41.463133 ], [ 144.785280, -41.445714 ], [ 144.745887, -41.421491 ], [ 144.789891, -41.395130 ], [ 144.781861, -41.397029 ], [ 144.782976, -41.367423 ], [ 144.777820, -41.369763 ], [ 144.759486, -41.341194 ], [ 144.770554, -41.341519 ], [ 144.738072, -41.325578 ], [ 144.734202, -41.318282 ], [ 144.741994, -41.311675 ], [ 144.719749, -41.301484 ], [ 144.722619, -41.285111 ], [ 144.711372, -41.282133 ], [ 144.716059, -41.277659 ], [ 144.705924, -41.254754 ], [ 144.683526, -41.234829 ], [ 144.690707, -41.231651 ], [ 144.685899, -41.223231 ], [ 144.694852, -41.199994 ], [ 144.672611, -41.159357 ], [ 144.683137, -41.132455 ], [ 144.671378, -41.138701 ], [ 144.664579, -41.120580 ], [ 144.676540, -41.117011 ], [ 144.678073, -41.079778 ], [ 144.659340, -41.057356 ], [ 144.681220, -41.050207 ], [ 144.683960, -41.038485 ], [ 144.695268, -41.048486 ], [ 144.746155, -41.056409 ], [ 144.754462, -41.061823 ] ], [ [ 144.779333, -41.079500 ], [ 144.775210, -41.084293 ], [ 144.781261, -41.079853 ], [ 144.779333, -41.079500 ] ], [ [ 144.777341, -41.070091 ], [ 144.791585, -41.068865 ], [ 144.795223, -41.054998 ], [ 144.793855, -41.053985 ], [ 144.791172, -41.068690 ], [ 144.782362, -41.065525 ], [ 144.777341, -41.070091 ] ], [ [ 144.796219, -41.055736 ], [ 144.798652, -41.060035 ], [ 144.799240, -41.057974 ], [ 144.796219, -41.055736 ] ], [ [ 144.791540, -41.084969 ], [ 144.790728, -41.086832 ], [ 144.799122, -41.089529 ], [ 144.791165, -41.086281 ], [ 144.791540, -41.084969 ] ], [ [ 145.064125, -41.634036 ], [ 145.065983, -41.636421 ], [ 145.062093, -41.647983 ], [ 145.081232, -41.657116 ], [ 145.103775, -41.655895 ], [ 145.090875, -41.651241 ], [ 145.082199, -41.656176 ], [ 145.065615, -41.649032 ], [ 145.068161, -41.636387 ], [ 145.064125, -41.634036 ] ], [ [ 145.388656, -42.196644 ], [ 145.411219, -42.198418 ], [ 145.414992, -42.196811 ], [ 145.388656, -42.196644 ] ], [ [ 145.430958, -42.190011 ], [ 145.434023, -42.188706 ], [ 145.449001, -42.199769 ], [ 145.463897, -42.192569 ], [ 145.469823, -42.197144 ], [ 145.471508, -42.185374 ], [ 145.487023, -42.186916 ], [ 145.499953, -42.176319 ], [ 145.486997, -42.186539 ], [ 145.471562, -42.184938 ], [ 145.469668, -42.196670 ], [ 145.464064, -42.192256 ], [ 145.449066, -42.199429 ], [ 145.433831, -42.188288 ], [ 145.430958, -42.190011 ] ], [ [ 146.156535, -43.414211 ], [ 146.166411, -43.418752 ], [ 146.168631, -43.411074 ], [ 146.156535, -43.414211 ] ], [ [ 147.535871, -42.960446 ], [ 147.516449, -42.952131 ], [ 147.518198, -42.963502 ], [ 147.509146, -42.967315 ], [ 147.528667, -42.985174 ], [ 147.539201, -42.974910 ], [ 147.527659, -42.962009 ], [ 147.535871, -42.960446 ] ], [ [ 148.301216, -41.251273 ], [ 148.287988, -41.250247 ], [ 148.293148, -41.253737 ], [ 148.287613, -41.256935 ], [ 148.301216, -41.251273 ] ], [ [ 147.201143, -40.999743 ], [ 147.203245, -40.999937 ], [ 147.202672, -41.009008 ], [ 147.205750, -40.999837 ], [ 147.201143, -40.999743 ] ], [ [ 146.151654, -41.162045 ], [ 146.128983, -41.152298 ], [ 146.131761, -41.157267 ], [ 146.120766, -41.155706 ], [ 146.125367, -41.164903 ], [ 146.129428, -41.158995 ], [ 146.144626, -41.161491 ], [ 146.142192, -41.168473 ], [ 146.151908, -41.176943 ], [ 146.144170, -41.164075 ], [ 146.151654, -41.162045 ] ], [ [ 145.120845, -40.838941 ], [ 145.091374, -40.847701 ], [ 145.119694, -40.841042 ], [ 145.120845, -40.838941 ] ], [ [ 148.248756, -41.459656 ], [ 148.236244, -41.459146 ], [ 148.244398, -41.466570 ], [ 148.232911, -41.460398 ], [ 148.231605, -41.453279 ], [ 148.231106, -41.459837 ], [ 148.246233, -41.469993 ], [ 148.248756, -41.459656 ] ], [ [ 148.229653, -41.442640 ], [ 148.227630, -41.431612 ], [ 148.228745, -41.442547 ], [ 148.229653, -41.442640 ] ], [ [ 148.219890, -41.445580 ], [ 148.215920, -41.446137 ], [ 148.219108, -41.446805 ], [ 148.219890, -41.445580 ] ], [ [ 148.204248, -41.443691 ], [ 148.205429, -41.440982 ], [ 148.197882, -41.442357 ], [ 148.204248, -41.443691 ] ], [ [ 148.075841, -42.067087 ], [ 148.075899, -42.062644 ], [ 148.063960, -42.068366 ], [ 148.073524, -42.065245 ], [ 148.075841, -42.067087 ] ], [ [ 147.052310, -43.041767 ], [ 147.056261, -43.039689 ], [ 147.036506, -43.024661 ], [ 147.041366, -43.017748 ], [ 147.034777, -43.019129 ], [ 147.034041, -43.010891 ], [ 147.002317, -43.016870 ], [ 147.033019, -43.011415 ], [ 147.035676, -43.025036 ], [ 147.054684, -43.039995 ], [ 147.052310, -43.041767 ] ], [ [ 146.917754, -43.436894 ], [ 146.908291, -43.432156 ], [ 146.905874, -43.420799 ], [ 146.907601, -43.432393 ], [ 146.917754, -43.436894 ] ], [ [ 145.917851, -43.210310 ], [ 145.928127, -43.204659 ], [ 145.916285, -43.192174 ], [ 145.937342, -43.191481 ], [ 145.927708, -43.185034 ], [ 145.921338, -43.163191 ], [ 145.940454, -43.150439 ], [ 145.920472, -43.161382 ], [ 145.927102, -43.189413 ], [ 145.908648, -43.187014 ], [ 145.915800, -43.188280 ], [ 145.910036, -43.194087 ], [ 145.920675, -43.204904 ], [ 145.917851, -43.210310 ] ], [ [ 145.613883, -42.437439 ], [ 145.626303, -42.445889 ], [ 145.648221, -42.435776 ], [ 145.671991, -42.444866 ], [ 145.677123, -42.504088 ], [ 145.665285, -42.527497 ], [ 145.672542, -42.534346 ], [ 145.666151, -42.538227 ], [ 145.670983, -42.562363 ], [ 145.698605, -42.570882 ], [ 145.718173, -42.590035 ], [ 145.729697, -42.582795 ], [ 145.741359, -42.591139 ], [ 145.729290, -42.582031 ], [ 145.718659, -42.589459 ], [ 145.701175, -42.571647 ], [ 145.671843, -42.560717 ], [ 145.667354, -42.538005 ], [ 145.674067, -42.534117 ], [ 145.667096, -42.527739 ], [ 145.678750, -42.502002 ], [ 145.673267, -42.442730 ], [ 145.645783, -42.434272 ], [ 145.625766, -42.444480 ], [ 145.612914, -42.434366 ], [ 145.613883, -42.437439 ] ], [ [ 145.246202, -42.030615 ], [ 145.253247, -42.019488 ], [ 145.267714, -42.022905 ], [ 145.253297, -42.018618 ], [ 145.245641, -42.027693 ], [ 145.246202, -42.030615 ] ] ], [ [ [ 148.349737, -40.517405 ], [ 148.347005, -40.522516 ], [ 148.340391, -40.517047 ], [ 148.327874, -40.501534 ], [ 148.331176, -40.496379 ], [ 148.344715, -40.499249 ], [ 148.349737, -40.517405 ] ] ], [ [ [ 148.347729, -39.950922 ], [ 148.342542, -39.958786 ], [ 148.322896, -39.959535 ], [ 148.315224, -39.946672 ], [ 148.324036, -39.944668 ], [ 148.328564, -39.931983 ], [ 148.347729, -39.950922 ] ] ], [ [ [ 148.345979, -42.341687 ], [ 148.304643, -42.343784 ], [ 148.277068, -42.324644 ], [ 148.251987, -42.328576 ], [ 148.236565, -42.317678 ], [ 148.236136, -42.306489 ], [ 148.253975, -42.293475 ], [ 148.279240, -42.302213 ], [ 148.298482, -42.292461 ], [ 148.319330, -42.305872 ], [ 148.317633, -42.323332 ], [ 148.331715, -42.322622 ], [ 148.326302, -42.333737 ], [ 148.345979, -42.341687 ] ] ], [ [ [ 148.334277, -40.208333 ], [ 148.283291, -40.231378 ], [ 148.271750, -40.230812 ], [ 148.272247, -40.217157 ], [ 148.258928, -40.209863 ], [ 148.210283, -40.210695 ], [ 148.193204, -40.218909 ], [ 148.185396, -40.249854 ], [ 148.122105, -40.274035 ], [ 148.098371, -40.260770 ], [ 148.088599, -40.268918 ], [ 148.059975, -40.247765 ], [ 148.046110, -40.249506 ], [ 148.040339, -40.230105 ], [ 148.025212, -40.225816 ], [ 148.024496, -40.211832 ], [ 148.040360, -40.215628 ], [ 148.041872, -40.204129 ], [ 148.017627, -40.170560 ], [ 148.019666, -40.136914 ], [ 148.007019, -40.105369 ], [ 147.970208, -40.086641 ], [ 147.963908, -40.075137 ], [ 147.955338, -40.082301 ], [ 147.964487, -40.088787 ], [ 147.953650, -40.099005 ], [ 147.951703, -40.061202 ], [ 147.933850, -40.034647 ], [ 147.917223, -40.029825 ], [ 147.895139, -40.037046 ], [ 147.874749, -40.021282 ], [ 147.859016, -40.023392 ], [ 147.869309, -40.009472 ], [ 147.880468, -40.012098 ], [ 147.885864, -40.000581 ], [ 147.897245, -39.999015 ], [ 147.906751, -39.976154 ], [ 147.899184, -39.942768 ], [ 147.880012, -39.907311 ], [ 147.847806, -39.898031 ], [ 147.804546, -39.916577 ], [ 147.794088, -39.901962 ], [ 147.757223, -39.890618 ], [ 147.748199, -39.873759 ], [ 147.769510, -39.866385 ], [ 147.777372, -39.849564 ], [ 147.792747, -39.852429 ], [ 147.803657, -39.835362 ], [ 147.843840, -39.837056 ], [ 147.850835, -39.822647 ], [ 147.840889, -39.808845 ], [ 147.869716, -39.786727 ], [ 147.868220, -39.774290 ], [ 147.847978, -39.750670 ], [ 147.862703, -39.747156 ], [ 147.884186, -39.761323 ], [ 147.919578, -39.744345 ], [ 147.941776, -39.719554 ], [ 147.963439, -39.727070 ], [ 147.955788, -39.732023 ], [ 147.955958, -39.744940 ], [ 147.966735, -39.772864 ], [ 147.967512, -39.759154 ], [ 147.990705, -39.779275 ], [ 147.962316, -39.743289 ], [ 147.967557, -39.741830 ], [ 147.960671, -39.730132 ], [ 148.122472, -39.897448 ], [ 148.107973, -39.894909 ], [ 148.124084, -39.898526 ], [ 148.186090, -39.946608 ], [ 148.170978, -39.942589 ], [ 148.177245, -39.952059 ], [ 148.204976, -39.945233 ], [ 148.260195, -39.966870 ], [ 148.291135, -39.965118 ], [ 148.279268, -40.008597 ], [ 148.286257, -40.067923 ], [ 148.269247, -40.090782 ], [ 148.238306, -40.101529 ], [ 148.223281, -40.121045 ], [ 148.234069, -40.127710 ], [ 148.279159, -40.116428 ], [ 148.281833, -40.080679 ], [ 148.287652, -40.080784 ], [ 148.314828, -40.174085 ], [ 148.334277, -40.208333 ] ] ], [ [ [ 148.325802, -40.287476 ], [ 148.306275, -40.292821 ], [ 148.278335, -40.284192 ], [ 148.288077, -40.278676 ], [ 148.295423, -40.257441 ], [ 148.312361, -40.266259 ], [ 148.325802, -40.287476 ] ] ], [ [ [ 148.318491, -40.501004 ], [ 148.314921, -40.520474 ], [ 148.304317, -40.521119 ], [ 148.303240, -40.504399 ], [ 148.312425, -40.496640 ], [ 148.318491, -40.501004 ] ] ], [ [ [ 148.266784, -40.252596 ], [ 148.256823, -40.257542 ], [ 148.238893, -40.248627 ], [ 148.233843, -40.254690 ], [ 148.227773, -40.240908 ], [ 148.256437, -40.241762 ], [ 148.266784, -40.252596 ] ] ], [ [ [ 148.261927, -40.228468 ], [ 148.244487, -40.225414 ], [ 148.256977, -40.221973 ], [ 148.261927, -40.228468 ] ] ], [ [ [ 148.248432, -40.487771 ], [ 148.231970, -40.507856 ], [ 148.228405, -40.525651 ], [ 148.235030, -40.532883 ], [ 148.194755, -40.569098 ], [ 148.198465, -40.590122 ], [ 148.178286, -40.594185 ], [ 148.149204, -40.565369 ], [ 148.125657, -40.572343 ], [ 148.113324, -40.564875 ], [ 148.121528, -40.537112 ], [ 148.095831, -40.531738 ], [ 148.131130, -40.502107 ], [ 148.192762, -40.489367 ], [ 148.210229, -40.503504 ], [ 148.238953, -40.479896 ], [ 148.246148, -40.478409 ], [ 148.248432, -40.487771 ] ] ], [ [ [ 148.215104, -40.254906 ], [ 148.205679, -40.258491 ], [ 148.201749, -40.249739 ], [ 148.215104, -40.254906 ] ] ], [ [ [ 148.169014, -42.648680 ], [ 148.152987, -42.653560 ], [ 148.144520, -42.667372 ], [ 148.133278, -42.660114 ], [ 148.119586, -42.668692 ], [ 148.112098, -42.659731 ], [ 148.081273, -42.661757 ], [ 148.068213, -42.681236 ], [ 148.087118, -42.689474 ], [ 148.096308, -42.711196 ], [ 148.093028, -42.720886 ], [ 148.079401, -42.724377 ], [ 148.065282, -42.717338 ], [ 148.067886, -42.726383 ], [ 148.047965, -42.722658 ], [ 148.013573, -42.741864 ], [ 148.012714, -42.720336 ], [ 148.025540, -42.712943 ], [ 148.038744, -42.684106 ], [ 148.057269, -42.685590 ], [ 148.066320, -42.676954 ], [ 148.063155, -42.664646 ], [ 148.049712, -42.655681 ], [ 148.025478, -42.668188 ], [ 148.009322, -42.661187 ], [ 148.037887, -42.649197 ], [ 148.034277, -42.634912 ], [ 148.024605, -42.629566 ], [ 148.047748, -42.607854 ], [ 148.052767, -42.585100 ], [ 148.067397, -42.570657 ], [ 148.089799, -42.585044 ], [ 148.120142, -42.585011 ], [ 148.138549, -42.608441 ], [ 148.140673, -42.631168 ], [ 148.169014, -42.648680 ] ] ], [ [ [ 148.166054, -40.291935 ], [ 148.131932, -40.297874 ], [ 148.143219, -40.290113 ], [ 148.166054, -40.291935 ] ] ], [ [ [ 148.127743, -40.734296 ], [ 148.108142, -40.742853 ], [ 148.089824, -40.740085 ], [ 148.119373, -40.726930 ], [ 148.127743, -40.734296 ] ] ], [ [ [ 148.116053, -40.302946 ], [ 148.107638, -40.312470 ], [ 148.097565, -40.309090 ], [ 148.108589, -40.295667 ], [ 148.116053, -40.302946 ] ] ], [ [ [ 148.082002, -40.488780 ], [ 148.047732, -40.474074 ], [ 148.061758, -40.468454 ], [ 148.082002, -40.488780 ] ] ], [ [ [ 148.025111, -40.354577 ], [ 147.994764, -40.369337 ], [ 147.980622, -40.367635 ], [ 148.006358, -40.351234 ], [ 148.024730, -40.349170 ], [ 148.025111, -40.354577 ] ] ], [ [ [ 148.011504, -43.221681 ], [ 148.001351, -43.227703 ], [ 147.949626, -43.215790 ], [ 147.945160, -43.194680 ], [ 147.931760, -43.198854 ], [ 147.916506, -43.189563 ], [ 147.896630, -43.190994 ], [ 147.895553, -43.155064 ], [ 147.888164, -43.142676 ], [ 147.894681, -43.138209 ], [ 147.888765, -43.138199 ], [ 147.886423, -43.123264 ], [ 147.867290, -43.129281 ], [ 147.863332, -43.107856 ], [ 147.853766, -43.117945 ], [ 147.857979, -43.124421 ], [ 147.850384, -43.124099 ], [ 147.866095, -43.137281 ], [ 147.855675, -43.134782 ], [ 147.860058, -43.142472 ], [ 147.845553, -43.154347 ], [ 147.861350, -43.164949 ], [ 147.870330, -43.151840 ], [ 147.870690, -43.164288 ], [ 147.852999, -43.179577 ], [ 147.876253, -43.191710 ], [ 147.866474, -43.197929 ], [ 147.874616, -43.206364 ], [ 147.860838, -43.208220 ], [ 147.844472, -43.187533 ], [ 147.797429, -43.217457 ], [ 147.799729, -43.242340 ], [ 147.785615, -43.237973 ], [ 147.776399, -43.213157 ], [ 147.750715, -43.209033 ], [ 147.746035, -43.197569 ], [ 147.711578, -43.194282 ], [ 147.715518, -43.178358 ], [ 147.701292, -43.176982 ], [ 147.694551, -43.167179 ], [ 147.701488, -43.160114 ], [ 147.698166, -43.145690 ], [ 147.685138, -43.138730 ], [ 147.703396, -43.122145 ], [ 147.731142, -43.124916 ], [ 147.734104, -43.110809 ], [ 147.716379, -43.105208 ], [ 147.730179, -43.100332 ], [ 147.747515, -43.112124 ], [ 147.742079, -43.094904 ], [ 147.684186, -43.102438 ], [ 147.673726, -43.088687 ], [ 147.650740, -43.089445 ], [ 147.641437, -43.075647 ], [ 147.627123, -43.073515 ], [ 147.622388, -43.051575 ], [ 147.628333, -43.040258 ], [ 147.619071, -43.006636 ], [ 147.640734, -42.993560 ], [ 147.667520, -42.999909 ], [ 147.679341, -42.991801 ], [ 147.685157, -42.974694 ], [ 147.668944, -42.963543 ], [ 147.675717, -42.956967 ], [ 147.664409, -42.943582 ], [ 147.678878, -42.934545 ], [ 147.699473, -42.944257 ], [ 147.705359, -42.956620 ], [ 147.725528, -42.949394 ], [ 147.731363, -42.957165 ], [ 147.726291, -42.964228 ], [ 147.736022, -42.970022 ], [ 147.708038, -43.003555 ], [ 147.726912, -43.018714 ], [ 147.718453, -43.027975 ], [ 147.740428, -43.014116 ], [ 147.749379, -43.043379 ], [ 147.759037, -43.044137 ], [ 147.766735, -43.032672 ], [ 147.773829, -43.054938 ], [ 147.806686, -43.046425 ], [ 147.813794, -43.060610 ], [ 147.826603, -43.055237 ], [ 147.840701, -43.060400 ], [ 147.844355, -43.049932 ], [ 147.835922, -43.041115 ], [ 147.845436, -43.030682 ], [ 147.860340, -43.057314 ], [ 147.872443, -43.023363 ], [ 147.924995, -43.015889 ], [ 147.846860, -43.013058 ], [ 147.850974, -43.007916 ], [ 147.839301, -43.003979 ], [ 147.837899, -42.991561 ], [ 147.856779, -42.982517 ], [ 147.836543, -42.980556 ], [ 147.832381, -42.970556 ], [ 147.822602, -42.976101 ], [ 147.811311, -42.962254 ], [ 147.830846, -42.965246 ], [ 147.854803, -42.958205 ], [ 147.847999, -42.951638 ], [ 147.853799, -42.945877 ], [ 147.865873, -42.947044 ], [ 147.857744, -42.935458 ], [ 147.837048, -42.947847 ], [ 147.829492, -42.946674 ], [ 147.833264, -42.934657 ], [ 147.814891, -42.937869 ], [ 147.811529, -42.926103 ], [ 147.821481, -42.922421 ], [ 147.821825, -42.907884 ], [ 147.802901, -42.893233 ], [ 147.840835, -42.888650 ], [ 147.873839, -42.894629 ], [ 147.876415, -42.888672 ], [ 147.895002, -42.894433 ], [ 147.907805, -42.908754 ], [ 147.900413, -42.899846 ], [ 147.903957, -42.882359 ], [ 147.861124, -42.874994 ], [ 147.885242, -42.861884 ], [ 147.879630, -42.853645 ], [ 147.891706, -42.842525 ], [ 147.920112, -42.843015 ], [ 147.920356, -42.861292 ], [ 147.939856, -42.877176 ], [ 147.970888, -42.864223 ], [ 147.971340, -42.874248 ], [ 147.957801, -42.881936 ], [ 147.984060, -42.890432 ], [ 147.998862, -42.914565 ], [ 147.983432, -42.941260 ], [ 147.999510, -42.964206 ], [ 147.984420, -42.979207 ], [ 147.961326, -42.984066 ], [ 147.953160, -43.001298 ], [ 147.930506, -43.009893 ], [ 147.926429, -43.021228 ], [ 147.935524, -43.034973 ], [ 147.950217, -43.034764 ], [ 147.954041, -43.052070 ], [ 147.945066, -43.059229 ], [ 147.955695, -43.064419 ], [ 147.970726, -43.102556 ], [ 147.981089, -43.107373 ], [ 147.980612, -43.123308 ], [ 147.954581, -43.125720 ], [ 147.959847, -43.130501 ], [ 147.954355, -43.136598 ], [ 147.963387, -43.142729 ], [ 147.972237, -43.134830 ], [ 148.005817, -43.139058 ], [ 147.983168, -43.156111 ], [ 147.963690, -43.191683 ], [ 148.011504, -43.221681 ] ] ], [ [ [ 148.011137, -39.648628 ], [ 147.991378, -39.663382 ], [ 147.964916, -39.660639 ], [ 147.985178, -39.652269 ], [ 147.977117, -39.643462 ], [ 147.982519, -39.636983 ], [ 148.011137, -39.648628 ] ] ], [ [ [ 148.009528, -43.236550 ], [ 147.998704, -43.246389 ], [ 147.998884, -43.232900 ], [ 148.009528, -43.236550 ] ] ], [ [ [ 147.986630, -40.186005 ], [ 147.973717, -40.194177 ], [ 147.971787, -40.175701 ], [ 147.983745, -40.177530 ], [ 147.986630, -40.186005 ] ] ], [ [ [ 147.946602, -39.697180 ], [ 147.902897, -39.705225 ], [ 147.890644, -39.700362 ], [ 147.887686, -39.687877 ], [ 147.898666, -39.681513 ], [ 147.907193, -39.689293 ], [ 147.926712, -39.685286 ], [ 147.946602, -39.697180 ] ] ], [ [ [ 147.937714, -40.270009 ], [ 147.927698, -40.281890 ], [ 147.911090, -40.278657 ], [ 147.931415, -40.257936 ], [ 147.937714, -40.270009 ] ] ], [ [ [ 147.917208, -40.186277 ], [ 147.890374, -40.190523 ], [ 147.906282, -40.177344 ], [ 147.917208, -40.186277 ] ] ], [ [ [ 147.908873, -40.301612 ], [ 147.904735, -40.317090 ], [ 147.881166, -40.325954 ], [ 147.864323, -40.319525 ], [ 147.846615, -40.323907 ], [ 147.856143, -40.308088 ], [ 147.836332, -40.303464 ], [ 147.839791, -40.292112 ], [ 147.868103, -40.297292 ], [ 147.875552, -40.305661 ], [ 147.903275, -40.291471 ], [ 147.908873, -40.301612 ] ] ], [ [ [ 147.893182, -40.097280 ], [ 147.886775, -40.106159 ], [ 147.886514, -40.094623 ], [ 147.893182, -40.097280 ] ] ], [ [ [ 147.803156, -40.313950 ], [ 147.787186, -40.299919 ], [ 147.790695, -40.294971 ], [ 147.799564, -40.294439 ], [ 147.803156, -40.313950 ] ] ], [ [ [ 147.787500, -40.042051 ], [ 147.759630, -40.068324 ], [ 147.756551, -40.094755 ], [ 147.726294, -40.103138 ], [ 147.725647, -40.091200 ], [ 147.751011, -40.076174 ], [ 147.747312, -40.066625 ], [ 147.756423, -40.058756 ], [ 147.764212, -40.028643 ], [ 147.775768, -40.023031 ], [ 147.787500, -40.042051 ] ] ], [ [ [ 147.778852, -39.908975 ], [ 147.769124, -39.909354 ], [ 147.774023, -39.903602 ], [ 147.778852, -39.908975 ] ] ], [ [ [ 147.675423, -43.135705 ], [ 147.670393, -43.140366 ], [ 147.672294, -43.129312 ], [ 147.675423, -43.135705 ] ] ], [ [ [ 147.648942, -42.954184 ], [ 147.644600, -42.958921 ], [ 147.635678, -42.947163 ], [ 147.643785, -42.943718 ], [ 147.648942, -42.954184 ] ] ], [ [ [ 147.644205, -40.787921 ], [ 147.634164, -40.807140 ], [ 147.617007, -40.813388 ], [ 147.640959, -40.779814 ], [ 147.644205, -40.787921 ] ] ], [ [ [ 147.490874, -43.062006 ], [ 147.472132, -43.045822 ], [ 147.484844, -43.044846 ], [ 147.490874, -43.062006 ] ] ], [ [ [ 147.202800, -43.436981 ], [ 147.203519, -43.453198 ], [ 147.179557, -43.471256 ], [ 147.187056, -43.481337 ], [ 147.182837, -43.488863 ], [ 147.159387, -43.483351 ], [ 147.146534, -43.496781 ], [ 147.137447, -43.493344 ], [ 147.135650, -43.458103 ], [ 147.093898, -43.428398 ], [ 147.097146, -43.412367 ], [ 147.122344, -43.416462 ], [ 147.160375, -43.464404 ], [ 147.179878, -43.458298 ], [ 147.171415, -43.451725 ], [ 147.180376, -43.443265 ], [ 147.174268, -43.437809 ], [ 147.192417, -43.428757 ], [ 147.184873, -43.418094 ], [ 147.174277, -43.423514 ], [ 147.174112, -43.409116 ], [ 147.167887, -43.408738 ], [ 147.185854, -43.387657 ], [ 147.179097, -43.352555 ], [ 147.188574, -43.349104 ], [ 147.185046, -43.357367 ], [ 147.195609, -43.361267 ], [ 147.198643, -43.379384 ], [ 147.212788, -43.382357 ], [ 147.221585, -43.370746 ], [ 147.218025, -43.362334 ], [ 147.234483, -43.364057 ], [ 147.222336, -43.339846 ], [ 147.240417, -43.329166 ], [ 147.246780, -43.304327 ], [ 147.271080, -43.295519 ], [ 147.271597, -43.276041 ], [ 147.286104, -43.265938 ], [ 147.290857, -43.241789 ], [ 147.302201, -43.264280 ], [ 147.297969, -43.273143 ], [ 147.305815, -43.297016 ], [ 147.317638, -43.294773 ], [ 147.357883, -43.255799 ], [ 147.348364, -43.237134 ], [ 147.355732, -43.229079 ], [ 147.341157, -43.219082 ], [ 147.364267, -43.208611 ], [ 147.375729, -43.214859 ], [ 147.383276, -43.206911 ], [ 147.386307, -43.187863 ], [ 147.378961, -43.176046 ], [ 147.361713, -43.176301 ], [ 147.354661, -43.186652 ], [ 147.331789, -43.185297 ], [ 147.342299, -43.169994 ], [ 147.299489, -43.180866 ], [ 147.300954, -43.168462 ], [ 147.276007, -43.166545 ], [ 147.296076, -43.157039 ], [ 147.282118, -43.144332 ], [ 147.310204, -43.134300 ], [ 147.329223, -43.152275 ], [ 147.337218, -43.136556 ], [ 147.352864, -43.131178 ], [ 147.355908, -43.140758 ], [ 147.361158, -43.113575 ], [ 147.353227, -43.128061 ], [ 147.338377, -43.119425 ], [ 147.328409, -43.130998 ], [ 147.322630, -43.126485 ], [ 147.330082, -43.114881 ], [ 147.306633, -43.113562 ], [ 147.317133, -43.109427 ], [ 147.326723, -43.089238 ], [ 147.322520, -43.084433 ], [ 147.338105, -43.082123 ], [ 147.351249, -43.063933 ], [ 147.367631, -43.071824 ], [ 147.362585, -43.086779 ], [ 147.387983, -43.102662 ], [ 147.389599, -43.121063 ], [ 147.400714, -43.127095 ], [ 147.392470, -43.162431 ], [ 147.409119, -43.168892 ], [ 147.410771, -43.200547 ], [ 147.426676, -43.206252 ], [ 147.433270, -43.231539 ], [ 147.430187, -43.252137 ], [ 147.421222, -43.252656 ], [ 147.415942, -43.240573 ], [ 147.380261, -43.250602 ], [ 147.345626, -43.273404 ], [ 147.322286, -43.304035 ], [ 147.320304, -43.343992 ], [ 147.340009, -43.366941 ], [ 147.334431, -43.367735 ], [ 147.349725, -43.368222 ], [ 147.367013, -43.350292 ], [ 147.381959, -43.371780 ], [ 147.378941, -43.390294 ], [ 147.364497, -43.392121 ], [ 147.337912, -43.423253 ], [ 147.346277, -43.429160 ], [ 147.344451, -43.437623 ], [ 147.331283, -43.441625 ], [ 147.320875, -43.469109 ], [ 147.323921, -43.502643 ], [ 147.294719, -43.516165 ], [ 147.291016, -43.505045 ], [ 147.271773, -43.500564 ], [ 147.263146, -43.487887 ], [ 147.246569, -43.492733 ], [ 147.240378, -43.465903 ], [ 147.255796, -43.457721 ], [ 147.245864, -43.440396 ], [ 147.202800, -43.436981 ] ], [ [ 147.202672, -43.434106 ], [ 147.204578, -43.429835 ], [ 147.225905, -43.433909 ], [ 147.241973, -43.425713 ], [ 147.241714, -43.413905 ], [ 147.235920, -43.419558 ], [ 147.227259, -43.412570 ], [ 147.202009, -43.419163 ], [ 147.202672, -43.434106 ] ] ], [ [ [ 147.361331, -39.465221 ], [ 147.345767, -39.471754 ], [ 147.357890, -39.481089 ], [ 147.349277, -39.485543 ], [ 147.351315, -39.497497 ], [ 147.330255, -39.490423 ], [ 147.324481, -39.504975 ], [ 147.313777, -39.480175 ], [ 147.305587, -39.483653 ], [ 147.303987, -39.475222 ], [ 147.312620, -39.473357 ], [ 147.309128, -39.468232 ], [ 147.321800, -39.452009 ], [ 147.327147, -39.458278 ], [ 147.340877, -39.449671 ], [ 147.343207, -39.460544 ], [ 147.361331, -39.465221 ] ] ], [ [ [ 147.304836, -39.451472 ], [ 147.295941, -39.456243 ], [ 147.299636, -39.461677 ], [ 147.289884, -39.477292 ], [ 147.260390, -39.479499 ], [ 147.270343, -39.466821 ], [ 147.293386, -39.462158 ], [ 147.274750, -39.443508 ], [ 147.285433, -39.446484 ], [ 147.286866, -39.439026 ], [ 147.301714, -39.438134 ], [ 147.304836, -39.451472 ] ] ], [ [ [ 147.148378, -43.286161 ], [ 147.144375, -43.294334 ], [ 147.137975, -43.290256 ], [ 147.148378, -43.286161 ] ] ], [ [ [ 147.134308, -43.257362 ], [ 147.127599, -43.264154 ], [ 147.129748, -43.252992 ], [ 147.134308, -43.257362 ] ] ], [ [ [ 147.105801, -43.396061 ], [ 147.100439, -43.409456 ], [ 147.094049, -43.398601 ], [ 147.099381, -43.389214 ], [ 147.105801, -43.396061 ] ] ], [ [ [ 147.087857, -41.380311 ], [ 147.082433, -41.384656 ], [ 147.079222, -41.372835 ], [ 147.087857, -41.380311 ] ] ], [ [ [ 147.041416, -43.053340 ], [ 147.023477, -43.077420 ], [ 147.030713, -43.058525 ], [ 147.041416, -43.053340 ] ] ], [ [ [ 147.020219, -43.090946 ], [ 147.013611, -43.111723 ], [ 147.007830, -43.114991 ], [ 147.013419, -43.102483 ], [ 146.999908, -43.120720 ], [ 147.004912, -43.104127 ], [ 147.020219, -43.090946 ] ] ], [ [ [ 146.996233, -39.221031 ], [ 146.987585, -39.231245 ], [ 146.977272, -39.229041 ], [ 146.985648, -39.206708 ], [ 146.996233, -39.221031 ] ] ], [ [ [ 146.657957, -39.463161 ], [ 146.640237, -39.480157 ], [ 146.637765, -39.473738 ], [ 146.657957, -39.463161 ] ] ], [ [ [ 146.395190, -39.230963 ], [ 146.380633, -39.231644 ], [ 146.388608, -39.224415 ], [ 146.395190, -39.230963 ] ] ], [ [ [ 146.377578, -43.596385 ], [ 146.351368, -43.607305 ], [ 146.336781, -43.591870 ], [ 146.374840, -43.586771 ], [ 146.377578, -43.596385 ] ] ], [ [ [ 146.297123, -43.619680 ], [ 146.285371, -43.620976 ], [ 146.292232, -43.612960 ], [ 146.297123, -43.619680 ] ] ], [ [ [ 146.286411, -43.651435 ], [ 146.267079, -43.657607 ], [ 146.274786, -43.636469 ], [ 146.286411, -43.651435 ] ] ], [ [ [ 145.971353, -43.418402 ], [ 145.963439, -43.423217 ], [ 145.968562, -43.412262 ], [ 145.971353, -43.418402 ] ] ], [ [ [ 145.104473, -40.793663 ], [ 145.077657, -40.794962 ], [ 145.045964, -40.782596 ], [ 145.040070, -40.774177 ], [ 145.044247, -40.751168 ], [ 145.104473, -40.793663 ] ] ], [ [ [ 144.929092, -40.622398 ], [ 144.919959, -40.613082 ], [ 144.927522, -40.577381 ], [ 144.949955, -40.621210 ], [ 144.935869, -40.629310 ], [ 144.929548, -40.622863 ], [ 144.937380, -40.649773 ], [ 144.967983, -40.658739 ], [ 144.954757, -40.629474 ], [ 144.991571, -40.670004 ], [ 145.026648, -40.684931 ], [ 145.049312, -40.680348 ], [ 145.044316, -40.689174 ], [ 145.067880, -40.714365 ], [ 145.041145, -40.717437 ], [ 145.051107, -40.712278 ], [ 145.039127, -40.713134 ], [ 145.038789, -40.705607 ], [ 145.004435, -40.714161 ], [ 144.976938, -40.707686 ], [ 144.943067, -40.731348 ], [ 144.919415, -40.728478 ], [ 144.893737, -40.740480 ], [ 144.867154, -40.722024 ], [ 144.876441, -40.710768 ], [ 144.871830, -40.678599 ], [ 144.903128, -40.657129 ], [ 144.919365, -40.624943 ], [ 144.929092, -40.622398 ] ] ], [ [ [ 144.969885, -40.426237 ], [ 144.947913, -40.438604 ], [ 144.951601, -40.460038 ], [ 144.896639, -40.483856 ], [ 144.858052, -40.468834 ], [ 144.850925, -40.452460 ], [ 144.834773, -40.443060 ], [ 144.841026, -40.429911 ], [ 144.854220, -40.434530 ], [ 144.877013, -40.422894 ], [ 144.885700, -40.408489 ], [ 144.874494, -40.401325 ], [ 144.884410, -40.399455 ], [ 144.879020, -40.392780 ], [ 144.887152, -40.388676 ], [ 144.913897, -40.397452 ], [ 144.954617, -40.391235 ], [ 144.962033, -40.401478 ], [ 144.956215, -40.412446 ], [ 144.969885, -40.426237 ] ] ], [ [ [ 144.841326, -40.695521 ], [ 144.823774, -40.699205 ], [ 144.832674, -40.690735 ], [ 144.841326, -40.695521 ] ] ], [ [ [ 144.792726, -40.417558 ], [ 144.791023, -40.464458 ], [ 144.784988, -40.470210 ], [ 144.792562, -40.479053 ], [ 144.791029, -40.507352 ], [ 144.771284, -40.533477 ], [ 144.775962, -40.581231 ], [ 144.757535, -40.605984 ], [ 144.735489, -40.592882 ], [ 144.725805, -40.574600 ], [ 144.733166, -40.550062 ], [ 144.722219, -40.517046 ], [ 144.709542, -40.510031 ], [ 144.718277, -40.500491 ], [ 144.710652, -40.484483 ], [ 144.724777, -40.479136 ], [ 144.730751, -40.489194 ], [ 144.755862, -40.485733 ], [ 144.772548, -40.464634 ], [ 144.766331, -40.444897 ], [ 144.784387, -40.420541 ], [ 144.784648, -40.399482 ], [ 144.792726, -40.417558 ] ] ], [ [ [ 144.723282, -40.606018 ], [ 144.716306, -40.606493 ], [ 144.717605, -40.599452 ], [ 144.723282, -40.606018 ] ] ], [ [ [ 144.698287, -40.633742 ], [ 144.687308, -40.638708 ], [ 144.679100, -40.627154 ], [ 144.698287, -40.633742 ] ] ], [ [ [ 144.138222, -39.933819 ], [ 144.128013, -39.993243 ], [ 144.113551, -40.008047 ], [ 144.116243, -40.018145 ], [ 144.100807, -40.028812 ], [ 144.105457, -40.044375 ], [ 144.093888, -40.052257 ], [ 144.070387, -40.051440 ], [ 144.062736, -40.069223 ], [ 144.062986, -40.063035 ], [ 144.049329, -40.067693 ], [ 144.050871, -40.074095 ], [ 144.026951, -40.094863 ], [ 143.989663, -40.098240 ], [ 143.971088, -40.116734 ], [ 143.962635, -40.109148 ], [ 143.949699, -40.112923 ], [ 143.921046, -40.134081 ], [ 143.929769, -40.146124 ], [ 143.925725, -40.157964 ], [ 143.915953, -40.143472 ], [ 143.900830, -40.139383 ], [ 143.908402, -40.128058 ], [ 143.904426, -40.121394 ], [ 143.875275, -40.116764 ], [ 143.872038, -40.083458 ], [ 143.858082, -40.062372 ], [ 143.879926, -40.062694 ], [ 143.890037, -40.053929 ], [ 143.884037, -40.028189 ], [ 143.892987, -40.010933 ], [ 143.885039, -39.998922 ], [ 143.891671, -39.993511 ], [ 143.879028, -39.967228 ], [ 143.838594, -39.936200 ], [ 143.845164, -39.925474 ], [ 143.833303, -39.915546 ], [ 143.839495, -39.911192 ], [ 143.835297, -39.902223 ], [ 143.847086, -39.894641 ], [ 143.841937, -39.885024 ], [ 143.846829, -39.870427 ], [ 143.860358, -39.856619 ], [ 143.854139, -39.851258 ], [ 143.867172, -39.833486 ], [ 143.859078, -39.816160 ], [ 143.863026, -39.789616 ], [ 143.850197, -39.770257 ], [ 143.854673, -39.737523 ], [ 143.844240, -39.715568 ], [ 143.891328, -39.698318 ], [ 143.922707, -39.668873 ], [ 143.934618, -39.638209 ], [ 143.924209, -39.595287 ], [ 143.935747, -39.594632 ], [ 143.945750, -39.580467 ], [ 143.984390, -39.600984 ], [ 144.005380, -39.596637 ], [ 144.012590, -39.608841 ], [ 144.051478, -39.625462 ], [ 144.109657, -39.669979 ], [ 144.100526, -39.752424 ], [ 144.113522, -39.819308 ], [ 144.093287, -39.792317 ], [ 144.106877, -39.819945 ], [ 144.121486, -39.819127 ], [ 144.110947, -39.798983 ], [ 144.127809, -39.821289 ], [ 144.106584, -39.866197 ], [ 144.105013, -39.891295 ], [ 144.111387, -39.913816 ], [ 144.135646, -39.924383 ], [ 144.138222, -39.933819 ] ] ], [ [ [ 143.837861, -39.669329 ], [ 143.819218, -39.674996 ], [ 143.826748, -39.665015 ], [ 143.837861, -39.669329 ] ] ], [ [ [ 143.835897, -39.687897 ], [ 143.829885, -39.693141 ], [ 143.826046, -39.682948 ], [ 143.835897, -39.687897 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 6, + "properties": { + "STATE_CODE": "7", + "STATE_NAME": "Northern Territory" + }, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ [ [ 130.517887, -12.731048 ], [ 130.517526, -12.725616 ], [ 130.529386, -12.725046 ], [ 130.524326, -12.734086 ], [ 130.531006, -12.742166 ], [ 130.525246, -12.734316 ], [ 130.531106, -12.724936 ], [ 130.515446, -12.722686 ], [ 130.511416, -12.710256 ], [ 130.520625, -12.703496 ], [ 130.535765, -12.719026 ], [ 130.557274, -12.701995 ], [ 130.558615, -12.718586 ], [ 130.567234, -12.706375 ], [ 130.583254, -12.719245 ], [ 130.569915, -12.743776 ], [ 130.584645, -12.735286 ], [ 130.591145, -12.739196 ], [ 130.585105, -12.731896 ], [ 130.596024, -12.717995 ], [ 130.607654, -12.719905 ], [ 130.599834, -12.729065 ], [ 130.605024, -12.732715 ], [ 130.610304, -12.722275 ], [ 130.629534, -12.727795 ], [ 130.624970, -12.769403 ], [ 130.643554, -12.743695 ], [ 130.636324, -12.727105 ], [ 130.616973, -12.711755 ], [ 130.621453, -12.705205 ], [ 130.630093, -12.715245 ], [ 130.660603, -12.714655 ], [ 130.687143, -12.727954 ], [ 130.690663, -12.732695 ], [ 130.679753, -12.745255 ], [ 130.689143, -12.751495 ], [ 130.693933, -12.746675 ], [ 130.684583, -12.744455 ], [ 130.707332, -12.716514 ], [ 130.738762, -12.710544 ], [ 130.706062, -12.710984 ], [ 130.690192, -12.719814 ], [ 130.679132, -12.713504 ], [ 130.701951, -12.690484 ], [ 130.674062, -12.707854 ], [ 130.664722, -12.700524 ], [ 130.673922, -12.691474 ], [ 130.633402, -12.686324 ], [ 130.637722, -12.683674 ], [ 130.616462, -12.668714 ], [ 130.617392, -12.676394 ], [ 130.597243, -12.670764 ], [ 130.585863, -12.684445 ], [ 130.573402, -12.652244 ], [ 130.545662, -12.634304 ], [ 130.549902, -12.616104 ], [ 130.559572, -12.626494 ], [ 130.582821, -12.622974 ], [ 130.586502, -12.660454 ], [ 130.596242, -12.653994 ], [ 130.588832, -12.654384 ], [ 130.588232, -12.629414 ], [ 130.609031, -12.604423 ], [ 130.618861, -12.615643 ], [ 130.630331, -12.610623 ], [ 130.642891, -12.625183 ], [ 130.641181, -12.644164 ], [ 130.644121, -12.623803 ], [ 130.631480, -12.609033 ], [ 130.618481, -12.612893 ], [ 130.612020, -12.601483 ], [ 130.589231, -12.592123 ], [ 130.603940, -12.578393 ], [ 130.588990, -12.580483 ], [ 130.573591, -12.596763 ], [ 130.566791, -12.581523 ], [ 130.582840, -12.512803 ], [ 130.588700, -12.501273 ], [ 130.605760, -12.501452 ], [ 130.604100, -12.487932 ], [ 130.580960, -12.462642 ], [ 130.588430, -12.452802 ], [ 130.623239, -12.447762 ], [ 130.612210, -12.431772 ], [ 130.587250, -12.425232 ], [ 130.578160, -12.406593 ], [ 130.611600, -12.393123 ], [ 130.619300, -12.381373 ], [ 130.624130, -12.388932 ], [ 130.654259, -12.393992 ], [ 130.683829, -12.416111 ], [ 130.705669, -12.414051 ], [ 130.711659, -12.423421 ], [ 130.749838, -12.427111 ], [ 130.765148, -12.437371 ], [ 130.757389, -12.482231 ], [ 130.727069, -12.526232 ], [ 130.736749, -12.524632 ], [ 130.761649, -12.482451 ], [ 130.778888, -12.474751 ], [ 130.771439, -12.493851 ], [ 130.778479, -12.509551 ], [ 130.769419, -12.527071 ], [ 130.774399, -12.545592 ], [ 130.748909, -12.579972 ], [ 130.729289, -12.581592 ], [ 130.732030, -12.596932 ], [ 130.730049, -12.583052 ], [ 130.749029, -12.584042 ], [ 130.778559, -12.559142 ], [ 130.781689, -12.573712 ], [ 130.767359, -12.601692 ], [ 130.774710, -12.616002 ], [ 130.777129, -12.599592 ], [ 130.779920, -12.619472 ], [ 130.791850, -12.621902 ], [ 130.780380, -12.616882 ], [ 130.790129, -12.602632 ], [ 130.783669, -12.589422 ], [ 130.794459, -12.578442 ], [ 130.788199, -12.548282 ], [ 130.810159, -12.539891 ], [ 130.805109, -12.563512 ], [ 130.814199, -12.582022 ], [ 130.825330, -12.579900 ], [ 130.816059, -12.558182 ], [ 130.841469, -12.555322 ], [ 130.868019, -12.601482 ], [ 130.857349, -12.615172 ], [ 130.847219, -12.613492 ], [ 130.858969, -12.620582 ], [ 130.869299, -12.611642 ], [ 130.876589, -12.628802 ], [ 130.869760, -12.658733 ], [ 130.879809, -12.631282 ], [ 130.887100, -12.648222 ], [ 130.900000, -12.655312 ], [ 130.898737, -12.662486 ], [ 130.908180, -12.656432 ], [ 130.890420, -12.641772 ], [ 130.882289, -12.606202 ], [ 130.932929, -12.611102 ], [ 130.945289, -12.637862 ], [ 130.952293, -12.635237 ], [ 130.947089, -12.617702 ], [ 130.953669, -12.627632 ], [ 130.952497, -12.635161 ], [ 130.966849, -12.629782 ], [ 130.957249, -12.630902 ], [ 130.948099, -12.608442 ], [ 130.953319, -12.596862 ], [ 130.945449, -12.606522 ], [ 130.923079, -12.579912 ], [ 130.884649, -12.574792 ], [ 130.877819, -12.552431 ], [ 130.893359, -12.560531 ], [ 130.901419, -12.556261 ], [ 130.879529, -12.547911 ], [ 130.873858, -12.528031 ], [ 130.862118, -12.526251 ], [ 130.859208, -12.506591 ], [ 130.869788, -12.505781 ], [ 130.879588, -12.521131 ], [ 130.903608, -12.513291 ], [ 130.895598, -12.529801 ], [ 130.907068, -12.516451 ], [ 130.908039, -12.540741 ], [ 130.916648, -12.530891 ], [ 130.910408, -12.517461 ], [ 130.922618, -12.509251 ], [ 130.930538, -12.520241 ], [ 130.927358, -12.536631 ], [ 130.934839, -12.540631 ], [ 130.934248, -12.532211 ], [ 130.947029, -12.541681 ], [ 130.938969, -12.554081 ], [ 130.949449, -12.539641 ], [ 130.953849, -12.555131 ], [ 130.955148, -12.529401 ], [ 130.941928, -12.521801 ], [ 130.947278, -12.496491 ], [ 130.940858, -12.504291 ], [ 130.930578, -12.486691 ], [ 130.946728, -12.471050 ], [ 130.897348, -12.487661 ], [ 130.891918, -12.472761 ], [ 130.916948, -12.457680 ], [ 130.890748, -12.465190 ], [ 130.885998, -12.443050 ], [ 130.878308, -12.450520 ], [ 130.885918, -12.462030 ], [ 130.878678, -12.463630 ], [ 130.856348, -12.451010 ], [ 130.867018, -12.440600 ], [ 130.850049, -12.438844 ], [ 130.850938, -12.467663 ], [ 130.844252, -12.471788 ], [ 130.832610, -12.459755 ], [ 130.821110, -12.461886 ], [ 130.815427, -12.453013 ], [ 130.831387, -12.449953 ], [ 130.835559, -12.426717 ], [ 130.828218, -12.411630 ], [ 130.819608, -12.414580 ], [ 130.816378, -12.407130 ], [ 130.843158, -12.407760 ], [ 130.848725, -12.390553 ], [ 130.842149, -12.378908 ], [ 130.861147, -12.375780 ], [ 130.896007, -12.330060 ], [ 130.923387, -12.344810 ], [ 130.946027, -12.342050 ], [ 130.946057, -12.357190 ], [ 130.950097, -12.346040 ], [ 130.982797, -12.341870 ], [ 131.004777, -12.352210 ], [ 131.012507, -12.367000 ], [ 131.013245, -12.366287 ], [ 131.013197, -12.366320 ], [ 131.008917, -12.356380 ], [ 131.034867, -12.360879 ], [ 131.055047, -12.347789 ], [ 131.029817, -12.346399 ], [ 131.029767, -12.325609 ], [ 131.060957, -12.332129 ], [ 131.028017, -12.317819 ], [ 131.028447, -12.305499 ], [ 131.017697, -12.326879 ], [ 131.012977, -12.323279 ], [ 131.030457, -12.231509 ], [ 131.021577, -12.216269 ], [ 131.004677, -12.209079 ], [ 130.994627, -12.186059 ], [ 130.995967, -12.168649 ], [ 131.030606, -12.146439 ], [ 131.045866, -12.142789 ], [ 131.051766, -12.158259 ], [ 131.065336, -12.166809 ], [ 131.087576, -12.153769 ], [ 131.113196, -12.155059 ], [ 131.114346, -12.175049 ], [ 131.125436, -12.182589 ], [ 131.144276, -12.182429 ], [ 131.157555, -12.168839 ], [ 131.169055, -12.173219 ], [ 131.175956, -12.192099 ], [ 131.222045, -12.227179 ], [ 131.207830, -12.239412 ], [ 131.209786, -12.239639 ], [ 131.205976, -12.270389 ], [ 131.232045, -12.266789 ], [ 131.221966, -12.278009 ], [ 131.225006, -12.285039 ], [ 131.222886, -12.277889 ], [ 131.229075, -12.273239 ], [ 131.228525, -12.281379 ], [ 131.233995, -12.266339 ], [ 131.206986, -12.263139 ], [ 131.212316, -12.240189 ], [ 131.250875, -12.220029 ], [ 131.231075, -12.214389 ], [ 131.228875, -12.207279 ], [ 131.253885, -12.162809 ], [ 131.250816, -12.135939 ], [ 131.273556, -12.100129 ], [ 131.266356, -12.076929 ], [ 131.297126, -12.042609 ], [ 131.303356, -12.052989 ], [ 131.299506, -12.070169 ], [ 131.320925, -12.089869 ], [ 131.313885, -12.112699 ], [ 131.321835, -12.122619 ], [ 131.312905, -12.132449 ], [ 131.322835, -12.147239 ], [ 131.314055, -12.165679 ], [ 131.322765, -12.193429 ], [ 131.380875, -12.256490 ], [ 131.426776, -12.275411 ], [ 131.472295, -12.283712 ], [ 131.548072, -12.278212 ], [ 131.682820, -12.284741 ], [ 131.775300, -12.268231 ], [ 131.879259, -12.214551 ], [ 131.904229, -12.224351 ], [ 131.917488, -12.255891 ], [ 131.939408, -12.272931 ], [ 132.069714, -12.303540 ], [ 132.073894, -12.288980 ], [ 132.147633, -12.245850 ], [ 132.170803, -12.213280 ], [ 132.224352, -12.194571 ], [ 132.238192, -12.169761 ], [ 132.261723, -12.173431 ], [ 132.264283, -12.203021 ], [ 132.278463, -12.224211 ], [ 132.353164, -12.198823 ], [ 132.389393, -12.236413 ], [ 132.417113, -12.222413 ], [ 132.417583, -12.195333 ], [ 132.442013, -12.146473 ], [ 132.513032, -12.124144 ], [ 132.554812, -12.098304 ], [ 132.556212, -12.085774 ], [ 132.578382, -12.105474 ], [ 132.629281, -12.085415 ], [ 132.618962, -12.016715 ], [ 132.638692, -11.942775 ], [ 132.640803, -11.901335 ], [ 132.655323, -11.889815 ], [ 132.645613, -11.875145 ], [ 132.647873, -11.858235 ], [ 132.636523, -11.822025 ], [ 132.618483, -11.805005 ], [ 132.594944, -11.805325 ], [ 132.580704, -11.786005 ], [ 132.596714, -11.767885 ], [ 132.620604, -11.758145 ], [ 132.648944, -11.722446 ], [ 132.654704, -11.685646 ], [ 132.643004, -11.681586 ], [ 132.630954, -11.720466 ], [ 132.594684, -11.730045 ], [ 132.540155, -11.718195 ], [ 132.518965, -11.687615 ], [ 132.499845, -11.682115 ], [ 132.507376, -11.635725 ], [ 132.557685, -11.636375 ], [ 132.574235, -11.654965 ], [ 132.564595, -11.667415 ], [ 132.576175, -11.655195 ], [ 132.616644, -11.654786 ], [ 132.607075, -11.639956 ], [ 132.594465, -11.639686 ], [ 132.547825, -11.608665 ], [ 132.536256, -11.580276 ], [ 132.549116, -11.574226 ], [ 132.553086, -11.554926 ], [ 132.524826, -11.544996 ], [ 132.531916, -11.520516 ], [ 132.515756, -11.520786 ], [ 132.499766, -11.509546 ], [ 132.494157, -11.482506 ], [ 132.480517, -11.484055 ], [ 132.457147, -11.457755 ], [ 132.399207, -11.454915 ], [ 132.353457, -11.441274 ], [ 132.301928, -11.465094 ], [ 132.238798, -11.455203 ], [ 132.210069, -11.469233 ], [ 132.193809, -11.490203 ], [ 132.167279, -11.491592 ], [ 132.138099, -11.521082 ], [ 132.119809, -11.515232 ], [ 132.119751, -11.514471 ], [ 132.114889, -11.516612 ], [ 132.122609, -11.526422 ], [ 132.113829, -11.539922 ], [ 132.104509, -11.528132 ], [ 132.067880, -11.525002 ], [ 132.055410, -11.496502 ], [ 132.033880, -11.482132 ], [ 132.030240, -11.458862 ], [ 132.050950, -11.460212 ], [ 132.059360, -11.432142 ], [ 132.041220, -11.420422 ], [ 131.996600, -11.430041 ], [ 131.985980, -11.422791 ], [ 131.990140, -11.401471 ], [ 131.962430, -11.411111 ], [ 131.942430, -11.399891 ], [ 131.939810, -11.392321 ], [ 131.959870, -11.380631 ], [ 131.980570, -11.383502 ], [ 131.989010, -11.373342 ], [ 131.968020, -11.369472 ], [ 131.964830, -11.360772 ], [ 131.973640, -11.361922 ], [ 131.975610, -11.351772 ], [ 131.965910, -11.342492 ], [ 131.951260, -11.341212 ], [ 131.951700, -11.351492 ], [ 131.937590, -11.350812 ], [ 131.928230, -11.357862 ], [ 131.930380, -11.365662 ], [ 131.916901, -11.357502 ], [ 131.943540, -11.319862 ], [ 131.933250, -11.316342 ], [ 131.930600, -11.324462 ], [ 131.914691, -11.324762 ], [ 131.859751, -11.292782 ], [ 131.842081, -11.312602 ], [ 131.821121, -11.318292 ], [ 131.773282, -11.325042 ], [ 131.762662, -11.315752 ], [ 131.759282, -11.299712 ], [ 131.772892, -11.302232 ], [ 131.776291, -11.311282 ], [ 131.779901, -11.291302 ], [ 131.800508, -11.295386 ], [ 131.806471, -11.283142 ], [ 131.794391, -11.268323 ], [ 131.815781, -11.268153 ], [ 131.840211, -11.286402 ], [ 131.855191, -11.276743 ], [ 131.848311, -11.253013 ], [ 131.836891, -11.247673 ], [ 131.814801, -11.211703 ], [ 131.821801, -11.206423 ], [ 131.840041, -11.226563 ], [ 131.860441, -11.209123 ], [ 131.856411, -11.219613 ], [ 131.867961, -11.219313 ], [ 131.879361, -11.234923 ], [ 131.886181, -11.207283 ], [ 131.875591, -11.193144 ], [ 131.882481, -11.181534 ], [ 131.912031, -11.206893 ], [ 131.904111, -11.216363 ], [ 131.927510, -11.235043 ], [ 131.929960, -11.259883 ], [ 131.945540, -11.251573 ], [ 131.944760, -11.244463 ], [ 131.961210, -11.253053 ], [ 131.961260, -11.228923 ], [ 131.974170, -11.235163 ], [ 131.986450, -11.218593 ], [ 131.962420, -11.176664 ], [ 131.969980, -11.170814 ], [ 131.982430, -11.180094 ], [ 131.993530, -11.175744 ], [ 131.986450, -11.170854 ], [ 131.985930, -11.150984 ], [ 131.970311, -11.134234 ], [ 131.992971, -11.124244 ], [ 132.010690, -11.129874 ], [ 132.029060, -11.178744 ], [ 132.036990, -11.192783 ], [ 132.047180, -11.191263 ], [ 132.046110, -11.199493 ], [ 132.056730, -11.201923 ], [ 132.054730, -11.191073 ], [ 132.068310, -11.175794 ], [ 132.075500, -11.179554 ], [ 132.066400, -11.191703 ], [ 132.082620, -11.194723 ], [ 132.075450, -11.209363 ], [ 132.084489, -11.231533 ], [ 132.098559, -11.231943 ], [ 132.113539, -11.211133 ], [ 132.113879, -11.234173 ], [ 132.095759, -11.262083 ], [ 132.100499, -11.274753 ], [ 132.114149, -11.268493 ], [ 132.116409, -11.273703 ], [ 132.098289, -11.302853 ], [ 132.107269, -11.315323 ], [ 132.099979, -11.329053 ], [ 132.108799, -11.328533 ], [ 132.122649, -11.349273 ], [ 132.125019, -11.313043 ], [ 132.136779, -11.296163 ], [ 132.140919, -11.315043 ], [ 132.155869, -11.322683 ], [ 132.145389, -11.356383 ], [ 132.153609, -11.360153 ], [ 132.154109, -11.374493 ], [ 132.144679, -11.382353 ], [ 132.157959, -11.382533 ], [ 132.152029, -11.391973 ], [ 132.169279, -11.406983 ], [ 132.164259, -11.412643 ], [ 132.170359, -11.420423 ], [ 132.180799, -11.416293 ], [ 132.175969, -11.396853 ], [ 132.199109, -11.417433 ], [ 132.208129, -11.413403 ], [ 132.206189, -11.398133 ], [ 132.197839, -11.397523 ], [ 132.199969, -11.382513 ], [ 132.188419, -11.380093 ], [ 132.182889, -11.365383 ], [ 132.190289, -11.350963 ], [ 132.222128, -11.369643 ], [ 132.231338, -11.363003 ], [ 132.236468, -11.339893 ], [ 132.226728, -11.321453 ], [ 132.197519, -11.301203 ], [ 132.172569, -11.323443 ], [ 132.197079, -11.280013 ], [ 132.190229, -11.248553 ], [ 132.179889, -11.240723 ], [ 132.188669, -11.241543 ], [ 132.199039, -11.225784 ], [ 132.199399, -11.237304 ], [ 132.202469, -11.226814 ], [ 132.194549, -11.207694 ], [ 132.160809, -11.183704 ], [ 132.161959, -11.160794 ], [ 132.141250, -11.153674 ], [ 132.143450, -11.133824 ], [ 132.135610, -11.122384 ], [ 132.186810, -11.130314 ], [ 132.196019, -11.164904 ], [ 132.211489, -11.183164 ], [ 132.227519, -11.180304 ], [ 132.230869, -11.196804 ], [ 132.243459, -11.197424 ], [ 132.239809, -11.218524 ], [ 132.249859, -11.221624 ], [ 132.265338, -11.263814 ], [ 132.283548, -11.276724 ], [ 132.281568, -11.233084 ], [ 132.264658, -11.213554 ], [ 132.273989, -11.199374 ], [ 132.265069, -11.175394 ], [ 132.287879, -11.164874 ], [ 132.305688, -11.173205 ], [ 132.322198, -11.165595 ], [ 132.319498, -11.155875 ], [ 132.338898, -11.140365 ], [ 132.333289, -11.115725 ], [ 132.343678, -11.119945 ], [ 132.341328, -11.133945 ], [ 132.356938, -11.148915 ], [ 132.364908, -11.193765 ], [ 132.382308, -11.207975 ], [ 132.373688, -11.295455 ], [ 132.384368, -11.287375 ], [ 132.385698, -11.296865 ], [ 132.397367, -11.299155 ], [ 132.406098, -11.264535 ], [ 132.414087, -11.269995 ], [ 132.422247, -11.262235 ], [ 132.413648, -11.237915 ], [ 132.419998, -11.225635 ], [ 132.433927, -11.211325 ], [ 132.451037, -11.218075 ], [ 132.476747, -11.258415 ], [ 132.506787, -11.272276 ], [ 132.505137, -11.284126 ], [ 132.497247, -11.282176 ], [ 132.486817, -11.299486 ], [ 132.510137, -11.292736 ], [ 132.505267, -11.310106 ], [ 132.517147, -11.317046 ], [ 132.503517, -11.318456 ], [ 132.501877, -11.329936 ], [ 132.512507, -11.330916 ], [ 132.519897, -11.345406 ], [ 132.514157, -11.349896 ], [ 132.528497, -11.340466 ], [ 132.547046, -11.342006 ], [ 132.559196, -11.367916 ], [ 132.585446, -11.394547 ], [ 132.622016, -11.410267 ], [ 132.635436, -11.436637 ], [ 132.637815, -11.477527 ], [ 132.669005, -11.515587 ], [ 132.694625, -11.514207 ], [ 132.714525, -11.523307 ], [ 132.732875, -11.519077 ], [ 132.747845, -11.495287 ], [ 132.778174, -11.470077 ], [ 132.783854, -11.446377 ], [ 132.811374, -11.438097 ], [ 132.825514, -11.420737 ], [ 132.823154, -11.404687 ], [ 132.842194, -11.395137 ], [ 132.850333, -11.392566 ], [ 132.864003, -11.419036 ], [ 132.873063, -11.416906 ], [ 132.885853, -11.429826 ], [ 132.896403, -11.425896 ], [ 132.909183, -11.384706 ], [ 132.880463, -11.347456 ], [ 132.865023, -11.340066 ], [ 132.872033, -11.329806 ], [ 132.897893, -11.339925 ], [ 132.917953, -11.331725 ], [ 132.933332, -11.363625 ], [ 132.945232, -11.367605 ], [ 132.968132, -11.416805 ], [ 133.007852, -11.432825 ], [ 133.045962, -11.502846 ], [ 133.076861, -11.520985 ], [ 133.069591, -11.548306 ], [ 133.094141, -11.591176 ], [ 133.105631, -11.633116 ], [ 133.149872, -11.702237 ], [ 133.190651, -11.728637 ], [ 133.281590, -11.740646 ], [ 133.252581, -11.730766 ], [ 133.283920, -11.717706 ], [ 133.295520, -11.702806 ], [ 133.343359, -11.693715 ], [ 133.354458, -11.717905 ], [ 133.340569, -11.727155 ], [ 133.320389, -11.719556 ], [ 133.308089, -11.738986 ], [ 133.309839, -11.758176 ], [ 133.320889, -11.769845 ], [ 133.353138, -11.764685 ], [ 133.356908, -11.775545 ], [ 133.369628, -11.776115 ], [ 133.376418, -11.767425 ], [ 133.369208, -11.757705 ], [ 133.385618, -11.752065 ], [ 133.402837, -11.732084 ], [ 133.415567, -11.739444 ], [ 133.410057, -11.748135 ], [ 133.414627, -11.757525 ], [ 133.398797, -11.757505 ], [ 133.398677, -11.767785 ], [ 133.410367, -11.779555 ], [ 133.448107, -11.778345 ], [ 133.448097, -11.790435 ], [ 133.459107, -11.801975 ], [ 133.480117, -11.781304 ], [ 133.501157, -11.781224 ], [ 133.533786, -11.760334 ], [ 133.539506, -11.770284 ], [ 133.528917, -11.791094 ], [ 133.530127, -11.812984 ], [ 133.549167, -11.826994 ], [ 133.565596, -11.806804 ], [ 133.602136, -11.809164 ], [ 133.606986, -11.816344 ], [ 133.595156, -11.833724 ], [ 133.611086, -11.842784 ], [ 133.663126, -11.818904 ], [ 133.655866, -11.809054 ], [ 133.678026, -11.788633 ], [ 133.692006, -11.794073 ], [ 133.664616, -11.779583 ], [ 133.670126, -11.773943 ], [ 133.690646, -11.782773 ], [ 133.738465, -11.782583 ], [ 133.773585, -11.761143 ], [ 133.785865, -11.732123 ], [ 133.793785, -11.727492 ], [ 133.808654, -11.733792 ], [ 133.793905, -11.724672 ], [ 133.812364, -11.730212 ], [ 133.837014, -11.723222 ], [ 133.848154, -11.744432 ], [ 133.867534, -11.753922 ], [ 133.899394, -11.754191 ], [ 133.915564, -11.742441 ], [ 133.927604, -11.764141 ], [ 133.940344, -11.770351 ], [ 133.916254, -11.772381 ], [ 133.901684, -11.805711 ], [ 133.889865, -11.812372 ], [ 133.867615, -11.805132 ], [ 133.846505, -11.813482 ], [ 133.823085, -11.838102 ], [ 133.829615, -11.864992 ], [ 133.831915, -11.858782 ], [ 133.842115, -11.879912 ], [ 133.858295, -11.877992 ], [ 133.877905, -11.902512 ], [ 133.867695, -11.901382 ], [ 133.876015, -11.910522 ], [ 133.895355, -11.913812 ], [ 133.912395, -11.906891 ], [ 133.907715, -11.927621 ], [ 133.919905, -11.916761 ], [ 133.933185, -11.920261 ], [ 133.984055, -11.894961 ], [ 134.004474, -11.863780 ], [ 134.030774, -11.854970 ], [ 134.063564, -11.869520 ], [ 134.063914, -11.892230 ], [ 134.078374, -11.898200 ], [ 134.068515, -11.915950 ], [ 134.071625, -11.933460 ], [ 134.065995, -11.934320 ], [ 134.074835, -11.941820 ], [ 134.080915, -11.929620 ], [ 134.101685, -11.924519 ], [ 134.104514, -11.912889 ], [ 134.127154, -11.897279 ], [ 134.134164, -11.920599 ], [ 134.175395, -11.956789 ], [ 134.168545, -11.972499 ], [ 134.149905, -11.963459 ], [ 134.151995, -11.987989 ], [ 134.172945, -12.002259 ], [ 134.181735, -11.994179 ], [ 134.181065, -12.014979 ], [ 134.194245, -12.028678 ], [ 134.162236, -12.100449 ], [ 134.168416, -12.114769 ], [ 134.188036, -12.105348 ], [ 134.193755, -12.074468 ], [ 134.228395, -12.036468 ], [ 134.253515, -12.034148 ], [ 134.245784, -11.984748 ], [ 134.286654, -11.983797 ], [ 134.306484, -12.008447 ], [ 134.348035, -12.039126 ], [ 134.416195, -12.064506 ], [ 134.470304, -12.067475 ], [ 134.462605, -12.069875 ], [ 134.479574, -12.075875 ], [ 134.492834, -12.071605 ], [ 134.490904, -12.077235 ], [ 134.605064, -12.048994 ], [ 134.655863, -12.015103 ], [ 134.687823, -11.962833 ], [ 134.703333, -11.967083 ], [ 134.739702, -11.959872 ], [ 134.747592, -11.949342 ], [ 134.770812, -11.959782 ], [ 134.760703, -11.995172 ], [ 134.779523, -12.003402 ], [ 134.798173, -12.047782 ], [ 134.830173, -12.056091 ], [ 134.837003, -12.074901 ], [ 134.831653, -12.055511 ], [ 134.844233, -12.061611 ], [ 134.841944, -12.112171 ], [ 134.856814, -12.131031 ], [ 134.885214, -12.134271 ], [ 134.904804, -12.153201 ], [ 134.935374, -12.142510 ], [ 134.971594, -12.158390 ], [ 135.004564, -12.212960 ], [ 135.056034, -12.263609 ], [ 135.124104, -12.237389 ], [ 135.137764, -12.242839 ], [ 135.144674, -12.236739 ], [ 135.160154, -12.249769 ], [ 135.164264, -12.264819 ], [ 135.213054, -12.295298 ], [ 135.218924, -12.288638 ], [ 135.209874, -12.274268 ], [ 135.183244, -12.253538 ], [ 135.181434, -12.239058 ], [ 135.159844, -12.231789 ], [ 135.161584, -12.225009 ], [ 135.193284, -12.225848 ], [ 135.207484, -12.234528 ], [ 135.267043, -12.224928 ], [ 135.283324, -12.252878 ], [ 135.313074, -12.260258 ], [ 135.342493, -12.246377 ], [ 135.352043, -12.232247 ], [ 135.312173, -12.241598 ], [ 135.280263, -12.220988 ], [ 135.276043, -12.200398 ], [ 135.256723, -12.207958 ], [ 135.223323, -12.188688 ], [ 135.269053, -12.179708 ], [ 135.284473, -12.164008 ], [ 135.302962, -12.162898 ], [ 135.319172, -12.145388 ], [ 135.304252, -12.135758 ], [ 135.305992, -12.124338 ], [ 135.352982, -12.105957 ], [ 135.366211, -12.084717 ], [ 135.386521, -12.092757 ], [ 135.396871, -12.082027 ], [ 135.422581, -12.083057 ], [ 135.405231, -12.101817 ], [ 135.415332, -12.113917 ], [ 135.454371, -12.114057 ], [ 135.507861, -12.085906 ], [ 135.519041, -12.059806 ], [ 135.538441, -12.064456 ], [ 135.544871, -12.087636 ], [ 135.570011, -12.100746 ], [ 135.603771, -12.078476 ], [ 135.615631, -12.078336 ], [ 135.605381, -12.076896 ], [ 135.643060, -12.054625 ], [ 135.649710, -12.059055 ], [ 135.643640, -12.053385 ], [ 135.653550, -12.039505 ], [ 135.684250, -12.034595 ], [ 135.727399, -12.009145 ], [ 135.754489, -12.007775 ], [ 135.808389, -11.981314 ], [ 135.886568, -11.965704 ], [ 135.909888, -11.952393 ], [ 135.911248, -11.959963 ], [ 135.877479, -11.986144 ], [ 135.869689, -11.975744 ], [ 135.831679, -11.984284 ], [ 135.826499, -11.995354 ], [ 135.832759, -12.000714 ], [ 135.772760, -12.043944 ], [ 135.758540, -12.079455 ], [ 135.731230, -12.090315 ], [ 135.700451, -12.126055 ], [ 135.659231, -12.149925 ], [ 135.650052, -12.168475 ], [ 135.652002, -12.201705 ], [ 135.676822, -12.241725 ], [ 135.710262, -12.262515 ], [ 135.720723, -12.281165 ], [ 135.710377, -12.312562 ], [ 135.730263, -12.293485 ], [ 135.746222, -12.262495 ], [ 135.762072, -12.253784 ], [ 135.776322, -12.259084 ], [ 135.778252, -12.224944 ], [ 135.798352, -12.212044 ], [ 135.803621, -12.198924 ], [ 135.815911, -12.201174 ], [ 135.825201, -12.184434 ], [ 135.828541, -12.191324 ], [ 135.838681, -12.182074 ], [ 135.850471, -12.184074 ], [ 135.855281, -12.169144 ], [ 135.864361, -12.174224 ], [ 135.865840, -12.158624 ], [ 135.881220, -12.150694 ], [ 135.886280, -12.150684 ], [ 135.881591, -12.177374 ], [ 135.894921, -12.184934 ], [ 135.912230, -12.149754 ], [ 135.921870, -12.149293 ], [ 135.928430, -12.161943 ], [ 135.935650, -12.143393 ], [ 135.948170, -12.150273 ], [ 135.948619, -12.138513 ], [ 135.950010, -12.151293 ], [ 135.959080, -12.151953 ], [ 135.959979, -12.137033 ], [ 135.972329, -12.137413 ], [ 136.002099, -12.116853 ], [ 135.996339, -12.105443 ], [ 136.004829, -12.100453 ], [ 135.996789, -12.093113 ], [ 136.003659, -12.083953 ], [ 136.031549, -12.076222 ], [ 136.034629, -12.066262 ], [ 136.045759, -12.063082 ], [ 136.011979, -12.123393 ], [ 135.983080, -12.151923 ], [ 135.973480, -12.185283 ], [ 135.957860, -12.182033 ], [ 135.955350, -12.196843 ], [ 135.942260, -12.199343 ], [ 135.928041, -12.222093 ], [ 135.933111, -12.237233 ], [ 135.956221, -12.249633 ], [ 135.962222, -12.269643 ], [ 135.950052, -12.279043 ], [ 136.001161, -12.268113 ], [ 136.010551, -12.242323 ], [ 136.019273, -12.245398 ], [ 136.013521, -12.233273 ], [ 136.028121, -12.240032 ], [ 136.049241, -12.231752 ], [ 136.061201, -12.240882 ], [ 136.054131, -12.269042 ], [ 136.033911, -12.271002 ], [ 136.029922, -12.294752 ], [ 136.009012, -12.290823 ], [ 136.007422, -12.303833 ], [ 136.015922, -12.304382 ], [ 136.023642, -12.319292 ], [ 136.008152, -12.331183 ], [ 135.995323, -12.359803 ], [ 135.975683, -12.369223 ], [ 135.970893, -12.386763 ], [ 135.975603, -12.395113 ], [ 135.996073, -12.400053 ], [ 136.015493, -12.397082 ], [ 135.993254, -12.440983 ], [ 136.003624, -12.453512 ], [ 135.988914, -12.462353 ], [ 136.015354, -12.457342 ], [ 136.014474, -12.484922 ], [ 136.021374, -12.486152 ], [ 136.033654, -12.473472 ], [ 136.051594, -12.479342 ], [ 136.046274, -12.457062 ], [ 136.063703, -12.430012 ], [ 136.075783, -12.434962 ], [ 136.073623, -12.448082 ], [ 136.085823, -12.457442 ], [ 136.104903, -12.453112 ], [ 136.107983, -12.439082 ], [ 136.121113, -12.452402 ], [ 136.151423, -12.435491 ], [ 136.159603, -12.444401 ], [ 136.158394, -12.470521 ], [ 136.158954, -12.463281 ], [ 136.169074, -12.461571 ], [ 136.231734, -12.465720 ], [ 136.249394, -12.445440 ], [ 136.259704, -12.456440 ], [ 136.252834, -12.443400 ], [ 136.263294, -12.441450 ], [ 136.314173, -12.381859 ], [ 136.303813, -12.376350 ], [ 136.304013, -12.367530 ], [ 136.333092, -12.326649 ], [ 136.325462, -12.306889 ], [ 136.341992, -12.301299 ], [ 136.353871, -12.277189 ], [ 136.368461, -12.278509 ], [ 136.342921, -12.265239 ], [ 136.362771, -12.257499 ], [ 136.359140, -12.230379 ], [ 136.353110, -12.211409 ], [ 136.342070, -12.206009 ], [ 136.345820, -12.200169 ], [ 136.334370, -12.202979 ], [ 136.337000, -12.195659 ], [ 136.315440, -12.210720 ], [ 136.288210, -12.205360 ], [ 136.228270, -12.213191 ], [ 136.218910, -12.187331 ], [ 136.232110, -12.182661 ], [ 136.208230, -12.184751 ], [ 136.190560, -12.195531 ], [ 136.172180, -12.192061 ], [ 136.168940, -12.178161 ], [ 136.176039, -12.168771 ], [ 136.167409, -12.163021 ], [ 136.176819, -12.158031 ], [ 136.195199, -12.163071 ], [ 136.217229, -12.152401 ], [ 136.212589, -12.130821 ], [ 136.230389, -12.131681 ], [ 136.231739, -12.118451 ], [ 136.246869, -12.110510 ], [ 136.267088, -12.065010 ], [ 136.326148, -12.045539 ], [ 136.331808, -12.059089 ], [ 136.339388, -12.059179 ], [ 136.348758, -12.043889 ], [ 136.344027, -12.032829 ], [ 136.355147, -12.030989 ], [ 136.357417, -12.021149 ], [ 136.369947, -12.027669 ], [ 136.367497, -12.011399 ], [ 136.378757, -12.019619 ], [ 136.389697, -12.011339 ], [ 136.382387, -11.997449 ], [ 136.414836, -11.958678 ], [ 136.426086, -11.958438 ], [ 136.430797, -11.971088 ], [ 136.445696, -11.954128 ], [ 136.443966, -11.941478 ], [ 136.492406, -11.952617 ], [ 136.513896, -11.936017 ], [ 136.523296, -11.939207 ], [ 136.531175, -11.914597 ], [ 136.548246, -11.923347 ], [ 136.561355, -11.917507 ], [ 136.573785, -11.902057 ], [ 136.557645, -11.886307 ], [ 136.562955, -11.876607 ], [ 136.568755, -11.894017 ], [ 136.581815, -11.902866 ], [ 136.580405, -11.915526 ], [ 136.534186, -11.947257 ], [ 136.472096, -11.960318 ], [ 136.472827, -11.996588 ], [ 136.456057, -11.978868 ], [ 136.448947, -11.987458 ], [ 136.451973, -11.999452 ], [ 136.457087, -11.999948 ], [ 136.455837, -12.005718 ], [ 136.469817, -11.999688 ], [ 136.477457, -12.018198 ], [ 136.488837, -12.024038 ], [ 136.485942, -12.034463 ], [ 136.490457, -12.030818 ], [ 136.488997, -12.040088 ], [ 136.492057, -12.027307 ], [ 136.498257, -12.028987 ], [ 136.496017, -12.009547 ], [ 136.505977, -12.003407 ], [ 136.503047, -11.997897 ], [ 136.512256, -11.987997 ], [ 136.531076, -11.991437 ], [ 136.564986, -12.081298 ], [ 136.580688, -12.091146 ], [ 136.587238, -12.084486 ], [ 136.590308, -12.095106 ], [ 136.581198, -12.107786 ], [ 136.587008, -12.125586 ], [ 136.577748, -12.146067 ], [ 136.599310, -12.202296 ], [ 136.646440, -12.235496 ], [ 136.647501, -12.269716 ], [ 136.674801, -12.288175 ], [ 136.669421, -12.277665 ], [ 136.691251, -12.276015 ], [ 136.705701, -12.288465 ], [ 136.720910, -12.266925 ], [ 136.726290, -12.276085 ], [ 136.742270, -12.271824 ], [ 136.766120, -12.235054 ], [ 136.751200, -12.232994 ], [ 136.752159, -12.214144 ], [ 136.723180, -12.229785 ], [ 136.729079, -12.211385 ], [ 136.698689, -12.190325 ], [ 136.677080, -12.205625 ], [ 136.681359, -12.186335 ], [ 136.714319, -12.186965 ], [ 136.725469, -12.182475 ], [ 136.727099, -12.172425 ], [ 136.782358, -12.159094 ], [ 136.790729, -12.185103 ], [ 136.818199, -12.211553 ], [ 136.846679, -12.210243 ], [ 136.873198, -12.219653 ], [ 136.884471, -12.243666 ], [ 136.905089, -12.245954 ], [ 136.902389, -12.280773 ], [ 136.911689, -12.283273 ], [ 136.914919, -12.275713 ], [ 136.928109, -12.282722 ], [ 136.939239, -12.324072 ], [ 136.933899, -12.333872 ], [ 136.921119, -12.344243 ], [ 136.944319, -12.357942 ], [ 136.964208, -12.350282 ], [ 136.965258, -12.340802 ], [ 136.978918, -12.345442 ], [ 136.961778, -12.363822 ], [ 136.962688, -12.374552 ], [ 136.945459, -12.369792 ], [ 136.899690, -12.392433 ], [ 136.889890, -12.413653 ], [ 136.863311, -12.431343 ], [ 136.805132, -12.506344 ], [ 136.779003, -12.525274 ], [ 136.772733, -12.555524 ], [ 136.760713, -12.525694 ], [ 136.775953, -12.496134 ], [ 136.795842, -12.492214 ], [ 136.794432, -12.449754 ], [ 136.775932, -12.447324 ], [ 136.759103, -12.467424 ], [ 136.735403, -12.478564 ], [ 136.720943, -12.458235 ], [ 136.719243, -12.468605 ], [ 136.729533, -12.478324 ], [ 136.721763, -12.493955 ], [ 136.742223, -12.517864 ], [ 136.726903, -12.529024 ], [ 136.733443, -12.536144 ], [ 136.748393, -12.533914 ], [ 136.730974, -12.562904 ], [ 136.728924, -12.553864 ], [ 136.720064, -12.553845 ], [ 136.714294, -12.566265 ], [ 136.693814, -12.567355 ], [ 136.691584, -12.587555 ], [ 136.675844, -12.581205 ], [ 136.669265, -12.590565 ], [ 136.680395, -12.603575 ], [ 136.676855, -12.593625 ], [ 136.681675, -12.598605 ], [ 136.682954, -12.590815 ], [ 136.696074, -12.586665 ], [ 136.697144, -12.569165 ], [ 136.715774, -12.571905 ], [ 136.723724, -12.562775 ], [ 136.734864, -12.570924 ], [ 136.747443, -12.551644 ], [ 136.761883, -12.577404 ], [ 136.735424, -12.579174 ], [ 136.690575, -12.632275 ], [ 136.678645, -12.669065 ], [ 136.681015, -12.687585 ], [ 136.699046, -12.704105 ], [ 136.693856, -12.711095 ], [ 136.675346, -12.704395 ], [ 136.652776, -12.711355 ], [ 136.617426, -12.689846 ], [ 136.631276, -12.700245 ], [ 136.611336, -12.714886 ], [ 136.601037, -12.740266 ], [ 136.619757, -12.756676 ], [ 136.624777, -12.773965 ], [ 136.608447, -12.814925 ], [ 136.621747, -12.839455 ], [ 136.587287, -12.821586 ], [ 136.580617, -12.804026 ], [ 136.583787, -12.778956 ], [ 136.605517, -12.790076 ], [ 136.581977, -12.767096 ], [ 136.567477, -12.763796 ], [ 136.549817, -12.740376 ], [ 136.532077, -12.745416 ], [ 136.525477, -12.758276 ], [ 136.531238, -12.801876 ], [ 136.542848, -12.806756 ], [ 136.517748, -12.807146 ], [ 136.483378, -12.768027 ], [ 136.467878, -12.780167 ], [ 136.463708, -12.772047 ], [ 136.468038, -12.793507 ], [ 136.487978, -12.801577 ], [ 136.478618, -12.841577 ], [ 136.505878, -12.851836 ], [ 136.518258, -12.875466 ], [ 136.538848, -12.881616 ], [ 136.552458, -12.874196 ], [ 136.542838, -12.896306 ], [ 136.546248, -12.916306 ], [ 136.555218, -12.920126 ], [ 136.559148, -12.914186 ], [ 136.598158, -12.930075 ], [ 136.625398, -12.952945 ], [ 136.638077, -12.950715 ], [ 136.644898, -12.990475 ], [ 136.667967, -13.004314 ], [ 136.654497, -13.015825 ], [ 136.629238, -13.017395 ], [ 136.635168, -13.001605 ], [ 136.627498, -12.994725 ], [ 136.627538, -12.974625 ], [ 136.617648, -12.967605 ], [ 136.600858, -12.975115 ], [ 136.598128, -12.989925 ], [ 136.580068, -13.001335 ], [ 136.584458, -13.018435 ], [ 136.562499, -13.018115 ], [ 136.569089, -12.997825 ], [ 136.551139, -12.986776 ], [ 136.564399, -12.981386 ], [ 136.558679, -12.964996 ], [ 136.539539, -12.970376 ], [ 136.542399, -12.979186 ], [ 136.531909, -12.982216 ], [ 136.531769, -12.991926 ], [ 136.519939, -12.976766 ], [ 136.491889, -12.992466 ], [ 136.474329, -12.977386 ], [ 136.455209, -12.978237 ], [ 136.452719, -12.991357 ], [ 136.477959, -12.995906 ], [ 136.480639, -13.006456 ], [ 136.484069, -12.998026 ], [ 136.507099, -12.996606 ], [ 136.510659, -13.016026 ], [ 136.535289, -13.018976 ], [ 136.532889, -13.051946 ], [ 136.566709, -13.058835 ], [ 136.538979, -13.110765 ], [ 136.531170, -13.154425 ], [ 136.514360, -13.139905 ], [ 136.498552, -13.140350 ], [ 136.500870, -13.141846 ], [ 136.479310, -13.169676 ], [ 136.483910, -13.184865 ], [ 136.473950, -13.201665 ], [ 136.475590, -13.234315 ], [ 136.467780, -13.247545 ], [ 136.454891, -13.254706 ], [ 136.446831, -13.248476 ], [ 136.454161, -13.224436 ], [ 136.439651, -13.217386 ], [ 136.436961, -13.230596 ], [ 136.399901, -13.243256 ], [ 136.358172, -13.309886 ], [ 136.343012, -13.325876 ], [ 136.331362, -13.324706 ], [ 136.331632, -13.311716 ], [ 136.318982, -13.298577 ], [ 136.338092, -13.276606 ], [ 136.328142, -13.250027 ], [ 136.350642, -13.246036 ], [ 136.367581, -13.252696 ], [ 136.388071, -13.227066 ], [ 136.380461, -13.203026 ], [ 136.366131, -13.196836 ], [ 136.369801, -13.166577 ], [ 136.356031, -13.147107 ], [ 136.371551, -13.139527 ], [ 136.354071, -13.116497 ], [ 136.368711, -13.108847 ], [ 136.362650, -13.092567 ], [ 136.371430, -13.070447 ], [ 136.363920, -13.056307 ], [ 136.335470, -13.044857 ], [ 136.333420, -13.034147 ], [ 136.331261, -13.047407 ], [ 136.308781, -13.071487 ], [ 136.306511, -13.093507 ], [ 136.291481, -13.107577 ], [ 136.311651, -13.108887 ], [ 136.321181, -13.120107 ], [ 136.306681, -13.144797 ], [ 136.315631, -13.159627 ], [ 136.283082, -13.168097 ], [ 136.281411, -13.151827 ], [ 136.288701, -13.145187 ], [ 136.273782, -13.158577 ], [ 136.256262, -13.154668 ], [ 136.259222, -13.132768 ], [ 136.252562, -13.121288 ], [ 136.243382, -13.145588 ], [ 136.218042, -13.138268 ], [ 136.223082, -13.146308 ], [ 136.214062, -13.154288 ], [ 136.231242, -13.155148 ], [ 136.235802, -13.169738 ], [ 136.247202, -13.173508 ], [ 136.235272, -13.187578 ], [ 136.245162, -13.212467 ], [ 136.238812, -13.204558 ], [ 136.218492, -13.203788 ], [ 136.213422, -13.233248 ], [ 136.201372, -13.246988 ], [ 136.186422, -13.244938 ], [ 136.174902, -13.232988 ], [ 136.161943, -13.242088 ], [ 136.159373, -13.251688 ], [ 136.183853, -13.274708 ], [ 136.181633, -13.280798 ], [ 136.155503, -13.266578 ], [ 136.147752, -13.218888 ], [ 136.134172, -13.207299 ], [ 136.150192, -13.183528 ], [ 136.153092, -13.145699 ], [ 136.145152, -13.120549 ], [ 136.099082, -13.158579 ], [ 136.107902, -13.172399 ], [ 136.077753, -13.209549 ], [ 136.084353, -13.232629 ], [ 136.064193, -13.226329 ], [ 136.053193, -13.234409 ], [ 136.050593, -13.249309 ], [ 136.062073, -13.263149 ], [ 136.047214, -13.309849 ], [ 136.036874, -13.299189 ], [ 136.041884, -13.289159 ], [ 136.030433, -13.243239 ], [ 136.012103, -13.214910 ], [ 135.998023, -13.212950 ], [ 135.979143, -13.222640 ], [ 135.963624, -13.294790 ], [ 135.948314, -13.253440 ], [ 135.918654, -13.268430 ], [ 135.908604, -13.286780 ], [ 135.913314, -13.295070 ], [ 135.886634, -13.323680 ], [ 135.879975, -13.363070 ], [ 135.905755, -13.379020 ], [ 135.920635, -13.377550 ], [ 135.925635, -13.396280 ], [ 135.919085, -13.404440 ], [ 135.926455, -13.417749 ], [ 135.965165, -13.410479 ], [ 135.972985, -13.402329 ], [ 135.961075, -13.445589 ], [ 135.951826, -13.448149 ], [ 135.945305, -13.435009 ], [ 135.929455, -13.442399 ], [ 135.935726, -13.458239 ], [ 135.931246, -13.466819 ], [ 135.919546, -13.462459 ], [ 135.894325, -13.425170 ], [ 135.872605, -13.428900 ], [ 135.859726, -13.440240 ], [ 135.863696, -13.476870 ], [ 135.855046, -13.519980 ], [ 135.865047, -13.531440 ], [ 135.869277, -13.561739 ], [ 135.839737, -13.566360 ], [ 135.835287, -13.590830 ], [ 135.843037, -13.612979 ], [ 135.865167, -13.622269 ], [ 135.871228, -13.656649 ], [ 135.880628, -13.669089 ], [ 135.907398, -13.658179 ], [ 135.921638, -13.675979 ], [ 135.889108, -13.688029 ], [ 135.877828, -13.700399 ], [ 135.879388, -13.712039 ], [ 135.914498, -13.747239 ], [ 135.956238, -13.743358 ], [ 135.978168, -13.731618 ], [ 135.988287, -13.709958 ], [ 136.009047, -13.707448 ], [ 136.012417, -13.688488 ], [ 136.033597, -13.682478 ], [ 136.025907, -13.652058 ], [ 136.040067, -13.656068 ], [ 136.051416, -13.644778 ], [ 136.083056, -13.655457 ], [ 136.075586, -13.672767 ], [ 136.069126, -13.669857 ], [ 136.054867, -13.680647 ], [ 136.055387, -13.694657 ], [ 136.034257, -13.716478 ], [ 136.035167, -13.746757 ], [ 136.013488, -13.762818 ], [ 136.006418, -13.791598 ], [ 136.015738, -13.828347 ], [ 135.991678, -13.857847 ], [ 135.989078, -13.896127 ], [ 135.969909, -13.913667 ], [ 135.955749, -13.949297 ], [ 135.941039, -13.953747 ], [ 135.909739, -13.990438 ], [ 135.913170, -14.042497 ], [ 135.905240, -14.074617 ], [ 135.891140, -14.094317 ], [ 135.894870, -14.107427 ], [ 135.878770, -14.166827 ], [ 135.903590, -14.190517 ], [ 135.898270, -14.193797 ], [ 135.893030, -14.181367 ], [ 135.881450, -14.181277 ], [ 135.815821, -14.228967 ], [ 135.791151, -14.231517 ], [ 135.794031, -14.226067 ], [ 135.766152, -14.260687 ], [ 135.736252, -14.281947 ], [ 135.702532, -14.271368 ], [ 135.730142, -14.296677 ], [ 135.667743, -14.399167 ], [ 135.670323, -14.424377 ], [ 135.656283, -14.418397 ], [ 135.630993, -14.419537 ], [ 135.628103, -14.427567 ], [ 135.619613, -14.423108 ], [ 135.586564, -14.484718 ], [ 135.589514, -14.505147 ], [ 135.568404, -14.514998 ], [ 135.566784, -14.537497 ], [ 135.555184, -14.536258 ], [ 135.536614, -14.561138 ], [ 135.518414, -14.625477 ], [ 135.527444, -14.640947 ], [ 135.539544, -14.642547 ], [ 135.541054, -14.652717 ], [ 135.519114, -14.653287 ], [ 135.499494, -14.675787 ], [ 135.484865, -14.667087 ], [ 135.465005, -14.675787 ], [ 135.440485, -14.694137 ], [ 135.416335, -14.735027 ], [ 135.405295, -14.736597 ], [ 135.393335, -14.719188 ], [ 135.382075, -14.725738 ], [ 135.393785, -14.771877 ], [ 135.393775, -14.808627 ], [ 135.412355, -14.848547 ], [ 135.410935, -14.873137 ], [ 135.415485, -14.870597 ], [ 135.428035, -14.891747 ], [ 135.431135, -14.910706 ], [ 135.455815, -14.948966 ], [ 135.478818, -14.976060 ], [ 135.579954, -15.045305 ], [ 135.612313, -15.051995 ], [ 135.639733, -15.044445 ], [ 135.657323, -15.052535 ], [ 135.669832, -15.071585 ], [ 135.701872, -15.087524 ], [ 135.724142, -15.116294 ], [ 135.748971, -15.116514 ], [ 135.862790, -15.182743 ], [ 135.925168, -15.249212 ], [ 135.981527, -15.286991 ], [ 136.049786, -15.316790 ], [ 136.071565, -15.339170 ], [ 136.129694, -15.364290 ], [ 136.164673, -15.392339 ], [ 136.209752, -15.392878 ], [ 136.207122, -15.401138 ], [ 136.239712, -15.416088 ], [ 136.241542, -15.448618 ], [ 136.263172, -15.496728 ], [ 136.270412, -15.535779 ], [ 136.290291, -15.572359 ], [ 136.317261, -15.589609 ], [ 136.317491, -15.625989 ], [ 136.326441, -15.601979 ], [ 136.341321, -15.613408 ], [ 136.412070, -15.626158 ], [ 136.468909, -15.666438 ], [ 136.533888, -15.731948 ], [ 136.547587, -15.728898 ], [ 136.540908, -15.739158 ], [ 136.558397, -15.742148 ], [ 136.555458, -15.750398 ], [ 136.568427, -15.741838 ], [ 136.559367, -15.727578 ], [ 136.584917, -15.725048 ], [ 136.621007, -15.706167 ], [ 136.644067, -15.672446 ], [ 136.664927, -15.678486 ], [ 136.671607, -15.663926 ], [ 136.679297, -15.667786 ], [ 136.681827, -15.684616 ], [ 136.696867, -15.683526 ], [ 136.704537, -15.696756 ], [ 136.724127, -15.696345 ], [ 136.682667, -15.777916 ], [ 136.642787, -15.769127 ], [ 136.645412, -15.778971 ], [ 136.658387, -15.781587 ], [ 136.644717, -15.791607 ], [ 136.670497, -15.794147 ], [ 136.678637, -15.805237 ], [ 136.674567, -15.814487 ], [ 136.713767, -15.856807 ], [ 136.714657, -15.877257 ], [ 136.690797, -15.903408 ], [ 136.706377, -15.931228 ], [ 136.729497, -15.932397 ], [ 136.771487, -15.889446 ], [ 136.773207, -15.906387 ], [ 136.760737, -15.916267 ], [ 136.786047, -15.902796 ], [ 136.795777, -15.911796 ], [ 136.795857, -15.904506 ], [ 136.822947, -15.899236 ], [ 136.835187, -15.908286 ], [ 136.856317, -15.907525 ], [ 136.849370, -15.916257 ], [ 136.866467, -15.913635 ], [ 136.871707, -15.923575 ], [ 136.887817, -15.922355 ], [ 136.888767, -15.932285 ], [ 136.892947, -15.924845 ], [ 136.908127, -15.928475 ], [ 136.904617, -15.936495 ], [ 136.944306, -15.932914 ], [ 136.953246, -15.938334 ], [ 136.918756, -15.917084 ], [ 136.912706, -15.899684 ], [ 136.939456, -15.880174 ], [ 136.970386, -15.874893 ], [ 136.966306, -15.861563 ], [ 136.977986, -15.850953 ], [ 136.987306, -15.875133 ], [ 136.998736, -15.880673 ], [ 136.999325, -15.875133 ], [ 137.005855, -15.879323 ], [ 136.997926, -15.869493 ], [ 137.003525, -15.873103 ], [ 137.048095, -15.922252 ], [ 137.083575, -15.944162 ], [ 137.157935, -15.969461 ], [ 137.204085, -15.999341 ], [ 137.254414, -16.012350 ], [ 137.308954, -16.085119 ], [ 137.294925, -16.081120 ], [ 137.354344, -16.114999 ], [ 137.372604, -16.133349 ], [ 137.373554, -16.126419 ], [ 137.381344, -16.137018 ], [ 137.383804, -16.131898 ], [ 137.356924, -16.115629 ], [ 137.388394, -16.126618 ], [ 137.409194, -16.144318 ], [ 137.425724, -16.139258 ], [ 137.498494, -16.168017 ], [ 137.556942, -16.174293 ], [ 137.534312, -16.164233 ], [ 137.573772, -16.174823 ], [ 137.680621, -16.222322 ], [ 137.729671, -16.232252 ], [ 137.740891, -16.261771 ], [ 137.768851, -16.285721 ], [ 137.789851, -16.326001 ], [ 137.862021, -16.422710 ], [ 138.001180, -16.544509 ], [ 137.999054, -25.996867 ], [ 129.000584, -25.998613 ], [ 129.001242, -14.879473 ], [ 129.031662, -14.886404 ], [ 129.044122, -14.907474 ], [ 129.056582, -14.907864 ], [ 129.054062, -14.895314 ], [ 129.065942, -14.891074 ], [ 129.101291, -14.915063 ], [ 129.112720, -14.934444 ], [ 129.108420, -14.989234 ], [ 129.122640, -14.953124 ], [ 129.130690, -14.948973 ], [ 129.156770, -14.969083 ], [ 129.153340, -14.983424 ], [ 129.158170, -14.969313 ], [ 129.188919, -14.987173 ], [ 129.169509, -15.051533 ], [ 129.180419, -15.076401 ], [ 129.177609, -15.088920 ], [ 129.195399, -15.102657 ], [ 129.200549, -15.122610 ], [ 129.174670, -15.147453 ], [ 129.174920, -15.168373 ], [ 129.157520, -15.184362 ], [ 129.158190, -15.197602 ], [ 129.171140, -15.195692 ], [ 129.180470, -15.183122 ], [ 129.187740, -15.189412 ], [ 129.186620, -15.173913 ], [ 129.199600, -15.146683 ], [ 129.195630, -15.159303 ], [ 129.231200, -15.175933 ], [ 129.215479, -15.153844 ], [ 129.238089, -15.128741 ], [ 129.235149, -15.108587 ], [ 129.249409, -15.091536 ], [ 129.236489, -15.067790 ], [ 129.251469, -15.055972 ], [ 129.256039, -15.033953 ], [ 129.261929, -15.038413 ], [ 129.256339, -15.061991 ], [ 129.261649, -15.043503 ], [ 129.278198, -15.029293 ], [ 129.292969, -15.041763 ], [ 129.301618, -15.036533 ], [ 129.293099, -15.040513 ], [ 129.281248, -15.026843 ], [ 129.265129, -15.032903 ], [ 129.233489, -15.008293 ], [ 129.241369, -14.986463 ], [ 129.233929, -14.924383 ], [ 129.241818, -14.910693 ], [ 129.221738, -14.855403 ], [ 129.228428, -14.839373 ], [ 129.243178, -14.841342 ], [ 129.240808, -14.852582 ], [ 129.243858, -14.845302 ], [ 129.262907, -14.850112 ], [ 129.257278, -14.865012 ], [ 129.317387, -14.859452 ], [ 129.334857, -14.872992 ], [ 129.350127, -14.873682 ], [ 129.367257, -14.903172 ], [ 129.392217, -14.909062 ], [ 129.408627, -14.924932 ], [ 129.409517, -14.917592 ], [ 129.435317, -14.921391 ], [ 129.482478, -14.941060 ], [ 129.522298, -15.005689 ], [ 129.524778, -15.028089 ], [ 129.556113, -15.048727 ], [ 129.603903, -15.108006 ], [ 129.602213, -15.128906 ], [ 129.560193, -15.155136 ], [ 129.557244, -15.170536 ], [ 129.563584, -15.179916 ], [ 129.578933, -15.155626 ], [ 129.611663, -15.153736 ], [ 129.626233, -15.138026 ], [ 129.656723, -15.139507 ], [ 129.670853, -15.148547 ], [ 129.684983, -15.142667 ], [ 129.685663, -15.131027 ], [ 129.652392, -15.099347 ], [ 129.639822, -15.071217 ], [ 129.640532, -15.042167 ], [ 129.663332, -15.028097 ], [ 129.654302, -15.023397 ], [ 129.635252, -15.032857 ], [ 129.621082, -14.998587 ], [ 129.623012, -14.953257 ], [ 129.608492, -14.947687 ], [ 129.596407, -14.956909 ], [ 129.599517, -14.970359 ], [ 129.593247, -14.967069 ], [ 129.547907, -14.878519 ], [ 129.536477, -14.869029 ], [ 129.530377, -14.843859 ], [ 129.500257, -14.803219 ], [ 129.499707, -14.790109 ], [ 129.533837, -14.806799 ], [ 129.570007, -14.847559 ], [ 129.592117, -14.891009 ], [ 129.618391, -14.875607 ], [ 129.586151, -14.839377 ], [ 129.574046, -14.806769 ], [ 129.577546, -14.798299 ], [ 129.632051, -14.843867 ], [ 129.648571, -14.834407 ], [ 129.684911, -14.848817 ], [ 129.744561, -14.852327 ], [ 129.768161, -14.841357 ], [ 129.771701, -14.848977 ], [ 129.802541, -14.858017 ], [ 129.850091, -14.843308 ], [ 129.851381, -14.826188 ], [ 129.881371, -14.820108 ], [ 129.885561, -14.813898 ], [ 129.876270, -14.806888 ], [ 129.864410, -14.810608 ], [ 129.863950, -14.801678 ], [ 129.882550, -14.799428 ], [ 129.902830, -14.773218 ], [ 129.868350, -14.776208 ], [ 129.835941, -14.813298 ], [ 129.812691, -14.822878 ], [ 129.800841, -14.818908 ], [ 129.768981, -14.828028 ], [ 129.756541, -14.823598 ], [ 129.749481, -14.809698 ], [ 129.776810, -14.795378 ], [ 129.793800, -14.769058 ], [ 129.804030, -14.769418 ], [ 129.810050, -14.760318 ], [ 129.800660, -14.766808 ], [ 129.794050, -14.756408 ], [ 129.776030, -14.771298 ], [ 129.774730, -14.783058 ], [ 129.758470, -14.782018 ], [ 129.734401, -14.793968 ], [ 129.672401, -14.763468 ], [ 129.662211, -14.746158 ], [ 129.664664, -14.726060 ], [ 129.644951, -14.715278 ], [ 129.619276, -14.679653 ], [ 129.597761, -14.674389 ], [ 129.589191, -14.661259 ], [ 129.580675, -14.637929 ], [ 129.583625, -14.616239 ], [ 129.692380, -14.612789 ], [ 129.718910, -14.582829 ], [ 129.756299, -14.569719 ], [ 129.773869, -14.547569 ], [ 129.771549, -14.538709 ], [ 129.669340, -14.580489 ], [ 129.566761, -14.562549 ], [ 129.556920, -14.550809 ], [ 129.526271, -14.552290 ], [ 129.488235, -14.503340 ], [ 129.523065, -14.465559 ], [ 129.508855, -14.471969 ], [ 129.490435, -14.460169 ], [ 129.506885, -14.471739 ], [ 129.482675, -14.500950 ], [ 129.471875, -14.459450 ], [ 129.481665, -14.449650 ], [ 129.470015, -14.458200 ], [ 129.464745, -14.441810 ], [ 129.462615, -14.451060 ], [ 129.453995, -14.446390 ], [ 129.468615, -14.460570 ], [ 129.474455, -14.490990 ], [ 129.453185, -14.505060 ], [ 129.447395, -14.499620 ], [ 129.451155, -14.483580 ], [ 129.422655, -14.467340 ], [ 129.420725, -14.449930 ], [ 129.397845, -14.416130 ], [ 129.397945, -14.426470 ], [ 129.379285, -14.419410 ], [ 129.356765, -14.423630 ], [ 129.360725, -14.382500 ], [ 129.373895, -14.354730 ], [ 129.367015, -14.338100 ], [ 129.393515, -14.316820 ], [ 129.410524, -14.288270 ], [ 129.419444, -14.291120 ], [ 129.418404, -14.277130 ], [ 129.411594, -14.279460 ], [ 129.409294, -14.235940 ], [ 129.431104, -14.226390 ], [ 129.453223, -14.191190 ], [ 129.463853, -14.193680 ], [ 129.496383, -14.127889 ], [ 129.507143, -14.133229 ], [ 129.512033, -14.127049 ], [ 129.498263, -14.116479 ], [ 129.507913, -14.103619 ], [ 129.499522, -14.078959 ], [ 129.486323, -14.078470 ], [ 129.478982, -14.047930 ], [ 129.491382, -14.047399 ], [ 129.515832, -14.075369 ], [ 129.525072, -14.052339 ], [ 129.535592, -14.058359 ], [ 129.535072, -14.081419 ], [ 129.542232, -14.091149 ], [ 129.527663, -14.129999 ], [ 129.541991, -14.144528 ], [ 129.556712, -14.142159 ], [ 129.554812, -14.111869 ], [ 129.567152, -14.083859 ], [ 129.594868, -14.091231 ], [ 129.609288, -14.069591 ], [ 129.611678, -14.053581 ], [ 129.590638, -14.032861 ], [ 129.598097, -14.011061 ], [ 129.609277, -14.035611 ], [ 129.640877, -14.047200 ], [ 129.721306, -14.013430 ], [ 129.746045, -13.975139 ], [ 129.752395, -13.952199 ], [ 129.745905, -13.946999 ], [ 129.747265, -13.919199 ], [ 129.735105, -13.897200 ], [ 129.716925, -13.896290 ], [ 129.715525, -13.878880 ], [ 129.722565, -13.847910 ], [ 129.740024, -13.826870 ], [ 129.781754, -13.789429 ], [ 129.794833, -13.789519 ], [ 129.785094, -13.768179 ], [ 129.790163, -13.666910 ], [ 129.834832, -13.561190 ], [ 129.827732, -13.518140 ], [ 129.817322, -13.501760 ], [ 129.831192, -13.511470 ], [ 129.873241, -13.499090 ], [ 129.885301, -13.503230 ], [ 129.871151, -13.493450 ], [ 129.869401, -13.479770 ], [ 129.897431, -13.440410 ], [ 129.900511, -13.498600 ], [ 129.909891, -13.514340 ], [ 129.956840, -13.535809 ], [ 130.008369, -13.533339 ], [ 130.058688, -13.499448 ], [ 130.064148, -13.503698 ], [ 130.106367, -13.456308 ], [ 130.125227, -13.466197 ], [ 130.141607, -13.457117 ], [ 130.182226, -13.408637 ], [ 130.198365, -13.374207 ], [ 130.214435, -13.368216 ], [ 130.235484, -13.339676 ], [ 130.277914, -13.334866 ], [ 130.284054, -13.305756 ], [ 130.239714, -13.282487 ], [ 130.225204, -13.249197 ], [ 130.164195, -13.178029 ], [ 130.130515, -13.176539 ], [ 130.116176, -13.164139 ], [ 130.118885, -13.133399 ], [ 130.134055, -13.107479 ], [ 130.120155, -13.079379 ], [ 130.141194, -13.000669 ], [ 130.128194, -12.973699 ], [ 130.141114, -12.933458 ], [ 130.159093, -12.929228 ], [ 130.175793, -12.910277 ], [ 130.193763, -12.910507 ], [ 130.192613, -12.927808 ], [ 130.213243, -12.947028 ], [ 130.247122, -12.948377 ], [ 130.338240, -12.890117 ], [ 130.333160, -12.881077 ], [ 130.358339, -12.807237 ], [ 130.352799, -12.795377 ], [ 130.356219, -12.734777 ], [ 130.346309, -12.715227 ], [ 130.352029, -12.670337 ], [ 130.372478, -12.682037 ], [ 130.378858, -12.677677 ], [ 130.404108, -12.701477 ], [ 130.405538, -12.685337 ], [ 130.396468, -12.680147 ], [ 130.393578, -12.662287 ], [ 130.412797, -12.655607 ], [ 130.414147, -12.664525 ], [ 130.424537, -12.656957 ], [ 130.420267, -12.645427 ], [ 130.438556, -12.633656 ], [ 130.444666, -12.645516 ], [ 130.460885, -12.639176 ], [ 130.492105, -12.667286 ], [ 130.513574, -12.667765 ], [ 130.518305, -12.691376 ], [ 130.501186, -12.717966 ], [ 130.506126, -12.715006 ], [ 130.517887, -12.731048 ] ], [ [ 136.493656, -13.137190 ], [ 136.494890, -13.130756 ], [ 136.490380, -13.135076 ], [ 136.493656, -13.137190 ] ], [ [ 136.920057, -12.345105 ], [ 136.898470, -12.362623 ], [ 136.879160, -12.366323 ], [ 136.872820, -12.380653 ], [ 136.882380, -12.367913 ], [ 136.910529, -12.367723 ], [ 136.920057, -12.345105 ] ], [ [ 136.484882, -12.038282 ], [ 136.481587, -12.050148 ], [ 136.464817, -12.050908 ], [ 136.489277, -12.056258 ], [ 136.484882, -12.038282 ] ], [ [ 134.460310, -12.070590 ], [ 134.447525, -12.074575 ], [ 134.455485, -12.077815 ], [ 134.460310, -12.070590 ] ], [ [ 130.624928, -12.769794 ], [ 130.624345, -12.775105 ], [ 130.635194, -12.774195 ], [ 130.624928, -12.769794 ] ], [ [ 131.018004, -12.362999 ], [ 131.018767, -12.371650 ], [ 131.019277, -12.362120 ], [ 131.018004, -12.362999 ] ] ], [ [ [ 137.106124, -15.772531 ], [ 137.097714, -15.812051 ], [ 137.072865, -15.834402 ], [ 137.074255, -15.846262 ], [ 137.039845, -15.835522 ], [ 137.044045, -15.817232 ], [ 137.034495, -15.797122 ], [ 137.016285, -15.805582 ], [ 136.992615, -15.792132 ], [ 136.989375, -15.760622 ], [ 136.978755, -15.761972 ], [ 136.982385, -15.749552 ], [ 136.969665, -15.749093 ], [ 136.980755, -15.740512 ], [ 136.974575, -15.737572 ], [ 136.982825, -15.723572 ], [ 136.978375, -15.712422 ], [ 136.963855, -15.730562 ], [ 136.959095, -15.709892 ], [ 136.947655, -15.717673 ], [ 136.953935, -15.740043 ], [ 136.947285, -15.733143 ], [ 136.941105, -15.739463 ], [ 136.941585, -15.725573 ], [ 136.929805, -15.726463 ], [ 136.940075, -15.719923 ], [ 136.934035, -15.697333 ], [ 136.939285, -15.690113 ], [ 136.918305, -15.683763 ], [ 136.938245, -15.685033 ], [ 136.947925, -15.676002 ], [ 136.941165, -15.672272 ], [ 136.946895, -15.661552 ], [ 136.936285, -15.660412 ], [ 136.949345, -15.658282 ], [ 136.961025, -15.640102 ], [ 136.970115, -15.642822 ], [ 136.969395, -15.661122 ], [ 136.984195, -15.667002 ], [ 136.983955, -15.674462 ], [ 136.994454, -15.664532 ], [ 136.994464, -15.657862 ], [ 136.980475, -15.655032 ], [ 136.976764, -15.634472 ], [ 136.999964, -15.622862 ], [ 136.991374, -15.584462 ], [ 137.019914, -15.594871 ], [ 137.033644, -15.635191 ], [ 137.054504, -15.640401 ], [ 137.058364, -15.628321 ], [ 137.067104, -15.628771 ], [ 137.059874, -15.641311 ], [ 137.063104, -15.652701 ], [ 137.081664, -15.655771 ], [ 137.076064, -15.661641 ], [ 137.085494, -15.712911 ], [ 137.077784, -15.743281 ], [ 137.083034, -15.747911 ], [ 137.073434, -15.745851 ], [ 137.080354, -15.749721 ], [ 137.078484, -15.760671 ], [ 137.106124, -15.772531 ] ] ], [ [ [ 137.074485, -15.854732 ], [ 137.068885, -15.866252 ], [ 137.067715, -15.857212 ], [ 137.074485, -15.854732 ] ] ], [ [ [ 136.964126, -14.165254 ], [ 136.954096, -14.193134 ], [ 136.940156, -14.189194 ], [ 136.934276, -14.203714 ], [ 136.936096, -14.212164 ], [ 136.951916, -14.219584 ], [ 136.945716, -14.225514 ], [ 136.959806, -14.244924 ], [ 136.940727, -14.260354 ], [ 136.947946, -14.276214 ], [ 136.964576, -14.282604 ], [ 136.935837, -14.281744 ], [ 136.935927, -14.290894 ], [ 136.952186, -14.294924 ], [ 136.949957, -14.304204 ], [ 136.909567, -14.284924 ], [ 136.899007, -14.297104 ], [ 136.904367, -14.310504 ], [ 136.896407, -14.301764 ], [ 136.890897, -14.307914 ], [ 136.883518, -14.299064 ], [ 136.876948, -14.302844 ], [ 136.859568, -14.278155 ], [ 136.845478, -14.282795 ], [ 136.842458, -14.295135 ], [ 136.830018, -14.277855 ], [ 136.825548, -14.283315 ], [ 136.819129, -14.277495 ], [ 136.812379, -14.287385 ], [ 136.824369, -14.293495 ], [ 136.814759, -14.294365 ], [ 136.802779, -14.288595 ], [ 136.812999, -14.279355 ], [ 136.809449, -14.270695 ], [ 136.755460, -14.258056 ], [ 136.694211, -14.275856 ], [ 136.679741, -14.290886 ], [ 136.682461, -14.297756 ], [ 136.670382, -14.287047 ], [ 136.649892, -14.296217 ], [ 136.645632, -14.286077 ], [ 136.633902, -14.283577 ], [ 136.628193, -14.265037 ], [ 136.540515, -14.254148 ], [ 136.524595, -14.233819 ], [ 136.490816, -14.237009 ], [ 136.455507, -14.218050 ], [ 136.450787, -14.203940 ], [ 136.437348, -14.196300 ], [ 136.395549, -14.202331 ], [ 136.356580, -14.220111 ], [ 136.324700, -14.246111 ], [ 136.324461, -14.213321 ], [ 136.411409, -14.169491 ], [ 136.422119, -14.154981 ], [ 136.421029, -14.142321 ], [ 136.442608, -14.123471 ], [ 136.429629, -14.094241 ], [ 136.433159, -14.079761 ], [ 136.418020, -14.058002 ], [ 136.418170, -13.996012 ], [ 136.408151, -13.976332 ], [ 136.436141, -13.890793 ], [ 136.429021, -13.869313 ], [ 136.408042, -13.845313 ], [ 136.409232, -13.830973 ], [ 136.422572, -13.815643 ], [ 136.434711, -13.815113 ], [ 136.446721, -13.822143 ], [ 136.440451, -13.831393 ], [ 136.457131, -13.819233 ], [ 136.462760, -13.834503 ], [ 136.495630, -13.840832 ], [ 136.524569, -13.821482 ], [ 136.523819, -13.791532 ], [ 136.531889, -13.785022 ], [ 136.542578, -13.789102 ], [ 136.539218, -13.814042 ], [ 136.552228, -13.819822 ], [ 136.560248, -13.815262 ], [ 136.566188, -13.829942 ], [ 136.574167, -13.798552 ], [ 136.583937, -13.808611 ], [ 136.599757, -13.807041 ], [ 136.594097, -13.787031 ], [ 136.624416, -13.790771 ], [ 136.638016, -13.783551 ], [ 136.629276, -13.777251 ], [ 136.630546, -13.766191 ], [ 136.607676, -13.763611 ], [ 136.618156, -13.744171 ], [ 136.607306, -13.730052 ], [ 136.588637, -13.724342 ], [ 136.592367, -13.696582 ], [ 136.574237, -13.694262 ], [ 136.577777, -13.687402 ], [ 136.612126, -13.678642 ], [ 136.618906, -13.688692 ], [ 136.636356, -13.688511 ], [ 136.617066, -13.706002 ], [ 136.632126, -13.720561 ], [ 136.647455, -13.700131 ], [ 136.661865, -13.704111 ], [ 136.664035, -13.694411 ], [ 136.676275, -13.702191 ], [ 136.678505, -13.680081 ], [ 136.693774, -13.652191 ], [ 136.695304, -13.662041 ], [ 136.710484, -13.657541 ], [ 136.715263, -13.665941 ], [ 136.728553, -13.652160 ], [ 136.730973, -13.687020 ], [ 136.719883, -13.717740 ], [ 136.707274, -13.715670 ], [ 136.694464, -13.728801 ], [ 136.686044, -13.727151 ], [ 136.681074, -13.739421 ], [ 136.685394, -13.748151 ], [ 136.690624, -13.744591 ], [ 136.689524, -13.763900 ], [ 136.697054, -13.774920 ], [ 136.735352, -13.770960 ], [ 136.712493, -13.793810 ], [ 136.716843, -13.810800 ], [ 136.729142, -13.819720 ], [ 136.718303, -13.835800 ], [ 136.725352, -13.842279 ], [ 136.754461, -13.832359 ], [ 136.807348, -13.856016 ], [ 136.837318, -13.842907 ], [ 136.845488, -13.815048 ], [ 136.837278, -13.802438 ], [ 136.813719, -13.812068 ], [ 136.796999, -13.834188 ], [ 136.814739, -13.801918 ], [ 136.839308, -13.780308 ], [ 136.840528, -13.745188 ], [ 136.864368, -13.755438 ], [ 136.888657, -13.753938 ], [ 136.905216, -13.764127 ], [ 136.924406, -13.806527 ], [ 136.912026, -13.807557 ], [ 136.883996, -13.842807 ], [ 136.858486, -13.893216 ], [ 136.857806, -13.912836 ], [ 136.812587, -13.904137 ], [ 136.793188, -13.914027 ], [ 136.778908, -13.934017 ], [ 136.762279, -14.000987 ], [ 136.778979, -14.023927 ], [ 136.807518, -14.018116 ], [ 136.807558, -14.035856 ], [ 136.784099, -14.039787 ], [ 136.777319, -14.058027 ], [ 136.775249, -14.046187 ], [ 136.760199, -14.046427 ], [ 136.747880, -14.066527 ], [ 136.752220, -14.086937 ], [ 136.737790, -14.078357 ], [ 136.736620, -14.065527 ], [ 136.720590, -14.069917 ], [ 136.724130, -14.078137 ], [ 136.713261, -14.093137 ], [ 136.720650, -14.104257 ], [ 136.711351, -14.099817 ], [ 136.699661, -14.114597 ], [ 136.705451, -14.140767 ], [ 136.715591, -14.142247 ], [ 136.707081, -14.168987 ], [ 136.726250, -14.189167 ], [ 136.785429, -14.193116 ], [ 136.788169, -14.184906 ], [ 136.770890, -14.169466 ], [ 136.782419, -14.163386 ], [ 136.776809, -14.144566 ], [ 136.788569, -14.151586 ], [ 136.800339, -14.146966 ], [ 136.810919, -14.164156 ], [ 136.842938, -14.183075 ], [ 136.853918, -14.206475 ], [ 136.865778, -14.210775 ], [ 136.893617, -14.203515 ], [ 136.914747, -14.171475 ], [ 136.911297, -14.137615 ], [ 136.930696, -14.143875 ], [ 136.920357, -14.152555 ], [ 136.928337, -14.164345 ], [ 136.945176, -14.157075 ], [ 136.964126, -14.165254 ] ] ], [ [ [ 136.962484, -13.626417 ], [ 136.951214, -13.648927 ], [ 136.950334, -13.643497 ], [ 136.925485, -13.644537 ], [ 136.933315, -13.634437 ], [ 136.962484, -13.626417 ] ] ], [ [ [ 136.949935, -15.772453 ], [ 136.946665, -15.777193 ], [ 136.940145, -15.768603 ], [ 136.947145, -15.759343 ], [ 136.949935, -15.772453 ] ] ], [ [ [ 136.937355, -13.662817 ], [ 136.929005, -13.667157 ], [ 136.925815, -13.661827 ], [ 136.937355, -13.662817 ] ] ], [ [ [ 136.913436, -13.662858 ], [ 136.900606, -13.678008 ], [ 136.886987, -13.676088 ], [ 136.908506, -13.658408 ], [ 136.913436, -13.662858 ] ] ], [ [ [ 136.904895, -15.588552 ], [ 136.895675, -15.598593 ], [ 136.886825, -15.594063 ], [ 136.884005, -15.607273 ], [ 136.861975, -15.607353 ], [ 136.875365, -15.617193 ], [ 136.881905, -15.613483 ], [ 136.880825, -15.636743 ], [ 136.845486, -15.647193 ], [ 136.837356, -15.628553 ], [ 136.851696, -15.624733 ], [ 136.829906, -15.618373 ], [ 136.843096, -15.610263 ], [ 136.831096, -15.601663 ], [ 136.855255, -15.583513 ], [ 136.852595, -15.569843 ], [ 136.841995, -15.562943 ], [ 136.841565, -15.542383 ], [ 136.860455, -15.532703 ], [ 136.867255, -15.507522 ], [ 136.870615, -15.517352 ], [ 136.883325, -15.509132 ], [ 136.873745, -15.532042 ], [ 136.890685, -15.579613 ], [ 136.904895, -15.588552 ] ] ], [ [ [ 136.840575, -15.577173 ], [ 136.827626, -15.585053 ], [ 136.801646, -15.582414 ], [ 136.796886, -15.573144 ], [ 136.781596, -15.582384 ], [ 136.773566, -15.578634 ], [ 136.793056, -15.560034 ], [ 136.833155, -15.555473 ], [ 136.835705, -15.563613 ], [ 136.827886, -15.570603 ], [ 136.836515, -15.566203 ], [ 136.840575, -15.577173 ] ] ], [ [ [ 136.837568, -11.664256 ], [ 136.824818, -11.676206 ], [ 136.809578, -11.673236 ], [ 136.823708, -11.658686 ], [ 136.833908, -11.656566 ], [ 136.837568, -11.664256 ] ] ], [ [ [ 136.836326, -15.686594 ], [ 136.813806, -15.700344 ], [ 136.802496, -15.697834 ], [ 136.804276, -15.685254 ], [ 136.791066, -15.684344 ], [ 136.779516, -15.701305 ], [ 136.798166, -15.703364 ], [ 136.804436, -15.723814 ], [ 136.776517, -15.746355 ], [ 136.764277, -15.742725 ], [ 136.746187, -15.749915 ], [ 136.739747, -15.762665 ], [ 136.732167, -15.758026 ], [ 136.728487, -15.734745 ], [ 136.738907, -15.712065 ], [ 136.749007, -15.718635 ], [ 136.751267, -15.712775 ], [ 136.729717, -15.700195 ], [ 136.736837, -15.697155 ], [ 136.734546, -15.677615 ], [ 136.740996, -15.672875 ], [ 136.735426, -15.646665 ], [ 136.765636, -15.640404 ], [ 136.780196, -15.648224 ], [ 136.794656, -15.644974 ], [ 136.829136, -15.662984 ], [ 136.828066, -15.676874 ], [ 136.836326, -15.686594 ] ] ], [ [ [ 136.829616, -15.730744 ], [ 136.817716, -15.730614 ], [ 136.815596, -15.746874 ], [ 136.812226, -15.737264 ], [ 136.807077, -15.746075 ], [ 136.800787, -15.742225 ], [ 136.803376, -15.726074 ], [ 136.829616, -15.730744 ] ] ], [ [ [ 136.827308, -12.129923 ], [ 136.814998, -12.141084 ], [ 136.801938, -12.127404 ], [ 136.800208, -12.132934 ], [ 136.796247, -12.106054 ], [ 136.797077, -12.088774 ], [ 136.823977, -12.072784 ], [ 136.827308, -12.129923 ] ] ], [ [ [ 136.819096, -15.603223 ], [ 136.791326, -15.615374 ], [ 136.790056, -15.608824 ], [ 136.777236, -15.608004 ], [ 136.791256, -15.590644 ], [ 136.819096, -15.603223 ] ] ], [ [ [ 136.766169, -11.028510 ], [ 136.734840, -11.114650 ], [ 136.736980, -11.127760 ], [ 136.721711, -11.150890 ], [ 136.714661, -11.176520 ], [ 136.720001, -11.193820 ], [ 136.711641, -11.194710 ], [ 136.706451, -11.211190 ], [ 136.694982, -11.218850 ], [ 136.684682, -11.213340 ], [ 136.666802, -11.224870 ], [ 136.684022, -11.248760 ], [ 136.670292, -11.246690 ], [ 136.662123, -11.264180 ], [ 136.648383, -11.263470 ], [ 136.644893, -11.282330 ], [ 136.633343, -11.277660 ], [ 136.625083, -11.284330 ], [ 136.634214, -11.294840 ], [ 136.623764, -11.303630 ], [ 136.627134, -11.328720 ], [ 136.616145, -11.328470 ], [ 136.599605, -11.347580 ], [ 136.588726, -11.383529 ], [ 136.562327, -11.398509 ], [ 136.555067, -11.416769 ], [ 136.537658, -11.426099 ], [ 136.537578, -11.440329 ], [ 136.521988, -11.444579 ], [ 136.525388, -11.435079 ], [ 136.518358, -11.430780 ], [ 136.499968, -11.441790 ], [ 136.502218, -11.455560 ], [ 136.483889, -11.456550 ], [ 136.474369, -11.449100 ], [ 136.494748, -11.437790 ], [ 136.501938, -11.424770 ], [ 136.497797, -11.392250 ], [ 136.520457, -11.395600 ], [ 136.517467, -11.384220 ], [ 136.530177, -11.377520 ], [ 136.533446, -11.365620 ], [ 136.547776, -11.364990 ], [ 136.554446, -11.356080 ], [ 136.551036, -11.345670 ], [ 136.563166, -11.347430 ], [ 136.565955, -11.335320 ], [ 136.582935, -11.324640 ], [ 136.576895, -11.316260 ], [ 136.583174, -11.281700 ], [ 136.620283, -11.238070 ], [ 136.622882, -11.210060 ], [ 136.627012, -11.204980 ], [ 136.631112, -11.213810 ], [ 136.643602, -11.209890 ], [ 136.657292, -11.184950 ], [ 136.672412, -11.197010 ], [ 136.687261, -11.192720 ], [ 136.706671, -11.167910 ], [ 136.703041, -11.152870 ], [ 136.696181, -11.151840 ], [ 136.704771, -11.147910 ], [ 136.706660, -11.125090 ], [ 136.693740, -11.119740 ], [ 136.715820, -11.124660 ], [ 136.722150, -11.109870 ], [ 136.700680, -11.092300 ], [ 136.727100, -11.097230 ], [ 136.737569, -11.076010 ], [ 136.734059, -11.060640 ], [ 136.712790, -11.054701 ], [ 136.725759, -11.039601 ], [ 136.736029, -11.050580 ], [ 136.745189, -11.048230 ], [ 136.736759, -11.033861 ], [ 136.750929, -11.030261 ], [ 136.759109, -11.017651 ], [ 136.766169, -11.028510 ] ] ], [ [ [ 136.762108, -11.004551 ], [ 136.747889, -11.020101 ], [ 136.736599, -11.007311 ], [ 136.762108, -11.004551 ] ] ], [ [ [ 136.753982, -13.690570 ], [ 136.733483, -13.695700 ], [ 136.738182, -13.686360 ], [ 136.753982, -13.690570 ] ] ], [ [ [ 136.712750, -12.217115 ], [ 136.700228, -12.228824 ], [ 136.696791, -12.222728 ], [ 136.705807, -12.212869 ], [ 136.696638, -12.207066 ], [ 136.709109, -12.203675 ], [ 136.712750, -12.217115 ] ] ], [ [ [ 136.702274, -13.620411 ], [ 136.695284, -13.625881 ], [ 136.701794, -13.634981 ], [ 136.686344, -13.631341 ], [ 136.702274, -13.620411 ] ] ], [ [ [ 136.688384, -13.634971 ], [ 136.680644, -13.647671 ], [ 136.680894, -13.633101 ], [ 136.688384, -13.634971 ] ] ], [ [ [ 136.688153, -11.821446 ], [ 136.669764, -11.836656 ], [ 136.643024, -11.839746 ], [ 136.688153, -11.821446 ] ] ], [ [ [ 136.682624, -13.658801 ], [ 136.676245, -13.678881 ], [ 136.665975, -13.684711 ], [ 136.659665, -13.679681 ], [ 136.668715, -13.663831 ], [ 136.662425, -13.656321 ], [ 136.682624, -13.658801 ] ] ], [ [ [ 136.681306, -15.605335 ], [ 136.673946, -15.612206 ], [ 136.646446, -15.606156 ], [ 136.654756, -15.593636 ], [ 136.669456, -15.590506 ], [ 136.681306, -15.605335 ] ] ], [ [ [ 136.656735, -13.655251 ], [ 136.647775, -13.665681 ], [ 136.643706, -13.656942 ], [ 136.656735, -13.655251 ] ] ], [ [ [ 136.641666, -13.664142 ], [ 136.631296, -13.673322 ], [ 136.632236, -13.659552 ], [ 136.641136, -13.656852 ], [ 136.641666, -13.664142 ] ] ], [ [ [ 136.630207, -12.863185 ], [ 136.621447, -12.868815 ], [ 136.618247, -12.858525 ], [ 136.626427, -12.854485 ], [ 136.630207, -12.863185 ] ] ], [ [ [ 136.627212, -11.740267 ], [ 136.591703, -11.764247 ], [ 136.584563, -11.774847 ], [ 136.589243, -11.782657 ], [ 136.579823, -11.788737 ], [ 136.511514, -11.804927 ], [ 136.515704, -11.786858 ], [ 136.534313, -11.776627 ], [ 136.533783, -11.760238 ], [ 136.546833, -11.771687 ], [ 136.545153, -11.780907 ], [ 136.559083, -11.780987 ], [ 136.557623, -11.767427 ], [ 136.572103, -11.778677 ], [ 136.565103, -11.760777 ], [ 136.587683, -11.764577 ], [ 136.587253, -11.756327 ], [ 136.578653, -11.755057 ], [ 136.587512, -11.744117 ], [ 136.609632, -11.751297 ], [ 136.614942, -11.737757 ], [ 136.627212, -11.740267 ] ] ], [ [ [ 136.617327, -15.555366 ], [ 136.604837, -15.560876 ], [ 136.596507, -15.581297 ], [ 136.604807, -15.615197 ], [ 136.598967, -15.620047 ], [ 136.605017, -15.623787 ], [ 136.594287, -15.626017 ], [ 136.589687, -15.645317 ], [ 136.570317, -15.649338 ], [ 136.550887, -15.639868 ], [ 136.539177, -15.653768 ], [ 136.522848, -15.654398 ], [ 136.494748, -15.643548 ], [ 136.513388, -15.622628 ], [ 136.504508, -15.592098 ], [ 136.520058, -15.576227 ], [ 136.522078, -15.563017 ], [ 136.511068, -15.544567 ], [ 136.525658, -15.538397 ], [ 136.525328, -15.530947 ], [ 136.566817, -15.530606 ], [ 136.578647, -15.510876 ], [ 136.610417, -15.523836 ], [ 136.617327, -15.555366 ] ] ], [ [ [ 136.602557, -13.657002 ], [ 136.591257, -13.667532 ], [ 136.575547, -13.667042 ], [ 136.586297, -13.653812 ], [ 136.602557, -13.657002 ] ] ], [ [ [ 136.584137, -13.723062 ], [ 136.574597, -13.729862 ], [ 136.569678, -13.724392 ], [ 136.584137, -13.723062 ] ] ], [ [ [ 136.579127, -13.775322 ], [ 136.573927, -13.787252 ], [ 136.572087, -13.773762 ], [ 136.579127, -13.775322 ] ] ], [ [ [ 136.541648, -13.771392 ], [ 136.520229, -13.792622 ], [ 136.499300, -13.782973 ], [ 136.490400, -13.759243 ], [ 136.469211, -13.746533 ], [ 136.471130, -13.720553 ], [ 136.495180, -13.713383 ], [ 136.501160, -13.720553 ], [ 136.514589, -13.718563 ], [ 136.518029, -13.710003 ], [ 136.509829, -13.698513 ], [ 136.530929, -13.703463 ], [ 136.538558, -13.738902 ], [ 136.531719, -13.752282 ], [ 136.541648, -13.771392 ] ] ], [ [ [ 136.499804, -11.797268 ], [ 136.491224, -11.816828 ], [ 136.499824, -11.818508 ], [ 136.477945, -11.846658 ], [ 136.486245, -11.884157 ], [ 136.479145, -11.898748 ], [ 136.464126, -11.904068 ], [ 136.468366, -11.896948 ], [ 136.457885, -11.889858 ], [ 136.469715, -11.876498 ], [ 136.460535, -11.866558 ], [ 136.473945, -11.858868 ], [ 136.470835, -11.841468 ], [ 136.464525, -11.841708 ], [ 136.479874, -11.819098 ], [ 136.477444, -11.801248 ], [ 136.499804, -11.797268 ] ] ], [ [ [ 136.473819, -11.467970 ], [ 136.461700, -11.498590 ], [ 136.466060, -11.505260 ], [ 136.449010, -11.531930 ], [ 136.425871, -11.536690 ], [ 136.427131, -11.546520 ], [ 136.409031, -11.543930 ], [ 136.404221, -11.554670 ], [ 136.374201, -11.565640 ], [ 136.366511, -11.534690 ], [ 136.381191, -11.550390 ], [ 136.386101, -11.525420 ], [ 136.400881, -11.521790 ], [ 136.402371, -11.527330 ], [ 136.421840, -11.512970 ], [ 136.430190, -11.490930 ], [ 136.446570, -11.494310 ], [ 136.456289, -11.473740 ], [ 136.473819, -11.467970 ] ] ], [ [ [ 136.459196, -11.904748 ], [ 136.453816, -11.917408 ], [ 136.434886, -11.919348 ], [ 136.457006, -11.897068 ], [ 136.459196, -11.904748 ] ] ], [ [ [ 136.431975, -11.879018 ], [ 136.430276, -11.894948 ], [ 136.408816, -11.893608 ], [ 136.404576, -11.902198 ], [ 136.385996, -11.906609 ], [ 136.366946, -11.902899 ], [ 136.398486, -11.889768 ], [ 136.396416, -11.878018 ], [ 136.409726, -11.878468 ], [ 136.408095, -11.855188 ], [ 136.418555, -11.874048 ], [ 136.426115, -11.865578 ], [ 136.431975, -11.879018 ] ] ], [ [ [ 136.419932, -13.631644 ], [ 136.396723, -13.627855 ], [ 136.400772, -13.620805 ], [ 136.417072, -13.621805 ], [ 136.419932, -13.631644 ] ] ], [ [ [ 136.400763, -13.714154 ], [ 136.384133, -13.711174 ], [ 136.380243, -13.694565 ], [ 136.400763, -13.714154 ] ] ], [ [ [ 136.383432, -13.313576 ], [ 136.374872, -13.319426 ], [ 136.369122, -13.313306 ], [ 136.383432, -13.313576 ] ] ], [ [ [ 136.377082, -11.583490 ], [ 136.365052, -11.597960 ], [ 136.355422, -11.594350 ], [ 136.337662, -11.605880 ], [ 136.332172, -11.623510 ], [ 136.316692, -11.617520 ], [ 136.296873, -11.641590 ], [ 136.289763, -11.622280 ], [ 136.264663, -11.621041 ], [ 136.256643, -11.632671 ], [ 136.270163, -11.627251 ], [ 136.272233, -11.639000 ], [ 136.261463, -11.662160 ], [ 136.230733, -11.668041 ], [ 136.231193, -11.655611 ], [ 136.223743, -11.652901 ], [ 136.213543, -11.659111 ], [ 136.214343, -11.674141 ], [ 136.203913, -11.665891 ], [ 136.172494, -11.694251 ], [ 136.159534, -11.693002 ], [ 136.163784, -11.678542 ], [ 136.180864, -11.675151 ], [ 136.168143, -11.656512 ], [ 136.169523, -11.641032 ], [ 136.207583, -11.656521 ], [ 136.209983, -11.641831 ], [ 136.230733, -11.645671 ], [ 136.232913, -11.628271 ], [ 136.223513, -11.618331 ], [ 136.242543, -11.620251 ], [ 136.239793, -11.600361 ], [ 136.265112, -11.572561 ], [ 136.270962, -11.585331 ], [ 136.280012, -11.582961 ], [ 136.281282, -11.603181 ], [ 136.315092, -11.603850 ], [ 136.314172, -11.592780 ], [ 136.296752, -11.591881 ], [ 136.295482, -11.580131 ], [ 136.308892, -11.570861 ], [ 136.321042, -11.585770 ], [ 136.340642, -11.588710 ], [ 136.338342, -11.579550 ], [ 136.348432, -11.577290 ], [ 136.345671, -11.563400 ], [ 136.358161, -11.560110 ], [ 136.360791, -11.549490 ], [ 136.371681, -11.565530 ], [ 136.369062, -11.580670 ], [ 136.377082, -11.583490 ] ] ], [ [ [ 136.373053, -13.825564 ], [ 136.368853, -13.841814 ], [ 136.335423, -13.843754 ], [ 136.354713, -13.810264 ], [ 136.367083, -13.811544 ], [ 136.373053, -13.825564 ] ] ], [ [ [ 136.335427, -11.958279 ], [ 136.323147, -11.961219 ], [ 136.332897, -11.945279 ], [ 136.335427, -11.958279 ] ] ], [ [ [ 136.147129, -12.053861 ], [ 136.140308, -12.038161 ], [ 136.131358, -12.039642 ], [ 136.132938, -12.025741 ], [ 136.145798, -12.027181 ], [ 136.146278, -12.037691 ], [ 136.155458, -12.041071 ], [ 136.172658, -12.029951 ], [ 136.171478, -12.013221 ], [ 136.185398, -12.029141 ], [ 136.192508, -12.027091 ], [ 136.189238, -12.000751 ], [ 136.198548, -12.006161 ], [ 136.202307, -11.996161 ], [ 136.207848, -12.008171 ], [ 136.199848, -12.021981 ], [ 136.217628, -12.035931 ], [ 136.256157, -12.006030 ], [ 136.271527, -12.002380 ], [ 136.281837, -11.975240 ], [ 136.313057, -11.974099 ], [ 136.304337, -11.993430 ], [ 136.312377, -11.985739 ], [ 136.317197, -11.992519 ], [ 136.310567, -12.010760 ], [ 136.277578, -12.034810 ], [ 136.197738, -12.060081 ], [ 136.194678, -12.076601 ], [ 136.178028, -12.076861 ], [ 136.161018, -12.065591 ], [ 136.128318, -12.073682 ], [ 136.118308, -12.061262 ], [ 136.119438, -12.050862 ], [ 136.138168, -12.060541 ], [ 136.147129, -12.053861 ] ] ], [ [ [ 136.301774, -13.734425 ], [ 136.266165, -13.737465 ], [ 136.253875, -13.747706 ], [ 136.254875, -13.759685 ], [ 136.276385, -13.756365 ], [ 136.275505, -13.777935 ], [ 136.283685, -13.787005 ], [ 136.273495, -13.793175 ], [ 136.259995, -13.784215 ], [ 136.254635, -13.832085 ], [ 136.244675, -13.838445 ], [ 136.247865, -13.850025 ], [ 136.199396, -13.853816 ], [ 136.211186, -13.824146 ], [ 136.189086, -13.794806 ], [ 136.192176, -13.773396 ], [ 136.185656, -13.768176 ], [ 136.150076, -13.776706 ], [ 136.144727, -13.785386 ], [ 136.157616, -13.799886 ], [ 136.155246, -13.816826 ], [ 136.169226, -13.820606 ], [ 136.168246, -13.834606 ], [ 136.127887, -13.835816 ], [ 136.105647, -13.815847 ], [ 136.119807, -13.787807 ], [ 136.109777, -13.764347 ], [ 136.112917, -13.731267 ], [ 136.122546, -13.722267 ], [ 136.127966, -13.736357 ], [ 136.139486, -13.735657 ], [ 136.145216, -13.747427 ], [ 136.173646, -13.748326 ], [ 136.181666, -13.736266 ], [ 136.173616, -13.727426 ], [ 136.180896, -13.718276 ], [ 136.173686, -13.707096 ], [ 136.187466, -13.699696 ], [ 136.192506, -13.679606 ], [ 136.181396, -13.677657 ], [ 136.199615, -13.665286 ], [ 136.221805, -13.662426 ], [ 136.254355, -13.673716 ], [ 136.252325, -13.693026 ], [ 136.266655, -13.691946 ], [ 136.274005, -13.705526 ], [ 136.292494, -13.707505 ], [ 136.301774, -13.734425 ] ] ], [ [ [ 136.272863, -13.460176 ], [ 136.267344, -13.466816 ], [ 136.251414, -13.453667 ], [ 136.244334, -13.461887 ], [ 136.238744, -13.442667 ], [ 136.248234, -13.435917 ], [ 136.272863, -13.460176 ] ] ], [ [ [ 136.248265, -13.594626 ], [ 136.235535, -13.603056 ], [ 136.225165, -13.600656 ], [ 136.219295, -13.588427 ], [ 136.236365, -13.594816 ], [ 136.231555, -13.585536 ], [ 136.237355, -13.577536 ], [ 136.248265, -13.594626 ] ] ], [ [ [ 136.209983, -11.634031 ], [ 136.207923, -11.641261 ], [ 136.195433, -11.629851 ], [ 136.193373, -11.613802 ], [ 136.205063, -11.615271 ], [ 136.209983, -11.634031 ] ] ], [ [ [ 136.205914, -13.454747 ], [ 136.194194, -13.472547 ], [ 136.181294, -13.463577 ], [ 136.170764, -13.468507 ], [ 136.165504, -13.485317 ], [ 136.151024, -13.468317 ], [ 136.142125, -13.470317 ], [ 136.143565, -13.487157 ], [ 136.149145, -13.495327 ], [ 136.156245, -13.491267 ], [ 136.167725, -13.509837 ], [ 136.165015, -13.523947 ], [ 136.155105, -13.518717 ], [ 136.149185, -13.525017 ], [ 136.149985, -13.557897 ], [ 136.140525, -13.564187 ], [ 136.126615, -13.543807 ], [ 136.150055, -13.511017 ], [ 136.139135, -13.498097 ], [ 136.126935, -13.503537 ], [ 136.132125, -13.488017 ], [ 136.121755, -13.482207 ], [ 136.135964, -13.452557 ], [ 136.130404, -13.428477 ], [ 136.141754, -13.419147 ], [ 136.127034, -13.374578 ], [ 136.089224, -13.364708 ], [ 136.092594, -13.358278 ], [ 136.115214, -13.357588 ], [ 136.140784, -13.386437 ], [ 136.150504, -13.384667 ], [ 136.161844, -13.417417 ], [ 136.180394, -13.426297 ], [ 136.177114, -13.437577 ], [ 136.205914, -13.454747 ] ] ], [ [ [ 136.155810, -12.189161 ], [ 136.113850, -12.199192 ], [ 136.104420, -12.189712 ], [ 136.121600, -12.167972 ], [ 136.129890, -12.177682 ], [ 136.147790, -12.171311 ], [ 136.155810, -12.189161 ] ] ], [ [ [ 136.155414, -11.696282 ], [ 136.130864, -11.725312 ], [ 136.125254, -11.711182 ], [ 136.140624, -11.697632 ], [ 136.138214, -11.682832 ], [ 136.155414, -11.696282 ] ] ], [ [ [ 136.122792, -11.544183 ], [ 136.108792, -11.567003 ], [ 136.110642, -11.547903 ], [ 136.122792, -11.544183 ] ] ], [ [ [ 136.108895, -13.464088 ], [ 136.106445, -13.471648 ], [ 136.082655, -13.471998 ], [ 136.074755, -13.482588 ], [ 136.082195, -13.443638 ], [ 136.108895, -13.464088 ] ] ], [ [ [ 136.104595, -11.746202 ], [ 136.074655, -11.771272 ], [ 136.077645, -11.752752 ], [ 136.099785, -11.741122 ], [ 136.104595, -11.746202 ] ] ], [ [ [ 136.095613, -13.298418 ], [ 136.091934, -13.321738 ], [ 136.077964, -13.298008 ], [ 136.095613, -13.298418 ] ] ], [ [ [ 136.090453, -11.582703 ], [ 136.079783, -11.604843 ], [ 136.077273, -11.586763 ], [ 136.090453, -11.582703 ] ] ], [ [ [ 136.071371, -12.276932 ], [ 136.048332, -12.310882 ], [ 136.048061, -12.284882 ], [ 136.071371, -12.276932 ] ] ], [ [ [ 136.067733, -11.635683 ], [ 136.062794, -11.646863 ], [ 136.054544, -11.641323 ], [ 136.062573, -11.627993 ], [ 136.067733, -11.635683 ] ] ], [ [ [ 136.056024, -11.653073 ], [ 135.993385, -11.719243 ], [ 135.990645, -11.703993 ], [ 135.981455, -11.714943 ], [ 135.950175, -11.696043 ], [ 135.960175, -11.670513 ], [ 136.004444, -11.650553 ], [ 136.012004, -11.654403 ], [ 136.009834, -11.648413 ], [ 136.024164, -11.639043 ], [ 136.034934, -11.647303 ], [ 136.048924, -11.644253 ], [ 136.056024, -11.653073 ] ] ], [ [ [ 136.050906, -11.786292 ], [ 136.028756, -11.812382 ], [ 136.041156, -11.783802 ], [ 136.050906, -11.786292 ] ] ], [ [ [ 136.047429, -12.101182 ], [ 136.036989, -12.106052 ], [ 136.041269, -12.128212 ], [ 136.032549, -12.135683 ], [ 136.028000, -12.159433 ], [ 136.026079, -12.103583 ], [ 136.035589, -12.092602 ], [ 136.047429, -12.101182 ] ] ], [ [ [ 135.992587, -11.851112 ], [ 135.980657, -11.856643 ], [ 135.961817, -11.879783 ], [ 135.956867, -11.898993 ], [ 135.945968, -11.904633 ], [ 135.942087, -11.879653 ], [ 135.982267, -11.848053 ], [ 135.992587, -11.851112 ] ] ], [ [ [ 135.978115, -11.737083 ], [ 135.960546, -11.760233 ], [ 135.940016, -11.763943 ], [ 135.937276, -11.749253 ], [ 135.941186, -11.741003 ], [ 135.952426, -11.742153 ], [ 135.952666, -11.732653 ], [ 135.975595, -11.731323 ], [ 135.978115, -11.737083 ] ] ], [ [ [ 135.975744, -13.343869 ], [ 135.961334, -13.321380 ], [ 135.971894, -13.327589 ], [ 135.975744, -13.343869 ] ] ], [ [ [ 135.735321, -11.936628 ], [ 135.760508, -11.912655 ], [ 135.781288, -11.909634 ], [ 135.830238, -11.860994 ], [ 135.832978, -11.870264 ], [ 135.835087, -11.837614 ], [ 135.853777, -11.848264 ], [ 135.871577, -11.832464 ], [ 135.883537, -11.804114 ], [ 135.900167, -11.808203 ], [ 135.903737, -11.793853 ], [ 135.888937, -11.803214 ], [ 135.885507, -11.792134 ], [ 135.866017, -11.782734 ], [ 135.864886, -11.767594 ], [ 135.876486, -11.755624 ], [ 135.889326, -11.762194 ], [ 135.907106, -11.757243 ], [ 135.909846, -11.768203 ], [ 135.928196, -11.775003 ], [ 135.937917, -11.802593 ], [ 135.907837, -11.823573 ], [ 135.900697, -11.851473 ], [ 135.857988, -11.878434 ], [ 135.797619, -11.964684 ], [ 135.776019, -11.976524 ], [ 135.741819, -11.975565 ], [ 135.734859, -12.001675 ], [ 135.637070, -12.017875 ], [ 135.605380, -12.032916 ], [ 135.592060, -12.055526 ], [ 135.564621, -12.069766 ], [ 135.564390, -12.056996 ], [ 135.554180, -12.048396 ], [ 135.564727, -12.031247 ], [ 135.563140, -12.008376 ], [ 135.585240, -11.980006 ], [ 135.588819, -11.968496 ], [ 135.581489, -11.961246 ], [ 135.594139, -11.950766 ], [ 135.605259, -11.960846 ], [ 135.618799, -11.959746 ], [ 135.615569, -11.970466 ], [ 135.632079, -11.975025 ], [ 135.656779, -11.964905 ], [ 135.669789, -11.945945 ], [ 135.666829, -11.935655 ], [ 135.735321, -11.936628 ] ] ], [ [ [ 135.768161, -14.875195 ], [ 135.764091, -14.901775 ], [ 135.732112, -14.892195 ], [ 135.707962, -14.912915 ], [ 135.686912, -14.903775 ], [ 135.716892, -14.882165 ], [ 135.721002, -14.860435 ], [ 135.709522, -14.851966 ], [ 135.725882, -14.834766 ], [ 135.747502, -14.836555 ], [ 135.759322, -14.847655 ], [ 135.768161, -14.875195 ] ] ], [ [ [ 135.735122, -14.287987 ], [ 135.732922, -14.295087 ], [ 135.728052, -14.291247 ], [ 135.735122, -14.287987 ] ] ], [ [ [ 135.630353, -14.496197 ], [ 135.607973, -14.516337 ], [ 135.603083, -14.490337 ], [ 135.624893, -14.488407 ], [ 135.630353, -14.496197 ] ] ], [ [ [ 135.169809, -11.702139 ], [ 135.167609, -11.709249 ], [ 135.156499, -11.705709 ], [ 135.150139, -11.687599 ], [ 135.157139, -11.686159 ], [ 135.169809, -11.702139 ] ] ], [ [ [ 135.122481, -11.927419 ], [ 135.107501, -11.942279 ], [ 135.088911, -11.941189 ], [ 135.056951, -11.954510 ], [ 135.047021, -11.940680 ], [ 135.057091, -11.919250 ], [ 135.082701, -11.916079 ], [ 135.122481, -11.927419 ] ] ], [ [ [ 135.002893, -12.091410 ], [ 134.989573, -12.093830 ], [ 134.976433, -12.065690 ], [ 134.997853, -12.072270 ], [ 135.002893, -12.091410 ] ] ], [ [ [ 134.990602, -12.035250 ], [ 134.958853, -12.053080 ], [ 134.960463, -12.064600 ], [ 134.944023, -12.062610 ], [ 134.932823, -12.044281 ], [ 134.910913, -12.033971 ], [ 134.908513, -12.023371 ], [ 134.954352, -12.014230 ], [ 134.990602, -12.035250 ] ] ], [ [ [ 134.959263, -12.083150 ], [ 134.956623, -12.094940 ], [ 134.951433, -12.093060 ], [ 134.942153, -12.070990 ], [ 134.952263, -12.071230 ], [ 134.959263, -12.083150 ] ] ], [ [ [ 134.931963, -12.061930 ], [ 134.925893, -12.064361 ], [ 134.917413, -12.054151 ], [ 134.924743, -12.051931 ], [ 134.931963, -12.061930 ] ] ], [ [ [ 134.929253, -12.090670 ], [ 134.904654, -12.137371 ], [ 134.869064, -12.125941 ], [ 134.874954, -12.117751 ], [ 134.863734, -12.109031 ], [ 134.866133, -12.070681 ], [ 134.847613, -12.042931 ], [ 134.880283, -12.061391 ], [ 134.906383, -12.065451 ], [ 134.929253, -12.090670 ] ] ], [ [ [ 134.865363, -12.025011 ], [ 134.851123, -12.037691 ], [ 134.826853, -12.020282 ], [ 134.839813, -12.006591 ], [ 134.859983, -12.014661 ], [ 134.865363, -12.025011 ] ] ], [ [ [ 134.831323, -12.044541 ], [ 134.798153, -12.033082 ], [ 134.798003, -12.016802 ], [ 134.809833, -12.016702 ], [ 134.831323, -12.044541 ] ] ], [ [ [ 134.222104, -11.953928 ], [ 134.217524, -11.963648 ], [ 134.207884, -11.962188 ], [ 134.222104, -11.953928 ] ] ], [ [ [ 134.185286, -12.096108 ], [ 134.172076, -12.112479 ], [ 134.166766, -12.107199 ], [ 134.172666, -12.089399 ], [ 134.182816, -12.086969 ], [ 134.185286, -12.096108 ] ] ], [ [ [ 133.493357, -11.511193 ], [ 133.491077, -11.519253 ], [ 133.434468, -11.505993 ], [ 133.416458, -11.526773 ], [ 133.383088, -11.543123 ], [ 133.401578, -11.506193 ], [ 133.390018, -11.488443 ], [ 133.423588, -11.490613 ], [ 133.466588, -11.464312 ], [ 133.493357, -11.511193 ] ] ], [ [ [ 133.481727, -11.615863 ], [ 133.480007, -11.623213 ], [ 133.446647, -11.617084 ], [ 133.426567, -11.629274 ], [ 133.421377, -11.645304 ], [ 133.415157, -11.625234 ], [ 133.388328, -11.633404 ], [ 133.402337, -11.659764 ], [ 133.396017, -11.673544 ], [ 133.370208, -11.681545 ], [ 133.358758, -11.664915 ], [ 133.364858, -11.642774 ], [ 133.349518, -11.623434 ], [ 133.392998, -11.603254 ], [ 133.409407, -11.584394 ], [ 133.438987, -11.587923 ], [ 133.441267, -11.599003 ], [ 133.444827, -11.592563 ], [ 133.467187, -11.591333 ], [ 133.481727, -11.615863 ] ] ], [ [ [ 133.016762, -11.067574 ], [ 133.005392, -11.086534 ], [ 132.994182, -11.087524 ], [ 132.977682, -11.043774 ], [ 133.016762, -11.067574 ] ] ], [ [ [ 132.919843, -11.168825 ], [ 132.905323, -11.161225 ], [ 132.904223, -11.150115 ], [ 132.903833, -11.160995 ], [ 132.876693, -11.170075 ], [ 132.871923, -11.156055 ], [ 132.857293, -11.146075 ], [ 132.863263, -11.139545 ], [ 132.876753, -11.146695 ], [ 132.917283, -11.139894 ], [ 132.919843, -11.168825 ] ] ], [ [ [ 132.876663, -11.046594 ], [ 132.870213, -11.060475 ], [ 132.852374, -11.058625 ], [ 132.858583, -11.044854 ], [ 132.876663, -11.046594 ] ] ], [ [ [ 132.832344, -10.973844 ], [ 132.825534, -10.998114 ], [ 132.819094, -10.967934 ], [ 132.830764, -10.967294 ], [ 132.832344, -10.973844 ] ] ], [ [ [ 132.803154, -11.388587 ], [ 132.798554, -11.395017 ], [ 132.780134, -11.389427 ], [ 132.775364, -11.375857 ], [ 132.803154, -11.388587 ] ] ], [ [ [ 132.733055, -11.285586 ], [ 132.730725, -11.295746 ], [ 132.719755, -11.289386 ], [ 132.733055, -11.285586 ] ] ], [ [ [ 132.681965, -11.188286 ], [ 132.660375, -11.211146 ], [ 132.643096, -11.210186 ], [ 132.659535, -11.187756 ], [ 132.681965, -11.188286 ] ] ], [ [ [ 132.587027, -10.987207 ], [ 132.579156, -11.007336 ], [ 132.602336, -11.117766 ], [ 132.614416, -11.129726 ], [ 132.602366, -11.142846 ], [ 132.587846, -11.139406 ], [ 132.579996, -11.160046 ], [ 132.587826, -11.176906 ], [ 132.596976, -11.178746 ], [ 132.600436, -11.170286 ], [ 132.624806, -11.172846 ], [ 132.631276, -11.186196 ], [ 132.615146, -11.186146 ], [ 132.602716, -11.204746 ], [ 132.604276, -11.218756 ], [ 132.619216, -11.232136 ], [ 132.619376, -11.284766 ], [ 132.599746, -11.300066 ], [ 132.587976, -11.355817 ], [ 132.584506, -11.336486 ], [ 132.566096, -11.328746 ], [ 132.555176, -11.310746 ], [ 132.543256, -11.252306 ], [ 132.469817, -11.156935 ], [ 132.476377, -11.148946 ], [ 132.491797, -11.155216 ], [ 132.509937, -11.138226 ], [ 132.504607, -11.124426 ], [ 132.513306, -11.092496 ], [ 132.509346, -11.082536 ], [ 132.485687, -11.078386 ], [ 132.462417, -11.032556 ], [ 132.498237, -11.056976 ], [ 132.520776, -11.053556 ], [ 132.527226, -11.042626 ], [ 132.545246, -11.052496 ], [ 132.533626, -11.042986 ], [ 132.545526, -11.042456 ], [ 132.559976, -11.029186 ], [ 132.556756, -10.994316 ], [ 132.564476, -10.979186 ], [ 132.595266, -10.970106 ], [ 132.589966, -10.988976 ], [ 132.587027, -10.987207 ] ] ], [ [ [ 132.462976, -11.621425 ], [ 132.457206, -11.628745 ], [ 132.447386, -11.621024 ], [ 132.462976, -11.621425 ] ] ], [ [ [ 132.421983, -12.116853 ], [ 132.411263, -12.138293 ], [ 132.387504, -12.138923 ], [ 132.350944, -12.108923 ], [ 132.336074, -12.085743 ], [ 132.377534, -12.072953 ], [ 132.401394, -12.076163 ], [ 132.413084, -12.088153 ], [ 132.421983, -12.116853 ] ] ], [ [ [ 132.360224, -12.170493 ], [ 132.352034, -12.188993 ], [ 132.344494, -12.172152 ], [ 132.354064, -12.155233 ], [ 132.360224, -12.170493 ] ] ], [ [ [ 132.339558, -11.524334 ], [ 132.333298, -11.540794 ], [ 132.334678, -11.514484 ], [ 132.339558, -11.524334 ] ] ], [ [ [ 132.324278, -11.581283 ], [ 132.314678, -11.600213 ], [ 132.295728, -11.586683 ], [ 132.303518, -11.563803 ], [ 132.324278, -11.581283 ] ] ], [ [ [ 132.174529, -11.584052 ], [ 132.167879, -11.585152 ], [ 132.170329, -11.576692 ], [ 132.174529, -11.584052 ] ] ], [ [ [ 132.149329, -11.606282 ], [ 132.133970, -11.627202 ], [ 132.111100, -11.620522 ], [ 132.120890, -11.590092 ], [ 132.113640, -11.575942 ], [ 132.121939, -11.564812 ], [ 132.134979, -11.568942 ], [ 132.149329, -11.606282 ] ] ], [ [ [ 131.964890, -11.483821 ], [ 131.953670, -11.486501 ], [ 131.948430, -11.473731 ], [ 131.964890, -11.483821 ] ] ], [ [ [ 130.402355, -11.363409 ], [ 130.401478, -11.367384 ], [ 130.391048, -11.366734 ], [ 130.384008, -11.346304 ], [ 130.398258, -11.318124 ], [ 130.409028, -11.318104 ], [ 130.407079, -11.301731 ], [ 130.404518, -11.301844 ], [ 130.392218, -11.284014 ], [ 130.394438, -11.266885 ], [ 130.388528, -11.274645 ], [ 130.370058, -11.264865 ], [ 130.363498, -11.251205 ], [ 130.372588, -11.170955 ], [ 130.401657, -11.166135 ], [ 130.418417, -11.186005 ], [ 130.412557, -11.174695 ], [ 130.489406, -11.262063 ], [ 130.513736, -11.279143 ], [ 130.499926, -11.271953 ], [ 130.496286, -11.278583 ], [ 130.538775, -11.284413 ], [ 130.553795, -11.266443 ], [ 130.594844, -11.289212 ], [ 130.603774, -11.321361 ], [ 130.594174, -11.322271 ], [ 130.586145, -11.336491 ], [ 130.579515, -11.326841 ], [ 130.586674, -11.342941 ], [ 130.566875, -11.340652 ], [ 130.554585, -11.361012 ], [ 130.556485, -11.383171 ], [ 130.568295, -11.397611 ], [ 130.581324, -11.402441 ], [ 130.601364, -11.386540 ], [ 130.619224, -11.387570 ], [ 130.640283, -11.372460 ], [ 130.641083, -11.356310 ], [ 130.656573, -11.335960 ], [ 130.663063, -11.341430 ], [ 130.657353, -11.400649 ], [ 130.680812, -11.427146 ], [ 130.680792, -11.444928 ], [ 130.701322, -11.441447 ], [ 130.694182, -11.464337 ], [ 130.709841, -11.486466 ], [ 130.703491, -11.494226 ], [ 130.705871, -11.513636 ], [ 130.710511, -11.489066 ], [ 130.721501, -11.507446 ], [ 130.714151, -11.493166 ], [ 130.722781, -11.470286 ], [ 130.755370, -11.479866 ], [ 130.761250, -11.498335 ], [ 130.795000, -11.511095 ], [ 130.809839, -11.525854 ], [ 130.810789, -11.538514 ], [ 130.823969, -11.538364 ], [ 130.791270, -11.491835 ], [ 130.766220, -11.484566 ], [ 130.769430, -11.465726 ], [ 130.755611, -11.459876 ], [ 130.754431, -11.446987 ], [ 130.740141, -11.442487 ], [ 130.733711, -11.427647 ], [ 130.723451, -11.420468 ], [ 130.704998, -11.421863 ], [ 130.705112, -11.423058 ], [ 130.696882, -11.426658 ], [ 130.704562, -11.385318 ], [ 130.733381, -11.386348 ], [ 130.735631, -11.380098 ], [ 130.763031, -11.375528 ], [ 130.772271, -11.364398 ], [ 130.807710, -11.364677 ], [ 130.848272, -11.354036 ], [ 130.897309, -11.308917 ], [ 130.921559, -11.312216 ], [ 130.963688, -11.332685 ], [ 130.951248, -11.334815 ], [ 130.987798, -11.339594 ], [ 130.990237, -11.354544 ], [ 131.031607, -11.367293 ], [ 131.051097, -11.343004 ], [ 131.040937, -11.317754 ], [ 131.071577, -11.303354 ], [ 131.082577, -11.302164 ], [ 131.084017, -11.310534 ], [ 131.091947, -11.303684 ], [ 131.089277, -11.331794 ], [ 131.092667, -11.320064 ], [ 131.098827, -11.323824 ], [ 131.095377, -11.305854 ], [ 131.103807, -11.312444 ], [ 131.103037, -11.306114 ], [ 131.110817, -11.308194 ], [ 131.087617, -11.300384 ], [ 131.111537, -11.280295 ], [ 131.112677, -11.259065 ], [ 131.147747, -11.249875 ], [ 131.165636, -11.265555 ], [ 131.163736, -11.278084 ], [ 131.172166, -11.286364 ], [ 131.168366, -11.313453 ], [ 131.187596, -11.334903 ], [ 131.199736, -11.311803 ], [ 131.208096, -11.310943 ], [ 131.209336, -11.344062 ], [ 131.227736, -11.305483 ], [ 131.222046, -11.313953 ], [ 131.215336, -11.304763 ], [ 131.190736, -11.303063 ], [ 131.202966, -11.284264 ], [ 131.197776, -11.269554 ], [ 131.204016, -11.236045 ], [ 131.247476, -11.217845 ], [ 131.250796, -11.193915 ], [ 131.258026, -11.190445 ], [ 131.269426, -11.197515 ], [ 131.260306, -11.210955 ], [ 131.277136, -11.189525 ], [ 131.279456, -11.204275 ], [ 131.288206, -11.193865 ], [ 131.315275, -11.228214 ], [ 131.297275, -11.258964 ], [ 131.296205, -11.268113 ], [ 131.305105, -11.274583 ], [ 131.324455, -11.272983 ], [ 131.320425, -11.276693 ], [ 131.328085, -11.279213 ], [ 131.328875, -11.255953 ], [ 131.353275, -11.249963 ], [ 131.374955, -11.264283 ], [ 131.370865, -11.283693 ], [ 131.380814, -11.298202 ], [ 131.400244, -11.291162 ], [ 131.395544, -11.267083 ], [ 131.401304, -11.258303 ], [ 131.435824, -11.265902 ], [ 131.442604, -11.286712 ], [ 131.429524, -11.295462 ], [ 131.429714, -11.304052 ], [ 131.462684, -11.328011 ], [ 131.455154, -11.351361 ], [ 131.470984, -11.370391 ], [ 131.465084, -11.385731 ], [ 131.481333, -11.398830 ], [ 131.467654, -11.401880 ], [ 131.473474, -11.405300 ], [ 131.456734, -11.412120 ], [ 131.464174, -11.412490 ], [ 131.456474, -11.419570 ], [ 131.481613, -11.402050 ], [ 131.487973, -11.387170 ], [ 131.500233, -11.383610 ], [ 131.510783, -11.396060 ], [ 131.524003, -11.394090 ], [ 131.537093, -11.413220 ], [ 131.532403, -11.424710 ], [ 131.543133, -11.452200 ], [ 131.527003, -11.476300 ], [ 131.508076, -11.465768 ], [ 131.486173, -11.474610 ], [ 131.484023, -11.487660 ], [ 131.464973, -11.497860 ], [ 131.454473, -11.546599 ], [ 131.464443, -11.572499 ], [ 131.455253, -11.580939 ], [ 131.470333, -11.586739 ], [ 131.469803, -11.608099 ], [ 131.431094, -11.605349 ], [ 131.426024, -11.613679 ], [ 131.402844, -11.588839 ], [ 131.369105, -11.580943 ], [ 131.379134, -11.592039 ], [ 131.367504, -11.605539 ], [ 131.359844, -11.603359 ], [ 131.362904, -11.609469 ], [ 131.370134, -11.603519 ], [ 131.370584, -11.609729 ], [ 131.349674, -11.649959 ], [ 131.336994, -11.658149 ], [ 131.333964, -11.679259 ], [ 131.280395, -11.739789 ], [ 131.254055, -11.734479 ], [ 131.181905, -11.791749 ], [ 131.081916, -11.836209 ], [ 131.048296, -11.881559 ], [ 131.018256, -11.885999 ], [ 130.989977, -11.906809 ], [ 130.998026, -11.908069 ], [ 130.976437, -11.933150 ], [ 130.949287, -11.940100 ], [ 130.916467, -11.895440 ], [ 130.919377, -11.900450 ], [ 130.862288, -11.854651 ], [ 130.801888, -11.845062 ], [ 130.724960, -11.802673 ], [ 130.686341, -11.796444 ], [ 130.675321, -11.780444 ], [ 130.679811, -11.761714 ], [ 130.641142, -11.747565 ], [ 130.622693, -11.723376 ], [ 130.597543, -11.717226 ], [ 130.590543, -11.702036 ], [ 130.571624, -11.701457 ], [ 130.556354, -11.672427 ], [ 130.529015, -11.679468 ], [ 130.492625, -11.654929 ], [ 130.476466, -11.620629 ], [ 130.478335, -11.592939 ], [ 130.486235, -11.589519 ], [ 130.493805, -11.564078 ], [ 130.487255, -11.547599 ], [ 130.460966, -11.535590 ], [ 130.452086, -11.516740 ], [ 130.431867, -11.502561 ], [ 130.433517, -11.474982 ], [ 130.418217, -11.454912 ], [ 130.425817, -11.425513 ], [ 130.411467, -11.408758 ], [ 130.409498, -11.367254 ], [ 130.402355, -11.363409 ] ], [ [ 131.368928, -11.580902 ], [ 131.355714, -11.577809 ], [ 131.366011, -11.585757 ], [ 131.368928, -11.580902 ] ], [ [ 130.402780, -11.361488 ], [ 130.408338, -11.360024 ], [ 130.404198, -11.355064 ], [ 130.402780, -11.361488 ] ] ], [ [ [ 131.355625, -12.101729 ], [ 131.355314, -12.111099 ], [ 131.345445, -12.111019 ], [ 131.349525, -12.096889 ], [ 131.355625, -12.101729 ] ] ], [ [ [ 131.135234, -12.012368 ], [ 131.111884, -12.023833 ], [ 131.072878, -12.014970 ], [ 131.127138, -12.000961 ], [ 131.135234, -12.012368 ] ] ], [ [ [ 131.126716, -12.059459 ], [ 131.122846, -12.070199 ], [ 131.105986, -12.075329 ], [ 131.061766, -12.069439 ], [ 131.098346, -12.052749 ], [ 131.126716, -12.059459 ] ] ], [ [ [ 131.064796, -12.037579 ], [ 131.062866, -12.046839 ], [ 131.032466, -12.058319 ], [ 131.001917, -12.052389 ], [ 131.039416, -12.031979 ], [ 131.064796, -12.037579 ] ] ], [ [ [ 131.048206, -12.112169 ], [ 131.036536, -12.127899 ], [ 131.012397, -12.118239 ], [ 131.030606, -12.098989 ], [ 131.048206, -12.112169 ] ] ], [ [ [ 130.872399, -12.548151 ], [ 130.863219, -12.560362 ], [ 130.864119, -12.546131 ], [ 130.872399, -12.548151 ] ] ], [ [ [ 130.660881, -11.814464 ], [ 130.646951, -11.821274 ], [ 130.645651, -11.809625 ], [ 130.660881, -11.814464 ] ] ], [ [ [ 130.212679, -11.712187 ], [ 130.206591, -11.724844 ], [ 130.210481, -11.719374 ], [ 130.222311, -11.725224 ], [ 130.220021, -11.730354 ], [ 130.224381, -11.726234 ], [ 130.237231, -11.746623 ], [ 130.235501, -11.723953 ], [ 130.217131, -11.717324 ], [ 130.225961, -11.717194 ], [ 130.229841, -11.703964 ], [ 130.206531, -11.693834 ], [ 130.223001, -11.670414 ], [ 130.229682, -11.686103 ], [ 130.232881, -11.680904 ], [ 130.260930, -11.706833 ], [ 130.283520, -11.698643 ], [ 130.295100, -11.725763 ], [ 130.305919, -11.733012 ], [ 130.293150, -11.692153 ], [ 130.261371, -11.698013 ], [ 130.246301, -11.678614 ], [ 130.258451, -11.675194 ], [ 130.265540, -11.661733 ], [ 130.253521, -11.673284 ], [ 130.236971, -11.661794 ], [ 130.217751, -11.631104 ], [ 130.209861, -11.642644 ], [ 130.191281, -11.642675 ], [ 130.200821, -11.585565 ], [ 130.195271, -11.571935 ], [ 130.185751, -11.572065 ], [ 130.174831, -11.557845 ], [ 130.192021, -11.536685 ], [ 130.195611, -11.516175 ], [ 130.224990, -11.507215 ], [ 130.230610, -11.528555 ], [ 130.242210, -11.534224 ], [ 130.238950, -11.539284 ], [ 130.255310, -11.537304 ], [ 130.261490, -11.571044 ], [ 130.272031, -11.570092 ], [ 130.263130, -11.559364 ], [ 130.267350, -11.546474 ], [ 130.283300, -11.539854 ], [ 130.263320, -11.542754 ], [ 130.260900, -11.527144 ], [ 130.235300, -11.520995 ], [ 130.239490, -11.495115 ], [ 130.233420, -11.497955 ], [ 130.230870, -11.484735 ], [ 130.231590, -11.497845 ], [ 130.208801, -11.511555 ], [ 130.198361, -11.507395 ], [ 130.185121, -11.484475 ], [ 130.156601, -11.491206 ], [ 130.147981, -11.482066 ], [ 130.169141, -11.462726 ], [ 130.180100, -11.429236 ], [ 130.230140, -11.406985 ], [ 130.245189, -11.366615 ], [ 130.238700, -11.388435 ], [ 130.247890, -11.398135 ], [ 130.254829, -11.376545 ], [ 130.251679, -11.346485 ], [ 130.280309, -11.342925 ], [ 130.286429, -11.361215 ], [ 130.286619, -11.343365 ], [ 130.302879, -11.341405 ], [ 130.337428, -11.318615 ], [ 130.340843, -11.324449 ], [ 130.322339, -11.333345 ], [ 130.341763, -11.326022 ], [ 130.343177, -11.328438 ], [ 130.361298, -11.379804 ], [ 130.384278, -11.405284 ], [ 130.385228, -11.418393 ], [ 130.394388, -11.416103 ], [ 130.400138, -11.425023 ], [ 130.403868, -11.447603 ], [ 130.392818, -11.472833 ], [ 130.375188, -11.484063 ], [ 130.380838, -11.494443 ], [ 130.376168, -11.507003 ], [ 130.402397, -11.539932 ], [ 130.429936, -11.549801 ], [ 130.452126, -11.573240 ], [ 130.452576, -11.567020 ], [ 130.463716, -11.575009 ], [ 130.460416, -11.621800 ], [ 130.448726, -11.627150 ], [ 130.464676, -11.629359 ], [ 130.468346, -11.666179 ], [ 130.516895, -11.691238 ], [ 130.556094, -11.692757 ], [ 130.564254, -11.707047 ], [ 130.584873, -11.708887 ], [ 130.592293, -11.730516 ], [ 130.617383, -11.733966 ], [ 130.641115, -11.756842 ], [ 130.612542, -11.821155 ], [ 130.603662, -11.827085 ], [ 130.581643, -11.826936 ], [ 130.570633, -11.810706 ], [ 130.563243, -11.816416 ], [ 130.567773, -11.821046 ], [ 130.545793, -11.819007 ], [ 130.503384, -11.830348 ], [ 130.393117, -11.801420 ], [ 130.367818, -11.780131 ], [ 130.312259, -11.770892 ], [ 130.130813, -11.825185 ], [ 130.064924, -11.818515 ], [ 130.048854, -11.824076 ], [ 130.023794, -11.797326 ], [ 130.020444, -11.778906 ], [ 130.033154, -11.756296 ], [ 130.080754, -11.768806 ], [ 130.061484, -11.750936 ], [ 130.076503, -11.669096 ], [ 130.090043, -11.670996 ], [ 130.122543, -11.707245 ], [ 130.157252, -11.705065 ], [ 130.202311, -11.649434 ], [ 130.214271, -11.664444 ], [ 130.203541, -11.694074 ], [ 130.221691, -11.703864 ], [ 130.213221, -11.714954 ], [ 130.212679, -11.712187 ] ], [ [ 130.212108, -11.709274 ], [ 130.211251, -11.704904 ], [ 130.204951, -11.706724 ], [ 130.212108, -11.709274 ] ] ], [ [ [ 130.342921, -11.327712 ], [ 130.341914, -11.325964 ], [ 130.342258, -11.325835 ], [ 130.342921, -11.327712 ] ] ], [ [ [ 130.544335, -12.704475 ], [ 130.535585, -12.709786 ], [ 130.525565, -12.702116 ], [ 130.524044, -12.661775 ], [ 130.499214, -12.645465 ], [ 130.486644, -12.623655 ], [ 130.494903, -12.596405 ], [ 130.484753, -12.580365 ], [ 130.508112, -12.574204 ], [ 130.517302, -12.557594 ], [ 130.521352, -12.589344 ], [ 130.510072, -12.590704 ], [ 130.502953, -12.610255 ], [ 130.511013, -12.617035 ], [ 130.517824, -12.650585 ], [ 130.541664, -12.679845 ], [ 130.544335, -12.704475 ] ] ], [ [ [ 130.434365, -12.579846 ], [ 130.416766, -12.592066 ], [ 130.405366, -12.573876 ], [ 130.420655, -12.563576 ], [ 130.434365, -12.579846 ] ] ], [ [ [ 130.416196, -12.595006 ], [ 130.400667, -12.601807 ], [ 130.391797, -12.587107 ], [ 130.404336, -12.581336 ], [ 130.416196, -12.595006 ] ] ], [ [ [ 130.408387, -12.608127 ], [ 130.401827, -12.615137 ], [ 130.385017, -12.602487 ], [ 130.408387, -12.608127 ] ] ], [ [ [ 130.396427, -12.626567 ], [ 130.386428, -12.643077 ], [ 130.368478, -12.642067 ], [ 130.364898, -12.624997 ], [ 130.370648, -12.619457 ], [ 130.385607, -12.617417 ], [ 130.396427, -12.626567 ] ] ], [ [ [ 130.109606, -13.220099 ], [ 130.097606, -13.221249 ], [ 130.085006, -13.209869 ], [ 130.090966, -13.192789 ], [ 130.101936, -13.194009 ], [ 130.109606, -13.220099 ] ] ], [ [ [ 130.075006, -13.171240 ], [ 130.068106, -13.182440 ], [ 130.047187, -13.175930 ], [ 130.041097, -13.183170 ], [ 130.020437, -13.179820 ], [ 130.018477, -13.111220 ], [ 130.027657, -13.150870 ], [ 130.057656, -13.152060 ], [ 130.075006, -13.171240 ] ] ], [ [ [ 129.732061, -14.804138 ], [ 129.719851, -14.813268 ], [ 129.698121, -14.809508 ], [ 129.670741, -14.784378 ], [ 129.732061, -14.804138 ] ] ] + ] + } + }, + { + "type": "Feature", + "id": 7, + "properties": { + "STATE_CODE": "8", + "STATE_NAME": "Australian Capital Territory" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ [ 149.399284, -35.319175 ], [ 149.352134, -35.351317 ], [ 149.336502, -35.339914 ], [ 149.254815, -35.330079 ], [ 149.207546, -35.345305 ], [ 149.146586, -35.414836 ], [ 149.139052, -35.432543 ], [ 149.155134, -35.436628 ], [ 149.135550, -35.454422 ], [ 149.151279, -35.506926 ], [ 149.131376, -35.554173 ], [ 149.142510, -35.592570 ], [ 149.084514, -35.580594 ], [ 149.078043, -35.586127 ], [ 149.087612, -35.639697 ], [ 149.097495, -35.647313 ], [ 149.095379, -35.679285 ], [ 149.109483, -35.696640 ], [ 149.090716, -35.765600 ], [ 149.101481, -35.803698 ], [ 149.093517, -35.824221 ], [ 149.095682, -35.845716 ], [ 149.064408, -35.874932 ], [ 149.048811, -35.920410 ], [ 149.012198, -35.899697 ], [ 148.959133, -35.895456 ], [ 148.909367, -35.853065 ], [ 148.907065, -35.829563 ], [ 148.886623, -35.810063 ], [ 148.897776, -35.794650 ], [ 148.894887, -35.771654 ], [ 148.903348, -35.757798 ], [ 148.894087, -35.751288 ], [ 148.886633, -35.719136 ], [ 148.877693, -35.714936 ], [ 148.872491, -35.721422 ], [ 148.855652, -35.760874 ], [ 148.856132, -35.753518 ], [ 148.835715, -35.741884 ], [ 148.822423, -35.720900 ], [ 148.791182, -35.703449 ], [ 148.798434, -35.666492 ], [ 148.767495, -35.647323 ], [ 148.783462, -35.628342 ], [ 148.768473, -35.603186 ], [ 148.788758, -35.588179 ], [ 148.773039, -35.568157 ], [ 148.778231, -35.558852 ], [ 148.769231, -35.544096 ], [ 148.772364, -35.529329 ], [ 148.762675, -35.495505 ], [ 148.774354, -35.486003 ], [ 148.767058, -35.465405 ], [ 148.788868, -35.426382 ], [ 148.785764, -35.408748 ], [ 148.796119, -35.406549 ], [ 148.795719, -35.392920 ], [ 148.808702, -35.382373 ], [ 148.793247, -35.339156 ], [ 148.807854, -35.309647 ], [ 149.120902, -35.124517 ], [ 149.138819, -35.128466 ], [ 149.138600, -35.135257 ], [ 149.149637, -35.138669 ], [ 149.146775, -35.144856 ], [ 149.164312, -35.142046 ], [ 149.167696, -35.159881 ], [ 149.189097, -35.165677 ], [ 149.183629, -35.175618 ], [ 149.197037, -35.185499 ], [ 149.189701, -35.203308 ], [ 149.208568, -35.211501 ], [ 149.204883, -35.229549 ], [ 149.214063, -35.219507 ], [ 149.238597, -35.222127 ], [ 149.246790, -35.229217 ], [ 149.234884, -35.242822 ], [ 149.273132, -35.259287 ], [ 149.272048, -35.273644 ], [ 149.315286, -35.276286 ], [ 149.322394, -35.286708 ], [ 149.341384, -35.286648 ], [ 149.361948, -35.308998 ], [ 149.394790, -35.303157 ], [ 149.399284, -35.319175 ] ], [ [ 149.153176, -35.304976 ], [ 149.136510, -35.289256 ], [ 149.122879, -35.286560 ], [ 149.118459, -35.293608 ], [ 149.110274, -35.284577 ], [ 149.114443, -35.280492 ], [ 149.103116, -35.285130 ], [ 149.101406, -35.294277 ], [ 149.099252, -35.285600 ], [ 149.088030, -35.285150 ], [ 149.083012, -35.296961 ], [ 149.071123, -35.298567 ], [ 149.084355, -35.303898 ], [ 149.095399, -35.287391 ], [ 149.101389, -35.301479 ], [ 149.126110, -35.294247 ], [ 149.144619, -35.310156 ], [ 149.153176, -35.304976 ] ] + ] + } + } + ] + } \ No newline at end of file diff --git a/assets/london_to_british.json b/assets/london_to_british.json new file mode 100644 index 00000000..c1786426 --- /dev/null +++ b/assets/london_to_british.json @@ -0,0 +1,23 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "type": "Feature", + "properties": { + "name": "London Heathrow - The British Museum" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [-0.45418, 51.470012], [-0.454211, 51.470131], [-0.454384, 51.471098], [-0.454381, 51.471164], [-0.454327, 51.471349], [-0.454235, 51.471511], [-0.454055, 51.471728], [-0.453995, 51.471801], [-0.453784, 51.471964], [-0.453531, 51.472142], [-0.453393, 51.472268], [-0.453247, 51.472459], [-0.453203, 51.472547], [-0.453126, 51.472833], [-0.453096, 51.473142], [-0.453018, 51.474092], [-0.453048, 51.479588], [-0.45305, 51.479771], [-0.453062, 51.480131], [-0.453088, 51.480273], [-0.453224, 51.480429], [-0.453293, 51.480481], [-0.453412, 51.480612], [-0.453527, 51.480814], [-0.453566, 51.480992], [-0.453554, 51.481264], [-0.453509, 51.481688], [-0.453468, 51.481818], [-0.453407, 51.481882], [-0.453348, 51.481936], [-0.453268, 51.481994], [-0.453036, 51.482137], [-0.452985, 51.482187], [-0.452947, 51.482272], [-0.45292, 51.482379], [-0.452904, 51.482526], [-0.452717, 51.48456], [-0.452706, 51.484918], [-0.452736, 51.485594], [-0.452829, 51.486307], [-0.452929, 51.486801], [-0.4531, 51.4874], [-0.453566, 51.488738], [-0.453714, 51.489269], [-0.453813, 51.489788], [-0.45387, 51.49018], [-0.453906, 51.490679], [-0.453904, 51.491128], [-0.453849, 51.491854], [-0.453716, 51.493106], [-0.453699, 51.493249], [-0.453618, 51.49399], [-0.453609, 51.494079], [-0.453514, 51.494635], [-0.453521, 51.494752], [-0.453562, 51.494867], [-0.453708, 51.495034], [-0.453933, 51.495205], [-0.454136, 51.49538], [-0.45419, 51.495429], [-0.454233, 51.495517], [-0.454224, 51.495586], [-0.454203, 51.49576], [-0.45408, 51.496027], [-0.454016, 51.496109], [-0.453954, 51.496177], [-0.453904, 51.496201], [-0.453831, 51.496268], [-0.453657, 51.496344], [-0.453433, 51.49638], [-0.453146, 51.496361], [-0.452941, 51.496328], [-0.452846, 51.496308], [-0.452732, 51.496267], [-0.452383, 51.496099], [-0.452171, 51.496027], [-0.451951, 51.495982], [-0.451811, 51.495963], [-0.45035, 51.49582], [-0.449902, 51.495769], [-0.448098, 51.495569], [-0.447369, 51.49546], [-0.445226, 51.495181], [-0.444087, 51.494972], [-0.441619, 51.494724], [-0.437515, 51.494346], [-0.433587, 51.494024], [-0.431731, 51.493879], [-0.430658, 51.493805], [-0.428775, 51.493677], [-0.428542, 51.493659], [-0.425186, 51.493427], [-0.420226, 51.493085], [-0.420005, 51.49307], [-0.418827, 51.492969], [-0.415639, 51.492751], [-0.411881, 51.492497], [-0.411427, 51.492466], [-0.410737, 51.492413], [-0.40978, 51.492321], [-0.409224, 51.492259], [-0.409053, 51.492237], [-0.408337, 51.492121], [-0.408152, 51.492094], [-0.407468, 51.49199], [-0.406504, 51.491815], [-0.405415, 51.491598], [-0.404572, 51.491376], [-0.402547, 51.490868], [-0.397749, 51.489596], [-0.394436, 51.488757], [-0.393189, 51.488482], [-0.392301, 51.488321], [-0.391191, 51.488147], [-0.389274, 51.487973], [-0.387193, 51.487865], [-0.385316, 51.48789], [-0.384002, 51.487968], [-0.382099, 51.48816], [-0.380756, 51.488355], [-0.377931, 51.48881], [-0.376633, 51.488992], [-0.371283, 51.489637], [-0.368778, 51.489984], [-0.367392, 51.490234], [-0.366027, 51.490543], [-0.364579, 51.490968], [-0.363353, 51.491349], [-0.362012, 51.491865], [-0.359469, 51.49291], [-0.357764, 51.49356], [-0.356197, 51.494029], [-0.353744, 51.494614], [-0.351757, 51.494944], [-0.350856, 51.495057], [-0.348905, 51.495229], [-0.344468, 51.495519], [-0.341422, 51.495706], [-0.341081, 51.49573], [-0.338574, 51.495888], [-0.337184, 51.495964], [-0.336089, 51.495958], [-0.335455, 51.495921], [-0.335055, 51.495899], [-0.334476, 51.49584], [-0.33368, 51.495737], [-0.332993, 51.495625], [-0.332242, 51.495463], [-0.331367, 51.495245], [-0.330636, 51.495012], [-0.329943, 51.49477], [-0.327975, 51.493965], [-0.326064, 51.493215], [-0.324693, 51.492633], [-0.323869, 51.492291], [-0.319529, 51.490549], [-0.317572, 51.489807], [-0.317003, 51.489634], [-0.31648, 51.489509], [-0.315523, 51.489339], [-0.314988, 51.489281], [-0.314446, 51.489248], [-0.313357, 51.489226], [-0.312818, 51.489251], [-0.311799, 51.489335], [-0.310857, 51.48949], [-0.310225, 51.489624], [-0.309329, 51.489882], [-0.306517, 51.490852], [-0.306048, 51.490993], [-0.305063, 51.49121], [-0.304533, 51.491293], [-0.304022, 51.491351], [-0.303491, 51.491388], [-0.301882, 51.491431], [-0.299729, 51.491447], [-0.294034, 51.491386], [-0.293341, 51.491383], [-0.292816, 51.491396], [-0.292551, 51.49142], [-0.292288, 51.491452], [-0.291776, 51.49155], [-0.291057, 51.491761], [-0.288302, 51.49277], [-0.287795, 51.492889], [-0.287527, 51.492919], [-0.287251, 51.492933], [-0.286981, 51.492926], [-0.286712, 51.4929], [-0.285386, 51.492657], [-0.284605, 51.492495], [-0.284018, 51.492318], [-0.283647, 51.492182], [-0.283338, 51.492058], [-0.280227, 51.490646], [-0.279391, 51.49026], [-0.278474, 51.489884], [-0.27792, 51.489682], [-0.277037, 51.489374], [-0.276451, 51.489162], [-0.27617, 51.489066], [-0.275843, 51.488968], [-0.274316, 51.488621], [-0.273652, 51.488481], [-0.273287, 51.488416], [-0.272636, 51.488316], [-0.271149, 51.488218], [-0.270181, 51.488129], [-0.268152, 51.487736], [-0.267983, 51.487718], [-0.267336, 51.48769], [-0.267115, 51.487684], [-0.266542, 51.487685], [-0.262117, 51.487624], [-0.258768, 51.487666], [-0.258202, 51.487656], [-0.257674, 51.487622], [-0.256742, 51.487528], [-0.254685, 51.487214], [-0.253719, 51.487085], [-0.253277, 51.487069], [-0.25303, 51.487112], [-0.252838, 51.487172], [-0.252739, 51.487207], [-0.252723, 51.487219], [-0.252541, 51.487272], [-0.252392, 51.487286], [-0.252333, 51.48729], [-0.2521, 51.48731], [-0.251931, 51.487341], [-0.251731, 51.48741], [-0.250639, 51.487936], [-0.249727, 51.488344], [-0.24771, 51.489166], [-0.246582, 51.489625], [-0.246095, 51.489824], [-0.245016, 51.490239], [-0.244429, 51.490441], [-0.243805, 51.490614], [-0.241754, 51.491115], [-0.241375, 51.491193], [-0.240929, 51.49127], [-0.240394, 51.491336], [-0.239756, 51.491378], [-0.238413, 51.491407], [-0.237732, 51.491412], [-0.237065, 51.491405], [-0.236238, 51.491379], [-0.235686, 51.491361], [-0.235119, 51.491322], [-0.232706, 51.491097], [-0.232029, 51.491024], [-0.231346, 51.490968], [-0.231063, 51.490961], [-0.230743, 51.490975], [-0.229546, 51.491042], [-0.228106, 51.491116], [-0.226419, 51.491221], [-0.225154, 51.491254], [-0.221769, 51.491289], [-0.220427, 51.49132], [-0.219945, 51.491318], [-0.219464, 51.491298], [-0.219006, 51.491242], [-0.21854, 51.491148], [-0.21743, 51.490922], [-0.217016, 51.490843], [-0.216734, 51.490808], [-0.216353, 51.490791], [-0.215147, 51.490827], [-0.213579, 51.490812], [-0.213241, 51.490784], [-0.213101, 51.490771], [-0.211199, 51.490577], [-0.210636, 51.490544], [-0.209891, 51.490544], [-0.209518, 51.490559], [-0.208844, 51.490631], [-0.208687, 51.490652], [-0.207182, 51.490908], [-0.207124, 51.490919], [-0.206927, 51.490957], [-0.206581, 51.491015], [-0.205449, 51.491227], [-0.20451, 51.491422], [-0.204467, 51.491427], [-0.203743, 51.491517], [-0.202652, 51.491624], [-0.202241, 51.491735], [-0.201697, 51.491914], [-0.201428, 51.492049], [-0.201192, 51.492211], [-0.200714, 51.49265], [-0.200618, 51.492686], [-0.200581, 51.492713], [-0.200406, 51.492813], [-0.200297, 51.49287], [-0.200191, 51.492908], [-0.200158, 51.492983], [-0.198931, 51.493416], [-0.198889, 51.493431], [-0.198207, 51.493671], [-0.197986, 51.493748], [-0.195712, 51.494539], [-0.195503, 51.494611], [-0.195382, 51.494648], [-0.195287, 51.49467], [-0.195069, 51.494714], [-0.194823, 51.494726], [-0.192309, 51.494781], [-0.192237, 51.494785], [-0.192112, 51.494786], [-0.191155, 51.494761], [-0.190905, 51.494751], [-0.190857, 51.494749], [-0.190532, 51.49474], [-0.189627, 51.494714], [-0.188777, 51.494689], [-0.188667, 51.494687], [-0.188355, 51.494691], [-0.187651, 51.494707], [-0.186033, 51.49484], [-0.185949, 51.494847], [-0.184954, 51.494923], [-0.184889, 51.494929], [-0.184314, 51.494964], [-0.182997, 51.495049], [-0.182842, 51.495062], [-0.182672, 51.495075], [-0.182259, 51.495107], [-0.180968, 51.495206], [-0.180044, 51.495277], [-0.179428, 51.495325], [-0.179218, 51.495341], [-0.179087, 51.495351], [-0.178921, 51.495365], [-0.178632, 51.495388], [-0.177665, 51.495463], [-0.177553, 51.495471], [-0.175582, 51.49561], [-0.175071, 51.495652], [-0.173756, 51.495762], [-0.17371, 51.495766], [-0.17357, 51.495778], [-0.173453, 51.495788], [-0.173371, 51.495799], [-0.172548, 51.495868], [-0.172395, 51.495886], [-0.171778, 51.495993], [-0.171551, 51.496034], [-0.171338, 51.496077], [-0.170714, 51.49623], [-0.170246, 51.496363], [-0.170004, 51.496432], [-0.169847, 51.496476], [-0.169545, 51.496563], [-0.169498, 51.496577], [-0.169473, 51.496584], [-0.169243, 51.496658], [-0.169167, 51.496686], [-0.16906, 51.49674], [-0.16897, 51.496781], [-0.168926, 51.496803], [-0.168842, 51.496848], [-0.168765, 51.496887], [-0.168705, 51.49692], [-0.168562, 51.497004], [-0.168328, 51.497151], [-0.16829, 51.497174], [-0.168149, 51.497257], [-0.167994, 51.497349], [-0.167821, 51.497452], [-0.167615, 51.497574], [-0.16752, 51.49763], [-0.167498, 51.497643], [-0.167325, 51.497745], [-0.166917, 51.497972], [-0.166349, 51.49827], [-0.166151, 51.498372], [-0.165976, 51.498421], [-0.165701, 51.498545], [-0.165452, 51.498671], [-0.165293, 51.498744], [-0.165077, 51.498859], [-0.164486, 51.499178], [-0.164164, 51.499351], [-0.163686, 51.499611], [-0.163315, 51.499825], [-0.163032, 51.499998], [-0.162536, 51.500351], [-0.162161, 51.500677], [-0.162087, 51.500738], [-0.161891, 51.500903], [-0.161591, 51.501155], [-0.161221, 51.501418], [-0.161209, 51.501472], [-0.161103, 51.501588], [-0.161061, 51.501664], [-0.16104, 51.501692], [-0.161015, 51.50173], [-0.160979, 51.501757], [-0.160904, 51.501771], [-0.160669, 51.501821], [-0.160473, 51.501864], [-0.160321, 51.501893], [-0.160255, 51.501906], [-0.160197, 51.501918], [-0.160013, 51.501951], [-0.15993, 51.501915], [-0.159533, 51.502001], [-0.159507, 51.502048], [-0.159103, 51.502134], [-0.15894, 51.502166], [-0.158852, 51.502151], [-0.158615, 51.502199], [-0.158598, 51.502235], [-0.158465, 51.502258], [-0.158375, 51.502268], [-0.158326, 51.502238], [-0.157022, 51.502302], [-0.156756, 51.502353], [-0.156347, 51.502401], [-0.155916, 51.502492], [-0.155837, 51.502508], [-0.153858, 51.502828], [-0.153642, 51.502868], [-0.1531, 51.502999], [-0.152822, 51.503052], [-0.152262, 51.503097], [-0.151882, 51.503106], [-0.150917, 51.503094], [-0.150618, 51.503116], [-0.150131, 51.503199], [-0.149813, 51.503284], [-0.149623, 51.503357], [-0.148988, 51.503646], [-0.14819, 51.504016], [-0.147869, 51.504186], [-0.147841, 51.504252], [-0.14748, 51.50442], [-0.146811, 51.504761], [-0.146657, 51.504839], [-0.146431, 51.504956], [-0.146364, 51.504991], [-0.145357, 51.505507], [-0.145082, 51.505653], [-0.144927, 51.505735], [-0.144665, 51.505815], [-0.144536, 51.505881], [-0.144011, 51.506172], [-0.143499, 51.506432], [-0.1432, 51.506575], [-0.143028, 51.506658], [-0.142897, 51.506725], [-0.142868, 51.506739], [-0.142154, 51.507084], [-0.142041, 51.507136], [-0.141975, 51.507218], [-0.141522, 51.507436], [-0.14133, 51.507528], [-0.140725, 51.507774], [-0.140647, 51.507806], [-0.140445, 51.507889], [-0.140123, 51.508018], [-0.139988, 51.508073], [-0.139705, 51.50817], [-0.139447, 51.508264], [-0.139335, 51.508257], [-0.139276, 51.508276], [-0.139109, 51.508331], [-0.138905, 51.508397], [-0.138849, 51.508417], [-0.138795, 51.508464], [-0.138701, 51.508492], [-0.13865, 51.508507], [-0.138215, 51.508644], [-0.137589, 51.508834], [-0.137211, 51.508954], [-0.137099, 51.508991], [-0.136805, 51.509085], [-0.135944, 51.509385], [-0.135853, 51.509413], [-0.135084, 51.509658], [-0.134931, 51.509709], [-0.134872, 51.509769], [-0.134863, 51.509825], [-0.134864, 51.509886], [-0.134815, 51.509986], [-0.134712, 51.510057], [-0.134649, 51.510087], [-0.134399, 51.510196], [-0.134277, 51.510273], [-0.134245, 51.510306], [-0.134171, 51.510415], [-0.133988, 51.510637], [-0.13394, 51.510695], [-0.133951, 51.510758], [-0.133897, 51.510814], [-0.133841, 51.510825], [-0.133831, 51.510836], [-0.133556, 51.511121], [-0.133335, 51.511299], [-0.133027, 51.511496], [-0.132771, 51.511629], [-0.132377, 51.511814], [-0.131544, 51.512164], [-0.131466, 51.512196], [-0.131415, 51.512213], [-0.131149, 51.512304], [-0.130686, 51.512473], [-0.130601, 51.512506], [-0.130394, 51.512586], [-0.130243, 51.512641], [-0.129931, 51.512782], [-0.12984, 51.512821], [-0.129605, 51.512923], [-0.129346, 51.513091], [-0.129304, 51.513121], [-0.129079, 51.513281], [-0.12914, 51.513394], [-0.129177, 51.513444], [-0.12919, 51.513467], [-0.129203, 51.513489], [-0.12938, 51.513773], [-0.129418, 51.513805], [-0.129452, 51.513857], [-0.129469, 51.513894], [-0.129454, 51.513922], [-0.129596, 51.514197], [-0.12964, 51.514301], [-0.129721, 51.514495], [-0.129885, 51.514865], [-0.129922, 51.51496], [-0.129934, 51.514988], [-0.129961, 51.515043], [-0.130007, 51.515129], [-0.130019, 51.515153], [-0.130089, 51.515286], [-0.130096, 51.515301], [-0.130142, 51.515392], [-0.130221, 51.515582], [-0.130282, 51.515756], [-0.130339, 51.516226], [-0.130342, 51.516241], [-0.130377, 51.516413], [-0.130383, 51.516476], [-0.13042, 51.516577], [-0.130637, 51.516914], [-0.130777, 51.517086], [-0.130722, 51.517102], [-0.130659, 51.517116], [-0.130006, 51.517265], [-0.129652, 51.517345], [-0.129501, 51.517381], [-0.129449, 51.517391], [-0.1289, 51.517515], [-0.128647, 51.517572], [-0.128413, 51.517624], [-0.128256, 51.517657], [-0.128168, 51.51769], [-0.12769, 51.517795], [-0.127629, 51.517806], [-0.127476, 51.517823], [-0.127446, 51.51783], [-0.127105, 51.517911], [-0.126977, 51.517944], [-0.126734, 51.518006], [-0.126114, 51.518228], [-0.125862, 51.51833], [-0.125711, 51.518391], [-0.125377, 51.518532], [-0.124792, 51.518776], [-0.124732, 51.518802], [-0.124573, 51.518871], [-0.124411, 51.518942], [-0.124456, 51.518979], [-0.124508, 51.519022], [-0.125429, 51.519793], [-0.125676, 51.520003 ] + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/london_to_chessington.json b/assets/london_to_chessington.json new file mode 100644 index 00000000..502f5179 --- /dev/null +++ b/assets/london_to_chessington.json @@ -0,0 +1,1822 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "type": "Feature", + "properties": { + "name": "London Heathrow - Churchill's War Rooms" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + -0.45418, + 51.470012 + ], + [ + -0.454211, + 51.470131 + ], + [ + -0.454384, + 51.471098 + ], + [ + -0.454381, + 51.471164 + ], + [ + -0.454327, + 51.471349 + ], + [ + -0.454235, + 51.471511 + ], + [ + -0.454055, + 51.471728 + ], + [ + -0.453995, + 51.471801 + ], + [ + -0.453784, + 51.471964 + ], + [ + -0.453531, + 51.472142 + ], + [ + -0.453393, + 51.472268 + ], + [ + -0.453247, + 51.472459 + ], + [ + -0.453203, + 51.472547 + ], + [ + -0.453126, + 51.472833 + ], + [ + -0.453096, + 51.473142 + ], + [ + -0.453018, + 51.474092 + ], + [ + -0.453048, + 51.479588 + ], + [ + -0.45305, + 51.479771 + ], + [ + -0.453062, + 51.480131 + ], + [ + -0.453088, + 51.480273 + ], + [ + -0.453224, + 51.480429 + ], + [ + -0.453293, + 51.480481 + ], + [ + -0.453412, + 51.480612 + ], + [ + -0.453527, + 51.480814 + ], + [ + -0.453566, + 51.480992 + ], + [ + -0.453554, + 51.481264 + ], + [ + -0.453509, + 51.481688 + ], + [ + -0.453468, + 51.481818 + ], + [ + -0.453407, + 51.481882 + ], + [ + -0.453348, + 51.481936 + ], + [ + -0.453268, + 51.481994 + ], + [ + -0.453036, + 51.482137 + ], + [ + -0.452985, + 51.482187 + ], + [ + -0.452947, + 51.482272 + ], + [ + -0.45292, + 51.482379 + ], + [ + -0.452904, + 51.482526 + ], + [ + -0.452717, + 51.48456 + ], + [ + -0.452706, + 51.484918 + ], + [ + -0.452736, + 51.485594 + ], + [ + -0.452829, + 51.486307 + ], + [ + -0.452929, + 51.486801 + ], + [ + -0.4531, + 51.4874 + ], + [ + -0.453566, + 51.488738 + ], + [ + -0.453714, + 51.489269 + ], + [ + -0.453813, + 51.489788 + ], + [ + -0.45387, + 51.49018 + ], + [ + -0.453906, + 51.490679 + ], + [ + -0.453904, + 51.491128 + ], + [ + -0.453849, + 51.491854 + ], + [ + -0.453716, + 51.493106 + ], + [ + -0.453699, + 51.493249 + ], + [ + -0.453618, + 51.49399 + ], + [ + -0.453609, + 51.494079 + ], + [ + -0.453514, + 51.494635 + ], + [ + -0.453521, + 51.494752 + ], + [ + -0.453562, + 51.494867 + ], + [ + -0.453708, + 51.495034 + ], + [ + -0.453933, + 51.495205 + ], + [ + -0.454428, + 51.49532 + ], + [ + -0.454569, + 51.495359 + ], + [ + -0.454716, + 51.495384 + ], + [ + -0.454855, + 51.4954 + ], + [ + -0.455013, + 51.495416 + ], + [ + -0.455804, + 51.495486 + ], + [ + -0.456745, + 51.495557 + ], + [ + -0.457669, + 51.495613 + ], + [ + -0.460512, + 51.495732 + ], + [ + -0.461487, + 51.495707 + ], + [ + -0.463005, + 51.495608 + ], + [ + -0.464291, + 51.495467 + ], + [ + -0.469739, + 51.494793 + ], + [ + -0.471266, + 51.494655 + ], + [ + -0.473867, + 51.494469 + ], + [ + -0.475928, + 51.494381 + ], + [ + -0.477438, + 51.494347 + ], + [ + -0.47937, + 51.494313 + ], + [ + -0.482595, + 51.494117 + ], + [ + -0.483157, + 51.494087 + ], + [ + -0.483577, + 51.494077 + ], + [ + -0.485169, + 51.494065 + ], + [ + -0.485681, + 51.494078 + ], + [ + -0.486181, + 51.49408 + ], + [ + -0.48688, + 51.494099 + ], + [ + -0.487868, + 51.494097 + ], + [ + -0.488257, + 51.494072 + ], + [ + -0.488576, + 51.494037 + ], + [ + -0.489294, + 51.493925 + ], + [ + -0.489542, + 51.49386 + ], + [ + -0.490226, + 51.493653 + ], + [ + -0.491188, + 51.493298 + ], + [ + -0.491608, + 51.49311 + ], + [ + -0.492438, + 51.492663 + ], + [ + -0.492896, + 51.492356 + ], + [ + -0.493328, + 51.492026 + ], + [ + -0.493668, + 51.491719 + ], + [ + -0.494038, + 51.491343 + ], + [ + -0.494357, + 51.490995 + ], + [ + -0.49457, + 51.49072 + ], + [ + -0.494801, + 51.490371 + ], + [ + -0.495114, + 51.489888 + ], + [ + -0.49542, + 51.489332 + ], + [ + -0.496029, + 51.488395 + ], + [ + -0.496531, + 51.487729 + ], + [ + -0.496948, + 51.487283 + ], + [ + -0.497278, + 51.486891 + ], + [ + -0.497885, + 51.486235 + ], + [ + -0.499131, + 51.48499 + ], + [ + -0.500052, + 51.484121 + ], + [ + -0.50041, + 51.483767 + ], + [ + -0.50082, + 51.483319 + ], + [ + -0.501373, + 51.48268 + ], + [ + -0.501828, + 51.482092 + ], + [ + -0.502076, + 51.481736 + ], + [ + -0.502532, + 51.481012 + ], + [ + -0.502691, + 51.480727 + ], + [ + -0.503371, + 51.479289 + ], + [ + -0.503515, + 51.479 + ], + [ + -0.503694, + 51.478451 + ], + [ + -0.503759, + 51.478159 + ], + [ + -0.503844, + 51.477815 + ], + [ + -0.503862, + 51.477631 + ], + [ + -0.504363, + 51.475275 + ], + [ + -0.504554, + 51.474525 + ], + [ + -0.504828, + 51.47366 + ], + [ + -0.505146, + 51.472842 + ], + [ + -0.505491, + 51.47208 + ], + [ + -0.506126, + 51.470891 + ], + [ + -0.5068, + 51.469838 + ], + [ + -0.507474, + 51.468926 + ], + [ + -0.508181, + 51.468069 + ], + [ + -0.508753, + 51.467439 + ], + [ + -0.509754, + 51.466442 + ], + [ + -0.510592, + 51.465701 + ], + [ + -0.511798, + 51.464725 + ], + [ + -0.514576, + 51.46267 + ], + [ + -0.51487, + 51.462401 + ], + [ + -0.515871, + 51.461499 + ], + [ + -0.5161, + 51.461314 + ], + [ + -0.516697, + 51.460675 + ], + [ + -0.517189, + 51.460112 + ], + [ + -0.51797, + 51.459016 + ], + [ + -0.518345, + 51.458368 + ], + [ + -0.518861, + 51.457281 + ], + [ + -0.519409, + 51.455865 + ], + [ + -0.520433, + 51.453299 + ], + [ + -0.521173, + 51.4519 + ], + [ + -0.52171, + 51.451157 + ], + [ + -0.522214, + 51.450548 + ], + [ + -0.522773, + 51.449977 + ], + [ + -0.524187, + 51.448758 + ], + [ + -0.524492, + 51.448526 + ], + [ + -0.526144, + 51.447358 + ], + [ + -0.526793, + 51.446929 + ], + [ + -0.528091, + 51.445831 + ], + [ + -0.528556, + 51.445344 + ], + [ + -0.528921, + 51.444919 + ], + [ + -0.529283, + 51.444445 + ], + [ + -0.529692, + 51.443836 + ], + [ + -0.529929, + 51.443423 + ], + [ + -0.530095, + 51.443102 + ], + [ + -0.531007, + 51.441117 + ], + [ + -0.531746, + 51.439866 + ], + [ + -0.53225, + 51.439273 + ], + [ + -0.532969, + 51.438577 + ], + [ + -0.533494, + 51.438106 + ], + [ + -0.533867, + 51.437794 + ], + [ + -0.535125, + 51.436846 + ], + [ + -0.53591, + 51.436277 + ], + [ + -0.53626, + 51.435989 + ], + [ + -0.536651, + 51.435644 + ], + [ + -0.536958, + 51.435364 + ], + [ + -0.537099, + 51.435225 + ], + [ + -0.537856, + 51.434438 + ], + [ + -0.538729, + 51.433355 + ], + [ + -0.539041, + 51.432846 + ], + [ + -0.539543, + 51.432061 + ], + [ + -0.539793, + 51.431578 + ], + [ + -0.539935, + 51.431274 + ], + [ + -0.540032, + 51.431045 + ], + [ + -0.540262, + 51.430447 + ], + [ + -0.540447, + 51.429848 + ], + [ + -0.540596, + 51.429201 + ], + [ + -0.540703, + 51.428556 + ], + [ + -0.540766, + 51.427894 + ], + [ + -0.540777, + 51.427314 + ], + [ + -0.540747, + 51.426694 + ], + [ + -0.540661, + 51.425963 + ], + [ + -0.540618, + 51.425721 + ], + [ + -0.540563, + 51.425446 + ], + [ + -0.540026, + 51.423459 + ], + [ + -0.539701, + 51.422004 + ], + [ + -0.539537, + 51.421126 + ], + [ + -0.539434, + 51.420039 + ], + [ + -0.539452, + 51.418612 + ], + [ + -0.539557, + 51.417431 + ], + [ + -0.539745, + 51.416422 + ], + [ + -0.540608, + 51.41291 + ], + [ + -0.540709, + 51.412363 + ], + [ + -0.540839, + 51.410823 + ], + [ + -0.540816, + 51.409975 + ], + [ + -0.540731, + 51.409226 + ], + [ + -0.54055, + 51.4082 + ], + [ + -0.540265, + 51.407192 + ], + [ + -0.540015, + 51.406409 + ], + [ + -0.539307, + 51.404727 + ], + [ + -0.53913, + 51.404336 + ], + [ + -0.538948, + 51.40393 + ], + [ + -0.538734, + 51.403506 + ], + [ + -0.538343, + 51.402665 + ], + [ + -0.538186, + 51.402381 + ], + [ + -0.537904, + 51.401791 + ], + [ + -0.537832, + 51.401649 + ], + [ + -0.537751, + 51.401493 + ], + [ + -0.537499, + 51.400999 + ], + [ + -0.537221, + 51.400479 + ], + [ + -0.536757, + 51.399639 + ], + [ + -0.536374, + 51.398978 + ], + [ + -0.535143, + 51.396921 + ], + [ + -0.534708, + 51.396271 + ], + [ + -0.533716, + 51.394875 + ], + [ + -0.533343, + 51.394423 + ], + [ + -0.532807, + 51.39377 + ], + [ + -0.532467, + 51.393396 + ], + [ + -0.532013, + 51.39292 + ], + [ + -0.531726, + 51.392628 + ], + [ + -0.530938, + 51.391912 + ], + [ + -0.530039, + 51.391157 + ], + [ + -0.529034, + 51.39043 + ], + [ + -0.528194, + 51.389865 + ], + [ + -0.527389, + 51.38939 + ], + [ + -0.524597, + 51.387805 + ], + [ + -0.520125, + 51.385342 + ], + [ + -0.517945, + 51.384129 + ], + [ + -0.517555, + 51.383897 + ], + [ + -0.516984, + 51.383552 + ], + [ + -0.515338, + 51.382366 + ], + [ + -0.514258, + 51.381522 + ], + [ + -0.512928, + 51.380319 + ], + [ + -0.512342, + 51.379755 + ], + [ + -0.511562, + 51.378919 + ], + [ + -0.511022, + 51.378208 + ], + [ + -0.510398, + 51.377394 + ], + [ + -0.509681, + 51.376271 + ], + [ + -0.5089, + 51.374787 + ], + [ + -0.508332, + 51.373555 + ], + [ + -0.507937, + 51.37263 + ], + [ + -0.507401, + 51.371588 + ], + [ + -0.507203, + 51.371148 + ], + [ + -0.506723, + 51.3703 + ], + [ + -0.506019, + 51.369297 + ], + [ + -0.505387, + 51.368485 + ], + [ + -0.504995, + 51.367988 + ], + [ + -0.503337, + 51.366251 + ], + [ + -0.501148, + 51.364258 + ], + [ + -0.496642, + 51.359852 + ], + [ + -0.492125, + 51.354937 + ], + [ + -0.491834, + 51.354669 + ], + [ + -0.490819, + 51.353619 + ], + [ + -0.490342, + 51.353177 + ], + [ + -0.489668, + 51.352551 + ], + [ + -0.488713, + 51.351704 + ], + [ + -0.487831, + 51.350864 + ], + [ + -0.487218, + 51.350238 + ], + [ + -0.486871, + 51.349786 + ], + [ + -0.486369, + 51.349116 + ], + [ + -0.485763, + 51.347991 + ], + [ + -0.485583, + 51.347556 + ], + [ + -0.485419, + 51.346999 + ], + [ + -0.485259, + 51.346061 + ], + [ + -0.485204, + 51.345276 + ], + [ + -0.485187, + 51.344479 + ], + [ + -0.485233, + 51.343353 + ], + [ + -0.485225, + 51.341935 + ], + [ + -0.485058, + 51.339869 + ], + [ + -0.484933, + 51.339352 + ], + [ + -0.484701, + 51.338184 + ], + [ + -0.484272, + 51.336687 + ], + [ + -0.484046, + 51.336036 + ], + [ + -0.483233, + 51.334451 + ], + [ + -0.482839, + 51.33377 + ], + [ + -0.482384, + 51.333042 + ], + [ + -0.481963, + 51.332553 + ], + [ + -0.481285, + 51.331818 + ], + [ + -0.480564, + 51.331137 + ], + [ + -0.479586, + 51.330252 + ], + [ + -0.47871, + 51.329566 + ], + [ + -0.477373, + 51.328693 + ], + [ + -0.476887, + 51.328411 + ], + [ + -0.476561, + 51.328228 + ], + [ + -0.476087, + 51.327972 + ], + [ + -0.475805, + 51.327832 + ], + [ + -0.474649, + 51.327296 + ], + [ + -0.472876, + 51.326594 + ], + [ + -0.472138, + 51.326333 + ], + [ + -0.471387, + 51.326097 + ], + [ + -0.47014, + 51.325742 + ], + [ + -0.469176, + 51.325499 + ], + [ + -0.468219, + 51.325296 + ], + [ + -0.467104, + 51.325093 + ], + [ + -0.466495, + 51.324998 + ], + [ + -0.465159, + 51.324827 + ], + [ + -0.462145, + 51.324564 + ], + [ + -0.459997, + 51.324315 + ], + [ + -0.459544, + 51.324262 + ], + [ + -0.457946, + 51.324017 + ], + [ + -0.455448, + 51.323571 + ], + [ + -0.454934, + 51.323469 + ], + [ + -0.453745, + 51.3232 + ], + [ + -0.452495, + 51.322892 + ], + [ + -0.450741, + 51.322397 + ], + [ + -0.448764, + 51.321776 + ], + [ + -0.446904, + 51.321124 + ], + [ + -0.445539, + 51.320587 + ], + [ + -0.444434, + 51.320156 + ], + [ + -0.442009, + 51.318969 + ], + [ + -0.441433, + 51.318686 + ], + [ + -0.440526, + 51.318217 + ], + [ + -0.437817, + 51.316919 + ], + [ + -0.435722, + 51.315982 + ], + [ + -0.433981, + 51.315239 + ], + [ + -0.428677, + 51.313144 + ], + [ + -0.426015, + 51.312093 + ], + [ + -0.423176, + 51.311004 + ], + [ + -0.421108, + 51.310248 + ], + [ + -0.417191, + 51.308828 + ], + [ + -0.414675, + 51.308037 + ], + [ + -0.414106, + 51.30791 + ], + [ + -0.413155, + 51.30767 + ], + [ + -0.412438, + 51.307488 + ], + [ + -0.411241, + 51.307221 + ], + [ + -0.40972, + 51.30694 + ], + [ + -0.40837, + 51.306668 + ], + [ + -0.407165, + 51.306448 + ], + [ + -0.406882, + 51.3064 + ], + [ + -0.406523, + 51.306336 + ], + [ + -0.405777, + 51.306218 + ], + [ + -0.40461, + 51.306094 + ], + [ + -0.404134, + 51.306065 + ], + [ + -0.402595, + 51.30599 + ], + [ + -0.402075, + 51.305972 + ], + [ + -0.401648, + 51.30597 + ], + [ + -0.400439, + 51.305983 + ], + [ + -0.39949, + 51.305999 + ], + [ + -0.397897, + 51.306113 + ], + [ + -0.395472, + 51.306435 + ], + [ + -0.394074, + 51.306694 + ], + [ + -0.392544, + 51.307007 + ], + [ + -0.391126, + 51.307333 + ], + [ + -0.388809, + 51.30802 + ], + [ + -0.387478, + 51.308385 + ], + [ + -0.386114, + 51.308835 + ], + [ + -0.383925, + 51.309517 + ], + [ + -0.382234, + 51.309967 + ], + [ + -0.380715, + 51.310348 + ], + [ + -0.378249, + 51.31094 + ], + [ + -0.377876, + 51.311014 + ], + [ + -0.375234, + 51.31158 + ], + [ + -0.372535, + 51.312092 + ], + [ + -0.3676, + 51.312704 + ], + [ + -0.364304, + 51.312966 + ], + [ + -0.361197, + 51.313074 + ], + [ + -0.359841, + 51.313101 + ], + [ + -0.357446, + 51.313219 + ], + [ + -0.355643, + 51.313332 + ], + [ + -0.354613, + 51.313466 + ], + [ + -0.351672, + 51.313962 + ], + [ + -0.350759, + 51.314146 + ], + [ + -0.349516, + 51.314436 + ], + [ + -0.345744, + 51.315375 + ], + [ + -0.343963, + 51.315654 + ], + [ + -0.342997, + 51.315758 + ], + [ + -0.341518, + 51.315847 + ], + [ + -0.340453, + 51.315859 + ], + [ + -0.339879, + 51.315935 + ], + [ + -0.339063, + 51.315908 + ], + [ + -0.336617, + 51.315687 + ], + [ + -0.333189, + 51.315199 + ], + [ + -0.332433, + 51.31511 + ], + [ + -0.332127, + 51.315125 + ], + [ + -0.331819, + 51.315205 + ], + [ + -0.331685, + 51.315295 + ], + [ + -0.331606, + 51.315364 + ], + [ + -0.331567, + 51.315513 + ], + [ + -0.331485, + 51.315597 + ], + [ + -0.33121, + 51.31584 + ], + [ + -0.331043, + 51.315939 + ], + [ + -0.330954, + 51.315972 + ], + [ + -0.330802, + 51.316099 + ], + [ + -0.330688, + 51.316206 + ], + [ + -0.330618, + 51.316362 + ], + [ + -0.330572, + 51.316555 + ], + [ + -0.330561, + 51.316743 + ], + [ + -0.330731, + 51.317194 + ], + [ + -0.330777, + 51.317592 + ], + [ + -0.33079, + 51.317921 + ], + [ + -0.330661, + 51.318578 + ], + [ + -0.329754, + 51.320872 + ], + [ + -0.329622, + 51.321246 + ], + [ + -0.329341, + 51.321991 + ], + [ + -0.328569, + 51.323972 + ], + [ + -0.328088, + 51.325091 + ], + [ + -0.327796, + 51.325667 + ], + [ + -0.327648, + 51.325955 + ], + [ + -0.327453, + 51.326243 + ], + [ + -0.32731, + 51.326444 + ], + [ + -0.327184, + 51.326622 + ], + [ + -0.327118, + 51.326713 + ], + [ + -0.32704, + 51.326815 + ], + [ + -0.32628, + 51.327793 + ], + [ + -0.325479, + 51.328877 + ], + [ + -0.325221, + 51.329223 + ], + [ + -0.325044, + 51.329462 + ], + [ + -0.324385, + 51.330354 + ], + [ + -0.323427, + 51.331837 + ], + [ + -0.322115, + 51.333974 + ], + [ + -0.321645, + 51.33474 + ], + [ + -0.3212, + 51.335515 + ], + [ + -0.321029, + 51.335822 + ], + [ + -0.320993, + 51.335886 + ], + [ + -0.320248, + 51.337404 + ], + [ + -0.320153, + 51.337596 + ], + [ + -0.319796, + 51.338324 + ], + [ + -0.319667, + 51.338607 + ], + [ + -0.319489, + 51.339009 + ], + [ + -0.319479, + 51.339031 + ], + [ + -0.319103, + 51.339665 + ], + [ + -0.319072, + 51.339718 + ], + [ + -0.318559, + 51.340597 + ], + [ + -0.318091, + 51.341318 + ], + [ + -0.318028, + 51.341428 + ], + [ + -0.317621, + 51.342187 + ], + [ + -0.317096, + 51.34312 + ], + [ + -0.316784, + 51.343654 + ], + [ + -0.316309, + 51.344447 + ], + [ + -0.316162, + 51.344704 + ], + [ + -0.316087, + 51.344845 + ], + [ + -0.315846, + 51.345293 + ], + [ + -0.315738, + 51.345518 + ], + [ + -0.315854, + 51.345548 + ], + [ + -0.315979, + 51.345606 + ], + [ + -0.316241, + 51.345801 + ], + [ + -0.316385, + 51.34587 + ], + [ + -0.31705, + 51.346074 + ], + [ + -0.317347, + 51.346189 + ], + [ + -0.317699, + 51.346342 + ], + [ + -0.317973, + 51.346484 + ], + [ + -0.318404, + 51.346707 + ], + [ + -0.31896, + 51.347032 + ], + [ + -0.319099, + 51.347084 + ], + [ + -0.319216, + 51.347091 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/london_to_hampton_court_palace.json b/assets/london_to_hampton_court_palace.json new file mode 100644 index 00000000..8afc42fd --- /dev/null +++ b/assets/london_to_hampton_court_palace.json @@ -0,0 +1,1990 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "type": "Feature", + "properties": { + "name": "London Heathrow - The National Galler" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + -0.45418, + 51.470012 + ], + [ + -0.454211, + 51.470131 + ], + [ + -0.454384, + 51.471098 + ], + [ + -0.454381, + 51.471164 + ], + [ + -0.454327, + 51.471349 + ], + [ + -0.454235, + 51.471511 + ], + [ + -0.454055, + 51.471728 + ], + [ + -0.453995, + 51.471801 + ], + [ + -0.453784, + 51.471964 + ], + [ + -0.453531, + 51.472142 + ], + [ + -0.453393, + 51.472268 + ], + [ + -0.453247, + 51.472459 + ], + [ + -0.453203, + 51.472547 + ], + [ + -0.453126, + 51.472833 + ], + [ + -0.453096, + 51.473142 + ], + [ + -0.453018, + 51.474092 + ], + [ + -0.453048, + 51.479588 + ], + [ + -0.45305, + 51.479771 + ], + [ + -0.453062, + 51.480131 + ], + [ + -0.453088, + 51.480273 + ], + [ + -0.453224, + 51.480429 + ], + [ + -0.453293, + 51.480481 + ], + [ + -0.453412, + 51.480612 + ], + [ + -0.453527, + 51.480814 + ], + [ + -0.453566, + 51.480992 + ], + [ + -0.453554, + 51.481264 + ], + [ + -0.453509, + 51.481688 + ], + [ + -0.453468, + 51.481818 + ], + [ + -0.453407, + 51.481882 + ], + [ + -0.453348, + 51.481936 + ], + [ + -0.453268, + 51.481994 + ], + [ + -0.453036, + 51.482137 + ], + [ + -0.452985, + 51.482187 + ], + [ + -0.452947, + 51.482272 + ], + [ + -0.45292, + 51.482379 + ], + [ + -0.452904, + 51.482526 + ], + [ + -0.452717, + 51.48456 + ], + [ + -0.452706, + 51.484918 + ], + [ + -0.452736, + 51.485594 + ], + [ + -0.452829, + 51.486307 + ], + [ + -0.452929, + 51.486801 + ], + [ + -0.4531, + 51.4874 + ], + [ + -0.453566, + 51.488738 + ], + [ + -0.453714, + 51.489269 + ], + [ + -0.453813, + 51.489788 + ], + [ + -0.45387, + 51.49018 + ], + [ + -0.453906, + 51.490679 + ], + [ + -0.453904, + 51.491128 + ], + [ + -0.453849, + 51.491854 + ], + [ + -0.453716, + 51.493106 + ], + [ + -0.453699, + 51.493249 + ], + [ + -0.453618, + 51.49399 + ], + [ + -0.453609, + 51.494079 + ], + [ + -0.453514, + 51.494635 + ], + [ + -0.453521, + 51.494752 + ], + [ + -0.453562, + 51.494867 + ], + [ + -0.453708, + 51.495034 + ], + [ + -0.453933, + 51.495205 + ], + [ + -0.454428, + 51.49532 + ], + [ + -0.454569, + 51.495359 + ], + [ + -0.454716, + 51.495384 + ], + [ + -0.454855, + 51.4954 + ], + [ + -0.455013, + 51.495416 + ], + [ + -0.455804, + 51.495486 + ], + [ + -0.456745, + 51.495557 + ], + [ + -0.457669, + 51.495613 + ], + [ + -0.460512, + 51.495732 + ], + [ + -0.461487, + 51.495707 + ], + [ + -0.463005, + 51.495608 + ], + [ + -0.464291, + 51.495467 + ], + [ + -0.469739, + 51.494793 + ], + [ + -0.471266, + 51.494655 + ], + [ + -0.473867, + 51.494469 + ], + [ + -0.475928, + 51.494381 + ], + [ + -0.477438, + 51.494347 + ], + [ + -0.47937, + 51.494313 + ], + [ + -0.482595, + 51.494117 + ], + [ + -0.483157, + 51.494087 + ], + [ + -0.483577, + 51.494077 + ], + [ + -0.485169, + 51.494065 + ], + [ + -0.485681, + 51.494078 + ], + [ + -0.486181, + 51.49408 + ], + [ + -0.48688, + 51.494099 + ], + [ + -0.487868, + 51.494097 + ], + [ + -0.488257, + 51.494072 + ], + [ + -0.488576, + 51.494037 + ], + [ + -0.489294, + 51.493925 + ], + [ + -0.489542, + 51.49386 + ], + [ + -0.490226, + 51.493653 + ], + [ + -0.491188, + 51.493298 + ], + [ + -0.491608, + 51.49311 + ], + [ + -0.492438, + 51.492663 + ], + [ + -0.492896, + 51.492356 + ], + [ + -0.493328, + 51.492026 + ], + [ + -0.493668, + 51.491719 + ], + [ + -0.494038, + 51.491343 + ], + [ + -0.494357, + 51.490995 + ], + [ + -0.49457, + 51.49072 + ], + [ + -0.494801, + 51.490371 + ], + [ + -0.495114, + 51.489888 + ], + [ + -0.49542, + 51.489332 + ], + [ + -0.496029, + 51.488395 + ], + [ + -0.496531, + 51.487729 + ], + [ + -0.496948, + 51.487283 + ], + [ + -0.497278, + 51.486891 + ], + [ + -0.497885, + 51.486235 + ], + [ + -0.499131, + 51.48499 + ], + [ + -0.500052, + 51.484121 + ], + [ + -0.50041, + 51.483767 + ], + [ + -0.50082, + 51.483319 + ], + [ + -0.501373, + 51.48268 + ], + [ + -0.501828, + 51.482092 + ], + [ + -0.502076, + 51.481736 + ], + [ + -0.502532, + 51.481012 + ], + [ + -0.502691, + 51.480727 + ], + [ + -0.503371, + 51.479289 + ], + [ + -0.503515, + 51.479 + ], + [ + -0.503694, + 51.478451 + ], + [ + -0.503759, + 51.478159 + ], + [ + -0.503844, + 51.477815 + ], + [ + -0.503862, + 51.477631 + ], + [ + -0.504363, + 51.475275 + ], + [ + -0.504554, + 51.474525 + ], + [ + -0.504828, + 51.47366 + ], + [ + -0.505146, + 51.472842 + ], + [ + -0.505491, + 51.47208 + ], + [ + -0.506126, + 51.470891 + ], + [ + -0.5068, + 51.469838 + ], + [ + -0.507474, + 51.468926 + ], + [ + -0.508181, + 51.468069 + ], + [ + -0.508753, + 51.467439 + ], + [ + -0.509754, + 51.466442 + ], + [ + -0.510592, + 51.465701 + ], + [ + -0.511798, + 51.464725 + ], + [ + -0.514576, + 51.46267 + ], + [ + -0.51487, + 51.462401 + ], + [ + -0.515871, + 51.461499 + ], + [ + -0.5161, + 51.461314 + ], + [ + -0.516697, + 51.460675 + ], + [ + -0.517189, + 51.460112 + ], + [ + -0.51797, + 51.459016 + ], + [ + -0.518345, + 51.458368 + ], + [ + -0.518861, + 51.457281 + ], + [ + -0.519409, + 51.455865 + ], + [ + -0.520433, + 51.453299 + ], + [ + -0.521173, + 51.4519 + ], + [ + -0.52171, + 51.451157 + ], + [ + -0.522214, + 51.450548 + ], + [ + -0.522773, + 51.449977 + ], + [ + -0.524187, + 51.448758 + ], + [ + -0.524492, + 51.448526 + ], + [ + -0.526144, + 51.447358 + ], + [ + -0.526793, + 51.446929 + ], + [ + -0.528091, + 51.445831 + ], + [ + -0.528556, + 51.445344 + ], + [ + -0.528921, + 51.444919 + ], + [ + -0.529283, + 51.444445 + ], + [ + -0.529692, + 51.443836 + ], + [ + -0.529929, + 51.443423 + ], + [ + -0.530095, + 51.443102 + ], + [ + -0.531007, + 51.441117 + ], + [ + -0.531746, + 51.439866 + ], + [ + -0.53225, + 51.439273 + ], + [ + -0.532969, + 51.438577 + ], + [ + -0.533494, + 51.438106 + ], + [ + -0.533867, + 51.437794 + ], + [ + -0.535125, + 51.436846 + ], + [ + -0.53591, + 51.436277 + ], + [ + -0.53626, + 51.435989 + ], + [ + -0.536651, + 51.435644 + ], + [ + -0.536958, + 51.435364 + ], + [ + -0.537099, + 51.435225 + ], + [ + -0.537856, + 51.434438 + ], + [ + -0.538729, + 51.433355 + ], + [ + -0.539041, + 51.432846 + ], + [ + -0.539543, + 51.432061 + ], + [ + -0.539793, + 51.431578 + ], + [ + -0.539935, + 51.431274 + ], + [ + -0.540032, + 51.431045 + ], + [ + -0.540262, + 51.430447 + ], + [ + -0.540447, + 51.429848 + ], + [ + -0.540596, + 51.429201 + ], + [ + -0.540703, + 51.428556 + ], + [ + -0.540766, + 51.427894 + ], + [ + -0.540777, + 51.427314 + ], + [ + -0.540747, + 51.426694 + ], + [ + -0.540661, + 51.425963 + ], + [ + -0.540618, + 51.425721 + ], + [ + -0.540563, + 51.425446 + ], + [ + -0.540026, + 51.423459 + ], + [ + -0.539701, + 51.422004 + ], + [ + -0.539537, + 51.421126 + ], + [ + -0.539434, + 51.420039 + ], + [ + -0.539452, + 51.418612 + ], + [ + -0.539557, + 51.417431 + ], + [ + -0.539745, + 51.416422 + ], + [ + -0.540608, + 51.41291 + ], + [ + -0.540709, + 51.412363 + ], + [ + -0.540839, + 51.410823 + ], + [ + -0.540816, + 51.409975 + ], + [ + -0.540731, + 51.409226 + ], + [ + -0.54055, + 51.4082 + ], + [ + -0.540265, + 51.407192 + ], + [ + -0.540015, + 51.406409 + ], + [ + -0.539424, + 51.405298 + ], + [ + -0.539135, + 51.40475 + ], + [ + -0.539022, + 51.404547 + ], + [ + -0.53891, + 51.404342 + ], + [ + -0.538664, + 51.403903 + ], + [ + -0.538432, + 51.403547 + ], + [ + -0.537978, + 51.403111 + ], + [ + -0.537385, + 51.402737 + ], + [ + -0.536817, + 51.40249 + ], + [ + -0.535742, + 51.402148 + ], + [ + -0.535574, + 51.40212 + ], + [ + -0.535026, + 51.401973 + ], + [ + -0.533872, + 51.401676 + ], + [ + -0.532756, + 51.401429 + ], + [ + -0.532263, + 51.401369 + ], + [ + -0.531705, + 51.401332 + ], + [ + -0.530866, + 51.401278 + ], + [ + -0.529698, + 51.401245 + ], + [ + -0.528674, + 51.401204 + ], + [ + -0.527671, + 51.40115 + ], + [ + -0.525909, + 51.400996 + ], + [ + -0.524714, + 51.400882 + ], + [ + -0.523906, + 51.400797 + ], + [ + -0.522411, + 51.400641 + ], + [ + -0.522272, + 51.400626 + ], + [ + -0.522162, + 51.400615 + ], + [ + -0.520383, + 51.40038 + ], + [ + -0.516254, + 51.399725 + ], + [ + -0.512677, + 51.399089 + ], + [ + -0.508529, + 51.398226 + ], + [ + -0.499465, + 51.3961 + ], + [ + -0.498105, + 51.395806 + ], + [ + -0.496307, + 51.395451 + ], + [ + -0.493489, + 51.395002 + ], + [ + -0.491115, + 51.39467 + ], + [ + -0.489067, + 51.394415 + ], + [ + -0.487551, + 51.394232 + ], + [ + -0.485639, + 51.39407 + ], + [ + -0.484308, + 51.394011 + ], + [ + -0.481322, + 51.393843 + ], + [ + -0.4788, + 51.393767 + ], + [ + -0.477553, + 51.393742 + ], + [ + -0.476292, + 51.393738 + ], + [ + -0.474025, + 51.393742 + ], + [ + -0.471701, + 51.393804 + ], + [ + -0.469206, + 51.393938 + ], + [ + -0.467937, + 51.394024 + ], + [ + -0.466662, + 51.394116 + ], + [ + -0.465558, + 51.394219 + ], + [ + -0.462966, + 51.394481 + ], + [ + -0.462003, + 51.394618 + ], + [ + -0.461111, + 51.394779 + ], + [ + -0.459836, + 51.395036 + ], + [ + -0.458906, + 51.39528 + ], + [ + -0.456977, + 51.395884 + ], + [ + -0.456425, + 51.396102 + ], + [ + -0.454857, + 51.396887 + ], + [ + -0.454337, + 51.397219 + ], + [ + -0.453599, + 51.397764 + ], + [ + -0.453195, + 51.398106 + ], + [ + -0.45239, + 51.398906 + ], + [ + -0.450814, + 51.400731 + ], + [ + -0.450318, + 51.401256 + ], + [ + -0.448271, + 51.403156 + ], + [ + -0.446271, + 51.404865 + ], + [ + -0.445041, + 51.405849 + ], + [ + -0.443342, + 51.407106 + ], + [ + -0.442304, + 51.407822 + ], + [ + -0.441382, + 51.408425 + ], + [ + -0.440417, + 51.409028 + ], + [ + -0.439295, + 51.409691 + ], + [ + -0.437911, + 51.410461 + ], + [ + -0.436798, + 51.411053 + ], + [ + -0.435432, + 51.411752 + ], + [ + -0.434291, + 51.412324 + ], + [ + -0.431792, + 51.413493 + ], + [ + -0.430446, + 51.414083 + ], + [ + -0.427716, + 51.415204 + ], + [ + -0.426959, + 51.415505 + ], + [ + -0.425578, + 51.416048 + ], + [ + -0.424804, + 51.416352 + ], + [ + -0.423819, + 51.41674 + ], + [ + -0.423407, + 51.416979 + ], + [ + -0.42311, + 51.41713 + ], + [ + -0.422743, + 51.417301 + ], + [ + -0.422222, + 51.417569 + ], + [ + -0.420975, + 51.418305 + ], + [ + -0.420361, + 51.418705 + ], + [ + -0.420152, + 51.418854 + ], + [ + -0.42006, + 51.418933 + ], + [ + -0.419952, + 51.419036 + ], + [ + -0.41998, + 51.419088 + ], + [ + -0.41999, + 51.419247 + ], + [ + -0.419956, + 51.419372 + ], + [ + -0.419858, + 51.419468 + ], + [ + -0.419651, + 51.419605 + ], + [ + -0.419498, + 51.419681 + ], + [ + -0.419323, + 51.419725 + ], + [ + -0.419178, + 51.419738 + ], + [ + -0.419003, + 51.419741 + ], + [ + -0.418927, + 51.419731 + ], + [ + -0.418681, + 51.419672 + ], + [ + -0.418499, + 51.419576 + ], + [ + -0.41838, + 51.419471 + ], + [ + -0.418311, + 51.419343 + ], + [ + -0.418279, + 51.419234 + ], + [ + -0.418166, + 51.419137 + ], + [ + -0.418042, + 51.419075 + ], + [ + -0.417904, + 51.419024 + ], + [ + -0.417834, + 51.419009 + ], + [ + -0.41638, + 51.418775 + ], + [ + -0.415738, + 51.418698 + ], + [ + -0.414208, + 51.41854 + ], + [ + -0.413742, + 51.418501 + ], + [ + -0.4137, + 51.418497 + ], + [ + -0.413579, + 51.418488 + ], + [ + -0.413138, + 51.418448 + ], + [ + -0.412919, + 51.418428 + ], + [ + -0.412186, + 51.418338 + ], + [ + -0.41149, + 51.418242 + ], + [ + -0.411099, + 51.418189 + ], + [ + -0.410875, + 51.41816 + ], + [ + -0.409006, + 51.417912 + ], + [ + -0.408978, + 51.417909 + ], + [ + -0.408265, + 51.417815 + ], + [ + -0.40785, + 51.417756 + ], + [ + -0.407486, + 51.417702 + ], + [ + -0.40734, + 51.417654 + ], + [ + -0.407207, + 51.41759 + ], + [ + -0.406956, + 51.417427 + ], + [ + -0.406834, + 51.417348 + ], + [ + -0.406406, + 51.417003 + ], + [ + -0.406214, + 51.416836 + ], + [ + -0.405844, + 51.41652 + ], + [ + -0.40573, + 51.416419 + ], + [ + -0.405492, + 51.416209 + ], + [ + -0.405354, + 51.416085 + ], + [ + -0.405142, + 51.415846 + ], + [ + -0.405133, + 51.415836 + ], + [ + -0.40498, + 51.41568 + ], + [ + -0.40485, + 51.415548 + ], + [ + -0.404674, + 51.415351 + ], + [ + -0.404618, + 51.415287 + ], + [ + -0.404385, + 51.415047 + ], + [ + -0.404039, + 51.414685 + ], + [ + -0.403806, + 51.414442 + ], + [ + -0.403385, + 51.414086 + ], + [ + -0.403244, + 51.413975 + ], + [ + -0.403071, + 51.413886 + ], + [ + -0.402855, + 51.413793 + ], + [ + -0.402581, + 51.413684 + ], + [ + -0.402184, + 51.413576 + ], + [ + -0.401923, + 51.413542 + ], + [ + -0.401515, + 51.41356 + ], + [ + -0.401347, + 51.413588 + ], + [ + -0.400756, + 51.413695 + ], + [ + -0.400331, + 51.413751 + ], + [ + -0.399969, + 51.413755 + ], + [ + -0.399174, + 51.413664 + ], + [ + -0.398663, + 51.413588 + ], + [ + -0.397754, + 51.413408 + ], + [ + -0.397405, + 51.413364 + ], + [ + -0.397121, + 51.41335 + ], + [ + -0.396842, + 51.41335 + ], + [ + -0.396641, + 51.413357 + ], + [ + -0.396129, + 51.413417 + ], + [ + -0.395063, + 51.413562 + ], + [ + -0.394254, + 51.413672 + ], + [ + -0.394087, + 51.4137 + ], + [ + -0.393405, + 51.413783 + ], + [ + -0.393243, + 51.41381 + ], + [ + -0.392023, + 51.414062 + ], + [ + -0.390877, + 51.414327 + ], + [ + -0.390381, + 51.414403 + ], + [ + -0.389669, + 51.414436 + ], + [ + -0.388691, + 51.414444 + ], + [ + -0.387935, + 51.414431 + ], + [ + -0.386636, + 51.414349 + ], + [ + -0.3864, + 51.414345 + ], + [ + -0.385587, + 51.414345 + ], + [ + -0.385123, + 51.414274 + ], + [ + -0.384189, + 51.414065 + ], + [ + -0.383712, + 51.413978 + ], + [ + -0.383043, + 51.413898 + ], + [ + -0.382488, + 51.413849 + ], + [ + -0.381541, + 51.413787 + ], + [ + -0.381151, + 51.413751 + ], + [ + -0.381012, + 51.413739 + ], + [ + -0.379461, + 51.413552 + ], + [ + -0.379068, + 51.413526 + ], + [ + -0.378694, + 51.413519 + ], + [ + -0.378121, + 51.413541 + ], + [ + -0.377213, + 51.413636 + ], + [ + -0.376109, + 51.413807 + ], + [ + -0.375734, + 51.413848 + ], + [ + -0.375188, + 51.413888 + ], + [ + -0.374662, + 51.413898 + ], + [ + -0.374044, + 51.413847 + ], + [ + -0.373476, + 51.413766 + ], + [ + -0.373024, + 51.413739 + ], + [ + -0.372028, + 51.413654 + ], + [ + -0.371099, + 51.413539 + ], + [ + -0.370333, + 51.413417 + ], + [ + -0.369545, + 51.413304 + ], + [ + -0.369242, + 51.413262 + ], + [ + -0.368593, + 51.41317 + ], + [ + -0.368485, + 51.413161 + ], + [ + -0.368353, + 51.413148 + ], + [ + -0.368081, + 51.413125 + ], + [ + -0.368054, + 51.413123 + ], + [ + -0.367989, + 51.413117 + ], + [ + -0.3675, + 51.413093 + ], + [ + -0.366603, + 51.413004 + ], + [ + -0.366081, + 51.412985 + ], + [ + -0.36583, + 51.412986 + ], + [ + -0.365549, + 51.413014 + ], + [ + -0.365336, + 51.413063 + ], + [ + -0.365067, + 51.413126 + ], + [ + -0.364993, + 51.413142 + ], + [ + -0.364827, + 51.413177 + ], + [ + -0.364408, + 51.413214 + ], + [ + -0.364308, + 51.413223 + ], + [ + -0.363691, + 51.413219 + ], + [ + -0.363396, + 51.413174 + ], + [ + -0.363187, + 51.413147 + ], + [ + -0.36307, + 51.413131 + ], + [ + -0.362811, + 51.413098 + ], + [ + -0.362704, + 51.413083 + ], + [ + -0.362538, + 51.413045 + ], + [ + -0.362326, + 51.412968 + ], + [ + -0.362246, + 51.412937 + ], + [ + -0.362135, + 51.412899 + ], + [ + -0.361899, + 51.41283 + ], + [ + -0.361426, + 51.412745 + ], + [ + -0.3609, + 51.412696 + ], + [ + -0.360201, + 51.412667 + ], + [ + -0.359907, + 51.412655 + ], + [ + -0.359588, + 51.412623 + ], + [ + -0.358792, + 51.412488 + ], + [ + -0.358133, + 51.412347 + ], + [ + -0.357999, + 51.412324 + ], + [ + -0.357478, + 51.412155 + ], + [ + -0.356888, + 51.411963 + ], + [ + -0.35497, + 51.411318 + ], + [ + -0.354512, + 51.411187 + ], + [ + -0.353617, + 51.41093 + ], + [ + -0.353292, + 51.410827 + ], + [ + -0.352571, + 51.410598 + ], + [ + -0.351939, + 51.410301 + ], + [ + -0.351062, + 51.409881 + ], + [ + -0.350762, + 51.409741 + ], + [ + -0.35033, + 51.40954 + ], + [ + -0.347947, + 51.408313 + ], + [ + -0.347652, + 51.408182 + ], + [ + -0.346949, + 51.407948 + ], + [ + -0.346791, + 51.407894 + ], + [ + -0.346606, + 51.407823 + ], + [ + -0.346374, + 51.40772 + ], + [ + -0.346308, + 51.407683 + ], + [ + -0.34615, + 51.407605 + ], + [ + -0.345606, + 51.407333 + ], + [ + -0.344475, + 51.406716 + ], + [ + -0.34434, + 51.406642 + ], + [ + -0.34399, + 51.40645 + ], + [ + -0.343261, + 51.40601 + ], + [ + -0.342553, + 51.405578 + ], + [ + -0.342518, + 51.405554 + ], + [ + -0.342233, + 51.40536 + ], + [ + -0.342128, + 51.40528 + ], + [ + -0.342016, + 51.405265 + ], + [ + -0.341836, + 51.405226 + ], + [ + -0.341712, + 51.405225 + ], + [ + -0.341684, + 51.405234 + ], + [ + -0.341561, + 51.405239 + ], + [ + -0.341531, + 51.405232 + ], + [ + -0.341502, + 51.405221 + ], + [ + -0.341438, + 51.405172 + ], + [ + -0.341427, + 51.405152 + ], + [ + -0.341422, + 51.40513 + ], + [ + -0.341445, + 51.405066 + ], + [ + -0.341491, + 51.405032 + ], + [ + -0.34152, + 51.40502 + ], + [ + -0.341512, + 51.404971 + ], + [ + -0.341513, + 51.404927 + ], + [ + -0.341577, + 51.404806 + ], + [ + -0.341642, + 51.40471 + ], + [ + -0.34158, + 51.40467 + ], + [ + -0.341444, + 51.404583 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/london_to_twickenham_stadium.json b/assets/london_to_twickenham_stadium.json new file mode 100644 index 00000000..f15aac2f --- /dev/null +++ b/assets/london_to_twickenham_stadium.json @@ -0,0 +1,1234 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "type": "Feature", + "properties": { + "name": "London Heathrow - The National Galler" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + -0.45418, + 51.470012 + ], + [ + -0.454211, + 51.470131 + ], + [ + -0.454384, + 51.471098 + ], + [ + -0.454381, + 51.471164 + ], + [ + -0.454327, + 51.471349 + ], + [ + -0.454235, + 51.471511 + ], + [ + -0.454055, + 51.471728 + ], + [ + -0.453995, + 51.471801 + ], + [ + -0.453784, + 51.471964 + ], + [ + -0.453531, + 51.472142 + ], + [ + -0.453393, + 51.472268 + ], + [ + -0.453247, + 51.472459 + ], + [ + -0.453203, + 51.472547 + ], + [ + -0.453126, + 51.472833 + ], + [ + -0.453096, + 51.473142 + ], + [ + -0.453018, + 51.474092 + ], + [ + -0.453048, + 51.479588 + ], + [ + -0.45305, + 51.479771 + ], + [ + -0.453062, + 51.480131 + ], + [ + -0.453088, + 51.480273 + ], + [ + -0.453224, + 51.480429 + ], + [ + -0.453293, + 51.480481 + ], + [ + -0.453412, + 51.480612 + ], + [ + -0.453527, + 51.480814 + ], + [ + -0.453566, + 51.480992 + ], + [ + -0.453554, + 51.481264 + ], + [ + -0.453509, + 51.481688 + ], + [ + -0.453468, + 51.481818 + ], + [ + -0.453407, + 51.481882 + ], + [ + -0.453348, + 51.481936 + ], + [ + -0.453252, + 51.481961 + ], + [ + -0.453091, + 51.482023 + ], + [ + -0.45294, + 51.482047 + ], + [ + -0.452689, + 51.482055 + ], + [ + -0.452576, + 51.482036 + ], + [ + -0.452487, + 51.482007 + ], + [ + -0.452408, + 51.481959 + ], + [ + -0.45232, + 51.481899 + ], + [ + -0.451998, + 51.481732 + ], + [ + -0.451829, + 51.481658 + ], + [ + -0.451683, + 51.481616 + ], + [ + -0.451201, + 51.481551 + ], + [ + -0.450523, + 51.481492 + ], + [ + -0.450107, + 51.481439 + ], + [ + -0.449941, + 51.481421 + ], + [ + -0.449873, + 51.481401 + ], + [ + -0.449799, + 51.481358 + ], + [ + -0.449411, + 51.481335 + ], + [ + -0.448808, + 51.48128 + ], + [ + -0.448775, + 51.481277 + ], + [ + -0.448266, + 51.48125 + ], + [ + -0.447883, + 51.481227 + ], + [ + -0.446482, + 51.481174 + ], + [ + -0.446175, + 51.481161 + ], + [ + -0.446106, + 51.481157 + ], + [ + -0.445943, + 51.481148 + ], + [ + -0.44573, + 51.481138 + ], + [ + -0.444039, + 51.481065 + ], + [ + -0.443595, + 51.48105 + ], + [ + -0.443053, + 51.481028 + ], + [ + -0.441501, + 51.480967 + ], + [ + -0.441061, + 51.480952 + ], + [ + -0.440084, + 51.480917 + ], + [ + -0.438322, + 51.480854 + ], + [ + -0.437738, + 51.480833 + ], + [ + -0.43706, + 51.480809 + ], + [ + -0.436365, + 51.480803 + ], + [ + -0.435762, + 51.480781 + ], + [ + -0.434685, + 51.480739 + ], + [ + -0.434526, + 51.480733 + ], + [ + -0.434474, + 51.480733 + ], + [ + -0.43437, + 51.480729 + ], + [ + -0.434248, + 51.480728 + ], + [ + -0.434087, + 51.480721 + ], + [ + -0.433859, + 51.480716 + ], + [ + -0.432507, + 51.480653 + ], + [ + -0.43209, + 51.480633 + ], + [ + -0.430616, + 51.480605 + ], + [ + -0.429166, + 51.480613 + ], + [ + -0.428842, + 51.480614 + ], + [ + -0.428662, + 51.48062 + ], + [ + -0.428534, + 51.480624 + ], + [ + -0.426927, + 51.480711 + ], + [ + -0.423574, + 51.480936 + ], + [ + -0.423199, + 51.480958 + ], + [ + -0.420965, + 51.481127 + ], + [ + -0.420058, + 51.481247 + ], + [ + -0.419707, + 51.481289 + ], + [ + -0.41889, + 51.481349 + ], + [ + -0.418234, + 51.481354 + ], + [ + -0.417843, + 51.481339 + ], + [ + -0.417772, + 51.481335 + ], + [ + -0.417297, + 51.481297 + ], + [ + -0.416834, + 51.481241 + ], + [ + -0.416493, + 51.481188 + ], + [ + -0.416303, + 51.481154 + ], + [ + -0.415632, + 51.481002 + ], + [ + -0.41371, + 51.480495 + ], + [ + -0.412956, + 51.480292 + ], + [ + -0.412701, + 51.480221 + ], + [ + -0.412544, + 51.480182 + ], + [ + -0.411713, + 51.479952 + ], + [ + -0.411037, + 51.479766 + ], + [ + -0.410861, + 51.479717 + ], + [ + -0.410645, + 51.479657 + ], + [ + -0.410473, + 51.479609 + ], + [ + -0.410335, + 51.479571 + ], + [ + -0.408895, + 51.479174 + ], + [ + -0.407805, + 51.478854 + ], + [ + -0.40721, + 51.478683 + ], + [ + -0.405865, + 51.478298 + ], + [ + -0.405215, + 51.478099 + ], + [ + -0.404561, + 51.47791 + ], + [ + -0.404432, + 51.47791 + ], + [ + -0.404342, + 51.477923 + ], + [ + -0.404253, + 51.477953 + ], + [ + -0.404111, + 51.477959 + ], + [ + -0.403919, + 51.477926 + ], + [ + -0.403823, + 51.477873 + ], + [ + -0.403769, + 51.477817 + ], + [ + -0.403659, + 51.477726 + ], + [ + -0.403509, + 51.477633 + ], + [ + -0.403338, + 51.477565 + ], + [ + -0.401197, + 51.476979 + ], + [ + -0.400765, + 51.476859 + ], + [ + -0.399162, + 51.476413 + ], + [ + -0.397527, + 51.475994 + ], + [ + -0.396928, + 51.475854 + ], + [ + -0.396698, + 51.475797 + ], + [ + -0.396574, + 51.475766 + ], + [ + -0.396267, + 51.475709 + ], + [ + -0.396163, + 51.475702 + ], + [ + -0.39596, + 51.475721 + ], + [ + -0.395893, + 51.475753 + ], + [ + -0.395787, + 51.475775 + ], + [ + -0.395641, + 51.475807 + ], + [ + -0.395516, + 51.475836 + ], + [ + -0.395409, + 51.475787 + ], + [ + -0.395433, + 51.475684 + ], + [ + -0.395379, + 51.475633 + ], + [ + -0.395342, + 51.475562 + ], + [ + -0.39514, + 51.475459 + ], + [ + -0.394999, + 51.475414 + ], + [ + -0.394585, + 51.475319 + ], + [ + -0.394346, + 51.475238 + ], + [ + -0.394205, + 51.475199 + ], + [ + -0.393973, + 51.475106 + ], + [ + -0.393543, + 51.475007 + ], + [ + -0.393481, + 51.474993 + ], + [ + -0.393304, + 51.474955 + ], + [ + -0.393121, + 51.474915 + ], + [ + -0.392946, + 51.474875 + ], + [ + -0.392817, + 51.474843 + ], + [ + -0.392631, + 51.4748 + ], + [ + -0.392231, + 51.474703 + ], + [ + -0.392083, + 51.474666 + ], + [ + -0.392029, + 51.474651 + ], + [ + -0.391718, + 51.474568 + ], + [ + -0.390723, + 51.474292 + ], + [ + -0.389897, + 51.474079 + ], + [ + -0.389496, + 51.473968 + ], + [ + -0.389319, + 51.473925 + ], + [ + -0.388674, + 51.473749 + ], + [ + -0.387918, + 51.473512 + ], + [ + -0.387769, + 51.473463 + ], + [ + -0.387405, + 51.473337 + ], + [ + -0.38701, + 51.473208 + ], + [ + -0.386854, + 51.473156 + ], + [ + -0.386685, + 51.473101 + ], + [ + -0.386576, + 51.473065 + ], + [ + -0.386143, + 51.472928 + ], + [ + -0.385749, + 51.472811 + ], + [ + -0.385191, + 51.472633 + ], + [ + -0.384887, + 51.472532 + ], + [ + -0.38392, + 51.472202 + ], + [ + -0.383709, + 51.472123 + ], + [ + -0.383163, + 51.471933 + ], + [ + -0.382429, + 51.471679 + ], + [ + -0.381901, + 51.471491 + ], + [ + -0.381531, + 51.471359 + ], + [ + -0.381443, + 51.471329 + ], + [ + -0.381109, + 51.471203 + ], + [ + -0.380359, + 51.470939 + ], + [ + -0.379669, + 51.470687 + ], + [ + -0.379518, + 51.47066 + ], + [ + -0.379465, + 51.470608 + ], + [ + -0.37895, + 51.470445 + ], + [ + -0.378789, + 51.470394 + ], + [ + -0.378661, + 51.470311 + ], + [ + -0.378679, + 51.470264 + ], + [ + -0.378662, + 51.469435 + ], + [ + -0.378688, + 51.469295 + ], + [ + -0.378625, + 51.468856 + ], + [ + -0.378568, + 51.468475 + ], + [ + -0.378536, + 51.468257 + ], + [ + -0.378509, + 51.468073 + ], + [ + -0.378471, + 51.467796 + ], + [ + -0.378423, + 51.46735 + ], + [ + -0.378386, + 51.467114 + ], + [ + -0.378349, + 51.466678 + ], + [ + -0.378338, + 51.466545 + ], + [ + -0.378301, + 51.46611 + ], + [ + -0.378249, + 51.465655 + ], + [ + -0.378228, + 51.465467 + ], + [ + -0.378209, + 51.465295 + ], + [ + -0.378161, + 51.465024 + ], + [ + -0.377832, + 51.464575 + ], + [ + -0.377517, + 51.464107 + ], + [ + -0.377166, + 51.463603 + ], + [ + -0.376998, + 51.463398 + ], + [ + -0.376655, + 51.462919 + ], + [ + -0.376342, + 51.462448 + ], + [ + -0.376112, + 51.462103 + ], + [ + -0.375818, + 51.461688 + ], + [ + -0.375751, + 51.461586 + ], + [ + -0.375728, + 51.461558 + ], + [ + -0.375349, + 51.461022 + ], + [ + -0.374951, + 51.460449 + ], + [ + -0.374903, + 51.460322 + ], + [ + -0.374677, + 51.459983 + ], + [ + -0.374592, + 51.459843 + ], + [ + -0.374289, + 51.459401 + ], + [ + -0.374077, + 51.459109 + ], + [ + -0.373903, + 51.458872 + ], + [ + -0.373554, + 51.458321 + ], + [ + -0.373006, + 51.457474 + ], + [ + -0.372984, + 51.457445 + ], + [ + -0.372612, + 51.456959 + ], + [ + -0.372139, + 51.456361 + ], + [ + -0.372042, + 51.456224 + ], + [ + -0.371963, + 51.456108 + ], + [ + -0.371891, + 51.456003 + ], + [ + -0.370926, + 51.454628 + ], + [ + -0.370859, + 51.454536 + ], + [ + -0.370439, + 51.454132 + ], + [ + -0.370393, + 51.454099 + ], + [ + -0.36955, + 51.45363 + ], + [ + -0.368932, + 51.453353 + ], + [ + -0.368412, + 51.45312 + ], + [ + -0.367548, + 51.452821 + ], + [ + -0.367344, + 51.452768 + ], + [ + -0.366947, + 51.452695 + ], + [ + -0.366689, + 51.452653 + ], + [ + -0.366433, + 51.452637 + ], + [ + -0.366283, + 51.452624 + ], + [ + -0.36594, + 51.452616 + ], + [ + -0.36498, + 51.452643 + ], + [ + -0.364356, + 51.452672 + ], + [ + -0.362932, + 51.452749 + ], + [ + -0.362586, + 51.45277 + ], + [ + -0.362379, + 51.45278 + ], + [ + -0.36221, + 51.452793 + ], + [ + -0.362114, + 51.452798 + ], + [ + -0.362031, + 51.452804 + ], + [ + -0.360658, + 51.452914 + ], + [ + -0.35977, + 51.452986 + ], + [ + -0.359638, + 51.453 + ], + [ + -0.359447, + 51.453024 + ], + [ + -0.359018, + 51.453067 + ], + [ + -0.358694, + 51.453114 + ], + [ + -0.358208, + 51.453203 + ], + [ + -0.357919, + 51.453237 + ], + [ + -0.35777, + 51.453255 + ], + [ + -0.357638, + 51.453291 + ], + [ + -0.356722, + 51.453535 + ], + [ + -0.356633, + 51.453557 + ], + [ + -0.356269, + 51.453659 + ], + [ + -0.35602, + 51.453702 + ], + [ + -0.355547, + 51.453763 + ], + [ + -0.354691, + 51.453855 + ], + [ + -0.35389, + 51.453876 + ], + [ + -0.351918, + 51.453792 + ], + [ + -0.35031, + 51.453826 + ], + [ + -0.349254, + 51.453845 + ], + [ + -0.348952, + 51.453814 + ], + [ + -0.348746, + 51.453795 + ], + [ + -0.347823, + 51.453758 + ], + [ + -0.347602, + 51.453748 + ], + [ + -0.346824, + 51.453746 + ], + [ + -0.34662, + 51.453747 + ], + [ + -0.346189, + 51.453761 + ], + [ + -0.345477, + 51.453777 + ], + [ + -0.345092, + 51.453788 + ], + [ + -0.344716, + 51.45382 + ], + [ + -0.344544, + 51.45383 + ], + [ + -0.344122, + 51.453867 + ], + [ + -0.34392, + 51.453901 + ], + [ + -0.343216, + 51.454021 + ], + [ + -0.342614, + 51.454141 + ], + [ + -0.342369, + 51.45419 + ], + [ + -0.341474, + 51.454371 + ], + [ + -0.340235, + 51.45463 + ], + [ + -0.339919, + 51.454717 + ], + [ + -0.339463, + 51.454865 + ], + [ + -0.339084, + 51.455003 + ], + [ + -0.338779, + 51.455138 + ], + [ + -0.33871, + 51.455165 + ], + [ + -0.338781, + 51.455308 + ], + [ + -0.338854, + 51.455535 + ], + [ + -0.338937, + 51.455692 + ], + [ + -0.339167, + 51.45591 + ], + [ + -0.339573, + 51.456226 + ], + [ + -0.340172, + 51.45668 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/london_to_windsor_castle.json b/assets/london_to_windsor_castle.json new file mode 100644 index 00000000..e28dc817 --- /dev/null +++ b/assets/london_to_windsor_castle.json @@ -0,0 +1,1022 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:OGC:1.3:CRS84" + } + }, + "features": [ + { + "type": "Feature", + "properties": { + "name": "London Heathrow - Big Ben" + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + -0.45418, + 51.470012 + ], + [ + -0.454211, + 51.470131 + ], + [ + -0.454384, + 51.471098 + ], + [ + -0.454381, + 51.471164 + ], + [ + -0.454327, + 51.471349 + ], + [ + -0.454235, + 51.471511 + ], + [ + -0.454055, + 51.471728 + ], + [ + -0.453995, + 51.471801 + ], + [ + -0.453784, + 51.471964 + ], + [ + -0.453531, + 51.472142 + ], + [ + -0.453393, + 51.472268 + ], + [ + -0.453247, + 51.472459 + ], + [ + -0.453203, + 51.472547 + ], + [ + -0.453126, + 51.472833 + ], + [ + -0.453096, + 51.473142 + ], + [ + -0.453018, + 51.474092 + ], + [ + -0.453048, + 51.479588 + ], + [ + -0.45305, + 51.479771 + ], + [ + -0.453062, + 51.480131 + ], + [ + -0.453088, + 51.480273 + ], + [ + -0.453224, + 51.480429 + ], + [ + -0.453293, + 51.480481 + ], + [ + -0.453412, + 51.480612 + ], + [ + -0.453527, + 51.480814 + ], + [ + -0.453566, + 51.480992 + ], + [ + -0.453554, + 51.481264 + ], + [ + -0.453509, + 51.481688 + ], + [ + -0.453468, + 51.481818 + ], + [ + -0.453407, + 51.481882 + ], + [ + -0.453348, + 51.481936 + ], + [ + -0.453268, + 51.481994 + ], + [ + -0.453036, + 51.482137 + ], + [ + -0.452985, + 51.482187 + ], + [ + -0.452947, + 51.482272 + ], + [ + -0.45292, + 51.482379 + ], + [ + -0.452904, + 51.482526 + ], + [ + -0.452717, + 51.48456 + ], + [ + -0.452706, + 51.484918 + ], + [ + -0.452736, + 51.485594 + ], + [ + -0.452829, + 51.486307 + ], + [ + -0.452929, + 51.486801 + ], + [ + -0.4531, + 51.4874 + ], + [ + -0.453566, + 51.488738 + ], + [ + -0.453714, + 51.489269 + ], + [ + -0.453813, + 51.489788 + ], + [ + -0.45387, + 51.49018 + ], + [ + -0.453906, + 51.490679 + ], + [ + -0.453904, + 51.491128 + ], + [ + -0.453849, + 51.491854 + ], + [ + -0.453716, + 51.493106 + ], + [ + -0.453699, + 51.493249 + ], + [ + -0.453618, + 51.49399 + ], + [ + -0.453609, + 51.494079 + ], + [ + -0.453514, + 51.494635 + ], + [ + -0.453521, + 51.494752 + ], + [ + -0.453562, + 51.494867 + ], + [ + -0.453708, + 51.495034 + ], + [ + -0.453933, + 51.495205 + ], + [ + -0.454428, + 51.49532 + ], + [ + -0.454569, + 51.495359 + ], + [ + -0.454716, + 51.495384 + ], + [ + -0.454855, + 51.4954 + ], + [ + -0.455013, + 51.495416 + ], + [ + -0.455804, + 51.495486 + ], + [ + -0.456745, + 51.495557 + ], + [ + -0.457669, + 51.495613 + ], + [ + -0.460512, + 51.495732 + ], + [ + -0.461487, + 51.495707 + ], + [ + -0.463005, + 51.495608 + ], + [ + -0.464291, + 51.495467 + ], + [ + -0.469739, + 51.494793 + ], + [ + -0.471266, + 51.494655 + ], + [ + -0.473867, + 51.494469 + ], + [ + -0.475928, + 51.494381 + ], + [ + -0.477438, + 51.494347 + ], + [ + -0.47937, + 51.494313 + ], + [ + -0.483182, + 51.494246 + ], + [ + -0.483602, + 51.494249 + ], + [ + -0.485582, + 51.494306 + ], + [ + -0.486032, + 51.49432 + ], + [ + -0.488637, + 51.494444 + ], + [ + -0.492077, + 51.494648 + ], + [ + -0.493884, + 51.494728 + ], + [ + -0.494323, + 51.494735 + ], + [ + -0.494937, + 51.494747 + ], + [ + -0.49578, + 51.494762 + ], + [ + -0.496654, + 51.494755 + ], + [ + -0.498711, + 51.494701 + ], + [ + -0.500743, + 51.494587 + ], + [ + -0.501787, + 51.49451 + ], + [ + -0.502844, + 51.494412 + ], + [ + -0.504163, + 51.49427 + ], + [ + -0.505086, + 51.49415 + ], + [ + -0.505584, + 51.494066 + ], + [ + -0.506933, + 51.49386 + ], + [ + -0.509423, + 51.493472 + ], + [ + -0.511024, + 51.493257 + ], + [ + -0.512848, + 51.493066 + ], + [ + -0.514555, + 51.492954 + ], + [ + -0.517724, + 51.492949 + ], + [ + -0.528922, + 51.493153 + ], + [ + -0.531301, + 51.493103 + ], + [ + -0.533097, + 51.493014 + ], + [ + -0.534332, + 51.492918 + ], + [ + -0.535787, + 51.492779 + ], + [ + -0.536327, + 51.492723 + ], + [ + -0.538879, + 51.492383 + ], + [ + -0.539817, + 51.492228 + ], + [ + -0.541117, + 51.491988 + ], + [ + -0.541777, + 51.491861 + ], + [ + -0.542892, + 51.491625 + ], + [ + -0.543917, + 51.49139 + ], + [ + -0.544515, + 51.491246 + ], + [ + -0.54695, + 51.49059 + ], + [ + -0.549, + 51.490013 + ], + [ + -0.556829, + 51.48783 + ], + [ + -0.559174, + 51.48722 + ], + [ + -0.560477, + 51.48691 + ], + [ + -0.562459, + 51.486622 + ], + [ + -0.564081, + 51.486482 + ], + [ + -0.565454, + 51.486416 + ], + [ + -0.566184, + 51.486419 + ], + [ + -0.568021, + 51.486499 + ], + [ + -0.569386, + 51.486616 + ], + [ + -0.571031, + 51.486841 + ], + [ + -0.573606, + 51.487411 + ], + [ + -0.575293, + 51.487969 + ], + [ + -0.57661, + 51.488475 + ], + [ + -0.578372, + 51.489303 + ], + [ + -0.580025, + 51.490301 + ], + [ + -0.581513, + 51.491476 + ], + [ + -0.586355, + 51.496439 + ], + [ + -0.587768, + 51.497852 + ], + [ + -0.589399, + 51.49917 + ], + [ + -0.590766, + 51.500001 + ], + [ + -0.591538, + 51.500364 + ], + [ + -0.592457, + 51.500754 + ], + [ + -0.593409, + 51.501096 + ], + [ + -0.594268, + 51.501342 + ], + [ + -0.594998, + 51.501526 + ], + [ + -0.59583, + 51.501716 + ], + [ + -0.596628, + 51.501855 + ], + [ + -0.597324, + 51.501949 + ], + [ + -0.598413, + 51.502047 + ], + [ + -0.599521, + 51.502097 + ], + [ + -0.600117, + 51.502099 + ], + [ + -0.601029, + 51.502102 + ], + [ + -0.601203, + 51.502103 + ], + [ + -0.605693, + 51.502029 + ], + [ + -0.608165, + 51.501996 + ], + [ + -0.608627, + 51.501988 + ], + [ + -0.60913, + 51.502002 + ], + [ + -0.609601, + 51.50201 + ], + [ + -0.610656, + 51.502003 + ], + [ + -0.612116, + 51.50204 + ], + [ + -0.612853, + 51.502092 + ], + [ + -0.613558, + 51.502183 + ], + [ + -0.614247, + 51.502313 + ], + [ + -0.615254, + 51.502519 + ], + [ + -0.615702, + 51.50256 + ], + [ + -0.61585, + 51.502563 + ], + [ + -0.61607, + 51.502457 + ], + [ + -0.616291, + 51.502383 + ], + [ + -0.616498, + 51.502272 + ], + [ + -0.616675, + 51.50214 + ], + [ + -0.616769, + 51.502042 + ], + [ + -0.616815, + 51.501977 + ], + [ + -0.616924, + 51.501756 + ], + [ + -0.617042, + 51.501524 + ], + [ + -0.617217, + 51.50119 + ], + [ + -0.617458, + 51.500704 + ], + [ + -0.617633, + 51.500351 + ], + [ + -0.617764, + 51.500088 + ], + [ + -0.618057, + 51.499498 + ], + [ + -0.618463, + 51.498641 + ], + [ + -0.618944, + 51.497744 + ], + [ + -0.61936, + 51.496886 + ], + [ + -0.619787, + 51.496002 + ], + [ + -0.620026, + 51.495579 + ], + [ + -0.620631, + 51.494316 + ], + [ + -0.620833, + 51.493899 + ], + [ + -0.621305, + 51.492916 + ], + [ + -0.622095, + 51.489905 + ], + [ + -0.622219, + 51.489392 + ], + [ + -0.622683, + 51.487414 + ], + [ + -0.622972, + 51.486175 + ], + [ + -0.622995, + 51.486059 + ], + [ + -0.623338, + 51.484397 + ], + [ + -0.623784, + 51.482564 + ], + [ + -0.624122, + 51.481295 + ], + [ + -0.624177, + 51.481061 + ], + [ + -0.624234, + 51.480699 + ], + [ + -0.624244, + 51.48065 + ], + [ + -0.624239, + 51.480495 + ], + [ + -0.624209, + 51.480419 + ], + [ + -0.624106, + 51.480291 + ], + [ + -0.623909, + 51.480153 + ], + [ + -0.623691, + 51.480093 + ], + [ + -0.623423, + 51.480052 + ], + [ + -0.623141, + 51.480063 + ], + [ + -0.622784, + 51.480071 + ], + [ + -0.622452, + 51.480115 + ], + [ + -0.620341, + 51.480294 + ], + [ + -0.620205, + 51.480301 + ], + [ + -0.619196, + 51.480353 + ], + [ + -0.617079, + 51.480401 + ], + [ + -0.616527, + 51.480406 + ], + [ + -0.616271, + 51.480386 + ], + [ + -0.615712, + 51.480327 + ], + [ + -0.615213, + 51.480274 + ], + [ + -0.614776, + 51.480226 + ], + [ + -0.613777, + 51.480102 + ], + [ + -0.61336, + 51.48006 + ], + [ + -0.612629, + 51.47999 + ], + [ + -0.612564, + 51.479983 + ], + [ + -0.612207, + 51.479949 + ], + [ + -0.612081, + 51.479938 + ], + [ + -0.611922, + 51.479925 + ], + [ + -0.611474, + 51.479892 + ], + [ + -0.611358, + 51.47989 + ], + [ + -0.611187, + 51.479878 + ], + [ + -0.610385, + 51.479844 + ], + [ + -0.609928, + 51.479832 + ], + [ + -0.609894, + 51.479839 + ], + [ + -0.609417, + 51.479878 + ], + [ + -0.608736, + 51.47996 + ], + [ + -0.608103, + 51.480057 + ], + [ + -0.607828, + 51.480105 + ], + [ + -0.607462, + 51.4801 + ], + [ + -0.60696, + 51.480052 + ], + [ + -0.606782, + 51.48004 + ], + [ + -0.605978, + 51.479975 + ], + [ + -0.605916, + 51.4803 + ], + [ + -0.605852, + 51.480678 + ], + [ + -0.60582, + 51.480792 + ], + [ + -0.605755, + 51.480883 + ], + [ + -0.605758, + 51.480958 + ], + [ + -0.605849, + 51.481018 + ], + [ + -0.606171, + 51.481217 + ], + [ + -0.606349, + 51.481359 + ], + [ + -0.606595, + 51.481572 + ], + [ + -0.606726, + 51.481687 + ], + [ + -0.607105, + 51.482028 + ], + [ + -0.607577, + 51.482531 + ], + [ + -0.607598, + 51.482552 + ], + [ + -0.607499, + 51.482581 + ], + [ + -0.60672, + 51.482735 + ], + [ + -0.606483, + 51.482785 + ], + [ + -0.606375, + 51.482822 + ], + [ + -0.606192, + 51.482866 + ] + ] + } + } + ] +} \ No newline at end of file diff --git a/assets/pdf/credit_card_statement.pdf b/assets/pdf/credit_card_statement.pdf new file mode 100644 index 00000000..9f477ef6 Binary files /dev/null and b/assets/pdf/credit_card_statement.pdf differ diff --git a/assets/pdf/gis_succinctly.pdf b/assets/pdf/gis_succinctly.pdf new file mode 100644 index 00000000..45e5cb88 Binary files /dev/null and b/assets/pdf/gis_succinctly.pdf differ diff --git a/assets/pdf/pdf_succinctly.pdf b/assets/pdf/pdf_succinctly.pdf deleted file mode 100644 index db723b0e..00000000 Binary files a/assets/pdf/pdf_succinctly.pdf and /dev/null differ diff --git a/assets/river.json b/assets/river.json new file mode 100644 index 00000000..df4bced9 --- /dev/null +++ b/assets/river.json @@ -0,0 +1,6375 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "LineString", + "coordinates": [ + [ + 151.50595136810452, + -29.84026458125537 + ], + [ + 151.44475345143783, + -29.84555429479706 + ], + [ + 151.38729902435452, + -29.81967538854705 + ], + [ + 151.3391219410212, + -29.827650648963726 + ], + [ + 151.1566675139378, + -29.778252862505397 + ], + [ + 151.15040123789618, + -29.737806898963683 + ], + [ + 151.12248782643783, + -29.700046482297054 + ], + [ + 151.12590579518783, + -29.535821221880383 + ], + [ + 151.1120711597712, + -29.508721612505415 + ], + [ + 151.0097762378962, + -29.425957940630383 + ], + [ + 150.96721438893783, + -29.304538669797036 + ], + [ + 150.9148055347712, + -29.278334242713708 + ], + [ + 150.9091903003962, + -29.26140715938034 + ], + [ + 150.9668074878962, + -29.151299737505372 + ], + [ + 150.96729576914618, + -29.11166757604704 + ], + [ + 150.9443465503962, + -29.073093357297033 + ], + [ + 150.8652449878962, + -29.024590753130365 + ], + [ + 150.7343856128962, + -28.80779387813037 + ], + [ + 150.6836043628962, + -28.764092706255354 + ], + [ + 150.5090438160212, + -28.693291925005376 + ], + [ + 150.46688886810452, + -28.6498348937553 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 151.8015242847712, + -25.776706638546905 + ], + [ + 151.81511477956283, + -25.701592706255227 + ], + [ + 151.69686933685452, + -25.61427174271356 + ], + [ + 151.67050214935452, + -25.619561456255223 + ], + [ + 151.6731063160212, + -25.596123956255234 + ], + [ + 151.65007571706283, + -25.58489348750521 + ], + [ + 151.67050214935452, + -25.537611586463573 + ], + [ + 151.6660262378962, + -25.467787367713584 + ], + [ + 151.6967879566462, + -25.397963148963544 + ], + [ + 151.7849227222712, + -25.38738372188024 + ], + [ + 151.8204044931045, + -25.3385555968802 + ], + [ + 151.85897871185452, + -25.351576430213548 + ], + [ + 151.86988365977118, + -25.338392836463566 + ], + [ + 151.87924238372952, + -25.3577613260469 + ], + [ + 151.89559980560452, + -25.353529555213584 + ], + [ + 151.95696048268783, + -25.2885067687552 + ], + [ + 151.9995223316462, + -25.296807550005198 + ], + [ + 152.0240991545628, + -25.254245701046887 + ], + [ + 151.98707115977118, + -25.1322567687552 + ], + [ + 152.02003014414618, + -25.085137628130205 + ], + [ + 152.0351668628962, + -25.087253513546877 + ], + [ + 152.06096438893783, + -25.044284763546887 + ], + [ + 152.1057235035212, + -25.052748305213548 + ], + [ + 152.0991317066462, + -24.99504973750522 + ], + [ + 152.1123966806045, + -24.97364674271352 + ], + [ + 152.13729902435452, + -24.969903253130184 + ], + [ + 152.18506920664618, + -24.99513111771355 + ], + [ + 152.17766360768783, + -24.982273044796887 + ], + [ + 152.1987410816462, + -24.975274346880205 + ], + [ + 152.18612714935452, + -24.962416273963544 + ], + [ + 152.1936141285212, + -24.94565195104689 + ], + [ + 152.23934980560452, + -24.937676690630187 + ], + [ + 152.2602645191462, + -24.89275481563022 + ], + [ + 152.3593856128962, + -24.85198333125518 + ], + [ + 152.40479576901248, + -24.74871184701316 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 117.5438745451879, + -32.642754815630525 + ], + [ + 117.58073977956289, + -32.615573826047196 + ], + [ + 117.5983992847712, + -32.598158461463875 + ], + [ + 117.61768639414622, + -32.52703215938052 + ], + [ + 117.4619246753962, + -32.4037411437555 + ], + [ + 117.3564559253962, + -32.341810805213825 + ], + [ + 117.2548934253962, + -32.33936939896386 + ], + [ + 117.2241317066462, + -32.2924943989638 + ], + [ + 117.1157332691462, + -32.227552992713846 + ], + [ + 116.98536217539619, + -32.195733331255504 + ], + [ + 116.94638105560453, + -32.156752211463846 + ], + [ + 116.9206649097712, + -32.095228773963804 + ], + [ + 116.81845136810452, + -32.05706145625552 + ], + [ + 116.77401777435452, + -31.89763762813048 + ], + [ + 116.79712975352119, + -31.81397877396381 + ], + [ + 116.67522220143789, + -31.74106210729716 + ], + [ + 116.64763431081289, + -31.664890232297132 + ], + [ + 116.4712020191462, + -31.521172784380475 + ], + [ + 116.43466230560453, + -31.51238372188042 + ], + [ + 116.3693139983129, + -31.546237888547154 + ], + [ + 116.31690514414622, + -31.54428476354717 + ], + [ + 116.19865970143789, + -31.59246184688044 + ], + [ + 116.18222089935453, + -31.63071054479713 + ], + [ + 116.1013289722712, + -31.673028253130497 + ], + [ + 116.0517684253962, + -31.721693617713775 + ], + [ + 115.97169030039622, + -31.872409763547164 + ], + [ + 115.74413339486938, + -32.01327892876878 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 128.7387801441462, + -16.10792408646335 + ], + [ + 128.7172957691462, + -16.179375909380013 + ], + [ + 128.7380477222712, + -16.21485768021336 + ], + [ + 128.7331649097712, + -16.361260675005003 + ], + [ + 128.6977645191462, + -16.54314544063004 + ], + [ + 128.70004316497952, + -16.577976169796706 + ], + [ + 128.7629500660212, + -16.669122003130024 + ], + [ + 128.76164798268783, + -16.730645440629992 + ], + [ + 128.73406009206283, + -16.788506768755045 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 128.7390242847712, + -16.1082496072967 + ], + [ + 128.7265731128962, + -16.096530857296717 + ], + [ + 128.6879988941462, + -16.10059986771337 + ], + [ + 128.6801863941462, + -16.083672784380003 + ], + [ + 128.7006942066462, + -15.998386326046711 + ], + [ + 128.74911543060452, + -15.952080987505006 + ], + [ + 128.76506595143783, + -15.877292576046713 + ], + [ + 128.6938582691462, + -15.697279555213365 + ], + [ + 128.71347089935452, + -15.643975518755003 + ], + [ + 128.69402102956283, + -15.576104425005036 + ], + [ + 128.6660262378962, + -15.555596612505024 + ], + [ + 128.6352645191462, + -15.56690846146338 + ], + [ + 128.59905032643783, + -15.552666925005035 + ], + [ + 128.5656844410212, + -15.568698826046688 + ], + [ + 128.53622480560452, + -15.517917576046713 + ], + [ + 128.4821883472712, + -15.574883721880028 + ], + [ + 128.42986087331283, + -15.546726169796711 + ], + [ + 128.4248153003962, + -15.51433684688003 + ], + [ + 128.36483808685452, + -15.525323175005036 + ], + [ + 128.3654891285212, + -15.488702081255036 + ], + [ + 128.31047610768783, + -15.45802174271336 + ], + [ + 128.28923587331283, + -15.401788018755033 + ] + ], + [ + [ + 127.57813561289619, + -17.623223565630052 + ], + [ + 127.6123966806045, + -17.622002862505003 + ], + [ + 127.6967879566462, + -17.560560805213356 + ], + [ + 127.74358157643783, + -17.573093357296706 + ], + [ + 127.85246829518783, + -17.476006768755038 + ], + [ + 127.9292098316462, + -17.46290455521336 + ], + [ + 128.0559188160212, + -17.471205336463356 + ], + [ + 128.23259524831283, + -17.54298268021338 + ], + [ + 128.3342391285212, + -17.690931898963395 + ], + [ + 128.3974715503962, + -17.708835544796663 + ], + [ + 128.4504500660212, + -17.697930596880063 + ], + [ + 128.52255293060452, + -17.621433201046703 + ], + [ + 128.6196395191462, + -17.58782317500501 + ], + [ + 128.6455184253962, + -17.540052992713353 + ], + [ + 128.7504988941462, + -17.47983163854669 + ], + [ + 128.90617923268783, + -17.28679778438003 + ], + [ + 128.87932376393783, + -17.21648528438005 + ], + [ + 128.8466903003962, + -17.175957940630003 + ], + [ + 128.8483992847712, + -17.13128020625501 + ], + [ + 128.8857528003962, + -17.090997003129996 + ], + [ + 128.8820906910212, + -17.077650648963377 + ], + [ + 128.7690535816462, + -17.0193824197967 + ], + [ + 128.7485457691462, + -16.985202732296678 + ], + [ + 128.7006942066462, + -16.960788669796695 + ], + [ + 128.68563886810452, + -16.841241143755028 + ], + [ + 128.73406009206283, + -16.788506768755045 + ] + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 133.1342879566462, + -13.298272393755044 + ], + [ + 133.1440535816462, + -13.342217706255061 + ], + [ + 133.2099715503962, + -13.421807550005049 + ], + [ + 133.22234134206283, + -13.46209075313005 + ], + [ + 133.2277938160212, + -13.639825128130067 + ], + [ + 133.19255618581283, + -13.71143971146339 + ], + [ + 133.11093183685452, + -13.749525648963404 + ], + [ + 132.9321395191462, + -13.695000909380058 + ], + [ + 132.7922469410212, + -13.852715753130067 + ], + [ + 132.7885848316462, + -13.934258721880038 + ], + [ + 132.77165774831283, + -13.975599867713376 + ], + [ + 132.74813886810452, + -13.992608331255036 + ], + [ + 132.7233992847712, + -14.137139581255049 + ], + [ + 132.68181399831283, + -14.195245050005068 + ], + [ + 132.5720320972712, + -14.285170180213406 + ], + [ + 132.4155379566462, + -14.319349867713399 + ], + [ + 132.4155379566462, + -14.353448175005061 + ], + [ + 132.36288496185452, + -14.367689711463406 + ], + [ + 132.2207137378962, + -14.508233331255058 + ], + [ + 132.13518313893783, + -14.532728773963397 + ], + [ + 132.11858157643783, + -14.556817315630044 + ], + [ + 132.0654403003962, + -14.579441013546717 + ], + [ + 131.9953719410212, + -14.673842055213386 + ], + [ + 131.9624129566462, + -14.696140232296711 + ], + [ + 131.84367923268783, + -14.705743096880049 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 143.4687606128962, + -16.484307550005035 + ], + [ + 143.4221297535212, + -16.500502211463377 + ], + [ + 143.3310653003962, + -16.45020924271337 + ], + [ + 143.2380477222712, + -16.424330336463374 + ], + [ + 143.1936141285212, + -16.426934503130017 + ], + [ + 143.1267195972712, + -16.37175872188 + ], + [ + 143.0722762378962, + -16.3499488260467 + ], + [ + 142.97649173268783, + -16.235772393755013 + ], + [ + 142.8486434253962, + -16.176283461463363 + ], + [ + 142.80339602956283, + -16.128757419796685 + ], + [ + 142.7419539722712, + -16.1082496072967 + ], + [ + 142.64201907643783, + -16.046075128130024 + ], + [ + 142.62094160247952, + -16.01140715938002 + ], + [ + 142.59042402435452, + -16.01140715938002 + ], + [ + 142.45761152435452, + -15.956719659380013 + ], + [ + 142.39592532643783, + -15.971042576046688 + ], + [ + 142.3510034514378, + -15.915215753130003 + ], + [ + 142.30282636810452, + -15.919366143755026 + ], + [ + 142.27108808685452, + -15.874200128130038 + ], + [ + 142.2485457691462, + -15.799167576046703 + ], + [ + 142.1721297535212, + -15.702813409379997 + ], + [ + 142.11125735768783, + -15.658623956255026 + ], + [ + 142.0754500660212, + -15.558038018755017 + ], + [ + 141.9638778003962, + -15.405205987505004 + ], + [ + 141.95256595143783, + -15.385105076046695 + ], + [ + 141.9672957691462, + -15.339776300005058 + ], + [ + 141.90487714935452, + -15.285577081255033 + ], + [ + 141.8125106128962, + -15.281263930213374 + ], + [ + 141.7619735035212, + -15.229913018755035 + ], + [ + 141.69011477956283, + -15.244154555213392 + ], + [ + 141.60898364511576, + -15.208079291550256 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 127.1521916024795, + -17.3831519510467 + ], + [ + 127.1213485035212, + -17.393080336463374 + ], + [ + 127.07252037852122, + -17.439955336463377 + ], + [ + 126.94597415456285, + -17.478041273963367 + ], + [ + 126.79590905039619, + -17.475925388546685 + ], + [ + 126.6572371753962, + -17.500420831255035 + ], + [ + 126.45224043060453, + -17.47551848750503 + ], + [ + 126.31747480560452, + -17.42986419063002 + ], + [ + 126.27442467539619, + -17.45069752396333 + ], + [ + 126.2271427743545, + -17.48894622188003 + ], + [ + 126.21338951914622, + -17.52874114375501 + ], + [ + 126.12427819102119, + -17.566827081255024 + ], + [ + 126.13778730560452, + -17.597832940630038 + ], + [ + 126.12444095143783, + -17.6284318989634 + ], + [ + 126.06902102956283, + -17.656182550005035 + ], + [ + 126.03134199310452, + -17.636244398963374 + ], + [ + 126.0178328785212, + -17.645440362504992 + ], + [ + 126.00066165456282, + -17.7107886697967 + ], + [ + 125.94727623789619, + -17.758151951046703 + ], + [ + 125.88526451914619, + -17.891615492713377 + ], + [ + 125.85328209727122, + -17.927178643755003 + ], + [ + 125.78093509206282, + -17.964694919796703 + ], + [ + 125.73886152435452, + -18.05323658646337 + ], + [ + 125.6928817066462, + -18.10873788854671 + ], + [ + 125.62362714935453, + -18.143243096880024 + ], + [ + 125.5107528003962, + -18.276543878130028 + ], + [ + 125.42188561289619, + -18.324395440630024 + ], + [ + 125.31885826914619, + -18.3387183572967 + ], + [ + 125.2797957691462, + -18.37778085729668 + ], + [ + 125.21583092539619, + -18.406914971880028 + ], + [ + 125.13892662852122, + -18.481947523963388 + ], + [ + 124.99325605560452, + -18.513360284380028 + ], + [ + 124.80184980560453, + -18.488620701046734 + ], + [ + 124.67798912852122, + -18.43767669063005 + ], + [ + 124.6433211597712, + -18.43767669063005 + ], + [ + 124.5544539722712, + -18.335300388546717 + ], + [ + 124.47022545664622, + -18.167331638546685 + ], + [ + 124.3845320972712, + -18.093763930213363 + ], + [ + 124.2242130868545, + -18.067315362505013 + ], + [ + 124.10832767018785, + -18.091648044796706 + ], + [ + 124.06112714935452, + -18.13380299271336 + ], + [ + 123.96200605560453, + -18.112155857296695 + ], + [ + 123.91765384206282, + -18.067722263546692 + ], + [ + 123.8767195972712, + -18.054050388546703 + ], + [ + 123.75383548268783, + -17.930026951046703 + ], + [ + 123.72909589935452, + -17.850030206255024 + ], + [ + 123.6638289722712, + -17.76604583125501 + ], + [ + 123.6389266285212, + -17.706068617713335 + ], + [ + 123.5703231128962, + -17.685479425004978 + ], + [ + 123.5577091806045, + -17.655775648963346 + ], + [ + 123.56755618581283, + -17.587904555213402 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 131.84367923268783, + -14.705743096880049 + ], + [ + 131.7180281910212, + -14.6562639302134 + ], + [ + 131.67009524831283, + -14.491550388546694 + ], + [ + 131.6682235035212, + -14.43547942500503 + ], + [ + 131.65031985768783, + -14.413425388546722 + ], + [ + 131.58879642018783, + -14.40496184688005 + ], + [ + 131.57504316497952, + -14.357435805213413 + ], + [ + 131.44524173268783, + -14.268731378130047 + ], + [ + 131.4004012378962, + -14.182305596880026 + ], + [ + 131.36125735768783, + -14.16863372188002 + ], + [ + 131.3476668628962, + -14.149346612505054 + ], + [ + 131.32512454518783, + -14.154961846880054 + ], + [ + 131.30184980560452, + -14.139662367713374 + ], + [ + 131.2573348316462, + -14.072930596880061 + ], + [ + 131.2124129566462, + -14.048760675005019 + ], + [ + 131.20744876393783, + -14.035007419796722 + ], + [ + 131.23625735768783, + -13.997247003130044 + ], + [ + 131.1814070972712, + -13.951023044796733 + ], + [ + 131.2124129566462, + -13.863783461463393 + ], + [ + 131.18368574310452, + -13.85206471146336 + ], + [ + 131.1537378264384, + -13.860039971856155 + ], + [ + 131.13323001393783, + -13.83204518021343 + ], + [ + 131.09758548268783, + -13.830010675005038 + ], + [ + 131.04159589935452, + -13.851495050005045 + ], + [ + 131.0376082691462, + -13.887383721880044 + ], + [ + 131.0224715503962, + -13.898125909380086 + ], + [ + 130.93710371185452, + -13.903659763546742 + ], + [ + 130.85556074310452, + -13.928724867713369 + ], + [ + 130.75530032643783, + -13.876478773963393 + ], + [ + 130.6567488941462, + -13.672539971880058 + ], + [ + 130.57829837331283, + -13.66830820104673 + ], + [ + 130.5537215503962, + -13.608575128130061 + ], + [ + 130.45004316497952, + -13.4653459614634 + ], + [ + 130.43075605560452, + -13.464776300005061 + ], + [ + 130.4052840503962, + -13.489678643755065 + ], + [ + 130.38583418060452, + -13.486260675005067 + ], + [ + 130.28655032643783, + -13.428643487505058 + ], + [ + 130.3244735035212, + -13.352959893755065 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 149.04851321706283, + -34.003757419797225 + ], + [ + 148.99634850352118, + -33.931573175005525 + ], + [ + 148.9637964201878, + -33.97966887813056 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 148.9637964201878, + -33.97966887813056 + ], + [ + 148.9233504566462, + -33.99334075313055 + ], + [ + 148.89169355560452, + -33.95232512813058 + ], + [ + 148.83098392018783, + -33.95061614375556 + ], + [ + 148.6897078785212, + -33.84612395625555 + ], + [ + 148.6279403003962, + -33.822116794797225 + ], + [ + 148.63290449310452, + -33.80046965938056 + ], + [ + 148.57569420664618, + -33.73088958125556 + ], + [ + 148.54737389414618, + -33.663262628130575 + ], + [ + 148.5063582691462, + -33.62940846146389 + ], + [ + 148.40878339935452, + -33.59555429479723 + ], + [ + 148.41065514414618, + -33.53793710729724 + ], + [ + 148.3676863941462, + -33.5105933572972 + ], + [ + 148.3064070972712, + -33.50725676875557 + ], + [ + 148.2307235035212, + -33.47625090938053 + ], + [ + 148.1630965503962, + -33.40951913854723 + ], + [ + 148.0254012378962, + -33.401381117713875 + ], + [ + 147.97746829518783, + -33.41790130000553 + ], + [ + 147.9405216806045, + -33.40447356563056 + ], + [ + 147.8911238941462, + -33.422051690630546 + ], + [ + 147.7478133472712, + -33.380385023963875 + ], + [ + 147.7065535816462, + -33.38380299271388 + ], + [ + 147.6323348316462, + -33.33399830521385 + ], + [ + 147.57227623789618, + -33.315443617713875 + ], + [ + 147.4878035816462, + -33.24643320104722 + ], + [ + 147.35360761810452, + -33.232354425005546 + ], + [ + 147.30559329518783, + -33.167494398963875 + ], + [ + 147.18604576914618, + -33.10418059688053 + ], + [ + 146.84709720143783, + -33.094252211463846 + ], + [ + 146.7500106128962, + -33.057549737505546 + ], + [ + 146.72307376393783, + -33.033705336463875 + ], + [ + 146.6955672535212, + -33.033379815630525 + ], + [ + 146.4980574878962, + -33.12452564896386 + ], + [ + 146.47632897227118, + -33.199069919797225 + ], + [ + 146.4437768889378, + -33.22218189896387 + ], + [ + 146.3966577483128, + -33.231622003130546 + ], + [ + 146.33513431081283, + -33.20834726354721 + ], + [ + 146.2815047535212, + -33.23764413854721 + ], + [ + 146.1731063160212, + -33.251967055213846 + ], + [ + 146.11264082122952, + -33.29867929479722 + ], + [ + 146.09188886810452, + -33.37932708125555 + ], + [ + 146.0588485035212, + -33.397393487505575 + ], + [ + 145.97649173268783, + -33.394952081255525 + ], + [ + 145.7714949878962, + -33.342299086463875 + ], + [ + 145.6049910816462, + -33.38722096146387 + ], + [ + 145.51319420664618, + -33.50505950313057 + ], + [ + 145.44817142018783, + -33.54143645625555 + ], + [ + 145.3531193368545, + -33.56088632604719 + ], + [ + 145.2844344410212, + -33.65056731563055 + ], + [ + 145.2204695972712, + -33.69133880000556 + ], + [ + 145.08196048268783, + -33.72641366979723 + ], + [ + 145.05380293060452, + -33.7202287739639 + ], + [ + 144.9831649097712, + -33.76384856563056 + ], + [ + 144.96485436289618, + -33.81983814896392 + ], + [ + 144.7083439462295, + -34.04753997188057 + ], + [ + 144.68165123789618, + -34.09636809688058 + ], + [ + 144.5761824878962, + -34.14535898229721 + ], + [ + 144.5581160816462, + -34.1782365864639 + ], + [ + 144.4917098316462, + -34.22299570104724 + ], + [ + 144.3908797535212, + -34.23357512813062 + ], + [ + 144.33570397227118, + -34.25619882604725 + ], + [ + 144.2558699878962, + -34.239108982297246 + ], + [ + 144.2104598316462, + -34.2544084614639 + ], + [ + 144.1198836597712, + -34.20558033646391 + ], + [ + 144.0605574878962, + -34.279717706255546 + ], + [ + 143.9445906910212, + -34.28907643021392 + ], + [ + 143.8711043628962, + -34.350762628130596 + ], + [ + 143.7568465503962, + -34.40471770625559 + ], + [ + 143.64901777435452, + -34.543633721880596 + ], + [ + 143.6462508472712, + -34.60344817500559 + ], + [ + 143.6223250660212, + -34.637627862505596 + ], + [ + 143.37566165456283, + -34.717461846880575 + ], + [ + 143.30364017018783, + -34.719577732297275 + ], + [ + 143.25530032643783, + -34.68596770625558 + ], + [ + 143.2212020191462, + -34.73324960729727 + ] + ], + [ + [ + 149.2790633472712, + -34.74692148229726 + ], + [ + 149.1767684253962, + -34.64983489375559 + ], + [ + 149.1594344410212, + -34.5448544250056 + ], + [ + 149.0766707691462, + -34.51336028438058 + ], + [ + 149.05095462331283, + -34.47869231563059 + ], + [ + 149.13046308685452, + -34.265557550005575 + ], + [ + 149.02719160247952, + -34.13445403438058 + ], + [ + 149.03223717539618, + -34.06772226354726 + ], + [ + 149.06535892018783, + -34.01010507604726 + ], + [ + 149.04851321706283, + -34.003757419797225 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 140.9991676555165, + -34.01763086208202 + ], + [ + 140.96807205330705, + -33.987411212203945 + ] + ], + [ + [ + 140.96708587370978, + -33.98670435533555 + ], + [ + 140.9668074878962, + -33.98650481563056 + ], + [ + 140.94182376393783, + -33.98919036250557 + ], + [ + 140.8296004566462, + -34.069024346880546 + ], + [ + 140.78183027435452, + -34.069024346880546 + ], + [ + 140.7528589201878, + -34.08660247188059 + ], + [ + 140.79436282643783, + -34.12240976354723 + ], + [ + 140.7656356128962, + -34.21176523229727 + ], + [ + 140.7131453785212, + -34.261651300005575 + ], + [ + 140.67294355560452, + -34.25042083125558 + ], + [ + 140.6521916024795, + -34.260186456255575 + ], + [ + 140.63925214935452, + -34.2848446593806 + ], + [ + 140.60930423268783, + -34.29753997188055 + ], + [ + 140.59929446706283, + -34.32927825313059 + ], + [ + 140.56267337331283, + -34.348972263547246 + ], + [ + 140.59677168060452, + -34.37346770625559 + ], + [ + 140.57341556081283, + -34.451999607297275 + ], + [ + 140.52776126393783, + -34.44670989375559 + ], + [ + 140.4873153003962, + -34.39194101354723 + ], + [ + 140.43913821706283, + -34.3979631489639 + ], + [ + 140.41171308685452, + -34.37493255000559 + ], + [ + 140.3857528003962, + -34.30388762813057 + ], + [ + 140.3845320972712, + -34.239108982297225 + ], + [ + 140.36874433685452, + -34.2003720031306 + ], + [ + 140.33196048268783, + -34.172377211463896 + ], + [ + 140.30136152435452, + -34.18450286250556 + ], + [ + 140.2299910816462, + -34.17905038854723 + ], + [ + 140.20809980560452, + -34.1593563781306 + ], + [ + 140.10344485768783, + -34.191908461463896 + ], + [ + 140.03752688893783, + -34.16594817500558 + ], + [ + 139.99594160247952, + -34.183933201047246 + ], + [ + 139.93889407643783, + -34.17083098750557 + ], + [ + 139.9265242847712, + -34.151381117713875 + ], + [ + 139.96005293060452, + -34.1274553364639 + ], + [ + 139.95403079518783, + -34.08888111771389 + ], + [ + 139.93205813893783, + -34.08269622188054 + ], + [ + 139.87850996185452, + -34.10759856563058 + ], + [ + 139.8386336597712, + -34.03826262813055 + ], + [ + 139.8154403003962, + -34.062188409380575 + ], + [ + 139.7880965503962, + -34.041029555213896 + ], + [ + 139.7002059253962, + -34.02263762813055 + ], + [ + 139.68124433685452, + -34.03110116979723 + ], + [ + 139.6809188160212, + -34.12468840938056 + ], + [ + 139.6379500660212, + -34.21241627396391 + ], + [ + 139.6447860035212, + -34.29119231563059 + ], + [ + 139.6242781910212, + -34.318536065630575 + ], + [ + 139.6088973316462, + -34.44280364375559 + ], + [ + 139.58261152435452, + -34.50042083125559 + ], + [ + 139.6037703785212, + -34.54827239375556 + ], + [ + 139.59001712331283, + -34.573093357297275 + ], + [ + 139.61003665456283, + -34.63412851354728 + ], + [ + 139.6670028003962, + -34.65056731563062 + ], + [ + 139.66513105560452, + -34.67514413854728 + ], + [ + 139.65617923268783, + -34.692396742713925 + ], + [ + 139.57040449310452, + -34.717787367713925 + ], + [ + 139.54599043060452, + -34.75359465938059 + ], + [ + 139.5781356128962, + -34.76466236771393 + ], + [ + 139.55095462331283, + -34.7954240864639 + ], + [ + 139.5559188160212, + -34.8219540343806 + ], + [ + 139.63420657643783, + -34.856622003130596 + ], + [ + 139.6408797535212, + -34.8854305968806 + ], + [ + 139.58261152435452, + -34.910332940630596 + ], + [ + 139.5483504566462, + -34.884291273963925 + ], + [ + 139.44597415456283, + -34.85662200313062 + ], + [ + 139.33139082122952, + -34.90186939896391 + ], + [ + 139.31511477956283, + -34.93181731563058 + ], + [ + 139.2605086597712, + -34.965834242713946 + ], + [ + 139.26889082122952, + -34.97804127396397 + ], + [ + 139.3278914722712, + -34.98422616979727 + ], + [ + 139.3751733733128, + -35.02581145625558 + ], + [ + 139.35409589935452, + -35.057142836463946 + ], + [ + 139.32870527435452, + -35.05535247188062 + ], + [ + 139.2929793628962, + -35.11508554479729 + ], + [ + 139.3251245451878, + -35.148288669797275 + ], + [ + 139.31511477956283, + -35.185560805213946 + ], + [ + 139.44084720143783, + -35.23796965938061 + ], + [ + 139.4585067066462, + -35.27101002396394 + ], + [ + 139.45158938893783, + -35.29005299271395 + ], + [ + 139.39763431081283, + -35.30860768021395 + ], + [ + 139.39071699310452, + -35.35011158646394 + ], + [ + 139.36288496185452, + -35.37688567500561 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 141.92628014414618, + -34.116875909380575 + ], + [ + 141.84074954518783, + -34.13054778438059 + ], + [ + 141.74842463332857, + -34.10325829045087 + ] + ], + [ + [ + 141.56767760224287, + -34.213774988091764 + ], + [ + 141.53703860768783, + -34.215834242713896 + ], + [ + 141.52294225657053, + -34.19492562706682 + ] + ], + [ + [ + 141.46266357858093, + -34.16949399035509 + ], + [ + 141.43625247426004, + -34.15833915500535 + ] + ], + [ + [ + 141.38171049382854, + -34.13528004273621 + ], + [ + 141.3305770191462, + -34.14487070104725 + ], + [ + 141.25995014636257, + -34.08369014264775 + ] + ], + [ + [ + 141.25690363648494, + -34.0823973426866 + ], + [ + 141.23430423268783, + -34.075209242713896 + ], + [ + 141.18987063893783, + -34.089288018755596 + ], + [ + 141.1337996753962, + -34.0639787739639 + ], + [ + 141.04533938893783, + -34.062188409380575 + ], + [ + 140.9991676555165, + -34.01763086208202 + ] + ], + [ + [ + 140.96807205330705, + -33.987411212203945 + ], + [ + 140.96708587370978, + -33.98670435533555 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 141.74842463332857, + -34.10325829045087 + ], + [ + 141.6655379566462, + -34.126967055213896 + ], + [ + 141.56767760224287, + -34.213774988091764 + ] + ], + [ + [ + 141.52294225657053, + -34.19492562706682 + ], + [ + 141.5105086597712, + -34.17221445104726 + ], + [ + 141.46266357858093, + -34.16949399035509 + ] + ], + [ + [ + 141.43625247426004, + -34.15833915500535 + ], + [ + 141.38171049382854, + -34.13528004273621 + ] + ], + [ + [ + 141.25995014636257, + -34.08369014264775 + ], + [ + 141.25690363648494, + -34.0823973426866 + ] + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 149.1200464201878, + -32.65569426875549 + ], + [ + 149.1743270191462, + -32.72576262813052 + ], + [ + 149.1870223316462, + -32.77239348750553 + ], + [ + 149.2417098316462, + -32.809584242713846 + ], + [ + 149.2304793628962, + -32.899102471880546 + ], + [ + 149.2453719410212, + -32.911472263547225 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 149.1200464201878, + -32.65569426875549 + ], + [ + 149.05315188893783, + -32.60857512813052 + ], + [ + 149.0031844410212, + -32.60930755000554 + ], + [ + 148.9931746753962, + -32.575697523963846 + ], + [ + 148.95753014414618, + -32.57439544063048 + ], + [ + 148.9233504566462, + -32.535495701047175 + ], + [ + 148.87297610768783, + -32.52214934688048 + ], + [ + 148.8750106128962, + -32.49871184688052 + ], + [ + 148.83497155039618, + -32.44890715938051 + ], + [ + 148.7966414722712, + -32.45842864375552 + ], + [ + 148.71989993581283, + -32.421237888547175 + ], + [ + 148.69768313893783, + -32.38510507604718 + ], + [ + 148.64584394622952, + -32.38803476354719 + ], + [ + 148.60938561289618, + -32.27914804479718 + ], + [ + 148.54599043060452, + -32.218763930213846 + ], + [ + 148.4323836597712, + -32.17986419063051 + ], + [ + 148.40194746185452, + -32.18458424271381 + ], + [ + 148.37981204518783, + -32.22087981563049 + ], + [ + 148.26563561289618, + -32.22950611771383 + ], + [ + 148.24423261810452, + -31.991631768755486 + ], + [ + 148.15031985768783, + -31.95745208125548 + ], + [ + 148.11906985768783, + -31.91407643021381 + ], + [ + 148.0205184253962, + -31.871595961463807 + ], + [ + 147.98056074310452, + -31.79705169063047 + ], + [ + 147.92278079518783, + -31.787448826047132 + ], + [ + 147.8596297535212, + -31.694756768755493 + ], + [ + 147.7993270191462, + -31.66326262813047 + ], + [ + 147.70313561289618, + -31.46404387813046 + ], + [ + 147.70606530039618, + -31.39828866979713 + ], + [ + 147.6504012378962, + -31.31585051875547 + ], + [ + 147.63583418060452, + -31.231133721880457 + ], + [ + 147.5796004566462, + -31.123874607297136 + ], + [ + 147.53117923268783, + -31.08782317500545 + ], + [ + 147.48340905039618, + -31.008721612505422 + ], + [ + 147.49333743581283, + -30.868584893755436 + ], + [ + 147.5385848316462, + -30.714288018755425 + ], + [ + 147.52743574310452, + -30.66301848750544 + ], + [ + 147.6109318368545, + -30.509698175005422 + ], + [ + 147.5302840503962, + -30.386244398963736 + ], + [ + 147.5202742847712, + -30.310560805213743 + ], + [ + 147.5620223316462, + -30.2824032531304 + ], + [ + 147.56649824310452, + -30.241387628130425 + ], + [ + 147.52938886810452, + -30.213392836463743 + ], + [ + 147.52792402435452, + -30.18743255000538 + ], + [ + 147.41179446706283, + -30.126967055213736 + ] + ], + [ + [ + 149.71835371185452, + -33.63705820104722 + ], + [ + 149.65308678477118, + -33.60564544063055 + ], + [ + 149.6462508472712, + -33.57903411250557 + ], + [ + 149.6010848316462, + -33.565362237505525 + ], + [ + 149.62924238372952, + -33.50725676875557 + ], + [ + 149.6010848316462, + -33.49985116979723 + ], + [ + 149.60686282643783, + -33.47673919063054 + ], + [ + 149.57756595143783, + -33.41456471146385 + ], + [ + 149.47453860768783, + -33.39373137813057 + ], + [ + 149.44621829518783, + -33.35450611771389 + ], + [ + 149.40219160247952, + -33.333184503130546 + ], + [ + 149.3820906910212, + -33.29070403438054 + ], + [ + 149.41627037852118, + -33.26710377396387 + ], + [ + 149.40796959727118, + -33.23666757604724 + ], + [ + 149.42538496185452, + -33.21941497188055 + ], + [ + 149.5017195972712, + -33.20297616979722 + ], + [ + 149.50399824310452, + -33.16448333125554 + ], + [ + 149.4382430347712, + -33.153334242713846 + ], + [ + 149.4196883472712, + -33.12647877396387 + ], + [ + 149.39454186289618, + -33.120293878130546 + ], + [ + 149.3951115243545, + -33.10198333125553 + ], + [ + 149.28280683685452, + -33.06446705521387 + ], + [ + 149.2722274097712, + -33.0275204406305 + ], + [ + 149.23739668060452, + -33.00017669063054 + ], + [ + 149.28329511810452, + -32.96990325313055 + ], + [ + 149.2844344410212, + -32.947686456255546 + ], + [ + 149.26539147227118, + -32.910821221880525 + ], + [ + 149.2441512378962, + -32.90903085729718 + ] + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 132.75066165456283, + -14.470147393755058 + ], + [ + 132.64763431081283, + -14.59311288854671 + ], + [ + 132.6630965503962, + -14.630873305213386 + ], + [ + 132.72274824310452, + -14.652357680213381 + ], + [ + 132.74333743581283, + -14.657077732296719 + ], + [ + 132.7739363941462, + -14.699151300005031 + ], + [ + 132.8296004566462, + -14.699151300005031 + ], + [ + 132.88249759206283, + -14.765150648963408 + ], + [ + 132.93563886810452, + -14.778008721880056 + ], + [ + 133.0244246753962, + -14.867364190630003 + ], + [ + 133.0966903003962, + -14.91586679479671 + ], + [ + 133.2614852222712, + -14.956231378130003 + ], + [ + 133.30217532643783, + -14.942559503130036 + ], + [ + 133.3330184253962, + -14.956231378130003 + ], + [ + 133.36589602956283, + -14.947279555213388 + ], + [ + 133.47014407643783, + -14.819675388546715 + ], + [ + 133.5243432951878, + -14.844089451046711 + ], + [ + 133.5422469410212, + -14.833347263546708 + ], + [ + 133.61337324310452, + -14.842787367713397 + ], + [ + 133.7663680347712, + -14.826674086463399 + ], + [ + 133.8366805347712, + -14.853936456255001 + ], + [ + 133.9255477222712, + -14.839776300005013 + ], + [ + 134.0039168628962, + -14.851088148963393 + ], + [ + 134.0461531910212, + -14.826511326046699 + ], + [ + 134.0361434253962, + -14.765964451046699 + ], + [ + 134.08733157643783, + -14.699558201046722 + ], + [ + 134.2714949878962, + -14.614190362505012 + ], + [ + 134.3613387378962, + -14.632745050005028 + ], + [ + 134.40227298268783, + -14.685967706255035 + ], + [ + 134.45834394622952, + -14.682061456255028 + ], + [ + 134.5578719410212, + -14.715508721880072 + ], + [ + 134.5976668628962, + -14.778008721880056 + ], + [ + 134.6630965503962, + -14.76653411250504 + ], + [ + 134.7277938160212, + -14.726413669796736 + ], + [ + 134.75847415456283, + -14.744805596880054 + ], + [ + 134.7890731128962, + -14.740573826046674 + ], + [ + 134.81340579518783, + -14.761895440630006 + ], + [ + 134.8896590503962, + -14.762139581255024 + ], + [ + 134.9555770191462, + -14.802097263546703 + ], + [ + 134.97087649831283, + -14.771905206255022 + ], + [ + 134.99130293060452, + -14.776299737505024 + ], + [ + 135.0566512378962, + -14.812188409380049 + ], + [ + 135.09367923268783, + -14.79631926875503 + ], + [ + 135.11483808685452, + -14.757500909380067 + ], + [ + 135.1408797535212, + -14.783217055213377 + ], + [ + 135.14559980560452, + -14.737155857296688 + ], + [ + 135.1875106128962, + -14.758965753130004 + ], + [ + 135.26164798268783, + -14.723972263546692 + ], + [ + 135.2685653003962, + -14.685560805213383 + ], + [ + 135.28264407643783, + -14.677097263546711 + ], + [ + 135.3088485035212, + -14.679701430213377 + ], + [ + 135.3134871753962, + -14.692396742713365 + ], + [ + 135.2878524097712, + -14.719903253130049 + ], + [ + 135.29387454518783, + -14.738213800005012 + ], + [ + 135.3266707691462, + -14.747898044796704 + ], + [ + 135.3427840503962, + -14.705580336463388 + ], + [ + 135.3681746753962, + -14.722832940630038 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 145.5481063160212, + -19.188327732296734 + ], + [ + 145.5810653003962, + -19.171888930213402 + ], + [ + 145.5881453785212, + -19.14666106563005 + ], + [ + 145.5942488941462, + -19.137220961463424 + ], + [ + 145.6132918628962, + -19.12289804479671 + ], + [ + 145.6989852222712, + -19.102552992713385 + ], + [ + 145.71933027435452, + -19.112644138546717 + ], + [ + 145.73601321706283, + -19.157077732296692 + ], + [ + 145.77385501393783, + -19.18409596146338 + ], + [ + 145.7870386076878, + -19.241631768755045 + ], + [ + 145.8300887378962, + -19.321302992713402 + ], + [ + 145.8535262378962, + -19.476006768755067 + ], + [ + 145.89389082122952, + -19.503350518755052 + ], + [ + 145.8818465503962, + -19.651055596880045 + ], + [ + 145.89722740977118, + -19.70159270625504 + ], + [ + 145.9553328785212, + -19.732924086463402 + ], + [ + 145.98316490977118, + -19.72551848750504 + ], + [ + 146.02084394622952, + -19.80462005000503 + ], + [ + 146.0998641285212, + -19.821791273963406 + ], + [ + 146.10661868581283, + -19.85588958125504 + ], + [ + 146.17351321706283, + -19.858575128130052 + ], + [ + 146.2370711597712, + -19.88380299271339 + ], + [ + 146.3286238941462, + -19.97201913854671 + ], + [ + 146.3972274097712, + -19.995131117713377 + ], + [ + 146.4309188160212, + -19.972670180213406 + ], + [ + 146.45606530039618, + -20.061944268755074 + ], + [ + 146.4450789722712, + -20.113946221880084 + ], + [ + 146.5004988941462, + -20.11720143021337 + ], + [ + 146.5131942066462, + -20.132338148963402 + ], + [ + 146.53825931081283, + -20.09604257604671 + ], + [ + 146.56600996185452, + -20.138360284380067 + ], + [ + 146.60214277435452, + -20.149590753130067 + ], + [ + 146.65186608164618, + -20.20492929479673 + ], + [ + 146.7060653003962, + -20.192315362505074 + ], + [ + 146.74797610768783, + -20.23088958125507 + ], + [ + 146.81251061289618, + -20.232761326046724 + ], + [ + 146.86337324310452, + -20.26205820104673 + ], + [ + 146.85751386810452, + -20.366550388546734 + ], + [ + 146.8762313160212, + -20.388523044796738 + ], + [ + 146.9421492847712, + -20.383477471880052 + ], + [ + 146.9680281910212, + -20.39983489375504 + ], + [ + 146.9592391285212, + -20.45549895625504 + ], + [ + 147.03443444102118, + -20.619642836463406 + ], + [ + 147.0766707691462, + -20.61671314896339 + ], + [ + 147.0861922535212, + -20.644870701046734 + ], + [ + 147.1133732431045, + -20.63054778438006 + ], + [ + 147.1582137378962, + -20.644870701046734 + ], + [ + 147.2819930347712, + -20.544854425005052 + ], + [ + 147.2922469410212, + -20.46599700313009 + ], + [ + 147.35360761810452, + -20.397149346880095 + ], + [ + 147.3195906910212, + -20.32512786250508 + ], + [ + 147.30038496185452, + -20.054538669796713 + ], + [ + 147.23764082122952, + -19.911146742713377 + ], + [ + 147.23837324310452, + -19.821791273963406 + ], + [ + 147.26425214935452, + -19.746026300005056 + ], + [ + 147.2956649097712, + -19.708510023963395 + ], + [ + 147.34376061289618, + -19.694756768755074 + ], + [ + 147.4120386076878, + -19.62004973750502 + ], + [ + 147.4336043628962, + -19.613946221880052 + ], + [ + 147.5923009825025, + -19.677384240540267 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 151.86304772227118, + -28.739271742713694 + ], + [ + 151.71233157643783, + -28.78020598750534 + ], + [ + 151.6340438160212, + -28.893243096880358 + ], + [ + 151.56063886810452, + -28.93897877396371 + ], + [ + 151.52629642018783, + -29.008233331255386 + ], + [ + 151.51968563469887, + -29.06168797356745 + ] + ], + [ + [ + 151.49753497986688, + -29.075328490387378 + ], + [ + 151.48878527796015, + -29.080714701946498 + ] + ], + [ + [ + 151.34381217430226, + -29.138201723509166 + ], + [ + 151.3387969218955, + -29.118899547004425 + ] + ], + [ + [ + 151.30818868302248, + -29.000941349130354 + ], + [ + 151.30680138752786, + -28.995588610598567 + ] + ], + [ + [ + 151.2861907784295, + -28.920321424970243 + ], + [ + 151.1601668628962, + -28.846123956255333 + ], + [ + 151.07770912175081, + -28.837020037948548 + ] + ], + [ + [ + 151.05401703886088, + -28.7610936444314 + ], + [ + 151.04646663088317, + -28.736710041901116 + ] + ], + [ + [ + 150.9417185514409, + -28.69375062021074 + ], + [ + 150.91681161482563, + -28.683900374003986 + ] + ], + [ + [ + 150.85049327146433, + -28.65764258874645 + ], + [ + 150.79525640043036, + -28.63573895424845 + ] + ], + [ + [ + 150.79307678842565, + -28.635108590342412 + ], + [ + 150.68799654135057, + -28.64968682006839 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 151.51968563469887, + -29.06168797356745 + ], + [ + 151.49753497986688, + -29.075328490387378 + ] + ], + [ + [ + 151.48878527796015, + -29.080714701946498 + ], + [ + 151.42237389414618, + -29.15463632604703 + ], + [ + 151.35059655039618, + -29.165459893755376 + ], + [ + 151.34381217430226, + -29.138201723509166 + ] + ], + [ + [ + 151.3387969218955, + -29.118899547004425 + ], + [ + 151.31503339935452, + -29.099297784380365 + ], + [ + 151.30818868302248, + -29.000941349130354 + ] + ], + [ + [ + 151.30680138752786, + -28.995588610598567 + ], + [ + 151.2861907784295, + -28.920321424970243 + ] + ], + [ + [ + 151.07770912175081, + -28.837020037948548 + ], + [ + 151.0552677743545, + -28.810560805213683 + ], + [ + 151.05401703886088, + -28.7610936444314 + ] + ], + [ + [ + 151.04646663088317, + -28.736710041901116 + ], + [ + 150.9790958993545, + -28.72364674271369 + ], + [ + 150.9417185514409, + -28.69375062021074 + ] + ], + [ + [ + 150.91681161482563, + -28.683900374003986 + ], + [ + 150.85049327146433, + -28.65764258874645 + ] + ], + [ + [ + 150.79525640043036, + -28.63573895424845 + ], + [ + 150.79307678842565, + -28.635108590342412 + ] + ], + [ + [ + 150.68799654135057, + -28.64968682006839 + ], + [ + 150.46965579518783, + -28.650404555213694 + ] + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 130.1489363941462, + -17.820733331255003 + ], + [ + 130.31755618581283, + -17.798028253130028 + ], + [ + 130.34489993581283, + -17.81389739375502 + ], + [ + 130.3869735035212, + -17.88917408646336 + ], + [ + 130.4753524097712, + -17.9541154927134 + ], + [ + 130.56731204518783, + -17.954603773963356 + ], + [ + 130.58781985768783, + -17.951023044796674 + ], + [ + 130.67245527435452, + -17.84392669063004 + ], + [ + 130.67595462331283, + -17.68401458125504 + ], + [ + 130.6987410816462, + -17.63266366979669 + ], + [ + 130.72909589935452, + -17.60881926875502 + ], + [ + 130.7509871753962, + -17.536065362505017 + ], + [ + 131.0471297535212, + -17.24024830521336 + ], + [ + 131.0986434253962, + -17.080905857296663 + ], + [ + 131.1672469410212, + -16.971042576046717 + ], + [ + 131.22730553477118, + -16.92815520625502 + ], + [ + 131.23625735768783, + -16.9061011697967 + ], + [ + 131.23625735768783, + -16.820733331255013 + ], + [ + 131.1965438160212, + -16.6946753885467 + ], + [ + 131.0573836597712, + -16.53956471146337 + ], + [ + 131.0527449878962, + -16.462416273963388 + ], + [ + 131.1003524097712, + -16.39389413854669 + ], + [ + 131.1059676441462, + -16.333510023963377 + ], + [ + 131.1591903003962, + -16.25383880000502 + ], + [ + 131.13323001393783, + -16.18328215938002 + ], + [ + 131.13323001393783, + -16.14226653438003 + ], + [ + 131.10637454518783, + -16.09718189896336 + ], + [ + 131.1164656910212, + -16.064304294796717 + ], + [ + 131.0922957691462, + -16.052911065630006 + ], + [ + 131.07479902435452, + -16.017998956255 + ], + [ + 131.09384199310452, + -15.9710425760467 + ], + [ + 131.07610110768783, + -15.831719659380047 + ], + [ + 131.1120711597712, + -15.798272393755028 + ], + [ + 131.0859481128962, + -15.738946221880063 + ], + [ + 131.12606855560452, + -15.681573175005033 + ], + [ + 131.1059676441462, + -15.648858331255028 + ], + [ + 131.1355086597712, + -15.628757419796692 + ], + [ + 131.13323001393783, + -15.593682550005036 + ], + [ + 131.11662845143783, + -15.576348565630017 + ], + [ + 131.0551863941462, + -15.570245050005045 + ], + [ + 130.99594160247952, + -15.540378513546687 + ], + [ + 130.86581464935452, + -15.550144138546685 + ], + [ + 130.7895613941462, + -15.51954518021335 + ], + [ + 130.77645918060452, + -15.486667576046683 + ], + [ + 130.7297469410212, + -15.50489674271338 + ], + [ + 130.7558699878962, + -15.532159112505045 + ], + [ + 130.69198652435452, + -15.610772393755015 + ], + [ + 130.61988365977118, + -15.601006768755017 + ], + [ + 130.5822860035212, + -15.627780857296687 + ], + [ + 130.5442000660212, + -15.580010675005031 + ], + [ + 130.52352949310452, + -15.578301690630038 + ], + [ + 130.47934003997952, + -15.622002862505065 + ], + [ + 130.45744876393783, + -15.620619398963356 + ], + [ + 130.4206649097712, + -15.607924086463393 + ], + [ + 130.3864852222712, + -15.573093357296704 + ], + [ + 130.35173587331283, + -15.449639581255019 + ], + [ + 130.2763778003962, + -15.365573826046699 + ], + [ + 130.2514754566462, + -15.364922784380015 + ], + [ + 130.2172957691462, + -15.403822523963372 + ], + [ + 130.14999433685452, + -15.408623956255017 + ], + [ + 130.11589602956283, + -15.435967706255001 + ], + [ + 130.02654056081283, + -15.409356378130042 + ], + [ + 129.94345136810452, + -15.446302992713363 + ], + [ + 129.85832767018783, + -15.405205987505004 + ], + [ + 129.8178817066462, + -15.24260833125502 + ], + [ + 129.7898055347712, + -15.195977471880058 + ], + [ + 129.7309676441462, + -15.188327732296704 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 148.85393313893783, + -25.338392836463566 + ], + [ + 148.8322860035212, + -25.273125909380216 + ], + [ + 148.7583113941462, + -25.180840753130227 + ], + [ + 148.73503665456283, + -25.05364348750521 + ], + [ + 148.67375735768783, + -24.995293878130237 + ], + [ + 148.6552840503962, + -24.95110442500519 + ], + [ + 148.71469160247952, + -24.809258721880187 + ], + [ + 148.7309676441462, + -24.660088800005177 + ], + [ + 148.70948326914618, + -24.599541925005152 + ], + [ + 148.6552840503962, + -24.563816013546866 + ], + [ + 148.6391707691462, + -24.530450128130177 + ], + [ + 148.6425887378962, + -24.484388930213527 + ], + [ + 148.5920516285212, + -24.38616301875518 + ], + [ + 148.6181746753962, + -24.314955336463523 + ], + [ + 148.6142684253962, + -24.26954518021353 + ], + [ + 148.58692467539618, + -24.21778736771351 + ], + [ + 148.6074324878962, + -24.173353773963523 + ], + [ + 148.5444442066462, + -24.08188241979684 + ], + [ + 148.48682701914618, + -23.921807550005145 + ], + [ + 148.51181074310452, + -23.786065362505173 + ], + [ + 148.4914656910212, + -23.71404387813016 + ], + [ + 148.54501386810452, + -23.637058201046827 + ], + [ + 148.5420028003962, + -23.601250909380145 + ], + [ + 148.51181074310452, + -23.590671482296802 + ], + [ + 148.5151473316462, + -23.568780206255145 + ], + [ + 148.60588626393783, + -23.540378513546848 + ], + [ + 148.6359155608128, + -23.51547616979683 + ], + [ + 148.6279403003962, + -23.50920989375515 + ], + [ + 148.6831160816462, + -23.433526300005155 + ], + [ + 148.67571048268783, + -23.426690362505134 + ], + [ + 148.7098901701878, + -23.3925920552135 + ], + [ + 148.70875084727118, + -23.36126067500515 + ], + [ + 148.7319442066462, + -23.36117929479682 + ], + [ + 148.7478133472712, + -23.37892018021348 + ], + [ + 148.78557376393783, + -23.364678643755134 + ], + [ + 148.84563235768783, + -23.378594659380145 + ], + [ + 148.8647567066462, + -23.368096612505145 + ], + [ + 148.85393313893783, + -23.282728773963473 + ], + [ + 148.94377688893783, + -23.245619398963466 + ], + [ + 148.95451907643783, + -23.210788669796802 + ], + [ + 148.9848738941462, + -23.193373305213488 + ], + [ + 148.9939070972712, + -23.167494398963466 + ], + [ + 148.9637964201878, + -23.1282691385468 + ], + [ + 148.96965579518783, + -23.107354425005134 + ], + [ + 149.1075138681045, + -23.04656340938013 + ], + [ + 149.1962182951878, + -23.04265715938015 + ], + [ + 149.23495527435452, + -22.990899346880116 + ], + [ + 149.28679446706283, + -22.964369398963488 + ], + [ + 149.3237410816462, + -22.88176848750513 + ], + [ + 149.34302819102118, + -22.875502211463463 + ], + [ + 149.4094344410212, + -22.91212330521345 + ], + [ + 149.4362899097712, + -23.01401132604681 + ], + [ + 149.47828209727118, + -23.042494398963473 + ], + [ + 149.5024520191462, + -23.117201430213473 + ], + [ + 149.49317467539618, + -23.184258721880134 + ], + [ + 149.54647871185452, + -23.213799737505145 + ], + [ + 149.54354902435452, + -23.23731861771348 + ], + [ + 149.5114852222712, + -23.271335544796802 + ], + [ + 149.52409915456283, + -23.315118096880145 + ], + [ + 149.50888105560452, + -23.360528253130138 + ], + [ + 149.5774031910212, + -23.385674737505145 + ], + [ + 149.6137801441462, + -23.49065520625513 + ], + [ + 149.67343183685452, + -23.53289153438017 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 147.69182376393783, + -42.17774830521413 + ], + [ + 147.60450280039618, + -42.16651783646416 + ], + [ + 147.55168704518783, + -42.11036549271414 + ], + [ + 147.47030683685452, + -42.05909596146415 + ], + [ + 147.4797469410212, + -42.0260555968808 + ], + [ + 147.4361271493545, + -41.921888930214195 + ], + [ + 147.3597925139378, + -41.892917576047445 + ], + [ + 147.3225203785212, + -41.835625909380795 + ], + [ + 147.24504642018783, + -41.80665455521415 + ], + [ + 147.1413680347712, + -41.722832940630795 + ], + [ + 147.11776777435452, + -41.68604908646414 + ], + [ + 147.14657636810452, + -41.630059503130774 + ], + [ + 147.1413680347712, + -41.592299086464145 + ], + [ + 147.06454511810452, + -41.46974049271412 + ], + [ + 147.07252037852118, + -41.43474700313079 + ], + [ + 147.12094160247952, + -41.445326430214166 + ], + [ + 147.1133732431045, + -41.39747486771414 + ], + [ + 147.0517684253962, + -41.3319638000058 + ], + [ + 146.99358157643783, + -41.29949309688079 + ], + [ + 146.9787703785212, + -41.24260833125579 + ], + [ + 146.9270125660212, + -41.21485768021412 + ], + [ + 146.9251408212295, + -41.18889739375581 + ], + [ + 146.9496362639378, + -41.161065362505795 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 116.7431746753962, + -33.218682550005525 + ], + [ + 116.82862389414622, + -33.33058033646387 + ], + [ + 116.79712975352119, + -33.52776458125553 + ], + [ + 116.80461673268789, + -33.60222747188057 + ], + [ + 116.7475692066462, + -33.60564544063055 + ], + [ + 116.70158938893788, + -33.680677992713875 + ], + [ + 116.63583418060452, + -33.67473723750557 + ], + [ + 116.61345462331288, + -33.64324309688057 + ], + [ + 116.57081139414622, + -33.65463632604723 + ], + [ + 116.57121829518789, + -33.7122535135472 + ], + [ + 116.5433862639379, + -33.746270440630546 + ], + [ + 116.5234481128962, + -33.73259856563055 + ], + [ + 116.5308537118545, + -33.76059335729721 + ], + [ + 116.3725692066462, + -33.84587981563057 + ], + [ + 116.3729761076879, + -33.87273528438057 + ], + [ + 116.39307701914622, + -33.890964451047196 + ], + [ + 116.37948652435453, + -33.897149346880546 + ], + [ + 116.39087975352122, + -33.924737237505575 + ], + [ + 116.3657332691462, + -33.931166273963896 + ], + [ + 116.3657332691462, + -33.95232512813058 + ], + [ + 116.32479902435453, + -33.931166273963896 + ], + [ + 116.2932235035212, + -33.96599700313057 + ], + [ + 116.24878990977122, + -33.955498956255575 + ], + [ + 116.2080998056045, + -34.000827732297246 + ], + [ + 116.13518313893789, + -33.968194268755575 + ], + [ + 116.0669051441462, + -33.971530857297225 + ], + [ + 116.0437931649795, + -33.959161065630546 + ], + [ + 116.02499433685452, + -33.91399505000556 + ], + [ + 115.9777938160212, + -33.906182550005575 + ], + [ + 115.88282311289622, + -33.830743096880575 + ], + [ + 115.76921634206288, + -33.93865325313059 + ], + [ + 115.66081790456288, + -33.97446054479723 + ], + [ + 115.59864342539619, + -34.041029555213896 + ], + [ + 115.61231530039622, + -34.075209242713896 + ], + [ + 115.5781356128962, + -34.069024346880575 + ], + [ + 115.5149031910212, + -34.10466887813055 + ], + [ + 115.50928795664623, + -34.069024346880546 + ], + [ + 115.22063235768789, + -34.075209242713896 + ], + [ + 115.18954511810452, + -34.098077081255575 + ], + [ + 115.2082625660212, + -34.22836679479726 + ], + [ + 115.15837649831289, + -34.296726169797246 + ], + [ + 115.1649682951879, + -34.3102352843806 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 150.40327303461777, + -28.612421502541075 + ], + [ + 150.298553790949, + -28.535252684480966 + ] + ], + [ + [ + 150.29787805734813, + -28.535013051996394 + ], + [ + 150.29777666114757, + -28.535036904751056 + ] + ], + [ + [ + 150.2139621291455, + -28.554725369980215 + ], + [ + 150.15821373789618, + -28.554620050005365 + ], + [ + 150.01947191149804, + -28.600121534813212 + ] + ], + [ + [ + 149.98637226601238, + -28.600802857355063 + ], + [ + 149.9429328181347, + -28.60168532687076 + ] + ], + [ + [ + 149.6205817065657, + -28.607763425475756 + ], + [ + 149.59489993581283, + -28.56536223750533 + ], + [ + 149.48406009206283, + -28.583916925005333 + ], + [ + 149.43950094868248, + -28.647835545154763 + ] + ], + [ + [ + 149.41780141469843, + -28.678651516188122 + ], + [ + 149.26539147227118, + -28.740736586463694 + ], + [ + 149.2078983085758, + -28.789164297936562 + ] + ], + [ + [ + 149.0955956935925, + -28.84736939344518 + ], + [ + 149.09291501602704, + -28.849228052705232 + ] + ], + [ + [ + 148.97262441247747, + -28.99821865271895 + ], + [ + 148.97076192329183, + -28.999746192188766 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 150.46965579518783, + -28.650404555213694 + ], + [ + 150.40327303461777, + -28.612421502541075 + ] + ], + [ + [ + 150.298553790949, + -28.535252684480966 + ], + [ + 150.29787805734813, + -28.535013051996394 + ] + ], + [ + [ + 150.29777666114757, + -28.535036904751056 + ], + [ + 150.2139621291455, + -28.554725369980215 + ] + ], + [ + [ + 150.01947191149804, + -28.600121534813212 + ], + [ + 149.98637226601238, + -28.600802857355063 + ] + ], + [ + [ + 149.9429328181347, + -28.60168532687076 + ], + [ + 149.7587996753962, + -28.606947523963672 + ], + [ + 149.7041121753962, + -28.627455336463658 + ], + [ + 149.6906844410212, + -28.61410898229704 + ], + [ + 149.6205817065657, + -28.607763425475756 + ] + ], + [ + [ + 149.43950094868248, + -28.647835545154763 + ], + [ + 149.41780141469843, + -28.678651516188122 + ] + ], + [ + [ + 149.2078983085758, + -28.789164297936562 + ], + [ + 149.17831464935452, + -28.81829192500534 + ], + [ + 149.0955956935925, + -28.84736939344518 + ] + ], + [ + [ + 149.09291501602704, + -28.849228052705232 + ], + [ + 149.06308027435452, + -28.936374607297033 + ], + [ + 148.97262441247747, + -28.99821865271895 + ] + ], + [ + [ + 148.97076192329183, + -28.999746192188766 + ], + [ + 148.8681746753962, + -29.053236586463687 + ], + [ + 148.8195906910212, + -29.10003020625539 + ], + [ + 148.8090926441462, + -29.17856210729703 + ], + [ + 148.7583113941462, + -29.222670180213694 + ], + [ + 148.7098901701878, + -29.33253346146372 + ], + [ + 148.69621829518783, + -29.37485116979706 + ], + [ + 148.71469160247952, + -29.43206145625538 + ], + [ + 148.6823836597712, + -29.506361586463726 + ], + [ + 148.5171004566462, + -29.592299086463726 + ], + [ + 148.4990340503962, + -29.651706638547047 + ], + [ + 148.43987063893783, + -29.721612237505415 + ], + [ + 148.3915307951878, + -29.74407317500544 + ], + [ + 148.38420657643783, + -29.772881768755376 + ], + [ + 148.3405867847712, + -29.792494398963726 + ], + [ + 148.26490319102118, + -29.883151951047076 + ], + [ + 148.1836043628962, + -29.939955336463743 + ], + [ + 148.1661076181045, + -29.975274346880404 + ], + [ + 148.0798445972712, + -30.012220961463726 + ], + [ + 147.87899824310452, + -30.046237888547097 + ], + [ + 147.7304793628962, + -30.053155206255422 + ], + [ + 147.6355086597712, + -30.076836846880404 + ], + [ + 147.6084090503962, + -30.10108814896375 + ], + [ + 147.5161238941462, + -30.094903253130425 + ], + [ + 147.4145613941462, + -30.124525648963743 + ] + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 141.9310954649675, + -34.10921461071869 + ], + [ + 141.92628014414618, + -34.116875909380575 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 147.4145613941462, + -30.124525648963743 + ], + [ + 147.3527938160212, + -30.142510675005383 + ], + [ + 147.32626386810452, + -30.128350518755404 + ], + [ + 147.21086673268783, + -30.12143320104708 + ], + [ + 147.1723738941462, + -30.063816013547108 + ], + [ + 147.04712975352118, + -30.050469659380386 + ], + [ + 147.0349227222712, + -30.028008721880386 + ], + [ + 147.00001061289618, + -30.028334242713736 + ], + [ + 146.9629012378962, + -29.985365492713697 + ], + [ + 146.89836673268783, + -29.984307550005376 + ], + [ + 146.8261824878962, + -29.943291925005372 + ], + [ + 146.76115970143783, + -29.949069919797072 + ], + [ + 146.67522220143783, + -29.915948175005415 + ], + [ + 146.6342879566462, + -29.922865492713715 + ], + [ + 146.5964461597712, + -29.961927992713733 + ], + [ + 146.5312606128962, + -29.943291925005372 + ], + [ + 146.4902449878962, + -29.95012786250542 + ], + [ + 146.4592391285212, + -29.929701430213736 + ], + [ + 146.32756595143783, + -29.94483814896373 + ], + [ + 146.26848392018783, + -29.97478606563042 + ], + [ + 146.19003339935452, + -29.945651951047086 + ], + [ + 146.1442163420628, + -29.970635675005408 + ], + [ + 146.0420028003962, + -29.966485284380422 + ], + [ + 146.02409915456283, + -29.984307550005376 + ], + [ + 146.0376082691462, + -30.02035898229706 + ], + [ + 146.01758873786991, + -30.042494398965925 + ], + [ + 145.9489852222712, + -30.07366301875541 + ], + [ + 145.9348250660212, + -30.0941708312554 + ], + [ + 145.91423587331283, + -30.087334893755404 + ], + [ + 145.8462020191462, + -30.105970961463765 + ], + [ + 145.7775985035212, + -30.197116794797097 + ], + [ + 145.7395125660212, + -30.20867278438042 + ], + [ + 145.67489668060452, + -30.261651300005393 + ], + [ + 145.58334394622952, + -30.28435637813041 + ], + [ + 145.56487063893783, + -30.33383554479712 + ], + [ + 145.5774031910212, + -30.363295180213754 + ], + [ + 145.51026451914618, + -30.409519138547115 + ], + [ + 145.4089461597712, + -30.408623956255404 + ], + [ + 145.3923445972712, + -30.4288876281304 + ], + [ + 145.33830813893783, + -30.409519138547115 + ], + [ + 145.3178003264378, + -30.447442315630404 + ], + [ + 145.24992923268783, + -30.481947523963758 + ], + [ + 145.1781518889378, + -30.46404387813045 + ], + [ + 145.1423445972712, + -30.48438893021375 + ], + [ + 145.1267195972712, + -30.477715753130415 + ], + [ + 145.11923261810452, + -30.549493096880415 + ], + [ + 145.05844160247952, + -30.60808684688043 + ], + [ + 145.01710045664618, + -30.636244398963743 + ], + [ + 144.9931746753962, + -30.64421965938042 + ], + [ + 144.9690047535212, + -30.627618096880425 + ], + [ + 144.95028730560452, + -30.648125909380415 + ], + [ + 144.91423587331283, + -30.648939711463772 + ], + [ + 144.88632246185452, + -30.676934503130425 + ], + [ + 144.85572350352118, + -30.68059661250543 + ], + [ + 144.84758548268783, + -30.71575286250545 + ], + [ + 144.79094485768783, + -30.738457940630415 + ], + [ + 144.71501712331283, + -30.86809661250543 + ], + [ + 144.6860457691462, + -30.890476169797097 + ], + [ + 144.5117293628962, + -30.896661065630422 + ], + [ + 144.43026777435452, + -30.930596612505436 + ], + [ + 144.3600366545628, + -31.00392018021377 + ], + [ + 144.3730574878962, + -31.03630950313045 + ], + [ + 144.3520613941462, + -31.06682708125543 + ], + [ + 144.32919355560452, + -31.080987237505454 + ], + [ + 144.2497664722712, + -31.0726050760471 + ], + [ + 144.2216903003962, + -31.122002862505457 + ], + [ + 144.2216903003962, + -31.115166925005436 + ], + [ + 144.17082767018783, + -31.119642836463797 + ], + [ + 144.09188886810452, + -31.197116794797136 + ], + [ + 144.02499433685452, + -31.20891692500545 + ], + [ + 144.01620527435452, + -31.228448175005447 + ], + [ + 144.0442000660212, + -31.300713800005454 + ], + [ + 144.0380965503962, + -31.345391534380457 + ], + [ + 144.01433352956283, + -31.374932550005443 + ], + [ + 143.9277449878962, + -31.423191013547147 + ], + [ + 143.8864852222712, + -31.416192315630465 + ], + [ + 143.81128990977118, + -31.45086028438048 + ], + [ + 143.74862714935452, + -31.457858982297136 + ], + [ + 143.7087508472712, + -31.442559503130482 + ], + [ + 143.5720320972712, + -31.486016534380454 + ], + [ + 143.47600345143783, + -31.597588800005468 + ], + [ + 143.4305932951878, + -31.560235284380493 + ], + [ + 143.38925214935452, + -31.568047784380457 + ], + [ + 143.3559676441462, + -31.62192148229717 + ], + [ + 143.3244735035212, + -31.732842706255493 + ], + [ + 143.21802819102118, + -31.749200128130497 + ], + [ + 143.1355086597712, + -31.869317315630475 + ], + [ + 143.03557376393783, + -31.88982512813049 + ], + [ + 143.00871829518783, + -31.91448333125549 + ], + [ + 142.9799910816462, + -32.00375741979715 + ], + [ + 142.9959416024795, + -32.0809872375055 + ], + [ + 142.97160892018783, + -32.10515715938048 + ], + [ + 142.9506942066462, + -32.115899346880504 + ], + [ + 142.85865319102118, + -32.111504815630475 + ], + [ + 142.8208113941462, + -32.15667083125549 + ], + [ + 142.70427493581283, + -32.2042782531305 + ], + [ + 142.6772567066462, + -32.27052174271381 + ], + [ + 142.61093183685452, + -32.306003513547154 + ], + [ + 142.5268660816462, + -32.32390715938049 + ], + [ + 142.4621688160212, + -32.391452732297175 + ], + [ + 142.4008895191462, + -32.4179013000055 + ], + [ + 142.3855086597712, + -32.5242652322972 + ], + [ + 142.4023543628962, + -32.600030206255504 + ], + [ + 142.38225345143783, + -32.659030857297196 + ], + [ + 142.3923445972712, + -32.78842538854719 + ], + [ + 142.37411543060452, + -32.82309335729718 + ], + [ + 142.3720809253962, + -32.89031340938054 + ], + [ + 142.3928328785212, + -32.92612070104721 + ], + [ + 142.3806258472712, + -32.943373305213846 + ], + [ + 142.39934329518783, + -33.00017669063054 + ], + [ + 142.3863224618545, + -33.035577081255504 + ], + [ + 142.3215438160212, + -33.083021742713875 + ], + [ + 142.3031518889378, + -33.12306080521383 + ], + [ + 142.3015242847712, + -33.19093189896386 + ], + [ + 142.3250431649795, + -33.21184661250553 + ], + [ + 142.38567142018783, + -33.225518487505546 + ], + [ + 142.49423261810452, + -33.33538176875552 + ], + [ + 142.5669051441462, + -33.382826430213896 + ], + [ + 142.58700605560452, + -33.413018487505525 + ], + [ + 142.5774031910212, + -33.45208098750557 + ], + [ + 142.53362063893783, + -33.54485442500556 + ], + [ + 142.46745852956283, + -33.57561614375556 + ], + [ + 142.45614668060452, + -33.622979425005575 + ], + [ + 142.42343183685452, + -33.6469865864639 + ], + [ + 142.40617923268783, + -33.69174570104724 + ], + [ + 142.18222089935452, + -33.80144622188055 + ], + [ + 142.0305281910212, + -33.81829192500559 + ], + [ + 141.9931746753962, + -33.86134205521388 + ], + [ + 141.9917098316462, + -33.94841887813056 + ], + [ + 141.91464277435452, + -34.01238372188057 + ], + [ + 141.91325931081283, + -34.069024346880546 + ], + [ + 141.9310954649675, + -34.10921461071869 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 146.2915958993545, + -42.26401132604745 + ], + [ + 146.40324954518783, + -42.316745701047466 + ], + [ + 146.4941512378962, + -42.40365976354751 + ], + [ + 146.6198836597712, + -42.440443617714195 + ], + [ + 146.6682235035212, + -42.496270440630816 + ], + [ + 146.8149520191462, + -42.580092055214145 + ], + [ + 146.9729923837295, + -42.73699309688081 + ], + [ + 147.1220809253962, + -42.78761158646415 + ], + [ + 147.2245386076878, + -42.742120050005816 + ], + [ + 147.27792402435452, + -42.77865976354748 + ] + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 149.6734375, + -23.53289153438008 + ], + [ + 149.7170918317047, + -23.551849943496205 + ], + [ + 149.76106323614275, + -23.61935320176337 + ], + [ + 149.79078339755324, + -23.615300452480128 + ], + [ + 149.80699439468623, + -23.593685789636112 + ], + [ + 149.8461709710909, + -23.58017662535864 + ], + [ + 149.91641862533393, + -23.60854587034137 + ], + [ + 149.9488406195999, + -23.561263795370124 + ], + [ + 150.0001754438544, + -23.551807380375905 + ], + [ + 149.9569461181664, + -23.508578054687916 + ], + [ + 149.965028941511, + -23.493535816366652 + ], + [ + 150.01773735741514, + -23.47615606042193 + ], + [ + 149.96099886744966, + -23.442383149728208 + ], + [ + 149.96099886744966, + -23.416715737600935 + ], + [ + 149.9150677089087, + -23.415364821191652 + ], + [ + 149.91371679247843, + -23.350520832641212 + ], + [ + 149.88940029677892, + -23.338362584791444 + ], + [ + 149.8880493803512, + -23.32350250408625 + ], + [ + 149.92452412390043, + -23.30594059052548 + ], + [ + 149.9407351210334, + -23.245149351276748 + ], + [ + 149.91641862533393, + -23.19921819273327 + ], + [ + 149.9162703785212, + -23.16407643021348 + ], + [ + 149.87606855560452, + -23.121270440630116 + ], + [ + 149.8799748056045, + -23.09425221146349 + ], + [ + 149.9233504566462, + -23.097100518755138 + ], + [ + 149.94247480560452, + -23.07512786250515 + ], + [ + 149.9887801441462, + -23.097100518755127 + ], + [ + 150.0092879566462, + -23.09172942500513 + ], + [ + 150.04680423268783, + -23.042494398963473 + ], + [ + 150.0772404306045, + -23.09067148229682 + ], + [ + 150.12020918060452, + -23.10442473750512 + ], + [ + 150.16350345143783, + -23.14552174271349 + ], + [ + 150.23528079518783, + -23.117608331255127 + ], + [ + 150.37566165456283, + -23.156670831255134 + ], + [ + 150.4006453785212, + -23.19093189896347 + ], + [ + 150.3674422535212, + -23.2190894510468 + ], + [ + 150.3610132170628, + -23.259779555213505 + ], + [ + 150.42009524831283, + -23.24854908646348 + ], + [ + 150.46501712331283, + -23.33049895625514 + ], + [ + 150.4886987639378, + -23.33220794063015 + ], + [ + 150.52051842539618, + -23.38201262813013 + ], + [ + 150.57504316497952, + -23.385186456255138 + ], + [ + 150.60783938893783, + -23.448256117713484 + ], + [ + 150.67066490977118, + -23.48878346146349 + ], + [ + 150.70655358164618, + -23.503106378130152 + ], + [ + 150.8213810556045, + -23.509209893755163 + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 146.1750615229594, + -36.0307934631071 + ], + [ + 146.21591230560452, + -36.055840753130646 + ] + ], + [ + [ + 147.0432235035212, + -36.108086846880646 + ], + [ + 147.06058589218998, + -36.103141468776855 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 146.0280867847712, + -36.014580987505596 + ], + [ + 146.0561629566462, + -36.00489674271398 + ], + [ + 146.1750615229594, + -36.0307934631071 + ] + ], + [ + [ + 147.06058589218998, + -36.103141468776855 + ], + [ + 147.1189070972712, + -36.03110116979731 + ], + [ + 147.2716577483128, + -36.049004815630646 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 145.99224623589046, + -36.016034016783 + ], + [ + 145.96841395233682, + -35.99371195480688 + ] + ], + [ + [ + 145.94001814897337, + -35.96709606238367 + ], + [ + 145.93953255046605, + -35.96684621106167 + ] + ], + [ + [ + 145.90076080483368, + -35.96648585590532 + ], + [ + 145.8296004566462, + -35.983412367713974 + ], + [ + 145.74423261810452, + -35.964857680213996 + ], + [ + 145.57232609618666, + -35.84363640359687 + ] + ], + [ + [ + 145.3838914312475, + -35.86926953914316 + ], + [ + 145.33467737312841, + -35.875923922198325 + ] + ], + [ + [ + 144.9621964383147, + -35.95327870450991 + ], + [ + 144.96181212113805, + -35.95398974223281 + ] + ], + [ + [ + 144.95246692853092, + -36.032508965728546 + ], + [ + 144.9852544114249, + -36.08012459785911 + ] + ], + [ + [ + 144.9855545357532, + -36.08106873809223 + ], + [ + 144.9751082691462, + -36.09750741979734 + ], + [ + 144.93699685477063, + -36.091800903091155 + ] + ], + [ + [ + 144.83630828711588, + -36.113998168761164 + ], + [ + 144.81080162851828, + -36.13168710726974 + ], + [ + 144.74088301143203, + -36.13496443559141 + ] + ], + [ + [ + 144.74062874888406, + -36.13495015664758 + ], + [ + 144.72866740570436, + -36.12666960606204 + ] + ], + [ + [ + 144.70535763448476, + -36.11052569149707 + ], + [ + 144.70518298881467, + -36.11040469962214 + ] + ], + [ + [ + 144.65824335414342, + -36.07786646438456 + ], + [ + 144.60246829518783, + -36.066094659380674 + ], + [ + 144.50337580225082, + -35.97024203305559 + ] + ], + [ + [ + 144.4847447853045, + -35.9572663932007 + ], + [ + 144.45224043060452, + -35.94719817500563 + ], + [ + 144.42157164199907, + -35.91228632725588 + ] + ], + [ + [ + 144.3247559151805, + -35.75486334660247 + ], + [ + 144.2762964201878, + -35.747979425005646 + ], + [ + 144.14755025057838, + -35.646235411615386 + ] + ], + [ + [ + 144.00196471681573, + -35.55698262065598 + ], + [ + 143.99740175794344, + -35.55418014258382 + ] + ], + [ + [ + 143.87981043789304, + -35.48185063226583 + ], + [ + 143.84905732778586, + -35.46290052490665 + ] + ], + [ + [ + 143.8122057438701, + -35.44017387877784 + ], + [ + 143.77487918888485, + -35.41775044766812 + ] + ], + [ + [ + 143.7169906838708, + -35.399314501239374 + ], + [ + 143.6508895191462, + -35.38933684688062 + ], + [ + 143.5952254566462, + -35.36052825313063 + ], + [ + 143.5761824878962, + -35.32903411250561 + ], + [ + 143.58913318732624, + -35.31038819630871 + ] + ], + [ + [ + 143.5815367019244, + -35.25052968877781 + ], + [ + 143.5807916133973, + -35.24918003369238 + ] + ], + [ + [ + 143.50271048685343, + -35.21761512801185 + ], + [ + 143.4179793628962, + -35.18800221146394 + ], + [ + 143.38347415456283, + -35.145684503130624 + ], + [ + 143.3498641285212, + -35.065931898963925 + ], + [ + 143.33201908728034, + -34.958883787493164 + ] + ], + [ + [ + 143.3406453522697, + -34.91267507516875 + ], + [ + 143.34597528263615, + -34.88410029850334 + ] + ], + [ + [ + 143.35311003158313, + -34.845821199017635 + ], + [ + 143.35944868402754, + -34.805741099769286 + ] + ], + [ + [ + 143.31332729401996, + -34.78308781316736 + ], + [ + 143.2824813160212, + -34.792494398963925 + ], + [ + 143.27289275436385, + -34.76320698389833 + ] + ], + [ + [ + 143.23530325322892, + -34.744707612780786 + ], + [ + 143.230095529487, + -34.742143351263685 + ] + ], + [ + [ + 143.14320952588713, + -34.69931353938981 + ], + [ + 143.04952449323943, + -34.69208293118859 + ] + ], + [ + [ + 142.9840795063974, + -34.68717205693581 + ], + [ + 142.9734306381156, + -34.68637027208421 + ] + ], + [ + [ + 142.88026495022334, + -34.679286048097005 + ], + [ + 142.87996755165466, + -34.67913956323787 + ] + ], + [ + [ + 142.71536708217604, + -34.62701743630387 + ], + [ + 142.6943465503962, + -34.73097096146391 + ], + [ + 142.6672649722787, + -34.73355393652735 + ] + ], + [ + [ + 142.64250874499976, + -34.78759863951274 + ], + [ + 142.64250735768783, + -34.78761158646391 + ], + [ + 142.6251733733128, + -34.79526132604727 + ], + [ + 142.60966830603485, + -34.782466091745206 + ] + ], + [ + [ + 142.5565815748183, + -34.77412862410834 + ], + [ + 142.5263778003962, + -34.7577450500056 + ], + [ + 142.52335997788074, + -34.72742481537823 + ] + ], + [ + [ + 142.39606130630708, + -34.547955684540334 + ], + [ + 142.3720809253962, + -34.424737237505596 + ], + [ + 142.4060263881604, + -34.3561761648689 + ] + ], + [ + [ + 142.37374900488396, + -34.33793286495445 + ], + [ + 142.3278914722712, + -34.33464934688059 + ], + [ + 142.2727746803041, + -34.28077083406028 + ] + ], + [ + [ + 142.27119200311304, + -34.279873774928106 + ], + [ + 142.255108481421, + -34.26026503447065 + ] + ], + [ + [ + 142.23528619026567, + -34.19247936029126 + ], + [ + 142.1994735035212, + -34.19280364375555 + ], + [ + 142.17016809249677, + -34.16731205154179 + ] + ], + [ + [ + 142.14694091714657, + -34.15850323215478 + ], + [ + 142.0940047535212, + -34.17083098750557 + ], + [ + 142.06559341907146, + -34.12761117331616 + ] + ], + [ + [ + 142.02533584267343, + -34.112299387255725 + ], + [ + 141.96005293060452, + -34.12468840938059 + ], + [ + 141.92628014414618, + -34.116875909380575 + ] + ], + [ + [ + 147.04452558685452, + -36.10759856563064 + ], + [ + 147.0343555507776, + -36.10245691396415 + ] + ], + [ + [ + 146.96812079635131, + -36.10070850901336 + ], + [ + 146.95573977956283, + -36.1180152322973 + ], + [ + 146.90435316535297, + -36.098998395843786 + ] + ], + [ + [ + 146.84686607484406, + -36.09742721743426 + ], + [ + 146.84623331477866, + -36.09713364661814 + ] + ], + [ + [ + 146.78535557267196, + -36.0688680218332 + ], + [ + 146.76571434434462, + -36.05973960213475 + ] + ], + [ + [ + 146.73085899858395, + -36.04352951834204 + ], + [ + 146.68889407643783, + -36.04233163854731 + ], + [ + 146.6237899097712, + -35.993829034380646 + ], + [ + 146.53344494927205, + -35.989122612502676 + ] + ], + [ + [ + 146.4795533691519, + -35.98633205829564 + ], + [ + 146.46524789005687, + -35.985588123572384 + ] + ], + [ + [ + 146.38484453186987, + -36.04744733019961 + ], + [ + 146.27873219767758, + -36.0390598107821 + ] + ], + [ + [ + 146.23963352588672, + -36.03595055527821 + ], + [ + 146.21591230560452, + -36.055840753130646 + ] + ], + [ + [ + 148.00497480560452, + -36.96713632604737 + ], + [ + 148.00196373789618, + -36.93987395625566 + ], + [ + 148.12381238864776, + -36.78300107459195 + ] + ], + [ + [ + 148.21349873179295, + -36.652084744241115 + ], + [ + 148.2138488891633, + -36.650884467242726 + ] + ], + [ + [ + 148.18311461412122, + -36.581271220572404 + ], + [ + 148.14999433685452, + -36.562513930213996 + ], + [ + 148.13440930794195, + -36.4707130612536 + ] + ], + [ + [ + 148.12756793437947, + -36.455159897929114 + ], + [ + 148.0673120451878, + -36.40968189896399 + ], + [ + 148.0762495891069, + -36.33830680976356 + ] + ], + [ + [ + 148.0719131167882, + -36.328417497693245 + ], + [ + 148.05569859428002, + -36.29141950783345 + ] + ], + [ + [ + 148.0321609468341, + -36.2376532472072 + ], + [ + 148.0317545863542, + -36.236248052721486 + ] + ], + [ + [ + 148.012466061569, + -36.13841385499408 + ], + [ + 147.9911401701878, + -36.11419036250567 + ], + [ + 147.99976993823864, + -36.07389732397677 + ] + ], + [ + [ + 147.9971810331782, + -36.06072986002351 + ], + [ + 147.92314882830294, + -36.02811029364659 + ] + ], + [ + [ + 147.7143981499089, + -35.939659701821824 + ], + [ + 147.71368954190868, + -35.939450290258726 + ] + ], + [ + [ + 147.6880813205116, + -35.948752181534076 + ], + [ + 147.5557137096985, + -35.996162086974586 + ] + ], + [ + [ + 147.34843289595022, + -36.06051330047932 + ], + [ + 147.3431026674275, + -36.07087899628372 + ] + ], + [ + [ + 147.33996142409185, + -36.076304215188344 + ], + [ + 147.33987280387782, + -36.07629164835292 + ] + ] + ] + }, + { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 146.0280867847712, + -36.014580987505596 + ], + [ + 145.99224623589046, + -36.016034016783 + ] + ], + [ + [ + 145.96841395233682, + -35.99371195480688 + ], + [ + 145.94001814897337, + -35.96709606238367 + ] + ], + [ + [ + 145.93953255046605, + -35.96684621106167 + ], + [ + 145.90076080483368, + -35.96648585590532 + ] + ], + [ + [ + 145.57232609618666, + -35.84363640359687 + ], + [ + 145.49333743581283, + -35.82903411250563 + ], + [ + 145.3838914312475, + -35.86926953914316 + ] + ], + [ + [ + 145.33467737312841, + -35.875923922198325 + ], + [ + 145.2177026701878, + -35.85125090938064 + ], + [ + 145.0080672535212, + -35.86760833125564 + ], + [ + 144.97087649831283, + -35.894870701047296 + ], + [ + 144.9621964383147, + -35.95327870450991 + ] + ], + [ + [ + 144.96181212113805, + -35.95398974223281 + ], + [ + 144.9336043628962, + -36.00554778438065 + ], + [ + 144.95246692853092, + -36.032508965728546 + ] + ], + [ + [ + 144.9852544114249, + -36.08012459785911 + ], + [ + 144.9855545357532, + -36.08106873809223 + ] + ], + [ + [ + 144.93699685477063, + -36.091800903091155 + ], + [ + 144.88974043060452, + -36.07634856563063 + ], + [ + 144.83630828711588, + -36.113998168761164 + ] + ], + [ + [ + 144.74088301143203, + -36.13496443559141 + ], + [ + 144.74062874888406, + -36.13495015664758 + ] + ], + [ + [ + 144.72866740570436, + -36.12666960606204 + ], + [ + 144.72421308685452, + -36.11166757604732 + ], + [ + 144.70535763448476, + -36.11052569149707 + ] + ], + [ + [ + 144.70518298881467, + -36.11040469962214 + ], + [ + 144.65824335414342, + -36.07786646438456 + ] + ], + [ + [ + 144.50337580225082, + -35.97024203305559 + ], + [ + 144.4847447853045, + -35.9572663932007 + ] + ], + [ + [ + 144.42157164199907, + -35.91228632725588 + ], + [ + 144.3530379566462, + -35.77752044063063 + ], + [ + 144.3247559151805, + -35.75486334660247 + ] + ], + [ + [ + 144.14755025057838, + -35.646235411615386 + ], + [ + 144.09970136810452, + -35.58676523229728 + ], + [ + 144.00196471681573, + -35.55698262065598 + ] + ], + [ + [ + 143.99740175794344, + -35.55418014258382 + ], + [ + 143.98039798268783, + -35.52337005000564 + ], + [ + 143.87981043789304, + -35.48185063226583 + ] + ], + [ + [ + 143.84905732778586, + -35.46290052490665 + ], + [ + 143.8122057438701, + -35.44017387877784 + ] + ], + [ + [ + 143.77487918888485, + -35.41775044766812 + ], + [ + 143.7169906838708, + -35.399314501239374 + ] + ], + [ + [ + 143.58913318732624, + -35.31038819630871 + ], + [ + 143.5815367019244, + -35.25052968877781 + ] + ], + [ + [ + 143.5807916133973, + -35.24918003369238 + ], + [ + 143.50271048685343, + -35.21761512801185 + ] + ], + [ + [ + 143.33201908728034, + -34.958883787493164 + ], + [ + 143.3406453522697, + -34.91267507516875 + ] + ], + [ + [ + 143.34597528263615, + -34.88410029850334 + ], + [ + 143.35311003158313, + -34.845821199017635 + ] + ], + [ + [ + 143.35944868402754, + -34.805741099769286 + ], + [ + 143.31332729401996, + -34.78308781316736 + ] + ], + [ + [ + 143.27289275436385, + -34.76320698389833 + ], + [ + 143.23530325322892, + -34.744707612780786 + ] + ], + [ + [ + 143.230095529487, + -34.742143351263685 + ], + [ + 143.14320952588713, + -34.69931353938981 + ] + ], + [ + [ + 143.04952449323943, + -34.69208293118859 + ], + [ + 142.99537194102118, + -34.668796482297246 + ], + [ + 142.9840795063974, + -34.68717205693581 + ] + ], + [ + [ + 142.9734306381156, + -34.68637027208421 + ], + [ + 142.93368574310452, + -34.65813567500559 + ], + [ + 142.88026495022334, + -34.679286048097005 + ] + ], + [ + [ + 142.87996755165466, + -34.67913956323787 + ], + [ + 142.85490970143783, + -34.62078215938056 + ], + [ + 142.7898055347712, + -34.58237070104729 + ], + [ + 142.7258406910212, + -34.603204034380624 + ], + [ + 142.71536708217604, + -34.62701743630387 + ] + ], + [ + [ + 142.6672649722787, + -34.73355393652735 + ], + [ + 142.63046308685452, + -34.7363420552139 + ], + [ + 142.64250874499976, + -34.78759863951274 + ] + ], + [ + [ + 142.60966830603485, + -34.782466091745206 + ], + [ + 142.5565815748183, + -34.77412862410834 + ] + ], + [ + [ + 142.52335997788074, + -34.72742481537823 + ], + [ + 142.47128339935452, + -34.643405857297275 + ], + [ + 142.46745852956283, + -34.60344817500559 + ], + [ + 142.39606130630708, + -34.547955684540334 + ] + ], + [ + [ + 142.4060263881604, + -34.3561761648689 + ], + [ + 142.3962508472712, + -34.33806731563057 + ], + [ + 142.37374900488396, + -34.33793286495445 + ] + ], + [ + [ + 142.2727746803041, + -34.28077083406028 + ], + [ + 142.27119200311304, + -34.279873774928106 + ] + ], + [ + [ + 142.255108481421, + -34.26026503447065 + ], + [ + 142.23528619026567, + -34.19247936029126 + ] + ], + [ + [ + 142.17016809249677, + -34.16731205154179 + ], + [ + 142.14694091714657, + -34.15850323215478 + ] + ], + [ + [ + 142.06559341907146, + -34.12761117331616 + ], + [ + 142.02533584267343, + -34.112299387255725 + ] + ], + [ + [ + 147.0343555507776, + -36.10245691396415 + ], + [ + 147.00497480560452, + -36.09018320104731 + ], + [ + 146.96812079635131, + -36.10070850901336 + ] + ], + [ + [ + 146.90435316535297, + -36.098998395843786 + ], + [ + 146.8784285816462, + -36.08757903438063 + ], + [ + 146.84686607484406, + -36.09742721743426 + ] + ], + [ + [ + 146.84623331477866, + -36.09713364661814 + ], + [ + 146.81251061289618, + -36.06951262813064 + ], + [ + 146.78535557267196, + -36.0688680218332 + ] + ], + [ + [ + 146.76571434434462, + -36.05973960213475 + ], + [ + 146.73085899858395, + -36.04352951834204 + ] + ], + [ + [ + 146.53344494927205, + -35.989122612502676 + ], + [ + 146.50391686289618, + -35.973972263547296 + ], + [ + 146.4795533691519, + -35.98633205829564 + ] + ], + [ + [ + 146.46524789005687, + -35.985588123572384 + ], + [ + 146.4316512378962, + -35.98390064896396 + ], + [ + 146.38484453186987, + -36.04744733019961 + ] + ], + [ + [ + 146.27873219767758, + -36.0390598107821 + ], + [ + 146.23963352588672, + -36.03595055527821 + ] + ], + [ + [ + 148.12381238864776, + -36.78300107459195 + ], + [ + 148.21349873179295, + -36.652084744241115 + ] + ], + [ + [ + 148.2138488891633, + -36.650884467242726 + ], + [ + 148.2146916024795, + -36.61687590938067 + ], + [ + 148.18311461412122, + -36.581271220572404 + ] + ], + [ + [ + 148.13440930794195, + -36.4707130612536 + ], + [ + 148.12756793437947, + -36.455159897929114 + ] + ], + [ + [ + 148.0762495891069, + -36.33830680976356 + ], + [ + 148.0719131167882, + -36.328417497693245 + ] + ], + [ + [ + 148.05569859428002, + -36.29141950783345 + ], + [ + 148.0321609468341, + -36.2376532472072 + ] + ], + [ + [ + 148.0317545863542, + -36.236248052721486 + ], + [ + 148.04509524831283, + -36.17253997188064 + ], + [ + 148.012466061569, + -36.13841385499408 + ] + ], + [ + [ + 147.99976993823864, + -36.07389732397677 + ], + [ + 147.9971810331782, + -36.06072986002351 + ] + ], + [ + [ + 147.92314882830294, + -36.02811029364659 + ], + [ + 147.9094344410212, + -36.005059503130646 + ], + [ + 147.7143981499089, + -35.939659701821824 + ] + ], + [ + [ + 147.71368954190868, + -35.939450290258726 + ], + [ + 147.6880813205116, + -35.948752181534076 + ] + ], + [ + [ + 147.5557137096985, + -35.996162086974586 + ], + [ + 147.5019637378962, + -35.94874439896393 + ], + [ + 147.40829511810452, + -35.95964934688064 + ], + [ + 147.36044355560452, + -36.0081519510473 + ], + [ + 147.34843289595022, + -36.06051330047932 + ] + ], + [ + [ + 147.3431026674275, + -36.07087899628372 + ], + [ + 147.33996142409185, + -36.076304215188344 + ] + ], + [ + [ + 147.33987280387782, + -36.07629164835292 + ], + [ + 147.3059188160212, + -36.05209726354731 + ], + [ + 147.2716577483128, + -36.049004815630646 + ] + ] + ] + } + ] +} \ No newline at end of file diff --git a/images/Cavaliers.png b/images/Cavaliers.png deleted file mode 100644 index 85d3bdf1..00000000 Binary files a/images/Cavaliers.png and /dev/null differ diff --git a/images/Odisha.jpg b/images/Odisha.jpg deleted file mode 100644 index 3a34e06b..00000000 Binary files a/images/Odisha.jpg and /dev/null differ diff --git a/images/People_Circle0.png b/images/People_Circle0.png deleted file mode 100644 index ac9fa4b1..00000000 Binary files a/images/People_Circle0.png and /dev/null differ diff --git a/images/People_Circle1.png b/images/People_Circle1.png deleted file mode 100644 index d1197277..00000000 Binary files a/images/People_Circle1.png and /dev/null differ diff --git a/images/User_image.png b/images/User_image.png deleted file mode 100644 index df2fb764..00000000 Binary files a/images/User_image.png and /dev/null differ diff --git a/images/airplane.png b/images/airplane.png deleted file mode 100644 index 66509d44..00000000 Binary files a/images/airplane.png and /dev/null differ diff --git a/images/athletics.png b/images/athletics.png deleted file mode 100644 index a7c91801..00000000 Binary files a/images/athletics.png and /dev/null differ diff --git a/images/axis_feature.png b/images/axis_feature.png deleted file mode 100644 index 4761620e..00000000 Binary files a/images/axis_feature.png and /dev/null differ diff --git a/images/axis_types.png b/images/axis_types.png deleted file mode 100644 index a87d225c..00000000 Binary files a/images/axis_types.png and /dev/null differ diff --git a/images/axis_types.svg b/images/axis_types.svg deleted file mode 100644 index a2d088aa..00000000 --- a/images/axis_types.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - Axis types - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/back.png b/images/back.png deleted file mode 100644 index ed3e8d73..00000000 Binary files a/images/back.png and /dev/null differ diff --git a/images/ball.png b/images/ball.png index 22adafd7..4ee38ad9 100644 Binary files a/images/ball.png and b/images/ball.png differ diff --git a/images/ball_progressbar.png b/images/ball_progressbar.png new file mode 100644 index 00000000..22adafd7 Binary files /dev/null and b/images/ball_progressbar.png differ diff --git a/images/bike.png b/images/bike.png deleted file mode 100644 index 2165945d..00000000 Binary files a/images/bike.png and /dev/null differ diff --git a/images/cancer_day.png b/images/cancer_day.png new file mode 100644 index 00000000..e5676673 Binary files /dev/null and b/images/cancer_day.png differ diff --git a/images/car.png b/images/car.png deleted file mode 100644 index 90bcd2f2..00000000 Binary files a/images/car.png and /dev/null differ diff --git a/images/close.png b/images/close.png deleted file mode 100644 index ba1339be..00000000 Binary files a/images/close.png and /dev/null differ diff --git a/images/environment_day.png b/images/environment_day.png new file mode 100644 index 00000000..4839119c Binary files /dev/null and b/images/environment_day.png differ diff --git a/images/external.png b/images/external.png deleted file mode 100644 index f50238b0..00000000 Binary files a/images/external.png and /dev/null differ diff --git a/images/golfball.png b/images/golfball.png deleted file mode 100644 index 1abcfeb8..00000000 Binary files a/images/golfball.png and /dev/null differ diff --git a/images/golfball2.png b/images/golfball2.png deleted file mode 100644 index 8c8b7b6a..00000000 Binary files a/images/golfball2.png and /dev/null differ diff --git a/images/golfball3.png b/images/golfball3.png deleted file mode 100644 index edf9b7ab..00000000 Binary files a/images/golfball3.png and /dev/null differ diff --git a/images/grouping_dark.png b/images/grouping_dark.png new file mode 100644 index 00000000..fbffec0e Binary files /dev/null and b/images/grouping_dark.png differ diff --git a/images/grouping_light.png b/images/grouping_light.png new file mode 100644 index 00000000..1ca3177c Binary files /dev/null and b/images/grouping_light.png differ diff --git a/images/happiness_day.png b/images/happiness_day.png new file mode 100644 index 00000000..5c1a6a97 Binary files /dev/null and b/images/happiness_day.png differ diff --git a/images/health_day.png b/images/health_day.png new file mode 100644 index 00000000..54faf93e Binary files /dev/null and b/images/health_day.png differ diff --git a/images/info.png b/images/info.png deleted file mode 100644 index 037db7a9..00000000 Binary files a/images/info.png and /dev/null differ diff --git a/images/information.svg b/images/information.svg deleted file mode 100644 index d2c68dfc..00000000 --- a/images/information.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Information - Created with Sketch. - - - - \ No newline at end of file diff --git a/images/jpg.png b/images/jpg.png deleted file mode 100644 index 7b5e5168..00000000 Binary files a/images/jpg.png and /dev/null differ diff --git a/images/legend.png b/images/legend.png deleted file mode 100644 index 2cc5d247..00000000 Binary files a/images/legend.png and /dev/null differ diff --git a/images/legend.svg b/images/legend.svg deleted file mode 100644 index f7f721c0..00000000 --- a/images/legend.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - Legend - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/live_update.png b/images/live_update.png deleted file mode 100644 index cf654fd2..00000000 Binary files a/images/live_update.png and /dev/null differ diff --git a/images/live_update.svg b/images/live_update.svg deleted file mode 100644 index 6f1bb4f4..00000000 --- a/images/live_update.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - Live Update - Created with Sketch. - - - - - - - - - - - - \ No newline at end of file diff --git a/images/man1.png b/images/man1.png deleted file mode 100644 index 41a43b6d..00000000 Binary files a/images/man1.png and /dev/null differ diff --git a/images/man2.png b/images/man2.png deleted file mode 100644 index 9f57e4c5..00000000 Binary files a/images/man2.png and /dev/null differ diff --git a/images/man3.png b/images/man3.png deleted file mode 100644 index b66040d8..00000000 Binary files a/images/man3.png and /dev/null differ diff --git a/images/maps-chichen-itza.jpg b/images/maps-chichen-itza.jpg new file mode 100644 index 00000000..d2e253e2 Binary files /dev/null and b/images/maps-chichen-itza.jpg differ diff --git a/images/maps-christ-the-redeemer.jpg b/images/maps-christ-the-redeemer.jpg new file mode 100644 index 00000000..c98fa872 Binary files /dev/null and b/images/maps-christ-the-redeemer.jpg differ diff --git a/images/maps-colosseum.jpg b/images/maps-colosseum.jpg new file mode 100644 index 00000000..f02ba0a7 Binary files /dev/null and b/images/maps-colosseum.jpg differ diff --git a/images/maps-great-wall-of-china.png b/images/maps-great-wall-of-china.png new file mode 100644 index 00000000..440a3507 Binary files /dev/null and b/images/maps-great-wall-of-china.png differ diff --git a/images/maps-machu-picchu.jpg b/images/maps-machu-picchu.jpg new file mode 100644 index 00000000..e83902dc Binary files /dev/null and b/images/maps-machu-picchu.jpg differ diff --git a/images/maps-petra.jpg b/images/maps-petra.jpg new file mode 100644 index 00000000..6405b64a Binary files /dev/null and b/images/maps-petra.jpg differ diff --git a/images/maps-tajmahal.jpg b/images/maps-tajmahal.jpg new file mode 100644 index 00000000..03714277 Binary files /dev/null and b/images/maps-tajmahal.jpg differ diff --git a/images/menu.png b/images/menu.png deleted file mode 100644 index d8d8abe8..00000000 Binary files a/images/menu.png and /dev/null differ diff --git a/images/open_arrow.png b/images/open_arrow.png deleted file mode 100644 index dccc6ab5..00000000 Binary files a/images/open_arrow.png and /dev/null differ diff --git a/images/other_features.png b/images/other_features.png deleted file mode 100644 index 44b8af72..00000000 Binary files a/images/other_features.png and /dev/null differ diff --git a/images/other_features.svg b/images/other_features.svg deleted file mode 100644 index da4424b8..00000000 --- a/images/other_features.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - Other Features - Created with Sketch. - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/pdficon.png b/images/pdficon.png deleted file mode 100644 index 600f5470..00000000 Binary files a/images/pdficon.png and /dev/null differ diff --git a/images/png.png b/images/png.png deleted file mode 100644 index 5ff9e6c6..00000000 Binary files a/images/png.png and /dev/null differ diff --git a/images/radial_range_slider.png b/images/radial_range_slider.png new file mode 100644 index 00000000..78a6e366 Binary files /dev/null and b/images/radial_range_slider.png differ diff --git a/images/radial_slider.png b/images/radial_slider.png new file mode 100644 index 00000000..fa0d7a72 Binary files /dev/null and b/images/radial_slider.png differ diff --git a/images/settings.png b/images/settings.png deleted file mode 100644 index 491c9ab1..00000000 Binary files a/images/settings.png and /dev/null differ diff --git a/images/settings.svg b/images/settings.svg deleted file mode 100644 index c34147a6..00000000 --- a/images/settings.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Settings - Created with Sketch. - - - - \ No newline at end of file diff --git a/images/sparkline_winloss.png b/images/sparkline_winloss.png new file mode 100644 index 00000000..11ab1cbf Binary files /dev/null and b/images/sparkline_winloss.png differ diff --git a/images/tourism_day.png b/images/tourism_day.png new file mode 100644 index 00000000..74c461e8 Binary files /dev/null and b/images/tourism_day.png differ diff --git a/images/user_interaction.png b/images/user_interaction.png deleted file mode 100644 index b7e08c02..00000000 Binary files a/images/user_interaction.png and /dev/null differ diff --git a/images/user_interaction.svg b/images/user_interaction.svg deleted file mode 100644 index fe75543f..00000000 --- a/images/user_interaction.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - User Interaction - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/images/whatsnew.png b/images/whatsnew.png deleted file mode 100644 index a3dbab39..00000000 Binary files a/images/whatsnew.png and /dev/null differ diff --git a/images/xlsio/assets.png b/images/xlsio/assets.png new file mode 100644 index 00000000..22607b09 Binary files /dev/null and b/images/xlsio/assets.png differ diff --git a/images/xlsio/categories.png b/images/xlsio/categories.png new file mode 100644 index 00000000..09548587 Binary files /dev/null and b/images/xlsio/categories.png differ diff --git a/images/xlsio/liabilities.png b/images/xlsio/liabilities.png new file mode 100644 index 00000000..b50a7043 Binary files /dev/null and b/images/xlsio/liabilities.png differ diff --git a/ios/Runner/AppDelegate.m b/ios/Runner/AppDelegate.m index cca4eb62..65354c17 100644 --- a/ios/Runner/AppDelegate.m +++ b/ios/Runner/AppDelegate.m @@ -7,7 +7,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { FlutterViewController* controller =(FlutterViewController*) self.window.rootViewController; - FlutterMethodChannel* viewPdfFileChannel = [FlutterMethodChannel methodChannelWithName:@"launchFile" binaryMessenger: controller]; + FlutterMethodChannel* viewPdfFileChannel = [FlutterMethodChannel methodChannelWithName:@"launchFile" binaryMessenger: controller.binaryMessenger]; [viewPdfFileChannel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) { if ([@"viewPdf" isEqualToString:call.method] || [@"viewExcel" isEqualToString:call.method]) { @@ -17,7 +17,7 @@ - (BOOL)application:(UIApplication *)application if(fileExist){ NSString* fileExtension = [filePath pathExtension]; _uiController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]]; - _uiController.delegate = self; + _uiController.delegate = (id)self; if([fileExtension isEqualToString:@"pdf"]){ _uiController.UTI = @"com.adobe.pdf"; } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index cb3f7ce9..b86f2dfb 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/lib/model/helper.dart b/lib/model/helper.dart index 4b892160..09e0964b 100644 --- a/lib/model/helper.dart +++ b/lib/model/helper.dart @@ -8,8 +8,6 @@ import 'package:url_launcher/url_launcher.dart'; /// Local imports import '../widgets/bottom_sheet.dart'; import '../widgets/flutter_backdrop.dart'; -import '../widgets/shared/mobile.dart' - if (dart.library.html) '../widgets/shared/web.dart'; import 'mobile_view.dart'; import 'model.dart'; import 'sample_view.dart'; @@ -170,14 +168,12 @@ class _FullViewSampleLayout extends StatelessWidget { child: Container( height: 40, width: 40, - child: HandCursor( - child: IconButton( - icon: Image.asset('images/code.png', - color: Colors.white), - onPressed: () { - launch(sample.codeLink); - }, - ), + child: IconButton( + icon: Image.asset('images/code.png', + color: Colors.white), + onPressed: () { + launch(sample.codeLink); + }, ), ), ) @@ -187,15 +183,13 @@ class _FullViewSampleLayout extends StatelessWidget { child: Container( height: 40, width: 40, - child: HandCursor( - child: IconButton( - icon: Image.asset('images/info.png', - color: Colors.white), - onPressed: () { - frontPanelVisible.value = - !frontPanelVisible.value; - }, - ), + child: IconButton( + icon: Icon(Icons.info_outline, + color: Colors.white), + onPressed: () { + frontPanelVisible.value = + !frontPanelVisible.value; + }, ), ), ), @@ -208,14 +202,12 @@ class _FullViewSampleLayout extends StatelessWidget { child: Container( height: 40, width: 40, - child: HandCursor( - child: IconButton( - icon: Image.asset('images/code.png', - color: Colors.white), - onPressed: () { - launch(sample.codeLink); - }, - ), + child: IconButton( + icon: Image.asset('images/code.png', + color: Colors.white), + onPressed: () { + launch(sample.codeLink); + }, ), ), ), @@ -652,7 +644,7 @@ Widget getLeftSideDrawer(SampleModel _model) { )), Align( alignment: Alignment.bottomCenter, - child: Text('Version 18.3.35', + child: Text('Version 18.4.30', style: TextStyle( color: _model.drawerTextIconColor, fontSize: 12, @@ -696,46 +688,37 @@ Widget getFooter(BuildContext context, SampleModel model) { children: [ Row( children: [ - HandCursor( - child: InkWell( - child: const Text('Documentation', - style: TextStyle(color: Colors.blue, fontSize: 12)), - onTap: () => launch( - 'https://help.syncfusion.com/flutter/introduction/overview'), - ), + InkWell( + child: const Text('Documentation', + style: TextStyle(color: Colors.blue, fontSize: 12)), + onTap: () => launch( + 'https://help.syncfusion.com/flutter/introduction/overview'), ), Text(' | ', style: TextStyle( fontSize: 12, color: model.textColor.withOpacity(0.7))), - HandCursor( - child: InkWell( - child: const Text('Forum', - style: TextStyle(color: Colors.blue, fontSize: 12)), - onTap: () => - launch('https://www.syncfusion.com/forums/flutter'), - ), + InkWell( + child: const Text('Forum', + style: TextStyle(color: Colors.blue, fontSize: 12)), + onTap: () => + launch('https://www.syncfusion.com/forums/flutter'), ), Text(' | ', style: TextStyle( fontSize: 12, color: model.textColor.withOpacity(0.7))), - HandCursor( - child: InkWell( - child: const Text('Blog', - style: TextStyle(color: Colors.blue, fontSize: 12)), - onTap: () => - launch('https://www.syncfusion.com/blogs/?s=flutter'), - ), + InkWell( + child: const Text('Blog', + style: TextStyle(color: Colors.blue, fontSize: 12)), + onTap: () => + launch('https://www.syncfusion.com/blogs/?s=flutter'), ), Text(' | ', style: TextStyle( fontSize: 12, color: model.textColor.withOpacity(0.7))), - HandCursor( - child: InkWell( - child: const Text('Knowledge base', - style: TextStyle(color: Colors.blue, fontSize: 12)), - onTap: () => - launch('https://www.syncfusion.com/kb/flutter'), - ), + InkWell( + child: const Text('Knowledge base', + style: TextStyle(color: Colors.blue, fontSize: 12)), + onTap: () => launch('https://www.syncfusion.com/kb/flutter'), ) ], ), @@ -748,18 +731,16 @@ Widget getFooter(BuildContext context, SampleModel model) { letterSpacing: 0.23))) ], )), - HandCursor( - child: InkWell( - onTap: () => launch('https://www.syncfusion.com'), - child: Image.asset( - model.themeData.brightness == Brightness.dark - ? 'images/syncfusion_dark.png' - : 'images/syncfusion.png', - fit: BoxFit.contain, - height: 25, - width: model.isMobileResolution ? 80 : 120), - ), - ) + InkWell( + onTap: () => launch('https://www.syncfusion.com'), + child: Image.asset( + model.themeData.brightness == Brightness.dark + ? 'images/syncfusion_dark.png' + : 'images/syncfusion.png', + fit: BoxFit.contain, + height: 25, + width: model.isMobileResolution ? 80 : 120), + ), ], ), ); @@ -790,13 +771,11 @@ Widget showWebThemeSettings(SampleModel model) { fontSize: 16, fontWeight: FontWeight.bold, fontFamily: 'Roboto-Medium')), - HandCursor( - child: IconButton( - icon: Icon(Icons.close, color: model.webIconColor), - onPressed: () { - Navigator.pop(context); - }), - ) + IconButton( + icon: Icon(Icons.close, color: model.webIconColor), + onPressed: () { + Navigator.pop(context); + }), ], ), Expanded( @@ -879,17 +858,15 @@ Widget showWebThemeSettings(SampleModel model) { Container( height: 44, padding: const EdgeInsets.fromLTRB(15, 0, 15, 0), - child: HandCursor( - child: RaisedButton( - color: model.paletteColor, - onPressed: () => _applyThemeAndPaletteColor( - model, context, _selectedValue), - child: const Text('APPLY', - style: TextStyle( - fontSize: 16, - fontFamily: 'Roboto-Bold', - color: Colors.white))), - ), + child: RaisedButton( + color: model.paletteColor, + onPressed: () => _applyThemeAndPaletteColor( + model, context, _selectedValue), + child: const Text('APPLY', + style: TextStyle( + fontSize: 16, + fontFamily: 'Roboto-Bold', + color: Colors.white))), ) ], ), @@ -925,14 +902,12 @@ List _addColorPalettes(SampleModel model, [StateSetter setState]) { border: Border.all(color: model.paletteBorderColors[i], width: 2.0), shape: BoxShape.circle, ), - child: HandCursor( - child: InkWell( - onTap: () => _changeColorPalette(model, i, setState), - child: Icon( - Icons.brightness_1, - size: 40.0, - color: model.paletteColors[i], - ), + child: InkWell( + onTap: () => _changeColorPalette(model, i, setState), + child: Icon( + Icons.brightness_1, + size: 40.0, + color: model.paletteColors[i], ), ), ))); @@ -994,7 +969,9 @@ String getStatusTag(SubItem item) { } status = (newCount != 0 && newCount == item.subItems.length) ? (_isWeb ? 'New' : 'N') - : (newCount != 0 || updateCount != 0) ? (_isWeb ? 'Updated' : 'U') : ''; + : (newCount != 0 || updateCount != 0) + ? (_isWeb ? 'Updated' : 'U') + : ''; } return status; } @@ -1009,9 +986,7 @@ void showBottomSettingsPanel(SampleModel model, BuildContext context) { ? const Color.fromRGBO(84, 84, 84, 1) : const Color.fromRGBO(218, 218, 218, 1); showRoundedModalBottomSheet( - dismissOnTap: false, context: context, - radius: 12.0, color: model.bottomSheetBackgroundColor, builder: (BuildContext context) => Container( height: 250, @@ -1183,12 +1158,9 @@ void showBottomSettingsPanel(SampleModel model, BuildContext context) { void showBottomSheetSettingsPanel(BuildContext context, Widget propertyWidget) { final SampleModel _model = SampleModel.instance; showRoundedModalBottomSheet( - dismissOnTap: false, context: context, - radius: 12.0, color: _model.bottomSheetBackgroundColor, builder: (BuildContext context) => Container( - height: MediaQuery.of(context).size.height * 0.22, padding: const EdgeInsets.fromLTRB(15, 0, 0, 5), child: Stack(children: [ Row( diff --git a/lib/model/mobile_view.dart b/lib/model/mobile_view.dart index 8646c6b7..f10b13bf 100644 --- a/lib/model/mobile_view.dart +++ b/lib/model/mobile_view.dart @@ -26,6 +26,7 @@ class LayoutPage extends StatefulWidget { class _LayoutPageState extends State { SampleModel _model; WidgetCategory _category; + StateSetter refreshSetState; @override void initState() { @@ -37,137 +38,206 @@ class _LayoutPageState extends State { int _primaryTabIndex = 0; int _secondaryTabIndex = 0; + bool _showCodeIcon = false; + @override Widget build(BuildContext context) { + _showCodeIcon = + _category.controlList[_category.selectedIndex].subItems[0].type == + 'sample' || + (_category.controlList[_category.selectedIndex].subItems[0].type != + 'parent' && + _category.controlList[_category.selectedIndex].subItems[0] + .displayType != + 'card'); return Theme( data: ThemeData( brightness: _model.themeData.brightness, primaryColor: _model.backgroundColor), - child: SafeArea( - child: DefaultTabController( - length: - _category.controlList[_category.selectedIndex].subItems.length, - child: Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.white), - onPressed: () => Navigator.maybePop(context, false), - ), - backgroundColor: _model.paletteColor, - bottom: ((_category.controlList[_category.selectedIndex] - .sampleList != - null && - _category.controlList[_category.selectedIndex] - .displayType == - 'card')) || - _category.controlList[_category.selectedIndex] - .subItems.length == - 1 - ? null - : TabBar( - onTap: (int index) { - _primaryTabIndex = index; - }, - indicator: const UnderlineTabIndicator( - borderSide: BorderSide( - width: 5.0, - color: Color.fromRGBO(252, 220, 0, 1)), - ), - isScrollable: true, - tabs: _getTabs( - _category.controlList[_category.selectedIndex] - .subItems, - 'parent'), - ), - title: Text( - _category.controlList[_category.selectedIndex].title - .toString(), - style: const TextStyle( - fontWeight: FontWeight.bold, - fontSize: 16.0, - color: Colors.white, - letterSpacing: 0.3)), - actions: ((_category.controlList[_category.selectedIndex] - .sampleList != - null && - _category.controlList[_category.selectedIndex] - .displayType != - 'card' && - _category.controlList[_category.selectedIndex] - .sampleList[_primaryTabIndex].codeLink != - null && - _category.controlList[_category.selectedIndex] - .sampleList[_primaryTabIndex].codeLink != - '') || - (_category.controlList[_category.selectedIndex] - .childList != - null && - _category - .controlList[_category.selectedIndex] - .childList[_primaryTabIndex] - .displayType != - 'card')) - ? [ - Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 10, 0), - child: Container( - height: 40, - width: 40, - child: IconButton( - icon: Image.asset('images/code.png', - color: Colors.white), - onPressed: () { - launch(_category + child: StatefulBuilder( + builder: (BuildContext buildContext, StateSetter setState) { + refreshSetState = setState; + return SafeArea( + child: DefaultTabController( + length: _category + .controlList[_category.selectedIndex].subItems.length, + child: Scaffold( + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () => Navigator.maybePop(context, false), + ), + backgroundColor: _model.paletteColor, + bottom: ((_category.controlList[_category.selectedIndex] + .sampleList != + null && + _category.controlList[_category.selectedIndex] + .displayType == + 'card')) || + _category.controlList[_category.selectedIndex] + .subItems.length == + 1 + ? null + : TabBar( + onTap: (int index) { + if (index != _primaryTabIndex) { + _primaryTabIndex = index; + refreshSetState(() { + _showCodeIcon = _category .controlList[ _category.selectedIndex] - .sampleList == - null - ? _category - .controlList[_category.selectedIndex] - .childList[_primaryTabIndex] - .subItems[_secondaryTabIndex] - .codeLink - : _category - .controlList[_category.selectedIndex] - .sampleList[_primaryTabIndex] - .codeLink); - }, - ), + .subItems[index] + .type == + 'sample' || + (_category + .controlList[ + _category.selectedIndex] + .subItems[index] + .type != + 'parent' && + _category + .controlList[ + _category.selectedIndex] + .subItems[index] + .displayType != + 'card'); + }); + } + }, + indicator: const UnderlineTabIndicator( + borderSide: BorderSide( + width: 5.0, + color: Color.fromRGBO(252, 220, 0, 1)), ), + isScrollable: true, + tabs: _getTabs( + _category.controlList[_category.selectedIndex] + .subItems, + 'parent'), ), - ] - : null, - ), - body: TabBarView( - physics: const NeverScrollableScrollPhysics(), - children: (_category.controlList[_category.selectedIndex] - .sampleList != - null) || - _category.controlList[_category.selectedIndex] - .subItems.length == - 1 - ? _getSamples( - _model, - _category.controlList[_category.selectedIndex] - .sampleList, - _category.controlList[_category.selectedIndex] - .displayType) - : (_category.controlList[_category.selectedIndex] - .childList != + title: Text( + _category.controlList[_category.selectedIndex].title + .toString(), + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 16.0, + color: Colors.white, + letterSpacing: 0.3)), + actions: ((_category.controlList[_category.selectedIndex] + .sampleList != null && - _checkSubItemsType(_category - .controlList[_category.selectedIndex] - .subItems)) - ? _getChildTabViewChildren( - _model, - _category.controlList[_category.selectedIndex] - .childList) - : _getParentTabViewChildren( - _model, _category.controlList[_category.selectedIndex] - .subItems))), - ), - )); + .displayType != + 'card' && + _category + .controlList[_category.selectedIndex] + .sampleList[_primaryTabIndex] + .codeLink != + null && + _category + .controlList[_category.selectedIndex] + .sampleList[_primaryTabIndex] + .codeLink != + '') || + (_category.controlList[_category.selectedIndex] + .childList != + null && + _category + .controlList[_category.selectedIndex] + .childList[_primaryTabIndex] + .displayType != + 'card')) + ? [ + Visibility( + visible: _showCodeIcon, + child: Padding( + padding: + const EdgeInsets.fromLTRB(0, 0, 10, 0), + child: Container( + height: 40, + width: 40, + child: IconButton( + icon: Image.asset('images/code.png', + color: Colors.white), + onPressed: () { + launch(_category.controlList[_category.selectedIndex].sampleList == null + ? (_category.controlList[_category.selectedIndex].childList[_primaryTabIndex].subItems[_secondaryTabIndex].codeLink == null && + _category + .controlList[_category + .selectedIndex] + .childList[ + _primaryTabIndex] + .subItems[ + _secondaryTabIndex] + .subItems + .length == + 1 && + _category + .controlList[_category + .selectedIndex] + .childList[ + _primaryTabIndex] + .subItems[ + _secondaryTabIndex] + .displayType != + 'card' + ? _category + .controlList[ + _category.selectedIndex] + .childList[_primaryTabIndex] + .subItems[ + _secondaryTabIndex] + .subItems[0] + .codeLink + : _category + .controlList[ + _category.selectedIndex] + .childList[_primaryTabIndex] + .subItems[ + _secondaryTabIndex] + .codeLink) + : _category + .controlList[_category.selectedIndex] + .sampleList[_primaryTabIndex] + .codeLink); + }, + ), + ), + )), + ] + : null, + ), + body: TabBarView( + physics: const NeverScrollableScrollPhysics(), + children: (_category.controlList[_category.selectedIndex] + .sampleList != + null) || + _category.controlList[_category.selectedIndex] + .subItems.length == + 1 + ? _getSamples( + _model, + _category.controlList[_category.selectedIndex] + .sampleList, + _category.controlList[_category.selectedIndex] + .displayType) + : (_category.controlList[_category.selectedIndex] + .childList != + null && + _checkSubItemsType(_category + .controlList[_category.selectedIndex] + .subItems)) + ? _getChildTabViewChildren( + _model, + _category.controlList[_category.selectedIndex] + .childList) + : _getParentTabViewChildren( + _model, + _category.controlList[_category.selectedIndex] + .subItems))), + ), + ); + })); } /// Returns true, if the list doesn't contain any child type. @@ -365,22 +435,26 @@ class _LayoutPageState extends State { Container( decoration: BoxDecoration( color: (_status != null && _status != '') - ? (_status == 'New' || _status == 'new' + ? (_status == 'New' || + _status == 'new' ? const Color.fromRGBO( 55, 153, 30, 1) : const Color.fromRGBO( 246, 117, 0, 1)) : Colors.transparent, shape: BoxShape.rectangle, - borderRadius: - const BorderRadius.all( - Radius.circular(10.0))), + borderRadius: const BorderRadius.all( + Radius.circular(10.0))), padding: const EdgeInsets.fromLTRB( 5, 2.7, 5, 2.7), child: Text( - (_status == 'New' || _status == 'new') + (_status == 'New' || + _status == 'new') ? 'New' - : (_status == 'Updated' || _status == 'updated') ? 'Updated' : '', + : (_status == 'Updated' || + _status == 'updated') + ? 'Updated' + : '', style: const TextStyle(fontSize: 12, color: Colors.white))), const Padding( padding: EdgeInsets.only(left: 15), @@ -489,6 +563,21 @@ class _LayoutPageState extends State { backgroundColor: const Color.fromRGBO(241, 241, 241, 1), bottom: TabBar( + onTap: (int index) { + if (_secondaryTabIndex != index) { + _secondaryTabIndex = index; + refreshSetState(() { + _showCodeIcon = + (list[i].subItems[index].displayType != + 'card' || + list[i] + .subItems[index] + .subItems + .length == + 1); + }); + } + }, unselectedLabelColor: Colors.black, labelColor: Colors.blue, indicatorColor: Colors.transparent, diff --git a/lib/model/model.dart b/lib/model/model.dart index 9175eb36..dae9b976 100644 --- a/lib/model/model.dart +++ b/lib/model/model.dart @@ -8,15 +8,38 @@ import 'package:flutter/foundation.dart'; /// Local import import '../sample_list.dart'; -import 'sample_view.dart'; /// WidgetCategory of the each control as Data Visualization, Editors,etc., class WidgetCategory { + /// Contructor holds the name, id, control collection of the [WidgetCategory] + WidgetCategory( + [this.categoryName, + this.controlList, + this.mobileCategoryId, + this.webCategoryId, + this.showInWeb]); + + /// Getting the control details from the json file + factory WidgetCategory.fromJson(Map json) { + return WidgetCategory(json['categoryName'], json['controlList'], + json['mobileCategoryId'], json['webCategoryId'], json['showInWeb']); + } + /// Name of the category String categoryName; /// Control collection under the particular category - List controlList; + List controlList; + + /// Sorting the categories based on this id in mobile. + final int mobileCategoryId; + + /// Sorting the categories based on this id in web. + final int webCategoryId; + + /// Specify false if the category need not to show in web + /// (as Viewer - not supported in web). + final bool showInWeb; /// Selected control in the controllist under the particular category int selectedIndex = 0; @@ -25,16 +48,8 @@ class WidgetCategory { /// Defines the control class. class Control { /// Contructor holds the tile, description, status etc., of the [Control] - Control( - this.title, - this.description, - this.image, - this.status, - this.displayType, - this.subItems, - this.category, - this.controlId, - this.showInWeb); + Control(this.title, this.description, this.image, this.status, + this.displayType, this.subItems, this.controlId, this.showInWeb); /// Getting the control details from the json file factory Control.fromJson(Map json) { @@ -45,7 +60,6 @@ class Control { json['status'], json['displayType'], json['subItems'], - json['category'], json['controlId'], json['showInWeb']); } @@ -65,10 +79,6 @@ class Control { /// Display the controls based on this order. final int controlId; - /// Specify the category of the control as - /// Data Visualization, Editors, Calendar, File format - final String category; - /// Need to mention this when samples directly given without any sub category /// Mention as card/fullView, by default it will taken as "fullView". final String displayType; @@ -319,7 +329,7 @@ class SampleModel extends Listenable { List routes; /// Holds the current visible sample, only for web - SampleView currentRenderSample; + dynamic currentRenderSample; /// Holds the current rendered sample's key, only for web String currentSampleKey; @@ -356,6 +366,15 @@ class SampleModel extends Listenable { /// Editing controller which used in the search text field TextEditingController editingController = TextEditingController(); + /// Key of the property panel widget + GlobalKey propertyPanelKey; + + /// Holds the information of to be maximize or not + bool needToMaximize = false; + + ///Storing state of current output container + dynamic outputContainerState; + /// Switching between light, dark, system themes void changeTheme(ThemeData _themeData) { themeData = _themeData; @@ -423,188 +442,200 @@ Future updateControlItems() async { const bool _isWeb = kIsWeb; final String _jsonText = await rootBundle.loadString('lib/sample_details.json'); - final List _controlList = json.decode(_jsonText); List _firstLevelSubItems = []; List _secondLevelSubItems = []; List _thirdLevelSubItems = []; final List sampleRoutes = []; - for (int i = 0; i < _controlList.length; i++) { - SampleModel._controlList.add(Control.fromJson(_controlList[i])); - if (!_isWeb || SampleModel._controlList[i].showInWeb != false) { - for (int j = 0; j < SampleModel._controlList[i].subItems.length; j++) { - _firstLevelSubItems - .add(SubItem.fromJson(SampleModel._controlList[i].subItems[j])); - if (_firstLevelSubItems[j].type == 'parent') { - for (int k = 0; k < _firstLevelSubItems[j].subItems.length; k++) { - if (!_isWeb || - SubItem.fromJson(_firstLevelSubItems[j].subItems[k]) - .showInWeb != - false) { - _secondLevelSubItems - .add(SubItem.fromJson(_firstLevelSubItems[j].subItems[k])); - for (int l = 0; - l < - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .subItems - .length; - l++) { + + final List categoryList = json.decode(_jsonText); + for (int index = 0; index < categoryList.length; index++) { + SampleModel._categoryList.add(WidgetCategory.fromJson(categoryList[index])); + List controlList = []; + if (!_isWeb || SampleModel._categoryList[index].showInWeb != false) { + for (int i = 0; + i < SampleModel._categoryList[index].controlList.length; + i++) { + controlList.add( + Control.fromJson(SampleModel._categoryList[index].controlList[i])); + if (!_isWeb || controlList[i].showInWeb != false) { + for (int j = 0; j < controlList[i].subItems.length; j++) { + _firstLevelSubItems + .add(SubItem.fromJson(controlList[i].subItems[j])); + if (_firstLevelSubItems[j].type == 'parent') { + for (int k = 0; k < _firstLevelSubItems[j].subItems.length; k++) { if (!_isWeb || - SubItem.fromJson(_secondLevelSubItems[ - _secondLevelSubItems.length - 1] - .subItems[l]) + SubItem.fromJson(_firstLevelSubItems[j].subItems[k]) .showInWeb != false) { - _thirdLevelSubItems.add(SubItem.fromJson( - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .subItems[l])); + _secondLevelSubItems.add( + SubItem.fromJson(_firstLevelSubItems[j].subItems[k])); + for (int l = 0; + l < + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .subItems + .length; + l++) { + if (!_isWeb || + SubItem.fromJson(_secondLevelSubItems[ + _secondLevelSubItems.length - 1] + .subItems[l]) + .showInWeb != + false) { + _thirdLevelSubItems.add(SubItem.fromJson( + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .subItems[l])); + } + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .parentIndex = j; + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .childIndex = k; + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .sampleIndex ??= _thirdLevelSubItems.length - 1; + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .control = controlList[i]; + final String breadCrumbText = ('/' + + controlList[i].title + + '/' + + _firstLevelSubItems[j].title + + '/' + + _secondLevelSubItems[ + _secondLevelSubItems.length - 1] + .title + + '/' + + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .title) + .replaceAll(' ', '-') + .toLowerCase(); + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .breadCrumbText = breadCrumbText; + _thirdLevelSubItems[_thirdLevelSubItems.length - 1] + .categoryName = + SampleModel._categoryList[index].categoryName; + sampleRoutes.add(SampleRoute( + routeName: breadCrumbText, + subItem: _thirdLevelSubItems[ + _thirdLevelSubItems.length - 1])); + } + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .subItems = _thirdLevelSubItems; + _thirdLevelSubItems = []; } - _thirdLevelSubItems[_thirdLevelSubItems.length - 1] - .parentIndex = j; - _thirdLevelSubItems[_thirdLevelSubItems.length - 1].childIndex = - k; - _thirdLevelSubItems[_thirdLevelSubItems.length - 1] - .sampleIndex ??= _thirdLevelSubItems.length - 1; - _thirdLevelSubItems[_thirdLevelSubItems.length - 1].control = - SampleModel._controlList[i]; - final String _breadCrumbText = ('/' + - SampleModel._controlList[i].title + - '/' + - _firstLevelSubItems[j].title + - '/' + - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .title + - '/' + - _thirdLevelSubItems[_thirdLevelSubItems.length - 1] - .title) - .replaceAll(' ', '-') - .toLowerCase(); - _thirdLevelSubItems[_thirdLevelSubItems.length - 1] - .breadCrumbText = _breadCrumbText; - _thirdLevelSubItems[_thirdLevelSubItems.length - 1] - .categoryName = SampleModel._controlList[i].category; - sampleRoutes.add(SampleRoute( - routeName: _breadCrumbText, - subItem: - _thirdLevelSubItems[_thirdLevelSubItems.length - 1])); } - _secondLevelSubItems[_secondLevelSubItems.length - 1].subItems = - _thirdLevelSubItems; - _thirdLevelSubItems = []; - } - } - _firstLevelSubItems[j].subItems = _secondLevelSubItems; - _secondLevelSubItems = []; - } else if (_firstLevelSubItems[j].type == 'child') { - if (!_isWeb || _firstLevelSubItems[j].showInWeb != false) { - _isChild = true; - for (int k = 0; k < _firstLevelSubItems[j].subItems.length; k++) { - if (!_isWeb || - SubItem.fromJson(_firstLevelSubItems[j].subItems[k]) - .showInWeb != - false) { - _secondLevelSubItems - .add(SubItem.fromJson(_firstLevelSubItems[j].subItems[k])); - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .childIndex = j; - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .sampleIndex ??= k; - _secondLevelSubItems[_secondLevelSubItems.length - 1].control = - SampleModel._controlList[i]; - final String _breadCrumbText = ('/' + - SampleModel._controlList[i].title + - '/' + - _firstLevelSubItems[j].title + + _firstLevelSubItems[j].subItems = _secondLevelSubItems; + _secondLevelSubItems = []; + } else if (_firstLevelSubItems[j].type == 'child') { + if (!_isWeb || _firstLevelSubItems[j].showInWeb != false) { + _isChild = true; + for (int k = 0; + k < _firstLevelSubItems[j].subItems.length; + k++) { + if (!_isWeb || + SubItem.fromJson(_firstLevelSubItems[j].subItems[k]) + .showInWeb != + false) { + _secondLevelSubItems.add( + SubItem.fromJson(_firstLevelSubItems[j].subItems[k])); + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .childIndex = j; + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .sampleIndex ??= k; + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .control = controlList[i]; + final String breadCrumbText = ('/' + + controlList[i].title + + '/' + + _firstLevelSubItems[j].title + + '/' + + _secondLevelSubItems[ + _secondLevelSubItems.length - 1] + .title) + .replaceAll(' ', '-') + .toLowerCase(); + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .breadCrumbText = breadCrumbText; + _secondLevelSubItems[_secondLevelSubItems.length - 1] + .categoryName = + SampleModel._categoryList[index].categoryName; + sampleRoutes.add(SampleRoute( + routeName: breadCrumbText, + subItem: _secondLevelSubItems[ + _secondLevelSubItems.length - 1])); + } + } + _firstLevelSubItems[j].subItems = _secondLevelSubItems; + _secondLevelSubItems = []; + } else { + _firstLevelSubItems.removeAt(j); + controlList[i].subItems.removeAt(j); + j--; + } + } else { + _isSample = true; + _firstLevelSubItems[j].sampleIndex ??= j; + if (!_isWeb || _firstLevelSubItems[j].showInWeb != false) { + final String breadCrumbText = ('/' + + controlList[i].title + '/' + - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .title) + _firstLevelSubItems[j].title) .replaceAll(' ', '-') .toLowerCase(); - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .breadCrumbText = _breadCrumbText; - _secondLevelSubItems[_secondLevelSubItems.length - 1] - .categoryName = SampleModel._controlList[i].category; + _firstLevelSubItems[j].breadCrumbText = breadCrumbText; + _firstLevelSubItems[j].control = controlList[i]; + _firstLevelSubItems[j].categoryName = + SampleModel._categoryList[index].categoryName; sampleRoutes.add(SampleRoute( - routeName: _breadCrumbText, - subItem: - _secondLevelSubItems[_secondLevelSubItems.length - 1])); + routeName: breadCrumbText, + subItem: _firstLevelSubItems[j])); + _secondLevelSubItems.add(_firstLevelSubItems[j]); } } - _firstLevelSubItems[j].subItems = _secondLevelSubItems; + } + if (_isSample) { + controlList[i].sampleList = _secondLevelSubItems; + controlList[i].subItems = _secondLevelSubItems; + _secondLevelSubItems = []; + } else if (_isChild) { + controlList[i].childList = _firstLevelSubItems; _secondLevelSubItems = []; - } else { - _firstLevelSubItems.removeAt(j); - SampleModel._controlList[i].subItems.removeAt(j); - j--; + _isChild = false; } + (!_isSample) + ? controlList[i].subItems = _firstLevelSubItems + : _isSample = false; + + _firstLevelSubItems = []; } else { - _isSample = true; - _firstLevelSubItems[j].sampleIndex ??= j; - if (!_isWeb || _firstLevelSubItems[j].showInWeb != false) { - final String _breadCrumbText = ('/' + - SampleModel._controlList[i].title + - '/' + - _firstLevelSubItems[j].title) - .replaceAll(' ', '-') - .toLowerCase(); - _firstLevelSubItems[j].breadCrumbText = _breadCrumbText; - _firstLevelSubItems[j].control = SampleModel._controlList[i]; - _firstLevelSubItems[j].categoryName = - SampleModel._controlList[i].category; - sampleRoutes.add(SampleRoute( - routeName: _breadCrumbText, subItem: _firstLevelSubItems[j])); - _secondLevelSubItems.add(_firstLevelSubItems[j]); - } + controlList.removeAt(i); + SampleModel._categoryList[index].controlList.removeAt(i); + i--; } } - if (_isSample) { - SampleModel._controlList[i].sampleList = _secondLevelSubItems; - SampleModel._controlList[i].subItems = _secondLevelSubItems; - _secondLevelSubItems = []; - } else if (_isChild) { - SampleModel._controlList[i].childList = _firstLevelSubItems; - _secondLevelSubItems = []; - _isChild = false; - } - (!_isSample) - ? SampleModel._controlList[i].subItems = _firstLevelSubItems - : _isSample = false; - _firstLevelSubItems = []; + SampleModel._categoryList[index].controlList = controlList; + SampleModel._controlList.addAll(controlList); } else { - SampleModel._controlList.removeAt(i); - _controlList.removeAt(i); - i--; + categoryList.removeAt(index); + SampleModel._categoryList.removeAt(index); + index--; } } SampleModel._routes = sampleRoutes; - /// Sorting the controls based on control id. - SampleModel._controlList - .sort((Control a, Control b) => a.controlId.compareTo(b.controlId)); - - /// Setting control's category. - final List _categoryNames = []; - String _controlCategory; - for (int i = 0; i < SampleModel._controlList.length; i++) { - _controlCategory = SampleModel._controlList[i].category.toUpperCase(); - if (!_categoryNames.contains(_controlCategory)) { - _categoryNames.add(_controlCategory); - SampleModel._categoryList.add(WidgetCategory()); - SampleModel._categoryList[SampleModel._categoryList.length - 1] - .categoryName = _controlCategory; - } + /// Sorting the controls based on control id category wise. + for (int i = 0; i < SampleModel._categoryList.length; i++) { + SampleModel._categoryList[i].controlList + .sort((dynamic a, dynamic b) => a.controlId.compareTo(b.controlId)); } - WidgetCategory _category; - for (int j = 0; j < SampleModel._categoryList.length; j++) { - _category = SampleModel._categoryList[j]; - _category.controlList = []; - for (int i = 0; i < SampleModel._controlList.length; i++) { - final Control control = SampleModel._controlList[i]; - if (control.category.toUpperCase() == _category.categoryName) { - _category.controlList.add(control); - } - } + + if (_isWeb) { + /// Sorting categories based on [webCategoryId] + SampleModel._categoryList.sort((WidgetCategory a, WidgetCategory b) => + a.webCategoryId.compareTo(b.webCategoryId)); + } else { + /// Sorting categories based on [mobileCategoryId] + SampleModel._categoryList.sort((WidgetCategory a, WidgetCategory b) => + a.mobileCategoryId.compareTo(b.mobileCategoryId)); } } diff --git a/lib/model/web_view.dart b/lib/model/web_view.dart index c23770b0..26b7a723 100644 --- a/lib/model/web_view.dart +++ b/lib/model/web_view.dart @@ -1,13 +1,12 @@ /// package imports import 'package:flutter/material.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/services.dart'; import 'package:url_launcher/url_launcher.dart'; ///Local imports import '../widgets/expansion_tile.dart'; import '../widgets/search_bar.dart'; -import '../widgets/shared/mobile.dart' - if (dart.library.html) '../widgets/shared/web.dart'; import 'helper.dart'; import 'model.dart'; import 'sample_view.dart'; @@ -43,6 +42,8 @@ class _WebLayoutPageState extends State { String selectSample; + _Popup popup; + SampleModel model; WidgetCategory category; SubItem sample; @@ -90,6 +91,8 @@ class _WebLayoutPageState extends State { super.dispose(); } + GlobalKey popUpKey = GlobalKey(); + @override Widget build(BuildContext context) { ///Checking the download button is currently hovered @@ -125,23 +128,30 @@ class _WebLayoutPageState extends State { child: AppBar( leading: (MediaQuery.of(context).size.width > 768) ? Container() - : HandCursor( - child: IconButton( - icon: const Icon(Icons.menu, color: Colors.white), - onPressed: () { - if (outputContainer != null) { - final GlobalKey globalKey = outputContainer.key; - final _SampleOutputContainerState - _outputContainerState = - globalKey.currentState; - if (_outputContainerState.outputScaffoldKey - .currentState.isEndDrawerOpen) { - Navigator.pop(context); - } + : IconButton( + icon: const Icon(Icons.menu, color: Colors.white), + onPressed: () { + if (outputContainer != null) { + final GlobalKey globalKey = outputContainer.key; + final _SampleOutputContainerState + _outputContainerState = globalKey.currentState; + if (_outputContainerState.outputScaffoldKey + .currentState.isEndDrawerOpen) { + Navigator.pop(context); + } + } + if (popup != null) { + final GlobalKey globalkey = popup.key; + final _PopupState popupState = + globalkey.currentState; + if (popupState.scaffoldKey.currentState != null && + popupState + .scaffoldKey.currentState.isEndDrawerOpen) { + Navigator.pop(context); } - scaffoldKey.currentState.openDrawer(); - }, - ), + } + scaffoldKey.currentState.openDrawer(); + }, ), automaticallyImplyLeading: MediaQuery.of(context).size.width <= 768, @@ -179,10 +189,8 @@ class _WebLayoutPageState extends State { width: MediaQuery.of(context).size.width * 0.215, height: MediaQuery.of(context).size.height * 0.0445, - child: HandCursor( - child: SearchBar( - sampleListModel: model, - ), + child: SearchBar( + sampleListModel: model, ))), ///download option @@ -228,49 +236,59 @@ class _WebLayoutPageState extends State { Container( height: 60, width: 60, - child: HandCursor( - child: IconButton( - icon: const Icon(Icons.settings, color: Colors.white), - onPressed: () { - if (outputContainer != null) { - final GlobalKey globalKey = outputContainer.key; - final _SampleOutputContainerState - _outputContainerState = globalKey.currentState; - if (_outputContainerState.outputScaffoldKey - .currentState.isEndDrawerOpen) { - Navigator.pop(context); - } + child: IconButton( + icon: const Icon(Icons.settings, color: Colors.white), + onPressed: () { + if (outputContainer != null) { + final GlobalKey globalKey = outputContainer.key; + final _SampleOutputContainerState + _outputContainerState = globalKey.currentState; + if (_outputContainerState + .outputScaffoldKey.currentState.isEndDrawerOpen) { + Navigator.pop(context); } - scaffoldKey.currentState.openEndDrawer(); - }, - ), + } + if (popup != null) { + final GlobalKey globalkey = popup.key; + final _PopupState popupState = globalkey.currentState; + if (popupState.scaffoldKey.currentState != null && + popupState + .scaffoldKey.currentState.isEndDrawerOpen) { + Navigator.pop(context); + } + } + scaffoldKey.currentState.openEndDrawer(); + }, ), ), ], ), )), body: Material( - child: Row( - children: [ - (MediaQuery.of(context).size.width <= 768) - ? Container() - : SizedBox( - width: MediaQuery.of(context).size.width * 0.17, - child: inputContainer = _SampleInputContainer( - sampleModel: model, - category: category, - key: sampleInputKey, - webLayoutPageState: this)), - outputContainer = _SampleOutputContainer( - sampleModel: model, - category: category, - initialSample: sample, - orginText: orginText, - initialSubItems: subItems, - key: sampleOutputKey, - webLayoutPageState: this) - ], - ))); + child: Stack(children: [ + Row( + children: [ + (MediaQuery.of(context).size.width <= 768) + ? Container() + : SizedBox( + width: MediaQuery.of(context).size.width * 0.17, + child: inputContainer = _SampleInputContainer( + sampleModel: model, + category: category, + key: sampleInputKey, + webLayoutPageState: this)), + outputContainer = _SampleOutputContainer( + sampleModel: model, + category: category, + initialSample: sample, + orginText: orginText, + initialSubItems: subItems, + key: sampleOutputKey, + webLayoutPageState: this) + ], + ), + popup = _Popup(key: popUpKey, show: false) + ]))); } } @@ -360,40 +378,39 @@ class _SampleInputContainerState extends State<_SampleInputContainer> { item: item) : Material( color: model.webBackgroundColor, - child: HandCursor( - child: InkWell( - hoverColor: Colors.grey.withOpacity(0.2), - onTap: () { - final GlobalKey globalKey = - widget.webLayoutPageState.outputContainer.key; - final _SampleOutputContainerState _outputContainerState = - globalKey.currentState; - if (_outputContainerState - .outputScaffoldKey.currentState.isEndDrawerOpen || - widget.webLayoutPageState.scaffoldKey.currentState - .isDrawerOpen) { - Navigator.pop(context); - } - _outputContainerState.sample = item; - _outputContainerState.needTabs = false; - _outputContainerState.orginText = - widget.webLayoutPageState.sample.control.title + - ' > ' + - item.title; - if (model.currentSampleKey == null || - model.currentSampleKey != item.key) { - _outputContainerState.refresh(); - } - }, - child: Container( - color: Colors.transparent, - padding: const EdgeInsets.fromLTRB(20, 10, 10, 10), - alignment: Alignment.centerLeft, - child: Text(item.title, - style: TextStyle( - color: model.textColor, - fontSize: 13, - fontFamily: 'Roboto-Regular')))))); + child: InkWell( + hoverColor: Colors.grey.withOpacity(0.2), + onTap: () { + final GlobalKey globalKey = + widget.webLayoutPageState.outputContainer.key; + final _SampleOutputContainerState _outputContainerState = + globalKey.currentState; + if (_outputContainerState + .outputScaffoldKey.currentState.isEndDrawerOpen || + widget.webLayoutPageState.scaffoldKey.currentState + .isDrawerOpen) { + Navigator.pop(context); + } + _outputContainerState.sample = item; + _outputContainerState.needTabs = false; + _outputContainerState.orginText = + widget.webLayoutPageState.sample.control.title + + ' > ' + + item.title; + if (model.currentSampleKey == null || + model.currentSampleKey != item.key) { + _outputContainerState.refresh(); + } + }, + child: Container( + color: Colors.transparent, + padding: const EdgeInsets.fromLTRB(20, 10, 10, 10), + alignment: Alignment.centerLeft, + child: Text(item.title, + style: TextStyle( + color: model.textColor, + fontSize: 13, + fontFamily: 'Roboto-Regular'))))); } List _getSampleList(SampleModel model, WidgetCategory category) { @@ -408,8 +425,7 @@ class _SampleInputContainerState extends State<_SampleInputContainer> { _children.add(Material( color: model.webBackgroundColor, child: _list[i].type != 'parent' && _list[i].type != 'child' - ? HandCursor( - child: InkWell( + ? InkWell( hoverColor: Colors.grey.withOpacity(0.2), child: Container( color: _isNeedSelect @@ -491,7 +507,7 @@ class _SampleInputContainerState extends State<_SampleInputContainer> { _outputContainerState.refresh(); } }, - )) + ) : _expandedChildren(model, _list[i], category, i))); } @@ -511,8 +527,7 @@ class _SampleInputContainerState extends State<_SampleInputContainer> { Container( padding: const EdgeInsets.only(top: 5), height: 40, - child: HandCursor( - child: InkWell( + child: InkWell( child: Row( children: [ const Padding( @@ -535,13 +550,12 @@ class _SampleInputContainerState extends State<_SampleInputContainer> { ], ), onTap: () { - changeCursorStyleOnNavigation(); Navigator.pop(context); if (MediaQuery.of(context).size.width <= 768) { Navigator.pop(context); } }, - )), + ), ), Expanded( child: @@ -592,9 +606,9 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { int tabIndex; GlobalKey outputScaffoldKey = GlobalKey(); final GlobalKey _propertiesPanelKey = GlobalKey(); - GlobalKey outputKey = GlobalKey(); _PropertiesPanel _propertiesPanel; bool _initialRender; + GlobalKey _outputKey; @override void initState() { @@ -622,15 +636,14 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { @override Widget build(BuildContext context) { final SampleModel _model = widget.sampleModel; + final double width = MediaQuery.of(context).size.width; if (_initialRender && widget.initialSubItems != null) { needTabs = true; subItems = widget.initialSubItems; } final SubItem _sample = _initialRender ? widget.initialSample : sample; - _propertiesPanel = _PropertiesPanel( - sampleModel: _model, - key: _propertiesPanelKey, - webLayoutPageState: widget.webLayoutPageState); + _propertiesPanel = + _PropertiesPanel(sampleModel: _model, key: _propertiesPanelKey); return Theme( data: ThemeData( brightness: _model.themeData.brightness, @@ -659,7 +672,6 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { : orginText, style: TextStyle( color: _model.textColor.withOpacity(0.65), - fontSize: 14, letterSpacing: 0.3, fontFamily: 'Roboto-Regular'))), const Padding(padding: EdgeInsets.only(top: 20)), @@ -699,10 +711,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { _model.dividerColor, width: 0.8)), ), - padding: MediaQuery.of(context) - .size - .width < - 500 + padding: width < 500 ? const EdgeInsets.fromLTRB( 2, 5, 2, 0) : const EdgeInsets.fromLTRB( @@ -713,19 +722,16 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { .spaceBetween, children: [ Container( - width: MediaQuery.of(context) - .size - .width * - ((MediaQuery.of(context) - .size - .width <= - 768 && - MediaQuery.of(context) - .size - .width > - 500) - ? 0.82 - : 0.67), + width: width * + ((_model.isMobileResolution && + width > 600) + ? 0.75 + : (width <= 500 + ? 0.585 + : width < + 890 + ? 0.58 + : 0.65)), child: SingleChildScrollView( key: PageStorageKey< @@ -736,33 +742,35 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { : '') + 'tabscroll'), scrollDirection: - Axis.horizontal, - child: HandCursor( - child: Material( - color: _model.webInputColor, - child: InkWell( - hoverColor: _model.paletteColor.withOpacity(0.3), - child: subItems.length == 1 - ? Container() - : TabBar( - indicatorPadding: EdgeInsets.zero, - indicatorColor: _model.backgroundColor, - onTap: (int value) { - final GlobalKey globalKey = widget.webLayoutPageState.outputContainer.key; - final _SampleOutputContainerState _outputContainerState = globalKey.currentState; - _outputContainerState.sample = subItems[value]; - _outputContainerState.needTabs = true; - _outputContainerState.subItems = subItems; - _outputContainerState.tabIndex = value; - if (_model.currentSampleKey == null || _model.currentSampleKey != _outputContainerState.sample.key) { - _outputContainerState.refresh(); - } - }, - labelColor: _model.backgroundColor, - unselectedLabelColor: _model.themeData.brightness == Brightness.dark ? Colors.white : const Color.fromRGBO(89, 89, 89, 1), - isScrollable: true, - tabs: _getTabs(subItems), - )))))), + Axis + .horizontal, + child: Material( + color: _model + .webInputColor, + child: InkWell( + hoverColor: _model.paletteColor.withOpacity(0.3), + child: subItems.length == 1 + ? Container() + : TabBar( + indicatorPadding: EdgeInsets.zero, + indicatorColor: _model.backgroundColor, + onTap: (int value) { + widget.sampleModel.needToMaximize = false; + final GlobalKey globalKey = widget.webLayoutPageState.outputContainer.key; + final _SampleOutputContainerState _outputContainerState = globalKey.currentState; + _outputContainerState.sample = subItems[value]; + _outputContainerState.needTabs = true; + _outputContainerState.subItems = subItems; + _outputContainerState.tabIndex = value; + if (_model.currentSampleKey == null || _model.currentSampleKey != _outputContainerState.sample.key) { + _outputContainerState.refresh(); + } + }, + labelColor: _model.backgroundColor, + unselectedLabelColor: _model.themeData.brightness == Brightness.dark ? Colors.white : const Color.fromRGBO(89, 89, 89, 1), + isScrollable: true, + tabs: _getTabs(subItems), + ))))), Container( child: Row( children: [ @@ -774,19 +782,37 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { Container( height: 24, width: 24, - child: HandCursor( - child: InkWell( - child: Icon( - Icons.code, - color: _model - .webIconColor), - onTap: () { - launch(_sample - .codeLink); - }, - ), + child: InkWell( + child: Icon( + Icons.code, + color: _model + .webIconColor), + onTap: () { + launch(_sample + .codeLink); + }, ), ), + const Padding( + padding: + EdgeInsets.only( + left: 13), + ), + InkWell( + child: Container( + child: Transform.scale( + scale: 0.85, + child: Icon( + Icons + .open_in_full, + color: _model + .webIconColor))), + onTap: () { + performMaximize( + _model, + _sample); + }, + ), const Padding( padding: EdgeInsets.only( @@ -798,21 +824,17 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { height: 24, width: 24, child: - HandCursor( - child: - InkWell( - child: Icon( - Icons - .menu, - color: - _model.webIconColor), - onTap: - () { - outputScaffoldKey - .currentState - .openEndDrawer(); - }, - ), + InkWell( + child: Icon( + Icons + .menu, + color: _model + .webIconColor), + onTap: () { + outputScaffoldKey + .currentState + .openEndDrawer(); + }, ), ) : Container(), @@ -869,8 +891,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { Container( height: 24, width: 24, - child: HandCursor( - child: InkWell( + child: InkWell( child: Icon(Icons.code, color: _model .webIconColor), @@ -878,7 +899,25 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { launch( _sample.codeLink); }, - )), + ), + ), + const Padding( + padding: EdgeInsets.only( + left: 15), + ), + InkWell( + child: Container( + child: Transform.scale( + scale: 0.85, + child: Icon( + Icons + .open_in_full, + color: _model + .webIconColor))), + onTap: () { + performMaximize( + _model, _sample); + }, ), const Padding( padding: EdgeInsets.only( @@ -889,8 +928,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { ? Container( height: 24, width: 24, - child: HandCursor( - child: InkWell( + child: InkWell( child: Icon( Icons.menu, color: _model @@ -900,7 +938,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { .currentState .openEndDrawer(); }, - )), + ), ) : Container(), ], @@ -915,6 +953,8 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { color: _model.cardThemeColor, child: _OutputContainer( key: GlobalKey(), + sampleOutputContainerState: + this, subItem: _sample, sampleView: _model .sampleWidget[_sample.key], @@ -970,7 +1010,6 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { textAlign: TextAlign.justify, style: TextStyle( color: _model.textColor, - fontSize: 14, fontFamily: 'Roboto-Regular', letterSpacing: 0.3))) : Container(), @@ -979,6 +1018,16 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { ); } + void performMaximize(SampleModel model, SubItem sample) { + model.needToMaximize = true; + _PopupState state = widget.webLayoutPageState.popUpKey.currentState; + state._sampleDetails = sample; + state._currentWidgetKey = model.currentRenderSample.key; + _OutputContainerState _outputContainerState = _outputKey.currentState; + _outputContainerState.setState(() {}); + state.refresh(true); + } + /// Get tabs which length is equal to list length List _getTabs(List list) { final List _tabs = []; @@ -990,9 +1039,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { children: [ Text(list[i].title.toString() + (_status != '' ? ' ' : ''), style: const TextStyle( - letterSpacing: 0.5, - fontSize: 14, - fontFamily: 'Roboto-Medium')), + letterSpacing: 0.5, fontFamily: 'Roboto-Medium')), _status == '' ? Container() : Container( @@ -1008,7 +1055,11 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { ), alignment: Alignment.center, child: Text( - _status == 'New' ? 'N' : _status == 'Updated' ? 'U' : '', + _status == 'New' + ? 'N' + : _status == 'Updated' + ? 'U' + : '', style: const TextStyle(fontSize: 11, color: Colors.white), ), ), @@ -1032,6 +1083,7 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), child: _OutputContainer( key: GlobalKey(), + sampleOutputContainerState: this, sampleModel: model, subItem: list[i], sampleView: model.sampleWidget[list[i].key]))), @@ -1069,7 +1121,12 @@ class _SampleOutputContainerState extends State<_SampleOutputContainer> { /// Output sample renders inside of this widget class _OutputContainer extends StatefulWidget { - _OutputContainer({this.sampleModel, this.key, this.subItem, this.sampleView}) + _OutputContainer( + {this.sampleModel, + this.key, + this.subItem, + this.sampleView, + this.sampleOutputContainerState}) : super(key: key); final SampleModel sampleModel; @@ -1081,6 +1138,8 @@ class _OutputContainer extends StatefulWidget { final Function sampleView; + final _SampleOutputContainerState sampleOutputContainerState; + @override State createState() { return _OutputContainerState(); @@ -1088,8 +1147,20 @@ class _OutputContainer extends StatefulWidget { } class _OutputContainerState extends State<_OutputContainer> { + _OutputContainerState(); + GlobalKey renderOutputKey; + + Widget renderWidget; + + void initState() { + renderOutputKey = GlobalKey(); + super.initState(); + } + @override Widget build(BuildContext context) { + widget.sampleModel.outputContainerState = this; + widget.sampleOutputContainerState._outputKey = widget.key; widget.sampleModel.oldWindowSize = widget.sampleModel.oldWindowSize == null ? MediaQuery.of(context).size : widget.sampleModel.currentWindowSize; @@ -1100,10 +1171,16 @@ class _OutputContainerState extends State<_OutputContainer> { widget.sampleModel.oldWindowSize.height != widget.sampleModel.currentWindowSize.height) { widget.sampleModel.currentSampleKey = widget.subItem.key; - return Container(child: widget.sampleModel.currentRenderSample); + return widget.sampleModel.needToMaximize + ? Container() + : Container(child: widget.sampleModel.currentRenderSample); } else { - widget.sampleModel.currentRenderSample = - widget.sampleView(GlobalKey()); + widget.sampleModel.currentRenderSample = renderWidget != null + ? renderWidget + : widget.sampleView(GlobalKey()); + renderWidget = null; + widget.sampleModel.propertyPanelKey = + widget.sampleModel.currentRenderSample.key; widget.sampleModel.currentSampleKey = widget.subItem.key; return MaterialApp( debugShowCheckedModeBanner: false, @@ -1114,28 +1191,22 @@ class _OutputContainerState extends State<_OutputContainer> { routes: { widget.subItem.breadCrumbText: (BuildContext cotext) => Scaffold( backgroundColor: widget.sampleModel.cardThemeColor, - body: widget.sampleModel.currentRenderSample) - }, - home: Builder(builder: (BuildContext context) { - return Scaffold( - backgroundColor: widget.sampleModel.cardThemeColor, - body: widget.sampleView(GlobalKey())); - })); + body: widget.sampleModel.needToMaximize + ? Container() + : widget.sampleModel.currentRenderSample) + }); } } } /// Get the Proeprty panel widget in the drawer class _PropertiesPanel extends StatefulWidget { - _PropertiesPanel({this.sampleModel, this.webLayoutPageState, this.key}) - : super(key: key); + _PropertiesPanel({this.sampleModel, this.key}) : super(key: key); final SampleModel sampleModel; @override final Key key; - final _WebLayoutPageState webLayoutPageState; - @override State createState() { return _PropertiesPanelState(); @@ -1143,11 +1214,20 @@ class _PropertiesPanel extends StatefulWidget { } class _PropertiesPanelState extends State<_PropertiesPanel> { + GlobalKey _sampleKey; + + @override + void initState() { + super.initState(); + } + @override Widget build(BuildContext context) { - final GlobalKey _sampleKey = widget.sampleModel.currentRenderSample.key; + final SampleModel model = widget.sampleModel; + _sampleKey = model.propertyPanelKey; final SampleViewState _sampleViewState = _sampleKey.currentState; final Widget _settingPanelContent = _sampleViewState.buildSettings(context); + return Theme( data: ThemeData( brightness: widget.sampleModel.themeData.brightness, @@ -1176,19 +1256,19 @@ class _PropertiesPanelState extends State<_PropertiesPanel> { fontWeight: FontWeight.bold, fontSize: 16), ), - HandCursor( - child: IconButton( + IconButton( icon: Icon(Icons.close, color: widget.sampleModel.webIconColor), onPressed: () { Navigator.pop(context); }, - )) + ) ]), Container( padding: const EdgeInsets.only(right: 5), height: 600, width: 238, + alignment: Alignment.topCenter, child: _settingPanelContent) ], ))))), @@ -1225,8 +1305,7 @@ class _TileContainerState extends State<_TileContainer> { @override Widget build(BuildContext context) { final SampleModel _model = widget.sampleModel; - return HandCursor( - child: CustomExpansionTile( + return CustomExpansionTile( headerBackgroundColor: _model.webBackgroundColor, onExpansionChanged: (bool value) { final _SampleInputContainerState _sampleInputContainerState = @@ -1251,7 +1330,7 @@ class _TileContainerState extends State<_TileContainer> { key: PageStorageKey(widget.item.title), children: _getNextLevelChildren( _model, widget.item.subItems, widget.item.title), - )); + ); } /// Get expanded children @@ -1279,99 +1358,93 @@ class _TileContainerState extends State<_TileContainer> { _nextLevelChildren.add(list[i].type == 'sample' ? Material( color: model.webBackgroundColor, - child: HandCursor( - child: InkWell( - hoverColor: Colors.grey.withOpacity(0.2), - onTap: () { - final _SampleInputContainerState - _sampleInputContainerState = widget - .webLayoutPageState - .sampleInputKey - .currentState; - final GlobalKey _globalKey = - widget.webLayoutPageState.outputContainer.key; - final _SampleOutputContainerState - _outputContainerState = _globalKey.currentState; - if (_outputContainerState.outputScaffoldKey - .currentState.isEndDrawerOpen || - widget.webLayoutPageState.scaffoldKey.currentState - .isDrawerOpen) { - Navigator.pop(context); - } - _outputContainerState.sample = list[i]; - _outputContainerState.needTabs = false; - _outputContainerState.orginText = - widget.webLayoutPageState.sample.control.title + - ' > ' + - text + - ' > ' + - list[i].title; - - widget.webLayoutPageState.selectSample = widget - .webLayoutPageState.selectSample = list[i].title; - widget.webLayoutPageState.sample = - list[i].subItems != null - ? list[i].subItems[0] - : list[i]; - if (model.currentSampleKey == null || - (list[i].key != null - ? model.currentSampleKey != list[i].key - : model.currentSampleKey != - list[i].subItems[0].key)) { - _sampleInputContainerState.refresh(); - _outputContainerState.refresh(); - } - }, - child: Container( - color: _isNeedSelect - ? Colors.grey.withOpacity(0.2) - : Colors.transparent, - child: Row(children: [ - Container( - width: 5, + child: InkWell( + hoverColor: Colors.grey.withOpacity(0.2), + onTap: () { + final _SampleInputContainerState + _sampleInputContainerState = + widget.webLayoutPageState.sampleInputKey.currentState; + final GlobalKey _globalKey = + widget.webLayoutPageState.outputContainer.key; + final _SampleOutputContainerState _outputContainerState = + _globalKey.currentState; + if (_outputContainerState + .outputScaffoldKey.currentState.isEndDrawerOpen || + widget.webLayoutPageState.scaffoldKey.currentState + .isDrawerOpen) { + Navigator.pop(context); + } + _outputContainerState.sample = list[i]; + _outputContainerState.needTabs = false; + _outputContainerState.orginText = + widget.webLayoutPageState.sample.control.title + + ' > ' + + text + + ' > ' + + list[i].title; + + widget.webLayoutPageState.selectSample = widget + .webLayoutPageState.selectSample = list[i].title; + widget.webLayoutPageState.sample = + list[i].subItems != null + ? list[i].subItems[0] + : list[i]; + if (model.currentSampleKey == null || + (list[i].key != null + ? model.currentSampleKey != list[i].key + : model.currentSampleKey != + list[i].subItems[0].key)) { + _sampleInputContainerState.refresh(); + _outputContainerState.refresh(); + } + }, + child: Container( + color: _isNeedSelect + ? Colors.grey.withOpacity(0.2) + : Colors.transparent, + child: Row(children: [ + Container( + width: 5, + alignment: Alignment.centerLeft, + padding: const EdgeInsets.fromLTRB(1, 10, 10, 10), + color: _isNeedSelect + ? model.backgroundColor + : Colors.transparent, + child: const Opacity( + opacity: 0.0, child: Text('1'))), + Expanded( + child: Container( alignment: Alignment.centerLeft, padding: - const EdgeInsets.fromLTRB(1, 10, 10, 10), - color: _isNeedSelect - ? model.backgroundColor + const EdgeInsets.fromLTRB(20, 10, 10, 10), + child: Text(list[i].title, + style: TextStyle( + fontSize: 13, + fontFamily: 'Roboto-Regular', + color: _isNeedSelect + ? model.backgroundColor + : model.textColor)))), + Container( + decoration: BoxDecoration( + color: (_status != null && _status != '') + ? (_status == 'New' + ? const Color.fromRGBO(55, 153, 30, 1) + : const Color.fromRGBO( + 246, 117, 0, 1)) : Colors.transparent, - child: const Opacity( - opacity: 0.0, child: Text('1'))), - Expanded( - child: Container( - alignment: Alignment.centerLeft, - padding: const EdgeInsets.fromLTRB( - 20, 10, 10, 10), - child: Text(list[i].title, - style: TextStyle( - fontSize: 13, - fontFamily: 'Roboto-Regular', - color: _isNeedSelect - ? model.backgroundColor - : model.textColor)))), - Container( - decoration: BoxDecoration( - color: (_status != null && _status != '') - ? (_status == 'New' - ? const Color.fromRGBO( - 55, 153, 30, 1) - : const Color.fromRGBO( - 246, 117, 0, 1)) - : Colors.transparent, - shape: BoxShape.rectangle, - borderRadius: const BorderRadius.all( - Radius.circular(10.0))), - padding: - const EdgeInsets.fromLTRB(5, 2.7, 5, 2.7), - child: Text(_status, - style: const TextStyle( - fontSize: 10.5, - color: Colors.white))), - _status != null && _status != '' - ? const Padding( - padding: EdgeInsets.only(right: 5)) - : Container(), - ]))))) + shape: BoxShape.rectangle, + borderRadius: const BorderRadius.all( + Radius.circular(10.0))), + padding: + const EdgeInsets.fromLTRB(5, 2.7, 5, 2.7), + child: Text(_status, + style: const TextStyle( + fontSize: 10.5, color: Colors.white))), + _status != null && _status != '' + ? const Padding( + padding: EdgeInsets.only(right: 5)) + : Container(), + ])))) : Material( color: model.webBackgroundColor, child: InkWell( @@ -1472,3 +1545,150 @@ class _TileContainerState extends State<_TileContainer> { return _nextLevelChildren; } } + +/// Showing the expanded sample in a pop-up widget +class _Popup extends StatefulWidget { + _Popup({this.key, this.show}) : super(key: key); + final Key key; + final bool show; + @override + _PopupState createState() => _PopupState(show); +} + +class _PopupState extends State<_Popup> { + _PopupState(this.show); + + bool show; + SubItem _sampleDetails; + + GlobalKey _currentWidgetKey; + + @override + void initState() { + super.initState(); + } + + void refresh(popupShow) { + setState(() { + show = popupShow; + }); + } + + @override + void dispose() { + SampleModel.instance.needToMaximize = false; + super.dispose(); + } + + GlobalKey scaffoldKey = GlobalKey(); + _PropertiesPanel _propertiesPanel; + GlobalKey _propertiesPanelKey = GlobalKey(); + + SampleModel model; + @override + Widget build(BuildContext context) { + model = SampleModel.instance; + _propertiesPanel = + _PropertiesPanel(sampleModel: model, key: _propertiesPanelKey); + return IgnorePointer( + ignoring: !show, + child: Container( + color: show ? Colors.black54 : Colors.transparent, + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + child: Container( + child: Opacity( + opacity: show ? 1.0 : 0.0, + child: _sampleDetails != null + ? Theme( + data: ThemeData( + brightness: model.themeData.brightness, + primaryColor: model.backgroundColor), + child: Scaffold( + key: scaffoldKey, + endDrawer: _propertiesPanel, + appBar: PreferredSize( + preferredSize: Size.fromHeight(40), + child: AppBar( + title: Text(_sampleDetails.title, + style: TextStyle( + fontFamily: 'Roboto-Medium', + fontSize: 16, + color: model.textColor)), + automaticallyImplyLeading: false, + backgroundColor: + model.webBackgroundColor, + actions: [ + _sampleDetails.needsPropertyPanel == + true + ? Container( + height: 40, + width: 40, + child: IconButton( + icon: Icon(Icons.menu, + color: + model.webIconColor), + onPressed: () { + model.propertyPanelKey = + _currentWidgetKey; + scaffoldKey.currentState + .openEndDrawer(); + }, + )) + : Container(), + Container( + height: 40, + width: 40, + child: IconButton( + icon: Icon(Icons.close, + color: model.webIconColor), + onPressed: () { + model.needToMaximize = false; + _OutputContainerState + _outputContainerState = + model.outputContainerState; + _outputContainerState + .setState(() { + _outputContainerState + .renderWidget = + _currentWidgetKey + ?.currentWidget; + }); + _sampleDetails = null; + refresh(false); + }, + ), + ) + ])), + backgroundColor: model.themeData.brightness == + Brightness.dark + ? const Color.fromRGBO(33, 33, 33, 1) + : Colors.white, + body: _currentWidgetKey?.currentWidget)) + : Container())))); + } +} + +/// Holds current render sample +class _RenderOutput extends StatefulWidget { + _RenderOutput({this.renderWidget, this.key}) : super(key: key); + + @override + final Key key; + + final Widget renderWidget; + + @override + State createState() { + return _RenderOutputState(renderWidget); + } +} + +class _RenderOutputState extends State<_RenderOutput> { + _RenderOutputState(this.renderWidget); + Widget renderWidget; + @override + Widget build(BuildContext context) { + return renderWidget; + } +} diff --git a/lib/sample_browser.dart b/lib/sample_browser.dart index 9b0d3f1d..337c88f2 100644 --- a/lib/sample_browser.dart +++ b/lib/sample_browser.dart @@ -1,25 +1,18 @@ /// dart imports -import 'dart:async'; import 'dart:io' show Platform; -import 'dart:typed_data'; -import 'dart:ui' as ui; /// package imports import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:url_launcher/url_launcher.dart'; /// local imports import 'model/helper.dart'; import 'model/model.dart'; import 'model/web_view.dart'; -import 'samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart'; import 'widgets/animate_opacity_widget.dart'; import 'widgets/search_bar.dart'; -import 'widgets/shared/mobile.dart' - if (dart.library.html) 'widgets/shared/web.dart'; /// Root widget of the sample browser /// Contains the Homepage wrapped with a MaterialApp widget @@ -50,7 +43,7 @@ class _SampleBrowserState extends State { final SampleRoute sampleRoute = _sampleListModel.routes[i]; WidgetCategory category; for (int j = 0; j < _sampleListModel.categoryList.length; j++) { - if (sampleRoute.subItem.categoryName.toUpperCase() == + if (sampleRoute.subItem.categoryName == _sampleListModel.categoryList[j].categoryName) { category = _sampleListModel.categoryList[j]; break; @@ -109,15 +102,11 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { SampleModel sampleListModel; GlobalKey scaffoldKey = GlobalKey(); - int columnCount; - double _cardWidth; - double _sidePadding; final ScrollController controller = ScrollController(); @override void initState() { sampleListModel = SampleModel.instance; _addColors(); - _init(); sampleListModel.addListener(_handleChange); super.initState(); } @@ -131,22 +120,6 @@ class _HomePageState extends State { } } - Future _init() async { - final ByteData data = await rootBundle.load('images/dashline.png'); - image = await _loadImage(Uint8List.view(data.buffer)); - } - - Future _loadImage(List img) async { - final Completer completer = Completer(); - ui.decodeImageFromList(img, (ui.Image img) { - setState(() { - isImageloaded = true; - }); - return completer.complete(img); - }); - return completer.future; - } - @override Widget build(BuildContext context) { ///Checking the download button is currently hovered @@ -155,191 +128,192 @@ class _HomePageState extends State { model.isMobileResolution = (MediaQuery.of(context).size.width) < 768; return Container( child: SafeArea( - child: model.isMobileResolution - ? Scaffold( - resizeToAvoidBottomPadding: true, - drawer: getLeftSideDrawer(model), - key: scaffoldKey, - backgroundColor: model.webBackgroundColor, - endDrawer: model.isWeb ? showWebThemeSettings(model) : null, - appBar: PreferredSize( - preferredSize: const Size.fromHeight(46.0), - child: AppBar( - elevation: 0.0, - backgroundColor: model.paletteColor, - title: AnimateOpacityWidget( - controller: controller, - opacity: 0, - child: const Text('Flutter UI Widgets', - style: TextStyle( - fontSize: 18, fontFamily: 'HeeboMedium'))), - actions: [ - Container( - height: 40, - width: 40, - child: IconButton( - icon: - const Icon(Icons.settings, color: Colors.white), - onPressed: () { - model.isWeb - ? scaffoldKey.currentState.openEndDrawer() - : showBottomSettingsPanel(model, context); - }, + child: model.isMobileResolution + ? Scaffold( + resizeToAvoidBottomPadding: true, + drawer: (!model.isWeb && Platform.isIOS) + ? null //Avoiding drawer in iOS platform + : getLeftSideDrawer(model), + key: scaffoldKey, + backgroundColor: model.webBackgroundColor, + endDrawer: model.isWeb ? showWebThemeSettings(model) : null, + appBar: PreferredSize( + preferredSize: const Size.fromHeight(46.0), + child: AppBar( + elevation: 0.0, + backgroundColor: model.paletteColor, + title: AnimateOpacityWidget( + controller: controller, + opacity: 0, + child: const Text('Flutter UI Widgets', + style: TextStyle( + fontSize: 18, fontFamily: 'HeeboMedium'))), + actions: [ + Container( + height: 40, + width: 40, + child: IconButton( + icon: const Icon(Icons.settings, + color: Colors.white), + onPressed: () { + model.isWeb + ? scaffoldKey.currentState.openEndDrawer() + : showBottomSettingsPanel(model, context); + }, + ), ), - ), - ], - )), - body: Container( - transform: Matrix4.translationValues(0, -1, 0), - child: _getScrollableWidget(model))) - : Scaffold( - bottomNavigationBar: getFooter(context, model), - key: scaffoldKey, - backgroundColor: model.webBackgroundColor, - endDrawer: showWebThemeSettings(model), - resizeToAvoidBottomPadding: true, - appBar: PreferredSize( - preferredSize: const Size.fromHeight(90.0), - child: AppBar( - leading: Container(), - elevation: 0.0, - backgroundColor: model.paletteColor, - flexibleSpace: Container( - transform: Matrix4.translationValues(0, 4, 0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: - const EdgeInsets.fromLTRB(24, 10, 0, 0), - child: Row(children: [ - const Text('Flutter UI Widgets ', + ], + )), + body: Container( + transform: Matrix4.translationValues(0, -1, 0), + child: _getScrollableWidget(model))) + : Scaffold( + bottomNavigationBar: getFooter(context, model), + key: scaffoldKey, + backgroundColor: model.webBackgroundColor, + endDrawer: showWebThemeSettings(model), + resizeToAvoidBottomPadding: true, + appBar: PreferredSize( + preferredSize: const Size.fromHeight(90.0), + child: AppBar( + leading: Container(), + elevation: 0.0, + backgroundColor: model.paletteColor, + flexibleSpace: Container( + transform: Matrix4.translationValues(0, 4, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: + const EdgeInsets.fromLTRB(24, 10, 0, 0), + child: Row(children: [ + const Text('Flutter UI Widgets ', + style: TextStyle( + color: Colors.white, + fontSize: 28, + letterSpacing: 0.53, + fontFamily: 'Roboto-Bold')), + model.isWeb + ? Container( + padding: + const EdgeInsets.fromLTRB( + 3, 0, 3, 0), + decoration: const BoxDecoration( + shape: BoxShape.rectangle, + color: Color.fromRGBO( + 245, 188, 14, 1)), + child: const Text( + 'BETA', + style: TextStyle( + fontSize: 14, + letterSpacing: 0.26, + fontFamily: 'Roboto-Medium', + color: Colors.black), + )) + : Container() + ])), + const Padding( + padding: EdgeInsets.fromLTRB(24, 0, 0, 0), + child: Text('Fast . Fluid . Flexible', style: TextStyle( color: Colors.white, - fontSize: 28, - letterSpacing: 0.53, - fontFamily: 'Roboto-Bold')), - model.isWeb - ? Container( - padding: const EdgeInsets.fromLTRB( - 3, 0, 3, 0), - decoration: const BoxDecoration( - shape: BoxShape.rectangle, - color: Color.fromRGBO( - 245, 188, 14, 1)), - child: const Text( - 'BETA', - style: TextStyle( - fontSize: 14, - letterSpacing: 0.26, - fontFamily: 'Roboto-Medium', - color: Colors.black), - )) - : Container() - ])), - const Padding( - padding: EdgeInsets.fromLTRB(24, 0, 0, 0), - child: Text('Fast . Fluid . Flexible', - style: TextStyle( - color: Colors.white, - fontSize: 14, - fontFamily: 'Roboto-Regular', - letterSpacing: 0.26, - fontWeight: FontWeight.normal))), - const Padding( - padding: EdgeInsets.only(top: 15), - ), - Container( - alignment: Alignment.bottomCenter, - width: double.infinity, - height: 16, - decoration: BoxDecoration( - color: model.webBackgroundColor, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(12.0), - topRight: Radius.circular(12.0)), - boxShadow: [ - BoxShadow( - color: model.webBackgroundColor, - offset: const Offset(0, 2.0), - blurRadius: 0.25, - ) - ])) - ], - )), - actions: [ - MediaQuery.of(context).size.width < 500 - ? Container(height: 0, width: 9) - : Container( - child: Container( - padding: const EdgeInsets.only( - top: 10, right: 10), - width: MediaQuery.of(context).size.width >= - 900 - ? 400 - : MediaQuery.of(context).size.width / 3, - height: MediaQuery.of(context).size.height * - 0.0445, - child: HandCursor( - child: SearchBar( - sampleListModel: model, - ), - ))), - - ///download option - model.isMobileResolution - ? Container() - : Container( - alignment: Alignment.center, - padding: EdgeInsets.only(top: 10), - child: Container( - width: 115, - height: 32, + fontSize: 14, + fontFamily: 'Roboto-Regular', + letterSpacing: 0.26, + fontWeight: FontWeight.normal))), + const Padding( + padding: EdgeInsets.only(top: 15), + ), + Container( + alignment: Alignment.bottomCenter, + width: double.infinity, + height: 16, decoration: BoxDecoration( - border: - Border.all(color: Colors.white)), - child: StatefulBuilder(builder: - (BuildContext context, - StateSetter setState) { - return MouseRegion( - child: InkWell( - hoverColor: Colors.white, - child: Padding( - padding: - const EdgeInsets.fromLTRB( - 8, 9, 8, 9), - child: Text('DOWNLOAD NOW', - style: TextStyle( - color: - isHoveringDownloadButton - ? model - .paletteColor - : Colors.white, - fontSize: 12, - fontFamily: - 'Roboto-Medium')), + color: model.webBackgroundColor, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(12.0), + topRight: Radius.circular(12.0)), + boxShadow: [ + BoxShadow( + color: model.webBackgroundColor, + offset: const Offset(0, 2.0), + blurRadius: 0.25, + ) + ])) + ], + )), + actions: [ + MediaQuery.of(context).size.width < 500 + ? Container(height: 0, width: 9) + : Container( + child: Container( + padding: + const EdgeInsets.only(top: 10, right: 10), + width: MediaQuery.of(context).size.width >= + 900 + ? 400 + : MediaQuery.of(context).size.width / 3, + height: MediaQuery.of(context).size.height * + 0.0445, + child: SearchBar( + sampleListModel: model, + ), + )), + + ///download option + model.isMobileResolution + ? Container() + : Container( + alignment: Alignment.center, + padding: EdgeInsets.only(top: 10), + child: Container( + width: 115, + height: 32, + decoration: BoxDecoration( + border: + Border.all(color: Colors.white)), + child: StatefulBuilder(builder: + (BuildContext context, + StateSetter setState) { + return MouseRegion( + child: InkWell( + hoverColor: Colors.white, + child: Padding( + padding: + const EdgeInsets.fromLTRB( + 8, 9, 8, 9), + child: Text('DOWNLOAD NOW', + style: TextStyle( + color: + isHoveringDownloadButton + ? model + .paletteColor + : Colors.white, + fontSize: 12, + fontFamily: + 'Roboto-Medium')), + ), + onTap: () { + launch( + 'https://www.syncfusion.com/downloads/flutter/confirm'); + }, ), - onTap: () { - launch( - 'https://www.syncfusion.com/downloads/flutter/confirm'); + onHover: (PointerHoverEvent event) { + isHoveringDownloadButton = true; + setState(() {}); }, - ), - onHover: (PointerHoverEvent event) { - isHoveringDownloadButton = true; - setState(() {}); - }, - onExit: (PointerExitEvent event) { - isHoveringDownloadButton = false; - setState(() {}); - }); - }))), - Container( - padding: MediaQuery.of(context).size.width < 500 - ? const EdgeInsets.only(top: 20, left: 5) - : const EdgeInsets.only(top: 10, right: 20), - height: 60, - width: 60, - child: HandCursor( + onExit: (PointerExitEvent event) { + isHoveringDownloadButton = false; + setState(() {}); + }); + }))), + Container( + padding: MediaQuery.of(context).size.width < 500 + ? const EdgeInsets.only(top: 20, left: 5) + : const EdgeInsets.only(top: 10, right: 20), + height: 60, + width: 60, child: IconButton( icon: const Icon(Icons.settings, color: Colors.white), @@ -348,11 +322,9 @@ class _HomePageState extends State { }, ), ), - ), - ], - )), - body: _getWebBodyWidget(model)), - ), + ], + )), + body: _CategorizedCards())), ); } @@ -406,9 +378,7 @@ class _HomePageState extends State { ? Container( height: MediaQuery.of(context).size.height, child: ListView(children: searchResults)) - : Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: _getControls(model, context))), + : _CategorizedCards()), ]), ) ], @@ -440,272 +410,6 @@ class _HomePageState extends State { ]; } - /// get the home page body contents in the web - Widget _getWebBodyWidget(SampleModel model) { - final double deviceWidth = MediaQuery.of(context).size.width; - _sidePadding = deviceWidth > 1060 - ? deviceWidth * 0.038 - : deviceWidth >= 768 ? deviceWidth * 0.041 : deviceWidth * 0.05; - final Widget _controlWidget = Container( - padding: EdgeInsets.only(top: deviceWidth > 1060 ? 15 : 10), - width: MediaQuery.of(context).size.width, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.start, - children: _getControls(model, context), - )); - return SingleChildScrollView(child: _controlWidget); - } - - /// get category wise control list resolution base - List _getControls(SampleModel model, BuildContext context) { - final double deviceWidth = MediaQuery.of(context).size.width; - num padding; - if (deviceWidth > 1060) { - padding = deviceWidth * 0.011; - _cardWidth = (deviceWidth * 0.9) / 3; - - ///setting max cardwidth, spcing between cards in higher resolutions - if (deviceWidth > 3000) { - _cardWidth = 2800 / 3; - _sidePadding = (deviceWidth - 2740) * 0.5; - padding = 30; - } - columnCount = 3; - return [ - Padding(padding: EdgeInsets.only(left: _sidePadding)), - Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - _getCategoryWidget(model, model.categoryList[1]), - Padding(padding: EdgeInsets.only(top: padding)), - ], - ), - Padding(padding: EdgeInsets.only(left: padding)), - Column(mainAxisAlignment: MainAxisAlignment.start, children: [ - _getCategoryWidget(model, model.categoryList[0]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[2]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[3]), - ]), - Padding(padding: EdgeInsets.only(left: padding)), - Column(mainAxisAlignment: MainAxisAlignment.start, children: [ - _getCategoryWidget(model, model.categoryList[4]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[5]), - Padding(padding: EdgeInsets.only(top: padding)), - model.isWeb - ? Container() - : _getCategoryWidget(model, model.categoryList[6]), - ]), - Padding(padding: EdgeInsets.only(left: _sidePadding)) - ]; - } else if (deviceWidth >= 768) { - padding = deviceWidth * 0.018; - _cardWidth = (deviceWidth * 0.9) / 2; - columnCount = 2; - return [ - Padding(padding: EdgeInsets.only(left: _sidePadding)), - Column(mainAxisAlignment: MainAxisAlignment.start, children: [ - _getCategoryWidget(model, model.categoryList[0]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[1]), - Padding(padding: EdgeInsets.only(top: padding)), - model.isWeb - ? Container() - : _getCategoryWidget(model, model.categoryList[6]), - ]), - Padding(padding: EdgeInsets.only(left: padding)), - Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - _getCategoryWidget(model, model.categoryList[2]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[3]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[4]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[5]), - Padding(padding: EdgeInsets.only(top: padding)), - ], - ), - Padding(padding: EdgeInsets.only(left: _sidePadding)), - ]; - } else { - columnCount = 1; - _cardWidth = deviceWidth * 0.9; - padding = deviceWidth * 0.035; - _sidePadding = (deviceWidth * 0.1) / 2; - return [ - Padding(padding: EdgeInsets.only(left: _sidePadding)), - Column(children: [ - Padding(padding: EdgeInsets.only(top: (_sidePadding - 16).abs())), - _getCategoryWidget(model, model.categoryList[0]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[1]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[2]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[3]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[4]), - Padding(padding: EdgeInsets.only(top: padding)), - _getCategoryWidget(model, model.categoryList[5]), - Padding(padding: EdgeInsets.only(top: _sidePadding)), - model.isWeb - ? Container() - : _getCategoryWidget(model, model.categoryList[6]), - Padding( - padding: EdgeInsets.only(top: model.isWeb ? 0 : _sidePadding)), - ]), - Padding(padding: EdgeInsets.only(left: _sidePadding)), - ]; - } - } - - /// get the rounded corner layout for given category - Widget _getCategoryWidget(SampleModel model, WidgetCategory category) { - final double width = _cardWidth; - return Container( - padding: const EdgeInsets.only(bottom: 10), - decoration: BoxDecoration( - color: model.cardColor, - border: Border.all( - color: const Color.fromRGBO(0, 0, 0, 0.12), width: 1.1), - borderRadius: const BorderRadius.all(Radius.circular(12))), - width: width, - child: Column(children: [ - Container( - padding: const EdgeInsets.only(top: 15, bottom: 2), - child: Text( - category.categoryName, - style: TextStyle( - color: model.backgroundColor, - fontSize: 16, - fontFamily: 'Roboto-Bold'), - ), - ), - Divider( - color: model.themeData.brightness == Brightness.dark - ? const Color.fromRGBO(61, 61, 61, 1) - : const Color.fromRGBO(238, 238, 238, 1), - thickness: 1, - ), - Column(children: _getControlListView(category, model)) - ])); - } - - /// get the list view of the controls in the specified category - List _getControlListView(WidgetCategory category, SampleModel model) { - final List items = []; - String status; - for (int i = 0; i < category.controlList.length; i++) { - final Control control = category.controlList[i]; - status = (control.status == 'preview' || control.status == 'Preview') && - !model.isWeb && - Platform.isIOS - ? 'New' - : (control.title == 'Radial Gauge' && model.isWeb) - ? null - : control.status; - items.add(HandCursor( - child: Container( - color: model.cardColor, - child: Material( - color: model.cardColor, - elevation: 0.0, - child: InkWell( - splashFactory: InkRipple.splashFactory, - hoverColor: Colors.grey.withOpacity(0.2), - onTap: () { - !model.isWeb - ? onTapControlInMobile(context, model, category, i) - : onTapControlInWeb(context, model, category, i); - model.searchResults.clear(); - }, - child: Container( - child: ListTile( - contentPadding: EdgeInsets.fromLTRB( - 12, 2, 0, category.controlList.length > 3 ? 6 : 0), - leading: Image.asset(control.image, fit: BoxFit.cover), - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - RichText( - text: TextSpan(children: [ - TextSpan( - text: control.title, - style: TextStyle( - fontSize: 12, - letterSpacing: 0.1, - color: model.textColor, - fontFamily: 'Roboto-Bold'), - ), - TextSpan( - text: control.title == - 'Circular ProgressBar' - ? '' //' designed using Radial Gauge' - : '', - style: TextStyle( - fontSize: 8, - letterSpacing: 0.1, - color: model.textColor, - fontStyle: FontStyle.italic), - ) - ]), - ), - status != null - ? Container( - decoration: BoxDecoration( - shape: BoxShape.rectangle, - color: status.toLowerCase() == 'new' - ? const Color.fromRGBO( - 55, 153, 30, 1) - : status.toLowerCase() == 'updated' - ? const Color.fromRGBO( - 246, 117, 0, 1) - : status.toLowerCase() == - 'preview' - ? const Color.fromRGBO( - 74, 90, 231, 1) - : Colors.transparent, - borderRadius: const BorderRadius.only( - topLeft: Radius.circular(10), - bottomLeft: Radius.circular(10))), - padding: const EdgeInsets.fromLTRB( - 6, 2.7, 4, 2.7), - child: Text(status, - style: const TextStyle( - fontFamily: 'Roboto-Medium', - color: Colors.white, - fontSize: 10.5))) - : Container() - ]), - subtitle: Container( - child: Padding( - padding: - const EdgeInsets.fromLTRB(0.0, 7.0, 12.0, 0.0), - child: Text( - control.description, - textAlign: TextAlign.left, - softWrap: true, - textScaleFactor: 1, - overflow: TextOverflow.fade, - style: const TextStyle( - fontWeight: FontWeight.normal, - fontSize: 12, - color: Color.fromRGBO(128, 128, 128, 1), - ), - ), - )), - ), - )))), - )); - } - return items; - } - /// returns searched result List _getSearchedItems(SampleModel model) { final List items = []; @@ -814,3 +518,263 @@ class _PersistentHeaderDelegate extends SliverPersistentHeaderDelegate { return true; } } + +/// Positioning/aligning the categories as cards +/// based on the screen width +class _CategorizedCards extends StatefulWidget { + @override + _CategorizedCardsState createState() => _CategorizedCardsState(); +} + +class _CategorizedCardsState extends State<_CategorizedCards> { + SampleModel model = SampleModel.instance; + double _cardWidth; + + @override + Widget build(BuildContext context) { + return Container(child: _getCategorizedCards()); + } + + Widget _getCategorizedCards() { + final double deviceWidth = MediaQuery.of(context).size.width; + double padding; + double _sidePadding = deviceWidth > 1060 + ? deviceWidth * 0.038 + : deviceWidth >= 768 + ? deviceWidth * 0.041 + : deviceWidth * 0.05; + + Widget organizedCardWidget; + + if (deviceWidth > 1060) { + padding = deviceWidth * 0.011; + _cardWidth = (deviceWidth * 0.9) / 3; + + ///setting max cardwidth, spacing between cards in higher resolutions + if (deviceWidth > 3000) { + _cardWidth = 2800 / 3; + _sidePadding = (deviceWidth - 2740) * 0.5; + padding = 30; + } + List firstColumnWidgets = []; + List secondColumnWidgets = []; + List thirdColumnWidgets = []; + int firstColumnControlCount = 0; + int secondColumnControlCount = 0; + for (int i = 0; i < model.categoryList.length; i++) { + if (firstColumnControlCount < model.controlList.length / 3) { + firstColumnWidgets.add(_getCategoryWidget(model.categoryList[i])); + firstColumnWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + firstColumnControlCount += model.categoryList[i].controlList.length; + } else if (secondColumnControlCount < model.controlList.length / 3 && + (secondColumnControlCount + + model.categoryList[i].controlList.length < + model.controlList.length / 3)) { + secondColumnWidgets.add(_getCategoryWidget(model.categoryList[i])); + secondColumnWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + secondColumnControlCount += model.categoryList[i].controlList.length; + } else { + thirdColumnWidgets.add(_getCategoryWidget(model.categoryList[i])); + thirdColumnWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + } + organizedCardWidget = Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding(padding: EdgeInsets.only(left: _sidePadding)), + Column(children: firstColumnWidgets), + Padding(padding: EdgeInsets.only(left: padding)), + Column(children: secondColumnWidgets), + Padding(padding: EdgeInsets.only(left: padding)), + Column(children: thirdColumnWidgets), + Padding( + padding: EdgeInsets.only(left: _sidePadding), + ) + ], + ); + } + } else if (deviceWidth >= 768) { + padding = deviceWidth * 0.018; + _cardWidth = (deviceWidth * 0.9) / 2; + List firstColumnWidgets = []; + List secondColumnWidgets = []; + int firstColumnControlCount = 0; + for (int i = 0; i < model.categoryList.length; i++) { + if (firstColumnControlCount < model.controlList.length / 2) { + firstColumnWidgets.add(_getCategoryWidget(model.categoryList[i])); + firstColumnWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + firstColumnControlCount += model.categoryList[i].controlList.length; + } else { + secondColumnWidgets.add(_getCategoryWidget(model.categoryList[i])); + secondColumnWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + } + organizedCardWidget = Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding(padding: EdgeInsets.only(left: _sidePadding)), + Column(children: firstColumnWidgets), + Padding(padding: EdgeInsets.only(left: padding)), + Column(children: secondColumnWidgets), + Padding( + padding: EdgeInsets.only(left: _sidePadding), + ) + ], + ); + } + } else { + _cardWidth = deviceWidth * 0.9; + padding = deviceWidth * 0.035; + _sidePadding = (deviceWidth * 0.1) / 2; + List verticalOrderedWidgets = []; + for (int i = 0; i < model.categoryList.length; i++) { + verticalOrderedWidgets.add(_getCategoryWidget(model.categoryList[i])); + verticalOrderedWidgets + .add(Padding(padding: EdgeInsets.only(top: padding))); + } + organizedCardWidget = Row( + children: [ + Padding(padding: EdgeInsets.only(left: _sidePadding)), + Column(children: verticalOrderedWidgets), + Padding( + padding: EdgeInsets.only(left: _sidePadding), + ) + ], + ); + } + return SingleChildScrollView( + child: Container( + padding: EdgeInsets.only(top: deviceWidth > 1060 ? 15 : 10), + child: organizedCardWidget)); + } + + /// get the rounded corner layout for given category + Widget _getCategoryWidget(WidgetCategory category) { + return Container( + padding: const EdgeInsets.only(bottom: 10), + decoration: BoxDecoration( + color: model.cardColor, + border: Border.all( + color: const Color.fromRGBO(0, 0, 0, 0.12), width: 1.1), + borderRadius: const BorderRadius.all(Radius.circular(12))), + width: _cardWidth, + child: Column(children: [ + Container( + padding: const EdgeInsets.only(top: 15, bottom: 2), + child: Text( + category.categoryName.toUpperCase(), + style: TextStyle( + color: model.backgroundColor, + fontSize: 16, + fontFamily: 'Roboto-Bold'), + ), + ), + Divider( + color: model.themeData.brightness == Brightness.dark + ? const Color.fromRGBO(61, 61, 61, 1) + : const Color.fromRGBO(238, 238, 238, 1), + thickness: 1, + ), + Column(children: _getControlListView(category)) + ])); + } + + /// get the list view of the controls in the specified category + List _getControlListView(WidgetCategory category) { + final List items = []; + String status; + for (int i = 0; i < category.controlList.length; i++) { + final Control control = category.controlList[i]; + status = (control.status == 'preview' || control.status == 'Preview') && + !model.isWeb && + Platform.isIOS + ? 'New' + : (control.title == 'Radial Gauge' && model.isWeb) + ? null + : control.status; + items.add(Container( + color: model.cardColor, + child: Material( + color: model.cardColor, + elevation: 0.0, + child: InkWell( + splashFactory: InkRipple.splashFactory, + hoverColor: Colors.grey.withOpacity(0.2), + onTap: () { + !model.isWeb + ? onTapControlInMobile(context, model, category, i) + : onTapControlInWeb(context, model, category, i); + model.searchResults.clear(); + }, + child: Container( + child: ListTile( + contentPadding: EdgeInsets.fromLTRB( + 12, 2, 0, category.controlList.length > 3 ? 6 : 0), + leading: Image.asset(control.image, fit: BoxFit.cover), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + control.title, + textAlign: TextAlign.left, + softWrap: true, + textScaleFactor: 1, + overflow: TextOverflow.fade, + style: TextStyle( + fontSize: 12, + letterSpacing: 0.1, + color: model.textColor, + fontFamily: 'Roboto-Bold'), + ), + status != null + ? Container( + decoration: BoxDecoration( + shape: BoxShape.rectangle, + color: status.toLowerCase() == 'new' + ? const Color.fromRGBO(55, 153, 30, 1) + : status.toLowerCase() == 'updated' + ? const Color.fromRGBO( + 246, 117, 0, 1) + : status.toLowerCase() == + 'preview' + ? const Color.fromRGBO( + 74, 90, 231, 1) + : Colors.transparent, + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(10), + bottomLeft: Radius.circular(10))), + padding: + const EdgeInsets.fromLTRB(6, 2.7, 4, 2.7), + child: Text(status, + style: const TextStyle( + fontFamily: 'Roboto-Medium', + color: Colors.white, + fontSize: 10.5))) + : Container() + ]), + subtitle: Container( + child: Padding( + padding: const EdgeInsets.fromLTRB(0.0, 7.0, 12.0, 0.0), + child: Text( + control.description, + textAlign: TextAlign.left, + softWrap: true, + textScaleFactor: 1, + overflow: TextOverflow.fade, + style: const TextStyle( + fontWeight: FontWeight.normal, + fontSize: 12, + color: Color.fromRGBO(128, 128, 128, 1), + ), + ), + )), + ), + ))), + )); + } + return items; + } +} diff --git a/lib/sample_details.json b/lib/sample_details.json index 9f656410..7647d695 100644 --- a/lib/sample_details.json +++ b/lib/sample_details.json @@ -1,2543 +1,2867 @@ [ { - "title": "Date Range Picker", - "description": "Allows to easily select dates or range of dates", - "image": "images/Date_range_picker.png", - "status": "Preview", - "displayType": "tab", - "category": "Calendar", - "controlId": 8, - "subItems": [ - { - "type": "sample", - "title": "Getting Started", - "key": "getting_started_date_picker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/getting_started/datePicker_getting_started.dart", - "needsPropertyPanel": true - }, - { - "type": "sample", - "title": "Flight Booking", - "key": "popup_picker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/popup_picker/popup_picker.dart" - }, - { - "type": "sample", - "title": "Blackout Dates", - "key": "blackout_picker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/blackout_dates/blackout_date_picker.dart" - }, - { - "type": "sample", - "title": "Customization", - "key": "customized_picker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/customization_picker/customized_date_picker.dart" - } - ] - }, - { - "title": "Slider", - "description": "Select a date or numeric value", - "image": "images/slider.png", - "category": "Sliders", - "status": "Updated", - "displayType": "tab", - "controlId": 11, - "subItems": [ - { - "type": "child", - "title": "Basic features", - "status": "New", - "displayType": "tab", - "subItems": [ - { - "type": "sample", - "title": "Default", - "key": "default_slider", - "status": "Updated", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/default_slider.dart", - "description": "" - }, - { - "type": "sample", - "title": "Divisors, labels, and ticks", - "key": "slider_divisor_label_tick", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart", - "description": "" - }, - { - "type": "sample", - "title": "Date interval", - "key": "slider_date_interval", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_date_interval.dart", - "description": "" - }, - { - "type": "sample", - "title": "Tooltip types", - "key": "slider_tooltip_type", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart", - "description": "" - }, - { - "type": "sample", - "title": "Step", - "key": "slider_step", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_step.dart", - "description": "" - } - ] - }, - { - "type": "child", - "status": "New", - "title": "Customization", - "displayType": "tab", - "subItems": [ - { - "type": "sample", - "title": "Thumb icon customization", - "key": "thumb_icon_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart" - }, - { - "type": "sample", - "title": "Size customization", - "key": "slider_size_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart" - }, - { - "type": "sample", - "title": "Color customization", - "key": "slider_color_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart" - }, - { - "type": "sample", - "title": "Shape customization", - "key": "slider_shape_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/shape_customization/slider_shape_customization.dart" - } - ] - } - ] - }, - { - "title": "Range Slider", - "description": "Select a date or numeric range", - "image": "images/range_slider.png", - "category": "Sliders", - "status": "Updated", - "controlId": 12, - "subItems": [ - { - "type": "child", - "title": "Basic features", + "categoryName": "Data Visualization", + "webCategoryId": 1, + "mobileCategoryId": 2, + "controlList": [ + { + "title": "Barcodes", + "description": "Generate and display data in machine-readable 1D and 2D barcodes", + "image": "images/barcode.png", "displayType": "tab", + "controlId": 6, "subItems": [ { "type": "sample", - "title": "Default", - "key": "range_slider_default_appearance", - "status": "Updated", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart", - "description": "" - }, - { - "type": "sample", - "title": "Divisors, labels, and ticks", - "key": "range_slider_divisor_label_tick", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_divisor_label_tick.dart", - "description": "" - }, - { - "type": "sample", - "title": "Date interval", - "key": "range_slider_date_time_label", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart", - "description": "" + "title": "One dimensional", + "key": "one_dimensional_types", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/one_dimensional/one_dimensional.dart" }, { "type": "sample", - "title": "Tooltip types", - "key": "range_slider_tooltip_type", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart", - "description": "" - }, - { - "type": "sample", - "title": "Step", - "key": "range_slider_step", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart", - "description": "" + "title": "QR Code", + "key": "qr_code_generator", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/two_dimensional/qr_code.dart", + "needsPropertyPanel": true }, { "type": "sample", - "title": "Interval selection", - "key": "range_slider_interval_selection", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart", - "description": "" + "title": "Data Matrix", + "key": "data_matrix_generator", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/data_matrix/data_matrix.dart", + "needsPropertyPanel": true } ] }, { - "type": "child", - "title": "Customization", - "displayType": "tab", + "title": "Cartesian Charts", + "description": "Plot over 30 chart types ranging from line charts to financial charts", + "image": "images/cartesian_types.png", + "status": "Updated", + "controlId": 1, "subItems": [ { - "type": "sample", - "title": "Thumb icon customization", - "key": "range_slider_thumb_icon_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart" - }, - { - "type": "sample", - "title": "Size customization", - "key": "size_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart" - }, - { - "type": "sample", - "title": "Color customization", - "key": "color_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/color_customization/color_customization.dart" + "type": "parent", + "title": "Chart Types", + "subItems": [ + { + "type": "child", + "title": "Line", + "displayType": "card", + "subItems": [ + { + "type": "sample", + "title": "Default line chart", + "key": "default_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/default_line_chart.dart", + "description": "This sample demonstrates the default line chart. Marker, tooltip and legend are enabled in this sample. Tap the marker to view information about that data point in a tooltip." + }, + { + "type": "sample", + "title": "Line with dashes", + "key": "line_with_dashes", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/line_with_dashes.dart", + "description": "Line chart is rendered with dashes in this sample." + }, + { + "type": "sample", + "title": "Multi-colored line", + "key": "multi_colored_line", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/multi_colored_line.dart", + "description": "This sample demonstrates the rendering of a line chart with multiple colors. Colors for each data point is mapped from the data source." + }, + { + "type": "sample", + "title": "Customized line chart", + "key": "customized_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/customized_line_chart.dart", + "description": "" + }, + { + "type": "sample", + "title": "Dynamic update animation", + "key": "animation_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Column", + "displayType": "card", + "subItems": [ + { + "title": "Default Column chart", + "key": "default_column_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/default_column_chart.dart" + }, + { + "title": "Modified axis base", + "key": "column_axis_crossing", + "description": "This sample is achieved using the axis crossing feature. X-axis 'crossAt' value is set to -2 and hence the data points are rendering from -2. Default axis base value is 0 and on that case, positive points will render upwards and negative points will render downwards.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/column_with_axis_base.dart", + "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", + "sourceText": "www.indexmundi.com", + "needsPropertyPanel": true + }, + { + "title": "Column with rounded corners", + "key": "column_with_rounded_corners", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/column_with_rounded_corners.dart", + "sourceLink": "https://www.worldatlas.com/articles/largest-cities-in-the-world-by-land-area.html", + "sourceText": "www.worldatlas.com" + }, + { + "title": "Back to back column", + "key": "back_to_back_column", + "description": "By default, the columns of various series are placed side by side. In this sample, it is changed to render back to back", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/back_to_back_column.dart" + }, + { + "title": "Column with track", + "key": "column_with_track", + "description": "This sample renders the column chart with track. Track is a rectangular bar drawn from minimum to maximum values of an axis.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/column_with_track.dart" + }, + { + "title": "Column width and spacing", + "key": "column_width_and_spacing", + "description": "You can change the width and spacing of columns by using the options in the properties panel.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/column_width_and_spacing.dart", + "needsPropertyPanel": true + }, + { + "title": "Customized column chart", + "key": "customized_column_chart", + "description": "This sample demonstrates the rendering of custom columns. Here, the top edges of the columns are changed to form a triangle.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/customized_column_chart.dart", + "sourceLink": "https://www.statista.com/statistics/263393/global-pc-shipments-since-1st-quarter-2009-by-vendor/", + "sourceText": "www.statista.com" + }, + { + "title": "Dynamic update animation", + "key": "animation_column_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Spline", + "displayType": "card", + "subItems": [ + { + "title": "Default spline chart", + "key": "default_spline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/default_spline_chart.dart", + "sourceLink": "https://www.holiday-weather.com/london/averages/", + "sourceText": "www.holiday-weather.com" + }, + { + "title": "Spline with dashes", + "key": "spline_with_dashes", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/spline_with_dashes.dart", + "sourceLink": "https://tcdata360.worldbank.org/indicators/inv.all.pct?country=BRA&indicator=345&countries=GRC,SWE&viz=line_chart&years=1997,2004", + "sourceText": "tcdata360.worldbank.org" + }, + { + "title": "Spline types", + "key": "spline_types", + "description": "This sample demonstrates various types of splines. Type can be changed by modifying the options in the properties panel.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/spline_types.dart", + "sourceLink": "https://tcdata360.worldbank.org/indicators/ex.grw?country=BRA&indicator=401&viz=line_chart&years=2010Q3,2016Q2", + "sourceText": "tcdata360.worldbank.org", + "needsPropertyPanel": true + }, + { + "title": "Vertical spline chart", + "key": "vertical_spline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/vertical_spline_chart.dart" + }, + { + "title": "Customized spline chart", + "key": "customized_spline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/customized_spline_chart.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_spline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Area", + "displayType": "card", + "subItems": [ + { + "title": "Default area chart", + "key": "default_area_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/default_area_chart.dart" + }, + { + "title": "Vertical area chart", + "key": "vertical_area_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/vertical_area_chart.dart" + }, + { + "title": "Modified axis base", + "key": "area_axis_crossing", + "description": "This sample is achieved using the axis crossing feature. X-axis 'crossAt' value is set to -2 and hence the data points are rendering from -2. Default axis base value is 0 and on that case, positive points will render upwards and negative points will render downwards.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/area_with_axis_base.dart", + "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", + "sourceText": "www.indexmundi.com", + "needsPropertyPanel": true + }, + { + "title": "Area with empty points", + "key": "area_with_emptypoints", + "description": "This area chart sample renders with gap for null values (empty data points).", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/area_with_emptypoints.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_area_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Bar", + "displayType": "card", + "subItems": [ + { + "title": "Default bar chart", + "key": "default_bar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/default_bar_chart.dart" + }, + { + "title": "Bar with rounded corners", + "key": "bar_with_rounded_corners", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_rounded_corners.dart", + "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", + "sourceText": "www.indexmundi.com" + }, + { + "title": "Bar width and spacing", + "key": "bar_width_and_spacing", + "description": "You can change the width and spacing of the bars by using the options in the properties panel.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/bar_width_and_spacing.dart", + "needsPropertyPanel": true + }, + { + "title": "Bar with track", + "key": "bar_with_track", + "description": "This sample renders the bar chart with track. Track is a rectangular bar drawn from minimum to maximum values of an axis.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_track.dart" + }, + { + "title": "Customized bar chart", + "key": "customized_bar_chart", + "showInWeb": false, + "description": "This sample demonstrates the rendering of custom bars. Here, the bars are filled with images, to look like pattern fill.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/customized_bar_chart.dart", + "sourceLink": "https://www.makeuseof.com/tag/most-popular-android-apps/", + "sourceText": "www.makeuseof.com" + }, + { + "title": "Dynamic update animation", + "key": "animation_bar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Bubble", + "displayType": "card", + "subItems": [ + { + "title": "Default bubble chart", + "key": "default_bubble_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/default_bubble_chart.dart" + }, + { + "title": "Bubble with various colors", + "key": "bubble_with_various_colors", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_various_colors.dart" + }, + { + "title": "Bubble filled with gradient", + "key": "bubble_filled_with_gradient", + "description": "This sample depicts the bubble chart filled with gradient colors.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_filled_with_gradient.dart" + }, + { + "title": "Bubble with multiple series", + "key": "bubble_with_multiple_series", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_multiple_series.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_bubble_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Scatter", + "displayType": "card", + "subItems": [ + { + "title": "Default scatter", + "key": "default_scatter_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/scatter/default_scatter_chart.dart", + "sourceLink": "https://tcdata360.worldbank.org/indicators/ex.grw?country=BRA&indicator=401&countries=IND,CAN&viz=line_chart&years=2013Q2,2016Q2", + "sourceText": "tcdata360.worldbank.org" + }, + { + "title": "Scatter with various shapes", + "key": "scatter_with_various_shapes", + "description": "This sample demonstrates the rendering of a scatter chart with various shapes.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/scatter/scatter_with_various_shapes.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_scatter_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Step Line", + "displayType": "card", + "subItems": [ + { + "title": "Default Step line chart", + "key": "default_stepline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_line/default_step_line_chart.dart" + }, + { + "title": "Step line with dashes", + "key": "stepline_with_dashes", + "description": "A step line chart is rendered with dashes in this sample.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_line/step_line_with_dashes.dart" + }, + { + "title": "Vertical step line chart", + "key": "vertical_stepline_chart", + "description": "The axes in this sample are transposed to form a vertical step line chart.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_line/vertical_step_line_chart.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_stepline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Range Column", + "displayType": "card", + "subItems": [ + { + "title": "Default range column chart", + "key": "default_rangecolumn_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_column/default_range_column_chart.dart", + "sourceLink": "https://www.holiday-weather.com/london/averages/", + "sourceText": "www.holiday-weather.com" + }, + { + "title": "Transposed range column", + "key": "vertical_rangecolumn_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_column/vertical_range_column_chart.dart", + "sourceLink": "https://www.holiday-weather.com/sydney/averages/", + "sourceText": "www.holiday-weather.com" + }, + { + "title": "Range column with track", + "key": "rangecolumn_with_track", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_column/range_column_with_track.dart" + }, + { + "title": "Dynamic update animation", + "key": "animation_rangecolumn_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Stacked Charts", + "displayType": "card", + "subItems": [ + { + "title": "Stacked line chart", + "key": "stacked_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_line_chart.dart" + }, + { + "title": "Stacked area chart", + "key": "stacked_area_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_area_chart.dart" + }, + { + "title": "Stacked column chart", + "key": "stacked_column_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_column_chart.dart" + }, + { + "title": "Stacked bar chart", + "key": "stacked_bar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_bar_chart.dart" + } + ] + }, + { + "type": "child", + "title": "100% Stacked Charts", + "displayType": "card", + "subItems": [ + { + "title": "100% stacked line chart", + "key": "stacked_line_100_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_line_100_chart.dart" + }, + { + "title": "100% stacked area chart", + "key": "stacked_area_100_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_area_100_chart.dart" + }, + { + "title": "100% stacked column chart", + "key": "stacked_column_100_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_column_100_chart.dart" + }, + { + "title": "100% stacked bar chart", + "key": "stacked_bar_100_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_bar_100_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Financial Charts", + "displayType": "card", + "subItems": [ + { + "title": "High low chart", + "key": "hilo_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_chart.dart", + "needsPropertyPanel": true + }, + { + "title": "Open high low close chart", + "key": "hilo_open_close_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_open_close_chart.dart", + "needsPropertyPanel": true + }, + { + "title": "Candle chart", + "key": "candle_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/chart_types/financial_charts/candle_chart.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Spline Area", + "subItems": [ + { + "type": "sample", + "title": "Spline area chart", + "key": "spline_area", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline_area.dart" + } + ] + }, + { + "type": "child", + "title": "Step Area", + "subItems": [ + { + "type": "sample", + "title": "Step area chart", + "key": "step_area", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_area.dart", + "sourceLink": "https://www.accuweather.com/en/fr/paris/623/march-weather/623?year=2019", + "sourceText": "www.accuweather.com" + } + ] + }, + { + "type": "child", + "title": "Range Area", + "subItems": [ + { + "type": "sample", + "title": "Range area chart", + "key": "range_area", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_area.dart" + } + ] + }, + { + "type": "child", + "title": "Spline Range Area", + "subItems": [ + { + "type": "sample", + "title": "Spline range area chart", + "key": "spline_range_area", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline_range_area.dart" + } + ] + }, + { + "type": "child", + "title": "Histogram", + "subItems": [ + { + "type": "sample", + "title": "Histogram chart", + "key": "histogram_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/histogram.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Box and Whisker", + "subItems": [ + { + "type": "sample", + "title": "Box and Whisker chart", + "key": "box_whisker", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/box_whisker.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Waterfall", + "displayType": "card", + "subItems": [ + { + "type": "sample", + "title": "Default waterfall chart", + "key": "water_fall", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/waterfall/waterfall.dart" + }, + { + "type": "sample", + "title": "Vertical waterfall chart", + "key": "vertical_water_fall", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/waterfall/vertical_waterfall.dart" + } + ] + } + ] }, - { - "type": "sample", - "title": "Shape customization", - "key": "shape_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/shape_customization/shape_customization.dart" - } - ] - } - ] - }, - { - "title": "Range Selector", - "description": "Visualize data and select a date or numeric range", - "image": "images/range_selector.png", - "status": "Updated", - "category": "Sliders", - "displayType": "tab", - "controlId": 14, - "subItems": [ - { - "type": "sample", - "title": "Default", - "status": "Updated", - "key": "range_selector_default_appearance", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_default_appearance.dart" - }, - { - "type": "sample", - "title": "Selection", - "key": "range_selector_with_selection", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_selection.dart" - }, - { - "type": "sample", - "title": "Zooming", - "key": "range_selector_with_zooming", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_zooming.dart", - "needsPropertyPanel": true - }, - { - "type": "sample", - "title": "Histogram Chart", - "status": "New", - "key": "range_selector_with_histogram_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart" - }, - { - "type": "sample", - "title": "Bar Chart", - "status": "New", - "key": "range_selector_with_bar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart" - } - ] - }, - { - "title": "Barcodes", - "description": "Generate and display data in machine-readable 1D and 2D barcodes", - "image": "images/barcode.png", - "category": "Data Visualization", - "displayType": "tab", - "controlId": 6, - "subItems": [ - { - "type": "sample", - "title": "One dimensional", - "key": "one_dimensional_types", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/one_dimensional/one_dimensional.dart" - }, - { - "type": "sample", - "title": "QR Code", - "key": "qr_code_generator", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/two_dimensional/qr_code.dart", - "needsPropertyPanel": true - }, - { - "type": "sample", - "title": "Data Matrix", - "key": "data_matrix_generator", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/barcodes/data_matrix/data_matrix.dart", - "needsPropertyPanel": true - } - ] - }, - { - "title": "PDF", - "description": "Create PDF document with text, images and tables", - "image": "images/pdf.png", - "status": "Preview", - "category": "File Formats", - "displayType": "tab", - "controlId": 10, - "subItems": [ - { - "type": "sample", - "title": "Invoice", - "key": "invoice", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/invoice/invoice.dart" - }, - { - "type": "sample", - "title": "Course Completion Certificate", - "key": "certificate", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/certificate/certificate.dart" - }, - { - "type": "sample", - "title": "Headers and Footers", - "key": "header_and_footer", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/header_and_footer/header_and_footer.dart" - }, - { - "type": "sample", - "title": "Annotations", - "key": "annotations", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/annotations/annotations.dart" - }, - { - "type": "sample", - "title": "Text Extraction", - "key": "text_extraction", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/text_extraction/text_extraction.dart" - }, - { - "type": "sample", - "title": "Find Text", - "key": "find_text", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/find_text/find_text.dart" - } - ] - }, - { - "title": "Cartesian Charts", - "description": "Plot over 30 chart types ranging from line charts to financial charts", - "image": "images/cartesian_types.png", - "status": "Updated", - "category": "Data Visualization", - "controlId": 1, - "subItems": [ - { - "type": "parent", - "title": "Chart Types", - "subItems": [ { "type": "child", - "title": "Line", + "title": "Data Source", "displayType": "card", "subItems": [ { - "type": "sample", - "title": "Default line chart", - "key": "default_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/default_line_chart.dart", - "description": "This sample demonstrates the default line chart. Marker, tooltip and legend are enabled in this sample. Tap the marker to view information about that data point in a tooltip." - }, - { - "type": "sample", - "title": "Line with dashes", - "key": "line_with_dashes", - "showInWeb": false, - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/line_with_dashes.dart", - "description": "Line chart is rendered with dashes in this sample." - }, - { - "type": "sample", - "title": "Multi-colored line", - "key": "multi_colored_line", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/multi_colored_line.dart", - "description": "This sample demonstrates the rendering of a line chart with multiple colors. Colors for each data point is mapped from the data source." + "title": "List", + "key": "local_list_data", + "description": "This sample demonstrates plotting the data which is stored as a list.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/data_source/list.dart" }, { - "type": "sample", - "title": "Customized line chart", - "showInWeb": false, - "key": "customized_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/customized_line_chart.dart", - "description": "" - }, + "title": "JSON", + "key": "local_json_data", + "description": "This same demonstrates binding of JSON data to the chart. We saved the JSON data in the file 'chart_data.json' in the assets folder.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/data_source/json.dart" + } + ] + }, + { + "type": "parent", + "title": "Axis Types", + "subItems": [ { - "type": "sample", - "title": "Dynamic update animation", - "key": "animation_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/animation_line_chart.dart" + "type": "child", + "title": "Numeric", + "displayType": "card", + "subItems": [ + { + "type": "sample", + "title": "Default numeric axis", + "key": "default_numeric_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/numeric/default_numeric_axis.dart", + "description": "", + "sourceLink": "https://www.google.com/search?q=india+vs+australia+odi+result+2019&oq=indian+vs+australia+odi+res&aqs=chrome.2.69i57j0l5.11336j1j4&sourceid=chrome&ie=UTF-8", + "sourceText": "www.google.com" + }, + { + "type": "sample", + "title": "Numeric axis with label format", + "key": "numeric_axis_with_label_format", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/numeric/numeric_axis_with_label_format.dart", + "description": "" + }, + { + "title": "Inversed numeric axis", + "key": "inversed_numeric_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/numeric/inversed_numeric_axis.dart", + "description": "", + "sourceLink": "https://www.indexmundi.com/g/g.aspx?c=us&v=121", + "sourceText": "www.indexmundi.com", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Category", + "displayType": "card", + "subItems": [ + { + "title": "Default category axis", + "key": "default_category_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/category/default_category_axis.dart", + "description": "", + "status": "" + }, + { + "title": "Arranged by index", + "key": "category_arranged_by_index", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/category/indexed_category_axis.dart", + "description": "By default, category data points will be arranged based on the x values. In this sample, you can arrange the data points based on the index value.", + "needsPropertyPanel": true + }, + { + "title": "Label placement", + "key": "category_label_placement", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/category/label_placement.dart", + "description": "", + "status": "", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Date Time", + "displayType": "card", + "subItems": [ + { + "title": "Default Date time axis", + "key": "default_datetime_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/date_time/default_date_time_axis.dart", + "description": "", + "status": "", + "sourceLink": "https://www.x-rates.com/graph/?from=USD&to=INR&amount=1", + "sourceText": "www.x-rates.com" + }, + { + "title": "Date time axis with label format", + "key": "datetime_axis_with_label_format", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/date_time/date_time_axis_with_label_format.dart", + "description": "", + "status": "", + "sourceLink": "https://en.wikipedia.org/wiki/List_of_earthquakes_in_Indonesia", + "sourceText": "en.wikipedia.org" + } + ] + }, + { + "type": "child", + "title": "Logarithmic", + "displayType": "card", + "subItems": [ + { + "title": "Default logarithmic axis", + "key": "default_logarithmic_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/logarithmic/default_logarithmic_axis.dart", + "description": "" + }, + { + "title": "Inversed logarithmic axis", + "key": "inversed_logarithmic_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_types/logarithmic/inversed_logarithmic_axis.dart", + "description": "", + "sourceLink": "https://www.worldometers.info/world-population/population-by-country/", + "sourceText": "www.worldometers.info" + } + ] } ] }, { "type": "child", - "title": "Column", + "title": "Axis Features", "displayType": "card", "subItems": [ { - "title": "Default Column chart", - "key": "default_column_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/default_column_chart.dart" + "title": "Opposed axes", + "key": "opposed_axes", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/opposed_axes.dart", + "sourceLink": "https://www.statista.com/statistics/199983/us-vehicle-sales-since-1951/", + "sourceText": "www.statista.com" + }, + { + "title": "Handling labels collision", + "key": "handling_label_collision", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/handling_label_collision.dart", + "sourceLink": "https://en.wikipedia.org/wiki/List_of_men%27s_footballers_with_500_or_more_goals", + "sourceText": "en.wikipedia.org", + "needsPropertyPanel": true }, { - "title": "Modified axis base", + "title": "Edge label placement", + "key": "edgelabel_placement", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/edgelabel_placement.dart", + "sourceLink": "https://www.mycarhelpline.com/index.php?option=com_easyblog&view=entry&id=808&Itemid=91", + "sourceText": "www.mycarhelpline.com", + "needsPropertyPanel": true + }, + { + "title": "Maximum width for labels", + "key": "chart_maximum_label_width", "status": "New", - "key": "column_axis_crossing", - "description": "This sample is achieved using the axis crossing feature. X-axis 'crossAt' value is set to -2 and hence the data points are rendering from -2. Default axis base value is 0 and on that case, positive points will render upwards and negative points will render downwards.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/column_with_axis_base.dart", - "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", - "sourceText": "www.indexmundi.com", + "description": "Maximum width for axis labels can be specified using the maximumLabelWidth property. The maximum space occupied by the axis labels can be changed using the labelsExtent property. A tooltip will be shown on clicking/tapping the trimmed axis label in both cases.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/maximum_label_width.dart", + "sourceLink": "https://www.emporis.com/statistics/worlds-tallest-buildings", + "sourceText": "www.emporis.com", "needsPropertyPanel": true }, { - "title": "Column with rounded corners", - "key": "column_with_rounded_corners", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/column_with_rounded_corners.dart", - "sourceLink": "https://www.worldatlas.com/articles/largest-cities-in-the-world-by-land-area.html", - "sourceText": "www.worldatlas.com" + "title": "Multiple axis chart", + "key": "multiple_axis_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/multiple_axis_chart.dart", + "sourceLink": "https://www.accuweather.com/en/us/new-york-ny/10007/month/349727?monyr=5/01/2019", + "sourceText": "www.accuweather.com" }, { - "title": "Back to back column", - "key": "back_to_back_column", - "description": "By default, the columns of various series are placed side by side. In this sample, it is changed to render back to back", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/back_to_back_column.dart" + "title": "Axis crossing", + "key": "axis_crossing", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/axis_crossing.dart", + "needsPropertyPanel": true }, { - "title": "Column with track", - "key": "column_with_track", - "description": "This sample renders the column chart with track. Track is a rectangular bar drawn from minimum to maximum values of an axis.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/column_with_track.dart" + "title": "Plot band", + "key": "plot_band", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/plot_band.dart", + "needsPropertyPanel": true }, { - "title": "Column width and spacing", - "key": "column_width_and_spacing", - "description": "You can change the width and spacing of columns by using the options in the properties panel.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/column_width_and_spacing.dart", + "title": "Plot band recurrence", + "key": "plot_band_recurrence", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/plot_band_recurrence.dart", "needsPropertyPanel": true }, { - "title": "Customized column chart", - "key": "customized_column_chart", - "description": "This sample demonstrates the rendering of custom columns. Here, the top edges of the columns are changed to form a triangle.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/customized_column_chart.dart", - "sourceLink": "https://www.statista.com/statistics/263393/global-pc-shipments-since-1st-quarter-2009-by-vendor/", - "sourceText": "www.statista.com" + "title": "Positioning axis labels", + "key": "positioning_axis_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/positioning_axis_label.dart", + "needsPropertyPanel": true }, { - "title": "Dynamic update animation", - "key": "animation_column_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/animation_column_chart.dart" + "title": "Axis animation", + "key": "axis_animation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/axis_animation.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "parent", + "title": "Series Features", + "subItems": [ + { + "type": "child", + "title": "Gradient", + "displayType": "card", + "subItems": [ + { + "title": "Horizontal gradient", + "key": "horizantal_gradient", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/gradients/horizantal_gradient.dart" + }, + { + "title": "Vertical gradient", + "key": "vertical_gradient", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/gradients/vertical_gradient.dart" + } + ] + }, + { + "type": "child", + "title": "Animation", + "displayType": "card", + "subItems": [ + { + "title": "Series animation", + "key": "series_animation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/animation/series_animation.dart" + }, + { + "title": "Line", + "key": "animation_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart" + }, + { + "title": "Column", + "key": "animation_column_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart" + }, + { + "title": "Spline", + "key": "animation_spline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart" + }, + { + "title": "Area", + "key": "animation_area_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart" + }, + { + "title": "Bar", + "key": "animation_bar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart" + }, + { + "title": "Bubble", + "key": "animation_bubble_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart" + }, + { + "title": "Scatter", + "key": "animation_scatter_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart" + }, + { + "title": "Step line", + "key": "animation_stepline_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart" + }, + { + "title": "Range column", + "key": "animation_rangecolumn_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Marker", + "displayType": "tab", + "subItems": [ + { + "title": "Various marker shapes", + "key": "various_marker_shapes", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/marker.dart" + } + ] + }, + { + "type": "child", + "title": "Data Label", + "displayType": "card", + "subItems": [ + { + "title": "Default data labels", + "key": "default_datalabels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/data_label/default_data_labels.dart", + "needsPropertyPanel": true + }, + { + "title": "Data label template", + "key": "datalabel_template", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/data_label/data_label_template.dart", + "sourceLink": "https://www.broadbandsearch.net/blog/social-media-facts-statistics", + "sourceText": "www.broadbandsearch.net" + } + ] + }, + { + "type": "child", + "title": "Annotation", + "displayType": "card", + "subItems": [ + { + "title": "Chart with annotation", + "key": "chart_with_annotation", + "description": "This sample renders the cartesian chart with annotation. A pie chart is rendered as an annotation here.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_annotation.dart" + }, + { + "title": "Chart with watermark", + "key": "chart_with_watermark", + "description": "In this sample, annotation is placed at the center of the chart with reduced opacity to form a watermark", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_watermark.dart" + } + ] + }, + { + "type": "child", + "title": "Sorting", + "displayType": "tab", + "subItems": [ + { + "title": "Sorting options", + "key": "sorting_options", + "description": "This sample depicts the sorting feature in a chart. The data points can be sorted in the ascending or descending order based on the x or y value.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/sorting.dart", + "sourceLink": "https://www.emporis.com/statistics/worlds-tallest-buildings", + "sourceText": "www.emporis.com", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Empty Points", + "displayType": "tab", + "subItems": [ + { + "title": "Chart with empty points", + "key": "chart_with_empty_points", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/series_features/empty_points.dart", + "needsPropertyPanel": true + } + ] } ] }, { "type": "child", - "title": "Spline", + "title": "Legend", "displayType": "card", "subItems": [ { - "title": "Default spline chart", - "key": "default_spline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/default_spline_chart.dart", - "sourceLink": "https://www.holiday-weather.com/london/averages/", - "sourceText": "www.holiday-weather.com" + "title": "Chart with customized legend", + "key": "chart_with_customized_legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/legend/chart_with_customized_legend.dart" }, { - "title": "Spline with dashes", - "showInWeb": false, - "key": "spline_with_dashes", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/spline_with_dashes.dart", - "sourceLink": "https://tcdata360.worldbank.org/indicators/inv.all.pct?country=BRA&indicator=345&countries=GRC,SWE&viz=line_chart&years=1997,2004", - "sourceText": "tcdata360.worldbank.org" - }, - { - "title": "Spline types", - "key": "spline_types", - "description": "This sample demonstrates various types of splines. Type can be changed by modifying the options in the properties panel.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/spline_types.dart", - "sourceLink": "https://tcdata360.worldbank.org/indicators/ex.grw?country=BRA&indicator=401&viz=line_chart&years=2010Q3,2016Q2", - "sourceText": "tcdata360.worldbank.org", + "title": "Legend with various options", + "key": "cartesian_legend_various_options", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/legend/legend_various_options.dart", "needsPropertyPanel": true - }, - { - "title": "Vertical spline chart", - "key": "vertical_spline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/vertical_spline_chart.dart" - }, - { - "title": "Customized spline chart", - "key": "customized_spline_chart", - "showInWeb": false, - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/customized_spline_chart.dart" - }, + } + ] + }, + { + "type": "parent", + "title": "User Interactions", + "subItems": [ { - "title": "Dynamic update animation", - "key": "animation_spline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart" + "type": "child", + "title": "Tooltip", + "displayType": "card", + "subItems": [ + { + "title": "Default tooltip", + "key": "default_tooltip", + "description": "Tooltip is enabled in this sample and to see the tooltip in action, tap the data points in mobile and hover the data points in the web.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/tooltip/default_tooltip.dart", + "sourceLink": "https://www.indexmundi.com/g/g.aspx?v=72&c=gm&c=mx&l=en", + "sourceText": "www.indexmundi.com" + }, + { + "title": "Tooltip position", + "description": "By changing the options, the tooltip can be made to display in the fixed location or at the pointer location itself.", + "key": "tooltip_position", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_position.dart", + "needsPropertyPanel": true + }, + { + "title": "Tooltip template", + "description": "This example displays a custom widget as the tooltip. To see the tooltip template, tap the data points in mobile and hover the data points in the web.", + "key": "tooltip_template", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart", + "sourceLink": "https://www.broadbandsearch.net/blog/social-media-facts-statistics", + "sourceText": "www.broadbandsearch.net" + } + ] + }, + { + "type": "child", + "title": "Zooming and Panning", + "displayType": "card", + "subItems": [ + { + "title": "Pinch zooming", + "key": "pinch_zooming", + "description": "Pinch zooming and panning is enabled in this sample. Pinch the chart to zoom in and swipe the zoomed chart to pan it. In the web, mouse wheel zooming is also enabled.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/pinch_zooming.dart", + "needsPropertyPanel": true + }, + { + "title": "Selection zooming", + "key": "selection_zooming", + "description": "This sample depicts the working of selection zooming. Long press and drag on the chart to select the region for zooming.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/selection_zooming.dart" + }, + { + "title": "Zooming with custom buttons", + "key": "zooming_with_custom_buttons", + "description": "This sample demonstrates zooming and panning with custom buttons.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/zooming_with_custom_buttons.dart" + } + ] + }, + { + "type": "child", + "title": "Crosshair", + "displayType": "tab", + "subItems": [ + { + "title": "Chart with crosshair", + "key": "chart_with_crosshair", + "description": "The crosshair is enabled in this sample. Tap the chart to show the crosshair and drag the chart to constantly change the crosshair position. On the web, you can move the cursor over the chart area to display the crosshair.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/crosshair.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Trackball", + "displayType": "card", + "subItems": [ + { + "title": "Chart with trackball", + "key": "chart_with_trackball", + "description": "The trackball is enabled in this sample. Tap the chart to show the trackball and drag the chart to change the position of the trackball continuously. On the web, you can move the cursor over the chart area to display the trackball.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/trackball.dart", + "needsPropertyPanel": true + }, + { + "title": "Customized trackball", + "key": "chart_with_trackball_template", + "status": "New", + "description": "This example displays a custom widget as the trackball. To see the customized trackball, tap the chart area in mobile and hover the chart area on the web.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/trackball_template.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Selection", + "displayType": "card", + "subItems": [ + { + "title": "Selection modes", + "key": "selection_modes", + "description": "This sample depicts the selection feature in the chart. Tap the data point to select or unselect in mobile and web click the data points.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/selection/selection_modes.dart", + "needsPropertyPanel": true + }, + { + "title": "Dynamic selection", + "key": "selection_index", + "description": "This sample depicts the dynamic selection feature achieved using the 'selectDataPoints' public method. Choose the series and point index from the dropdown to select or unselect the data points.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/selection/dynamic_selection.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Events", + "displayType": "card", + "subItems": [ + { + "title": "Events", + "key": "events", + "description": "Various chart callbacks are enabled in this example. It displays the event trace details while rendering and on performing various interactions.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/events.dart" + }, + { + "title": "Navigation with events", + "key": "navigate_with_events", + "status": "New", + "description": "Tap/click on the axis labels, data points or on the data labels for navigating to an external link.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/axis_features/maximum_label_width.dart", + "sourceLink": "https://www.emporis.com/statistics/worlds-tallest-buildings", + "sourceText": "www.emporis.com" + } + ] + }, + { + "type": "child", + "title": "Add a point on click", + "displayType": "tab", + "subItems": [ + { + "title": "Add a point on click", + "status": "New", + "description": "This example depicts the pixel to data point conversion feature. Tap/click on the chart area to add a data point dynamically on that location.", + "key": "chart_interactivity", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart" + } + ] } ] }, { "type": "child", - "title": "Area", + "title": "Trendlines", "displayType": "card", "subItems": [ { - "title": "Default area chart", - "key": "default_area_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/default_area_chart.dart" - }, - { - "title": "Vertical area chart", - "key": "vertical_area_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/vertical_area_chart.dart" - }, - { - "title": "Modified axis base", - "status": "New", - "key": "area_axis_crossing", - "description": "This sample is achieved using the axis crossing feature. X-axis 'crossAt' value is set to -2 and hence the data points are rendering from -2. Default axis base value is 0 and on that case, positive points will render upwards and negative points will render downwards.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/area_with_axis_base.dart", - "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", - "sourceText": "www.indexmundi.com", + "title": "Default rendering", + "key": "default_trendlines_with_options", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/trendline/default_trendline.dart", "needsPropertyPanel": true }, { - "title": "Area with empty points", - "key": "area_with_emptypoints", - "description": "This area chart sample renders with gap for null values (empty data points).", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/area_with_emptypoints.dart" - }, - { - "title": "Dynamic update animation", - "key": "animation_area_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/animation_area_chart.dart" + "title": "Trendline forecast", + "key": "trendline_forecast_with_options", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/trendline/trendline_forecast.dart", + "sourceLink": "https://www.ofx.com/en-au/forex-news/historical-exchange-rates/yearly-average-rates/", + "sourceText": "www.ofx.com", + "needsPropertyPanel": true } ] }, { "type": "child", - "title": "Bar", + "title": "Technical Indicators", "displayType": "card", "subItems": [ { - "title": "Default bar chart", - "key": "default_bar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/default_bar_chart.dart" + "title": "Accumulation Distribution", + "key": "accumulation_distribution", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/accumulation_distribution.dart" }, { - "title": "Bar with rounded corners", - "key": "bar_with_rounded_corners", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/bar_with_rounded_corners.dart", - "sourceLink": "https://www.indexmundi.com/g/r.aspx?v=24", - "sourceText": "www.indexmundi.com" + "title": "ATR Indicator", + "key": "atr_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/atr_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Bar width and spacing", - "key": "bar_width_and_spacing", - "description": "You can change the width and spacing of the bars by using the options in the properties panel.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/bar_width_and_spacing.dart", + "title": "Bollinger Indicator", + "key": "bollinger_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/bollinger_indicator.dart", "needsPropertyPanel": true }, { - "title": "Bar with track", - "key": "bar_with_track", - "description": "This sample renders the bar chart with track. Track is a rectangular bar drawn from minimum to maximum values of an axis.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/bar_with_track.dart" + "title": "EMA Indicator", + "key": "ema_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/ema_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Customized bar chart", - "key": "customized_bar_chart", - "showInWeb": false, - "description": "This sample demonstrates the rendering of custom bars. Here, the bars are filled with images, to look like pattern fill.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart", - "sourceLink": "https://www.makeuseof.com/tag/most-popular-android-apps/", - "sourceText": "www.makeuseof.com" + "title": "Momentum Indicator", + "key": "momentum_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/momentum_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Dynamic update animation", - "key": "animation_bar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart" - } - ] - }, - { - "type": "child", - "title": "Bubble", - "displayType": "card", - "subItems": [ - { - "title": "Default bubble chart", - "key": "default_bubble_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/default_bubble_chart.dart" + "title": "RSI Indicator", + "key": "rsi_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/rsi_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Bubble with various colors", - "key": "bubble_with_various_colors", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_various_colors.dart" + "title": "SMA Indicator", + "key": "sma_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/sma_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Bubble filled with gradient", - "key": "bubble_filled_with_gradient", - "description": "This sample depicts the bubble chart filled with gradient colors.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/bubble_filled_with_gradient.dart" + "title": "Stochastic Indicator", + "key": "stochastic_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/stochastic_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Bubble with multiple series", - "key": "bubble_with_multiple_series", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_multiple_series.dart" + "title": "TMA Indicator", + "key": "tma_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/tma_indicator.dart", + "needsPropertyPanel": true }, { - "title": "Dynamic update animation", - "key": "animation_bubble_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart" + "title": "MACD Indicator", + "key": "macd_indicator", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/technical_indicators/macd_indicator.dart", + "needsPropertyPanel": true } ] }, { - "type": "child", - "title": "Scatter", - "displayType": "card", + "type": "parent", + "title": "Real-time Charts", "subItems": [ { - "title": "Default scatter", - "key": "default_scatter_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/scatter_series/default_scatter_chart.dart", - "sourceLink": "https://tcdata360.worldbank.org/indicators/ex.grw?country=BRA&indicator=401&countries=IND,CAN&viz=line_chart&years=2013Q2,2016Q2", - "sourceText": "tcdata360.worldbank.org" - }, - { - "title": "Scatter with various shapes", - "key": "scatter_with_various_shapes", - "description": "This sample demonstrates the rendering of a scatter chart with various shapes.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/scatter_series/scatter_with_various_shapes.dart" - }, - { - "title": "Dynamic update animation", - "key": "animation_scatter_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart" + "type": "child", + "title": "Live Updates", + "displayType": "card", + "subItems": [ + { + "title": "Real-time spline chart", + "key": "real_time_spline_chart", + "description": "This sample demonstrates the live chart. A new data point is added at the end and a point is removed at the start in certain time interval continuously.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_spline_chart.dart" + }, + { + "title": "Real-time line chart", + "key": "real_time_line_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_line_chart.dart" + }, + { + "title": "Vertical live chart", + "key": "vertical_live_chart", + "description": "This sample demonstrates the live chart. A new data point is added at the end in certain time interval continuously.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/live_update/vertical_live_chart.dart" + } + ] + }, + { + "type": "child", + "title": "Add Data Points", + "displayType": "card", + "subItems": [ + { + "title": "Programmatic", + "key": "add_remove_points", + "description": "Add or remove the data points from a chart using the buttons placed in the sample.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_points.dart" + }, + { + "title": "Interaction", + "status": "New", + "description": "This example depicts the pixel to data point conversion feature. Tap/click on the chart area to add a data point dynamically on that location.", + "key": "chart_interactivity", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart" + } + ] + }, + { + "type": "child", + "title": "Add/Remove Series", + "displayType": "tab", + "subItems": [ + { + "title": "Add/remove series", + "key": "add_remove_series", + "description": "Add or remove series from the chart using the buttons placed in the sample.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_series.dart" + } + ] + }, + { + "type": "child", + "title": "Update Data Source", + "displayType": "tab", + "subItems": [ + { + "title": "Update data source", + "key": "update_data_source", + "description": "The data source bound to this chart can be changed with random values dynamically, by tapping the button placed in this sample.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/real_time_charts/update_data_source.dart" + } + ] } ] }, { "type": "child", - "title": "Step Line", - "displayType": "card", + "title": "Exporting", + "displayType": "tab", + "showInWeb": false, "subItems": [ { - "title": "Default Step line chart", - "key": "default_stepline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stepLine_series/default_stepline_chart.dart" - }, - { - "title": "Step line with dashes", - "key": "stepline_with_dashes", + "title": "Export", + "key": "exporting_chart", "showInWeb": false, - "description": "A step line chart is rendered with dashes in this sample.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stepLine_series/stepline_with_dashes.dart" - }, - { - "title": "Vertical step line chart", - "key": "vertical_stepline_chart", - "description": "The axes in this sample are transposed to form a vertical step line chart.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stepLine_series/vertical_stepline_chart.dart" - }, - { - "title": "Dynamic update animation", - "key": "animation_stepline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart" + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/export.dart" } ] - }, + } + ] + }, + { + "title": "Circular Charts", + "description": "Visualize the data using pie, doughnut, and radial bar charts", + "image": "images/circle_series.png", + "status": "", + "controlId": 2, + "subItems": [ { - "type": "child", - "title": "Range Column", - "displayType": "card", + "type": "parent", + "title": "Chart Types", "subItems": [ { - "title": "Default range column chart", - "key": "default_rangecolumn_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/rangecolumn_series/default_rangecolumn_chart.dart", - "sourceLink": "https://www.holiday-weather.com/london/averages/", - "sourceText": "www.holiday-weather.com" - }, - { - "title": "Transposed range column", - "key": "vertical_rangecolumn_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/rangecolumn_series/vertical_rangecolumn_chart.dart", - "sourceLink": "https://www.holiday-weather.com/sydney/averages/", - "sourceText": "www.holiday-weather.com" - }, - { - "title": "Range column with track", - "key": "rangecolumn_with_track", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/rangecolumn_series/rangecolumn_with_track.dart" - }, - { - "title": "Dynamic update animation", - "key": "animation_rangecolumn_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart" + "type": "child", + "title": "Pie", + "displayType": "card", + "subItems": [ + { + "title": "Default pie chart", + "key": "default_pie_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/pie/default_pie_chart.dart" + }, + { + "title": "Pie with various radius", + "key": "pie_with_various_radius", + "description": "This sample demonstrates the pie chart with different radius for all the slices. The radius of a slice is based on a numeric value.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/pie/pie_with_various_radius.dart" + }, + { + "title": "Semi-pie chart", + "key": "semi_pie_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/pie/semi_pie_chart.dart", + "sourceLink": "https://data.worldbank.org/indicator/sp.rur.totl.zs", + "sourceText": "data.worldbank.org", + "needsPropertyPanel": true + }, + { + "title": "Pie with grouping", + "key": "pie_with_grouping", + "description": "This sample demonstrates the grouping functionality in a pie chart. Data points’ values less than the specified value can be grouped together.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/pie/pie_with_grouping.dart" + }, + { + "title": "Pie with smart labels", + "key": "pie_with_smart_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/pie/pie_with_smart_labels.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Doughnut", + "displayType": "card", + "subItems": [ + { + "title": "Default doughnut chart", + "key": "default_doughnut_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/doughnut/default_doughnut_chart.dart", + "sourceLink": "https://www.pngkit.com/view/u2q8y3w7r5y3t4o0_composition-of-ocean-water-earths-oceans-elements-percentage/", + "sourceText": "www.pngkit.com" + }, + { + "title": "Doughnut with center elevation", + "key": "doughnut_with_center_elevation", + "description": "The doughnut chart is rendered with elevated circle at the center using annotations feature in this sample.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_center_elevation.dart" + }, + { + "title": "Doughnut with rounded corners", + "key": "doughnut_with_rounded_corners", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_rounded_corners.dart" + }, + { + "title": "Doughnut with color mapping", + "key": "doughnut_with_color_mapping", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_color_mapping.dart" + }, + { + "title": "Semi-doughnut chart", + "key": "semi_doughnut_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/doughnut/semi_doughnut_chart.dart", + "needsPropertyPanel": true + } + ] + }, + { + "type": "child", + "title": "Radial Bar", + "displayType": "card", + "subItems": [ + { + "title": "Default radial bar chart", + "key": "default_radialbar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/radial_bar/default_radial_bar_chart.dart" + }, + { + "title": "Radial bar with legend", + "key": "radialbar_with_legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/radial_bar/radial_bar_with_legend.dart" + }, + { + "title": "Customized radial bar chart", + "key": "customized_radialbar_chart", + "description": "This sample renders the radial bar chart with annotation at the center and templated legend.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/chart_types/radial_bar/customized_radial_bar_chart.dart" + } + ] } ] }, { "type": "child", - "title": "Stacked Charts", + "title": "Legend", "displayType": "card", "subItems": [ { - "title": "Stacked line chart", - "key": "stacked_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stacked_series/stacked_line_chart.dart" - }, - { - "title": "Stacked area chart", - "key": "stacked_area_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stacked_series/stacked_area_chart.dart" + "title": "Chart with legend", + "key": "chart_with_legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/legend/chart_with_legend.dart" }, { - "title": "Stacked column chart", - "key": "stacked_column_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stacked_series/stacked_column_chart.dart" - }, - { - "title": "Stacked bar chart", - "key": "stacked_bar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stacked_series/stacked_bar_chart.dart" + "title": "Legend with various options", + "key": "legend_with_various_options", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/legend/legend_with_various_options.dart", + "needsPropertyPanel": true } ] }, { "type": "child", - "title": "100% Stacked Charts", + "title": "User Interactions", "displayType": "card", "subItems": [ { - "title": "100% stacked line chart", - "key": "stacked_line_100_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_line_100_chart.dart" - }, - { - "title": "100% stacked area chart", - "key": "stacked_area_100_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_area_100_chart.dart" - }, - { - "title": "100% stacked column chart", - "key": "stacked_column_100_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_column_100_chart.dart" - }, - { - "title": "100% stacked bar chart", - "key": "stacked_bar_100_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_bar_100_chart.dart" - } - ] - }, - { - "type": "child", - "title": "Financial Charts", - "displayType": "card", - "subItems": [ - { - "title": "High low chart", - "key": "hilo_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/financial_series/hilo_chart.dart", + "title": "Tooltip", + "key": "pie_tooltip_position", + "description": "By changing the options, the tooltip can be made to display in the fixed location or at the pointer location itself.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/tooltip.dart", "needsPropertyPanel": true }, { - "title": "Open high low close chart", - "key": "hilo_open_close_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/financial_series/hilo_open_close_chart.dart", + "title": "Selection", + "key": "circular_selection", + "description": "This sample depicts the selection feature in the chart. Tap the data point to select or unselect in mobile and web click the data points.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/selection.dart", "needsPropertyPanel": true }, { - "title": "Candle chart", - "key": "candle_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/chart/cartesian_charts/financial_series/candle_chart.dart", + "title": "Dynamic selection", + "key": "circular_dynamic_selection", + "description": "This sample depicts the dynamic selection feature achieved using the 'selectDataPoints' public method. Choose the point index from the dropdown to select or unselect the data points.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/dynamic_selection.dart", "needsPropertyPanel": true } ] }, { "type": "child", - "title": "Spline Area", + "title": "Exporting", + "displayType": "tab", + "showInWeb": false, "subItems": [ { - "type": "sample", - "title": "Spline area chart", - "key": "spline_area", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/spline_area.dart" + "title": "Export", + "key": "export_circular_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/export.dart", + "showInWeb": false } ] - }, + } + ] + }, + { + "title": "Radial Gauge", + "description": "Visualize one or multiple measures on a circular scale with pointers and ranges", + "image": "images/circle_gauge.png", + "controlId": 3, + "subItems": [ { "type": "child", - "title": "Step Area", + "title": "Showcase", + "displayType": "card", "subItems": [ { "type": "sample", - "title": "Step area chart", - "key": "step_area", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/step_area.dart", - "sourceLink": "https://www.accuweather.com/en/fr/paris/623/march-weather/623?year=2019", - "sourceText": "www.accuweather.com" - } - ] - }, - { - "type": "child", - "title": "Range Area", - "subItems": [ + "title": "Gauge compass", + "key": "gauge_compass", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/gauge_compass.dart", + "description": "" + }, { "type": "sample", - "title": "Range area chart", - "key": "range_area", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/range_area.dart" - } - ] - }, - { - "type": "child", - "title": "Spline Range Area", - "subItems": [ + "title": "Clock", + "key": "clock_sample", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/clock_sample.dart", + "description": "" + }, + { + "type": "sample", + "title": "Temparature monitor", + "key": "gauge_overview", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/gauge_overview.dart", + "description": "" + }, { "type": "sample", - "title": "Spline range area chart", - "key": "spline_range_area", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/spline_range_area.dart" + "title": "Distance tracker", + "key": "distance_tracker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/distance_tracker.dart", + "description": "" } ] }, { "type": "child", - "title": "Histogram", + "title": "Axis", + "displayType": "card", "subItems": [ { "type": "sample", - "title": "Histogram chart", - "key": "histogram_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/histogram_chart.dart", - "needsPropertyPanel": true + "title": "Default view", + "key": "default_gauge_view", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/default_gauge_view.dart", + "description": "" + }, + { + "type": "sample", + "title": "Multiple axis", + "key": "multiple_axis", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/multiple_axis.dart", + "description": "" + }, + { + "type": "sample", + "title": "Label customization", + "key": "radiallabel_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/radiallabel_customization.dart", + "description": "" + }, + { + "type": "sample", + "title": "Tick customization", + "key": "tick_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/tick_customization.dart", + "description": "" + }, + { + "type": "sample", + "title": "Custom scale", + "key": "non_linearable", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/non_linearable.dart", + "description": "" + }, + { + "type": "sample", + "title": "Custom labels", + "key": "custom_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/custom_labels.dart", + "description": "" + }, + { + "type": "sample", + "title": "Range colors for axis", + "key": "range_colors", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/range_colors.dart", + "description": "" } ] }, { "type": "child", - "title": "Box and Whisker", + "title": "Pointers", + "displayType": "card", "subItems": [ { "type": "sample", - "title": "Box and Whisker chart", - "key": "box_whisker", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/box_whisker.dart", - "needsPropertyPanel": true + "title": "Range pointer", + "key": "range_pointer", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/multiple_ranges.dart", + "description": "" + }, + { + "type": "sample", + "title": "Multiple needle", + "key": "multiple_needle", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/multiple_needle.dart", + "description": "" + }, + { + "type": "sample", + "title": "Marker pointer", + "key": "radial_marker", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/radial_marker.dart", + "description": "" + }, + { + "type": "sample", + "title": "Text pointer", + "key": "text_pointer", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/text_pointer.dart", + "description": "" } ] }, { "type": "child", - "title": "Waterfall", + "title": "Range", "displayType": "card", "subItems": [ { "type": "sample", - "title": "Default waterfall chart", - "key": "water_fall", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/waterFall.dart" + "title": "Multiple ranges", + "key": "multiple_ranges", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/multiple_ranges.dart", + "description": "" }, { "type": "sample", - "title": "Vertical waterfall chart", - "key": "vertical_water_fall", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/other_series/vertical_waterfall.dart" + "title": "Range thickness", + "key": "range_thickness", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/range_thickness.dart", + "description": "" + }, + { + "type": "sample", + "title": "Range label", + "key": "range_datalabels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/range_datalabels.dart", + "description": "" } ] - } - ] - }, - { - "type": "child", - "title": "Data Source", - "displayType": "card", - "subItems": [ - { - "title": "List", - "key": "local_list_data", - "status": "New", - "description": "This sample demonstrates plotting the data which is stored as a list.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/data_binding/local_data.dart" }, - { - "title": "JSON", - "key": "local_json_data", - "status": "New", - "description": "This same demonstrates binding of JSON data to the chart. We saved the JSON data in the file 'chart_data.json' in the assets folder.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/data_binding/json_data.dart" - } - ] - }, - { - "type": "parent", - "title": "Axis Types", - "subItems": [ { "type": "child", - "title": "Numeric", + "title": "Gauge Annotation", "displayType": "card", "subItems": [ { "type": "sample", - "title": "Default numeric axis", - "key": "default_numeric_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/numeric_types/default_numeric_axis.dart", - "description": "", - "status": "", - "sourceLink": "https://www.google.com/search?q=india+vs+australia+odi+result+2019&oq=indian+vs+australia+odi+res&aqs=chrome.2.69i57j0l5.11336j1j4&sourceid=chrome&ie=UTF-8", - "sourceText": "www.google.com" + "title": "Direction compass", + "key": "direct_compass", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/direct_compass.dart", + "description": "" }, { "type": "sample", - "title": "Numeric axis with label format", - "key": "numeric_axis_with_label_format", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/numeric_types/numeric_axis_with_label_format.dart", - "description": "", - "status": "" + "title": "Text annotation", + "key": "text_annotation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/text_annotation.dart", + "description": "" }, { - "title": "Inversed numeric axis", - "key": "inversed_numeric_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/numeric_types/inversed_numeric_axis.dart", - "description": "", - "status": "", - "sourceLink": "https://www.indexmundi.com/g/g.aspx?c=us&v=121", - "sourceText": "www.indexmundi.com", - "needsPropertyPanel": true + "type": "sample", + "title": "Temparature tracker", + "key": "image_annotation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/image_annotation.dart", + "description": "" } ] }, { "type": "child", - "title": "Category", + "title": "Pointer Interaction", "displayType": "card", "subItems": [ { - "title": "Default category axis", - "key": "default_category_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/category_types/default_category_axis.dart", - "description": "", - "status": "" - }, - { - "title": "Arranged by index", - "key": "category_arranged_by_index", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/category_types/indexed_category_axis.dart", - "description": "By default, category data points will be arranged based on the x values. In this sample, you can arrange the data points based on the index value.", - "needsPropertyPanel": true + "type": "sample", + "title": "Radial slider", + "key": "radial_pointerdragging", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointer_interaction/radial_pointer_dragging.dart", + "description": "" }, { - "title": "Label placement", - "key": "category_label_placement", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/category_types/label_placement.dart", - "description": "", - "status": "", - "needsPropertyPanel": true + "type": "sample", + "title": "Radial range slider", + "key": "radial_slider", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointer_interaction/radial_slider.dart", + "description": "" } ] }, { "type": "child", - "title": "Date Time", + "title": "Pointer Animation", "displayType": "card", "subItems": [ { - "title": "Default Date time axis", - "key": "default_datetime_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/date_time_types/default_date_time_axis.dart", - "description": "", - "status": "", - "sourceLink": "https://www.x-rates.com/graph/?from=USD&to=INR&amount=1", - "sourceText": "www.x-rates.com" + "type": "sample", + "title": "Bounce out", + "key": "radial_bounce", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_bounce.dart", + "description": "" }, { - "title": "Date time axis with label format", - "key": "datetime_axis_with_label_format", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/date_time_types/date_time_axis_with_label_format.dart", - "description": "", - "status": "", - "sourceLink": "https://en.wikipedia.org/wiki/List_of_earthquakes_in_Indonesia", - "sourceText": "en.wikipedia.org" + "type": "sample", + "title": "Ease", + "key": "radial_easeanimation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_ease_animation.dart", + "description": "" + }, + { + "type": "sample", + "title": "Linear", + "key": "radial_linearanimation", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_linear_animation.dart", + "description": "" + }, + { + "type": "sample", + "title": "Ease in cric", + "key": "radial_easeincric", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_ease_incric.dart", + "description": "" + }, + { + "type": "sample", + "title": "Elastic out", + "key": "radial_elasticout", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_elastic_out.dart", + "description": "" + }, + { + "type": "sample", + "title": "Slow middle", + "key": "radial_slowmiddle", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_slow_middle.dart", + "description": "" + }, + { + "type": "sample", + "title": "Ease out back", + "key": "radial_easeout", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_ease_out.dart", + "description": "" } ] }, { "type": "child", - "title": "Logarithmic", - "displayType": "card", + "title": "Exporting", + "displayType": "tab", + "showInWeb": false, "subItems": [ { - "title": "Default logarithmic axis", - "key": "default_logarithmic_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/logarithmic_types/default_logarithmic_axis.dart", - "description": "", - "status": "" - }, - { - "title": "Inversed logarithmic axis", - "key": "inversed_logarithmic_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_types/logarithmic_types/inversed_logarithmic_axis.dart", - "description": "", - "status": "", - "sourceLink": "https://www.worldometers.info/world-population/population-by-country/", - "sourceText": "www.worldometers.info" + "type": "sample", + "title": "Export", + "key": "export_gauge", + "showInWeb": false, + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/export/export.dart" } ] } ] }, { - "type": "child", - "title": "Axis Features", + "title": "Funnel Chart", + "description": "Visualize the sequential data using funnel chart", + "image": "images/funnel.png", + "status": "", "displayType": "card", + "controlId": 5, "subItems": [ { - "title": "Opposed axes", - "key": "opposed_axes", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/opposed_axes/opposed_axes.dart", - "sourceLink": "https://www.statista.com/statistics/199983/us-vehicle-sales-since-1951/", - "sourceText": "www.statista.com" - }, - { - "title": "Handling labels collision", - "key": "handling_label_collision", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/handling_label_collision/handling_label_collision.dart", - "sourceLink": "https://en.wikipedia.org/wiki/List_of_men%27s_footballers_with_500_or_more_goals", - "sourceText": "en.wikipedia.org", - "needsPropertyPanel": true - }, - { - "title": "Edge label placement", - "key": "edgelabel_placement", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/edge_label_placement/edgelabel_placement.dart", - "sourceLink": "https://www.mycarhelpline.com/index.php?option=com_easyblog&view=entry&id=808&Itemid=91", - "sourceText": "www.mycarhelpline.com", - "needsPropertyPanel": true - }, - { - "title": "Multiple axis chart", - "key": "multiple_axis_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/multiple_axis_chart/multiple_axis_chart.dart", - "sourceLink": "https://www.accuweather.com/en/us/new-york-ny/10007/month/349727?monyr=5/01/2019", - "sourceText": "www.accuweather.com" + "title": "Default funnel chart", + "key": "default_funnel_chart", + "needsPropertyPanel": true, + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/default_funnel_chart.dart" }, { - "title": "Axis crossing", - "key": "axis_crossing", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/axis_crossing/axis_crossing.dart", + "title": "Funnel with smart labels", + "key": "funnel_with_smart_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart", "needsPropertyPanel": true }, { - "title": "Plot band", - "key": "plot_band", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/plot_band/plot_band.dart", - "needsPropertyPanel": true - }, + "title": "Funnel with legend", + "key": "funnel_with_legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/funnel_with_legend.dart" + } + ] + }, + { + "title": "Pyramid Chart", + "description": "Visualize the organized data using pyramid chart", + "image": "images/pyramid.png", + "status": "", + "displayType": "card", + "controlId": 4, + "subItems": [ { - "title": "Plot band recurrence", - "key": "plot_band_recurrence", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/plot_band/plot_band_recurrence.dart", - "needsPropertyPanel": true + "title": "Default pyramid chart", + "key": "default_pyramid_chart", + "needsPropertyPanel": true, + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart" }, { - "title": "Positioning axis labels", - "key": "positioning_axis_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/positioning_axis_label/positioning_axis_label.dart", + "title": "Pyramid with smart labels", + "key": "pyramid_with_smart_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart", + "sourceLink": "https://www.worldometers.info/world-population/population-by-country/", + "sourceText": "www.worldometers.info", "needsPropertyPanel": true }, { - "title": "Axis animation", - "key": "axis_animation", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/axis_features/axis_animation/axis_animation.dart", - "needsPropertyPanel": true + "title": "Pyramid with legend", + "key": "pyramid_with_legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/pyramid_with_legend.dart" } ] }, { - "type": "parent", - "title": "Series Features", + "title": "Maps", + "description": "Easily visualize data over a geographical area", + "image": "images/map.png", + "displayType": "tab", + "controlId": 7, + "status": "Updated", "subItems": [ { "type": "child", - "title": "Gradient", - "displayType": "card", - "subItems": [ - { - "title": "Horizontal gradient", - "key": "horizantal_gradient", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/gradients/horizantal_gradient.dart" - }, - { - "title": "Vertical gradient", - "key": "vertical_gradient", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/gradients/vertical_gradient.dart" - } - ] - }, - { - "type": "child", - "title": "Animation", - "displayType": "card", + "title": "Shape Layer", + "status": "Updated", + "displayType": "tab", "subItems": [ { - "title": "Series animation", - "key": "series_animation", + "type": "sample", + "title": "Range color mapping", "status": "Updated", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/animation/series_animation.dart" - }, - { - "title": "Line", - "key": "animation_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/line_series/animation_line_chart.dart" + "key": "range_color_mapping", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart" }, { - "title": "Column", - "key": "animation_column_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/column_series/animation_column_chart.dart" + "type": "sample", + "title": "Equal color mapping", + "status": "Updated", + "key": "equal_color_mapping", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart" }, { - "title": "Spline", - "key": "animation_spline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart" + "type": "sample", + "title": "Bubble", + "key": "bubble", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/bubble/bubble.dart" }, { - "title": "Area", - "key": "animation_area_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/area_series/animation_area_chart.dart" + "type": "sample", + "title": "Selection", + "key": "selection", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/selection/selection.dart" }, { - "title": "Bar", - "key": "animation_bar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart" + "type": "sample", + "title": "Marker", + "key": "marker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/marker/marker.dart" }, { - "title": "Bubble", - "key": "animation_bubble_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart" + "type": "sample", + "title": "Legend", + "status": "Updated", + "key": "legend", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/legend/legend.dart", + "needsPropertyPanel": true }, { - "title": "Scatter", - "key": "animation_scatter_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart" + "type": "sample", + "title": "Tooltip", + "key": "tooltip", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/tooltip/tooltip.dart" }, { - "title": "Step line", - "key": "animation_stepline_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart" + "type": "sample", + "title": "Zooming", + "status": "Updated", + "key": "zooming", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/zooming/zooming.dart" }, { - "title": "Range column", - "key": "animation_rangecolumn_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart" + "type": "sample", + "title": "Sublayer", + "status": "new", + "key": "sublayer", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/sublayer/sublayer.dart" } ] }, { "type": "child", - "title": "Marker", + "title": "Tile Layer", + "status": "New", "displayType": "tab", "subItems": [ { - "title": "Various marker shapes", - "key": "various_marker_shapes", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/marker/various_marker_shapes.dart" - } - ] - }, - { - "type": "child", - "title": "Data Label", - "displayType": "card", - "subItems": [ - { - "title": "Default data labels", - "key": "default_datalabels", + "type": "sample", + "title": "OSM", "status": "Updated", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/data_label/default_datalabels.dart", - "needsPropertyPanel": true + "key": "osm", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/osm/osm.dart" }, { - "title": "Data label template", - "status": "New", - "key": "datalabel_template", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/data_label/datalabel_template.dart", - "sourceLink": "https://www.broadbandsearch.net/blog/social-media-facts-statistics", - "sourceText": "www.broadbandsearch.net" - } - ] - }, - { - "type": "child", - "title": "Annotation", - "displayType": "card", - "subItems": [ + "type": "sample", + "title": "Bing Maps", + "key": "bing_map", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/bing_map/bing_map.dart" + }, { - "title": "Chart with annotation", - "key": "chart_with_annotation", - "description": "This sample renders the cartesian chart with annotation. A pie chart is rendered as an annotation here.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/annotation/chart_with_annotation.dart" + "type": "sample", + "title": "Arcs and Lines", + "status": "New", + "key": "arcs", + "description": "This sample demonstrates how the arc layer and the line layer can be used for denoting the air routes between different locations.", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/vector_layer/arcs.dart", + "needsPropertyPanel": true }, { - "title": "Chart with watermark", - "key": "chart_with_watermark", - "description": "In this sample, annotation is placed at the center of the chart with reduced opacity to form a watermark", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/annotation/chart_with_watermark.dart" + "type": "sample", + "title": "Polylines", + "status": "New", + "key": "polylines", + "description": "This sample demonstrates how the polyline layer can be used for denoting the road routes between two locations.", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/vector_layer/polylines.dart" } ] - }, + } + ] + }, + { + "title": "Circular ProgressBar", + "description": "Indicates the progress of a task with customizable visuals. Designed using Radial Gauge widget.", + "image": "images/circular_progress_bar.png", + "displayType": "tab", + "controlId": 8, + "subItems": [ { - "type": "child", - "title": "Sorting", - "displayType": "tab", - "subItems": [ - { - "title": "Sorting options", - "key": "sorting_options", - "description": "This sample depicts the sorting feature in a chart. The data points can be sorted in the ascending or descending order based on the x or y value.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/sorting/sorting_options.dart", - "sourceLink": "https://www.emporis.com/statistics/worlds-tallest-buildings", - "sourceText": "www.emporis.com", - "needsPropertyPanel": true - } - ] + "type": "sample", + "title": "Types", + "key": "progress_bar_types", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/types/types.dart" }, { - "type": "child", - "title": "Empty Points", - "displayType": "tab", - "subItems": [ - { - "title": "Chart with empty points", - "key": "chart_with_empty_points", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/series_features/empty_point/chart_with_empty_points.dart", - "needsPropertyPanel": true - } - ] + "type": "sample", + "title": "Determinate styles", + "key": "progress_bar_determinate_styles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/determinate_styles/determinate_styles.dart" + }, + { + "type": "sample", + "title": "Segment styles", + "showInWeb": false, + "key": "progress_bar_segment_styles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/segment_styles/segment_styles.dart" + }, + { + "type": "sample", + "title": "Track with marker", + "key": "progress_bar_track_with_markers", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/track_with_marker/track_with_marker.dart" + }, + { + "type": "sample", + "title": "Custom content", + "key": "progress_bar_custom_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/custom_labels/custom_labels.dart" + }, + { + "type": "sample", + "title": "Angles", + "key": "progress_bar_angles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/angles/angles.dart" } ] }, { - "type": "child", - "title": "Legend", - "displayType": "card", + "title": "Spark/Micro Charts", + "description": "Light-weight line, area, column and win-loss charts which fits in a very small area.", + "image": "images/sparkline_winloss.png", + "displayType": "tab", + "status": "New", + "controlId": 9, "subItems": [ { - "title": "Chart with customized legend", - "key": "chart_with_customized_legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/legend/chart_with_customized_legend.dart" + "type": "sample", + "title": "Chart Types", + "key": "sparkline_series", + "codeLink": "" + }, + { + "type": "sample", + "title": "Axis Types", + "key": "sparkline_axis", + "codeLink": "" }, { - "title": "Legend with various options", - "key": "cartesian_legend_various_options", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/legend/cartesian_legend_various_options.dart", + "type": "sample", + "title": "Customization", + "key": "sparkline_customization", + "description" : "This example depicts various useful features available in Spark charts. Enable the marker, data label, trackball, range band and also change the axis value with the options in the properties panel.", "needsPropertyPanel": true + }, + { + "type": "sample", + "title": "Sparkline in Grid", + "key": "sparkline_grid", + "description" : "This example depicts the rendering of Syncfusion Flutter Spark Charts in the cells of the Syncfusion Flutter Data Grid widget.", + "codeLink": "" + }, + { + "type": "sample", + "title": "Live Update", + "key": "sparkline_live_update", + "codeLink": "" } ] - }, - { - "type": "parent", - "title": "User Interactions", + } + ] + }, + { + "categoryName": "Grids", + "mobileCategoryId": 1, + "webCategoryId": 2, + "controlList": [ + { + "title": "DataGrid", + "description": "Displays large amounts of data with different data types in a tabular view", + "image": "images/Datagrid.png", + "status": "Preview", + "displayType": "tab", + "controlId": 1, "subItems": [ { "type": "child", - "title": "Tooltip", - "displayType": "card", + "title": "Getting Started", "subItems": [ { - "title": "Default tooltip", - "key": "default_tooltip", - "description": "Tooltip is enabled in this sample and to see the tooltip in action, tap the data points in mobile and hover the data points in the web.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/tooltip/default_tooltip.dart", - "sourceLink": "https://www.indexmundi.com/g/g.aspx?v=72&c=gm&c=mx&l=en", - "sourceText": "www.indexmundi.com" - }, + "type": "sample", + "title": "Getting Started", + "key": "getting_started_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/getting_started/datagrid_getting_started.dart" + } + ] + }, + { + "type": "child", + "title": "Data Source", + "subItems": [ { - "title": "Tooltip position", - "description": "By changing the options, the tooltip can be made to display in the fixed location or at the pointer location itself.", - "key": "tooltip_position", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/tooltip/tooltip_position.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "List", + "key": "list_data_source_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/data_source/datagrid_list_data_source.dart" }, { - "title": "Tooltip template", - "description": "This example displays a custom widget as the tooltip. To see the tooltip template, tap the data points in mobile and hover the data points in the web.", - "status": "New", - "key": "tooltip_template", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/tooltip/tooltip_template.dart", - "sourceLink": "https://www.broadbandsearch.net/blog/social-media-facts-statistics", - "sourceText": "www.broadbandsearch.net" + "type": "sample", + "title": "JSON", + "key": "json_data_source_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/data_source/datagrid_json_data_source.dart" } ] }, { "type": "child", - "title": "Zooming and Panning", - "displayType": "card", + "title": "Columns", "subItems": [ { - "title": "Pinch zooming", - "key": "pinch_zooming", - "status": "Updated", - "description": "Pinch zooming and panning is enabled in this sample. Pinch the chart to zoom in and swipe the zoomed chart to pan it. In the web, mouse wheel zooming is also enabled.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/zooming_panning/pinch_zooming/pinch_zooming.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Column Types", + "key": "column_types_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/columns/datagrid_column_types.dart" }, { - "title": "Selection zooming", - "key": "selection_zooming", - "showInWeb": false, - "description": "This sample depicts the working of selection zooming. Long press and drag on the chart to select the region for zooming.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/zooming_panning/selection_zooming/selection_zooming.dart" + "type": "sample", + "title": "Custom Header", + "key": "custom_header_datagrid", + "description": "This sample showcases how to load a widget to a header cell using the headerCellBuilder property. In this sample, the dropdown icon is loaded along with the text to the header cell. If you click the header cell, the popup menu options will be shown. You can sort that specific column or freeze it.", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/columns/datagrid_custom_header.dart" }, { - "title": "Zooming with custom buttons", - "key": "zooming_with_custom_buttons", - "showInWeb": true, - "description": "This sample demonstrates zooming and panning with custom buttons.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/zooming_panning/zooming_with_custom_button/zooming_with_custom_buttons.dart" + "type": "sample", + "title": "Stacked Header", + "key": "stacked_header_datagrid", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/columns/datagrid_stacked_header.dart" } ] }, { "type": "child", - "title": "Crosshair", - "displayType": "tab", + "title": "Sorting", "subItems": [ { - "title": "Chart with crosshair", - "key": "chart_with_crosshair", - "description": "The crosshair is enabled in this sample. Tap the chart to show the crosshair and drag the chart to constantly change the crosshair position. On the web, you can move the cursor over the chart area to display the crosshair.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/crosshair/chart_with_crosshair.dart", + "type": "sample", + "title": "Sorting", + "description": "This sample demonstrates how to sort one or more columns. In the Web platform, you can sort multiple columns by tapping the column header with the CTRL key where as in a mobile platform you can tap the column headers. It also provides some additional functionalities like Tri-state sorting and displaying sort numbers that indicate the sort order.", + "key": "sorting_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/sorting/datagrid_sorting.dart", "needsPropertyPanel": true } ] }, { "type": "child", - "title": "Trackball", - "displayType": "tab", + "title": "Selection", "subItems": [ { - "title": "Chart with trackball", - "key": "chart_with_trackball", - "status": "Updated", - "description": "The trackball is enabled in this sample. Tap the chart to show the trackball and drag the chart to change the position of the trackball continuously. On the web, you can move the cursor over the chart area to display the trackball.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/trackball/chart_with_trackball.dart", + "type": "sample", + "title": "Selection", + "key": "selection_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/selection/datagrid_selection.dart", "needsPropertyPanel": true } ] }, { "type": "child", - "title": "Selection", - "displayType": "card", + "title": "Freeze Panes", "subItems": [ { - "title": "Selection modes", - "key": "selection_modes", - "description": "This sample depicts the selection feature in the chart. Tap the data point to select or unselect in mobile and web click the data points.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/selection/selection_modes.dart", + "type": "sample", + "title": "Freeze Panes", + "key": "freeze_panes_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart" + } + ] + }, + { + "type": "child", + "title": "Auto Row Height", + "subItems": [ + { + "type": "sample", + "title": "Auto Row Height", + "description": "This sample showcases the auto row height feature of the DataGrid that improves readability of the content. DataGrid provides support to change the height of the row based on its content that changes at run time for all columns or certain columns.", + "key": "auto_row_height_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/auto_row_height/datagrid_auto_row_height.dart" + } + ] + }, + { + "type": "child", + "title": "Appearance", + "subItems": [ + { + "type": "sample", + "title": "Styling", + "key": "styling_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/apperance/styling/datagrid_styling.dart", "needsPropertyPanel": true }, { - "title": "Dynamic selection", - "key": "selection_index", - "status": "New", - "description": "This sample depicts the dynamic selection feature achieved using the 'selectDataPoints' public method. Choose the series and point index from the dropdown to select or unselect the data points.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/selection/selection_index.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Conditional Styling", + "key": "conditional_styling_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart" } ] }, { "type": "child", - "title": "Events", - "status": "New", - "displayType": "tab", + "title": "Load More Behavior", "subItems": [ { - "title": "Events", - "key": "events", + "type": "sample", + "title": "Infinite Scrolling", + "key": "load_more_infinite_scrolling_datagrid", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/loadmore/datagrid_infinite_scrolling.dart" + }, + { + "type": "sample", + "title": "Load More", + "key": "load_more_datagrid", "status": "New", - "description": "Various chart callbacks are enabled in this example. It displays the event trace details while rendering and on performing various interactions.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/user_interactions/events.dart" + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/loadmore/datagrid_load_more.dart" } ] - } - ] - }, - { - "type": "child", - "title": "Trendlines", - "displayType": "card", - "subItems": [ + }, { - "title": "Default rendering", - "key": "default_trendlines_with_options", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/trendline/default_trendline.dart", - "needsPropertyPanel": true + "type": "child", + "title": "Paging", + "subItems": [ + { + "type": "sample", + "title": "Paging", + "key": "paging_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/paging/datagrid_paging.dart" + } + ] }, { - "title": "Trendline forecast", - "key": "trendline_forecast_with_options", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/trendline/trendline_forecast_options.dart", - "sourceLink": "https://www.ofx.com/en-au/forex-news/historical-exchange-rates/yearly-average-rates/", - "sourceText": "www.ofx.com", - "needsPropertyPanel": true + "type": "child", + "title": "Real-Time Update", + "subItems": [ + { + "type": "sample", + "title": "Real-Time Update", + "key": "real_time_update_datagrid", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart" + } + ] } ] - }, - { - "type": "child", - "title": "Technical Indicators", - "displayType": "card", + } + ] + }, + { + "categoryName": "Calendar", + "mobileCategoryId": 3, + "webCategoryId": 3, + "controlList": [ + { + "title": "Event Calendar", + "description": "Allows you to easily visualize and schedule appointments", + "image": "images/calendar.png", + "status": "Updated", + "displayType": "tab", + "controlId": 1, "subItems": [ { - "title": "Accumulation Distribution", - "key": "accumulation_distribution", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/ad_indicator.dart" + "type": "sample", + "title": "Getting Started", + "status": "Updated", + "key": "getting_started_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/getting_started/getting_started.dart", + "needsPropertyPanel": true }, { - "title": "ATR Indicator", - "key": "atr_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/atr_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Scheduling", + "key": "appointment_editor_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/appointment_editor/appointment_editor.dart" }, { - "title": "Bollinger Indicator", - "key": "bollinger_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/bollinger_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Recurrence", + "key": "recurrence_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/recurrence/recurrence.dart" }, { - "title": "EMA Indicator", - "key": "ema_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/ema_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Special Regions", + "status": "Updated", + "key": "special_regions_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/special_regions/special_regions.dart" }, { - "title": "Momentum Indicator", - "key": "momentum_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/momentum_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Timeline views", + "key": "timeline_views_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/timeline_views/timeline_views.dart" }, { - "title": "RSI Indicator", - "key": "rsi_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/rsi_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Event Customization", + "status": "New", + "key": "customization_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/customization.dart" }, { - "title": "SMA Indicator", - "key": "sma_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/sma_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Schedule View", + "key": "schedule_view_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/schedule_view/schedule_view.dart" }, { - "title": "Stochastic Indicator", - "key": "stochastic_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/stochastic_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Resource View", + "key": "shift_scheduler", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/shift_scheduler/shift_scheduler.dart" }, { - "title": "TMA Indicator", - "key": "tma_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/tma_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Month Agenda View", + "key": "agenda_view_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/agenda_view/agenda_view.dart" }, { - "title": "MACD Indicator", - "key": "macd_indicator", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/technical_indicators/macd_indicator.dart", - "needsPropertyPanel": true + "type": "sample", + "title": "Fare Calendar", + "key": "air_fare_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/airfare/airfare.dart" + }, + { + "type": "sample", + "title": "Heat Map", + "key": "heat_map_calendar", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/heatmap/heatmap.dart" } ] }, { - "type": "parent", - "title": "Real-time Charts", + "title": "Date Range Picker", + "description": "Allows to easily select dates or range of dates", + "image": "images/Date_range_picker.png", + "status": "Preview", + "displayType": "tab", + "controlId": 2, "subItems": [ { - "type": "child", - "title": "Live Updates", - "displayType": "card", - "subItems": [ - { - "title": "Real-time spline chart", - "key": "real_time_spline_chart", - "description": "This sample demonstrates the live chart. A new data point is added at the end and a point is removed at the start in certain time interval continuously.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/live_update/real_time_spline_chart.dart" - }, - { - "title": "Real-time line chart", - "key": "real_time_line_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/live_update/real_time_line_chart.dart" - }, - { - "title": "Vertical live chart", - "key": "vertical_live_chart", - "description": "This sample demonstrates the live chart. A new data point is added at the end in certain time interval continuously.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/live_update/vertical_live_chart.dart" - } - ] + "type": "sample", + "title": "Getting Started", + "key": "getting_started_date_picker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/getting_started/date_picker_getting_started.dart", + "needsPropertyPanel": true }, { - "type": "child", - "title": "Add/Remove Data", - "displayType": "card", - "subItems": [ - { - "title": "Add/remove points", - "key": "add_remove_points", - "description": "Add or remove the data points from a chart using the buttons placed in the sample.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_points.dart" - }, - { - "title": "Add/remove series", - "key": "add_remove_series", - "description": "Add or remove series from the chart using the buttons placed in the sample.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_series.dart" - } - ] + "type": "sample", + "title": "Hijri Calendar", + "key": "hijri_calendar_date_picker", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/hijri_calendar/hijri_calendar.dart", + "needsPropertyPanel": true }, { - "type": "child", - "title": "Update Data Source", - "showInWeb": true, - "displayType": "tab", - "subItems": [ - { - "title": "Update data source", - "key": "update_data_source", - "showInWeb": true, - "description": "The data source bound to this chart can be changed with random values dynamically, by tapping the button placed in this sample.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/dynamic_updates/update_data_source/update_data_source.dart" - } - ] + "type": "sample", + "title": "Flight Booking", + "key": "popup_picker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/popup_picker/popup_picker.dart" + }, + { + "type": "sample", + "title": "Blackout Dates", + "key": "blackout_picker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/blackout_dates/blackout_date_picker.dart" + }, + { + "type": "sample", + "title": "Cell Customization", + "key": "customized_picker", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/customization_picker/customized_date_picker.dart" + }, + { + "type": "sample", + "title": "Vertical Calendar", + "key": "vertical_calendar", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/date_picker/vertical_calendar/vertical_calendar.dart" } ] - }, + } + ] + }, + { + "categoryName": "Viewer", + "mobileCategoryId": 4, + "webCategoryId": 4, + "showInWeb": false, + "controlList": [ { - "type": "child", - "title": "Exporting", + "title": "PDF Viewer", + "description": "View the PDF document seamlessly and efficiently", + "image": "images/pdf_viewer.png", "displayType": "tab", "showInWeb": false, + "status": "Preview", + "controlId": 1, "subItems": [ { - "title": "Export", - "key": "exporting_chart", + "type": "sample", + "title": "Getting Started", + "key": "pdf_viewer_getting_started", + "status": "Updated", "showInWeb": false, - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/export/export.dart" + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart" + }, + { + "type": "sample", + "title": "Custom Toolbar", + "key": "pdf_viewer_custom_toolbar", + "status": "Updated", + "showInWeb": false, + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart" } ] } ] }, { - "title": "Circular Charts", - "description": "Visualize the data using pie, doughnut, and radial bar charts", - "image": "images/circle_series.png", - "status": "Updated", - "category": "Data Visualization", - "controlId": 2, - "subItems": [ - { - "type": "parent", - "title": "Chart Types", + "categoryName": "File Formats", + "mobileCategoryId": 5, + "webCategoryId": 5, + "controlList": [ + { + "title": "PDF", + "description": "Create PDF document with text, images and tables", + "image": "images/pdf.png", + "status": "Preview", + "displayType": "tab", + "controlId": 1, "subItems": [ { - "type": "child", - "title": "Pie", - "displayType": "card", - "subItems": [ - { - "title": "Default pie chart", - "key": "default_pie_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/pie_series/default_pie_chart.dart" - }, - { - "title": "Pie with various radius", - "key": "pie_with_various_radius", - "description": "This sample demonstrates the pie chart with different radius for all the slices. The radius of a slice is based on a numeric value.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/pie_series/pie_with_various_radius.dart" - }, - { - "title": "Semi-pie chart", - "key": "semi_pie_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/pie_series/semi_pie_chart.dart", - "sourceLink": "https://data.worldbank.org/indicator/sp.rur.totl.zs", - "sourceText": "data.worldbank.org", - "needsPropertyPanel": true - }, - { - "title": "Pie with grouping", - "key": "pie_with_grouping", - "description": "This sample demonstrates the grouping functionality in a pie chart. Data points’ values less than the specified value can be grouped together.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/pie_series/pie_with_grouping.dart" - }, - { - "title": "Pie with smart labels", - "key": "pie_with_smart_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/pie_series/pie_with_smart_labels.dart", - "needsPropertyPanel": true - } - ] + "type": "sample", + "title": "Invoice", + "key": "invoice", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/invoice.dart" }, - { - "type": "child", - "title": "Doughnut", - "displayType": "card", - "subItems": [ - { - "title": "Default doughnut chart", - "key": "default_doughnut_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/doughnut_series/default_doughnut_chart.dart", - "sourceLink": "https://www.pngkit.com/view/u2q8y3w7r5y3t4o0_composition-of-ocean-water-earths-oceans-elements-percentage/", - "sourceText": "www.pngkit.com" - }, - { - "title": "Doughnut with center elevation", - "key": "doughnut_with_center_elevation", - "description": "The doughnut chart is rendered with elevated circle at the center using annotations feature in this sample.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_center_elevation.dart" - }, - { - "title": "Doughnut with rounded corners", - "key": "doughnut_with_rounded_corners", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_rounded_corners.dart" - }, - { - "title": "Doughnut with color mapping", - "key": "doughnut_with_color_mapping", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_color_mapping.dart" - }, - { - "title": "Semi-doughnut chart", - "key": "semi_doughnut_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/doughnut_series/semi_doughnut_chart.dart", - "needsPropertyPanel": true - } - ] - }, - { - "type": "child", - "title": "Radial Bar", - "displayType": "card", - "subItems": [ - { - "title": "Default radial bar chart", - "key": "default_radialbar_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/radialbar_series/default_radialbar_chart.dart" - }, - { - "title": "Radial bar with legend", - "key": "radialbar_with_legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/radialbar_series/radialbar_with_legend.dart" - }, - { - "title": "Customized radial bar chart", - "key": "customized_radialbar_chart", - "description": "This sample renders the radial bar chart with annotation at the center and templated legend.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/radialbar_series/customized_radialbar_chart.dart" - } - ] - } - ] - }, - { - "type": "child", - "title": "Legend", - "displayType": "card", - "subItems": [ - { - "title": "Chart with legend", - "key": "chart_with_legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/legend/chart_with_legend.dart" - }, - { - "title": "Legend with various options", - "key": "legend_with_various_options", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/legend/legend_with_various_options.dart", - "needsPropertyPanel": true - } - ] - }, - { - "type": "child", - "title": "User Interactions", - "displayType": "card", - "subItems": [ - { - "title": "Tooltip", - "key": "pie_tooltip_position", - "description": "By changing the options, the tooltip can be made to display in the fixed location or at the pointer location itself.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/tooltip/pie_tooltip_position.dart", - "needsPropertyPanel": true - }, - { - "title": "Selection", - "key": "circular_selection", - "description": "This sample depicts the selection feature in the chart. Tap the data point to select or unselect in mobile and web click the data points.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/selection/circular_selection.dart", - "needsPropertyPanel": true - }, - { - "title": "Dynamic selection", - "key": "circular_dynamic_selection", - "status": "New", - "description": "This sample depicts the dynamic selection feature achieved using the 'selectDataPoints' public method. Choose the point index from the dropdown to select or unselect the data points.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/user_interactions/selection/dynamic_circular_selection.dart", - "needsPropertyPanel": true - } - ] - }, - { - "type": "child", - "title": "Exporting", - "displayType": "tab", - "showInWeb": false, - "subItems": [ - { - "title": "Export", - "key": "export_circular_chart", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/circular_charts/export/export.dart", - "showInWeb": false - } - ] - } - ] - }, - { - "title": "Event Calendar", - "description": "Allows you to easily visualize and schedule appointments", - "image": "images/calendar.png", - "status": "Updated", - "category": "Calendar", - "displayType": "tab", - "controlId": 7, - "subItems": [ - { - "type": "sample", - "title": "Getting Started", - "status": "Updated", - "key": "getting_started_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/getting_started/getting_started.dart", - "needsPropertyPanel": true - }, - { - "type": "sample", - "title": "Scheduling", - "key": "appointment_editor_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/appointment_editor/appointment_editor.dart" - }, - { - "type": "sample", - "title": "Recurrence", - "key": "recurrence_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/recurrence/recurrence.dart" - }, - { - "type": "sample", - "title": "Special Regions", - "key": "special_regions_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/special_regions/special_regions.dart" - }, - { - "type": "sample", - "title": "Timeline views", - "status": "Updated", - "key": "timeline_views_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/timeline_views/timeline_views.dart" - }, - { - "type": "sample", - "title": "Schedule View", - "status": "Updated", - "key": "schedule_view_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/schedule_view/schedule_view.dart" - }, - { - "type": "sample", - "title": "Resource View", - "status": "New", - "key": "shift_scheduler", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/shift_scheduler/shift_scheduler.dart" - }, - { - "type": "sample", - "title": "Month Agenda View", - "key": "agenda_view_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/agenda_view/agenda_view.dart" - }, - { - "type": "sample", - "title": "Fare Calendar", - "status": "New", - "key": "air_fare_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/airfare/airfare.dart" - }, - { - "type": "sample", - "title": "Heat Map", - "status": "New", - "key": "heat_map_calendar", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/calendar/heatmap/heatmap.dart" - } - ] - }, - { - "title": "Radial Gauge", - "status": "Updated", - "description": "Visualize one or multiple measures on a circular scale with pointers and ranges", - "image": "images/circle_gauge.png", - "category": "Data Visualization", - "controlId": 3, - "subItems": [ - { - "type": "child", - "title": "Showcase", - "displayType": "card", - "subItems": [ - { - "type": "sample", - "title": "Gauge compass", - "key": "gauge_compass", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/gauge_compass.dart", - "description": "" - }, - { - "type": "sample", - "title": "Clock", - "key": "clock_sample", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/clock_sample.dart", - "description": "" - }, - { - "type": "sample", - "title": "Temparature monitor", - "key": "gauge_overview", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/gauge_overview.dart", - "description": "" - }, - { - "type": "sample", - "title": "Distance tracker", - "key": "distance_tracker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/gauge/showcase/distance_tracker.dart", - "description": "" - } - ] - }, - { - "type": "child", - "title": "Axis", - "displayType": "card", - "subItems": [ { "type": "sample", - "title": "Default view", - "key": "default_gauge_view", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/default_gauge_view.dart", - "description": "" + "title": "Course Completion Certificate", + "key": "certificate", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/certificate.dart" }, { "type": "sample", - "title": "Multiple axis", - "key": "multiple_axis", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/multiple_axis.dart", - "description": "" + "title": "Headers and Footers", + "key": "header_and_footer", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/header_and_footer.dart" }, { "type": "sample", - "title": "Label customization", - "key": "radiallabel_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/radiallabel_customization.dart", - "description": "" + "title": "Annotations", + "key": "annotations", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/annotations.dart" }, { "type": "sample", - "title": "Tick customization", - "key": "tick_customization", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/tick_customization.dart", - "description": "" + "title": "Text Extraction", + "key": "text_extraction", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/text_extraction.dart" }, { "type": "sample", - "title": "Custom scale", - "key": "non_linearable", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/non_linearable.dart", - "description": "" + "title": "Find Text", + "key": "find_text", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/find_text.dart" }, - { + { "type": "sample", - "title": "Custom labels", - "key": "custom_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/custom_labels.dart", - "description": "" + "title": "Encryption", + "key": "encryption", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/encryption.dart" }, { "type": "sample", - "title": "Range colors for axis", - "key": "range_colors", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/axis_feature/range_colors.dart", - "description": "" + "title": "Conformance", + "key": "conformance", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf/conformance.dart" } ] }, { - "type": "child", - "title": "Pointers", - "displayType": "card", + "title": "XlsIO", + "description": "Create Excel documents with text, numbers, cell formatting, formulas, charts, images, and more", + "image": "images/xlsio.png", + "status": "Preview", + "displayType": "tab", + "controlId": 2, "subItems": [ { "type": "sample", - "title": "Range pointer", - "key": "range_pointer", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/multiple_ranges.dart", - "description": "" - }, - { - "type": "sample", - "title": "Multiple needle", - "key": "multiple_needle", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/multiple_needle.dart", - "description": "" - }, - { - "type": "sample", - "title": "Marker pointer", - "key": "radial_marker", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/radial_marker.dart", - "description": "" + "title": "Expenses Report", + "key": "expenses_report", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/expenses_report/expenses_report.dart" }, { "type": "sample", - "title": "Text pointer", - "key": "text_pointer", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointers/text_pointer.dart", - "description": "" - } - ] - }, - { - "type": "child", - "title": "Range", - "displayType": "card", - "subItems": [ - { - "type": "sample", - "title": "Multiple ranges", - "key": "multiple_ranges", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/multiple_ranges.dart", - "description": "" + "title": "Invoice", + "key": "invoice_excel", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/invoice/invoice.dart" }, { "type": "sample", - "title": "Range thickness", - "key": "range_thickness", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/range_thickness.dart", - "description": "" + "title": "Yearly Sales", + "key": "yearly_sales", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/yearly_sales/yearly_sales.dart" }, { "type": "sample", - "title": "Range label", - "key": "range_datalabels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/ranges/range_datalabels.dart", - "description": "" + "title": "Balance Sheet", + "key": "balance_sheet", + "status": "New", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/balance_sheet/balance_sheet.dart" } ] - }, - { - "type": "child", - "title": "Gauge Annotation", - "displayType": "card", + } + ] + }, + { + "categoryName": "Sliders", + "mobileCategoryId": 6, + "webCategoryId": 6, + "controlList": [ + { + "title": "Slider", + "description": "Select a date or numeric value", + "image": "images/slider.png", + "displayType": "tab", + "controlId": 1, "subItems": [ { - "type": "sample", - "title": "Direction compass", - "key": "direct_compass", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/direct_compass.dart", - "description": "" - }, - { - "type": "sample", - "title": "Text annotation", - "key": "text_annotation", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/text_annotation.dart", - "description": "" + "type": "child", + "title": "Basic features", + "status": "New", + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Default", + "key": "default_slider", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/default_slider.dart", + "description": "" + }, + { + "type": "sample", + "title": "Divisors, labels, and ticks", + "key": "slider_divisor_label_tick", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart", + "description": "" + }, + { + "type": "sample", + "title": "Date interval", + "key": "slider_date_interval", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_date_interval.dart", + "description": "" + }, + { + "type": "sample", + "title": "Tooltip types", + "key": "slider_tooltip_type", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart", + "description": "" + }, + { + "type": "sample", + "title": "Step", + "key": "slider_step", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/slider/basic_features/slider_step.dart", + "description": "" + } + ] }, { - "type": "sample", - "title": "Temparature tracker", - "key": "image_annotation", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/annotation/image_annotation.dart", - "description": "" + "type": "child", + "status": "New", + "title": "Customization", + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Thumb icon customization", + "key": "thumb_icon_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart" + }, + { + "type": "sample", + "title": "Size customization", + "key": "slider_size_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart" + }, + { + "type": "sample", + "title": "Color customization", + "key": "slider_color_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart" + }, + { + "type": "sample", + "title": "Shape customization", + "key": "slider_shape_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/slider/customization/shape_customization/slider_shape_customization.dart" + } + ] } ] }, { - "type": "child", - "title": "Pointer Interaction", - "displayType": "card", + "title": "Range Slider", + "description": "Select a date or numeric range", + "image": "images/range_slider.png", + "controlId": 2, "subItems": [ { - "type": "sample", - "title": "Radial slider", - "key": "radial_pointerdragging", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointer_interaction/radial_pointerdragging.dart", - "description": "" + "type": "child", + "title": "Basic features", + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Default", + "key": "range_slider_default_appearance", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart", + "description": "" + }, + { + "type": "sample", + "title": "Divisors, labels, and ticks", + "key": "range_slider_divisor_label_tick", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_divisor_label_tick.dart", + "description": "" + }, + { + "type": "sample", + "title": "Date interval", + "key": "range_slider_date_time_label", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart", + "description": "" + }, + { + "type": "sample", + "title": "Tooltip types", + "key": "range_slider_tooltip_type", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart", + "description": "" + }, + { + "type": "sample", + "title": "Step", + "key": "range_slider_step", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart", + "description": "" + }, + { + "type": "sample", + "title": "Interval selection", + "key": "range_slider_interval_selection", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart", + "description": "" + } + ] }, { - "type": "sample", - "title": "Radial range slider", - "key": "radial_slider", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/pointer_interaction/radial_slider.dart", - "description": "" + "type": "child", + "title": "Customization", + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Thumb icon customization", + "key": "range_slider_thumb_icon_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart" + }, + { + "type": "sample", + "title": "Size customization", + "key": "size_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart" + }, + { + "type": "sample", + "title": "Color customization", + "key": "color_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/color_customization/color_customization.dart" + }, + { + "type": "sample", + "title": "Shape customization", + "key": "shape_customization", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/sliders/range_slider/customization/shape_customization/shape_customization.dart" + } + ] } ] }, { - "type": "child", - "title": "Pointer Animation", - "displayType": "card", + "title": "Range Selector", + "description": "Visualize data and select a date or numeric range", + "image": "images/range_selector.png", + "displayType": "tab", + "controlId": 3, "subItems": [ { "type": "sample", - "title": "Bounce out", - "key": "radial_bounce", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_bounce.dart", - "description": "" - }, - { - "type": "sample", - "title": "Ease", - "key": "radial_easeanimation", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_easeanimation.dart", - "description": "" - }, - { - "type": "sample", - "title": "Linear", - "key": "radial_linearanimation", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_linearanimation.dart", - "description": "" + "title": "Default", + "key": "range_selector_default_appearance", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_default_appearance.dart" }, { "type": "sample", - "title": "Ease in cric", - "key": "radial_easeincric", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_easeincric.dart", - "description": "" + "title": "Selection", + "key": "range_selector_with_selection", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_selection.dart" }, { "type": "sample", - "title": "Elastic out", - "key": "radial_elasticout", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_elasticout.dart", - "description": "" + "title": "Zooming", + "key": "range_selector_with_zooming", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_zooming.dart", + "needsPropertyPanel": true }, { "type": "sample", - "title": "Slow middle", - "key": "radial_slowmiddle", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_slowmiddle.dart", - "description": "" + "title": "Histogram Chart", + "key": "range_selector_with_histogram_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart" }, { "type": "sample", - "title": "Ease out back", - "key": "radial_easeout", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/animation/radial_easeout.dart", - "description": "" + "title": "Bar Chart", + "key": "range_selector_with_bar_chart", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart" } ] }, { - "type": "child", - "title": "Exporting", + "title": "Radial Slider", + "description": "Selects a numeric value in a radial scale. Designed using Radial Gauge widget.", + "image": "images/radial_slider.png", + "status": "Updated", + "category": "Sliders", "displayType": "tab", - "showInWeb": false, + "controlId": 4, "subItems": [ { - "type": "sample", - "title": "Export", - "key": "export_gauge", - "showInWeb": false, + "type": "child", + "title": "Basic Features", "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/gauge/export/export.dart" - } - ] - } - ] - }, - { - "title": "Funnel Chart", - "description": "Visualize the sequential data using funnel chart", - "image": "images/funnel.png", - "status": "", - "displayType": "card", - "category": "Data Visualization", - "controlId": 5, - "subItems": [ - { - "title": "Default funnel chart", - "key": "default_funnel_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/default_funnel_chart.dart" - }, - { - "title": "Funnel with smart labels", - "key": "funnel_with_smart_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart", - "needsPropertyPanel": true - }, - { - "title": "Funnel with legend", - "key": "funnel_with_legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/funnel_charts/funnel_with_legend.dart" - } - ] - }, - { - "title": "Pyramid Chart", - "description": "Visualize the organized data using pyramid chart", - "image": "images/pyramid.png", - "status": "", - "displayType": "card", - "category": "Data Visualization", - "controlId": 4, - "subItems": [ - { - "title": "Default pyramid chart", - "key": "default_pyramid_chart", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart" - }, - { - "title": "Pyramid with smart labels", - "key": "pyramid_with_smart_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart", - "sourceLink": "https://www.worldometers.info/world-population/population-by-country/", - "sourceText": "www.worldometers.info", - "needsPropertyPanel": true - }, - { - "title": "Pyramid with legend", - "key": "pyramid_with_legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/chart/pyramid_charts/pyramid_with_legend.dart" - } - ] - }, - { - "title": "DataGrid", - "description": "Displays large amounts of data with different data types in a tabular view", - "image": "images/Datagrid.png", - "category": "Grids", - "status": "Preview", - "displayType": "tab", - "controlId": 0, - "subItems": [ - { - "type": "child", - "title": "Getting Started", - "subItems": [ - { - "type": "sample", - "title": "Getting Started", - "key": "getting_started_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/getting_started/datagrid_getting_started.dart" - } - ] - }, - { - "type": "child", - "title": "Data Source", - "subItems": [ - { - "type": "sample", - "title": "List", - "status": "New", - "key": "list_data_source_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/data_source/datagrid_list_data_source.dart" - }, - { - "type": "sample", - "title": "JSON", - "status": "New", - "key": "json_data_source_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/data_source/datagrid_json_data_source.dart" - } - ] - }, - { - "type": "child", - "title": "Columns", - "subItems": [ - { - "type": "sample", - "title": "Column Types", - "key": "column_types_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/columns/datagrid_column_types.dart" + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "State", + "key": "radial_slider_state", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/basic_features/state/radial_slider_state.dart", + "description": "", + "needsPropertyPanel": true + }, + { + "type": "sample", + "title": "Labels and Ticks", + "key": "radial_slider_ticks_and_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/basic_features/labels_and_ticks/radial_slider_labels_And_ticks.dart", + "description": "" + }, + { + "type": "sample", + "title": "Angles", + "key": "radial_slider_angles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/basic_features/angles/radial_slider_angles.dart", + "description": "" + } + ] }, { - "type": "sample", - "title": "Custom Header", - "key": "custom_header_datagrid", - "status": "New", - "description": "This sample showcases how to load a widget to a header cell using the headerCellBuilder property. In this sample, the dropdown icon is loaded along with the text to the header cell. If you click the header cell, the popup menu options will be shown. You can sort that specific column or freeze it.", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/columns/datagrid_custom_header.dart" - } - ] - }, - { - "type": "child", - "title": "Sorting", - "subItems": [ - { - "type": "sample", - "title": "Sorting", - "description": "This sample demonstrates how to sort one or more columns. In the Web platform, you can sort multiple columns by tapping the column header with the CTRL key where as in a mobile platform you can tap the column headers. It also provides some additional functionalities like Tri-state sorting and displaying sort numbers that indicate the sort order.", - "key": "sorting_datagrid", - "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/sorting/datagrid_sorting.dart", - "needsPropertyPanel": true - } - ] - }, - { - "type": "child", - "title": "Selection", - "subItems": [ - { - "type": "sample", - "title": "Selection", - "key": "selection_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/selection/datagrid_selection.dart", - "needsPropertyPanel": true - } - ] - }, - { - "type": "child", - "title": "Freeze Panes", - "subItems": [ - { - "type": "sample", - "title": "Freeze Panes", - "key": "freeze_panes_datagrid", + "type": "child", + "title": "Customization", "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart" + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Styles", + "key": "radial_slider_styles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/customization/styles/radial_slider_styles.dart", + "description": "" + }, + { + "type": "sample", + "title": "Thumb", + "key": "radial_slider_thumb", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/customization/thumb/radial_slider_thumb.dart", + "description": "" + }, + { + "type": "sample", + "title": "Custom Text", + "key": "radial_slider_custom_text", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/customization/custom_text/radial_slider_custom_text.dart", + "description": "" + }, + { + "type": "sample", + "title": "Gradient Fill", + "key": "radial_slider_gradient", + "showInWeb": false, + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_slider/customization/gradient/radial_slider_gradient.dart", + "description": "" + } + ] } ] }, { - "type": "child", - "title": "Auto Row Height", + "title": "Radial Range Slider", + "description": "Selects a numeric range in a radial scale. Designed using Radial Gauge widget.", + "image": "images/radial_range_slider.png", + "status": "Updated", + "category": "Sliders", + "displayType": "tab", + "controlId": 5, "subItems": [ { - "type": "sample", - "title": "Auto Row Height", - "description": "This sample showcases the auto row height feature of the DataGrid that improves readability of the content. DataGrid provides support to change the height of the row based on its content that changes at run time for all columns or certain columns.", - "key": "auto_row_height_datagrid", + "type": "child", + "title": "Basic Features", "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/auto_row_height/datgrid_auto_row_height.dart" - } - ] - }, - { - "type": "child", - "title": "Appearance", - "subItems": [ - { - "type": "sample", - "title": "Styling", - "key": "styling_datagrid", - "status": "Updated", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/apperance/styling/datagrid_styling.dart", - "needsPropertyPanel": true + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "State", + "key": "radial_range_slider_state", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/basic_features/state/range_slider_state.dart", + "description": "", + "needsPropertyPanel": true + }, + { + "type": "sample", + "title": "Labels and Ticks", + "key": "radial_range_slider_ticks_and_labels", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/basic_features/labels_and_ticks/range_slider_labels_And_ticks.dart", + "description": "" + }, + { + "type": "sample", + "title": "Angles", + "key": "radial_range_slider_angles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/basic_features/angles/range_slider_angles.dart", + "description": "" + } + ] }, { - "type": "sample", - "title": "Conditional Styling", - "key": "conditional_styling_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart" - } - ] - }, - { - "type": "child", - "title": "Paging", - "subItems": [ - { - "type": "sample", - "title": "Paging", - "key": "paging_datagrid", + "type": "child", + "title": "Customization", "status": "New", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/paging/datagrid_paging.dart" - } - ] - }, - { - "type": "child", - "title": "Real-Time Update", - "subItems": [ - { - "type": "sample", - "title": "Real-Time Update", - "key": "real_time_update_datagrid", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart" + "displayType": "tab", + "subItems": [ + { + "type": "sample", + "title": "Styles", + "key": "radial_range_slider_styles", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/customization/styles/range_slider_styles.dart", + "description": "" + }, + { + "type": "sample", + "title": "Thumb", + "key": "radial_range_slider_thumb", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/customization/thumb/range_slider_thumb.dart", + "description": "" + }, + { + "type": "sample", + "title": "Custom Text", + "key": "radial_range_slider_custom_text", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/customization/custom_text/range_slider_custom_text.dart", + "description": "" + }, + { + "type": "sample", + "title": "Gradient Fill", + "showInWeb": false, + "key": "radial_range_slider_gradient", + "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/radial_range_slider/customization/gradient/range_slider_gradient.dart", + "description": "" + } + ] } ] } ] }, { - "title": "Maps", - "description": "Easily visualize data over a geographical area", - "image": "images/map.png", - "status": "Preview", - "category": "Data Visualization", - "displayType": "tab", - "controlId": 7, - "subItems": [ - { - "type": "child", - "title": "Shape Layer", - "status": "Updated", + "categoryName": "Signature Pad", + "mobileCategoryId": 7, + "webCategoryId": 7, + "controlList": [ + { + "title": "Signature Pad", + "description": "Captures the signature and save it as an image to sync across devices and documents", + "image": "images/SignaturePad.png", "displayType": "tab", + "status": "Preview", + "controlId": 1, "subItems": [ { "type": "sample", - "title": "Range color mapping", - "key": "range_color_mapping", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart" - }, - { - "type": "sample", - "title": "Equal color mapping", - "key": "equal_color_mapping", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart" - }, - { - "type": "sample", - "title": "Bubble", - "key": "bubble", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/bubble/bubble.dart" - }, - { - "type": "sample", - "title": "Selection", - "key": "selection", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/selection/selection.dart" - }, - { - "type": "sample", - "title": "Marker", - "key": "marker", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/marker/marker.dart" - }, - { - "type": "sample", - "title": "Legend", - "status": "New", - "key": "legend", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/legend/legend.dart", + "title": "Getting Started", + "key": "signature_pad_getting_started", + "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart", "needsPropertyPanel": true - }, - { - "type": "sample", - "title": "Tooltip", - "status": "New", - "key": "tooltip", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/tooltip/tooltip.dart" - }, - { - "type": "sample", - "title": "Zooming", - "status": "New", - "key": "zooming", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/shape_layer/zooming/zooming.dart" } ] - }, - { - "type": "child", - "title": "Tile Layer", - "status": "New", - "displayType": "tab", - "subItems": [ - { - "type": "sample", - "title": "OSM", - "status": "New", - "key": "osm", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/osm/osm.dart" - }, - { - "type": "sample", - "title": "Bing Maps", - "status": "New", - "key": "bing_map", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/maps/tile_layer/bing_map/bing_map.dart" - } - ] - } - ] - }, - { - "title": "Signature Pad", - "description": "Captures the signature and save it as an image to sync across devices and documents", - "image": "images/SignaturePad.png", - "displayType": "tab", - "category": "Signature Pad", - "status": "New", - "controlId": 15, - "subItems": [ - { - "type": "sample", - "title": "Getting Started", - "key": "signature_pad_getting_started", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart", - "needsPropertyPanel": true - } - ] - }, - { - "title": "PDF Viewer", - "description": "View the PDF document seamlessly and efficiently", - "image": "images/pdf_viewer.png", - "displayType": "tab", - "category": "Viewer", - "showInWeb": false, - "status": "New", - "controlId": 9, - "subItems": [ - { - "type": "sample", - "title": "Getting Started", - "key": "pdf_viewer_getting_started", - "showInWeb": false, - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart" - }, - { - "type": "sample", - "title": "Custom Toolbar", - "key": "pdf_viewer_custom_toolbar", - "showInWeb": false, - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart" - } - ] - }, - { - "title": "XlsIO", - "description": "Create Excel documents with text, numbers, cell formatting, formulas, charts, images, and more", - "image": "images/xlsio.png", - "status": "New", - "category": "File Formats", - "displayType": "tab", - "controlId": 16, - "subItems": [ - { - "type": "sample", - "title": "Expenses Report", - "key": "expenses_report", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/expenses_report/expenses_report.dart" - }, - { - "type": "sample", - "title": "Invoice", - "key": "invoice_excel", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/invoice/invoice.dart" - }, - { - "type": "sample", - "title": "Yearly Sales", - "key": "yearly_sales", - "codeLink": "https://github.com/syncfusion/flutter-examples/blob/master/lib/samples/xlsio/yearly_sales/yearly_sales.dart" - } - ] - }, - { - "title": "Circular ProgressBar", - "description": "Designed using Radial Gauge widget. Indicates the progress of a task with customizable visuals.", - "image": "images/circular_progress_bar.png", - "displayType": "tab", - "status": "Updated", - "category": "Data Visualization", - "controlId": 17, - "subItems": [ - { - "type": "sample", - "title": "Types", - "key": "progress_bar_types", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/types/types.dart" - }, - { - "type": "sample", - "title": "Determinate styles", - "key": "progress_bar_determinate_styles", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/determinate_styles/determinate_styles.dart" - }, - { - "type": "sample", - "title": "Segment styles", - "showInWeb": false, - "key": "progress_bar_segment_styles", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/segment_styles/segment_styles.dart" - }, - { - "type": "sample", - "title": "Track with marker", - "key": "progress_bar_track_with_markers", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/track_with_marker/track_with_marker.dart" - }, - { - "type": "sample", - "title": "Custom content", - "key": "progress_bar_custom_labels", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/custom_labels/custom_labels.dart" - }, - { - "type": "sample", - "title": "Angles", - "key": "progress_bar_angles", - "codeLink": "https://github.com/syncfusion/flutter-examples/tree/master/lib/samples/progress_bar/angles/angles.dart" } ] } diff --git a/lib/sample_list.dart b/lib/sample_list.dart index 9b49e928..004373d0 100644 --- a/lib/sample_list.dart +++ b/lib/sample_list.dart @@ -1,195 +1,209 @@ import 'package:flutter/foundation.dart'; -import 'samples/barcodes/data_matrix/data_matrix.dart'; -import 'samples/barcodes/one_dimensional/one_dimensional.dart'; -import 'samples/barcodes/two_dimensional/qr_code.dart'; -import 'samples/calendar/agenda_view/agenda_view.dart'; -import 'samples/calendar/appointment_editor/appointment_editor.dart'; -import 'samples/calendar/getting_started/getting_started.dart'; -import 'samples/calendar/recurrence/recurrence.dart'; -import 'samples/calendar/schedule_view/schedule_view.dart'; -import 'samples/calendar/shift_scheduler/shift_scheduler.dart'; -import 'samples/calendar/heatmap/heatmap.dart'; -import 'samples/calendar/airfare/airfare.dart'; -import 'samples/calendar/timeline_views/timeline_views.dart'; -import 'samples/calendar/special_regions/special_regions.dart'; -import 'samples/chart/axis_features/axis_animation/axis_animation.dart'; -import 'samples/chart/axis_features/axis_crossing/axis_crossing.dart'; -import 'samples/chart/axis_features/axis_cross_base_value.dart'; -import 'samples/chart/axis_features/edge_label_placement/edgelabel_placement.dart'; -import 'samples/chart/axis_features/handling_label_collision/handling_label_collision.dart'; -import 'samples/chart/axis_features/multiple_axis_chart/multiple_axis_chart.dart'; -import 'samples/chart/axis_features/opposed_axes/opposed_axes.dart'; -import 'samples/chart/axis_features/plot_band/plot_band.dart'; -import 'samples/chart/axis_features/plot_band/plot_band_recurrence.dart'; -import 'samples/chart/axis_features/positioning_axis_label/positioning_axis_label.dart'; -import 'samples/chart/axis_types/category_types/default_category_axis.dart'; -import 'samples/chart/axis_types/category_types/indexed_category_axis.dart'; -import 'samples/chart/axis_types/category_types/label_placement.dart'; -import 'samples/chart/axis_types/date_time_types/date_time_axis_with_label_format.dart'; -import 'samples/chart/axis_types/date_time_types/default_date_time_axis.dart'; -import 'samples/chart/axis_types/logarithmic_types/default_logarithmic_axis.dart'; -import 'samples/chart/axis_types/logarithmic_types/inversed_logarithmic_axis.dart'; -import 'samples/chart/axis_types/numeric_types/default_numeric_axis.dart'; -import 'samples/chart/axis_types/numeric_types/inversed_numeric_axis.dart'; -import 'samples/chart/axis_types/numeric_types/numeric_axis_with_label_format.dart'; -import 'samples/chart/cartesian_charts/area_series/animation_area_chart.dart'; -import 'samples/chart/cartesian_charts/area_series/area_with_emptypoints.dart'; -import 'samples/chart/cartesian_charts/area_series/default_area_chart.dart'; -import 'samples/chart/cartesian_charts/area_series/vertical_area_chart.dart'; -import 'samples/chart/cartesian_charts/area_series/area_with_axis_base.dart'; -import 'samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart'; -import 'samples/chart/cartesian_charts/bar_series/bar_width_and_spacing.dart'; -import 'samples/chart/cartesian_charts/bar_series/bar_with_rounded_corners.dart'; -import 'samples/chart/cartesian_charts/bar_series/bar_with_track.dart'; -import 'samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart'; -import 'samples/chart/cartesian_charts/bar_series/default_bar_chart.dart'; -import 'samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart'; -import 'samples/chart/cartesian_charts/bubble_series/bubble_filled_with_gradient.dart'; -import 'samples/chart/cartesian_charts/bubble_series/bubble_with_multiple_series.dart'; -import 'samples/chart/cartesian_charts/bubble_series/bubble_with_various_colors.dart'; -import 'samples/chart/cartesian_charts/bubble_series/default_bubble_chart.dart'; -import 'samples/chart/cartesian_charts/column_series/animation_column_chart.dart'; -import 'samples/chart/cartesian_charts/column_series/back_to_back_column.dart'; -import 'samples/chart/cartesian_charts/column_series/column_width_and_spacing.dart'; -import 'samples/chart/cartesian_charts/column_series/column_with_rounded_corners.dart'; -import 'samples/chart/cartesian_charts/column_series/column_with_track.dart'; -import 'samples/chart/cartesian_charts/column_series/customized_column_chart.dart'; -import 'samples/chart/cartesian_charts/column_series/default_column_chart.dart'; -import 'samples/chart/cartesian_charts/column_series/column_with_axis_base.dart'; -import 'samples/chart/cartesian_charts/financial_series/candle_chart.dart'; -import 'samples/chart/cartesian_charts/financial_series/hilo_chart.dart'; -import 'samples/chart/cartesian_charts/financial_series/hilo_open_close_chart.dart'; -import 'samples/chart/cartesian_charts/line_series/animation_line_chart.dart'; -import 'samples/chart/cartesian_charts/line_series/customized_line_chart.dart'; -import 'samples/chart/cartesian_charts/line_series/default_line_chart.dart'; -import 'samples/chart/cartesian_charts/line_series/line_with_dashes.dart'; -import 'samples/chart/cartesian_charts/line_series/multi_colored_line.dart'; -import 'samples/chart/cartesian_charts/other_series/histogram_chart.dart'; -import 'samples/chart/cartesian_charts/other_series/range_area.dart'; -import 'samples/chart/cartesian_charts/other_series/spline_area.dart'; -import 'samples/chart/cartesian_charts/other_series/spline_range_area.dart'; -import 'samples/chart/cartesian_charts/other_series/step_area.dart'; -import 'samples/chart/cartesian_charts/other_series/box_whiser.dart'; -import 'samples/chart/cartesian_charts/other_series/waterFall.dart'; -import 'samples/chart/cartesian_charts/other_series/vertical_waterfall.dart'; -import 'samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart'; -import 'samples/chart/cartesian_charts/rangecolumn_series/default_rangecolumn_chart.dart'; -import 'samples/chart/cartesian_charts/rangecolumn_series/rangecolumn_with_track.dart'; -import 'samples/chart/cartesian_charts/rangecolumn_series/vertical_rangecolumn_chart.dart'; -import 'samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart'; -import 'samples/chart/cartesian_charts/scatter_series/default_scatter_chart.dart'; -import 'samples/chart/cartesian_charts/scatter_series/scatter_with_various_shapes.dart'; -import 'samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart'; -import 'samples/chart/cartesian_charts/spline_series/customized_spline_chart.dart'; -import 'samples/chart/cartesian_charts/spline_series/default_spline_chart.dart'; -import 'samples/chart/cartesian_charts/spline_series/spline_types.dart'; -import 'samples/chart/cartesian_charts/spline_series/spline_with_dashes.dart'; -import 'samples/chart/cartesian_charts/spline_series/vertical_spline_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series/stacked_area_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series/stacked_bar_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series/stacked_column_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series/stacked_line_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series_100/stacked_area_100_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series_100/stacked_bar_100_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series_100/stacked_column_100_chart.dart'; -import 'samples/chart/cartesian_charts/stacked_series_100/stacked_line_100_chart.dart'; -import 'samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart'; -import 'samples/chart/cartesian_charts/stepLine_series/default_stepline_chart.dart'; -import 'samples/chart/cartesian_charts/stepLine_series/stepline_with_dashes.dart'; -import 'samples/chart/cartesian_charts/stepLine_series/vertical_stepline_chart.dart'; -import 'samples/chart/data_binding/local_data.dart'; -import 'samples/chart/data_binding/json_data.dart'; -import 'samples/chart/circular_charts/doughnut_series/default_doughnut_chart.dart'; -import 'samples/chart/circular_charts/doughnut_series/doughnut_with_center_elevation.dart'; -import 'samples/chart/circular_charts/doughnut_series/doughnut_with_color_mapping.dart'; -import 'samples/chart/circular_charts/doughnut_series/doughnut_with_rounded_corners.dart'; -import 'samples/chart/circular_charts/doughnut_series/semi_doughnut_chart.dart'; -import 'samples/chart/circular_charts/export/export.dart'; -import 'samples/chart/circular_charts/pie_series/default_pie_chart.dart'; -import 'samples/chart/circular_charts/pie_series/pie_with_grouping.dart'; -import 'samples/chart/circular_charts/pie_series/pie_with_smart_labels.dart'; -import 'samples/chart/circular_charts/pie_series/pie_with_various_radius.dart'; -import 'samples/chart/circular_charts/pie_series/semi_pie_chart.dart'; -import 'samples/chart/circular_charts/radial_bar_series/customized_radialbar_chart.dart'; -import 'samples/chart/circular_charts/radial_bar_series/default_radialbar_chart.dart'; -import 'samples/chart/circular_charts/radial_bar_series/radialbar_with_legend.dart'; -import 'samples/chart/circular_charts/user_interactions/selection/circular_selection.dart'; -import 'samples/chart/circular_charts/user_interactions/selection/dynamic_circular_selection.dart'; -import 'samples/chart/circular_charts/user_interactions/tooltip/pie_tooltip_position.dart'; -import 'samples/chart/dynamic_updates/add_remove_data/add_remove_points.dart'; -import 'samples/chart/dynamic_updates/add_remove_data/add_remove_series.dart'; -import 'samples/chart/dynamic_updates/live_update/real_time_line_chart.dart'; -import 'samples/chart/dynamic_updates/live_update/real_time_spline_chart.dart'; -import 'samples/chart/dynamic_updates/live_update/vertical_live_chart.dart'; -import 'samples/chart/dynamic_updates/update_data_source/update_data_source.dart'; -import 'samples/chart/export/export.dart'; +import 'samples/barcodes/data_matrix.dart'; +import 'samples/barcodes/one_dimensional.dart'; +import 'samples/barcodes/qr_code.dart'; +import 'samples/calendar/agenda_view.dart'; +import 'samples/calendar/appointment_editor.dart'; +import 'samples/calendar/customization.dart'; +import 'samples/calendar/getting_started.dart'; +import 'samples/calendar/recurrence.dart'; +import 'samples/calendar/schedule_view.dart'; +import 'samples/calendar/shift_scheduler.dart'; +import 'samples/calendar/heatmap.dart'; +import 'samples/calendar/airfare.dart'; +import 'samples/calendar/timeline_views.dart'; +import 'samples/calendar/special_regions.dart'; +import 'samples/chart/cartesian_charts/axis_features/axis_animation.dart'; +import 'samples/chart/cartesian_charts/axis_features/axis_crossing.dart'; +import 'samples/chart/cartesian_charts/axis_features/edge_label_placement.dart'; +import 'samples/chart/cartesian_charts/axis_features/maximum_width_for_labels.dart'; +import 'samples/chart/cartesian_charts/axis_features/handling_label_collision.dart'; +import 'samples/chart/cartesian_charts/axis_features/multiple_axis_chart.dart'; +import 'samples/chart/cartesian_charts/axis_features/opposed_axes.dart'; +import 'samples/chart/cartesian_charts/axis_features/plot_band.dart'; +import 'samples/chart/cartesian_charts/axis_features/plot_band_recurrence.dart'; +import 'samples/chart/cartesian_charts/axis_features/positioning_axis_label.dart'; +import 'samples/chart/cartesian_charts/axis_types/category/default_category_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/category/indexed_category_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/category/label_placement.dart'; +import 'samples/chart/cartesian_charts/axis_types/date_time/date_time_axis_with_label_format.dart'; +import 'samples/chart/cartesian_charts/axis_types/date_time/default_date_time_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/logarithmic/default_logarithmic_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/logarithmic/inversed_logarithmic_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/numeric/default_numeric_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/numeric/inversed_numeric_axis.dart'; +import 'samples/chart/cartesian_charts/axis_types/numeric/numeric_axis_with_label_format.dart'; +import 'samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/area/area_with_emptypoints.dart'; +import 'samples/chart/cartesian_charts/chart_types/area/default_area_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/area/vertical_area_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/area/area_with_axis_base.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/bar_width_and_spacing.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/bar_with_rounded_corners.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/bar_with_track.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/customized_bar_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/bar/default_bar_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/box_whisker.dart'; +import 'samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/bubble/bubble_filled_with_gradient.dart'; +import 'samples/chart/cartesian_charts/chart_types/bubble/bubble_with_multiple_series.dart'; +import 'samples/chart/cartesian_charts/chart_types/bubble/bubble_with_various_colors.dart'; +import 'samples/chart/cartesian_charts/chart_types/bubble/default_bubble_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/back_to_back_column.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/column_width_and_spacing.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/column_with_rounded_corners.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/column_with_track.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/customized_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/default_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/column/column_with_axis_base.dart'; +import 'samples/chart/cartesian_charts/chart_types/financial_charts/candle_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/financial_charts/hilo_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/financial_charts/hilo_open_close_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/histogram.dart'; +import 'samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/line/customized_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/line/default_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/line/line_with_dashes.dart'; +import 'samples/chart/cartesian_charts/chart_types/line/multi_colored_line.dart'; +import 'samples/chart/cartesian_charts/chart_types/range_area.dart'; +import 'samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/range_column/default_range_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/range_column/range_column_with_track.dart'; +import 'samples/chart/cartesian_charts/chart_types/range_column/vertical_range_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/scatter/default_scatter_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/scatter/scatter_with_various_shapes.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline_area.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline_range_area.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/customized_spline_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/default_spline_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/spline_types.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/spline_with_dashes.dart'; +import 'samples/chart/cartesian_charts/chart_types/spline/vertical_spline_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_area_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_bar_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_column_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/step_area.dart'; +import 'samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/step_line/default_step_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/step_line/step_line_with_dashes.dart'; +import 'samples/chart/cartesian_charts/chart_types/step_line/vertical_step_line_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/waterfall/waterfall.dart'; +import 'samples/chart/cartesian_charts/chart_types/waterfall/vertical_waterfall.dart'; +import 'samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_area_100_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_bar_100_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_column_100_chart.dart'; +import 'samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_line_100_chart.dart'; +import 'samples/chart/cartesian_charts/data_source/list.dart'; +import 'samples/chart/cartesian_charts/data_source/json.dart'; +import 'samples/chart/cartesian_charts/export.dart'; +import 'samples/chart/cartesian_charts/legend/legend_various_options.dart'; +import 'samples/chart/cartesian_charts/legend/chart_with_customized_legend.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_points.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_series.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/live_update/real_time_line_chart.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/live_update/real_time_spline_chart.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/live_update/vertical_live_chart.dart'; +import 'samples/chart/cartesian_charts/real_time_charts/update_data_source.dart'; +import 'samples/chart/cartesian_charts/series_features/animation/series_animation.dart'; +import 'samples/chart/cartesian_charts/series_features/annotation/chart_with_annotation.dart'; +import 'samples/chart/cartesian_charts/series_features/annotation/chart_with_watermark.dart'; +import 'samples/chart/cartesian_charts/series_features/data_label/default_data_labels.dart'; +import 'samples/chart/cartesian_charts/series_features/data_label/data_label_template.dart'; +import 'samples/chart/cartesian_charts/series_features/empty_points.dart'; +import 'samples/chart/cartesian_charts/series_features/gradients/horizantal_gradient.dart'; +import 'samples/chart/cartesian_charts/series_features/gradients/vertical_gradient.dart'; +import 'samples/chart/cartesian_charts/series_features/marker.dart'; +import 'samples/chart/cartesian_charts/series_features/sorting.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/accumulation_distribution.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/atr_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/bollinger_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/ema_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/macd_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/momentum_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/rsi_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/sma_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/stochastic_indicator.dart'; +import 'samples/chart/cartesian_charts/technical_indicators/tma_indicator.dart'; +import 'samples/chart/cartesian_charts/trendline/default_trendline.dart'; +import 'samples/chart/cartesian_charts/trendline/trendline_forecast.dart'; +import 'samples/chart/cartesian_charts/user_interactions/crosshair.dart'; +import 'samples/chart/cartesian_charts/user_interactions/trackball.dart'; +import 'samples/chart/cartesian_charts/user_interactions/customized_trackball.dart'; +import 'samples/chart/cartesian_charts/user_interactions/events.dart'; +import 'samples/chart/cartesian_charts/user_interactions/navigation_with_events.dart'; +import 'samples/chart/cartesian_charts/user_interactions/selection/dynamic_selection.dart'; +import 'samples/chart/cartesian_charts/user_interactions/selection/selection_modes.dart'; +import 'samples/chart/cartesian_charts/user_interactions/tooltip/default_tooltip.dart'; +import 'samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_position.dart'; +import 'samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart'; +import 'samples/chart/cartesian_charts/user_interactions/zooming_and_panning/pinch_zooming.dart'; +import 'samples/chart/cartesian_charts/user_interactions/zooming_and_panning/selection_zooming.dart'; +import 'samples/chart/cartesian_charts/user_interactions/add_point_on_click.dart'; +import 'samples/chart/cartesian_charts/user_interactions/zooming_and_panning/zooming_with_custom_buttons.dart'; +import 'samples/chart/circular_charts/chart_types/doughnut/default_doughnut_chart.dart'; +import 'samples/chart/circular_charts/chart_types/doughnut/doughnut_with_center_elevation.dart'; +import 'samples/chart/circular_charts/chart_types/doughnut/doughnut_with_color_mapping.dart'; +import 'samples/chart/circular_charts/chart_types/doughnut/doughnut_with_rounded_corners.dart'; +import 'samples/chart/circular_charts/chart_types/doughnut/semi_doughnut_chart.dart'; +import 'samples/chart/circular_charts/chart_types/pie/default_pie_chart.dart'; +import 'samples/chart/circular_charts/chart_types/pie/pie_with_grouping.dart'; +import 'samples/chart/circular_charts/chart_types/pie/pie_with_smart_labels.dart'; +import 'samples/chart/circular_charts/chart_types/pie/pie_with_various_radius.dart'; +import 'samples/chart/circular_charts/chart_types/pie/semi_pie_chart.dart'; +import 'samples/chart/circular_charts/chart_types/radial_bar/customized_radial_bar_chart.dart'; +import 'samples/chart/circular_charts/chart_types/radial_bar/default_radial_bar_chart.dart'; +import 'samples/chart/circular_charts/chart_types/radial_bar/radial_bar_with_legend.dart'; +import 'samples/chart/circular_charts/export.dart'; +import 'samples/chart/circular_charts/user_interactions/selection.dart'; +import 'samples/chart/circular_charts/user_interactions/dynamic_selection.dart'; +import 'samples/chart/circular_charts/user_interactions/tooltip.dart'; import 'samples/chart/funnel_charts/default_funnel_chart.dart'; import 'samples/chart/funnel_charts/funnel_with_legend.dart'; import 'samples/chart/funnel_charts/funnel_with_smart_labels.dart'; -import 'samples/chart/legend/cartesian_legend_various_options.dart'; -import 'samples/chart/legend/chart_with_customized_legend.dart'; -import 'samples/chart/legend/chart_with_legend.dart'; -import 'samples/chart/legend/legend_with_various_options.dart'; +import 'samples/chart/circular_charts/legend/chart_with_legend.dart'; +import 'samples/chart/circular_charts/legend/legend_with_various_options.dart'; import 'samples/chart/pyramid_charts/default_pyramid_chart.dart'; import 'samples/chart/pyramid_charts/pyramid_with_legend.dart'; import 'samples/chart/pyramid_charts/pyramid_with_smart_labels.dart'; -import 'samples/chart/series_features/animation/series_animation.dart'; -import 'samples/chart/series_features/annotation/chart_with_annotation.dart'; -import 'samples/chart/series_features/annotation/chart_with_watermark.dart'; -import 'samples/chart/series_features/data_label/default_datalabels.dart'; -import 'samples/chart/series_features/data_label/datalabel_template.dart'; -import 'samples/chart/series_features/empty_point/chart_with_empty_points.dart'; -import 'samples/chart/series_features/gradients/horizantal_gradient.dart'; -import 'samples/chart/series_features/gradients/vertical_gradient.dart'; -import 'samples/chart/series_features/marker/various_marker_shapes.dart'; -import 'samples/chart/series_features/sorting/sorting_options.dart'; -import 'samples/chart/technical_indicators/ad_indicator.dart'; -import 'samples/chart/technical_indicators/atr_indicator.dart'; -import 'samples/chart/technical_indicators/bollinger_indicator.dart'; -import 'samples/chart/technical_indicators/ema_indicator.dart'; -import 'samples/chart/technical_indicators/macd_indicator.dart'; -import 'samples/chart/technical_indicators/momentum_indicator.dart'; -import 'samples/chart/technical_indicators/rsi_indicator.dart'; -import 'samples/chart/technical_indicators/sma_indicator.dart'; -import 'samples/chart/technical_indicators/stochastic_indicator.dart'; -import 'samples/chart/technical_indicators/tma_indicator.dart'; -import 'samples/chart/trendline/default_trendline.dart'; -import 'samples/chart/trendline/trendline_forecast_options.dart'; -import 'samples/chart/user_interactions/crosshair/chart_with_crosshair.dart'; -import 'samples/chart/user_interactions/trackball/chart_with_trackball.dart'; -import 'samples/chart/user_interactions/events.dart'; -import 'samples/chart/user_interactions/selection/selection_index.dart'; -import 'samples/chart/user_interactions/selection/selection_modes.dart'; -import 'samples/chart/user_interactions/tooltip/default_tooltip.dart'; -import 'samples/chart/user_interactions/tooltip/tooltip_position.dart'; -import 'samples/chart/user_interactions/tooltip/tootip_template.dart'; -import 'samples/chart/user_interactions/zooming_panning/pinch_zooming/pinch_zooming.dart'; -import 'samples/chart/user_interactions/zooming_panning/selection_zooming.dart'; -import 'samples/chart/user_interactions/zooming_panning/zooming_with_custom_button/zooming_with_custom_buttons.dart'; -import 'samples/datagrid/auto_row_height/datgrid_auto_row_height.dart'; +import 'samples/sparkline/chart_types.dart'; +import 'samples/sparkline/axis_types.dart'; +import 'samples/sparkline/customization.dart'; +import 'samples/sparkline/sparkline_in_grid.dart'; +import 'samples/sparkline/live_update.dart'; +import 'samples/datagrid/auto_row_height/datagrid_auto_row_height.dart'; import 'samples/datagrid/columns/datagrid_column_types.dart'; import 'samples/datagrid/columns/datagrid_custom_header.dart'; import 'samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart'; import 'samples/datagrid/data_source/datagrid_json_data_source.dart'; import 'samples/datagrid/data_source/datagrid_list_data_source.dart'; import 'samples/datagrid/getting_started/datagrid_getting_started.dart'; -import 'samples/datagrid/freeze_panes/datagrid_freeze_panes.dart'; +import 'Samples/datagrid/freeze_panes/datagrid_freeze_panes.dart'; import 'samples/datagrid/real_time_update/datagrid_real_time_update.dart'; import 'samples/datagrid/selection/datagrid_selection.dart'; import 'samples/datagrid/apperance/styling/datagrid_styling.dart'; import 'samples/datagrid/paging/datagrid_paging.dart'; import 'samples/datagrid/sorting/datagrid_sorting.dart'; -import 'samples/date_picker/blackout_dates/blackout_date_picker.dart'; -import 'samples/date_picker/customization_picker/customized_date_picker.dart'; -import 'samples/date_picker/getting_started/datePicker_getting_started.dart'; -import 'samples/date_picker/popup_picker/popup_picker.dart'; +import 'samples/datagrid/columns/datagrid_stacked_header.dart'; +import 'samples/datagrid/loadmore/datagrid_infinite_scrolling.dart'; +import 'samples/datagrid/loadmore/datagrid_load_more.dart'; +import 'samples/date_picker/blackout_date_picker.dart'; +import 'samples/date_picker/customized_date_picker.dart'; +import 'samples/date_picker/date_picker_getting_started.dart'; +import 'samples/date_picker/hijri_calendar.dart'; +import 'samples/date_picker/popup_picker.dart'; +import 'samples/date_picker/vertical_calendar.dart'; import 'samples/gauge/animation/radial_bounce.dart'; -import 'samples/gauge/animation/radial_easeanimation.dart'; -import 'samples/gauge/animation/radial_easeincric.dart'; -import 'samples/gauge/animation/radial_easeout.dart'; -import 'samples/gauge/animation/radial_elasticout.dart'; -import 'samples/gauge/animation/radial_linearanimation.dart'; -import 'samples/gauge/animation/radial_slowmiddle.dart'; +import 'samples/gauge/animation/radial_ease_animation.dart'; +import 'samples/gauge/animation/radial_ease_incric.dart'; +import 'samples/gauge/animation/radial_ease_out.dart'; +import 'samples/gauge/animation/radial_elastic_out.dart'; +import 'samples/gauge/animation/radial_linear_animation.dart'; +import 'samples/gauge/animation/radial_slow_middle.dart'; import 'samples/gauge/annotation/direct_compass.dart'; import 'samples/gauge/annotation/image_annotation.dart'; import 'samples/gauge/annotation/text_annotation.dart'; @@ -197,11 +211,11 @@ import 'samples/gauge/axis_feature/custom_labels.dart'; import 'samples/gauge/axis_feature/default_gauge_view.dart'; import 'samples/gauge/axis_feature/multiple_axis.dart'; import 'samples/gauge/axis_feature/non_linearable.dart'; -import 'samples/gauge/axis_feature/radiallabel_customization.dart'; +import 'samples/gauge/axis_feature/radial_label_customization.dart'; import 'samples/gauge/axis_feature/range_colors.dart'; import 'samples/gauge/axis_feature/tick_customization.dart'; import 'samples/gauge/export/export.dart'; -import 'samples/gauge/pointer_interaction/radial_pointerdragging.dart'; +import 'samples/gauge/pointer_interaction/radial_pointer_dragging.dart'; import 'samples/gauge/pointer_interaction/radial_slider.dart'; import 'samples/gauge/pointers/multiple_needle.dart'; import 'samples/gauge/pointers/multiple_ranges.dart'; @@ -221,20 +235,46 @@ import 'samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart'; import 'samples/maps/shape_layer/selection/selection.dart'; import 'samples/maps/shape_layer/tooltip/tooltip.dart'; import 'samples/maps/shape_layer/zooming/zooming.dart'; +import 'samples/maps/shape_layer/sublayer/sublayer.dart'; import 'samples/maps/shape_layer/legend/legend.dart'; import 'samples/maps/tile_layer/osm/osm.dart'; import 'samples/maps/tile_layer/bing_map/bing_map.dart'; -import 'samples/pdf/certificate/certificate.dart'; -import 'samples/pdf/header_and_footer/header_and_footer.dart'; -import 'samples/pdf/invoice/invoice.dart'; -import 'samples/pdf/annotations/annotations.dart'; -import 'samples/pdf/text_extraction/text_extraction.dart'; -import 'samples/pdf/find_text/find_text.dart'; +import 'samples/maps/tile_layer/vector_layer/arcs.dart'; +import 'samples/maps/tile_layer/vector_layer/polylines.dart'; +import 'samples/pdf/annotations.dart'; +import 'samples/pdf/certificate.dart'; +import 'samples/pdf/conformance.dart'; +import 'samples/pdf/encryption.dart'; +import 'samples/pdf/find_text.dart'; +import 'samples/pdf/header_and_footer.dart'; +import 'samples/pdf/invoice.dart'; +import 'samples/pdf/text_extraction.dart'; import 'samples/xlsio/expenses_report/expenses_report.dart'; import 'samples/xlsio/invoice/invoice.dart'; import 'samples/xlsio/yearly_sales/yearly_sales.dart'; -import 'samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart'; -import 'samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart'; +import 'samples/xlsio/balance_sheet/balance_sheet.dart'; +import 'samples/pdf_viewer/pdf_viewer_getting_started.dart'; +import 'samples/pdf_viewer/pdf_viewer_custom_toolbar.dart'; +import 'samples/progress_bar/angles.dart'; +import 'samples/progress_bar/custom_labels.dart'; +import 'samples/progress_bar/determinate_styles.dart'; +import 'samples/progress_bar/segment_styles.dart'; +import 'samples/progress_bar/track_with_marker.dart'; +import 'samples/progress_bar/types.dart'; +import 'samples/radial_slider/basic_features/angles/radial_slider_angles.dart'; +import 'samples/radial_slider/basic_features/labels_and_ticks/radial_slider_labels_and_ticks.dart'; +import 'samples/radial_slider/basic_features/state/radial_slider_state.dart'; +import 'samples/radial_slider/customization/custom_text/radial_slider_custom_text.dart'; +import 'samples/radial_slider/customization/gradient/radial_slider_gradient.dart'; +import 'samples/radial_slider/customization/styles/radial_slider_styles.dart'; +import 'samples/radial_slider/customization/thumb/radial_slider_thumb.dart'; +import 'samples/radial_range_slider/basic_features/angles/range_slider_angles.dart'; +import 'samples/radial_range_slider/basic_features/labels_and_ticks/range_slider_labels_and_ticks.dart'; +import 'samples/radial_range_slider/basic_features/state/range_slider_state.dart'; +import 'samples/radial_range_slider/customization/custom_text/range_slider_custom_text.dart'; +import 'samples/radial_range_slider/customization/gradient/range_slider_gradient.dart'; +import 'samples/radial_range_slider/customization/styles/range_slider_styles.dart'; +import 'samples/radial_range_slider/customization/thumb/range_slider_thumb.dart'; import 'samples/sliders/range_selector/range_selector_default_appearance.dart'; import 'samples/sliders/range_selector/range_selector_with_selection.dart'; import 'samples/sliders/range_selector/range_selector_with_zooming.dart'; @@ -260,18 +300,12 @@ import 'samples/sliders/slider/customization/shape_customization/slider_shape_cu import 'samples/sliders/slider/customization/size_customization/slider_size_customization.dart'; import 'samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart'; import 'samples/signature_pad/getting_started/signature_pad_getting_started.dart'; -import 'samples/progress_bar/angles/angles.dart'; -import 'samples/progress_bar/custom_labels/custom_labels.dart'; -import 'samples/progress_bar/determinate_styles/determinate_styles.dart'; -import 'samples/progress_bar/segment_styles/segment_styles.dart'; -import 'samples/progress_bar/track_with_marker/track_with_marker.dart'; -import 'samples/progress_bar/types/types.dart'; /// Contains the output widget of sample /// appropriate key and output widget mapped Map getSampleWidget() { return { - //cartesian charts + // cartesian charts 'default_line_chart': (Key key) => LineDefault(key), 'line_with_dashes': (Key key) => LineDashed(key), 'multi_colored_line': (Key key) => LineMultiColor(key), @@ -346,10 +380,10 @@ Map getSampleWidget() { 'hilo_open_close_chart': (Key key) => HiloOpenCloseChart(key), 'candle_chart': (Key key) => CandleChart(key), 'axis_crossing': (Key key) => AxisCrossing(key), - 'axis_cross_base_value': (Key key) => AxisCrossingBaseValue(key), 'positioning_axis_labels': (Key key) => LabelCustomization(key), 'axis_animation': (Key key) => AxisAnimationDefault(key), 'edgelabel_placement': (Key key) => EdgeLabel(key), + 'chart_maximum_label_width': (Key key) => ChartMaximumLabelWidth(key), 'handling_label_collision': (Key key) => LabelAction(key), 'multiple_axis_chart': (Key key) => MultipleAxis(key), 'opposed_axes': (Key key) => NumericOpposed(key), @@ -398,6 +432,7 @@ Map getSampleWidget() { 'selection_index': (Key key) => SelectionIndex(key), 'default_tooltip': (Key key) => DefaultTooltip(key), 'chart_with_trackball': (Key key) => DefaultTrackball(key), + 'chart_with_trackball_template': (Key key) => TrackballTemplate(key), 'pinch_zooming': (Key key) => DefaultPanning(key), 'selection_zooming': (Key key) => DefaultZooming(key), 'zooming_with_custom_buttons': (Key key) => ButtonZooming(key), @@ -407,6 +442,8 @@ Map getSampleWidget() { 'circular_dynamic_selection': (Key key) => DynamicCircularSelection(key), 'pie_tooltip_position': (Key key) => PieTooltipPosition(key), 'events': (Key key) => Events(key), + 'navigate_with_events': (Key key) => NavigationWithEvents(key), + 'chart_interactivity': (Key key) => InteractiveChart(key), //Dynamic updates 'add_remove_points': (Key key) => AddDataPoints(key), @@ -430,13 +467,13 @@ Map getSampleWidget() { 'pie_with_grouping': (Key key) => PieGrouping(key), 'pie_with_smart_labels': (Key key) => PieSmartLabels(key), 'pie_with_various_radius': (Key key) => PieRadius(key), - 'semi_pie_chart': (Key key) => PieSemi(key), + 'semi_pie_chart': (Key key) => SemiPieChart(key), //Doughnut 'default_doughnut_chart': (Key key) => DoughnutDefault(key), 'doughnut_with_center_elevation': (Key key) => DoughnutElevation(key), 'doughnut_with_color_mapping': (Key key) => DoughnutCustomization(key), 'doughnut_with_rounded_corners': (Key key) => DoughnutRounded(key), - 'semi_doughnut_chart': (Key key) => DoughnutSemi(key), + 'semi_doughnut_chart': (Key key) => SemiDoughnutChart(key), //Radialbar 'customized_radialbar_chart': (Key key) => RadialBarCustomized(key), @@ -453,11 +490,19 @@ Map getSampleWidget() { 'pyramid_with_legend': (Key key) => PyramidLegend(key), 'pyramid_with_smart_labels': (Key key) => PyramidSmartLabels(key), + //Sparkline + 'sparkline_series': (Key key) => SparklineSeriesTypes(key), + 'sparkline_axis': (Key key) => SparklineAxesTypes(key), + 'sparkline_customization': (Key key) => SparklineCustomization(key), + 'sparkline_grid': (Key key) => SparkLineGrid(key), + 'sparkline_live_update': (Key key) => SparklineLiveUpdate(key), + // Calendar Samples 'getting_started_calendar': (Key key) => GettingStartedCalendar(key), 'recurrence_calendar': (Key key) => RecurrenceCalendar(key), 'agenda_view_calendar': (Key key) => AgendaViewCalendar(key), 'appointment_editor_calendar': (Key key) => CalendarAppointmentEditor(key), + 'customization_calendar': (Key key) => CustomizationCalendar(key), 'special_regions_calendar': (Key key) => SpecialRegionsCalendar(key), 'schedule_view_calendar': (Key key) => ScheduleViewCalendar(key), 'shift_scheduler': (Key key) => ShiftScheduler(key), @@ -467,9 +512,11 @@ Map getSampleWidget() { // Date picker Samples 'getting_started_date_picker': (Key key) => GettingStartedDatePicker(key), + 'hijri_calendar_date_picker': (Key key) => HijriDatePicker(key), 'blackout_picker': (Key key) => BlackoutDatePicker(key), 'customized_picker': (Key key) => CustomizedDatePicker(key), 'popup_picker': (Key key) => PopUpDatePicker(key), + 'vertical_calendar': (Key key) => VerticalCalendar(key), //Gauge 'radial_bounce': (Key key) => RadialBounceOutExample(key), @@ -511,6 +558,8 @@ Map getSampleWidget() { 'annotations': (Key key) => AnnotationsPdf(key), 'text_extraction': (Key key) => TextExtractionPdf(key), 'find_text': (Key key) => FindTextPdf(key), + 'encryption': (Key key) => EncryptPdf(key), + 'conformance': (Key key) => ConformancePdf(key), // PDF Viewer samples 'pdf_viewer_getting_started': (Key key) => GettingStartedPdfViewer(key), @@ -520,6 +569,7 @@ Map getSampleWidget() { 'expenses_report': (Key key) => ExpensesReportXlsIO(key), 'invoice_excel': (Key key) => InvoiceXlsIO(key), 'yearly_sales': (Key key) => YearlySalesXlsIO(key), + 'balance_sheet': (Key key) => BalanceSheetXlsIO(key), // Barcode samples 'one_dimensional_types': (Key key) => OneDimensionalBarcodes(key: key), @@ -614,6 +664,13 @@ Map getSampleWidget() { 'sorting_datagrid': (Key key) => SortingDataGrid(key: key), + 'stacked_header_datagrid': (Key key) => StackedHeaderDataGrid(key: key), + + 'load_more_infinite_scrolling_datagrid': (Key key) => + LoadMoreInfiniteScrollingDataGrid(key: key), + + 'load_more_datagrid': (Key key) => LoadMoreDataGrid(key: key), + //Maps: Shape Layer Samples 'range_color_mapping': (Key key) => MapRangeColorMappingPage(key), @@ -631,11 +688,17 @@ Map getSampleWidget() { 'zooming': (Key key) => MapZoomingPage(key), + 'sublayer': (Key key) => MapSublayerPage(key), + //Maps: Tile Layer Samples 'osm': (Key key) => MapOSMPage(key), 'bing_map': (Key key) => MapBingPage(key), + 'arcs': (Key key) => MapArcsPage(key), + + 'polylines': (Key key) => MapPolylinesPage(key), + //SignaturePad 'signature_pad_getting_started': (Key key) => GettingStartedSignaturePad(key), @@ -649,5 +712,25 @@ Map getSampleWidget() { ProgressBarTrackWithMarker(key), 'progress_bar_custom_labels': (Key key) => ProgressBarCustomLabels(key), 'progress_bar_angles': (Key key) => ProgressBarAngles(key), + + //Radial Slider + 'radial_slider_angles': (Key key) => RadialSliderAngles(key), + 'radial_slider_ticks_and_labels': (Key key) => RadialSliderLabelsTicks(key), + 'radial_slider_state': (Key key) => RadialSliderStateTypes(key), + 'radial_slider_custom_text': (Key key) => RadialSliderCustomText(key), + 'radial_slider_gradient': (Key key) => RadialSliderGradient(key), + 'radial_slider_styles': (Key key) => RadialSliderStyles(key), + 'radial_slider_thumb': (Key key) => RadialSliderThumb(key), + + //Radial Range Slider + 'radial_range_slider_angles': (Key key) => RadialRangeSliderAngles(key), + 'radial_range_slider_ticks_and_labels': (Key key) => + RadialRangeSliderLabelsTicks(key), + 'radial_range_slider_state': (Key key) => RadialRangeSliderStateTypes(key), + 'radial_range_slider_custom_text': (Key key) => + RadialRangeSliderCustomText(key), + 'radial_range_slider_gradient': (Key key) => RadialRangeSliderGradient(key), + 'radial_range_slider_styles': (Key key) => RadialRangeSliderStyles(key), + 'radial_range_slider_thumb': (Key key) => RadialRangeSliderThumb(key) }; } diff --git a/lib/samples/barcodes/data_matrix/data_matrix.dart b/lib/samples/barcodes/data_matrix.dart similarity index 97% rename from lib/samples/barcodes/data_matrix/data_matrix.dart rename to lib/samples/barcodes/data_matrix.dart index 32958526..56056274 100644 --- a/lib/samples/barcodes/data_matrix/data_matrix.dart +++ b/lib/samples/barcodes/data_matrix.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_barcodes/barcodes.dart'; /// Local imports -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Renders the Data Matrix barcode generator sample class DataMatrixGenerator extends SampleView { @@ -60,7 +60,7 @@ class _DataMatrixGeneratorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView(children: [ + return ListView(shrinkWrap: true, children: [ Padding( padding: const EdgeInsets.fromLTRB(10, 10, 0, 10), child: Container( diff --git a/lib/samples/barcodes/one_dimensional/one_dimensional.dart b/lib/samples/barcodes/one_dimensional.dart similarity index 93% rename from lib/samples/barcodes/one_dimensional/one_dimensional.dart rename to lib/samples/barcodes/one_dimensional.dart index f44a31d7..e1edeac4 100644 --- a/lib/samples/barcodes/one_dimensional/one_dimensional.dart +++ b/lib/samples/barcodes/one_dimensional.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_barcodes/barcodes.dart'; /// Local imports -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the one dimensional barcodes. class OneDimensionalBarcodes extends SampleView { @@ -86,8 +86,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Codabar', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -130,8 +129,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code39', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -176,8 +174,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code39 Extended', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -222,8 +219,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code93', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -267,8 +263,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('UPC-A', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -312,8 +307,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('UPC-E', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -357,8 +351,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('EAN-8', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -402,8 +395,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('EAN-13', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -446,8 +438,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(25, 10, 1, 1), child: Text('Code128', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(25, 2, 1, 10), @@ -489,8 +480,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128A', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -533,8 +523,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128B', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -577,8 +566,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(25, 10, 1, 1), child: Text('Code128C', - style: - TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(25, 2, 1, 10), @@ -626,8 +614,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Codabar', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -668,8 +655,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code39', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -713,8 +699,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code39 Extended', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -756,8 +741,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code93', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -800,8 +784,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('UPC-A', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -844,8 +827,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('UPC-E', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -888,8 +870,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('EAN-8', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -932,8 +913,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('EAN-13', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -975,8 +955,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -1018,8 +997,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128A', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -1061,8 +1039,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128B', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), @@ -1104,8 +1081,7 @@ class _OneDimensionalBarcodesState extends SampleViewState { Padding( padding: EdgeInsets.fromLTRB(15, 10, 1, 1), child: Text('Code128C', - style: TextStyle( - fontSize: 14, fontWeight: FontWeight.bold)), + style: TextStyle(fontWeight: FontWeight.bold)), ), Padding( padding: EdgeInsets.fromLTRB(15, 2, 1, 10), diff --git a/lib/samples/barcodes/qr_code.dart b/lib/samples/barcodes/qr_code.dart new file mode 100644 index 00000000..78617ec0 --- /dev/null +++ b/lib/samples/barcodes/qr_code.dart @@ -0,0 +1,290 @@ +/// Flutter package imports +import 'package:flutter/material.dart'; + +/// Barcode imports +import 'package:syncfusion_flutter_barcodes/barcodes.dart'; + +/// Local imports +import '../../model/sample_view.dart'; + +/// Renders the QR barcode generator sample +class QRCodeGenerator extends SampleView { + /// Creates the QR barcode generator sample + const QRCodeGenerator(Key key) : super(key: key); + @override + _QRCodeGeneratorState createState() => _QRCodeGeneratorState(); +} + +class _QRCodeGeneratorState extends SampleViewState { + _QRCodeGeneratorState(); + + final List _encoding = [ + 'Numeric', + 'AlphaNumeric', + 'Binary', + ]; + + final List _errorCorrectionLevels = [ + 'High', + 'Quartile', + 'Medium', + 'Low' + ]; + + ErrorCorrectionLevel _errorCorrectionLevel; + String _selectedErrorCorrectionLevel; + QRInputMode _inputMode; + String _selectedInputMode; + String _inputValue; + TextEditingController _textEditingController; + + @override + void initState() { + super.initState(); + _selectedInputMode = 'Binary'; + _inputValue = 'http://www.syncfusion.com'; + _selectedErrorCorrectionLevel = 'Quartile'; + _errorCorrectionLevel = ErrorCorrectionLevel.quartile; + _inputMode = QRInputMode.binary; + _textEditingController = TextEditingController.fromValue( + TextEditingValue( + text: model.isWeb ? 'http://www.syncfusion.com' : _inputValue, + ), + ); + } + + @override + void dispose() { + _textEditingController.dispose(); + super.dispose(); + } + + @override + Widget build([BuildContext context]) { + EdgeInsets _padding = const EdgeInsets.all(0); + double _margin; + if (!model.isWeb) { + _margin = (MediaQuery.of(context).size.width - + MediaQuery.of(context).size.width * 0.6) / + 2; + _padding = EdgeInsets.fromLTRB(_margin, 0, _margin, 0); + } + + return Scaffold( + backgroundColor: model.isWeb ? Colors.transparent : model.cardThemeColor, + body: Padding( + padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), + child: Container( + child: _getQRCodeGenerator( + _inputValue, _errorCorrectionLevel, _inputMode, _padding)), + ), + ); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + padding: const EdgeInsets.fromLTRB(10, 10, 0, 10), + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), + child: Container( + height: 100, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Input value: ', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(0, 5, 0, 0), + height: 50, + child: Align( + alignment: Alignment.bottomLeft, + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: TextField( + style: TextStyle(color: model.textColor), + decoration: InputDecoration( + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: model.textColor))), + autofocus: false, + keyboardType: TextInputType.text, + maxLines: null, + onChanged: (String _text) { + setState(() { + _inputValue = _text; + }); + }, + controller: _textEditingController), + ), + )) + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), + child: Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text( + 'Input mode:', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor), + ), + ), + Expanded( + child: Container( + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedInputMode, + items: _encoding.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Binary', + child: Text('$value', + textAlign: TextAlign.center, + style: + TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onInputModeChanged(value.toString()); + stateSetter(() {}); + }), + ), + ) + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), + child: Container( + height: 70, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Text( + 'Error level: ', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor), + ), + ), + Expanded( + child: Container( + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedErrorCorrectionLevel, + items: _errorCorrectionLevels.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Quartile', + child: Text('$value', + textAlign: TextAlign.center, + style: + TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onErrorCorrectionLevelChanged(value.toString()); + stateSetter(() {}); + }), + ), + ), + ], + ), + ), + ), + ]); + }); + } + + /// Updating the input mode in QR barcode + void _onInputModeChanged(String item) { + _selectedInputMode = item; + switch (_selectedInputMode) { + case 'Numeric': + _inputMode = QRInputMode.numeric; + break; + case 'AlphaNumeric': + _inputMode = QRInputMode.alphaNumeric; + break; + case 'Binary': + _inputMode = QRInputMode.binary; + break; + } + setState(() { + /// update the QR input mode changes + }); + } + + /// Updating the error correction level in QR barcode + void _onErrorCorrectionLevelChanged(String item) { + _selectedErrorCorrectionLevel = item; + switch (_selectedErrorCorrectionLevel) { + case 'High': + _errorCorrectionLevel = ErrorCorrectionLevel.high; + break; + case 'Quartile': + _errorCorrectionLevel = ErrorCorrectionLevel.quartile; + break; + case 'Medium': + _errorCorrectionLevel = ErrorCorrectionLevel.medium; + break; + case 'Low': + _errorCorrectionLevel = ErrorCorrectionLevel.low; + break; + } + setState(() { + ///Updating the error correction level + }); + } + + /// Returns the QR barcode + Widget _getQRCodeGenerator( + [String _inputValue, + ErrorCorrectionLevel _correctionLevel, + QRInputMode _inputMode, + EdgeInsets _padding]) { + return Center( + child: Container( + height: model.isWeb ? 300 : double.infinity, + child: Padding( + padding: _padding ?? const EdgeInsets.all(30), + child: SfBarcodeGenerator( + value: _inputValue ?? 'http://www.syncfusion.com', + textAlign: TextAlign.justify, + textSpacing: 10, + showValue: false, + symbology: QRCode( + inputMode: _inputMode ?? QRInputMode.binary, + codeVersion: QRCodeVersion.auto, + errorCorrectionLevel: + _correctionLevel ?? ErrorCorrectionLevel.quartile), + ), + )), + ); + } +} diff --git a/lib/samples/barcodes/two_dimensional/qr_code.dart b/lib/samples/barcodes/two_dimensional/qr_code.dart deleted file mode 100644 index 486f2f32..00000000 --- a/lib/samples/barcodes/two_dimensional/qr_code.dart +++ /dev/null @@ -1,293 +0,0 @@ -/// Flutter package imports -import 'package:flutter/material.dart'; - -/// Barcode imports -import 'package:syncfusion_flutter_barcodes/barcodes.dart'; - -/// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_dropdown.dart'; - -/// Renders the QR barcode generator sample -class QRCodeGenerator extends SampleView { - /// Creates the QR barcode generator sample - const QRCodeGenerator(Key key) : super(key: key); - @override - _QRCodeGeneratorState createState() => _QRCodeGeneratorState(); -} - -class _QRCodeGeneratorState extends SampleViewState { - _QRCodeGeneratorState(); - - final List _encoding = [ - 'Numeric', - 'AlphaNumeric', - 'Binary', - ]; - - final List _errorCorrectionLevels = [ - 'High', - 'Quartile', - 'Medium', - 'Low' - ]; - - ErrorCorrectionLevel _errorCorrectionLevel; - String _selectedErrorCorrectionLevel; - QRInputMode _inputMode; - String _selectedInputMode; - String _inputValue; - TextEditingController _textEditingController; - - @override - void initState() { - super.initState(); - _selectedInputMode = 'Binary'; - _inputValue = 'http://www.syncfusion.com'; - _selectedErrorCorrectionLevel = 'Quartile'; - _errorCorrectionLevel = ErrorCorrectionLevel.quartile; - _inputMode = QRInputMode.binary; - _textEditingController = TextEditingController.fromValue( - TextEditingValue( - text: model.isWeb ? 'http://www.syncfusion.com' : _inputValue, - ), - ); - } - - @override - void dispose() { - _textEditingController.dispose(); - super.dispose(); - } - - @override - Widget build([BuildContext context]) { - EdgeInsets _padding = const EdgeInsets.all(0); - double _margin; - if (!model.isWeb) { - _margin = (MediaQuery.of(context).size.width - - MediaQuery.of(context).size.width * 0.6) / - 2; - _padding = EdgeInsets.fromLTRB(_margin, 0, _margin, 0); - } - - return Scaffold( - backgroundColor: model.isWeb ? Colors.transparent : model.cardThemeColor, - body: Padding( - padding: const EdgeInsets.fromLTRB(5, 5, 5, 5), - child: Container( - child: _getQRCodeGenerator( - _inputValue, _errorCorrectionLevel, _inputMode, _padding)), - ), - ); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 10), - children: [ - Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), - child: Container( - height: 100, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Input value: ', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(0, 5, 0, 0), - height: 50, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: TextField( - style: TextStyle(color: model.textColor), - decoration: InputDecoration( - enabledBorder: UnderlineInputBorder( - borderSide: - BorderSide(color: model.textColor))), - autofocus: false, - keyboardType: TextInputType.text, - maxLines: null, - onChanged: (String _text) { - setState(() { - _inputValue = _text; - }); - }, - controller: _textEditingController), - ), - )) - ], - ), - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), - child: Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Text( - 'Input mode:', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor), - ), - ), - Expanded( - child: Container( - height: 50, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedInputMode, - item: _encoding.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Binary', - child: Text('$value', - textAlign: TextAlign.center, - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onInputModeChanged(value); - }), - ), - )), - ) - ], - ), - ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), - child: Container( - height: 70, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Text( - 'Error level: ', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor), - ), - ), - Expanded( - child: Container( - height: 50, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedErrorCorrectionLevel, - item: - _errorCorrectionLevels.map((String value) { - return DropdownMenuItem( - value: - (value != null) ? value : 'Quartile', - child: Text('$value', - textAlign: TextAlign.center, - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onErrorCorrectionLevelChanged(value); - }), - ), - )), - ) - ], - ), - ), - ), - ]); - } - - /// Updating the input mode in QR barcode - void _onInputModeChanged(String item) { - _selectedInputMode = item; - switch (_selectedInputMode) { - case 'Numeric': - _inputMode = QRInputMode.numeric; - break; - case 'AlphaNumeric': - _inputMode = QRInputMode.alphaNumeric; - break; - case 'Binary': - _inputMode = QRInputMode.binary; - break; - } - setState(() { - /// update the QR input mode changes - }); - } - - /// Updating the error correction level in QR barcode - void _onErrorCorrectionLevelChanged(String item) { - _selectedErrorCorrectionLevel = item; - switch (_selectedErrorCorrectionLevel) { - case 'High': - _errorCorrectionLevel = ErrorCorrectionLevel.high; - break; - case 'Quartile': - _errorCorrectionLevel = ErrorCorrectionLevel.quartile; - break; - case 'Medium': - _errorCorrectionLevel = ErrorCorrectionLevel.medium; - break; - case 'Low': - _errorCorrectionLevel = ErrorCorrectionLevel.low; - break; - } - setState(() { - ///Updating the error correction level - }); - } - - /// Returns the QR barcode - Widget _getQRCodeGenerator( - [String _inputValue, - ErrorCorrectionLevel _correctionLevel, - QRInputMode _inputMode, - EdgeInsets _padding]) { - return Center( - child: Container( - height: model.isWeb ? 300 : double.infinity, - child: Padding( - padding: _padding ?? const EdgeInsets.all(30), - child: SfBarcodeGenerator( - value: _inputValue ?? 'http://www.syncfusion.com', - textAlign: TextAlign.justify, - textSpacing: 10, - showValue: false, - symbology: QRCode( - inputMode: _inputMode ?? QRInputMode.binary, - codeVersion: QRCodeVersion.auto, - errorCorrectionLevel: - _correctionLevel ?? ErrorCorrectionLevel.quartile), - ), - )), - ); - } -} diff --git a/lib/samples/calendar/agenda_view/agenda_view.dart b/lib/samples/calendar/agenda_view.dart similarity index 87% rename from lib/samples/calendar/agenda_view/agenda_view.dart rename to lib/samples/calendar/agenda_view.dart index eb68f7d2..7c61d348 100644 --- a/lib/samples/calendar/agenda_view/agenda_view.dart +++ b/lib/samples/calendar/agenda_view.dart @@ -9,7 +9,7 @@ import 'package:flutter/scheduler.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class AgendaViewCalendar extends SampleView { @@ -23,21 +23,15 @@ class AgendaViewCalendar extends SampleView { class _AgendaViewCalendarState extends SampleViewState { _AgendaViewCalendarState(); - List subjectCollection; - List colorCollection; - List<_Meeting> meetings; - _MeetingDataSource events; - CalendarController calendarController; + _MeetingDataSource _events; + CalendarController _calendarController; Orientation _deviceOrientation; @override void initState() { - meetings = <_Meeting>[]; - calendarController = CalendarController(); - calendarController.selectedDate = DateTime.now(); - _addAppointmentDetails(); - _addAppointments(); - events = _MeetingDataSource(meetings); + _calendarController = CalendarController(); + _calendarController.selectedDate = DateTime.now(); + _events = _MeetingDataSource(_getAppointments()); super.initState(); } @@ -51,8 +45,8 @@ class _AgendaViewCalendarState extends SampleViewState { Widget build(BuildContext context) { final Widget _calendar = Theme( data: model.themeData.copyWith(accentColor: model.backgroundColor), - child: - _getAgendaViewCalendar(events, _onViewChanged, calendarController)); + child: _getAgendaViewCalendar( + _events, _onViewChanged, _calendarController)); return model.isMobileResolution && _deviceOrientation == Orientation.landscape ? Scrollbar( @@ -71,9 +65,11 @@ class _AgendaViewCalendarState extends SampleViewState { ); } - /// Creates the required appointment details as a list. - void _addAppointmentDetails() { - subjectCollection = []; + /// Method that creates the collection the data source for calendar, with + /// required information. + List<_Meeting> _getAppointments() { + /// Creates the required appointment subject details as a list. + List subjectCollection = []; subjectCollection.add('General Meeting'); subjectCollection.add('Plan Execution'); subjectCollection.add('Project Plan'); @@ -85,7 +81,8 @@ class _AgendaViewCalendarState extends SampleViewState { subjectCollection.add('Release updates'); subjectCollection.add('Performance Check'); - colorCollection = []; + /// Creates the required appointment color details as a list. + List colorCollection = []; colorCollection.add(const Color(0xFF0F8644)); colorCollection.add(const Color(0xFF8B1FA9)); colorCollection.add(const Color(0xFFD20100)); @@ -96,11 +93,8 @@ class _AgendaViewCalendarState extends SampleViewState { colorCollection.add(const Color(0xFFE47C73)); colorCollection.add(const Color(0xFF636363)); colorCollection.add(const Color(0xFF0A8043)); - } - /// Method that creates the collection the data source for calendar, with - /// required information. - void _addAppointments() { + final List<_Meeting> meetings = <_Meeting>[]; final Random random = Random(); final DateTime rangeStartDate = DateTime.now().add(const Duration(days: -(365 ~/ 2))); @@ -141,6 +135,7 @@ class _AgendaViewCalendarState extends SampleViewState { '', '', 'FREQ=WEEKLY;BYDAY=FR;INTERVAL=1')); + return meetings; } /// Updated the selected date of calendar, when the months swiped, selects the @@ -155,17 +150,17 @@ class _AgendaViewCalendarState extends SampleViewState { .isAfter(visibleDatesChangedDetails.visibleDates[0]) && DateTime.now().isBefore(visibleDatesChangedDetails.visibleDates[ visibleDatesChangedDetails.visibleDates.length - 1])) { - calendarController.selectedDate = DateTime.now(); + _calendarController.selectedDate = DateTime.now(); } else { - calendarController.selectedDate = + _calendarController.selectedDate = visibleDatesChangedDetails.visibleDates[0]; } } else { if (currentViewDate.month == DateTime.now().month && currentViewDate.year == DateTime.now().year) { - calendarController.selectedDate = DateTime.now(); + _calendarController.selectedDate = DateTime.now(); } else { - calendarController.selectedDate = + _calendarController.selectedDate = DateTime(currentViewDate.year, currentViewDate.month, 01); } } @@ -174,7 +169,7 @@ class _AgendaViewCalendarState extends SampleViewState { /// Returns the calendar widget based on the properties passed. SfCalendar _getAgendaViewCalendar( - [CalendarDataSource _calendarDataSource, + [CalendarDataSource calendarDataSource, ViewChangedCallback onViewChanged, CalendarController controller]) { return SfCalendar( @@ -183,7 +178,7 @@ class _AgendaViewCalendarState extends SampleViewState { showDatePickerButton: true, showNavigationArrow: model.isWeb, onViewChanged: onViewChanged, - dataSource: _calendarDataSource, + dataSource: calendarDataSource, monthViewSettings: MonthViewSettings( showAgenda: true, numberOfWeeksInView: model.isWeb ? 2 : 6), timeSlotViewSettings: TimeSlotViewSettings( diff --git a/lib/samples/calendar/airfare/airfare.dart b/lib/samples/calendar/airfare.dart similarity index 71% rename from lib/samples/calendar/airfare/airfare.dart rename to lib/samples/calendar/airfare.dart index 19937390..836e4b31 100644 --- a/lib/samples/calendar/airfare/airfare.dart +++ b/lib/samples/calendar/airfare.dart @@ -11,7 +11,7 @@ import 'package:syncfusion_flutter_calendar/calendar.dart'; import 'package:syncfusion_flutter_core/core.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Smallest fare value const String _kBestPrice = "\$100.17"; @@ -29,11 +29,11 @@ class AirFareCalendar extends SampleView { class _AirFareCalendarCalendarState extends SampleViewState { _AirFareCalendarCalendarState(); - ScrollController controller; - List airFareDataCollection; - List airlineId; - List fares; - DateTime minDate; + ScrollController _controller; + List _airFareDataCollection; + List _airlineId; + List _fares; + DateTime _minDate; /// Global key used to maintain the state, when we change the parent of the /// widget @@ -44,11 +44,11 @@ class _AirFareCalendarCalendarState extends SampleViewState { @override void initState() { _globalKey = GlobalKey(); - controller = ScrollController(); - airFareDataCollection = []; - airlineId = []; - fares = []; - minDate = DateTime.now(); + _controller = ScrollController(); + _airFareDataCollection = []; + _airlineId = []; + _fares = []; + _minDate = DateTime.now(); _addFareDataDetails(); _addAirFareData(); super.initState(); @@ -56,40 +56,40 @@ class _AirFareCalendarCalendarState extends SampleViewState { /// Creates required data for the air fare data. void _addFareDataDetails() { - airlineId = [1, 2, 3, 4]; - fares.add("\$134.50"); - fares.add("\$305.00"); - fares.add("\$152.66"); - fares.add("\$267.09"); - fares.add("\$189.20"); - fares.add("\$212.10"); - fares.add("\$350.50"); - fares.add("\$222.39"); - fares.add("\$238.83"); - fares.add("\$147.27"); - fares.add("\$115.43"); - fares.add("\$198.06"); - fares.add("\$189.83"); - fares.add("\$110.71"); - fares.add("\$152.10"); - fares.add("\$199.62"); - fares.add("\$146.15"); - fares.add("\$237.04"); - fares.add("\$100.17"); - fares.add("\$101.72"); - fares.add("\$266.69"); - fares.add("\$332.48"); - fares.add("\$256.77"); - fares.add("\$449.68"); - fares.add("\$100.17"); - fares.add("\$153.31"); - fares.add("\$249.92"); - fares.add("\$254.59"); - fares.add("\$332.48"); - fares.add("\$256.77"); - fares.add("\$449.68"); - fares.add("\$107.18"); - fares.add("\$219.04"); + _airlineId = [1, 2, 3, 4]; + _fares.add("\$134.50"); + _fares.add("\$305.00"); + _fares.add("\$152.66"); + _fares.add("\$267.09"); + _fares.add("\$189.20"); + _fares.add("\$212.10"); + _fares.add("\$350.50"); + _fares.add("\$222.39"); + _fares.add("\$238.83"); + _fares.add("\$147.27"); + _fares.add("\$115.43"); + _fares.add("\$198.06"); + _fares.add("\$189.83"); + _fares.add("\$110.71"); + _fares.add("\$152.10"); + _fares.add("\$199.62"); + _fares.add("\$146.15"); + _fares.add("\$237.04"); + _fares.add("\$100.17"); + _fares.add("\$101.72"); + _fares.add("\$266.69"); + _fares.add("\$332.48"); + _fares.add("\$256.77"); + _fares.add("\$449.68"); + _fares.add("\$100.17"); + _fares.add("\$153.31"); + _fares.add("\$249.92"); + _fares.add("\$254.59"); + _fares.add("\$332.48"); + _fares.add("\$256.77"); + _fares.add("\$449.68"); + _fares.add("\$107.18"); + _fares.add("\$219.04"); } /// Returns color for the airplane data. @@ -105,17 +105,17 @@ class _AirFareCalendarCalendarState extends SampleViewState { /// Creates the air fare data with required information void _addAirFareData() { - airFareDataCollection = []; + _airFareDataCollection = []; for (int i = 0; i < 100; i++) { - int id = i % airlineId.length; + int id = i % _airlineId.length; if (id == 0) { id = 1; - } else if (id > airlineId.length) { + } else if (id > _airlineId.length) { id -= 1; } - final String fare = fares[i % fares.length]; + final String fare = _fares[i % _fares.length]; final Color color = _getAirPlaneColor(id); - airFareDataCollection + _airFareDataCollection .add(AirFare(fare, color, 'Airways ' + id.toString())); } } @@ -129,7 +129,7 @@ class _AirFareCalendarCalendarState extends SampleViewState { } Widget build([BuildContext context]) { - final Widget _calendar = Theme( + final Widget calendar = Theme( /// The key set here to maintain the state, /// when we change the parent of the widget @@ -145,18 +145,18 @@ class _AirFareCalendarCalendarState extends SampleViewState { _deviceOrientation == Orientation.landscape ? Scrollbar( isAlwaysShown: true, - controller: controller, + controller: _controller, child: ListView( - controller: controller, + controller: _controller, children: [ Container( color: model.cardThemeColor, height: 600, - child: _calendar, + child: calendar, ) ], )) - : Container(color: model.cardThemeColor, child: _calendar), + : Container(color: model.cardThemeColor, child: calendar), ) ]), ); @@ -169,7 +169,7 @@ class _AirFareCalendarCalendarState extends SampleViewState { view: CalendarView.month, monthCellBuilder: _monthCellBuilder, showDatePickerButton: true, - minDate: minDate, + minDate: _minDate, ); } @@ -178,27 +178,32 @@ class _AirFareCalendarCalendarState extends SampleViewState { BuildContext buildContext, MonthCellDetails details) { Random random = Random(); final bool isToday = isSameDate(details.date, DateTime.now()); - final AirFare airFare = airFareDataCollection[random.nextInt(100)]; + final AirFare airFare = _airFareDataCollection[random.nextInt(100)]; final Color defaultColor = model.themeData != null && model.themeData.brightness == Brightness.dark ? Colors.white : Colors.black54; final bool isBestPrice = airFare.fare == _kBestPrice; final bool isDisabledDate = - details.date.isBefore(minDate) && !isSameDate(details.date, minDate); + details.date.isBefore(_minDate) && !isSameDate(details.date, _minDate); return Container( decoration: BoxDecoration( - border: Border.all(color: defaultColor, width: 0.1), + border: Border( + top: BorderSide(width: 0.1, color: defaultColor), + left: BorderSide(width: 0.1, color: defaultColor), + ), color: isDisabledDate ? Colors.grey.withOpacity(0.1) - : isBestPrice ? Colors.yellow.withOpacity(0.2) : null), + : isBestPrice + ? Colors.yellow.withOpacity(0.2) + : null), child: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(left: 10, right: 10), + padding: EdgeInsets.symmetric(horizontal: 10, vertical: 0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: model.isMobileResolution @@ -213,7 +218,9 @@ class _AirFareCalendarCalendarState extends SampleViewState { style: TextStyle( color: isToday ? model.backgroundColor - : isDisabledDate ? Colors.grey : null, + : isDisabledDate + ? Colors.grey + : null, fontWeight: isToday ? FontWeight.bold : null), ), !model.isMobileResolution && airFare.fare == _kBestPrice diff --git a/lib/samples/calendar/appointment_editor/appointment_editor.dart b/lib/samples/calendar/appointment_editor.dart similarity index 63% rename from lib/samples/calendar/appointment_editor/appointment_editor.dart rename to lib/samples/calendar/appointment_editor.dart index 1797fe72..74d5bd40 100644 --- a/lib/samples/calendar/appointment_editor/appointment_editor.dart +++ b/lib/samples/calendar/appointment_editor.dart @@ -11,9 +11,9 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/model.dart'; -import '../../../model/sample_view.dart'; -import '../getting_started/getting_started.dart'; +import '../../model/model.dart'; +import '../../model/sample_view.dart'; +import 'getting_started.dart'; /// Render the widget of appointment editor calendar class CalendarAppointmentEditor extends SampleView { @@ -156,7 +156,8 @@ class _CalendarAppointmentEditorState extends SampleViewState { void _onCalendarTapped(CalendarTapDetails calendarTapDetails) { /// Condition added to open the editor, when the calendar elements tapped /// other than the header. - if (calendarTapDetails.targetElement == CalendarElement.header) { + if (calendarTapDetails.targetElement == CalendarElement.header || + calendarTapDetails.targetElement == CalendarElement.resourceHeader) { return; } @@ -231,8 +232,14 @@ class _CalendarAppointmentEditorState extends SampleViewState { }, child: Center( child: Container( + alignment: Alignment.center, width: _isAppointmentTapped ? 400 : 500, - height: _isAppointmentTapped ? 200 : 400, + height: _isAppointmentTapped + ? _selectedAppointment.location == null || + _selectedAppointment.location.isEmpty + ? 150 + : 200 + : 390, child: Theme( data: model.themeData, child: Card( @@ -562,6 +569,7 @@ Widget displayAppointmentDetails( ListTile( trailing: Row( mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.start, children: [ IconButton( @@ -722,29 +730,32 @@ class _CalendarColorPickerState extends State<_CalendarColorPicker> { height: (widget.colorCollection.length * 50).toDouble(), child: ListView.builder( padding: const EdgeInsets.all(0), - itemCount: widget.colorCollection.length - 1, + itemCount: widget.colorCollection.length, itemBuilder: (BuildContext context, int index) { - return ListTile( - contentPadding: const EdgeInsets.all(0), - leading: Icon( - index == _selectedColorIndex - ? Icons.lens - : Icons.trip_origin, - color: widget.colorCollection[index]), - title: Text(widget.colorNames[index]), - onTap: () { - setState(() { - _selectedColorIndex = index; - widget.onChanged(_PickerChangedDetails(index: index)); - }); - - // ignore: always_specify_types - Future.delayed(const Duration(milliseconds: 200), () { - // When task is over, close the dialog - Navigator.pop(context); - }); - }, - ); + return Container( + height: 50, + child: ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 10), + leading: Icon( + index == _selectedColorIndex + ? Icons.lens + : Icons.trip_origin, + color: widget.colorCollection[index]), + title: Text(widget.colorNames[index]), + onTap: () { + setState(() { + _selectedColorIndex = index; + widget.onChanged(_PickerChangedDetails(index: index)); + }); + + // ignore: always_specify_types + Future.delayed(const Duration(milliseconds: 200), () { + // When task is over, close the dialog + Navigator.pop(context); + }); + }, + )); }, )), ), @@ -782,29 +793,32 @@ class _ResourcePickerState extends State<_ResourcePicker> { itemBuilder: (BuildContext context, int index) { final CalendarResource resource = widget.resourceCollection[index]; - return ListTile( - contentPadding: const EdgeInsets.all(0), - leading: CircleAvatar( - backgroundColor: widget.model.backgroundColor, - backgroundImage: resource.image, - child: resource.image == null - ? Text(resource.displayName[0]) - : null, - ), - title: Text(resource.displayName), - onTap: () { - setState(() { - widget.onChanged( - _PickerChangedDetails(resourceId: resource.id)); - }); - - // ignore: always_specify_types - Future.delayed(const Duration(milliseconds: 200), () { - // When task is over, close the dialog - Navigator.pop(context); - }); - }, - ); + return Container( + height: 50, + child: ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 10), + leading: CircleAvatar( + backgroundColor: widget.model.backgroundColor, + backgroundImage: resource.image, + child: resource.image == null + ? Text(resource.displayName[0]) + : null, + ), + title: Text(resource.displayName), + onTap: () { + setState(() { + widget.onChanged( + _PickerChangedDetails(resourceId: resource.id)); + }); + + // ignore: always_specify_types + Future.delayed(const Duration(milliseconds: 200), () { + // When task is over, close the dialog + Navigator.pop(context); + }); + }, + )); }, )), )); @@ -860,28 +874,32 @@ class _CalendarTimeZonePickerState extends State<_CalendarTimeZonePicker> { padding: const EdgeInsets.all(0), itemCount: widget.timeZoneCollection.length, itemBuilder: (BuildContext context, int index) { - return ListTile( - contentPadding: const EdgeInsets.all(0), - leading: Icon( - index == _selectedTimeZoneIndex - ? Icons.check_box - : Icons.check_box_outline_blank, - color: widget.backgroundColor, - ), - title: Text(widget.timeZoneCollection[index]), - onTap: () { - setState(() { - _selectedTimeZoneIndex = index; - widget.onChanged(_PickerChangedDetails(index: index)); - }); - - // ignore: always_specify_types - Future.delayed(const Duration(milliseconds: 200), () { - // When task is over, close the dialog - Navigator.pop(context); - }); - }, - ); + return Container( + height: 50, + child: ListTile( + contentPadding: + const EdgeInsets.symmetric(horizontal: 10), + leading: Icon( + index == _selectedTimeZoneIndex + ? Icons.check_box + : Icons.check_box_outline_blank, + color: widget.backgroundColor, + ), + title: Text(widget.timeZoneCollection[index]), + onTap: () { + setState(() { + _selectedTimeZoneIndex = index; + widget + .onChanged(_PickerChangedDetails(index: index)); + }); + + // ignore: always_specify_types + Future.delayed(const Duration(milliseconds: 200), () { + // When task is over, close the dialog + Navigator.pop(context); + }); + }, + )); }, )), )); @@ -990,9 +1008,11 @@ class _PopUpAppointmentEditorState extends State { ? Colors.white : Colors.black87; - final Widget _startDatePicker = FlatButton( - padding: const EdgeInsets.only(left: 0), + final Widget _startDatePicker = RawMaterialButton( + padding: const EdgeInsets.symmetric(horizontal: 5), child: Text(DateFormat('MMM dd, yyyy').format(_startDate), + style: + TextStyle(fontWeight: FontWeight.w500, color: defaultTextColor), textAlign: TextAlign.left), onPressed: () async { final DateTime date = await showDatePicker( @@ -1028,9 +1048,11 @@ class _PopUpAppointmentEditorState extends State { }, ); - final Widget _startTimePicker = FlatButton( + final Widget _startTimePicker = RawMaterialButton( + padding: const EdgeInsets.symmetric(horizontal: 5), child: Text( DateFormat('hh:mm a').format(_startDate), + style: TextStyle(fontWeight: FontWeight.w500, color: defaultTextColor), textAlign: TextAlign.left, ), onPressed: () async { @@ -1067,9 +1089,11 @@ class _PopUpAppointmentEditorState extends State { }, ); - final Widget _endTimePicker = FlatButton( + final Widget _endTimePicker = RawMaterialButton( + padding: const EdgeInsets.symmetric(horizontal: 5), child: Text( DateFormat('hh:mm a').format(_endDate), + style: TextStyle(fontWeight: FontWeight.w500, color: defaultTextColor), textAlign: TextAlign.left, ), onPressed: () async { @@ -1109,8 +1133,11 @@ class _PopUpAppointmentEditorState extends State { }, ); - final Widget _endDatePicker = FlatButton( + final Widget _endDatePicker = RawMaterialButton( + padding: const EdgeInsets.symmetric(horizontal: 5), child: Text(DateFormat('MMM dd, yyyy').format(_endDate), + style: + TextStyle(fontWeight: FontWeight.w500, color: defaultTextColor), textAlign: TextAlign.left), onPressed: () async { final DateTime date = await showDatePicker( @@ -1150,342 +1177,378 @@ class _PopUpAppointmentEditorState extends State { ); return ListView(padding: const EdgeInsets.all(0.0), children: [ - ListTile( - trailing: IconButton( - icon: Icon(Icons.close, color: defaultColor), - onPressed: () { - if (widget.newAppointment != null && - widget.events.appointments.contains(widget.newAppointment)) { - /// To remove the created appointment, when the appointment editor - /// closed without saving the appointment. - widget.events.appointments.removeAt( - widget.events.appointments.indexOf(widget.newAppointment)); - widget.events.notifyListeners(CalendarDataSourceAction.remove, - []..add(widget.newAppointment)); - } - - Navigator.pop(context); - }, - ), - ), - ListTile( - leading: const Text(''), - title: TextField( - autofocus: true, - cursorColor: widget.model.backgroundColor, - controller: TextEditingController(text: _subject), - onChanged: (String value) { - _subject = value; - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 20, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - focusColor: widget.model.backgroundColor, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), - hintText: 'Add title and time', - ), - ), - ), - ListTile( - leading: Container( - width: 30, - alignment: Alignment.centerRight, - child: Icon( - Icons.access_time, - size: 20, - color: defaultColor, - )), - title: _isAllDay - ? Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.min, - children: [ - _startDatePicker, - const Text('-'), - _endDatePicker, - const Text(''), - const Text(''), - ]) - : Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.min, - children: [ - _startDatePicker, - _startTimePicker, - const Text('-'), - _endTimePicker, - _endDatePicker, - ]), - ), - ListTile( - leading: Container( - width: 30, - alignment: Alignment.centerRight, - child: Icon( - Icons.location_on, - color: defaultColor, - size: 20, - )), - title: TextField( - cursorColor: widget.model.backgroundColor, - controller: TextEditingController(text: _location), - onChanged: (String value) { - _location = value; - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 15, - color: defaultTextColor, - ), - decoration: const InputDecoration( - filled: true, - isDense: true, - contentPadding: EdgeInsets.fromLTRB(5, 10, 10, 10), - fillColor: Colors.transparent, - border: InputBorder.none, - hintText: 'Add location', - ), - ), - ), - ListTile( - leading: Container( - width: 30, - alignment: Alignment.centerRight, - child: Icon( - Icons.subject, - size: 20, - color: defaultColor, - )), - title: TextField( - controller: TextEditingController(text: _notes), - onChanged: (String value) { - _notes = value; - }, - keyboardType: TextInputType.multiline, - maxLines: widget.model.isWeb ? 1 : null, - style: TextStyle( - fontSize: 15, - color: defaultTextColor, - ), - decoration: const InputDecoration( - filled: true, - isDense: true, - contentPadding: EdgeInsets.fromLTRB(5, 10, 10, 10), - fillColor: Colors.transparent, - border: InputBorder.none, - hintText: 'Add description', - ), - ), - ), - widget.events.resources == null || widget.events.resources.isEmpty - ? Container() - : ListTile( - leading: Container( - width: 30, - alignment: Alignment.centerRight, - child: Icon( - Icons.people, - color: defaultColor, - size: 20, - )), - title: FlatButton( - padding: const EdgeInsets.only(left: 5), - child: Container( - alignment: Alignment.topLeft, - child: _getResourceEditor(TextStyle( - fontSize: 15, - color: defaultColor, - fontWeight: FontWeight.w300)), - ), - onPressed: () { - showDialog( - context: context, - barrierDismissible: true, - builder: (BuildContext context) { - return _ResourcePicker( - _unSelectedResources, - widget.model, - onChanged: (_PickerChangedDetails details) { - _resourceIds == null - ? _resourceIds = [details.resourceId] - : _resourceIds.add(details.resourceId); - _selectedResources = _getSelectedResources( - _resourceIds, widget.events.resources); - _unSelectedResources = _getUnSelectedResources( - _selectedResources, widget.events.resources); - }, - ); - }, - ).then((dynamic value) => setState(() { - /// update the color picker changes - })); - }, + Container( + height: 50, + child: ListTile( + trailing: IconButton( + icon: Icon(Icons.close, color: defaultColor), + onPressed: () { + if (widget.newAppointment != null && + widget.events.appointments + .contains(widget.newAppointment)) { + /// To remove the created appointment, when the appointment editor + /// closed without saving the appointment. + widget.events.appointments.removeAt(widget.events.appointments + .indexOf(widget.newAppointment)); + widget.events.notifyListeners(CalendarDataSourceAction.remove, + []..add(widget.newAppointment)); + } + + Navigator.pop(context); + }, + ), + )), + Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: const Text(''), + title: TextField( + autofocus: true, + cursorColor: widget.model.backgroundColor, + controller: TextEditingController(text: _subject), + onChanged: (String value) { + _subject = value; + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 20, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + focusColor: widget.model.backgroundColor, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), + hintText: 'Add title and time', ), ), - ListTile( - leading: Container( - width: 30, - alignment: Alignment.centerRight, - child: Icon(Icons.lens, - size: 20, color: widget.colorCollection[_selectedColorIndex])), - title: FlatButton( - padding: const EdgeInsets.only(left: 5), - child: Container( - alignment: Alignment.centerLeft, - child: Text( - widget.colorNames[_selectedColorIndex], - textAlign: TextAlign.start, + )), + Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: Container( + width: 30, + alignment: Alignment.centerRight, + child: Icon( + Icons.access_time, + size: 20, + color: defaultColor, + )), + title: _isAllDay + ? Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + _startDatePicker, + const Text(' - '), + _endDatePicker, + const Text(''), + const Text(''), + ]) + : Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + _startDatePicker, + _startTimePicker, + const Text(' - '), + _endTimePicker, + _endDatePicker, + ]), + )), + Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: Container( + width: 30, + alignment: Alignment.centerRight, + child: Icon( + Icons.location_on, + color: defaultColor, + size: 20, + )), + title: TextField( + cursorColor: widget.model.backgroundColor, + controller: TextEditingController(text: _location), + onChanged: (String value) { + _location = value; + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 15, + color: defaultTextColor, + ), + decoration: const InputDecoration( + filled: true, + contentPadding: EdgeInsets.fromLTRB(5, 10, 10, 10), + fillColor: Colors.transparent, + border: InputBorder.none, + hintText: 'Add location', + ), ), - ), - onPressed: () { - showDialog( - context: context, - barrierDismissible: true, - builder: (BuildContext context) { - return _CalendarColorPicker( - widget.colorCollection, - _selectedColorIndex, - widget.colorNames, - widget.model, - onChanged: (_PickerChangedDetails details) { - _selectedColorIndex = details.index; - }, - ); + )), + Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: Container( + width: 30, + alignment: Alignment.centerRight, + child: Icon( + Icons.subject, + size: 20, + color: defaultColor, + )), + title: TextField( + controller: TextEditingController(text: _notes), + onChanged: (String value) { + _notes = value; }, - ).then((dynamic value) => setState(() { - /// update the color picker changes - })); - }, - ), - ), - ListTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.only(right: 10), - child: FlatButton( - child: const Text('MORE OPTIONS'), + keyboardType: TextInputType.multiline, + maxLines: widget.model.isWeb ? 1 : null, + style: TextStyle( + fontSize: 15, + color: defaultTextColor, + ), + decoration: const InputDecoration( + filled: true, + contentPadding: EdgeInsets.fromLTRB(5, 10, 10, 10), + fillColor: Colors.transparent, + border: InputBorder.none, + hintText: 'Add description', + ), + ), + )), + widget.events.resources == null || widget.events.resources.isEmpty + ? Container() + : Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: Container( + width: 30, + alignment: Alignment.centerRight, + child: Icon( + Icons.people, + color: defaultColor, + size: 20, + )), + title: RawMaterialButton( + padding: const EdgeInsets.only(left: 5), + child: Container( + alignment: Alignment.centerLeft, + child: _getResourceEditor(TextStyle( + fontSize: 15, + color: defaultColor, + fontWeight: FontWeight.w300)), + ), onPressed: () { - Navigator.pop(context); showDialog( - context: context, - builder: (BuildContext context) { - final Appointment selectedApp = Appointment( - startTime: _startDate, - endTime: _endDate, - color: widget.colorCollection[_selectedColorIndex], - startTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget - .timeZoneCollection[_selectedTimeZoneIndex], - endTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget - .timeZoneCollection[_selectedTimeZoneIndex], - notes: _notes, - isAllDay: _isAllDay, - location: _location, - subject: _subject == '' ? '(No title)' : _subject, - resourceIds: _resourceIds, - ); - return WillPopScope( - onWillPop: () async { - if (widget.newAppointment != null) { - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.newAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - [] - ..add(widget.newAppointment)); - } - return true; - }, - child: AppointmentEditorWeb( - widget.model, - selectedApp, - widget.colorCollection, - widget.colorNames, - widget.events, - widget.timeZoneCollection, - widget.appointment, - widget.newAppointment), - ); - }); + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return _ResourcePicker( + _unSelectedResources, + widget.model, + onChanged: (_PickerChangedDetails details) { + _resourceIds == null + ? _resourceIds = [details.resourceId] + : _resourceIds.add(details.resourceId); + _selectedResources = _getSelectedResources( + _resourceIds, widget.events.resources); + _unSelectedResources = _getUnSelectedResources( + _selectedResources, widget.events.resources); + }, + ); + }, + ).then((dynamic value) => setState(() { + /// update the color picker changes + })); }, - )), - Padding( - padding: EdgeInsets.only(left: 10), - child: FlatButton( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4)), ), - color: widget.model.backgroundColor, - textColor: Colors.white, - child: const Text('SAVE'), - onPressed: () { - if (widget.selectedAppointment != null || - widget.newAppointment != null) { - if (widget.events.appointments.isNotEmpty && - widget.events.appointments - .contains(widget.selectedAppointment)) { - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.selectedAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - []..add(widget.selectedAppointment)); - } - if (widget.appointment.isNotEmpty && - widget.appointment.contains(widget.newAppointment)) { - widget.appointment.removeAt( - widget.appointment.indexOf(widget.newAppointment)); - } - } + )), + Container( + margin: EdgeInsets.only(bottom: 5), + height: 50, + child: ListTile( + leading: Container( + width: 30, + alignment: Alignment.centerRight, + child: Icon(Icons.lens, + size: 20, + color: widget.colorCollection[_selectedColorIndex])), + title: RawMaterialButton( + padding: const EdgeInsets.only(left: 5), + child: Container( + alignment: Alignment.centerLeft, + child: Text( + widget.colorNames[_selectedColorIndex], + style: TextStyle( + fontWeight: FontWeight.w500, color: defaultTextColor), + textAlign: TextAlign.start, + ), + ), + onPressed: () { + showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return _CalendarColorPicker( + widget.colorCollection, + _selectedColorIndex, + widget.colorNames, + widget.model, + onChanged: (_PickerChangedDetails details) { + _selectedColorIndex = details.index; + }, + ); + }, + ).then((dynamic value) => setState(() { + /// update the color picker changes + })); + }, + ), + )), + Container( + height: 50, + child: ListTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(right: 10), + child: RawMaterialButton( + padding: EdgeInsets.symmetric(horizontal: 5), + child: Text( + 'MORE OPTIONS', + style: TextStyle( + fontWeight: FontWeight.w500, + color: defaultTextColor), + ), + onPressed: () { + Navigator.pop(context); + showDialog( + context: context, + builder: (BuildContext context) { + final Appointment selectedApp = Appointment( + startTime: _startDate, + endTime: _endDate, + color: + widget.colorCollection[_selectedColorIndex], + startTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[ + _selectedTimeZoneIndex], + endTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[ + _selectedTimeZoneIndex], + notes: _notes, + isAllDay: _isAllDay, + location: _location, + subject: + _subject == '' ? '(No title)' : _subject, + resourceIds: _resourceIds, + ); + return WillPopScope( + onWillPop: () async { + if (widget.newAppointment != null) { + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.newAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + [] + ..add(widget.newAppointment)); + } + return true; + }, + child: AppointmentEditorWeb( + widget.model, + selectedApp, + widget.colorCollection, + widget.colorNames, + widget.events, + widget.timeZoneCollection, + widget.appointment, + widget.newAppointment), + ); + }); + }, + )), + Padding( + padding: EdgeInsets.only(left: 10), + child: RawMaterialButton( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(4)), + ), + fillColor: widget.model.backgroundColor, + child: const Text( + 'SAVE', + style: TextStyle( + color: Colors.white, fontWeight: FontWeight.w500), + ), + onPressed: () { + if (widget.selectedAppointment != null || + widget.newAppointment != null) { + if (widget.events.appointments.isNotEmpty && + widget.events.appointments + .contains(widget.selectedAppointment)) { + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.selectedAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + []..add(widget.selectedAppointment)); + } + if (widget.appointment.isNotEmpty && + widget.appointment + .contains(widget.newAppointment)) { + widget.appointment.removeAt(widget.appointment + .indexOf(widget.newAppointment)); + } + } - widget.appointment.add(Appointment( - startTime: _startDate, - endTime: _endDate, - color: widget.colorCollection[_selectedColorIndex], - startTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget.timeZoneCollection[_selectedTimeZoneIndex], - endTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget.timeZoneCollection[_selectedTimeZoneIndex], - notes: _notes, - isAllDay: _isAllDay, - location: _location, - subject: _subject == '' ? '(No title)' : _subject, - resourceIds: _resourceIds, - )); - - widget.events.appointments.add(widget.appointment[0]); - - widget.events.notifyListeners( - CalendarDataSourceAction.add, widget.appointment); + widget.appointment.add(Appointment( + startTime: _startDate, + endTime: _endDate, + color: widget.colorCollection[_selectedColorIndex], + startTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[_selectedTimeZoneIndex], + endTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[_selectedTimeZoneIndex], + notes: _notes, + isAllDay: _isAllDay, + location: _location, + subject: _subject == '' ? '(No title)' : _subject, + resourceIds: _resourceIds, + )); - Navigator.pop(context); - }, - ), + widget.events.appointments.add(widget.appointment[0]); + + widget.events.notifyListeners( + CalendarDataSourceAction.add, widget.appointment); + + Navigator.pop(context); + }, + ), + ), + ], ), - ], - ), - ), + )), ]); } @@ -1676,318 +1739,260 @@ class _AppointmentEditorWebState extends State { : Colors.black87; return Dialog( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4))), + insetPadding: EdgeInsets.all(20), child: Container( - color: widget.model.themeData != null && - widget.model.themeData.brightness == Brightness.dark - ? Colors.grey[850] - : Colors.white, width: 600, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.all(Radius.circular(4)), + color: widget.model.themeData != null && + widget.model.themeData.brightness == Brightness.dark + ? Colors.grey[850] + : Colors.white, + ), height: widget.events.resources != null && widget.events.resources.isNotEmpty - ? _isTimeZoneEnabled ? 560 : 500 - : _isTimeZoneEnabled ? 490 : 430, + ? _isTimeZoneEnabled + ? 560 + : 500 + : _isTimeZoneEnabled + ? 480 + : 420, + alignment: Alignment.center, child: ListView( padding: const EdgeInsets.all(0.0), children: [ - ListTile( - title: Text( - widget.selectedAppointment != null && - widget.newAppointment == null - ? 'Edit appointment' - : 'New appointment', - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w400, - color: defaultTextColor), - ), - trailing: IconButton( - icon: Icon(Icons.close, color: defaultColor), - onPressed: () { - if (widget.newAppointment != null && - widget.events.appointments - .contains(widget.newAppointment)) { - /// To remove the created appointment when the pop-up closed - /// without saving the appointment. - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.newAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - []..add(widget.newAppointment)); - } + Container( + margin: EdgeInsets.symmetric(vertical: 3), + child: ListTile( + title: Text( + widget.selectedAppointment != null && + widget.newAppointment == null + ? 'Edit appointment' + : 'New appointment', + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w400, + color: defaultTextColor), + ), + trailing: IconButton( + icon: Icon(Icons.close, color: defaultColor), + onPressed: () { + if (widget.newAppointment != null && + widget.events.appointments + .contains(widget.newAppointment)) { + /// To remove the created appointment when the pop-up closed + /// without saving the appointment. + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.newAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + []..add(widget.newAppointment)); + } - Navigator.pop(context); - }, - ), - ), - ListTile( - title: Row( - mainAxisSize: MainAxisSize.max, - mainAxisAlignment: MainAxisAlignment.spaceAround, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - flex: 4, - child: Padding( - padding: const EdgeInsets.only( - left: 5, right: 5, top: 2, bottom: 2), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Title', - style: TextStyle( - fontSize: 12, - color: defaultColor, - fontWeight: FontWeight.w300), - textAlign: TextAlign.start, + Navigator.pop(context); + }, + ), + )), + Container( + margin: EdgeInsets.symmetric(vertical: 3), + child: ListTile( + title: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.spaceAround, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 4, + child: Padding( + padding: const EdgeInsets.only( + left: 5, right: 5, top: 2, bottom: 2), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Title', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + textAlign: TextAlign.start, + ), + TextField( + autofocus: true, + cursorColor: widget.model.backgroundColor, + controller: + TextEditingController(text: _subject), + onChanged: (String value) { + _subject = value; + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + isDense: true, + focusColor: widget.model.backgroundColor, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), + ), + ), + ], ), - TextField( - autofocus: true, - cursorColor: widget.model.backgroundColor, - controller: TextEditingController(text: _subject), - onChanged: (String value) { - _subject = value; - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - isDense: true, - focusColor: widget.model.backgroundColor, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), + )), + Expanded( + flex: 4, + child: Padding( + padding: const EdgeInsets.only( + left: 5, right: 5, top: 2, bottom: 2), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Location', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + textAlign: TextAlign.start, ), - ), - ], - ), - )), - Expanded( - flex: 4, - child: Padding( - padding: const EdgeInsets.only( - left: 5, right: 5, top: 2, bottom: 2), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Location', - style: TextStyle( - fontSize: 12, - color: defaultColor, - fontWeight: FontWeight.w300), - textAlign: TextAlign.start, - ), - TextField( - controller: TextEditingController(text: _location), - cursorColor: widget.model.backgroundColor, - onChanged: (String value) { - _location = value; - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - focusColor: widget.model.backgroundColor, - isDense: true, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), - ), - ), - ], - ), - ), - ) - ], - )), - ListTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.spaceAround, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - flex: 4, - child: Padding( - padding: const EdgeInsets.only( - left: 5, right: 5, top: 5, bottom: 2), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Start', - style: TextStyle( - fontSize: 12, - color: defaultColor, - fontWeight: FontWeight.w300), - textAlign: TextAlign.start, + TextField( + controller: + TextEditingController(text: _location), + cursorColor: widget.model.backgroundColor, + onChanged: (String value) { + _location = value; + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + focusColor: widget.model.backgroundColor, + isDense: true, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), + ), + ), + ], ), - TextField( - readOnly: true, - controller: TextEditingController( - text: (_isAllDay - ? DateFormat('dd/MM/yyyy') - : DateFormat('dd/MM/yy h:mm a')) - .format(_startDate)), - onChanged: (String value) { - _startDate = DateTime.parse(value); - _startTime = TimeOfDay( - hour: _startDate.hour, - minute: _startDate.minute); - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - isDense: true, - suffix: Container( - height: 20, - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - ButtonTheme( - minWidth: 50.0, - child: FlatButton( - onPressed: () async { - final DateTime date = - await showDatePicker( - context: context, - initialDate: _startDate, - firstDate: DateTime(1900), - lastDate: DateTime(2100), - builder: - (BuildContext context, - Widget child) { - return Theme( - data: ThemeData( - brightness: widget - .model - .themeData - .brightness, - colorScheme: - _getColorScheme( - widget.model, - true), - accentColor: widget - .model - .backgroundColor, - primaryColor: widget - .model - .backgroundColor), - child: child, - ); - }); - - if (date != null && - date != _startDate) { - setState(() { - final Duration difference = - _endDate - .difference(_startDate); - _startDate = DateTime( - date.year, - date.month, - date.day, - _startTime.hour, - _startTime.minute, - 0); - _endDate = - _startDate.add(difference); - _endTime = TimeOfDay( - hour: _endDate.hour, - minute: _endDate.minute); - }); - } - }, - shape: const CircleBorder(), - padding: const EdgeInsets.all(0.0), - child: Icon( - Icons.date_range, - color: defaultColor, - size: 20, - ), - )), - _isAllDay - ? Text('') - : ButtonTheme( + ), + ) + ], + ))), + Container( + margin: EdgeInsets.symmetric(vertical: 3), + child: ListTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + flex: 4, + child: Padding( + padding: const EdgeInsets.only( + left: 5, right: 5, top: 5, bottom: 2), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Start', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + textAlign: TextAlign.start, + ), + TextField( + readOnly: true, + controller: TextEditingController( + text: (_isAllDay + ? DateFormat('dd/MM/yyyy') + : DateFormat('dd/MM/yy h:mm a')) + .format(_startDate)), + onChanged: (String value) { + _startDate = DateTime.parse(value); + _startTime = TimeOfDay( + hour: _startDate.hour, + minute: _startDate.minute); + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + isDense: true, + suffix: Container( + height: 20, + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + ButtonTheme( minWidth: 50.0, child: FlatButton( - child: Icon( - Icons.access_time, - color: defaultColor, - size: 20, - ), - shape: const CircleBorder(), - padding: const EdgeInsets.all(0), onPressed: () async { - final TimeOfDay time = - await showTimePicker( + final DateTime date = + await showDatePicker( context: context, - initialTime: TimeOfDay( - hour: _startTime.hour, - minute: _startTime - .minute), + initialDate: _startDate, + firstDate: DateTime(1900), + lastDate: DateTime(2100), builder: (BuildContext context, Widget child) { return Theme( data: ThemeData( - brightness: widget - .model - .themeData - .brightness, - colorScheme: - _getColorScheme( - widget - .model, - false), - accentColor: widget - .model - .backgroundColor, - primaryColor: widget - .model - .backgroundColor, - ), + brightness: widget + .model + .themeData + .brightness, + colorScheme: + _getColorScheme( + widget + .model, + true), + accentColor: widget + .model + .backgroundColor, + primaryColor: widget + .model + .backgroundColor), child: child, ); }); - if (time != null && - time != _startTime) { + if (date != null && + date != _startDate) { setState(() { - _startTime = time; final Duration difference = _endDate.difference( _startDate); _startDate = DateTime( - _startDate.year, - _startDate.month, - _startDate.day, + date.year, + date.month, + date.day, _startTime.hour, _startTime.minute, 0); @@ -1999,149 +2004,160 @@ class _AppointmentEditorWebState extends State { }); } }, - )) - ], + shape: const CircleBorder(), + padding: const EdgeInsets.all(0.0), + child: Icon( + Icons.date_range, + color: defaultColor, + size: 20, + ), + )), + _isAllDay + ? Text('') + : ButtonTheme( + minWidth: 50.0, + child: FlatButton( + child: Icon( + Icons.access_time, + color: defaultColor, + size: 20, + ), + shape: const CircleBorder(), + padding: + const EdgeInsets.all(0), + onPressed: () async { + final TimeOfDay time = + await showTimePicker( + context: context, + initialTime: TimeOfDay( + hour: _startTime + .hour, + minute: _startTime + .minute), + builder: (BuildContext + context, + Widget child) { + return Theme( + data: ThemeData( + brightness: widget + .model + .themeData + .brightness, + colorScheme: + _getColorScheme( + widget + .model, + false), + accentColor: widget + .model + .backgroundColor, + primaryColor: widget + .model + .backgroundColor, + ), + child: child, + ); + }); + + if (time != null && + time != _startTime) { + setState(() { + _startTime = time; + final Duration + difference = + _endDate.difference( + _startDate); + _startDate = DateTime( + _startDate.year, + _startDate.month, + _startDate.day, + _startTime.hour, + _startTime.minute, + 0); + _endDate = _startDate + .add(difference); + _endTime = TimeOfDay( + hour: _endDate.hour, + minute: + _endDate.minute); + }); + } + }, + )) + ], + ), + ), + focusColor: widget.model.backgroundColor, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), ), ), - focusColor: widget.model.backgroundColor, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), - ), + ], ), - ], + ), ), - ), - ), - Expanded( - flex: 4, - child: Padding( - padding: const EdgeInsets.only( - left: 5, right: 5, top: 5, bottom: 2), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('End', - style: TextStyle( - fontSize: 12, - color: defaultColor, - fontWeight: FontWeight.w300), - textAlign: TextAlign.start), - TextField( - readOnly: true, - controller: TextEditingController( - text: (_isAllDay - ? DateFormat('dd/MM/yyyy') - : DateFormat('dd/MM/yy h:mm a')) - .format(_endDate)), - onChanged: (String value) { - _endDate = DateTime.parse(value); - _endTime = TimeOfDay( - hour: _endDate.hour, minute: _endDate.minute); - }, - keyboardType: TextInputType.multiline, - maxLines: null, - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - isDense: true, - suffix: Container( - height: 20, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - ButtonTheme( - minWidth: 50.0, - child: FlatButton( - child: Icon( - Icons.date_range, - color: defaultColor, - size: 20, - ), - shape: const CircleBorder(), - padding: const EdgeInsets.all(0), - onPressed: () async { - final DateTime date = - await showDatePicker( - context: context, - initialDate: _endDate, - firstDate: DateTime(1900), - lastDate: DateTime(2100), - builder: - (BuildContext context, - Widget child) { - return Theme( - data: ThemeData( - brightness: widget - .model - .themeData - .brightness, - colorScheme: - _getColorScheme( - widget.model, - true), - accentColor: widget - .model - .backgroundColor, - primaryColor: widget - .model - .backgroundColor, - ), - child: child, - ); - }); - - if (date != null && - date != _endDate) { - setState(() { - final Duration difference = - _endDate - .difference(_startDate); - _endDate = DateTime( - date.year, - date.month, - date.day, - _endTime.hour, - _endTime.minute, - 0); - if (_endDate - .isBefore(_startDate)) { - _startDate = _endDate - .subtract(difference); - _startTime = TimeOfDay( - hour: _startDate.hour, - minute: _startDate.minute); - } - }); - } - }, - )), - _isAllDay - ? Text('') - : ButtonTheme( + Expanded( + flex: 4, + child: Padding( + padding: const EdgeInsets.only( + left: 5, right: 5, top: 5, bottom: 2), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('End', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + textAlign: TextAlign.start), + TextField( + readOnly: true, + controller: TextEditingController( + text: (_isAllDay + ? DateFormat('dd/MM/yyyy') + : DateFormat('dd/MM/yy h:mm a')) + .format(_endDate)), + onChanged: (String value) { + _endDate = DateTime.parse(value); + _endTime = TimeOfDay( + hour: _endDate.hour, + minute: _endDate.minute); + }, + keyboardType: TextInputType.multiline, + maxLines: null, + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + isDense: true, + suffix: Container( + height: 20, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + ButtonTheme( minWidth: 50.0, child: FlatButton( child: Icon( - Icons.access_time, + Icons.date_range, color: defaultColor, size: 20, ), shape: const CircleBorder(), padding: const EdgeInsets.all(0), onPressed: () async { - final TimeOfDay time = - await showTimePicker( + final DateTime date = + await showDatePicker( context: context, - initialTime: TimeOfDay( - hour: _endTime.hour, - minute: - _endTime.minute), + initialDate: _endDate, + firstDate: DateTime(1900), + lastDate: DateTime(2100), builder: (BuildContext context, Widget child) { @@ -2155,7 +2171,7 @@ class _AppointmentEditorWebState extends State { _getColorScheme( widget .model, - false), + true), accentColor: widget .model .backgroundColor, @@ -2167,17 +2183,16 @@ class _AppointmentEditorWebState extends State { ); }); - if (time != null && - time != _endTime) { + if (date != null && + date != _endDate) { setState(() { - _endTime = time; final Duration difference = _endDate.difference( _startDate); _endDate = DateTime( - _endDate.year, - _endDate.month, - _endDate.day, + date.year, + date.month, + date.day, _endTime.hour, _endTime.minute, 0); @@ -2193,85 +2208,164 @@ class _AppointmentEditorWebState extends State { }); } }, - )) - ], + )), + _isAllDay + ? Text('') + : ButtonTheme( + minWidth: 50.0, + child: FlatButton( + child: Icon( + Icons.access_time, + color: defaultColor, + size: 20, + ), + shape: const CircleBorder(), + padding: + const EdgeInsets.all(0), + onPressed: () async { + final TimeOfDay time = + await showTimePicker( + context: context, + initialTime: TimeOfDay( + hour: + _endTime.hour, + minute: _endTime + .minute), + builder: (BuildContext + context, + Widget child) { + return Theme( + data: ThemeData( + brightness: widget + .model + .themeData + .brightness, + colorScheme: + _getColorScheme( + widget + .model, + false), + accentColor: widget + .model + .backgroundColor, + primaryColor: widget + .model + .backgroundColor, + ), + child: child, + ); + }); + + if (time != null && + time != _endTime) { + setState(() { + _endTime = time; + final Duration + difference = + _endDate.difference( + _startDate); + _endDate = DateTime( + _endDate.year, + _endDate.month, + _endDate.day, + _endTime.hour, + _endTime.minute, + 0); + if (_endDate.isBefore( + _startDate)) { + _startDate = + _endDate.subtract( + difference); + _startTime = TimeOfDay( + hour: + _startDate.hour, + minute: _startDate + .minute); + } + }); + } + }, + )) + ], + ), + ), + focusColor: widget.model.backgroundColor, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), ), ), - focusColor: widget.model.backgroundColor, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), - ), + ], ), - ], + ), ), + ], + ))), + Container( + margin: EdgeInsets.symmetric(vertical: 3), + child: ListTile( + title: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Checkbox( + focusColor: widget.model.backgroundColor, + activeColor: widget.model.backgroundColor, + value: _isAllDay, + onChanged: (bool value) { + setState(() { + _isAllDay = value; + if (_isAllDay) { + _isTimeZoneEnabled = false; + } + }); + }, + ), + Text( + 'All day', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + ), + Container(width: 10), + _isAllDay + ? Container() + : Checkbox( + focusColor: widget.model.backgroundColor, + activeColor: widget.model.backgroundColor, + value: _isTimeZoneEnabled, + onChanged: (bool value) { + setState(() { + _isTimeZoneEnabled = value; + if (!_isTimeZoneEnabled && + _selectedTimeZoneIndex != 0) { + _selectedTimeZoneIndex = 0; + } + }); + }, + ), + _isAllDay + ? Container() + : Text( + 'Time zone', + style: TextStyle( + fontSize: 12, + color: defaultColor, + fontWeight: FontWeight.w300), + ), + ], ), - ), - ], - )), - ListTile( - contentPadding: - const EdgeInsets.only(left: 5, right: 5, top: 2, bottom: 2), - title: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Checkbox( - focusColor: widget.model.backgroundColor, - activeColor: widget.model.backgroundColor, - value: _isAllDay, - onChanged: (bool value) { - setState(() { - _isAllDay = value; - if (_isAllDay) { - _isTimeZoneEnabled = false; - } - }); - }, - ), - Text( - 'All day', - style: TextStyle( - fontSize: 14, - color: defaultColor, - fontWeight: FontWeight.w300), - ), - _isAllDay - ? Container() - : Checkbox( - focusColor: widget.model.backgroundColor, - activeColor: widget.model.backgroundColor, - value: _isTimeZoneEnabled, - onChanged: (bool value) { - setState(() { - _isTimeZoneEnabled = value; - if (!_isTimeZoneEnabled && - _selectedTimeZoneIndex != 0) { - _selectedTimeZoneIndex = 0; - } - }); - }, - ), - _isAllDay - ? Container() - : Text( - 'Time zone', - style: TextStyle( - fontSize: 14, - color: defaultColor, - fontWeight: FontWeight.w300), - ), - ], - ), - ), + )), _isTimeZoneEnabled - ? ListTile( + ? Container( + child: ListTile( contentPadding: const EdgeInsets.only( - left: 15, top: 2, bottom: 2, right: 305), + left: 20, top: 2, bottom: 2, right: 305), title: Container( decoration: BoxDecoration( border: Border( @@ -2286,58 +2380,58 @@ class _AppointmentEditorWebState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( - child: FlatButton( - padding: const EdgeInsets.only(left: 5.0), - child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - widget.timeZoneCollection[ - _selectedTimeZoneIndex], - style: TextStyle( - fontSize: 13, - color: defaultColor, - fontWeight: FontWeight.w400), - ), - const Icon( - Icons.arrow_drop_down, - size: 24, - ) - ], - ), - onPressed: () { - showDialog( - context: context, - barrierDismissible: true, - builder: (BuildContext context) { - return _CalendarTimeZonePicker( - widget.model.backgroundColor, - widget.timeZoneCollection, - _selectedTimeZoneIndex, - widget.model, - onChanged: - (_PickerChangedDetails details) { - _selectedTimeZoneIndex = details.index; - }, - ); - }, - ).then((dynamic value) => setState(() { - /// update the time zone changes - })); - }, + child: RawMaterialButton( + padding: const EdgeInsets.only(left: 5.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + widget.timeZoneCollection[ + _selectedTimeZoneIndex], + style: TextStyle( + fontSize: 13, + color: defaultColor, + fontWeight: FontWeight.w400), + ), + const Icon( + Icons.arrow_drop_down, + size: 24, + ) + ], ), - ), + onPressed: () { + showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return _CalendarTimeZonePicker( + widget.model.backgroundColor, + widget.timeZoneCollection, + _selectedTimeZoneIndex, + widget.model, + onChanged: (_PickerChangedDetails details) { + _selectedTimeZoneIndex = details.index; + }, + ); + }, + ).then((dynamic value) => setState(() { + /// update the time zone changes + })); + }, + )), ], ), ), - ) + )) : Container(), widget.events.resources == null || widget.events.resources.isEmpty ? Container() - : ListTile( + : Container( + child: ListTile( + contentPadding: + const EdgeInsets.symmetric(vertical: 2, horizontal: 20), title: Column( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start, @@ -2353,6 +2447,7 @@ class _AppointmentEditorWebState extends State { Container( width: 600, height: 50, + alignment: Alignment.centerLeft, decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -2390,12 +2485,14 @@ class _AppointmentEditorWebState extends State { /// update the color picker changes })); }, - ), - ListTile( + )), + Container( + child: ListTile( contentPadding: - const EdgeInsets.only(left: 17, right: 17, bottom: 2, top: 2), + const EdgeInsets.symmetric(vertical: 2, horizontal: 20), title: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( @@ -2406,197 +2503,215 @@ class _AppointmentEditorWebState extends State { fontWeight: FontWeight.w300), textAlign: TextAlign.start, ), - TextField( - controller: TextEditingController(text: _notes), - cursorColor: widget.model.backgroundColor, - onChanged: (String value) { - _notes = value; - }, - keyboardType: TextInputType.multiline, - maxLines: widget.model.isWeb ? 1 : null, - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), - decoration: InputDecoration( - isDense: true, - focusColor: widget.model.backgroundColor, - border: const UnderlineInputBorder(), - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide( - color: widget.model.backgroundColor, - width: 2.0, - style: BorderStyle.solid)), - ), - ), + Padding( + padding: EdgeInsets.symmetric(vertical: 5), + child: TextField( + controller: TextEditingController(text: _notes), + cursorColor: widget.model.backgroundColor, + onChanged: (String value) { + _notes = value; + }, + keyboardType: TextInputType.multiline, + maxLines: widget.model.isWeb ? 1 : null, + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + decoration: InputDecoration( + isDense: true, + focusColor: widget.model.backgroundColor, + border: const UnderlineInputBorder(), + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide( + color: widget.model.backgroundColor, + width: 2.0, + style: BorderStyle.solid)), + ), + )), ], ), - ), - ListTile( - contentPadding: const EdgeInsets.only( - left: 15, top: 2, bottom: 2, right: 15), - title: Container( - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: defaultColor.withOpacity(0.4), - width: 1.0, - ), - ), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - Icons.lens, - size: 20, - color: widget.colorCollection[_selectedColorIndex], + )), + Container( + child: ListTile( + contentPadding: + const EdgeInsets.symmetric(vertical: 2, horizontal: 20), + title: Container( + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: defaultColor.withOpacity(0.4), + width: 1.0, + ), + ), ), - Expanded( - child: FlatButton( - padding: const EdgeInsets.only( - right: 0, - left: 5, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + Icons.lens, + size: 20, + color: widget.colorCollection[_selectedColorIndex], ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - widget.colorNames[_selectedColorIndex], - style: TextStyle( - fontSize: 13, - color: defaultTextColor, - fontWeight: FontWeight.w400), + Expanded( + child: RawMaterialButton( + padding: const EdgeInsets.only(left: 5), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + widget.colorNames[_selectedColorIndex], + style: TextStyle( + fontSize: 13, + color: defaultTextColor, + fontWeight: FontWeight.w400), + ), + const Icon( + Icons.arrow_drop_down, + size: 24, + ) + ], ), - const Icon( - Icons.arrow_drop_down, - size: 24, - ) - ], - ), - onPressed: () { - showDialog( - context: context, - barrierDismissible: true, - builder: (BuildContext context) { - return _CalendarColorPicker( - widget.colorCollection, - _selectedColorIndex, - widget.colorNames, - widget.model, - onChanged: (_PickerChangedDetails details) { - _selectedColorIndex = details.index; + onPressed: () { + showDialog( + context: context, + barrierDismissible: true, + builder: (BuildContext context) { + return _CalendarColorPicker( + widget.colorCollection, + _selectedColorIndex, + widget.colorNames, + widget.model, + onChanged: + (_PickerChangedDetails details) { + _selectedColorIndex = details.index; + }, + ); }, - ); + ).then((dynamic value) => setState(() { + /// update the color picker changes + })); }, - ).then((dynamic value) => setState(() { - /// update the color picker changes - })); + ), + ), + ], + ), + ))), + Container( + margin: EdgeInsets.symmetric(vertical: 3), + child: ListTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + children: [ + Padding( + padding: EdgeInsets.only(right: 10), + child: RawMaterialButton( + child: Text( + 'CANCEL', + style: TextStyle( + fontWeight: FontWeight.w500, + color: defaultTextColor), + ), + onPressed: () { + if (widget.newAppointment != null) { + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.newAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + []..add(widget.newAppointment)); + } + Navigator.pop(context); }, ), ), - ], - ), - )), - ListTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.end, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - children: [ - Padding( - padding: EdgeInsets.only(right: 10), - child: FlatButton( - child: const Text('CANCEL'), - onPressed: () { - if (widget.newAppointment != null) { - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.newAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - []..add(widget.newAppointment)); - } - Navigator.pop(context); - }, - ), - ), - Padding( - padding: EdgeInsets.only(left: 10), - child: FlatButton( - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.all(Radius.circular(4)), - ), - color: widget.model.backgroundColor, - textColor: Colors.white, - child: const Text('SAVE'), - onPressed: () { - if (widget.selectedAppointment != null || - widget.newAppointment != null) { - if (widget.events.appointments.isNotEmpty && - widget.events.appointments - .contains(widget.selectedAppointment)) { - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.selectedAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - [] - ..add(widget.selectedAppointment)); - } - if (widget.appointment.isNotEmpty && - widget.appointment - .contains(widget.newAppointment)) { - widget.appointment.removeAt(widget.appointment - .indexOf(widget.newAppointment)); - } + Padding( + padding: EdgeInsets.only(left: 10), + child: RawMaterialButton( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(4)), + ), + fillColor: widget.model.backgroundColor, + child: const Text( + 'SAVE', + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.white), + ), + onPressed: () { + if (widget.selectedAppointment != null || + widget.newAppointment != null) { + if (widget.events.appointments.isNotEmpty && + widget.events.appointments + .contains(widget.selectedAppointment)) { + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.selectedAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + [] + ..add(widget.selectedAppointment)); + } + if (widget.appointment.isNotEmpty && + widget.appointment + .contains(widget.newAppointment)) { + widget.appointment.removeAt(widget.appointment + .indexOf(widget.newAppointment)); + } - if (widget.newAppointment != null && - widget.events.appointments.isNotEmpty && - widget.events.appointments - .contains(widget.newAppointment)) { - widget.events.appointments.removeAt(widget - .events.appointments - .indexOf(widget.newAppointment)); - widget.events.notifyListeners( - CalendarDataSourceAction.remove, - []..add(widget.newAppointment)); - } - } + if (widget.newAppointment != null && + widget.events.appointments.isNotEmpty && + widget.events.appointments + .contains(widget.newAppointment)) { + widget.events.appointments.removeAt(widget + .events.appointments + .indexOf(widget.newAppointment)); + widget.events.notifyListeners( + CalendarDataSourceAction.remove, + [] + ..add(widget.newAppointment)); + } + } + + widget.appointment.add(Appointment( + startTime: _startDate, + endTime: _endDate, + color: + widget.colorCollection[_selectedColorIndex], + startTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[ + _selectedTimeZoneIndex], + endTimeZone: _selectedTimeZoneIndex == 0 + ? '' + : widget.timeZoneCollection[ + _selectedTimeZoneIndex], + notes: _notes, + isAllDay: _isAllDay, + location: _location, + subject: + _subject == '' ? '(No title)' : _subject, + resourceIds: _resourceIds)); - widget.appointment.add(Appointment( - startTime: _startDate, - endTime: _endDate, - color: widget.colorCollection[_selectedColorIndex], - startTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget - .timeZoneCollection[_selectedTimeZoneIndex], - endTimeZone: _selectedTimeZoneIndex == 0 - ? '' - : widget - .timeZoneCollection[_selectedTimeZoneIndex], - notes: _notes, - isAllDay: _isAllDay, - location: _location, - subject: _subject == '' ? '(No title)' : _subject, - resourceIds: _resourceIds)); - - widget.events.appointments.add(widget.appointment[0]); + widget.events.appointments + .add(widget.appointment[0]); - widget.events.notifyListeners( - CalendarDataSourceAction.add, widget.appointment); + widget.events.notifyListeners( + CalendarDataSourceAction.add, + widget.appointment); - Navigator.pop(context); - }, - ), + Navigator.pop(context); + }, + ), + ), + ], ), - ], - ), - ), + )), ], ), ), diff --git a/lib/samples/calendar/customization.dart b/lib/samples/calendar/customization.dart new file mode 100644 index 00000000..d8fa26bd --- /dev/null +++ b/lib/samples/calendar/customization.dart @@ -0,0 +1,653 @@ +///Dart imports +import 'dart:math'; +import 'dart:ui'; +import 'package:intl/intl.dart' show DateFormat; + +///Package imports +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +///calendar import +import 'package:syncfusion_flutter_calendar/calendar.dart'; + +///Local import +import '../../model/sample_view.dart'; + +/// Widget of customization calendar +class CustomizationCalendar extends SampleView { + /// Creates default customization calendar + const CustomizationCalendar(Key key) : super(key: key); + + @override + _CustomizationCalendarState createState() => _CustomizationCalendarState(); +} + +class _CustomizationCalendarState extends SampleViewState { + _CustomizationCalendarState(); + + List _subjectCollection; + List _iconCollection; + List _colorCollection; + _MeetingDataSource _events; + CalendarController _calendarController; + + final List _allowedViews = [ + CalendarView.week, + CalendarView.workWeek, + CalendarView.month, + CalendarView.schedule, + CalendarView.timelineWeek, + CalendarView.timelineWorkWeek, + CalendarView.timelineMonth, + ]; + + ScrollController _controller; + + CalendarView _currentView; + + /// Global key used to maintain the state, when we change the parent of the + /// widget + GlobalKey _globalKey; + + @override + void initState() { + _calendarController = CalendarController(); + _currentView = CalendarView.week; + _calendarController.view = _currentView; + _globalKey = GlobalKey(); + _controller = ScrollController(); + addAppointmentDetails(); + _events = _MeetingDataSource(<_Meeting>[]); + super.initState(); + } + + @override + Widget build([BuildContext context]) { + final Widget calendar = Theme( + + /// The key set here to maintain the state, + /// when we change the parent of the widget + key: _globalKey, + data: model.themeData.copyWith(accentColor: model.backgroundColor), + child: _getCustomizationCalendar( + _calendarController, _events, _onViewChanged, _getAppointmentUI)); + + final double screenHeight = MediaQuery.of(context).size.height; + return Scaffold( + body: Row(children: [ + Expanded( + child: _calendarController.view == CalendarView.month && + model.isWeb && + screenHeight < 800 + ? Scrollbar( + isAlwaysShown: true, + controller: _controller, + child: ListView( + controller: _controller, + children: [ + Container( + color: model.cardThemeColor, + height: 600, + child: calendar, + ) + ], + )) + : Container(color: model.cardThemeColor, child: calendar), + ) + ]), + ); + } + + /// The method called whenever the calendar view navigated to previous/next + /// view or switched to different calendar view, based on the view changed + /// details new appointment collection added to the calendar + void _onViewChanged(ViewChangedDetails visibleDatesChangedDetails) { + final List<_Meeting> appointment = <_Meeting>[]; + _events.appointments.clear(); + final Random random = Random(); + + /// Remove the scroll bar on sample while change the view from + /// month view or change the view to month view. + if (_currentView != _calendarController.view && + model.isWeb && + (_currentView == CalendarView.month || + _calendarController.view == CalendarView.month)) { + SchedulerBinding.instance.addPostFrameCallback((Duration duration) { + setState(() {}); + }); + } + + _currentView = _calendarController.view; + if (_currentView == CalendarView.day || + _currentView == CalendarView.week || + _currentView == CalendarView.workWeek) { + final Map events = {}; + events['Environmental Discussion'] = + 'The day that creates awareness to promote the healthy planet and reduce air pollution crisis on nature earth'; + events['Health Checkup'] = + 'The day that raises awareness on different health issues. It marks the anniversary of the foundation of WHO'; + events['Cancer awareness'] = + 'The day that creates awareness on cancer and its preventive measures. Early detection saves life'; + events['Happiness'] = + 'The general idea is to promote happiness and smile around the world'; + events['Tourism'] = + 'The day that creates awareness to the role of tourism and its effect on social and economic values'; + final List colors = [ + Color(0xFF56AB56), + Color(0xFF357CD2), + Color(0xFF7FA90E), + Colors.deepOrangeAccent, + Color(0xFF5BBEAF) + ]; + final List images = [ + 'environment_day', + 'health_day', + 'cancer_day', + 'happiness_day', + 'tourism_day' + ]; + final List keys = events.keys.toList(); + DateTime date = DateTime.now(); + date = DateTime(date.year, date.month, date.day, 9, 0, 0) + .subtract(Duration(days: date.weekday - 1)); + for (int i = 0; i < 5; i++) { + final String key = keys[i]; + appointment.add(_Meeting(key, date, date.add(Duration(hours: 6)), + colors[i], false, events[key], images[i], null)); + date = date.add(Duration(days: 1)); + } + } + + /// Creates new appointment collection based on + /// the visible dates in calendar. + else if (_currentView != CalendarView.schedule) { + for (int i = 0; i < visibleDatesChangedDetails.visibleDates.length; i++) { + final DateTime date = visibleDatesChangedDetails.visibleDates[i]; + final int count = _currentView != CalendarView.month + ? 1 + : 1 + random.nextInt(model.isWeb ? 2 : 3); + for (int j = 0; j < count; j++) { + final DateTime startDate = DateTime( + date.year, date.month, date.day, 8 + random.nextInt(8), 0, 0); + appointment.add(_Meeting( + _subjectCollection[random.nextInt(7)], + startDate, + startDate.add(Duration(hours: random.nextInt(3))), + _colorCollection[random.nextInt(9)], + false, + '', + '', + null)); + } + } + } else { + final DateTime rangeStartDate = + DateTime.now().add(const Duration(days: -(365 ~/ 2))); + final DateTime rangeEndDate = + DateTime.now().add(const Duration(days: 365)); + for (DateTime i = rangeStartDate; + i.isBefore(rangeEndDate); + i = i.add(const Duration(days: 1))) { + final DateTime date = i; + final int count = 1 + random.nextInt(3); + for (int j = 0; j < count; j++) { + final DateTime startDate = DateTime( + date.year, date.month, date.day, 8 + random.nextInt(8), 0, 0); + final int index = random.nextInt(7); + appointment.add(_Meeting( + _subjectCollection[index], + startDate, + startDate.add(Duration(hours: random.nextInt(3))), + _colorCollection[random.nextInt(9)], + false, + '', + '', + _iconCollection[index])); + } + } + } + + for (int i = 0; i < appointment.length; i++) { + _events.appointments.add(appointment[i]); + } + + /// Resets the newly created appointment collection to render + /// the appointments on the visible dates. + _events.notifyListeners(CalendarDataSourceAction.reset, appointment); + } + + /// Creates the required appointment details as a list. + void addAppointmentDetails() { + _subjectCollection = []; + _subjectCollection.add('General Meeting'); + _subjectCollection.add('Plan Execution'); + _subjectCollection.add('Project Plan'); + _subjectCollection.add('Consulting'); + _subjectCollection.add('Support'); + _subjectCollection.add('Development Meeting'); + _subjectCollection.add('Scrum'); + _subjectCollection.add('Project Completion'); + _subjectCollection.add('Release updates'); + _subjectCollection.add('Performance Check'); + + _iconCollection = []; + _iconCollection.add(Icons.people_outlined); + _iconCollection.add(Icons.supervisor_account_outlined); + _iconCollection.add(Icons.sticky_note_2_outlined); + _iconCollection.add(Icons.headset_mic_outlined); + _iconCollection.add(Icons.perm_phone_msg_outlined); + _iconCollection.add(Icons.file_copy_outlined); + _iconCollection.add(Icons.personal_video_outlined); + _iconCollection.add(Icons.fact_check_outlined); + _iconCollection.add(Icons.new_releases_outlined); + _iconCollection.add(Icons.speed_outlined); + + _colorCollection = []; + _colorCollection.add(const Color(0xFF0F8644)); + _colorCollection.add(const Color(0xFF8B1FA9)); + _colorCollection.add(const Color(0xFFD20100)); + _colorCollection.add(const Color(0xFFFC571D)); + _colorCollection.add(const Color(0xFF36B37B)); + _colorCollection.add(const Color(0xFF01A1EF)); + _colorCollection.add(const Color(0xFF3D4FB5)); + _colorCollection.add(const Color(0xFFE47C73)); + _colorCollection.add(const Color(0xFF636363)); + _colorCollection.add(const Color(0xFF0A8043)); + } + + Widget _getAppointmentUI( + BuildContext context, CalendarAppointmentDetails details) { + final _Meeting meeting = details.appointments.first; + final Color textColor = model.themeData == null || + model.themeData.brightness == Brightness.light + ? Colors.black + : Colors.white; + if (_calendarController.view == CalendarView.timelineDay || + _calendarController.view == CalendarView.timelineWeek || + _calendarController.view == CalendarView.timelineWorkWeek || + _calendarController.view == CalendarView.timelineMonth) { + final double horizontalHighlight = + _calendarController.view == CalendarView.timelineMonth ? 10 : 20; + final double cornerRadius = horizontalHighlight / 4; + return Container( + child: Row( + children: [ + Container( + width: horizontalHighlight, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(cornerRadius), + bottomLeft: Radius.circular(cornerRadius)), + color: meeting.background, + ), + ), + Expanded( + child: Container( + alignment: Alignment.center, + color: meeting.background.withOpacity(0.8), + padding: EdgeInsets.only(left: 2), + child: Text( + meeting.eventName, + style: TextStyle( + color: Colors.white, + fontSize: 12, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + ))), + Container( + width: horizontalHighlight, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topRight: Radius.circular(cornerRadius), + bottomRight: Radius.circular(cornerRadius)), + color: meeting.background, + ), + ), + ], + ), + ); + } else if (_calendarController.view != CalendarView.month && + _calendarController.view != CalendarView.schedule) { + return Container( + child: Column( + children: [ + Container( + padding: EdgeInsets.all(3), + height: 50, + alignment: model.isMobileResolution + ? Alignment.topLeft + : Alignment.centerLeft, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(5), topRight: Radius.circular(5)), + color: meeting.background, + ), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + meeting.eventName, + style: TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w500, + ), + maxLines: model.isMobileResolution ? 3 : 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + ), + model.isMobileResolution + ? Container() + : Text( + 'Time: ${DateFormat('hh:mm a').format(meeting.from)} - ' + + '${DateFormat('hh:mm a').format(meeting.to)}', + style: TextStyle( + color: Colors.white, + fontSize: 10, + ), + ) + ], + )), + ), + Container( + height: details.bounds.height - 70, + padding: EdgeInsets.fromLTRB(3, 5, 3, 2), + color: meeting.background.withOpacity(0.8), + alignment: Alignment.topLeft, + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 5), + child: Image( + image: ExactAssetImage( + 'images/' + meeting.image + '.png'), + fit: BoxFit.contain, + width: details.bounds.width, + height: 60)), + Text( + meeting.notes, + style: TextStyle( + color: Colors.white, + fontSize: 10, + ), + ) + ], + )), + ), + Container( + height: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(5), + bottomRight: Radius.circular(5)), + color: meeting.background, + ), + ), + ], + ), + ); + } else if (_calendarController.view == CalendarView.month) { + final double fontSize = + details.bounds.height > 11 ? 10 : details.bounds.height - 1; + return Container( + alignment: Alignment.centerLeft, + padding: EdgeInsets.symmetric(horizontal: 2), + child: details.isMoreAppointmentRegion + ? Padding( + padding: EdgeInsets.only(left: 2), + child: Text( + '+ More', + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + )) + : model.isMobileResolution + ? Row( + children: [ + Icon( + Icons.circle, + color: meeting.background, + size: fontSize, + ), + Expanded( + child: Padding( + padding: EdgeInsets.only(left: 2), + child: Text( + meeting.eventName, + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + ))), + ], + ) + : Row( + children: [ + Icon( + Icons.circle, + color: meeting.background, + size: fontSize, + ), + Padding( + padding: + EdgeInsets.symmetric(vertical: 0, horizontal: 2), + child: Text( + meeting.isAllDay + ? 'All' + : '${DateFormat('h a').format(meeting.from)}', + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + )), + Expanded( + child: Text( + meeting.eventName, + style: TextStyle( + color: textColor, + fontSize: fontSize, + ), + maxLines: 1, + overflow: TextOverflow.ellipsis, + )), + ], + ), + ); + } + + return Container( + child: Row( + children: [ + Container( + width: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(5), bottomLeft: Radius.circular(5)), + color: meeting.background, + ), + ), + Expanded( + child: Container( + alignment: Alignment.center, + color: meeting.background.withOpacity(0.8), + padding: EdgeInsets.only(left: 2), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + meeting.eventName, + style: TextStyle( + color: Colors.white, + fontSize: 12, + fontWeight: FontWeight.w500, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + ), + Text( + 'Time: ${DateFormat('hh:mm a').format(meeting.from)} - ' + + '${DateFormat('hh:mm a').format(meeting.to)}', + style: TextStyle( + color: Colors.white, + fontSize: 10, + ), + maxLines: 1, + softWrap: false, + overflow: TextOverflow.ellipsis, + ) + ], + )), + _getScheduleAppointmentIcon(meeting), + Container( + margin: EdgeInsets.all(0), + width: 30, + alignment: Alignment.center, + child: Icon( + meeting.icon, + size: 20, + color: Colors.white, + ), + ), + ], + ))), + Container( + margin: EdgeInsets.all(0), + width: 20, + decoration: BoxDecoration( + shape: BoxShape.rectangle, + borderRadius: BorderRadius.only( + topRight: Radius.circular(5), + bottomRight: Radius.circular(5)), + color: meeting.background, + ), + ), + ], + ), + ); + } + + Widget _getScheduleAppointmentIcon(_Meeting meeting) { + if (meeting.eventName == 'General Meeting') { + return Container( + margin: EdgeInsets.all(0), + width: 30, + alignment: Alignment.center, + child: Icon( + Icons.priority_high_outlined, + size: 20, + color: Colors.red, + ), + ); + } + + return Container( + width: 30, + ); + } + + /// Returns the calendar widget based on the properties passed. + SfCalendar _getCustomizationCalendar( + [CalendarController _calendarController, + CalendarDataSource _calendarDataSource, + ViewChangedCallback viewChangedCallback, + CalendarAppointmentBuilder appointmentBuilder]) { + return SfCalendar( + controller: _calendarController, + dataSource: _calendarDataSource, + allowedViews: _allowedViews, + appointmentBuilder: appointmentBuilder, + showNavigationArrow: model.isWeb, + showDatePickerButton: true, + cellEndPadding: 3, + onViewChanged: viewChangedCallback, + monthViewSettings: MonthViewSettings( + appointmentDisplayMode: MonthAppointmentDisplayMode.appointment, + showTrailingAndLeadingDates: true, + appointmentDisplayCount: 3), + timeSlotViewSettings: TimeSlotViewSettings( + timelineAppointmentHeight: 50, + timeIntervalWidth: 100, + minimumAppointmentDuration: const Duration(minutes: 60))); + } +} + +/// An object to set the appointment collection data source to collection, which +/// used to map the custom appointment data to the calendar appointment, and +/// allows to add, remove or reset the appointment collection. +class _MeetingDataSource extends CalendarDataSource { + _MeetingDataSource(this.source); + + List<_Meeting> source; + + @override + List get appointments => source; + + @override + DateTime getStartTime(int index) { + return source[index].from; + } + + @override + DateTime getEndTime(int index) { + return source[index].to; + } + + @override + bool isAllDay(int index) { + return source[index].isAllDay; + } + + @override + String getSubject(int index) { + return source[index].eventName; + } + + @override + Color getColor(int index) { + return source[index].background; + } +} + +/// Custom business object class which contains properties to hold the detailed +/// information about the event data which will be rendered in calendar. +class _Meeting { + _Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay, + this.notes, this.image, this.icon); + + String eventName; + DateTime from; + DateTime to; + Color background; + bool isAllDay; + String notes; + String image; + IconData icon; +} diff --git a/lib/samples/calendar/getting_started/getting_started.dart b/lib/samples/calendar/getting_started.dart similarity index 59% rename from lib/samples/calendar/getting_started/getting_started.dart rename to lib/samples/calendar/getting_started.dart index 1f94b0fa..36ac4865 100644 --- a/lib/samples/calendar/getting_started/getting_started.dart +++ b/lib/samples/calendar/getting_started.dart @@ -2,6 +2,7 @@ import 'dart:math'; ///Package imports +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -9,8 +10,7 @@ import 'package:flutter/scheduler.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; -import '../../../widgets/switch.dart'; +import '../../model/sample_view.dart'; /// Widget of getting started calendar class GettingStartedCalendar extends SampleView { @@ -24,11 +24,10 @@ class GettingStartedCalendar extends SampleView { class _GettingStartedCalendarState extends SampleViewState { _GettingStartedCalendarState(); - List subjectCollection; - List colorCollection; - List<_Meeting> meetings; - List blackoutDates; - _MeetingDataSource events; + List _subjectCollection; + List _colorCollection; + List _blackoutDates; + _MeetingDataSource _events; DateTime _minDate, _maxDate; CalendarController _calendarController; @@ -44,7 +43,7 @@ class _GettingStartedCalendarState extends SampleViewState { bool _showDatePickerButton = true; bool _allowViewNavigation = true; - ScrollController controller; + ScrollController _controller; /// Global key used to maintain the state, when we change the parent of the /// widget @@ -58,11 +57,10 @@ class _GettingStartedCalendarState extends SampleViewState { _calendarController = CalendarController(); _calendarController.view = CalendarView.month; _globalKey = GlobalKey(); - controller = ScrollController(); - blackoutDates = []; - meetings = <_Meeting>[]; + _controller = ScrollController(); + _blackoutDates = []; addAppointmentDetails(); - events = _MeetingDataSource(meetings); + _events = _MeetingDataSource(<_Meeting>[]); _minDate = DateTime.now().subtract(const Duration(days: 365 ~/ 2)); _maxDate = DateTime.now().add(const Duration(days: 365 ~/ 2)); super.initState(); @@ -70,36 +68,36 @@ class _GettingStartedCalendarState extends SampleViewState { @override Widget build([BuildContext context]) { - final Widget _calendar = Theme( + final Widget calendar = Theme( /// The key set here to maintain the state, /// when we change the parent of the widget key: _globalKey, data: model.themeData.copyWith(accentColor: model.backgroundColor), - child: _getGettingStartedCalendar(_calendarController, events, + child: _getGettingStartedCalendar(_calendarController, _events, _onViewChanged, _minDate, _maxDate, scheduleViewBuilder)); - final double _screenHeight = MediaQuery.of(context).size.height; + final double screenHeight = MediaQuery.of(context).size.height; return Scaffold( body: Row(children: [ Expanded( child: _calendarController.view == CalendarView.month && model.isWeb && - _screenHeight < 800 + screenHeight < 800 ? Scrollbar( isAlwaysShown: true, - controller: controller, + controller: _controller, child: ListView( - controller: controller, + controller: _controller, children: [ Container( color: model.cardThemeColor, height: 600, - child: _calendar, + child: calendar, ) ], )) - : Container(color: model.cardThemeColor, child: _calendar), + : Container(color: model.cardThemeColor, child: calendar), ) ]), ); @@ -110,7 +108,7 @@ class _GettingStartedCalendarState extends SampleViewState { /// details new appointment collection added to the calendar void _onViewChanged(ViewChangedDetails visibleDatesChangedDetails) { final List<_Meeting> appointment = <_Meeting>[]; - events.appointments.clear(); + _events.appointments.clear(); final Random random = Random(); final List blockedDates = []; if (_calendarController.view == CalendarView.month || @@ -125,9 +123,9 @@ class _GettingStartedCalendarState extends SampleViewState { setState(() { if (_calendarController.view == CalendarView.month || _calendarController.view == CalendarView.timelineMonth) { - blackoutDates = blockedDates; + _blackoutDates = blockedDates; } else { - blackoutDates?.clear(); + _blackoutDates?.clear(); } }); }); @@ -142,22 +140,17 @@ class _GettingStartedCalendarState extends SampleViewState { blockedDates.contains(date)) { continue; } - final int count = - model.isWeb ? 1 + random.nextInt(2) : 1 + random.nextInt(3); + final int count = 1 + random.nextInt(model.isWeb ? 2 : 3); for (int j = 0; j < count; j++) { final DateTime startDate = DateTime( date.year, date.month, date.day, 8 + random.nextInt(8), 0, 0); appointment.add(_Meeting( - subjectCollection[random.nextInt(7)], - '', - '', - null, - startDate, - startDate.add(Duration(hours: random.nextInt(3))), - colorCollection[random.nextInt(9)], - false, - '', - '')); + _subjectCollection[random.nextInt(7)], + startDate, + startDate.add(Duration(hours: random.nextInt(3))), + _colorCollection[random.nextInt(9)], + false, + )); } } } else { @@ -174,154 +167,164 @@ class _GettingStartedCalendarState extends SampleViewState { final DateTime startDate = DateTime( date.year, date.month, date.day, 8 + random.nextInt(8), 0, 0); appointment.add(_Meeting( - subjectCollection[random.nextInt(7)], - '', - '', - null, - startDate, - startDate.add(Duration(hours: random.nextInt(3))), - colorCollection[random.nextInt(9)], - false, - '', - '')); + _subjectCollection[random.nextInt(7)], + startDate, + startDate.add(Duration(hours: random.nextInt(3))), + _colorCollection[random.nextInt(9)], + false, + )); } } } for (int i = 0; i < appointment.length; i++) { - events.appointments.add(appointment[i]); + _events.appointments.add(appointment[i]); } /// Resets the newly created appointment collection to render /// the appointments on the visible dates. - events.notifyListeners(CalendarDataSourceAction.reset, appointment); + _events.notifyListeners(CalendarDataSourceAction.reset, appointment); } /// Creates the required appointment details as a list. void addAppointmentDetails() { - subjectCollection = []; - subjectCollection.add('General Meeting'); - subjectCollection.add('Plan Execution'); - subjectCollection.add('Project Plan'); - subjectCollection.add('Consulting'); - subjectCollection.add('Support'); - subjectCollection.add('Development Meeting'); - subjectCollection.add('Scrum'); - subjectCollection.add('Project Completion'); - subjectCollection.add('Release updates'); - subjectCollection.add('Performance Check'); - - colorCollection = []; - colorCollection.add(const Color(0xFF0F8644)); - colorCollection.add(const Color(0xFF8B1FA9)); - colorCollection.add(const Color(0xFFD20100)); - colorCollection.add(const Color(0xFFFC571D)); - colorCollection.add(const Color(0xFF36B37B)); - colorCollection.add(const Color(0xFF01A1EF)); - colorCollection.add(const Color(0xFF3D4FB5)); - colorCollection.add(const Color(0xFFE47C73)); - colorCollection.add(const Color(0xFF636363)); - colorCollection.add(const Color(0xFF0A8043)); + _subjectCollection = []; + _subjectCollection.add('General Meeting'); + _subjectCollection.add('Plan Execution'); + _subjectCollection.add('Project Plan'); + _subjectCollection.add('Consulting'); + _subjectCollection.add('Support'); + _subjectCollection.add('Development Meeting'); + _subjectCollection.add('Scrum'); + _subjectCollection.add('Project Completion'); + _subjectCollection.add('Release updates'); + _subjectCollection.add('Performance Check'); + + _colorCollection = []; + _colorCollection.add(const Color(0xFF0F8644)); + _colorCollection.add(const Color(0xFF8B1FA9)); + _colorCollection.add(const Color(0xFFD20100)); + _colorCollection.add(const Color(0xFFFC571D)); + _colorCollection.add(const Color(0xFF36B37B)); + _colorCollection.add(const Color(0xFF01A1EF)); + _colorCollection.add(const Color(0xFF3D4FB5)); + _colorCollection.add(const Color(0xFFE47C73)); + _colorCollection.add(const Color(0xFF636363)); + _colorCollection.add(const Color(0xFF0A8043)); } @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - Text('Allow view navigation', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context) - .copyWith(canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _allowViewNavigation, - valueChanged: (dynamic value) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Text('Allow view navigation', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: _allowViewNavigation, + onChanged: (bool value) { setState(() { _allowViewNavigation = value; + stateSetter(() {}); }); }, - activeColor: model.backgroundColor, - ))), - ), - ) - ], + )), + ), + ), + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - Text('Show date picker button', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context) - .copyWith(canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _showDatePickerButton, - valueChanged: (dynamic value) { + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Text('Show date picker button', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: _showDatePickerButton, + onChanged: (bool value) { setState(() { _showDatePickerButton = value; + stateSetter(() {}); }); }, - activeColor: model.backgroundColor, - ))), - ), - ) - ], + )), + ), + ), + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - child: Text('Show trailing and leading dates', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context) - .copyWith(canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _showLeadingAndTrailingDates, - valueChanged: (dynamic value) { + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.max, + children: [ + Expanded( + child: Text('Show trailing and leading dates', + style: + TextStyle(fontSize: 16.0, color: model.textColor))), + Container( + padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + child: Align( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: _showLeadingAndTrailingDates, + onChanged: (bool value) { setState(() { _showLeadingAndTrailingDates = value; + stateSetter(() {}); }); }, - activeColor: model.backgroundColor, - ))), - ), - ) - ], + )), + )), + ), + ) + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the calendar widget based on the properties passed. @@ -341,7 +344,7 @@ class _GettingStartedCalendarState extends SampleViewState { showDatePickerButton: _showDatePickerButton, allowViewNavigation: _allowViewNavigation, onViewChanged: viewChangedCallback, - blackoutDates: blackoutDates, + blackoutDates: _blackoutDates, blackoutDatesTextStyle: TextStyle( decoration: model.isWeb ? null : TextDecoration.lineThrough, color: Colors.red), @@ -441,16 +444,6 @@ class _MeetingDataSource extends CalendarDataSource { return source[index].eventName; } - @override - String getStartTimeZone(int index) { - return source[index].startTimeZone; - } - - @override - String getEndTimeZone(int index) { - return source[index].endTimeZone; - } - @override Color getColor(int index) { return source[index].background; @@ -460,26 +453,11 @@ class _MeetingDataSource extends CalendarDataSource { /// Custom business object class which contains properties to hold the detailed /// information about the event data which will be rendered in calendar. class _Meeting { - _Meeting( - this.eventName, - this.organizer, - this.contactID, - this.capacity, - this.from, - this.to, - this.background, - this.isAllDay, - this.startTimeZone, - this.endTimeZone); + _Meeting(this.eventName, this.from, this.to, this.background, this.isAllDay); String eventName; - String organizer; - String contactID; - int capacity; DateTime from; DateTime to; Color background; bool isAllDay; - String startTimeZone; - String endTimeZone; } diff --git a/lib/samples/calendar/heatmap/heatmap.dart b/lib/samples/calendar/heatmap.dart similarity index 99% rename from lib/samples/calendar/heatmap/heatmap.dart rename to lib/samples/calendar/heatmap.dart index 54677740..8bef9512 100644 --- a/lib/samples/calendar/heatmap/heatmap.dart +++ b/lib/samples/calendar/heatmap.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Colors used as background color for various month cells in this sample const Color _kLightGrey = Color.fromRGBO(238, 238, 238, 1); diff --git a/lib/samples/calendar/recurrence/recurrence.dart b/lib/samples/calendar/recurrence.dart similarity index 99% rename from lib/samples/calendar/recurrence/recurrence.dart rename to lib/samples/calendar/recurrence.dart index bc7d6f28..180019fa 100644 --- a/lib/samples/calendar/recurrence/recurrence.dart +++ b/lib/samples/calendar/recurrence.dart @@ -9,8 +9,8 @@ import 'package:flutter/scheduler.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; -import '../getting_started/getting_started.dart'; +import '../../model/sample_view.dart'; +import 'getting_started.dart'; /// Widget class of recurrence calendar class RecurrenceCalendar extends SampleView { diff --git a/lib/samples/calendar/schedule_view/schedule_view.dart b/lib/samples/calendar/schedule_view.dart similarity index 97% rename from lib/samples/calendar/schedule_view/schedule_view.dart rename to lib/samples/calendar/schedule_view.dart index d3f90320..a73a60ac 100644 --- a/lib/samples/calendar/schedule_view/schedule_view.dart +++ b/lib/samples/calendar/schedule_view.dart @@ -8,8 +8,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; -import '../getting_started/getting_started.dart'; +import '../../model/sample_view.dart'; +import 'getting_started.dart'; /// Widget class of Schedule view calendar class ScheduleViewCalendar extends SampleView { diff --git a/lib/samples/calendar/shift_scheduler/shift_scheduler.dart b/lib/samples/calendar/shift_scheduler.dart similarity index 95% rename from lib/samples/calendar/shift_scheduler/shift_scheduler.dart rename to lib/samples/calendar/shift_scheduler.dart index 13e42fd5..fee96804 100644 --- a/lib/samples/calendar/shift_scheduler/shift_scheduler.dart +++ b/lib/samples/calendar/shift_scheduler.dart @@ -7,8 +7,8 @@ import 'package:flutter/scheduler.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; -import '../appointment_editor/appointment_editor.dart'; +import '../../model/sample_view.dart'; +import 'appointment_editor.dart'; /// Widget class of shift scheduler calendar class ShiftScheduler extends SampleView { @@ -70,7 +70,8 @@ class _ShiftSchedulerState extends SampleViewState { /// Condition added to open the editor, when the calendar elements tapped /// other than the header. if (calendarTapDetails.targetElement == CalendarElement.header || - calendarTapDetails.targetElement == CalendarElement.viewHeader) { + calendarTapDetails.targetElement == CalendarElement.viewHeader || + calendarTapDetails.targetElement == CalendarElement.resourceHeader) { return; } @@ -421,6 +422,7 @@ class _ShiftSchedulerState extends SampleViewState { startTime: DateTime(date.year, date.month, date.day, 13, 0, 0), endTime: DateTime(date.year, date.month, date.day, 14, 0, 0), text: 'Lunch', + color: Colors.grey.withOpacity(0.2), resourceIds: [_employeeCollection[i].id], recurrenceRule: 'FREQ=DAILY;INTERVAL=1')); @@ -433,8 +435,9 @@ class _ShiftSchedulerState extends SampleViewState { _specialTimeRegions.add(TimeRegion( startTime: startDate, - endTime: startDate.add(Duration(hours: 3)), + endTime: startDate.add(Duration(hours: 1)), text: 'Not Available', + color: Colors.grey.withOpacity(0.2), enablePointerInteraction: false, resourceIds: [_employeeCollection[i].id], )); @@ -478,6 +481,31 @@ class _ShiftSchedulerState extends SampleViewState { } } + Widget _getSpecialRegionWidget( + BuildContext context, TimeRegionDetails details) { + if (details.region.text == 'Lunch') { + return Container( + color: details.region.color, + alignment: Alignment.center, + child: Icon( + Icons.restaurant_menu, + color: Colors.grey.withOpacity(0.5), + ), + ); + } else if (details.region.text == 'Not Available') { + return Container( + color: details.region.color, + alignment: Alignment.center, + child: Icon( + Icons.block, + color: Colors.grey.withOpacity(0.5), + ), + ); + } + + return Container(color: details.region.color); + } + /// Returns the calendar widget based on the properties passed SfCalendar _getShiftScheduler( [CalendarDataSource _calendarDataSource, @@ -487,6 +515,7 @@ class _ShiftSchedulerState extends SampleViewState { showDatePickerButton: true, controller: _calendarController, allowedViews: _allowedViews, + timeRegionBuilder: _getSpecialRegionWidget, specialRegions: _specialTimeRegions, showNavigationArrow: model.isWeb, dataSource: _calendarDataSource, diff --git a/lib/samples/calendar/special_regions/special_regions.dart b/lib/samples/calendar/special_regions.dart similarity index 79% rename from lib/samples/calendar/special_regions/special_regions.dart rename to lib/samples/calendar/special_regions.dart index 3dfa531a..828fcf05 100644 --- a/lib/samples/calendar/special_regions/special_regions.dart +++ b/lib/samples/calendar/special_regions.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of special region schedule class SpecialRegionsCalendar extends SampleView { @@ -73,12 +73,33 @@ class _SpecialRegionsCalendarState extends SampleViewState { recurrenceRule: 'FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR', )); + regions.add(TimeRegion( + startTime: DateTime(date.year, date.month, date.day, 10, 0, 0), + endTime: DateTime(date.year, date.month, date.day, 11, 0, 0), + enablePointerInteraction: false, + textStyle: const TextStyle(color: Colors.black45, fontSize: 15), + color: Colors.grey.withOpacity(0.2), + text: 'Not Available', + recurrenceRule: 'FREQ=WEEKLY;INTERVAL=1;BYDAY=TU', + )); + + regions.add(TimeRegion( + startTime: DateTime(date.year, date.month, date.day, 15, 0, 0), + endTime: DateTime(date.year, date.month, date.day, 16, 0, 0), + enablePointerInteraction: false, + textStyle: const TextStyle(color: Colors.black45, fontSize: 15), + color: Colors.grey.withOpacity(0.2), + text: 'Not Available', + recurrenceRule: 'FREQ=WEEKLY;INTERVAL=1;BYDAY=WE', + )); + regions.add(TimeRegion( startTime: DateTime(date.year, date.month, date.day, 13, 0, 0), endTime: DateTime(date.year, date.month, date.day, 14, 0, 0), enablePointerInteraction: false, textStyle: const TextStyle(color: Colors.black45, fontSize: 15), color: Colors.grey.withOpacity(0.2), + text: 'Lunch', recurrenceRule: 'FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR', )); @@ -159,6 +180,31 @@ class _SpecialRegionsCalendarState extends SampleViewState { ])); } + Widget _getSpecialRegionWidget( + BuildContext context, TimeRegionDetails details) { + if (details.region.text == 'Lunch') { + return Container( + color: details.region.color, + alignment: Alignment.center, + child: Icon( + Icons.restaurant, + color: Colors.grey.withOpacity(0.5), + ), + ); + } else if (details.region.text == 'Not Available') { + return Container( + color: details.region.color, + alignment: Alignment.center, + child: Icon( + Icons.block, + color: Colors.grey.withOpacity(0.5), + ), + ); + } + + return Container(color: details.region.color); + } + /// Return the calendar widget based on the properties passed SfCalendar _getSpecialRegionCalendar( {List regions, _DataSource dataSource}) { @@ -168,6 +214,7 @@ class _SpecialRegionsCalendarState extends SampleViewState { showDatePickerButton: true, allowedViews: _allowedViews, specialRegions: regions, + timeRegionBuilder: _getSpecialRegionWidget, timeSlotViewSettings: TimeSlotViewSettings( minimumAppointmentDuration: const Duration(minutes: 30)), dataSource: dataSource, diff --git a/lib/samples/calendar/timeline_views/timeline_views.dart b/lib/samples/calendar/timeline_views.dart similarity index 77% rename from lib/samples/calendar/timeline_views/timeline_views.dart rename to lib/samples/calendar/timeline_views.dart index ccc5797c..05aa664c 100644 --- a/lib/samples/calendar/timeline_views/timeline_views.dart +++ b/lib/samples/calendar/timeline_views.dart @@ -9,7 +9,7 @@ import 'package:flutter/scheduler.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of getting started calendar class TimelineViewsCalendar extends SampleView { @@ -23,11 +23,10 @@ class TimelineViewsCalendar extends SampleView { class _TimelineViewsCalendarState extends SampleViewState { _TimelineViewsCalendarState(); - List subjectCollection; - List colorCollection; - List<_Meeting> meetings; - List blackoutDates; - _MeetingDataSource events; + List _subjectCollection; + List _colorCollection; + List _blackoutDates; + _MeetingDataSource _events; CalendarController _calendarController; final List _allowedViews = [ @@ -41,10 +40,9 @@ class _TimelineViewsCalendarState extends SampleViewState { void initState() { _calendarController = CalendarController(); _calendarController.view = CalendarView.timelineMonth; - blackoutDates = []; - meetings = <_Meeting>[]; + _blackoutDates = []; addAppointmentDetails(); - events = _MeetingDataSource(meetings); + _events = _MeetingDataSource(<_Meeting>[]); super.initState(); } @@ -59,7 +57,7 @@ class _TimelineViewsCalendarState extends SampleViewState { data: model.themeData .copyWith(accentColor: model.backgroundColor), child: _getTimelineViewsCalendar( - _calendarController, events, _onViewChanged))), + _calendarController, _events, _onViewChanged))), ) ]), ); @@ -70,7 +68,7 @@ class _TimelineViewsCalendarState extends SampleViewState { /// details new appointment collection added to the calendar void _onViewChanged(ViewChangedDetails visibleDatesChangedDetails) { final List<_Meeting> appointment = <_Meeting>[]; - events.appointments.clear(); + _events.appointments.clear(); final Random random = Random(); final List blockedDates = []; if (_calendarController.view == CalendarView.timelineMonth) { @@ -83,9 +81,9 @@ class _TimelineViewsCalendarState extends SampleViewState { SchedulerBinding.instance.addPostFrameCallback((timeStamp) { setState(() { if (_calendarController.view == CalendarView.timelineMonth) { - blackoutDates = blockedDates; + _blackoutDates = blockedDates; } else { - blackoutDates?.clear(); + _blackoutDates?.clear(); } }); }); @@ -105,13 +103,13 @@ class _TimelineViewsCalendarState extends SampleViewState { final DateTime startDate = DateTime( date.year, date.month, date.day, 8 + random.nextInt(8), 0, 0); appointment.add(_Meeting( - subjectCollection[random.nextInt(7)], + _subjectCollection[random.nextInt(7)], '', '', null, startDate, startDate.add(Duration(hours: random.nextInt(3))), - colorCollection[random.nextInt(9)], + _colorCollection[random.nextInt(9)], false, '', '', @@ -120,39 +118,39 @@ class _TimelineViewsCalendarState extends SampleViewState { } for (int i = 0; i < appointment.length; i++) { - events.appointments.add(appointment[i]); + _events.appointments.add(appointment[i]); } /// Resets the newly created appointment collection to render /// the appointments on the visible dates. - events.notifyListeners(CalendarDataSourceAction.reset, appointment); + _events.notifyListeners(CalendarDataSourceAction.reset, appointment); } /// Creates the required appointment details as a list. void addAppointmentDetails() { - subjectCollection = []; - subjectCollection.add('General Meeting'); - subjectCollection.add('Plan Execution'); - subjectCollection.add('Project Plan'); - subjectCollection.add('Consulting'); - subjectCollection.add('Support'); - subjectCollection.add('Development Meeting'); - subjectCollection.add('Scrum'); - subjectCollection.add('Project Completion'); - subjectCollection.add('Release updates'); - subjectCollection.add('Performance Check'); + _subjectCollection = []; + _subjectCollection.add('General Meeting'); + _subjectCollection.add('Plan Execution'); + _subjectCollection.add('Project Plan'); + _subjectCollection.add('Consulting'); + _subjectCollection.add('Support'); + _subjectCollection.add('Development Meeting'); + _subjectCollection.add('Scrum'); + _subjectCollection.add('Project Completion'); + _subjectCollection.add('Release updates'); + _subjectCollection.add('Performance Check'); - colorCollection = []; - colorCollection.add(const Color(0xFF0F8644)); - colorCollection.add(const Color(0xFF8B1FA9)); - colorCollection.add(const Color(0xFFD20100)); - colorCollection.add(const Color(0xFFFC571D)); - colorCollection.add(const Color(0xFF36B37B)); - colorCollection.add(const Color(0xFF01A1EF)); - colorCollection.add(const Color(0xFF3D4FB5)); - colorCollection.add(const Color(0xFFE47C73)); - colorCollection.add(const Color(0xFF636363)); - colorCollection.add(const Color(0xFF0A8043)); + _colorCollection = []; + _colorCollection.add(const Color(0xFF0F8644)); + _colorCollection.add(const Color(0xFF8B1FA9)); + _colorCollection.add(const Color(0xFFD20100)); + _colorCollection.add(const Color(0xFFFC571D)); + _colorCollection.add(const Color(0xFF36B37B)); + _colorCollection.add(const Color(0xFF01A1EF)); + _colorCollection.add(const Color(0xFF3D4FB5)); + _colorCollection.add(const Color(0xFFE47C73)); + _colorCollection.add(const Color(0xFF636363)); + _colorCollection.add(const Color(0xFF0A8043)); } /// Returns the calendar widget based on the properties passed. @@ -167,7 +165,7 @@ class _TimelineViewsCalendarState extends SampleViewState { showNavigationArrow: model.isWeb, showDatePickerButton: true, onViewChanged: viewChangedCallback, - blackoutDates: blackoutDates, + blackoutDates: _blackoutDates, blackoutDatesTextStyle: TextStyle( decoration: model.isWeb ? null : TextDecoration.lineThrough, color: Colors.red), diff --git a/lib/samples/chart/axis_features/axis_cross_base_value.dart b/lib/samples/chart/axis_features/axis_cross_base_value.dart deleted file mode 100644 index 1e43b530..00000000 --- a/lib/samples/chart/axis_features/axis_cross_base_value.dart +++ /dev/null @@ -1,200 +0,0 @@ -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Package import -import 'package:flutter/material.dart'; - -/// Local imports -import '../../../model/sample_view.dart'; -// import '../../../widgets/checkbox.dart'; -// import '../../../widgets/custom_button.dart'; -import '../../../widgets/custom_dropdown.dart'; -// import '../../../widgets/shared/mobile.dart' -// if (dart.library.html) '../../../widgets/shared/web.dart'; - -/// Renders the spline chart with axis crossing sample. -class AxisCrossingBaseValue extends SampleView { - ///Creates default axis crossing sample, chart widget - const AxisCrossingBaseValue(Key key) : super(key: key); - - @override - _AxisCrossingBaseValueState createState() => _AxisCrossingBaseValueState(); -} - -/// State class of the spline chart with axis crossing. -class _AxisCrossingBaseValueState extends SampleViewState { - _AxisCrossingBaseValueState(); - final List _axis = ['-2 (modified)', '0 (default)'].toList(); - final List _series = ['column', 'area'].toList(); - String _selectedSeriesType = 'column'; - String _selectedSeries; - //ignore: unused_field - String _selectedAxisType = '-2 (modified)'; - String _selectedAxis; - double _crossAt = 0; - // bool _isPlaceLabelsNearAxisLine = true; - - @override - void initState() { - _selectedAxisType = '-2 (modified)'; - _selectedAxis = '-2 (modified)'; - _selectedSeriesType = 'column'; - _selectedSeries = 'column'; - _crossAt = -2; - // _isPlaceLabelsNearAxisLine = true; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return _getAxisCrossingBaseValueSample(); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Row( - children: [ - Text('Chart type', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedSeries, - item: _series.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'column', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSeriesTypeChange(value.toString()); - }), - ), - )) - ], - ), - Row( - children: [ - Text('Axis base\nvalue ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedAxis, - item: _axis.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '-2 (modified)', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAxisTypeChange(value.toString()); - }), - ), - )) - ], - ), - ], - ); - } - - /// Returns the spline chart with axis crossing at provided axis value. - SfCartesianChart _getAxisCrossingBaseValueSample() { - return SfCartesianChart( - plotAreaBorderWidth: 0, - title: ChartTitle( - text: isCardView ? '' : 'Population growth rate of countries'), - primaryXAxis: CategoryAxis( - majorGridLines: MajorGridLines(width: 0), - labelIntersectAction: AxisLabelIntersectAction.wrap, - crossesAt: _crossAt, - placeLabelsNearAxisLine: false), - primaryYAxis: NumericAxis( - minimum: -2, maximum: 2, majorTickLines: MajorTickLines(size: 0)), - series: _getSeries(_selectedSeriesType), - tooltipBehavior: - TooltipBehavior(enable: true, header: '', canShowMarker: false), - ); - } - - /// Returns the list of chart series which need to render on - /// the bar or column chart with axis crossing. - - List> _getSeries(String seriesType) { - List> chart = null; - final List chartData = [ - ChartSampleData(x: 'Iceland', y: 1.13), - ChartSampleData(x: 'Algeria', y: 1.7), - ChartSampleData(x: 'Singapore', y: 1.82), - ChartSampleData(x: 'Malaysia', y: 1.37), - ChartSampleData(x: 'Moldova', y: -1.05), - ChartSampleData(x: 'American Samoa', y: -1.3), - ChartSampleData(x: 'Latvia', y: -1.1) - ]; - if (seriesType == 'column') { - chart = >[ - ColumnSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - dataLabelSettings: DataLabelSettings( - isVisible: true, - labelAlignment: ChartDataLabelAlignment.middle, - alignment: ChartAlignment.center)), - ]; - } else if (seriesType == 'area') { - chart = >[ - AreaSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - markerSettings: MarkerSettings(isVisible: true)), - ]; - } - return chart; - } - - /// Method for updating the axis type on change. - void _onAxisTypeChange(String item) { - _selectedAxis = item; - if (_selectedAxis == '-2 (modified)') { - _selectedAxisType = '-2 (modified)'; - _crossAt = -2; - } else if (_selectedAxis == '0 (default)') { - _selectedAxisType = '0 (default)'; - _crossAt = 0; - } - setState(() { - /// update the axis type changes - }); - } - - /// Method for updating the series type on change. - void _onSeriesTypeChange(String item) { - _selectedSeries = item; - if (_selectedSeries == 'column') { - _selectedSeriesType = 'column'; - } else if (_selectedSeries == 'area') { - _selectedSeriesType = 'area'; - } - setState(() { - /// update the series type changes - }); - } -} diff --git a/lib/samples/chart/axis_features/axis_crossing/axis_crossing.dart b/lib/samples/chart/axis_features/axis_crossing/axis_crossing.dart deleted file mode 100644 index ec6a4d9f..00000000 --- a/lib/samples/chart/axis_features/axis_crossing/axis_crossing.dart +++ /dev/null @@ -1,279 +0,0 @@ -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Package import -import 'package:flutter/material.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/custom_button.dart'; -import '../../../../widgets/custom_dropdown.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; - -/// Renders the spline chart with axis crossing sample. -class AxisCrossing extends SampleView { - ///Creates default axis crossing sample, chart widget - const AxisCrossing(Key key) : super(key: key); - - @override - _AxisCrossingState createState() => _AxisCrossingState(); -} - -/// State class of the spline chart with axis crossing. -class _AxisCrossingState extends SampleViewState { - _AxisCrossingState(); - final List _axis = ['x', 'y'].toList(); - // final List _series = ['column', 'bar', 'spline'].toList(); - String _selectedSeriesType = 'column'; - //ignore: unused_field - String _selectedSeries; - String _selectedAxisType = 'x'; - String _selectedAxis; - double _crossAt = 0; - bool _isPlaceLabelsNearAxisLine = true; - - @override - void initState() { - _selectedAxisType = 'x'; - _selectedAxis = 'x'; - _selectedSeriesType = 'column'; - _selectedSeries = 'column'; - _crossAt = 0; - _isPlaceLabelsNearAxisLine = true; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return _getAxisCrossingSample(); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - // Row(children: [ - // Text('Chart type', - // style: TextStyle(fontSize: 16.0, color: model.textColor)), - // Container( - // padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - // height: 50, - // width: 150, - // child: Align( - // alignment: Alignment.bottomCenter, - // child: Theme( - // data: Theme.of(context).copyWith( - // canvasColor: model.bottomSheetBackgroundColor), - // child: DropDown( - // value: _selectedSeries, - // item: _series.map((String value) { - // return DropdownMenuItem( - // value: (value != null) ? value : 'column', - // child: Text('$value', - // style: TextStyle(color: model.textColor))); - // }).toList(), - // valueChanged: (dynamic value) { - // _onSeriesTypeChange(value.toString()); - // }), - // ), - // )) - // ],), - Row( - children: [ - Text('Axis', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedAxis, - item: _axis.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'x', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAxisTypeChange(value.toString()); - }), - ), - )) - ], - ), - Row( - children: [ - Text('Cross at', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: -8, - maxValue: 8, - initialValue: _crossAt, - onChanged: (double val) => setState(() { - _crossAt = val; - }), - step: 2, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ], - ), - Row( - children: [ - Text('Labels near\naxisline', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _isPlaceLabelsNearAxisLine, - valueChanged: (dynamic value) { - setState(() { - _isPlaceLabelsNearAxisLine = value; - }); - }, - ), - ), - ], - ), - ], - ); - } - - /// Returns the spline chart with axis crossing at provided axis value. - SfCartesianChart _getAxisCrossingSample() { - return SfCartesianChart( - plotAreaBorderWidth: 0, - title: ChartTitle(text: isCardView ? '' : 'Spline Interpolation'), - legend: Legend(isVisible: !isCardView), - primaryXAxis: NumericAxis( - minimum: -8, - maximum: 8, - interval: 2, - placeLabelsNearAxisLine: isCardView - ? true - : _selectedAxisType == 'x' - ? _isPlaceLabelsNearAxisLine ?? true - : true, - crossesAt: _selectedAxisType == 'x' ? _crossAt ?? 0 : 0, - minorTicksPerInterval: 3), - primaryYAxis: NumericAxis( - minimum: -8, - maximum: 8, - interval: 2, - placeLabelsNearAxisLine: isCardView - ? true - : _selectedAxisType == 'y' - ? _isPlaceLabelsNearAxisLine ?? true - : true, - crossesAt: _selectedAxisType == 'y' ? _crossAt ?? 0 : 0, - minorTicksPerInterval: 3), - series: _getSeries(_selectedSeriesType), - tooltipBehavior: - TooltipBehavior(enable: true, header: '', canShowMarker: false), - ); - } - - /// Returns the list of chart series which need to render on - /// the spline chart with axis crossing. - - List> _getSeries(String seriesType) { - List> chart = null; - final List chartData = [ - ChartSampleData(x: -7, y: -3), - ChartSampleData(x: -4.5, y: -2), - ChartSampleData(x: -3.5, y: 0), - ChartSampleData(x: -3, y: 2), - ChartSampleData(x: 0, y: 7), - ChartSampleData(x: 3, y: 2), - ChartSampleData(x: 3.5, y: 0), - ChartSampleData(x: 4.5, y: -2), - ChartSampleData(x: 7, y: -3), - ]; - chart = >[ - SplineSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - color: const Color.fromRGBO(20, 122, 20, 1), - name: 'Cubic Interpolation', - width: 2), - ]; - // if(seriesType == 'column'){ - // chart = >[ - // ColumnSeries( - // dataSource: chartData, - // xValueMapper: (ChartSampleData sales, _) => sales.x, - // yValueMapper: (ChartSampleData sales, _) => sales.y, - // color: const Color.fromRGBO(20, 122, 20, 1), - // name: 'Cubic Interpolation', - // width: 0.7), - // ]; - // } - // else if(seriesType == 'bar'){ - // chart = >[ - // BarSeries( - // dataSource: chartData, - // xValueMapper: (ChartSampleData sales, _) => sales.x, - // yValueMapper: (ChartSampleData sales, _) => sales.y, - // color: const Color.fromRGBO(20, 122, 20, 1), - // name: 'Cubic Interpolation', - // width: 0.7), - // ]; - // } - // else if(seriesType == 'spline'){ - // chart = >[ - // SplineSeries( - // dataSource: chartData, - // xValueMapper: (ChartSampleData sales, _) => sales.x, - // yValueMapper: (ChartSampleData sales, _) => sales.y, - // color: const Color.fromRGBO(20, 122, 20, 1), - // name: 'Cubic Interpolation', - // width: 2), - // ]; - // } - return chart; - } - - /// Method for updating the axis type on change. - void _onAxisTypeChange(String item) { - _selectedAxis = item; - if (_selectedAxis == 'x') { - _selectedAxisType = 'x'; - } else if (_selectedAxis == 'y') { - _selectedAxisType = 'y'; - } - setState(() { - /// update the axis type changes - }); - } - // /// Method for updating the series type on change. - // void _onSeriesTypeChange(String item) { - // _selectedSeries = item; - // if (_selectedSeries == 'column') { - // _selectedSeriesType = 'column'; - // } else if (_selectedSeries == 'bar') { - // _selectedSeriesType = 'bar'; - // } else if (_selectedSeries == 'spline') { - // _selectedSeriesType = 'spline'; - // } - // setState(() { - // /// update the series type changes - // }); - // } -} diff --git a/lib/samples/chart/axis_features/axis_animation/axis_animation.dart b/lib/samples/chart/cartesian_charts/axis_features/axis_animation.dart similarity index 85% rename from lib/samples/chart/axis_features/axis_animation/axis_animation.dart rename to lib/samples/chart/cartesian_charts/axis_features/axis_animation.dart index 958372aa..89576df0 100644 --- a/lib/samples/chart/axis_features/axis_animation/axis_animation.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/axis_animation.dart @@ -10,7 +10,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; /// Renders the default axis animation chart widget class AxisAnimationDefault extends SampleView { @@ -59,35 +58,33 @@ class _AxisAnimationDefaultState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Enable axis elements\nanimation', - textAlign: TextAlign.start, - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _animation, - valueChanged: (dynamic value) { - setState(() { - _animation = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Enable axis elements\nanimation', + textAlign: TextAlign.start, + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _animation, + onChanged: (bool value) { + setState(() { + _animation = value; + stateSetter(() {}); + }); + })), + ) + ], + ); + }); } @override diff --git a/lib/samples/chart/cartesian_charts/axis_features/axis_crossing.dart b/lib/samples/chart/cartesian_charts/axis_features/axis_crossing.dart new file mode 100644 index 00000000..f01ecbce --- /dev/null +++ b/lib/samples/chart/cartesian_charts/axis_features/axis_crossing.dart @@ -0,0 +1,194 @@ +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Package import +import 'package:flutter/material.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; + +/// Renders the spline chart with axis crossing sample. +class AxisCrossing extends SampleView { + ///Creates default axis crossing sample, chart widget + const AxisCrossing(Key key) : super(key: key); + + @override + _AxisCrossingState createState() => _AxisCrossingState(); +} + +/// State class of the spline chart with axis crossing. +class _AxisCrossingState extends SampleViewState { + _AxisCrossingState(); + final List _axis = ['x', 'y'].toList(); + // final List _series = ['column', 'bar', 'spline'].toList(); + String _selectedSeriesType = 'column'; + //ignore: unused_field + String _selectedSeries; + String _selectedAxisType = 'x'; + String _selectedAxis; + double _crossAt = 0; + bool _isPlaceLabelsNearAxisLine = true; + + @override + void initState() { + _selectedAxisType = 'x'; + _selectedAxis = 'x'; + _selectedSeriesType = 'column'; + _selectedSeries = 'column'; + _crossAt = 0; + _isPlaceLabelsNearAxisLine = true; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return _getAxisCrossingSample(); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Row( + children: [ + Text('Axis ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(138, 0, 0, 0), + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedAxis, + items: _axis.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'X', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onAxisTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), + Row( + children: [ + Text('Cross At ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(85, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: -8, + maxValue: 8, + initialValue: _crossAt, + onChanged: (double val) => setState(() { + _crossAt = val; + }), + step: 2, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ), + ], + ), + Row( + children: [ + Text('Labels Near Axisline', + style: TextStyle(color: model.textColor, fontSize: 16)), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _isPlaceLabelsNearAxisLine, + onChanged: (bool value) { + setState(() { + _isPlaceLabelsNearAxisLine = value; + stateSetter(() {}); + }); + })), + ], + ), + ], + ); + }); + } + + /// Returns the spline chart with axis crossing at provided axis value. + SfCartesianChart _getAxisCrossingSample() { + return SfCartesianChart( + plotAreaBorderWidth: 0, + title: ChartTitle(text: isCardView ? '' : 'Spline Interpolation'), + legend: Legend(isVisible: !isCardView), + primaryXAxis: NumericAxis( + minimum: -8, + maximum: 8, + interval: 2, + placeLabelsNearAxisLine: isCardView + ? true + : _selectedAxisType == 'x' + ? _isPlaceLabelsNearAxisLine ?? true + : true, + crossesAt: _selectedAxisType == 'x' ? _crossAt ?? 0 : 0, + minorTicksPerInterval: 3), + primaryYAxis: NumericAxis( + minimum: -8, + maximum: 8, + interval: 2, + placeLabelsNearAxisLine: isCardView + ? true + : _selectedAxisType == 'y' + ? _isPlaceLabelsNearAxisLine ?? true + : true, + crossesAt: _selectedAxisType == 'y' ? _crossAt ?? 0 : 0, + minorTicksPerInterval: 3), + series: _getSeries(_selectedSeriesType), + tooltipBehavior: + TooltipBehavior(enable: true, header: '', canShowMarker: false), + ); + } + + /// Returns the list of chart series which need to render on + /// the spline chart with axis crossing. + + List> _getSeries(String seriesType) { + List> chart = null; + final List chartData = [ + ChartSampleData(x: -7, y: -3), + ChartSampleData(x: -4.5, y: -2), + ChartSampleData(x: -3.5, y: 0), + ChartSampleData(x: -3, y: 2), + ChartSampleData(x: 0, y: 7), + ChartSampleData(x: 3, y: 2), + ChartSampleData(x: 3.5, y: 0), + ChartSampleData(x: 4.5, y: -2), + ChartSampleData(x: 7, y: -3), + ]; + chart = >[ + SplineSeries( + dataSource: chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + color: const Color.fromRGBO(20, 122, 20, 1), + name: 'Cubic Interpolation', + width: 2), + ]; + return chart; + } + + /// Method for updating the axis type on change. + void _onAxisTypeChange(String item) { + _selectedAxis = item; + if (_selectedAxis == 'x') { + _selectedAxisType = 'x'; + } else if (_selectedAxis == 'y') { + _selectedAxisType = 'y'; + } + setState(() { + /// update the axis type changes + }); + } +} diff --git a/lib/samples/chart/axis_features/customized_axis_label.dart b/lib/samples/chart/cartesian_charts/axis_features/customized_axis_label.dart similarity index 99% rename from lib/samples/chart/axis_features/customized_axis_label.dart rename to lib/samples/chart/cartesian_charts/axis_features/customized_axis_label.dart index f45c479b..b1a24417 100644 --- a/lib/samples/chart/axis_features/customized_axis_label.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/customized_axis_label.dart @@ -11,7 +11,7 @@ import 'package:flutter/rendering.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; /// Renders the customized axis labels sample class CustomLabelsEvent extends SampleView { diff --git a/lib/samples/chart/axis_features/edge_label_placement/edgelabel_placement.dart b/lib/samples/chart/cartesian_charts/axis_features/edge_label_placement.dart similarity index 79% rename from lib/samples/chart/axis_features/edge_label_placement/edgelabel_placement.dart rename to lib/samples/chart/cartesian_charts/axis_features/edge_label_placement.dart index 3d7aa690..a095d9e7 100644 --- a/lib/samples/chart/axis_features/edge_label_placement/edgelabel_placement.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/edge_label_placement.dart @@ -7,7 +7,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Renders the edge label placement chart sample. class EdgeLabel extends SampleView { @@ -40,44 +39,42 @@ class _EdgeLabelState extends SampleViewState { @override Widget buildSettings(BuildContext buildContext) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Edge label placement', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Edge label placement', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( + )), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 100, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _edgeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'hide', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedType, + items: _edgeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'hide', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the spline with edge label placement chart. diff --git a/lib/samples/chart/axis_features/handling_label_collision/handling_label_collision.dart b/lib/samples/chart/cartesian_charts/axis_features/handling_label_collision.dart similarity index 74% rename from lib/samples/chart/axis_features/handling_label_collision/handling_label_collision.dart rename to lib/samples/chart/cartesian_charts/axis_features/handling_label_collision.dart index 55c3849c..53bf4cc4 100644 --- a/lib/samples/chart/axis_features/handling_label_collision/handling_label_collision.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/handling_label_collision.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Renders the label intersect action chart. class LabelAction extends SampleView { @@ -46,45 +45,34 @@ class _LabelActionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Intersect action ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _labelList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'hide', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange( - value.toString(), - ); - }), - ), - )), - ], + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Intersect action ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedType, + items: _labelList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'hide', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), ), - ), - ], - ); + ], + ); + }); } /// Returns the column chart with label intersect action option. diff --git a/lib/samples/chart/cartesian_charts/axis_features/maximum_width_for_labels.dart b/lib/samples/chart/cartesian_charts/axis_features/maximum_width_for_labels.dart new file mode 100644 index 00000000..51d7e4b9 --- /dev/null +++ b/lib/samples/chart/cartesian_charts/axis_features/maximum_width_for_labels.dart @@ -0,0 +1,203 @@ +/// Package imports +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; + +/// Renders the chart with sorting options sample. +class ChartMaximumLabelWidth extends SampleView { + /// Creates the chart with sorting options sample. + const ChartMaximumLabelWidth(Key key) : super(key: key); + + @override + _ChartMaximumLabelWidthState createState() => _ChartMaximumLabelWidthState(); +} + +/// State class the chart with sorting options. +class _ChartMaximumLabelWidthState extends SampleViewState { + _ChartMaximumLabelWidthState(); + double _xMaximumLabelWidth = 80; + double _xLabelsExtent = 80; + bool _isEnableLabelExtend = false; + // ignore: unused_field + bool _isEnableMaximumLabelWidth = true; + // ignore: unused_field + List _isSelected; + String _selectedType = 'Maximum label width'; + //ignore: unused_field + List _typeList = ['Maximum label width', 'Labels extent']; + + @override + void initState() { + _isSelected = [true, false]; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return _getmaximumLabelWidthChart(); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + child: Text('Maximum label\nwidth', + style: TextStyle(color: model.textColor)), + ), + Container( + padding: !model.isWeb + ? EdgeInsets.fromLTRB(32, 0, 0, 0) + : EdgeInsets.fromLTRB(42, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 120, + minValue: 1, + initialValue: _xMaximumLabelWidth, + onChanged: (double val) { + setState(() { + _xMaximumLabelWidth = val; + }); + }, + step: 10, + loop: true, + padding: 5.0, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + ) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Enable label extent', + style: TextStyle(color: model.textColor)), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _isEnableLabelExtend, + onChanged: (bool value) { + setState(() { + _isEnableLabelExtend = value; + stateSetter(() {}); + }); + })) + ], + )), + Container( + child: Visibility( + visible: _isEnableLabelExtend, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Labels extent', + style: TextStyle(color: model.textColor)), + Container( + padding: !model.isWeb + ? EdgeInsets.fromLTRB(40, 0, 0, 0) + : EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 200, + minValue: 1, + initialValue: _xLabelsExtent, + onChanged: (double val) { + setState(() { + _xLabelsExtent = val; + }); + }, + step: 10, + loop: true, + iconColor: model.textColor, + style: + TextStyle(fontSize: 16.0, color: model.textColor), + ), + ), + ], + )), + ), + ], + ); + }); + } + + /// Returns the Cartesian chart with sorting options. + SfCartesianChart _getmaximumLabelWidthChart() { + return SfCartesianChart( + title: ChartTitle(text: isCardView ? '' : "World's tallest buildings"), + plotAreaBorderWidth: 0, + onDataLabelRender: (DataLabelRenderArgs args) { + args.text = args.dataPoints[args.pointIndex].y.toString() + ' m'; + }, + onTooltipRender: (TooltipArgs args) { + args.text = args.dataPoints[args.pointIndex].x.toString() + + ' : ' + + args.dataPoints[args.pointIndex].y.toString() + + ' m'; + }, + primaryXAxis: CategoryAxis( + labelsExtent: _isEnableLabelExtend ? _xLabelsExtent : null, + maximumLabelWidth: _xMaximumLabelWidth, + majorGridLines: MajorGridLines(width: 0)), + primaryYAxis: NumericAxis( + title: AxisTitle(text: isCardView ? '' : 'Height (meters)'), + minimum: 500, + maximum: 900, + interval: 100, + majorTickLines: MajorTickLines(size: 0)), + series: _getDefaultSortingSeries(), + tooltipBehavior: + TooltipBehavior(enable: true, canShowMarker: false, header: ''), + ); + } + + /// Returns the list of chart series which need to + /// render on the chart with sorting options. + List> _getDefaultSortingSeries() { + final List chartData = [ + ChartSampleData(x: 'Goldin Finance 117', y: 597), + ChartSampleData(x: 'Ping An Finance Center', y: 599), + ChartSampleData(x: 'Makkah Clock Royal Tower', y: 601), + ChartSampleData(x: 'Shanghai Tower', y: 632), + ChartSampleData(x: 'Burj Khalifa', y: 828) + ]; + return >[ + BarSeries( + dataSource: chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + dataLabelSettings: + DataLabelSettings(isVisible: true, offset: Offset(-5, 0)), + ) + ]; + } + + void onTypeChange(String item) { + _selectedType = item; + if (_selectedType == 'Maximum label width') { + _isEnableMaximumLabelWidth = true; + _isEnableLabelExtend = false; + } + if (_selectedType == 'Labels extent') { + _isEnableLabelExtend = true; + _isEnableMaximumLabelWidth = false; + } + setState(() {}); + } +} diff --git a/lib/samples/chart/axis_features/multiple_axis_chart/multiple_axis_chart.dart b/lib/samples/chart/cartesian_charts/axis_features/multiple_axis_chart.dart similarity index 100% rename from lib/samples/chart/axis_features/multiple_axis_chart/multiple_axis_chart.dart rename to lib/samples/chart/cartesian_charts/axis_features/multiple_axis_chart.dart diff --git a/lib/samples/chart/axis_features/opposed_axes/opposed_axes.dart b/lib/samples/chart/cartesian_charts/axis_features/opposed_axes.dart similarity index 100% rename from lib/samples/chart/axis_features/opposed_axes/opposed_axes.dart rename to lib/samples/chart/cartesian_charts/axis_features/opposed_axes.dart diff --git a/lib/samples/chart/axis_features/plot_band/plot_band.dart b/lib/samples/chart/cartesian_charts/axis_features/plot_band.dart similarity index 86% rename from lib/samples/chart/axis_features/plot_band/plot_band.dart rename to lib/samples/chart/cartesian_charts/axis_features/plot_band.dart index 25f2ac8c..4b8c8e00 100644 --- a/lib/samples/chart/axis_features/plot_band/plot_band.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/plot_band.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Render the defauld plotband. class PlotBandDefault extends SampleView { @@ -30,40 +29,35 @@ class _PlotBandDefaultState extends SampleViewState { String _selectedType; @override Widget buildSettings(BuildContext context) { - return ListView(children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Plot band type', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _plotBandType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'horizontal', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPlotBandModeChange(value.toString()); - }), - ), - )) - ], - ), - ), - ]); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Plot band type', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedType, + items: _plotBandType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'horizontal', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPlotBandModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ); + }); } @override @@ -187,10 +181,16 @@ class _PlotBandDefaultState extends SampleViewState { isLine ? TextAnchor.start : TextAnchor.middle, // padding for plotband text verticalTextPadding: '-7', - borderWidth: isCardView ? 0 : isLine ? 2 : 0, + borderWidth: isCardView + ? 0 + : isLine + ? 2 + : 0, borderColor: isCardView ? Colors.black - : isLine ? const Color.fromRGBO(207, 85, 7, 1) : Colors.black, + : isLine + ? const Color.fromRGBO(207, 85, 7, 1) + : Colors.black, text: 'High Temperature', shouldRenderAboveSeries: false, color: const Color.fromRGBO(207, 85, 7, 1), @@ -207,7 +207,11 @@ class _PlotBandDefaultState extends SampleViewState { isLine ? TextAnchor.start : TextAnchor.middle, verticalTextAlignment: isLine ? TextAnchor.start : TextAnchor.middle, - borderWidth: isCardView ? 0 : isLine ? 2 : 0, + borderWidth: isCardView + ? 0 + : isLine + ? 2 + : 0, borderColor: isCardView ? Colors.black : isLine @@ -231,7 +235,11 @@ class _PlotBandDefaultState extends SampleViewState { isLine ? TextAnchor.start : TextAnchor.middle, verticalTextAlignment: isLine ? TextAnchor.start : TextAnchor.middle, - borderWidth: isCardView ? 0 : isLine ? 2 : 0, + borderWidth: isCardView + ? 0 + : isLine + ? 2 + : 0, borderColor: isCardView ? Colors.black : isLine diff --git a/lib/samples/chart/axis_features/plot_band/plot_band_recurrence.dart b/lib/samples/chart/cartesian_charts/axis_features/plot_band_recurrence.dart similarity index 76% rename from lib/samples/chart/axis_features/plot_band/plot_band_recurrence.dart rename to lib/samples/chart/cartesian_charts/axis_features/plot_band_recurrence.dart index 4e66fbe6..939c846a 100644 --- a/lib/samples/chart/axis_features/plot_band/plot_band_recurrence.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/plot_band_recurrence.dart @@ -7,9 +7,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; /// Renders the column chart with plotband recurrrence. class PlotBandRecurrence extends SampleView { @@ -39,56 +36,58 @@ class _PlotBandRecurrenceState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('X Axis', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('X Axis', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: xAxis, - valueChanged: (dynamic value) { - setState(() { - xAxis = value; - }); - }, - ), - ), - ], + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: xAxis, + onChanged: (bool value) { + setState(() { + xAxis = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Y Axis', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Y Axis', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: yAxis, - valueChanged: (dynamic value) { - setState(() { - yAxis = value; - }); - }, - ), - ), - ], + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: yAxis, + onChanged: (bool value) { + setState(() { + yAxis = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the ccolumn chart with plot band recurrence. diff --git a/lib/samples/chart/axis_features/positioning_axis_label/positioning_axis_label.dart b/lib/samples/chart/cartesian_charts/axis_features/positioning_axis_label.dart similarity index 50% rename from lib/samples/chart/axis_features/positioning_axis_label/positioning_axis_label.dart rename to lib/samples/chart/cartesian_charts/axis_features/positioning_axis_label.dart index d4ac87f9..2b099e80 100644 --- a/lib/samples/chart/axis_features/positioning_axis_label/positioning_axis_label.dart +++ b/lib/samples/chart/cartesian_charts/axis_features/positioning_axis_label.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Render the positioning axis label. class LabelCustomization extends SampleView { @@ -38,164 +37,152 @@ class _AxisCrossingState extends SampleViewState { ['start', 'end', 'center'].toList(); @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Y Axis', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor)), - ], + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Y Axis', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor)), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label position ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label position ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _ySelectedPositionType, - item: _yPositionType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'outside', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _ySelectedPositionType, + items: _yPositionType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'outside', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label alignment', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(5, 0, 0, 0), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label alignment', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _ySelectedAlignmentType, - item: _yAlignmentType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'start', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAlignmentChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _ySelectedAlignmentType, + items: _yAlignmentType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'start', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onAlignmentChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('X Axis', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor)), - ], + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('X Axis', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor)), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label position ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label position ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _xSelectedPositionType, - item: _xPositionType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'outside', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onXPositionChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _xSelectedPositionType, + items: _xPositionType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'outside', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onXPositionChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label alignment', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(5, 0, 0, 0), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label alignment', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _xSelectedAlignmentType, - item: _xAlignmentType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'center', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onXAlignmentChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _xSelectedAlignmentType, + items: _xAlignmentType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'center', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onXAlignmentChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/axis_types/category_types/default_category_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/category/default_category_axis.dart similarity index 98% rename from lib/samples/chart/axis_types/category_types/default_category_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/category/default_category_axis.dart index 2bbf661e..4a0a3121 100644 --- a/lib/samples/chart/axis_types/category_types/default_category_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/category/default_category_axis.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the column chart with default category axis. class CategoryDefault extends SampleView { diff --git a/lib/samples/chart/axis_types/category_types/indexed_category_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/category/indexed_category_axis.dart similarity index 75% rename from lib/samples/chart/axis_types/category_types/indexed_category_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/category/indexed_category_axis.dart index 94fd56e6..f953e3b0 100644 --- a/lib/samples/chart/axis_types/category_types/indexed_category_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/category/indexed_category_axis.dart @@ -5,10 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the arrange by index category axis chart sample. class CategoryIndexed extends SampleView { @@ -37,31 +34,32 @@ class _CategoryIndexedState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Row( - children: [ - Text('Arrange by index', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: isIndexed, - valueChanged: (dynamic value) { - setState(() { - isIndexed = value; - }); - }, - ), - ), - ], - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Arrange by index', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.only(left: 2.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: isIndexed, + onChanged: (bool value) { + setState(() { + isIndexed = value; + stateSetter(() {}); + }); + })), + ) + ], + ); + }); } /// Returns the column chart with arranged index. diff --git a/lib/samples/chart/axis_types/category_types/label_placement.dart b/lib/samples/chart/cartesian_charts/axis_types/category/label_placement.dart similarity index 71% rename from lib/samples/chart/axis_types/category_types/label_placement.dart rename to lib/samples/chart/cartesian_charts/axis_types/category/label_placement.dart index a07556ce..e309a53b 100644 --- a/lib/samples/chart/axis_types/category_types/label_placement.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/category/label_placement.dart @@ -5,8 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the line chart with category label placement sample. class CategoryTicks extends SampleView { @@ -39,41 +38,41 @@ class _CategoryTicksState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Row( - children: [ - Text('Label placement ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Row( + children: [ + Text('Label placement ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( + )), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), height: 50, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _labelPosition.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'betweenTicks', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - }), - ), - )), - ], - ), - ], - ); + alignment: Alignment.bottomCenter, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedType, + items: _labelPosition.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'betweenTicks', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), + ], + ); + }); } /// Returns the line chart with category label placement. diff --git a/lib/samples/chart/axis_types/date_time_types/date_time_axis_with_label_format.dart b/lib/samples/chart/cartesian_charts/axis_types/date_time/date_time_axis_with_label_format.dart similarity index 98% rename from lib/samples/chart/axis_types/date_time_types/date_time_axis_with_label_format.dart rename to lib/samples/chart/cartesian_charts/axis_types/date_time/date_time_axis_with_label_format.dart index 43bc8579..ebe30f2b 100644 --- a/lib/samples/chart/axis_types/date_time_types/date_time_axis_with_label_format.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/date_time/date_time_axis_with_label_format.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the scatter chart with datetime axis label format. class DateTimeLabel extends SampleView { diff --git a/lib/samples/chart/axis_types/date_time_types/default_date_time_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/date_time/default_date_time_axis.dart similarity index 99% rename from lib/samples/chart/axis_types/date_time_types/default_date_time_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/date_time/default_date_time_axis.dart index 44165030..c028ed73 100644 --- a/lib/samples/chart/axis_types/date_time_types/default_date_time_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/date_time/default_date_time_axis.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the line chart with default data time axis sample. class DateTimeDefault extends SampleView { diff --git a/lib/samples/chart/axis_types/logarithmic_types/default_logarithmic_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/logarithmic/default_logarithmic_axis.dart similarity index 98% rename from lib/samples/chart/axis_types/logarithmic_types/default_logarithmic_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/logarithmic/default_logarithmic_axis.dart index 57c8f9a9..80f650a6 100644 --- a/lib/samples/chart/axis_types/logarithmic_types/default_logarithmic_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/logarithmic/default_logarithmic_axis.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the line chart with default logarithmic axis sample. class LogarithmicAxisDefault extends SampleView { diff --git a/lib/samples/chart/axis_types/logarithmic_types/inversed_logarithmic_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/logarithmic/inversed_logarithmic_axis.dart similarity index 98% rename from lib/samples/chart/axis_types/logarithmic_types/inversed_logarithmic_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/logarithmic/inversed_logarithmic_axis.dart index b2967d9f..cb5e0915 100644 --- a/lib/samples/chart/axis_types/logarithmic_types/inversed_logarithmic_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/logarithmic/inversed_logarithmic_axis.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stepline chart with inversed logarithmic axis sample. class LogarithmicAxisInversed extends SampleView { diff --git a/lib/samples/chart/axis_types/numeric_types/default_numeric_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/numeric/default_numeric_axis.dart similarity index 98% rename from lib/samples/chart/axis_types/numeric_types/default_numeric_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/numeric/default_numeric_axis.dart index 1f6c01b5..2055baab 100644 --- a/lib/samples/chart/axis_types/numeric_types/default_numeric_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/numeric/default_numeric_axis.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the default numeric axis sample. class NumericDefault extends SampleView { diff --git a/lib/samples/chart/axis_types/numeric_types/inversed_numeric_axis.dart b/lib/samples/chart/cartesian_charts/axis_types/numeric/inversed_numeric_axis.dart similarity index 64% rename from lib/samples/chart/axis_types/numeric_types/inversed_numeric_axis.dart rename to lib/samples/chart/cartesian_charts/axis_types/numeric/inversed_numeric_axis.dart index a4666b13..8a64a2d4 100644 --- a/lib/samples/chart/axis_types/numeric_types/inversed_numeric_axis.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/numeric/inversed_numeric_axis.dart @@ -1,4 +1,5 @@ /// Package imports +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -6,10 +7,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; -import '../../../../widgets/switch.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the inversed numeric axis sample. class NumericInverse extends SampleView { @@ -28,46 +26,51 @@ class _NumericInverseState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView(children: [ - Row( - children: [ - Text('Inverse X axis', style: TextStyle(color: model.textColor)), - Padding( - padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), - child: HandCursor( - child: CustomSwitch( - activeColor: model.backgroundColor, - switchValue: isXInversed, - valueChanged: (dynamic value) { - setState(() { - isXInversed = value; - }); - }, - ), + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView(shrinkWrap: true, children: [ + Row( + children: [ + Text('Inverse X axis', style: TextStyle(color: model.textColor)), + Padding( + padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: isXInversed, + onChanged: (bool value) { + setState(() { + isXInversed = value; + stateSetter(() {}); + }); + }, + )), ), - ), - ], - ), - Row( - children: [ - Text('Inverse Y axis', style: TextStyle(color: model.textColor)), - Padding( - padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), - child: HandCursor( - child: CustomSwitch( - activeColor: model.backgroundColor, - switchValue: isYInversed, - valueChanged: (dynamic value) { - setState(() { - isYInversed = value; - }); - }, - ), + ], + ), + Row( + children: [ + Text('Inverse Y axis', style: TextStyle(color: model.textColor)), + Padding( + padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: isYInversed, + onChanged: (bool value) { + setState(() { + isYInversed = value; + stateSetter(() {}); + }); + }, + )), ), - ), - ], - ), - ]); + ], + ), + ]); + }); } @override diff --git a/lib/samples/chart/axis_types/numeric_types/numeric_axis_with_label_format.dart b/lib/samples/chart/cartesian_charts/axis_types/numeric/numeric_axis_with_label_format.dart similarity index 98% rename from lib/samples/chart/axis_types/numeric_types/numeric_axis_with_label_format.dart rename to lib/samples/chart/cartesian_charts/axis_types/numeric/numeric_axis_with_label_format.dart index f6ff7b9a..d1f5674f 100644 --- a/lib/samples/chart/axis_types/numeric_types/numeric_axis_with_label_format.dart +++ b/lib/samples/chart/cartesian_charts/axis_types/numeric/numeric_axis_with_label_format.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the numeric with axis label format. class NumericLabel extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_area_100_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_area_100_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series_100/stacked_area_100_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_area_100_chart.dart index 15030569..a2f9096c 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_area_100_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_area_100_chart.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked area 100 chart sample. class StackedArea100Chart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_bar_100_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_bar_100_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series_100/stacked_bar_100_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_bar_100_chart.dart index 942d6415..aa3468ce 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_bar_100_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_bar_100_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked bar 100 chart sample. class StackedBar100Chart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_column_100_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_column_100_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series_100/stacked_column_100_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_column_100_chart.dart index f43909f5..929bcb0d 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_column_100_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_column_100_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked column 100 chart sample. class StackedColumn100Chart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_line_100_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_line_100_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series_100/stacked_line_100_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_line_100_chart.dart index da095bf6..a6b7d134 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series_100/stacked_line_100_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/100%_stacked_charts/stacked_line_100_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked line 100 chart sample. class StackedLine100Chart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/area_series/animation_area_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/area_series/animation_area_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart index 47436c2c..09b6478e 100644 --- a/lib/samples/chart/cartesian_charts/area_series/animation_area_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/animation_area_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the animation area chart. class AnimationAreaDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/area_series/area_with_axis_base.dart b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_axis_base.dart similarity index 73% rename from lib/samples/chart/cartesian_charts/area_series/area_with_axis_base.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/area_with_axis_base.dart index 25212fd7..808d7dca 100644 --- a/lib/samples/chart/cartesian_charts/area_series/area_with_axis_base.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_axis_base.dart @@ -5,8 +5,7 @@ import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:flutter/material.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the spline chart with axis crossing sample. class AreaAxisCrossingBaseValue extends SampleView { @@ -41,38 +40,33 @@ class _AxisCrossingBaseValueState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Row( - children: [ - Text('Axis base value ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedAxis, - item: _axis.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '-2 (modified)', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAxisTypeChange(value.toString()); - }), - ), - )) - ], - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Axis base value ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedAxis, + items: _axis.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : '-2 (modified)', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onAxisTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ); + }); } /// Returns the spline chart with axis crossing at provided axis value. diff --git a/lib/samples/chart/cartesian_charts/area_series/area_with_emptypoints.dart b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_emptypoints.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/area_series/area_with_emptypoints.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/area_with_emptypoints.dart index 18ae2b9c..b149579c 100644 --- a/lib/samples/chart/cartesian_charts/area_series/area_with_emptypoints.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_emptypoints.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the area with empty points chart sample. class AreaEmpty extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/area_series/area_with_gradient.dart b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_gradient.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/area_series/area_with_gradient.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/area_with_gradient.dart index 3be0d60f..aa93a237 100644 --- a/lib/samples/chart/cartesian_charts/area_series/area_with_gradient.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/area_with_gradient.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the Area chart with gradient sample. class AreaGradient extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/area_series/default_area_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/area/default_area_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/area_series/default_area_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/default_area_chart.dart index e8380b53..cc77f637 100644 --- a/lib/samples/chart/cartesian_charts/area_series/default_area_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/default_area_chart.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the default area chart sample. class AreaDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/area_series/vertical_area_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/area/vertical_area_chart.dart similarity index 99% rename from lib/samples/chart/cartesian_charts/area_series/vertical_area_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/area/vertical_area_chart.dart index 11ddbe08..e9514216 100644 --- a/lib/samples/chart/cartesian_charts/area_series/vertical_area_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/area/vertical_area_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the vertical area chart sample. class AreaVertical extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart index 0c7e8e8c..ea494364 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/animation_bar_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/animation_bar_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the bar chart sample with dynamically updated data points. class AnimationBarDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bar_series/bar_width_and_spacing.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_width_and_spacing.dart similarity index 69% rename from lib/samples/chart/cartesian_charts/bar_series/bar_width_and_spacing.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/bar_width_and_spacing.dart index 8f9feb47..4a5c955a 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/bar_width_and_spacing.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_width_and_spacing.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_button.dart'; +import '../../../../../model/sample_view.dart'; +import '../../../../../widgets/custom_button.dart'; /// Renders the bar chart sample with bars width and space changing option. class BarSpacing extends SampleView { @@ -37,29 +37,26 @@ class _BarSpacingState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text('Width ', - style: TextStyle(fontSize: 14.0, color: model.textColor)), + Text('Width ', style: TextStyle(color: model.textColor)), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 1, - initialValue: columnWidth, - onChanged: (double val) => setState(() { - columnWidth = val; - }), - step: 0.1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 1, + initialValue: columnWidth, + onChanged: (double val) => setState(() { + columnWidth = val; + }), + step: 0.1, + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ), ], @@ -72,25 +69,22 @@ class _BarSpacingState extends SampleViewState { children: [ Padding( padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), - child: Text('Spacing ', - style: TextStyle(fontSize: 14.0, color: model.textColor)), + child: + Text('Spacing ', style: TextStyle(color: model.textColor)), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 1, - initialValue: columnSpacing, - onChanged: (double val) => setState(() { - columnSpacing = val; - }), - step: 0.1, - loop: true, - padding: 5.0, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 1, + initialValue: columnSpacing, + onChanged: (double val) => setState(() { + columnSpacing = val; + }), + step: 0.1, + loop: true, + padding: 5.0, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ) ], diff --git a/lib/samples/chart/cartesian_charts/bar_series/bar_with_rounded_corners.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_rounded_corners.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/bar_series/bar_with_rounded_corners.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_rounded_corners.dart index f7d8e5b6..c3db0778 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/bar_with_rounded_corners.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_rounded_corners.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the rounded corner bar chart sample. class BarRounded extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bar_series/bar_with_track.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_track.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/bar_series/bar_with_track.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_track.dart index 7f8ab3a8..bb517c37 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/bar_with_track.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/bar_with_track.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the bar chart sample with tracker. class BarTracker extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/customized_bar_chart.dart similarity index 81% rename from lib/samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/customized_bar_chart.dart index b1ff8f1a..ef3f9e1c 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/customized_bar_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/customized_bar_chart.dart @@ -1,15 +1,17 @@ /// Dart imports +import 'dart:async'; import 'dart:typed_data'; import 'dart:ui' as ui; /// Package import import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; /// Chart import import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the customized bar chart sample. class BarCustomization extends SampleView { @@ -30,6 +32,28 @@ bool isImageloaded = false; class _BarCustomizationState extends SampleViewState { _BarCustomizationState(); + Future _init() async { + final ByteData data = await rootBundle.load('images/dashline.png'); + image = await _loadImage(Uint8List.view(data.buffer)); + } + + Future _loadImage(List img) async { + final Completer completer = Completer(); + ui.decodeImageFromList(img, (ui.Image img) { + setState(() { + isImageloaded = true; + }); + return completer.complete(img); + }); + return completer.future; + } + + @override + void initState() { + super.initState(); + _init(); + } + @override Widget build(BuildContext context) { return _getCustomizedBarChart(); @@ -102,8 +126,10 @@ class BarCustomPainter extends BarSegment { ..color = Colors.black ..style = PaintingStyle.fill ..strokeWidth = 40 - ..shader = ImageShader( - image, TileMode.repeated, TileMode.repeated, deviceTransform); + ..shader = image == null + ? null + : ImageShader( + image, TileMode.repeated, TileMode.repeated, deviceTransform); final double devicePixelRatio = ui.window.devicePixelRatio; diff --git a/lib/samples/chart/cartesian_charts/bar_series/default_bar_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/bar/default_bar_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/bar_series/default_bar_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/bar/default_bar_chart.dart index 99a7a03b..8e35a864 100644 --- a/lib/samples/chart/cartesian_charts/bar_series/default_bar_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bar/default_bar_chart.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the default bar chart samnple. class BarDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/box_whiser.dart b/lib/samples/chart/cartesian_charts/chart_types/box_whisker.dart similarity index 67% rename from lib/samples/chart/cartesian_charts/other_series/box_whiser.dart rename to lib/samples/chart/cartesian_charts/chart_types/box_whisker.dart index 877cb83e..58db6a79 100644 --- a/lib/samples/chart/cartesian_charts/other_series/box_whiser.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/box_whisker.dart @@ -6,8 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/custom_dropdown.dart'; ///Renders histogram chart sample class BoxWhisker extends SampleView { @@ -26,71 +24,70 @@ class _BoxWhiskerState extends SampleViewState { ['normal', 'exclusive', 'inclusive'].toList(); @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Box plot mode ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectMode, - item: _modeType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'normal', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onModeChange(value.toString()); - }), - ), - )), - ], - )), - Container( - child: Row( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ - Text('Mean', - style: TextStyle( + Text('Box plot mode ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectMode, + items: _modeType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'normal', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + )), + Container( + child: Row( + children: [ + Text('Mean', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.fromLTRB(60, 0, 0, 0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _mean, - valueChanged: (dynamic value) { - setState(() { - _mean = value; - }); - }, + )), + Padding( + padding: const EdgeInsets.fromLTRB(60, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _mean, + onChanged: (bool value) { + setState(() { + _mean = value; + stateSetter(() {}); + }); + })), ), - ), - ], + ], + ), ), - ), - ], - ); + ], + ); + }); } @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 50), child: _getDefaultWhiskerChart()); } diff --git a/lib/samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart index 123391d8..c1bc9116 100644 --- a/lib/samples/chart/cartesian_charts/bubble_series/animation_bubble_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bubble/animation_bubble_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the bubble chart sample with dynamically updated data points. class AnimationBubbleDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bubble_series/bubble_filled_with_gradient.dart b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_filled_with_gradient.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/bubble_series/bubble_filled_with_gradient.dart rename to lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_filled_with_gradient.dart index 0ae4d758..9c838868 100644 --- a/lib/samples/chart/cartesian_charts/bubble_series/bubble_filled_with_gradient.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_filled_with_gradient.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the bubble with gradient chart sample class BubbleGradient extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_multiple_series.dart b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_multiple_series.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/bubble_series/bubble_with_multiple_series.dart rename to lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_multiple_series.dart index 218fb2cd..f52a9087 100644 --- a/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_multiple_series.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_multiple_series.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the multiple bubble series chart sample class BubbleMultiSeries extends SampleView { @@ -44,7 +44,7 @@ class _BubbleMultiSeriesState extends SampleViewState { isVisible: isCardView ? false : true, overflowMode: LegendItemOverflowMode.wrap), tooltipBehavior: TooltipBehavior( - textAlignment: ChartAlignment.near, + textAlignment: ChartAlignment.center, enable: true, header: '', canShowMarker: false, diff --git a/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_various_colors.dart b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_various_colors.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/bubble_series/bubble_with_various_colors.dart rename to lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_various_colors.dart index 90fcca13..100e2446 100644 --- a/lib/samples/chart/cartesian_charts/bubble_series/bubble_with_various_colors.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bubble/bubble_with_various_colors.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the bubble chart with point color sample class BubblePointColor extends SampleView { @@ -44,7 +44,7 @@ class _BubblePointColorState extends SampleViewState { majorTickLines: MajorTickLines(size: 0)), series: _getPointColorBubbleSeries(), tooltipBehavior: TooltipBehavior( - textAlignment: ChartAlignment.near, + textAlignment: ChartAlignment.center, enable: true, canShowMarker: false, header: '', diff --git a/lib/samples/chart/cartesian_charts/bubble_series/default_bubble_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/bubble/default_bubble_chart.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/bubble_series/default_bubble_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/bubble/default_bubble_chart.dart index cb02998d..c4308d0b 100644 --- a/lib/samples/chart/cartesian_charts/bubble_series/default_bubble_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/bubble/default_bubble_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the default bubble chart sample class BubbleDefault extends SampleView { @@ -41,7 +41,7 @@ class _BubbleDefaultState extends SampleViewState { title: AxisTitle(text: isCardView ? '' : 'GDP growth rate')), tooltipBehavior: TooltipBehavior( enable: true, - textAlignment: ChartAlignment.near, + textAlignment: ChartAlignment.center, header: '', canShowMarker: false, format: diff --git a/lib/samples/chart/cartesian_charts/column_series/animation_column_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/column_series/animation_column_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart index bec901b6..2ea47b77 100644 --- a/lib/samples/chart/cartesian_charts/column_series/animation_column_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/animation_column_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the column chart sample with dynamically updated data points. class AnimationColumnDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/column_series/back_to_back_column.dart b/lib/samples/chart/cartesian_charts/chart_types/column/back_to_back_column.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/column_series/back_to_back_column.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/back_to_back_column.dart index 3ce7f804..1c5c3540 100644 --- a/lib/samples/chart/cartesian_charts/column_series/back_to_back_column.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/back_to_back_column.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the back to back column chart sample class ColumnBack extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/column_series/column_width_and_spacing.dart b/lib/samples/chart/cartesian_charts/chart_types/column/column_width_and_spacing.dart similarity index 71% rename from lib/samples/chart/cartesian_charts/column_series/column_width_and_spacing.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/column_width_and_spacing.dart index 28066241..b3dc937e 100644 --- a/lib/samples/chart/cartesian_charts/column_series/column_width_and_spacing.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/column_width_and_spacing.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_button.dart'; +import '../../../../../model/sample_view.dart'; +import '../../../../../widgets/custom_button.dart'; /// Render the column chart with columns width and space change option class ColumnSpacing extends SampleView { @@ -37,31 +37,28 @@ class _ColumnSpacingState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text('Width ', - style: TextStyle(fontSize: 14.0, color: model.textColor)), + Text('Width ', style: TextStyle(color: model.textColor)), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 1, - initialValue: _columnWidth, - onChanged: (double val) { - setState(() { - _columnWidth = val; - }); - }, - step: 0.1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 1, + initialValue: _columnWidth, + onChanged: (double val) { + setState(() { + _columnWidth = val; + }); + }, + step: 0.1, + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ), ], @@ -74,27 +71,24 @@ class _ColumnSpacingState extends SampleViewState { children: [ Padding( padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), - child: Text('Spacing ', - style: TextStyle(fontSize: 14.0, color: model.textColor)), + child: + Text('Spacing ', style: TextStyle(color: model.textColor)), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 1, - initialValue: _columnSpacing, - onChanged: (double val) { - setState(() { - _columnSpacing = val; - }); - }, - step: 0.1, - loop: true, - padding: 5.0, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 1, + initialValue: _columnSpacing, + onChanged: (double val) { + setState(() { + _columnSpacing = val; + }); + }, + step: 0.1, + loop: true, + padding: 5.0, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ) ], diff --git a/lib/samples/chart/cartesian_charts/column_series/column_with_axis_base.dart b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_axis_base.dart similarity index 74% rename from lib/samples/chart/cartesian_charts/column_series/column_with_axis_base.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/column_with_axis_base.dart index 047f5062..3cb7209e 100644 --- a/lib/samples/chart/cartesian_charts/column_series/column_with_axis_base.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_axis_base.dart @@ -5,8 +5,7 @@ import 'package:syncfusion_flutter_charts/charts.dart'; import 'package:flutter/material.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the spline chart with axis crossing sample. class ColumnAxisCrossingBaseValue extends SampleView { @@ -41,38 +40,33 @@ class _AxisCrossingBaseValueState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Row( - children: [ - Text('Axis base value ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedAxis, - item: _axis.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '-2 (modified)', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAxisTypeChange(value.toString()); - }), - ), - )) - ], - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Axis base value ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedAxis, + items: _axis.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : '-2 (modified)', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onAxisTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ); + }); } /// Returns the spline chart with axis crossing at provided axis value. diff --git a/lib/samples/chart/cartesian_charts/column_series/column_with_rounded_corners.dart b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_rounded_corners.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/column_series/column_with_rounded_corners.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/column_with_rounded_corners.dart index ef582550..0e0191a4 100644 --- a/lib/samples/chart/cartesian_charts/column_series/column_with_rounded_corners.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_rounded_corners.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders column chart with rounded corners class ColumnRounded extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/column_series/column_with_track.dart b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_track.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/column_series/column_with_track.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/column_with_track.dart index 85e7d7a3..4a08c16b 100644 --- a/lib/samples/chart/cartesian_charts/column_series/column_with_track.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/column_with_track.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders column chart with trackers class ColumnTracker extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/column_series/customized_column_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/column/customized_column_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/column_series/customized_column_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/customized_column_chart.dart index 8d351ce9..1eb2148d 100644 --- a/lib/samples/chart/cartesian_charts/column_series/customized_column_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/customized_column_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders customized Column chart class ColumnVertical extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/column_series/default_column_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/column/default_column_chart.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/column_series/default_column_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/column/default_column_chart.dart index 4b05bcc2..fb58ece2 100644 --- a/lib/samples/chart/cartesian_charts/column_series/default_column_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/column/default_column_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders default column chart sample class ColumnDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/financial_series/candle_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/candle_chart.dart similarity index 84% rename from lib/samples/chart/cartesian_charts/financial_series/candle_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/financial_charts/candle_chart.dart index 02025b0b..81a4a9fe 100644 --- a/lib/samples/chart/cartesian_charts/financial_series/candle_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/candle_chart.dart @@ -6,8 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; +import '../../../../../model/sample_view.dart'; ///Renders default Candle series chart class CandleChart extends SampleView { @@ -24,52 +23,58 @@ class _CandleChartState extends SampleViewState { bool _toggleVisibility; @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Enable solid candles', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Enable solid candles', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _enableSolidCandle, - valueChanged: (dynamic value) { - setState(() { - _enableSolidCandle = value; - }); - }, - ), - ], + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableSolidCandle, + onChanged: (bool value) { + setState(() { + _enableSolidCandle = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Show indication for \nsame values', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Show indication for \nsame values', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _toggleVisibility, - valueChanged: (dynamic value) { - setState(() { - _toggleVisibility = value; - }); - }, - ), - ], + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _toggleVisibility, + onChanged: (bool value) { + setState(() { + _toggleVisibility = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/cartesian_charts/financial_series/hilo_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_chart.dart similarity index 87% rename from lib/samples/chart/cartesian_charts/financial_series/hilo_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_chart.dart index feda7ffc..a59db8d1 100644 --- a/lib/samples/chart/cartesian_charts/financial_series/hilo_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_chart.dart @@ -6,8 +6,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; +import '../../../../../model/sample_view.dart'; ///Renders default High- low series chart class HiloChart extends SampleView { @@ -24,34 +23,32 @@ class _HiloChartState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Show indication for\nsame values ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _toggleVisibility, - valueChanged: (dynamic value) { - setState(() { - _toggleVisibility = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Show indication for\nsame values ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _toggleVisibility, + onChanged: (bool value) { + setState(() { + _toggleVisibility = value; + stateSetter(() {}); + }); + })), + ) + ], + ); + }); } @override diff --git a/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_open_close_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_open_close_chart.dart new file mode 100644 index 00000000..24fb730c --- /dev/null +++ b/lib/samples/chart/cartesian_charts/chart_types/financial_charts/hilo_open_close_chart.dart @@ -0,0 +1,413 @@ +/// Package imports +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../../model/sample_view.dart'; + +///Renders default High-low-open-close series chart +class HiloOpenCloseChart extends SampleView { + ///Creates default High-low-open-close series chart + const HiloOpenCloseChart(Key key) : super(key: key); + + @override + _HiloOpenCloseChartState createState() => _HiloOpenCloseChartState(); +} + +class _HiloOpenCloseChartState extends SampleViewState { + _HiloOpenCloseChartState(); + bool _toggleVisibility; + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Show indication for\nsame values ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _toggleVisibility, + onChanged: (bool value) { + setState(() { + _toggleVisibility = value; + stateSetter(() {}); + }); + }), + )) + ], + ); + }); + } + + @override + Widget build(BuildContext context) { + return _getHiloOpenClose(); + } + + ///Get the cartesian chart with hilo open close series + SfCartesianChart _getHiloOpenClose() { + return SfCartesianChart( + plotAreaBorderWidth: 0, + title: ChartTitle(text: isCardView ? '' : 'AAPL - 2016'), + primaryXAxis: DateTimeAxis( + dateFormat: DateFormat.MMM(), + interval: 3, + intervalType: DateTimeIntervalType.months, + minimum: DateTime(2016, 01, 01), + maximum: DateTime(2017, 01, 01), + majorGridLines: MajorGridLines(width: 0)), + primaryYAxis: NumericAxis( + minimum: 140, + maximum: 60, + interval: 20, + labelFormat: '\${value}', + axisLine: AxisLine(width: 0)), + series: _getHiloOpenCloseSeries(), + trackballBehavior: TrackballBehavior( + enable: true, activationMode: ActivationMode.singleTap), + ); + } + + ///Get the hilo open close series + List> + _getHiloOpenCloseSeries() { + final List chartData = [ + ChartSampleData( + x: DateTime(2016, 01, 11), + open: 98.97, + high: 101.19, + low: 95.36, + close: 97.13), + ChartSampleData( + x: DateTime(2016, 01, 18), + open: 98.41, + high: 101.46, + low: 93.42, + close: 101.42), + ChartSampleData( + x: DateTime(2016, 01, 25), + open: 101.52, + high: 101.53, + low: 92.39, + close: 97.34), + ChartSampleData( + x: DateTime(2016, 02, 01), + open: 96.47, + high: 97.33, + low: 93.69, + close: 94.02), + ChartSampleData( + x: DateTime(2016, 02, 08), + open: 93.13, + high: 96.35, + low: 92.59, + close: 93.99), + ChartSampleData( + x: DateTime(2016, 02, 15), + open: 91.02, + high: 94.89, + low: 90.61, + close: 92.04), + ChartSampleData( + x: DateTime(2016, 02, 22), + open: 96.31, + high: 98.0237, + low: 98.0237, + close: 96.31), + ChartSampleData( + x: DateTime(2016, 02, 29), + open: 99.86, + high: 106.75, + low: 99.65, + close: 106.01), + ChartSampleData( + x: DateTime(2016, 03, 07), + open: 102.39, + high: 102.83, + low: 100.15, + close: 102.26), + ChartSampleData( + x: DateTime(2016, 03, 14), + open: 101.91, + high: 106.5, + low: 101.78, + close: 105.92), + ChartSampleData( + x: DateTime(2016, 03, 21), + open: 105.93, + high: 107.65, + low: 104.89, + close: 105.67), + ChartSampleData( + x: DateTime(2016, 03, 28), + open: 106, + high: 110.42, + low: 104.88, + close: 109.99), + ChartSampleData( + x: DateTime(2016, 04, 04), + open: 110.42, + high: 112.19, + low: 108.121, + close: 108.66), + ChartSampleData( + x: DateTime(2016, 04, 11), + open: 108.97, + high: 112.39, + low: 108.66, + close: 109.85), + ChartSampleData( + x: DateTime(2016, 04, 18), + open: 108.89, + high: 108.95, + low: 104.62, + close: 105.68), + ChartSampleData( + x: DateTime(2016, 04, 25), + open: 105, + high: 105.65, + low: 92.51, + close: 93.74), + ChartSampleData( + x: DateTime(2016, 05, 02), + open: 93.965, + high: 95.9, + low: 91.85, + close: 92.72), + ChartSampleData( + x: DateTime(2016, 05, 09), + open: 93, + high: 93.77, + low: 89.47, + close: 90.52), + ChartSampleData( + x: DateTime(2016, 05, 16), + open: 92.39, + high: 95.43, + low: 91.65, + close: 95.22), + ChartSampleData( + x: DateTime(2016, 05, 23), + open: 95.87, + high: 100.73, + low: 95.67, + close: 100.35), + ChartSampleData( + x: DateTime(2016, 05, 30), + open: 99.6, + high: 100.4, + low: 96.63, + close: 97.92), + ChartSampleData( + x: DateTime(2016, 06, 06), + open: 97.99, + high: 101.89, + low: 97.55, + close: 98.83), + ChartSampleData( + x: DateTime(2016, 06, 13), + open: 98.69, + high: 99.12, + low: 95.3, + close: 95.33), + ChartSampleData( + x: DateTime(2016, 06, 20), + open: 96, + high: 96.89, + low: 92.65, + close: 93.4), + ChartSampleData( + x: DateTime(2016, 06, 27), + open: 93, + high: 96.465, + low: 91.5, + close: 95.89), + ChartSampleData( + x: DateTime(2016, 07, 04), + open: 95.39, + high: 96.89, + low: 94.37, + close: 96.68), + ChartSampleData( + x: DateTime(2016, 07, 11), + open: 96.75, + high: 99.3, + low: 96.73, + close: 98.78), + ChartSampleData( + x: DateTime(2016, 07, 18), + open: 98.7, + high: 101, + low: 98.31, + close: 98.66), + ChartSampleData( + x: DateTime(2016, 07, 25), + open: 98.25, + high: 104.55, + low: 96.42, + close: 104.21), + ChartSampleData( + x: DateTime(2016, 08, 01), + open: 104.41, + high: 107.65, + low: 104, + close: 107.48), + ChartSampleData( + x: DateTime(2016, 08, 08), + open: 107.52, + high: 108.94, + low: 107.16, + close: 108.18), + ChartSampleData( + x: DateTime(2016, 08, 15), + open: 108.14, + high: 110.23, + low: 108.08, + close: 109.36), + ChartSampleData( + x: DateTime(2016, 08, 22), + open: 108.86, + high: 109.32, + low: 106.31, + close: 106.94), + ChartSampleData( + x: DateTime(2016, 08, 29), + open: 106.62, + high: 108, + low: 105.5, + close: 107.73), + ChartSampleData( + x: DateTime(2016, 09, 05), + open: 107.9, + high: 108.76, + low: 103.13, + close: 103.13), + ChartSampleData( + x: DateTime(2016, 09, 12), + open: 102.65, + high: 116.13, + low: 102.53, + close: 114.92), + ChartSampleData( + x: DateTime(2016, 09, 19), + open: 115.19, + high: 116.18, + low: 111.55, + close: 112.71), + ChartSampleData( + x: DateTime(2016, 09, 26), + open: 111.64, + high: 114.64, + low: 111.55, + close: 113.05), + ChartSampleData( + x: DateTime(2016, 10, 03), + open: 112.71, + high: 114.56, + low: 112.28, + close: 114.06), + ChartSampleData( + x: DateTime(2016, 10, 10), + open: 115.02, + high: 118.69, + low: 114.72, + close: 117.63), + ChartSampleData( + x: DateTime(2016, 10, 17), + open: 117.33, + high: 118.21, + low: 113.8, + close: 116.6), + ChartSampleData( + x: DateTime(2016, 10, 24), + open: 117.1, + high: 118.36, + low: 113.31, + close: 113.72), + ChartSampleData( + x: DateTime(2016, 10, 31), + open: 113.65, + high: 114.23, + low: 108.11, + close: 108.84), + ChartSampleData( + x: DateTime(2016, 11, 07), + open: 110.08, + high: 111.72, + low: 105.83, + close: 108.43), + ChartSampleData( + x: DateTime(2016, 11, 14), + open: 107.71, + high: 110.54, + low: 104.08, + close: 110.06), + ChartSampleData( + x: DateTime(2016, 11, 21), + open: 114.12, + high: 115.42, + low: 115.42, + close: 114.12), + ChartSampleData( + x: DateTime(2016, 11, 28), + open: 111.43, + high: 112.465, + low: 108.85, + close: 109.9), + ChartSampleData( + x: DateTime(2016, 12, 05), + open: 110, + high: 114.7, + low: 108.25, + close: 113.95), + ChartSampleData( + x: DateTime(2016, 12, 12), + open: 113.29, + high: 116.73, + low: 112.49, + close: 115.97), + ChartSampleData( + x: DateTime(2016, 12, 19), + open: 115.8, + high: 117.5, + low: 115.59, + close: 116.52), + ChartSampleData( + x: DateTime(2016, 12, 26), + open: 116.52, + high: 118.0166, + low: 115.43, + close: 115.82), + ]; + return >[ + HiloOpenCloseSeries( + dataSource: chartData, + name: 'AAPL', + showIndicationForSameValues: isCardView ? true : _toggleVisibility, + xValueMapper: (ChartSampleData sales, _) => sales.x, + + /// High, low, open and close values used to render the HLOC series. + lowValueMapper: (ChartSampleData sales, _) => sales.low, + highValueMapper: (ChartSampleData sales, _) => sales.high, + openValueMapper: (ChartSampleData sales, _) => sales.open, + closeValueMapper: (ChartSampleData sales, _) => sales.close) + ]; + } + + @override + void initState() { + _toggleVisibility = true; + super.initState(); + } +} diff --git a/lib/samples/chart/cartesian_charts/other_series/histogram_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/histogram.dart similarity index 84% rename from lib/samples/chart/cartesian_charts/other_series/histogram_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/histogram.dart index fd2b8a41..20a3658b 100644 --- a/lib/samples/chart/cartesian_charts/other_series/histogram_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/histogram.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; ///Renders histogram chart sample class HistogramDefault extends SampleView { @@ -22,40 +21,38 @@ class _HistogramDefaultState extends SampleViewState { bool _showDistributionCurve = true; @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Show distribution line ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _showDistributionCurve, - valueChanged: (dynamic value) { - setState(() { - _showDistributionCurve = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Show distribution line ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _showDistributionCurve, + onChanged: (bool value) { + setState(() { + _showDistributionCurve = value; + stateSetter(() {}); + }); + })), + ) + ], + ); + }); } @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 60), child: _getDefaultHistogramChart()); } @@ -197,7 +194,7 @@ class _HistogramDefaultState extends SampleViewState { binInterval: 20, /// It used to add the dashes line for distribution line. - curveDashArray: model.isWeb ? [0, 0] : [12, 3, 3, 3], + curveDashArray: [12, 3, 3, 3], width: 0.99, curveWidth: 2.5, yValueMapper: (ChartSampleData sales, _) => sales.x, diff --git a/lib/samples/chart/cartesian_charts/line_series/animation_line_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/line_series/animation_line_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart index 65a0853b..e5fdece2 100644 --- a/lib/samples/chart/cartesian_charts/line_series/animation_line_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/line/animation_line_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the line sample with dynamically updated data points. class AnimationLineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/line_series/customized_line_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/line/customized_line_chart.dart similarity index 99% rename from lib/samples/chart/cartesian_charts/line_series/customized_line_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/line/customized_line_chart.dart index 4318ddb5..4ba3ef46 100644 --- a/lib/samples/chart/cartesian_charts/line_series/customized_line_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/line/customized_line_chart.dart @@ -11,7 +11,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders customized line chart class CustomizedLine extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/line_series/default_line_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/line/default_line_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/line_series/default_line_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/line/default_line_chart.dart index dda3e7d4..65d35c04 100644 --- a/lib/samples/chart/cartesian_charts/line_series/default_line_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/line/default_line_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders default line series chart class LineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/line_series/line_with_dashes.dart b/lib/samples/chart/cartesian_charts/chart_types/line/line_with_dashes.dart similarity index 91% rename from lib/samples/chart/cartesian_charts/line_series/line_with_dashes.dart rename to lib/samples/chart/cartesian_charts/chart_types/line/line_with_dashes.dart index 3b6800bd..81d0955f 100644 --- a/lib/samples/chart/cartesian_charts/line_series/line_with_dashes.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/line/line_with_dashes.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders dashed line series sample class LineDashed extends SampleView { @@ -65,7 +65,7 @@ class _LineDashedState extends SampleViewState { animationDuration: 2500, /// The property uses to render a line with dashes. - dashArray: model.isWeb ? [0, 0] : [15, 3, 3, 3], + dashArray: [15, 3, 3, 3], dataSource: chartData, xValueMapper: (_ChartData sales, _) => sales.x, yValueMapper: (_ChartData sales, _) => sales.y, @@ -75,7 +75,7 @@ class _LineDashedState extends SampleViewState { LineSeries<_ChartData, num>( animationDuration: 2500, dataSource: chartData, - dashArray: model.isWeb ? [0, 0] : [15, 3, 3, 3], + dashArray: [15, 3, 3, 3], width: 2, name: 'Saudi Arabia', xValueMapper: (_ChartData sales, _) => sales.x, @@ -85,7 +85,7 @@ class _LineDashedState extends SampleViewState { animationDuration: 2500, dataSource: chartData, width: 2, - dashArray: model.isWeb ? [0, 0] : [15, 3, 3, 3], + dashArray: [15, 3, 3, 3], name: 'Spain', xValueMapper: (_ChartData sales, _) => sales.x, yValueMapper: (_ChartData sales, _) => sales.y3, @@ -94,7 +94,7 @@ class _LineDashedState extends SampleViewState { animationDuration: 2500, dataSource: chartData, width: 2, - dashArray: model.isWeb ? [0, 0] : [15, 3, 3, 3], + dashArray: [15, 3, 3, 3], name: 'Portugal', xValueMapper: (_ChartData sales, _) => sales.x, yValueMapper: (_ChartData sales, _) => sales.y4, diff --git a/lib/samples/chart/cartesian_charts/line_series/multi_colored_line.dart b/lib/samples/chart/cartesian_charts/chart_types/line/multi_colored_line.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/line_series/multi_colored_line.dart rename to lib/samples/chart/cartesian_charts/chart_types/line/multi_colored_line.dart index 683d1085..5c1428c6 100644 --- a/lib/samples/chart/cartesian_charts/line_series/multi_colored_line.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/line/multi_colored_line.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders line series with point color mapping class LineMultiColor extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/range_area.dart b/lib/samples/chart/cartesian_charts/chart_types/range_area.dart similarity index 100% rename from lib/samples/chart/cartesian_charts/other_series/range_area.dart rename to lib/samples/chart/cartesian_charts/chart_types/range_area.dart diff --git a/lib/samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart index c48539df..2db7c553 100644 --- a/lib/samples/chart/cartesian_charts/rangecolumn_series/animation_rangecolumn_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/range_column/animation_range_column_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the range column chart sample with dynamically updated data points. class AnimationRangeColumnDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/rangecolumn_series/default_rangecolumn_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/range_column/default_range_column_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/rangecolumn_series/default_rangecolumn_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/range_column/default_range_column_chart.dart index 295a8b8f..9c535055 100644 --- a/lib/samples/chart/cartesian_charts/rangecolumn_series/default_rangecolumn_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/range_column/default_range_column_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the default range column chart sample. class RangeColumnDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/rangecolumn_series/rangecolumn_with_track.dart b/lib/samples/chart/cartesian_charts/chart_types/range_column/range_column_with_track.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/rangecolumn_series/rangecolumn_with_track.dart rename to lib/samples/chart/cartesian_charts/chart_types/range_column/range_column_with_track.dart index 143e107f..5e7cfb7d 100644 --- a/lib/samples/chart/cartesian_charts/rangecolumn_series/rangecolumn_with_track.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/range_column/range_column_with_track.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the range column chart with tracker. class RangeColumnWithTrack extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/rangecolumn_series/vertical_rangecolumn_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/range_column/vertical_range_column_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/rangecolumn_series/vertical_rangecolumn_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/range_column/vertical_range_column_chart.dart index 1b6af1eb..5574e488 100644 --- a/lib/samples/chart/cartesian_charts/rangecolumn_series/vertical_rangecolumn_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/range_column/vertical_range_column_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the vertical range column chart. class RangeBarChart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart index fc542e5e..efb79f5e 100644 --- a/lib/samples/chart/cartesian_charts/scatter_series/animation_scatter_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/scatter/animation_scatter_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the Scatter chart sample with dynamically updated data points. class AnimationScatterDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/scatter_series/default_scatter_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/scatter/default_scatter_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/scatter_series/default_scatter_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/scatter/default_scatter_chart.dart index 97ae3ab5..c05714ff 100644 --- a/lib/samples/chart/cartesian_charts/scatter_series/default_scatter_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/scatter/default_scatter_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the default scatter chart sample. class ScatterDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/scatter_series/scatter_with_various_shapes.dart b/lib/samples/chart/cartesian_charts/chart_types/scatter/scatter_with_various_shapes.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/scatter_series/scatter_with_various_shapes.dart rename to lib/samples/chart/cartesian_charts/chart_types/scatter/scatter_with_various_shapes.dart index aa988e68..2314eac0 100644 --- a/lib/samples/chart/cartesian_charts/scatter_series/scatter_with_various_shapes.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/scatter/scatter_with_various_shapes.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the scatter chart with various shapes sample. class ScatterShapes extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart index 2ce1e4bc..44c25d8e 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/animation_spline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/animation_spline_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the spline chart sample with dynamically updated data points. class AnimationSplineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/spline_series/customized_spline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/customized_spline_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/spline_series/customized_spline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/customized_spline_chart.dart index 65895843..70facbd2 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/customized_spline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/customized_spline_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the customized spline chart sample. class SplineCustomization extends SampleView { @@ -61,7 +61,7 @@ class _SplineVerticalState extends SampleViewState { xValueMapper: (ChartSampleData sales, _) => sales.x, yValueMapper: (ChartSampleData sales, _) => sales.y, width: 2, - dashArray: model.isWeb ? [0, 0] : [10, 5]), + dashArray: [10, 5]), ], ); } diff --git a/lib/samples/chart/cartesian_charts/spline_series/default_spline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/default_spline_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/spline_series/default_spline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/default_spline_chart.dart index 697562ee..967b3ce1 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/default_spline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/default_spline_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the defaul spline chart sample. class SplineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/spline_series/spline_types.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/spline_types.dart similarity index 69% rename from lib/samples/chart/cartesian_charts/spline_series/spline_types.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/spline_types.dart index 3257a885..86f67424 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/spline_types.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/spline_types.dart @@ -5,8 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the spline types cahrt sample. class SplineTypes extends SampleView { @@ -40,44 +39,36 @@ class _SplineTypesState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Spline type ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedSplineType, - item: _splineList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'natural', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - }), - ), - )), - ], + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Spline type ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedSplineType, + items: _splineList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'natural', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), ), - ), - ], - ); + ], + ); + }); } /// Returns the spline types chart. diff --git a/lib/samples/chart/cartesian_charts/spline_series/spline_with_dashes.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/spline_with_dashes.dart similarity index 93% rename from lib/samples/chart/cartesian_charts/spline_series/spline_with_dashes.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/spline_with_dashes.dart index d3c0f9ef..64519197 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/spline_with_dashes.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/spline_with_dashes.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the dashed spline chart. class SplineDashed extends SampleView { @@ -95,20 +95,20 @@ class _SplineDashedState extends SampleViewState { name: 'Brazil', /// To apply the dashes line for spline. - dashArray: model.isWeb ? [0, 0] : [12, 3, 3, 3], + dashArray: [12, 3, 3, 3], markerSettings: MarkerSettings(isVisible: true)), SplineSeries( dataSource: chartData, width: 2, name: 'Sweden', - dashArray: model.isWeb ? [0, 0] : [12, 3, 3, 3], + dashArray: [12, 3, 3, 3], xValueMapper: (ChartSampleData sales, _) => sales.x, yValueMapper: (ChartSampleData sales, _) => sales.secondSeriesYValue, markerSettings: MarkerSettings(isVisible: true)), SplineSeries( dataSource: chartData, width: 2, - dashArray: model.isWeb ? [0, 0] : [12, 3, 3, 3], + dashArray: [12, 3, 3, 3], name: 'Greece', xValueMapper: (ChartSampleData sales, _) => sales.x, yValueMapper: (ChartSampleData sales, _) => sales.thirdSeriesYValue, diff --git a/lib/samples/chart/cartesian_charts/spline_series/vertical_spline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/spline/vertical_spline_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/spline_series/vertical_spline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline/vertical_spline_chart.dart index 3642a1fb..958bc2f4 100644 --- a/lib/samples/chart/cartesian_charts/spline_series/vertical_spline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/spline/vertical_spline_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the vertical spline chart sample. class SplineVertical extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/spline_area.dart b/lib/samples/chart/cartesian_charts/chart_types/spline_area.dart similarity index 100% rename from lib/samples/chart/cartesian_charts/other_series/spline_area.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline_area.dart diff --git a/lib/samples/chart/cartesian_charts/other_series/spline_range_area.dart b/lib/samples/chart/cartesian_charts/chart_types/spline_range_area.dart similarity index 100% rename from lib/samples/chart/cartesian_charts/other_series/spline_range_area.dart rename to lib/samples/chart/cartesian_charts/chart_types/spline_range_area.dart diff --git a/lib/samples/chart/cartesian_charts/stacked_series/stacked_area_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_area_chart.dart similarity index 99% rename from lib/samples/chart/cartesian_charts/stacked_series/stacked_area_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_area_chart.dart index 69285c2a..f57b409a 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series/stacked_area_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_area_chart.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked area chart sample. class StackedAreaChart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series/stacked_bar_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_bar_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series/stacked_bar_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_bar_chart.dart index 5b4c3d93..3b7b5ca2 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series/stacked_bar_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_bar_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked bar chart sample. class StackedBarChart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series/stacked_column_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_column_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series/stacked_column_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_column_chart.dart index 1b1bd252..f81140bd 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series/stacked_column_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_column_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked column chart sample. class StackedColumnChart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stacked_series/stacked_line_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_line_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stacked_series/stacked_line_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_line_chart.dart index 513ca9b2..5d00481c 100644 --- a/lib/samples/chart/cartesian_charts/stacked_series/stacked_line_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/stacked_charts/stacked_line_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stacked line chart sample. class StackedLineChart extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/step_area.dart b/lib/samples/chart/cartesian_charts/chart_types/step_area.dart similarity index 97% rename from lib/samples/chart/cartesian_charts/other_series/step_area.dart rename to lib/samples/chart/cartesian_charts/chart_types/step_area.dart index 7c55e42d..6792a3eb 100644 --- a/lib/samples/chart/cartesian_charts/other_series/step_area.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/step_area.dart @@ -23,7 +23,7 @@ class _StepAreaState extends SampleViewState { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 60), child: _getStepAreaChart()); } diff --git a/lib/samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart index d7914002..fd669017 100644 --- a/lib/samples/chart/cartesian_charts/stepLine_series/animation_stepline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/step_line/animation_step_line_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the stepline chart sample with dynamically updated data points. class AnimationStepLineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stepLine_series/default_stepline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/step_line/default_step_line_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stepLine_series/default_stepline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/step_line/default_step_line_chart.dart index 7c006708..87807bd1 100644 --- a/lib/samples/chart/cartesian_charts/stepLine_series/default_stepline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/step_line/default_step_line_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the default stepline chart sample. class StepLineDefault extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/stepLine_series/stepline_with_dashes.dart b/lib/samples/chart/cartesian_charts/chart_types/step_line/step_line_with_dashes.dart similarity index 91% rename from lib/samples/chart/cartesian_charts/stepLine_series/stepline_with_dashes.dart rename to lib/samples/chart/cartesian_charts/chart_types/step_line/step_line_with_dashes.dart index 67937034..388616fc 100644 --- a/lib/samples/chart/cartesian_charts/stepLine_series/stepline_with_dashes.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/step_line/step_line_with_dashes.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the dashed stepline chart sample. class StepLineDashed extends SampleView { @@ -97,28 +97,28 @@ class _StepLineDashedState extends SampleViewState { yValueMapper: (ChartSampleData data, _) => data.y, name: 'USA', width: 2, - dashArray: model.isWeb ? [0, 0] : [10, 5]), + dashArray: [10, 5]), StepLineSeries( dataSource: chartData, xValueMapper: (ChartSampleData data, _) => data.x, yValueMapper: (ChartSampleData data, _) => data.yValue, name: 'UK', width: 2, - dashArray: model.isWeb ? [0, 0] : [10, 5]), + dashArray: [10, 5]), StepLineSeries( dataSource: chartData, xValueMapper: (ChartSampleData data, _) => data.x, yValueMapper: (ChartSampleData data, _) => data.secondSeriesYValue, name: 'Korea', width: 2, - dashArray: model.isWeb ? [0, 0] : [10, 5]), + dashArray: [10, 5]), StepLineSeries( dataSource: chartData, xValueMapper: (ChartSampleData data, _) => data.x, yValueMapper: (ChartSampleData data, _) => data.thirdSeriesYValue, name: 'Japan', width: 2, - dashArray: model.isWeb ? [0, 0] : [10, 5]) + dashArray: [10, 5]) ]; } } diff --git a/lib/samples/chart/cartesian_charts/stepLine_series/vertical_stepline_chart.dart b/lib/samples/chart/cartesian_charts/chart_types/step_line/vertical_step_line_chart.dart similarity index 98% rename from lib/samples/chart/cartesian_charts/stepLine_series/vertical_stepline_chart.dart rename to lib/samples/chart/cartesian_charts/chart_types/step_line/vertical_step_line_chart.dart index b91c62b7..72fa50ec 100644 --- a/lib/samples/chart/cartesian_charts/stepLine_series/vertical_stepline_chart.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/step_line/vertical_step_line_chart.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the vertical stepline chart sample. class StepLineVertical extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/vertical_waterfall.dart b/lib/samples/chart/cartesian_charts/chart_types/waterfall/vertical_waterfall.dart similarity index 99% rename from lib/samples/chart/cartesian_charts/other_series/vertical_waterfall.dart rename to lib/samples/chart/cartesian_charts/chart_types/waterfall/vertical_waterfall.dart index ce2d62b4..eab12e85 100644 --- a/lib/samples/chart/cartesian_charts/other_series/vertical_waterfall.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/waterfall/vertical_waterfall.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders histogram chart sample class VerticalWaterFall extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/other_series/waterFall.dart b/lib/samples/chart/cartesian_charts/chart_types/waterfall/waterfall.dart similarity index 99% rename from lib/samples/chart/cartesian_charts/other_series/waterFall.dart rename to lib/samples/chart/cartesian_charts/chart_types/waterfall/waterfall.dart index 7a2f73fb..cbd19a0e 100644 --- a/lib/samples/chart/cartesian_charts/other_series/waterFall.dart +++ b/lib/samples/chart/cartesian_charts/chart_types/waterfall/waterfall.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders histogram chart sample class WaterFall extends SampleView { diff --git a/lib/samples/chart/data_binding/json_data.dart b/lib/samples/chart/cartesian_charts/data_source/json.dart similarity index 98% rename from lib/samples/chart/data_binding/json_data.dart rename to lib/samples/chart/cartesian_charts/data_source/json.dart index c52a4bb6..57146c12 100644 --- a/lib/samples/chart/data_binding/json_data.dart +++ b/lib/samples/chart/cartesian_charts/data_source/json.dart @@ -10,7 +10,7 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; ///Renders default line series chart class JsonData extends SampleView { diff --git a/lib/samples/chart/data_binding/local_data.dart b/lib/samples/chart/cartesian_charts/data_source/list.dart similarity index 99% rename from lib/samples/chart/data_binding/local_data.dart rename to lib/samples/chart/cartesian_charts/data_source/list.dart index 5c28658a..46a41a85 100644 --- a/lib/samples/chart/data_binding/local_data.dart +++ b/lib/samples/chart/cartesian_charts/data_source/list.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local import -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; ///Renders default line series chart class LocalData extends SampleView { diff --git a/lib/samples/chart/export/export.dart b/lib/samples/chart/cartesian_charts/export.dart similarity index 99% rename from lib/samples/chart/export/export.dart rename to lib/samples/chart/cartesian_charts/export.dart index f234039e..ba156ee6 100644 --- a/lib/samples/chart/export/export.dart +++ b/lib/samples/chart/cartesian_charts/export.dart @@ -3,17 +3,18 @@ import 'dart:async'; import 'dart:io'; import 'dart:ui' as dart_ui; -///Package imports +/// Package imports import 'package:flutter/material.dart'; import 'package:path_provider/path_provider.dart'; /// Chart import import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Pdf import import 'package:syncfusion_flutter_pdf/pdf.dart'; /// Local imports import '../../../model/sample_view.dart'; - import '../../pdf/helper/save_file_mobile.dart' if (dart.library.html) '../../pdf/helper/save_file_web.dart'; diff --git a/lib/samples/chart/cartesian_charts/financial_series/hilo_open_close_chart.dart b/lib/samples/chart/cartesian_charts/financial_series/hilo_open_close_chart.dart deleted file mode 100644 index e022cc5b..00000000 --- a/lib/samples/chart/cartesian_charts/financial_series/hilo_open_close_chart.dart +++ /dev/null @@ -1,418 +0,0 @@ -/// Package imports -import 'package:intl/intl.dart'; -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; - -///Renders default High-low-open-close series chart -class HiloOpenCloseChart extends SampleView { - ///Creates default High-low-open-close series chart - const HiloOpenCloseChart(Key key) : super(key: key); - - @override - _HiloOpenCloseChartState createState() => _HiloOpenCloseChartState(); -} - -class _HiloOpenCloseChartState extends SampleViewState { - _HiloOpenCloseChartState(); - bool _toggleVisibility; - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Show indication for\nsame values ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _toggleVisibility, - valueChanged: (dynamic value) { - setState(() { - _toggleVisibility = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); - } - - @override - Widget build(BuildContext context) { - return _getHiloOpenClose(); - } - - ///Get the cartesian chart with hilo open close series - SfCartesianChart _getHiloOpenClose() { - return SfCartesianChart( - plotAreaBorderWidth: 0, - title: ChartTitle(text: isCardView ? '' : 'AAPL - 2016'), - primaryXAxis: DateTimeAxis( - dateFormat: DateFormat.MMM(), - interval: 3, - intervalType: DateTimeIntervalType.months, - minimum: DateTime(2016, 01, 01), - maximum: DateTime(2017, 01, 01), - majorGridLines: MajorGridLines(width: 0)), - primaryYAxis: NumericAxis( - minimum: 140, - maximum: 60, - interval: 20, - labelFormat: '\${value}', - axisLine: AxisLine(width: 0)), - series: _getHiloOpenCloseSeries(), - trackballBehavior: TrackballBehavior( - enable: true, activationMode: ActivationMode.singleTap), - ); - } - - ///Get the hilo open close series - List> - _getHiloOpenCloseSeries() { - final List chartData = [ - ChartSampleData( - x: DateTime(2016, 01, 11), - secondSeriesYValue: 98.97, - yValue: 101.19, - y: 95.36, - thirdSeriesYValue: 97.13), - ChartSampleData( - x: DateTime(2016, 01, 18), - secondSeriesYValue: 98.41, - yValue: 101.46, - y: 93.42, - thirdSeriesYValue: 101.42), - ChartSampleData( - x: DateTime(2016, 01, 25), - secondSeriesYValue: 101.52, - yValue: 101.53, - y: 92.39, - thirdSeriesYValue: 97.34), - ChartSampleData( - x: DateTime(2016, 02, 01), - secondSeriesYValue: 96.47, - yValue: 97.33, - y: 93.69, - thirdSeriesYValue: 94.02), - ChartSampleData( - x: DateTime(2016, 02, 08), - secondSeriesYValue: 93.13, - yValue: 96.35, - y: 92.59, - thirdSeriesYValue: 93.99), - ChartSampleData( - x: DateTime(2016, 02, 15), - secondSeriesYValue: 91.02, - yValue: 94.89, - y: 90.61, - thirdSeriesYValue: 92.04), - ChartSampleData( - x: DateTime(2016, 02, 22), - secondSeriesYValue: 96.31, - yValue: 98.0237, - y: 98.0237, - thirdSeriesYValue: 96.31), - ChartSampleData( - x: DateTime(2016, 02, 29), - secondSeriesYValue: 99.86, - yValue: 106.75, - y: 99.65, - thirdSeriesYValue: 106.01), - ChartSampleData( - x: DateTime(2016, 03, 07), - secondSeriesYValue: 102.39, - yValue: 102.83, - y: 100.15, - thirdSeriesYValue: 102.26), - ChartSampleData( - x: DateTime(2016, 03, 14), - secondSeriesYValue: 101.91, - yValue: 106.5, - y: 101.78, - thirdSeriesYValue: 105.92), - ChartSampleData( - x: DateTime(2016, 03, 21), - secondSeriesYValue: 105.93, - yValue: 107.65, - y: 104.89, - thirdSeriesYValue: 105.67), - ChartSampleData( - x: DateTime(2016, 03, 28), - secondSeriesYValue: 106, - yValue: 110.42, - y: 104.88, - thirdSeriesYValue: 109.99), - ChartSampleData( - x: DateTime(2016, 04, 04), - secondSeriesYValue: 110.42, - yValue: 112.19, - y: 108.121, - thirdSeriesYValue: 108.66), - ChartSampleData( - x: DateTime(2016, 04, 11), - secondSeriesYValue: 108.97, - yValue: 112.39, - y: 108.66, - thirdSeriesYValue: 109.85), - ChartSampleData( - x: DateTime(2016, 04, 18), - secondSeriesYValue: 108.89, - yValue: 108.95, - y: 104.62, - thirdSeriesYValue: 105.68), - ChartSampleData( - x: DateTime(2016, 04, 25), - secondSeriesYValue: 105, - yValue: 105.65, - y: 92.51, - thirdSeriesYValue: 93.74), - ChartSampleData( - x: DateTime(2016, 05, 02), - secondSeriesYValue: 93.965, - yValue: 95.9, - y: 91.85, - thirdSeriesYValue: 92.72), - ChartSampleData( - x: DateTime(2016, 05, 09), - secondSeriesYValue: 93, - yValue: 93.77, - y: 89.47, - thirdSeriesYValue: 90.52), - ChartSampleData( - x: DateTime(2016, 05, 16), - secondSeriesYValue: 92.39, - yValue: 95.43, - y: 91.65, - thirdSeriesYValue: 95.22), - ChartSampleData( - x: DateTime(2016, 05, 23), - secondSeriesYValue: 95.87, - yValue: 100.73, - y: 95.67, - thirdSeriesYValue: 100.35), - ChartSampleData( - x: DateTime(2016, 05, 30), - secondSeriesYValue: 99.6, - yValue: 100.4, - y: 96.63, - thirdSeriesYValue: 97.92), - ChartSampleData( - x: DateTime(2016, 06, 06), - secondSeriesYValue: 97.99, - yValue: 101.89, - y: 97.55, - thirdSeriesYValue: 98.83), - ChartSampleData( - x: DateTime(2016, 06, 13), - secondSeriesYValue: 98.69, - yValue: 99.12, - y: 95.3, - thirdSeriesYValue: 95.33), - ChartSampleData( - x: DateTime(2016, 06, 20), - secondSeriesYValue: 96, - yValue: 96.89, - y: 92.65, - thirdSeriesYValue: 93.4), - ChartSampleData( - x: DateTime(2016, 06, 27), - secondSeriesYValue: 93, - yValue: 96.465, - y: 91.5, - thirdSeriesYValue: 95.89), - ChartSampleData( - x: DateTime(2016, 07, 04), - secondSeriesYValue: 95.39, - yValue: 96.89, - y: 94.37, - thirdSeriesYValue: 96.68), - ChartSampleData( - x: DateTime(2016, 07, 11), - secondSeriesYValue: 96.75, - yValue: 99.3, - y: 96.73, - thirdSeriesYValue: 98.78), - ChartSampleData( - x: DateTime(2016, 07, 18), - secondSeriesYValue: 98.7, - yValue: 101, - y: 98.31, - thirdSeriesYValue: 98.66), - ChartSampleData( - x: DateTime(2016, 07, 25), - secondSeriesYValue: 98.25, - yValue: 104.55, - y: 96.42, - thirdSeriesYValue: 104.21), - ChartSampleData( - x: DateTime(2016, 08, 01), - secondSeriesYValue: 104.41, - yValue: 107.65, - y: 104, - thirdSeriesYValue: 107.48), - ChartSampleData( - x: DateTime(2016, 08, 08), - secondSeriesYValue: 107.52, - yValue: 108.94, - y: 107.16, - thirdSeriesYValue: 108.18), - ChartSampleData( - x: DateTime(2016, 08, 15), - secondSeriesYValue: 108.14, - yValue: 110.23, - y: 108.08, - thirdSeriesYValue: 109.36), - ChartSampleData( - x: DateTime(2016, 08, 22), - secondSeriesYValue: 108.86, - yValue: 109.32, - y: 106.31, - thirdSeriesYValue: 106.94), - ChartSampleData( - x: DateTime(2016, 08, 29), - secondSeriesYValue: 106.62, - yValue: 108, - y: 105.5, - thirdSeriesYValue: 107.73), - ChartSampleData( - x: DateTime(2016, 09, 05), - secondSeriesYValue: 107.9, - yValue: 108.76, - y: 103.13, - thirdSeriesYValue: 103.13), - ChartSampleData( - x: DateTime(2016, 09, 12), - secondSeriesYValue: 102.65, - yValue: 116.13, - y: 102.53, - thirdSeriesYValue: 114.92), - ChartSampleData( - x: DateTime(2016, 09, 19), - secondSeriesYValue: 115.19, - yValue: 116.18, - y: 111.55, - thirdSeriesYValue: 112.71), - ChartSampleData( - x: DateTime(2016, 09, 26), - secondSeriesYValue: 111.64, - yValue: 114.64, - y: 111.55, - thirdSeriesYValue: 113.05), - ChartSampleData( - x: DateTime(2016, 10, 03), - secondSeriesYValue: 112.71, - yValue: 114.56, - y: 112.28, - thirdSeriesYValue: 114.06), - ChartSampleData( - x: DateTime(2016, 10, 10), - secondSeriesYValue: 115.02, - yValue: 118.69, - y: 114.72, - thirdSeriesYValue: 117.63), - ChartSampleData( - x: DateTime(2016, 10, 17), - secondSeriesYValue: 117.33, - yValue: 118.21, - y: 113.8, - thirdSeriesYValue: 116.6), - ChartSampleData( - x: DateTime(2016, 10, 24), - secondSeriesYValue: 117.1, - yValue: 118.36, - y: 113.31, - thirdSeriesYValue: 113.72), - ChartSampleData( - x: DateTime(2016, 10, 31), - secondSeriesYValue: 113.65, - yValue: 114.23, - y: 108.11, - thirdSeriesYValue: 108.84), - ChartSampleData( - x: DateTime(2016, 11, 07), - secondSeriesYValue: 110.08, - yValue: 111.72, - y: 105.83, - thirdSeriesYValue: 108.43), - ChartSampleData( - x: DateTime(2016, 11, 14), - secondSeriesYValue: 107.71, - yValue: 110.54, - y: 104.08, - thirdSeriesYValue: 110.06), - ChartSampleData( - x: DateTime(2016, 11, 21), - secondSeriesYValue: 114.12, - yValue: 115.42, - y: 115.42, - thirdSeriesYValue: 114.12), - ChartSampleData( - x: DateTime(2016, 11, 28), - secondSeriesYValue: 111.43, - yValue: 112.465, - y: 108.85, - thirdSeriesYValue: 109.9), - ChartSampleData( - x: DateTime(2016, 12, 05), - secondSeriesYValue: 110, - yValue: 114.7, - y: 108.25, - thirdSeriesYValue: 113.95), - ChartSampleData( - x: DateTime(2016, 12, 12), - secondSeriesYValue: 113.29, - yValue: 116.73, - y: 112.49, - thirdSeriesYValue: 115.97), - ChartSampleData( - x: DateTime(2016, 12, 19), - secondSeriesYValue: 115.8, - yValue: 117.5, - y: 115.59, - thirdSeriesYValue: 116.52), - ChartSampleData( - x: DateTime(2016, 12, 26), - secondSeriesYValue: 116.52, - yValue: 118.0166, - y: 115.43, - thirdSeriesYValue: 115.82), - ]; - return >[ - HiloOpenCloseSeries( - dataSource: chartData, - name: 'AAPL', - showIndicationForSameValues: isCardView ? true : _toggleVisibility, - xValueMapper: (ChartSampleData sales, _) => sales.x, - - /// High, low, open and close values used to render the HLOC series. - lowValueMapper: (ChartSampleData sales, _) => sales.y, - highValueMapper: (ChartSampleData sales, _) => sales.yValue, - openValueMapper: (ChartSampleData sales, _) => - sales.secondSeriesYValue, - closeValueMapper: (ChartSampleData sales, _) => - sales.thirdSeriesYValue) - ]; - } - - @override - void initState() { - _toggleVisibility = true; - super.initState(); - } -} diff --git a/lib/samples/chart/legend/chart_with_customized_legend.dart b/lib/samples/chart/cartesian_charts/legend/chart_with_customized_legend.dart similarity index 98% rename from lib/samples/chart/legend/chart_with_customized_legend.dart rename to lib/samples/chart/cartesian_charts/legend/chart_with_customized_legend.dart index 32b67ff0..9be61b60 100644 --- a/lib/samples/chart/legend/chart_with_customized_legend.dart +++ b/lib/samples/chart/cartesian_charts/legend/chart_with_customized_legend.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; /// Renders the line chart with customized legends sample. class LegendCustomized extends SampleView { @@ -34,6 +34,7 @@ class _LegendCustomizedState extends SampleViewState { legend: Legend( isVisible: true, overflowMode: LegendItemOverflowMode.wrap, + toggleSeriesVisibility: false, legendItemBuilder: (String name, dynamic series, dynamic point, int index) { return Container( diff --git a/lib/samples/chart/legend/cartesian_legend_various_options.dart b/lib/samples/chart/cartesian_charts/legend/legend_various_options.dart similarity index 64% rename from lib/samples/chart/legend/cartesian_legend_various_options.dart rename to lib/samples/chart/cartesian_charts/legend/legend_various_options.dart index 72777bfd..50640166 100644 --- a/lib/samples/chart/legend/cartesian_legend_various_options.dart +++ b/lib/samples/chart/cartesian_charts/legend/legend_various_options.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; -import '../../../widgets/custom_dropdown.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; /// Renders the Stacked line chart and legend with various opdations sample. class CartesianLegendOptions extends SampleView { @@ -50,104 +46,93 @@ class _CartesianLegendOptionsState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Position ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Position ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(65, 0, 0, 0), - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedPosition, - item: _positionList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'auto', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - })), - ), - ), - ], + )), + Container( + padding: const EdgeInsets.fromLTRB(75, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedPosition, + items: _positionList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'auto', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + })), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Overflow mode', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Overflow mode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'wrap', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onModeTypeChange(value); - })), - ), - ), - ], + )), + Container( + padding: const EdgeInsets.fromLTRB(30, 0, 0, 0), + height: 50, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'wrap', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onModeTypeChange(value); + stateSetter(() {}); + })), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Toggle visibility ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Toggle visibility', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: toggleVisibility, - valueChanged: (dynamic value) { - setState(() { - toggleVisibility = value; - }); - }, - ), - ), - ), - ], + )), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: toggleVisibility, + onChanged: (bool value) { + setState(() { + toggleVisibility = value; + stateSetter(() {}); + }); + })), + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the stacked line chart with various legedn modification options. diff --git a/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_points.dart b/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_points.dart new file mode 100644 index 00000000..ccccde63 --- /dev/null +++ b/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_points.dart @@ -0,0 +1,201 @@ +/// Dart import +import 'dart:math'; + +/// Package import +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../../model/sample_view.dart'; + +/// Renders the chart with add and remove points sample. +class AddDataPoints extends SampleView { + /// Renders the chart with add and remove points sample. + const AddDataPoints(Key key) : super(key: key); + + @override + _LiveVerticalState createState() => _LiveVerticalState(); +} + +/// State class of the chart with add and remove points options. +class _LiveVerticalState extends SampleViewState { + _LiveVerticalState() { + if (chartData.length > 11) { + chartData.removeRange(10, chartData.length - 1); + } + } + ChartSeriesController _chartSeriesController; + + /// List for storing the chart series data points. + List chartData = [ + ChartSampleData(x: 0, y: 10), + ChartSampleData(x: 1, y: 13), + ChartSampleData(x: 2, y: 80), + ChartSampleData(x: 3, y: 30), + ChartSampleData(x: 4, y: 72), + ChartSampleData(x: 5, y: 19), + ChartSampleData(x: 6, y: 30), + ChartSampleData(x: 7, y: 92), + ChartSampleData(x: 8, y: 48), + ChartSampleData(x: 9, y: 20), + ChartSampleData(x: 10, y: 51), + ]; + int count = 11; + + /// Get the random value + num _getRandomInt(num min, num max) { + final Random random = Random(); + return min + random.nextInt(max - min); + } + + /// Add the data point into the line series + List _addDataPoint() { + chartData.add(ChartSampleData(x: count, y: _getRandomInt(10, 100))); + count = count + 1; + return chartData; + } + + /// Remove the data point from the line series + List _removeDataPoint() { + if (chartData != null && chartData.isNotEmpty) { + chartData.removeAt(chartData.length - 1); + } + count = count - 1; + return chartData; + } + + @override + Widget build(BuildContext context) { + final double bottomPadding = 40; + return Scaffold( + backgroundColor: model.cardThemeColor, + body: Padding( + padding: EdgeInsets.fromLTRB(5, 0, 5, bottomPadding), + child: Container(child: _getAddRemovePointsChart()), + ), + floatingActionButton: Stack( + children: [ + Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: const EdgeInsets.fromLTRB(30, 50, 0, 0), + child: Container( + height: isCardView ? 40 : 45, + width: model.isWeb + ? 135 + : isCardView + ? 100 + : 110, + child: InkWell( + splashColor: Colors.transparent, + child: Row(children: [ + SizedBox( + width: model.isWeb ? 65 : 45, + height: 50, + child: IconButton( + onPressed: () { + chartData = _addDataPoint(); + _chartSeriesController.updateDataSource( + addedDataIndexes: [ + chartData.length - 1 + ], + ); + }, + icon: Icon(Icons.add_circle, + size: isCardView ? 40 : 50, + color: model.backgroundColor), + ), + ), + Padding( + padding: + const EdgeInsets.fromLTRB(10, 0, 0, 0), + child: SizedBox( + width: model.isWeb ? 65 : 45, + height: 50, + child: IconButton( + onPressed: () { + if (chartData.length > 1) { + chartData = _removeDataPoint(); + _chartSeriesController + .updateDataSource( + updatedDataIndexes: [ + chartData.length - 1 + ], + removedDataIndexes: [ + chartData.length - 1 + ], + ); + } + }, + icon: Icon( + Icons.remove_circle, + size: isCardView ? 40 : 50, + color: model.backgroundColor, + )))) + ]))))) + ], + ) + + // Row(children: [ + // Spacer(), + // IconButton( + // onPressed: () { + // chartData = _addDataPoint(); + // _chartSeriesController.updateDataSource( + // addedDataIndexes: [chartData.length - 1], + // ); + // }, + // icon: Icon(Icons.add_circle, + // size: isCardView ? 40 : 50, color: model.backgroundColor), + // ), + // IconButton( + // onPressed: () { + // if (chartData.length > 1) { + // chartData = _removeDataPoint(); + // _chartSeriesController.updateDataSource( + // updatedDataIndexes: [chartData.length - 1], + // removedDataIndexes: [chartData.length - 1], + // ); + // } + // }, + // icon: Icon( + // Icons.remove_circle, + // size: isCardView ? 40 : 50, + // color: model.backgroundColor, + // )) + // ]) + ); + } + + /// Returns the chart with add and remove points options. + SfCartesianChart _getAddRemovePointsChart() { + return SfCartesianChart( + plotAreaBorderWidth: 0, + primaryXAxis: NumericAxis( + majorGridLines: MajorGridLines(width: 0), + edgeLabelPlacement: EdgeLabelPlacement.shift), + primaryYAxis: NumericAxis( + axisLine: AxisLine(width: 0), + majorTickLines: MajorTickLines(size: 0)), + series: _getAddRemovePointSeries(), + ); + } + + /// Returns the list of chart series which need to render + /// on the chart with add and remove points. + List> _getAddRemovePointSeries() { + return >[ + LineSeries( + onRendererCreated: (ChartSeriesController controller) { + _chartSeriesController = controller; + }, + animationDuration: 0, + dataSource: chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + width: 2), + ]; + } +} diff --git a/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_series.dart b/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_series.dart similarity index 65% rename from lib/samples/chart/dynamic_updates/add_remove_data/add_remove_series.dart rename to lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_series.dart index 61de4c29..1f5bbd41 100644 --- a/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_series.dart +++ b/lib/samples/chart/cartesian_charts/real_time_charts/add_remove_data/add_remove_series.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with add and remove series options sample. class AddSeries extends SampleView { @@ -59,64 +59,63 @@ class _LiveVerticalState extends SampleViewState { @override Widget build(BuildContext context) { - final double bottomPadding = isCardView ? 0 : 50; + final double bottomPadding = 45; return Scaffold( backgroundColor: model.cardThemeColor, body: Padding( padding: EdgeInsets.fromLTRB(5, 0, 5, bottomPadding), child: Container(child: getAddRemoveSeriesChart()), ), - floatingActionButton: isCardView - ? null - : Stack(children: [ - Align( - alignment: Alignment.bottomRight, - child: Padding( - padding: const EdgeInsets.fromLTRB(30, 50, 0, 0), - child: Container( - height: 50, - width: model.isWeb ? 180 : 120, - child: InkWell( - splashColor: Colors.transparent, - child: Row( - children: [ - SizedBox( - width: model.isWeb ? 65 : 45, - height: 50, - child: IconButton( - splashColor: Colors.transparent, - icon: Icon(Icons.add_circle, - size: 50, color: model.backgroundColor), - onPressed: () { - setState(() { - _addSeries(); - }); - })), - Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), - child: SizedBox( - width: 65, - height: 50, - child: IconButton( - splashColor: Colors.transparent, - icon: Icon(Icons.remove_circle, - size: 50, color: model.backgroundColor), - onPressed: () => setState(() { - _removeSeries(); - }), - ), - )) - ], - ), - ), - ), + floatingActionButton: Stack(children: [ + Align( + alignment: Alignment.bottomRight, + child: Padding( + padding: const EdgeInsets.fromLTRB(30, 50, 0, 0), + child: Container( + height: 45, + width: model.isWeb ? 135 : 110, + child: InkWell( + splashColor: Colors.transparent, + child: Row( + children: [ + SizedBox( + width: model.isWeb ? 65 : 45, + height: 50, + child: IconButton( + splashColor: Colors.transparent, + icon: Icon(Icons.add_circle, + size: 50, color: model.backgroundColor), + onPressed: () { + setState(() { + _addSeries(); + }); + })), + Padding( + padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), + child: SizedBox( + width: model.isWeb ? 65 : 45, + height: 50, + child: IconButton( + splashColor: Colors.transparent, + icon: Icon(Icons.remove_circle, + size: 50, color: model.backgroundColor), + onPressed: () => setState(() { + _removeSeries(); + }), + ), + )) + ], ), - ) - ])); + ), + ), + ), + ) + ])); } /// Returns the chart with add and remove series options. SfCartesianChart getAddRemoveSeriesChart() { + //ignore: unused_local_variable final List> defaultSeries = >[ LineSeries( @@ -154,7 +153,7 @@ class _LiveVerticalState extends SampleViewState { primaryYAxis: NumericAxis( axisLine: AxisLine(width: 0), majorTickLines: MajorTickLines(size: 0)), - series: isCardView ? defaultSeries : series, + series: series, ); } diff --git a/lib/samples/chart/dynamic_updates/live_update/real_time_line_chart.dart b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_line_chart.dart similarity index 98% rename from lib/samples/chart/dynamic_updates/live_update/real_time_line_chart.dart rename to lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_line_chart.dart index 82a89d74..40632667 100644 --- a/lib/samples/chart/dynamic_updates/live_update/real_time_line_chart.dart +++ b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_line_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the realtime line chart sample. class LiveLineChart extends SampleView { diff --git a/lib/samples/chart/dynamic_updates/live_update/real_time_spline_chart.dart b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_spline_chart.dart similarity index 98% rename from lib/samples/chart/dynamic_updates/live_update/real_time_spline_chart.dart rename to lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_spline_chart.dart index 0d21797a..4dacfd54 100644 --- a/lib/samples/chart/dynamic_updates/live_update/real_time_spline_chart.dart +++ b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/real_time_spline_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; ///Renders real time spline chart class LiveUpdate extends SampleView { diff --git a/lib/samples/chart/dynamic_updates/live_update/vertical_live_chart.dart b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/vertical_live_chart.dart similarity index 98% rename from lib/samples/chart/dynamic_updates/live_update/vertical_live_chart.dart rename to lib/samples/chart/cartesian_charts/real_time_charts/live_update/vertical_live_chart.dart index 0ffd4543..eedc2da7 100644 --- a/lib/samples/chart/dynamic_updates/live_update/vertical_live_chart.dart +++ b/lib/samples/chart/cartesian_charts/real_time_charts/live_update/vertical_live_chart.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the vertical live update chart sample. class VerticalLineLiveUpdate extends SampleView { diff --git a/lib/samples/chart/dynamic_updates/update_data_source/update_data_source.dart b/lib/samples/chart/cartesian_charts/real_time_charts/update_data_source.dart similarity index 100% rename from lib/samples/chart/dynamic_updates/update_data_source/update_data_source.dart rename to lib/samples/chart/cartesian_charts/real_time_charts/update_data_source.dart diff --git a/lib/samples/chart/series_features/animation/series_animation.dart b/lib/samples/chart/cartesian_charts/series_features/animation/series_animation.dart similarity index 99% rename from lib/samples/chart/series_features/animation/series_animation.dart rename to lib/samples/chart/cartesian_charts/series_features/animation/series_animation.dart index 5e3d835e..ab7f5c73 100644 --- a/lib/samples/chart/series_features/animation/series_animation.dart +++ b/lib/samples/chart/cartesian_charts/series_features/animation/series_animation.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the cartesian chart with default serie animation sample. class AnimationDefault extends SampleView { diff --git a/lib/samples/chart/series_features/annotation/chart_with_annotation.dart b/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_annotation.dart similarity index 99% rename from lib/samples/chart/series_features/annotation/chart_with_annotation.dart rename to lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_annotation.dart index e71e3b06..1f2edb86 100644 --- a/lib/samples/chart/series_features/annotation/chart_with_annotation.dart +++ b/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_annotation.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with annotation sample. class AnnotationWatermark extends SampleView { diff --git a/lib/samples/chart/series_features/annotation/chart_with_watermark.dart b/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_watermark.dart similarity index 99% rename from lib/samples/chart/series_features/annotation/chart_with_watermark.dart rename to lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_watermark.dart index bd31a300..2ff044b5 100644 --- a/lib/samples/chart/series_features/annotation/chart_with_watermark.dart +++ b/lib/samples/chart/cartesian_charts/series_features/annotation/chart_with_watermark.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with watermark sample. class AnnotationDefault extends SampleView { diff --git a/lib/samples/chart/series_features/data_label/datalabel_template.dart b/lib/samples/chart/cartesian_charts/series_features/data_label/data_label_template.dart similarity index 99% rename from lib/samples/chart/series_features/data_label/datalabel_template.dart rename to lib/samples/chart/cartesian_charts/series_features/data_label/data_label_template.dart index dcc920e4..8e6cd575 100644 --- a/lib/samples/chart/series_features/data_label/datalabel_template.dart +++ b/lib/samples/chart/cartesian_charts/series_features/data_label/data_label_template.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with various marker shapes sample. class DataLabelTemplate extends SampleView { diff --git a/lib/samples/chart/series_features/data_label/default_datalabels.dart b/lib/samples/chart/cartesian_charts/series_features/data_label/default_data_labels.dart similarity index 63% rename from lib/samples/chart/series_features/data_label/default_datalabels.dart rename to lib/samples/chart/cartesian_charts/series_features/data_label/default_data_labels.dart index 2cc70517..2e97f999 100644 --- a/lib/samples/chart/series_features/data_label/default_datalabels.dart +++ b/lib/samples/chart/cartesian_charts/series_features/data_label/default_data_labels.dart @@ -5,10 +5,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/custom_dropdown.dart'; -import '../../../../widgets/custom_button.dart'; +import '../../../../../model/sample_view.dart'; +import '../../../../../widgets/custom_button.dart'; /// Renders the chart with default data labels sample. class DataLabelDefault extends SampleView { @@ -37,105 +35,100 @@ class _DataLabelDefaultState extends SampleViewState { final List _chartAlign = ['near', 'far', 'center'].toList(); @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Use series color', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Use series color', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.fromLTRB(5, 0, 0, 0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _seriescolor, - valueChanged: (dynamic value) { - setState(() { - _seriescolor = value; - }); - }, + )), + Padding( + padding: const EdgeInsets.fromLTRB(8, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _seriescolor, + onChanged: (bool value) { + setState(() { + _seriescolor = value; + stateSetter(() {}); + }); + })), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label alignment', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(23, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _labelAln, - item: _chartAlign.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'center', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onAlignmentChange(value.toString()); - }), - ), - )), - ], - )), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label position', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(60, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _labelPos, - item: _positionType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'top', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionChange(value.toString()); - }), - ), - )), - ], - )), - Container( - child: Row( + Container( + child: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( - 'Horizontal padding', - style: TextStyle(fontSize: 16.0, color: model.textColor), + Text('Label alignment', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(52, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _labelAln, + items: _chartAlign.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'center', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onAlignmentChange(value.toString()); + stateSetter(() {}); + }), ), + ], + )), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label position', + style: TextStyle(fontSize: 16.0, color: model.textColor)), Container( - child: Padding( + padding: const EdgeInsets.fromLTRB(67, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _labelPos, + items: _positionType.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'top', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + )), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Horizontal padding', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), child: CustomDirectionalButtons( minValue: -50, @@ -145,26 +138,23 @@ class _DataLabelDefaultState extends SampleViewState { _horizontalPaddding = val; }), step: 10, - padding: 0, iconColor: model.textColor, style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Vertical padding', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Vertical padding', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(28, 0, 0, 0), child: CustomDirectionalButtons( minValue: -50, @@ -177,13 +167,13 @@ class _DataLabelDefaultState extends SampleViewState { iconColor: model.textColor, style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/series_features/empty_point/chart_with_empty_points.dart b/lib/samples/chart/cartesian_charts/series_features/empty_points.dart similarity index 69% rename from lib/samples/chart/series_features/empty_point/chart_with_empty_points.dart rename to lib/samples/chart/cartesian_charts/series_features/empty_points.dart index 6c50d258..d7631a28 100644 --- a/lib/samples/chart/series_features/empty_point/chart_with_empty_points.dart +++ b/lib/samples/chart/cartesian_charts/series_features/empty_points.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Renders the chart with empty points sample. class EmptyPoints extends SampleView { @@ -35,46 +34,41 @@ class _EmptyPointsState extends SampleViewState { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 60), child: _getEmptyPointChart()); } @override Widget buildSettings(BuildContext context) { - return ListView(children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Empty point mode ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _emptyPointMode.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'gap', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onEmptyPointModeChange(value.toString()); - }), - ), - )) - ], - ), - ), - ]); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Empty point mode ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _emptyPointMode.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'gap', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onEmptyPointModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ); + }); } /// Returns the cartesian chart with empty points. diff --git a/lib/samples/chart/series_features/gradients/horizantal_gradient.dart b/lib/samples/chart/cartesian_charts/series_features/gradients/horizantal_gradient.dart similarity index 98% rename from lib/samples/chart/series_features/gradients/horizantal_gradient.dart rename to lib/samples/chart/cartesian_charts/series_features/gradients/horizantal_gradient.dart index 383d184b..c9874ca9 100644 --- a/lib/samples/chart/series_features/gradients/horizantal_gradient.dart +++ b/lib/samples/chart/cartesian_charts/series_features/gradients/horizantal_gradient.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render chart series with horizontal gradient. class HorizantalGradient extends SampleView { diff --git a/lib/samples/chart/series_features/gradients/vertical_gradient.dart b/lib/samples/chart/cartesian_charts/series_features/gradients/vertical_gradient.dart similarity index 98% rename from lib/samples/chart/series_features/gradients/vertical_gradient.dart rename to lib/samples/chart/cartesian_charts/series_features/gradients/vertical_gradient.dart index 75d3521d..3e96fc79 100644 --- a/lib/samples/chart/series_features/gradients/vertical_gradient.dart +++ b/lib/samples/chart/cartesian_charts/series_features/gradients/vertical_gradient.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render chart series with vertical gradient. class VerticalGradient extends SampleView { diff --git a/lib/samples/chart/series_features/marker/various_marker_shapes.dart b/lib/samples/chart/cartesian_charts/series_features/marker.dart similarity index 100% rename from lib/samples/chart/series_features/marker/various_marker_shapes.dart rename to lib/samples/chart/cartesian_charts/series_features/marker.dart diff --git a/lib/samples/chart/series_features/sorting/sorting_options.dart b/lib/samples/chart/cartesian_charts/series_features/sorting.dart similarity index 53% rename from lib/samples/chart/series_features/sorting/sorting_options.dart rename to lib/samples/chart/cartesian_charts/series_features/sorting.dart index 6bd9b202..a585918a 100644 --- a/lib/samples/chart/series_features/sorting/sorting_options.dart +++ b/lib/samples/chart/cartesian_charts/series_features/sorting.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// Renders the chart with sorting options sample. class SortingDefault extends SampleView { @@ -42,84 +41,76 @@ class _SortingDefaultState extends SampleViewState { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 60), child: _getDefaultSortingChart()); } @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Sort by ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Sort by ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(30, 0, 0, 0), + )), + Container( + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _labelList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'y', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedType, + items: _labelList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'y', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Sorting order ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Sorting order ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + )), + Container( height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedSortType, - item: _sortList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'none', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSortingTypeChange(value.toString()); - }), - ), - )), - ], + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedSortType, + items: _sortList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'none', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onSortingTypeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the Cartesian chart with sorting options. @@ -128,6 +119,9 @@ class _SortingDefaultState extends SampleViewState { title: ChartTitle(text: "World's tallest buildings"), plotAreaBorderWidth: 0, primaryXAxis: CategoryAxis(majorGridLines: MajorGridLines(width: 0)), + onDataLabelRender: (DataLabelRenderArgs args) { + args.text = args.dataPoints[args.pointIndex].y.toString() + ' m'; + }, primaryYAxis: NumericAxis( minimum: 500, maximum: 900, @@ -135,8 +129,11 @@ class _SortingDefaultState extends SampleViewState { axisLine: AxisLine(width: 0), majorTickLines: MajorTickLines(size: 0)), series: _getDefaultSortingSeries(), - tooltipBehavior: - TooltipBehavior(enable: true, canShowMarker: false, header: ''), + tooltipBehavior: TooltipBehavior( + enable: true, + canShowMarker: false, + header: '', + format: 'point.x : point.y m'), ); } @@ -144,11 +141,11 @@ class _SortingDefaultState extends SampleViewState { /// render on the chart with sorting options. List> _getDefaultSortingSeries() { final List chartData = [ - ChartSampleData(x: 'Burj \n Khalifa', y: 828), - ChartSampleData(x: 'Goldin \n Finance 117', y: 597), - ChartSampleData(x: 'Makkah Clock \n Royal Tower', y: 601), - ChartSampleData(x: 'Ping An \n Finance Center', y: 599), - ChartSampleData(x: 'Shanghai \n Tower', y: 632), + ChartSampleData(x: 'Burj\nKhalifa', y: 828), + ChartSampleData(x: 'Goldin\nFinance 117', y: 597), + ChartSampleData(x: 'Makkah Clock\nRoyal Tower', y: 601), + ChartSampleData(x: 'Ping An\nFinance Center', y: 599), + ChartSampleData(x: 'Shanghai\nTower', y: 632), ]; return >[ BarSeries( diff --git a/lib/samples/chart/technical_indicators/ad_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/accumulation_distribution.dart similarity index 98% rename from lib/samples/chart/technical_indicators/ad_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/accumulation_distribution.dart index 20bacdae..b207b996 100644 --- a/lib/samples/chart/technical_indicators/ad_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/accumulation_distribution.dart @@ -6,7 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Accumulation distribution indicator samples. diff --git a/lib/samples/chart/technical_indicators/atr_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/atr_indicator.dart similarity index 72% rename from lib/samples/chart/technical_indicators/atr_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/atr_indicator.dart index 66ce6aec..b28504c0 100644 --- a/lib/samples/chart/technical_indicators/atr_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/atr_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC Ohart with Average true range indicator sample. @@ -39,36 +37,25 @@ class _ATRIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ + Text( + 'Period', + style: TextStyle(color: model.textColor), + ), Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), - ), - ) - ], + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ), ], diff --git a/lib/samples/chart/technical_indicators/bollinger_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/bollinger_indicator.dart similarity index 71% rename from lib/samples/chart/technical_indicators/bollinger_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/bollinger_indicator.dart index 547f048c..90ebada1 100644 --- a/lib/samples/chart/technical_indicators/bollinger_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/bollinger_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Bollinger band indicator sample. @@ -42,6 +40,7 @@ class _BollingerIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( @@ -50,24 +49,19 @@ class _BollingerIndicatorState extends SampleViewState { children: [ Text( 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), + style: TextStyle(color: model.textColor), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(125, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), + padding: const EdgeInsets.fromLTRB(125, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), ) ], @@ -80,26 +74,21 @@ class _BollingerIndicatorState extends SampleViewState { children: [ Text( 'Standard deviation', - style: TextStyle(fontSize: 14.0, color: model.textColor), + style: TextStyle(color: model.textColor), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 20, - initialValue: _standardDeviation, - onChanged: (double val) => setState(() { - _standardDeviation = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 5, + initialValue: _standardDeviation, + onChanged: (double val) => setState(() { + _standardDeviation = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), - ) + ), ], ), ), diff --git a/lib/samples/chart/technical_indicators/ema_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/ema_indicator.dart similarity index 70% rename from lib/samples/chart/technical_indicators/ema_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/ema_indicator.dart index 1b33b440..17a47494 100644 --- a/lib/samples/chart/technical_indicators/ema_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/ema_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Exponential moving average indicator. @@ -39,38 +37,27 @@ class _EMAIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ + Text( + 'Period', + style: TextStyle(color: model.textColor), + ), Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), - ), - ) - ], + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), - ), + ) ], ); } diff --git a/lib/samples/chart/technical_indicators/indicator_data_source.dart b/lib/samples/chart/cartesian_charts/technical_indicators/indicator_data_source.dart similarity index 99% rename from lib/samples/chart/technical_indicators/indicator_data_source.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/indicator_data_source.dart index 9f72b766..b8cb872d 100644 --- a/lib/samples/chart/technical_indicators/indicator_data_source.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/indicator_data_source.dart @@ -1,5 +1,5 @@ /// Local import -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; /// Get the chart data List getChartData() { diff --git a/lib/samples/chart/technical_indicators/macd_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/macd_indicator.dart similarity index 52% rename from lib/samples/chart/technical_indicators/macd_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/macd_indicator.dart index 9334f032..c9dcc581 100644 --- a/lib/samples/chart/technical_indicators/macd_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/macd_indicator.dart @@ -6,11 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/custom_dropdown.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with @@ -52,133 +49,118 @@ class _MACDIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Long Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Long Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _longPeriod, - onChanged: (double val) => setState(() { - _longPeriod = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _longPeriod, + onChanged: (double val) => setState(() { + _longPeriod = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Short period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Short period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(36, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _shortPeriod, - onChanged: (double val) => setState(() { - _shortPeriod = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _shortPeriod, + onChanged: (double val) => setState(() { + _shortPeriod = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('MACD type ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('MACD type ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( + )), + Container( padding: const EdgeInsets.fromLTRB(34, 0, 0, 0), height: 50, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMacdIndicatorType, - item: _macdIndicatorTypeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Both', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onMacdIndicatorTypeChanged(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomCenter, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMacdIndicatorType, + items: _macdIndicatorTypeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Both', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onMacdIndicatorTypeChanged(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the OHLC chart with diff --git a/lib/samples/chart/technical_indicators/momentum_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/momentum_indicator.dart similarity index 72% rename from lib/samples/chart/technical_indicators/momentum_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/momentum_indicator.dart index 94603536..e12dee9c 100644 --- a/lib/samples/chart/technical_indicators/momentum_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/momentum_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Momentum indicator sample. @@ -39,38 +37,27 @@ class _MomentummIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext c0ntext) { - return ListView( + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ + Text( + 'Period', + style: TextStyle(color: model.textColor), + ), Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), - ), - ) - ], + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), - ), + ) ], ); } diff --git a/lib/samples/chart/technical_indicators/rsi_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/rsi_indicator.dart similarity index 51% rename from lib/samples/chart/technical_indicators/rsi_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/rsi_indicator.dart index cc86ad61..a58673e4 100644 --- a/lib/samples/chart/technical_indicators/rsi_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/rsi_indicator.dart @@ -6,11 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Relative strength index indicator sample. @@ -46,126 +43,113 @@ class _RSIIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(88, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Overbought', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Overbought', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(49, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 100, - initialValue: _overBought, - onChanged: (double val) => setState(() { - _overBought = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 100, + initialValue: _overBought, + onChanged: (double val) => setState(() { + _overBought = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Oversold', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Oversold', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( padding: const EdgeInsets.fromLTRB(68, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _overSold, - onChanged: (double val) => setState(() { - _overSold = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _overSold, + onChanged: (double val) => setState(() { + _overSold = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), - ) - ], + ) + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Show zones', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Show zones', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(17, 0, 0, 0), - child: HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _showZones, - valueChanged: (dynamic value) { - setState(() { - _showZones = value; - }); - }, - ), - ))), - ], + )), + Padding( + padding: const EdgeInsets.fromLTRB(17, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _showZones, + onChanged: (bool value) { + setState(() { + _showZones = value; + stateSetter(() {}); + }); + }))), + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the OHLC chart with Relative strength index indicator. diff --git a/lib/samples/chart/technical_indicators/sma_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/sma_indicator.dart similarity index 70% rename from lib/samples/chart/technical_indicators/sma_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/sma_indicator.dart index c787e317..452bfcce 100644 --- a/lib/samples/chart/technical_indicators/sma_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/sma_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders the OHLC chart with Simple moving average indicator sample. @@ -39,38 +37,27 @@ class _SMAIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ + Text( + 'Period', + style: TextStyle(color: model.textColor), + ), Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), - ), - ) - ], + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), ), - ), + ) ], ); } diff --git a/lib/samples/chart/cartesian_charts/technical_indicators/stochastic_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/stochastic_indicator.dart new file mode 100644 index 00000000..6290dbd8 --- /dev/null +++ b/lib/samples/chart/cartesian_charts/technical_indicators/stochastic_indicator.dart @@ -0,0 +1,272 @@ +/// Package imports +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; +import 'indicator_data_source.dart'; + +/// Renders the OHLC chart with Stochastic indicator sample. +class StochasticcIndicator extends SampleView { + /// creates the OHLC chart with Stochastic indicator. + const StochasticcIndicator(Key key) : super(key: key); + + @override + _StochasticcIndicatorState createState() => _StochasticcIndicatorState(); +} + +/// State class of the OHLC chart with Stochastic indicator. +class _StochasticcIndicatorState extends SampleViewState { + _StochasticcIndicatorState(); + double _period = 14.0; + double _kPeriod = 3.0; + double _dPeriod = 5.0; + double _overBought = 80.0; + double _overSold = 20.0; + bool _showZones = true; + + @override + void initState() { + _period = 14.0; + _overBought = 80.0; + _overSold = 20.0; + _kPeriod = 3.0; + _dPeriod = 5.0; + _showZones = true; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return _getDefaultStochasticIndicator(); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(82, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'K Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(68, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 100, + initialValue: _kPeriod, + onChanged: (double val) => setState(() { + _kPeriod = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'D Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(68, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _dPeriod, + onChanged: (double val) => setState(() { + _dPeriod = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Overbought', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(46, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 100, + initialValue: _overBought, + onChanged: (double val) => setState(() { + _overBought = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ), + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Oversold', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(65, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _overSold, + onChanged: (double val) => setState(() { + _overSold = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Show zones', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _showZones, + onChanged: (bool value) { + setState(() { + _showZones = value; + stateSetter(() {}); + }); + }))), + ], + ), + ), + ], + ); + }); + } + + /// Returns the OHLC chart with Stochastic indicator. + SfCartesianChart _getDefaultStochasticIndicator() { + final List chartData = getChartData(); + return SfCartesianChart( + plotAreaBorderWidth: 0, + legend: Legend(isVisible: !isCardView), + primaryXAxis: DateTimeAxis( + majorGridLines: MajorGridLines(width: 0), + dateFormat: DateFormat.MMM(), + interval: 3, + minimum: DateTime(2016, 01, 01), + maximum: DateTime(2017, 01, 01), + ), + primaryYAxis: NumericAxis( + minimum: 70, + maximum: 130, + interval: 20, + labelFormat: '\${value}', + axisLine: AxisLine(width: 0)), + axes: [ + NumericAxis( + majorGridLines: MajorGridLines(width: 0), + opposedPosition: true, + name: 'yaxes', + minimum: 10, + maximum: 110, + interval: 20, + axisLine: AxisLine(width: 0)) + ], + trackballBehavior: TrackballBehavior( + enable: !isCardView, + activationMode: ActivationMode.singleTap, + tooltipDisplayMode: TrackballDisplayMode.groupAllPoints, + ), + tooltipBehavior: TooltipBehavior(enable: isCardView ? true : false), + indicators: >[ + /// Stochastic indicator mentioned here. + StochasticIndicator( + seriesName: 'AAPL', + yAxisName: 'yaxes', + overbought: _overBought ?? 80, + oversold: _overSold ?? 20, + showZones: _showZones ?? true, + period: _period.toInt() ?? 14, + kPeriod: _kPeriod.toInt() ?? 3, + dPeriod: _dPeriod.toInt() ?? 5, + ), + ], + title: ChartTitle(text: isCardView ? '' : 'AAPL - 2016'), + series: >[ + HiloOpenCloseSeries( + emptyPointSettings: EmptyPointSettings(mode: EmptyPointMode.zero), + dataSource: chartData, + opacity: 0.7, + xValueMapper: (ChartSampleData sales, _) => sales.x, + lowValueMapper: (ChartSampleData sales, _) => sales.low, + highValueMapper: (ChartSampleData sales, _) => sales.high, + openValueMapper: (ChartSampleData sales, _) => sales.open, + closeValueMapper: (ChartSampleData sales, _) => sales.close, + name: 'AAPL'), + ], + ); + } +} diff --git a/lib/samples/chart/technical_indicators/tma_indicator.dart b/lib/samples/chart/cartesian_charts/technical_indicators/tma_indicator.dart similarity index 69% rename from lib/samples/chart/technical_indicators/tma_indicator.dart rename to lib/samples/chart/cartesian_charts/technical_indicators/tma_indicator.dart index 91720603..aea5e42d 100644 --- a/lib/samples/chart/technical_indicators/tma_indicator.dart +++ b/lib/samples/chart/cartesian_charts/technical_indicators/tma_indicator.dart @@ -6,10 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; import 'indicator_data_source.dart'; /// Renders thec OHLC chart with Triangular moving average indicator sample. @@ -39,40 +37,27 @@ class _TMAIndicatorState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( + return Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, children: [ + Text( + 'Period', + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - step: 1, - loop: true, - padding: 0, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _period, + onChanged: (double val) => setState(() { + _period = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), - ), + ) ], ); } diff --git a/lib/samples/chart/trendline/default_trendline.dart b/lib/samples/chart/cartesian_charts/trendline/default_trendline.dart similarity index 52% rename from lib/samples/chart/trendline/default_trendline.dart rename to lib/samples/chart/cartesian_charts/trendline/default_trendline.dart index 6a3032b1..a4e400d7 100644 --- a/lib/samples/chart/trendline/default_trendline.dart +++ b/lib/samples/chart/cartesian_charts/trendline/default_trendline.dart @@ -6,11 +6,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/custom_dropdown.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; /// Render the default trendline chart sample. class TrendLineDefault extends SampleView { @@ -55,127 +52,110 @@ class _TrendLineDefaultState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text( - 'Trendline type', - style: TextStyle( - color: model.textColor, - fontSize: 16.0, - letterSpacing: 0.34, - fontWeight: FontWeight.normal), - ), - Container( - padding: const EdgeInsets.fromLTRB(60, 0, 0, 0), - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedTrendLineType, - item: _trendlineTypeList.map((String value) { - return DropdownMenuItem( - value: value ?? 'Linear', - child: Text('$value', - style: TextStyle(color: model.textColor)), - ); - }).toList(), - valueChanged: (dynamic value) { - _onTrendLineTypeChanged(value.toString()); - }, - ), - ), - ), - ) - ], - ), - ), - Visibility( - visible: _selectedTrendLineType != 'Polynomial' ? false : true, - maintainState: true, - child: Container( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - 'Polynomial Order', + 'Trendline type', style: TextStyle( - fontSize: 14.0, - color: _selectedTrendLineType != 'Polynomial' - ? const Color.fromRGBO(0, 0, 0, 0.3) - : model.textColor), + color: model.textColor, + fontSize: 16.0, + ), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(37, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 2, - maxValue: 6, - initialValue: _polynomialOrder.toDouble(), - onChanged: (double val) => setState(() { - _polynomialOrder = val.floor(); - }), - step: 1, - loop: true, - padding: 0, - iconColor: model.textColor, - style: - TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), + padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedTrendLineType, + items: _trendlineTypeList.map((String value) { + return DropdownMenuItem( + value: value ?? 'Linear', + child: Text('$value', + style: TextStyle(color: model.textColor)), + ); + }).toList(), + onChanged: (dynamic value) { + _onTrendLineTypeChanged(value.toString()); + stateSetter(() {}); + }, ), ) ], ), ), - ), - Visibility( - visible: _selectedTrendLineType != 'MovingAverage' ? false : true, - maintainState: true, - child: Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 14.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(103, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 2, - maxValue: periodMaxValue.toDouble(), - initialValue: _period.toDouble(), - onChanged: (double val) => setState(() { - _period = val.floor(); - }), - step: 1, - loop: true, - padding: 0, - iconColor: model.textColor, - style: - TextStyle(fontSize: 16.0, color: model.textColor), - ), - ), + Visibility( + visible: _selectedTrendLineType != 'Polynomial' ? false : true, + maintainState: true, + child: Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Polynomial Order', + style: TextStyle( + color: _selectedTrendLineType != 'Polynomial' + ? const Color.fromRGBO(0, 0, 0, 0.3) + : model.textColor), ), - ) - ], + Container( + padding: const EdgeInsets.fromLTRB(37, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 2, + maxValue: 6, + initialValue: _polynomialOrder.toDouble(), + onChanged: (double val) => setState(() { + _polynomialOrder = val.floor(); + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + ) + ], + ), ), ), - ) - ], - ); + Visibility( + visible: _selectedTrendLineType != 'MovingAverage' ? false : true, + maintainState: true, + child: Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + 'Period', + style: TextStyle(color: model.textColor), + ), + Container( + padding: const EdgeInsets.fromLTRB(103, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 2, + maxValue: periodMaxValue.toDouble(), + initialValue: _period.toDouble(), + onChanged: (double val) => setState(() { + _period = val.floor(); + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 16.0, color: model.textColor), + ), + ) + ], + ), + ), + ) + ], + ); + }); } /// Returns the column chart with defaul trendline types. @@ -225,7 +205,7 @@ class _TrendLineDefaultState extends SampleViewState { type: _type, width: 3, color: const Color.fromRGBO(192, 108, 132, 1), - dashArray: model.isWeb ? [0, 0] : [15, 3, 3, 3], + dashArray: [15, 3, 3, 3], enableTooltip: true, polynomialOrder: _polynomialOrder, period: _period) diff --git a/lib/samples/chart/trendline/trendline_forecast_options.dart b/lib/samples/chart/cartesian_charts/trendline/trendline_forecast.dart similarity index 70% rename from lib/samples/chart/trendline/trendline_forecast_options.dart rename to lib/samples/chart/cartesian_charts/trendline/trendline_forecast.dart index c9b54c2e..ce330eb7 100644 --- a/lib/samples/chart/trendline/trendline_forecast_options.dart +++ b/lib/samples/chart/cartesian_charts/trendline/trendline_forecast.dart @@ -5,10 +5,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; /// Renders the spline chart with trend forcasting sample. class TrendLineForecast extends SampleView { @@ -40,6 +38,7 @@ class _TrendLineForecastState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( @@ -51,23 +50,16 @@ class _TrendLineForecastState extends SampleViewState { style: TextStyle(fontSize: 16.0, color: model.textColor), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _forwardForecastValue, - onChanged: (double val) => setState(() { - _forwardForecastValue = val; - }), - step: 1, - loop: true, - padding: 0, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _forwardForecastValue, + onChanged: (double val) => setState(() { + _forwardForecastValue = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ) ], @@ -83,23 +75,16 @@ class _TrendLineForecastState extends SampleViewState { style: TextStyle(fontSize: 16.0, color: model.textColor), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _backwardForecastValue, - onChanged: (double val) => setState(() { - _backwardForecastValue = val; - }), - step: 1, - loop: true, - padding: 0, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 50, + initialValue: _backwardForecastValue, + onChanged: (double val) => setState(() { + _backwardForecastValue = val; + }), + loop: true, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ) ], @@ -173,7 +158,7 @@ class _TrendLineForecastState extends SampleViewState { Trendline( type: TrendlineType.linear, width: 3, - dashArray: model.isWeb ? [0, 0] : [10, 10], + dashArray: [10, 10], name: 'Linear', enableTooltip: true, diff --git a/lib/samples/chart/cartesian_charts/user_interactions/add_point_on_click.dart b/lib/samples/chart/cartesian_charts/user_interactions/add_point_on_click.dart new file mode 100644 index 00000000..062b7c2f --- /dev/null +++ b/lib/samples/chart/cartesian_charts/user_interactions/add_point_on_click.dart @@ -0,0 +1,114 @@ +/// Package import +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; + +/// Renders the cartesian chart with default tootlip sample. +class InteractiveChart extends SampleView { + /// Creates the cartesian chart with default tootlip sample. + const InteractiveChart(Key key) : super(key: key); + + @override + _InteractiveChartState createState() => _InteractiveChartState(); +} + +/// State class of the cartesian chart with default tootlip. +class _InteractiveChartState extends SampleViewState { + _InteractiveChartState(); + List chartData = [ + ChartSampleData(x: 1, y: 5), + ChartSampleData(x: 2, y: 8), + ChartSampleData(x: 3, y: 6), + ChartSampleData(x: 4, y: 8), + ChartSampleData(x: 5, y: 10) + ]; + List scatterData = []; + bool isLineExist = false; + ChartSeriesController seriesController; + List> chartSeries; + bool isSorting = false; + bool isDataAdded = false; + bool isScatterData = false; + bool isRender = false; + bool isResetVisible = false; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final double bottomPadding = !model.isWeb ? 40 : 60; + return Scaffold( + backgroundColor: model.cardThemeColor, + body: Padding( + padding: + EdgeInsets.fromLTRB(5, isCardView ? 0 : 15, 5, bottomPadding), + child: Container( + child: _getInteractiveChart(), + )), + floatingActionButton: SizedBox( + height: model.isWeb ? 45 : 40, + width: 45, + child: FloatingActionButton( + onPressed: isResetVisible + ? () => setState(() { + chartData = [ + ChartSampleData(x: 1, y: 5), + ChartSampleData(x: 2, y: 8), + ChartSampleData(x: 3, y: 6), + ChartSampleData(x: 4, y: 8), + ChartSampleData(x: 5, y: 10) + ]; + isResetVisible = false; + }) + : null, + child: const Icon(Icons.refresh, color: Colors.white), + backgroundColor: + isResetVisible ? model.backgroundColor : Colors.grey[600], + ), + )); + } + + /// Returns the cartesian chart with default tootlip. + SfCartesianChart _getInteractiveChart() { + return SfCartesianChart( + margin: EdgeInsets.fromLTRB(10, 15, 10, 10), + plotAreaBorderWidth: 0, + enableAxisAnimation: true, + primaryXAxis: NumericAxis( + edgeLabelPlacement: EdgeLabelPlacement.shift, + rangePadding: ChartRangePadding.additional, + majorGridLines: MajorGridLines(width: 0)), + primaryYAxis: NumericAxis( + rangePadding: ChartRangePadding.additional, + axisLine: AxisLine(width: 0), + majorTickLines: MajorTickLines(width: 0)), + series: [ + LineSeries( + onRendererCreated: (ChartSeriesController controller) { + seriesController = controller; + }, + animationDuration: 1000, + color: Color.fromRGBO(75, 135, 185, 1), + dataSource: chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + name: 'Germany', + markerSettings: MarkerSettings(isVisible: true)), + ], + onChartTouchInteractionUp: (ChartTouchInteractionArgs args) { + isResetVisible = true; + final Offset value = Offset(args.position.dx, args.position.dy); + CartesianChartPoint chartpoint; + chartpoint = seriesController.pixelToPoint(value); + chartData.add(ChartSampleData(x: chartpoint.x, y: chartpoint.y)); + setState(() {}); + }); + } +} diff --git a/lib/samples/chart/user_interactions/crosshair/chart_with_crosshair.dart b/lib/samples/chart/cartesian_charts/user_interactions/crosshair.dart similarity index 58% rename from lib/samples/chart/user_interactions/crosshair/chart_with_crosshair.dart rename to lib/samples/chart/cartesian_charts/user_interactions/crosshair.dart index f1ac6f59..bbe27efc 100644 --- a/lib/samples/chart/user_interactions/crosshair/chart_with_crosshair.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/crosshair.dart @@ -10,11 +10,7 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; import '../../../../widgets/custom_button.dart'; -import '../../../../widgets/custom_dropdown.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; /// Renders the chart with crosshair sample. class DefaultCrossHair extends SampleView { @@ -48,102 +44,94 @@ class _DefaultCrossHairState extends SampleViewState { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), + padding: EdgeInsets.only(bottom: model.isWeb || !isCardView ? 0 : 60), child: getDefaultCrossHairChart()); } @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Line type ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Line type ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(36, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedLineType, - item: _lineTypeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'both', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - onLineTypeChange(value); - })), - ), - ), - ], + )), + Container( + padding: const EdgeInsets.fromLTRB(36, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedLineType, + items: _lineTypeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'both', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onLineTypeChange(value); + stateSetter(() {}); + })), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Show always ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Show always ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: alwaysShow, - valueChanged: (dynamic value) { - setState(() { - alwaysShow = value; - }); - }, - ), - ), - ], + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: alwaysShow, + onChanged: (bool value) { + setState(() { + alwaysShow = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Hide delay ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Hide delay ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(46, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 10, - initialValue: duration, - onChanged: (double val) => setState(() { - duration = val; - }), - step: 2, - padding: 0, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + child: CustomDirectionalButtons( + maxValue: 10, + initialValue: duration, + onChanged: (double val) => setState(() { + duration = val; + }), + step: 2, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the cartesian chart with crosshair. diff --git a/lib/samples/chart/cartesian_charts/user_interactions/customized_trackball.dart b/lib/samples/chart/cartesian_charts/user_interactions/customized_trackball.dart new file mode 100644 index 00000000..73f6ed20 --- /dev/null +++ b/lib/samples/chart/cartesian_charts/user_interactions/customized_trackball.dart @@ -0,0 +1,374 @@ +/// Package imports +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; + +/// Renders the chart with default trackball sample. +class TrackballTemplate extends SampleView { + /// Creates the chart with default trackball sample. + const TrackballTemplate(Key key) : super(key: key); + + @override + _TrackballTemplateState createState() => _TrackballTemplateState(); +} + +/// State class the chart with default trackball. +class _TrackballTemplateState extends SampleViewState { + _TrackballTemplateState(); + // ignore: unused_field + double _duration = 2; + // ignore: unused_field + bool _showAlways = false; + final List _modeList = + ['floatAllPoints', 'groupAllPoints', 'nearestPoint'].toList(); + String _selectedMode = 'floatAllPoints'; + + TrackballDisplayMode _mode = TrackballDisplayMode.floatAllPoints; + + bool _isTemplate = true; + + @override + void initState() { + _duration = 2; + _showAlways = false; + _selectedMode = 'floatAllPoints'; + _mode = TrackballDisplayMode.floatAllPoints; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return _getTrackballTemplateChart(); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Container( + height: 50, + child: ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Container( + child: Row( + children: [ + Text('Display mode', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(60, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container( + color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) + ? value + : 'floatAllPoints', + child: Text('$value', + style: TextStyle( + color: model.textColor))); + }).toList(), + onChanged: (String value) { + setState(() { + onModeTypeChange(value); + stateSetter(() {}); + }); + }), + ), + ], + ), + ) + ])); + }), + Container( + child: Row( + children: [ + Text('Tooltip template', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _isTemplate, + onChanged: (bool value) { + setState(() { + _isTemplate = value; + stateSetter(() {}); + }); + })) + ], + ), + ), + ], + ); + }); + } + + /// Returns the cartesian chart with default trackball. + SfCartesianChart _getTrackballTemplateChart() { + return SfCartesianChart( + plotAreaBorderWidth: 0, + title: ChartTitle(text: isCardView ? '' : 'Monthly expense of a family'), + legend: Legend(isVisible: !isCardView, toggleSeriesVisibility: false), + primaryXAxis: CategoryAxis( + majorGridLines: MajorGridLines(width: 0), + labelRotation: isCardView || model.isWeb ? 0 : -45, + ), + primaryYAxis: NumericAxis( + maximum: 200, + axisLine: AxisLine(width: 0), + labelFormat: '\${value}', + majorTickLines: MajorTickLines(size: 0)), + series: _getDefaultTrackballSeries(), + + /// To set the track ball as true and customized trackball behaviour. + trackballBehavior: TrackballBehavior( + enable: true, + markerSettings: TrackballMarkerSettings( + height: 10, + width: 10, + borderWidth: 1, + ), + hideDelay: 2000, + activationMode: ActivationMode.singleTap, + tooltipDisplayMode: + isCardView ? TrackballDisplayMode.floatAllPoints : _mode, + builder: _isTemplate + ? (BuildContext context, TrackballDetails trackballDetails) { + return Padding( + padding: EdgeInsets.all(0), + child: Container( + height: _mode == TrackballDisplayMode.groupAllPoints + ? model.isWeb + ? 125 + : 105 + : 50, + width: _mode == TrackballDisplayMode.groupAllPoints + ? 145 + : 120, + decoration: BoxDecoration( + color: model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(0, 8, 22, 0.75), + borderRadius: + BorderRadius.all(Radius.circular(6.0)), + ), + child: Row(children: [ + Padding( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: SizedBox( + height: _mode == + TrackballDisplayMode.groupAllPoints + ? 40 + : 35, + width: _mode == + TrackballDisplayMode.groupAllPoints + ? 40 + : 35, + child: Image.asset( + _getImageTemplate(trackballDetails)), + )), + Center( + child: Padding( + padding: EdgeInsets.fromLTRB(5, 10, 0, 0), + child: Center( + child: getGroupingTemplateWidgets( + trackballDetails)))) + ]))); + } + : null), + ); + } + + Column getGroupingTemplateWidgets(TrackballDetails _trackballDetails) { + Column _columnWidgets = Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [], + ); + if (_mode == TrackballDisplayMode.groupAllPoints) { + _columnWidgets.children.add(Container( + child: Padding( + padding: EdgeInsets.only(left: 0), + child: Text( + '${_trackballDetails.groupingModeInfo.points[0].x.toString()}', + style: TextStyle( + color: model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(0, 0, 0, 1) + : Color.fromRGBO(255, 255, 255, 1)))))); + _columnWidgets.children.add(Padding( + padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + child: Container( + height: 1, + width: 80, + color: model.themeData.brightness == Brightness.dark + ? const Color.fromRGBO(61, 61, 61, 1) + : const Color.fromRGBO(238, 238, 238, 1), + ))); + Column _columnChildWidgets = Column( + crossAxisAlignment: _mode == TrackballDisplayMode.groupAllPoints + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + children: [], + ); + List seriesIndices = + _trackballDetails.groupingModeInfo.visibleSeriesIndices; + for (int i = 0; i < seriesIndices.length; i++) { + _columnChildWidgets.children.add( + Container( + child: Text( + '${_trackballDetails.groupingModeInfo.visibleSeriesList[i].name.toString()} : \$${_trackballDetails.groupingModeInfo.points[i].y.toString()}', + textAlign: TextAlign.left, + style: _getTrackballTextStyle())), + ); + } + _columnWidgets.children.add(_columnChildWidgets); + } else { + _columnWidgets.children.add(Text( + '${_trackballDetails.point.x.toString()}', + style: _getTrackballTextStyle())); + _columnWidgets.children.add(Text( + '\$${_trackballDetails.point.y.toString()}', + style: TextStyle( + fontWeight: FontWeight.bold, + color: model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(0, 0, 0, 1) + : Color.fromRGBO(255, 255, 255, 1)))); + } + return _columnWidgets; + } + + TextStyle _getTrackballTextStyle() { + return TextStyle( + color: model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(0, 0, 0, 1) + : Color.fromRGBO(255, 255, 255, 1)); + } + + /// Returns the list of chart which need to render on the cartesian chart. + List> _getDefaultTrackballSeries() { + final List _chartData = [ + ChartSampleData( + x: 'Food', + y: 55, + yValue: 40, + secondSeriesYValue: 45, + thirdSeriesYValue: 48), + ChartSampleData( + x: 'Transport', + y: 33, + yValue: 45, + secondSeriesYValue: 54, + thirdSeriesYValue: 28), + ChartSampleData( + x: 'Medical', + y: 43, + yValue: 23, + secondSeriesYValue: 20, + thirdSeriesYValue: 34), + ChartSampleData( + x: 'Clothes', + y: 32, + yValue: 54, + secondSeriesYValue: 23, + thirdSeriesYValue: 54), + ChartSampleData( + x: 'Books', + y: 56, + yValue: 18, + secondSeriesYValue: 43, + thirdSeriesYValue: 55), + ChartSampleData( + x: 'Others', + y: 23, + yValue: 54, + secondSeriesYValue: 33, + thirdSeriesYValue: 56), + ]; + return >[ + StackedLineSeries( + dataSource: _chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + name: 'John', + markerSettings: MarkerSettings(isVisible: true)), + StackedLineSeries( + dataSource: _chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.yValue, + name: 'Mary', + markerSettings: MarkerSettings(isVisible: true)), + StackedLineSeries( + dataSource: _chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.secondSeriesYValue, + name: 'Martin', + markerSettings: MarkerSettings(isVisible: true)), + StackedLineSeries( + dataSource: _chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.thirdSeriesYValue, + name: 'Jessica', + markerSettings: MarkerSettings(isVisible: true)) + ]; + } + + String _getImageTemplate(TrackballDetails _pointInfo) { + String _path; + int _seriesIndex = _pointInfo.seriesIndex; + + _path = _seriesIndex == 0 + ? 'images/People_Circle12.png' + : _seriesIndex == 1 + ? 'images/People_Circle3.png' + : _seriesIndex == 2 + ? 'images/People_Circle14.png' + : _seriesIndex == 3 + ? 'images/People_Circle16.png' + : model.themeData.brightness == Brightness.dark + ? 'images/grouping_dark.png' + : 'images/grouping_light.png'; + + return _path; + } + + /// Method to update the trackball display mode in the chart on change. + void onModeTypeChange(String _item) { + _selectedMode = _item; + if (_selectedMode == 'floatAllPoints') { + _mode = TrackballDisplayMode.floatAllPoints; + } + if (_selectedMode == 'groupAllPoints') { + _mode = TrackballDisplayMode.groupAllPoints; + } + if (_selectedMode == 'nearestPoint') { + _mode = TrackballDisplayMode.nearestPoint; + } + if (_selectedMode == 'none') { + _mode = TrackballDisplayMode.none; + } + setState(() { + /// update the trackball display type changes + }); + } +} diff --git a/lib/samples/chart/cartesian_charts/user_interactions/events.dart b/lib/samples/chart/cartesian_charts/user_interactions/events.dart new file mode 100644 index 00000000..fc26d085 --- /dev/null +++ b/lib/samples/chart/cartesian_charts/user_interactions/events.dart @@ -0,0 +1,327 @@ +/// Package import +import 'package:flutter/material.dart'; +import 'package:flutter/scheduler.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; + +///Renders default column chart sample +class Events extends SampleView { + ///Renders default column chart sample + const Events(Key key) : super(key: key); + + @override + _EventsState createState() => _EventsState(); +} + +// final GlobalKey consoleKey = GlobalKey(); +final _scrollController = ScrollController(); + +class _EventsState extends SampleViewState { + _EventsState(); + List actionsList = []; + final GlobalKey consoleKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return MediaQuery.of(context).size.height > + MediaQuery.of(context).size.width + ? Column(children: [ + Expanded( + flex: 6, + child: _getDefaultEventChart(), + ), + isCardView + ? Container() + : Expanded( + flex: 4, + child: Container( + child: Column( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(5, 5, 5, 0), + child: Container( + height: 50, + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.withOpacity(0.4))), + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.fromLTRB( + 10, 0, 0, 0), + child: Align( + child: Text( + 'Event Trace', + style: TextStyle( + fontWeight: + FontWeight.bold), + ), + alignment: + Alignment.centerLeft))), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + splashRadius: 25, + icon: Icon(Icons.close), + onPressed: () { + actionsList.clear(); + (consoleKey.currentWidget + as Console) + .actionsList; + consoleKey.currentState + .setState(() {}); + }, + ))), + ], + ))), + Expanded( + child: Padding( + padding: EdgeInsets.fromLTRB(5, 0, 5, 5), + child: Console(actionsList, consoleKey), + )) + ], + ), + )), + ]) + : Row(children: [ + Expanded( + flex: 6, + child: _getDefaultEventChart(), + ), + isCardView + ? Container() + : Expanded( + flex: 4, + child: Container( + child: Column( + children: [ + Padding( + padding: EdgeInsets.fromLTRB(5, 5, 5, 0), + child: Container( + height: 50, + decoration: BoxDecoration( + border: Border.all( + color: Colors.grey.withOpacity(0.4))), + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.fromLTRB( + 10, 0, 0, 0), + child: Align( + child: Text( + 'Event Trace', + style: TextStyle( + fontWeight: + FontWeight.bold), + ), + alignment: + Alignment.centerLeft))), + Expanded( + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + splashRadius: 25, + icon: Icon(Icons.close), + onPressed: () { + actionsList.clear(); + (consoleKey.currentWidget + as Console) + .actionsList; + // _scrollController.jumpTo(0.0); + // setState(() {}); + consoleKey.currentState + .setState(() {}); + }, + ))), + ], + ))), + Expanded( + child: Padding( + padding: EdgeInsets.fromLTRB(5, 0, 5, 5), + child: Console(actionsList, consoleKey), + )) + ], + ), + )), + ]); + } + + /// Get default column chart + SfCartesianChart _getDefaultEventChart() { + return SfCartesianChart( + onAxisLabelRender: (AxisLabelRenderArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Axis label (${args.text}) was rendered'); + } + }, + onAxisLabelTapped: (AxisLabelTapArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Axis label (${args.text}) was tapped'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onDataLabelTapped: (DataLabelTapDetails args) { + if (!isCardView) { + actionsList.insert(0, 'Data label (${args.text}) was tapped'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onPointTapped: (PointTapArgs args) { + if (!isCardView) { + actionsList.insert( + 0, 'Point (${args.pointIndex.toString()}) was tapped'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onChartTouchInteractionDown: (ChartTouchInteractionArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Chart was tapped down'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onChartTouchInteractionMove: (ChartTouchInteractionArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Moved on chart area'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onLegendTapped: (LegendTapArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Legend was tapped'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onMarkerRender: (MarkerRenderArgs args) { + if (!isCardView) { + actionsList.insert( + 0, 'Marker (${args.pointIndex.toString()}) was rendered'); + if (args.pointIndex == 5) { + SchedulerBinding.instance.addPostFrameCallback((_) { + (consoleKey.currentState as _ConsoleState).setState(() {}); + }); + } + } + }, + onTooltipRender: (TooltipArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Tooltip (${args.text}) is showing'); + SchedulerBinding.instance.addPostFrameCallback((_) { + (consoleKey.currentState as _ConsoleState).setState(() {}); + }); + } + }, + onChartTouchInteractionUp: (ChartTouchInteractionArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Chart was tapped up'); + (consoleKey.currentState as _ConsoleState).setState(() {}); + } + }, + onLegendItemRender: (LegendRenderArgs args) { + if (!isCardView) { + actionsList.insert(0, 'Legend (${args.text}) was rendered'); + } + }, + onDataLabelRender: (DataLabelRenderArgs args) { + if (!isCardView) { + actionsList.insert( + 0, 'Data label (${args.text.toString()}) was rendered'); + } + }, + plotAreaBorderWidth: 0, + title: ChartTitle( + text: isCardView ? '' : 'Population growth of various countries'), + primaryXAxis: CategoryAxis( + majorGridLines: MajorGridLines(width: 0), + ), + primaryYAxis: NumericAxis( + axisLine: AxisLine(width: 0), + labelFormat: '{value}%', + majorTickLines: MajorTickLines(size: 0)), + series: _getDefaultColumnSeries(), + legend: Legend( + isVisible: isCardView ? false : true, + position: LegendPosition.bottom), + tooltipBehavior: TooltipBehavior( + animationDuration: 0, + canShowMarker: false, + enable: true, + ), + ); + } + + /// Get default column series + List> _getDefaultColumnSeries() { + final List chartData = [ + ChartSampleData(x: 'China', y: 0.541), + ChartSampleData(x: 'Brazil', y: 0.818), + ChartSampleData(x: 'Bolivia', y: 1.51), + ChartSampleData(x: 'Mexico', y: 1.302), + ChartSampleData(x: 'Egypt', y: 2.017), + ChartSampleData(x: 'Mongolia', y: 1.683), + ]; + return >[ + ColumnSeries( + dataSource: chartData, + animationDuration: 0, + name: 'Population', + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + markerSettings: MarkerSettings(isVisible: true), + dataLabelSettings: DataLabelSettings(isVisible: true), + ) + ]; + } +} + +class CustomColumnSeriesRenderer extends ColumnSeriesRenderer {} + +class Console extends StatefulWidget { + Console(this.actionsList, Key consoleKey) : super(key: consoleKey); + final List actionsList; + @override + _ConsoleState createState() => _ConsoleState(); +} + +class _ConsoleState extends State { + void scrollToTop() { + _scrollController.animateTo(_scrollController.position.minScrollExtent, + duration: Duration(milliseconds: 200), curve: Curves.easeIn); + setState(() {}); + } + + void scrollToBottom() { + _scrollController.animateTo(_scrollController.position.maxScrollExtent, + duration: Duration(milliseconds: 200), curve: Curves.easeOut); + setState(() {}); + } + + Widget build(BuildContext context) { + return Container( + child: Padding( + padding: EdgeInsets.all(5), + child: ListView.separated( + controller: _scrollController, + separatorBuilder: (context, build) => Divider( + color: Colors.grey, + height: 4, + ), + itemCount: widget.actionsList.length, + itemBuilder: (BuildContext ctxt, int index) { + return Padding( + padding: EdgeInsets.all(5), + child: Text(widget.actionsList[index]), + ); + }, + )), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4))), + ); + } +} diff --git a/lib/samples/chart/cartesian_charts/user_interactions/navigation_with_events.dart b/lib/samples/chart/cartesian_charts/user_interactions/navigation_with_events.dart new file mode 100644 index 00000000..a05131af --- /dev/null +++ b/lib/samples/chart/cartesian_charts/user_interactions/navigation_with_events.dart @@ -0,0 +1,318 @@ +/// Package imports +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +///URL launcher import +import 'package:url_launcher/url_launcher.dart' show launch; + +/// Local imports +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; + +/// Renders the chart with sorting options sample. +class NavigationWithEvents extends SampleView { + /// Creates the chart with sorting options sample. + const NavigationWithEvents(Key key) : super(key: key); + + @override + _NavigationWithEventsState createState() => _NavigationWithEventsState(); +} + +/// State class the chart with sorting options. +class _NavigationWithEventsState extends SampleViewState { + _NavigationWithEventsState(); + double _xMaximumLabelWidth = 80; + double _xLabelsExtent = 20; + bool _isEnableLabelExtend = false; + bool _isEnableMaximumLabelWidth = true; + List _isSelected; + String _selectedType = 'Maximum label width'; + List _typeList = ['Maximum label width', 'Labels extent']; + final List _chartData = [ + ChartSampleData(x: 'Goldin\nFinance 117', y: 597), + ChartSampleData(x: 'Ping An\nFinance Center', y: 599), + ChartSampleData(x: 'Makkah Clock\nRoyal Tower', y: 601), + ChartSampleData(x: 'Shanghai\nTower', y: 632), + ChartSampleData(x: 'Burj\nKhalifa', y: 828) + ]; + GlobalKey _scaffoldKey = GlobalKey(); + + @override + void initState() { + _isSelected = [true, false]; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + backgroundColor: model.cardThemeColor, + body: _getmaximumLabelWidthChart()); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + alignment: Alignment.center, + child: ToggleButtons( + constraints: BoxConstraints(maxWidth: 150, minHeight: 40), + children: [ + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Text( + 'Maximum label \nwidth', + textAlign: TextAlign.center, + ), + ), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: Text('Labels extent', textAlign: TextAlign.center), + ) + ], + onPressed: (int index) { + setState(() { + for (int buttonIndex = 0; + buttonIndex < _isSelected.length; + buttonIndex++) { + _isSelected[buttonIndex] = buttonIndex == index; + stateSetter(() { + onTypeChange(_typeList[index]); + }); + } + }); + }, + isSelected: _isSelected, + )), + Padding( + padding: EdgeInsets.fromLTRB(0, 10, 0, 0), + ), + Container( + child: Visibility( + visible: _isEnableMaximumLabelWidth, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + child: Text('Maximum label\nwidth', + style: TextStyle(color: model.textColor)), + ), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 120, + minValue: 1, + initialValue: _xMaximumLabelWidth, + onChanged: (double val) { + setState(() { + _xMaximumLabelWidth = val; + }); + }, + step: 10, + loop: true, + padding: 5.0, + iconColor: model.textColor, + style: + TextStyle(fontSize: 16.0, color: model.textColor), + ), + ) + ], + )), + ), + Container( + child: Visibility( + visible: _isEnableLabelExtend, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Labels extent', + style: TextStyle(color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(30, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 200, + minValue: 1, + initialValue: _xLabelsExtent, + onChanged: (double val) { + setState(() { + _xLabelsExtent = val; + }); + }, + step: 10, + loop: true, + iconColor: model.textColor, + style: + TextStyle(fontSize: 16.0, color: model.textColor), + ), + ), + ], + )), + ), + ], + ); + }); + } + + /// Returns the Cartesian chart with sorting options. + SfCartesianChart _getmaximumLabelWidthChart() { + return SfCartesianChart( + title: ChartTitle(text: isCardView ? '' : "World's tallest buildings"), + plotAreaBorderWidth: 0, + onDataLabelRender: (DataLabelRenderArgs args) { + args.text = args.dataPoints[args.pointIndex].y.toString() + ' m'; + }, + onTooltipRender: (TooltipArgs args) { + args.text = args.dataPoints[args.pointIndex].x.toString() + + ' : ' + + args.dataPoints[args.pointIndex].y.toString() + + ' m'; + }, + onDataLabelTapped: (DataLabelTapDetails args) { + _scaffoldKey.currentState.showSnackBar(SnackBar( + width: model.isWeb + ? _measureText( + 'Data label tapped/clicked. Navigating to the link.') + .width + : null, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(5))), + duration: Duration(milliseconds: 2000), + content: Text("Data label tapped/clicked. Navigating to the link."), + )); + launchHyperLink(args.text); + }, + onAxisLabelTapped: (AxisLabelTapArgs args) { + _scaffoldKey.currentState.showSnackBar(SnackBar( + width: model.isWeb + ? _measureText( + 'Axis label tapped/clicked. Navigating to the link.') + .width + : null, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(5))), + duration: Duration(milliseconds: 2000), + content: Text("Axis label tapped/clicked. Navigating to the link."), + )); + launchHyperLink(args.value.toString()); + }, + onPointTapped: (PointTapArgs args) { + _scaffoldKey.currentState.showSnackBar(SnackBar( + width: model.isWeb + ? _measureText( + 'Data point tapped/clicked. Navigating to the link.') + .width + : null, + behavior: SnackBarBehavior.floating, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(5))), + duration: Duration(milliseconds: 2000), + content: Text("Data point tapped/clicked. Navigating to the link."), + )); + launchHyperLink(args.pointIndex.toString()); + }, + primaryXAxis: CategoryAxis( + labelIntersectAction: isCardView + ? AxisLabelIntersectAction.multipleRows + : AxisLabelIntersectAction.rotate45, + majorGridLines: MajorGridLines(width: 0)), + primaryYAxis: NumericAxis( + title: AxisTitle(text: isCardView ? '' : 'Height (meters)'), + minimum: 500, + maximum: 900, + interval: 100, + axisLine: AxisLine(width: 0), + majorTickLines: MajorTickLines(size: 0)), + series: _getDefaultSortingSeries(), + tooltipBehavior: TooltipBehavior( + enable: true, + canShowMarker: false, + header: '', + activationMode: ActivationMode.longPress), + ); + } + + void launchHyperLink(String text) { + switch (text) { + case 'Goldin Finance 117': + case '597 ft': + case '0': + launch( + 'https://www.emporis.com/buildings/388229/goldin-finance-117-tianjin-china'); + break; + case 'Ping An Finance Center': + case '599 ft': + case '1': + launch( + 'https://www.emporis.com/buildings/1189351/ping-an-international-finance-center-shenzhen-china'); + break; + case 'Makkah Clock Royal Tower': + case '601 ft': + case '2': + launch( + 'https://www.emporis.com/buildings/221047/makkah-clock-royal-tower-makkah-saudi-arabia'); + break; + case 'Shanghai Tower': + case '632 ft': + case '3': + launch( + 'https://www.emporis.com/buildings/323473/shanghai-tower-shanghai-china'); + break; + case 'Burj Khalifa': + case '828 ft': + case '4': + launch( + 'https://www.emporis.com/buildings/182168/burj-khalifa-dubai-united-arab-emirates'); + break; + } + } + + /// Returns the list of chart series which need to + /// render on the chart with sorting options. + List> _getDefaultSortingSeries() { + return >[ + BarSeries( + dataSource: _chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + dataLabelSettings: + DataLabelSettings(isVisible: true, offset: Offset(-5, 0)), + ) + ]; + } + + void onTypeChange(String item) { + _selectedType = item; + if (_selectedType == 'Maximum label width') { + _isEnableMaximumLabelWidth = true; + _isEnableLabelExtend = false; + } + if (_selectedType == 'Labels extent') { + _isEnableLabelExtend = true; + _isEnableMaximumLabelWidth = false; + } + setState(() {}); + } +} + +Size _measureText(String textValue) { + Size size; + final TextPainter textPainter = TextPainter( + textAlign: TextAlign.center, + textDirection: TextDirection.ltr, + text: TextSpan(text: textValue)); + textPainter.layout(); + size = Size(textPainter.width + 40, textPainter.height); + return size; +} diff --git a/lib/samples/chart/user_interactions/selection/selection_index.dart b/lib/samples/chart/cartesian_charts/user_interactions/selection/dynamic_selection.dart similarity index 60% rename from lib/samples/chart/user_interactions/selection/selection_index.dart rename to lib/samples/chart/cartesian_charts/user_interactions/selection/dynamic_selection.dart index 16e08423..d4d79909 100644 --- a/lib/samples/chart/user_interactions/selection/selection_index.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/selection/dynamic_selection.dart @@ -6,8 +6,7 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with default selection option sample. class SelectionIndex extends SampleView { @@ -46,87 +45,83 @@ class _DefaultSelectionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Series index', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Series index', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(78, 0, 0, 0), - child: Align( - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _seriesIndex.toString(), - item: _seriesIndexList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '0', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSeriesIndexChange(value); - })), - ), - ), - ], + )), + Container( + padding: const EdgeInsets.fromLTRB(78, 0, 0, 0), + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _seriesIndex.toString(), + items: _seriesIndexList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : '0', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onSeriesIndexChange(value); + stateSetter(() {}); + })), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Point index ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Point index ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), + )), + Container( + padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _pointIndex.toString(), + items: _pointIndexList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : '0', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPointIndexChange(value); + stateSetter(() {}); + })), + ], + ), + ), + Column( + children: [ Container( - padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), - child: Align( - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _pointIndex.toString(), - item: _pointIndexList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '0', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPointIndexChange(value); - })), - ), - ), + child: Padding( + padding: const EdgeInsets.fromLTRB(0, 0, 25, 0), + child: RaisedButton( + color: model.backgroundColor, + onPressed: () { + selection(_seriesIndex, _pointIndex); + }, + child: Text('Select', + style: TextStyle(color: Colors.white)), + ))) ], ), - ), - Column( - children: [ - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(0, 0, 25, 0), - child: RaisedButton( - color: model.backgroundColor, - onPressed: () { - selection(_seriesIndex, _pointIndex); - }, - child: - Text('Select', style: TextStyle(color: Colors.white)), - ))) - ], - ), - ], - ); + ], + ); + }); } /// Returns the cartesian chart with default selection. diff --git a/lib/samples/chart/user_interactions/selection/selection_modes.dart b/lib/samples/chart/cartesian_charts/user_interactions/selection/selection_modes.dart similarity index 64% rename from lib/samples/chart/user_interactions/selection/selection_modes.dart rename to lib/samples/chart/cartesian_charts/user_interactions/selection/selection_modes.dart index 659be314..2d5d28f2 100644 --- a/lib/samples/chart/user_interactions/selection/selection_modes.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/selection/selection_modes.dart @@ -5,11 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with default selection option sample. class DefaultSelection extends SampleView { @@ -50,67 +46,59 @@ class _DefaultSelectionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Mode ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(150, 0, 0, 0), - height: 50, - width: 250, - child: Align( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Mode ', + style: TextStyle(color: model.textColor, fontSize: 16)), + Container( + padding: const EdgeInsets.fromLTRB(145, 0, 0, 0), + height: 50, alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'point', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onModeTypeChange(value); - })), + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'point', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onModeTypeChange(value); + stateSetter(() {}); + }), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Enable multi-selection ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _enableMultiSelect, - valueChanged: (dynamic value) { - setState(() { - _enableMultiSelect = value; - }); - }, - ), - ), - ], + Container( + child: Row( + children: [ + Text('Enable multi-selection', + style: TextStyle(color: model.textColor, fontSize: 16)), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableMultiSelect, + onChanged: (bool value) { + setState(() { + _enableMultiSelect = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the cartesian chart with default selection. diff --git a/lib/samples/chart/user_interactions/tooltip/default_tooltip.dart b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/default_tooltip.dart similarity index 98% rename from lib/samples/chart/user_interactions/tooltip/default_tooltip.dart rename to lib/samples/chart/cartesian_charts/user_interactions/tooltip/default_tooltip.dart index d231b973..1deb34fb 100644 --- a/lib/samples/chart/user_interactions/tooltip/default_tooltip.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/default_tooltip.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the cartesian chart with default tootlip sample. class DefaultTooltip extends SampleView { diff --git a/lib/samples/chart/user_interactions/tooltip/tooltip_position.dart b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_position.dart similarity index 72% rename from lib/samples/chart/user_interactions/tooltip/tooltip_position.dart rename to lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_position.dart index ed84496e..93fdb293 100644 --- a/lib/samples/chart/user_interactions/tooltip/tooltip_position.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_position.dart @@ -5,8 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the cartesian chart with tooltip position option sample. class CartesianTooltipPosition extends SampleView { @@ -39,44 +38,43 @@ class _TooltipPositionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Tooltip position ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Tooltip position ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( + )), + Container( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + height: 50, alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedTooltipPosition, - item: _tooltipPositionList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'auto', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - }), - ), - )) - ], + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedTooltipPosition, + items: _tooltipPositionList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'auto', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + })) + ], + ), ), - ), - ], - ); + ], + ); + }); } /// Returns the cartesian chart with tooltip position option. diff --git a/lib/samples/chart/user_interactions/tooltip/tootip_template.dart b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart similarity index 99% rename from lib/samples/chart/user_interactions/tooltip/tootip_template.dart rename to lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart index 3876ec6e..68b2af17 100644 --- a/lib/samples/chart/user_interactions/tooltip/tootip_template.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/tooltip/tooltip_template.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with various marker shapes sample. class TooltipTemplate extends SampleView { diff --git a/lib/samples/chart/cartesian_charts/user_interactions/trackball.dart b/lib/samples/chart/cartesian_charts/user_interactions/trackball.dart new file mode 100644 index 00000000..88fb589d --- /dev/null +++ b/lib/samples/chart/cartesian_charts/user_interactions/trackball.dart @@ -0,0 +1,384 @@ +/// Package imports +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; + +/// Renders the chart with default trackball sample. +class DefaultTrackball extends SampleView { + /// Creates the chart with default trackball sample. + const DefaultTrackball(Key key) : super(key: key); + + @override + _DefaultTrackballState createState() => _DefaultTrackballState(); +} + +/// State class the chart with default trackball. +class _DefaultTrackballState extends SampleViewState { + _DefaultTrackballState(); + double duration = 2; + bool showAlways = false; + final List _modeList = + ['floatAllPoints', 'groupAllPoints', 'nearestPoint'].toList(); + String _selectedMode = 'floatAllPoints'; + + TrackballDisplayMode _mode = TrackballDisplayMode.floatAllPoints; + + final List _alignmentList = + ['center', 'far', 'near'].toList(); + String _tooltipAlignment = 'center'; + bool _showMarker; + ChartAlignment _alignment = ChartAlignment.center; + + @override + void initState() { + duration = 2; + showAlways = false; + _selectedMode = 'floatAllPoints'; + _mode = TrackballDisplayMode.floatAllPoints; + _tooltipAlignment = 'center'; + _showMarker = true; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return _getDefaultTrackballChart(); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return Container( + height: 110, + child: ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Container( + child: Row( + children: [ + Text('Mode ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(100, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container( + color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: + (value != null) ? value : 'point', + child: Text('$value', + style: TextStyle( + color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + setState(() { + onModeTypeChange(value); + stateSetter(() {}); + }); + }), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Text('Alignment', + style: TextStyle( + color: _selectedMode != 'groupAllPoints' + ? const Color.fromRGBO(0, 0, 0, 0.3) + : model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(70, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container( + color: Color(0xFFBDBDBD), height: 1), + value: _tooltipAlignment, + items: _selectedMode != 'groupAllPoints' + ? null + : _alignmentList.map((String value) { + return DropdownMenuItem( + value: (value != null) + ? value + : 'center', + child: Text('$value', + style: TextStyle( + color: + model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onAlignmentChange(value); + stateSetter(() {}); + })), + ], + ), + ) + ])); + }), + Container( + child: Row( + children: [ + Text('Show always ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: showAlways, + onChanged: (bool value) { + setState(() { + showAlways = value; + stateSetter(() {}); + }); + })) + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Hide delay ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(44, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 10, + initialValue: duration, + onChanged: (double val) => setState(() { + duration = val; + }), + step: 2, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), + ), + ), + ], + ), + ), + Container( + child: Row( + children: [ + Text('Show track\nmarker', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _showMarker, + onChanged: (bool value) { + setState(() { + _showMarker = value; + stateSetter(() {}); + }); + }))), + ], + ), + ), + ], + ); + }); + } + + /// Returns the cartesian chart with default trackball. + SfCartesianChart _getDefaultTrackballChart() { + return SfCartesianChart( + title: ChartTitle(text: !isCardView ? 'Average sales per person' : ''), + plotAreaBorderWidth: 0, + primaryXAxis: DateTimeAxis( + interval: 1, + intervalType: DateTimeIntervalType.years, + dateFormat: DateFormat.y(), + majorGridLines: MajorGridLines(width: 0), + edgeLabelPlacement: EdgeLabelPlacement.shift), + primaryYAxis: NumericAxis( + title: AxisTitle(text: !isCardView ? 'Revenue' : ''), + axisLine: AxisLine(width: 0), + majorTickLines: MajorTickLines(width: 0)), + series: _getDefaultTrackballSeries(), + + /// To set the track ball as true and customized trackball behaviour. + trackballBehavior: TrackballBehavior( + enable: true, + markerSettings: TrackballMarkerSettings( + markerVisibility: _showMarker + ? TrackballVisibilityMode.visible + : TrackballVisibilityMode.hidden, + height: 10, + width: 10, + borderWidth: 1, + ), + hideDelay: (duration ?? 2.0) * 1000, + activationMode: ActivationMode.singleTap, + tooltipAlignment: _alignment, + tooltipDisplayMode: _mode, + tooltipSettings: InteractiveTooltip(format: 'point.x: point.y'), + shouldAlwaysShow: showAlways ?? true, + ), + ); + } + + /// Returns the list of chart which need to render on the cartesian chart. + List> _getDefaultTrackballSeries() { + final List chartData = [ + ChartSampleData( + x: DateTime(2000, 2, 11), + y: 15, + secondSeriesYValue: 39, + thirdSeriesYValue: 60), + ChartSampleData( + x: DateTime(2000, 9, 14), + y: 20, + secondSeriesYValue: 30, + thirdSeriesYValue: 55), + ChartSampleData( + x: DateTime(2001, 2, 11), + y: 25, + secondSeriesYValue: 28, + thirdSeriesYValue: 48), + ChartSampleData( + x: DateTime(2001, 9, 16), + y: 21, + secondSeriesYValue: 35, + thirdSeriesYValue: 57), + ChartSampleData( + x: DateTime(2002, 2, 7), + y: 13, + secondSeriesYValue: 39, + thirdSeriesYValue: 62), + ChartSampleData( + x: DateTime(2002, 9, 7), + y: 18, + secondSeriesYValue: 41, + thirdSeriesYValue: 64), + ChartSampleData( + x: DateTime(2003, 2, 11), + y: 24, + secondSeriesYValue: 45, + thirdSeriesYValue: 57), + ChartSampleData( + x: DateTime(2003, 9, 14), + y: 23, + secondSeriesYValue: 48, + thirdSeriesYValue: 53), + ChartSampleData( + x: DateTime(2004, 2, 6), + y: 19, + secondSeriesYValue: 54, + thirdSeriesYValue: 63), + ChartSampleData( + x: DateTime(2004, 9, 6), + y: 31, + secondSeriesYValue: 55, + thirdSeriesYValue: 50), + ChartSampleData( + x: DateTime(2005, 2, 11), + y: 39, + secondSeriesYValue: 57, + thirdSeriesYValue: 66), + ChartSampleData( + x: DateTime(2005, 9, 11), + y: 50, + secondSeriesYValue: 60, + thirdSeriesYValue: 65), + ChartSampleData( + x: DateTime(2006, 2, 11), + y: 24, + secondSeriesYValue: 60, + thirdSeriesYValue: 79), + ]; + return >[ + LineSeries( + dataSource: chartData, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.y, + width: 2, + name: 'John', + markerSettings: MarkerSettings(isVisible: true)), + LineSeries( + dataSource: chartData, + width: 2, + name: 'Andrew', + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.secondSeriesYValue, + markerSettings: MarkerSettings(isVisible: true)), + LineSeries( + dataSource: chartData, + width: 2, + xValueMapper: (ChartSampleData sales, _) => sales.x, + yValueMapper: (ChartSampleData sales, _) => sales.thirdSeriesYValue, + name: 'Thomas', + markerSettings: MarkerSettings(isVisible: true)) + ]; + } + + /// Method to update the trackball display mode in the chart on change. + void onModeTypeChange(String item) { + _selectedMode = item; + if (_selectedMode == 'floatAllPoints') { + _mode = TrackballDisplayMode.floatAllPoints; + } + if (_selectedMode == 'groupAllPoints') { + _mode = TrackballDisplayMode.groupAllPoints; + } + if (_selectedMode == 'nearestPoint') { + _mode = TrackballDisplayMode.nearestPoint; + } + if (_selectedMode == 'none') { + _mode = TrackballDisplayMode.none; + } + setState(() { + /// update the trackball display type changes + }); + } + + /// Method to update the chart alignment for tooltip in the chart on change. + void onAlignmentChange(String item) { + _tooltipAlignment = item; + if (_tooltipAlignment == 'center') { + _alignment = ChartAlignment.center; + } + if (_tooltipAlignment == 'far') { + _alignment = ChartAlignment.far; + } + if (_tooltipAlignment == 'near') { + _alignment = ChartAlignment.near; + } + setState(() { + /// update the tooltip alignment changes + }); + } +} diff --git a/lib/samples/chart/user_interactions/zooming_panning/pinch_zooming/pinch_zooming.dart b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/pinch_zooming.dart similarity index 92% rename from lib/samples/chart/user_interactions/zooming_panning/pinch_zooming/pinch_zooming.dart rename to lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/pinch_zooming.dart index 42d4cea4..d7ab3b63 100644 --- a/lib/samples/chart/user_interactions/zooming_panning/pinch_zooming/pinch_zooming.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/pinch_zooming.dart @@ -8,8 +8,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../../../model/sample_view.dart'; -import '../../../../../widgets/custom_dropdown.dart'; -import '../../../../../widgets/checkbox.dart'; /// Renders the chart with pinch zooming sample. class DefaultPanning extends SampleView { @@ -95,44 +93,34 @@ class _DefaultPanningState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return StatefulBuilder( - builder: (BuildContext context, StateSetter setState) { + builder: (BuildContext context, StateSetter stateSetter) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( children: [ Text('Zoom mode ', style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), + color: model.textColor, + fontSize: 16, + )), Container( - padding: const EdgeInsets.fromLTRB(60, 0, 40, 0), + padding: const EdgeInsets.fromLTRB(70, 0, 40, 0), height: 50, - width: 160, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Padding( - padding: EdgeInsets.fromLTRB(10, 0, 0, 0), - child: DropDown( - value: _selectedModeType, - item: _zoomModeTypeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'x', - child: Text('$value', - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - setState(() { - _onZoomTypeChange(value); - }); - }))), - ), + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedModeType, + items: _zoomModeTypeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'x', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onZoomTypeChange(value.toString()); + stateSetter(() {}); + }), ), ], ), @@ -143,17 +131,21 @@ class _DefaultPanningState extends SampleViewState { children: [ Text('Anchor range to \nvisible points', style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _enableAnchor, - valueChanged: (dynamic value) { - _enableRangeCalculation(value); - }, - ), + color: model.textColor, + fontSize: 16, + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableAnchor, + onChanged: (bool value) { + stateSetter(() { + _enableRangeCalculation(value); + _enableAnchor = value; + stateSetter(() {}); + }); + })), ], ), ), diff --git a/lib/samples/chart/user_interactions/zooming_panning/selection_zooming.dart b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/selection_zooming.dart similarity index 99% rename from lib/samples/chart/user_interactions/zooming_panning/selection_zooming.dart rename to lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/selection_zooming.dart index 9729faaf..c05226ea 100644 --- a/lib/samples/chart/user_interactions/zooming_panning/selection_zooming.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/selection_zooming.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Renders the chart with delection zooming sample. class DefaultZooming extends SampleView { @@ -23,7 +23,7 @@ class _DefaultZoomingState extends SampleViewState { @override Widget build(BuildContext context) { - final double bottomPadding = isCardView ? 0 : 60; + final double bottomPadding = isCardView || model.isWeb ? 0 : 60; _zoomingPanBehavior = ZoomPanBehavior( enablePanning: true, diff --git a/lib/samples/chart/user_interactions/zooming_panning/zooming_with_custom_button/zooming_with_custom_buttons.dart b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/zooming_with_custom_buttons.dart similarity index 82% rename from lib/samples/chart/user_interactions/zooming_panning/zooming_with_custom_button/zooming_with_custom_buttons.dart rename to lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/zooming_with_custom_buttons.dart index 8e936101..b6609e10 100644 --- a/lib/samples/chart/user_interactions/zooming_panning/zooming_with_custom_button/zooming_with_custom_buttons.dart +++ b/lib/samples/chart/cartesian_charts/user_interactions/zooming_and_panning/zooming_with_custom_buttons.dart @@ -47,7 +47,11 @@ class _ButtonZoomingState extends SampleViewState { child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Padding( + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, padding: const EdgeInsets.fromLTRB(24, 15, 0, 0), child: Tooltip( message: 'Zoom In', @@ -60,8 +64,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Zoom Out', child: IconButton( @@ -73,8 +81,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Pan Up', child: IconButton( @@ -86,8 +98,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Pan Down', child: IconButton( @@ -99,8 +115,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Pan Left', child: IconButton( @@ -112,8 +132,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Pan Right', child: IconButton( @@ -125,8 +149,12 @@ class _ButtonZoomingState extends SampleViewState { ), ), ), - Padding( - padding: const EdgeInsets.fromLTRB(0, 15, 0, 0), + Container( + width: model.isWeb + ? null + : (MediaQuery.of(context).size.width / 7) * + 0.9, + padding: const EdgeInsets.fromLTRB(20, 15, 0, 0), child: Tooltip( message: 'Reset', child: IconButton( diff --git a/lib/samples/chart/circular_charts/doughnut_series/default_doughnut_chart.dart b/lib/samples/chart/circular_charts/chart_types/doughnut/default_doughnut_chart.dart similarity index 97% rename from lib/samples/chart/circular_charts/doughnut_series/default_doughnut_chart.dart rename to lib/samples/chart/circular_charts/chart_types/doughnut/default_doughnut_chart.dart index 0f05ab93..6c4e3ed1 100644 --- a/lib/samples/chart/circular_charts/doughnut_series/default_doughnut_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/doughnut/default_doughnut_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the default doughnut chart. class DoughnutDefault extends SampleView { diff --git a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_center_elevation.dart b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_center_elevation.dart similarity index 98% rename from lib/samples/chart/circular_charts/doughnut_series/doughnut_with_center_elevation.dart rename to lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_center_elevation.dart index 8a3206e5..079104b6 100644 --- a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_center_elevation.dart +++ b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_center_elevation.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the doughnut series with center elevation. class DoughnutElevation extends SampleView { diff --git a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_color_mapping.dart b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_color_mapping.dart similarity index 98% rename from lib/samples/chart/circular_charts/doughnut_series/doughnut_with_color_mapping.dart rename to lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_color_mapping.dart index df27297f..e4846046 100644 --- a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_color_mapping.dart +++ b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_color_mapping.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the doughnut series with color mapping. class DoughnutCustomization extends SampleView { diff --git a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_rounded_corners.dart b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_rounded_corners.dart similarity index 97% rename from lib/samples/chart/circular_charts/doughnut_series/doughnut_with_rounded_corners.dart rename to lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_rounded_corners.dart index 85b7cc7a..066873f0 100644 --- a/lib/samples/chart/circular_charts/doughnut_series/doughnut_with_rounded_corners.dart +++ b/lib/samples/chart/circular_charts/chart_types/doughnut/doughnut_with_rounded_corners.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the rounded corner doughnut series. class DoughnutRounded extends SampleView { diff --git a/lib/samples/chart/circular_charts/doughnut_series/semi_doughnut_chart.dart b/lib/samples/chart/circular_charts/chart_types/doughnut/semi_doughnut_chart.dart similarity index 66% rename from lib/samples/chart/circular_charts/doughnut_series/semi_doughnut_chart.dart rename to lib/samples/chart/circular_charts/chart_types/doughnut/semi_doughnut_chart.dart index 0bec28a8..b9c5aaeb 100644 --- a/lib/samples/chart/circular_charts/doughnut_series/semi_doughnut_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/doughnut/semi_doughnut_chart.dart @@ -5,26 +5,27 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_button.dart'; +import '../../../../../model/sample_view.dart'; +import '../../../../../widgets/custom_button.dart'; /// Render the semi doughnut series. -class DoughnutSemi extends SampleView { +class SemiDoughnutChart extends SampleView { /// Creates the semi doughnut series. - const DoughnutSemi(Key key) : super(key: key); + const SemiDoughnutChart(Key key) : super(key: key); @override - _DoughnutSemiState createState() => _DoughnutSemiState(); + _SemiDoughnutChartState createState() => _SemiDoughnutChartState(); } /// State class of semi doughunut series. -class _DoughnutSemiState extends SampleViewState { - _DoughnutSemiState(); +class _SemiDoughnutChartState extends SampleViewState { + _SemiDoughnutChartState(); int startAngle = 270; int endAngle = 90; @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( @@ -34,19 +35,17 @@ class _DoughnutSemiState extends SampleViewState { Text('Start Angle ', style: TextStyle(fontSize: 16.0, color: model.textColor)), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 90, - maxValue: 270, - initialValue: startAngle.toDouble(), - onChanged: (double val) => setState(() { - startAngle = val.toInt(); - }), - step: 10, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 90, + maxValue: 270, + initialValue: startAngle.toDouble(), + onChanged: (double val) => setState(() { + startAngle = val.toInt(); + }), + step: 10, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), ], @@ -63,19 +62,17 @@ class _DoughnutSemiState extends SampleViewState { style: TextStyle(fontSize: 16.0, color: model.textColor)), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 90, - maxValue: 270, - initialValue: endAngle.toDouble(), - onChanged: (double val) => setState(() { - endAngle = val.toInt(); - }), - step: 10, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 90, + maxValue: 270, + initialValue: endAngle.toDouble(), + onChanged: (double val) => setState(() { + endAngle = val.toInt(); + }), + step: 10, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), ], diff --git a/lib/samples/chart/circular_charts/pie_series/default_pie_chart.dart b/lib/samples/chart/circular_charts/chart_types/pie/default_pie_chart.dart similarity index 97% rename from lib/samples/chart/circular_charts/pie_series/default_pie_chart.dart rename to lib/samples/chart/circular_charts/chart_types/pie/default_pie_chart.dart index 72e188b3..84667c96 100644 --- a/lib/samples/chart/circular_charts/pie_series/default_pie_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/pie/default_pie_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the default pie series. class PieDefault extends SampleView { diff --git a/lib/samples/chart/circular_charts/pie_series/pie_with_grouping.dart b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_grouping.dart similarity index 98% rename from lib/samples/chart/circular_charts/pie_series/pie_with_grouping.dart rename to lib/samples/chart/circular_charts/chart_types/pie/pie_with_grouping.dart index 00bed366..6863b127 100644 --- a/lib/samples/chart/circular_charts/pie_series/pie_with_grouping.dart +++ b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_grouping.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the pie series with grouping datapoints. class PieGrouping extends SampleView { diff --git a/lib/samples/chart/circular_charts/chart_types/pie/pie_with_smart_labels.dart b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_smart_labels.dart new file mode 100644 index 00000000..bf151232 --- /dev/null +++ b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_smart_labels.dart @@ -0,0 +1,231 @@ +/// Package imports +import 'package:flutter/material.dart'; + +/// Chart import +import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Local imports +import '../../../../../model/sample_view.dart'; + +/// Render the pie series with smart labels. +class PieSmartLabels extends SampleView { + /// Creates the pie series with smart labels. + const PieSmartLabels(Key key) : super(key: key); + + @override + _PieSmartLabelsState createState() => _PieSmartLabelsState(); +} + +/// State class of pie series with smart labels. +class _PieSmartLabelsState extends SampleViewState { + _PieSmartLabelsState(); + final List _positionList = ['outside', 'inside'].toList(); + final List _connectorLineList = ['curve', 'line'].toList(); + String _selectedPosition = 'outside'; + String _connectorLine = 'curve'; + bool isZeroVisible = false; + bool isSmartLabelMode = true; + ChartDataLabelPosition _labelPosition; + ConnectorType _connectorType; + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label position ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), + height: 50, + alignment: Alignment.bottomCenter, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedPosition, + items: _positionList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'outside', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + })), + ], + ), + ), + Container( + child: Row( + children: [ + Text('Enable smart label ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: isSmartLabelMode, + onChanged: (bool value) { + setState(() { + isSmartLabelMode = value; + stateSetter(() {}); + }); + })), + ], + ), + ), + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Connector line type', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + height: 50, + alignment: Alignment.bottomCenter, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _connectorLine, + items: _connectorLineList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'line', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onLineTypeChange(value.toString()); + })), + ], + ), + ), + Container( + child: Row( + children: [ + Text('Hide label for 0 value', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: isZeroVisible, + onChanged: (bool value) { + setState(() { + isZeroVisible = value; + stateSetter(() {}); + }); + })), + ], + ), + ), + ], + ); + }); + } + + @override + Widget build(BuildContext context) { + return _getSmartLabelPieChart(); + } + + /// Returns the circular charts with pie series. + SfCircularChart _getSmartLabelPieChart() { + return SfCircularChart( + title: ChartTitle( + text: isCardView ? '' : 'Monthly expenditure of an individual'), + series: _gettSmartLabelPieSeries(), + tooltipBehavior: TooltipBehavior(enable: true), + ); + } + + /// Returns the pie series with smart data labels. + List> _gettSmartLabelPieSeries() { + final List chartData = [ + ChartSampleData(x: 'Food', y: 38), + ChartSampleData(x: 'Loan due', y: 0), + ChartSampleData(x: 'Medical', y: 24), + ChartSampleData(x: 'Movies', y: 0), + ChartSampleData(x: 'Travel', y: 27), + ChartSampleData(x: 'Shopping', y: 19), + ChartSampleData(x: 'Savings', y: 9), + ChartSampleData(x: 'Others', y: 5), + ChartSampleData(x: 'Rent', y: 5), + ChartSampleData(x: 'Insurance', y: 4), + ChartSampleData(x: 'Tax', y: 3), + ChartSampleData(x: 'PF', y: 4), + ]; + return >[ + PieSeries( + dataSource: chartData, + xValueMapper: (ChartSampleData data, _) => data.x, + yValueMapper: (ChartSampleData data, _) => data.y, + dataLabelMapper: (ChartSampleData data, _) => data.x, + radius: '55%', + + /// By using this property we can enable the smart label mode. + enableSmartLabels: !isCardView ? isSmartLabelMode : true, + dataLabelSettings: DataLabelSettings( + isVisible: true, + showZeroValue: !isCardView && !isZeroVisible ? true : false, + labelPosition: + !isCardView ? _labelPosition : ChartDataLabelPosition.outside, + connectorLineSettings: ConnectorLineSettings( + type: !isCardView ? _connectorType : ConnectorType.curve))) + ]; + } + + @override + void initState() { + _labelPosition = ChartDataLabelPosition.outside; + _connectorType = ConnectorType.curve; + super.initState(); + } + + /// Method for changeing the connector line in pie series. + void _onLineTypeChange(String item) { + setState(() { + _connectorLine = item; + if (_connectorLine == 'curve') { + _connectorType = ConnectorType.curve; + } + if (_connectorLine == 'line') { + _connectorType = ConnectorType.line; + } + }); + } + + /// Method for changing the data label position. + void _onPositionTypeChange(String item) { + setState(() { + _selectedPosition = item; + if (_selectedPosition == 'outside') { + _labelPosition = ChartDataLabelPosition.outside; + } + if (_selectedPosition == 'inside') { + _labelPosition = ChartDataLabelPosition.inside; + } + }); + } +} diff --git a/lib/samples/chart/circular_charts/pie_series/pie_with_various_radius.dart b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_various_radius.dart similarity index 97% rename from lib/samples/chart/circular_charts/pie_series/pie_with_various_radius.dart rename to lib/samples/chart/circular_charts/chart_types/pie/pie_with_various_radius.dart index abb9f210..1c1d624b 100644 --- a/lib/samples/chart/circular_charts/pie_series/pie_with_various_radius.dart +++ b/lib/samples/chart/circular_charts/chart_types/pie/pie_with_various_radius.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the pie series with various radius datapoints. class PieRadius extends SampleView { diff --git a/lib/samples/chart/circular_charts/pie_series/semi_pie_chart.dart b/lib/samples/chart/circular_charts/chart_types/pie/semi_pie_chart.dart similarity index 62% rename from lib/samples/chart/circular_charts/pie_series/semi_pie_chart.dart rename to lib/samples/chart/circular_charts/chart_types/pie/semi_pie_chart.dart index 6f7e6ba0..0d1c3a5c 100644 --- a/lib/samples/chart/circular_charts/pie_series/semi_pie_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/pie/semi_pie_chart.dart @@ -5,26 +5,27 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_button.dart'; +import '../../../../../model/sample_view.dart'; +import '../../../../../widgets/custom_button.dart'; /// Render the semi pie series. -class PieSemi extends SampleView { +class SemiPieChart extends SampleView { /// Creates the semi pie series. - const PieSemi(Key key) : super(key: key); + const SemiPieChart(Key key) : super(key: key); @override - _PieSemiState createState() => _PieSemiState(); + _SemiPieChartState createState() => _SemiPieChartState(); } -class _PieSemiState extends SampleViewState { - _PieSemiState(); +class _SemiPieChartState extends SampleViewState { + _SemiPieChartState(); int _startAngle = 270; int _endAngle = 90; @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ Container( child: Row( @@ -34,19 +35,17 @@ class _PieSemiState extends SampleViewState { Text('Start Angle ', style: TextStyle(fontSize: 16.0, color: model.textColor)), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 90, - maxValue: 270, - initialValue: _startAngle.toDouble(), - onChanged: (double val) => setState(() { - _startAngle = val.toInt(); - }), - step: 10, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 90, + maxValue: 270, + initialValue: _startAngle.toDouble(), + onChanged: (double val) => setState(() { + _startAngle = val.toInt(); + }), + step: 10, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), ], @@ -63,19 +62,17 @@ class _PieSemiState extends SampleViewState { style: TextStyle(fontSize: 16.0, color: model.textColor)), ), Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), - child: CustomDirectionalButtons( - minValue: 90, - maxValue: 270, - initialValue: _endAngle.toDouble(), - onChanged: (double val) => setState(() { - _endAngle = val.toInt(); - }), - step: 10, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + minValue: 90, + maxValue: 270, + initialValue: _endAngle.toDouble(), + onChanged: (double val) => setState(() { + _endAngle = val.toInt(); + }), + step: 10, + iconColor: model.textColor, + style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), ], @@ -87,25 +84,25 @@ class _PieSemiState extends SampleViewState { @override Widget build(BuildContext context) { - return _getSemiPieChart(); + return _getSemiPieChartChart(); } /// Return the circular chart with semi pie series. - SfCircularChart _getSemiPieChart() { + SfCircularChart _getSemiPieChartChart() { return SfCircularChart( centerY: '60%', title: ChartTitle( text: isCardView ? '' : 'Rural population of various countries'), legend: Legend( isVisible: !isCardView, overflowMode: LegendItemOverflowMode.wrap), - series: _getSemiPieSeries(), + series: _getSemiPieChartSeries(), tooltipBehavior: TooltipBehavior(enable: true, format: 'point.x : point.y%'), ); } /// Return the semi pie series. - List> _getSemiPieSeries() { + List> _getSemiPieChartSeries() { final List chartData = [ ChartSampleData(x: 'Algeria', y: 28), ChartSampleData(x: 'Australia', y: 14), diff --git a/lib/samples/chart/circular_charts/radial_bar_series/customized_radialbar_chart.dart b/lib/samples/chart/circular_charts/chart_types/radial_bar/customized_radial_bar_chart.dart similarity index 99% rename from lib/samples/chart/circular_charts/radial_bar_series/customized_radialbar_chart.dart rename to lib/samples/chart/circular_charts/chart_types/radial_bar/customized_radial_bar_chart.dart index aea1a673..8325c71d 100644 --- a/lib/samples/chart/circular_charts/radial_bar_series/customized_radialbar_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/radial_bar/customized_radial_bar_chart.dart @@ -6,7 +6,7 @@ import 'package:flutter/rendering.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the radial bar customization. class RadialBarCustomized extends SampleView { diff --git a/lib/samples/chart/circular_charts/radial_bar_series/default_radialbar_chart.dart b/lib/samples/chart/circular_charts/chart_types/radial_bar/default_radial_bar_chart.dart similarity index 98% rename from lib/samples/chart/circular_charts/radial_bar_series/default_radialbar_chart.dart rename to lib/samples/chart/circular_charts/chart_types/radial_bar/default_radial_bar_chart.dart index cd0a5976..2200688e 100644 --- a/lib/samples/chart/circular_charts/radial_bar_series/default_radialbar_chart.dart +++ b/lib/samples/chart/circular_charts/chart_types/radial_bar/default_radial_bar_chart.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the default radial bar. class RadialBarDefault extends SampleView { diff --git a/lib/samples/chart/circular_charts/radial_bar_series/radialbar_with_legend.dart b/lib/samples/chart/circular_charts/chart_types/radial_bar/radial_bar_with_legend.dart similarity index 98% rename from lib/samples/chart/circular_charts/radial_bar_series/radialbar_with_legend.dart rename to lib/samples/chart/circular_charts/chart_types/radial_bar/radial_bar_with_legend.dart index fbf717f6..8e6128c8 100644 --- a/lib/samples/chart/circular_charts/radial_bar_series/radialbar_with_legend.dart +++ b/lib/samples/chart/circular_charts/chart_types/radial_bar/radial_bar_with_legend.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../model/sample_view.dart'; +import '../../../../../model/sample_view.dart'; /// Render the radial series with legend. class RadialBarAngle extends SampleView { diff --git a/lib/samples/chart/circular_charts/export/export.dart b/lib/samples/chart/circular_charts/export.dart similarity index 97% rename from lib/samples/chart/circular_charts/export/export.dart rename to lib/samples/chart/circular_charts/export.dart index c845cdd2..c90c6d9a 100644 --- a/lib/samples/chart/circular_charts/export/export.dart +++ b/lib/samples/chart/circular_charts/export.dart @@ -9,13 +9,14 @@ import 'package:path_provider/path_provider.dart'; /// Chart import import 'package:syncfusion_flutter_charts/charts.dart'; + +/// Pdf import import 'package:syncfusion_flutter_pdf/pdf.dart'; /// Local imports -import '../../../../model/sample_view.dart'; - -import '../../../pdf/helper/save_file_mobile.dart' - if (dart.library.html) '../../../pdf/helper/save_file_web.dart'; +import '../../../model/sample_view.dart'; +import '../../pdf/helper/save_file_mobile.dart' + if (dart.library.html) '../../pdf/helper/save_file_web.dart'; ///Renders default circular chart sample class ExportCircular extends SampleView { diff --git a/lib/samples/chart/legend/chart_with_legend.dart b/lib/samples/chart/circular_charts/legend/chart_with_legend.dart similarity index 97% rename from lib/samples/chart/legend/chart_with_legend.dart rename to lib/samples/chart/circular_charts/legend/chart_with_legend.dart index 0d72ab8f..cce9126d 100644 --- a/lib/samples/chart/legend/chart_with_legend.dart +++ b/lib/samples/chart/circular_charts/legend/chart_with_legend.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; +import '../../../../model/sample_view.dart'; /// Renders the doughnut chart with legend class LegendDefault extends SampleView { diff --git a/lib/samples/chart/legend/legend_with_various_options.dart b/lib/samples/chart/circular_charts/legend/legend_with_various_options.dart similarity index 51% rename from lib/samples/chart/legend/legend_with_various_options.dart rename to lib/samples/chart/circular_charts/legend/legend_with_various_options.dart index 27f96652..f999e4f1 100644 --- a/lib/samples/chart/legend/legend_with_various_options.dart +++ b/lib/samples/chart/circular_charts/legend/legend_with_various_options.dart @@ -5,9 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; -import '../../../widgets/custom_dropdown.dart'; +import '../../../../model/sample_view.dart'; /// Renders the Pie chart with legend class LegendOptions extends SampleView { @@ -32,101 +30,94 @@ class _LegendOptionsState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Position ', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Position ', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(75, 0, 0, 0), - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedPosition, - item: _positionList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'auto', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - })), + )), + Container( + padding: const EdgeInsets.fromLTRB(75, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedPosition, + items: _positionList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'auto', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPositionTypeChange(value.toString()); + stateSetter(() {}); + }), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Overflow mode', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Overflow mode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'wrap', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onModeTypeChange(value); - })), - ), - ), - ], + )), + Container( + padding: const EdgeInsets.fromLTRB(30, 0, 0, 0), + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'wrap', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onModeTypeChange(value); + stateSetter(() {}); + })), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Toggle visibility ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Toggle visibility', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: toggleVisibility, - valueChanged: (dynamic value) { - setState(() { - toggleVisibility = value; - }); - }, - ), - ), - ], + )), + Container( + width: 75, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: toggleVisibility, + onChanged: (bool value) { + setState(() { + toggleVisibility = value; + stateSetter(() {}); + }); + })), + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/circular_charts/pie_series/pie_with_smart_labels.dart b/lib/samples/chart/circular_charts/pie_series/pie_with_smart_labels.dart deleted file mode 100644 index 53e23192..00000000 --- a/lib/samples/chart/circular_charts/pie_series/pie_with_smart_labels.dart +++ /dev/null @@ -1,244 +0,0 @@ -/// Package imports -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/custom_dropdown.dart'; - -/// Render the pie series with smart labels. -class PieSmartLabels extends SampleView { - /// Creates the pie series with smart labels. - const PieSmartLabels(Key key) : super(key: key); - - @override - _PieSmartLabelsState createState() => _PieSmartLabelsState(); -} - -/// State class of pie series with smart labels. -class _PieSmartLabelsState extends SampleViewState { - _PieSmartLabelsState(); - final List _positionList = ['outside', 'inside'].toList(); - final List _connectorLineList = ['curve', 'line'].toList(); - String _selectedPosition = 'outside'; - String _connectorLine = 'curve'; - bool isZeroVisible = false; - bool isSmartLabelMode = true; - ChartDataLabelPosition _labelPosition; - ConnectorType _connectorType; - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label position ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedPosition, - item: _positionList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'outside', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPositionTypeChange(value.toString()); - })), - ), - ), - ], - ), - ), - Container( - child: Row( - children: [ - Text('Enable smart label ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: isSmartLabelMode, - valueChanged: (dynamic value) { - setState(() { - isSmartLabelMode = value; - }); - }, - ), - ), - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Connector line type', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(2, 0, 0, 0), - height: 50, - width: 200, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _connectorLine, - item: _connectorLineList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'line', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onLineTypeChange(value.toString()); - })), - ), - ), - ], - ), - ), - Container( - child: Row( - children: [ - Text('Hide label for 0 value ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: const EdgeInsets.all(8.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: isZeroVisible, - valueChanged: (dynamic value) { - setState(() { - isZeroVisible = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); - } - - @override - Widget build(BuildContext context) { - return _getSmartLabelPieChart(); - } - - /// Returns the circular charts with pie series. - SfCircularChart _getSmartLabelPieChart() { - return SfCircularChart( - title: ChartTitle( - text: isCardView ? '' : 'Monthly expenditure of an individual'), - series: _gettSmartLabelPieSeries(), - tooltipBehavior: TooltipBehavior(enable: true), - ); - } - - /// Returns the pie series with smart data labels. - List> _gettSmartLabelPieSeries() { - final List chartData = [ - ChartSampleData(x: 'Food', y: 38), - ChartSampleData(x: 'Loan due', y: 0), - ChartSampleData(x: 'Medical', y: 24), - ChartSampleData(x: 'Movies', y: 0), - ChartSampleData(x: 'Travel', y: 27), - ChartSampleData(x: 'Shopping', y: 19), - ChartSampleData(x: 'Savings', y: 9), - ChartSampleData(x: 'Others', y: 5), - ChartSampleData(x: 'Rent', y: 5), - ChartSampleData(x: 'Insurance', y: 4), - ChartSampleData(x: 'Tax', y: 3), - ChartSampleData(x: 'PF', y: 4), - ]; - return >[ - PieSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData data, _) => data.x, - yValueMapper: (ChartSampleData data, _) => data.y, - dataLabelMapper: (ChartSampleData data, _) => data.x, - radius: '55%', - - /// By using this property we can enable the smart label mode. - enableSmartLabels: !isCardView ? isSmartLabelMode : true, - dataLabelSettings: DataLabelSettings( - isVisible: true, - showZeroValue: !isCardView && !isZeroVisible ? true : false, - labelPosition: - !isCardView ? _labelPosition : ChartDataLabelPosition.outside, - connectorLineSettings: ConnectorLineSettings( - type: !isCardView ? _connectorType : ConnectorType.curve))) - ]; - } - - @override - void initState() { - _labelPosition = ChartDataLabelPosition.outside; - _connectorType = ConnectorType.curve; - super.initState(); - } - - /// Method for changeing the connector line in pie series. - void _onLineTypeChange(String item) { - setState(() { - _connectorLine = item; - if (_connectorLine == 'curve') { - _connectorType = ConnectorType.curve; - } - if (_connectorLine == 'line') { - _connectorType = ConnectorType.line; - } - }); - } - - /// Method for changing the data label position. - void _onPositionTypeChange(String item) { - setState(() { - _selectedPosition = item; - if (_selectedPosition == 'outside') { - _labelPosition = ChartDataLabelPosition.outside; - } - if (_selectedPosition == 'inside') { - _labelPosition = ChartDataLabelPosition.inside; - } - }); - } -} diff --git a/lib/samples/chart/circular_charts/user_interactions/selection/dynamic_circular_selection.dart b/lib/samples/chart/circular_charts/user_interactions/dynamic_selection.dart similarity index 71% rename from lib/samples/chart/circular_charts/user_interactions/selection/dynamic_circular_selection.dart rename to lib/samples/chart/circular_charts/user_interactions/dynamic_selection.dart index 047bc8d3..b4e17454 100644 --- a/lib/samples/chart/circular_charts/user_interactions/selection/dynamic_circular_selection.dart +++ b/lib/samples/chart/circular_charts/user_interactions/dynamic_selection.dart @@ -5,8 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../../model/sample_view.dart'; -import '../../../../../widgets/custom_dropdown.dart'; +import '../../../../model/sample_view.dart'; /// Render the pie series with selection. class DynamicCircularSelection extends SampleView { @@ -31,6 +30,7 @@ class _CircularSelectionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { return ListView( + shrinkWrap: true, children: [ StatefulBuilder(builder: (BuildContext context, StateSetter setState) { return Container( @@ -38,32 +38,26 @@ class _CircularSelectionState extends SampleViewState { children: [ Text('Point index ', style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), + color: model.textColor, + fontSize: 16, + )), Container( - padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), - child: Align( - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _pointIndex.toString(), - item: _pointIndexList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : '0', - child: Text('$value', - style: - TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - setState(() { - _pointIndex = int.parse(value); - }); - })), - ), - ), + padding: const EdgeInsets.fromLTRB(80, 0, 0, 0), + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _pointIndex.toString(), + items: _pointIndexList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : '0', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + setState(() { + _pointIndex = int.parse(value); + }); + })), ], ), ); diff --git a/lib/samples/chart/circular_charts/user_interactions/selection/circular_selection.dart b/lib/samples/chart/circular_charts/user_interactions/selection.dart similarity index 76% rename from lib/samples/chart/circular_charts/user_interactions/selection/circular_selection.dart rename to lib/samples/chart/circular_charts/user_interactions/selection.dart index a710c37b..ce24f561 100644 --- a/lib/samples/chart/circular_charts/user_interactions/selection/circular_selection.dart +++ b/lib/samples/chart/circular_charts/user_interactions/selection.dart @@ -5,8 +5,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../../model/sample_view.dart'; -import '../../../../../widgets/checkbox.dart'; +import '../../../../model/sample_view.dart'; /// Render the pie series with selection. class CircularSelection extends SampleView { @@ -24,31 +23,29 @@ class _CircularSelectionState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Enable multi-selection ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: enableMultiSelect, - valueChanged: (dynamic value) { - setState(() { - enableMultiSelect = value; - }); - }, - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row( + children: [ + Text('Enable multi-selection ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: enableMultiSelect, + onChanged: (bool value) { + setState(() { + enableMultiSelect = value; + stateSetter(() {}); + }); + })) + ], + ); + }); } @override diff --git a/lib/samples/chart/circular_charts/user_interactions/tooltip/pie_tooltip_position.dart b/lib/samples/chart/circular_charts/user_interactions/tooltip.dart similarity index 65% rename from lib/samples/chart/circular_charts/user_interactions/tooltip/pie_tooltip_position.dart rename to lib/samples/chart/circular_charts/user_interactions/tooltip.dart index b7276122..148d5a61 100644 --- a/lib/samples/chart/circular_charts/user_interactions/tooltip/pie_tooltip_position.dart +++ b/lib/samples/chart/circular_charts/user_interactions/tooltip.dart @@ -5,9 +5,8 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports -import '../../../../../model/sample_view.dart'; -import '../../../../../widgets/custom_button.dart'; -import '../../../../../widgets/custom_dropdown.dart'; +import '../../../../model/sample_view.dart'; +import '../../../../widgets/custom_button.dart'; /// Render the pie series with tooltip position (auto/pointer). class PieTooltipPosition extends SampleView { @@ -27,53 +26,50 @@ class _PieTooltipPositionState extends SampleViewState { double duration = 2; @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Tooltip position', - style: TextStyle( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + children: [ + Text('Tooltip position', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + )), + Container( + padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedTooltipPosition, - item: _tooltipPositionList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'auto', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - setState(() { - onPositionTypeChange(value.toString()); - }); - }), - ), - )) - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedTooltipPosition, + items: _tooltipPositionList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'auto', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + setState(() { + onPositionTypeChange(value.toString()); + stateSetter(() {}); + }); + }), + ), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Hide delay ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Hide delay', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), child: CustomDirectionalButtons( minValue: 1, @@ -88,12 +84,12 @@ class _PieTooltipPositionState extends SampleViewState { style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_points.dart b/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_points.dart deleted file mode 100644 index 93b26635..00000000 --- a/lib/samples/chart/dynamic_updates/add_remove_data/add_remove_points.dart +++ /dev/null @@ -1,174 +0,0 @@ -/// Dart import -import 'dart:math'; - -/// Package import -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; - -/// Renders the chart with add and remove points sample. -class AddDataPoints extends SampleView { - /// Renders the chart with add and remove points sample. - const AddDataPoints(Key key) : super(key: key); - - @override - _LiveVerticalState createState() => _LiveVerticalState(); -} - -/// State class of the chart with add and remove points options. -class _LiveVerticalState extends SampleViewState { - _LiveVerticalState() { - if (chartData.length > 11) { - chartData.removeRange(10, chartData.length - 1); - } - } - ChartSeriesController _chartSeriesController; - - /// List for storing the chart series data points. - List chartData = [ - ChartSampleData(x: 0, y: 10), - ChartSampleData(x: 1, y: 13), - ChartSampleData(x: 2, y: 80), - ChartSampleData(x: 3, y: 30), - ChartSampleData(x: 4, y: 72), - ChartSampleData(x: 5, y: 19), - ChartSampleData(x: 6, y: 30), - ChartSampleData(x: 7, y: 92), - ChartSampleData(x: 8, y: 48), - ChartSampleData(x: 9, y: 20), - ChartSampleData(x: 10, y: 51), - ]; - int count = 11; - - /// Get the random value - num _getRandomInt(num min, num max) { - final Random random = Random(); - return min + random.nextInt(max - min); - } - - /// Add the data point into the line series - List _addDataPoint() { - chartData.add(ChartSampleData(x: count, y: _getRandomInt(10, 100))); - count = count + 1; - return chartData; - } - - /// Remove the data point from the line series - List _removeDataPoint() { - if (chartData != null && chartData.isNotEmpty) { - chartData.removeAt(chartData.length - 1); - } - count = count - 1; - return chartData; - } - - @override - Widget build(BuildContext context) { - final double bottomPadding = isCardView ? 0 : 50; - return Scaffold( - backgroundColor: model.cardThemeColor, - body: Padding( - padding: EdgeInsets.fromLTRB(5, 0, 5, bottomPadding), - child: Container(child: _getAddRemovePointsChart()), - ), - floatingActionButton: isCardView - ? null - : Stack(children: [ - Align( - alignment: Alignment.bottomRight, - child: Padding( - padding: const EdgeInsets.fromLTRB(30, 50, 0, 0), - child: Container( - height: 50, - width: model.isWeb ? 180 : 120, - child: InkWell( - splashColor: Colors.transparent, - child: Row( - children: [ - SizedBox( - width: model.isWeb ? 65 : 45, - height: 50, - child: IconButton( - splashColor: Colors.transparent, - icon: Icon(Icons.add_circle, - size: 50, color: model.backgroundColor), - onPressed: () { - setState(() { - chartData = _addDataPoint(); - _chartSeriesController.updateDataSource( - addedDataIndexes: [ - chartData.length - 1 - ], - ); - }); - })), - Padding( - padding: const EdgeInsets.fromLTRB(10, 0, 0, 0), - child: SizedBox( - width: 65, - height: 50, - child: IconButton( - splashColor: Colors.transparent, - icon: Icon(Icons.remove_circle, - size: 50, - color: model.backgroundColor), - onPressed: () { - setState(() { - if (chartData.length > 1) { - chartData = _removeDataPoint(); - _chartSeriesController - .updateDataSource( - updatedDataIndexes: [ - chartData.length - 1 - ], - removedDataIndexes: [ - chartData.length - 1 - ], - ); - } - }); - }), - )) - ], - ), - ), - ), - ), - ) - ])); - } - - /// Returns the chart with add and remove points options. - SfCartesianChart _getAddRemovePointsChart() { - return SfCartesianChart( - plotAreaBorderWidth: 0, - primaryXAxis: NumericAxis( - majorGridLines: MajorGridLines(width: 0), - edgeLabelPlacement: EdgeLabelPlacement.shift), - primaryYAxis: NumericAxis( - axisLine: AxisLine(width: 0), - majorTickLines: MajorTickLines(size: 0)), - series: _getAddRemovePointSeries(), - ); - } - - /// Returns the list of chart series which need to render - /// on the chart with add and remove points. - List> _getAddRemovePointSeries() { - return >[ - LineSeries( - onRendererCreated: (ChartSeriesController controller) { - _chartSeriesController = controller; - }, - animationDuration: 0, - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - width: 2), - ]; - } -} diff --git a/lib/samples/chart/funnel_charts/default_funnel_chart.dart b/lib/samples/chart/funnel_charts/default_funnel_chart.dart index 11b75946..59e08c92 100644 --- a/lib/samples/chart/funnel_charts/default_funnel_chart.dart +++ b/lib/samples/chart/funnel_charts/default_funnel_chart.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; import '../../../widgets/custom_button.dart'; /// Renders the default funnel chart @@ -27,20 +26,21 @@ class _FunnelDefaultState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Gap ratio ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Gap ratio ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), child: CustomDirectionalButtons( - minValue: 0, maxValue: 0.5, initialValue: gapRatio, onChanged: (double val) => setState(() { @@ -51,22 +51,19 @@ class _FunnelDefaultState extends SampleViewState { style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Neck height ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Neck height ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(25, 0, 0, 0), child: CustomDirectionalButtons( - minValue: 0, maxValue: 50, initialValue: neckHeight.toDouble(), onChanged: (double val) => setState(() { @@ -77,22 +74,19 @@ class _FunnelDefaultState extends SampleViewState { style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Neck width', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Neck width', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), child: CustomDirectionalButtons( - minValue: 0, maxValue: 50, initialValue: neckWidth.toDouble(), onChanged: (double val) => setState(() { @@ -103,34 +97,35 @@ class _FunnelDefaultState extends SampleViewState { style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Explode', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Explode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - const Padding(padding: EdgeInsets.fromLTRB(30, 0, 0, 0)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: explode, - valueChanged: (dynamic value) { - setState(() { - explode = value; - }); - }, - ), - ], + )), + const Padding(padding: EdgeInsets.fromLTRB(30, 0, 0, 0)), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: explode, + onChanged: (bool value) { + setState(() { + explode = value; + stateSetter(() {}); + }); + })) + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart b/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart index 0e0c0cf0..21d0a788 100644 --- a/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart +++ b/lib/samples/chart/funnel_charts/funnel_with_smart_labels.dart @@ -6,7 +6,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../model/sample_view.dart'; -import '../../../widgets/custom_dropdown.dart'; /// Renders the funnel chart with smart data label class FunnelSmartLabels extends SampleView { @@ -30,76 +29,71 @@ class _FunnelSmartLabelState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label Position ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label Position ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedPosition, - item: _labelPosition.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'outside', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onLabelPositionChange(value.toString()); - }), - ), - )) - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedPosition, + items: _labelPosition.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'outside', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onLabelPositionChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Smart label mode', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Smart label mode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + )), + Container( + padding: const EdgeInsets.fromLTRB(22, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _smartLabelMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'shift', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSmartLabelModeChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _smartLabelMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'shift', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onSmartLabelModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart b/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart index 555aa8e3..c2d01fca 100644 --- a/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart +++ b/lib/samples/chart/pyramid_charts/default_pyramid_chart.dart @@ -6,9 +6,7 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; import '../../../widgets/custom_button.dart'; -import '../../../widgets/custom_dropdown.dart'; /// Renders the default pyramid chart class PyramidDefault extends SampleView { @@ -23,58 +21,55 @@ class _PyramidDefaultState extends SampleViewState { _PyramidDefaultState(); final List _pyramidMode = ['Linear', 'Surface'].toList(); PyramidMode _selectedPyramidMode = PyramidMode.linear; - String _selectedMode; + String _selectedMode = 'Linear'; double gapRatio = 0; bool explode = false; @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Pyramid mode', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Pyramid mode', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _pyramidMode.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Linear', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onPyramidModeChange(value.toString()); - }), - ), - )) - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMode, + items: _pyramidMode.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Linear', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onPyramidModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Gap ratio ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Gap ratio ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( padding: const EdgeInsets.fromLTRB(45, 0, 0, 0), child: CustomDirectionalButtons( - minValue: 0, maxValue: 0.5, initialValue: gapRatio, onChanged: (double val) => setState(() { @@ -85,34 +80,36 @@ class _PyramidDefaultState extends SampleViewState { style: TextStyle(fontSize: 20.0, color: model.textColor), ), ), - ), - ], + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Explode', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Explode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - const Padding(padding: EdgeInsets.fromLTRB(40, 0, 0, 0)), - CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: explode, - valueChanged: (dynamic value) { - setState(() { - explode = value; - }); - }, - ), - ], + )), + Padding( + padding: EdgeInsets.fromLTRB(40, 0, 0, 0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: explode, + onChanged: (bool value) { + setState(() { + explode = value; + stateSetter(() {}); + }); + }))), + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart b/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart index e3353ce0..c02d549b 100644 --- a/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart +++ b/lib/samples/chart/pyramid_charts/pyramid_with_smart_labels.dart @@ -7,7 +7,6 @@ import 'package:syncfusion_flutter_charts/charts.dart'; /// Local imports import '../../../model/sample_view.dart'; -import '../../../widgets/custom_dropdown.dart'; /// Renders the pyramid chart with smart data labels class PyramidSmartLabels extends SampleView { @@ -31,76 +30,71 @@ class _PyramidSmartLabelState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Label position ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - padding: const EdgeInsets.fromLTRB(47, 0, 0, 0), + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + Container( + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text('Label position ', + style: TextStyle(fontSize: 16.0, color: model.textColor)), + Container( + padding: const EdgeInsets.fromLTRB(40, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedPosition, - item: _labelPosition.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'outside', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onLabelPositionChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedPosition, + items: _labelPosition.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'outside', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onLabelPositionChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - Container( - child: Row( - children: [ - Text('Smart label mode ', - style: TextStyle( + Container( + child: Row( + children: [ + Text('Smart label mode', + style: TextStyle( color: model.textColor, fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( + )), + Container( padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _smartLabelMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'shift', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSmartLabelModeChange(value.toString()); - }), - ), - )), - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _smartLabelMode, + items: _modeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'shift', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onSmartLabelModeChange(value.toString()); + stateSetter(() {}); + }), + ), + ], + ), ), - ), - ], - ); + ], + ); + }); } @override diff --git a/lib/samples/chart/series_features/animation/dynamic_animation.dart b/lib/samples/chart/series_features/animation/dynamic_animation.dart deleted file mode 100644 index 50222a53..00000000 --- a/lib/samples/chart/series_features/animation/dynamic_animation.dart +++ /dev/null @@ -1,365 +0,0 @@ -/// Dart imports -import 'dart:async'; - -/// Package import -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; - -Timer _timer; - -/// Renders the Cartesian chart with dynamic animation sample. -class CartesianDynamicAnimation extends SampleView { - /// Creates the Cartesian chart with dynamic animation sample. - const CartesianDynamicAnimation(Key key) : super(key: key); - - @override - _CartesianDynamicAnimationState createState() => - _CartesianDynamicAnimationState(); -} - -/// State class of the Cartesian chart with dynamic animation. -class _CartesianDynamicAnimationState extends SampleViewState { - _CartesianDynamicAnimationState(); - int count = 0; - final List _seriesType = [ - 'Column', - 'Line', - 'Spline', - 'StepLine', - 'Scatter', - 'Bubble', - 'Bar', - 'Area' - ].toList(); - - String _selectedType = 'Column'; - - @override - void initState() { - _selectedType = 'Column'; - super.initState(); - } - - @override - void dispose() { - super.dispose(); - _timer.cancel(); - } - - @override - Widget build(BuildContext context) { - chartData = _getChartData(); - _timer = Timer(const Duration(seconds: 3), () { - setState(() { - chartData = _getChartData(); - }); - }); - return _getDynamicAnimationChart(); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Text('Chart type ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomCenter, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedType, - item: _seriesType.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'column', - child: Text('$value', - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSeriesTypeChange(value.toString()); - }), - ), - )), - ], - ), - ), - ], - ); - } - - /// Returns the the Cartesian chart with dynamic animation. - SfCartesianChart _getDynamicAnimationChart() { - return SfCartesianChart( - primaryXAxis: CategoryAxis( - majorGridLines: MajorGridLines(width: 0), - ), - primaryYAxis: NumericAxis( - axisLine: AxisLine(width: 0), - interval: 20, - maximum: 80, - majorTickLines: MajorTickLines(size: 0)), - series: _getAnimationData(), - ); - } - - /// List of chart data for initial rendering. - List chartData = [ - ChartSampleData(x: '1', y: 45, pointColor: Colors.yellow), - ChartSampleData(x: '2', y: 52, pointColor: Colors.teal), - ChartSampleData(x: '3', y: 41, pointColor: Colors.blue), - ChartSampleData(x: '4', y: 65, pointColor: Colors.orange), - ChartSampleData(x: '5', y: 36, pointColor: Colors.pink), - ChartSampleData(x: '6', y: 65, pointColor: Colors.brown[300]), - ]; - - /// Returns the list of chart series which need to render on the - /// Cartesian chart with dynamic animation. - List> _getAnimationData() { - if (_selectedType == 'Line') { - return >[ - LineSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - width: 2, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.near, - isVisible: false), - ) - ]; - } else if (_selectedType == 'Column') { - return >[ - ColumnSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.near, - isVisible: false), - borderRadius: const BorderRadius.all(Radius.circular(20)), - ) - ]; - } else if (_selectedType == 'Spline') { - return >[ - SplineSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - width: 2, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.near, - isVisible: false), - ) - ]; - } else if (_selectedType == 'Area') { - return >[ - AreaSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.near, - isVisible: false), - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - ) - ]; - } else if (_selectedType == 'StepLine') { - return >[ - StepLineSeries( - dataSource: chartData, - width: 2, - color: const Color.fromRGBO(0, 168, 181, 1), - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.center, - labelAlignment: ChartDataLabelAlignment.auto, - isVisible: false), - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - ) - ]; - } else if (_selectedType == 'Bar') { - return >[ - BarSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.center, - labelAlignment: ChartDataLabelAlignment.auto, - isVisible: false), - borderRadius: const BorderRadius.all(Radius.circular(20)), - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - ) - ]; - } else if (_selectedType == 'Scatter') { - return >[ - ScatterSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - color: const Color.fromRGBO(0, 168, 181, 1), - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.center, - labelAlignment: ChartDataLabelAlignment.auto, - isVisible: false), - markerSettings: MarkerSettings( - isVisible: false, - height: 10, - width: 10, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - ) - ]; - } else if (_selectedType == 'Bubble') { - return >[ - BubbleSeries( - dataSource: chartData, - color: const Color.fromRGBO(0, 168, 181, 1), - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - sizeValueMapper: (ChartSampleData sales, _) => sales.y, - dataLabelSettings: DataLabelSettings( - color: Colors.blue, - alignment: ChartAlignment.center, - labelAlignment: ChartDataLabelAlignment.auto, - isVisible: false), - markerSettings: MarkerSettings( - isVisible: false, - height: 5, - width: 5, - color: Colors.white, - shape: DataMarkerType.circle, - borderWidth: 3, - borderColor: Colors.blue), - ) - ]; - } - return null; - } - - /// Method to get the chartdata for the cartesian chart in order - /// to do dynmaic animation. - List _getChartData() { - if (count == 0) { - chartData = [ - ChartSampleData(x: '1', y: 76, pointColor: Colors.yellow), - ChartSampleData(x: '2', y: 50, pointColor: Colors.teal), - ChartSampleData(x: '3', y: 60, pointColor: Colors.blue), - ChartSampleData(x: '4', y: 32, pointColor: Colors.orange), - ChartSampleData(x: '5', y: 29, pointColor: Colors.pink), - ChartSampleData(x: '6', y: 20, pointColor: Colors.brown[300]), - ]; - count++; - } else if (count == 1) { - chartData = [ - ChartSampleData(x: '1', y: 36, pointColor: Colors.yellow), - ChartSampleData(x: '2', y: 10, pointColor: Colors.teal), - ChartSampleData(x: '3', y: 20, pointColor: Colors.blue), - ChartSampleData(x: '4', y: 50, pointColor: Colors.orange), - ChartSampleData(x: '5', y: 19, pointColor: Colors.pink), - ChartSampleData(x: '6', y: 67, pointColor: Colors.brown[300]), - ]; - count++; - } else if (count == 2) { - chartData = [ - ChartSampleData(x: '1', y: 40, pointColor: Colors.yellow), - ChartSampleData(x: '2', y: 60, pointColor: Colors.teal), - ChartSampleData(x: '3', y: 35, pointColor: Colors.blue), - ChartSampleData(x: '4', y: 12, pointColor: Colors.orange), - ChartSampleData(x: '5', y: 65, pointColor: Colors.pink), - ChartSampleData(x: '6', y: 40, pointColor: Colors.brown[300]), - ]; - count = 0; - } - if (_timer != null) { - _timer.cancel(); - } - return chartData; - } - - /// Method to update the series type in the chart on change. - void _onSeriesTypeChange(String item) { - _selectedType = item; - setState(() { - /// update the series type changes - }); - } -} diff --git a/lib/samples/chart/technical_indicators/stochastic_indicator.dart b/lib/samples/chart/technical_indicators/stochastic_indicator.dart deleted file mode 100644 index e02646a4..00000000 --- a/lib/samples/chart/technical_indicators/stochastic_indicator.dart +++ /dev/null @@ -1,303 +0,0 @@ -/// Package imports -import 'package:intl/intl.dart'; -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; -import '../../../widgets/custom_button.dart'; -import '../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../widgets/shared/web.dart'; -import 'indicator_data_source.dart'; - -/// Renders the OHLC chart with Stochastic indicator sample. -class StochasticcIndicator extends SampleView { - /// creates the OHLC chart with Stochastic indicator. - const StochasticcIndicator(Key key) : super(key: key); - - @override - _StochasticcIndicatorState createState() => _StochasticcIndicatorState(); -} - -/// State class of the OHLC chart with Stochastic indicator. -class _StochasticcIndicatorState extends SampleViewState { - _StochasticcIndicatorState(); - double _period = 14.0; - double _kPeriod = 3.0; - double _dPeriod = 5.0; - double _overBought = 80.0; - double _overSold = 20.0; - bool _showZones = true; - - @override - void initState() { - _period = 14.0; - _overBought = 80.0; - _overSold = 20.0; - _kPeriod = 3.0; - _dPeriod = 5.0; - _showZones = true; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return _getDefaultStochasticIndicator(); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(82, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _period, - onChanged: (double val) => setState(() { - _period = val; - }), - step: 1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'K Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(68, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 100, - initialValue: _kPeriod, - onChanged: (double val) => setState(() { - _kPeriod = val; - }), - step: 1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'D Period', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(68, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _dPeriod, - onChanged: (double val) => setState(() { - _dPeriod = val; - }), - step: 1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Overbought', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(46, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 100, - initialValue: _overBought, - onChanged: (double val) => setState(() { - _overBought = val; - }), - step: 1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - 'Oversold', - style: TextStyle(fontSize: 16.0, color: model.textColor), - ), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(65, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 50, - initialValue: _overSold, - onChanged: (double val) => setState(() { - _overSold = val; - }), - step: 1, - loop: true, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ) - ], - ), - ), - Container( - child: Row( - children: [ - Text('Show zones', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), - child: HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _showZones, - valueChanged: (dynamic value) { - setState(() { - _showZones = value; - }); - }, - ), - ))), - ], - ), - ), - ], - ); - } - - /// Returns the OHLC chart with Stochastic indicator. - SfCartesianChart _getDefaultStochasticIndicator() { - final List chartData = getChartData(); - return SfCartesianChart( - plotAreaBorderWidth: 0, - legend: Legend(isVisible: !isCardView), - primaryXAxis: DateTimeAxis( - majorGridLines: MajorGridLines(width: 0), - dateFormat: DateFormat.MMM(), - interval: 3, - minimum: DateTime(2016, 01, 01), - maximum: DateTime(2017, 01, 01), - ), - primaryYAxis: NumericAxis( - minimum: 70, - maximum: 130, - interval: 20, - labelFormat: '\${value}', - axisLine: AxisLine(width: 0)), - axes: [ - NumericAxis( - majorGridLines: MajorGridLines(width: 0), - opposedPosition: true, - name: 'yaxes', - minimum: 10, - maximum: 110, - interval: 20, - axisLine: AxisLine(width: 0)) - ], - trackballBehavior: TrackballBehavior( - enable: !isCardView, - activationMode: ActivationMode.singleTap, - tooltipDisplayMode: TrackballDisplayMode.groupAllPoints, - ), - tooltipBehavior: TooltipBehavior(enable: isCardView ? true : false), - indicators: >[ - /// Stochastic indicator mentioned here. - StochasticIndicator( - seriesName: 'AAPL', - yAxisName: 'yaxes', - overbought: _overBought ?? 80, - oversold: _overSold ?? 20, - showZones: _showZones ?? true, - period: _period.toInt() ?? 14, - kPeriod: _kPeriod.toInt() ?? 3, - dPeriod: _dPeriod.toInt() ?? 5, - ), - ], - title: ChartTitle(text: isCardView ? '' : 'AAPL - 2016'), - series: >[ - HiloOpenCloseSeries( - emptyPointSettings: EmptyPointSettings(mode: EmptyPointMode.zero), - dataSource: chartData, - opacity: 0.7, - xValueMapper: (ChartSampleData sales, _) => sales.x, - lowValueMapper: (ChartSampleData sales, _) => sales.low, - highValueMapper: (ChartSampleData sales, _) => sales.high, - openValueMapper: (ChartSampleData sales, _) => sales.open, - closeValueMapper: (ChartSampleData sales, _) => sales.close, - name: 'AAPL'), - ], - ); - } -} diff --git a/lib/samples/chart/user_interactions/events.dart b/lib/samples/chart/user_interactions/events.dart deleted file mode 100644 index b8859482..00000000 --- a/lib/samples/chart/user_interactions/events.dart +++ /dev/null @@ -1,294 +0,0 @@ -/// Package import -import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../model/sample_view.dart'; - -///Renders default column chart sample -class Events extends SampleView { - ///Renders default column chart sample - const Events(Key key) : super(key: key); - - @override - _EventsState createState() => _EventsState(); -} - -// final GlobalKey consoleKey = GlobalKey(); -final _scrollController = ScrollController(); - -class _EventsState extends SampleViewState { - _EventsState(); - List actionsList = []; - final GlobalKey consoleKey = GlobalKey(); - - @override - Widget build(BuildContext context) { - return MediaQuery.of(context).size.height > - MediaQuery.of(context).size.width - ? Column(children: [ - Expanded( - flex: 6, - child: _getDefaultEventChart(), - ), - Expanded( - flex: 4, - child: Container( - child: Column( - children: [ - Padding( - padding: EdgeInsets.fromLTRB(5, 5, 5, 0), - child: Container( - height: 50, - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.withOpacity(0.4))), - child: Row( - children: [ - Expanded( - child: Container( - padding: - EdgeInsets.fromLTRB(10, 0, 0, 0), - child: Align( - child: Text( - 'Event Trace', - style: TextStyle( - fontWeight: - FontWeight.bold), - ), - alignment: - Alignment.centerLeft))), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: IconButton( - splashRadius: 25, - icon: Icon(Icons.close), - onPressed: () { - actionsList.clear(); - (consoleKey.currentWidget - as Console) - .actionsList; - consoleKey.currentState - .setState(() {}); - }, - ))), - ], - ))), - Expanded( - child: Padding( - padding: EdgeInsets.fromLTRB(5, 0, 5, 5), - child: Console(actionsList, consoleKey), - )) - ], - ), - )), - ]) - : Row(children: [ - Expanded( - flex: 6, - child: _getDefaultEventChart(), - ), - Expanded( - flex: 4, - child: Container( - child: Column( - children: [ - Padding( - padding: EdgeInsets.fromLTRB(5, 5, 5, 0), - child: Container( - height: 50, - decoration: BoxDecoration( - border: Border.all( - color: Colors.grey.withOpacity(0.4))), - child: Row( - children: [ - Expanded( - child: Container( - padding: - EdgeInsets.fromLTRB(10, 0, 0, 0), - child: Align( - child: Text( - 'Event Trace', - style: TextStyle( - fontWeight: - FontWeight.bold), - ), - alignment: - Alignment.centerLeft))), - Expanded( - child: Align( - alignment: Alignment.centerRight, - child: IconButton( - splashRadius: 25, - icon: Icon(Icons.close), - onPressed: () { - actionsList.clear(); - (consoleKey.currentWidget - as Console) - .actionsList; - // _scrollController.jumpTo(0.0); - // setState(() {}); - consoleKey.currentState - .setState(() {}); - }, - ))), - ], - ))), - Expanded( - child: Padding( - padding: EdgeInsets.fromLTRB(5, 0, 5, 5), - child: Console(actionsList, consoleKey), - )) - ], - ), - )), - ]); - } - - /// Get default column chart - SfCartesianChart _getDefaultEventChart() { - return SfCartesianChart( - onAxisLabelRender: (AxisLabelRenderArgs args) { - actionsList.insert(0, 'Axis label (${args.text}) was rendered'); - }, - onAxisLabelTapped: (AxisLabelTapArgs args) { - actionsList.insert(0, 'Axis label (${args.text}) was tapped'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onDataLabelTapped: (DataLabelTapDetails args) { - actionsList.insert(0, 'Data label (${args.text}) was tapped'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onPointTapped: (PointTapArgs args) { - actionsList.insert( - 0, 'Point (${args.pointIndex.toString()}) was tapped'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onChartTouchInteractionDown: (ChartTouchInteractionArgs args) { - actionsList.insert(0, 'Chart was tapped down'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onChartTouchInteractionMove: (ChartTouchInteractionArgs args) { - actionsList.insert(0, 'Moved on chart area'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onLegendTapped: (LegendTapArgs args) { - actionsList.insert(0, 'Legend was tapped'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onMarkerRender: (MarkerRenderArgs args) { - actionsList.insert( - 0, 'Marker (${args.pointIndex.toString()}) was rendered'); - if (args.pointIndex == 5) { - SchedulerBinding.instance.addPostFrameCallback((_) { - (consoleKey.currentState as _ConsoleState).setState(() {}); - }); - } - }, - onTooltipRender: (TooltipArgs args) { - actionsList.insert(0, 'Tooltip (${args.text}) is showing'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onChartTouchInteractionUp: (ChartTouchInteractionArgs args) { - actionsList.insert(0, 'Chart was tapped up'); - (consoleKey.currentState as _ConsoleState).setState(() {}); - }, - onLegendItemRender: (LegendRenderArgs args) { - actionsList.insert(0, 'Legend (${args.text}) was rendered'); - }, - onDataLabelRender: (DataLabelRenderArgs args) { - actionsList.insert( - 0, 'Data label (${args.text.toString()}) was rendered'); - }, - plotAreaBorderWidth: 0, - title: ChartTitle(text: 'Population growth of various countries'), - primaryXAxis: CategoryAxis( - majorGridLines: MajorGridLines(width: 0), - ), - primaryYAxis: NumericAxis( - axisLine: AxisLine(width: 0), - labelFormat: '{value}%', - majorTickLines: MajorTickLines(size: 0)), - series: _getDefaultColumnSeries(), - legend: Legend(isVisible: true, position: LegendPosition.bottom), - tooltipBehavior: TooltipBehavior( - animationDuration: 0, - canShowMarker: false, - enable: true, - ), - ); - } - - /// Get default column series - List> _getDefaultColumnSeries() { - final List chartData = [ - ChartSampleData(x: 'China', y: 0.541), - ChartSampleData(x: 'Brazil', y: 0.818), - ChartSampleData(x: 'Bolivia', y: 1.51), - ChartSampleData(x: 'Mexico', y: 1.302), - ChartSampleData(x: 'Egypt', y: 2.017), - ChartSampleData(x: 'Mongolia', y: 1.683), - ]; - return >[ - ColumnSeries( - dataSource: chartData, - animationDuration: 0, - name: 'Population', - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - markerSettings: MarkerSettings(isVisible: true), - dataLabelSettings: DataLabelSettings(isVisible: true), - ) - ]; - } -} - -class CustomColumnSeriesRenderer extends ColumnSeriesRenderer {} - -class Console extends StatefulWidget { - Console(this.actionsList, Key consoleKey) : super(key: consoleKey); - final List actionsList; - @override - _ConsoleState createState() => _ConsoleState(); -} - -class _ConsoleState extends State { - void scrollToTop() { - _scrollController.animateTo(_scrollController.position.minScrollExtent, - duration: Duration(milliseconds: 200), curve: Curves.easeIn); - setState(() {}); - } - - void scrollToBottom() { - _scrollController.animateTo(_scrollController.position.maxScrollExtent, - duration: Duration(milliseconds: 200), curve: Curves.easeOut); - setState(() {}); - } - - Widget build(BuildContext context) { - return Container( - child: Padding( - padding: EdgeInsets.all(5), - child: ListView.separated( - controller: _scrollController, - separatorBuilder: (context, build) => Divider( - color: Colors.grey, - height: 4, - ), - itemCount: widget.actionsList.length, - itemBuilder: (BuildContext ctxt, int index) { - return Padding( - padding: EdgeInsets.all(5), - child: Text(widget.actionsList[index]), - ); - }, - )), - decoration: BoxDecoration( - border: Border.all(color: Colors.grey.withOpacity(0.4))), - ); - } -} diff --git a/lib/samples/chart/user_interactions/trackball/chart_with_trackball.dart b/lib/samples/chart/user_interactions/trackball/chart_with_trackball.dart deleted file mode 100644 index 8dc8ba26..00000000 --- a/lib/samples/chart/user_interactions/trackball/chart_with_trackball.dart +++ /dev/null @@ -1,420 +0,0 @@ -/// Package imports -import 'package:intl/intl.dart'; -import 'package:flutter/material.dart'; - -/// Chart import -import 'package:syncfusion_flutter_charts/charts.dart'; - -/// Local imports -import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; -import '../../../../widgets/custom_button.dart'; -import '../../../../widgets/custom_dropdown.dart'; -import '../../../../widgets/shared/mobile.dart' - if (dart.library.html) '../../../../widgets/shared/web.dart'; - -/// Renders the chart with default trackball sample. -class DefaultTrackball extends SampleView { - /// Creates the chart with default trackball sample. - const DefaultTrackball(Key key) : super(key: key); - - @override - _DefaultTrackballState createState() => _DefaultTrackballState(); -} - -/// State class the chart with default trackball. -class _DefaultTrackballState extends SampleViewState { - _DefaultTrackballState(); - double duration = 2; - bool showAlways = false; - final List _modeList = - ['floatAllPoints', 'groupAllPoints', 'nearestPoint'].toList(); - String _selectedMode = 'floatAllPoints'; - - TrackballDisplayMode _mode = TrackballDisplayMode.floatAllPoints; - - final List _alignmentList = - ['center', 'far', 'near'].toList(); - String _tooltipAlignment = 'center'; - bool _showMarker; - ChartAlignment _alignment = ChartAlignment.center; - - @override - void initState() { - duration = 2; - showAlways = false; - _selectedMode = 'floatAllPoints'; - _mode = TrackballDisplayMode.floatAllPoints; - _tooltipAlignment = 'center'; - _showMarker = true; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(bottom: model.isWeb ? 0 : 60), - child: _getDefaultTrackballChart()); - } - - @override - Widget buildSettings(BuildContext context) { - return ListView( - children: [ - StatefulBuilder(builder: (BuildContext context, StateSetter setState) { - return Container( - height: 110, - child: ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - children: [ - Container( - child: Row( - children: [ - Text('Mode ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(100, 0, 0, 0), - height: 50, - width: 280, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: - model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectedMode, - item: _modeList.map((String value) { - return DropdownMenuItem( - value: (value != null) - ? value - : 'point', - child: Text('$value', - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - setState(() { - onModeTypeChange(value); - }); - })), - ), - ), - ], - ), - ), - Container( - child: Row( - children: [ - Text('Alignment', - style: TextStyle( - color: _selectedMode != 'groupAllPoints' - ? model.themeData.brightness == - Brightness.dark - ? const Color.fromRGBO( - 255, 255, 255, 0.3) - : const Color.fromRGBO(0, 0, 0, 0.3) - : model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Container( - padding: const EdgeInsets.fromLTRB(70, 0, 0, 0), - height: 50, - width: 150, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: - model.bottomSheetBackgroundColor), - child: DropdownButtonFormField( - disabledHint: Text( - 'center', - style: TextStyle( - color: _selectedMode != - 'groupAllPoints' - ? model.themeData.brightness == - Brightness.dark - ? const Color.fromRGBO( - 255, 255, 255, 0.3) - : const Color.fromRGBO( - 0, 0, 0, 0.3) - : model.textColor), - ), - value: _tooltipAlignment, - items: _alignmentList.map((String value) { - return DropdownMenuItem( - value: (value != null) - ? value - : 'center', - child: Text('$value', - style: TextStyle( - color: model.textColor))); - }).toList(), - onChanged: - _selectedMode != 'groupAllPoints' - ? null - : (dynamic value) { - onAlignmentChange(value); - })), - ), - ), - ], - ), - ) - ])); - }), - Container( - child: Row( - children: [ - Text('Show always ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - HandCursor( - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: showAlways, - valueChanged: (dynamic value) { - setState(() { - showAlways = value; - }); - }, - ), - ), - ], - ), - ), - Container( - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text('Hide delay ', - style: TextStyle(fontSize: 16.0, color: model.textColor)), - Container( - child: Padding( - padding: const EdgeInsets.fromLTRB(44, 0, 0, 0), - child: HandCursor( - child: CustomDirectionalButtons( - minValue: 0, - maxValue: 10, - initialValue: duration, - onChanged: (double val) => setState(() { - duration = val; - }), - step: 2, - padding: 0, - iconColor: model.textColor, - style: TextStyle(fontSize: 20.0, color: model.textColor), - ), - ), - ), - ), - ], - ), - ), - Container( - child: Row( - children: [ - Text('Show track\nmarker', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal)), - Padding( - padding: EdgeInsets.fromLTRB(20, 0, 0, 0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _showMarker, - valueChanged: (dynamic value) { - setState(() { - _showMarker = value; - }); - }, - )), - ], - ), - ), - ], - ); - } - - /// Returns the cartesian chart with default trackball. - SfCartesianChart _getDefaultTrackballChart() { - return SfCartesianChart( - title: ChartTitle(text: 'Average sales per person'), - plotAreaBorderWidth: 0, - primaryXAxis: DateTimeAxis( - interval: 1, - intervalType: DateTimeIntervalType.years, - dateFormat: DateFormat.y(), - majorGridLines: MajorGridLines(width: 0), - edgeLabelPlacement: EdgeLabelPlacement.shift), - primaryYAxis: NumericAxis( - title: AxisTitle(text: 'Revenue'), - axisLine: AxisLine(width: 0), - majorTickLines: MajorTickLines(width: 0)), - series: _getDefaultTrackballSeries(), - - /// To set the track ball as true and customized trackball behaviour. - trackballBehavior: TrackballBehavior( - enable: true, - markerSettings: TrackballMarkerSettings( - markerVisibility: _showMarker - ? TrackballVisibilityMode.visible - : TrackballVisibilityMode.hidden, - height: 10, - width: 10, - borderWidth: 1, - ), - hideDelay: (duration ?? 2.0) * 1000, - activationMode: ActivationMode.singleTap, - tooltipAlignment: _alignment, - tooltipDisplayMode: _mode, - tooltipSettings: InteractiveTooltip(format: 'point.x: point.y'), - shouldAlwaysShow: showAlways ?? true, - ), - ); - } - - /// Returns the list of chart which need to render on the cartesian chart. - List> _getDefaultTrackballSeries() { - final List chartData = [ - ChartSampleData( - x: DateTime(2000, 2, 11), - y: 15, - secondSeriesYValue: 39, - thirdSeriesYValue: 60), - ChartSampleData( - x: DateTime(2000, 9, 14), - y: 20, - secondSeriesYValue: 30, - thirdSeriesYValue: 55), - ChartSampleData( - x: DateTime(2001, 2, 11), - y: 25, - secondSeriesYValue: 28, - thirdSeriesYValue: 48), - ChartSampleData( - x: DateTime(2001, 9, 16), - y: 21, - secondSeriesYValue: 35, - thirdSeriesYValue: 57), - ChartSampleData( - x: DateTime(2002, 2, 7), - y: 13, - secondSeriesYValue: 39, - thirdSeriesYValue: 62), - ChartSampleData( - x: DateTime(2002, 9, 7), - y: 18, - secondSeriesYValue: 41, - thirdSeriesYValue: 64), - ChartSampleData( - x: DateTime(2003, 2, 11), - y: 24, - secondSeriesYValue: 45, - thirdSeriesYValue: 57), - ChartSampleData( - x: DateTime(2003, 9, 14), - y: 23, - secondSeriesYValue: 48, - thirdSeriesYValue: 53), - ChartSampleData( - x: DateTime(2004, 2, 6), - y: 19, - secondSeriesYValue: 54, - thirdSeriesYValue: 63), - ChartSampleData( - x: DateTime(2004, 9, 6), - y: 31, - secondSeriesYValue: 55, - thirdSeriesYValue: 50), - ChartSampleData( - x: DateTime(2005, 2, 11), - y: 39, - secondSeriesYValue: 57, - thirdSeriesYValue: 66), - ChartSampleData( - x: DateTime(2005, 9, 11), - y: 50, - secondSeriesYValue: 60, - thirdSeriesYValue: 65), - ChartSampleData( - x: DateTime(2006, 2, 11), - y: 24, - secondSeriesYValue: 60, - thirdSeriesYValue: 79), - ]; - return >[ - LineSeries( - dataSource: chartData, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.y, - width: 2, - name: 'John', - markerSettings: MarkerSettings(isVisible: true)), - LineSeries( - dataSource: chartData, - width: 2, - name: 'Andrew', - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.secondSeriesYValue, - markerSettings: MarkerSettings(isVisible: true)), - LineSeries( - dataSource: chartData, - width: 2, - xValueMapper: (ChartSampleData sales, _) => sales.x, - yValueMapper: (ChartSampleData sales, _) => sales.thirdSeriesYValue, - name: 'Thomas', - markerSettings: MarkerSettings(isVisible: true)) - ]; - } - - /// Method to update the trackball display mode in the chart on change. - void onModeTypeChange(String item) { - _selectedMode = item; - if (_selectedMode == 'floatAllPoints') { - _mode = TrackballDisplayMode.floatAllPoints; - } - if (_selectedMode == 'groupAllPoints') { - _mode = TrackballDisplayMode.groupAllPoints; - } - if (_selectedMode == 'nearestPoint') { - _mode = TrackballDisplayMode.nearestPoint; - } - if (_selectedMode == 'none') { - _mode = TrackballDisplayMode.none; - } - setState(() { - /// update the trackball display type changes - }); - } - - /// Method to update the chart alignment for tooltip in the chart on change. - void onAlignmentChange(String item) { - _tooltipAlignment = item; - if (_tooltipAlignment == 'center') { - _alignment = ChartAlignment.center; - } - if (_tooltipAlignment == 'far') { - _alignment = ChartAlignment.far; - } - if (_tooltipAlignment == 'near') { - _alignment = ChartAlignment.near; - } - setState(() { - /// update the tooltip alignment changes - }); - } -} diff --git a/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart b/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart index 79c70961..9fc377c1 100644 --- a/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart +++ b/lib/samples/datagrid/apperance/conditional_styling/datagrid_conditional_styling.dart @@ -134,31 +134,31 @@ class _ConditionalStylingDataGridState extends SampleViewState { } }, columns: [ - GridTextColumn(mappingName: 'name')..headerText = 'Name', - GridNumericColumn(mappingName: 'qs1') - ..headerTextAlignment = Alignment.center - ..headerText = 'Q1' - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..padding = - model.isWeb ? const EdgeInsets.all(16) : const EdgeInsets.all(4), - GridNumericColumn(mappingName: 'qs2') - ..headerTextAlignment = Alignment.center - ..headerText = 'Q2' - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..padding = - model.isWeb ? const EdgeInsets.all(16) : const EdgeInsets.all(4), - GridNumericColumn(mappingName: 'qs3') - ..headerTextAlignment = Alignment.center - ..headerText = 'Q3' - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..padding = - model.isWeb ? const EdgeInsets.all(16) : const EdgeInsets.all(4), - GridNumericColumn(mappingName: 'qs4') - ..headerTextAlignment = Alignment.center - ..headerText = 'Q4' - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..padding = - model.isWeb ? const EdgeInsets.all(16) : const EdgeInsets.all(4), + GridTextColumn(mappingName: 'name', headerText: 'Name'), + GridNumericColumn( + mappingName: 'qs1', + headerTextAlignment: Alignment.center, + headerText: 'Q1', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + padding: model.isWeb ? null : const EdgeInsets.all(4)), + GridNumericColumn( + mappingName: 'qs2', + headerTextAlignment: Alignment.center, + headerText: 'Q2', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + padding: model.isWeb ? null : const EdgeInsets.all(4)), + GridNumericColumn( + mappingName: 'qs3', + headerTextAlignment: Alignment.center, + headerText: 'Q3', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + padding: model.isWeb ? null : const EdgeInsets.all(4)), + GridNumericColumn( + mappingName: 'qs4', + headerTextAlignment: Alignment.center, + headerText: 'Q4', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + padding: model.isWeb ? null : const EdgeInsets.all(4)), ], ); } diff --git a/lib/samples/datagrid/apperance/styling/datagrid_styling.dart b/lib/samples/datagrid/apperance/styling/datagrid_styling.dart index 908c173e..a0b42450 100644 --- a/lib/samples/datagrid/apperance/styling/datagrid_styling.dart +++ b/lib/samples/datagrid/apperance/styling/datagrid_styling.dart @@ -13,7 +13,6 @@ import 'package:syncfusion_flutter_core/theme.dart'; /// Local import import '../../../../model/sample_view.dart'; -import '../../../../widgets/custom_dropdown.dart'; /// render data grid widget class StylingDataGrid extends SampleView { @@ -114,73 +113,82 @@ class _StylingDataGridState extends SampleViewState { List getColumns() { return model.isWeb ? [ - GridNumericColumn(mappingName: 'orderId') - ..headerText = 'Order ID' - ..headerTextAlignment = Alignment.centerRight, - GridNumericColumn(mappingName: 'customerId') - ..headerText = 'Customer ID' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'name') - ..headerText = 'Name' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'freight') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Freight' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'city') - ..headerText = 'City' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'price') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Price' + GridNumericColumn( + mappingName: 'orderId', + headerText: 'Order ID', + headerTextAlignment: Alignment.centerRight), + GridNumericColumn( + mappingName: 'customerId', + headerText: 'Customer ID', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'freight', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'city', + headerText: 'City', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'price', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Price') ] : [ - GridNumericColumn(mappingName: 'orderId') - ..headerTextAlignment = Alignment.centerRight - ..headerText = 'Order ID', - GridNumericColumn(mappingName: 'customerId') - ..padding = const EdgeInsets.all(8) - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.header - ..headerTextAlignment = Alignment.centerRight - ..headerText = 'Customer ID', - GridTextColumn(mappingName: 'name') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'Name', - GridTextColumn(mappingName: 'city') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'City' + GridNumericColumn( + mappingName: 'orderId', + headerTextAlignment: Alignment.centerRight, + headerText: 'Order ID'), + GridNumericColumn( + mappingName: 'customerId', + padding: const EdgeInsets.all(8), + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.header, + headerTextAlignment: Alignment.centerRight, + headerText: 'Customer ID'), + GridTextColumn( + mappingName: 'name', + headerTextAlignment: Alignment.centerLeft, + headerText: 'Name'), + GridTextColumn( + mappingName: 'city', + headerTextAlignment: Alignment.centerLeft, + headerText: 'City') ]; } SfDataGridTheme _dataGridSample([GridLinesVisibility gridLineVisibility]) { return SfDataGridTheme( - data: SfDataGridThemeData( - brightness: model.themeData.brightness, - headerStyle: const DataGridHeaderCellStyle( - backgroundColor: Color(0xFF6C59CF), - textStyle: TextStyle( - color: Color.fromRGBO(255, 255, 255, 1), - ))), - child: SfDataGrid( - source: _stylingDataGridSource, - columnWidthMode: ColumnWidthMode.fill, - gridLinesVisibility: gridLineVisibility, - onQueryRowStyle: (QueryRowStyleArgs args) { - return ((args.rowIndex) % 2 == 0) - ? DataGridCellStyle( - backgroundColor: - model.themeData.brightness == Brightness.dark - ? const Color(0xFF2E2946) - : const Color.fromRGBO(245, 244, 255, 1), - ) - : null; - }, - columns: getColumns(), - )); + data: SfDataGridThemeData( + brightness: model.themeData.brightness, + headerStyle: DataGridHeaderCellStyle( + backgroundColor: Color(0xFF6C59CF), + textStyle: TextStyle(color: Color.fromRGBO(255, 255, 255, 1)), + hoverColor: Color(0xFF9588D7).withOpacity(0.6))), + child: SfDataGrid( + source: _stylingDataGridSource, + columnWidthMode: ColumnWidthMode.fill, + gridLinesVisibility: gridLineVisibility, + onQueryRowStyle: (QueryRowStyleArgs args) { + return ((args.rowIndex) % 2 == 0) + ? DataGridCellStyle( + backgroundColor: model.themeData.brightness == Brightness.dark + ? const Color(0xFF2E2946) + : const Color.fromRGBO(245, 244, 255, 1), + ) + : null; + }, + columns: getColumns(), + ), + ); } @override @@ -203,32 +211,36 @@ class _StylingDataGridState extends SampleViewState { void _subscribeToValueNotifier() => panelOpen = frontPanelVisible.value; @override Widget buildSettings(BuildContext context) { - return ListView(children: [ - ListTile( - title: Text( - 'Grid lines visibility:', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor), - ), - trailing: Theme( - data: ThemeData(canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _gridLinesVisibility, - item: _encoding.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'None', - child: Text('$value', - textAlign: TextAlign.center, - style: TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onGridLinesVisibilitychanges(value); - }), + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView(shrinkWrap: true, children: [ + ListTile( + title: Text( + 'Grid lines visibility:', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor), + ), + trailing: Theme( + data: ThemeData(canvasColor: model.bottomSheetBackgroundColor), + child: DropdownButton( + value: _gridLinesVisibility, + items: _encoding.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'None', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onGridLinesVisibilitychanges(value); + stateSetter(() {}); + }), + ), ), - ), - ]); + ]); + }); } @override diff --git a/lib/samples/datagrid/auto_row_height/datagrid_auto_row_height.dart b/lib/samples/datagrid/auto_row_height/datagrid_auto_row_height.dart index c706b3bd..1c061c67 100644 --- a/lib/samples/datagrid/auto_row_height/datagrid_auto_row_height.dart +++ b/lib/samples/datagrid/auto_row_height/datagrid_auto_row_height.dart @@ -247,57 +247,66 @@ class _AutoRowHeightDataGridState extends SampleViewState { return height; }, columns: [ - GridTextColumn(mappingName: 'id') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 135 : 90 - ..headerText = 'ID' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'contactName') - ..softWrap = true - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.auto : ColumnWidthMode.header - ..overflow = TextOverflow.clip - ..headerText = 'Contact Name' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'companyName') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 165 : 140 - ..headerText = 'Company Name' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'address') - ..softWrap = true - ..width = model.isWeb ? 180 : 140 - ..overflow = TextOverflow.clip - ..headerText = 'Address' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'city') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 150 : 120 - ..headerText = 'City' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'country') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 150 : 120 - ..headerText = 'Country' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'designation') - ..softWrap = true - ..overflow = TextOverflow.clip - ..columnWidthMode = ColumnWidthMode.auto - ..headerText = 'Designation' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'postalCode') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Postal Code' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), - GridTextColumn(mappingName: 'phoneNumber') - ..columnWidthMode = ColumnWidthMode.auto - ..headerText = 'Phone Number' - ..padding = EdgeInsets.symmetric(vertical: 12, horizontal: 16), + GridTextColumn( + mappingName: 'id', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 135 : 90, + headerText: 'ID', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'contactName', + softWrap: true, + columnWidthMode: + model.isWeb ? ColumnWidthMode.auto : ColumnWidthMode.header, + overflow: TextOverflow.clip, + headerText: 'Contact Name', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'companyName', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 165 : 140, + headerText: 'Company Name', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'address', + softWrap: true, + width: model.isWeb ? 180 : 140, + overflow: TextOverflow.clip, + headerText: 'Address', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'city', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 150 : 120, + headerText: 'City', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'country', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 150 : 120, + headerText: 'Country', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'designation', + softWrap: true, + overflow: TextOverflow.clip, + columnWidthMode: ColumnWidthMode.auto, + headerText: 'Designation', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'postalCode', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Postal Code', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), + GridTextColumn( + mappingName: 'phoneNumber', + columnWidthMode: ColumnWidthMode.auto, + headerText: 'Phone Number', + padding: EdgeInsets.symmetric(vertical: 12, horizontal: 16)), ]), ); } diff --git a/lib/samples/datagrid/columns/datagrid_column_types.dart b/lib/samples/datagrid/columns/datagrid_column_types.dart index 0d0b84c1..73d3d140 100644 --- a/lib/samples/datagrid/columns/datagrid_column_types.dart +++ b/lib/samples/datagrid/columns/datagrid_column_types.dart @@ -131,40 +131,45 @@ class _ColumnTypesDataGridState extends SampleViewState { ); }, columns: [ - GridWidgetColumn(mappingName: 'dealer') - ..width = 90 - ..headerText = 'Dealer', - GridNumericColumn(mappingName: 'id') - ..headerText = ' ID' - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.none - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'name') - ..headerText = 'Name' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'freight') - ..textAlignment = Alignment.center - ..headerTextAlignment = Alignment.center - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.none - ..headerText = 'Freight', - GridDateTimeColumn(mappingName: 'shippedDate') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Shipped Date' - ..dateFormat = DateFormat.yMd(), - GridTextColumn(mappingName: 'city') - ..headerText = 'City' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'price') - ..headerTextAlignment = Alignment.centerRight - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..columnWidthMode = ColumnWidthMode.lastColumnFill - ..headerText = 'Price' + GridWidgetColumn( + mappingName: 'dealer', width: 90, headerText: 'Dealer'), + GridNumericColumn( + mappingName: 'id', + headerText: ' ID', + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.none, + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'freight', + textAlignment: Alignment.center, + headerTextAlignment: Alignment.center, + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.none, + headerText: 'Freight'), + GridDateTimeColumn( + mappingName: 'shippedDate', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Shipped Date', + dateFormat: DateFormat.yMd()), + GridTextColumn( + mappingName: 'city', + headerText: 'City', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'price', + headerTextAlignment: Alignment.centerRight, + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + columnWidthMode: ColumnWidthMode.lastColumnFill, + headerText: 'Price') ]); } diff --git a/lib/samples/datagrid/columns/datagrid_custom_header.dart b/lib/samples/datagrid/columns/datagrid_custom_header.dart index c360198e..4619521a 100644 --- a/lib/samples/datagrid/columns/datagrid_custom_header.dart +++ b/lib/samples/datagrid/columns/datagrid_custom_header.dart @@ -147,6 +147,7 @@ class _CustomHeaderDataGridState extends SampleViewState { source: _source, columns: _columns, gridLinesVisibility: GridLinesVisibility.both, + headerGridLinesVisibility: GridLinesVisibility.both, onCellTap: (details) { if (details.rowColumnIndex.rowIndex == 0) { buildShowMenu(context, details); @@ -161,32 +162,25 @@ class _CustomHeaderDataGridState extends SampleViewState { List getColumns() { List columns; columns = [ - GridNumericColumn(mappingName: 'id') - ..width = 140 - ..headerText = 'Order ID', - GridNumericColumn(mappingName: 'productId') - ..width = 150 - ..headerText = 'Product ID', - GridTextColumn(mappingName: 'name') - ..width = 185 - ..headerText = 'Customer Name', - GridTextColumn(mappingName: 'product') - ..width = 135 - ..headerText = 'Product', - GridDateTimeColumn(mappingName: 'orderDate') - ..width = 150 - ..dateFormat = DateFormat('MM/dd/yyyy') - ..headerText = 'Order Date', - GridNumericColumn(mappingName: 'quantity') - ..width = 135 - ..headerText = 'Quantity', - GridTextColumn(mappingName: 'city') - ..width = 130 - ..headerText = 'City', - GridNumericColumn(mappingName: 'unitPrice') - ..width = 140 - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Unit Price', + GridNumericColumn(mappingName: 'id', width: 140, headerText: 'Order ID'), + GridNumericColumn( + mappingName: 'productId', width: 150, headerText: 'Product ID'), + GridTextColumn( + mappingName: 'name', width: 185, headerText: 'Customer Name'), + GridTextColumn(mappingName: 'product', width: 135, headerText: 'Product'), + GridDateTimeColumn( + mappingName: 'orderDate', + width: 150, + dateFormat: DateFormat('MM/dd/yyyy'), + headerText: 'Order Date'), + GridNumericColumn( + mappingName: 'quantity', width: 135, headerText: 'Quantity'), + GridTextColumn(mappingName: 'city', width: 130, headerText: 'City'), + GridNumericColumn( + mappingName: 'unitPrice', + width: 140, + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Unit Price'), ]; return columns; } diff --git a/lib/samples/datagrid/columns/datagrid_stacked_header.dart b/lib/samples/datagrid/columns/datagrid_stacked_header.dart new file mode 100644 index 00000000..c419ce4a --- /dev/null +++ b/lib/samples/datagrid/columns/datagrid_stacked_header.dart @@ -0,0 +1,336 @@ +/// Dart import +import 'dart:math'; + +/// Package imports +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +/// DataGrid import +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; + +/// Core import +import 'package:syncfusion_flutter_core/theme.dart'; + +/// Local import +import '../../../model/sample_view.dart'; + +class StackedHeaderDataGrid extends SampleView { + StackedHeaderDataGrid({Key key}) : super(key: key); + + @override + _StackedHeaderDataGridState createState() => _StackedHeaderDataGridState(); +} + +List _productData; + +class _StackedHeaderDataGridState extends SampleViewState { + final _StackedHeaderDataGridSource _stackedHeaderDataGridSource = + _StackedHeaderDataGridSource(); + final Random _random = Random(); + + final List _product = [ + 'Lax', + 'Chocolate', + 'Syrup', + 'Chai', + 'Bags', + 'Meat', + 'Filo', + 'Cashew', + 'Walnuts', + 'Geitost', + 'Cote de', + 'Crab', + 'Chang', + 'Cajun', + 'Gum', + 'Filo', + 'Cashew', + 'Walnuts', + 'Geitost', + 'Bag', + 'Meat', + 'Filo', + 'Cashew', + 'Geitost', + 'Cote de', + 'Crab', + 'Chang', + 'Cajun', + 'Gum', + ]; + + final List _cities = [ + 'Bruxelles', + 'Rosario', + 'Recife', + 'Graz', + 'Montreal', + 'Tsawassen', + 'Campinas', + 'Resende', + ]; + + final List _productId = [ + 3524, + 2523, + 1345, + 5243, + 1803, + 4932, + 6532, + 9475, + 2435, + 2123, + 3652, + 4523, + 4263, + 3527, + 3634, + 4932, + 6532, + 9475, + 2435, + 2123, + 6532, + 9475, + 2435, + 2123, + 4523, + 4263, + 3527, + 3634, + 4932, + ]; + + final List _orderDate = [ + DateTime.now(), + DateTime(2002, 8, 27), + DateTime(2015, 7, 4), + DateTime(2007, 4, 15), + DateTime(2010, 12, 23), + DateTime(2010, 4, 20), + DateTime(2004, 6, 13), + DateTime(2008, 11, 11), + DateTime(2005, 7, 29), + DateTime(2009, 4, 5), + DateTime(2003, 3, 20), + DateTime(2011, 3, 8), + DateTime(2013, 10, 22), + ]; + + List _names = [ + 'Kyle', + 'Gina', + 'Irene', + 'Katie', + 'Michael', + 'Oscar', + 'Ralph', + 'Torrey', + 'William', + 'Bill', + 'Daniel', + 'Frank', + 'Brenda', + 'Danielle', + 'Fiona', + 'Howard', + 'Jack', + 'Larry', + 'Holly', + 'Jennifer', + 'Liz', + 'Pete', + 'Steve', + 'Vince', + 'Zeke' + ]; + + List _generateProductData(int count) { + final List productData = []; + for (int i = 0; i < count; i++) { + productData.add( + Product( + i + 1000, + _productId[i < _productId.length + ? i + : _random.nextInt(_productId.length - 1)], + _product[ + i < _product.length ? i : _random.nextInt(_product.length - 1)], + _random.nextInt(count), + 70.0 + _random.nextInt(100), + _cities[ + i < _cities.length ? i : _random.nextInt(_cities.length - 1)], + 1700 + _random.nextInt(100), + _orderDate[_random.nextInt(_orderDate.length - 1)], + _names[i < _names.length ? i : _random.nextInt(_names.length - 1)]), + ); + } + + return productData; + } + + List _getColumns() { + List columns; + columns = [ + GridTextColumn( + mappingName: 'customerName', + width: model.isWeb ? 180 : 140, + headerText: 'Customer Name'), + GridTextColumn( + mappingName: 'city', + width: model.isWeb ? 140 : 100, + headerText: 'City'), + GridNumericColumn( + mappingName: 'orderId', + width: model.isWeb ? 140 : 90, + headerText: 'Order ID'), + GridDateTimeColumn( + mappingName: 'orderDate', + width: model.isWeb ? 140 : 110, + dateFormat: DateFormat('MM/dd/yyyy'), + headerText: 'Order Date'), + GridTextColumn( + mappingName: 'product', + width: model.isWeb ? 160 : 100, + headerText: 'Product'), + GridNumericColumn( + mappingName: 'productId', + width: model.isWeb ? 150 : 100, + headerText: 'Product ID'), + GridNumericColumn( + mappingName: 'quantity', + width: model.isWeb ? 150 : 90, + headerText: 'Quantity'), + GridNumericColumn( + mappingName: 'unitPrice', + width: model.isWeb ? 140 : 100, + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Unit Price'), + ]; + return columns; + } + + Color _getHeaderCellBackgroundColor() { + return model.themeData.brightness == Brightness.light + ? const Color(0xFFF1F1F1) + : const Color(0xFF3A3A3A); + } + + Widget _getWidgetForStackedHeaderCell(String title) { + return Container( + padding: EdgeInsets.all(16.0), + color: _getHeaderCellBackgroundColor(), + alignment: Alignment.centerLeft, + child: Text(title)); + } + + List _getStackedHeaderRows() { + List _stackedHeaderRows; + _stackedHeaderRows = [ + StackedHeaderRow(cells: [ + StackedHeaderCell(columnNames: [ + 'customerName', + 'city', + ], child: _getWidgetForStackedHeaderCell('Customer Details')), + StackedHeaderCell(columnNames: [ + 'orderId', + 'orderDate', + ], child: _getWidgetForStackedHeaderCell('Order Details')), + StackedHeaderCell( + columnNames: ['product', 'productId', 'quantity', 'unitPrice'], + child: _getWidgetForStackedHeaderCell('Product Details')) + ]) + ]; + return _stackedHeaderRows; + } + + @override + void initState() { + super.initState(); + _productData = _generateProductData(30); + } + + @override + Widget build(BuildContext context) { + return SfDataGridTheme( + data: SfDataGridThemeData( + brightness: model.themeData.brightness, + headerStyle: DataGridHeaderCellStyle( + hoverColor: Colors.transparent, + hoverTextStyle: + SfTheme.of(context).dataGridThemeData.headerStyle.textStyle, + backgroundColor: _getHeaderCellBackgroundColor())), + child: SfDataGrid( + gridLinesVisibility: GridLinesVisibility.both, + headerGridLinesVisibility: GridLinesVisibility.both, + source: _stackedHeaderDataGridSource, + columns: _getColumns(), + stackedHeaderRows: _getStackedHeaderRows(), + )); + } +} + +class Product { + Product( + this.orderId, + this.productId, + this.product, + this.quantity, + this.unitPrice, + this.city, + this.customerId, + this.orderDate, + this.customerName); + final int orderId; + final int productId; + final String product; + final int quantity; + final double unitPrice; + final String city; + final int customerId; + final DateTime orderDate; + final String customerName; +} + +class _StackedHeaderDataGridSource extends DataGridSource { + _StackedHeaderDataGridSource(); + @override + List get dataSource => _productData; + @override + Object getValue(Product product, String columnName) { + switch (columnName) { + case 'orderId': + return product.orderId; + break; + case 'product': + return product.product; + break; + case 'productId': + return product.productId; + break; + case 'unitPrice': + return product.unitPrice; + break; + case 'quantity': + return product.quantity; + break; + case 'city': + return product.city; + break; + case 'customerId': + return product.customerId; + break; + case 'orderDate': + return product.orderDate; + break; + case 'customerName': + return product.customerName; + break; + default: + return 'empty'; + break; + } + } +} diff --git a/lib/samples/datagrid/data_source/datagrid_json_data_source.dart b/lib/samples/datagrid/data_source/datagrid_json_data_source.dart index edc1b36b..0aa4564b 100644 --- a/lib/samples/datagrid/data_source/datagrid_json_data_source.dart +++ b/lib/samples/datagrid/data_source/datagrid_json_data_source.dart @@ -26,43 +26,51 @@ class _JsonDataSourceDataGridState extends SampleViewState { List getColumns() { List columns; columns = ([ - GridTextColumn(mappingName: 'id') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 135 : 90 - ..headerText = 'ID', - GridTextColumn(mappingName: 'contactName') - ..softWrap = true - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.auto : ColumnWidthMode.header - ..overflow = TextOverflow.clip - ..headerText = 'Contact Name', - GridTextColumn(mappingName: 'companyName') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 165 : 140 - ..headerText = 'Company', - GridTextColumn(mappingName: 'city') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 150 : 120 - ..headerText = 'City', - GridTextColumn(mappingName: 'country') - ..softWrap = true - ..overflow = TextOverflow.clip - ..width = model.isWeb ? 150 : 120 - ..headerText = 'Country', - GridTextColumn(mappingName: 'designation') - ..softWrap = true - ..overflow = TextOverflow.clip - ..columnWidthMode = ColumnWidthMode.auto - ..headerText = 'Job Title', - GridTextColumn(mappingName: 'postalCode') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Postal Code', - GridTextColumn(mappingName: 'phoneNumber') - ..columnWidthMode = ColumnWidthMode.auto - ..headerText = 'Phone Number' + GridTextColumn( + mappingName: 'id', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 135 : 90, + headerText: 'ID'), + GridTextColumn( + mappingName: 'contactName', + softWrap: true, + columnWidthMode: + model.isWeb ? ColumnWidthMode.auto : ColumnWidthMode.header, + overflow: TextOverflow.clip, + headerText: 'Contact Name'), + GridTextColumn( + mappingName: 'companyName', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 165 : 140, + headerText: 'Company'), + GridTextColumn( + mappingName: 'city', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 150 : 120, + headerText: 'City'), + GridTextColumn( + mappingName: 'country', + softWrap: true, + overflow: TextOverflow.clip, + width: model.isWeb ? 150 : 120, + headerText: 'Country'), + GridTextColumn( + mappingName: 'designation', + softWrap: true, + overflow: TextOverflow.clip, + columnWidthMode: ColumnWidthMode.auto, + headerText: 'Job Title'), + GridTextColumn( + mappingName: 'postalCode', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Postal Code'), + GridTextColumn( + mappingName: 'phoneNumber', + columnWidthMode: ColumnWidthMode.auto, + headerText: 'Phone Number') ]); return columns; } diff --git a/lib/samples/datagrid/data_source/datagrid_list_data_source.dart b/lib/samples/datagrid/data_source/datagrid_list_data_source.dart index db48054d..34548f34 100644 --- a/lib/samples/datagrid/data_source/datagrid_list_data_source.dart +++ b/lib/samples/datagrid/data_source/datagrid_list_data_source.dart @@ -77,53 +77,63 @@ class _ListDataSourceDataGridState extends SampleViewState { List columns; columns = kIsWeb ? ([ - GridNumericColumn(mappingName: 'id') - ..headerText = 'Order ID' - ..padding = const EdgeInsets.all(8) - ..headerTextAlignment = Alignment.centerRight - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto, - GridNumericColumn(mappingName: 'customerId') - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.header - ..headerText = 'Customer ID' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'name') - ..headerText = 'Name' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'freight') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Freight' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'city') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'City' - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto, - GridNumericColumn(mappingName: 'price') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Price' + GridNumericColumn( + mappingName: 'id', + headerText: 'Order ID', + padding: const EdgeInsets.all(8), + headerTextAlignment: Alignment.centerRight, + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto), + GridNumericColumn( + mappingName: 'customerId', + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.header, + headerText: 'Customer ID', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'freight', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'city', + headerTextAlignment: Alignment.centerLeft, + headerText: 'City', + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto), + GridNumericColumn( + mappingName: 'price', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Price') ]) : ([ - GridNumericColumn(mappingName: 'id') - ..headerText = 'ID' - ..padding = const EdgeInsets.all(8) - ..headerTextAlignment = Alignment.centerRight, - GridNumericColumn(mappingName: 'customerId') - ..headerTextAlignment = Alignment.centerRight - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.header - ..headerText = 'Customer ID', - GridTextColumn(mappingName: 'name') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'Name', - GridTextColumn(mappingName: 'city') - ..headerText = 'City' - ..headerTextAlignment = Alignment.centerLeft - ..columnWidthMode = ColumnWidthMode.lastColumnFill, + GridNumericColumn( + mappingName: 'id', + headerText: 'ID', + padding: const EdgeInsets.all(8), + headerTextAlignment: Alignment.centerRight), + GridNumericColumn( + mappingName: 'customerId', + headerTextAlignment: Alignment.centerRight, + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.header, + headerText: 'Customer ID'), + GridTextColumn( + mappingName: 'name', + headerTextAlignment: Alignment.centerLeft, + headerText: 'Name'), + GridTextColumn( + mappingName: 'city', + headerText: 'City', + headerTextAlignment: Alignment.centerLeft, + columnWidthMode: ColumnWidthMode.lastColumnFill), ]); return columns; } diff --git a/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart b/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart index 20b057a9..e89a560a 100644 --- a/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart +++ b/lib/samples/datagrid/freeze_panes/datagrid_freeze_panes.dart @@ -173,32 +173,38 @@ class _FreezePanesDataGridPageState extends SampleViewState { List getColumns() { List columns; columns = [ - GridNumericColumn(mappingName: 'id') - ..width = model.isWeb ? 140 : 90 - ..headerText = 'ID', - GridNumericColumn(mappingName: 'productId') - ..width = model.isWeb ? 150 : 100 - ..headerText = 'Product ID', - GridTextColumn(mappingName: 'name') - ..width = model.isWeb ? 180 : 140 - ..headerText = 'Customer Name', - GridTextColumn(mappingName: 'product') - ..width = model.isWeb ? 160 : 100 - ..headerText = 'Product', - GridDateTimeColumn(mappingName: 'orderDate') - ..width = model.isWeb ? 140 : 110 - ..dateFormat = DateFormat('MM/dd/yyyy') - ..headerText = 'Order Date', - GridNumericColumn(mappingName: 'quantity') - ..width = model.isWeb ? 150 : 90 - ..headerText = 'Quantity', - GridTextColumn(mappingName: 'city') - ..width = model.isWeb ? 140 : 100 - ..headerText = 'City', - GridNumericColumn(mappingName: 'unitPrice') - ..width = model.isWeb ? 140 : 100 - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Unit Price', + GridNumericColumn( + mappingName: 'id', width: model.isWeb ? 140 : 90, headerText: 'ID'), + GridNumericColumn( + mappingName: 'productId', + width: model.isWeb ? 150 : 100, + headerText: 'Product ID'), + GridTextColumn( + mappingName: 'name', + width: model.isWeb ? 180 : 140, + headerText: 'Customer Name'), + GridTextColumn( + mappingName: 'product', + width: model.isWeb ? 160 : 100, + headerText: 'Product'), + GridDateTimeColumn( + mappingName: 'orderDate', + width: model.isWeb ? 140 : 110, + dateFormat: DateFormat('MM/dd/yyyy'), + headerText: 'Order Date'), + GridNumericColumn( + mappingName: 'quantity', + width: model.isWeb ? 150 : 90, + headerText: 'Quantity'), + GridTextColumn( + mappingName: 'city', + width: model.isWeb ? 140 : 100, + headerText: 'City'), + GridNumericColumn( + mappingName: 'unitPrice', + width: model.isWeb ? 140 : 100, + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Unit Price'), ]; return columns; } diff --git a/lib/samples/datagrid/getting_started/datagrid_getting_started.dart b/lib/samples/datagrid/getting_started/datagrid_getting_started.dart index 29737b2b..c1eb3a0b 100644 --- a/lib/samples/datagrid/getting_started/datagrid_getting_started.dart +++ b/lib/samples/datagrid/getting_started/datagrid_getting_started.dart @@ -310,35 +310,41 @@ class _GettingStartedDataGridState extends SampleViewState { ), rowHeight: 50, columns: [ - GridWidgetColumn(mappingName: 'image') - ..width = 51 - ..headerText = '' - ..padding = const EdgeInsets.all(8.0), - GridTextColumn(mappingName: 'team') - ..columnWidthMode = ColumnWidthMode.cells - ..headerText = 'Team' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'wins') - ..headerText = 'W' - ..padding = const EdgeInsets.all(8) - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, - GridNumericColumn(mappingName: 'losses') - ..padding = const EdgeInsets.all(8) - ..textAlignment = Alignment.center - ..headerTextAlignment = Alignment.center - ..headerText = 'L', - GridNumericColumn(mappingName: 'pct') - ..headerText = 'WPCT' - ..padding = const EdgeInsets.all(8) - ..textAlignment = Alignment.center - ..headerTextAlignment = Alignment.center - ..columnWidthMode = ColumnWidthMode.auto, - GridNumericColumn(mappingName: 'gb') - ..headerText = 'GB' - ..textAlignment = Alignment.center - ..headerTextAlignment = Alignment.center - ..padding = const EdgeInsets.all(8), + GridWidgetColumn( + mappingName: 'image', + width: 51, + headerText: '', + ), + GridTextColumn( + mappingName: 'team', + columnWidthMode: ColumnWidthMode.cells, + headerText: 'Team', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'wins', + headerText: 'W', + padding: const EdgeInsets.all(8), + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), + GridNumericColumn( + mappingName: 'losses', + padding: const EdgeInsets.all(8), + textAlignment: Alignment.center, + headerTextAlignment: Alignment.center, + headerText: 'L'), + GridNumericColumn( + mappingName: 'pct', + headerText: 'WPCT', + padding: const EdgeInsets.all(8), + textAlignment: Alignment.center, + headerTextAlignment: Alignment.center, + columnWidthMode: ColumnWidthMode.auto), + GridNumericColumn( + mappingName: 'gb', + headerText: 'GB', + textAlignment: Alignment.center, + headerTextAlignment: Alignment.center, + padding: const EdgeInsets.all(8)), ], ); } @@ -473,35 +479,44 @@ class _GettingStartedDataGridState extends SampleViewState { } }, columns: [ - GridWidgetColumn(mappingName: 'employeeName') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Employee Name', - GridTextColumn(mappingName: 'designation') - ..headerText = 'Designation' - ..headerTextAlignment = Alignment.centerLeft, - GridTextColumn(mappingName: 'mail') - ..headerText = 'Mail' - ..headerTextAlignment = Alignment.centerLeft, - GridWidgetColumn(mappingName: 'location') - ..width = 105 - ..headerText = 'Location' - ..headerTextAlignment = Alignment.centerLeft, - GridTextColumn(mappingName: 'status') - ..headerText = 'Status' - ..headerTextAlignment = Alignment.centerLeft, - GridWidgetColumn(mappingName: 'trustworthiness') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Trustworthiness', - GridWidgetColumn(mappingName: 'softwareProficiency') - ..columnWidthMode = ColumnWidthMode.header - ..headerText = 'Software Proficiency', - GridNumericColumn(mappingName: 'salary') - ..headerText = 'Salary' - ..headerTextAlignment = Alignment.centerRight - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$'), - GridTextColumn(mappingName: 'address') - ..headerText = 'Address' - ..headerTextAlignment = Alignment.centerLeft, + GridWidgetColumn( + mappingName: 'employeeName', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Employee Name'), + GridTextColumn( + mappingName: 'designation', + headerText: 'Designation', + headerTextAlignment: Alignment.centerLeft), + GridTextColumn( + mappingName: 'mail', + headerText: 'Mail', + headerTextAlignment: Alignment.centerLeft), + GridWidgetColumn( + mappingName: 'location', + width: 105, + headerText: 'Location', + headerTextAlignment: Alignment.centerLeft), + GridTextColumn( + mappingName: 'status', + headerText: 'Status', + headerTextAlignment: Alignment.centerLeft), + GridWidgetColumn( + mappingName: 'trustworthiness', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Trustworthiness'), + GridWidgetColumn( + mappingName: 'softwareProficiency', + columnWidthMode: ColumnWidthMode.header, + headerText: 'Software Proficiency'), + GridNumericColumn( + mappingName: 'salary', + headerText: 'Salary', + headerTextAlignment: Alignment.centerRight, + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$')), + GridTextColumn( + mappingName: 'address', + headerText: 'Address', + headerTextAlignment: Alignment.centerLeft), ], ); } diff --git a/lib/samples/datagrid/loadmore/datagrid_infinite_scrolling.dart b/lib/samples/datagrid/loadmore/datagrid_infinite_scrolling.dart new file mode 100644 index 00000000..bf3a1b5f --- /dev/null +++ b/lib/samples/datagrid/loadmore/datagrid_infinite_scrolling.dart @@ -0,0 +1,222 @@ +/// Dart import +import 'dart:math'; + +/// Package import +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; + +/// DataGrid import +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; + +/// Local import +import '../../../model/sample_view.dart'; + +class LoadMoreInfiniteScrollingDataGrid extends SampleView { + LoadMoreInfiniteScrollingDataGrid({Key key}) : super(key: key); + + @override + _LoadMoreInfiniteScrollingDataGridState createState() => + _LoadMoreInfiniteScrollingDataGridState(); +} + +class _LoadMoreInfiniteScrollingDataGridState extends SampleViewState { + List _employeeData = []; + EmployeeDataSource _employeeDataSource; + + @override + void initState() { + _populateData(); + _employeeDataSource = EmployeeDataSource(employeeData: _employeeData); + super.initState(); + } + + Widget _buildProgressIndicator() { + final isLight = model.themeData.brightness == Brightness.light; + return Container( + height: 60.0, + alignment: Alignment.center, + width: double.infinity, + decoration: BoxDecoration( + color: isLight ? Color(0xFFFFFFFF) : Color(0xFF212121), + border: BorderDirectional( + top: BorderSide( + width: 1.0, + color: isLight + ? Color.fromRGBO(0, 0, 0, 0.26) + : Color.fromRGBO(255, 255, 255, 0.26)))), + child: Container( + width: 40, + height: 40, + alignment: Alignment.center, + child: Container( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(model.backgroundColor), + backgroundColor: Colors.transparent, + )))); + } + + Widget _buildLoadMoreView(BuildContext context, LoadMoreRows loadMoreRows) { + Future loadRows() async { + // Call the loadMoreRows function to call the + // DataGridSource.handleLoadMoreRows method. So, additional + // rows can be added from handleLoadMoreRows method. + await loadMoreRows(); + return Future.value('Completed'); + } + + return FutureBuilder( + initialData: 'Loading', + future: loadRows(), + builder: (context, snapShot) { + return snapShot.data == 'Loading' + ? _buildProgressIndicator() + : SizedBox.fromSize(size: Size.zero); + }, + ); + } + + @override + Widget build(BuildContext context) { + return SfDataGrid( + source: _employeeDataSource, + loadMoreViewBuilder: _buildLoadMoreView, + columns: _getColumns()); + } + + void _populateData() { + _employeeData.clear(); + _employeeData = _generateList(_employeeData, 25); + } +} + +List _getColumns() { + return [ + GridNumericColumn( + mappingName: 'id', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Order ID'), + GridNumericColumn( + mappingName: 'customerId', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Customer ID'), + GridTextColumn(mappingName: 'name', headerText: 'Name'), + GridNumericColumn( + mappingName: 'freight', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight'), + GridTextColumn( + mappingName: 'city', + columnWidthMode: !kIsWeb ? ColumnWidthMode.auto : ColumnWidthMode.fill, + headerText: 'City'), + GridNumericColumn( + mappingName: 'price', + numberFormat: NumberFormat.currency( + locale: 'en_US', symbol: '\$', decimalDigits: 0), + columnWidthMode: ColumnWidthMode.lastColumnFill, + headerText: 'Price') + ]; +} + +List _generateList(List employeeData, int count) { + final Random _random = Random(); + int startIndex = employeeData.isNotEmpty ? employeeData.length : 0, + endIndex = startIndex + count; + for (int i = startIndex; i < endIndex; i++) { + employeeData.add(Employee( + 1000 + i, + 1700 + i, + _names[i < _names.length ? i : _random.nextInt(_names.length - 1)], + _random.nextInt(1000) + _random.nextDouble(), + _citys[_random.nextInt(_citys.length - 1)], + 1500.0 + _random.nextInt(100), + )); + } + return employeeData; +} + +final List _names = [ + 'Welli', + 'Blonp', + 'Folko', + 'Furip', + 'Folig', + 'Picco', + 'Frans', + 'Warth', + 'Linod', + 'Simop', + 'Merep', + 'Riscu', + 'Seves', + 'Vaffe', + 'Alfki', +]; + +final List _citys = [ + 'Bruxelles', + 'Rosario', + 'Recife', + 'Graz', + 'Montreal', + 'Tsawassen', + 'Campinas', + 'Resende', +]; + +class Employee { + Employee( + this.id, this.customerId, this.name, this.freight, this.city, this.price); + final int id; + final int customerId; + final String name; + final String city; + final double freight; + final double price; +} + +class EmployeeDataSource extends DataGridSource { + EmployeeDataSource({List employeeData}) { + _employeeData = employeeData; + } + + List _employeeData; + + @override + List get dataSource => _employeeData; + @override + Object getValue(Employee employee, String columnName) { + switch (columnName) { + case 'id': + return employee.id; + break; + case 'name': + return employee.name; + break; + case 'customerId': + return employee.customerId; + break; + case 'freight': + return employee.freight; + break; + case 'price': + return employee.price; + break; + case 'city': + return employee.city; + break; + default: + return 'empty'; + break; + } + } + + @override + Future handleLoadMoreRows() async { + await Future.delayed(Duration(seconds: 5)); + _employeeData = _generateList(dataSource, 15); + notifyListeners(); + } +} diff --git a/lib/samples/datagrid/loadmore/datagrid_load_more.dart b/lib/samples/datagrid/loadmore/datagrid_load_more.dart new file mode 100644 index 00000000..bd602f9d --- /dev/null +++ b/lib/samples/datagrid/loadmore/datagrid_load_more.dart @@ -0,0 +1,265 @@ +/// Dart import +import 'dart:math'; + +/// Package import +import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart'; + +/// DataGrid import +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; + +/// Local import +import '../../../model/sample_view.dart'; + +class LoadMoreDataGrid extends SampleView { + LoadMoreDataGrid({Key key}) : super(key: key); + + @override + _LoadMoreDataGridState createState() => _LoadMoreDataGridState(); +} + +class _LoadMoreDataGridState extends SampleViewState { + List _employeeData = []; + EmployeeDataSource _employeeDataSource; + + @override + void initState() { + _populateData(); + _employeeDataSource = EmployeeDataSource(employeeData: _employeeData); + super.initState(); + } + + Widget _buildProgressIndicator(bool isLight) { + return Container( + height: 60.0, + alignment: Alignment.center, + width: double.infinity, + decoration: BoxDecoration( + color: isLight ? Color(0xFFFFFFFF) : Color(0xFF212121), + border: BorderDirectional( + top: BorderSide( + width: 1.0, + color: isLight + ? Color.fromRGBO(0, 0, 0, 0.26) + : Color.fromRGBO(255, 255, 255, 0.26)))), + child: Container( + width: 40, + height: 40, + alignment: Alignment.center, + child: Container( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation(model.backgroundColor), + backgroundColor: Colors.transparent, + )))); + } + + Widget _buildLoadMoreView(BuildContext context, LoadMoreRows loadMoreRows) { + final isLight = model.themeData.brightness == Brightness.light; + bool showIndicator = false; + + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return showIndicator + ? _buildProgressIndicator(isLight) + : Container( + height: 60.0, + width: double.infinity, + alignment: Alignment.center, + decoration: BoxDecoration( + color: isLight ? Color(0xFFFFFFFF) : Color(0xFF212121), + border: BorderDirectional( + top: BorderSide( + width: 1.0, + color: isLight + ? Color.fromRGBO(0, 0, 0, 0.26) + : Color.fromRGBO(255, 255, 255, 0.26)))), + child: Container( + width: model.isWeb ? 350.0 : 142.0, + height: 36, + decoration: BoxDecoration( + color: model.backgroundColor, + borderRadius: BorderRadius.circular(4.0)), + child: FlatButton( + child: Text('LOAD MORE', + style: TextStyle( + letterSpacing: model.isWeb ? 1.35 : 0.35, + fontSize: 14, + color: Colors.white)), + onPressed: () async { + // To avoid the "Error: setState() called after dispose():" + // while scrolling the datagrid vertically and displaying the + // load more view, current load more view is checked whether + // loaded widget is mounted or not. + if (context is StatefulElement && + context.state != null && + context.state.mounted) { + setState(() { + showIndicator = true; + }); + } + // Call the loadMoreRows function to call the + // DataGridSource.handleLoadMoreRows method. So, additional + // rows can be added from handleLoadMoreRows method. + await loadMoreRows(); + // To avoid the "Error: setState() called after dispose():" + // while scrolling the datagrid vertically and displaying the + // load more view, current load more view is checked whether + // loaded widget is mounted or not. + if (context is StatefulElement && + context.state != null && + context.state.mounted) { + setState(() { + showIndicator = false; + }); + } + }, + ), + )); + }); + } + + @override + Widget build(BuildContext context) { + return SfDataGrid( + source: _employeeDataSource, + loadMoreViewBuilder: _buildLoadMoreView, + columns: _getColumns()); + } + + void _populateData() { + _employeeData.clear(); + _employeeData = _generateList(_employeeData, 25); + } +} + +List _getColumns() { + return [ + GridNumericColumn( + mappingName: 'id', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Order ID'), + GridNumericColumn( + mappingName: 'customerId', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Customer ID'), + GridTextColumn(mappingName: 'name', headerText: 'Name'), + GridNumericColumn( + mappingName: 'freight', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight'), + GridTextColumn( + mappingName: 'city', + columnWidthMode: !kIsWeb ? ColumnWidthMode.auto : ColumnWidthMode.fill, + headerText: 'City'), + GridNumericColumn( + mappingName: 'price', + numberFormat: NumberFormat.currency( + locale: 'en_US', symbol: '\$', decimalDigits: 0), + columnWidthMode: ColumnWidthMode.lastColumnFill, + headerText: 'Price') + ]; +} + +List _generateList(List employeeData, int count) { + final Random _random = Random(); + int startIndex = employeeData.isNotEmpty ? employeeData.length : 0, + endIndex = startIndex + count; + for (int i = startIndex; i < endIndex; i++) { + employeeData.add(Employee( + 1000 + i, + 1700 + i, + _names[i < _names.length ? i : _random.nextInt(_names.length - 1)], + _random.nextInt(1000) + _random.nextDouble(), + _citys[_random.nextInt(_citys.length - 1)], + 1500.0 + _random.nextInt(100), + )); + } + return employeeData; +} + +final List _names = [ + 'Welli', + 'Blonp', + 'Folko', + 'Furip', + 'Folig', + 'Picco', + 'Frans', + 'Warth', + 'Linod', + 'Simop', + 'Merep', + 'Riscu', + 'Seves', + 'Vaffe', + 'Alfki', +]; + +final List _citys = [ + 'Bruxelles', + 'Rosario', + 'Recife', + 'Graz', + 'Montreal', + 'Tsawassen', + 'Campinas', + 'Resende', +]; + +class Employee { + Employee( + this.id, this.customerId, this.name, this.freight, this.city, this.price); + final int id; + final int customerId; + final String name; + final String city; + final double freight; + final double price; +} + +class EmployeeDataSource extends DataGridSource { + EmployeeDataSource({List employeeData}) { + _employeeData = employeeData; + } + + List _employeeData; + + @override + List get dataSource => _employeeData; + @override + Object getValue(Employee employee, String columnName) { + switch (columnName) { + case 'id': + return employee.id; + break; + case 'name': + return employee.name; + break; + case 'customerId': + return employee.customerId; + break; + case 'freight': + return employee.freight; + break; + case 'price': + return employee.price; + break; + case 'city': + return employee.city; + break; + default: + return 'empty'; + break; + } + } + + @override + Future handleLoadMoreRows() async { + await Future.delayed(Duration(seconds: 5)); + _employeeData = _generateList(dataSource, 15); + notifyListeners(); + } +} diff --git a/lib/samples/datagrid/paging/datagrid_paging.dart b/lib/samples/datagrid/paging/datagrid_paging.dart index 3c2af325..67134a54 100644 --- a/lib/samples/datagrid/paging/datagrid_paging.dart +++ b/lib/samples/datagrid/paging/datagrid_paging.dart @@ -55,26 +55,33 @@ class _PagingDataGridState extends SampleViewState { ? ColumnWidthMode.auto : ColumnWidthMode.fill, columns: [ - GridNumericColumn(mappingName: 'orderID', headerText: 'Order ID') - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.none - ..headerTextAlignment = Alignment.centerRight, + GridNumericColumn( + mappingName: 'orderID', + headerText: 'Order ID', + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.none, + headerTextAlignment: Alignment.centerRight), GridTextColumn( mappingName: 'customerID', headerText: 'Customer Name'), - GridDateTimeColumn(mappingName: 'orderDate', headerText: 'Order Date') - ..dateFormat = DateFormat.yMd(), - GridNumericColumn(mappingName: 'freight', headerText: 'Freight') - ..columnWidthMode = _isLandscapeInMobileView - ? ColumnWidthMode.fill - : ColumnWidthMode.none - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$'), GridDateTimeColumn( - mappingName: 'shippingDate', headerText: 'Shipped Date') - ..dateFormat = DateFormat.yMd(), + mappingName: 'orderDate', + headerText: 'Order Date', + dateFormat: DateFormat.yMd()), + GridNumericColumn( + mappingName: 'freight', + headerText: 'Freight', + columnWidthMode: _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.none, + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center, + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$')), + GridDateTimeColumn( + mappingName: 'shippingDate', + headerText: 'Shipped Date', + dateFormat: DateFormat.yMd()), GridTextColumn( mappingName: 'shipCountry', headerText: 'Ship Country'), ]); @@ -83,13 +90,9 @@ class _PagingDataGridState extends SampleViewState { Widget _getDataPager() { return SfDataPagerTheme( data: SfDataPagerThemeData( - brightness: model.themeData.brightness, - selectedItemColor: model.backgroundColor, - selectedItemTextStyle: TextStyle( - color: model.textColor, - fontSize: 14, - fontFamily: 'Roboto', - fontWeight: FontWeight.w400)), + brightness: model.themeData.brightness, + selectedItemColor: model.backgroundColor, + ), child: SfDataPager( delegate: _orderInfoDataSource, rowsPerPage: 20, diff --git a/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart b/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart index 437e7d98..ef152875 100644 --- a/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart +++ b/lib/samples/datagrid/real_time_update/datagrid_real_time_update.dart @@ -182,26 +182,31 @@ class _RealTimeUpdateDataGridPageState extends SampleViewState { ? ColumnWidthMode.fill : ColumnWidthMode.header, columns: [ - GridTextColumn(mappingName: 'symbol') - ..headerText = 'Symbol' - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, - GridWidgetColumn(mappingName: 'stock') - ..headerText = 'Stock' - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, - GridNumericColumn(mappingName: 'open') - ..headerText = ' Open' - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, - GridNumericColumn(mappingName: 'previousClose') - ..headerText = 'Previous Close' - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, - GridNumericColumn(mappingName: 'lastTrade') - ..headerText = 'Last Trade' - ..headerTextAlignment = Alignment.center - ..textAlignment = Alignment.center, + GridTextColumn( + mappingName: 'symbol', + headerText: 'Symbol', + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), + GridWidgetColumn( + mappingName: 'stock', + headerText: 'Stock', + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), + GridNumericColumn( + mappingName: 'open', + headerText: ' Open', + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), + GridNumericColumn( + mappingName: 'previousClose', + headerText: 'Previous Close', + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), + GridNumericColumn( + mappingName: 'lastTrade', + headerText: 'Last Trade', + headerTextAlignment: Alignment.center, + textAlignment: Alignment.center), ], ); } diff --git a/lib/samples/datagrid/selection/datagrid_selection.dart b/lib/samples/datagrid/selection/datagrid_selection.dart index 2236ef46..a0c09886 100644 --- a/lib/samples/datagrid/selection/datagrid_selection.dart +++ b/lib/samples/datagrid/selection/datagrid_selection.dart @@ -10,7 +10,6 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; /// Local import import '../../../model/sample_view.dart'; -import '../../../widgets/custom_dropdown.dart'; /// Renders datagrid with selection option(single/multiple and select/unselect) class SelectionDataGrid extends SampleView { @@ -90,50 +89,60 @@ class _SelectionDataGridPageState extends SampleViewState { columns = model.isWeb ? [ - GridNumericColumn(mappingName: 'id') - ..headerText = 'Order ID' - ..padding = const EdgeInsets.all(8) - ..headerTextAlignment = Alignment.centerRight - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto, - GridNumericColumn(mappingName: 'customerId') - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.header - ..headerText = 'Customer ID' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'name') - ..headerText = 'Name' - ..headerTextAlignment = Alignment.centerLeft, - GridNumericColumn(mappingName: 'freight') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Freight' - ..headerTextAlignment = Alignment.centerRight, - GridTextColumn(mappingName: 'city') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'City' - ..columnWidthMode = - model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto, - GridNumericColumn(mappingName: 'price') - ..numberFormat = - NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Price' + GridNumericColumn( + mappingName: 'id', + headerText: 'Order ID', + padding: const EdgeInsets.all(8), + headerTextAlignment: Alignment.centerRight, + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto), + GridNumericColumn( + mappingName: 'customerId', + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.header, + headerText: 'Customer ID', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + headerTextAlignment: Alignment.centerLeft), + GridNumericColumn( + mappingName: 'freight', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight', + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'city', + headerTextAlignment: Alignment.centerLeft, + headerText: 'City', + columnWidthMode: + model.isWeb ? ColumnWidthMode.none : ColumnWidthMode.auto), + GridNumericColumn( + mappingName: 'price', + numberFormat: + NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Price') ] : [ - GridNumericColumn(mappingName: 'id') - ..headerText = 'Order ID' - ..padding = const EdgeInsets.all(8) - ..headerTextAlignment = Alignment.centerRight, - GridNumericColumn(mappingName: 'customerId') - ..headerTextAlignment = Alignment.centerRight - ..headerText = 'Customer ID', - GridTextColumn(mappingName: 'name') - ..headerTextAlignment = Alignment.centerLeft - ..headerText = 'Name', - GridTextColumn(mappingName: 'city') - ..headerText = 'City' - ..headerTextAlignment = Alignment.centerLeft - ..columnWidthMode = ColumnWidthMode.lastColumnFill, + GridNumericColumn( + mappingName: 'id', + headerText: 'Order ID', + padding: const EdgeInsets.all(8), + headerTextAlignment: Alignment.centerRight), + GridNumericColumn( + mappingName: 'customerId', + headerTextAlignment: Alignment.centerRight, + headerText: 'Customer ID'), + GridTextColumn( + mappingName: 'name', + headerTextAlignment: Alignment.centerLeft, + headerText: 'Name'), + GridTextColumn( + mappingName: 'city', + headerText: 'City', + headerTextAlignment: Alignment.centerLeft, + columnWidthMode: ColumnWidthMode.lastColumnFill), ]; return columns; } @@ -217,94 +226,91 @@ class _SelectionDataGridPageState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView(children: [ - Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), - child: Container( - child: Row( - children: [ - Expanded( - child: Text( - 'Selection mode:', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor), + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView(shrinkWrap: true, children: [ + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), + child: Container( + child: Row( + children: [ + Expanded( + child: Text( + 'Selection mode:', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor), + ), ), - ), - Expanded( - child: Container( + Expanded( + child: Container( padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), height: 40, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectionMode, - item: _encoding.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Multiple', - child: Text('$value', - textAlign: TextAlign.center, - style: - TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onSelectionModeChanged(value); - }), - ), - )), - ) - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectionMode, + items: _encoding.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Multiple', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onSelectionModeChanged(value); + stateSetter(() {}); + }), + ), + ) + ], + ), ), ), - ), - Padding( - padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), - child: Container( - child: Row( - children: [ - Expanded( - child: Text( - 'Navigation mode:', - style: TextStyle( - fontSize: 16.0, - fontWeight: FontWeight.bold, - color: model.textColor), + Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 0, 0), + child: Container( + child: Row( + children: [ + Expanded( + child: Text( + 'Navigation mode:', + style: TextStyle( + fontSize: 16.0, + fontWeight: FontWeight.bold, + color: model.textColor), + ), ), - ), - Expanded( - child: Container( + Expanded( + child: Container( padding: const EdgeInsets.fromLTRB(15, 0, 0, 0), height: 40, - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _navigationMode, - item: _navigation.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Cell', - child: Text('$value', - textAlign: TextAlign.center, - style: - TextStyle(color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - _onNavigationModeChanged(value); - }), - ), - )), - ) - ], + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: + Container(color: Color(0xFFBDBDBD), height: 1), + value: _navigationMode, + items: _navigation.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Cell', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + _onNavigationModeChanged(value); + stateSetter(() {}); + }), + ), + ) + ], + ), ), ), - ), - ]); + ]); + }); } @override diff --git a/lib/samples/datagrid/sorting/datagrid_sorting.dart b/lib/samples/datagrid/sorting/datagrid_sorting.dart index d9e00ab7..b34e7f3f 100644 --- a/lib/samples/datagrid/sorting/datagrid_sorting.dart +++ b/lib/samples/datagrid/sorting/datagrid_sorting.dart @@ -1,7 +1,7 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:flutter_examples/model/sample_view.dart'; -import 'package:flutter_examples/widgets/switch.dart'; import 'package:flutter/foundation.dart'; import 'package:intl/intl.dart'; import 'dart:math'; @@ -47,6 +47,7 @@ class _SortingDataGridState extends SampleViewState { source: _sortingDataGridSource, columns: getColumns(), gridLinesVisibility: GridLinesVisibility.both, + headerGridLinesVisibility: GridLinesVisibility.both, columnWidthMode: kIsWeb || _isLandscapeInMobileView ? ColumnWidthMode.fill : ColumnWidthMode.header, @@ -59,92 +60,119 @@ class _SortingDataGridState extends SampleViewState { @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - ListTile( - title: - Text('Allow sorting', style: TextStyle(color: model.textColor)), - trailing: CustomSwitch( - switchValue: _allowSorting, - valueChanged: (value) { - setState(() { - _allowSorting = value; - }); - }), - ), - ListTile( - title: Text('Allow multiple column sorting', - style: TextStyle(color: model.textColor)), - trailing: CustomSwitch( - switchValue: _allowMultiSorting, - valueChanged: (value) { - setState(() { - _allowMultiSorting = value; - }); - }), - ), - ListTile( - title: Text('Allow tri-state sorting', - style: TextStyle(color: model.textColor)), - trailing: CustomSwitch( - switchValue: _allowTriStateSorting, - valueChanged: (value) { - setState(() { - _allowTriStateSorting = value; - }); - }), - ), - ListTile( - trailing: CustomSwitch( - switchValue: _allowColumnSorting, - valueChanged: (value) { - setState(() { - _allowColumnSorting = value; - }); - }), - title: Text('Allow sorting for the Name column', - style: TextStyle(color: model.textColor)), - ), - ListTile( - title: Text('Display sort sequence numbers', - style: TextStyle(color: model.textColor)), - trailing: CustomSwitch( - switchValue: _showSortNumbers, - valueChanged: (value) { - setState(() { - _showSortNumbers = value; - }); - }), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: true, + children: [ + ListTile( + title: + Text('Allow sorting', style: TextStyle(color: model.textColor)), + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _allowSorting, + onChanged: (bool value) { + setState(() { + _allowSorting = value; + stateSetter(() {}); + }); + }, + )), + ), + ListTile( + title: Text('Allow multiple column sorting', + style: TextStyle(color: model.textColor)), + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _allowMultiSorting, + onChanged: (bool value) { + setState(() { + _allowMultiSorting = value; + stateSetter(() {}); + }); + }, + ))), + ListTile( + title: Text('Allow tri-state sorting', + style: TextStyle(color: model.textColor)), + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _allowTriStateSorting, + onChanged: (bool value) { + setState(() { + _allowTriStateSorting = value; + stateSetter(() {}); + }); + }, + ))), + ListTile( + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _allowColumnSorting, + onChanged: (bool value) { + setState(() { + _allowColumnSorting = value; + stateSetter(() {}); + }); + }, + )), + title: Text('Allow sorting for the Name column', + style: TextStyle(color: model.textColor)), + ), + ListTile( + title: Text('Display sort sequence numbers', + style: TextStyle(color: model.textColor)), + trailing: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _showSortNumbers, + onChanged: (bool value) { + setState(() { + _showSortNumbers = value; + stateSetter(() {}); + }); + }, + ))), + ], + ); + }); } List getColumns() { return [ - GridNumericColumn(mappingName: 'id') - ..columnWidthMode = - !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill - ..headerText = 'Order ID', - GridNumericColumn(mappingName: 'customerId') - ..columnWidthMode = - !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill - ..headerText = 'Customer ID', - GridTextColumn(mappingName: 'name') - ..headerText = 'Name' - ..allowSorting = _allowColumnSorting, - GridNumericColumn(mappingName: 'freight') - ..numberFormat = NumberFormat.currency(locale: 'en_US', symbol: '\$') - ..headerText = 'Freight', - GridTextColumn(mappingName: 'city') - ..columnWidthMode = - !kIsWeb ? ColumnWidthMode.auto : ColumnWidthMode.fill - ..headerText = 'City', - GridNumericColumn(mappingName: 'price') - ..numberFormat = NumberFormat.currency( - locale: 'en_US', symbol: '\$', decimalDigits: 0) - ..columnWidthMode = ColumnWidthMode.lastColumnFill - ..headerText = 'Price' + GridNumericColumn( + mappingName: 'id', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Order ID'), + GridNumericColumn( + mappingName: 'customerId', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.header : ColumnWidthMode.fill, + headerText: 'Customer ID'), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + allowSorting: _allowColumnSorting), + GridNumericColumn( + mappingName: 'freight', + numberFormat: NumberFormat.currency(locale: 'en_US', symbol: '\$'), + headerText: 'Freight'), + GridTextColumn( + mappingName: 'city', + columnWidthMode: + !kIsWeb ? ColumnWidthMode.auto : ColumnWidthMode.fill, + headerText: 'City'), + GridNumericColumn( + mappingName: 'price', + numberFormat: NumberFormat.currency( + locale: 'en_US', symbol: '\$', decimalDigits: 0), + columnWidthMode: ColumnWidthMode.lastColumnFill, + headerText: 'Price') ]; } } diff --git a/lib/samples/date_picker/blackout_dates/blackout_date_picker.dart b/lib/samples/date_picker/blackout_date_picker.dart similarity index 88% rename from lib/samples/date_picker/blackout_dates/blackout_date_picker.dart rename to lib/samples/date_picker/blackout_date_picker.dart index 80cc1d97..afc1a2aa 100644 --- a/lib/samples/date_picker/blackout_dates/blackout_date_picker.dart +++ b/lib/samples/date_picker/blackout_date_picker.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Renders datepicker for blackout class BlackoutDatePicker extends SampleView { @@ -56,17 +56,17 @@ class _BlackoutDatePickerState extends SampleViewState { @override Widget build([BuildContext context]) { - final Widget _cardView = Card( + final Widget cardView = Card( elevation: 10, margin: model.isWeb ? const EdgeInsets.fromLTRB(30, 60, 30, 10) : const EdgeInsets.all(30), child: Container( padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), - color: model.isWeb ? model.cardThemeColor : model.cardThemeColor, + color: model.cardThemeColor, child: Theme( data: model.themeData.copyWith(accentColor: model.backgroundColor), - child: _getBlackoutDatePicker(_blackoutDates)), + child: _getBlackoutDatePicker()), ), ); return Scaffold( @@ -80,11 +80,11 @@ class _BlackoutDatePickerState extends SampleViewState { child: model.isWeb ? Center( child: - Container(width: 400, height: 600, child: _cardView)) + Container(width: 400, height: 600, child: cardView)) : ListView(children: [ Container( height: 450, - child: _cardView, + child: cardView, ) ])), Expanded( @@ -99,13 +99,14 @@ class _BlackoutDatePickerState extends SampleViewState { } /// Returns the date range picker widget based on the properties passed. - SfDateRangePicker _getBlackoutDatePicker([List dates]) { + SfDateRangePicker _getBlackoutDatePicker() { return SfDateRangePicker( monthCellStyle: DateRangePickerMonthCellStyle( blackoutDateTextStyle: const TextStyle( color: Colors.red, decoration: TextDecoration.lineThrough)), monthViewSettings: DateRangePickerMonthViewSettings( - showTrailingAndLeadingDates: true, blackoutDates: dates), + showTrailingAndLeadingDates: true, blackoutDates: _blackoutDates), + showNavigationArrow: model.isWeb, ); } } diff --git a/lib/samples/date_picker/customization_picker/customized_date_picker.dart b/lib/samples/date_picker/customized_date_picker.dart similarity index 85% rename from lib/samples/date_picker/customization_picker/customized_date_picker.dart rename to lib/samples/date_picker/customized_date_picker.dart index d21eb233..0a20ba29 100644 --- a/lib/samples/date_picker/customization_picker/customized_date_picker.dart +++ b/lib/samples/date_picker/customized_date_picker.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_datepicker/datepicker.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Render datepicker widget with customized options class CustomizedDatePicker extends SampleView { @@ -65,7 +65,7 @@ class _CustomizedDatePickerState extends SampleViewState { : const EdgeInsets.all(30), child: Container( padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), - color: model.isWeb ? model.cardThemeColor : model.cardThemeColor, + color: model.cardThemeColor, child: _getCustomizedDatePicker(_specialDates, model.themeData)), ); return Scaffold( @@ -125,31 +125,30 @@ class _CustomizedDatePickerState extends SampleViewState { color: cellTextColor, )), monthCellStyle: DateRangePickerMonthCellStyle( - cellDecoration: _MonthCellDecoration( - borderColor: null, - backgroundColor: monthCellBackground, - showIndicator: false, - indicatorColor: indicatorColor), - todayCellDecoration: _MonthCellDecoration( - borderColor: highlightColor, - backgroundColor: monthCellBackground, - showIndicator: false, - indicatorColor: indicatorColor), - specialDatesDecoration: _MonthCellDecoration( - borderColor: null, - backgroundColor: monthCellBackground, - showIndicator: true, - indicatorColor: indicatorColor), - disabledDatesTextStyle: TextStyle( - color: isDark ? const Color(0xFF666479) : const Color(0xffe2d7fe), - ), - weekendTextStyle: TextStyle( - color: highlightColor, - ), - textStyle: TextStyle(color: cellTextColor, fontSize: 14), - specialDatesTextStyle: TextStyle(color: cellTextColor, fontSize: 14), - todayTextStyle: TextStyle(color: highlightColor, fontSize: 14), - ), + cellDecoration: _MonthCellDecoration( + borderColor: null, + backgroundColor: monthCellBackground, + showIndicator: false, + indicatorColor: indicatorColor), + todayCellDecoration: _MonthCellDecoration( + borderColor: highlightColor, + backgroundColor: monthCellBackground, + showIndicator: false, + indicatorColor: indicatorColor), + specialDatesDecoration: _MonthCellDecoration( + borderColor: null, + backgroundColor: monthCellBackground, + showIndicator: true, + indicatorColor: indicatorColor), + disabledDatesTextStyle: TextStyle( + color: isDark ? const Color(0xFF666479) : const Color(0xffe2d7fe), + ), + weekendTextStyle: TextStyle( + color: highlightColor, + ), + textStyle: TextStyle(color: cellTextColor, fontSize: 14), + specialDatesTextStyle: TextStyle(color: cellTextColor, fontSize: 14), + todayTextStyle: TextStyle(color: highlightColor, fontSize: 14)), yearCellStyle: DateRangePickerYearCellStyle( todayTextStyle: TextStyle(color: highlightColor, fontSize: 14), textStyle: TextStyle(color: cellTextColor, fontSize: 14), diff --git a/lib/samples/date_picker/date_picker_getting_started.dart b/lib/samples/date_picker/date_picker_getting_started.dart new file mode 100644 index 00000000..91c1703f --- /dev/null +++ b/lib/samples/date_picker/date_picker_getting_started.dart @@ -0,0 +1,584 @@ +///Package import +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +///Date picker imports +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; + +///Local import +import '../../model/model.dart'; +import '../../model/sample_view.dart'; +import 'popup_picker.dart'; + +/// Render getting started datepicker widget +class GettingStartedDatePicker extends SampleView { + /// Creates datepicker widget with customized options + const GettingStartedDatePicker(Key key) : super(key: key); + + @override + _GettingStartedDatePickerState createState() => + _GettingStartedDatePickerState(); +} + +class _GettingStartedDatePickerState extends SampleViewState { + _GettingStartedDatePickerState(); + + DateRangePickerController _controller; + DateRangePickerSelectionMode _selectionMode; + bool _showTrailingAndLeadingDates; + bool _enablePastDates; + bool _enableSwipingSelection; + bool _enableViewNavigation; + bool _isWeb; + Orientation _deviceOrientation; + + String _selectionModeString; + final List _selectionModeList = [ + 'Single', + 'Multiple', + 'Range', + 'Multi Range', + ].toList(); + + String _viewModeString; + final List _viewModeList = [ + 'Month', + 'Year', + 'Decade', + 'Century', + ].toList(); + + @override + void initState() { + _controller = DateRangePickerController(); + _selectionMode = DateRangePickerSelectionMode.range; + _showTrailingAndLeadingDates = true; + _enablePastDates = true; + _enableSwipingSelection = true; + _enableViewNavigation = true; + _selectionModeString = 'Range'; + _viewModeString = 'Month'; + _controller.view = DateRangePickerView.month; + _controller.displayDate = DateTime.now(); + _controller.selectedDate = DateTime.now(); + _controller.selectedDates = [ + DateTime.now(), + DateTime.now().add(const Duration(days: 2)), + DateTime.now().subtract(const Duration(days: 2)) + ]; + _controller.selectedRange = PickerDateRange( + DateTime.now().subtract(const Duration(days: 2)), + DateTime.now().add(const Duration(days: 2))); + _controller.selectedRanges = [ + PickerDateRange(DateTime.now().subtract(const Duration(days: 2)), + DateTime.now().add(const Duration(days: 2))), + PickerDateRange(DateTime.now().add(const Duration(days: 8)), + DateTime.now().add(const Duration(days: 12))), + PickerDateRange(DateTime.now().add(const Duration(days: 15)), + DateTime.now().add(const Duration(days: 20))), + PickerDateRange(DateTime.now().add(const Duration(days: 22)), + DateTime.now().add(const Duration(days: 27))) + ]; + _isWeb = false; + super.initState(); + } + + @override + void didChangeDependencies() { + //// Extra small devices (phones, 600px and down) +//// @media only screen and (max-width: 600px) {...} +//// +//// Small devices (portrait tablets and large phones, 600px and up) +//// @media only screen and (min-width: 600px) {...} +//// +//// Medium devices (landscape tablets, 768px and up) +//// media only screen and (min-width: 768px) {...} +//// +//// Large devices (laptops/desktops, 992px and up) +//// media only screen and (min-width: 992px) {...} +//// +//// Extra large devices (large laptops and desktops, 1200px and up) +//// media only screen and (min-width: 1200px) {...} +//// Default width to render the mobile UI in web, if the device width exceeds +//// the given width agenda view will render the web UI. + _isWeb = MediaQuery.of(context).size.width > 767; + _deviceOrientation = MediaQuery.of(context).orientation; + + super.didChangeDependencies(); + } + + @override + Widget build([BuildContext context]) { + final bool _enableMultiView = _isWeb && + (_selectionMode == DateRangePickerSelectionMode.range || + _selectionMode == DateRangePickerSelectionMode.multiRange); + final Widget cardView = Card( + elevation: 10, + margin: model.isWeb + ? const EdgeInsets.fromLTRB(30, 60, 30, 10) + : const EdgeInsets.all(30), + child: Container( + padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), + color: model.cardThemeColor, + child: Theme( + data: + model.themeData.copyWith(accentColor: model.backgroundColor), + child: _getGettingStartedDatePicker( + _controller, + _selectionMode, + _showTrailingAndLeadingDates, + _enablePastDates, + _enableSwipingSelection, + _enableViewNavigation, + DateTime.now().subtract(const Duration(days: 200)), + DateTime.now().add(const Duration(days: 200)), + _enableMultiView)), + )); + return Scaffold( + backgroundColor: model.themeData == null || + model.themeData.brightness == Brightness.light + ? null + : const Color(0x171A21), + body: Column(children: [ + Expanded( + flex: model.isWeb ? 9 : 8, + child: model.isWeb + ? Center( + child: Container( + width: !_enableMultiView ? 400 : 700, + height: 600, + child: cardView)) + : ListView(children: [ + Container( + height: 450, + child: cardView, + ) + ])), + Expanded( + flex: model.isWeb + ? 1 + : model.isMobileResolution && + _deviceOrientation == Orientation.landscape + ? 0 + : 1, + child: Container()) + ]), + ); + } + + /// To change the date range picker view to the selected view, the view which + /// selected in the dropdown menu set to the view property of the controller. + void onPickerViewChange(String value) { + _viewModeString = value; + if (value == 'Month') { + _controller.view = DateRangePickerView.month; + } else if (value == 'Year') { + _controller.view = DateRangePickerView.year; + } else if (value == 'Decade') { + _controller.view = DateRangePickerView.decade; + } else if (value == 'Century') { + _controller.view = DateRangePickerView.century; + } + setState(() { + /// update the date range picker view changes + }); + } + + /// To change the date range picker selection mode to the selected mode, the + /// mode which selected in the dropdown menu set to the selection mode property, + /// which is set to the selection mode property of date range picker. + void onSelectionModeChange(String value) { + _selectionModeString = value; + if (value == 'Single') { + _selectionMode = DateRangePickerSelectionMode.single; + } else if (value == 'Multiple') { + _selectionMode = DateRangePickerSelectionMode.multiple; + } else if (value == 'Range') { + _selectionMode = DateRangePickerSelectionMode.range; + } else if (value == 'Multi Range') { + _selectionMode = DateRangePickerSelectionMode.multiRange; + } + setState(() { + /// update the date range picker selection mode changes + }); + } + + /// Handled to update the boolean values from the property window, whenever the + /// boolean value changed it's value set the corresponding property of date range + /// picker. + void onBoolValueChange(String property, bool value) { + if (property == 'ShowLeadingTrailingDates') { + _showTrailingAndLeadingDates = value; + } else if (property == 'EnablePastDates') { + _enablePastDates = value; + } else if (property == 'EnableSwipingSelection') { + _enableSwipingSelection = value; + } else if (property == 'EnableViewNavigation') { + _enableViewNavigation = value; + } + setState(() { + /// update the bool value changes + }); + } + + @override + Widget buildSettings([BuildContext context]) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + List propertyOptions = []; + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Picker view', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _viewModeString, + items: _viewModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Month', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onPickerViewChange(value); + stateSetter(() {}); + }), + ), + ) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Selection mode', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectionModeString, + items: _selectionModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Range', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onSelectionModeChange(value); + stateSetter(() {}); + }), + ), + ) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Display date', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + alignment: Alignment.centerLeft, + child: Theme( + data: model.themeData.copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: _DateRangePickerOption( + _onDisplayDateChanged, _controller.displayDate, model, + displayDate: _controller.displayDate)), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable view navigation', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enableViewNavigation, + onChanged: (bool value) { + setState(() { + onBoolValueChange( + 'EnableViewNavigation', value); + stateSetter(() {}); + }); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Show trailing/leading dates', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _showTrailingAndLeadingDates, + onChanged: (dynamic value) { + onBoolValueChange( + 'ShowLeadingTrailingDates', value); + stateSetter(() {}); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable past dates', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enablePastDates, + onChanged: (dynamic value) { + onBoolValueChange('EnablePastDates', value); + stateSetter(() {}); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable swipe selection', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enableSwipingSelection, + onChanged: (dynamic value) { + setState(() { + onBoolValueChange( + 'EnableSwipingSelection', value); + stateSetter(() {}); + }); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + return Padding( + padding: const EdgeInsets.fromLTRB(15, 10, 0, 5), + child: model.isWeb + ? Column( + children: propertyOptions, + ) + : ListView( + children: propertyOptions, + ), + ); + }); + } + + /// Updates the display for date range picker by setting the selected date value + /// to the display date property of controller. + void _onDisplayDateChanged(DateRangePickerSelectionChangedArgs details) { + setState(() { + _controller.displayDate = details.value; + }); + } +} + +/// Builds the date range picker in a pop-up window, to select the display date +/// property for the date range picker, in the property window. +class _DateRangePickerOption extends StatefulWidget { + const _DateRangePickerOption(this.selectionChanged, this.date, this.model, + {this.displayDate}); + + final DateRangePickerSelectionChangedCallback selectionChanged; + final DateTime date; + final DateTime displayDate; + final SampleModel model; + + @override + State createState() { + return _DateRangePickerOptionState(); + } +} + +class _DateRangePickerOptionState extends State<_DateRangePickerOption> { + DateTime _date; + + @override + void initState() { + _date = widget.date; + super.initState(); + } + + /// Updates the selected date value to the date range pickers selected + /// property + void _onSelectionChanged(DateTime value) { + setState(() { + _date = value; + }); + + if (widget.selectionChanged != null) { + widget.selectionChanged(DateRangePickerSelectionChangedArgs(value)); + } + } + + @override + Widget build(BuildContext context) { + final ThemeData theme = Theme.of(context); + return Container( + color: Colors.transparent, + child: GestureDetector( + child: Text(DateFormat('dd-MM-yyyy').format(_date), + style: TextStyle( + fontSize: 15, + color: theme.textTheme.subtitle2.color, + fontWeight: FontWeight.w600)), + onTap: () async { + final DateTime result = await showDialog( + context: context, + builder: (BuildContext context) { + return Theme( + data: theme, + child: DateRangePicker( + _date, + null, + minDate: DateTime.now() + .subtract(const Duration(days: 200)), + maxDate: + DateTime.now().add(const Duration(days: 200)), + displayDate: _date, + model: widget.model, + )); + }); + + if (result != null) { + _onSelectionChanged(result); + } + })); + } +} + +/// Returns the date range picker based on the properties passed +SfDateRangePicker _getGettingStartedDatePicker( + [DateRangePickerController controller, + DateRangePickerSelectionMode mode, + bool showLeading, + bool enablePastDates, + bool enableSwipingSelection, + bool enableViewNavigation, + DateTime minDate, + DateTime maxDate, + bool enableMultiView]) { + return SfDateRangePicker( + enablePastDates: enablePastDates, + minDate: minDate, + maxDate: maxDate, + enableMultiView: enableMultiView, + allowViewNavigation: enableViewNavigation, + selectionMode: mode, + controller: controller, + monthViewSettings: DateRangePickerMonthViewSettings( + enableSwipeSelection: enableSwipingSelection, + showTrailingAndLeadingDates: showLeading ?? false), + ); +} diff --git a/lib/samples/date_picker/getting_started/datePicker_getting_started.dart b/lib/samples/date_picker/getting_started/datePicker_getting_started.dart deleted file mode 100644 index bd57c02f..00000000 --- a/lib/samples/date_picker/getting_started/datePicker_getting_started.dart +++ /dev/null @@ -1,587 +0,0 @@ -///Package import -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; - -///Date picker imports -import 'package:syncfusion_flutter_datepicker/datepicker.dart'; - -///Local import -import '../../../model/model.dart'; -import '../../../model/sample_view.dart'; -import '../../../widgets/custom_dropdown.dart'; -import '../../../widgets/switch.dart'; -import '../popup_picker/popup_picker.dart'; - -/// Render getting started datepicker widget -class GettingStartedDatePicker extends SampleView { - /// Creates datepicker widget with customized options - const GettingStartedDatePicker(Key key) : super(key: key); - - @override - _GettingStartedDatePickerState createState() => - _GettingStartedDatePickerState(); -} - -class _GettingStartedDatePickerState extends SampleViewState { - _GettingStartedDatePickerState(); - - DateRangePickerController _controller; - DateRangePickerSelectionMode _selectionMode; - DateRangePickerView _view; - bool _showTrailingAndLeadingDates; - bool _enablePastDates; - bool _enableSwipingSelection; - bool _enableViewNavigation; - bool _isWeb; - Orientation _deviceOrientation; - - String _selectionModeString; - final List _selectionModeList = [ - 'Single', - 'Multiple', - 'Range', - 'Multi Range', - ].toList(); - - String _viewModeString; - final List _viewModeList = [ - 'Month', - 'Year', - 'Decade', - 'Century', - ].toList(); - - @override - void initState() { - _controller = DateRangePickerController(); - _selectionMode = DateRangePickerSelectionMode.range; - _view = DateRangePickerView.month; - _showTrailingAndLeadingDates = true; - _enablePastDates = true; - _enableSwipingSelection = true; - _enableViewNavigation = true; - _selectionModeString = 'Range'; - _viewModeString = 'Month'; - _controller.view = _view; - _controller.displayDate = DateTime.now(); - _controller.selectedDate = DateTime.now(); - _controller.selectedDates = [ - DateTime.now(), - DateTime.now().add(const Duration(days: 2)), - DateTime.now().subtract(const Duration(days: 2)) - ]; - _controller.selectedRange = PickerDateRange( - DateTime.now().subtract(const Duration(days: 2)), - DateTime.now().add(const Duration(days: 2))); - _controller.selectedRanges = [ - PickerDateRange(DateTime.now().subtract(const Duration(days: 2)), - DateTime.now().add(const Duration(days: 2))), - PickerDateRange(DateTime.now().add(const Duration(days: 8)), - DateTime.now().add(const Duration(days: 12))), - PickerDateRange(DateTime.now().add(const Duration(days: 15)), - DateTime.now().add(const Duration(days: 20))), - PickerDateRange(DateTime.now().add(const Duration(days: 22)), - DateTime.now().add(const Duration(days: 27))) - ]; - _isWeb = false; - super.initState(); - } - - @override - void didChangeDependencies() { - //// Extra small devices (phones, 600px and down) -//// @media only screen and (max-width: 600px) {...} -//// -//// Small devices (portrait tablets and large phones, 600px and up) -//// @media only screen and (min-width: 600px) {...} -//// -//// Medium devices (landscape tablets, 768px and up) -//// media only screen and (min-width: 768px) {...} -//// -//// Large devices (laptops/desktops, 992px and up) -//// media only screen and (min-width: 992px) {...} -//// -//// Extra large devices (large laptops and desktops, 1200px and up) -//// media only screen and (min-width: 1200px) {...} -//// Default width to render the mobile UI in web, if the device width exceeds -//// the given width agenda view will render the web UI. - _isWeb = MediaQuery.of(context).size.width > 767; - _deviceOrientation = MediaQuery.of(context).orientation; - - super.didChangeDependencies(); - } - - @override - Widget build([BuildContext context]) { - final bool _enableMultiView = _isWeb && - (_selectionMode == DateRangePickerSelectionMode.range || - _selectionMode == DateRangePickerSelectionMode.multiRange); - final Widget _cardView = Card( - elevation: 10, - margin: model.isWeb - ? const EdgeInsets.fromLTRB(30, 60, 30, 10) - : const EdgeInsets.all(30), - child: Container( - padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), - color: model.isWeb ? model.cardThemeColor : model.cardThemeColor, - child: Theme( - data: - model.themeData.copyWith(accentColor: model.backgroundColor), - child: _getGettingStartedDatePicker( - _controller, - _selectionMode, - _showTrailingAndLeadingDates, - _enablePastDates, - _enableSwipingSelection, - _enableViewNavigation, - DateTime.now().subtract(const Duration(days: 200)), - DateTime.now().add(const Duration(days: 200)), - _enableMultiView)), - )); - return Scaffold( - backgroundColor: model.themeData == null || - model.themeData.brightness == Brightness.light - ? null - : const Color(0x171A21), - body: Column(children: [ - Expanded( - flex: model.isWeb ? 9 : 8, - child: model.isWeb - ? Center( - child: Container( - width: !_enableMultiView ? 400 : 700, - height: 600, - child: _cardView)) - : ListView(children: [ - Container( - height: 450, - child: _cardView, - ) - ])), - Expanded( - flex: model.isWeb - ? 1 - : model.isMobileResolution && - _deviceOrientation == Orientation.landscape - ? 0 - : 1, - child: Container()) - ]), - ); - } - - /// To change the date range picker view to the selected view, the view which - /// selected in the dropdown menu set to the view property of the controller. - void onPickerViewChange(String value) { - _viewModeString = value; - if (value == 'Month') { - _controller.view = DateRangePickerView.month; - } else if (value == 'Year') { - _controller.view = DateRangePickerView.year; - } else if (value == 'Decade') { - _controller.view = DateRangePickerView.decade; - } else if (value == 'Century') { - _controller.view = DateRangePickerView.century; - } - setState(() { - /// update the date range picker view changes - }); - } - - /// To change the date range picker selection mode to the selected mode, the - /// mode which selected in the dropdown menu set to the selection mode property, - /// which is set to the selection mode property of date range picker. - void onSelectionModeChange(String value) { - _selectionModeString = value; - if (value == 'Single') { - _selectionMode = DateRangePickerSelectionMode.single; - } else if (value == 'Multiple') { - _selectionMode = DateRangePickerSelectionMode.multiple; - } else if (value == 'Range') { - _selectionMode = DateRangePickerSelectionMode.range; - } else if (value == 'Multi Range') { - _selectionMode = DateRangePickerSelectionMode.multiRange; - } - setState(() { - /// update the date range picker selection mode changes - }); - } - - /// Handled to update the boolean values from the property window, whenever the - /// boolean value changed it's value set the corresponding property of date range - /// picker. - void onBoolValueChange(String property, bool value) { - if (property == 'ShowLeadingTrailingDates') { - _showTrailingAndLeadingDates = value; - } else if (property == 'EnablePastDates') { - _enablePastDates = value; - } else if (property == 'EnableSwipingSelection') { - _enableSwipingSelection = value; - } else if (property == 'EnableViewNavigation') { - _enableViewNavigation = value; - } - setState(() { - /// update the bool value changes - }); - } - - @override - Widget buildSettings([BuildContext context]) { - final ThemeData _theme = model.themeData; - return ListView( - padding: const EdgeInsets.fromLTRB(15, 10, 0, 5), - children: [ - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Picker view', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _viewModeString, - item: _viewModeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Month', - child: Text('$value', - textAlign: TextAlign.center, - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - onPickerViewChange(value); - }), - ), - ))) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Selection mode', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Align( - alignment: Alignment.bottomLeft, - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: DropDown( - value: _selectionModeString, - item: _selectionModeList.map((String value) { - return DropdownMenuItem( - value: (value != null) ? value : 'Range', - child: Text('$value', - textAlign: TextAlign.center, - style: TextStyle( - color: model.textColor))); - }).toList(), - valueChanged: (dynamic value) { - onSelectionModeChange(value); - }), - ), - ))) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Display date', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: _theme.copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Align( - alignment: Alignment.centerLeft, - child: _DateRangePickerOption( - _onDisplayDateChanged, - _controller.displayDate, - model, - displayDate: _controller.displayDate)), - ))) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Enable view navigation', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _enableViewNavigation, - valueChanged: (dynamic value) { - setState(() { - onBoolValueChange( - 'EnableViewNavigation', value); - }); - }, - activeColor: model.backgroundColor, - ))), - ), - )) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Show trailing and leading dates', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _showTrailingAndLeadingDates, - valueChanged: (dynamic value) { - onBoolValueChange( - 'ShowLeadingTrailingDates', value); - }, - activeColor: model.backgroundColor, - ))), - ), - )) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Enable past dates', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _enablePastDates, - valueChanged: (dynamic value) { - onBoolValueChange('EnablePastDates', value); - }, - activeColor: model.backgroundColor, - ))), - ), - )) - ], - ), - ), - Container( - height: 50, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - flex: 6, - child: Text('Enable swipe selection', - style: - TextStyle(fontSize: 16.0, color: model.textColor))), - Expanded( - flex: 4, - child: Container( - padding: const EdgeInsets.fromLTRB(0, 0, 0, 0), - child: Theme( - data: Theme.of(context).copyWith( - canvasColor: model.bottomSheetBackgroundColor), - child: Container( - child: Align( - alignment: Alignment.centerLeft, - child: CustomSwitch( - switchValue: _enableSwipingSelection, - valueChanged: (dynamic value) { - setState(() { - onBoolValueChange( - 'EnableSwipingSelection', value); - }); - }, - activeColor: model.backgroundColor, - ))), - ), - )) - ], - ), - ), - ]); - } - - /// Updates the display for date range picker by setting the selected date value - /// to the display date property of controller. - void _onDisplayDateChanged(DateRangePickerSelectionChangedArgs details) { - setState(() { - _controller.displayDate = details.value; - }); - } -} - -/// Builds the date range picker in a pop-up window, to select the display date -/// property for the date range picker, in the property window. -class _DateRangePickerOption extends StatefulWidget { - const _DateRangePickerOption(this.selectionChanged, this.date, this.model, - {this.displayDate}); - - final DateRangePickerSelectionChangedCallback selectionChanged; - final DateTime date; - final DateTime displayDate; - final SampleModel model; - - @override - State createState() { - return _DateRangePickerOptionState(); - } -} - -class _DateRangePickerOptionState extends State<_DateRangePickerOption> { - DateTime date; - - @override - void initState() { - date = widget.date; - super.initState(); - } - - /// Updates the selected date value to the date range pickers selected - /// property - void _onSelectionChanged(DateTime value) { - setState(() { - date = value; - }); - - if (widget.selectionChanged != null) { - widget.selectionChanged(DateRangePickerSelectionChangedArgs(value)); - } - } - - @override - Widget build(BuildContext context) { - final ThemeData _theme = Theme.of(context); - return Container( - color: Colors.transparent, - child: GestureDetector( - child: Text(DateFormat('dd-MM-yyyy').format(date), - style: TextStyle( - fontSize: 15, - color: _theme.textTheme.subtitle2.color, - fontWeight: FontWeight.w600)), - onTap: () async { - final DateTime result = await showDialog( - context: context, - builder: (BuildContext context) { - return Theme( - data: _theme, - child: DateRangePicker( - date, - null, - minDate: DateTime.now() - .subtract(const Duration(days: 200)), - maxDate: - DateTime.now().add(const Duration(days: 200)), - displayDate: date, - model: widget.model, - )); - }); - - if (result != null) { - _onSelectionChanged(result); - } - })); - } -} - -/// Returns the date range picker based on the properties passed -SfDateRangePicker _getGettingStartedDatePicker( - [DateRangePickerController controller, - DateRangePickerSelectionMode mode, - bool showLeading, - bool enablePastDates, - bool _enableSwipingSelection, - bool _enableViewNavigation, - DateTime minDate, - DateTime maxDate, - bool enableMultiView]) { - return SfDateRangePicker( - enablePastDates: enablePastDates, - minDate: minDate, - maxDate: maxDate, - enableMultiView: enableMultiView, - allowViewNavigation: _enableViewNavigation, - selectionMode: mode, - controller: controller, - monthViewSettings: DateRangePickerMonthViewSettings( - enableSwipeSelection: _enableSwipingSelection, - showTrailingAndLeadingDates: showLeading ?? false), - ); -} diff --git a/lib/samples/date_picker/hijri_calendar.dart b/lib/samples/date_picker/hijri_calendar.dart new file mode 100644 index 00000000..9d7262c0 --- /dev/null +++ b/lib/samples/date_picker/hijri_calendar.dart @@ -0,0 +1,549 @@ +///Package import +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +///Date picker imports +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; + +/// core import +import 'package:syncfusion_flutter_core/core.dart'; + +///Local import +import '../../model/model.dart'; +import '../../model/sample_view.dart'; +import 'popup_picker.dart'; + +/// Render getting started datepicker widget +class HijriDatePicker extends SampleView { + /// Creates datepicker widget with customized options + const HijriDatePicker(Key key) : super(key: key); + + @override + _HijriDatePickerState createState() => _HijriDatePickerState(); +} + +class _HijriDatePickerState extends SampleViewState { + _HijriDatePickerState(); + + HijriDatePickerController _controller; + DateRangePickerSelectionMode _selectionMode; + bool _enablePastDates; + bool _enableSwipingSelection; + bool _enableViewNavigation; + bool _isWeb; + Orientation _deviceOrientation; + + String _selectionModeString; + final List _selectionModeList = [ + 'Single', + 'Multiple', + 'Range', + 'Multi Range', + ].toList(); + + String _viewModeString; + final List _viewModeList = [ + 'Month', + 'Year', + 'Decade', + ].toList(); + + @override + void initState() { + _controller = HijriDatePickerController(); + _selectionMode = DateRangePickerSelectionMode.range; + _enablePastDates = true; + _enableSwipingSelection = true; + _enableViewNavigation = true; + _selectionModeString = 'Range'; + _viewModeString = 'Month'; + _controller.view = HijriDatePickerView.month; + _controller.displayDate = HijriDateTime.now(); + _controller.selectedDate = HijriDateTime.now(); + _controller.selectedDates = [ + HijriDateTime.now(), + HijriDateTime.now().add(const Duration(days: 2)), + HijriDateTime.now().subtract(const Duration(days: 2)) + ]; + _controller.selectedRange = HijriDateRange( + HijriDateTime.now().subtract(const Duration(days: 2)), + HijriDateTime.now().add(const Duration(days: 2))); + _controller.selectedRanges = [ + HijriDateRange(HijriDateTime.now().subtract(const Duration(days: 2)), + HijriDateTime.now().add(const Duration(days: 2))), + HijriDateRange(HijriDateTime.now().add(const Duration(days: 8)), + HijriDateTime.now().add(const Duration(days: 12))), + HijriDateRange(HijriDateTime.now().add(const Duration(days: 15)), + HijriDateTime.now().add(const Duration(days: 20))), + HijriDateRange(HijriDateTime.now().add(const Duration(days: 22)), + HijriDateTime.now().add(const Duration(days: 27))) + ]; + _isWeb = false; + super.initState(); + } + + @override + void didChangeDependencies() { + //// Extra small devices (phones, 600px and down) +//// @media only screen and (max-width: 600px) {...} +//// +//// Small devices (portrait tablets and large phones, 600px and up) +//// @media only screen and (min-width: 600px) {...} +//// +//// Medium devices (landscape tablets, 768px and up) +//// media only screen and (min-width: 768px) {...} +//// +//// Large devices (laptops/desktops, 992px and up) +//// media only screen and (min-width: 992px) {...} +//// +//// Extra large devices (large laptops and desktops, 1200px and up) +//// media only screen and (min-width: 1200px) {...} +//// Default width to render the mobile UI in web, if the device width exceeds +//// the given width agenda view will render the web UI. + _isWeb = MediaQuery.of(context).size.width > 767; + _deviceOrientation = MediaQuery.of(context).orientation; + + super.didChangeDependencies(); + } + + @override + Widget build([BuildContext context]) { + final bool enableMultiView = _isWeb && + (_selectionMode == DateRangePickerSelectionMode.range || + _selectionMode == DateRangePickerSelectionMode.multiRange); + final Widget cardView = Card( + elevation: 10, + margin: model.isWeb + ? const EdgeInsets.fromLTRB(30, 60, 30, 10) + : const EdgeInsets.all(30), + child: Container( + padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), + color: model.cardThemeColor, + child: Theme( + data: + model.themeData.copyWith(accentColor: model.backgroundColor), + child: _getGettingStartedDatePicker( + _controller, + _selectionMode, + _enablePastDates, + _enableSwipingSelection, + _enableViewNavigation, + HijriDateTime.now().subtract(const Duration(days: 200)), + HijriDateTime.now().add(const Duration(days: 200)), + enableMultiView)), + )); + return Scaffold( + backgroundColor: model.themeData == null || + model.themeData.brightness == Brightness.light + ? null + : const Color(0x171A21), + body: Column(children: [ + Expanded( + flex: model.isWeb ? 9 : 8, + child: model.isWeb + ? Center( + child: Container( + width: !enableMultiView ? 400 : 700, + height: 600, + child: cardView)) + : ListView(padding: EdgeInsets.zero, children: [ + Container( + height: 450, + child: cardView, + ) + ])), + Expanded( + flex: model.isWeb + ? 1 + : model.isMobileResolution && + _deviceOrientation == Orientation.landscape + ? 0 + : 1, + child: Container()) + ]), + ); + } + + /// To change the date range picker view to the selected view, the view which + /// selected in the dropdown menu set to the view property of the controller. + void onPickerViewChange(String value) { + _viewModeString = value; + if (value == 'Month') { + _controller.view = HijriDatePickerView.month; + } else if (value == 'Year') { + _controller.view = HijriDatePickerView.year; + } else if (value == 'Decade') { + _controller.view = HijriDatePickerView.decade; + } + setState(() { + /// update the date range picker view changes + }); + } + + /// To change the date range picker selection mode to the selected mode, the + /// mode which selected in the dropdown menu set to the selection mode property, + /// which is set to the selection mode property of date range picker. + void onSelectionModeChange(String value) { + _selectionModeString = value; + if (value == 'Single') { + _selectionMode = DateRangePickerSelectionMode.single; + } else if (value == 'Multiple') { + _selectionMode = DateRangePickerSelectionMode.multiple; + } else if (value == 'Range') { + _selectionMode = DateRangePickerSelectionMode.range; + } else if (value == 'Multi Range') { + _selectionMode = DateRangePickerSelectionMode.multiRange; + } + setState(() { + /// update the date range picker selection mode changes + }); + } + + /// Handled to update the boolean values from the property window, whenever the + /// boolean value changed it's value set the corresponding property of date range + /// picker. + void onBoolValueChange(String property, bool value) { + if (property == 'EnablePastDates') { + _enablePastDates = value; + } else if (property == 'EnableSwipingSelection') { + _enableSwipingSelection = value; + } else if (property == 'EnableViewNavigation') { + _enableViewNavigation = value; + } + + setState(() { + /// update the bool value changes + }); + } + + @override + Widget buildSettings([BuildContext context]) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + List propertyOptions = []; + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Picker view', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _viewModeString, + items: _viewModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Month', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onPickerViewChange(value); + stateSetter(() {}); + }), + ), + ) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Selection mode', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectionModeString, + items: _selectionModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'Range', + child: Text('$value', + textAlign: TextAlign.center, + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (dynamic value) { + onSelectionModeChange(value); + stateSetter(() {}); + }), + ), + ) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Display date', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + alignment: Alignment.centerLeft, + child: Theme( + data: model.themeData.copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: _DateRangePickerOption( + _onDisplayDateChanged, + _controller.displayDate, + model, + displayDate: _controller.displayDate, + )), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable view navigation', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enableViewNavigation, + onChanged: (bool value) { + setState(() { + onBoolValueChange( + 'EnableViewNavigation', value); + stateSetter(() {}); + }); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable past dates', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enablePastDates, + onChanged: (dynamic value) { + onBoolValueChange('EnablePastDates', value); + stateSetter(() {}); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + propertyOptions.add(Container( + height: 50, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + flex: 6, + child: Text('Enable swipe selection', + style: TextStyle(fontSize: 16.0, color: model.textColor))), + Expanded( + flex: 4, + child: Container( + padding: const EdgeInsets.all(0), + child: Theme( + data: Theme.of(context).copyWith( + canvasColor: model.bottomSheetBackgroundColor), + child: Container( + alignment: Alignment.centerLeft, + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + value: _enableSwipingSelection, + onChanged: (dynamic value) { + setState(() { + onBoolValueChange( + 'EnableSwipingSelection', value); + stateSetter(() {}); + }); + }, + activeColor: model.backgroundColor, + ))), + ), + )) + ], + ), + )); + + return Padding( + padding: const EdgeInsets.fromLTRB(15, 10, 0, 5), + child: model.isWeb + ? Column( + children: propertyOptions, + ) + : ListView( + children: propertyOptions, + )); + }); + } + + /// Updates the display for date range picker by setting the selected date value + /// to the display date property of controller. + void _onDisplayDateChanged(DateRangePickerSelectionChangedArgs details) { + setState(() { + _controller.displayDate = details.value; + }); + } +} + +/// Builds the date range picker in a pop-up window, to select the display date +/// property for the date range picker, in the property window. +class _DateRangePickerOption extends StatefulWidget { + const _DateRangePickerOption(this.selectionChanged, this.date, this.model, + {this.displayDate}); + + final DateRangePickerSelectionChangedCallback selectionChanged; + final HijriDateTime date; + final HijriDateTime displayDate; + final SampleModel model; + + @override + State createState() { + return _DateRangePickerOptionState(); + } +} + +class _DateRangePickerOptionState extends State<_DateRangePickerOption> { + HijriDateTime _date; + + @override + void initState() { + _date = widget.date; + super.initState(); + } + + /// Updates the selected date value to the date range pickers selected + /// property + void _onSelectionChanged(HijriDateTime value) { + setState(() { + _date = value; + }); + + if (widget.selectionChanged != null) { + widget.selectionChanged(DateRangePickerSelectionChangedArgs(value)); + } + } + + @override + Widget build(BuildContext context) { + final ThemeData _theme = Theme.of(context); + return Container( + color: Colors.transparent, + child: GestureDetector( + child: Text( + _date.day.toString() + + '-' + + _date.month.toString() + + '-' + + _date.year.toString(), + style: TextStyle( + fontSize: 15, + color: _theme.textTheme.subtitle2.color, + fontWeight: FontWeight.w600)), + onTap: () async { + final HijriDateTime result = await showDialog( + context: context, + builder: (BuildContext context) { + return Theme( + data: _theme, + child: DateRangePicker( + _date, + null, + minDate: HijriDateTime.now() + .subtract(const Duration(days: 200)), + maxDate: HijriDateTime.now() + .add(const Duration(days: 200)), + displayDate: _date, + model: widget.model, + )); + }); + + if (result != null) { + _onSelectionChanged(result); + } + })); + } +} + +/// Returns the date range picker based on the properties passed +SfHijriDateRangePicker _getGettingStartedDatePicker( + [HijriDatePickerController controller, + DateRangePickerSelectionMode mode, + bool enablePastDates, + bool _enableSwipingSelection, + bool _enableViewNavigation, + HijriDateTime minDate, + HijriDateTime maxDate, + bool enableMultiView]) { + return SfHijriDateRangePicker( + enablePastDates: enablePastDates, + minDate: minDate, + maxDate: maxDate, + enableMultiView: enableMultiView, + allowViewNavigation: _enableViewNavigation, + selectionMode: mode, + controller: controller, + monthViewSettings: HijriDatePickerMonthViewSettings( + enableSwipeSelection: _enableSwipingSelection), + ); +} diff --git a/lib/samples/date_picker/popup_picker/popup_picker.dart b/lib/samples/date_picker/popup_picker.dart similarity index 70% rename from lib/samples/date_picker/popup_picker/popup_picker.dart rename to lib/samples/date_picker/popup_picker.dart index c221c3b3..2268d5a6 100644 --- a/lib/samples/date_picker/popup_picker/popup_picker.dart +++ b/lib/samples/date_picker/popup_picker.dart @@ -5,9 +5,13 @@ import 'package:intl/intl.dart'; ///Date picker imports import 'package:syncfusion_flutter_datepicker/datepicker.dart' as _picker; +/// Core import +import 'package:syncfusion_flutter_core/core.dart'; +import 'package:syncfusion_flutter_core/localizations.dart'; + ///Local import -import '../../../model/model.dart'; -import '../../../model/sample_view.dart'; +import '../../model/model.dart'; +import '../../model/sample_view.dart'; /// Renders datepicker with popup menu class PopUpDatePicker extends SampleView { @@ -37,13 +41,15 @@ class _PopUpDatePickerState extends SampleViewState /// Update the selected date for the date range picker based on the date selected, /// when the trip mode set one way. void _onSelectedDateChanged(DateTime date) { - if (date != null && date != _startDate) { - setState(() { - final Duration difference = _endDate.difference(_startDate); - _startDate = DateTime(date.year, date.month, date.day); - _endDate = _startDate.add(difference); - }); + if (date == null || date == _startDate) { + return; } + + setState(() { + final Duration difference = _endDate.difference(_startDate); + _startDate = DateTime(date.year, date.month, date.day); + _endDate = _startDate.add(difference); + }); } /// Update the selected range based on the range selected in the pop up editor, @@ -70,14 +76,14 @@ class _PopUpDatePickerState extends SampleViewState ? const EdgeInsets.fromLTRB(30, 20, 30, 5) : const EdgeInsets.all(30), child: Container( - color: model.isWeb ? model.cardThemeColor : model.cardThemeColor, + color: model.cardThemeColor, child: ListView( padding: model.isWeb ? const EdgeInsets.fromLTRB(30, 10, 10, 5) : const EdgeInsets.fromLTRB(30, 20, 10, 10), children: [ Container( - padding: const EdgeInsets.fromLTRB(0, 5, 0, 5), + padding: const EdgeInsets.symmetric(vertical: 5), child: Text( 'Book a Flight', style: TextStyle( @@ -94,7 +100,7 @@ class _PopUpDatePickerState extends SampleViewState children: [ Expanded( flex: 5, - child: FlatButton( + child: RawMaterialButton( padding: const EdgeInsets.fromLTRB(5, 5, 10, 5), onPressed: () { @@ -115,9 +121,9 @@ class _PopUpDatePickerState extends SampleViewState SizedBox( width: 8, ), - new Text( + Text( 'One-way', - style: new TextStyle( + style: TextStyle( fontSize: 16.0, fontWeight: _value == 0 ? FontWeight.w600 @@ -128,7 +134,7 @@ class _PopUpDatePickerState extends SampleViewState ), Expanded( flex: 5, - child: FlatButton( + child: RawMaterialButton( onPressed: () { setState(() { _value = 1; @@ -149,9 +155,9 @@ class _PopUpDatePickerState extends SampleViewState SizedBox( width: 8, ), - new Text( + Text( 'Round-Trip', - style: new TextStyle( + style: TextStyle( fontSize: 16.0, fontWeight: _value == 1 ? FontWeight.w600 @@ -168,7 +174,7 @@ class _PopUpDatePickerState extends SampleViewState Expanded( flex: 5, child: Container( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ @@ -189,7 +195,7 @@ class _PopUpDatePickerState extends SampleViewState Expanded( flex: 5, child: Container( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ @@ -221,8 +227,8 @@ class _PopUpDatePickerState extends SampleViewState children: [ Expanded( flex: 5, - child: FlatButton( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + child: RawMaterialButton( + padding: EdgeInsets.all(5), onPressed: () async { if (_value == 0) { final DateTime date = @@ -284,8 +290,8 @@ class _PopUpDatePickerState extends SampleViewState )))), Expanded( flex: 5, - child: FlatButton( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + child: RawMaterialButton( + padding: EdgeInsets.all(5), onPressed: _value == 0 ? null : () async { @@ -319,6 +325,7 @@ class _PopUpDatePickerState extends SampleViewState Text('Return Date', style: const TextStyle( fontSize: 16, + color: Colors.grey, fontWeight: FontWeight.w500)) ] @@ -355,7 +362,7 @@ class _PopUpDatePickerState extends SampleViewState Expanded( flex: 5, child: Container( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ @@ -376,7 +383,7 @@ class _PopUpDatePickerState extends SampleViewState Expanded( flex: 5, child: Container( - padding: EdgeInsets.fromLTRB(5, 5, 5, 5), + padding: EdgeInsets.all(5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: const [ @@ -401,8 +408,10 @@ class _PopUpDatePickerState extends SampleViewState mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [ - FlatButton( - color: model.backgroundColor, + RawMaterialButton( + fillColor: model.backgroundColor, + splashColor: Colors.grey.withOpacity(0.12), + hoverColor: Colors.grey.withOpacity(0.04), onPressed: () { Scaffold.of(context).showSnackBar(const SnackBar( content: Text( @@ -428,14 +437,18 @@ class _PopUpDatePickerState extends SampleViewState @override Widget build([BuildContext context]) { return Scaffold( - backgroundColor: model.themeData == null || - model.themeData.brightness == Brightness.light - ? null - : const Color(0x171A21), - body: model.isWeb - ? Center( - child: Container(width: 400, height: 380, child: _getBooking())) - : Container(height: 450, child: _getBooking())); + backgroundColor: model.themeData == null || + model.themeData.brightness == Brightness.light + ? null + : const Color(0x171A21), + body: model.isWeb + ? Center( + child: Container(width: 400, height: 380, child: _getBooking())) + : Container( + height: 450, + child: _getBooking(), + ), + ); } } @@ -452,19 +465,19 @@ class DateRangePicker extends StatefulWidget { {this.minDate, this.maxDate, this.displayDate, this.model}); /// Holds date value - final DateTime date; + final dynamic date; /// Holds date range value - final _picker.PickerDateRange range; + final dynamic range; /// Holds minimum date value - final DateTime minDate; + final dynamic minDate; - /// Holds maximu date value - final DateTime maxDate; + /// Holds maximum date value + final dynamic maxDate; /// Holds showable date value - final DateTime displayDate; + final dynamic displayDate; /// Holds Samplemodel instance final SampleModel model; @@ -476,16 +489,22 @@ class DateRangePicker extends StatefulWidget { } class _DateRangePickerState extends State { - DateTime date; - _picker.DateRangePickerController _controller; - _picker.PickerDateRange range; - bool _isWeb; + dynamic _date; + dynamic _controller; + dynamic _range; + bool _isWeb, _isHijri; + SfLocalizations _localizations; @override void initState() { - date = widget.date; - range = widget.range; - _controller = _picker.DateRangePickerController(); + _isHijri = widget.date is HijriDateTime; + _date = widget.date; + _range = widget.range; + if (_isHijri) { + _controller = _picker.HijriDatePickerController(); + } else { + _controller = _picker.DateRangePickerController(); + } _isWeb = false; super.initState(); } @@ -509,6 +528,7 @@ class _DateRangePickerState extends State { //// Default width to render the mobile UI in web, if the device width exceeds //// the given width agenda view will render the web UI. _isWeb = MediaQuery.of(context).size.width > 767; + _localizations = SfLocalizations.of(context); super.didChangeDependencies(); } @@ -535,9 +555,9 @@ class _DateRangePickerState extends State { style: TextStyle(color: widget.model.backgroundColor), ), onPressed: () { - (range != null) - ? Navigator.pop(context, range) - : Navigator.pop(context, date); + (_range != null) + ? Navigator.pop(context, _range) + : Navigator.pop(context, _date); }, ), ], @@ -550,14 +570,21 @@ class _DateRangePickerState extends State { child: Container( height: 30, padding: const EdgeInsets.symmetric(horizontal: 4.0), - child: range == null || - range.startDate == null || - range.endDate == null || - range.startDate == range.endDate + child: _range == null || + _range.startDate == null || + _range.endDate == null || + _range.startDate == _range.endDate ? Text( - DateFormat('dd MMM, yyyy').format(range == null - ? date - : (range.startDate ?? range.endDate)), + _isHijri + ? getFormattedHijriString( + _range == null + ? _date + : (_range.startDate ?? _range.endDate), + _localizations, + 'MMM') + : DateFormat('dd MMM, yyyy').format(_range == null + ? _date + : (_range.startDate ?? _range.endDate)), textAlign: TextAlign.center, style: TextStyle( fontSize: 18, @@ -569,10 +596,17 @@ class _DateRangePickerState extends State { Expanded( flex: 5, child: Text( - DateFormat('dd MMM, yyyy').format( - range.startDate.isAfter(range.endDate) - ? range.endDate - : range.startDate), + _isHijri + ? getFormattedHijriString( + _range.startDate.isAfter(_range.endDate) + ? _range.endDate + : _range.startDate, + _localizations, + 'MMM') + : DateFormat('dd MMM, yyyy').format( + _range.startDate.isAfter(_range.endDate) + ? _range.endDate + : _range.startDate), maxLines: 1, overflow: TextOverflow.ellipsis, textAlign: TextAlign.center, @@ -589,10 +623,17 @@ class _DateRangePickerState extends State { Expanded( flex: 5, child: Text( - DateFormat('dd MMM, yyyy').format( - range.startDate.isAfter(range.endDate) - ? range.startDate - : range.endDate), + _isHijri + ? getFormattedHijriString( + _range.startDate.isAfter(_range.endDate) + ? _range.startDate + : _range.endDate, + _localizations, + 'MMM') + : DateFormat('dd MMM, yyyy').format( + _range.startDate.isAfter(_range.endDate) + ? _range.startDate + : _range.endDate), maxLines: 1, overflow: TextOverflow.ellipsis, textAlign: TextAlign.center, @@ -605,41 +646,71 @@ class _DateRangePickerState extends State { ], ))); - _controller.selectedDate = date; - _controller.selectedRange = range; - final Widget pickerWidget = _picker.SfDateRangePicker( - controller: _controller, - initialDisplayDate: widget.displayDate, - showNavigationArrow: true, - enableMultiView: range != null && _isWeb, - selectionMode: range == null - ? _picker.DateRangePickerSelectionMode.single - : _picker.DateRangePickerSelectionMode.range, - minDate: widget.minDate, - maxDate: widget.maxDate, - todayHighlightColor: Colors.transparent, - headerStyle: _picker.DateRangePickerHeaderStyle( - textAlign: TextAlign.center, - textStyle: - TextStyle(color: widget.model.backgroundColor, fontSize: 15)), - onSelectionChanged: - (_picker.DateRangePickerSelectionChangedArgs details) { - setState(() { - if (range == null) { - date = details.value; - } else { - range = details.value; - } - }); - }, - ); + _controller.selectedDate = _date; + _controller.selectedRange = _range; + Widget pickerWidget; + if (_isHijri) { + pickerWidget = _picker.SfHijriDateRangePicker( + controller: _controller, + initialDisplayDate: widget.displayDate, + showNavigationArrow: true, + enableMultiView: _range != null && _isWeb, + selectionMode: _range == null + ? _picker.DateRangePickerSelectionMode.single + : _picker.DateRangePickerSelectionMode.range, + minDate: widget.minDate, + maxDate: widget.maxDate, + todayHighlightColor: Colors.transparent, + headerStyle: _picker.DateRangePickerHeaderStyle( + textAlign: TextAlign.center, + textStyle: + TextStyle(color: widget.model.backgroundColor, fontSize: 15)), + onSelectionChanged: + (_picker.DateRangePickerSelectionChangedArgs details) { + setState(() { + if (_range == null) { + _date = details.value; + } else { + _range = details.value; + } + }); + }, + ); + } else { + pickerWidget = _picker.SfDateRangePicker( + controller: _controller, + initialDisplayDate: widget.displayDate, + showNavigationArrow: true, + enableMultiView: _range != null && _isWeb, + selectionMode: _range == null + ? _picker.DateRangePickerSelectionMode.single + : _picker.DateRangePickerSelectionMode.range, + minDate: widget.minDate, + maxDate: widget.maxDate, + todayHighlightColor: Colors.transparent, + headerStyle: _picker.DateRangePickerHeaderStyle( + textAlign: TextAlign.center, + textStyle: + TextStyle(color: widget.model.backgroundColor, fontSize: 15)), + onSelectionChanged: + (_picker.DateRangePickerSelectionChangedArgs details) { + setState(() { + if (_range == null) { + _date = details.value; + } else { + _range = details.value; + } + }); + }, + ); + } return Dialog( backgroundColor: widget.model.cardThemeColor, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)), child: Container( height: 400, - width: range != null && _isWeb ? 500 : 300, + width: _range != null && _isWeb ? 500 : 300, color: widget.model.cardThemeColor, child: Theme( data: widget.model.themeData.copyWith( @@ -652,11 +723,112 @@ class _DateRangePickerState extends State { selectedDateWidget, Flexible( child: Padding( - padding: const EdgeInsets.fromLTRB(5, 0, 5, 0), + padding: const EdgeInsets.symmetric( + vertical: 0, horizontal: 5), child: pickerWidget)), footerWidget, ], ), ))); } + + String getFormattedHijriString( + HijriDateTime date, SfLocalizations localizations, String monthFormat) { + return date.day.toString() + + ' ' + + getHijriMonthText(date, localizations, monthFormat) + + ' ' + + date.year.toString(); + } + + String getHijriMonthText( + dynamic date, SfLocalizations localizations, String format) { + if (date.month == 1) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortMuharramLabel; + } + return localizations.muharramLabel; + } else if (date.month == 2) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortSafarLabel; + } + return localizations.safarLabel; + } else if (date.month == 3) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortRabi1Label; + } + return localizations.rabi1Label; + } else if (date.month == 4) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortRabi2Label; + } + return localizations.rabi2Label; + } else if (date.month == 5) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortJumada1Label; + } + return localizations.jumada1Label; + } else if (date.month == 6) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortJumada2Label; + } + return localizations.jumada2Label; + } else if (date.month == 7) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortRajabLabel; + } + return localizations.rajabLabel; + } else if (date.month == 8) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortShaabanLabel; + } + + return localizations.shaabanLabel; + } else if (date.month == 9) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortRamadanLabel; + } + + return localizations.ramadanLabel; + } else if (date.month == 10) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortShawwalLabel; + } + return localizations.shawwalLabel; + } else if (date.month == 11) { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortDhualqiLabel; + } + return localizations.dhualqiLabel; + } else { + if (format == 'M' || format == 'MM') { + return date.month.toString(); + } else if (format == 'MMM') { + return localizations.shortDhualhiLabel; + } + return localizations.dhualhiLabel; + } + } } diff --git a/lib/samples/date_picker/vertical_calendar.dart b/lib/samples/date_picker/vertical_calendar.dart new file mode 100644 index 00000000..af12b505 --- /dev/null +++ b/lib/samples/date_picker/vertical_calendar.dart @@ -0,0 +1,83 @@ +///Package import +import 'package:flutter/material.dart'; + +///Date picker imports +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; + +///Local import +import '../../model/sample_view.dart'; + +/// Renders datepicker for blackout +class VerticalCalendar extends SampleView { + /// Creates datepicker for blackout + const VerticalCalendar(Key key) : super(key: key); + + @override + _VerticalCalendarPickerState createState() => _VerticalCalendarPickerState(); +} + +class _VerticalCalendarPickerState extends SampleViewState { + _VerticalCalendarPickerState(); + + @override + void initState() { + super.initState(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + } + + @override + Widget build([BuildContext context]) { + final Widget calendar = Container( + height: 550, + padding: const EdgeInsets.fromLTRB(5, 0, 5, 5), + color: model.cardThemeColor, + child: Theme( + data: model.themeData.copyWith(accentColor: model.backgroundColor), + child: _getVerticalCalendar(), + ), + ); + final Widget _cardView = Card( + elevation: 10, + margin: model.isWeb + ? const EdgeInsets.fromLTRB(30, 20, 30, 10) + : const EdgeInsets.fromLTRB(30, 30, 30, 10), + child: model.isWeb ? ListView(children: [calendar]) : calendar); + return Scaffold( + backgroundColor: model.themeData == null || + model.themeData.brightness == Brightness.light + ? null + : const Color(0x171A21), + body: Column(children: [ + Expanded( + flex: 9, + child: model.isWeb + ? Center( + child: + + /// 580 defines 550 height and 30 margin + Container(width: 400, height: 580, child: _cardView)) + + /// 590 defines 550 height and 40 margin + : ListView(children: [ + Container( + height: 590, + child: _cardView, + ) + ])) + ])); + } + + /// Returns the date range picker widget based on the properties passed. + SfDateRangePicker _getVerticalCalendar() { + return SfDateRangePicker( + enableMultiView: true, + navigationDirection: DateRangePickerNavigationDirection.vertical, + selectionMode: DateRangePickerSelectionMode.multiRange, + showNavigationArrow: model.isWeb, + ); + } +} diff --git a/lib/samples/gauge/animation/radial_easeanimation.dart b/lib/samples/gauge/animation/radial_ease_animation.dart similarity index 98% rename from lib/samples/gauge/animation/radial_easeanimation.dart rename to lib/samples/gauge/animation/radial_ease_animation.dart index 9b22ffcf..542371f7 100644 --- a/lib/samples/gauge/animation/radial_easeanimation.dart +++ b/lib/samples/gauge/animation/radial_ease_animation.dart @@ -100,7 +100,7 @@ class _RadialEaseExampleState extends SampleViewState { markerType: MarkerType.image, enableAnimation: true, animationType: AnimationType.ease, - imageUrl: 'images/ball.png', + imageUrl: 'images/ball_progressbar.png', markerHeight: isCardView ? 30 : 40, markerOffset: 4, markerWidth: isCardView ? 30 : 40) diff --git a/lib/samples/gauge/animation/radial_easeincric.dart b/lib/samples/gauge/animation/radial_ease_incric.dart similarity index 100% rename from lib/samples/gauge/animation/radial_easeincric.dart rename to lib/samples/gauge/animation/radial_ease_incric.dart diff --git a/lib/samples/gauge/animation/radial_easeout.dart b/lib/samples/gauge/animation/radial_ease_out.dart similarity index 100% rename from lib/samples/gauge/animation/radial_easeout.dart rename to lib/samples/gauge/animation/radial_ease_out.dart diff --git a/lib/samples/gauge/animation/radial_elasticout.dart b/lib/samples/gauge/animation/radial_elastic_out.dart similarity index 100% rename from lib/samples/gauge/animation/radial_elasticout.dart rename to lib/samples/gauge/animation/radial_elastic_out.dart diff --git a/lib/samples/gauge/animation/radial_linearanimation.dart b/lib/samples/gauge/animation/radial_linear_animation.dart similarity index 100% rename from lib/samples/gauge/animation/radial_linearanimation.dart rename to lib/samples/gauge/animation/radial_linear_animation.dart diff --git a/lib/samples/gauge/animation/radial_slowmiddle.dart b/lib/samples/gauge/animation/radial_slow_middle.dart similarity index 100% rename from lib/samples/gauge/animation/radial_slowmiddle.dart rename to lib/samples/gauge/animation/radial_slow_middle.dart diff --git a/lib/samples/gauge/axis_feature/custom_labels.dart b/lib/samples/gauge/axis_feature/custom_labels.dart index 2aafc4ea..788949b8 100644 --- a/lib/samples/gauge/axis_feature/custom_labels.dart +++ b/lib/samples/gauge/axis_feature/custom_labels.dart @@ -56,7 +56,9 @@ class _GaugeCustomLabelsState extends SampleViewState { ? 18 : isCardView ? 10 - : _orientation == Orientation.portrait ? 18 : 10, + : _orientation == Orientation.portrait + ? 18 + : 10, gradient: const LinearGradient(colors: [ Color(0xFFFF6B78), Color(0xFFFF6B78), @@ -95,7 +97,9 @@ class _GaugeCustomLabelsState extends SampleViewState { ? 18 : isCardView ? 10 - : _orientation == Orientation.portrait ? 18 : 10, + : _orientation == Orientation.portrait + ? 18 + : 10, knobStyle: KnobStyle( knobRadius: model.isWeb ? 0.098 : 0.09, sizeUnit: GaugeSizeUnit.factor, diff --git a/lib/samples/gauge/axis_feature/multiple_axis.dart b/lib/samples/gauge/axis_feature/multiple_axis.dart index bf061fcc..2b08852e 100644 --- a/lib/samples/gauge/axis_feature/multiple_axis.dart +++ b/lib/samples/gauge/axis_feature/multiple_axis.dart @@ -32,7 +32,9 @@ class _MultipleAxisExampleState extends SampleViewState { maximum: 212, interval: 36, radiusFactor: MediaQuery.of(context).orientation == Orientation.portrait - ? isCardView ? 0.5 : 0.6 + ? isCardView + ? 0.5 + : 0.6 : 0.5, labelOffset: 15, canRotateLabels: true, diff --git a/lib/samples/gauge/axis_feature/non_linearable.dart b/lib/samples/gauge/axis_feature/non_linearable.dart index b7106cf2..49281ca9 100644 --- a/lib/samples/gauge/axis_feature/non_linearable.dart +++ b/lib/samples/gauge/axis_feature/non_linearable.dart @@ -41,7 +41,7 @@ class _RadialNonLinearLabelState extends SampleViewState { maximum: 150, axisLabelStyle: GaugeTextStyle(fontSize: 12), // Added custom axis renderer that extended from RadialAxisRenderer - // onCreateAxisRenderer: handleCreateAxisRenderer, + onCreateAxisRenderer: handleCreateAxisRenderer, pointers: [ NeedlePointer( enableAnimation: true, @@ -81,10 +81,8 @@ class _RadialNonLinearLabelState extends SampleViewState { ); } - GaugeAxisRenderer handleCreateAxisRenderer(GaugeAxis axis) { + GaugeAxisRenderer handleCreateAxisRenderer() { final _CustomAxisRenderer _customAxisRenderer = _CustomAxisRenderer(); - final RadialAxis customAxis = axis; - _customAxisRenderer._axis = customAxis; return _customAxisRenderer; } @@ -94,8 +92,6 @@ class _RadialNonLinearLabelState extends SampleViewState { class _CustomAxisRenderer extends RadialAxisRenderer { _CustomAxisRenderer() : super(); - RadialAxis _axis; - /// Generated the 9 non-linear interval labels from 0 to 150 /// instead of actual generated labels. @override @@ -104,7 +100,7 @@ class _CustomAxisRenderer extends RadialAxisRenderer { for (num i = 0; i < 9; i++) { final double _value = _calculateLabelValue(i); final CircularAxisLabel label = CircularAxisLabel( - _axis.axisLabelStyle, _value.toInt().toString(), i, false); + this.axis.axisLabelStyle, _value.toInt().toString(), i, false); label.value = _value; _visibleLabels.add(label); } diff --git a/lib/samples/gauge/axis_feature/radiallabel_customization.dart b/lib/samples/gauge/axis_feature/radial_label_customization.dart similarity index 100% rename from lib/samples/gauge/axis_feature/radiallabel_customization.dart rename to lib/samples/gauge/axis_feature/radial_label_customization.dart diff --git a/lib/samples/gauge/export/export.dart b/lib/samples/gauge/export/export.dart index 2bd46f2a..1bb5054c 100644 --- a/lib/samples/gauge/export/export.dart +++ b/lib/samples/gauge/export/export.dart @@ -109,13 +109,13 @@ class _ExportState extends SampleViewState { ? '\nHigh and low temperatures of London \nSep ‘20' : '\nHigh and low temperatures of London - Sep ‘20', textStyle: TextStyle( - fontSize: 20.0, - // color: model.currentThemeData.brightness == Brightness.light - // ? Colors.black - // : Colors.white, - fontFamily: 'Segoe UI', - fontStyle: FontStyle.normal, - fontWeight: FontWeight.normal), + fontSize: 20.0, + // color: model.currentThemeData.brightness == Brightness.light + // ? Colors.black + // : Colors.white, + fontFamily: 'Segoe UI', + fontStyle: FontStyle.normal, + ), ), axes: [ RadialAxis( diff --git a/lib/samples/gauge/pointer_interaction/radial_pointerdragging.dart b/lib/samples/gauge/pointer_interaction/radial_pointer_dragging.dart similarity index 100% rename from lib/samples/gauge/pointer_interaction/radial_pointerdragging.dart rename to lib/samples/gauge/pointer_interaction/radial_pointer_dragging.dart diff --git a/lib/samples/gauge/showcase/clock_sample.dart b/lib/samples/gauge/showcase/clock_sample.dart index fc856009..a09c7a81 100644 --- a/lib/samples/gauge/showcase/clock_sample.dart +++ b/lib/samples/gauge/showcase/clock_sample.dart @@ -113,7 +113,11 @@ class _ClockExampleState extends SampleViewState { maximum: 12, showFirstLabel: false, interval: 2, - centerX: isCardView ? 0.38 : model.isWeb ? 0.38 : 0.335, + centerX: isCardView + ? 0.38 + : model.isWeb + ? 0.38 + : 0.335, minorTicksPerInterval: 5, tickOffset: 0.03, minorTickStyle: MinorTickStyle( diff --git a/lib/samples/gauge/showcase/distance_tracker.dart b/lib/samples/gauge/showcase/distance_tracker.dart index 718a53a2..b3162a3a 100644 --- a/lib/samples/gauge/showcase/distance_tracker.dart +++ b/lib/samples/gauge/showcase/distance_tracker.dart @@ -27,7 +27,9 @@ class _DistanceTrackerExampleState extends SampleViewState { _markerValue = (MediaQuery.of(context).orientation == Orientation.portrait) ? 138 - : model.isWeb ? 138 : 136; + : model.isWeb + ? 138 + : 136; }); return _getDistanceTrackerExample(); } diff --git a/lib/samples/maps/shape_layer/bubble/bubble.dart b/lib/samples/maps/shape_layer/bubble/bubble.dart index 98ccc7d2..f6c21776 100644 --- a/lib/samples/maps/shape_layer/bubble/bubble.dart +++ b/lib/samples/maps/shape_layer/bubble/bubble.dart @@ -1,13 +1,13 @@ ///Flutter package imports -import 'package:flutter/material.dart'; import 'package:flutter/animation.dart'; - -///Map import -import 'package:syncfusion_flutter_maps/maps.dart'; +import 'package:flutter/material.dart'; ///Core theme import import 'package:syncfusion_flutter_core/theme.dart'; +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + ///Local import import '../../../../model/sample_view.dart'; @@ -24,12 +24,12 @@ class _MapBubblePageState extends SampleViewState with TickerProviderStateMixin { _MapBubblePageState(); - MapShapeLayerDelegate _mapDelegate; - MapShapeLayerDelegate _facebookMapDelegate; - MapShapeLayerDelegate _twitterMapDelegate; - MapShapeLayerDelegate _tikTokMapDelegate; - MapShapeLayerDelegate _instagramMapDelegate; - MapShapeLayerDelegate _snapChatMapDelegate; + MapShapeSource _mapSource; + MapShapeSource _facebookMapSource; + MapShapeSource _twitterMapSource; + MapShapeSource _tikTokMapSorce; + MapShapeSource _instagramMapSource; + MapShapeSource _snapChatMapSource; bool _isLightTheme; @@ -41,6 +41,8 @@ class _MapBubblePageState extends SampleViewState Color _tooltipStrokeColor; Color _tooltipTextColor; + String _currentDelegate; + BoxDecoration _facebookBoxDecoration; BoxDecoration _twitterBoxDecoration; BoxDecoration _instagramBoxDecoration; @@ -214,86 +216,63 @@ class _MapBubblePageState extends SampleViewState _UsersModel('Egypt', 7), ]; - _facebookMapDelegate = MapShapeLayerDelegate( - // Path of the GeoJSON file. - shapeFile: 'assets/world_map.json', - // Field or group name in the .json file to identify the shapes. - // - // Which is used to map the respective shape to data source. - shapeDataField: 'name', - // The number of data in your data source collection. - // - // The callback for the [primaryValueMapper] will be called - // the number of times equal to the [dataCount]. - // The value returned in the [primaryValueMapper] should be - // exactly matched with the value of the [shapeDataField] - // in the .json file. This is how the mapping between the - // data source and the shapes in the .json file is done. - dataCount: _facebookUsers.length, - primaryValueMapper: (int index) => _facebookUsers[index].country, - // The value returned from this callback will be used as a factor to - // calculate the radius of the bubble between the - // [MapBubbleSettings.minRadius] and [MapBubbleSettings.maxRadius]. - bubbleSizeMapper: (int index) => _facebookUsers[index].usersCount, - // Returns the custom tooltip text for each bubble. - // - // By default, the value returned in the [primaryValueMapper] - // will be used for tooltip text. - bubbleTooltipTextMapper: (int index) => - _facebookUsers[index].country + - ' : ' + - _facebookUsers[index].usersCount.toStringAsFixed(0) + - 'M users'); - - _twitterMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/world_map.json', - shapeDataField: 'name', - dataCount: _twitterUsers.length, - primaryValueMapper: (int index) => _twitterUsers[index].country, - bubbleSizeMapper: (int index) => _twitterUsers[index].usersCount, - bubbleTooltipTextMapper: (int index) => - _twitterUsers[index].country + - ' : ' + - _twitterUsers[index].usersCount.toStringAsFixed(0) + - 'M users'); - - _tikTokMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/world_map.json', - shapeDataField: 'name', - dataCount: _tikTokUsers.length, - primaryValueMapper: (int index) => _tikTokUsers[index].country, - bubbleSizeMapper: (int index) => _tikTokUsers[index].usersCount, - bubbleTooltipTextMapper: (int index) => - _tikTokUsers[index].country + - ' : ' + - _tikTokUsers[index].usersCount.toStringAsFixed(0) + - 'M users'); - - _instagramMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/world_map.json', - shapeDataField: 'name', - dataCount: _instagramUsers.length, - primaryValueMapper: (int index) => _instagramUsers[index].country, - bubbleSizeMapper: (int index) => _instagramUsers[index].usersCount, - bubbleTooltipTextMapper: (int index) => - _instagramUsers[index].country + - ' : ' + - _instagramUsers[index].usersCount.toStringAsFixed(0) + - 'M users'); - - _snapChatMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/world_map.json', - shapeDataField: 'name', - dataCount: _snapChatUsers.length, - primaryValueMapper: (int index) => _snapChatUsers[index].country, - bubbleSizeMapper: (int index) => _snapChatUsers[index].usersCount, - bubbleTooltipTextMapper: (int index) => - _snapChatUsers[index].country + - ' : ' + - _snapChatUsers[index].usersCount.toStringAsFixed(0) + - 'M users'); + _facebookMapSource = MapShapeSource.asset( + // Path of the GeoJSON file. + 'assets/world_map.json', + // Field or group name in the .json file to identify the shapes. + // + // Which is used to map the respective shape to data source. + shapeDataField: 'name', + // The number of data in your data source collection. + // + // The callback for the [primaryValueMapper] will be called + // the number of times equal to the [dataCount]. + // The value returned in the [primaryValueMapper] should be + // exactly matched with the value of the [shapeDataField] + // in the .json file. This is how the mapping between the + // data source and the shapes in the .json file is done. + dataCount: _facebookUsers.length, + primaryValueMapper: (int index) => _facebookUsers[index].country, + // The value returned from this callback will be used as a factor to + // calculate the radius of the bubble between the + // [MapBubbleSettings.minRadius] and [MapBubbleSettings.maxRadius]. + bubbleSizeMapper: (int index) => _facebookUsers[index].usersCount, + ); + + _twitterMapSource = MapShapeSource.asset( + 'assets/world_map.json', + shapeDataField: 'name', + dataCount: _twitterUsers.length, + primaryValueMapper: (int index) => _twitterUsers[index].country, + bubbleSizeMapper: (int index) => _twitterUsers[index].usersCount, + ); + + _tikTokMapSorce = MapShapeSource.asset( + 'assets/world_map.json', + shapeDataField: 'name', + dataCount: _tikTokUsers.length, + primaryValueMapper: (int index) => _tikTokUsers[index].country, + bubbleSizeMapper: (int index) => _tikTokUsers[index].usersCount, + ); + + _instagramMapSource = MapShapeSource.asset( + 'assets/world_map.json', + shapeDataField: 'name', + dataCount: _instagramUsers.length, + primaryValueMapper: (int index) => _instagramUsers[index].country, + bubbleSizeMapper: (int index) => _instagramUsers[index].usersCount, + ); + + _snapChatMapSource = MapShapeSource.asset( + 'assets/world_map.json', + shapeDataField: 'name', + dataCount: _snapChatUsers.length, + primaryValueMapper: (int index) => _snapChatUsers[index].country, + bubbleSizeMapper: (int index) => _snapChatUsers[index].usersCount, + ); - _mapDelegate = _facebookMapDelegate; + _mapSource = _facebookMapSource; + _currentDelegate = 'FaceBook'; _shapeColor = _isLightTheme ? const Color.fromRGBO(57, 110, 218, 0.35) : const Color.fromRGBO(72, 132, 255, 0.35); @@ -339,344 +318,356 @@ class _MapBubblePageState extends SampleViewState } Widget _getMapsWidget() { - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return (snapshot.hasData) - ? Stack( - children: [ - Padding( - padding: MediaQuery.of(context).orientation == - Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.15, - right: 10) - : const EdgeInsets.only(bottom: 75.0, right: 10), - child: SfMapsTheme( - data: SfMapsThemeData( - shapeHoverColor: Colors.transparent, - shapeHoverStrokeColor: Colors.transparent, - bubbleHoverColor: _shapeColor, - bubbleHoverStrokeColor: _bubbleColor, - bubbleHoverStrokeWidth: 1.5, - ), - child: SfMaps( - title: const MapTitle( - text: 'Social Media Users Statistics', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - delegate: _mapDelegate, - enableBubbleTooltip: true, - showBubbles: true, - color: _shapeColor, - strokeWidth: 1, - strokeColor: _shapeStrokeColor, - bubbleSettings: MapBubbleSettings( - strokeColor: _bubbleStrokeColor, - strokeWidth: 0.5, - color: _bubbleColor, - minRadius: 10, - maxRadius: 40), - tooltipSettings: MapTooltipSettings( - textStyle: Theme.of(context) - .textTheme - .caption - .copyWith(color: _tooltipTextColor), - color: _tooltipColor, - strokeColor: _tooltipStrokeColor), - ), - ], + return Stack( + children: [ + Padding( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.15, + right: 10) + : const EdgeInsets.only(bottom: 75.0, right: 10), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Colors.transparent, + shapeHoverStrokeColor: Colors.transparent, + bubbleHoverColor: _shapeColor, + bubbleHoverStrokeColor: _bubbleColor, + bubbleHoverStrokeWidth: 1.5, + ), + child: SfMaps( + title: const MapTitle( + 'Social Media Users Statistics', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, ), + ); + }, + source: _mapSource, + color: _shapeColor, + strokeWidth: 1, + strokeColor: _shapeStrokeColor, + // Returns the custom tooltip for each bubble. + bubbleTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text(_getCustomizedString(index), + style: Theme.of(context) + .textTheme + .caption + .copyWith(color: _tooltipTextColor)), + ); + }, + bubbleSettings: MapBubbleSettings( + strokeColor: _bubbleStrokeColor, + strokeWidth: 0.5, + color: _bubbleColor, + minRadius: 10, + maxRadius: 40), + tooltipSettings: MapTooltipSettings( + color: _tooltipColor, strokeColor: _tooltipStrokeColor), + ), + ], + ), + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.only(bottom: 5), + child: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + decoration: _facebookBoxDecoration, + child: ScaleTransition( + scale: _facebookAnimation, + child: IconButton( + icon: Image.asset('images/maps_facebook.png'), + iconSize: 50, + onPressed: () { + setState(() { + _mapSource = _facebookMapSource; + _currentDelegate = 'FaceBook'; + _shapeColor = _isLightTheme + ? const Color.fromRGBO(57, 110, 218, 0.35) + : const Color.fromRGBO(72, 132, 255, 0.35); + _shapeStrokeColor = + const Color.fromARGB(255, 52, 85, 176) + .withOpacity(0); + _bubbleColor = _isLightTheme + ? const Color.fromRGBO(15, 59, 177, 0.5) + : const Color.fromRGBO(135, 167, 255, 0.6); + _tooltipColor = _isLightTheme + ? const Color.fromRGBO(35, 65, 148, 1) + : const Color.fromRGBO(52, 85, 176, 1); + _bubbleStrokeColor = Colors.white; + _tooltipStrokeColor = Colors.white; + _tooltipTextColor = Colors.white; + + _facebookController.forward(); + + _tiktokController.reverse(); + _twitterController.reverse(); + _snapchatController.reverse(); + _instagramController.reverse(); + + _twitterBoxDecoration = null; + _instagramBoxDecoration = null; + _snapchatBoxDecoration = null; + _tiktokBoxDecoration = null; + + _facebookBoxDecoration = _getBoxDecoration( + const Color.fromARGB(255, 52, 85, 176) + .withOpacity(_isLightTheme ? 0.1 : 0.3)); + }); + }, ), ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.only(bottom: 5), - child: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - decoration: _facebookBoxDecoration, - child: ScaleTransition( - scale: _facebookAnimation, - child: IconButton( - icon: Image.asset('images/maps_facebook.png'), - iconSize: 50, - onPressed: () { - setState(() { - _mapDelegate = _facebookMapDelegate; - _shapeColor = _isLightTheme - ? const Color.fromRGBO( - 57, 110, 218, 0.35) - : const Color.fromRGBO( - 72, 132, 255, 0.35); - _shapeStrokeColor = - const Color.fromARGB(255, 52, 85, 176) - .withOpacity(0); - _bubbleColor = _isLightTheme - ? const Color.fromRGBO(15, 59, 177, 0.5) - : const Color.fromRGBO( - 135, 167, 255, 0.6); - _tooltipColor = _isLightTheme - ? const Color.fromRGBO(35, 65, 148, 1) - : const Color.fromRGBO(52, 85, 176, 1); - _bubbleStrokeColor = Colors.white; - _tooltipStrokeColor = Colors.white; - _tooltipTextColor = Colors.white; - - _facebookController.forward(); - - _tiktokController.reverse(); - _twitterController.reverse(); - _snapchatController.reverse(); - _instagramController.reverse(); - - _twitterBoxDecoration = null; - _instagramBoxDecoration = null; - _snapchatBoxDecoration = null; - _tiktokBoxDecoration = null; - - _facebookBoxDecoration = _getBoxDecoration( - const Color.fromARGB(255, 52, 85, 176) - .withOpacity( - _isLightTheme ? 0.1 : 0.3)); - }); - }, - ), - ), - ), - Container( - decoration: _twitterBoxDecoration, - child: ScaleTransition( - scale: _twitterAnimation, - child: IconButton( - icon: Image.asset('images/maps_twitter.png'), - iconSize: 50, - onPressed: () { - setState(() { - _mapDelegate = _twitterMapDelegate; - _shapeColor = _isLightTheme - ? const Color.fromRGBO( - 86, 170, 235, 0.35) - : const Color.fromRGBO( - 32, 154, 255, 0.35); - _shapeStrokeColor = - const Color.fromARGB(255, 0, 122, 202) - .withOpacity(0); - _bubbleColor = _isLightTheme - ? const Color.fromRGBO( - 17, 124, 179, 0.5) - : const Color.fromRGBO( - 56, 184, 251, 0.5); - _tooltipColor = _isLightTheme - ? const Color.fromRGBO(27, 129, 188, 1) - : const Color.fromRGBO(65, 154, 207, 1); - _bubbleStrokeColor = Colors.white; - _tooltipStrokeColor = Colors.white; - _tooltipTextColor = Colors.white; - - _twitterController.forward(); - - _facebookController.reverse(); - _tiktokController.reverse(); - _snapchatController.reverse(); - _instagramController.reverse(); - - _facebookBoxDecoration = null; - _instagramBoxDecoration = null; - _snapchatBoxDecoration = null; - _tiktokBoxDecoration = null; - - _twitterBoxDecoration = _getBoxDecoration( - const Color.fromARGB(255, 0, 122, 202) - .withOpacity( - _isLightTheme ? 0.1 : 0.3)); - }); - }, - ), - ), - ), - Container( - decoration: _instagramBoxDecoration, - child: ScaleTransition( - scale: _instagramAnimation, - child: IconButton( - icon: Image.asset('images/maps_instagram.png'), - iconSize: 50, - onPressed: () { - setState(() { - _mapDelegate = _instagramMapDelegate; - _shapeColor = _isLightTheme - ? const Color.fromRGBO( - 159, 119, 213, 0.35) - : const Color.fromRGBO( - 166, 104, 246, 0.35); - _shapeStrokeColor = - const Color.fromARGB(255, 238, 46, 73) - .withOpacity(0); - _bubbleColor = _isLightTheme - ? const Color.fromRGBO(249, 99, 20, 0.5) - : const Color.fromRGBO( - 253, 173, 38, 0.5); - _tooltipColor = _isLightTheme - ? const Color.fromRGBO(175, 90, 66, 1) - : const Color.fromRGBO(202, 130, 8, 1); - _bubbleStrokeColor = Colors.white; - _tooltipStrokeColor = Colors.white; - _tooltipTextColor = Colors.white; - - _instagramController.forward(); - - _facebookController.reverse(); - _tiktokController.reverse(); - _twitterController.reverse(); - _snapchatController.reverse(); - - _facebookBoxDecoration = null; - _twitterBoxDecoration = null; - _snapchatBoxDecoration = null; - _tiktokBoxDecoration = null; - - _instagramBoxDecoration = _getBoxDecoration( - const Color.fromARGB(255, 238, 46, 73) - .withOpacity( - _isLightTheme ? 0.1 : 0.3)); - }); - }, - ), - ), - ), - Container( - decoration: _snapchatBoxDecoration, - child: ScaleTransition( - scale: _snapchatAnimation, - child: IconButton( - icon: Image.asset('images/maps_snapchat.png'), - iconSize: 50, - onPressed: () { - setState(() { - _mapDelegate = _snapChatMapDelegate; - _shapeColor = _isLightTheme - ? const Color.fromRGBO( - 212, 185, 48, 0.35) - : const Color.fromRGBO( - 227, 226, 73, 0.35); - _shapeStrokeColor = - const Color.fromARGB(255, 255, 126, 0) - .withOpacity(0); - _bubbleColor = _isLightTheme - ? const Color.fromRGBO(182, 150, 2, 0.5) - : const Color.fromRGBO( - 254, 253, 2, 0.458); - _tooltipColor = _isLightTheme - ? const Color.fromRGBO(173, 144, 12, 1) - : const Color.fromRGBO(225, 225, 30, 1); - _bubbleStrokeColor = _isLightTheme - ? Colors.black - : Colors.white; - _tooltipStrokeColor = _isLightTheme - ? Colors.black - : Colors.white; - _tooltipTextColor = _isLightTheme - ? Colors.white - : Colors.black; - - _snapchatController.forward(); - - _facebookController.reverse(); - _tiktokController.reverse(); - _twitterController.reverse(); - _instagramController.reverse(); - - _facebookBoxDecoration = null; - _twitterBoxDecoration = null; - _instagramBoxDecoration = null; - _tiktokBoxDecoration = null; - - _snapchatBoxDecoration = _getBoxDecoration( - const Color.fromARGB(255, 255, 221, 0) - .withOpacity( - _isLightTheme ? 0.2 : 0.3)); - }); - }, - ), - ), - ), - Container( - decoration: _tiktokBoxDecoration, - child: ScaleTransition( - scale: _tiktokAnimation, - child: IconButton( - icon: Image.asset('images/maps_tiktok.png'), - iconSize: 50, - onPressed: () { - setState(() { - _mapDelegate = _tikTokMapDelegate; - _shapeColor = _isLightTheme - ? const Color.fromRGBO( - 72, 193, 188, 0.35) - : const Color.fromRGBO( - 50, 216, 210, 0.35); - _shapeStrokeColor = - Colors.black54.withOpacity(0); - _bubbleColor = _isLightTheme - ? const Color.fromRGBO( - 250, 60, 114, 0.5) - : const Color.fromRGBO( - 218, 11, 69, 0.5); - _tooltipColor = _isLightTheme - ? const Color.fromRGBO(186, 57, 108, 1) - : const Color.fromRGBO(189, 74, 119, 1); - _bubbleStrokeColor = Colors.white; - _tooltipStrokeColor = Colors.white; - _tooltipTextColor = Colors.white; - - _tiktokController.forward(); - - _facebookController.reverse(); - _twitterController.reverse(); - _snapchatController.reverse(); - _instagramController.reverse(); - - _facebookBoxDecoration = null; - _twitterBoxDecoration = null; - _instagramBoxDecoration = null; - _snapchatBoxDecoration = null; - - _tiktokBoxDecoration = _getBoxDecoration( - Colors.black.withOpacity( - _isLightTheme ? 0.1 : 0.3)); - }); - }, - ), - ), - ), - ], - ), + ), + Container( + decoration: _twitterBoxDecoration, + child: ScaleTransition( + scale: _twitterAnimation, + child: IconButton( + icon: Image.asset('images/maps_twitter.png'), + iconSize: 50, + onPressed: () { + setState(() { + _mapSource = _twitterMapSource; + _currentDelegate = 'Twitter'; + _shapeColor = _isLightTheme + ? const Color.fromRGBO(86, 170, 235, 0.35) + : const Color.fromRGBO(32, 154, 255, 0.35); + _shapeStrokeColor = + const Color.fromARGB(255, 0, 122, 202) + .withOpacity(0); + _bubbleColor = _isLightTheme + ? const Color.fromRGBO(17, 124, 179, 0.5) + : const Color.fromRGBO(56, 184, 251, 0.5); + _tooltipColor = _isLightTheme + ? const Color.fromRGBO(27, 129, 188, 1) + : const Color.fromRGBO(65, 154, 207, 1); + _bubbleStrokeColor = Colors.white; + _tooltipStrokeColor = Colors.white; + _tooltipTextColor = Colors.white; + + _twitterController.forward(); + + _facebookController.reverse(); + _tiktokController.reverse(); + _snapchatController.reverse(); + _instagramController.reverse(); + + _facebookBoxDecoration = null; + _instagramBoxDecoration = null; + _snapchatBoxDecoration = null; + _tiktokBoxDecoration = null; + + _twitterBoxDecoration = _getBoxDecoration( + const Color.fromARGB(255, 0, 122, 202) + .withOpacity(_isLightTheme ? 0.1 : 0.3)); + }); + }, + ), + ), + ), + Container( + decoration: _instagramBoxDecoration, + child: ScaleTransition( + scale: _instagramAnimation, + child: IconButton( + icon: Image.asset('images/maps_instagram.png'), + iconSize: 50, + onPressed: () { + setState(() { + _mapSource = _instagramMapSource; + _currentDelegate = 'Instagram'; + _shapeColor = _isLightTheme + ? const Color.fromRGBO(159, 119, 213, 0.35) + : const Color.fromRGBO(166, 104, 246, 0.35); + _shapeStrokeColor = + const Color.fromARGB(255, 238, 46, 73) + .withOpacity(0); + _bubbleColor = _isLightTheme + ? const Color.fromRGBO(249, 99, 20, 0.5) + : const Color.fromRGBO(253, 173, 38, 0.5); + _tooltipColor = _isLightTheme + ? const Color.fromRGBO(175, 90, 66, 1) + : const Color.fromRGBO(202, 130, 8, 1); + _bubbleStrokeColor = Colors.white; + _tooltipStrokeColor = Colors.white; + _tooltipTextColor = Colors.white; + + _instagramController.forward(); + + _facebookController.reverse(); + _tiktokController.reverse(); + _twitterController.reverse(); + _snapchatController.reverse(); + + _facebookBoxDecoration = null; + _twitterBoxDecoration = null; + _snapchatBoxDecoration = null; + _tiktokBoxDecoration = null; + + _instagramBoxDecoration = _getBoxDecoration( + const Color.fromARGB(255, 238, 46, 73) + .withOpacity(_isLightTheme ? 0.1 : 0.3)); + }); + }, ), ), - ], - ) - : Center( - child: Container( - height: 25, - width: 25, - child: const CircularProgressIndicator( - strokeWidth: 3, + ), + Container( + decoration: _snapchatBoxDecoration, + child: ScaleTransition( + scale: _snapchatAnimation, + child: IconButton( + icon: Image.asset('images/maps_snapchat.png'), + iconSize: 50, + onPressed: () { + setState(() { + _mapSource = _snapChatMapSource; + _currentDelegate = 'SnapChat'; + _shapeColor = _isLightTheme + ? const Color.fromRGBO(212, 185, 48, 0.35) + : const Color.fromRGBO(227, 226, 73, 0.35); + _shapeStrokeColor = + const Color.fromARGB(255, 255, 126, 0) + .withOpacity(0); + _bubbleColor = _isLightTheme + ? const Color.fromRGBO(182, 150, 2, 0.5) + : const Color.fromRGBO(254, 253, 2, 0.458); + _tooltipColor = _isLightTheme + ? const Color.fromRGBO(173, 144, 12, 1) + : const Color.fromRGBO(225, 225, 30, 1); + _bubbleStrokeColor = + _isLightTheme ? Colors.black : Colors.white; + _tooltipStrokeColor = + _isLightTheme ? Colors.black : Colors.white; + _tooltipTextColor = + _isLightTheme ? Colors.white : Colors.black; + + _snapchatController.forward(); + + _facebookController.reverse(); + _tiktokController.reverse(); + _twitterController.reverse(); + _instagramController.reverse(); + + _facebookBoxDecoration = null; + _twitterBoxDecoration = null; + _instagramBoxDecoration = null; + _tiktokBoxDecoration = null; + + _snapchatBoxDecoration = _getBoxDecoration( + const Color.fromARGB(255, 255, 221, 0) + .withOpacity(_isLightTheme ? 0.2 : 0.3)); + }); + }, + ), ), ), - ); - }, + Container( + decoration: _tiktokBoxDecoration, + child: ScaleTransition( + scale: _tiktokAnimation, + child: IconButton( + icon: Image.asset('images/maps_tiktok.png'), + iconSize: 50, + onPressed: () { + setState(() { + _mapSource = _tikTokMapSorce; + _currentDelegate = 'Tiktok'; + _shapeColor = _isLightTheme + ? const Color.fromRGBO(72, 193, 188, 0.35) + : const Color.fromRGBO(50, 216, 210, 0.35); + _shapeStrokeColor = Colors.black54.withOpacity(0); + _bubbleColor = _isLightTheme + ? const Color.fromRGBO(250, 60, 114, 0.5) + : const Color.fromRGBO(218, 11, 69, 0.5); + _tooltipColor = _isLightTheme + ? const Color.fromRGBO(186, 57, 108, 1) + : const Color.fromRGBO(189, 74, 119, 1); + _bubbleStrokeColor = Colors.white; + _tooltipStrokeColor = Colors.white; + _tooltipTextColor = Colors.white; + + _tiktokController.forward(); + + _facebookController.reverse(); + _twitterController.reverse(); + _snapchatController.reverse(); + _instagramController.reverse(); + + _facebookBoxDecoration = null; + _twitterBoxDecoration = null; + _instagramBoxDecoration = null; + _snapchatBoxDecoration = null; + + _tiktokBoxDecoration = _getBoxDecoration(Colors.black + .withOpacity(_isLightTheme ? 0.1 : 0.3)); + }); + }, + ), + ), + ), + ], + ), + ), + ), + ], ); } + // ignore: missing_return + String _getCustomizedString(int index) { + switch (_currentDelegate) { + case 'FaceBook': + return _facebookUsers[index].country + + ' : ' + + _facebookUsers[index].usersCount.toStringAsFixed(0) + + 'M users'; + break; + case 'Twitter': + return _twitterUsers[index].country + + ' : ' + + _twitterUsers[index].usersCount.toStringAsFixed(0) + + 'M users'; + break; + case 'Instagram': + return _instagramUsers[index].country + + ' : ' + + _instagramUsers[index].usersCount.toStringAsFixed(0) + + 'M users'; + + break; + case 'SnapChat': + return _snapChatUsers[index].country + + ' : ' + + _snapChatUsers[index].usersCount.toStringAsFixed(0) + + 'M users'; + break; + case 'Tiktok': + return _tikTokUsers[index].country + + ' : ' + + _tikTokUsers[index].usersCount.toStringAsFixed(0) + + 'M users'; + break; + } + } + BoxDecoration _getBoxDecoration(Color color) { return BoxDecoration( shape: BoxShape.circle, diff --git a/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart b/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart index d6d45a5a..472b6d34 100644 --- a/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart +++ b/lib/samples/maps/shape_layer/equal_color_mapping/equal_color_mapping.dart @@ -102,131 +102,121 @@ class _MapEqualColorMappingPageState extends SampleViewState { Widget _getMapsWidget(ThemeData themeData) { final bool isLightTheme = themeData.brightness == Brightness.light; - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return (snapshot.hasData) - ? Center( - child: Padding( - padding: MediaQuery.of(context).orientation == - Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.05, - right: 10, - left: 10) - : const EdgeInsets.only(left: 10, right: 10, bottom: 15), - child: SfMaps( - title: const MapTitle( - text: 'European Time Zones', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - delegate: MapShapeLayerDelegate( - // Path of the GeoJSON file. - shapeFile: 'assets/europe.json', - // Field or group name in the .json file to identify - // the shapes. - // - // Which is used to map the respective shape - // to data source. - // - // On the basis of this value, shape tooltip text - // is rendered. - shapeDataField: 'name', - // The number of data in your data source collection. - // - // The callback for the [primaryValueMapper] will be - // called the number of times equal to the [dataCount]. - // The value returned in the [primaryValueMapper] should - // exactly matched with the value of the [shapeDataField] - // in the .json file. This is how the mapping between the - // data source and the shapes in the .json file is done. - dataCount: _gmtDetails.length, - primaryValueMapper: (int index) => - _gmtDetails[index].countryName, - // Used for color mapping. - // - // The value of the [MapColorMapper.value] will be - // compared with the value returned in the - // [shapeColorValueMapper]. If it is equal, the respective - // [MapColorMapper.color] will be applied to the shape. - shapeColorValueMapper: (int index) => - _gmtDetails[index].gmtTime, - // Returns the custom tooltip text for each shape. - // - // By default, the value returned in the - // [primaryValueMapper] will be used for tooltip text. - shapeTooltipTextMapper: (int index) => - _gmtDetails[index].countryName + - ' : ' + - _gmtDetails[index].gmtTime, - // Group and differentiate the shapes using the color - // based on [MapColorMapper.value] value. - // - // The value of the [MapColorMapper.value] - // will be compared with the value returned in the - // [shapeColorValueMapper] and the respective - // [MapColorMapper.color] will be applied to the shape. - // - // [MapColorMapper.text] which is used for the text of - // legend item and [MapColorMapper.color] will be used for - // the color of the legend icon respectively. - shapeColorMappers: const [ - MapColorMapper( - value: 'GMT+0', - color: Colors.lightBlue, - text: 'GMT+0'), - MapColorMapper( - value: 'GMT+1', - color: Colors.orangeAccent, - text: 'GMT+1'), - MapColorMapper( - value: 'GMT+2', - color: Colors.lightGreen, - text: 'GMT+2'), - MapColorMapper( - value: 'GMT+3', - color: Colors.purple, - text: 'GMT+3'), - ], - ), - legendSource: MapElement.shape, - strokeColor: isLightTheme - ? Colors.white - : const Color.fromRGBO(224, 224, 224, 0.5), - enableShapeTooltip: true, - legendSettings: const MapLegendSettings( - position: MapLegendPosition.bottom, - padding: EdgeInsets.only(top: 15)), - tooltipSettings: MapTooltipSettings( - color: isLightTheme - ? Color.fromRGBO(45, 45, 45, 1) - : Color.fromRGBO(242, 242, 242, 1), - textStyle: themeData.textTheme.caption.copyWith( - color: isLightTheme - ? Color.fromRGBO(255, 255, 255, 1) - : Color.fromRGBO(10, 10, 10, 1), - ), - ), - ), - ], - ), - ), - ) - : Center( - child: Container( + return Center( + child: Padding( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.05, + right: 10, + left: 10) + : const EdgeInsets.only(left: 10, right: 10, bottom: 15), + child: SfMaps( + title: const MapTitle( + 'European Time Zones', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( height: 25, width: 25, child: const CircularProgressIndicator( strokeWidth: 3, ), - ), - ); - }, + ); + }, + source: MapShapeSource.asset( + // Path of the GeoJSON file. + 'assets/europe.json', + // Field or group name in the .json file to identify + // the shapes. + // + // Which is used to map the respective shape + // to data source. + // + // On the basis of this value, shape tooltip text + // is rendered. + shapeDataField: 'name', + // The number of data in your data source collection. + // + // The callback for the [primaryValueMapper] will be + // called the number of times equal to the [dataCount]. + // The value returned in the [primaryValueMapper] should + // exactly matched with the value of the [shapeDataField] + // in the .json file. This is how the mapping between the + // data source and the shapes in the .json file is done. + dataCount: _gmtDetails.length, + primaryValueMapper: (int index) => + _gmtDetails[index].countryName, + // Used for color mapping. + // + // The value of the [MapColorMapper.value] will be + // compared with the value returned in the + // [shapeColorValueMapper]. If it is equal, the respective + // [MapColorMapper.color] will be applied to the shape. + shapeColorValueMapper: (int index) => + _gmtDetails[index].gmtTime, + // Group and differentiate the shapes using the color + // based on [MapColorMapper.value] value. + // + // The value of the [MapColorMapper.value] + // will be compared with the value returned in the + // [shapeColorValueMapper] and the respective + // [MapColorMapper.color] will be applied to the shape. + // + // [MapColorMapper.text] which is used for the text of + // legend item and [MapColorMapper.color] will be used for + // the color of the legend icon respectively. + shapeColorMappers: const [ + MapColorMapper( + value: 'GMT+0', color: Colors.lightBlue, text: 'GMT+0'), + MapColorMapper( + value: 'GMT+1', + color: Colors.orangeAccent, + text: 'GMT+1'), + MapColorMapper( + value: 'GMT+2', color: Colors.lightGreen, text: 'GMT+2'), + MapColorMapper( + value: 'GMT+3', color: Colors.purple, text: 'GMT+3'), + ], + ), + strokeColor: isLightTheme + ? Colors.white + : const Color.fromRGBO(224, 224, 224, 0.5), + // Returns the custom tooltip for each shape. + shapeTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _gmtDetails[index].countryName + + ' : ' + + _gmtDetails[index].gmtTime, + style: themeData.textTheme.caption.copyWith( + color: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(10, 10, 10, 1), + ), + ), + ); + }, + legend: MapLegend.bar( + MapElement.shape, + position: MapLegendPosition.bottom, + padding: EdgeInsets.only(top: 15), + segmentSize: const Size(60.0, 10.0), + ), + tooltipSettings: MapTooltipSettings( + color: isLightTheme + ? Color.fromRGBO(45, 45, 45, 1) + : Color.fromRGBO(242, 242, 242, 1), + ), + ), + ], + ), + ), ); } } diff --git a/lib/samples/maps/shape_layer/legend/legend.dart b/lib/samples/maps/shape_layer/legend/legend.dart index 0b8db3ba..d6b8519e 100644 --- a/lib/samples/maps/shape_layer/legend/legend.dart +++ b/lib/samples/maps/shape_layer/legend/legend.dart @@ -1,15 +1,14 @@ ///Flutter package imports import 'package:flutter/material.dart'; -///Map import -import 'package:syncfusion_flutter_maps/maps.dart'; - ///Core theme import import 'package:syncfusion_flutter_core/theme.dart'; +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + ///Local import import '../../../../model/sample_view.dart'; -import '../../../../widgets/checkbox.dart'; class MapLegendPage extends SampleView { const MapLegendPage(Key key) : super(key: key); @@ -20,19 +19,29 @@ class MapLegendPage extends SampleView { class _MapLegendPageState extends SampleViewState { _MapLegendPageState(); - MapShapeLayerDelegate _mapBubbleDelegate; - MapShapeLayerDelegate _mapShapeDelegate; + MapShapeSource _mapBubbleSource; + MapShapeSource _mapShapeSource; - List _internetData; - List _colorMappers; + List _shapeInternetData; + List _bubbleInternetData; + List _shapeColorMappers; + List _bubbleColorMappers; + List _shapeBarLegendColorMappers; + List _bubbleBarLegendColorMappers; bool _showBubbleData = false; + bool _showBarLegend = false; + bool _enableToggleInteraction = true; + bool _enableGradient = false; + + List> _dropDownMenuItems; + String _currentLegend; @override void initState() { super.initState(); - _internetData = [ + _shapeInternetData = [ InternetDataModel('Algeria', price: 5.15), InternetDataModel('Angola', price: 7.95), InternetDataModel('Benin', price: 20.99), @@ -98,12 +107,64 @@ class _MapLegendPageState extends SampleViewState { InternetDataModel('Zimbabwe', price: 75.2), ]; - _colorMappers = [ + _bubbleInternetData = [ + InternetDataModel('Algeria', price: 5.15), + InternetDataModel('Angola', price: 7.95), + InternetDataModel('Benin', price: 20.99), + InternetDataModel('Botswana', price: 14.12), + InternetDataModel('Cape Verde', price: 4.25), + InternetDataModel('Central African Rep.', + price: 6.03, countryName: 'Central African Republic'), + InternetDataModel('Chad', price: 23.33), + InternetDataModel('Comoros', price: 12.57), + InternetDataModel('Congo', price: 5.63), + InternetDataModel('C�te d\'Ivoire', + price: 4.1, countryName: 'Ivory Coast'), + InternetDataModel('Dem. Rep. Congo', + price: 0.88, countryName: 'Democratic Republic of the Congo'), + InternetDataModel('Djibouti', price: 37.92), + InternetDataModel('Egypt', price: 1.49), + InternetDataModel('Eq. Guinea', + price: 65.83, countryName: 'Equatorial Guinea'), + InternetDataModel('Eritrea'), + InternetDataModel('Guinea', price: 1.97), + InternetDataModel('Kenya', price: 2.73), + InternetDataModel('Madagascar', price: 3.39), + InternetDataModel('Malawi', price: 3.59), + InternetDataModel('Mali', price: 9.22), + InternetDataModel('Mauritania', price: 3.12), + InternetDataModel('Mauritius', price: 3.71), + InternetDataModel('Mayotte', price: 10.18), + InternetDataModel('Morocco', price: 1.6), + InternetDataModel('Mozambique', price: 15.82), + InternetDataModel('Namibia', price: 11.02), + InternetDataModel('Niger', price: 2.98), + InternetDataModel('Nigeria', price: 2.22), + InternetDataModel('Rwanda', price: 0.56), + InternetDataModel('Sao Tome and Principe', price: 5.33), + InternetDataModel('Saint Helena', price: 55.47), + InternetDataModel('Senegal', price: 3.28), + InternetDataModel('Seychelles', price: 19.55), + InternetDataModel('Somalia', price: 6.19), + InternetDataModel('Somaliland'), + InternetDataModel('South Africa', price: 7.19), + InternetDataModel('S. Sudan', countryName: 'South Sudan'), + InternetDataModel('Sudan', price: 0.68), + InternetDataModel('Swaziland', price: 12.14), + InternetDataModel('Tanzania', price: 5.93), + InternetDataModel('Tunisia', price: 2.87), + InternetDataModel('W. Sahara', + price: 1.66, countryName: 'Western Sahara'), + InternetDataModel('Zambia', price: 2.25), + InternetDataModel('Zimbabwe', price: 75.2), + ]; + + _shapeColorMappers = [ MapColorMapper( from: 0, to: 0.99, color: Color.fromRGBO(3, 192, 150, 1), - text: 'Less than \$1'), + text: '<\$1'), MapColorMapper( from: 1.0, to: 4.99, @@ -117,64 +178,142 @@ class _MapLegendPageState extends SampleViewState { MapColorMapper( from: 10, to: 29.99, + color: Color.fromRGBO(255, 175, 33, 0.70), + text: '\$10 - \$29.99'), + MapColorMapper( + from: 30, + to: 100, color: Color.fromRGBO(255, 175, 33, 1.0), + text: '>\$30'), + ]; + + _bubbleColorMappers = [ + MapColorMapper( + from: 0, + to: 0.99, + color: Color.fromRGBO(34, 205, 72, 0.6), + text: '<\$1'), + MapColorMapper( + from: 1.0, + to: 4.99, + color: Color.fromRGBO(237, 171, 0, 0.6), + text: '\$1 - \$4.99'), + MapColorMapper( + from: 5, + to: 9.99, + color: Color.fromRGBO(24, 152, 207, 0.6), + text: '\$5 - \$9.99'), + MapColorMapper( + from: 10, + to: 29.99, + color: Color.fromRGBO(255, 0, 0, 0.6), text: '\$10 - \$29.99'), MapColorMapper( from: 30, - to: 49.99, + to: 100, + color: Color.fromRGBO(134, 0, 179, 0.6), + text: '>\$30'), + ]; + + _shapeBarLegendColorMappers = [ + MapColorMapper( + from: 0, + to: 0.99, + color: Color.fromRGBO(3, 192, 150, 1), + text: '{\$0},{\$1}'), + MapColorMapper( + from: 1.0, + to: 4.99, + color: Color.fromRGBO(3, 192, 150, 0.6), + text: '\$5'), + MapColorMapper( + from: 5, + to: 9.99, + color: Color.fromRGBO(3, 192, 150, 0.35), + text: '\$10'), + MapColorMapper( + from: 10, + to: 29.99, color: Color.fromRGBO(255, 175, 33, 0.70), - text: '\$30 - \$49.99'), + text: '\$30'), MapColorMapper( - from: 50, + from: 30, to: 100, - color: Color.fromRGBO(255, 175, 33, 0.40), - text: '\$50 and More'), + color: Color.fromRGBO(255, 175, 33, 1.0), + text: '\$100'), ]; - _mapBubbleDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/africa.json', + _bubbleBarLegendColorMappers = [ + MapColorMapper( + from: 0, + to: 0.99, + color: Color.fromRGBO(34, 205, 72, 0.6), + text: '{\$0},{\$1}'), + MapColorMapper( + from: 1.0, + to: 4.99, + color: Color.fromRGBO(237, 171, 0, 0.6), + text: '\$5'), + MapColorMapper( + from: 5, + to: 9.99, + color: Color.fromRGBO(24, 152, 207, 0.6), + text: '\$10'), + MapColorMapper( + from: 10, + to: 29.99, + color: Color.fromRGBO(255, 0, 0, 0.6), + text: '\$30'), + MapColorMapper( + from: 30, + to: 100, + color: Color.fromRGBO(134, 0, 179, 0.6), + text: '\$100'), + ]; + + _mapBubbleSource = MapShapeSource.asset( + 'assets/africa.json', shapeDataField: 'name', - dataCount: _internetData.length, - primaryValueMapper: (int index) => _internetData[index].actualCountryName, - bubbleTooltipTextMapper: (int index) { - return 'State : ' + - (_internetData[index].countryName ?? - _internetData[index].actualCountryName) + - '\nPrice : \$' + - _internetData[index].price.toString(); - }, - bubbleSizeMapper: (int index) => _internetData[index].price, - bubbleColorValueMapper: (int index) => _internetData[index].price, - bubbleColorMappers: _colorMappers, + dataCount: _bubbleInternetData.length, + primaryValueMapper: (int index) => + _bubbleInternetData[index].actualCountryName, + bubbleSizeMapper: (int index) => _bubbleInternetData[index].price, + bubbleColorValueMapper: (int index) => _bubbleInternetData[index].price, + bubbleColorMappers: _bubbleColorMappers, ); - _mapShapeDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/africa.json', + _mapShapeSource = MapShapeSource.asset( + 'assets/africa.json', shapeDataField: 'name', - dataCount: _internetData.length, - primaryValueMapper: (int index) => _internetData[index].actualCountryName, - shapeTooltipTextMapper: (int index) { - if (_internetData[index].price == null) { - return null; - } - return 'State : ' + - (_internetData[index].countryName ?? - _internetData[index].actualCountryName) + - '\nPrice : \$' + - _internetData[index].price.toString(); - }, - shapeColorValueMapper: (int index) => _internetData[index].price, - shapeColorMappers: _colorMappers, + dataCount: _shapeInternetData.length, + primaryValueMapper: (int index) => + _shapeInternetData[index].actualCountryName, + shapeColorValueMapper: (int index) => _shapeInternetData[index].price, + shapeColorMappers: _shapeColorMappers, ); + + _dropDownMenuItems = _getDropDownMenuItems(); + _currentLegend = _dropDownMenuItems[0].value; } @override void dispose() { - _internetData?.clear(); - _colorMappers?.clear(); + _shapeInternetData?.clear(); + _bubbleInternetData?.clear(); + _shapeColorMappers?.clear(); + _bubbleColorMappers?.clear(); + _shapeBarLegendColorMappers?.clear(); + _bubbleBarLegendColorMappers?.clear(); super.dispose(); } + List> _getDropDownMenuItems() { + List> legendItems = List() + ..add(DropdownMenuItem(value: 'Default', child: Text('Default'))) + ..add(DropdownMenuItem(value: 'Bar', child: Text('Bar'))); + return legendItems; + } + @override Widget build(BuildContext context) { return MediaQuery.of(context).orientation == Orientation.portrait || @@ -185,153 +324,334 @@ class _MapLegendPageState extends SampleViewState { } Widget _getMapsWidget() { - bool _isLightTheme = model?.themeData?.brightness == Brightness.light; - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Padding( - padding: - MediaQuery.of(context).orientation == Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - right: 10, - left: 5) - : const EdgeInsets.only(left: 5, right: 10), - child: SfMapsTheme( - data: SfMapsThemeData( - brightness: model?.themeData?.brightness, - shapeHoverColor: _showBubbleData - ? Colors.transparent - : (_isLightTheme - ? const Color.fromRGBO(204, 204, 204, 0.8) - : const Color.fromRGBO(77, 77, 77, 0.8)), - shapeHoverStrokeColor: _showBubbleData - ? Colors.transparent - : (_isLightTheme - ? const Color.fromRGBO(158, 158, 158, 1) - : const Color.fromRGBO(255, 255, 255, 1)), - bubbleHoverColor: _showBubbleData - ? (_isLightTheme - ? const Color.fromRGBO(204, 204, 204, 0.8) - : const Color.fromRGBO(115, 115, 115, 0.8)) - : Colors.transparent, - bubbleHoverStrokeColor: _showBubbleData - ? const Color.fromRGBO(158, 158, 158, 1) - : Colors.transparent, - toggledItemColor: Colors.transparent, - toggledItemStrokeColor: - _showBubbleData ? Colors.transparent : null, - ), - child: SfMaps( - title: const MapTitle( - text: 'Average Internet Prices in Africa', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - /// Changing the data based on whether data will be - /// visualized using the shape colors or bubbles. - delegate: _showBubbleData - ? _mapBubbleDelegate - : _mapShapeDelegate, + bool isLightTheme = model?.themeData?.brightness == Brightness.light; + return Padding( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + right: 10, + left: 5) + : const EdgeInsets.only(left: 5, right: 10), + child: SfMapsTheme( + data: SfMapsThemeData( + brightness: model?.themeData?.brightness, + shapeHoverColor: _showBubbleData + ? Colors.transparent + : (isLightTheme + ? const Color.fromRGBO(204, 204, 204, 0.8) + : const Color.fromRGBO(77, 77, 77, 0.8)), + shapeHoverStrokeColor: _showBubbleData + ? Colors.transparent + : (isLightTheme + ? const Color.fromRGBO(158, 158, 158, 1) + : const Color.fromRGBO(255, 255, 255, 1)), + bubbleHoverColor: _showBubbleData + ? (isLightTheme + ? const Color.fromRGBO(204, 204, 204, 0.8) + : const Color.fromRGBO(115, 115, 115, 0.8)) + : Colors.transparent, + bubbleHoverStrokeColor: _showBubbleData + ? const Color.fromRGBO(158, 158, 158, 1) + : Colors.transparent, + toggledItemColor: Colors.transparent, + toggledItemStrokeColor: _showBubbleData ? Colors.transparent : null, + ), + child: SfMaps( + title: const MapTitle( + 'Average Internet Prices in Africa', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, + ), + ); + }, - /// You can show legend for the shapes or bubbles. By - /// default, the legend will not be shown. - legendSource: - _showBubbleData ? MapElement.bubble : MapElement.shape, - showBubbles: _showBubbleData, - enableBubbleTooltip: _showBubbleData, - enableShapeTooltip: !_showBubbleData, - color: _showBubbleData - ? (_isLightTheme - ? Color.fromRGBO(238, 238, 238, 1) - : Color.fromRGBO(238, 238, 238, 0.1)) - : null, - strokeColor: _showBubbleData - ? (_isLightTheme - ? Color.fromRGBO(158, 158, 158, 1) - : Color.fromRGBO(158, 158, 158, 0.1)) - : Color.fromRGBO(255, 255, 255, 1), - bubbleSettings: MapBubbleSettings( - minRadius: 15, - maxRadius: 45, - ), - legendSettings: MapLegendSettings( + /// Changing the data based on whether data will be + /// visualized using the shape colors or bubbles. + source: _showBubbleData ? _mapBubbleSource : _mapShapeSource, + // Returns the custom tooltip for each shape. + shapeTooltipBuilder: _showBubbleData + ? null + : (BuildContext context, int index) { + if (_shapeInternetData[index].price == null) { + return null; + } + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Country : ' + + (_shapeInternetData[index].countryName ?? + _shapeInternetData[index].actualCountryName) + + '\nPrice : \$' + + _shapeInternetData[index].price.toString(), + style: Theme.of(context).textTheme.caption.copyWith( + color: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(10, 10, 10, 1), + ), + ), + ); + }, + // Returns the custom tooltip for each bubble. + bubbleTooltipBuilder: _showBubbleData + ? (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Country : ' + + (_bubbleInternetData[index].countryName ?? + _bubbleInternetData[index] + .actualCountryName) + + '\nPrice : \$' + + _bubbleInternetData[index].price.toString(), + style: Theme.of(context).textTheme.caption.copyWith( + color: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(10, 10, 10, 1), + ), + ), + ); + } + : null, + color: _showBubbleData + ? (isLightTheme + ? Color.fromRGBO(204, 204, 204, 1) + : Color.fromRGBO(103, 103, 103, 1)) + : null, + strokeColor: _showBubbleData + ? (isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(49, 49, 49, 1)) + : Color.fromRGBO(255, 255, 255, 1), + bubbleSettings: MapBubbleSettings( + minRadius: 13, + maxRadius: 20, + strokeColor: Colors.black, + strokeWidth: 0.5, + ), + legend: _showBarLegend + ? MapLegend.bar( + /// You can show legend for the shapes or bubbles. By + /// default, the legend will not be shown. + _showBubbleData ? MapElement.bubble : MapElement.shape, + edgeLabelsPlacement: MapLegendEdgeLabelsPlacement.inside, + labelsPlacement: MapLegendLabelsPlacement.betweenItems, + position: MapLegendPosition.top, + spacing: _enableGradient ? 10.0 : 1.0, + segmentPaintingStyle: _enableGradient + ? MapLegendPaintingStyle.gradient + : MapLegendPaintingStyle.solid, + segmentSize: + _enableGradient ? Size(300.0, 9.0) : Size(55.0, 9.0), + padding: EdgeInsets.only(bottom: 20), + ) + : MapLegend( + /// You can show legend for the shapes or bubbles. By + /// default, the legend will not be shown. + _showBubbleData ? MapElement.bubble : MapElement.shape, position: MapLegendPosition.left, offset: Offset( MediaQuery.of(context).size.width * (model.isWeb ? 0.25 : 0.12), 50), - iconType: MapIconType.square, - enableToggleInteraction: true, + iconType: MapIconType.rectangle, + enableToggleInteraction: _enableToggleInteraction, ), - tooltipSettings: MapTooltipSettings( - color: _isLightTheme - ? Color.fromRGBO(45, 45, 45, 1) - : Color.fromRGBO(242, 242, 242, 1), - textStyle: Theme.of(context).textTheme.caption.copyWith( - color: _isLightTheme - ? Color.fromRGBO(255, 255, 255, 1) - : Color.fromRGBO(10, 10, 10, 1), - ), - ), - ), - ], + tooltipSettings: MapTooltipSettings( + color: isLightTheme + ? Color.fromRGBO(45, 45, 45, 1) + : Color.fromRGBO(242, 242, 242, 1), ), ), - ); - } else { - return Center( - child: Container( - height: 25, - width: 25, - child: const CircularProgressIndicator( - strokeWidth: 3, - ), - ), - ); - } - }, + ], + ), + ), ); } @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Expanded( - child: Text( - 'Enable bubble legend ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal), - ), - ), - Padding( - padding: const EdgeInsets.all(10.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: _showBubbleData, - valueChanged: (dynamic value) { - setState(() { - _showBubbleData = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return SingleChildScrollView( + child: Container( + height: 220, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Legend type", + style: TextStyle( + color: model.textColor, + fontSize: 16, + ), + ), + Padding( + padding: EdgeInsets.only(right: 15.0), + child: DropdownButton( + value: _currentLegend, + items: _dropDownMenuItems, + onChanged: (String value) { + setState(() { + _currentLegend = value; + if (_currentLegend == 'Bar') { + _showBarLegend = true; + _mapBubbleSource = MapShapeSource.asset( + 'assets/africa.json', + shapeDataField: 'name', + dataCount: _bubbleInternetData.length, + primaryValueMapper: (int index) => + _bubbleInternetData[index] + .actualCountryName, + bubbleSizeMapper: (int index) => + _bubbleInternetData[index].price, + bubbleColorValueMapper: (int index) => + _bubbleInternetData[index].price, + bubbleColorMappers: + _bubbleBarLegendColorMappers, + ); + + _mapShapeSource = MapShapeSource.asset( + 'assets/africa.json', + shapeDataField: 'name', + dataCount: _shapeInternetData.length, + primaryValueMapper: (int index) => + _shapeInternetData[index] + .actualCountryName, + shapeColorValueMapper: (int index) => + _shapeInternetData[index].price, + shapeColorMappers: + _shapeBarLegendColorMappers, + ); + } else { + _showBarLegend = false; + _mapBubbleSource = MapShapeSource.asset( + 'assets/africa.json', + shapeDataField: 'name', + dataCount: _bubbleInternetData.length, + primaryValueMapper: (int index) => + _bubbleInternetData[index] + .actualCountryName, + bubbleSizeMapper: (int index) => + _bubbleInternetData[index].price, + bubbleColorValueMapper: (int index) => + _bubbleInternetData[index].price, + bubbleColorMappers: _bubbleColorMappers, + ); + + _mapShapeSource = MapShapeSource.asset( + 'assets/africa.json', + shapeDataField: 'name', + dataCount: _shapeInternetData.length, + primaryValueMapper: (int index) => + _shapeInternetData[index] + .actualCountryName, + shapeColorValueMapper: (int index) => + _shapeInternetData[index].price, + shapeColorMappers: _shapeColorMappers, + ); + } + stateSetter(() {}); + }); + }, + )) + ], + ), + Row( + children: [ + Expanded( + child: Text( + 'Enable legend for bubbles', + style: TextStyle( + color: model.textColor, + fontSize: 16, + ), + ), + ), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _showBubbleData, + onChanged: (bool value) { + setState(() { + _showBubbleData = value; + stateSetter(() {}); + }); + })), + ], + ), + Row( + children: [ + Expanded( + child: Text( + 'Enable toggle interaction', + style: TextStyle( + color: _showBarLegend + ? model.textColor.withOpacity(0.5) + : model.textColor, + fontSize: 16, + ), + ), + ), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableToggleInteraction, + onChanged: !_showBarLegend + ? (bool value) { + setState(() { + _enableToggleInteraction = value; + stateSetter(() {}); + }); + } + : null), + ), + ], + ), + Row( + children: [ + Expanded( + child: Text( + 'Enable gradient', + style: TextStyle( + color: _showBarLegend + ? model.textColor + : model.textColor.withOpacity(0.5), + fontSize: 16, + ), + ), + ), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableGradient, + onChanged: _showBarLegend + ? (bool value) { + setState(() { + _enableGradient = value; + stateSetter(() {}); + }); + } + : null), + ), + ], + ), + ], + ))); + }); } } diff --git a/lib/samples/maps/shape_layer/marker/marker.dart b/lib/samples/maps/shape_layer/marker/marker.dart index bc4dc0b4..d172fcba 100644 --- a/lib/samples/maps/shape_layer/marker/marker.dart +++ b/lib/samples/maps/shape_layer/marker/marker.dart @@ -66,81 +66,71 @@ class _MapMarkerPageState extends SampleViewState { } Widget _getMapsWidget() { - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Center( - child: Padding( - padding: - MediaQuery.of(context).orientation == Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.1, - right: 10, - left: 10) - : const EdgeInsets.only(left: 10, right: 10, bottom: 10), - child: SfMapsTheme( - data: SfMapsThemeData( - shapeHoverColor: Colors.transparent, - shapeHoverStrokeColor: Colors.transparent, - shapeHoverStrokeWidth: 0, - ), - child: SfMaps( - title: const MapTitle( - text: 'World Clock', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - delegate: const MapShapeLayerDelegate( - // Path of the GeoJSON file. - shapeFile: 'assets/world_map.json', - // Field or group name in the .json file to identify - // the shapes. - // - // Which is used to map the respective shape to - // data source. - shapeDataField: 'name', - ), - // The number of initial markers. - // - // The callback for the [markerBuilder] will be called - // the number of times equal to the [initialMarkersCount]. - initialMarkersCount: 7, - markerBuilder: (_, int index) { - return MapMarker( - longitude: _clockModelData[index].longitude, - latitude: _clockModelData[index].latitude, - child: _ClockWidget( - countryName: _clockModelData[index].countryName, - date: _clockModelData[index].date), - size: const Size(150, 150)); - }, - strokeWidth: 0, - color: model.themeData.brightness == Brightness.light - ? const Color.fromRGBO(71, 70, 75, 0.2) - : const Color.fromRGBO(71, 70, 75, 1), + return Center( + child: Padding( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.1, + right: 10, + left: 10) + : const EdgeInsets.only(left: 10, right: 10, bottom: 10), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Colors.transparent, + shapeHoverStrokeColor: Colors.transparent, + shapeHoverStrokeWidth: 0, + ), + child: SfMaps( + title: const MapTitle( + 'World Clock', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, ), - ], + ); + }, + source: MapShapeSource.asset( + // Path of the GeoJSON file. + 'assets/world_map.json', + // Field or group name in the .json file to identify + // the shapes. + // + // Which is used to map the respective shape to + // data source. + shapeDataField: 'name', ), + // The number of initial markers. + // + // The callback for the [markerBuilder] will be called + // the number of times equal to the [initialMarkersCount]. + initialMarkersCount: 7, + markerBuilder: (_, int index) { + return MapMarker( + longitude: _clockModelData[index].longitude, + latitude: _clockModelData[index].latitude, + child: _ClockWidget( + countryName: _clockModelData[index].countryName, + date: _clockModelData[index].date), + size: const Size(150, 150)); + }, + strokeWidth: 0, + color: model.themeData.brightness == Brightness.light + ? const Color.fromRGBO(71, 70, 75, 0.2) + : const Color.fromRGBO(71, 70, 75, 1), ), - ), - ); - } else { - return Center( - child: Container( - height: 25, - width: 25, - child: const CircularProgressIndicator( - strokeWidth: 3, - ), - ), - ); - } - }, + ], + ), + ), + ), ); } } diff --git a/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart b/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart index 781989e9..5fa00100 100644 --- a/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart +++ b/lib/samples/maps/shape_layer/range_color_mapping/range_color_mapping.dart @@ -2,12 +2,12 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart' show NumberFormat; -///Map import -import 'package:syncfusion_flutter_maps/maps.dart'; - ///Core theme import import 'package:syncfusion_flutter_core/theme.dart'; +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + ///Local import import '../../../../model/sample_view.dart'; @@ -294,170 +294,146 @@ class _MapRangeColorMappingPageState extends SampleViewState { } Widget _getMapsWidget() { - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return snapshot.hasData - ? Center( - child: Padding( - padding: MediaQuery.of(context).orientation == - Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.05, - right: 10) - : const EdgeInsets.only(right: 10, bottom: 15), - child: SfMapsTheme( - data: SfMapsThemeData( - shapeHoverColor: Color.fromRGBO(176, 237, 131, 1), + return Center( + child: Padding( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.05, + right: 10) + : const EdgeInsets.only(right: 10, bottom: 15), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Color.fromRGBO(176, 237, 131, 1), + ), + child: SfMaps( + title: const MapTitle( + 'World Population Density (per sq. km.)', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, ), - child: SfMaps( - title: const MapTitle( - text: 'World Population Density (per sq. km.)', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - delegate: MapShapeLayerDelegate( - // Path of the GeoJSON file. - shapeFile: 'assets/world_map.json', - // Field or group name in the .json file - // to identify the shapes. - // - // Which is used to map the respective - // shape to data source. - // - // On the basis of this value, - // shape tooltip text is rendered. - shapeDataField: 'name', - // The number of data in your data source collection. - // - // The callback for the [primaryValueMapper] - // will be called the number of times equal - // to the [dataCount]. - // The value returned in the [primaryValueMapper] - // should be exactly matched with the value of the - // [shapeDataField] in the .json file. This is how - // the mapping between the data source and the shapes - // in the .json file is done. - dataCount: _worldPopulationDensityDetails.length, - primaryValueMapper: (int index) => - _worldPopulationDensityDetails[index] - .countryName, - // Used for color mapping. - // - // The value of the [MapColorMapper.from] - // and [MapColorMapper.to] - // will be compared with the value returned in the - // [shapeColorValueMapper] and the respective - // [MapColorMapper.color] will be applied to the shape. - shapeColorValueMapper: (int index) => - _worldPopulationDensityDetails[index].density, - // Returns the custom tooltip text for each shape. - // - // By default, the value returned in the - //[primaryValueMapper] will be used for tooltip text. - shapeTooltipTextMapper: (int index) => - _worldPopulationDensityDetails[index] - .countryName + - ' : ' + - _numberFormat - .format( - _worldPopulationDensityDetails[index] - .density) - .toString() + - ' per sq. km.', - // Group and differentiate the shapes using the color - // based on [MapColorMapper.from] and - //[MapColorMapper.to] value. - // - // The value of the [MapColorMapper.from] and - // [MapColorMapper.to] will be compared with the value - // returned in the [shapeColorValueMapper] and - // the respective [MapColorMapper.color] will be applied - // to the shape. - // - // [MapColorMapper.text] which is used for the text of - // legend item and [MapColorMapper.color] will be used for - // the color of the legend icon respectively. - shapeColorMappers: const [ - MapColorMapper( - from: 0, - to: 50, - color: Color.fromRGBO(128, 159, 255, 1), - text: '<50'), - MapColorMapper( - from: 50, - to: 100, - color: Color.fromRGBO(51, 102, 255, 1), - text: '50 - 100'), - MapColorMapper( - from: 100, - to: 250, - color: Color.fromRGBO(0, 57, 230, 1), - text: '100 - 250'), - MapColorMapper( - from: 250, - to: 500, - color: Color.fromRGBO(0, 51, 204, 1), - text: '250 - 500'), - MapColorMapper( - from: 500, - to: 1000, - color: Color.fromRGBO(0, 45, 179, 1), - text: '500 - 1k'), - MapColorMapper( - from: 1000, - to: 5000, - color: Color.fromRGBO(0, 38, 153, 1), - text: '1k - 5k'), - MapColorMapper( - from: 5000, - to: 10000, - color: Color.fromRGBO(0, 32, 128, 1), - text: '5k - 10k'), - MapColorMapper( - from: 10000, - to: 50000, - color: Color.fromRGBO(0, 26, 102, 1), - text: '10k - 30k'), - ], - ), - enableShapeTooltip: true, - legendSource: MapElement.shape, - strokeColor: Colors.white30, - legendSettings: const MapLegendSettings( - position: MapLegendPosition.bottom, - iconType: MapIconType.square, - overflowMode: MapLegendOverflowMode.wrap, - padding: EdgeInsets.only(top: 15)), - tooltipSettings: MapTooltipSettings( - color: - model.themeData.brightness == Brightness.light - ? const Color.fromRGBO(0, 32, 128, 1) - : const Color.fromRGBO(226, 233, 255, 1), - strokeColor: - model.themeData.brightness == Brightness.light - ? Colors.white - : Colors.black), - ), - ], - ), - ), - ), - ) - : Center( - child: Container( - height: 25, - width: 25, - child: const CircularProgressIndicator( - strokeWidth: 3, - ), + ); + }, + source: MapShapeSource.asset( + // Path of the GeoJSON file. + 'assets/world_map.json', + // Field or group name in the .json file + // to identify the shapes. + // + // Which is used to map the respective + // shape to data source. + // + // On the basis of this value, + // shape tooltip text is rendered. + shapeDataField: 'name', + // The number of data in your data source collection. + // + // The callback for the [primaryValueMapper] + // will be called the number of times equal + // to the [dataCount]. + // The value returned in the [primaryValueMapper] + // should be exactly matched with the value of the + // [shapeDataField] in the .json file. This is how + // the mapping between the data source and the shapes + // in the .json file is done. + dataCount: _worldPopulationDensityDetails.length, + primaryValueMapper: (int index) => + _worldPopulationDensityDetails[index].countryName, + // Used for color mapping. + // + // The value of the [MapColorMapper.from] + // and [MapColorMapper.to] + // will be compared with the value returned in the + // [shapeColorValueMapper] and the respective + // [MapColorMapper.color] will be applied to the shape. + shapeColorValueMapper: (int index) => + _worldPopulationDensityDetails[index].density, + // Group and differentiate the shapes using the color + // based on [MapColorMapper.from] and + //[MapColorMapper.to] value. + // + // The value of the [MapColorMapper.from] and + // [MapColorMapper.to] will be compared with the value + // returned in the [shapeColorValueMapper] and + // the respective [MapColorMapper.color] will be applied + // to the shape. + // + // [MapColorMapper.text] which is used for the text of + // legend item and [MapColorMapper.color] will be used for + // the color of the legend icon respectively. + shapeColorMappers: const [ + MapColorMapper( + from: 0, + to: 100, + color: Color.fromRGBO(128, 159, 255, 1), + text: '{0},{100}'), + MapColorMapper( + from: 100, + to: 500, + color: Color.fromRGBO(51, 102, 255, 1), + text: '500'), + MapColorMapper( + from: 500, + to: 1000, + color: Color.fromRGBO(0, 57, 230, 1), + text: '1k'), + MapColorMapper( + from: 1000, + to: 5000, + color: Color.fromRGBO(0, 45, 179, 1), + text: '5k'), + MapColorMapper( + from: 5000, + to: 50000, + color: Color.fromRGBO(0, 26, 102, 1), + text: '50k'), + ], ), - ); - }, + // Returns the custom tooltip for each shape. + shapeTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _worldPopulationDensityDetails[index].countryName + + ' : ' + + _numberFormat + .format(_worldPopulationDensityDetails[index] + .density) + .toString() + + ' per sq. km.', + style: Theme.of(context).textTheme.caption.copyWith( + color: Theme.of(context).colorScheme.surface)), + ); + }, + strokeColor: Colors.white30, + legend: MapLegend.bar(MapElement.shape, + position: MapLegendPosition.bottom, + overflowMode: MapLegendOverflowMode.wrap, + labelsPlacement: MapLegendLabelsPlacement.betweenItems, + padding: EdgeInsets.only(top: 15), + spacing: 1.0, + segmentSize: Size(55.0, 9.0)), + tooltipSettings: MapTooltipSettings( + color: model.themeData.brightness == Brightness.light + ? const Color.fromRGBO(0, 32, 128, 1) + : const Color.fromRGBO(226, 233, 255, 1), + strokeColor: model.themeData.brightness == Brightness.light + ? Colors.white + : Colors.black), + ), + ], + ), + ), + ), ); } } diff --git a/lib/samples/maps/shape_layer/selection/selection.dart b/lib/samples/maps/shape_layer/selection/selection.dart index de2a129f..3892a4c5 100644 --- a/lib/samples/maps/shape_layer/selection/selection.dart +++ b/lib/samples/maps/shape_layer/selection/selection.dart @@ -17,9 +17,11 @@ class MapSelectionPage extends SampleView { } class _MapSelectionPageState extends SampleViewState { + int _selectedIndex; + List<_ElectionResultModel> _electionResults; - MapShapeLayerDelegate _selectionMapDelegate; + MapShapeSource _selectionMapSource; final GlobalKey _scaffoldKey = GlobalKey(); @@ -88,9 +90,9 @@ class _MapSelectionPageState extends SampleViewState { _ElectionResultModel('Hawaii', 62.2, 30.0, 'Hawaii', 'Democratic'), ]; - _selectionMapDelegate = MapShapeLayerDelegate( + _selectionMapSource = MapShapeSource.asset( // Path of the GeoJSON file. - shapeFile: 'assets/usa.json', + 'assets/usa.json', // Field or group name in the .json file to identify the shapes. // // Which is used to map the respective shape to data source. @@ -125,6 +127,8 @@ class _MapSelectionPageState extends SampleViewState { MapColorMapper(value: 'Republican', color: Colors.red), ], ); + + _selectedIndex = -1; } @override @@ -158,7 +162,7 @@ class _MapSelectionPageState extends SampleViewState { : const EdgeInsets.only(right: 10, bottom: 15), child: SfMaps( title: const MapTitle( - text: '2016 US Election Results', + '2016 US Election Results', padding: EdgeInsets.only(top: 15, bottom: 30), ), layers: [ @@ -172,21 +176,23 @@ class _MapSelectionPageState extends SampleViewState { ), ); }, - delegate: _selectionMapDelegate, - legendSource: MapElement.shape, + source: _selectionMapSource, // Selection will not work if [MapShapeLayerDelegate.dataCount] // is null or empty. - enableSelection: true, + selectedIndex: _selectedIndex, strokeColor: Colors.white30, - legendSettings: const MapLegendSettings( - position: MapLegendPosition.bottom, - padding: EdgeInsets.only(top: 15)), + legend: const MapLegend( + MapElement.shape, + position: MapLegendPosition.bottom, + padding: EdgeInsets.only(top: 15), + ), selectionSettings: const MapSelectionSettings( color: Color.fromRGBO(252, 177, 0, 1), strokeColor: Colors.white, strokeWidth: 2), + // Passes the tapped or clicked shape index to the callback. onSelectionChanged: (int index) { - if (index != -1) { + if (index != _selectedIndex) { _scaffoldKey.currentState.hideCurrentSnackBar(); _scaffoldKey.currentState.showSnackBar(SnackBar( backgroundColor: @@ -275,6 +281,14 @@ class _MapSelectionPageState extends SampleViewState { duration: const Duration(seconds: 3), )); } + // Tapped or clicked shape UI won't change until the parent widget + // rebuilds the maps widget with the new selected [index]. + // + // Passing -1 to the [MapShapeLayer.selectedIndex] for unselecting + // the previous selected shape. + setState(() { + _selectedIndex = (index == _selectedIndex) ? -1 : index; + }); }, ), ], diff --git a/lib/samples/maps/shape_layer/sublayer/sublayer.dart b/lib/samples/maps/shape_layer/sublayer/sublayer.dart new file mode 100644 index 00000000..240926a5 --- /dev/null +++ b/lib/samples/maps/shape_layer/sublayer/sublayer.dart @@ -0,0 +1,271 @@ +///Flutter package imports +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + +///Core theme import +import 'package:syncfusion_flutter_core/theme.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Renders the map widget with sublayer +class MapSublayerPage extends SampleView { + /// Creates the map widget with sublayer + const MapSublayerPage(Key key) : super(key: key); + + @override + _MapSublayerPageState createState() => _MapSublayerPageState(); +} + +class _MapSublayerPageState extends SampleViewState + with SingleTickerProviderStateMixin { + MapShapeSource _mapSource; + MapZoomPanBehavior _zoomPanBehavior; + bool _isDesktop; + List _state; + ThemeData _themeData; + + @override + void initState() { + super.initState(); + + _state = [ + 'New South Wales', + 'Victoria', + 'Queensland', + 'South Australia', + 'Western Australia', + 'Northern Territory' + ]; + + _mapSource = MapShapeSource.asset( + // Path of the GeoJSON file. + 'assets/australia.json', + // Field or group name in the .json file to identify the shapes. + // + // Which is used to map the respective shape to data source. + // + // On the basis of this value, shape tooltip text is rendered. + shapeDataField: 'STATE_NAME', + primaryValueMapper: (index) => _state[index], + dataCount: _state.length, + dataLabelMapper: (index) => index == 0 ? 'NSW' : _state[index], + ); + + _zoomPanBehavior = MapZoomPanBehavior(); + } + + @override + void dispose() { + super.dispose(); + } + + Future>> getJsonData() async { + List> polylines = >[]; + String data = await rootBundle.loadString('assets/river.json'); + dynamic jsonData = json.decode(data); + + int length = (jsonData['geometries']).length; + for (int i = 0; i < length; i++) { + List polylineData; + if (jsonData['geometries'][i]['type'] == 'LineString') { + List riverPoints = []; + polylineData = jsonData['geometries'][i]['coordinates']; + for (int j = 0; j < polylineData.length; j++) { + riverPoints.add(MapLatLng(polylineData[j][1], polylineData[j][0])); + } + polylines.add(riverPoints); + } else { + polylineData = []; + int length = (jsonData['geometries'][i]['coordinates']).length; + for (int j = 0; j < length; j++) { + polylineData.add(jsonData['geometries'][i]['coordinates'][j]); + } + + for (int k = 0; k < polylineData.length; k++) { + List riverPoints = []; + for (int index = 0; index < polylineData[k].length; index++) { + riverPoints.add(MapLatLng( + polylineData[k][index][1], polylineData[k][index][0])); + } + polylines.add(riverPoints); + } + } + } + + return polylines; + } + + @override + Widget build(BuildContext context) { + _themeData = Theme.of(context); + _isDesktop = model.isWeb || + _themeData.platform == TargetPlatform.macOS || + _themeData.platform == TargetPlatform.windows; + return Scaffold( + backgroundColor: + _isDesktop ? model.cardThemeColor : model.cardThemeColor, + body: MediaQuery.of(context).orientation == Orientation.portrait || + _isDesktop + ? _getMapsWidget() + : SingleChildScrollView(child: _getMapsWidget())); + } + + Widget _getMapsWidget() { + final bool isLightTheme = _themeData.brightness == Brightness.light; + return FutureBuilder( + future: getJsonData(), + builder: (BuildContext context, AsyncSnapshot snapchat) { + if (snapchat.hasData) { + final List> polylines = snapchat.data; + return Center( + child: Padding( + padding: MediaQuery.of(context).orientation == + Orientation.portrait || + _isDesktop + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.05, + right: 10, + ) + : const EdgeInsets.only(right: 10, bottom: 15), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Colors.transparent, + shapeHoverStrokeColor: Colors.transparent, + ), + child: SfMaps( + title: const MapTitle( + 'Rivers in Australia', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + source: _mapSource, + color: isLightTheme + ? const Color.fromRGBO(254, 246, 214, 1.0) + : const Color.fromRGBO(142, 197, 128, 1.0), + zoomPanBehavior: _zoomPanBehavior, + strokeWidth: 1.0, + strokeColor: isLightTheme + ? const Color.fromRGBO(205, 195, 152, 0.5) + : const Color.fromRGBO(117, 156, 22, 1.0), + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, + ), + ); + }, + tooltipSettings: MapTooltipSettings( + color: isLightTheme + ? Color.fromRGBO(45, 45, 45, 1) + : Color.fromRGBO(242, 242, 242, 1), + strokeColor: isLightTheme + ? Color.fromRGBO(242, 242, 242, 1) + : Color.fromRGBO(45, 45, 45, 1), + ), + showDataLabels: true, + dataLabelSettings: MapDataLabelSettings( + overflowMode: MapLabelOverflow.visible, + textStyle: _themeData.textTheme.caption.copyWith( + color: Color.fromRGBO(0, 0, 0, 1), + ), + ), + sublayers: [ + MapPolylineLayer( + polylines: List.generate( + polylines.length, + (int index) { + return MapPolyline( + points: polylines[index], + color: isLightTheme + ? Color.fromRGBO(0, 168, 204, 1.0) + : Color.fromRGBO(11, 138, 255, 1.0), + width: 2.0, + ); + }, + ).toSet(), + tooltipBuilder: (BuildContext context, int index) { + final String tooltipText = _getTooltipText(index); + if (tooltipText != null) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text(tooltipText, + style: model.themeData.textTheme.caption + .copyWith( + color: isLightTheme + ? Color.fromRGBO( + 255, 255, 255, 1) + : Color.fromRGBO( + 10, 10, 10, 1))), + ); + } + return null; + }, + ), + ], + ), + ], + ), + ), + ), + ); + } else { + return Container(); + } + }); + } + + String _getTooltipText(int index) { + if (index == 0) { + return 'Gwydir'; + } else if (index == 1) { + return 'Brisbane'; + } else if (index == 2) { + return 'Swan'; + } else if (index > 2 && index < 6) { + return 'Ord'; + } else if (index == 6 || index == 9) { + return 'Daly'; + } else if (index == 7) { + return 'Staaten'; + } else if (index > 9 && index < 13) { + return 'Lachian'; + } else if (index > 12 && index < 24) { + return null; + } else if (index > 23 && index < 28) { + return 'Macquarie'; + } else if (index == 28) { + return 'Roper'; + } else if (index == 29) { + return 'Burdekin'; + } else if (index > 29 && index < 48) { + return 'Macintyre'; + } else if (index == 48) { + return 'Vectoria'; + } else if (index == 49 || index == 72 || index == 8) { + return 'Fitzroy'; + } else if (index == 50) { + return 'South Esk'; + } else if (index == 51) { + return 'Blackwood'; + } else if (index > 51 && index < 70) { + return 'Barwon'; + } else if (index == 70) { + return 'Darling'; + } else if (index == 71) { + return 'Denvert'; + } else if (index > 73) { + return 'Macintyre'; + } + + return null; + } +} diff --git a/lib/samples/maps/shape_layer/tooltip/tooltip.dart b/lib/samples/maps/shape_layer/tooltip/tooltip.dart index 8dabf7b5..2621c4c5 100644 --- a/lib/samples/maps/shape_layer/tooltip/tooltip.dart +++ b/lib/samples/maps/shape_layer/tooltip/tooltip.dart @@ -1,12 +1,12 @@ ///Flutter package imports import 'package:flutter/material.dart'; -///Map import -import 'package:syncfusion_flutter_maps/maps.dart'; - ///Core theme import import 'package:syncfusion_flutter_core/theme.dart'; +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + ///Local import import '../../../../model/sample_view.dart'; @@ -21,10 +21,10 @@ class _MapTooltipPageState extends SampleViewState { List _riverData; List _rainfallData; - MapShapeLayerDelegate _forestMapDelegate; - MapShapeLayerDelegate _riverMapDelegate; - MapShapeLayerDelegate _rainfallMapDelegate; - MapShapeLayerDelegate _mapDelegate; + MapShapeSource _forestMapSource; + MapShapeSource _riverMapSource; + MapShapeSource _rainfallMapSource; + MapShapeSource _mapSource; Color _bubbleColor; @@ -141,24 +141,24 @@ class _MapTooltipPageState extends SampleViewState { imageSource: 'images/maps_rainfall_2.jpg'), ]; - _forestMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/india.json', + _forestMapSource = MapShapeSource.asset( + 'assets/india.json', shapeDataField: 'name', dataCount: _forestData.length, primaryValueMapper: (index) => _forestData[index].state, bubbleSizeMapper: (index) => _forestData[index].areaInSqKm.toDouble(), ); - _riverMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/india.json', + _riverMapSource = MapShapeSource.asset( + 'assets/india.json', shapeDataField: 'name', dataCount: _riverData.length, primaryValueMapper: (index) => _riverData[index].state, bubbleSizeMapper: (index) => _riverData[index].riversCount, ); - _rainfallMapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/india.json', + _rainfallMapSource = MapShapeSource.asset( + 'assets/india.json', shapeDataField: 'name', dataCount: _rainfallData.length, primaryValueMapper: (index) => _rainfallData[index].state, @@ -183,17 +183,17 @@ class _MapTooltipPageState extends SampleViewState { case 0: _mapTitle = 'Indian States with the Most Forest Area'; _bubbleColor = Color.fromRGBO(34, 205, 72, 0.7); - _mapDelegate = _forestMapDelegate; + _mapSource = _forestMapSource; break; case 1: _mapTitle = 'Indian States with the Most Rivers'; _bubbleColor = Color.fromRGBO(237, 171, 0, 0.7); - _mapDelegate = _riverMapDelegate; + _mapSource = _riverMapSource; break; case 2: _mapTitle = 'Indian States with the Most Rainfall'; _bubbleColor = Color.fromRGBO(24, 152, 207, 0.7); - _mapDelegate = _rainfallMapDelegate; + _mapSource = _rainfallMapSource; break; } } @@ -305,104 +305,89 @@ class _MapTooltipPageState extends SampleViewState { Widget _getMapsWidget(ThemeData themeData) { final bool isLightTheme = themeData.brightness == Brightness.light; - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: model.isWeb ? 0 : 500), () => 'Loaded'), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasData) { - return Stack( - children: [ - Container( - padding: MediaQuery.of(context).orientation == - Orientation.portrait || - model.isWeb - ? EdgeInsets.only( - left: 15, - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.15) - : const EdgeInsets.only(bottom: 75.0), - child: SfMapsTheme( - data: SfMapsThemeData( - shapeHoverColor: Colors.transparent, - shapeHoverStrokeWidth: 0, - shapeHoverStrokeColor: Colors.transparent, - bubbleHoverColor: _bubbleColor.withOpacity(0.4), - bubbleHoverStrokeColor: Colors.black, - bubbleHoverStrokeWidth: 1.0, - ), - child: SfMaps( - title: MapTitle( - text: _mapTitle, - padding: const EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - delegate: _mapDelegate, - - /// This callback returns the custom widget to be shown - /// as the tooltip. The custom widget will be wrapped - /// inside the tooltip. Hence, the nose will still be - /// there. You can customize the stroke around the - /// tooltip if needed. - bubbleTooltipBuilder: - (BuildContext context, int index) { - return _getCustomTooltipWidget( - _getSelectedIndexModel(index), - themeData, - isLightTheme); - }, - showBubbles: true, - enableBubbleTooltip: true, - color: isLightTheme - ? Color.fromRGBO(204, 204, 204, 1) - : Color.fromRGBO(103, 103, 103, 1), - strokeColor: isLightTheme - ? Color.fromRGBO(255, 255, 255, 1) - : Color.fromRGBO(49, 49, 49, 1), - bubbleSettings: MapBubbleSettings( - minRadius: 15, - maxRadius: 30, - color: _bubbleColor, - strokeColor: Colors.black, - strokeWidth: 0.5, - ), - tooltipSettings: MapTooltipSettings( - color: isLightTheme - ? Color.fromRGBO(255, 255, 255, 1) - : Color.fromRGBO(66, 66, 66, 1), - strokeColor: Color.fromRGBO(153, 153, 153, 1), - strokeWidth: 0.5, - ), + return Stack( + children: [ + Container( + padding: MediaQuery.of(context).orientation == Orientation.portrait || + model.isWeb + ? EdgeInsets.only( + left: 15, + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.15) + : const EdgeInsets.only(bottom: 75.0), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Colors.transparent, + shapeHoverStrokeWidth: 0, + shapeHoverStrokeColor: Colors.transparent, + bubbleHoverColor: _bubbleColor.withOpacity(0.4), + bubbleHoverStrokeColor: Colors.black, + bubbleHoverStrokeWidth: 1.0, + ), + child: SfMaps( + title: MapTitle( + _mapTitle, + padding: const EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( + height: 25, + width: 25, + child: const CircularProgressIndicator( + strokeWidth: 3, ), - ], + ); + }, + source: _mapSource, + + /// This callback returns the custom widget to be shown + /// as the tooltip. The custom widget will be wrapped + /// inside the tooltip. Hence, the nose will still be + /// there. You can customize the stroke around the + /// tooltip if needed. + bubbleTooltipBuilder: (BuildContext context, int index) { + return _getCustomTooltipWidget( + _getSelectedIndexModel(index), themeData, isLightTheme); + }, + color: isLightTheme + ? Color.fromRGBO(204, 204, 204, 1) + : Color.fromRGBO(103, 103, 103, 1), + strokeColor: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(49, 49, 49, 1), + bubbleSettings: MapBubbleSettings( + minRadius: 15, + maxRadius: 30, + color: _bubbleColor, + strokeColor: Colors.black, + strokeWidth: 0.5, + ), + tooltipSettings: MapTooltipSettings( + color: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(66, 66, 66, 1), + strokeColor: Color.fromRGBO(153, 153, 153, 1), + strokeWidth: 0.5, ), ), - ), - Align( - alignment: Alignment.bottomCenter, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - _getChipWidget(0, 'Forest'), - _getChipWidget(1, 'River'), - _getChipWidget(2, 'Rainfall'), - ], - ), - ) - ], - ); - } else { - return Center( - child: Container( - height: 25, - width: 25, - child: const CircularProgressIndicator( - strokeWidth: 3, - ), + ], ), - ); - } - }, + ), + ), + Align( + alignment: Alignment.bottomCenter, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + _getChipWidget(0, 'Forest'), + _getChipWidget(1, 'River'), + _getChipWidget(2, 'Rainfall'), + ], + ), + ) + ], ); } } diff --git a/lib/samples/maps/shape_layer/zooming/zooming.dart b/lib/samples/maps/shape_layer/zooming/zooming.dart index c3482265..5dba3e6e 100644 --- a/lib/samples/maps/shape_layer/zooming/zooming.dart +++ b/lib/samples/maps/shape_layer/zooming/zooming.dart @@ -1,18 +1,19 @@ ///Dart import import 'dart:async'; -///Flutter package imports -import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; // ignore: unused_import import 'package:flutter/gestures.dart'; -///Map import -import 'package:syncfusion_flutter_maps/maps.dart'; +///Flutter package imports +import 'package:flutter/material.dart'; ///Core theme import import 'package:syncfusion_flutter_core/theme.dart'; +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + ///Local import import '../../../../model/sample_view.dart'; @@ -25,7 +26,7 @@ class MapZoomingPage extends SampleView { class _MapZoomingPageState extends SampleViewState { final double _markerSize = 24; - MapShapeLayerDelegate _mapDelegate; + MapShapeSource _mapSource; List _dataSource; @@ -87,8 +88,8 @@ class _MapZoomingPageState extends SampleViewState { CountryModel('Venezuela', Color.fromRGBO(141, 208, 203, 1)), ]; - _mapDelegate = MapShapeLayerDelegate( - shapeFile: 'assets/south_america.json', + _mapSource = MapShapeSource.asset( + 'assets/south_america.json', shapeDataField: 'name', dataCount: _dataSource.length, primaryValueMapper: (int index) => _dataSource[index].country, @@ -114,136 +115,83 @@ class _MapZoomingPageState extends SampleViewState { final Color surfaceColor = isLightTheme ? Color.fromRGBO(45, 45, 45, 1) : Color.fromRGBO(242, 242, 242, 1); - return FutureBuilder( - future: Future.delayed( - Duration(milliseconds: kIsWeb ? 0 : 500), - () => 'Loaded', - ), - builder: (BuildContext context, AsyncSnapshot snapshot) { - return snapshot.hasData - ? Container( - padding: MediaQuery.of(context).orientation == - Orientation.portrait || - kIsWeb - ? EdgeInsets.only( - top: MediaQuery.of(context).size.height * 0.05, - bottom: MediaQuery.of(context).size.height * 0.05) - : const EdgeInsets.only(top: 10, bottom: 15), - child: SfMapsTheme( - data: SfMapsThemeData( - shapeHoverColor: Colors.transparent, - shapeHoverStrokeColor: Colors.grey[700], - shapeHoverStrokeWidth: 1.5, - ), - child: SfMaps( - title: MapTitle( - text: 'Tourist Places in South America', - padding: EdgeInsets.only(top: 15, bottom: 30), - ), - layers: [ - MapShapeLayer( - color: Colors.white, - strokeColor: Color.fromRGBO(242, 242, 242, 1), - strokeWidth: 1, - delegate: _mapDelegate, - showDataLabels: true, - dataLabelSettings: MapDataLabelSettings( - overflowMode: MapLabelOverflowMode.trim, - textStyle: TextStyle( - color: Color.fromRGBO(45, 45, 45, 1), - ), - ), - initialMarkersCount: _markerSource.length, - markerBuilder: (BuildContext context, int index) { - /// This key will be used to show the framework's - /// tooltip during interaction. - final GlobalKey tooltipKey = GlobalKey(); - return MapMarker( - latitude: _markerSource[index].latLng.latitude, - longitude: _markerSource[index].latLng.longitude, - size: Size(_markerSize, _markerSize * 2), - child: Column( - children: [ - MouseRegion( - child: GestureDetector( - child: Tooltip( - key: tooltipKey, - message: _markerSource[index].place, - preferBelow: false, - decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(4.0)), - color: surfaceColor, - ), - textStyle: - themeData.textTheme.caption.copyWith( - color: isLightTheme - ? Color.fromRGBO(255, 255, 255, 1) - : Color.fromRGBO(10, 10, 10, 1), - ), - waitDuration: Duration(milliseconds: 0), - child: GestureDetector( - child: Icon( - Icons.location_on, - color: isLightTheme - ? Color.fromRGBO(45, 45, 45, 1) - : Color.fromRGBO(199, 42, 89, 1), - ), - onTap: () { - _showTooltip(tooltipKey); - }, - ), - ), - ), - - /// On hovering the marker, we will show the - /// framework's tooltip to show the details - /// about that place. - onHover: (PointerHoverEvent event) { - _showTooltip(tooltipKey); - }, - ), - SizedBox( - height: _markerSize, - ), - ], - ), - ); - }, - - /// Adding `zoomPanBehavior` will enable the zooming and - /// panning in the shape layer. - zoomPanBehavior: _zoomPanBehavior, - ), - ], - ), - ), - ) - : Center( - child: Container( + return Container( + padding: + MediaQuery.of(context).orientation == Orientation.portrait || kIsWeb + ? EdgeInsets.only( + top: MediaQuery.of(context).size.height * 0.05, + bottom: MediaQuery.of(context).size.height * 0.05) + : const EdgeInsets.only(top: 10, bottom: 15), + child: SfMapsTheme( + data: SfMapsThemeData( + shapeHoverColor: Colors.transparent, + shapeHoverStrokeColor: Colors.grey[700], + shapeHoverStrokeWidth: 1.5, + ), + child: SfMaps( + title: MapTitle( + 'Tourist Places in South America', + padding: EdgeInsets.only(top: 15, bottom: 30), + ), + layers: [ + MapShapeLayer( + loadingBuilder: (BuildContext context) { + return Container( height: 25, width: 25, child: const CircularProgressIndicator( strokeWidth: 3, ), + ); + }, + color: Colors.white, + strokeColor: Color.fromRGBO(242, 242, 242, 1), + strokeWidth: 1, + source: _mapSource, + showDataLabels: true, + dataLabelSettings: MapDataLabelSettings( + overflowMode: MapLabelOverflow.ellipsis, + textStyle: TextStyle( + color: Color.fromRGBO(45, 45, 45, 1), ), - ); - }, + ), + tooltipSettings: MapTooltipSettings( + color: surfaceColor, + ), + initialMarkersCount: _markerSource.length, + markerTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text(_markerSource[index].place, + style: themeData.textTheme.caption.copyWith( + color: isLightTheme + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(10, 10, 10, 1))), + ); + }, + markerBuilder: (BuildContext context, int index) { + return MapMarker( + latitude: _markerSource[index].latLng.latitude, + longitude: _markerSource[index].latLng.longitude, + size: Size(_markerSize, _markerSize * 2), + child: Icon( + Icons.location_on, + color: isLightTheme + ? Color.fromRGBO(45, 45, 45, 1) + : Color.fromRGBO(199, 42, 89, 1), + ), + ); + }, + + /// Adding `zoomPanBehavior` will enable the zooming and + /// panning in the shape layer. + zoomPanBehavior: _zoomPanBehavior, + ), + ], + ), + ), ); } - - void _showTooltip(GlobalKey tooltipKey) { - _tooltipTimer?.cancel(); - _tooltipTimer = - Timer(const Duration(seconds: 3), () => _hideTooltip(tooltipKey)); - final dynamic tooltipState = tooltipKey.currentState; - tooltipState.ensureTooltipVisible(); - } - - void _hideTooltip(GlobalKey tooltipKey) { - final dynamic tooltipState = tooltipKey.currentState; - tooltipState.deactivate(); - } } class TouristPlaceModel { diff --git a/lib/samples/maps/tile_layer/osm/osm.dart b/lib/samples/maps/tile_layer/osm/osm.dart index 450021e2..b375f807 100644 --- a/lib/samples/maps/tile_layer/osm/osm.dart +++ b/lib/samples/maps/tile_layer/osm/osm.dart @@ -28,6 +28,7 @@ class _TileLayerSampleState extends SampleViewState { double _cardHeight; bool _canUpdateFocalLatLng; + bool _isDesktop; @override void initState() { @@ -39,71 +40,84 @@ class _TileLayerSampleState extends SampleViewState { _data.add(WorldWonderModel( place: 'Chichen Itza', + state: 'Yucatan', country: 'Mexico', latitude: 20.6843, longitude: -88.5678, description: 'Mayan ruins on Mexico\'s Yucatan Peninsula. It was one of the largest Maya cities, thriving from around A.D. 600 to 1200.', - imagePath: 'images/maps_chichen_itza.jpg')); + imagePath: 'images/maps_chichen_itza.jpg', + tooltipImagePath: 'images/maps-chichen-itza.jpg')); _data.add(WorldWonderModel( place: 'Machu Picchu', + state: 'Cuzco', country: 'Peru', latitude: -13.1631, longitude: -72.5450, description: 'An Inca citadel built in the mid-1400s. It was not widely known until the early twentieth century.', - imagePath: 'images/maps_machu_pichu.jpg')); + imagePath: 'images/maps_machu_pichu.jpg', + tooltipImagePath: 'images/maps-machu-picchu.jpg')); _data.add(WorldWonderModel( place: 'Christ the Redeemer', + state: 'Rio de Janeiro', country: 'Brazil', latitude: -22.9519, longitude: -43.2105, description: 'An enormous statue of Jesus Christ with open arms, constructed between 1922 and 1931.', - imagePath: 'images/maps_christ_redeemer.jpg')); + imagePath: 'images/maps_christ_redeemer.jpg', + tooltipImagePath: 'images/maps-christ-the-redeemer.jpg')); _data.add(WorldWonderModel( place: 'Colosseum', + state: 'Regio III Isis et Serapis', country: 'Rome', latitude: 41.8902, longitude: 12.4922, description: 'Built between A.D. 70 and 80, it could accommodate 50,000 to 80,000 people in tiered seating. It is one of the most popular tourist attractions in Europe.', - imagePath: 'images/maps_colosseum.jpg')); + imagePath: 'images/maps_colosseum.jpg', + tooltipImagePath: 'images/maps-colosseum.jpg')); _data.add(WorldWonderModel( place: 'Petra', + state: 'Ma\'an Governorate', country: 'Jordan', latitude: 30.3285, longitude: 35.4444, description: 'An ancient stone city located in southern Jordan. It became the capital city for the Nabataeans around the fourth century BC.', - imagePath: 'images/maps_petra.jpg')); + imagePath: 'images/maps_petra.jpg', + tooltipImagePath: 'images/maps-petra.jpg')); _data.add(WorldWonderModel( place: 'Taj Mahal', + state: 'Uttar Pradesh', country: 'India', latitude: 27.1751, longitude: 78.0421, description: 'A white marble mausoleum in Agra, India. It was commissioned in A.D. 1632 by the Mughal emperor Shah Jahan to hold the remains of his favorite wife. It was completed in 1653.', - imagePath: 'images/maps_taj_mahal.jpg')); + imagePath: 'images/maps_taj_mahal.jpg', + tooltipImagePath: 'images/maps-tajmahal.jpg')); _data.add(WorldWonderModel( place: 'Great Wall of China', + state: 'Beijing', country: 'China', latitude: 40.4319, longitude: 116.5704, description: 'A series of walls and fortifications built along the northern border of China to protect Chinese states from invaders. Counting all of its offshoots, its length is more than 13,000 miles.', - imagePath: 'images/maps_great_wall_of_china.jpg')); + imagePath: 'images/maps_great_wall_of_china.jpg', + tooltipImagePath: 'images/maps-great-wall-of-china.png')); _zoomPanBehavior = MapZoomPanBehavior( minZoomLevel: 3, maxZoomLevel: 10, - zoomLevel: model.isWeb ? 5 : 4, focalLatLng: MapLatLng(_data[_currentSelectedIndex].latitude, _data[_currentSelectedIndex].longitude), ); @@ -119,14 +133,19 @@ class _TileLayerSampleState extends SampleViewState { @override Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + _isDesktop = model.isWeb || + themeData.platform == TargetPlatform.macOS || + themeData.platform == TargetPlatform.windows; + _zoomPanBehavior.zoomLevel = _isDesktop ? 5 : 4; _cardHeight = (MediaQuery.of(context).orientation == Orientation.landscape) - ? (model.isWeb ? 120 : 90) + ? (_isDesktop ? 120 : 90) : 110; _pageViewController = PageController( initialPage: _currentSelectedIndex, viewportFraction: (MediaQuery.of(context).orientation == Orientation.landscape) - ? (model.isWeb ? 0.5 : 0.7) + ? (_isDesktop ? 0.5 : 0.7) : 0.8); return Stack( children: [ @@ -150,6 +169,59 @@ class _TileLayerSampleState extends SampleViewState { zoomPanBehavior: _zoomPanBehavior, controller: _mapController, initialMarkersCount: _data.length, + tooltipSettings: MapTooltipSettings( + color: Colors.transparent, + ), + markerTooltipBuilder: (BuildContext context, int index) { + if (_isDesktop) { + return Container( + width: 150, + height: 130, + child: ClipRRect( + borderRadius: BorderRadius.all(Radius.circular(8)), + child: Column(children: [ + Container( + width: 150, + height: 80, + child: Image.asset( + _data[index].tooltipImagePath, + fit: BoxFit.fill, + ), + ), + Container( + padding: const EdgeInsets.only( + left: 10.0, top: 5.0, bottom: 5.0), + width: 150, + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + _data[index].place, + style: TextStyle( + fontSize: 14, + color: Colors.black, + fontWeight: FontWeight.bold), + ), + Padding( + padding: const EdgeInsets.only(top: 5.0), + child: Text( + _data[index].state + + ', ' + + _data[index].country, + style: TextStyle( + fontSize: 10, color: Colors.black), + ), + ) + ]), + ), + ]), + ), + ); + } + + return null; + }, markerBuilder: (BuildContext context, int index) { return MapMarker( latitude: _data[index].latitude, @@ -233,8 +305,8 @@ class _TileLayerSampleState extends SampleViewState { Expanded( child: Text( item.description, - style: TextStyle( - fontSize: model.isWeb ? 14 : 11), + style: + TextStyle(fontSize: _isDesktop ? 14 : 11), overflow: TextOverflow.ellipsis, maxLines: (index == 2 || index == 6) ? 2 : 4, )) @@ -322,16 +394,20 @@ class _TileLayerSampleState extends SampleViewState { class WorldWonderModel { const WorldWonderModel( {this.place, + this.state, this.country, this.imagePath, this.latitude, this.longitude, - this.description}); + this.description, + this.tooltipImagePath}); final String place; + final String state; final String country; final double latitude; final double longitude; final String description; final String imagePath; + final String tooltipImagePath; } diff --git a/lib/samples/maps/tile_layer/vector_layer/arcs.dart b/lib/samples/maps/tile_layer/vector_layer/arcs.dart new file mode 100644 index 00000000..4c25f9e2 --- /dev/null +++ b/lib/samples/maps/tile_layer/vector_layer/arcs.dart @@ -0,0 +1,634 @@ +/// Flutter package imports +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/rendering.dart'; + +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +class MapArcsPage extends SampleView { + const MapArcsPage(Key key) : super(key: key); + _ArcsSampleState createState() => _ArcsSampleState(); +} + +class _ArcsSampleState extends SampleViewState + with SingleTickerProviderStateMixin { + List _airportData; + List _markerData; + MapZoomPanBehavior _zoomPanBehavior; + MapTileLayerController _mapController; + AnimationController _animationController; + Animation _animation; + int _selectedLineIndex; + int _currentSelectedCityIndex = 0; + bool _isDesktop = false; + bool _enableDashArray = false; + bool _canUpdateZoomLevel; + List> _dropDownMenuItems; + String _currentSublayer; + Color _layerColor; + + @override + void initState() { + _mapController = MapTileLayerController(); + + _zoomPanBehavior = MapZoomPanBehavior( + focalLatLng: MapLatLng(40.7128, -74.0060), + toolbarSettings: MapToolbarSettings( + direction: Axis.vertical, position: MapToolbarPosition.bottomRight), + ); + + _setNavigationLineData(_currentSelectedCityIndex); + + _dropDownMenuItems = _getDropDownMenuItems(); + _currentSublayer = _dropDownMenuItems[0].value; + _canUpdateZoomLevel = true; + + _animationController = AnimationController( + duration: Duration(seconds: 2), + vsync: this, + ); + + _animation = CurvedAnimation( + parent: _animationController, + curve: Curves.linear, + ); + _animationController.forward(from: 0); + + super.initState(); + } + + @override + void dispose() { + _animationController?.dispose(); + _mapController?.dispose(); + _markerData?.clear(); + _airportData?.clear(); + super.dispose(); + } + + void _setNavigationLineData(int index) { + switch (index) { + case 0: + _layerColor = Color.fromRGBO(167, 61, 233, 1.0); + _markerData = [ + MarkerData('New York', MapLatLng(40.7128, -74.0060)), + MarkerData('Denver', MapLatLng(39.7392, -104.9903)), + MarkerData('Bogata', MapLatLng(4.7110, -74.0721)), + MarkerData('Calgary', MapLatLng(51.0447, -114.0719)), + MarkerData('Tashkent', MapLatLng(41.2995, 69.2401)), + MarkerData('Dakar', MapLatLng(14.7167, -17.4677)), + MarkerData('Casablanca', MapLatLng(33.3700, -7.5857)), + MarkerData('Houston', MapLatLng(29.7604, -95.3698)), + MarkerData('Edmonton', MapLatLng(53.5461, -113.4938)), + MarkerData('Panama City', MapLatLng(8.9824, -79.5199)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(4.7110, -74.0721), 'New York - Bogata'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(51.0447, -114.0719), 'New York - Calgary'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(41.2995, 69.2401), 'New York - Tashkent'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(14.7167, -17.4677), 'New York - Dakar'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(33.3700, -7.5857), 'New York - Casablanca'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(29.7604, -95.3698), 'New York - Houston'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(53.5461, -113.4938), 'New York - Edmonton'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(8.9824, -79.5199), 'New York - Panama City'), + AirRouteModel(MapLatLng(40.7128, -74.0060), + MapLatLng(39.7392, -104.9903), 'New york - Denver'), + ]; + _updateMarkers(); + break; + + case 1: + _layerColor = Color.fromRGBO(65, 72, 22, 1.0); + _markerData = [ + MarkerData('Denver', MapLatLng(39.7392, -104.9903)), + MarkerData('New York', MapLatLng(40.7128, -74.0060)), + MarkerData('Calgary', MapLatLng(51.0447, -114.0719)), + MarkerData('Edmonton', MapLatLng(53.5461, -113.4938)), + MarkerData('Paris', MapLatLng(48.8566, 2.3522)), + MarkerData('Panama City', MapLatLng(8.9824, -79.5199)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(39.7392, -104.9903), + MapLatLng(53.5461, -113.4938), 'Denver - Edmonton'), + AirRouteModel(MapLatLng(39.7392, -104.9903), + MapLatLng(51.0447, -114.0719), 'Denver - Calgary'), + AirRouteModel(MapLatLng(39.7392, -104.9903), + MapLatLng(40.7128, -74.0060), 'Denver - New York'), + AirRouteModel(MapLatLng(39.7392, -104.9903), + MapLatLng(48.8566, 2.3522), 'Denver - Paris'), + AirRouteModel(MapLatLng(39.7392, -104.9903), + MapLatLng(8.9824, -79.5199), 'Denver - Panama City'), + ]; + _updateMarkers(); + break; + + case 2: + _layerColor = Color.fromRGBO(12, 152, 34, 1.0); + _markerData = [ + MarkerData('London', MapLatLng(51.4700, 0.4543)), + MarkerData('Bogata', MapLatLng(4.7110, -74.0721)), + MarkerData('Calgary', MapLatLng(51.0447, -114.0719)), + MarkerData('Moscow', MapLatLng(55.7558, 37.6173)), + MarkerData('Riyath', MapLatLng(24.7136, 46.6753)), + MarkerData('Seoul', MapLatLng(37.5665, 126.9780)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(51.4700, 0.4543), + MapLatLng(51.0447, -114.0719), 'London - Calgary'), + AirRouteModel(MapLatLng(51.4700, 0.4543), MapLatLng(4.7110, -74.0721), + 'London - Bogata'), + AirRouteModel(MapLatLng(51.4700, 0.4543), MapLatLng(55.7558, 37.6173), + 'London - Moscow'), + AirRouteModel(MapLatLng(51.4700, 0.4543), MapLatLng(24.7136, 46.6753), + 'London - Riyath'), + AirRouteModel(MapLatLng(51.4700, 0.4543), + MapLatLng(37.5665, 126.9780), 'London - Seoul'), + ]; + _updateMarkers(); + break; + + case 3: + _layerColor = Color.fromRGBO(226, 75, 65, 1.0); + _markerData = [ + MarkerData('Dublin', MapLatLng(53.3498, -6.2603)), + MarkerData('New York', MapLatLng(40.7128, -74.0060)), + MarkerData('Hong Kong', MapLatLng(22.3193, 114.1694)), + MarkerData('Calgary', MapLatLng(51.0447, -114.0719)), + MarkerData('Addis Abada', MapLatLng(8.9806, 38.7578)), + MarkerData('Helsinki', MapLatLng(60.1699, 24.9384)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(53.3498, -6.2603), + MapLatLng(22.3193, 114.1694), 'Dublin - Hong Kong'), + AirRouteModel(MapLatLng(53.3498, -6.2603), MapLatLng(8.9806, 38.7578), + 'Dublin - Addis Abada'), + AirRouteModel(MapLatLng(53.3498, -6.2603), + MapLatLng(60.1699, 24.9384), 'Dublin - Helsinki'), + AirRouteModel(MapLatLng(53.3498, -6.2603), + MapLatLng(40.7128, -74.0060), 'Dublin - New York'), + AirRouteModel(MapLatLng(53.3498, -6.2603), + MapLatLng(51.0447, -114.0719), 'Dublin - Calgary'), + ]; + _updateMarkers(); + break; + + case 4: + _layerColor = Color.fromRGBO(108, 27, 212, 1.0); + _markerData = [ + MarkerData('Beijing', MapLatLng(39.9042, 116.4074)), + MarkerData('Seoul', MapLatLng(37.5665, 126.9780)), + MarkerData('Islamabad', MapLatLng(33.6844, 73.0479)), + MarkerData('Addis Abada', MapLatLng(8.9806, 38.7578)), + MarkerData('Tokyo', MapLatLng(35.6762, 139.6503)), + MarkerData('Helsinki', MapLatLng(60.1699, 24.9384)), + MarkerData('Korla', MapLatLng(41.7259, 86.1746)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(33.6844, 73.0479), 'Beijing - Islamabad'), + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(8.9806, 38.7578), 'Beijing - Addis Abada'), + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(35.6762, 139.6503), 'Beijing - Tokyo'), + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(60.1699, 24.9384), 'Beijing - Helsinki'), + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(41.7259, 86.1746), 'Beijing - Korla'), + AirRouteModel(MapLatLng(39.9042, 116.4074), + MapLatLng(37.5665, 126.9780), 'Beijing - Seoul'), + ]; + _updateMarkers(); + break; + case 5: + _layerColor = Color.fromRGBO(236, 40, 134, 1.0); + _markerData = [ + MarkerData('Delhi', MapLatLng(28.7041, 77.1025)), + MarkerData('London', MapLatLng(51.4700, 0.4543)), + MarkerData('Beijing', MapLatLng(39.9042, 116.4074)), + MarkerData('Chennai', MapLatLng(13.0827, 80.2707)), + MarkerData('New York', MapLatLng(40.7128, -74.0060)), + MarkerData('Sydney', MapLatLng(-33.8688, 151.2093)), + MarkerData('Mumbai', MapLatLng(19.0931, 72.8568)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(28.7041, 77.1025), MapLatLng(51.4700, 0.4543), + 'Delhi - London'), + AirRouteModel(MapLatLng(28.7041, 77.1025), + MapLatLng(40.7128, -74.0060), 'Delhi - New York'), + AirRouteModel(MapLatLng(28.7041, 77.1025), + MapLatLng(-33.8688, 151.2093), 'Delhi - Sydney'), + AirRouteModel(MapLatLng(28.7041, 77.1025), + MapLatLng(39.9042, 116.4074), 'Delhi - Beijing'), + AirRouteModel(MapLatLng(28.7041, 77.1025), + MapLatLng(13.0827, 80.2707), 'Delhi - Chennai'), + AirRouteModel(MapLatLng(28.7041, 77.1025), + MapLatLng(19.0931, 72.8568), 'Delhi - Mumbai'), + ]; + _updateMarkers(); + break; + case 6: + _layerColor = Color.fromRGBO(2, 130, 122, 1.0); + _markerData = [ + MarkerData('Chennai', MapLatLng(13.0827, 80.2707)), + MarkerData('London', MapLatLng(51.4700, 0.4543)), + MarkerData('Delhi', MapLatLng(28.7041, 77.1025)), + MarkerData('Riyath', MapLatLng(24.7136, 46.6753)), + MarkerData('Tokyo', MapLatLng(35.6762, 139.6503)), + MarkerData('Singapore', MapLatLng(1.3521, 103.8198)), + MarkerData('Addis Abada', MapLatLng(8.9806, 38.7578)), + ]; + + _airportData = [ + AirRouteModel(MapLatLng(13.0827, 80.2707), + MapLatLng(51.507351, -0.127758), 'Chennai - London'), + AirRouteModel(MapLatLng(13.0827, 80.2707), + MapLatLng(35.6762, 139.6503), 'Chennai - Tokyo'), + AirRouteModel(MapLatLng(13.0827, 80.2707), MapLatLng(8.9806, 38.7578), + 'Chennai - Addis Abada'), + AirRouteModel(MapLatLng(13.0827, 80.2707), + MapLatLng(24.7136, 46.6753), 'Chennai - Riyath'), + AirRouteModel(MapLatLng(13.0827, 80.2707), + MapLatLng(1.3521, 103.8198), 'Chennai - Singapore'), + AirRouteModel(MapLatLng(13.0827, 80.2707), + MapLatLng(28.7041, 77.1025), 'Chennai - Delhi'), + ]; + _updateMarkers(); + break; + } + } + + void _updateMarkers() { + _mapController.clearMarkers(); + for (int i = 0; i < _markerData.length; i++) { + _mapController.insertMarker(i); + } + } + + List> _getDropDownMenuItems() { + List> sublayerItems = List() + ..add(DropdownMenuItem(value: 'Arcs', child: Text('Arcs'))) + ..add(DropdownMenuItem(value: 'Lines', child: Text('Lines'))); + return sublayerItems; + } + + MapSublayer _getCurrentSublayer(_currentLegend) { + if (_currentLegend == 'Arcs') { + return MapArcLayer( + arcs: List.generate( + _airportData.length, + (int index) { + bool isSelected = _selectedLineIndex == index; + return MapArc( + from: _airportData[index].from, + to: _airportData[index].to, + dashArray: _enableDashArray ? [8, 3] : [0, 0], + heightFactor: index == 5 && + _airportData[index].to == MapLatLng(13.0827, 80.2707) + ? 0.5 + : 0.2, + color: isSelected ? Colors.blue : _layerColor, + width: 2.0, + onTap: () { + setState(() { + _selectedLineIndex = index; + _canUpdateZoomLevel = false; + }); + }, + ); + }, + ).toSet(), + animation: _animation, + tooltipBuilder: _tooltipBuilder, + ); + } else { + return MapLineLayer( + lines: List.generate( + _airportData.length, + (int index) { + bool isSelected = _selectedLineIndex == index; + return MapLine( + from: _airportData[index].from, + to: _airportData[index].to, + dashArray: _enableDashArray ? [8, 3] : [0, 0], + color: isSelected ? Colors.blue : _layerColor, + width: 2.0, + onTap: () { + setState(() { + _selectedLineIndex = index; + _canUpdateZoomLevel = false; + }); + }, + ); + }, + ).toSet(), + animation: _animation, + tooltipBuilder: _tooltipBuilder, + ); + } + } + + Widget _tooltipBuilder(BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(left: 5.0, right: 5.0, top: 5.0), + child: Container( + height: _isDesktop ? 45 : 40, + child: Column( + children: [ + Text('Route', + style: Theme.of(context).textTheme.caption.copyWith( + fontWeight: FontWeight.bold, + color: Color.fromRGBO(255, 255, 255, 1))), + Padding( + padding: EdgeInsets.only(top: 5.0), + child: Text(_airportData[index].destination, + style: Theme.of(context) + .textTheme + .caption + .copyWith(color: Color.fromRGBO(255, 255, 255, 1))), + ), + ], + ), + ), + ); + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + _isDesktop = kIsWeb || + themeData.platform == TargetPlatform.macOS || + themeData.platform == TargetPlatform.windows; + if (_canUpdateZoomLevel) { + _zoomPanBehavior.zoomLevel = _isDesktop ? 4 : 3; + _zoomPanBehavior.minZoomLevel = _isDesktop ? 4 : 3; + } + + return Stack(children: [ + Positioned.fill( + child: Image.asset( + 'images/maps_grid.png', + repeat: ImageRepeat.repeat, + ), + ), + SfMaps( + layers: [ + MapTileLayer( + urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + initialMarkersCount: _markerData.length, + zoomPanBehavior: _zoomPanBehavior, + controller: _mapController, + markerBuilder: (BuildContext context, int index) { + return MapMarker( + latitude: _markerData[index].latLan.latitude, + longitude: _markerData[index].latLan.longitude, + child: index == 0 + ? BlowingCircle(color: _layerColor) + : Icon(Icons.circle, color: _layerColor, size: 15), + ); + }, + markerTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text(_markerData[index].country, + style: model.themeData.textTheme.caption + .copyWith(color: Color.fromRGBO(255, 255, 255, 1))), + ); + }, + tooltipSettings: MapTooltipSettings( + color: Color.fromRGBO(45, 45, 45, 1), + ), + sublayers: [_getCurrentSublayer(_currentSublayer)], + ), + ], + ), + Align( + alignment: Alignment.topCenter, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + _getChipWidget(0, 'New York'), + _getChipWidget(1, 'Denver'), + _getChipWidget(2, 'London'), + _getChipWidget(3, 'Dublin'), + _getChipWidget(4, 'Beijing'), + _getChipWidget(5, 'Delhi'), + _getChipWidget(6, 'Chennai'), + ], + ), + ), + ) + ]); + } + + Widget _getChipWidget(int index, String city) { + return Padding( + padding: _isDesktop + ? const EdgeInsets.only(left: 8.0, top: 8.0) + : const EdgeInsets.only(left: 8.0), + child: ChoiceChip( + backgroundColor: model?.themeData?.brightness == Brightness.light + ? Colors.white + : Colors.black, + elevation: 3.0, + label: Text( + city, + style: TextStyle( + color: model.textColor, + ), + ), + selected: _currentSelectedCityIndex == index, + onSelected: (bool isSelected) { + if (isSelected) { + setState(() { + _currentSelectedCityIndex = index; + _setNavigationLineData(_currentSelectedCityIndex); + _zoomPanBehavior.focalLatLng = _markerData[0].latLan; + _selectedLineIndex = null; + _canUpdateZoomLevel = false; + _animationController.forward(from: 0); + }); + } + }, + ), + ); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return SingleChildScrollView( + child: Container( + height: 110, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Layer type", + style: TextStyle( + color: model.textColor, + fontSize: 16, + ), + ), + Padding( + padding: EdgeInsets.only(right: 15.0), + child: DropdownButton( + value: _currentSublayer, + items: _dropDownMenuItems, + onChanged: (String value) { + setState(() { + _currentSublayer = value; + _canUpdateZoomLevel = false; + }); + stateSetter(() {}); + }, + )) + ], + ), + Row( + children: [ + Expanded( + child: Text( + 'Show dashes', + style: TextStyle( + color: model.textColor, + fontSize: 16, + ), + ), + ), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableDashArray, + onChanged: (bool value) { + setState(() { + _enableDashArray = value; + _canUpdateZoomLevel = false; + }); + stateSetter(() {}); + })), + ], + ), + ], + ))); + }); + } +} + +class MarkerData { + MarkerData(this.country, this.latLan); + + String country; + MapLatLng latLan; +} + +class AirRouteModel { + AirRouteModel(this.from, this.to, this.destination); + + MapLatLng from; + MapLatLng to; + String destination; +} + +class BlowingCircleCustomPaint extends CustomPainter { + BlowingCircleCustomPaint( + {this.iconColor, this.iconSize, this.animationValue}); + + final Color iconColor; + + final Size iconSize; + + final double animationValue; + + @override + void paint(Canvas canvas, Size size) { + final double halfWidth = iconSize.width / 2; + final Offset center = Offset(0.0, 0.0); + final Paint paint = Paint() + ..isAntiAlias = true + ..color = iconColor; + canvas.drawCircle(center, halfWidth, paint); + canvas.drawCircle(center, halfWidth + halfWidth * 2 * animationValue, + paint..color = iconColor.withOpacity(1 - animationValue)); + } + + @override + bool shouldRepaint(BlowingCircleCustomPaint oldDelegate) => true; +} + +class BlowingCircle extends StatefulWidget { + const BlowingCircle({ + Key key, + this.color, + }) : super(key: key); + + final Color color; + @override + _BlowingCircleState createState() => _BlowingCircleState(); +} + +class _BlowingCircleState extends State + with SingleTickerProviderStateMixin { + AnimationController _controller; + Animation _animation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: Duration( + milliseconds: 1000, + ), + ); + + _animation = CurvedAnimation( + curve: Curves.fastOutSlowIn, + parent: _controller, + )..addListener(() { + setState(() {}); + }); + + _controller.repeat(); + } + + @override + void dispose() { + _controller.stop(); + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return CustomPaint( + painter: BlowingCircleCustomPaint( + iconColor: widget.color, + iconSize: Size(15.0, 15.0), + animationValue: _animation.value), + ); + } +} diff --git a/lib/samples/maps/tile_layer/vector_layer/polylines.dart b/lib/samples/maps/tile_layer/vector_layer/polylines.dart new file mode 100644 index 00000000..dffcaafa --- /dev/null +++ b/lib/samples/maps/tile_layer/vector_layer/polylines.dart @@ -0,0 +1,282 @@ +/// Flutter package imports +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart' show kIsWeb; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; + +///Map import +import 'package:syncfusion_flutter_maps/maps.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +class MapPolylinesPage extends SampleView { + const MapPolylinesPage(Key key) : super(key: key); + _PolylinesSampleState createState() => _PolylinesSampleState(); +} + +class _PolylinesSampleState extends SampleViewState + with SingleTickerProviderStateMixin { + MapZoomPanBehavior _zoomPanBehavior; + MapTileLayerController _mapController; + AnimationController _animationController; + Animation _animation; + bool _isDesktop; + List _markerData; + int _currentSelectedCityIndex = 0; + String _routeJson; + + @override + void initState() { + _routeJson = 'assets/london_to_british.json'; + _markerData = [ + MarkerData(MapLatLng(51.4700, -0.4543), null, 'London Heathrow'), + MarkerData( + MapLatLng(51.5194, -0.1270), + Icon(Icons.location_on, color: Colors.red[600], size: 30), + 'The British Museum'), + ]; + _mapController = MapTileLayerController(); + _zoomPanBehavior = MapZoomPanBehavior( + minZoomLevel: 3, + zoomLevel: 10, + focalLatLng: MapLatLng(51.4700, -0.2843), + toolbarSettings: MapToolbarSettings( + direction: Axis.vertical, position: MapToolbarPosition.bottomRight), + maxZoomLevel: 15); + + _animationController = AnimationController( + duration: Duration(seconds: 3), + vsync: this, + ); + + _animation = CurvedAnimation( + parent: _animationController, + curve: Curves.easeInOut, + ); + super.initState(); + } + + @override + void dispose() { + _animationController?.dispose(); + _mapController?.dispose(); + _markerData?.clear(); + super.dispose(); + } + + Future getJsonData() async { + List polyline = []; + String data = await rootBundle.loadString(_routeJson); + dynamic jsonData = json.decode(data); + List polylinePoints = + jsonData['features'][0]['geometry']['coordinates']; + for (int i = 0; i < polylinePoints.length; i++) { + polyline.add(MapLatLng(polylinePoints[i][1], polylinePoints[i][0])); + } + _animationController.forward(from: 0); + + return polyline; + } + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + _isDesktop = kIsWeb || + themeData.platform == TargetPlatform.macOS || + themeData.platform == TargetPlatform.windows; + return FutureBuilder( + future: getJsonData(), + builder: (BuildContext context, AsyncSnapshot snapdata) { + if (snapdata.hasData) { + final List polylinePoints = snapdata.data; + return Stack(children: [ + Positioned.fill( + child: Image.asset( + 'images/maps_grid.png', + repeat: ImageRepeat.repeat, + ), + ), + SfMaps( + layers: [ + MapTileLayer( + urlTemplate: + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + initialMarkersCount: _markerData.length, + controller: _mapController, + markerBuilder: (BuildContext context, int index) { + if (_markerData[index].icon != null) { + return MapMarker( + key: UniqueKey(), + latitude: _markerData[index].latLan.latitude, + longitude: _markerData[index].latLan.longitude, + child: _markerData[index].icon, + ); + } else { + return MapMarker( + key: UniqueKey(), + latitude: _markerData[index].latLan.latitude, + longitude: _markerData[index].latLan.longitude, + iconType: MapIconType.circle, + iconColor: Colors.white, + iconStrokeWidth: 2.0, + size: Size(15, 15), + iconStrokeColor: Colors.black, + ); + } + }, + tooltipSettings: MapTooltipSettings( + color: Color.fromRGBO(45, 45, 45, 1), + ), + markerTooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text(_markerData[index].city, + style: model.themeData.textTheme.caption.copyWith( + color: Color.fromRGBO(255, 255, 255, 1))), + ); + }, + sublayers: [ + MapPolylineLayer( + polylines: [ + MapPolyline( + points: polylinePoints, + color: Color.fromRGBO(0, 102, 255, 1.0), + width: 6.0, + ) + ].toSet(), + animation: _animation, + tooltipBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + _markerData[0].city + + ' - ' + + _markerData[1].city, + style: model.themeData.textTheme.caption + .copyWith( + color: Color.fromRGBO( + 255, 255, 255, 1))), + ); + }), + ], + zoomPanBehavior: _zoomPanBehavior, + ), + ], + ), + Align( + alignment: Alignment.topCenter, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + _getChipWidget(0, 'The British Museum'), + _getChipWidget(1, 'The Windsor Castle'), + _getChipWidget(2, 'Twickenham Stadium'), + _getChipWidget(3, 'Chessington World of Adventures'), + _getChipWidget(4, 'Hampton Court Palace'), + ], + ), + ), + ) + ]); + } else { + return Container(); + } + }); + } + + Widget _getChipWidget(int index, String city) { + return Padding( + padding: _isDesktop + ? const EdgeInsets.only(left: 8.0, top: 8.0) + : const EdgeInsets.only(left: 8.0), + child: ChoiceChip( + backgroundColor: model?.themeData?.brightness == Brightness.light + ? Colors.white + : Colors.black, + elevation: 3.0, + label: Text( + city, + style: TextStyle( + color: model.textColor, + ), + ), + selected: _currentSelectedCityIndex == index, + onSelected: (bool isSelected) { + if (isSelected) { + setState(() { + _currentSelectedCityIndex = index; + _currentNavigationLine(index, city); + }); + } + }, + ), + ); + } + + void _currentNavigationLine(int index, String city) { + switch (index) { + case 0: + setState(() { + _routeJson = 'assets/london_to_british.json'; + _zoomPanBehavior.focalLatLng = MapLatLng(51.4700, -0.2843); + _zoomPanBehavior.zoomLevel = 10; + _markerData[1] = MarkerData(MapLatLng(51.5194, -0.1270), + Icon(Icons.location_on, color: Colors.red[600], size: 30), city); + _mapController.updateMarkers([1]); + }); + break; + case 1: + setState(() { + _routeJson = 'assets/london_to_windsor_castle.json'; + _zoomPanBehavior.focalLatLng = MapLatLng(51.4700, -0.5443); + _zoomPanBehavior.zoomLevel = 11; + _markerData[1] = MarkerData(MapLatLng(51.4839, -0.6044), + Icon(Icons.location_on, color: Colors.red[600], size: 30), city); + _mapController.updateMarkers([1]); + }); + break; + case 2: + setState(() { + _routeJson = 'assets/london_to_twickenham_stadium.json'; + _zoomPanBehavior.focalLatLng = MapLatLng(51.4700, -0.3843); + _zoomPanBehavior.zoomLevel = 11; + _markerData[1] = MarkerData(MapLatLng(51.4560, -0.3415), + Icon(Icons.location_on, color: Colors.red[600], size: 30), city); + _mapController.updateMarkers([1]); + }); + break; + case 3: + setState(() { + _routeJson = 'assets/london_to_chessington.json'; + _zoomPanBehavior.focalLatLng = MapLatLng(51.4050, -0.4300); + _zoomPanBehavior.zoomLevel = 10; + _markerData[1] = MarkerData(MapLatLng(51.3472, -0.3192), + Icon(Icons.location_on, color: Colors.red[600], size: 30), city); + _mapController.updateMarkers([1]); + }); + break; + case 4: + setState(() { + _routeJson = 'assets/london_to_hampton_court_palace.json'; + _zoomPanBehavior.focalLatLng = MapLatLng(51.4500, -0.4393); + _zoomPanBehavior.zoomLevel = 11; + _markerData[1] = MarkerData(MapLatLng(51.4036, -0.3378), + Icon(Icons.location_on, color: Colors.red[600], size: 30), city); + _mapController.updateMarkers([1]); + }); + break; + } + } +} + +class MarkerData { + MarkerData(this.latLan, this.icon, this.city); + + MapLatLng latLan; + Widget icon; + String city; +} diff --git a/lib/samples/pdf/annotations/annotations.dart b/lib/samples/pdf/annotations.dart similarity index 94% rename from lib/samples/pdf/annotations/annotations.dart rename to lib/samples/pdf/annotations.dart index 24ac0a46..4f73e4af 100644 --- a/lib/samples/pdf/annotations/annotations.dart +++ b/lib/samples/pdf/annotations.dart @@ -6,9 +6,9 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Render pdf with annotations class AnnotationsPdf extends SampleView { @@ -36,7 +36,7 @@ class _AnnotationsPdfState extends SampleViewState { Text( 'This sample shows how to create annotations such as rectangle, ellipse, polygon, and line in a PDF document. ', style: TextStyle(fontSize: 16, color: model.textColor)), - const SizedBox(height: 20, width: 30), + const SizedBox(height: 10, width: 30), Container( child: Row( mainAxisAlignment: MainAxisAlignment.start, @@ -53,7 +53,7 @@ class _AnnotationsPdfState extends SampleViewState { style: TextStyle(fontSize: 16, color: model.textColor)), ], )), - const SizedBox(height: 20, width: 30), + const SizedBox(height: 10, width: 30), Align( alignment: Alignment.center, child: FlatButton( diff --git a/lib/samples/pdf/certificate/certificate.dart b/lib/samples/pdf/certificate.dart similarity index 97% rename from lib/samples/pdf/certificate/certificate.dart rename to lib/samples/pdf/certificate.dart index 3d151bb2..dcdf65ff 100644 --- a/lib/samples/pdf/certificate/certificate.dart +++ b/lib/samples/pdf/certificate.dart @@ -10,9 +10,9 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Render pdf of course completion certificate class CourseCompletionCertificatePdf extends SampleView { @@ -97,6 +97,7 @@ class _CertificatePdfState extends SampleViewState { onTap: () { _selectDate(context); }), + const SizedBox(height: 20, width: 30), FlatButton( child: const Text( 'Generate PDF', diff --git a/lib/samples/pdf/conformance.dart b/lib/samples/pdf/conformance.dart new file mode 100644 index 00000000..ac4d5f9b --- /dev/null +++ b/lib/samples/pdf/conformance.dart @@ -0,0 +1,310 @@ +///Package imports +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; + +///Pdf import +import 'package:syncfusion_flutter_pdf/pdf.dart'; + +///Local imports +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; + +/// PDF conformance. +class ConformancePdf extends SampleView { + /// PDF conformance. + const ConformancePdf(Key key) : super(key: key); + @override + _ConformancePdfState createState() => _ConformancePdfState(); +} + +class _ConformancePdfState extends SampleViewState { + _ConformancePdfState(); + int _groupValue = 0; + void _changed(int value) { + setState(() { + _groupValue = value; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: model.cardThemeColor, + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'This sample shows how to create various PDF conformance document like PDF/A-1B, PDF/A-2B, and PDF/A-3B', + style: TextStyle(fontSize: 16, color: model.textColor)), + const SizedBox(height: 20, width: 30), + Text('Choose the conformance level:', + style: TextStyle( + fontSize: 16, + color: model.textColor, + fontWeight: FontWeight.bold)), + const SizedBox(height: 10, width: 25), + (MediaQuery.of(context).size.width > 800) + ? Row(children: getChildWidgets(context)) + : Column(children: getChildWidgets(context)), + const SizedBox(height: 10, width: 30), + Align( + alignment: Alignment.center, + child: FlatButton( + child: const Text('Generate PDF', + style: TextStyle(color: Colors.white)), + color: model.backgroundColor, + onPressed: _conformance)) + ]), + ), + )), + ); + } + + List getChildWidgets(BuildContext context) { + return [ + Row(children: [ + Radio(groupValue: _groupValue, onChanged: _changed, value: 0), + Text('PDF/A-1B', style: TextStyle(fontSize: 16, color: model.textColor)) + ]), + Row(children: [ + Radio(groupValue: _groupValue, onChanged: _changed, value: 1), + Text('PDF/A-2B', style: TextStyle(fontSize: 16, color: model.textColor)) + ]), + Row(children: [ + Radio(groupValue: _groupValue, onChanged: _changed, value: 2), + Text('PDF/A-3B', style: TextStyle(fontSize: 16, color: model.textColor)) + ]), + ]; + } + + Future _conformance() async { + PdfDocument document; + if (_groupValue == 0) { + //Create document with PDF/A-1B standard. + document = PdfDocument(conformanceLevel: PdfConformanceLevel.a1b); + } else if (_groupValue == 1) { + //Create document with PDF/A-2B standard. + document = PdfDocument(conformanceLevel: PdfConformanceLevel.a2b); + } else { + //Create document with PDF/A-3B standard. + document = PdfDocument(conformanceLevel: PdfConformanceLevel.a3b); + String text = + 'Adventure Works Cycles, the fictitious company on which the AdventureWorks sample databases are based, is a large, multinational manufacturing company. The company manufactures and sells metal and composite bicycles to North American, European and Asian commercial markets. While its base operation is located in Bothell, Washington with 290 employees, several regional sales teams are located throughout their market base.'; + document.attachments.add(PdfAttachment( + 'AdventureCycle.txt', utf8.encode(text), + description: 'Adventure Works Cycles', mimeType: 'application/txt')); + } + //Add page to the PDF + final PdfPage page = document.pages.add(); + //Get page client size + final Size pageSize = page.getClientSize(); + //Draw rectangle + page.graphics.drawRectangle( + bounds: Rect.fromLTWH(0, 0, pageSize.width, pageSize.height), + pen: PdfPen(PdfColor(142, 170, 219, 255))); + //Read font file. + List fontData = await _readData('Roboto-Regular.ttf'); + //Create a PDF true type font. + PdfFont contentFont = PdfTrueTypeFont(fontData, 9); + PdfFont headerFont = PdfTrueTypeFont(fontData, 30); + PdfFont footerFont = PdfTrueTypeFont(fontData, 18); + //Generate PDF grid. + final PdfGrid grid = _getGrid(contentFont); + //Draw the header section by creating text element + final PdfLayoutResult result = + _drawHeader(page, pageSize, grid, contentFont, headerFont, footerFont); + //Draw grid + _drawGrid(page, grid, result, contentFont); + //Add invoice footer + _drawFooter(page, pageSize, contentFont); + //Save and dispose the document. + final List bytes = document.save(); + document.dispose(); + //Save and launch file. + await FileSaveHelper.saveAndLaunchFile(bytes, 'ConformancePDF.pdf'); + } + + Future> _readData(String name) async { + final ByteData data = await rootBundle.load('assets/fonts/$name'); + return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + } + + //Draws the invoice header + PdfLayoutResult _drawHeader(PdfPage page, Size pageSize, PdfGrid grid, + PdfFont contentFont, PdfFont headerFont, PdfFont footerFont) { + //Draw rectangle + page.graphics.drawRectangle( + brush: PdfSolidBrush(PdfColor(91, 126, 215, 255)), + bounds: Rect.fromLTWH(0, 0, pageSize.width - 115, 90)); + //Draw string + page.graphics.drawString('INVOICE', headerFont, + brush: PdfBrushes.white, + bounds: Rect.fromLTWH(25, 0, pageSize.width - 115, 90), + format: PdfStringFormat(lineAlignment: PdfVerticalAlignment.middle)); + page.graphics.drawRectangle( + bounds: Rect.fromLTWH(400, 0, pageSize.width - 400, 90), + brush: PdfSolidBrush(PdfColor(65, 104, 205))); + page.graphics.drawString( + '\$' + _getTotalAmount(grid).toString(), footerFont, + bounds: Rect.fromLTWH(400, 0, pageSize.width - 400, 100), + brush: PdfBrushes.white, + format: PdfStringFormat( + alignment: PdfTextAlignment.center, + lineAlignment: PdfVerticalAlignment.middle)); + //Draw string + page.graphics.drawString('Amount', contentFont, + brush: PdfBrushes.white, + bounds: Rect.fromLTWH(400, 0, pageSize.width - 400, 33), + format: PdfStringFormat( + alignment: PdfTextAlignment.center, + lineAlignment: PdfVerticalAlignment.bottom)); + //Create data foramt and convert it to text. + final DateFormat format = DateFormat.yMMMMd('en_US'); + final String invoiceNumber = 'Invoice Number: 2058557939\r\n\r\nDate: ' + + format.format(DateTime.now()); + final Size contentSize = contentFont.measureString(invoiceNumber); + const String address = + 'Bill To: \r\n\r\nAbraham Swearegin, \r\n\r\nUnited States, California, San Mateo, \r\n\r\n9920 BridgePointe Parkway, \r\n\r\n9365550136'; + PdfTextElement(text: invoiceNumber, font: contentFont).draw( + page: page, + bounds: Rect.fromLTWH(pageSize.width - (contentSize.width + 30), 120, + contentSize.width + 30, pageSize.height - 120)); + return PdfTextElement(text: address, font: contentFont).draw( + page: page, + bounds: Rect.fromLTWH(30, 120, + pageSize.width - (contentSize.width + 30), pageSize.height - 120)); + } + + //Draws the grid + void _drawGrid( + PdfPage page, PdfGrid grid, PdfLayoutResult result, PdfFont contentFont) { + Rect totalPriceCellBounds; + Rect quantityCellBounds; + //Invoke the beginCellLayout event. + grid.beginCellLayout = (Object sender, PdfGridBeginCellLayoutArgs args) { + final PdfGrid grid = sender; + if (args.cellIndex == grid.columns.count - 1) { + totalPriceCellBounds = args.bounds; + } else if (args.cellIndex == grid.columns.count - 2) { + quantityCellBounds = args.bounds; + } + }; + //Draw the PDF grid and get the result. + result = grid.draw( + page: page, bounds: Rect.fromLTWH(0, result.bounds.bottom + 40, 0, 0)); + //Draw grand total. + page.graphics.drawString('Grand Total', contentFont, + bounds: Rect.fromLTWH( + quantityCellBounds.left, + result.bounds.bottom + 10, + quantityCellBounds.width, + quantityCellBounds.height)); + page.graphics.drawString(_getTotalAmount(grid).toString(), contentFont, + bounds: Rect.fromLTWH( + totalPriceCellBounds.left, + result.bounds.bottom + 10, + totalPriceCellBounds.width, + totalPriceCellBounds.height)); + } + + //Draw the invoice footer data. + void _drawFooter(PdfPage page, Size pageSize, PdfFont contentFont) { + final PdfPen linePen = + PdfPen(PdfColor(142, 170, 219, 255), dashStyle: PdfDashStyle.custom); + linePen.dashPattern = [3, 3]; + //Draw line + page.graphics.drawLine(linePen, Offset(0, pageSize.height - 100), + Offset(pageSize.width, pageSize.height - 100)); + const String footerContent = + '800 Interchange Blvd.\r\n\r\nSuite 2501, Austin, TX 78721\r\n\r\nAny Questions? support@adventure-works.com'; + //Added 30 as a margin for the layout + page.graphics.drawString(footerContent, contentFont, + format: PdfStringFormat(alignment: PdfTextAlignment.right), + bounds: Rect.fromLTWH(pageSize.width - 30, pageSize.height - 70, 0, 0)); + } + + //Create PDF grid and return + PdfGrid _getGrid(PdfFont contentFont) { + //Create a PDF grid + final PdfGrid grid = PdfGrid(); + //Secify the columns count to the grid. + grid.columns.add(count: 5); + //Create the header row of the grid. + final PdfGridRow headerRow = grid.headers.add(1)[0]; + //Set style + headerRow.style.backgroundBrush = PdfSolidBrush(PdfColor(68, 114, 196)); + headerRow.style.textBrush = PdfBrushes.white; + headerRow.cells[0].value = 'Product Id'; + headerRow.cells[0].stringFormat.alignment = PdfTextAlignment.center; + headerRow.cells[1].value = 'Product Name'; + headerRow.cells[2].value = 'Price'; + headerRow.cells[3].value = 'Quantity'; + headerRow.cells[4].value = 'Total'; + _addProducts('CA-1098', 'AWC Logo Cap', 8.99, 2, 17.98, grid); + _addProducts( + 'LJ-0192', 'Long-Sleeve Logo Jersey,M', 49.99, 3, 149.97, grid); + _addProducts('So-B909-M', 'Mountain Bike Socks,M', 9.5, 2, 19, grid); + _addProducts( + 'LJ-0192', 'Long-Sleeve Logo Jersey,M', 49.99, 4, 199.96, grid); + _addProducts('FK-5136', 'ML Fork', 175.49, 6, 1052.94, grid); + _addProducts('HL-U509', 'Sports-100 Helmet,Black', 34.99, 1, 34.99, grid); + final PdfPen whitePen = PdfPen(PdfColor.empty, width: 0.5); + PdfBorders borders = PdfBorders(); + borders.all = PdfPen(PdfColor(142, 179, 219), width: 0.5); + ; + grid.rows.applyStyle(PdfGridCellStyle(borders: borders)); + grid.columns[1].width = 200; + for (int i = 0; i < headerRow.cells.count; i++) { + headerRow.cells[i].style.cellPadding = + PdfPaddings(bottom: 5, left: 5, right: 5, top: 5); + headerRow.cells[i].style.borders.all = whitePen; + } + for (int i = 0; i < grid.rows.count; i++) { + final PdfGridRow row = grid.rows[i]; + if (i % 2 == 0) { + row.style.backgroundBrush = PdfSolidBrush(PdfColor(217, 226, 243)); + } + for (int j = 0; j < row.cells.count; j++) { + final PdfGridCell cell = row.cells[j]; + if (j == 0) { + cell.stringFormat.alignment = PdfTextAlignment.center; + } + cell.style.cellPadding = + PdfPaddings(bottom: 5, left: 5, right: 5, top: 5); + } + } + //Set font + grid.style.font = contentFont; + return grid; + } + + //Create and row for the grid. + void _addProducts(String productId, String productName, double price, + int quantity, double total, PdfGrid grid) { + final PdfGridRow row = grid.rows.add(); + row.cells[0].value = productId; + row.cells[1].value = productName; + row.cells[2].value = price.toString(); + row.cells[3].value = quantity.toString(); + row.cells[4].value = total.toString(); + } + + //Get the total amount. + double _getTotalAmount(PdfGrid grid) { + double total = 0; + for (int i = 0; i < grid.rows.count; i++) { + final String value = grid.rows[i].cells[grid.columns.count - 1].value; + total += double.parse(value); + } + return total; + } +} diff --git a/lib/samples/pdf/encryption.dart b/lib/samples/pdf/encryption.dart new file mode 100644 index 00000000..a14d65af --- /dev/null +++ b/lib/samples/pdf/encryption.dart @@ -0,0 +1,179 @@ +///Package imports +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +///Pdf import +import 'package:syncfusion_flutter_pdf/pdf.dart'; + +///Local imports +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; + +/// Encrypt PDF document +class EncryptPdf extends SampleView { + /// Encrypt the PDF document + const EncryptPdf(Key key) : super(key: key); + @override + _EncryptPdfState createState() => _EncryptPdfState(); +} + +class _EncryptPdfState extends SampleViewState { + _EncryptPdfState(); + int _groupValue = 3; + void _changed(int value) { + setState(() { + _groupValue = value; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: model.cardThemeColor, + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'This sample shows how to encrypt the existing PDF document with encryption standard like 40-bit RC4, 128-bit RC4, 128-bit AES, 256-bit AES, and advanced encryption standard 256-bit AES Revision 6 (PDF 2.0) to protect documents against unauthorized access.', + style: + TextStyle(fontSize: 16, color: model.textColor)), + const SizedBox(height: 20, width: 30), + Text('Encryption Type', + style: TextStyle( + fontSize: 16, + color: model.textColor, + fontWeight: FontWeight.bold)), + const SizedBox(height: 10, width: 30), + (MediaQuery.of(context).size.width > 800) + ? Row(children: getChildWidgets(context)) + : Column(children: getChildWidgets(context)), + const SizedBox(height: 10, width: 30), + Row(children: [ + Text('User Password: ', + style: TextStyle( + fontSize: 16, + color: model.textColor, + fontWeight: FontWeight.bold)), + Text('password@123', + style: TextStyle( + fontSize: 16, color: model.textColor)), + ]), + const SizedBox(height: 15, width: 30), + Row(children: [ + Text('Owner Password: ', + style: TextStyle( + fontSize: 16, + color: model.textColor, + fontWeight: FontWeight.bold)), + Text('syncfusion', + style: TextStyle( + fontSize: 16, color: model.textColor)), + ]), + const SizedBox(height: 15, width: 30), + Align( + alignment: Alignment.center, + child: FlatButton( + child: const Text('Encrypt PDF', + style: TextStyle(color: Colors.white)), + color: model.backgroundColor, + onPressed: _encryptPDF)) + ]), + ), + ))); + } + + List getChildWidgets(BuildContext context) { + return [ + Row(children: [ + Radio(value: 0, groupValue: _groupValue, onChanged: _changed), + Text('40-bit RC4', + style: TextStyle(fontSize: 16, color: model.textColor)), + ]), + Row(children: [ + Radio(value: 1, groupValue: _groupValue, onChanged: _changed), + Text('128-bit RC4', + style: TextStyle(fontSize: 16, color: model.textColor)), + ]), + Row(children: [ + Radio(value: 2, groupValue: _groupValue, onChanged: _changed), + Text('128-bit AES', + style: TextStyle(fontSize: 16, color: model.textColor)), + ]), + Row(children: [ + Radio(value: 3, groupValue: _groupValue, onChanged: _changed), + Text('256-bit AES', + style: TextStyle(fontSize: 16, color: model.textColor)), + ]), + Row(children: [ + Radio(value: 4, groupValue: _groupValue, onChanged: _changed), + Text('256-bit AES Revision 6', + style: TextStyle(fontSize: 16, color: model.textColor)) + ]) + ]; + } + + Future _encryptPDF() async { + //Load the PDF document. + final PdfDocument document = PdfDocument( + inputBytes: await _readDocumentData('credit_card_statement.pdf')); + + // Get the PDF security. + PdfSecurity security = document.security; + + //Set passwords + security.userPassword = 'password@123'; + security.ownerPassword = 'syncfusion'; + + //Set the encryption algorithm. + security.algorithm = _getAlgorithm(); + + //Set the permissions. + security.permissions.addAll( + [PdfPermissionsFlags.print, PdfPermissionsFlags.fullQualityPrint]); + + //Save and launch the document + final List bytes = document.save(); + + //Dispose the document. + document.dispose(); + //Save and launch file. + await FileSaveHelper.saveAndLaunchFile(bytes, 'EncryptedPDF.pdf'); + } + + Future> _readDocumentData(String name) async { + final ByteData data = await rootBundle.load('assets/pdf/$name'); + return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + } + + PdfEncryptionAlgorithm _getAlgorithm() { + PdfEncryptionAlgorithm algorithm; + switch (_groupValue) { + case 0: + algorithm = PdfEncryptionAlgorithm.rc4x40Bit; + break; + case 1: + algorithm = PdfEncryptionAlgorithm.rc4x128Bit; + break; + case 2: + algorithm = PdfEncryptionAlgorithm.aesx128Bit; + break; + case 3: + algorithm = PdfEncryptionAlgorithm.aesx256Bit; + break; + case 4: + algorithm = PdfEncryptionAlgorithm.aesx256BitRevision6; + break; + default: + algorithm = PdfEncryptionAlgorithm.aesx256Bit; + break; + } + return algorithm; + } +} diff --git a/lib/samples/pdf/find_text/find_text.dart b/lib/samples/pdf/find_text.dart similarity index 97% rename from lib/samples/pdf/find_text/find_text.dart rename to lib/samples/pdf/find_text.dart index 371d4466..57038a08 100644 --- a/lib/samples/pdf/find_text/find_text.dart +++ b/lib/samples/pdf/find_text.dart @@ -6,9 +6,9 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Find text from the PDF document class FindTextPdf extends SampleView { diff --git a/lib/samples/pdf/header_and_footer/header_and_footer.dart b/lib/samples/pdf/header_and_footer.dart similarity index 98% rename from lib/samples/pdf/header_and_footer/header_and_footer.dart rename to lib/samples/pdf/header_and_footer.dart index 7d7cd0c7..1e8bc0ca 100644 --- a/lib/samples/pdf/header_and_footer/header_and_footer.dart +++ b/lib/samples/pdf/header_and_footer.dart @@ -6,9 +6,9 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Render pdf with header and footer class HeaderAndFooterPdf extends SampleView { @@ -312,7 +312,12 @@ class _HeaderAndFooterPdfState extends SampleViewState { return PdfTextElement( text: text, font: PdfStandardFont( - PdfFontFamily.helvetica, isTitle ? mainTitle ? 24 : 18 : 13, + PdfFontFamily.helvetica, + isTitle + ? mainTitle + ? 24 + : 18 + : 13, style: (isTitle && !mainTitle) ? PdfFontStyle.bold : PdfFontStyle.regular), diff --git a/lib/samples/pdf/invoice/invoice.dart b/lib/samples/pdf/invoice.dart similarity index 98% rename from lib/samples/pdf/invoice/invoice.dart rename to lib/samples/pdf/invoice.dart index 92412145..a02a2599 100644 --- a/lib/samples/pdf/invoice/invoice.dart +++ b/lib/samples/pdf/invoice.dart @@ -6,9 +6,9 @@ import 'package:intl/intl.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Render pdf of invoice class InvoicePdf extends SampleView { diff --git a/lib/samples/pdf/text_extraction/text_extraction.dart b/lib/samples/pdf/text_extraction.dart similarity index 96% rename from lib/samples/pdf/text_extraction/text_extraction.dart rename to lib/samples/pdf/text_extraction.dart index 3201bdc2..008a4227 100644 --- a/lib/samples/pdf/text_extraction/text_extraction.dart +++ b/lib/samples/pdf/text_extraction.dart @@ -6,9 +6,9 @@ import 'package:flutter/services.dart'; import 'package:syncfusion_flutter_pdf/pdf.dart'; ///Local imports -import '../../../model/sample_view.dart'; -import '../helper/save_file_mobile.dart' - if (dart.library.html) '../helper/save_file_web.dart'; +import '../../model/sample_view.dart'; +import 'helper/save_file_mobile.dart' + if (dart.library.html) 'helper/save_file_web.dart'; /// Extract text from the PDF document class TextExtractionPdf extends SampleView { diff --git a/lib/samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart b/lib/samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart deleted file mode 100644 index 7aefe15a..00000000 --- a/lib/samples/pdf_viewer/custom_toolbar/pdf_viewer_custom_toolbar.dart +++ /dev/null @@ -1,508 +0,0 @@ -/// Package import -import 'package:flutter/material.dart'; - -/// PDF Viewer import -import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; - -/// Core theme import -import 'package:syncfusion_flutter_core/theme.dart'; - -/// Local import -import '../../../model/sample_view.dart'; - -/// Widget of [SfPdfViewer] with custom toolbar. -class CustomToolbarPdfViewer extends SampleView { - /// Creates a [SfPdfViewer] with custom toolbar. - const CustomToolbarPdfViewer(Key key) : super(key: key); - - @override - _CustomToolbarPdfViewerState createState() => _CustomToolbarPdfViewerState(); -} - -/// State for the [SfPdfViewer] widget with custom toolbar -class _CustomToolbarPdfViewerState extends SampleViewState { - String _documentPath; - final GlobalKey _pdfViewerKey = GlobalKey(); - final PdfViewerController _pdfViewerController = PdfViewerController(); - bool _showPdf; - bool _showToolbar; - - @override - void initState() { - _documentPath = 'assets/pdf/pdf_succinctly.pdf'; - _showPdf = false; - _showToolbar = true; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: _showToolbar - ? AppBar( - flexibleSpace: Toolbar( - showTooltip: true, - controller: _pdfViewerController, - onTap: (Object toolbarItem) { - if (_pdfViewerKey.currentState.isBookmarkViewOpen) { - Navigator.pop(context); - } - if (toolbarItem != 'Jump to the page') { - final currentFocus = FocusScope.of(context); - if (!currentFocus.hasPrimaryFocus) { - currentFocus.requestFocus(FocusNode()); - } - } - if (toolbarItem is Document) { - setState(() { - _documentPath = toolbarItem.path; - }); - } else if (toolbarItem.toString() == 'Bookmarks') { - setState(() { - _showToolbar = false; - }); - _pdfViewerKey.currentState?.openBookmarkView(); - } - }, - ), - automaticallyImplyLeading: false, - backgroundColor: - SfPdfViewerTheme.of(context).bookmarkViewStyle.headerBarColor, - ) - : PreferredSize( - child: Container(), - preferredSize: Size.zero, - ), - body: FutureBuilder( - future: Future.delayed(Duration(milliseconds: 200)).then((value) { - _showPdf = true; - }), - builder: (context, snapshot) { - if (_showPdf) { - return SfPdfViewerTheme( - data: - SfPdfViewerThemeData(brightness: model.themeData.brightness), - child: WillPopScope( - onWillPop: () async { - setState(() { - _showToolbar = true; - }); - return true; - }, - child: SfPdfViewer.asset( - _documentPath, - key: _pdfViewerKey, - controller: _pdfViewerController, - onDocumentLoadFailed: (PdfDocumentLoadFailedDetails details) { - showErrorDialog( - context, details.error, details.description); - }, - ), - ), - ); - } else { - return Container( - color: SfPdfViewerTheme.of(context).backgroundColor, - ); - } - }, - ), - ); - } -} - -/// Represents PDF document. -class Document { - /// Constructs Document instance. - Document(this.name, this.path); - - /// Name of the PDF document. - final String name; - - /// Path of the PDF document. - final String path; -} - -/// Signature for [FileExplorer.onDocumentTap] callback. -typedef PdfDocumentTapCallback = void Function(Document document); - -/// File Explorer widget -class FileExplorer extends StatefulWidget { - /// Creates a File Explorer - FileExplorer({Key key, this.brightness, this.onDocumentTap}); - - /// Brightness theme for the file explorer. - final Brightness brightness; - - /// Called when the document is selected. - final PdfDocumentTapCallback onDocumentTap; - - @override - FileExplorerState createState() => FileExplorerState(); -} - -/// State for the File Explorer widget -class FileExplorerState extends State { - Color _foregroundColor; - Color _backgroundColor; - List _documents = [ - Document('PDF Succinctly', 'assets/pdf/pdf_succinctly.pdf'), - Document('HTTP Succinctly', 'assets/pdf/http_succinctly.pdf'), - Document('JavaScript Succinctly', 'assets/pdf/javascript_succinctly.pdf'), - Document('Single Page Document', 'assets/pdf/single_page_document.pdf'), - Document('Corrupted Document', 'assets/pdf/corrupted_document.pdf') - ]; - - @override - void didChangeDependencies() { - _backgroundColor = widget.brightness == Brightness.light - ? Color(0xFFFAFAFA) - : Color(0xFF424242); - _foregroundColor = - widget.brightness == Brightness.light ? Colors.black : Colors.white; - super.didChangeDependencies(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - automaticallyImplyLeading: false, - title: Text('Choose File', style: TextStyle(color: _foregroundColor)), - backgroundColor: _backgroundColor, - ), - body: Container( - color: widget.brightness == Brightness.light - ? Colors.white - : Color(0xFF212121), - child: ListView.builder( - itemCount: _documents.length, - itemBuilder: (context, index) { - final document = _documents[index]; - return ListTile( - title: Text(document.name, - style: TextStyle(color: _foregroundColor, fontSize: 14)), - leading: Icon(Icons.picture_as_pdf, color: _foregroundColor), - onTap: () { - widget.onDocumentTap(document); - }, - ); - }), - )); - } -} - -/// Signature for [Toolbar.onTap] callback. -typedef TapCallback = void Function(Object item); - -/// Toolbar widget -class Toolbar extends StatefulWidget { - ///it describe top toolbar constructor - Toolbar({ - this.controller, - this.onTap, - this.showTooltip = true, - Key key, - }) : super(key: key); - - /// Indicates whether tooltip for the toolbar items need to be shown or not.. - final bool showTooltip; - - /// An object that is used to control the [SfPdfViewer]. - final PdfViewerController controller; - - /// Called when the toolbar item is selected. - final TapCallback onTap; - - @override - ToolbarState createState() => ToolbarState(); -} - -/// State for the Toolbar widget -class ToolbarState extends State { - SfPdfViewerThemeData _pdfViewerThemeData; - Color _color; - Color _disabledColor; - int _pageCount; - - /// An object that is used to control the Text Field. - TextEditingController _textEditingController; - - @override - void initState() { - widget.controller?.addListener(_pageChanged); - _textEditingController = - TextEditingController(text: widget.controller.pageNumber.toString()); - _pageCount = widget.controller.pageCount; - super.initState(); - } - - @override - void dispose() { - widget.controller?.removeListener(_pageChanged); - super.dispose(); - } - - /// Called when the page changes and updates the page number text field. - void _pageChanged({String property}) { - if (widget.controller?.pageCount != null && - _pageCount != widget.controller.pageCount) { - _pageCount = widget.controller.pageCount; - setState(() {}); - } - if (widget.controller?.pageNumber != null && - _textEditingController.text != - widget.controller.pageNumber.toString()) { - _textEditingController.text = widget.controller.pageNumber.toString(); - setState(() {}); - } - } - - @override - void didChangeDependencies() { - _pdfViewerThemeData = SfPdfViewerTheme.of(context); - _color = _pdfViewerThemeData.brightness == Brightness.light - ? Colors.black.withOpacity(0.54) - : Colors.white.withOpacity(0.65); - _disabledColor = _pdfViewerThemeData.brightness == Brightness.light - ? Colors.black12 - : Colors.white12; - super.didChangeDependencies(); - } - - @override - Widget build(BuildContext context) { - final canJumpToPreviousPage = widget.controller.pageNumber > 1; - final canJumpToNextPage = - widget.controller.pageNumber < widget.controller.pageCount; - return GestureDetector( - onTap: () { - widget.onTap?.call('Toolbar'); - }, - child: Container( - padding: EdgeInsets.only(left: 16.0, right: 16.0), - height: 56, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ToolbarItem( - height: 40, - width: 40, - child: Material( - color: Colors.transparent, - child: IconButton( - icon: Icon( - Icons.folder_open, - color: _color, - size: 24, - ), - onPressed: () { - widget.onTap?.call('File Explorer'); - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => FileExplorer( - brightness: _pdfViewerThemeData.brightness, - onDocumentTap: (document) { - widget.onTap?.call(document); - Navigator.of(context, rootNavigator: true) - .pop(context); - }, - ))); - }, - tooltip: widget.showTooltip ? 'Choose file' : null, - )), - ), - Row(children: [ - ToolbarItem( - height: 25, - width: 75, - child: Row(children: [ - Flexible( - child: paginationTextField(context), - ), - Padding( - padding: EdgeInsets.only(left: 10.0, right: 10.0), - child: Text( - '/', - style: TextStyle(color: _color, fontSize: 16), - )), - Text( - _pageCount.toString(), - style: TextStyle(color: _color, fontSize: 16), - ) - ])), - Padding( - padding: const EdgeInsets.only(left: 24), - child: ToolbarItem( - height: 40, - width: 40, - child: Material( - color: Colors.transparent, - child: IconButton( - icon: Icon( - Icons.keyboard_arrow_up, - color: canJumpToPreviousPage - ? _color - : _disabledColor, - size: 24, - ), - onPressed: canJumpToPreviousPage - ? () { - widget.onTap?.call('Previous page'); - widget.controller?.previousPage(); - } - : null, - tooltip: - widget.showTooltip ? 'Previous page' : null, - )), - )), - Padding( - padding: const EdgeInsets.only(left: 24), - child: ToolbarItem( - height: 40, - width: 40, - child: Material( - color: Colors.transparent, - child: IconButton( - icon: Icon( - Icons.keyboard_arrow_down, - color: - canJumpToNextPage ? _color : _disabledColor, - size: 24, - ), - onPressed: canJumpToNextPage - ? () { - widget.onTap?.call('Next page'); - widget.controller?.nextPage(); - } - : null, - tooltip: widget.showTooltip ? 'Next page' : null, - )), - )) - ]), - ToolbarItem( - height: 40, - width: 40, - child: Material( - color: Colors.transparent, - child: IconButton( - icon: Icon( - Icons.bookmark, - color: widget.controller.pageNumber == 0 - ? Colors.black12 - : _color, - size: 24, - ), - onPressed: widget.controller.pageNumber == 0 - ? null - : () { - _textEditingController.selection = TextSelection( - baseOffset: -1, extentOffset: -1); - widget.onTap?.call('Bookmarks'); - }, - tooltip: widget.showTooltip ? 'Bookmarks' : null, - ), - )), - ], - )), - ); - } - - /// Pagination text field widget - Widget paginationTextField(BuildContext context) { - return TextField( - style: TextStyle(color: _color), - enableInteractiveSelection: false, - keyboardType: TextInputType.number, - controller: _textEditingController, - textAlign: TextAlign.center, - maxLength: 3, - maxLines: 1, - decoration: InputDecoration( - counterText: '', - border: UnderlineInputBorder( - borderSide: BorderSide(color: Colors.grey), - ), - ), - enabled: widget.controller.pageCount == 0 ? false : true, - onTap: widget.controller.pageCount == 0 - ? null - : () { - _textEditingController.selection = TextSelection( - baseOffset: 0, - extentOffset: _textEditingController.value.text.length); - widget.onTap?.call('Jump to the page'); - }, - onEditingComplete: () { - final str = _textEditingController.text; - if (str != widget.controller.pageNumber.toString()) { - try { - final int index = int.parse(str); - if (index > 0 && index <= widget.controller.pageCount) { - widget.controller?.jumpToPage(index); - FocusScope.of(context).requestFocus(FocusNode()); - widget.onTap?.call('Navigated'); - } else { - _textEditingController.text = - widget.controller.pageNumber.toString(); - showErrorDialog( - context, 'Error', 'Please enter a valid page number.'); - } - } catch (exception) { - return showErrorDialog( - context, 'Error', 'Please enter a valid page number.'); - } - } - widget.onTap?.call('Navigated'); - }, - ); - } -} - -/// Toolbar item widget -class ToolbarItem extends StatelessWidget { - ///Creates a toolbar item - ToolbarItem({ - this.height, - this.width, - @required this.child, - }); - - /// Height of the toolbar item - final double height; - - /// Width of the toolbar item - final double width; - - /// Child widget of the toolbar item - final Widget child; - - @override - Widget build(BuildContext context) { - return Container( - height: height, - width: width, - child: child, - ); - } -} - -/// Displays the error message -void showErrorDialog(BuildContext context, String error, String description) { - showDialog( - context: context, - builder: (BuildContext context) { - return AlertDialog( - title: Text(error), - content: Text(description), - actions: [ - FlatButton( - child: Text('OK'), - onPressed: () { - Navigator.of(context, rootNavigator: true).pop(); - }, - ) - ], - ); - }, - ); -} diff --git a/lib/samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart b/lib/samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart deleted file mode 100644 index 03c09474..00000000 --- a/lib/samples/pdf_viewer/getting_started/pdf_viewer_getting_started.dart +++ /dev/null @@ -1,53 +0,0 @@ -///Package import -import 'package:flutter/material.dart'; - -///PDF Viewer import -import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; - -/// Core theme import -import 'package:syncfusion_flutter_core/theme.dart'; - -///Local import -import '../../../model/sample_view.dart'; - -///Widget of getting started PDF Viewer. -class GettingStartedPdfViewer extends SampleView { - /// Creates default getting started PDF Viewer. - const GettingStartedPdfViewer(Key key) : super(key: key); - - @override - _GettingStartedPdfViewerState createState() => - _GettingStartedPdfViewerState(); -} - -class _GettingStartedPdfViewerState extends SampleViewState { - @override - void initState() { - super.initState(); - } - - @override - Widget build(BuildContext context) { - bool _showPdf = false; - // TODO: implement build - return Scaffold( - body: FutureBuilder( - future: Future.delayed(Duration(milliseconds: 200)).then((value) { - _showPdf = true; - }), - builder: (context, snapshot) { - if (_showPdf) { - return SfPdfViewerTheme( - data: SfPdfViewerThemeData( - brightness: model.themeData.brightness), - child: - SfPdfViewer.asset('assets/pdf/flutter_succinctly.pdf')); - } else { - return Container( - color: SfPdfViewerTheme.of(context).backgroundColor, - ); - } - }), - ); - } -} diff --git a/lib/samples/pdf_viewer/pdf_viewer_custom_toolbar.dart b/lib/samples/pdf_viewer/pdf_viewer_custom_toolbar.dart new file mode 100644 index 00000000..0c376b3c --- /dev/null +++ b/lib/samples/pdf_viewer/pdf_viewer_custom_toolbar.dart @@ -0,0 +1,1125 @@ +/// Package import +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +/// PDF Viewer import +import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; + +/// Core theme import +import 'package:syncfusion_flutter_core/theme.dart'; + +/// Local import +import '../../model/sample_view.dart'; + +/// Widget of [SfPdfViewer] with custom toolbar. +class CustomToolbarPdfViewer extends SampleView { + /// Creates a [SfPdfViewer] with custom toolbar. + const CustomToolbarPdfViewer(Key key) : super(key: key); + + @override + _CustomToolbarPdfViewerState createState() => _CustomToolbarPdfViewerState(); +} + +/// State for the [SfPdfViewer] widget with custom toolbar +class _CustomToolbarPdfViewerState extends SampleViewState { + String _documentPath; + final GlobalKey _pdfViewerKey = GlobalKey(); + final PdfViewerController _pdfViewerController = PdfViewerController(); + final GlobalKey _textSearchKey = GlobalKey(); + bool _showPdf; + bool _showToolbar; + bool _showToast; + bool _showScrollHead; + OverlayEntry _overlayEntry; + Color _contextMenuColor; + Color _copyColor; + double _contextMenuWidth; + double _contextMenuHeight; + + @override + void initState() { + _documentPath = 'assets/pdf/gis_succinctly.pdf'; + _showPdf = false; + _showToolbar = true; + _showToast = false; + _showScrollHead = true; + _contextMenuHeight = 48; + _contextMenuWidth = 100; + super.initState(); + } + + @override + void didChangeDependencies() { + /// Used figma colors for context menu color and copy text color. + _contextMenuColor = model.themeData.brightness == Brightness.light + ? Color(0xFFFFFFFF) + : Color(0xFF424242); + _copyColor = model.themeData.brightness == Brightness.light + ? Color(0xFF000000) + : Color(0xFFFFFFFF); + super.didChangeDependencies(); + } + + /// Show Context menu for Text Selection. + void _showContextMenu( + BuildContext context, PdfTextSelectionChangedDetails details) { + final RenderBox renderBoxContainer = + context.findRenderObject() as RenderBox; + final Offset containerOffset = renderBoxContainer.localToGlobal( + renderBoxContainer.paintBounds.topLeft, + ); + if (containerOffset.dy < details.globalSelectedRegion.topLeft.dy - 55 || + (containerOffset.dy < + details.globalSelectedRegion.center.dy - + (_contextMenuHeight / 2) && + details.globalSelectedRegion.height > _contextMenuWidth)) { + double top = details.globalSelectedRegion.height > _contextMenuWidth + ? details.globalSelectedRegion.center.dy - (_contextMenuHeight / 2) + : details.globalSelectedRegion.topLeft.dy - 55; + double left = details.globalSelectedRegion.height > _contextMenuWidth + ? details.globalSelectedRegion.center.dx - (_contextMenuWidth / 2) + : details.globalSelectedRegion.bottomLeft.dx; + if ((details.globalSelectedRegion.top) > + MediaQuery.of(context).size.height / 2) { + top = details.globalSelectedRegion.topLeft.dy - 55; + left = details.globalSelectedRegion.bottomLeft.dx; + } + final OverlayState _overlayState = Overlay.of(context); + _overlayEntry = OverlayEntry( + builder: (context) => Positioned( + top: top, + left: left, + child: Container( + decoration: BoxDecoration( + color: _contextMenuColor, + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.14), + blurRadius: 2, + offset: Offset(0, 0), + ), + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.12), + blurRadius: 2, + offset: Offset(0, 2), + ), + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.2), + blurRadius: 3, + offset: Offset(0, 1), + ), + ], + ), + constraints: BoxConstraints.tightFor( + width: _contextMenuWidth, height: _contextMenuHeight), + child: FlatButton( + child: Text( + 'Copy', + style: TextStyle(fontSize: 17, color: _copyColor), + ), + onPressed: () async { + _checkAndCloseContextMenu(); + _pdfViewerController.clearSelection(); + if (_textSearchKey.currentState?._pdfTextSearchResult != null && + _textSearchKey + .currentState._pdfTextSearchResult.hasResult) { + setState(() { + _showToolbar = false; + }); + } + await Clipboard.setData( + ClipboardData(text: details.selectedText)); + setState(() { + _showToast = true; + }); + await Future.delayed(Duration(seconds: 1)); + setState(() { + _showToast = false; + }); + }, + ), + ), + ), + ); + _overlayState.insert(_overlayEntry); + } + } + + /// Ensure the entry history of Text search. + LocalHistoryEntry _historyEntry; + void _ensureHistoryEntry() { + if (_historyEntry == null) { + final ModalRoute route = ModalRoute.of(context); + if (route != null) { + _historyEntry = LocalHistoryEntry(onRemove: _handleHistoryEntryRemoved); + route.addLocalHistoryEntry(_historyEntry); + } + } + } + + void _handleHistoryEntryRemoved() { + _textSearchKey?.currentState?.clearSearch(); + _historyEntry = null; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: _showToolbar + ? AppBar( + flexibleSpace: Toolbar( + showTooltip: true, + controller: _pdfViewerController, + onTap: (Object toolbarItem) { + if (toolbarItem.toString() != 'Bookmarks') { + _checkAndCloseContextMenu(); + _pdfViewerController.clearSelection(); + } + if (_pdfViewerKey.currentState.isBookmarkViewOpen) { + Navigator.pop(context); + } + if (toolbarItem != 'Jump to the page') { + final currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.requestFocus(FocusNode()); + } + } + if (toolbarItem is Document) { + setState(() { + _documentPath = toolbarItem.path; + }); + } + if (toolbarItem.toString() == 'Bookmarks') { + setState(() { + _showToolbar = false; + }); + _pdfViewerKey.currentState?.openBookmarkView(); + } else if (toolbarItem.toString() == 'Search') { + setState(() { + _showToolbar = false; + _showScrollHead = false; + _ensureHistoryEntry(); + }); + } + }, + ), + automaticallyImplyLeading: false, + backgroundColor: + SfPdfViewerTheme.of(context).bookmarkViewStyle.headerBarColor, + ) + : !_pdfViewerKey.currentState.isBookmarkViewOpen + ? AppBar( + flexibleSpace: SearchToolbar( + key: _textSearchKey, + showTooltip: true, + controller: _pdfViewerController, + onTap: (Object toolbarItem) { + if (toolbarItem.toString() == 'Cancel Search') { + setState(() { + _showToolbar = true; + _showScrollHead = true; + if (Navigator.canPop(context)) { + Navigator.of(context).maybePop(); + } + }); + } + if (toolbarItem.toString() == 'Previous Instance') { + setState(() { + _showToolbar = false; + }); + } + if (toolbarItem.toString() == 'Next Instance') { + setState(() { + _showToolbar = false; + }); + } + if (toolbarItem.toString() == 'Clear Text') { + setState(() { + _showToolbar = false; + }); + } + }, + ), + automaticallyImplyLeading: false, + backgroundColor: SfPdfViewerTheme.of(context) + .bookmarkViewStyle + .headerBarColor, + ) + : PreferredSize( + child: Container(), + preferredSize: Size.zero, + ), + body: FutureBuilder( + future: Future.delayed(Duration(milliseconds: 200)).then((value) { + _showPdf = true; + }), + builder: (context, snapshot) { + if (_showPdf) { + return SfPdfViewerTheme( + data: + SfPdfViewerThemeData(brightness: model.themeData.brightness), + child: WillPopScope( + onWillPop: () async { + setState(() { + _showToolbar = true; + }); + return true; + }, + child: Stack(children: [ + SfPdfViewer.asset( + _documentPath, + key: _pdfViewerKey, + controller: _pdfViewerController, + onTextSelectionChanged: + (PdfTextSelectionChangedDetails details) async { + if (details.selectedText == null && + _overlayEntry != null) { + _checkAndCloseContextMenu(); + } else if (details.selectedText != null && + _overlayEntry == null) { + _showContextMenu(context, details); + } + }, + onDocumentLoadFailed: + (PdfDocumentLoadFailedDetails details) { + showErrorDialog( + context, details.error, details.description); + }, + canShowScrollHead: _showScrollHead, + ), + Visibility( + visible: _textSearchKey?.currentState?._showToast ?? false, + child: Align( + alignment: Alignment.center, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.only( + left: 15, top: 7, right: 15, bottom: 7), + decoration: BoxDecoration( + color: Colors.grey[600], + borderRadius: BorderRadius.all( + Radius.circular(16.0), + ), + ), + child: Text( + 'No result', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'Roboto', + fontSize: 16, + color: Colors.white), + ), + ), + ], + ), + ), + ), + Visibility( + visible: _showToast, + child: Positioned.fill( + bottom: 25.0, + child: Align( + alignment: Alignment.bottomCenter, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.only( + left: 16, top: 6, right: 16, bottom: 6), + decoration: BoxDecoration( + color: Colors.grey[500], + borderRadius: BorderRadius.all( + Radius.circular(16.0), + ), + ), + child: Text( + 'Copied', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'Roboto', + fontSize: 16, + color: Colors.white), + ), + ), + ], + ), + ), + ), + ), + ]), + ), + ); + } else { + return Container( + color: SfPdfViewerTheme.of(context).backgroundColor, + ); + } + }, + ), + ); + } + + void _checkAndCloseContextMenu() { + if (_overlayEntry != null) { + _overlayEntry.remove(); + _overlayEntry = null; + } + } +} + +/// Represents PDF document. +class Document { + /// Constructs Document instance. + Document(this.name, this.path); + + /// Name of the PDF document. + final String name; + + /// Path of the PDF document. + final String path; +} + +/// Signature for [FileExplorer.onDocumentTap] callback. +typedef PdfDocumentTapCallback = void Function(Document document); + +/// File Explorer widget +class FileExplorer extends StatefulWidget { + /// Creates a File Explorer + FileExplorer({Key key, this.brightness, this.onDocumentTap}); + + /// Brightness theme for the file explorer. + final Brightness brightness; + + /// Called when the document is selected. + final PdfDocumentTapCallback onDocumentTap; + + @override + FileExplorerState createState() => FileExplorerState(); +} + +/// State for the File Explorer widget +class FileExplorerState extends State { + Color _foregroundColor; + Color _backgroundColor; + List _documents = [ + Document('GIS Succinctly', 'assets/pdf/gis_succinctly.pdf'), + Document('HTTP Succinctly', 'assets/pdf/http_succinctly.pdf'), + Document('JavaScript Succinctly', 'assets/pdf/javascript_succinctly.pdf'), + Document('Single Page Document', 'assets/pdf/single_page_document.pdf'), + Document('Corrupted Document', 'assets/pdf/corrupted_document.pdf') + ]; + + @override + void didChangeDependencies() { + _backgroundColor = widget.brightness == Brightness.light + ? Color(0xFFFAFAFA) + : Color(0xFF424242); + _foregroundColor = + widget.brightness == Brightness.light ? Colors.black : Colors.white; + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Text('Choose File', style: TextStyle(color: _foregroundColor)), + backgroundColor: _backgroundColor, + ), + body: Container( + color: widget.brightness == Brightness.light + ? Colors.white + : Color(0xFF212121), + child: ListView.builder( + itemCount: _documents.length, + itemBuilder: (context, index) { + final document = _documents[index]; + return ListTile( + title: Text(document.name, + style: TextStyle(color: _foregroundColor, fontSize: 14)), + leading: Icon(Icons.picture_as_pdf, color: _foregroundColor), + onTap: () { + widget.onDocumentTap(document); + }, + ); + }), + )); + } +} + +/// Signature for [Toolbar.onTap] callback. +typedef TapCallback = void Function(Object item); + +/// Toolbar widget +class Toolbar extends StatefulWidget { + ///it describe top toolbar constructor + Toolbar({ + this.controller, + this.onTap, + this.showTooltip = true, + Key key, + }) : super(key: key); + + /// Indicates whether tooltip for the toolbar items need to be shown or not.. + final bool showTooltip; + + /// An object that is used to control the [SfPdfViewer]. + final PdfViewerController controller; + + /// Called when the toolbar item is selected. + final TapCallback onTap; + + @override + ToolbarState createState() => ToolbarState(); +} + +/// State for the Toolbar widget +class ToolbarState extends State { + SfPdfViewerThemeData _pdfViewerThemeData; + Color _color; + Color _disabledColor; + int _pageCount; + + /// An object that is used to control the Text Field. + TextEditingController _textEditingController; + + @override + void initState() { + widget.controller?.addListener(_pageChanged); + _textEditingController = + TextEditingController(text: widget.controller.pageNumber.toString()); + _pageCount = widget.controller.pageCount; + super.initState(); + } + + @override + void dispose() { + widget.controller?.removeListener(_pageChanged); + super.dispose(); + } + + /// Called when the page changes and updates the page number text field. + void _pageChanged({String property}) { + if (widget.controller?.pageCount != null && + _pageCount != widget.controller.pageCount) { + _pageCount = widget.controller.pageCount; + setState(() {}); + } + if (widget.controller?.pageNumber != null && + _textEditingController.text != + widget.controller.pageNumber.toString()) { + _textEditingController.text = widget.controller.pageNumber.toString(); + setState(() {}); + } + } + + @override + void didChangeDependencies() { + _pdfViewerThemeData = SfPdfViewerTheme.of(context); + _color = _pdfViewerThemeData.brightness == Brightness.light + ? Colors.black.withOpacity(0.54) + : Colors.white.withOpacity(0.65); + _disabledColor = _pdfViewerThemeData.brightness == Brightness.light + ? Colors.black12 + : Colors.white12; + super.didChangeDependencies(); + } + + @override + Widget build(BuildContext context) { + final canJumpToPreviousPage = widget.controller.pageNumber > 1; + final canJumpToNextPage = + widget.controller.pageNumber < widget.controller.pageCount; + return GestureDetector( + onTap: () { + widget.onTap?.call('Toolbar'); + }, + child: Container( + padding: EdgeInsets.only(left: 16.0, right: 16.0), + height: 56, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.folder_open, + color: _color, + size: 24, + ), + onPressed: () async { + widget.onTap?.call('File Explorer'); + widget.controller.clearSelection(); + await Future.delayed(Duration(milliseconds: 50)); + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => FileExplorer( + brightness: _pdfViewerThemeData.brightness, + onDocumentTap: (document) { + widget.onTap?.call(document); + Navigator.of(context, rootNavigator: true) + .pop(context); + }, + ))); + }, + tooltip: widget.showTooltip ? 'Choose file' : null, + )), + ), + Row(children: [ + ToolbarItem( + height: 25, + width: 75, + child: Row(children: [ + Flexible( + child: paginationTextField(context), + ), + Padding( + padding: EdgeInsets.only(left: 10.0, right: 10.0), + child: Text( + '/', + style: TextStyle(color: _color, fontSize: 16), + )), + Text( + _pageCount.toString(), + style: TextStyle(color: _color, fontSize: 16), + ) + ])), + Padding( + padding: const EdgeInsets.only(left: 24), + child: ToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.keyboard_arrow_up, + color: canJumpToPreviousPage + ? _color + : _disabledColor, + size: 24, + ), + onPressed: canJumpToPreviousPage + ? () { + widget.onTap?.call('Previous page'); + widget.controller?.previousPage(); + } + : null, + tooltip: + widget.showTooltip ? 'Previous page' : null, + )), + )), + Padding( + padding: const EdgeInsets.only(left: 24), + child: ToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.keyboard_arrow_down, + color: + canJumpToNextPage ? _color : _disabledColor, + size: 24, + ), + onPressed: canJumpToNextPage + ? () { + widget.onTap?.call('Next page'); + widget.controller?.nextPage(); + } + : null, + tooltip: widget.showTooltip ? 'Next page' : null, + )), + )) + ]), + Row(children: [ + ToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.bookmark, + color: widget.controller.pageNumber == 0 + ? Colors.black12 + : _color, + size: 24, + ), + onPressed: widget.controller.pageNumber == 0 + ? null + : () { + _textEditingController.selection = + TextSelection( + baseOffset: -1, extentOffset: -1); + widget.onTap?.call('Bookmarks'); + }, + tooltip: widget.showTooltip ? 'Bookmarks' : null, + ), + )), + ToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.search, + color: widget.controller.pageNumber == 0 + ? Colors.black12 + : _color, + size: 24, + ), + onPressed: widget.controller.pageNumber == 0 + ? null + : () { + widget.controller.clearSelection(); + widget.onTap?.call('Search'); + }, + tooltip: widget.showTooltip ? 'Search' : null, + ), + )) + ]), + ], + )), + ); + } + + /// Pagination text field widget + Widget paginationTextField(BuildContext context) { + return TextField( + style: TextStyle(color: _color), + enableInteractiveSelection: false, + keyboardType: TextInputType.number, + controller: _textEditingController, + textAlign: TextAlign.center, + maxLength: 3, + maxLines: 1, + decoration: InputDecoration( + counterText: '', + border: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.grey), + ), + ), + enabled: widget.controller.pageCount == 0 ? false : true, + onTap: widget.controller.pageCount == 0 + ? null + : () { + _textEditingController.selection = TextSelection( + baseOffset: 0, + extentOffset: _textEditingController.value.text.length); + widget.onTap?.call('Jump to the page'); + }, + onEditingComplete: () { + final str = _textEditingController.text; + if (str != widget.controller.pageNumber.toString()) { + try { + final int index = int.parse(str); + if (index > 0 && index <= widget.controller.pageCount) { + widget.controller?.jumpToPage(index); + FocusScope.of(context).requestFocus(FocusNode()); + widget.onTap?.call('Navigated'); + } else { + _textEditingController.text = + widget.controller.pageNumber.toString(); + showErrorDialog( + context, 'Error', 'Please enter a valid page number.'); + } + } catch (exception) { + return showErrorDialog( + context, 'Error', 'Please enter a valid page number.'); + } + } + widget.onTap?.call('Navigated'); + }, + ); + } +} + +/// Signature for [SearchToolbar.onTap] callback. +typedef SearchTapCallback = void Function(Object item); + +/// SearchToolbar widget +class SearchToolbar extends StatefulWidget { + ///it describe search toolbar constructor + SearchToolbar({ + this.controller, + this.onTap, + this.showTooltip = true, + Key key, + }) : super(key: key); + + /// Indicates whether tooltip for the search toolbar items need to be shown or not. + final bool showTooltip; + + /// An object that is used to control the [SfPdfViewer]. + final PdfViewerController controller; + + /// Called when the search toolbar item is selected. + final SearchTapCallback onTap; + + @override + SearchToolbarState createState() => SearchToolbarState(); +} + +/// State for the SearchToolbar widget +class SearchToolbarState extends State { + SfPdfViewerThemeData _pdfViewerThemeData; + Color _color; + bool _showItem = false; + bool _showToast = false; + int _totalTextValue = 0; + + /// An object that is used to control the Text Field. + final TextEditingController _editingController = TextEditingController(); + + /// An object that is used retrieve the text search result. + PdfTextSearchResult _pdfTextSearchResult = PdfTextSearchResult(); + + /// Define the focus node. To manage the lifecycle, create the FocusNode in + /// the initState method, and clean it up in the dispose method. + + FocusNode myFocusNode; + + @override + void initState() { + super.initState(); + myFocusNode = FocusNode(); + } + + @override + void dispose() { + // Clean up the focus node when the Form is disposed. + myFocusNode?.dispose(); + super.dispose(); + } + + ///clear the text search result + void clearSearch() { + _pdfTextSearchResult.clear(); + } + + @override + void didChangeDependencies() { + _pdfViewerThemeData = SfPdfViewerTheme.of(context); + _color = _pdfViewerThemeData.brightness == Brightness.light + ? Colors.black.withOpacity(0.54) + : Colors.white.withOpacity(0.65); + super.didChangeDependencies(); + } + + ///Display the Alert Dialog to search from the beginning + void _showDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('Search Result'), + content: Text( + 'No more occurrences found. Would you like to continue to search from the beginning?'), + actions: [ + FlatButton( + child: Text('YES'), + onPressed: () { + _pdfTextSearchResult?.nextInstance(); + Navigator.of(context).pop(); + }, + ), + FlatButton( + child: Text('NO'), + onPressed: () { + _pdfTextSearchResult?.clear(); + _editingController.clear(); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + ///Display the Alert Dialog to search from the ending + void _showAlertDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text('Search Result'), + content: Text( + 'No more occurrences found. Would you like to continue to search from the ending?'), + actions: [ + FlatButton( + child: Text('YES'), + onPressed: () { + _pdfTextSearchResult?.previousInstance(); + Navigator.of(context).pop(); + }, + ), + FlatButton( + child: Text('NO'), + onPressed: () { + _pdfTextSearchResult?.clear(); + _editingController.clear(); + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only(left: 16.0, right: 16.0), + height: 56, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SearchToolbarItem( + height: 40, + width: 40, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.arrow_back, + color: _color, + size: 24, + ), + onPressed: () { + widget.onTap?.call('Cancel Search'); + _editingController.clear(); + _pdfTextSearchResult?.clear(); + }, + ), + ), + ), + SearchToolbarItem( + child: Flexible( + child: TextFormField( + style: TextStyle(color: _color), + enableInteractiveSelection: false, + autofocus: true, + focusNode: myFocusNode, + keyboardType: TextInputType.text, + textInputAction: TextInputAction.search, + controller: _editingController, + decoration: InputDecoration( + border: InputBorder.none, + hintText: 'Find...', + ), + onChanged: (text) { + if (_totalTextValue < _editingController.value.text.length) { + _totalTextValue = _editingController.value.text.length; + } + if (_editingController.value.text.length < _totalTextValue) { + setState(() { + _showItem = false; + }); + } + }, + onFieldSubmitted: (String value) async { + _pdfTextSearchResult = await widget.controller + .searchText(_editingController.text); + if (_pdfTextSearchResult.totalInstanceCount == 0) { + _showToast = true; + await Future.delayed(Duration(seconds: 2), () { + setState(() { + _showToast = false; + }); + }); + } else { + _showItem = true; + } + }, + ), + ), + ), + SearchToolbarItem( + child: Visibility( + visible: _editingController.text.isNotEmpty, + child: Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.clear, + color: _color, + size: 24, + ), + onPressed: () { + setState(() { + _editingController.clear(); + _pdfTextSearchResult?.clear(); + widget.controller.clearSelection(); + _showItem = false; + myFocusNode.requestFocus(); + }); + widget.onTap?.call('Clear Text'); + }, + tooltip: widget.showTooltip ? 'Clear Text' : null, + ), + ), + ), + ), + SearchToolbarItem( + child: Visibility( + visible: _showItem, + child: Row( + children: [ + Text( + '${_pdfTextSearchResult?.currentInstanceIndex}', + style: TextStyle(color: _color, fontSize: 16), + ), + Text( + ' of ', + style: TextStyle(color: _color, fontSize: 16), + ), + Text( + '${_pdfTextSearchResult?.totalInstanceCount}', + style: TextStyle(color: _color, fontSize: 16), + ), + Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.navigate_before, + color: _color, + size: 24, + ), + onPressed: () { + setState(() { + if (_pdfTextSearchResult?.totalInstanceCount != 0 && + _pdfTextSearchResult.currentInstanceIndex <= 1) { + _showAlertDialog(context); + } else { + _pdfTextSearchResult?.previousInstance(); + } + }); + widget.onTap?.call('Previous Instance'); + }, + tooltip: widget.showTooltip ? 'Previous' : null, + ), + ), + Material( + color: Colors.transparent, + child: IconButton( + icon: Icon( + Icons.navigate_next, + color: _color, + size: 24, + ), + onPressed: () { + setState(() { + if (_pdfTextSearchResult?.currentInstanceIndex == + _pdfTextSearchResult?.totalInstanceCount && + _pdfTextSearchResult?.currentInstanceIndex != 0 && + _pdfTextSearchResult?.totalInstanceCount != 0) { + _showDialog(context); + } else { + widget.controller.clearSelection(); + _pdfTextSearchResult?.nextInstance(); + } + }); + widget.onTap?.call('Next Instance'); + }, + tooltip: widget.showTooltip ? 'Next' : null, + ), + ), + ], + ), + ), + ) + ], + ), + ); + } +} + +/// Toolbar item widget +class ToolbarItem extends StatelessWidget { + ///Creates a toolbar item + ToolbarItem({ + this.height, + this.width, + @required this.child, + }); + + /// Height of the toolbar item + final double height; + + /// Width of the toolbar item + final double width; + + /// Child widget of the toolbar item + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + height: height, + width: width, + child: child, + ); + } +} + +/// SearchToolbar item widget +class SearchToolbarItem extends StatelessWidget { + ///Creates a search toolbar item + SearchToolbarItem({ + this.height, + this.width, + @required this.child, + }); + + /// Height of the search toolbar item + final double height; + + /// Width of the search toolbar item + final double width; + + /// Child widget of the search toolbar item + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + height: height, + width: width, + child: child, + ); + } +} + +/// Displays the error message +void showErrorDialog(BuildContext context, String error, String description) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text(error), + content: Text(description), + actions: [ + FlatButton( + child: Text('OK'), + onPressed: () { + Navigator.of(context, rootNavigator: true).pop(); + }, + ) + ], + ); + }, + ); +} diff --git a/lib/samples/pdf_viewer/pdf_viewer_getting_started.dart b/lib/samples/pdf_viewer/pdf_viewer_getting_started.dart new file mode 100644 index 00000000..e83ea962 --- /dev/null +++ b/lib/samples/pdf_viewer/pdf_viewer_getting_started.dart @@ -0,0 +1,211 @@ +///Package import +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +///PDF Viewer import +import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; + +/// Core theme import +import 'package:syncfusion_flutter_core/theme.dart'; + +///Local import +import '../../model/sample_view.dart'; + +///Widget of getting started PDF Viewer. +class GettingStartedPdfViewer extends SampleView { + /// Creates default getting started PDF Viewer. + const GettingStartedPdfViewer(Key key) : super(key: key); + + @override + _GettingStartedPdfViewerState createState() => + _GettingStartedPdfViewerState(); +} + +class _GettingStartedPdfViewerState extends SampleViewState { + bool _showPdf; + bool _showToast; + OverlayEntry _overlayEntry; + Color _contextMenuColor; + Color _copyColor; + double _contextMenuWidth; + double _contextMenuHeight; + final PdfViewerController _pdfViewerController = PdfViewerController(); + + @override + void initState() { + _showPdf = false; + _showToast = false; + _contextMenuHeight = 48; + _contextMenuWidth = 100; + super.initState(); + } + + @override + void didChangeDependencies() { + /// Used figma colors for context menu color and copy text color. + _contextMenuColor = model.themeData.brightness == Brightness.light + ? Color(0xFFFFFFFF) + : Color(0xFF424242); + _copyColor = model.themeData.brightness == Brightness.light + ? Color(0xFF000000) + : Color(0xFFFFFFFF); + super.didChangeDependencies(); + } + + /// Show Context menu for Text Selection. + void _showContextMenu( + BuildContext context, PdfTextSelectionChangedDetails details) { + final RenderBox renderBoxContainer = + context.findRenderObject() as RenderBox; + final Offset containerOffset = renderBoxContainer.localToGlobal( + renderBoxContainer.paintBounds.topLeft, + ); + if (containerOffset.dy < details.globalSelectedRegion.topLeft.dy - 55 || + (containerOffset.dy < + details.globalSelectedRegion.center.dy - + (_contextMenuHeight / 2) && + details.globalSelectedRegion.height > _contextMenuWidth)) { + double top = details.globalSelectedRegion.height > _contextMenuWidth + ? details.globalSelectedRegion.center.dy - (_contextMenuHeight / 2) + : details.globalSelectedRegion.topLeft.dy - 55; + double left = details.globalSelectedRegion.height > _contextMenuWidth + ? details.globalSelectedRegion.center.dx - (_contextMenuWidth / 2) + : details.globalSelectedRegion.bottomLeft.dx; + if ((details.globalSelectedRegion.top) > + MediaQuery.of(context).size.height / 2) { + top = details.globalSelectedRegion.topLeft.dy - 55; + left = details.globalSelectedRegion.bottomLeft.dx; + } + final OverlayState _overlayState = Overlay.of(context); + _overlayEntry = OverlayEntry( + builder: (context) => Positioned( + top: top, + left: left, + child: Container( + decoration: BoxDecoration( + color: _contextMenuColor, + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.14), + blurRadius: 2, + offset: Offset(0, 0), + ), + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.12), + blurRadius: 2, + offset: Offset(0, 2), + ), + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.2), + blurRadius: 3, + offset: Offset(0, 1), + ), + ], + ), + constraints: BoxConstraints.tightFor( + width: _contextMenuWidth, height: _contextMenuHeight), + child: FlatButton( + child: Text( + 'Copy', + style: TextStyle(fontSize: 17, color: _copyColor), + ), + onPressed: () async { + _checkAndCloseContextMenu(); + _pdfViewerController.clearSelection(); + await Clipboard.setData( + ClipboardData(text: details.selectedText)); + setState(() { + _showToast = true; + }); + await Future.delayed(Duration(seconds: 1)); + setState(() { + _showToast = false; + }); + }, + ), + ), + ), + ); + _overlayState.insert(_overlayEntry); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: FutureBuilder( + future: Future.delayed(Duration(milliseconds: 200)).then((value) { + _showPdf = true; + }), + builder: (context, snapshot) { + if (_showPdf) { + return SfPdfViewerTheme( + data: SfPdfViewerThemeData( + brightness: model.themeData.brightness), + child: Stack(children: [ + SfPdfViewer.asset( + 'assets/pdf/flutter_succinctly.pdf', + controller: _pdfViewerController, + onTextSelectionChanged: + (PdfTextSelectionChangedDetails details) { + if (details.selectedText == null && + _overlayEntry != null) { + _checkAndCloseContextMenu(); + } else if (details.selectedText != null && + _overlayEntry == null) { + _showContextMenu(context, details); + } + }, + ), + Visibility( + visible: _showToast, + child: Positioned.fill( + bottom: 25.0, + child: Align( + alignment: Alignment.bottomCenter, + child: Flex( + direction: Axis.horizontal, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.only( + left: 16, top: 6, right: 16, bottom: 6), + decoration: BoxDecoration( + color: Colors.grey[500], + borderRadius: BorderRadius.all( + Radius.circular(16.0), + ), + ), + child: Text( + 'Copied', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'Roboto', + fontSize: 16, + color: Colors.white), + ), + ), + ], + ), + ), + ), + ), + ]), + ); + } else { + return Container( + color: SfPdfViewerTheme.of(context).backgroundColor, + ); + } + }), + ); + } + + /// Check and close the context menu. + void _checkAndCloseContextMenu() { + if (_overlayEntry != null) { + _overlayEntry.remove(); + _overlayEntry = null; + } + } +} diff --git a/lib/samples/progress_bar/angles/angles.dart b/lib/samples/progress_bar/angles.dart similarity index 99% rename from lib/samples/progress_bar/angles/angles.dart rename to lib/samples/progress_bar/angles.dart index d52a95b2..e33ef618 100644 --- a/lib/samples/progress_bar/angles/angles.dart +++ b/lib/samples/progress_bar/angles.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarAngles extends SampleView { diff --git a/lib/samples/progress_bar/custom_labels/custom_labels.dart b/lib/samples/progress_bar/custom_labels.dart similarity index 99% rename from lib/samples/progress_bar/custom_labels/custom_labels.dart rename to lib/samples/progress_bar/custom_labels.dart index d456c2dc..da4cb6c6 100644 --- a/lib/samples/progress_bar/custom_labels/custom_labels.dart +++ b/lib/samples/progress_bar/custom_labels.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarCustomLabels extends SampleView { diff --git a/lib/samples/progress_bar/determinate_styles/determinate_styles.dart b/lib/samples/progress_bar/determinate_styles.dart similarity index 99% rename from lib/samples/progress_bar/determinate_styles/determinate_styles.dart rename to lib/samples/progress_bar/determinate_styles.dart index 5bff4a53..42c56fe0 100644 --- a/lib/samples/progress_bar/determinate_styles/determinate_styles.dart +++ b/lib/samples/progress_bar/determinate_styles.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarDeterminateStyle extends SampleView { diff --git a/lib/samples/progress_bar/segment_styles/segment_styles.dart b/lib/samples/progress_bar/segment_styles.dart similarity index 99% rename from lib/samples/progress_bar/segment_styles/segment_styles.dart rename to lib/samples/progress_bar/segment_styles.dart index 6007d57b..49011e87 100644 --- a/lib/samples/progress_bar/segment_styles/segment_styles.dart +++ b/lib/samples/progress_bar/segment_styles.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarSegmentStyle extends SampleView { diff --git a/lib/samples/progress_bar/track_with_marker/track_with_marker.dart b/lib/samples/progress_bar/track_with_marker.dart similarity index 99% rename from lib/samples/progress_bar/track_with_marker/track_with_marker.dart rename to lib/samples/progress_bar/track_with_marker.dart index 67847b59..9e6775f7 100644 --- a/lib/samples/progress_bar/track_with_marker/track_with_marker.dart +++ b/lib/samples/progress_bar/track_with_marker.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarTrackWithMarker extends SampleView { @@ -273,7 +273,7 @@ class _ProgressBarTrackWithMarkerState extends SampleViewState { MarkerPointer( value: progressValue, markerType: MarkerType.image, - imageUrl: 'images/ball.png', + imageUrl: 'images/ball_progressbar.png', markerHeight: model.isWeb ? 15 : 30, markerWidth: model.isWeb ? 15 : 30, enableAnimation: true, diff --git a/lib/samples/progress_bar/types/types.dart b/lib/samples/progress_bar/types.dart similarity index 99% rename from lib/samples/progress_bar/types/types.dart rename to lib/samples/progress_bar/types.dart index 8263fefa..547d2fe9 100644 --- a/lib/samples/progress_bar/types/types.dart +++ b/lib/samples/progress_bar/types.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:syncfusion_flutter_gauges/gauges.dart'; ///Local import -import '../../../model/sample_view.dart'; +import '../../model/sample_view.dart'; /// Widget of the AgendaView Calendar. class ProgressBarTypes extends SampleView { diff --git a/lib/samples/radial_range_slider/basic_features/angles/range_slider_angles.dart b/lib/samples/radial_range_slider/basic_features/angles/range_slider_angles.dart new file mode 100644 index 00000000..b98d4c2a --- /dev/null +++ b/lib/samples/radial_range_slider/basic_features/angles/range_slider_angles.dart @@ -0,0 +1,620 @@ +///Package imports +import 'package:flutter/material.dart'; + +///gauges import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the Radial Slider angles. +class RadialRangeSliderAngles extends SampleView { + const RadialRangeSliderAngles(Key key) : super(key: key); + + @override + _RadialRangeSliderAnglesState createState() => + _RadialRangeSliderAnglesState(); +} + +class _RadialRangeSliderAnglesState extends SampleViewState { + _RadialRangeSliderAnglesState(); + + double _size = 150; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _markerSize = 18; + _annotationFontSize = 15; + } else { + _markerSize = model.isWeb ? 18 : 12; + _annotationFontSize = model.isWeb ? 15 : 12; + } + if (MediaQuery.of(context).size.height > + MediaQuery.of(context).size.width) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 6 + : MediaQuery.of(context).size.height / 6; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirstSlider(), + Align( + alignment: !model.isWeb ? Alignment(0, 0) : Alignment(0, 0), + child: _getSecondSlider(), + ), + Align( + alignment: !model.isWeb ? Alignment(0, 0) : Alignment(0, 0), + child: _getThirdSlider()), + Align( + alignment: model.isWeb ? Alignment(0, 0) : Alignment(0, 0), + child: _getFourthSlider()), + ], + ), + ); + } else { + _size = MediaQuery.of(context).size.width / 5.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirstSlider(), + Align( + alignment: Alignment(0.8, 0), + child: _getSecondSlider(), + ), + Align( + alignment: Alignment(-0.5, 0), + child: _getThirdSlider(), + ), + Align( + alignment: model.isWeb ? Alignment(0, 0) : Alignment(0, 0.5), + child: _getFourthSlider()), + ], + ), + ); + } + } + + @override + void dispose() { + super.dispose(); + } + + Widget _getSecondSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 90, + endAngle: 270, + ranges: [ + GaugeRange( + startValue: _thirdMarkerValue, + endValue: _fourthMarkerValue, + endWidth: 0.1, + startWidth: 0.1, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor) + ], + pointers: [ + MarkerPointer( + value: _thirdMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + onValueChanged: handleThirdPointerValueChanged, + onValueChanging: handleThirdPointerValueChanging, + borderWidth: 4, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + MarkerPointer( + value: _fourthMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleFourthPointerValueChanged, + onValueChanging: handleFourthPointerValueChanging, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue2 - $_annotationValue_2', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: model.currentThemeData.brightness == + Brightness.light + ? Colors.black + : Colors.white), + ), + positionFactor: 0.13, + angle: 0) + ]) + ]), + ); + } + + Widget _getThirdSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 90, + ranges: [ + GaugeRange( + startValue: _fifthMarkerValue, + endValue: _sixthMarkerValue, + endWidth: 0.1, + startWidth: 0.1, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor) + ], + pointers: [ + MarkerPointer( + value: _fifthMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleFifthPointerValueChanged, + onValueChanging: handleFifthPointerValueChanging, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + MarkerPointer( + value: _sixthMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleSixthPointerValueChanged, + onValueChanging: handleSixthPointerValueChanging, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue3 - $_annotationValue_3', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: model.currentThemeData.brightness == + Brightness.light + ? Colors.black + : Colors.white), + ), + positionFactor: 0.13, + angle: 0) + ]), + ]), + ); + } + + Widget _getFirstSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + startValue: _firstMarkerValue, + endValue: _secondMarkerValue, + endWidth: 0.1, + startWidth: 0.1, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + MarkerPointer( + value: _secondMarkerValue, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + enableDragging: true, + borderWidth: 4, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue1 - $_annotationValue_1', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: model.currentThemeData.brightness == + Brightness.light + ? Colors.black + : Colors.white), + ), + positionFactor: 0.13, + angle: 0) + ]) + ]), + ); + } + + Widget _getFourthSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 180, + endAngle: 0, + ranges: [ + GaugeRange( + startValue: _seventhMarkerValue, + endValue: _eighthMarkerValue, + endWidth: 0.1, + startWidth: 0.1, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor) + ], + pointers: [ + MarkerPointer( + value: _seventhMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleSeventhPointerValueChanged, + onValueChanging: handleSeventhPointerValueChanging, + enableDragging: true, + borderColor: model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + MarkerPointer( + value: _eighthMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleEighthPointerValueChanged, + onValueChanging: handleEighthPointerValueChanging, + enableDragging: true, + borderColor: model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue4 - $_annotationValue_4', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white), + ), + positionFactor: 0.13, + angle: 0) + ], + ), + ]), + ); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = _secondMarkerValue.abs().round().toInt(); + _annotationValue_1 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = _firstMarkerValue.abs().round().toInt(); + _annotationValue1 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleFourthPointerValueChanged(double value) { + setState(() { + _fourthMarkerValue = value; + final int _value = _fourthMarkerValue.abs().round().toInt(); + _annotationValue_2 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleFourthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _thirdMarkerValue || + (args.value - _fourthMarkerValue).abs() > 10) { + if (args.value <= _thirdMarkerValue) { + if ((args.value - _fourthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fourthMarkerValue = _thirdMarkerValue; + _thirdMarkerValue = args.value; + } + } + } + } + + /// Value changed call back for first pointer + void handleThirdPointerValueChanged(double value) { + setState(() { + _thirdMarkerValue = value; + final int _value = _thirdMarkerValue.abs().round().toInt(); + _annotationValue2 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleThirdPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _fourthMarkerValue || + (args.value - _thirdMarkerValue).abs() > 10) { + if (args.value >= _fourthMarkerValue) { + if ((args.value - _thirdMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _thirdMarkerValue = _fourthMarkerValue; + _fourthMarkerValue = args.value; + } + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSixthPointerValueChanged(double value) { + setState(() { + _sixthMarkerValue = value; + final int _value = _sixthMarkerValue.abs().round().toInt(); + _annotationValue_3 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSixthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _fifthMarkerValue || + (args.value - _sixthMarkerValue).abs() > 10) { + if (args.value <= _fifthMarkerValue) { + if ((args.value - _sixthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _sixthMarkerValue = _fifthMarkerValue; + _fifthMarkerValue = args.value; + } + } + } + } + + /// Value changed call back for first pointer + void handleFifthPointerValueChanged(double value) { + setState(() { + _fifthMarkerValue = value; + final int _value = _fifthMarkerValue.abs().round().toInt(); + _annotationValue3 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFifthPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _sixthMarkerValue || + (args.value - _fifthMarkerValue).abs() > 10) { + if (args.value >= _sixthMarkerValue) { + if ((args.value - _fifthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fifthMarkerValue = _sixthMarkerValue; + _sixthMarkerValue = args.value; + } + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleEighthPointerValueChanged(double value) { + setState(() { + _eighthMarkerValue = value; + final int _value = _eighthMarkerValue.abs().round().toInt(); + _annotationValue_4 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleEighthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _seventhMarkerValue || + (args.value - _eighthMarkerValue).abs() > 10) { + if (args.value <= _seventhMarkerValue) { + if ((args.value - _eighthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _eighthMarkerValue = _seventhMarkerValue; + _seventhMarkerValue = args.value; + } + } + } + } + + /// Value changed call back for first pointer + void handleSeventhPointerValueChanged(double value) { + setState(() { + _seventhMarkerValue = value; + final int _value = _seventhMarkerValue.abs().round().toInt(); + _annotationValue4 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleSeventhPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _eighthMarkerValue || + (args.value - _seventhMarkerValue).abs() > 10) { + if (args.value >= _eighthMarkerValue) { + if ((args.value - _seventhMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _seventhMarkerValue = _eighthMarkerValue; + _eighthMarkerValue = args.value; + } + } + } + } + + double _firstMarkerValue = 0; + double _secondMarkerValue = 60; + double _thirdMarkerValue = 0; + double _fourthMarkerValue = 60; + double _fifthMarkerValue = 0; + double _sixthMarkerValue = 60; + double _seventhMarkerValue = 0; + double _eighthMarkerValue = 60; + String _annotationValue1 = '0'; + String _annotationValue_1 = '60'; + String _annotationValue2 = '0'; + String _annotationValue_2 = '60'; + String _annotationValue3 = '0'; + String _annotationValue_3 = '60'; + String _annotationValue4 = '0'; + String _annotationValue_4 = '60'; + double _markerSize = 10; + double _annotationFontSize = 25; +} diff --git a/lib/samples/radial_range_slider/basic_features/labels_and_ticks/range_slider_labels_and_ticks.dart b/lib/samples/radial_range_slider/basic_features/labels_and_ticks/range_slider_labels_and_ticks.dart new file mode 100644 index 00000000..c4dae774 --- /dev/null +++ b/lib/samples/radial_range_slider/basic_features/labels_and_ticks/range_slider_labels_and_ticks.dart @@ -0,0 +1,196 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider ticks and labels. +class RadialRangeSliderLabelsTicks extends SampleView { + const RadialRangeSliderLabelsTicks(Key key) : super(key: key); + + @override + _RadialRangeSliderLabelsTicksState createState() => + _RadialRangeSliderLabelsTicksState(); +} + +class _RadialRangeSliderLabelsTicksState extends SampleViewState { + _RadialRangeSliderLabelsTicksState(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 27; + _annotationFontSize = 25; + } else { + _firstMarkerSize = model.isWeb ? 20 : 15; + _annotationFontSize = model.isWeb ? 25 : 15; + } + + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + tickOffset: 0.2, + labelOffset: 0.15, + offsetUnit: GaugeSizeUnit.factor, + minorTicksPerInterval: 7, + majorTickStyle: + MajorTickStyle(length: 0.1, lengthUnit: GaugeSizeUnit.factor), + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: const Color.fromRGBO(0, 198, 139, 1), + endWidth: 0.1, + startWidth: 0.1) + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue1 - $_annotationValue2', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + ], + ), + positionFactor: 0.7, + angle: 90) + ]), + // Create secondary radial axis for segmented line + RadialAxis( + interval: 20, + showLabels: false, + showTicks: true, + showAxisLine: false, + tickOffset: -0.05, + offsetUnit: GaugeSizeUnit.factor, + minorTicksPerInterval: 0, + radiusFactor: 0.85, + majorTickStyle: MajorTickStyle( + length: 0.3, + thickness: 3, + lengthUnit: GaugeSizeUnit.factor, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Color.fromRGBO(33, 33, 33, 1)), + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderColor: const Color.fromRGBO(0, 198, 139, 1), + borderWidth: 7, + markerOffset: 0.0355, + offsetUnit: GaugeSizeUnit.factor, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + ), + MarkerPointer( + value: _secondMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderColor: const Color.fromRGBO(0, 198, 139, 1), + enableDragging: true, + borderWidth: 6, + markerOffset: 0.0355, + offsetUnit: GaugeSizeUnit.factor, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + ) + ], + ), + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = _secondMarkerValue.abs().round().toInt(); + _annotationValue2 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = _firstMarkerValue.abs().round().toInt(); + _annotationValue1 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + double _secondMarkerValue = 70; + double _firstMarkerValue = 10; + double _firstMarkerSize = 10; + double _annotationFontSize = 25; + String _annotationValue1 = '10'; + String _annotationValue2 = '70'; +} diff --git a/lib/samples/radial_range_slider/basic_features/state/range_slider_state.dart b/lib/samples/radial_range_slider/basic_features/state/range_slider_state.dart new file mode 100644 index 00000000..f833000c --- /dev/null +++ b/lib/samples/radial_range_slider/basic_features/state/range_slider_state.dart @@ -0,0 +1,194 @@ +///Package imports +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider state. +class RadialRangeSliderStateTypes extends SampleView { + const RadialRangeSliderStateTypes(Key key) : super(key: key); + + @override + _RadialRangeSliderStateTypesState createState() => + _RadialRangeSliderStateTypesState(); +} + +class _RadialRangeSliderStateTypesState extends SampleViewState { + _RadialRangeSliderStateTypesState(); + + bool _enableDragging = true; + double _secondMarkerValue = 30; + double _firstMarkerValue = 0; + double _markerSize = 30; + double _annotationFontSize = 25; + String _annotationValue1 = '0'; + String _annotationValue2 = '30'; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _markerSize = 35; + } else { + _markerSize = model.isWeb ? 25 : 25; + } + + return Center( + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: model.isWeb ? 0.15 : 0.25, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: _enableDragging + ? const Color.fromRGBO(34, 144, 199, 1) + : const Color(0xFF888888), + endWidth: model.isWeb ? 0.15 : 0.25, + startWidth: model.isWeb ? 0.15 : 0.25, + ) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + enableDragging: _enableDragging, + color: Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + MarkerPointer( + value: _secondMarkerValue, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + enableDragging: _enableDragging, + color: Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue1 - $_annotationValue2', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + ], + ), + positionFactor: 0.13, + angle: 90) + ]) + ], + ), + ); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row(children: [ + Text('Enable Drag', style: TextStyle(color: model.textColor)), + Padding( + padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), //as you need + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: _enableDragging, + onChanged: (bool value) { + setState(() { + _enableDragging = value; + stateSetter(() {}); + }); + }, + )), + ), + ]); + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = _secondMarkerValue.abs().toInt(); + _annotationValue2 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = _firstMarkerValue.abs().toInt(); + _annotationValue1 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + @override + void dispose() { + super.dispose(); + } +} diff --git a/lib/samples/radial_range_slider/customization/custom_text/range_slider_custom_text.dart b/lib/samples/radial_range_slider/customization/custom_text/range_slider_custom_text.dart new file mode 100644 index 00000000..130fc6ee --- /dev/null +++ b/lib/samples/radial_range_slider/customization/custom_text/range_slider_custom_text.dart @@ -0,0 +1,194 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider custom text. +class RadialRangeSliderCustomText extends SampleView { + const RadialRangeSliderCustomText(Key key) : super(key: key); + + @override + _RadialRangeSliderCustomTextState createState() => + _RadialRangeSliderCustomTextState(); +} + +class _RadialRangeSliderCustomTextState extends SampleViewState { + _RadialRangeSliderCustomTextState(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 30; + _annotationFontSize = 20; + } else { + _firstMarkerSize = model.isWeb ? 25 : 20; + _annotationFontSize = model.isWeb ? 25 : 15; + } + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + axisLineStyle: AxisLineStyle( + thickness: model.isWeb ? 0.15 : 0.2, + thicknessUnit: GaugeSizeUnit.factor), + showTicks: false, + showLabels: true, + labelOffset: 25, + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: _rangeColor, + endWidth: model.isWeb ? 0.15 : 0.2, + startWidth: model.isWeb ? 0.15 : 0.2, + ) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + color: Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + borderColor: _rangeColor, + borderWidth: 9.5, + markerType: MarkerType.circle, + enableDragging: true, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + ), + MarkerPointer( + value: _secondMarkerValue - 1, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + enableDragging: true, + color: Colors.white, + borderColor: _rangeColor, + borderWidth: 9.5, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + ], + ), + positionFactor: 0.13, + angle: 0) + ]) + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = (_firstMarkerValue - _secondMarkerValue).abs().toInt(); + if (_value < 99 && _annotationValue != 'In-progress') { + _annotationValue = 'In-progress'; + + if (_rangeColor != const Color.fromRGBO(255, 150, 0, 1)) { + _rangeColor = const Color.fromRGBO(255, 150, 0, 1); + } + if (_annotationColor != const Color.fromRGBO(255, 150, 0, 1)) { + _annotationColor = const Color.fromRGBO(255, 150, 0, 1); + } + } else if (_value == 99) { + _annotationValue = 'Done'; + _rangeColor = const Color(0xFF00A8B5); + _annotationColor = const Color(0xFF00A8B5); + } + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = (_firstMarkerValue - _secondMarkerValue).abs().toInt(); + if (_value < 99 && _annotationValue != 'In-progress') { + _annotationValue = 'In-progress'; + + if (_rangeColor != const Color.fromRGBO(255, 150, 0, 1)) { + _rangeColor = const Color.fromRGBO(255, 150, 0, 1); + } + if (_annotationColor != const Color.fromRGBO(255, 150, 0, 1)) { + _annotationColor = const Color.fromRGBO(255, 150, 0, 1); + } + } else if (_value == 99) { + _annotationValue = 'Done'; + _rangeColor = const Color(0xFF00A8B5); + _annotationColor = const Color(0xFF00A8B5); + } + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + double _secondMarkerValue = 60; + double _firstMarkerValue = 0; + double _firstMarkerSize = 10; + double _annotationFontSize = 25; + String _annotationValue = 'In-progress'; + Color _rangeColor = const Color.fromRGBO(255, 150, 0, 1); + Color _annotationColor = const Color.fromRGBO(255, 150, 0, 1); +} diff --git a/lib/samples/radial_range_slider/customization/gradient/range_slider_gradient.dart b/lib/samples/radial_range_slider/customization/gradient/range_slider_gradient.dart new file mode 100644 index 00000000..b26b5036 --- /dev/null +++ b/lib/samples/radial_range_slider/customization/gradient/range_slider_gradient.dart @@ -0,0 +1,238 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider gradient. +class RadialRangeSliderGradient extends SampleView { + const RadialRangeSliderGradient(Key key) : super(key: key); + + @override + _RadialRangeSliderGradientState createState() => + _RadialRangeSliderGradientState(); +} + +class _RadialRangeSliderGradientState extends SampleViewState { + _RadialRangeSliderGradientState(); + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 30; + _annotationFontSize = 25; + } else { + _firstMarkerSize = model.isWeb ? 20 : 15; + _annotationFontSize = model.isWeb ? 25 : 15; + } + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + thickness: 0, thicknessUnit: GaugeSizeUnit.factor), + tickOffset: 0.20, + labelOffset: 0.10, + offsetUnit: GaugeSizeUnit.factor, + minorTicksPerInterval: 5, + onLabelCreated: (args) { + double axisValue = double.parse(args.text); + double celsiusValue = (axisValue - 32) / 1.8; + args.text = celsiusValue.toStringAsFixed(1); + }, + majorTickStyle: + MajorTickStyle(length: 0.1, lengthUnit: GaugeSizeUnit.factor), + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_firstCelsiusAnnotationValue°C' + + ' to $_secondCelsiusAnnotationValue', + style: TextStyle( + fontSize: _celsiusAnnotationFontSize, + fontFamily: 'Times', + // fontWeight: FontWeight.bold + ), + ), + Text( + '°C', + style: TextStyle( + fontSize: _celsiusAnnotationFontSize, + fontFamily: 'Times', + // fontWeight: FontWeight.bold, + ), + ) + ], + ), + positionFactor: 0.15, + angle: 90) + ]), + RadialAxis( + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showTicks: false, + showLabels: true, + labelOffset: 20, + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + gradient: model.isWeb + ? null + : const SweepGradient(colors: [ + Color.fromRGBO(115, 67, 189, 1), + Color.fromRGBO(202, 94, 230, 1) + ], stops: [ + 0.5, + 1 + ]), + endWidth: 0.1, + startWidth: 0.1) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 7, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + enableDragging: true, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + ), + MarkerPointer( + value: _secondMarkerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 7, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + enableDragging: true, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_firstAnnotationValue°F to $_secondAnnotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold), + ), + Text( + '°F', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ) + ], + ), + positionFactor: 0.05, + angle: 0) + ]) + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + // final int _value = + // (_firstMarkerValue - _secondMarkerValue).abs().round().toInt(); + final int _value = _secondMarkerValue.abs().round().toInt(); + _secondAnnotationValue = '$_value'; + final double _celsiusValue = (_value - 32) / 1.8; + _secondCelsiusAnnotationValue = '${_celsiusValue.toStringAsFixed(1)}'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + // final int _value = + // (_firstMarkerValue - _secondMarkerValue).abs().round().toInt(); + final int _value = _firstMarkerValue.abs().round().toInt(); + _firstAnnotationValue = '$_value'; + final double _celsiusValue = (_value - 32) / 1.8; + _firstCelsiusAnnotationValue = '${_celsiusValue.toStringAsFixed(1)}'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + double _secondMarkerValue = 60; + double _firstMarkerValue = 0; + double _firstMarkerSize = 30; + double _annotationFontSize = 25; + double _celsiusAnnotationFontSize = 18; + String _firstAnnotationValue = '0'; + String _secondAnnotationValue = '60'; + String _firstCelsiusAnnotationValue = '-${17.7778.toStringAsFixed(1)}'; + String _secondCelsiusAnnotationValue = '${15.5556.toStringAsFixed(1)}'; +} diff --git a/lib/samples/radial_range_slider/customization/styles/range_slider_styles.dart b/lib/samples/radial_range_slider/customization/styles/range_slider_styles.dart new file mode 100644 index 00000000..6f8b0f1a --- /dev/null +++ b/lib/samples/radial_range_slider/customization/styles/range_slider_styles.dart @@ -0,0 +1,943 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider styles. +class RadialRangeSliderStyles extends SampleView { + const RadialRangeSliderStyles(Key key) : super(key: key); + + @override + _RadialRangeSliderStylesState createState() => + _RadialRangeSliderStylesState(); +} + +class _RadialRangeSliderStylesState extends SampleViewState { + _RadialRangeSliderStylesState(); + + double _annotationFontSize = 25; + double _firstMarkerSize = 20; + double _secondMarkerSize = 20; + double _markerWidth = 10; + double _size = 150; + double _borderWidth = 8; + + double _firstMarkerValue = 0; + double _secondMarkerValue = 30; + String _annotationValue1 = '0'; + String _annotationValue_1 = '30'; + + double _thirdMarkerValue = 0; + double _fourthMarkerValue = 30; + String _annotationValue2 = '0'; + String _annotationValue_2 = '30'; + + double _fifthMarkerValue = 0; + double _sixthMarkerValue = 30; + String _annotationValue3 = '0'; + String _annotationValue_3 = '30'; + + double _seventhMarkerValue = 0; + double _eighthMarkerValue = 30; + String _annotationValue4 = '0'; + String _annotationValue_4 = '30'; + + double _ninthMarkerValue = 0; + double _tenthMarkerValue = 30; + String _annotationValue5 = '0'; + String _annotationValue_5 = '30'; + + double _eleventhMarkerValue = 0; + double _twelethMarkerValue = 30; + String _annotationValue6 = '0'; + String _annotationValue_6 = '30'; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + Size actualSize = MediaQuery.of(context).size; + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 15; + _secondMarkerSize = 20; + _borderWidth = 5; + _markerWidth = 5; + _annotationFontSize = 15; + } else { + _firstMarkerSize = model.isWeb ? 15 : 10; + _secondMarkerSize = model.isWeb ? 20 : 15; + _markerWidth = model.isWeb ? 3 : 3; + _borderWidth = model.isWeb ? 5 : 3; + _annotationFontSize = model.isWeb ? 15 : 12; + } + + if (actualSize.width > actualSize.height) { + _size = actualSize.height / 5; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [_getFirtSlider(), _getSecondSlider(), _getThirdSlider()], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFourthSlider(), + _getFifthSlider(), + _getSixthSlider() + ], + ), + ], + ); + } else { + _size = actualSize.height / 5; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [_getFirtSlider(), _getSecondSlider(), _getThirdSlider()], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFourthSlider(), + _getFifthSlider(), + _getSixthSlider() + ], + ), + ], + ); + } + } + + Widget _getFirtSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(191, 214, 252, 1) + : const Color.fromRGBO(36, 58, 97, 1), + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: Color.fromRGBO(41, 118, 246, 1), + endWidth: 0.1, + startWidth: 0.1) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: _borderWidth, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + borderColor: Color.fromRGBO(41, 118, 246, 1)), + MarkerPointer( + value: _secondMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: _borderWidth, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + borderColor: Color.fromRGBO(41, 118, 246, 1)), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue1 - $_annotationValue_1', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getSecondSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(218, 218, 218, 1) + : const Color.fromRGBO(88, 88, 88, 1), + thickness: 0.15, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: _fourthMarkerValue, + startValue: _thirdMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: const Color.fromRGBO(126, 86, 212, 1), + endWidth: 0.15, + startWidth: 0.15) + ], + pointers: [ + MarkerPointer( + enableDragging: true, + value: _thirdMarkerValue, + color: const Color.fromRGBO(126, 86, 212, 1), + borderWidth: 9, + markerWidth: _firstMarkerSize, + markerHeight: _markerWidth, + onValueChanged: handleThirdPointerValueChanged, + onValueChanging: handleThirdPointerValueChanging, + markerType: MarkerType.rectangle, + borderColor: const Color.fromRGBO(126, 86, 212, 1)), + MarkerPointer( + value: _fourthMarkerValue, + enableDragging: true, + color: const Color.fromRGBO(126, 86, 212, 1), + borderWidth: 9, + markerWidth: _firstMarkerSize, + markerHeight: _markerWidth, + onValueChanged: handleFourthPointerValueChanged, + onValueChanging: handleFourthPointerValueChanging, + markerType: MarkerType.rectangle, + borderColor: const Color.fromRGBO(126, 86, 212, 1)), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue2 - $_annotationValue_2', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getThirdSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: const Color.fromRGBO(254, 166, 25, 1), + thickness: 0.25, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: 100, + startValue: 0, + sizeUnit: GaugeSizeUnit.factor, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : const Color.fromRGBO(41, 37, 32, 1), + endWidth: 0.145, + rangeOffset: 0.05, + startWidth: 0.145), + GaugeRange( + endValue: _sixthMarkerValue, + startValue: _fifthMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: const Color.fromRGBO(254, 166, 25, 1), + rangeOffset: 0.05, + endWidth: 0.144, + startWidth: 0.144), + ], + pointers: [ + MarkerPointer( + value: _sixthMarkerValue, + enableDragging: true, + color: Colors.white, + borderWidth: _borderWidth, + markerHeight: _secondMarkerSize, + markerWidth: _secondMarkerSize, + onValueChanged: handleSixthPointerValueChanged, + onValueChanging: handleSixthPointerValueChanging, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(254, 166, 25, 1), + ), + MarkerPointer( + value: _fifthMarkerValue, + enableDragging: true, + color: Colors.white, + borderWidth: _borderWidth, + markerHeight: _secondMarkerSize, + markerWidth: _secondMarkerSize, + onValueChanged: handleFifthPointerValueChanged, + onValueChanging: handleFifthPointerValueChanging, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(254, 166, 25, 1), + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue3 - $_annotationValue_3', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getFourthSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(201, 201, 201, 1) + : const Color.fromRGBO(78, 78, 78, 1), + thickness: 0.15, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: 100, + startValue: 0, + sizeUnit: GaugeSizeUnit.factor, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + endWidth: 0.09, + rangeOffset: 0.03, + startWidth: 0.09), + GaugeRange( + endValue: _eighthMarkerValue, + startValue: _seventhMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + rangeOffset: 0.05, + endWidth: 0.05, + color: const Color.fromRGBO(88, 194, 143, 1), + startWidth: 0.05), + ], + pointers: [ + MarkerPointer( + value: _seventhMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 3, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleSeventhPointerValueChanged, + onValueChanging: handleSeventhPointerValueChanging, + borderColor: Color.fromRGBO(88, 194, 143, 1)), + MarkerPointer( + value: _seventhMarkerValue, + enableDragging: true, + color: Color.fromRGBO(88, 194, 143, 1), + borderWidth: 1, + markerHeight: 7, + markerWidth: 7, + markerType: MarkerType.circle, + onValueChanged: handleSeventhPointerValueChanged, + onValueChanging: handleSeventhPointerValueChanging, + borderColor: Color.fromRGBO(88, 194, 143, 1)), + MarkerPointer( + value: _eighthMarkerValue, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 3, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + onValueChanged: handleEighthPointerValueChanged, + onValueChanging: handleEighthPointerValueChanging, + borderColor: Color.fromRGBO(88, 194, 143, 1)), + MarkerPointer( + value: _eighthMarkerValue, + enableDragging: true, + color: Color.fromRGBO(88, 194, 143, 1), + borderWidth: 1, + markerHeight: 7, + markerWidth: 7, + markerType: MarkerType.circle, + onValueChanged: handleEighthPointerValueChanged, + onValueChanging: handleEighthPointerValueChanging, + borderColor: Color.fromRGBO(88, 194, 143, 1)) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue4 - $_annotationValue_4', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getFifthSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + color: Color.fromRGBO(41, 118, 246, 1), + thickness: 0.3, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: _tenthMarkerValue, + startValue: _ninthMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: const Color.fromRGBO(254, 166, 25, 1), + endWidth: 0.15, + rangeOffset: 0.075, + startWidth: 0.15), + ], + pointers: [ + MarkerPointer( + value: _ninthMarkerValue, + color: const Color.fromRGBO(254, 166, 25, 1), + markerHeight: _firstMarkerSize, + enableDragging: true, + markerWidth: _firstMarkerSize, + onValueChanged: handleNinthPointerValueChanged, + onValueChanging: handleNinthPointerValueChanging, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(34, 144, 199, 0.75)), + MarkerPointer( + value: _tenthMarkerValue, + enableDragging: true, + color: const Color.fromRGBO(254, 166, 25, 1), + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + onValueChanged: handleTenthPointerValueChanged, + onValueChanging: handleTenthPointerValueChanging, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(34, 144, 199, 0.75)), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue5 - $_annotationValue_5', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getSixthSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLabelStyle: GaugeTextStyle(fontSize: 8), + interval: 10, + axisLineStyle: AxisLineStyle( + thickness: 0.03, thicknessUnit: GaugeSizeUnit.factor), + showTicks: false, + showLabels: false, + startAngle: 270, + endAngle: 270, + ranges: [ + GaugeRange( + endValue: _twelethMarkerValue, + startValue: _eleventhMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: const Color.fromRGBO(135, 80, 221, 1), + endWidth: 0.07, + rangeOffset: 0.27, + startWidth: 0.07), + ], + pointers: [ + NeedlePointer( + value: _twelethMarkerValue, + enableDragging: true, + needleColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + needleEndWidth: 2, + needleStartWidth: 2, + onValueChanged: handleTwelethPointerValueChanged, + // onValueChangeEnd: handleTwelethPointerValueChanged, + onValueChanging: handleTwelethPointerValueChanging, + needleLength: 0.71, + knobStyle: KnobStyle( + knobRadius: model.isWeb ? 0.4 : 0.3, + borderWidth: 0.05, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.white + : const Color.fromRGBO(33, 33, 33, 1), + )), + NeedlePointer( + value: _eleventhMarkerValue, + enableDragging: true, + needleColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + needleEndWidth: 2, + needleStartWidth: 2, + onValueChanged: handleEleventhPointerValueChanged, + // onValueChangeEnd: handleEleventhPointerValueChanged, + onValueChanging: handleEleventhPointerValueChanging, + needleLength: 0.71, + knobStyle: KnobStyle( + knobRadius: model.isWeb ? 0.4 : 0.3, + borderWidth: 0.05, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.white + : const Color.fromRGBO(33, 33, 33, 1), + )), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue6 - $_annotationValue_6', + style: TextStyle( + fontSize: model.isWeb ? 10 : 12, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: model.currentThemeData.brightness == + Brightness.light + ? Colors.black + : Colors.white, + ), + ), + positionFactor: 0, + angle: 90) + ]) + ], + ), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = _secondMarkerValue.abs().round().toInt(); + _annotationValue_1 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = _firstMarkerValue.abs().round().toInt(); + _annotationValue1 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleFourthPointerValueChanged(double value) { + setState(() { + _fourthMarkerValue = value; + final int _value = _fourthMarkerValue.abs().round().toInt(); + _annotationValue_2 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleFourthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _thirdMarkerValue || + (args.value - _fourthMarkerValue).abs() > 10) { + if (args.value <= _thirdMarkerValue) { + if ((args.value - _fourthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fourthMarkerValue = _thirdMarkerValue; + _thirdMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleThirdPointerValueChanged(double value) { + setState(() { + _thirdMarkerValue = value; + final int _value = _thirdMarkerValue.abs().round().toInt(); + _annotationValue2 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleThirdPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _fourthMarkerValue || + (args.value - _thirdMarkerValue).abs() > 10) { + if (args.value >= _fourthMarkerValue) { + if ((args.value - _thirdMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _thirdMarkerValue = _fourthMarkerValue; + _fourthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSixthPointerValueChanged(double value) { + setState(() { + _sixthMarkerValue = value; + final int _value = _sixthMarkerValue.abs().round().toInt(); + _annotationValue_3 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSixthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _fifthMarkerValue || + (args.value - _sixthMarkerValue).abs() > 10) { + if (args.value <= _fifthMarkerValue) { + if ((args.value - _sixthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _sixthMarkerValue = _fifthMarkerValue; + _fifthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFifthPointerValueChanged(double value) { + setState(() { + _fifthMarkerValue = value; + final int _value = _fifthMarkerValue.abs().round().toInt(); + _annotationValue3 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFifthPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _sixthMarkerValue || + (args.value - _fifthMarkerValue).abs() > 10) { + if (args.value >= _sixthMarkerValue) { + if ((args.value - _fifthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fifthMarkerValue = _sixthMarkerValue; + _sixthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleEighthPointerValueChanged(double value) { + setState(() { + _eighthMarkerValue = value; + final int _value = _eighthMarkerValue.abs().round().toInt(); + _annotationValue_4 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleEighthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _seventhMarkerValue || + (args.value - _eighthMarkerValue).abs() > 10) { + if (args.value <= _seventhMarkerValue) { + if ((args.value - _eighthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _eighthMarkerValue = _seventhMarkerValue; + _seventhMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleSeventhPointerValueChanged(double value) { + setState(() { + _seventhMarkerValue = value; + final int _value = _seventhMarkerValue.abs().round().toInt(); + _annotationValue4 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleSeventhPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _eighthMarkerValue || + (args.value - _seventhMarkerValue).abs() > 10) { + if (args.value >= _eighthMarkerValue) { + if ((args.value - _seventhMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _seventhMarkerValue = _eighthMarkerValue; + _eighthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleTenthPointerValueChanged(double value) { + setState(() { + _tenthMarkerValue = value; + final int _value = _tenthMarkerValue.abs().round().toInt(); + _annotationValue_5 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleTenthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _ninthMarkerValue || + (args.value - _tenthMarkerValue).abs() > 10) { + if (args.value <= _ninthMarkerValue) { + if ((args.value - _tenthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _tenthMarkerValue = _ninthMarkerValue; + _ninthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleNinthPointerValueChanged(double value) { + setState(() { + _ninthMarkerValue = value; + final int _value = _ninthMarkerValue.abs().round().toInt(); + _annotationValue5 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleNinthPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _tenthMarkerValue || + (args.value - _ninthMarkerValue).abs() > 10) { + if (args.value >= _tenthMarkerValue) { + if ((args.value - _ninthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _ninthMarkerValue = _tenthMarkerValue; + _tenthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleTwelethPointerValueChanged(double value) { + setState(() { + _twelethMarkerValue = value; + final int _value = _twelethMarkerValue.abs().round().toInt(); + _annotationValue_6 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleTwelethPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _eleventhMarkerValue || + (args.value - _twelethMarkerValue).abs() > 10) { + if (args.value <= _eleventhMarkerValue) { + if ((args.value - _twelethMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _twelethMarkerValue = _eleventhMarkerValue; + _eleventhMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleEleventhPointerValueChanged(double value) { + setState(() { + _eleventhMarkerValue = value; + final int _value = _eleventhMarkerValue.abs().round().toInt(); + _annotationValue6 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleEleventhPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _twelethMarkerValue || + (args.value - _eleventhMarkerValue).abs() > 10) { + if (args.value >= _twelethMarkerValue) { + if ((args.value - _eleventhMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _eleventhMarkerValue = _twelethMarkerValue; + _twelethMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } +} diff --git a/lib/samples/radial_range_slider/customization/thumb/range_slider_thumb.dart b/lib/samples/radial_range_slider/customization/thumb/range_slider_thumb.dart new file mode 100644 index 00000000..7df97f3d --- /dev/null +++ b/lib/samples/radial_range_slider/customization/thumb/range_slider_thumb.dart @@ -0,0 +1,470 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the radial slider thumb customization. +class RadialRangeSliderThumb extends SampleView { + const RadialRangeSliderThumb(Key key) : super(key: key); + + @override + _RadialRangeSliderThumbState createState() => _RadialRangeSliderThumbState(); +} + +class _RadialRangeSliderThumbState extends SampleViewState { + _RadialRangeSliderThumbState(); + + double _firstMarkerValue = 0; + double _secondMarkerValue = 75; + double _thirdMarkerValue = 0; + double _fourthMarkerValue = 75; + double _fifthMarkerValue = 0; + double _sixthMarkerValue = 75; + String _annotationValue1 = '0'; + String _annotationValue_1 = '75'; + String _annotationValue2 = '0'; + String _annotationValue_2 = '75'; + String _annotationValue3 = '0'; + String _annotationValue_3 = '75'; + + double _size = 150; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).size.height > + MediaQuery.of(context).size.width) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 3.5 + : MediaQuery.of(context).size.height / 5; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: !model.isWeb + ? [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + getSliderWithImage(), + Center(child: Text('Image thumb')), + ] + : [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')) + ], + )); + } else { + _size = MediaQuery.of(context).size.width / 4.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: !model.isWeb + ? [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithImage(), + Center(child: Text('Image thumb')), + ]), + ] + : [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + ]), + ], + )); + } + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithCircle() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + ranges: [ + GaugeRange( + endValue: _secondMarkerValue, + startValue: _firstMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: model.isWeb ? Color.fromRGBO(197, 91, 226, 1) : null, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ]), + endWidth: 0.1, + startWidth: 0.1) + ], + pointers: [ + MarkerPointer( + value: _firstMarkerValue, + markerType: MarkerType.circle, + markerHeight: 22, + markerWidth: 22, + enableDragging: true, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ), + MarkerPointer( + value: _secondMarkerValue, + markerType: MarkerType.circle, + markerHeight: 22, + markerWidth: 22, + enableDragging: true, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text('$_annotationValue1 - $_annotationValue_1')) + ]), + ])); + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithRectangle() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + ranges: [ + GaugeRange( + endValue: _thirdMarkerValue, + startValue: _fourthMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: model.isWeb ? Color.fromRGBO(197, 91, 226, 1) : null, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ]), + endWidth: 0.1, + startWidth: 0.1, + ) + ], + pointers: [ + MarkerPointer( + value: _thirdMarkerValue, + markerType: MarkerType.rectangle, + markerHeight: 22, + markerWidth: 22, + enableDragging: true, + onValueChanged: handleThirdPointerValueChanged, + onValueChanging: handleThirdPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ), + MarkerPointer( + value: _fourthMarkerValue, + markerType: MarkerType.rectangle, + markerHeight: 22, + markerWidth: 22, + enableDragging: true, + onValueChanged: handleFourthPointerValueChanged, + onValueChanging: handleFourthPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text('$_annotationValue2 - $_annotationValue_2')) + ]), + ])); + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithImage() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + ranges: [ + GaugeRange( + endValue: _fifthMarkerValue, + startValue: _sixthMarkerValue, + sizeUnit: GaugeSizeUnit.factor, + color: Colors.green, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ]), + endWidth: 0.1, + startWidth: 0.1) + ], + pointers: [ + MarkerPointer( + value: _fifthMarkerValue, + markerType: MarkerType.image, + imageUrl: 'images/ball.png', + markerHeight: model.isWeb ? 15 : 30, + markerWidth: model.isWeb ? 15 : 30, + enableDragging: true, + onValueChanged: handleFifthPointerValueChanged, + onValueChanging: handleFifthPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ), + MarkerPointer( + value: _sixthMarkerValue, + markerType: MarkerType.image, + imageUrl: 'images/ball.png', + markerHeight: model.isWeb ? 15 : 30, + markerWidth: model.isWeb ? 15 : 30, + enableDragging: true, + onValueChanged: handleSixthPointerValueChanged, + onValueChanging: handleSixthPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text('$_annotationValue3 - $_annotationValue_3')) + ]), + ])); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSecondPointerValueChanged(double value) { + setState(() { + _secondMarkerValue = value; + final int _value = _secondMarkerValue.abs().toInt(); + _annotationValue_1 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _firstMarkerValue || + (args.value - _secondMarkerValue).abs() > 10) { + if (args.value <= _firstMarkerValue) { + if ((args.value - _secondMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _secondMarkerValue = _firstMarkerValue; + _firstMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFirstPointerValueChanged(double value) { + setState(() { + _firstMarkerValue = value; + final int _value = _firstMarkerValue.abs().toInt(); + _annotationValue1 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _secondMarkerValue || + (args.value - _firstMarkerValue).abs() > 10) { + if (args.value >= _secondMarkerValue) { + if ((args.value - _firstMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _firstMarkerValue = _secondMarkerValue; + _secondMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleFourthPointerValueChanged(double value) { + setState(() { + _fourthMarkerValue = value; + final int _value = _fourthMarkerValue.abs().toInt(); + _annotationValue_2 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleFourthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _thirdMarkerValue || + (args.value - _fourthMarkerValue).abs() > 10) { + if (args.value <= _thirdMarkerValue) { + if ((args.value - _fourthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fourthMarkerValue = _thirdMarkerValue; + _thirdMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleThirdPointerValueChanged(double value) { + setState(() { + _thirdMarkerValue = value; + final int _value = _thirdMarkerValue.abs().toInt(); + _annotationValue2 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleThirdPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _fourthMarkerValue || + (args.value - _thirdMarkerValue).abs() > 10) { + if (args.value >= _fourthMarkerValue) { + if ((args.value - _thirdMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _thirdMarkerValue = _fourthMarkerValue; + _fourthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSixthPointerValueChanged(double value) { + setState(() { + _sixthMarkerValue = value; + final int _value = _sixthMarkerValue.abs().toInt(); + _annotationValue_3 = '$_value'; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSixthPointerValueChanging(ValueChangingArgs args) { + if (args.value <= _fifthMarkerValue || + (args.value - _sixthMarkerValue).abs() > 10) { + if (args.value <= _fifthMarkerValue) { + if ((args.value - _sixthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _sixthMarkerValue = _fifthMarkerValue; + _fifthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } + + /// Value changed call back for first pointer + void handleFifthPointerValueChanged(double value) { + setState(() { + _fifthMarkerValue = value; + final int _value = _fifthMarkerValue.abs().toInt(); + _annotationValue3 = '$_value'; + }); + } + + /// Value changeing call back for first pointer + void handleFifthPointerValueChanging(ValueChangingArgs args) { + if (args.value >= _sixthMarkerValue || + (args.value - _fifthMarkerValue).abs() > 10) { + if (args.value >= _sixthMarkerValue) { + if ((args.value - _fifthMarkerValue).abs() > 10) { + args.cancel = true; + } else { + _fifthMarkerValue = _sixthMarkerValue; + _sixthMarkerValue = args.value; + } + } else { + args.cancel = true; + } + } + } +} diff --git a/lib/samples/radial_slider/basic_features/angles/radial_slider_angles.dart b/lib/samples/radial_slider/basic_features/angles/radial_slider_angles.dart new file mode 100644 index 00000000..e375ca00 --- /dev/null +++ b/lib/samples/radial_slider/basic_features/angles/radial_slider_angles.dart @@ -0,0 +1,430 @@ +///Package imports +import 'package:flutter/material.dart'; + +///gauges import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the Radial Slider angles. +class RadialSliderAngles extends SampleView { + const RadialSliderAngles(Key key) : super(key: key); + + @override + _RadialSliderAnglesState createState() => _RadialSliderAnglesState(); +} + +class _RadialSliderAnglesState extends SampleViewState { + _RadialSliderAnglesState(); + + double _size = 150; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _markerSize = 18; + _annotationFontSize = 15; + } else { + _markerSize = model.isWeb ? 18 : 12; + _annotationFontSize = model.isWeb ? 15 : 12; + } + if (MediaQuery.of(context).size.height > + MediaQuery.of(context).size.width) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 6 + : MediaQuery.of(context).size.height / 6; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirstSlider(), + Align( + alignment: !model.isWeb ? Alignment(0, 0.1) : Alignment(0, 0), + child: _getSecondSlider(), + ), + Align( + alignment: !model.isWeb ? Alignment(0, 0.1) : Alignment(0, 0), + child: _getThirdSlider()), + _getFourthSlider(), + ], + ), + ); + } else { + _size = MediaQuery.of(context).size.width / 5.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirstSlider(), + _getSecondSlider(), + _getThirdSlider(), + Align( + alignment: model.isWeb ? Alignment(0, -0.6) : Alignment(0, 0), + child: _getFourthSlider()), + ], + ), + ); + } + } + + @override + void dispose() { + super.dispose(); + } + + Widget _getFirstSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + width: 0.1, + value: _currentValue, + cornerStyle: CornerStyle.endCurve, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + enableDragging: true, + value: _markerValue, + onValueChanged: handlePointerValueChanged, + onValueChangeEnd: handlePointerValueChanged, + onValueChanging: handlePointerValueChanging, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue1' + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + ), + ), + positionFactor: 0.13, + angle: 0) + ]) + ]), + ); + } + + Widget _getSecondSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 90, + endAngle: 270, + pointers: [ + RangePointer( + width: 0.1, + value: _currentValueForFirstHalfSlider, + cornerStyle: CornerStyle.endCurve, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValueForFirstHalfSlider, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleValueChangedForFirstHalfSlider, + onValueChangeEnd: handleValueChangedForFirstHalfSlider, + onValueChanging: handleValueChangingForFirstHalfSlider, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue2' + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + ), + ), + positionFactor: 0.13, + angle: 0) + ]), + ]), + ); + } + + Widget _getThirdSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 90, + pointers: [ + RangePointer( + width: 0.1, + value: _currentValueForPieSlider, + cornerStyle: CornerStyle.endCurve, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValueForPieSlider, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleValueChangedForPieSlider, + onValueChangeEnd: handleValueChangedForPieSlider, + onValueChanging: handleValueChangingForPieSlider, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue3' + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + ), + ), + positionFactor: 0.13, + angle: 0) + ]) + ]), + ); + } + + Widget _getFourthSlider() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.9, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 180, + endAngle: 0, + canScaleToFit: true, + pointers: [ + RangePointer( + width: 0.1, + value: _currentValueForFirstQuarterSlider, + cornerStyle: CornerStyle.endCurve, + color: const Color.fromRGBO(0, 198, 139, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValueForFirstQuarterSlider, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 4, + onValueChanged: handleValueChangedForFirstQuarterSlider, + onValueChangeEnd: handleValueChangedForFirstQuarterSlider, + onValueChanging: handleValueChangingForFirstQuarterSlider, + enableDragging: true, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _markerSize, + markerWidth: _markerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue4' + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + ), + ), + positionFactor: 0.13, + angle: 0) + ]), + ]), + ); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handlePointerValueChanged(double value) { + _setPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handlePointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue).abs() > 20) { + args.cancel = true; + if (_markerValue > 50) { + final double value = 100; + _setPointerValue(value); + } + } + } + + /// Method to set the pointer value + void _setPointerValue(double value) { + setState(() { + _markerValue = value.roundToDouble(); + _currentValue = _markerValue + 2; + _annotationValue1 = value.round().toStringAsFixed(0); + }); + } + + /// Value changing call back for pie slider. + void handleValueChangingForPieSlider(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValueForPieSlider).abs() > 20) { + args.cancel = true; + if (_markerValueForPieSlider > 50) { + final double value = 100; + _setPointerValueForPieSlider(value); + } + } + } + + /// Value changed call back for pie slider. + void handleValueChangedForPieSlider(double value) { + _setPointerValueForPieSlider(value); + } + + void _setPointerValueForPieSlider(double value) { + setState(() { + _markerValueForPieSlider = value.roundToDouble(); + _currentValueForPieSlider = _markerValueForPieSlider + 2; + _annotationValue3 = value.round().toStringAsFixed(0); + }); + } + + /// Value changing call back for first half slider. + void handleValueChangingForFirstHalfSlider(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValueForFirstHalfSlider).abs() > + 20) { + args.cancel = true; + if (_markerValueForFirstHalfSlider > 50) { + final double value = 100; + _setPointerValueForHalfSlider(value); + } + } + } + + /// Value changed call back for first half slider. + void handleValueChangedForFirstHalfSlider(double value) { + _setPointerValueForHalfSlider(value); + } + + /// Method to set the value for pointer value + void _setPointerValueForHalfSlider(double value) { + setState(() { + _markerValueForFirstHalfSlider = value.roundToDouble(); + _currentValueForFirstHalfSlider = _markerValueForFirstHalfSlider + 2; + _annotationValue2 = value.round().toStringAsFixed(0); + }); + } + + /// Value changing call back for first quarter slider. + void handleValueChangingForFirstQuarterSlider(ValueChangingArgs args) { + if (args.value.toInt() < 0) { + args.cancel = true; + } + } + + /// Value changed call back for first quarter slider. + void handleValueChangedForFirstQuarterSlider(double value) { + setState(() { + _markerValueForFirstQuarterSlider = value.roundToDouble(); + _currentValueForFirstQuarterSlider = + _markerValueForFirstQuarterSlider + 2; + _annotationValue4 = value.round().toStringAsFixed(0); + }); + } + + double _currentValue = 60; + double _markerValue = 58; + double _currentValueForPieSlider = 60; + double _markerValueForPieSlider = 58; + double _currentValueForFirstHalfSlider = 60; + double _markerValueForFirstHalfSlider = 58; + double _currentValueForFirstQuarterSlider = 60; + double _markerValueForFirstQuarterSlider = 58; + double _markerSize = 25; + String _annotationValue1 = '60'; + String _annotationValue2 = '60'; + String _annotationValue3 = '60'; + String _annotationValue4 = '60'; + double _annotationFontSize = 25; +} diff --git a/lib/samples/radial_slider/basic_features/labels_and_ticks/radial_slider_labels_and_ticks.dart b/lib/samples/radial_slider/basic_features/labels_and_ticks/radial_slider_labels_and_ticks.dart new file mode 100644 index 00000000..b83e1f18 --- /dev/null +++ b/lib/samples/radial_slider/basic_features/labels_and_ticks/radial_slider_labels_and_ticks.dart @@ -0,0 +1,157 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider ticks and labels. +class RadialSliderLabelsTicks extends SampleView { + const RadialSliderLabelsTicks(Key key) : super(key: key); + + @override + _RadialSliderLabelsTicksState createState() => + _RadialSliderLabelsTicksState(); +} + +class _RadialSliderLabelsTicksState extends SampleViewState { + _RadialSliderLabelsTicksState(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 27; + _annotationFontSize = 25; + } else { + _firstMarkerSize = model.isWeb ? 20 : 15; + _annotationFontSize = model.isWeb ? 25 : 15; + } + + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + tickOffset: 0.2, + labelOffset: 0.15, + offsetUnit: GaugeSizeUnit.factor, + onAxisTapped: handlePointerValueChanged, + minorTicksPerInterval: 5, + majorTickStyle: + MajorTickStyle(length: 0.1, lengthUnit: GaugeSizeUnit.factor), + pointers: [ + RangePointer( + color: const Color.fromRGBO(0, 198, 139, 1), + value: _currentValue, + onValueChanged: handlePointerValueChanged, + cornerStyle: CornerStyle.bothCurve, + onValueChangeEnd: handlePointerValueChanged, + onValueChanging: handlePointerValueChanging, + enableDragging: true, + width: 0.1, + sizeUnit: GaugeSizeUnit.factor), + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + Text( + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ) + ], + ), + positionFactor: 0.7, + angle: 90) + ]), + // Create secondary radial axis for segmented line + RadialAxis( + interval: 20, + showLabels: false, + showTicks: true, + showAxisLine: false, + tickOffset: -0.05, + offsetUnit: GaugeSizeUnit.factor, + minorTicksPerInterval: 0, + radiusFactor: 0.85, + majorTickStyle: MajorTickStyle( + length: 0.3, + thickness: 3, + lengthUnit: GaugeSizeUnit.factor, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Color.fromRGBO(33, 33, 33, 1)), + pointers: [ + MarkerPointer( + value: _markerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 7, + markerOffset: 0.0355, + offsetUnit: GaugeSizeUnit.factor, + borderColor: const Color.fromRGBO(0, 198, 139, 1), + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + ), + ]), + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handlePointerValueChanged(double value) { + _setPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 0. + void handlePointerValueChanging(ValueChangingArgs args) { + if (args.value.toInt() < 0) { + args.cancel = true; + } + } + + /// method to set the pointer value + void _setPointerValue(double value) { + setState(() { + _currentValue = value.roundToDouble(); + final int _value = _currentValue.round().toInt(); + _annotationValue = '$_value'; + _markerValue = _currentValue; + }); + } + + double _currentValue = 54; + double _markerValue = 54; + double _firstMarkerSize = 10; + double _annotationFontSize = 25; + String _annotationValue = '54'; +} diff --git a/lib/samples/radial_slider/basic_features/state/radial_slider_state.dart b/lib/samples/radial_slider/basic_features/state/radial_slider_state.dart new file mode 100644 index 00000000..ca57c9e5 --- /dev/null +++ b/lib/samples/radial_slider/basic_features/state/radial_slider_state.dart @@ -0,0 +1,165 @@ +///Package imports +import 'package:flutter/material.dart'; +import 'package:flutter/cupertino.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider state. +class RadialSliderStateTypes extends SampleView { + const RadialSliderStateTypes(Key key) : super(key: key); + + @override + _RadialSliderStateTypesState createState() => _RadialSliderStateTypesState(); +} + +class _RadialSliderStateTypesState extends SampleViewState { + _RadialSliderStateTypesState(); + + bool _enableDragging = true; + double _value = 30; + double _markerValue = 28.75; + double _annotationFontSize = 25; + String _annotationValue = '30'; + double _firstMarkerSize = 30; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 30; + _annotationFontSize = 25; + } else { + _firstMarkerSize = model.isWeb ? 22 : 20; + _firstMarkerSize = model.isWeb ? 20 : 20; + _annotationFontSize = model.isWeb ? 25 : 15; + } + + return Center( + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: model.isWeb ? 0.15 : 0.25, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + width: model.isWeb ? 0.15 : 0.25, + value: _value, + enableDragging: _enableDragging, + cornerStyle: CornerStyle.bothCurve, + onValueChanged: handlePointerValueChanged, + onValueChangeEnd: handlePointerValueChanged, + onValueChanging: handlePointerValueChanging, + color: _enableDragging + ? const Color.fromRGBO(34, 144, 199, 1) + : const Color(0xFF888888), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue, + color: Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + ) + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + Text( + '%', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ) + ], + ), + positionFactor: 0.13, + angle: 90) + ]) + ], + ), + ); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row(children: [ + Text('Enable Drag', style: TextStyle(color: model.textColor)), + Padding( + padding: const EdgeInsets.fromLTRB(35, 0, 0, 0), + child: Transform.scale( + scale: 0.8, + child: CupertinoSwitch( + activeColor: model.backgroundColor, + value: _enableDragging, + onChanged: (bool value) { + setState(() { + _enableDragging = value; + stateSetter(() {}); + }); + }, + )), + ), + ]); + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handlePointerValueChanged(double value) { + _setPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handlePointerValueChanging(ValueChangingArgs args) { + if ((args.value.toInt() - _value).abs() > 20) { + args.cancel = true; + if (_value > 50) { + final double value = 100; + _setPointerValue(value); + } + } + } + + /// Method to set the pointer value + void _setPointerValue(double value) { + setState(() { + _value = value; + _markerValue = value - 1.75; + int _currentValue = _value.toInt(); + _currentValue = _currentValue >= 100 ? 100 : _currentValue; + _annotationValue = '$_currentValue'; + }); + } + + @override + void dispose() { + super.dispose(); + } +} diff --git a/lib/samples/radial_slider/customization/custom_text/radial_slider_custom_text.dart b/lib/samples/radial_slider/customization/custom_text/radial_slider_custom_text.dart new file mode 100644 index 00000000..ea37ddc1 --- /dev/null +++ b/lib/samples/radial_slider/customization/custom_text/radial_slider_custom_text.dart @@ -0,0 +1,131 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider custom text. +class RadialSliderCustomText extends SampleView { + const RadialSliderCustomText(Key key) : super(key: key); + + @override + _RadialSliderCustomTextState createState() => _RadialSliderCustomTextState(); +} + +class _RadialSliderCustomTextState extends SampleViewState { + _RadialSliderCustomTextState(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 20; + _annotationFontSize = 20; + } else { + _firstMarkerSize = model.isWeb ? 25 : 20; + _annotationFontSize = model.isWeb ? 25 : 15; + } + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + axisLineStyle: AxisLineStyle( + thickness: 0.2, + thicknessUnit: GaugeSizeUnit.factor, + cornerStyle: CornerStyle.bothCurve, + ), + showTicks: false, + showLabels: true, + labelOffset: 25, + onAxisTapped: handlePointerValueChanged, + pointers: [ + RangePointer( + color: _rangeColor, + value: _currentValue, + onValueChanged: handlePointerValueChanged, + cornerStyle: CornerStyle.bothCurve, + onValueChangeEnd: handlePointerValueChanged, + onValueChanging: handlePointerValueChanging, + enableDragging: true, + width: 0.2, + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue, + color: Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '$_annotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + ], + ), + positionFactor: 0.13, + angle: 0.5) + ]) + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handlePointerValueChanged(double value) { + setState(() { + _currentValue = value.roundToDouble(); + final int _value = _currentValue.toInt(); + if (_value < 100 && _annotationValue != 'In-progress') { + _annotationValue = 'In-progress'; + if (_rangeColor != const Color.fromRGBO(255, 150, 0, 1)) { + _rangeColor = const Color.fromRGBO(255, 150, 0, 1); + } + if (_annotationColor != const Color.fromRGBO(255, 150, 0, 1)) { + _annotationColor = const Color.fromRGBO(255, 150, 0, 1); + } + } else if (_value == 100) { + _annotationValue = 'Done'; + _rangeColor = null; + _annotationColor = const Color(0xFF00A8B5); + } + + _markerValue = _currentValue - 2; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handlePointerValueChanging(ValueChangingArgs args) { + if (args.value.toInt() <= 3) { + args.cancel = true; + } + } + + double _currentValue = 60; + double _markerValue = 58; + double _firstMarkerSize = 10; + double _annotationFontSize = 25; + String _annotationValue = 'In-progress'; + Color _rangeColor = const Color.fromRGBO(255, 150, 0, 1); + Color _annotationColor = const Color.fromRGBO(255, 150, 0, 1); +} diff --git a/lib/samples/radial_slider/customization/gradient/radial_slider_gradient.dart b/lib/samples/radial_slider/customization/gradient/radial_slider_gradient.dart new file mode 100644 index 00000000..91bb0a45 --- /dev/null +++ b/lib/samples/radial_slider/customization/gradient/radial_slider_gradient.dart @@ -0,0 +1,149 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider gradient. +class RadialSliderGradient extends SampleView { + const RadialSliderGradient(Key key) : super(key: key); + + @override + _RadialSliderGradientState createState() => _RadialSliderGradientState(); +} + +class _RadialSliderGradientState extends SampleViewState { + _RadialSliderGradientState(); + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 30; + _annotationFontSize = 25; + } else { + _firstMarkerSize = model.isWeb ? 20 : 15; + _annotationFontSize = model.isWeb ? 25 : 15; + } + return Center( + child: SfRadialGauge(axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + thickness: 0, thicknessUnit: GaugeSizeUnit.factor), + tickOffset: 0.20, + labelOffset: 0.10, + offsetUnit: GaugeSizeUnit.factor, + minorTicksPerInterval: 5, + onLabelCreated: (args) { + double axisValue = double.parse(args.text); + double celsiusValue = (axisValue - 32) / 1.8; + args.text = celsiusValue.toStringAsFixed(1); + }, + majorTickStyle: + MajorTickStyle(length: 0.1, lengthUnit: GaugeSizeUnit.factor), + annotations: [ + GaugeAnnotation( + widget: Text( + '${_annotationValue2}°C', + style: TextStyle( + fontSize: _celsiusAnnotationFontSize, + fontFamily: 'Times', + ), + ), + positionFactor: 0.15, + angle: 90) + ]), + RadialAxis( + axisLineStyle: AxisLineStyle( + thickness: 0.1, thicknessUnit: GaugeSizeUnit.factor), + showTicks: false, + showLabels: true, + labelOffset: 20, + onAxisTapped: handlePointerValueChanged, + pointers: [ + RangePointer( + value: _currentValue, + onValueChanged: handlePointerValueChanged, + onValueChangeEnd: handlePointerValueChanged, + onValueChanging: handlePointerValueChanging, + enableDragging: true, + width: 0.1, + cornerStyle: CornerStyle.endCurve, + gradient: model.isWeb + ? null + : const SweepGradient(colors: [ + Color.fromRGBO(115, 67, 189, 1), + Color.fromRGBO(202, 94, 230, 1) + ], stops: [ + 0.5, + 1 + ]), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 7, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Colors.black + : Colors.white, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + ), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue°F', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.05, + angle: 0) + ]), + ]), + ); + } + + @override + void dispose() { + super.dispose(); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handlePointerValueChanged(double value) { + setState(() { + _currentValue = value.roundToDouble(); + final int _value = _currentValue.round().toInt(); + _annotationValue = '$_value'; + final double _celsiusValue = (_currentValue - 32) / 1.8; + _annotationValue2 = '${_celsiusValue.toStringAsFixed(1)}'; + _markerValue = _currentValue; + }); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handlePointerValueChanging(ValueChangingArgs args) { + if (args.value.toInt() < 0) { + args.cancel = true; + } + } + + double _currentValue = 60; + double _markerValue = 60; + double _firstMarkerSize = 30; + double _annotationFontSize = 25; + double _celsiusAnnotationFontSize = 18; + String _annotationValue = '60'; + String _annotationValue2 = '${15.5556.toStringAsFixed(1)}'; +} diff --git a/lib/samples/radial_slider/customization/styles/radial_slider_styles.dart b/lib/samples/radial_slider/customization/styles/radial_slider_styles.dart new file mode 100644 index 00000000..31e39b71 --- /dev/null +++ b/lib/samples/radial_slider/customization/styles/radial_slider_styles.dart @@ -0,0 +1,676 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the RadialSlider styles. +class RadialSliderStyles extends SampleView { + const RadialSliderStyles(Key key) : super(key: key); + + @override + _RadialSliderStylesState createState() => _RadialSliderStylesState(); +} + +class _RadialSliderStylesState extends SampleViewState { + _RadialSliderStylesState(); + + double _value = 30; + String _annotationValue = '30'; + double _annotationFontSize = 25; + double _markerValue = 28; + double _firstMarkerSize = 20; + double _secondMarkerSize = 20; + double _markerWidth = 10; + double _size = 150; + double _borderWidth = 8; + + double _value1 = 30; + double _markerValue1 = 30; + String _annotationValue1 = '30'; + + double _value2 = 30; + double _markerValue2 = 28; + String _annotationValue2 = '30'; + + double _value3 = 30; + double _markerValue3 = 28; + String _annotationValue3 = '30'; + + double _value4 = 30; + double _markerValue4 = 28; + String _annotationValue4 = '30'; + + double _value5 = 30; + double _markerValue5 = 30; + String _annotationValue5 = '30'; + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + Size actualSize = MediaQuery.of(context).size; + if (MediaQuery.of(context).orientation == Orientation.portrait) { + _firstMarkerSize = 15; + _secondMarkerSize = 20; + _borderWidth = 5; + _markerWidth = 5; + _annotationFontSize = 15; + } else { + _firstMarkerSize = model.isWeb ? 15 : 10; + _secondMarkerSize = model.isWeb ? 20 : 15; + _markerWidth = model.isWeb ? 5 : 3; + _borderWidth = model.isWeb ? 5 : 3; + _annotationFontSize = model.isWeb ? 15 : 12; + } + + if (actualSize.width > actualSize.height) { + _size = actualSize.height / 5; + return Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirtProgressBar(), + _getSecondProgressBar(), + _getThirdProgressBar() + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFourthProgressBar(), + _getFifthProgressBar(), + _getSixthProgressBar() + ], + ), + ], + ); + } else { + _size = actualSize.height / 5; + return Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFirtProgressBar(), + _getSecondProgressBar(), + _getThirdProgressBar() + ], + ), + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getFourthProgressBar(), + _getFifthProgressBar(), + _getSixthProgressBar() + ], + ), + ], + ); + } + } + + Widget _getFirtProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(191, 214, 252, 1) + : const Color.fromRGBO(36, 58, 97, 1), + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + width: 0.1, + value: _value, + cornerStyle: CornerStyle.bothCurve, + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(41, 118, 246, 1) + : const Color.fromRGBO(6, 102, 217, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue, + onValueChanged: handleFirstPointerValueChanged, + onValueChangeEnd: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: _borderWidth, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + borderColor: Color.fromRGBO(41, 118, 246, 1)), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getSecondProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(218, 218, 218, 1) + : const Color.fromRGBO(88, 88, 88, 1), + thickness: 0.15, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + width: 0.15, + value: _value1, + cornerStyle: CornerStyle.bothCurve, + color: const Color.fromRGBO(126, 86, 212, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue1, + onValueChanged: handleSecondPointerValueChanged, + onValueChangeEnd: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + enableDragging: true, + color: const Color.fromRGBO(126, 86, 212, 1), + borderWidth: 9, + markerWidth: _firstMarkerSize, + markerHeight: _markerWidth, + markerType: MarkerType.rectangle, + borderColor: const Color.fromRGBO(126, 86, 212, 1)) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue1', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getThirdProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: const Color.fromRGBO(254, 166, 25, 1), + thickness: 0.25, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + value: 100, + pointerOffset: 0.05, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : const Color.fromRGBO(41, 37, 32, 1), + width: 0.145, + sizeUnit: GaugeSizeUnit.factor), + RangePointer( + width: 0.144, + pointerOffset: 0.05, + value: _value2, + color: const Color.fromRGBO(254, 166, 25, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue2, + color: model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(255, 255, 255, 1) + : Color.fromRGBO(33, 33, 33, 1), + borderWidth: _borderWidth, + onValueChanged: handleThirdPointerValueChanged, + onValueChangeEnd: handleThirdPointerValueChanged, + onValueChanging: handleThirdPointerValueChanging, + enableDragging: true, + markerHeight: _secondMarkerSize, + markerWidth: _secondMarkerSize, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(254, 166, 25, 1), + ) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue2', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getFourthProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLineStyle: AxisLineStyle( + color: model.currentThemeData.brightness == Brightness.light + ? const Color.fromRGBO(201, 201, 201, 1) + : const Color.fromRGBO(78, 78, 78, 1), + thickness: 0.15, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + value: 100, + pointerOffset: 0.03, + width: 0.09, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + sizeUnit: GaugeSizeUnit.factor), + RangePointer( + width: 0.05, + pointerOffset: 0.05, + value: _value3, + cornerStyle: CornerStyle.bothCurve, + color: const Color.fromRGBO(88, 194, 143, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue3, + onValueChanged: handleFourthPointerValueChanged, + onValueChanging: handleFourthPointerValueChanging, + enableDragging: true, + color: model.currentThemeData.brightness == Brightness.light + ? Colors.white + : Colors.black, + borderWidth: 3, + markerHeight: _firstMarkerSize, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + borderColor: Color.fromRGBO(88, 194, 143, 1)), + MarkerPointer( + value: _markerValue3, + onValueChanged: handleFourthPointerValueChanged, + onValueChanging: handleFourthPointerValueChanging, + enableDragging: true, + color: Color.fromRGBO(88, 194, 143, 1), + borderWidth: 1, + markerHeight: 7, + markerWidth: 7, + markerType: MarkerType.circle, + borderColor: Color.fromRGBO(88, 194, 143, 1)), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue3', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getFifthProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + color: Color.fromRGBO(41, 118, 246, 1), + thickness: 0.3, + thicknessUnit: GaugeSizeUnit.factor), + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + pointers: [ + RangePointer( + pointerOffset: 0.075, + width: 0.15, + value: _value4, + cornerStyle: CornerStyle.bothCurve, + color: const Color.fromRGBO(254, 166, 25, 1), + sizeUnit: GaugeSizeUnit.factor), + MarkerPointer( + value: _markerValue4, + color: const Color.fromRGBO(254, 166, 25, 1), + markerHeight: _firstMarkerSize, + onValueChanged: handleFifthPointerValueChanged, + onValueChangeEnd: handleFifthPointerValueChanged, + onValueChanging: handleFifthPointerValueChanging, + enableDragging: true, + markerWidth: _firstMarkerSize, + markerType: MarkerType.circle, + borderColor: const Color.fromRGBO(34, 144, 199, 0.75)) + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue4', + style: TextStyle( + fontSize: _annotationFontSize, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + ), + ), + positionFactor: 0.1, + angle: 90) + ]) + ], + ), + ); + } + + Widget _getSixthProgressBar() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge( + axes: [ + RadialAxis( + radiusFactor: 0.85, + axisLabelStyle: GaugeTextStyle(fontSize: 8), + interval: 10, + axisLineStyle: AxisLineStyle( + thickness: 0.03, thicknessUnit: GaugeSizeUnit.factor), + showTicks: false, + showLabels: false, + startAngle: 270, + endAngle: 270, + pointers: [ + NeedlePointer( + value: _markerValue5, + needleColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + needleEndWidth: 1.5, + needleStartWidth: 1.5, + needleLength: 0.72, + knobStyle: KnobStyle( + knobRadius: model.isWeb ? 0.4 : 0.3, + borderWidth: 0.05, + borderColor: + model.currentThemeData.brightness == Brightness.light + ? Color.fromRGBO(65, 65, 65, 1) + : Color.fromRGBO(191, 191, 191, 1), + color: + model.currentThemeData.brightness == Brightness.light + ? Colors.white + : const Color.fromRGBO(33, 33, 33, 1), + )), + RangePointer( + width: 0.07, + pointerOffset: 0.27, + value: _value5, + onValueChanged: handleSixthPointerValueChanged, + onValueChangeEnd: handleSixthPointerValueChanged, + onValueChanging: handleSixthPointerValueChanging, + enableDragging: true, + color: const Color.fromRGBO(126, 87, 213, 1), + sizeUnit: GaugeSizeUnit.factor), + ], + annotations: [ + GaugeAnnotation( + widget: Text( + '$_annotationValue5', + style: TextStyle( + fontSize: 12, + fontFamily: 'Times', + fontWeight: FontWeight.bold, + color: model.currentThemeData.brightness == + Brightness.light + ? Colors.black + : Colors.white), + ), + positionFactor: 0.04, + angle: 90) + ]) + ], + ), + ); + } + + @override + void dispose() { + super.dispose(); + } + + void handleFirstPointerValueChanged(double value) { + _setFirstPointerValue(value); + } + + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue).abs() > 20) { + args.cancel = true; + + if (_markerValue > 50) { + final double value = 100; + _setFirstPointerValue(value); + } + } + } + + /// Method to set value for pointer + void _setFirstPointerValue(double value) { + setState(() { + _markerValue = value.roundToDouble(); + _value = (_markerValue + 2); + final int _currentValue = _markerValue.round().toInt(); + _annotationValue = '$_currentValue'; + }); + } + + void handleSecondPointerValueChanged(double value) { + _setSecondPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue1).abs() > 20) { + args.cancel = true; + + if (_markerValue1 > 50) { + final double value = 100; + _setSecondPointerValue(value); + } + } + } + + /// Method to set value for pointer + void _setSecondPointerValue(double value) { + setState(() { + _markerValue1 = value.roundToDouble(); + _value1 = (_markerValue1); + final int _currentValue = _markerValue1.round().toInt(); + _annotationValue1 = '$_currentValue'; + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleThirdPointerValueChanged(double value) { + _setThirdPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleThirdPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue2).abs() > 20) { + args.cancel = true; + + if (_markerValue2 > 50) { + final double value = 100; + _setThirdPointerValue(value); + } + } + } + + /// Method to set value for pointer + void _setThirdPointerValue(double value) { + setState(() { + _markerValue2 = value.roundToDouble(); + _value2 = (_markerValue2 + 2); + final int _currentValue = _markerValue2.round().toInt(); + _annotationValue2 = '$_currentValue'; + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleFourthPointerValueChanged(double value) { + _setFourthPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleFourthPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue3).abs() > 20) { + args.cancel = true; + + if (_markerValue3 > 50) { + final double value = 100; + _setFourthPointerValue(value); + } + } + } + + /// Method to set value for pointer + void _setFourthPointerValue(double value) { + setState(() { + _markerValue3 = value; + _value3 = (_markerValue3 + 2); + final int _currentValue = _markerValue3.round().toInt(); + _annotationValue3 = '$_currentValue'; + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleFifthPointerValueChanged(double value) { + _setFifthPointerValue(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleFifthPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue4).abs() > 20) { + args.cancel = true; + + if (_markerValue4 > 50) { + final double value = 100; + _setFifthPointerValue(value); + } + } + } + + /// Method to set value for pointer + void _setFifthPointerValue(double value) { + setState(() { + _markerValue4 = value.roundToDouble(); + _value4 = (_markerValue4 + 2); + final int _currentValue = _markerValue4.round().toInt(); + _annotationValue4 = '$_currentValue'; + }); + } + + /// Dragged pointer new value is updated to pointer and + /// annotation current value. + void handleSixthPointerValueChanged(double value) { + _setValueForSixthPointer(value); + } + + /// Pointer dragging is canceled when dragging pointer value is less than 6. + void handleSixthPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _markerValue5).abs() > 20) { + args.cancel = true; + + if (_markerValue5 > 50) { + final double value = 100; + _setValueForSixthPointer(value); + } + } + } + + /// Method to set value for pointer + void _setValueForSixthPointer(double value) { + setState(() { + _markerValue5 = value.roundToDouble(); + _value5 = _markerValue5; + final int _currentValue = _value5.round().toInt(); + _annotationValue5 = '$_currentValue'; + }); + } +} diff --git a/lib/samples/radial_slider/customization/thumb/radial_slider_thumb.dart b/lib/samples/radial_slider/customization/thumb/radial_slider_thumb.dart new file mode 100644 index 00000000..198df0e5 --- /dev/null +++ b/lib/samples/radial_slider/customization/thumb/radial_slider_thumb.dart @@ -0,0 +1,297 @@ +///Package imports +import 'package:flutter/material.dart'; + +///calendar import +import 'package:syncfusion_flutter_gauges/gauges.dart'; + +///Local import +import '../../../../model/sample_view.dart'; + +/// Widget of the radial slider thumb customization. +class RadialSliderThumb extends SampleView { + const RadialSliderThumb(Key key) : super(key: key); + + @override + _RadialSliderThumbState createState() => _RadialSliderThumbState(); +} + +class _RadialSliderThumbState extends SampleViewState { + _RadialSliderThumbState(); + + double _progressValue1 = 75; + double _progressValue2 = 75; + double _progressValue3 = 75; + double _size = 150; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (MediaQuery.of(context).size.height > + MediaQuery.of(context).size.width) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 3.5 + : MediaQuery.of(context).size.height / 5; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: !model.isWeb + ? [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + getSliderWithImage(), + Center(child: Text('Image thumb')), + ] + : [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')) + ], + )); + } else { + _size = MediaQuery.of(context).size.width / 4.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: !model.isWeb + ? [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithImage(), + Center(child: Text('Image thumb')), + ]), + ] + : [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithCircle(), + Center(child: Text('Circle thumb')), + ]), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + getSliderWithRectangle(), + Center(child: Text('Rectangle thumb')), + ]), + ], + )); + } + } + + @override + void dispose() { + super.dispose(); + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithCircle() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + pointers: [ + RangePointer( + value: _progressValue1, + width: 0.1, + sizeUnit: GaugeSizeUnit.factor, + color: model.isWeb ? Color.fromRGBO(197, 91, 226, 1) : null, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ])), + MarkerPointer( + value: _progressValue1, + markerType: MarkerType.circle, + markerHeight: 25, + markerWidth: 25, + enableDragging: true, + onValueChanged: handleFirstPointerValueChanged, + onValueChanging: handleFirstPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text(_progressValue1.toStringAsFixed(0) + '%')) + ]), + ])); + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithRectangle() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + pointers: [ + RangePointer( + value: _progressValue2, + width: 0.1, + sizeUnit: GaugeSizeUnit.factor, + color: model.isWeb ? Color.fromRGBO(197, 91, 226, 1) : null, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ])), + MarkerPointer( + value: _progressValue2, + markerType: MarkerType.rectangle, + markerHeight: 25, + markerWidth: 25, + enableDragging: true, + onValueChanged: handleSecondPointerValueChanged, + onValueChanging: handleSecondPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text(_progressValue2.toStringAsFixed(0) + '%')) + ]), + ])); + } + + /// Returns gradient progress style circular progress bar. + Widget getSliderWithImage() { + return Container( + height: _size, + width: _size, + child: SfRadialGauge(axes: [ + RadialAxis( + showLabels: false, + showTicks: false, + startAngle: 270, + endAngle: 270, + radiusFactor: 0.8, + axisLineStyle: AxisLineStyle( + thickness: 0.1, + thicknessUnit: GaugeSizeUnit.factor, + ), + pointers: [ + RangePointer( + value: _progressValue3, + width: 0.1, + sizeUnit: GaugeSizeUnit.factor, + gradient: model.isWeb + ? null + : SweepGradient(colors: [ + const Color.fromRGBO(197, 91, 226, 1), + const Color.fromRGBO(115, 67, 189, 1) + ], stops: [ + 0.5, + 1 + ])), + MarkerPointer( + value: _progressValue3, + markerType: MarkerType.image, + imageUrl: 'images/ball.png', + markerHeight: model.isWeb ? 15 : 30, + markerWidth: model.isWeb ? 15 : 30, + enableDragging: true, + onValueChanged: handleThirdPointerValueChanged, + onValueChanging: handleThirdPointerValueChanging, + color: const Color.fromRGBO(125, 71, 194, 1), + ) + ], + annotations: [ + GaugeAnnotation( + positionFactor: 0.1, + widget: Text(_progressValue3.toStringAsFixed(0) + '%')) + ]), + ])); + } + + void handleFirstPointerValueChanged(double value) { + setState(() { + _progressValue1 = value; + }); + } + + void handleFirstPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _progressValue1).abs() > 20) { + args.cancel = true; + } + } + + void handleSecondPointerValueChanged(double value) { + setState(() { + _progressValue2 = value; + }); + } + + void handleSecondPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _progressValue2).abs() > 20) { + args.cancel = true; + } + } + + void handleThirdPointerValueChanged(double value) { + setState(() { + _progressValue3 = value; + }); + } + + void handleThirdPointerValueChanging(ValueChangingArgs args) { + if ((args.value.round().toInt() - _progressValue3).abs() > 20) { + args.cancel = true; + } + } +} diff --git a/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart b/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart index 336f7d07..e5bd547f 100644 --- a/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart +++ b/lib/samples/signature_pad/getting_started/signature_pad_getting_started.dart @@ -179,7 +179,6 @@ class _GettingStartedSignaturePadState extends SampleViewState { Text( 'Pen Color', style: TextStyle( - fontSize: 14.0, color: textColor, fontWeight: FontWeight.w400, fontFamily: 'Roboto-Regular'), @@ -208,7 +207,6 @@ class _GettingStartedSignaturePadState extends SampleViewState { 'CLEAR', style: TextStyle( fontWeight: FontWeight.w500, - fontSize: 14, fontFamily: 'Roboto-Medium'), ), textColor: model.currentPaletteColor), @@ -221,7 +219,6 @@ class _GettingStartedSignaturePadState extends SampleViewState { child: const Text('SAVE', style: TextStyle( fontWeight: FontWeight.w500, - fontSize: 14, fontFamily: 'Roboto-Medium')), textColor: model.currentPaletteColor) ], @@ -285,9 +282,7 @@ class _GettingStartedSignaturePadState extends SampleViewState { data: SfDataGridThemeData( headerStyle: DataGridHeaderCellStyle( textStyle: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 14, - color: _getTextColor()), + fontWeight: FontWeight.bold, color: _getTextColor()), backgroundColor: Colors.transparent), gridLineStrokeWidth: 1, gridLineColor: _isDark ? Colors.grey[850] : Colors.grey[200], @@ -300,22 +295,29 @@ class _GettingStartedSignaturePadState extends SampleViewState { source: _productDataSource, columnWidthMode: ColumnWidthMode.fill, columns: [ - GridTextColumn(mappingName: 'name', headerText: 'Product') - ..columnWidthMode = ColumnWidthMode.cells - ..headerTextSoftWrap = true - ..headerTextOverflow = TextOverflow.clip - ..padding = EdgeInsets.fromLTRB(10.0, 5.0, 0, 5.0), - GridNumericColumn(mappingName: 'price', headerText: 'Price') - ..headerTextSoftWrap = true - ..headerTextOverflow = TextOverflow.clip, + GridTextColumn( + mappingName: 'name', + headerText: 'Product', + columnWidthMode: ColumnWidthMode.cells, + headerTextSoftWrap: true, + headerTextOverflow: TextOverflow.clip, + padding: EdgeInsets.fromLTRB(10.0, 5.0, 0, 5.0)), GridNumericColumn( - mappingName: 'quantity', headerText: 'Quantity') - ..headerTextSoftWrap = true - ..headerTextOverflow = TextOverflow.clip - ..padding = EdgeInsets.all(8), - GridNumericColumn(mappingName: 'total', headerText: 'Total') - ..headerTextSoftWrap = true - ..headerTextOverflow = TextOverflow.clip + mappingName: 'price', + headerText: 'Price', + headerTextSoftWrap: true, + headerTextOverflow: TextOverflow.clip), + GridNumericColumn( + mappingName: 'quantity', + headerText: 'Quantity', + headerTextSoftWrap: true, + headerTextOverflow: TextOverflow.clip, + padding: EdgeInsets.all(8)), + GridNumericColumn( + mappingName: 'total', + headerText: 'Total', + headerTextSoftWrap: true, + headerTextOverflow: TextOverflow.clip) ], ), ), @@ -529,7 +531,7 @@ class _GettingStartedSignaturePadState extends SampleViewState { Widget buildSettings(BuildContext context) { return StatefulBuilder( builder: (BuildContext context, StateSetter stateSetter) { - return ListView(children: [ + return ListView(shrinkWrap: true, children: [ Padding( child: Text( 'Minimum Width', diff --git a/lib/samples/sliders/range_selector/range_selector_default_appearance.dart b/lib/samples/sliders/range_selector/range_selector_default_appearance.dart index 3f28fbea..b15ba1dd 100644 --- a/lib/samples/sliders/range_selector/range_selector_default_appearance.dart +++ b/lib/samples/sliders/range_selector/range_selector_default_appearance.dart @@ -100,7 +100,9 @@ class _DefaultRangeSelectorPageState extends SampleViewState { 0, mediaQueryData.orientation == Orientation.portrait ? 50 - : model.isWeb ? 15 : 2, + : model.isWeb + ? 15 + : 2, 0, 5), child: const SizedBox( @@ -144,7 +146,7 @@ class _DefaultRangeSelectorPageState extends SampleViewState { dateIntervalType: DateIntervalType.years, showTicks: true, showLabels: true, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMMd().format(actualLabel).toString(); diff --git a/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart b/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart index 1d8c5d2f..62053e7a 100644 --- a/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart +++ b/lib/samples/sliders/range_selector/range_selector_with_bar_chart.dart @@ -153,7 +153,7 @@ class _RangeSelectorBarChartPageState extends SampleViewState ), controller: _rangeController, dateFormat: DateFormat.yMd(), - showTooltip: true, + enableTooltip: true, thumbShape: ThumbShape(), trackShape: TrackShape(), overlayShape: OverlayShape(), diff --git a/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart b/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart index f14643de..7fecb319 100644 --- a/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart +++ b/lib/samples/sliders/range_selector/range_selector_with_histogram_chart.dart @@ -353,7 +353,7 @@ class _RangeSelectorHistogramChartPageState extends SampleViewState interval: 225, showTicks: true, showLabels: true, - showTooltip: true, + enableTooltip: true, initialValues: _values, tooltipTextFormatterCallback: (dynamic actualValue, String formattedText) { diff --git a/lib/samples/sliders/range_selector/range_selector_with_zooming.dart b/lib/samples/sliders/range_selector/range_selector_with_zooming.dart index 9a0975b5..8d952bfa 100644 --- a/lib/samples/sliders/range_selector/range_selector_with_zooming.dart +++ b/lib/samples/sliders/range_selector/range_selector_with_zooming.dart @@ -20,7 +20,6 @@ import 'package:syncfusion_flutter_sliders/sliders.dart'; ///Local import import '../../../model/sample_view.dart'; -import '../../../widgets/checkbox.dart'; /// Renders the range selector with line chart zooming option class RangeSelectorZoomingPage extends SampleView { @@ -742,38 +741,28 @@ class _RangeSelectorZoomingPageState extends SampleViewState @override Widget buildSettings(BuildContext context) { - return ListView( - children: [ - Container( - child: Row( - children: [ - Expanded( - child: Text( - 'Enable deferred update ', - style: TextStyle( - color: model.textColor, - fontSize: 16, - letterSpacing: 0.34, - fontWeight: FontWeight.normal, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(10.0), - child: CustomCheckBox( - activeColor: model.backgroundColor, - switchValue: enableDeferredUpdate, - valueChanged: (dynamic value) { - setState(() { - enableDeferredUpdate = value; - }); - }, - ), - ), - ], - ), - ), - ], - ); + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return Row(children: [ + Text('Enable deferred update ', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding( + padding: const EdgeInsets.all(10.0), + child: Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: enableDeferredUpdate, + onChanged: (bool value) { + setState(() { + enableDeferredUpdate = value; + stateSetter(() {}); + }); + }))), + ]); + }); } } diff --git a/lib/samples/sliders/range_slider/customization/shape_customization/divisor_customization.dart b/lib/samples/sliders/range_slider/customization/shape_customization/divisor_customization.dart index b832e339..85eb5d5c 100644 --- a/lib/samples/sliders/range_slider/customization/shape_customization/divisor_customization.dart +++ b/lib/samples/sliders/range_slider/customization/shape_customization/divisor_customization.dart @@ -48,7 +48,7 @@ class _DivisorCustomizedRangeSliderState extends SampleViewState { }, interval: 10, showDivisors: true, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), divisorShape: _DivisorShape(model), ), diff --git a/lib/samples/sliders/range_slider/customization/shape_customization/thumb_customization.dart b/lib/samples/sliders/range_slider/customization/shape_customization/thumb_customization.dart index 9b97f163..89f7dca5 100644 --- a/lib/samples/sliders/range_slider/customization/shape_customization/thumb_customization.dart +++ b/lib/samples/sliders/range_slider/customization/shape_customization/thumb_customization.dart @@ -52,7 +52,7 @@ class _ThumbCustomizedRangeSliderState extends SampleViewState { interval: 10, minorTicksPerInterval: 3, showTicks: true, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), thumbShape: _RectThumbShape(), ), @@ -75,7 +75,7 @@ class _ThumbCustomizedRangeSliderState extends SampleViewState { _doubleStrokeSliderValues = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), thumbShape: const _ThumbShape(true), activeColor: const Color.fromARGB(255, 0, 178, 206), diff --git a/lib/samples/sliders/range_slider/customization/shape_customization/tick_customization.dart b/lib/samples/sliders/range_slider/customization/shape_customization/tick_customization.dart index d4a5a313..35498175 100644 --- a/lib/samples/sliders/range_slider/customization/shape_customization/tick_customization.dart +++ b/lib/samples/sliders/range_slider/customization/shape_customization/tick_customization.dart @@ -53,7 +53,7 @@ class _TickCustomizedRangeSliderState extends SampleViewState { interval: 10, minorTicksPerInterval: 3, showTicks: true, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), tickShape: _TickShape(), minorTickShape: _MinorTickShape(), diff --git a/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart b/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart index 13c0e349..9107a4d9 100644 --- a/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart +++ b/lib/samples/sliders/range_slider/customization/size_customization/size_customization.dart @@ -83,7 +83,7 @@ class _SfRangeSliderSizeCustomizationState extends SampleViewState { _yearValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -114,7 +114,7 @@ class _SfRangeSliderSizeCustomizationState extends SampleViewState { _values = values; }); }, - showTooltip: true)); + enableTooltip: true)); } Widget _getWebLayout() { diff --git a/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart b/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart index d8fffa26..24151544 100644 --- a/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart +++ b/lib/samples/sliders/range_slider/customization/thumb_customization/range_slider_thumb_icon_customization.dart @@ -65,9 +65,9 @@ class _ThumbCustomizationRangeSliderState extends SampleViewState { interval: 2.0, min: _thumbMin, max: _thumbMax, - startThumbIcon: - const Icon(Icons.arrow_back_ios, color: Colors.white, size: 12.0), - endThumbIcon: const Icon(Icons.arrow_forward_ios, + startThumbIcon: const Icon(Icons.arrow_back_ios_outlined, + color: Colors.white, size: 12.0), + endThumbIcon: const Icon(Icons.arrow_forward_ios_outlined, color: Colors.white, size: 12.0), minorTicksPerInterval: 1, showTicks: true, diff --git a/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart b/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart index 021316ca..22e18096 100644 --- a/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart +++ b/lib/samples/sliders/range_slider/default_appearance/range_slider_date_time_label.dart @@ -72,7 +72,7 @@ class _DateRangeSliderState extends SampleViewState { _yearValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -100,7 +100,7 @@ class _DateRangeSliderState extends SampleViewState { _hourValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat('h:mm a').format(actualLabel); diff --git a/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart b/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart index 1faaaec4..5e695369 100644 --- a/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart +++ b/lib/samples/sliders/range_slider/default_appearance/range_slider_default_appearance.dart @@ -70,7 +70,7 @@ class _DefaultRangeSliderState extends SampleViewState { }); }, values: _activeRangeSliderValue, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), )); } diff --git a/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart b/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart index b067cbe5..8f831793 100644 --- a/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart +++ b/lib/samples/sliders/range_slider/default_appearance/range_slider_interval_selection.dart @@ -76,7 +76,7 @@ class _RangeSliderIntervalSelectionState extends SampleViewState { _yearValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -102,7 +102,7 @@ class _RangeSliderIntervalSelectionState extends SampleViewState { _values = values; }); }, - showTooltip: true)); + enableTooltip: true)); } Widget _getWebLayout() { diff --git a/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart b/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart index 4a5ea9b2..d6b672a3 100644 --- a/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart +++ b/lib/samples/sliders/range_slider/default_appearance/range_slider_step.dart @@ -72,7 +72,7 @@ class _SliderStepDurationState extends SampleViewState { _yearValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -97,7 +97,7 @@ class _SliderStepDurationState extends SampleViewState { _values = values; }); }, - showTooltip: true)); + enableTooltip: true)); } Widget _getWebLayout() { diff --git a/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart b/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart index 92ec51c7..ac8c07ab 100644 --- a/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart +++ b/lib/samples/sliders/range_slider/default_appearance/range_slider_tooltip_type.dart @@ -72,7 +72,7 @@ class _TooltipRangeSliderState extends SampleViewState { _yearValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -100,7 +100,7 @@ class _TooltipRangeSliderState extends SampleViewState { _hourValues = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipShape: SfPaddleTooltipShape(), tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { diff --git a/lib/samples/sliders/slider/basic_features/default_slider.dart b/lib/samples/sliders/slider/basic_features/default_slider.dart index 5eab2bdf..96e03e88 100644 --- a/lib/samples/sliders/slider/basic_features/default_slider.dart +++ b/lib/samples/sliders/slider/basic_features/default_slider.dart @@ -68,7 +68,7 @@ class _DefaultSliderState extends SampleViewState { }); }, value: _activeSliderValue, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), )); } diff --git a/lib/samples/sliders/slider/basic_features/slider_date_interval.dart b/lib/samples/sliders/slider/basic_features/slider_date_interval.dart index a46a3176..27ac4dd3 100644 --- a/lib/samples/sliders/slider/basic_features/slider_date_interval.dart +++ b/lib/samples/sliders/slider/basic_features/slider_date_interval.dart @@ -69,7 +69,7 @@ class _DateIntervalSliderState extends SampleViewState { _yearValue = value; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -96,7 +96,7 @@ class _DateIntervalSliderState extends SampleViewState { _hourValue = value; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat('h:mm a').format(actualLabel); diff --git a/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart b/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart index 26230425..c7c05355 100644 --- a/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart +++ b/lib/samples/sliders/slider/basic_features/slider_divisor_label_tick.dart @@ -68,7 +68,7 @@ class _SliderLabelCustomizationState extends SampleViewState { _labelSliderValue = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), )); } @@ -88,7 +88,7 @@ class _SliderLabelCustomizationState extends SampleViewState { _tickSliderValue = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), )); } @@ -107,7 +107,7 @@ class _SliderLabelCustomizationState extends SampleViewState { _divisorSliderValue = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), )); } diff --git a/lib/samples/sliders/slider/basic_features/slider_step.dart b/lib/samples/sliders/slider/basic_features/slider_step.dart index 98256cbd..048085aa 100644 --- a/lib/samples/sliders/slider/basic_features/slider_step.dart +++ b/lib/samples/sliders/slider/basic_features/slider_step.dart @@ -70,7 +70,7 @@ class _StepSliderState extends SampleViewState { _yearValue = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.y().format(actualLabel); @@ -94,7 +94,7 @@ class _StepSliderState extends SampleViewState { _stepSliderValue = values; }); }, - showTooltip: true)); + enableTooltip: true)); } Widget _getWebLayout() { diff --git a/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart b/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart index 71cab5c7..20f573c7 100644 --- a/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart +++ b/lib/samples/sliders/slider/basic_features/slider_tooltip_type.dart @@ -69,7 +69,7 @@ class _SliderTooltipTypeState extends SampleViewState { _yearValue = value; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -96,7 +96,7 @@ class _SliderTooltipTypeState extends SampleViewState { _hourValue = value; }); }, - showTooltip: true, + enableTooltip: true, tooltipShape: SfPaddleTooltipShape(), tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { diff --git a/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart b/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart index 7a0ad28c..149fd513 100644 --- a/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart +++ b/lib/samples/sliders/slider/customization/color_customization/slider_color_customization.dart @@ -73,7 +73,7 @@ class _SliderColorCustomizationState extends SampleViewState { _trackSliderValue = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'))); } @@ -109,7 +109,7 @@ class _SliderColorCustomizationState extends SampleViewState { _thumbStrokeSliderValue = values; }); }, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'))); } diff --git a/lib/samples/sliders/slider/customization/shape_customization/slider_thumb_customization.dart b/lib/samples/sliders/slider/customization/shape_customization/slider_thumb_customization.dart index e2540e38..eaee3eab 100644 --- a/lib/samples/sliders/slider/customization/shape_customization/slider_thumb_customization.dart +++ b/lib/samples/sliders/slider/customization/shape_customization/slider_thumb_customization.dart @@ -46,7 +46,7 @@ class _ThumbCustomizedSliderState extends SampleViewState { }, interval: 10, showDivisors: true, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), thumbShape: _RectThumbShape(), ), diff --git a/lib/samples/sliders/slider/customization/shape_customization/slider_tick_customization.dart b/lib/samples/sliders/slider/customization/shape_customization/slider_tick_customization.dart index 9849e035..d0936884 100644 --- a/lib/samples/sliders/slider/customization/shape_customization/slider_tick_customization.dart +++ b/lib/samples/sliders/slider/customization/shape_customization/slider_tick_customization.dart @@ -51,7 +51,7 @@ class _TickCustomizedSliderState extends SampleViewState { interval: 10, minorTicksPerInterval: 3, showTicks: true, - showTooltip: true, + enableTooltip: true, numberFormat: NumberFormat('#'), tickShape: _TickShape(), minorTickShape: _MinorTickShape(), diff --git a/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart b/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart index a085efa6..5e8eb43a 100644 --- a/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart +++ b/lib/samples/sliders/slider/customization/size_customization/slider_size_customization.dart @@ -81,7 +81,7 @@ class _SfSliderSizeCustomizationState extends SampleViewState { _yearValue = values; }); }, - showTooltip: true, + enableTooltip: true, tooltipTextFormatterCallback: (dynamic actualLabel, String formattedText) { return DateFormat.yMMM().format(actualLabel); @@ -108,7 +108,7 @@ class _SfSliderSizeCustomizationState extends SampleViewState { _value = values; }); }, - showTooltip: true)); + enableTooltip: true)); } Widget _getWebLayout() { diff --git a/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart b/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart index 7c1204a0..9278354e 100644 --- a/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart +++ b/lib/samples/sliders/slider/customization/thumb_customization/thumb_icon_customization.dart @@ -83,12 +83,11 @@ class _ThumbCustomizationSliderState extends SampleViewState { } else if (_thumbValue == _thumbMax) { return const Icon(Icons.arrow_back_ios, color: Colors.white, size: 12.0); } else { - return Row( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - Icon(Icons.arrow_back_ios, color: Colors.white, size: 12.0), - Icon(Icons.arrow_forward_ios, color: Colors.white, size: 12.0), - ]); + return Row(mainAxisAlignment: MainAxisAlignment.center, children: const < + Widget>[ + Icon(Icons.arrow_back_ios_outlined, color: Colors.white, size: 12.0), + Icon(Icons.arrow_forward_ios_outlined, color: Colors.white, size: 12.0), + ]); } } diff --git a/lib/samples/sparkline/axis_types.dart b/lib/samples/sparkline/axis_types.dart new file mode 100644 index 00000000..652bcf9a --- /dev/null +++ b/lib/samples/sparkline/axis_types.dart @@ -0,0 +1,258 @@ +/// Package import +import 'package:flutter/material.dart'; + +/// Chart import + +/// Local import +import '../../model/sample_view.dart'; + +import 'package:syncfusion_flutter_charts/sparkcharts.dart'; + +///Renders default line series chart +class SparklineAxesTypes extends SampleView { + ///Creates default line series chart + const SparklineAxesTypes(Key key) : super(key: key); + + @override + _SparklineAxesTypesState createState() => _SparklineAxesTypesState(); +} + +class _SparklineAxesTypesState extends SampleViewState { + _SparklineAxesTypesState(); + double _size = 150; + bool _isVertical = false; + final List _dateTimeChartData = [ + SalesData(xval: DateTime(2018, 0, 1), yval: 4), + SalesData(xval: DateTime(2018, 0, 2), yval: 4.5), + SalesData(xval: DateTime(2018, 0, 3), yval: 8), + SalesData(xval: DateTime(2018, 0, 4), yval: 7), + SalesData(xval: DateTime(2018, 0, 5), yval: 6), + SalesData(xval: DateTime(2018, 0, 8), yval: 8), + SalesData(xval: DateTime(2018, 0, 9), yval: 8), + SalesData(xval: DateTime(2018, 0, 10), yval: 6.5), + SalesData(xval: DateTime(2018, 0, 11), yval: 4), + SalesData(xval: DateTime(2018, 0, 12), yval: 5.5), + SalesData(xval: DateTime(2018, 0, 15), yval: 8), + SalesData(xval: DateTime(2018, 0, 16), yval: 6), + SalesData(xval: DateTime(2018, 0, 17), yval: 6.5), + SalesData(xval: DateTime(2018, 0, 18), yval: 7.5), + SalesData(xval: DateTime(2018, 0, 19), yval: 7.5), + SalesData(xval: DateTime(2018, 0, 22), yval: 4), + SalesData(xval: DateTime(2018, 0, 23), yval: 8), + SalesData(xval: DateTime(2018, 0, 24), yval: 6), + SalesData(xval: DateTime(2018, 0, 25), yval: 7.5), + SalesData(xval: DateTime(2018, 0, 26), yval: 4.5), + SalesData(xval: DateTime(2018, 0, 29), yval: 6), + SalesData(xval: DateTime(2018, 0, 30), yval: 5), + SalesData(xval: DateTime(2018, 0, 31), yval: 7), + ]; + + final List _numericdata = [ + SalesData(xval: 1, yval: 190), + SalesData(xval: 2, yval: 165), + SalesData(xval: 3, yval: 158), + SalesData(xval: 4, yval: 175), + SalesData(xval: 5, yval: 200), + SalesData(xval: 6, yval: 180), + SalesData(xval: 7, yval: 210), + ]; + + final List _categorydata = [ + SalesData(xval: 'Robert', yval: 60), + SalesData(xval: 'Andrew', yval: 65), + SalesData(xval: 'Suyama', yval: 70), + SalesData(xval: 'Michael', yval: 80), + SalesData(xval: 'Janet', yval: 55), + SalesData(xval: 'Davolio', yval: 90), + SalesData(xval: 'Fuller', yval: 75), + SalesData(xval: 'Nancy', yval: 85), + SalesData(xval: 'Margaret', yval: 77), + SalesData(xval: 'Steven', yval: 68), + SalesData(xval: 'Laura', yval: 96), + SalesData(xval: 'Elizabeth', yval: 57) + ]; + @override + Widget build(BuildContext context) { + _isVertical = + MediaQuery.of(context).size.height > MediaQuery.of(context).size.width; + if (_isVertical) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 5 + : MediaQuery.of(context).size.height / 4.5; + return model.isWeb && model.isMobileResolution + ? Container( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkNumericChart(), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkCategoryChart(), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkDatetimeChart(), + ]))) + : Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkNumericChart(), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkCategoryChart(), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 5), + ), + _getSparkDatetimeChart(), + ])); + } else { + _size = MediaQuery.of(context).size.width / 4.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getSparkNumericChart(), + Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + ), + _getSparkCategoryChart(), + Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + ), + _getSparkDatetimeChart(), + ])); + } + } + + // Get the cartesian chart with default line series + Widget _getSparkDatetimeChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 1.7 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + child: Column(children: [ + Text('Average working hours for a month', + textAlign: TextAlign.center), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + ), + Expanded( + child: SfSparkBarChart.custom( + axisLineWidth: 0, + dataCount: 23, + xValueMapper: (num index) => + _dateTimeChartData[index].xval, + yValueMapper: (num index) => + _dateTimeChartData[index].yval, + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('DateTime Axis', + style: TextStyle(fontStyle: FontStyle.italic)), + ])), + ]); + } + +// Get the cartesian chart with default line series + Widget _getSparkCategoryChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 1.7 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + child: Column(children: [ + Text('Percentage of the students in a class', + textAlign: TextAlign.center), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + ), + Expanded( + child: SfSparkBarChart.custom( + axisLineWidth: 0, + dataCount: 12, + xValueMapper: (num index) => _categorydata[index].xval, + yValueMapper: (num index) => _categorydata[index].yval, + trackball: SparkChartTrackball( + tooltipFormatter: + (TooltipFormatterDetails details) { + String _labelText = + '${details.x} : ${details.y}%'; + return _labelText; + }, + activationMode: SparkChartActivationMode.tap))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Category Axis', + style: TextStyle(fontStyle: FontStyle.italic)), + ])), + ]); + } + +// Get the cartesian chart with default line series + Widget _getSparkNumericChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 1.7 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + child: Column(children: [ + Text('Expenditure details of various trips', + textAlign: TextAlign.center), + Padding( + padding: EdgeInsets.fromLTRB(0, 0, 0, 10), + ), + Expanded( + child: SfSparkBarChart.custom( + axisLineWidth: 0, + dataCount: 7, + xValueMapper: (num index) => _numericdata[index].xval, + yValueMapper: (num index) => _numericdata[index].yval, + trackball: SparkChartTrackball( + tooltipFormatter: + (TooltipFormatterDetails details) { + String _labelText = + '${details.x} : \$${details.y}'; + return _labelText; + }, + activationMode: SparkChartActivationMode.tap))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Numeric Axis', + style: TextStyle(fontStyle: FontStyle.italic)), + ])), + ]); + } +} + +class SalesData { + SalesData({this.xval, this.yval}); + final dynamic xval; + final double yval; +} diff --git a/lib/samples/sparkline/chart_types.dart b/lib/samples/sparkline/chart_types.dart new file mode 100644 index 00000000..1a58143d --- /dev/null +++ b/lib/samples/sparkline/chart_types.dart @@ -0,0 +1,264 @@ +/// Package import +import 'package:flutter/material.dart'; + +/// Chart import + +/// Local import +import '../../model/sample_view.dart'; + +import 'package:syncfusion_flutter_charts/sparkcharts.dart'; + +///Renders default line series chart +class SparklineSeriesTypes extends SampleView { + ///Creates default line series chart + const SparklineSeriesTypes(Key key) : super(key: key); + + @override + _SparklineSeriesTypesState createState() => _SparklineSeriesTypesState(); +} + +class _SparklineSeriesTypesState extends SampleViewState { + _SparklineSeriesTypesState(); + + double _size = 150; + bool _isVertical = false; + + @override + Widget build(BuildContext context) { + _isVertical = + MediaQuery.of(context).size.height > MediaQuery.of(context).size.width; + if (_isVertical) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 6 + : MediaQuery.of(context).size.height / 6; + return model.isWeb && model.isMobileResolution + ? Container( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding(padding: EdgeInsets.all(5)), + _getSparkLineChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkAreaChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkBarChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkWinlossChart(), + ], + ))) + : Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding(padding: EdgeInsets.all(5)), + Expanded(child: _getSparkLineChart()), + Padding(padding: EdgeInsets.all(5)), + Expanded(child: _getSparkAreaChart()), + Padding(padding: EdgeInsets.all(5)), + Expanded(child: _getSparkBarChart()), + Padding(padding: EdgeInsets.all(5)), + Expanded(child: _getSparkWinlossChart()), + ], + )); + } else { + _size = MediaQuery.of(context).size.width / 5.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding(padding: EdgeInsets.all(5)), + _getSparkLineChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkAreaChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkBarChart(), + Padding(padding: EdgeInsets.all(5)), + _getSparkWinlossChart(), + ], + )); + } + } + + Widget _getSparkLineChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4))), + child: Column(children: [ + Expanded( + child: SfSparkLineChart( + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap), + marker: SparkChartMarker( + borderWidth: 3, + size: 5, + shape: SparkChartMarkerShape.circle, + displayMode: SparkChartMarkerDisplayMode.all, + color: Colors.blue), + axisLineWidth: 0, + data: [ + 5, + 6, + 5, + 7, + 4, + 3, + 9, + 5, + 6, + 5, + 7, + 8, + 4, + 5, + 3, + 4, + 11, + 10, + 2, + 12, + 4, + 7, + 6, + 8 + ], + )), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Spark Line Chart', + style: TextStyle(fontStyle: FontStyle.italic)), + ]))), + ]); + } + + Widget _getSparkAreaChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4))), + child: Column(children: [ + Expanded( + child: SfSparkAreaChart( + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap), + data: [ + 34, + 36, + 32, + 35, + 40, + 38, + 33, + 37, + 34, + 31, + 30, + 29 + ], + color: Color.fromRGBO(178, 207, 255, 1), + axisLineWidth: 0, + borderWidth: 2, + borderColor: Color.fromRGBO(60, 120, 239, 1))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Spark Area Chart', + style: TextStyle(fontStyle: FontStyle.italic)), + ]))), + ]); + } + + /// Get the cartesian chart with default line series + Widget _getSparkBarChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + padding: const EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4))), + child: Column(children: [ + Expanded( + child: SfSparkBarChart( + axisLineWidth: 0, + highPointColor: Color.fromRGBO(20, 170, 33, 1), + data: [ + 10, + 6, + 8, + -5, + 11, + 5, + -2, + 7, + -3, + 6, + 8, + 10 + ], + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Spark Bar Chart', + style: TextStyle(fontStyle: FontStyle.italic)), + ]))), + ]); + } + + /// Get the cartesian chart with default line series + Widget _getSparkWinlossChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Center( + child: Container( + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + padding: const EdgeInsets.all(5.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.4))), + child: Column(children: [ + Expanded( + child: SfSparkWinLossChart( + data: [ + 12, + 15, + -10, + 13, + 15, + 6, + -12, + 17, + 13, + 0, + 8, + -10 + ], + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap))), + Padding(padding: EdgeInsets.fromLTRB(0, 2, 0, 0)), + Text('Spark Win Loss Chart', + style: TextStyle(fontStyle: FontStyle.italic)), + ]))), + ]); + } +} diff --git a/lib/samples/sparkline/customization.dart b/lib/samples/sparkline/customization.dart new file mode 100644 index 00000000..62aecbf9 --- /dev/null +++ b/lib/samples/sparkline/customization.dart @@ -0,0 +1,356 @@ +/// Package import +import 'package:flutter/material.dart'; + +/// Chart import + +/// Local import +import '../../model/sample_view.dart'; +import '../../widgets/custom_button.dart'; + +import 'package:syncfusion_flutter_charts/sparkcharts.dart'; + +class SparklineCustomization extends SampleView { + const SparklineCustomization(Key key) : super(key: key); + + @override + _SparklineCustomizationState createState() => _SparklineCustomizationState(); +} + +class _SparklineCustomizationState extends SampleViewState { + _SparklineCustomizationState(); + double _axisCrossingValue = 0, _startValue = 0, _endValue = 0; + final List _markerDisplayModeList = + ['none', 'all', 'high', 'low', 'first', 'last'].toList(); + String _selectedMarkerDisplayMode = 'none'; + SparkChartMarkerDisplayMode _markerDisplayMode = + SparkChartMarkerDisplayMode.none; + final List _datalabelDisplayModeList = + ['none', 'all', 'high', 'low', 'first', 'last'].toList(); + String _selectedDatalabelDisplayMode = 'none'; + SparkChartLabelDisplayMode _dataLabelDisplayMode = + SparkChartLabelDisplayMode.none; + bool _enableTrackLine = false, _enablePlotband = false; + + @override + void initState() { + _selectedDatalabelDisplayMode = 'none'; + _dataLabelDisplayMode = SparkChartLabelDisplayMode.none; + _selectedMarkerDisplayMode = 'none'; + _markerDisplayMode = SparkChartMarkerDisplayMode.none; + _enableTrackLine = false; + _enablePlotband = false; + _axisCrossingValue = 0; + _startValue = 2; + _endValue = 5; + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Center( + child: Container( + height: MediaQuery.of(context).size.height / 3, + width: model.isWeb || + MediaQuery.of(context).orientation == Orientation.landscape + ? MediaQuery.of(context).size.width / 2.5 + : MediaQuery.of(context).size.width / 1.2, + child: _getSparkBarCustomizationChart(), + )); + } + + SfSparkLineChart _getSparkBarCustomizationChart() { + return SfSparkLineChart( + data: [1, 5, -6, 0, 1, -2, 7, -7, -4, -10, 13, -6, 7, 5, 11, 5, 3], + labelDisplayMode: _dataLabelDisplayMode, + axisCrossesAt: _axisCrossingValue, + axisLineWidth: 1, + axisLineColor: model.themeData.brightness == Brightness.dark + ? const Color.fromRGBO(101, 101, 101, 1) + : const Color.fromRGBO(181, 181, 181, 1), + marker: SparkChartMarker(borderWidth: 2, displayMode: _markerDisplayMode), + plotBand: SparkChartPlotBand( + start: _startValue, + end: _endValue, + color: _enablePlotband + ? Color.fromRGBO(191, 212, 252, 1) + : Colors.transparent), + trackball: _enableTrackLine + ? SparkChartTrackball(activationMode: SparkChartActivationMode.tap) + : null, + ); + } + + @override + Widget buildSettings(BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + return ListView( + shrinkWrap: !model.isWeb, + children: [ + Container( + child: Row( + children: [ + Text('Marker', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding(padding: EdgeInsets.fromLTRB(75, 0, 0, 0)), + Container( + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedMarkerDisplayMode, + items: _markerDisplayModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'none', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onMarkerDisplayModeChange(value.toString()); + stateSetter(() {}); + }), + ) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Data label', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding(padding: EdgeInsets.fromLTRB(55, 0, 0, 0)), + Container( + height: 50, + alignment: Alignment.bottomLeft, + child: DropdownButton( + underline: Container(color: Color(0xFFBDBDBD), height: 1), + value: _selectedDatalabelDisplayMode, + items: _datalabelDisplayModeList.map((String value) { + return DropdownMenuItem( + value: (value != null) ? value : 'none', + child: Text('$value', + style: TextStyle(color: model.textColor))); + }).toList(), + onChanged: (String value) { + _onDatalabelDisplayModeChange(value.toString()); + stateSetter(() {}); + }), + ) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Trackball', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding(padding: EdgeInsets.fromLTRB(16, 0, 0, 0)), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enableTrackLine, + onChanged: (bool value) { + setState(() { + _enableTrackLine = value; + stateSetter(() {}); + }); + })) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Axis value', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Padding(padding: EdgeInsets.fromLTRB(30, 0, 0, 0)), + Container( + width: 150, + child: SliderTheme( + data: SliderThemeData( + tickMarkShape: SliderTickMarkShape.noTickMark), + child: Slider( + value: _axisCrossingValue, + min: -10, + max: 13, + divisions: 24, + onChanged: (double value) { + setState(() { + _axisCrossingValue = value; + stateSetter(() {}); + }); + }, + ))), + Padding(padding: EdgeInsets.fromLTRB(2, 0, 0, 0)), + Container( + child: Text('${_axisCrossingValue.floor()}', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + ) + ], + ), + ), + Container( + child: Row( + children: [ + Text('Plot band', + style: TextStyle( + color: model.textColor, + fontSize: 16, + )), + Container( + width: 90, + child: CheckboxListTile( + activeColor: model.backgroundColor, + value: _enablePlotband, + onChanged: (bool value) { + setState(() { + _enablePlotband = value; + stateSetter(() {}); + }); + })) + ], + ), + ), + Visibility( + visible: _enablePlotband, + child: Row(children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Start', + style: + TextStyle(fontSize: 16.0, color: model.textColor), + ), + ]), + Padding(padding: EdgeInsets.fromLTRB(20, 0, 0, 0)), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 13, + minValue: -10, + initialValue: _startValue, + onChanged: (double val) => setState(() { + _startValue = val; + }), + loop: true, + iconColor: model.textColor, + style: + TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ]), + ])), + Visibility( + visible: _enablePlotband, + child: Row(children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'End', + style: + TextStyle(fontSize: 16.0, color: model.textColor), + ) + ]), + Padding(padding: EdgeInsets.fromLTRB(25, 0, 0, 0)), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.fromLTRB(50, 0, 0, 0), + child: CustomDirectionalButtons( + maxValue: 13, + minValue: -10, + initialValue: _endValue, + onChanged: (double val) => setState(() { + _endValue = val; + }), + loop: true, + iconColor: model.textColor, + style: + TextStyle(fontSize: 20.0, color: model.textColor), + ), + ) + ]), + ])), + ], + ); + }); + } + + /// Method to change the marker display mode using dropdown menu. + void _onMarkerDisplayModeChange(String _item) { + _selectedMarkerDisplayMode = _item; + if (_selectedMarkerDisplayMode == 'none') { + _markerDisplayMode = SparkChartMarkerDisplayMode.none; + } + if (_selectedMarkerDisplayMode == 'all') { + _markerDisplayMode = SparkChartMarkerDisplayMode.all; + } + if (_selectedMarkerDisplayMode == 'high') { + _markerDisplayMode = SparkChartMarkerDisplayMode.high; + } + if (_selectedMarkerDisplayMode == 'low') { + _markerDisplayMode = SparkChartMarkerDisplayMode.low; + } + if (_selectedMarkerDisplayMode == 'first') { + _markerDisplayMode = SparkChartMarkerDisplayMode.first; + } + if (_selectedMarkerDisplayMode == 'last') { + _markerDisplayMode = SparkChartMarkerDisplayMode.last; + } + setState(() { + /// update the marker display mode changes + }); + } + + /// Method to change the data label display mode using dropdown menu. + void _onDatalabelDisplayModeChange(String _item) { + _selectedDatalabelDisplayMode = _item; + if (_selectedDatalabelDisplayMode == 'none') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.none; + } + if (_selectedDatalabelDisplayMode == 'all') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.all; + } + if (_selectedDatalabelDisplayMode == 'high') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.high; + } + if (_selectedDatalabelDisplayMode == 'low') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.low; + } + if (_selectedDatalabelDisplayMode == 'first') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.first; + } + if (_selectedDatalabelDisplayMode == 'last') { + _dataLabelDisplayMode = SparkChartLabelDisplayMode.last; + } + setState(() { + /// update the data label display mode changes + }); + } +} diff --git a/lib/samples/sparkline/live_update.dart b/lib/samples/sparkline/live_update.dart new file mode 100644 index 00000000..38e64c44 --- /dev/null +++ b/lib/samples/sparkline/live_update.dart @@ -0,0 +1,408 @@ +///Dart imports +import 'dart:async'; +import 'dart:math'; + +///Package imports +import 'package:flutter/material.dart'; + +///Local import +import '../../model/sample_view.dart'; + +import 'package:syncfusion_flutter_charts/sparkcharts.dart'; + +/// Widget of the AgendaView Calendar. +class SparklineLiveUpdate extends SampleView { + const SparklineLiveUpdate(Key key) : super(key: key); + + @override + _SparklineLiveUpdateState createState() => _SparklineLiveUpdateState(); +} + +class _SparklineLiveUpdateState extends SampleViewState { + _SparklineLiveUpdateState(); + + double _size = 140; + Timer _timer; + bool _isVertical = false; + String _cpuValue = ''; + String _diskValue = ''; + String _memoryValue = ''; + String _ethernetValue = ''; + List _cpuData = [20, 19, 39, 25, 11, 28, 34, 28]; + List _diskData = [ + 60, + 59, + 55, + 60, + 64, + 56, + 55, + 65, + 55, + 60, + 59, + 55, + 60, + 64, + 56, + 55, + 65, + 55 + ]; + List _memoryData = [0, 68, 47, 74, 52, 74, 42, 3, 16]; + List _ethernetData = [0, 12, 0, 63, 13, 25, 48, 24, 74]; + @override + void initState() { + _cpuValue = _cpuData[_cpuData.length - 1].round().toString(); + _diskValue = _diskData[_diskData.length - 1].round().toString(); + _memoryValue = _memoryData[_memoryData.length - 1].round().toString(); + _ethernetValue = _ethernetData[_ethernetData.length - 1].round().toString(); + super.initState(); + _timer = Timer.periodic(const Duration(milliseconds: 500), _updateData); + } + + @override + void dispose() { + _cpuData = []; + _diskData = []; + _memoryData = []; + _ethernetData = []; + _timer.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _isVertical = + MediaQuery.of(context).size.height > MediaQuery.of(context).size.width; + if (_isVertical) { + _size = model.isWeb + ? MediaQuery.of(context).size.height / 6.5 + : MediaQuery.of(context).size.height / 6; + return model.isWeb && model.isMobileResolution + ? Container( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _getCPUDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getDiskDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getMemoryDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getEthernetDataChart(), + ], + )), + ) + : Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _getCPUDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getDiskDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getMemoryDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 10), + ), + _getEthernetDataChart(), + ], + ), + ); + } else { + _size = MediaQuery.of(context).size.width / 5.5; + return Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _getCPUDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 0), + ), + _getDiskDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 0), + ), + _getMemoryDataChart(), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 0, 0), + ), + _getEthernetDataChart(), + ], + ), + ); + } + } + + Widget _getCPUDataChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text('CPU', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 16))), + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text( + '${_cpuValue}' + + '%' + + ' ' + + '${int.parse(_cpuValue) / 5}' + + ' GHz', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 12, + color: + model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(232, 242, 252, 1) + : Color.fromRGBO(3, 88, 160, 1)))), + Padding(padding: EdgeInsets.fromLTRB(0, 0, 0, 10)), + Expanded( + child: SfSparkAreaChart( + data: _cpuData, + axisLineWidth: 0, + color: Color.fromRGBO(232, 242, 252, 1), + borderColor: Color.fromRGBO(3, 88, 160, 1), + borderWidth: 1, + )) + ]), + ), + ]); + } + + Widget _getDiskDataChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text('Disk', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 16))), + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text('${_diskValue}' + '%', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 12, + color: model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(245, 232, 252, 1) + : Color.fromRGBO(178, 71, 198, 1), + ))), + Padding(padding: EdgeInsets.fromLTRB(0, 0, 0, 10)), + Expanded( + child: SfSparkAreaChart( + data: _diskData, + axisCrossesAt: 0, + axisLineWidth: 0, + color: Color.fromRGBO(245, 232, 252, 1), + borderColor: Color.fromRGBO(178, 71, 198, 1), + borderWidth: 1, + )) + ]), + ), + ]); + } + + Widget _getMemoryDataChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text('Memory', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 16))), + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text( + '${int.parse(_memoryValue) / 10}' + + '/' + + '15.8 GB ' + + '(' + + '${(((int.parse(_memoryValue) / 10) / 15.8) * 100).round()}' + + '%' + + ')', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 12, + color: + model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(224, 249, 209, 1) + : Color.fromRGBO(39, 173, 102, 1), + ))), + Padding(padding: EdgeInsets.fromLTRB(0, 0, 0, 10)), + Expanded( + child: SfSparkAreaChart( + data: _memoryData, + axisCrossesAt: 0, + axisLineWidth: 0, + color: Color.fromRGBO(224, 249, 209, 1), + borderColor: Color.fromRGBO(39, 173, 102, 1), + borderWidth: 1)) + ])), + ]); + } + + Widget _getEthernetDataChart() { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + padding: EdgeInsets.all(5), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.withOpacity(0.5))), + height: _isVertical ? _size : _size * 0.7, + width: _isVertical ? _size * 2 : _size, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text('Ethernet', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, fontSize: 16))), + Container( + padding: EdgeInsets.fromLTRB(5, 0, 0, 0), + child: Text( + 'R: ' + '${int.parse(_ethernetValue)}' + ' Kbps', + textAlign: TextAlign.left, + style: TextStyle( + fontSize: 12, + color: + model.themeData.brightness == Brightness.dark + ? Color.fromRGBO(242, 216, 199, 1) + : Color.fromRGBO(170, 144, 122, 1), + ))), + Padding(padding: EdgeInsets.fromLTRB(0, 0, 0, 10)), + Expanded( + child: SfSparkAreaChart( + data: _ethernetData, + axisCrossesAt: 0, + axisLineWidth: 0, + color: Color.fromRGBO(242, 216, 199, 1), + borderColor: Color.fromRGBO(170, 144, 122, 1), + borderWidth: 1, + )) + ])), + ]); + } + + ///Get random value + num _getRandomInt(num _min, num _max) { + final Random _random = Random(); + return _min + _random.nextInt(_max - _min).toDouble(); + } + + void _updateData(Timer timer) { + if (_cpuData.length > 10) { + _cpuData.removeAt(0); + } + if (_diskData.length > 10) { + _diskData.removeAt(1); + _diskData[0] = 0; + } + if (_memoryData.length > 10) { + _memoryData.removeAt(0); + } + if (_ethernetData.length > 10) { + _ethernetData.removeAt(0); + } + setState(() { + _cpuData = List.from(_getCPUData()); + _diskData = List.from(_getDiskData()); + _memoryData = List.from(_getMemoryData()); + _ethernetData = List.from(_getEthernetData()); + _cpuValue = _cpuData[_cpuData.length - 1].round().toString(); + _diskValue = _diskData[_diskData.length - 1].round().toString(); + _memoryValue = _memoryData[_memoryData.length - 1].round().toString(); + _ethernetValue = + _ethernetData[_ethernetData.length - 1].round().toString(); + }); + } + + //ignore: unused_element + List _getCPUData() { + _cpuData.add(_getRandomInt(0, 40)); + return _cpuData; + } + + //ignore: unused_element + List _getDiskData() { + _diskData.add(_getRandomInt(55, 65)); + return _diskData; + } + + //ignore: unused_element + List _getMemoryData() { + _memoryData.add(_getRandomInt(0, 80)); + return _memoryData; + } + + //ignore: unused_element + List _getEthernetData() { + _ethernetData.add(_getRandomInt(0, 70)); + return _ethernetData; + } +} + +class ChartData { + ChartData(this.x, this.y); + final num x; + final num y; +} diff --git a/lib/samples/sparkline/sparkline_in_grid.dart b/lib/samples/sparkline/sparkline_in_grid.dart new file mode 100644 index 00000000..f7583061 --- /dev/null +++ b/lib/samples/sparkline/sparkline_in_grid.dart @@ -0,0 +1,487 @@ +///Dart import +import 'dart:math' as math; + +/// Package imports +import 'package:flutter/material.dart'; +// import 'package:intl/intl.dart'; + +/// Barcode imports +import 'package:syncfusion_flutter_datagrid/datagrid.dart'; + +/// Local imports +import '../../model/sample_view.dart'; + +import 'package:syncfusion_flutter_charts/sparkcharts.dart'; + +/// Renders column type data grid +class SparkLineGrid extends SampleView { + /// Creates column type data grid + const SparkLineGrid(Key key) : super(key: key); + + @override + _SparkLineGridState createState() => _SparkLineGridState(); +} + +List<_Employee> _employeeData; + +class _SparkLineGridState extends SampleViewState { + _SparkLineGridState(); + //ignore: unused_field + final math.Random _random = math.Random(); + bool _isLandscapeInMobileView; + + final _ColumnTypesDataGridSource _columnTypesDataGridSource = + _ColumnTypesDataGridSource(); + + List<_Employee> _generateList(int _count) { + final List<_Employee> _employeeData = <_Employee>[]; + for (int i = 0; i < _count; i++) { + _employeeData.add(_Employee( + 1 + i, + _names[i], + Padding(padding: EdgeInsets.fromLTRB(10, 0, 10, 0), child: _taxs[i]), + _shipCountrys[i], + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: _columnData[i]), + Padding( + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + child: SfSparkWinLossChart( + data: _winlossData[i], + trackball: SparkChartTrackball( + activationMode: SparkChartActivationMode.tap))))); + } + return _employeeData; + } + + final List _taxs = [ + SfSparkLineChart( + data: [0, 6, 4, 1, 3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [5, 4, 6, 3, 1, 2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [6, 4, 0, 3, 2, 5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [4, 6, 3, 0, 1, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [3, 5, 6, 4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [1, 3, 4, 2, 5, 0, 6], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [2, 4, 0, 3, 5, 6, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [5, 4, 6, 3, 1, 2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [0, 6, 4, 1, 3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [6, 4, 0, 3, 2, 5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [4, 6, 3, 0, 1, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [3, 5, 6, 4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [1, 3, 4, 2, 5, 0, 6], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [2, 4, 0, 3, 5, 6, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [5, 4, 6, 3, 1, 2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [0, 6, 4, 1, 3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [6, 4, 0, 3, 2, 5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [4, 6, 3, 0, 1, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [2, 4, 0, 3, 5, 6, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkLineChart( + data: [3, 5, 6, 4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + ]; + + final List _names = [ + 'VINET', + 'TOMSP', + 'HANAR', + 'VICTE', + 'SUPRD', + 'HANAR', + 'CHOPS', + 'RICSU', + 'WELLI', + 'HILAA', + 'ERNSH', + 'CENTC', + 'OTTIK', + 'QUEDE', + 'RATTC', + 'ERNSH', + 'FOLKO', + 'BLONP', + 'WARTH', + 'FRANK' + ]; + + final List> _winlossData = >[ + [0, 6, -4, 1, -3, 2, 5], + [5, -4, 6, 3, -1, 2, 0], + [6, 4, 0, 3, -2, 5, 1], + [4, -6, 3, 0, 1, -2, 5], + [3, 5, -6, -4, 0, 1, 2], + [1, -3, 4, -2, 5, 0, 6], + [2, 4, 0, -3, 5, -6, 1], + [5, 4, -6, 3, 1, -2, 0], + [0, -6, 4, 1, -3, 2, 5], + [6, 4, 0, -3, 2, -5, 1], + [4, 6, -3, 0, 1, 2, 5], + [3, -5, -6, 4, 0, 1, 2], + [1, 3, -4, -2, 5, 0, 6], + [2, -4, 0, -3, 5, 6, 1], + [5, 4, -6, 3, 1, -2, 0], + [0, 6, 4, -1, -3, 2, 5], + [6, -4, 0, -3, 2, 5, 1], + [4, 6, -3, 0, -1, 2, 5], + [6, 4, 0, -3, 2, -5, 1], + [3, 5, 6, -4, 0, 1, 2], + [1, 3, -4, 2, -5, 0, 6] + ]; + final List _columnData = [ + SfSparkBarChart( + data: [0, 6, -4, 1, -3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [5, -4, 6, 3, -1, 2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [6, 4, 0, 3, -2, 5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [4, -6, 3, 0, 1, -2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [3, 5, -6, -4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [1, -3, 4, -2, 5, 0, 6], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [2, 4, 0, -3, 5, -6, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [5, 4, -6, 3, 1, -2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [0, -6, 4, 1, -3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [6, 4, 0, -3, 2, -5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [4, 6, -3, 0, 1, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [3, -5, -6, 4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [1, 3, -4, -2, 5, 0, 6], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [2, -4, 0, -3, 5, 6, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [5, 4, -6, 3, 1, -2, 0], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [0, 6, 4, -1, -3, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [6, -4, 0, -3, 2, 5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [4, 6, -3, 0, -1, 2, 5], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [6, 4, 0, -3, 2, -5, 1], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)), + SfSparkBarChart( + data: [3, 5, 6, -4, 0, 1, 2], + axisLineWidth: 0, + trackball: + SparkChartTrackball(activationMode: SparkChartActivationMode.tap)) + ]; + + //ignore: unused_field + final List _orderDates = [ + DateTime(1996, 07, 04), + DateTime(1996, 07, 05), + DateTime(1996, 07, 08), + DateTime(1996, 07, 08), + DateTime(1996, 07, 09), + DateTime(1996, 07, 10), + DateTime(1996, 07, 11), + DateTime(1996, 07, 12), + DateTime(1996, 07, 15), + DateTime(1996, 07, 16), + DateTime(1996, 07, 17), + DateTime(1996, 07, 18), + DateTime(1996, 07, 19), + DateTime(1996, 07, 19), + DateTime(1996, 07, 22), + DateTime(1996, 07, 23), + DateTime(1996, 07, 24), + DateTime(1996, 07, 25), + DateTime(1996, 07, 26), + DateTime(1996, 07, 29), + ]; + + final List _shipCountrys = [ + 'France', + 'Germany', + 'Brazil', + 'France', + 'Belgium', + 'Brazil', + 'Switzerland', + 'Switzerland', + 'Brazil', + 'Venezuela', + 'Austria', + 'Mexico', + 'Germany', + 'Brazil', + 'USA', + 'Austria', + 'Sweden', + 'France', + 'Finland', + 'Germany', + ]; + + SfDataGrid _getDataGrid() { + return SfDataGrid( + source: _columnTypesDataGridSource, + columnWidthMode: model.isWeb + ? ColumnWidthMode.fill + : _isLandscapeInMobileView + ? ColumnWidthMode.fill + : ColumnWidthMode.auto, + cellBuilder: (BuildContext context, GridColumn column, int rowIndex) { + Widget widget; + if (column.mappingName == 'tax') { + widget = Container( + padding: const EdgeInsets.all(3), + child: _employeeData[rowIndex].tax, + ); + } + if (column.mappingName == 'column') { + widget = Container( + padding: const EdgeInsets.all(3), + child: _employeeData[rowIndex].column, + ); + } + if (column.mappingName == 'winloss') { + widget = Container( + padding: const EdgeInsets.all(3), + child: _employeeData[rowIndex].winloss, + ); + } + return widget; + }, + columns: [ + GridNumericColumn( + mappingName: 'id', + headerText: ' ID', + columnWidthMode: ColumnWidthMode.header, + headerTextAlignment: Alignment.centerRight), + GridTextColumn( + mappingName: 'name', + headerText: 'Name', + columnWidthMode: (model.isWeb || _isLandscapeInMobileView) + ? ColumnWidthMode.none + : ColumnWidthMode.cells, + headerTextAlignment: Alignment.centerLeft), + GridTextColumn( + mappingName: 'shipCountry', + headerText: 'Ship country', + columnWidthMode: (model.isWeb || _isLandscapeInMobileView) + ? ColumnWidthMode.none + : ColumnWidthMode.header, + headerTextAlignment: Alignment.centerLeft), + GridWidgetColumn( + columnWidthMode: (model.isWeb || _isLandscapeInMobileView) + ? ColumnWidthMode.none + : ColumnWidthMode.header, + mappingName: 'tax', + headerText: 'Tax per annum'), + GridWidgetColumn( + columnWidthMode: (model.isWeb || _isLandscapeInMobileView) + ? ColumnWidthMode.none + : ColumnWidthMode.header, + mappingName: 'column', + headerText: 'One day index'), + GridWidgetColumn( + columnWidthMode: (model.isWeb || _isLandscapeInMobileView) + ? ColumnWidthMode.none + : ColumnWidthMode.header, + mappingName: 'winloss', + headerText: 'Year GR'), + ]); + } + + @override + void initState() { + super.initState(); + _employeeData = _generateList(20); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _isLandscapeInMobileView = !model.isWeb && + MediaQuery.of(context).orientation == Orientation.landscape; + } + + @override + Widget build(BuildContext context) { + return Scaffold(body: _getDataGrid()); + } +} + +class _Employee { + _Employee(this.id, this.name, this.tax, this.shipCountry, this.column, + this.winloss); + final int id; + final String name; + final String shipCountry; + final Widget tax; + final Widget column; + final Widget winloss; +} + +class _ColumnTypesDataGridSource extends DataGridSource<_Employee> { + _ColumnTypesDataGridSource(); + @override + List<_Employee> get dataSource => _employeeData; + @override + Object getValue(_Employee _employee, String columnName) { + switch (columnName) { + case 'id': + return _employee.id; + break; + case 'name': + return _employee.name; + break; + case 'shipCountry': + return _employee.shipCountry; + break; + case 'tax': + return _employee.tax; + break; + case 'column': + return _employee.column; + break; + case 'winloss': + return _employee.winloss; + break; + default: + return 'empty'; + break; + } + } +} diff --git a/lib/samples/xlsio/balance_sheet/balance_sheet.dart b/lib/samples/xlsio/balance_sheet/balance_sheet.dart new file mode 100644 index 00000000..5d2e56d6 --- /dev/null +++ b/lib/samples/xlsio/balance_sheet/balance_sheet.dart @@ -0,0 +1,455 @@ +///Dart import +import 'dart:typed_data'; + +///Package imports +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +///XlsIO import +import 'package:syncfusion_flutter_xlsio/xlsio.dart' hide Column, Alignment; + +///Local imports +import '../../../model/sample_view.dart'; +import '../helper/save_file_mobile.dart' + if (dart.library.html) '../helper/save_file_web.dart'; + +/// Create balance sheet Excel report +class BalanceSheetXlsIO extends SampleView { + /// Create balance sheet Excel report + const BalanceSheetXlsIO(Key key) : super(key: key); + @override + _BalanceSheetXlsIOState createState() => _BalanceSheetXlsIOState(); +} + +class _BalanceSheetXlsIOState extends SampleViewState { + _BalanceSheetXlsIOState(); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: model.cardThemeColor, + body: Padding( + padding: const EdgeInsets.fromLTRB(10, 10, 10, 10), + child: Container( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'This sample showcases how to create a simple balance sheet in Excel with formulas, autofit rows and columns, image hyperlinks, and workbook/worksheet protection using XlsIO.', + style: TextStyle(fontSize: 16, color: model.textColor)), + const SizedBox(height: 20, width: 30), + Align( + alignment: Alignment.center, + child: FlatButton( + child: const Text('Generate Excel', + style: TextStyle(color: Colors.white)), + color: model.backgroundColor, + onPressed: _generateExcel)) + ], + ), + ), + ), + ); + } + + Future _generateExcel() async { + //Creating a workbook. + final Workbook workbook = Workbook(); + //Accessing via index + final Worksheet sheet = workbook.worksheets[0]; + sheet.name = 'Summary'; + sheet.showGridlines = false; + final Worksheet sheet2 = workbook.worksheets.addWithName('Assets'); + sheet2.showGridlines = false; + final Worksheet sheet3 = workbook.worksheets.addWithName('Liabilities'); + sheet3.showGridlines = false; + final Worksheet sheet4 = workbook.worksheets.addWithName('Categories'); + sheet4.showGridlines = false; + + final List styles = balanceSheetStyles(workbook); + + sheet.enableSheetCalculations(); + sheet.getRangeByName('A1').columnWidth = 1.69; + sheet.getRangeByIndex(2, 1).rowHeight = 30; + sheet.getRangeByName('A3').rowHeight = 40; + + final Range range = sheet.getRangeByIndex(3, 2); + range.setText('Balance Sheet'); + range.cellStyle = styles[0]; + range.columnWidth = 16.14; + sheet.getRangeByIndex(1, 3).columnWidth = 16.14; + + sheet.getRangeByName('B5:C5').merge(); + sheet.getRangeByName('B6:C6').merge(); + sheet.getRangeByName('B7:C7').merge(); + sheet.getRangeByName('B8:C8').merge(); + sheet.getRangeByName('B9:C9').merge(); + sheet.getRangeByName('B10:C10').merge(); + sheet.getRangeByName('B11:C11').merge(); + sheet.getRangeByName('B12:C12').merge(); + sheet.getRangeByName('B13:C13').merge(); + sheet.getRangeByName('B14:C14').merge(); + + sheet.getRangeByName('C3:E3').cellStyle = styles[0]; + + Range range1 = sheet.getRangeByName('D4'); + range1.cellStyle = styles[5]; + range1.text = 'FY-2019'; + + Range range2 = sheet.getRangeByName('E4'); + range2.cellStyle = styles[5]; + range2.text = 'FY-2019'; + + sheet.getRangeByName('B5').text = 'Asset Type'; + sheet.getRangeByName('D5').text = 'Prior Year'; + sheet.getRangeByName('E5').text = 'Current Year'; + + sheet.getRangeByName('B5:E5').cellStyle = styles[1]; + + sheet.getRangeByName('B6').text = 'Current Asset'; + sheet.getRangeByName('B7').text = 'Fixed Assets'; + sheet.getRangeByName('B8').text = 'Other Assets'; + sheet.getRangeByName('B9').text = 'Current Liabilities'; + sheet.getRangeByName('B10').text = 'Long-term Liabilities'; + sheet.getRangeByName('B11').text = 'Owner Equity'; + + sheet.getRangeByName('B6:E14').rowHeight = 20; + sheet.getRangeByName('B6:E11').cellStyle = styles[2]; + + sheet.getRangeByName('B12:C13').cellStyle = styles[3]; + sheet.getRangeByName('D12:E13').cellStyle = styles[8]; + sheet.getRangeByName('B12').text = 'Total Assets'; + sheet.getRangeByName('B13').text = 'Total Liabilities & Stockholder Equity'; + + sheet.getRangeByName('B14:C14').cellStyle = styles[4]; + sheet.getRangeByName('D14:E14').cellStyle = styles[9]; + sheet.getRangeByName('B14').text = 'Balance'; + + sheet.getRangeByName('D4:E14').autoFitColumns(); + + // Sheet2 + sheet2.getRangeByName('A1').columnWidth = 1.69; + + sheet2.getRangeByName('B1').text = 'Assets'; + sheet2.getRangeByName('B1:E1').cellStyle = styles[0]; + sheet2.getRangeByIndex(1, 2).columnWidth = 16; + + sheet2.getRangeByIndex(1, 3).columnWidth = 32; + + range1 = sheet2.getRangeByName('D2'); + range1.cellStyle = styles[5]; + range1.text = 'FY-2019'; + + range2 = sheet2.getRangeByName('E2'); + range2.cellStyle = styles[5]; + range2.text = 'FY-2020'; + + sheet2.getRangeByName('B3').text = 'Asset Type'; + sheet2.getRangeByName('C3').text = 'Description'; + sheet2.getRangeByName('D3').text = 'Prior Year'; + sheet2.getRangeByName('E3').text = 'Current Year'; + + sheet2.getRangeByName('B3:E3').cellStyle = styles[1]; + + sheet2.getRangeByName('B4:B7').text = 'Current Assets'; + sheet2.getRangeByName('B8:B12').text = 'Fixed Assets'; + sheet2.getRangeByIndex(13, 2).text = 'Other Assets'; + + sheet2.getRangeByName('C4').text = 'Cash'; + sheet2.getRangeByName('C5').text = 'Investments'; + sheet2.getRangeByName('C6').text = 'Inventories'; + sheet2.getRangeByName('C7').text = 'Accounts receivable'; + sheet2.getRangeByName('C8').text = 'Pre-paid expenses'; + sheet2.getRangeByName('C9').text = 'Property and equipment'; + sheet2.getRangeByName('C10').text = 'Leasehold improvements'; + sheet2.getRangeByName('C11').text = 'Equity and other investments'; + sheet2.getRangeByName('C12').text = + 'Less accumulated depreciation (Negative Value)'; + sheet2.getRangeByName('C13').text = 'Charity'; + sheet2.getRangeByName('B4:E12').cellStyle = styles[2]; + sheet2.getRangeByName('B13:E13').cellStyle = styles[6]; + + sheet2.getRangeByName('D4').number = 102100; + sheet2.getRangeByName('D5').number = 10000; + sheet2.getRangeByName('D6').number = 31000; + sheet2.getRangeByName('D7').number = 40500; + sheet2.getRangeByName('D8').number = 1500; + sheet2.getRangeByName('D9').number = 381000; + sheet2.getRangeByName('D10').number = 12000; + sheet2.getRangeByName('D11').number = 20000; + sheet2.getRangeByName('D12').number = -56000; + sheet2.getRangeByName('D13').number = 10500; + + sheet2.getRangeByName('E4').number = 100000; + sheet2.getRangeByName('E5').number = 10000; + sheet2.getRangeByName('E6').number = 30000; + sheet2.getRangeByName('E7').number = 40000; + sheet2.getRangeByName('E8').number = 1500; + sheet2.getRangeByName('E9').number = 324300; + sheet2.getRangeByName('E10').number = 14000; + sheet2.getRangeByName('E11').number = 21500; + sheet2.getRangeByName('E12').number = -46500; + sheet2.getRangeByName('E13').number = 4000; + + sheet2.getRangeByName('C3:C13').autoFitRows(); + sheet2.autoFitColumn(4); + sheet2.autoFitColumn(5); + + // sheet3 + sheet3.getRangeByName('A1').columnWidth = 1.69; + sheet3.getRangeByIndex(1, 3).columnWidth = 23; + + sheet3.getRangeByName('B1').text = 'Liabilities'; + sheet3.getRangeByName('B1:E1').cellStyle = styles[0]; + + sheet3.autoFitColumn(2); + + range1 = sheet3.getRangeByName('D2'); + range1.cellStyle = styles[5]; + range1.text = 'FY-2019'; + + range2 = sheet3.getRangeByName('E2'); + range2.cellStyle = styles[5]; + range2.text = 'FY-2020'; + + sheet3.getRangeByName('B3').text = 'Liabilities Type'; + sheet3.getRangeByName('C3').text = 'Description'; + sheet3.getRangeByName('D3').text = 'Prior Year'; + sheet3.getRangeByName('E3').text = 'Current Year'; + + sheet3.getRangeByName('B3:E3').cellStyle = styles[1]; + + sheet3.getRangeByName('B4:E11').cellStyle = styles[2]; + sheet3.getRangeByName('B12:E12').cellStyle = styles[6]; + sheet3.getRangeByName('B4:B8').text = 'Current Liabilities'; + sheet3.getRangeByName('B9:B10').text = 'Long-term Liabilities'; + sheet3.getRangeByIndex(10, 2, 11, 2).text = 'Owner Equity'; + + sheet3.getRangeByIndex(4, 3).text = 'Accounts payable'; + sheet3.getRangeByIndex(5, 3).text = 'Accrued wages'; + sheet3.getRangeByIndex(6, 3).text = 'Accrued compensation'; + sheet3.getRangeByIndex(7, 3).text = 'Income taxes payable'; + sheet3.getRangeByIndex(8, 3).text = 'Unearned revenue'; + sheet3.getRangeByIndex(9, 3).text = 'Notes Payable'; + sheet3.getRangeByIndex(10, 3).text = 'Bonds Payable'; + sheet3.getRangeByIndex(11, 3).text = 'Investment capital'; + sheet3.getRangeByIndex(12, 3).text = 'Accumulated retained earnings'; + + sheet3.getRangeByName('D4').number = 35900; + sheet3.getRangeByName('D5').number = 8500; + sheet3.getRangeByName('D6').number = 7900; + sheet3.getRangeByName('D7').number = 6100; + sheet3.getRangeByName('D8').number = 1500; + sheet3.getRangeByName('D9').number = 20000; + sheet3.getRangeByName('D10').number = 400000; + sheet3.getRangeByName('D11').number = 11000; + sheet3.getRangeByName('D12').number = 22000; + + sheet3.getRangeByName('E4').number = 30000; + sheet3.getRangeByName('E5').number = 6400; + sheet3.getRangeByName('E6').number = 5000; + sheet3.getRangeByName('E7').number = 5300; + sheet3.getRangeByName('E8').number = 1700; + sheet3.getRangeByName('E9').number = 22000; + sheet3.getRangeByName('E10').number = 380100; + sheet3.getRangeByName('E11').number = 12500; + sheet3.getRangeByName('E12').number = 20700; + + sheet3.getRangeByName('C3:C12').autoFitRows(); + sheet3.autoFitColumn(4); + sheet3.autoFitColumn(5); + + // sheet4 + sheet4.getRangeByName('A1').columnWidth = 1.69; + + sheet4.getRangeByName('B1').text = 'Categories'; + sheet4.getRangeByName('B1').cellStyle = styles[0]; + sheet4.getRangeByName('B1').columnWidth = 60; + + sheet4.getRangeByName('B3:B8').cellStyle = styles[7]; + sheet4.getRangeByIndex(3, 2).text = 'Current Assets'; + sheet4.getRangeByIndex(4, 2).text = 'Fixed Assets'; + sheet4.getRangeByIndex(5, 2).text = 'Other Assets'; + sheet4.getRangeByIndex(6, 2).text = 'Current Liabilities'; + sheet4.getRangeByIndex(7, 2).text = 'Long-term Liabilities'; + sheet4.getRangeByIndex(8, 2).text = 'Owner Equity'; + + sheet.getRangeByIndex(6, 4).formula = '=SUM(Assets!\$D\$4:\$D\$8)'; + sheet.getRangeByIndex(7, 4).formula = '=SUM(Assets!\$D\$9:\$D\$12)'; + sheet.getRangeByIndex(8, 4).formula = '=SUM(Assets!D13)'; + sheet.getRangeByIndex(9, 4).formula = '=SUM(Liabilities!\$D\$4:\$D\$8)'; + sheet.getRangeByIndex(10, 4).formula = '=SUM(Liabilities!\$D\$9:\$D\$10)'; + sheet.getRangeByIndex(11, 4).formula = '=SUM(Liabilities!\$D\$11:\$D\$12)'; + sheet.getRangeByIndex(12, 4).formula = + '=SUM(SUM(Assets!\$D\$4:\$D\$8),SUM(Assets!\$D\$9:\$D\$12),SUM(Assets!\$D\$13))'; + sheet.getRangeByIndex(13, 4).formula = + '=SUM(SUM(Liabilities!\$D\$4:\$D\$8), SUM(Liabilities!\$D\$9:\$D\$10), SUM(Liabilities!\$D\$11:\$D\$12))'; + sheet.getRangeByIndex(14, 4).formula = '=D12-D13'; + + sheet.getRangeByIndex(6, 5).formula = '=SUM(Assets!\$E\$4:\$E\$8)'; + sheet.getRangeByIndex(7, 5).formula = '=SUM(Assets!\$E\$9:\$E\$12)'; + sheet.getRangeByIndex(8, 5).formula = '=SUM(Assets!E13)'; + sheet.getRangeByIndex(9, 5).formula = '=SUM(Liabilities!\$E\$4:\$E\$8)'; + sheet.getRangeByIndex(10, 5).formula = '=SUM(Liabilities!\$E\$9:\$E\$10)'; + sheet.getRangeByIndex(11, 5).formula = '=SUM(Liabilities!\$E\$11:\$E\$12)'; + sheet.getRangeByIndex(12, 5).formula = + '=SUM(SUM(Assets!\$E\$4:\$E\$8),SUM(Assets!\$E\$9:\$E\$12),SUM(Assets!\$E\$13))'; + sheet.getRangeByIndex(13, 5).formula = + '=SUM(SUM(Liabilities!\$E\$4:\$E\$8), SUM(Liabilities!\$E\$9:\$E\$10), SUM(Liabilities!\$E\$11:\$E\$12))'; + sheet.getRangeByIndex(14, 5).formula = '=E12-E13'; + + // sheet1 Image Hyperlink + final Picture picture = + sheet.pictures.addStream(2, 2, await _readImageData('assets.png')); + picture.height = 30; + picture.width = 100; + sheet.hyperlinks + .addImage(picture, HyperlinkType.workbook, 'Assets!B1', 'Assets'); + + final Picture picture1 = + sheet.pictures.addStream(2, 3, await _readImageData('liabilities.png')); + picture1.height = 30; + picture1.width = 100; + sheet.hyperlinks.addImage( + picture1, HyperlinkType.workbook, 'Liabilities!B1', 'Liabilities'); + + final Picture picture2 = + sheet.pictures.addStream(2, 4, await _readImageData('categories.png')); + picture2.height = 30; + picture2.width = 100; + sheet.hyperlinks.addImage( + picture2, HyperlinkType.workbook, 'Categories!B1', 'Categories'); + + sheet.protect('Syncfusion'); + ExcelSheetProtectionOption option = ExcelSheetProtectionOption(); + option.lockedCells = true; + option.insertColumns = true; + sheet2.protect('Syncfusion', option); + option = ExcelSheetProtectionOption(); + option.formatCells = true; + sheet3.protect('Syncfusion', option); + sheet4.protect('Syncfusion'); + + workbook.protect(true, true, 'Syncfusion'); + + final List bytes = workbook.saveAsStream(); + workbook.dispose(); + + //Launch file. + await FileSaveHelper.saveAndLaunchFile(bytes, 'BalanceSheet.xlsx'); + } + + // Create styles for worksheet + List balanceSheetStyles(Workbook workbook) { + final Style style = workbook.styles.add('Style'); + style.fontColor = '#308DA2'; + style.fontSize = 28; + style.bold = true; + style.borders.bottom.lineStyle = LineStyle.double; + style.vAlign = VAlignType.center; + + final Style style1 = workbook.styles.add('Style1'); + style1.bold = true; + style1.fontSize = 12; + style1.fontColor = '#595959'; + style1.vAlign = VAlignType.center; + style1.borders.bottom.lineStyle = LineStyle.thin; + style1.borders.bottom.color = '#A6A6A6'; + style1.borders.right.lineStyle = LineStyle.thin; + style1.borders.right.color = '#A6A6A6'; + + final Style style2 = workbook.styles.add('Style2'); + style2.fontColor = '#595959'; + style2.wrapText = true; + style2.vAlign = VAlignType.center; + style2.borders.bottom.lineStyle = LineStyle.thin; + style2.borders.bottom.color = '#A6A6A6'; + style2.borders.right.lineStyle = LineStyle.thin; + style2.borders.right.color = '#A6A6A6'; + style2.numberFormat = '_(\$* #,##0_);_(\$* (#,##0);_(\$* "-"_);_(@_)'; + + final Style style3 = workbook.styles.add('style3'); + style3.backColor = '#F2F2F2'; + style3.fontColor = '#313F55'; + style3.vAlign = VAlignType.center; + style3.borders.bottom.lineStyle = LineStyle.thin; + style3.borders.bottom.color = '#308DA2'; + style3.borders.right.lineStyle = LineStyle.thin; + style3.borders.right.color = '#A6A6A6'; + + final Style style4 = workbook.styles.add('Style4'); + style4.backColor = '#CFEBF1'; + style4.bold = true; + style4.vAlign = VAlignType.center; + style4.borders.bottom.lineStyle = LineStyle.medium; + style4.borders.bottom.color = '#308DA2'; + style4.borders.right.lineStyle = LineStyle.thin; + style4.borders.right.color = '#A6A6A6'; + + final Style style5 = workbook.styles.add('Style5'); + style5.fontSize = 12; + style5.vAlign = VAlignType.center; + style5.hAlign = HAlignType.right; + style5.indent = 1; + style5.borders.bottom.lineStyle = LineStyle.thick; + style5.borders.bottom.color = '#308DA2'; + style5.borders.right.lineStyle = LineStyle.thin; + style5.borders.right.color = '#A6A6A6'; + style5.borders.left.lineStyle = LineStyle.thin; + style5.borders.left.color = '#A6A6A6'; + + final Style style6 = workbook.styles.add('Style6'); + style6.fontColor = '#595959'; + style6.wrapText = true; + style6.vAlign = VAlignType.center; + style6.borders.right.lineStyle = LineStyle.thin; + style6.borders.right.color = '#A6A6A6'; + style6.numberFormat = '_(\$* #,##0_);_(\$* (#,##0);_(\$* "-"_);_(@_)'; + + final Style style7 = workbook.styles.add('Style7'); + style7.fontColor = '#595959'; + style7.wrapText = true; + style7.vAlign = VAlignType.center; + style7.borders.bottom.lineStyle = LineStyle.thin; + style7.borders.bottom.color = '#A6A6A6'; + + final Style style8 = workbook.styles.add('style8'); + style8.backColor = '#F2F2F2'; + style8.fontColor = '#313F55'; + style8.vAlign = VAlignType.center; + style8.borders.bottom.lineStyle = LineStyle.thin; + style8.borders.bottom.color = '#308DA2'; + style8.borders.right.lineStyle = LineStyle.thin; + style8.borders.right.color = '#A6A6A6'; + style8.numberFormat = '_(\$* #,##0_);_(\$* (#,##0);_(\$* "-"_);_(@_)'; + + final Style style9 = workbook.styles.add('style9'); + style9.backColor = '#CFEBF1'; + style9.bold = true; + style9.vAlign = VAlignType.center; + style9.borders.bottom.lineStyle = LineStyle.medium; + style9.borders.bottom.color = '#308DA2'; + style9.borders.right.lineStyle = LineStyle.thin; + style9.borders.right.color = '#A6A6A6'; + style9.numberFormat = '_(\$* #,##0_);_(\$* (#,##0);_(\$* "-"_);_(@_)'; + + return [ + style, + style1, + style2, + style3, + style4, + style5, + style6, + style7, + style8, + style9 + ]; + } + + Future> _readImageData(String name) async { + final ByteData data = await rootBundle.load('images/xlsio/$name'); + return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); + } +} diff --git a/lib/samples/xlsio/expenses_report/expenses_report.dart b/lib/samples/xlsio/expenses_report/expenses_report.dart index e61795f3..c8a721de 100644 --- a/lib/samples/xlsio/expenses_report/expenses_report.dart +++ b/lib/samples/xlsio/expenses_report/expenses_report.dart @@ -10,9 +10,9 @@ import '../../../model/sample_view.dart'; import '../helper/save_file_mobile.dart' if (dart.library.html) '../helper/save_file_web.dart'; -/// Render pdf of invoice +/// Create expenses report Excel report class ExpensesReportXlsIO extends SampleView { - /// Render pdf of invoice + /// Create expenses report Excel report const ExpensesReportXlsIO(Key key) : super(key: key); @override _ExpensesReportXlsIOState createState() => _ExpensesReportXlsIOState(); @@ -33,7 +33,7 @@ class _ExpensesReportXlsIOState extends SampleViewState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'The XlsIO package is a non-UI and reusable flutter library to create Excel reports programmatically with formatted text, numbers, datetime, number formats, cell styles, images, charts and more.\r\n\r\nThis sample showcases on how to create a simple Excel report for expenses with data, chart, formulas, and cell formatting using XlsIO.', + 'The XlsIO package is a non-UI and reusable Flutter library to create Excel reports programmatically with formatted text, numbers, date time, number formats, cell styles, images, charts, and more.\r\n\r\nThis sample showcases how to create a simple Excel report for expenses with data, charts, formulas, and cell formatting using XlsIO.', style: TextStyle(fontSize: 16, color: model.textColor)), const SizedBox(height: 20, width: 30), Align( diff --git a/lib/samples/xlsio/invoice/invoice.dart b/lib/samples/xlsio/invoice/invoice.dart index 79fe8da0..f22cbb08 100644 --- a/lib/samples/xlsio/invoice/invoice.dart +++ b/lib/samples/xlsio/invoice/invoice.dart @@ -13,9 +13,9 @@ import '../../../model/sample_view.dart'; import '../helper/save_file_mobile.dart' if (dart.library.html) '../helper/save_file_web.dart'; -/// Render pdf of invoice +/// Create invoice Excel report class InvoiceXlsIO extends SampleView { - /// Render pdf of invoice + /// Create invoice Excel report const InvoiceXlsIO(Key key) : super(key: key); @override _InvoiceXlsIOState createState() => _InvoiceXlsIOState(); @@ -36,7 +36,7 @@ class _InvoiceXlsIOState extends SampleViewState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'This sample showcases on how to create a simple Excel invoice with data, image, formulas, and cell formatting using XlsIO.', + 'This sample showcases how to create a simple Excel invoice with data, images, formulas, and cell formatting using XlsIO.', style: TextStyle(fontSize: 16, color: model.textColor)), const SizedBox(height: 20, width: 30), Align( @@ -233,7 +233,6 @@ class _InvoiceXlsIOState extends SampleViewState { await FileSaveHelper.saveAndLaunchFile(bytes, 'Invoice.xlsx'); } - //ignore: unused_element Future> _readImageData(String name) async { final ByteData data = await rootBundle.load('images/xlsio/$name'); return data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes); diff --git a/lib/samples/xlsio/yearly_sales/yearly_sales.dart b/lib/samples/xlsio/yearly_sales/yearly_sales.dart index 0d3aa1e0..edcf81f8 100644 --- a/lib/samples/xlsio/yearly_sales/yearly_sales.dart +++ b/lib/samples/xlsio/yearly_sales/yearly_sales.dart @@ -10,9 +10,9 @@ import '../../../model/sample_view.dart'; import '../helper/save_file_mobile.dart' if (dart.library.html) '../helper/save_file_web.dart'; -/// Render pdf of invoice +/// Create yearly sales Excel report class YearlySalesXlsIO extends SampleView { - /// Render pdf of invoice + /// Create yearly sales Excel report const YearlySalesXlsIO(Key key) : super(key: key); @override _YearlySalesXlsIOState createState() => _YearlySalesXlsIOState(); @@ -33,7 +33,7 @@ class _YearlySalesXlsIOState extends SampleViewState { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'This sample showcases on how to create a simple Excel report for yearly sales with data, chart, formulas, and cell formatting using XlsIO.', + 'This sample showcases how to create a simple Excel report for yearly sales with data, charts, formulas, and cell formatting using XlsIO.', style: TextStyle(fontSize: 16, color: model.textColor)), const SizedBox(height: 20, width: 30), Align( diff --git a/lib/widgets/bottom_sheet.dart b/lib/widgets/bottom_sheet.dart index bb4f4a40..5ce6bfb3 100644 --- a/lib/widgets/bottom_sheet.dart +++ b/lib/widgets/bottom_sheet.dart @@ -1,5 +1,4 @@ ///Flutter package imports -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; ///Local import @@ -10,19 +9,16 @@ Future showRoundedModalBottomSheet({ @required BuildContext context, @required WidgetBuilder builder, Color color = Colors.white, - double radius = 10.0, - bool dismissOnTap = true, + bool dismissOnTap = false, }) { assert(context != null); assert(builder != null); - assert(radius != null && radius > 0.0); assert(color != null && color != Colors.transparent); return Navigator.push( context, _RoundedCornerModalRoute( builder: builder, color: color, - radius: radius, autoResize: true, dismissOnTap: dismissOnTap, barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, @@ -167,14 +163,12 @@ class _RoundedCornerModalRoute extends PopupRoute { this.builder, this.barrierLabel, this.color, - this.radius, this.autoResize = false, this.dismissOnTap = true, RouteSettings settings, }) : super(settings: settings); final WidgetBuilder builder; - final double radius; final Color color; final bool autoResize; final bool dismissOnTap; @@ -211,17 +205,14 @@ class _RoundedCornerModalRoute extends PopupRoute { Widget buildPage(BuildContext context, Animation animation, Animation secondaryAnimation) { return Container( - margin: kIsWeb - ? const EdgeInsets.fromLTRB(250, 0, 250, 0) - : const EdgeInsets.all(0), child: MediaQuery.removePadding( - context: context, - removeTop: true, - child: Theme( - data: Theme.of(context).copyWith(canvasColor: Colors.transparent), - child: _RoundedModalBottomSheet(route: this), - ), - )); + context: context, + removeTop: true, + child: Theme( + data: Theme.of(context).copyWith(canvasColor: Colors.transparent), + child: _RoundedModalBottomSheet(route: this), + ), + )); } } @@ -279,8 +270,8 @@ class _RoundedModalBottomSheetState decoration: BoxDecoration( color: widget.route.color, borderRadius: BorderRadius.only( - topLeft: Radius.circular(widget.route.radius), - topRight: Radius.circular(widget.route.radius), + topLeft: Radius.circular(12.0), + topRight: Radius.circular(12.0), ), ), child: SafeArea( diff --git a/lib/widgets/checkbox.dart b/lib/widgets/checkbox.dart deleted file mode 100644 index 1a776664..00000000 --- a/lib/widgets/checkbox.dart +++ /dev/null @@ -1,60 +0,0 @@ -///package import -import 'package:flutter/material.dart'; - -/// Custom check box extend from [CheckboxListTile] widget -/// To customize the check box -class CustomCheckBox extends StatefulWidget { - /// Holds the CheckboxListTile information - const CustomCheckBox( - {@required this.switchValue, - @required this.valueChanged, - this.activeColor}) - : assert(switchValue != null), - assert(valueChanged != null); - - /// Whether this checkbox is checked. - /// - /// This property must not be null. - final bool switchValue; - - /// Called when the value of the checkbox should change. - final ValueChanged valueChanged; - - /// The color to use when this checkbox is checked. - /// - /// Defaults to accent color of the current [Theme]. - final Color activeColor; - - @override - _BottomSheetSwitch createState() => _BottomSheetSwitch(); -} - -class _BottomSheetSwitch extends State { - bool _switchValue; - - @override - void initState() { - _switchValue = widget.switchValue; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container( - width: 90, - child: Column( - children: [ - CheckboxListTile( - activeColor: widget.activeColor, - value: _switchValue, - onChanged: (bool value) { - setState(() { - _switchValue = value; - widget.valueChanged(value); - }); - }) - ], - ), - ); - } -} diff --git a/lib/widgets/custom_button.dart b/lib/widgets/custom_button.dart index 98183dbd..0a148ed9 100644 --- a/lib/widgets/custom_button.dart +++ b/lib/widgets/custom_button.dart @@ -6,7 +6,7 @@ class CustomDirectionalButtons extends StatefulWidget { /// direction arrows surronding in text widget const CustomDirectionalButtons({ Key key, - @required this.minValue, + this.minValue = 0, @required this.maxValue, @required this.initialValue, @required this.onChanged, diff --git a/lib/widgets/custom_dropdown.dart b/lib/widgets/custom_dropdown.dart deleted file mode 100644 index e1d91a41..00000000 --- a/lib/widgets/custom_dropdown.dart +++ /dev/null @@ -1,56 +0,0 @@ -///Package import -import 'package:flutter/material.dart'; - -/// Custom dropdown acts like [DropdownButton] -class DropDown extends StatefulWidget { - /// Holds the DropdownButton details - const DropDown( - {@required this.value, - @required this.valueChanged, - this.item, - this.isExpanded = false}) - : assert(value != null), - assert(valueChanged != null); - - /// The value of the currently selected [DropdownMenuItem]. - final String value; - - /// The list of items the user can select. - final List> item; - - /// Called when the user selects an item. - final ValueChanged valueChanged; - - /// Set the dropdown's inner contents to horizontally fill its parent. - final bool isExpanded; - - @override - _DropDownState createState() => _DropDownState(); -} - -class _DropDownState extends State { - String _value; - - @override - void initState() { - _value = widget.value; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Container( - child: DropdownButton( - isExpanded: widget.isExpanded, - value: _value, - items: widget.item, - onChanged: (String value) { - setState(() { - _value = value; - widget.valueChanged(value); - }); - }, - ), - ); - } -} diff --git a/lib/widgets/flutter_backdrop.dart b/lib/widgets/flutter_backdrop.dart index 140eaacd..628e75f3 100644 --- a/lib/widgets/flutter_backdrop.dart +++ b/lib/widgets/flutter_backdrop.dart @@ -378,9 +378,7 @@ class _BackdropPanel extends StatelessWidget { this.onTap, this.onVerticalDragUpdate, this.onVerticalDragEnd, - this.frontHeader, this.child, - this.shape, this.borderRadius, this.frontHeaderHeight, this.padding, @@ -390,10 +388,8 @@ class _BackdropPanel extends StatelessWidget { final VoidCallback onTap; final GestureDragUpdateCallback onVerticalDragUpdate; final GestureDragEndCallback onVerticalDragEnd; - final Widget frontHeader; final Widget child; final BorderRadius borderRadius; - final ShapeBorder shape; final double frontHeaderHeight; final EdgeInsets padding; final Color color; @@ -406,7 +402,6 @@ class _BackdropPanel extends StatelessWidget { color: color, elevation: 12.0, borderRadius: borderRadius, - shape: shape, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -416,10 +411,7 @@ class _BackdropPanel extends StatelessWidget { onVerticalDragUpdate: onVerticalDragUpdate, onVerticalDragEnd: onVerticalDragEnd, onTap: onTap, - child: Container( - height: frontHeaderHeight, - child: frontHeader, - ), + child: Container(height: frontHeaderHeight), ), //--------------------REST OF THE BODY---------------------- diff --git a/lib/widgets/search_bar.dart b/lib/widgets/search_bar.dart index ed368899..f41a0c91 100644 --- a/lib/widgets/search_bar.dart +++ b/lib/widgets/search_bar.dart @@ -10,7 +10,6 @@ import 'package:flutter/services.dart'; ///Local import import '../model/helper.dart'; import '../model/model.dart'; -import 'shared/mobile.dart' if (dart.library.html) 'shared/web.dart'; /// Searchbar widget for searching particular sample /// by typing the sample's title in the text editor present in the [SearchBar] @@ -230,7 +229,9 @@ class _SearchBarState extends State with WidgetsBindingObserver { ///Arrow up key action _selectionIndex = _selectionIndex == null ? 0 - : _selectionIndex == 0 ? 0 : _selectionIndex - 1; + : _selectionIndex == 0 + ? 0 + : _selectionIndex - 1; final List indexes = _getVisibleIndexes(); if (!indexes.contains(_selectionIndex)) { _scrollToUp(_selectionIndex); @@ -244,7 +245,6 @@ class _SearchBarState extends State with WidgetsBindingObserver { sampleListModel.editingController.text = ''; _isFocus.unfocus(); _overlayEntry.maintainState = false; - changeCursorStyleOnNavigation(); _overlayEntry.opaque = false; _removeOverlayEntries(); } @@ -254,7 +254,6 @@ class _SearchBarState extends State with WidgetsBindingObserver { /// Navigate to the selected sample void _navigateToSample(int index) { _overlayEntry.maintainState = false; - changeCursorStyleOnNavigation(); sampleListModel.editingController.text = ''; _isFocus.unfocus(); _overlayEntry.opaque = false; @@ -351,8 +350,7 @@ class _SearchBarState extends State with WidgetsBindingObserver { .createGlobalKey(); return _RectGetterFromListView( key: _keys[index], - child: HandCursor( - child: SizedBox( + child: SizedBox( height: _itemHeight.toDouble(), child: Material( color: index == _selectionIndex @@ -382,7 +380,7 @@ class _SearchBarState extends State with WidgetsBindingObserver { _selectionIndex = null; _navigateToSample(index); })), - ))); + )); }))), ), ), diff --git a/lib/widgets/shared/mobile.dart b/lib/widgets/shared/mobile.dart deleted file mode 100644 index 11deb83c..00000000 --- a/lib/widgets/shared/mobile.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/widgets.dart'; - -/// Cursor tracks the movement shows as hand symbol -class HandCursor extends MouseRegion { - /// holds the child widget - const HandCursor({@required Widget child}) : super(child: child); -} - -/// change the cursor into hand cursor on navigation -void changeCursorStyleOnNavigation() {} diff --git a/lib/widgets/shared/shared.dart b/lib/widgets/shared/shared.dart deleted file mode 100644 index 046d5df4..00000000 --- a/lib/widgets/shared/shared.dart +++ /dev/null @@ -1,3 +0,0 @@ -export 'shared.dart' - if (dart.library.html) 'web.dart' - if (dart.library.io) 'mobile.dart'; diff --git a/lib/widgets/shared/web.dart b/lib/widgets/shared/web.dart deleted file mode 100644 index 429a2f1a..00000000 --- a/lib/widgets/shared/web.dart +++ /dev/null @@ -1,28 +0,0 @@ -//ignore: avoid_web_libraries_in_flutter -import 'dart:html' as html; -import 'package:flutter/gestures.dart'; -import 'package:flutter/widgets.dart'; - -/// Cursor tracks the movement shows as hand symbol -class HandCursor extends MouseRegion { - /// holds the mouse events - const HandCursor({@required Widget child}) - : super( - child: child, - onHover: _mouseHover, - onExit: _mouseExit, - ); - static final html.Element _appContainer = - html.window.document.getElementById('app-container'); - - static void _mouseHover(PointerEvent event) => - _appContainer.style.cursor = 'pointer'; - - static void _mouseExit(PointerEvent event) => - _appContainer.style.cursor = 'default'; -} - -/// change the cursor into hand cursor on navigation -void changeCursorStyleOnNavigation() { - HandCursor._appContainer.style.cursor = 'default'; -} diff --git a/lib/widgets/switch.dart b/lib/widgets/switch.dart deleted file mode 100644 index 2ffda2d3..00000000 --- a/lib/widgets/switch.dart +++ /dev/null @@ -1,52 +0,0 @@ -///Package imports -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; - -/// Custom switch extends from the [CupertinoSwitch] widget -class CustomSwitch extends StatefulWidget { - /// Holds the switch informations - const CustomSwitch( - {@required this.switchValue, - @required this.valueChanged, - this.activeColor}) - : assert(switchValue != null), - assert(valueChanged != null); - - /// Contains the information of switch state (on/off) - final bool switchValue; - - /// Holds the action of on/off change - final ValueChanged valueChanged; - - /// Holds the color of the switch - final Color activeColor; - - @override - _BottomSheetSwitch createState() => _BottomSheetSwitch(); -} - -class _BottomSheetSwitch extends State { - bool _switchValue; - - @override - void initState() { - _switchValue = widget.switchValue; - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Transform.scale( - scale: 0.8, - child: CupertinoSwitch( - activeColor: widget.activeColor, - value: _switchValue, - onChanged: (bool value) { - setState(() { - _switchValue = value; - widget.valueChanged(value); - }); - }), - ); - } -} diff --git a/pubspec.yaml b/pubspec.yaml index 3bb2193e..320fd278 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,36 +1,39 @@ name: flutter_examples description: This project contains the Syncfusion Flutter UI widgets examples. -version: 18.3.35 +version: 18.4.30 +author: Syncfusion homepage: https://github.com/syncfusion/flutter-examples environment: sdk: ">=2.1.0 <3.0.0" + dependencies: flutter_test: sdk: flutter flutter: sdk: flutter - scoped_model: 1.0.1 - flutter_gallery_assets: 0.1.8 url_launcher: ^5.0.3 intl: ^0.16.0 path_provider: ^1.6.18 - http: ^0.12.2 - syncfusion_flutter_datagrid: ^18.3.35-beta - syncfusion_flutter_calendar: ^18.3.35 - syncfusion_flutter_datepicker: ^18.3.35-beta - syncfusion_flutter_charts: ^18.3.35 - syncfusion_flutter_gauges: ^18.3.35 - syncfusion_flutter_sliders: ^18.3.35-beta - syncfusion_flutter_pdf: ^18.3.35-beta - syncfusion_flutter_barcodes: ^18.3.35 - syncfusion_officechart: ^18.3.35-beta - syncfusion_flutter_maps: ^18.3.35-beta - syncfusion_flutter_signaturepad: ^18.3.35-beta - syncfusion_flutter_pdfviewer: ^18.3.35-beta - + flutter_localizations: + sdk: flutter + + syncfusion_flutter_datagrid: ^18.4.30-beta + syncfusion_flutter_calendar: ^18.4.30 + syncfusion_flutter_datepicker: ^18.4.30-beta + syncfusion_flutter_charts: ^18.4.30 + syncfusion_flutter_gauges: ^18.4.30 + syncfusion_flutter_sliders: ^18.4.30-beta + syncfusion_flutter_pdf: ^18.4.30-beta + syncfusion_flutter_barcodes: ^18.4.30 + syncfusion_officechart: ^18.4.30-beta + syncfusion_flutter_maps: ^18.4.30-beta + syncfusion_flutter_signaturepad: ^18.4.30-beta + syncfusion_flutter_pdfviewer: ^18.4.30-beta + + flutter: uses-material-design: true assets: @@ -45,6 +48,13 @@ flutter: - india.json - usa.json - south_america.json + - australia.json + - river.json + - london_to_british.json + - london_to_chessington.json + - london_to_hampton_court_palace.json + - london_to_twickenham_stadium.json + - london_to_windsor_castle.json - product_data.json - chart_data.json fonts: