├── .fvmrc
├── .github
├── pull_request_template.md
└── workflows
│ ├── main.yml
│ ├── sync_with_crowdin.yml
│ └── update_app_identifiers.sh
├── .gitignore
├── .metadata
├── LICENSE
├── Makefile
├── README.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── org
│ │ │ │ └── catrobat
│ │ │ │ └── paintroid
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-mdpi
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable-xhdpi
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xxhdpi
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ └── ic_launcher_foreground.png
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ └── ic_launcher.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── values-night
│ │ │ └── styles.xml
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
├── icon
│ ├── 1.5x
│ │ ├── pocketpaint_intro_landscape.png
│ │ ├── pocketpaint_intro_portrait.png
│ │ └── pocketpaint_logo_small.png
│ ├── 2.0x
│ │ ├── pocketpaint_intro_landscape.png
│ │ ├── pocketpaint_intro_portrait.png
│ │ └── pocketpaint_logo_small.png
│ ├── 3.0x
│ │ ├── pocketpaint_intro_landscape.png
│ │ ├── pocketpaint_intro_portrait.png
│ │ └── pocketpaint_logo_small.png
│ ├── app_icon.png
│ └── app_icon_foreground.png
├── img
│ ├── checkerboard.png
│ ├── pocketpaint_intro_landscape.png
│ ├── pocketpaint_intro_portrait.png
│ └── pocketpaint_logo_small.png
├── lang
│ └── app_translations_en.arb
└── svg
│ ├── ic_brush.svg
│ ├── ic_clipboard.svg
│ ├── ic_clipping.svg
│ ├── ic_cursor.svg
│ ├── ic_edit_circle.svg
│ ├── ic_eraser.svg
│ ├── ic_fill.svg
│ ├── ic_hand.svg
│ ├── ic_import.svg
│ ├── ic_layers.svg
│ ├── ic_line.svg
│ ├── ic_pipette.svg
│ ├── ic_shapes.svg
│ ├── ic_smudge.svg
│ ├── ic_spray_can.svg
│ ├── ic_stamp.svg
│ ├── ic_text.svg
│ ├── ic_tools.svg
│ ├── ic_transform.svg
│ └── ic_watercolor.svg
├── build.yaml
├── crowdin.yaml
├── flutter_launcher_icons.yaml
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── IDEWorkspaceChecks.plist
│ │ │ └── WorkspaceSettings.xcsettings
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── WorkspaceSettings.xcsettings
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── Runner-Bridging-Header.h
├── lib
├── app.dart
├── core
│ ├── commands
│ │ ├── command_factory
│ │ │ ├── command_factory.dart
│ │ │ ├── command_factory_provider.dart
│ │ │ └── command_factory_provider.g.dart
│ │ ├── command_implementation
│ │ │ ├── command.dart
│ │ │ └── graphic
│ │ │ │ ├── draw_path_command.g.dart
│ │ │ │ ├── graphic_command.dart
│ │ │ │ ├── line_command.dart
│ │ │ │ ├── line_command.g.dart
│ │ │ │ ├── path_command.dart
│ │ │ │ ├── path_command.g.dart
│ │ │ │ ├── shape
│ │ │ │ ├── circle_shape_command.dart
│ │ │ │ ├── circle_shape_command.g.dart
│ │ │ │ ├── shape_command.dart
│ │ │ │ ├── square_shape_command.dart
│ │ │ │ └── square_shape_command.g.dart
│ │ │ │ ├── spray_command.dart
│ │ │ │ └── spray_command.g.dart
│ │ ├── command_manager
│ │ │ ├── command_manager.dart
│ │ │ ├── command_manager_provider.dart
│ │ │ └── command_manager_provider.g.dart
│ │ ├── command_painter.dart
│ │ ├── graphic_factory
│ │ │ ├── graphic_factory.dart
│ │ │ ├── graphic_factory_provider.dart
│ │ │ └── graphic_factory_provider.g.dart
│ │ └── path_with_action_history.dart
│ ├── database
│ │ ├── project_dao.dart
│ │ ├── project_database.dart
│ │ └── project_database.g.dart
│ ├── enums
│ │ ├── bounding_box_corners.dart
│ │ ├── image_format.dart
│ │ ├── image_location.dart
│ │ ├── shape_type.dart
│ │ └── tool_types.dart
│ ├── extensions
│ │ ├── offset_extension.dart
│ │ └── path_extension.dart
│ ├── json_serialization
│ │ ├── converter
│ │ │ ├── offset_converter.dart
│ │ │ ├── paint_converter.dart
│ │ │ ├── path_action_converter.dart
│ │ │ └── path_with_action_history_converter.dart
│ │ └── versioning
│ │ │ ├── serializer_version.dart
│ │ │ └── version_strategy.dart
│ ├── localization
│ │ ├── app_localizations.dart
│ │ └── app_localizations_en.dart
│ ├── models
│ │ ├── catrobat_image.dart
│ │ ├── catrobat_image.g.dart
│ │ ├── database
│ │ │ └── project.dart
│ │ ├── image_from_file.dart
│ │ ├── image_meta_data.dart
│ │ ├── image_with_pixel_info.dart
│ │ └── loggable_mixin.dart
│ ├── providers
│ │ ├── object
│ │ │ ├── canvas_painter_provider.dart
│ │ │ ├── canvas_painter_provider.g.dart
│ │ │ ├── device_service.dart
│ │ │ ├── file_service.dart
│ │ │ ├── image_service.dart
│ │ │ ├── io_handler.dart
│ │ │ ├── load_image_from_file_manager.dart
│ │ │ ├── load_image_from_photo_library.dart
│ │ │ ├── permission_service.dart
│ │ │ ├── photo_library_service.dart
│ │ │ ├── render_image_for_export.dart
│ │ │ ├── save_as_catrobat_image.dart
│ │ │ ├── save_as_raster_image.dart
│ │ │ ├── shapes_tool_options_state_provider.dart
│ │ │ ├── shapes_tool_options_state_provider.g.dart
│ │ │ └── tools
│ │ │ │ ├── brush_tool_provider.dart
│ │ │ │ ├── brush_tool_provider.g.dart
│ │ │ │ ├── eraser_tool_provider.dart
│ │ │ │ ├── eraser_tool_provider.g.dart
│ │ │ │ ├── hand_tool_provider.dart
│ │ │ │ ├── hand_tool_provider.g.dart
│ │ │ │ ├── line_tool_provider.dart
│ │ │ │ ├── line_tool_provider.g.dart
│ │ │ │ ├── shapes_tool_provider.dart
│ │ │ │ └── shapes_tool_provider.g.dart
│ │ └── state
│ │ │ ├── app_bar_provider.dart
│ │ │ ├── app_bar_provider.g.dart
│ │ │ ├── canvas_state_data.dart
│ │ │ ├── canvas_state_data.freezed.dart
│ │ │ ├── canvas_state_provider.dart
│ │ │ ├── canvas_state_provider.g.dart
│ │ │ ├── paint_provider.dart
│ │ │ ├── paint_provider.g.dart
│ │ │ ├── shapes_tool_options_state_data.dart
│ │ │ ├── shapes_tool_options_state_data.freezed.dart
│ │ │ ├── spray_tool_provider.dart
│ │ │ ├── spray_tool_provider.g.dart
│ │ │ ├── tool_options_visibility_state_provider.dart
│ │ │ ├── tool_options_visibility_state_provider.g.dart
│ │ │ ├── toolbox_state_data.dart
│ │ │ ├── toolbox_state_data.freezed.dart
│ │ │ ├── toolbox_state_provider.dart
│ │ │ ├── toolbox_state_provider.g.dart
│ │ │ ├── workspace_state.dart
│ │ │ ├── workspace_state.freezed.dart
│ │ │ ├── workspace_state_notifier.dart
│ │ │ └── workspace_state_notifier.g.dart
│ ├── tools
│ │ ├── implementation
│ │ │ ├── brush_tool.dart
│ │ │ ├── eraser_tool.dart
│ │ │ ├── hand_tool.dart
│ │ │ ├── shapes_tool
│ │ │ │ ├── bounding_box.dart
│ │ │ │ └── shapes_tool.dart
│ │ │ └── spray_tool.dart
│ │ ├── line_tool
│ │ │ ├── line_tool.dart
│ │ │ ├── vertex.dart
│ │ │ └── vertex_stack.dart
│ │ ├── tool.dart
│ │ └── tool_data.dart
│ └── utils
│ │ ├── color_utils.dart
│ │ ├── constants.dart
│ │ ├── date_time_converter.dart
│ │ ├── distance_calculator.dart
│ │ ├── failure.dart
│ │ ├── load_image_failure.dart
│ │ ├── open_url.dart
│ │ ├── save_image_failure.dart
│ │ └── widget_identifier.dart
├── main.dart
└── ui
│ ├── pages
│ ├── landing_page
│ │ ├── components
│ │ │ ├── custom_action_button.dart
│ │ │ ├── image_preview.dart
│ │ │ ├── main_overflow_menu.dart
│ │ │ ├── project_list_tile.dart
│ │ │ └── project_overflow_menu.dart
│ │ └── landing_page.dart
│ ├── onboarding_page
│ │ ├── components
│ │ │ ├── bottom_nav_bar_container.dart
│ │ │ ├── onboarding_page_app_bar.dart
│ │ │ └── onboarding_page_bottom_nav_bar.dart
│ │ ├── onboarding_page.dart
│ │ └── screens
│ │ │ ├── screen1.dart
│ │ │ ├── screen2.dart
│ │ │ ├── screen3.dart
│ │ │ ├── screen4.dart
│ │ │ └── screen5.dart
│ └── workspace_page
│ │ ├── components
│ │ ├── bottom_bar
│ │ │ ├── bottom_nav_bar.dart
│ │ │ ├── bottom_nav_bar_items.dart
│ │ │ ├── tool_options
│ │ │ │ ├── shapes_tool_options.dart
│ │ │ │ ├── spray_tool_options.dart
│ │ │ │ ├── stroke_tool_options.dart
│ │ │ │ ├── tool_option.dart
│ │ │ │ ├── tool_options.dart
│ │ │ │ └── widgets
│ │ │ │ │ ├── radius_slider.dart
│ │ │ │ │ ├── shapes_tool_shape_type_options.dart
│ │ │ │ │ ├── shapes_tool_transformation_mode_options.dart
│ │ │ │ │ ├── stroke_cap_chips.dart
│ │ │ │ │ └── stroke_width_slider.dart
│ │ │ └── tools
│ │ │ │ ├── tool_button.dart
│ │ │ │ └── tools_bottom_sheet.dart
│ │ ├── drawing_surface
│ │ │ ├── canvas_painter.dart
│ │ │ ├── checkerboard_pattern.dart
│ │ │ ├── drawing_canvas.dart
│ │ │ └── exit_fullscreen_button.dart
│ │ └── top_bar
│ │ │ ├── overflow_menu.dart
│ │ │ └── top_app_bar.dart
│ │ └── workspace_page.dart
│ ├── shared
│ ├── action_button.dart
│ ├── bottom_nav_bar_icon.dart
│ ├── custom_action_chip.dart
│ ├── dialogs
│ │ ├── about_dialog.dart
│ │ ├── delete_project_dialog.dart
│ │ ├── discard_changes_dialog.dart
│ │ ├── generic_dialog.dart
│ │ ├── load_image_dialog.dart
│ │ ├── overwrite_dialog.dart
│ │ ├── project_details_dialog.dart
│ │ ├── rename_project_dialog.dart
│ │ └── save_image_dialog.dart
│ ├── icon_button_with_label.dart
│ ├── icon_svg.dart
│ ├── image_format_info.dart
│ ├── images
│ │ ├── checkerboard.dart
│ │ ├── pocketpaint_intro_landscape.dart
│ │ ├── pocketpaint_intro_portrait.dart
│ │ └── pocketpaint_logo_small.dart
│ ├── loading_overlay.dart
│ ├── pop_menu_button.dart
│ └── text_input_field.dart
│ ├── theme
│ ├── data
│ │ ├── custom_colors.dart
│ │ ├── dark_paintroid_theme_data.dart
│ │ ├── font_size.dart
│ │ ├── light_paintroid_theme_data.dart
│ │ ├── paintroid_theme.dart
│ │ ├── paintroid_theme_data.dart
│ │ └── spacing.dart
│ ├── state
│ │ ├── theme_mode_state_provider.dart
│ │ └── theme_mode_state_provider.g.dart
│ └── theme.dart
│ └── utils
│ ├── toast_utils.dart
│ └── top_bar_action_data.dart
├── packages
└── colorpicker
│ ├── .metadata
│ ├── analysis_options.yaml
│ ├── assets
│ └── img
│ │ └── checkerboard.png
│ ├── lib
│ ├── colorpicker.dart
│ ├── src
│ │ ├── colorpicker.dart
│ │ ├── components
│ │ │ ├── checkerboard_square.dart
│ │ │ ├── color_comparison.dart
│ │ │ ├── color_square.dart
│ │ │ ├── opacity_slider.dart
│ │ │ └── slider_indicator_shape.dart
│ │ ├── constants
│ │ │ └── colors.dart
│ │ └── state
│ │ │ ├── color_picker_state_data.dart
│ │ │ ├── color_picker_state_data.freezed.dart
│ │ │ ├── color_picker_state_provider.dart
│ │ │ └── color_picker_state_provider.g.dart
│ └── utils
│ │ └── assets.dart
│ ├── pubspec.yaml
│ └── test
│ └── unit
│ └── color_state_test.dart
├── pubspec.lock
├── pubspec.yaml
└── test
├── assets
└── images
│ ├── test.jpg
│ ├── test.png
│ └── test1.png
├── integration
├── app_workflow_test.dart
├── brush_tool_test.dart
├── command_manager_test.dart
├── driver
│ └── driver.dart
├── eraser_tool_test.dart
├── line_tool_test.dart
├── shapes_tool_test.dart
└── spray_tool_test.dart
├── unit
├── command
│ ├── command_factory_test.dart
│ ├── draw_path_command_test.dart
│ ├── draw_path_command_test.mocks.dart
│ ├── shape_command_test.dart
│ └── shape_command_test.mocks.dart
├── database
│ └── project_database_test.dart
├── provider
│ ├── file_service_test.dart
│ ├── image_service_test.dart
│ ├── load_image_from_photo_library_test.dart
│ ├── load_image_from_photo_library_test.mocks.dart
│ ├── paint_provider_test.dart
│ ├── photo_library_service_test.dart
│ ├── photo_library_service_test.mocks.dart
│ ├── save_as_raster_image_test.dart
│ └── save_as_raster_image_test.mocks.dart
├── serialization
│ ├── command
│ │ ├── circle_shape_serializer_test.dart
│ │ ├── line_command_serializer_test.dart
│ │ ├── path_command_serializer_test.dart
│ │ └── rectangle_shape_serializer_test.dart
│ ├── converter
│ │ ├── offset_converter_test.dart
│ │ ├── paint_converter_test.dart
│ │ ├── path_action_converter_test.dart
│ │ └── path_with_action_history_converter_test.dart
│ ├── image
│ │ └── catrobat_image_serializer_test.dart
│ └── utils
│ │ ├── dummy_command_factory.dart
│ │ ├── dummy_paint_factory.dart
│ │ ├── dummy_path_factory.dart
│ │ └── dummy_version_strategy.dart
├── tools
│ ├── bounding_box_test.dart
│ ├── brush_tool_test.dart
│ ├── eraser_tool_test.dart
│ ├── hand_tool_test.dart
│ ├── line_tool_test.dart
│ ├── shapes_tool_test.dart
│ └── spray_tool_test.dart
└── workspace
│ ├── render_image_for_export_test.dart
│ └── render_image_for_export_test.mocks.dart
├── utils
├── bottom_nav_bar_interactions.dart
├── canvas_interactions.dart
├── canvas_positions.dart
├── interactive_viewer_interactions.dart
├── test_utils.dart
├── ui_interaction.dart
└── widget_finder.dart
└── widget
├── landing_page
├── landing_page_test.dart
└── landing_page_test.mocks.dart
├── onboarding_page
└── onboarding_page_test.dart
└── workspace_page
├── bottom_control_navigation_bar_test.dart
├── eraser_tool_test.dart
├── hand_tool_test.dart
├── line_tool_test.dart
├── shapes_tool_test.dart
├── top_bar_test.dart
└── workspace_page_test.dart
/.fvmrc:
--------------------------------------------------------------------------------
1 | {
2 | "flutter": "3.29.2"
3 | }
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | *Please enter a short description of your pull request and add a reference to the Jira ticket.*
2 |
3 | ## New Features and Enhancements
4 | - New Features and Enhancements
5 | ## Refactorings and Bug Fixes
6 | - Refactorings and Bug Fixes
7 |
8 | ## Checklist
9 |
10 | #### Your checklist for this pull request
11 | Please review the [contributing guidelines](https://github.com/Catrobat/Paintroid/blob/develop/README.md) and [wiki pages](https://github.com/Catrobat/Catroid/wiki/) of this repository.
12 |
13 | - [ ] Include the name of the Jira ticket in the PR’s title
14 | - [ ] Add the link to the ticket in Jira in the description of the PR
15 | - [ ] Include a summary of the changes plus the relevant context
16 | - [ ] Choose the proper base branch (*develop*)
17 | - [ ] Confirm that the changes follow the project’s coding guidelines (Wiki)
18 | - [ ] Verify that the changes generate no compiler or linter warnings
19 | - [ ] Perform a self-review of the changes
20 | - [ ] Verify to commit no other files than the intentionally changed ones
21 | - [ ] Include reasonable and readable tests verifying the added or changed behavior
22 | - [ ] Confirm that new and existing tests pass locally
23 | - [ ] Check that the commits’ message style matches the [project’s guideline](https://github.com/Catrobat/Catroid/wiki/Commit-Message-Guidelines)
24 | - [ ] Verify that your changes do not have any conflicts with the base branch
25 | - [ ] After the PR, verify that all CI checks have passed
26 | - [ ] Add new information to the [Wiki](https://github.com/Catrobat/Paintroid-Flutter/wiki)
27 |
28 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: Build, Test and Analyze
2 |
3 | on:
4 | push:
5 | pull_request:
6 | workflow_dispatch:
7 |
8 | jobs:
9 | main:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v4.1.4
13 | - uses: subosito/flutter-action@v2.10.0
14 | with:
15 | flutter-version: "3.29.2"
16 | channel: "stable"
17 | cache-key: "flutter-:os:-:channel:-:version:-:arch:-:hash:"
18 | cache-path: "${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:"
19 | architecture: x64
20 |
21 | - name: Setup
22 | run: make get
23 |
24 | - name: Static Analysis
25 | run: make lint
26 |
27 | - name: Unit Tests
28 | run: make unit
29 |
30 | - name: Widget Tests
31 | run: make widget
32 |
33 | - name: Integration Tests
34 | run: make integration
35 |
36 | - name: Install xmlstarlet
37 | run: sudo apt-get install -y xmlstarlet
38 |
39 | - name: Prepare App Name and Identifier
40 | run: |
41 | chmod +x ./.github/workflows/update_app_identifiers.sh
42 | ./.github/workflows/update_app_identifiers.sh ${{ github.event.number }}
43 |
44 | - name: Build release package
45 | run: |
46 | flutter build apk --release
47 | mv build/app/outputs/flutter-apk/app-release.apk build/app/outputs/flutter-apk/flutter-paint-${{ github.event.number }}.apk
48 |
49 | - name: Archive build artifacts
50 | uses: actions/upload-artifact@v4.3.3
51 | with:
52 | name: flutter-paint-apk-${{ github.event.number }}
53 | path: |
54 | build/app/outputs/flutter-apk/flutter-paint-${{ github.event.number }}.apk
55 |
--------------------------------------------------------------------------------
/.github/workflows/sync_with_crowdin.yml:
--------------------------------------------------------------------------------
1 | name: Synchronize Crowdin Translations
2 |
3 | on:
4 | schedule:
5 | - cron: '0 0 * * *'
6 | workflow_dispatch:
7 |
8 | jobs:
9 | sync-with-crowdin:
10 | name: Synchronize Crowdin Translations
11 | runs-on: ubuntu-latest
12 | steps:
13 | - uses: actions/checkout@v3
14 | - uses: crowdin/github-action@1.4.11
15 | with:
16 | upload_sources: true
17 | upload_translations: false
18 | download_translations: true
19 | config: 'crowdin.yaml'
20 | env:
21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22 | CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
23 | CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .build/
9 | .buildlog/
10 | .history
11 | .svn/
12 | .swiftpm/
13 | migrate_working_dir/
14 |
15 | # IntelliJ related
16 | *.iml
17 | *.ipr
18 | *.iws
19 | .idea/
20 |
21 | # VSCode related
22 | .vscode/
23 |
24 | # Flutter/Dart/Pub related
25 | **/doc/api/
26 | **/ios/Flutter/.last_build_id
27 | .dart_tool/
28 | .flutter-plugins
29 | .flutter-plugins-dependencies
30 | .packages
31 | .pub-cache/
32 | .pub/
33 | /build/
34 | coverage
35 |
36 | # Commented out to push generated code:
37 | # *.mocks.dart
38 | # *.pb*.dart
39 | # *.g.dart
40 | # *.freezed.dart
41 |
42 | # Web related
43 | lib/generated_plugin_registrant.dart
44 |
45 | # Symbolication related
46 | app.*.symbols
47 |
48 | # Obfuscation related
49 | app.*.map.json
50 |
51 | # Android Studio will place build artifacts here
52 | /android/app/debug
53 | /android/app/profile
54 | /android/app/release
55 |
56 | # Melos
57 | pubspec_overrides.yaml
58 |
59 | # Packages
60 | packages/*/pubspec.lock
61 | packages/*/build
62 |
63 | packages/features/*/pubspec.lock
64 | packages/features/*/build
65 |
66 | # FVM Version Cache
67 | .fvm/
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled.
5 |
6 | version:
7 | revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
8 | channel: stable
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
17 | base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
18 | - platform: android
19 | create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
20 | base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
21 | - platform: ios
22 | create_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
23 | base_revision: ee4e09cce01d6f2d7f4baebd247fde02e5008851
24 |
25 | # User provided section
26 |
27 | # List of Local paths (relative to this file) that should be
28 | # ignored by the migrate tool.
29 | #
30 | # Files that are not part of the templates will be ignored by default.
31 | unmanaged_files:
32 | - 'lib/main.dart'
33 | - 'ios/Runner.xcodeproj/project.pbxproj'
34 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:flutter_lints/flutter.yaml
2 | linter:
3 | rules:
4 | always_use_package_imports: true
5 | avoid_relative_lib_imports: true
6 | prefer_relative_imports: false
7 | prefer_single_quotes: true
8 | avoid_void_async: true
9 | constant_identifier_names: false
10 |
11 | analyzer:
12 | errors:
13 | missing_enum_constant_in_switch: error
14 | exhaustive_cases: error
15 | unused_element: error
16 | type_annotate_public_apis: error
17 | missing_required_param: error
18 | invalid_use_of_protected_member: error
19 | unused_import: error
20 |
21 | exclude:
22 | - lib/src/**.pb*.dart
23 | - lib/**.g.dart
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 | .cxx/
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id "com.android.application"
3 | id "kotlin-android"
4 | id "dev.flutter.flutter-gradle-plugin"
5 | }
6 |
7 | def localProperties = new Properties()
8 | def localPropertiesFile = rootProject.file('local.properties')
9 | if (localPropertiesFile.exists()) {
10 | localPropertiesFile.withReader('UTF-8') { reader ->
11 | localProperties.load(reader)
12 | }
13 | }
14 |
15 | android {
16 | namespace = "org.catrobat.paintroid"
17 | compileSdkVersion 35
18 | ndkVersion flutter.ndkVersion
19 |
20 | compileOptions {
21 | sourceCompatibility JavaVersion.VERSION_1_8
22 | targetCompatibility JavaVersion.VERSION_1_8
23 | }
24 |
25 | kotlinOptions {
26 | jvmTarget = '1.8'
27 | }
28 |
29 | sourceSets {
30 | main.java.srcDirs += 'src/main/kotlin'
31 | }
32 |
33 | defaultConfig {
34 | applicationId "org.catrobat.paintroidflutter"
35 | minSdkVersion 24
36 | targetSdkVersion 35
37 | versionCode 1
38 | versionName "1.0.0"
39 | }
40 |
41 | buildTypes {
42 | release {
43 | signingConfig signingConfigs.debug
44 | minifyEnabled true
45 | }
46 | }
47 | }
48 |
49 | flutter {
50 | source '../..'
51 | }
52 |
53 | dependencies {
54 | implementation "androidx.window:window:1.0.0"
55 | }
56 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #bff8fb
4 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | allprojects {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | }
6 | }
7 |
8 | rootProject.buildDir = '../build'
9 | subprojects {
10 | project.buildDir = "${rootProject.buildDir}/${project.name}"
11 | }
12 | subprojects {
13 | project.evaluationDependsOn(':app')
14 | }
15 |
16 | tasks.register("clean", Delete) {
17 | delete rootProject.buildDir
18 | }
19 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | def flutterSdkPath = {
3 | def properties = new Properties()
4 | file("local.properties").withInputStream { properties.load(it) }
5 | def flutterSdkPath = properties.getProperty("flutter.sdk")
6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
7 | return flutterSdkPath
8 | }()
9 |
10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
11 |
12 | repositories {
13 | google()
14 | mavenCentral()
15 | gradlePluginPortal()
16 | }
17 | }
18 |
19 | plugins {
20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0"
21 | id "com.android.application" version "8.1.0" apply false
22 | id "org.jetbrains.kotlin.android" version "1.8.21" apply false
23 | }
24 |
25 | include ":app"
--------------------------------------------------------------------------------
/assets/icon/1.5x/pocketpaint_intro_landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/1.5x/pocketpaint_intro_landscape.png
--------------------------------------------------------------------------------
/assets/icon/1.5x/pocketpaint_intro_portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/1.5x/pocketpaint_intro_portrait.png
--------------------------------------------------------------------------------
/assets/icon/1.5x/pocketpaint_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/1.5x/pocketpaint_logo_small.png
--------------------------------------------------------------------------------
/assets/icon/2.0x/pocketpaint_intro_landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/2.0x/pocketpaint_intro_landscape.png
--------------------------------------------------------------------------------
/assets/icon/2.0x/pocketpaint_intro_portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/2.0x/pocketpaint_intro_portrait.png
--------------------------------------------------------------------------------
/assets/icon/2.0x/pocketpaint_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/2.0x/pocketpaint_logo_small.png
--------------------------------------------------------------------------------
/assets/icon/3.0x/pocketpaint_intro_landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/3.0x/pocketpaint_intro_landscape.png
--------------------------------------------------------------------------------
/assets/icon/3.0x/pocketpaint_intro_portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/3.0x/pocketpaint_intro_portrait.png
--------------------------------------------------------------------------------
/assets/icon/3.0x/pocketpaint_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/3.0x/pocketpaint_logo_small.png
--------------------------------------------------------------------------------
/assets/icon/app_icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/app_icon.png
--------------------------------------------------------------------------------
/assets/icon/app_icon_foreground.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/icon/app_icon_foreground.png
--------------------------------------------------------------------------------
/assets/img/checkerboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/img/checkerboard.png
--------------------------------------------------------------------------------
/assets/img/pocketpaint_intro_landscape.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/img/pocketpaint_intro_landscape.png
--------------------------------------------------------------------------------
/assets/img/pocketpaint_intro_portrait.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/img/pocketpaint_intro_portrait.png
--------------------------------------------------------------------------------
/assets/img/pocketpaint_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/assets/img/pocketpaint_logo_small.png
--------------------------------------------------------------------------------
/assets/lang/app_translations_en.arb:
--------------------------------------------------------------------------------
1 | {
2 | "@@locale": "en",
3 | "fullscreen": "Fullscreen",
4 | "saveImage": "Save image",
5 | "loadImage": "Load image",
6 | "newImage": "New image",
7 | "saveProject": "Save project",
8 | "tools": "Tools",
9 | "brush": "Brush",
10 | "color": "Color",
11 | "layers": "Layers"
12 | }
--------------------------------------------------------------------------------
/assets/svg/ic_brush.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_clipboard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/ic_clipping.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/svg/ic_cursor.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/assets/svg/ic_edit_circle.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/ic_eraser.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_fill.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_hand.svg:
--------------------------------------------------------------------------------
1 |
7 |
8 |
--------------------------------------------------------------------------------
/assets/svg/ic_import.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_layers.svg:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/assets/svg/ic_line.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_pipette.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/svg/ic_shapes.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/assets/svg/ic_smudge.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/svg/ic_spray_can.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/assets/svg/ic_stamp.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/svg/ic_text.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/svg/ic_tools.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/ic_transform.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/build.yaml:
--------------------------------------------------------------------------------
1 | targets:
2 | $default:
3 | builders:
4 | riverpod_generator:
5 | options:
6 | # Could be changed to "my", such that riverpod_generator
7 | # would generate "myCountProvider" instead of "countProvider"
8 | provider_name_prefix: "" # (default)
9 | # Similar to provider_name_prefix, this is an option for renaming
10 | # providers with parameters ("families").
11 | # This takes precedence over provider_name_prefix.
12 | provider_family_name_prefix: "" # (default)
13 | # Could be changed to "Pod", such that riverpod_generator
14 | # would generate "countPod" instead of "countProvider"
15 | provider_name_suffix: "" # (default)
16 | # Similar to provider_name_suffix, this is an option for renaming
17 | # providers with parameters ("families").
18 | # This takes precedence over provider_name_suffix.
19 | provider_family_name_suffix: "" # (default)
--------------------------------------------------------------------------------
/crowdin.yaml:
--------------------------------------------------------------------------------
1 | "project_id_env": "CROWDIN_PROJECT_ID"
2 | "api_token_env": "CROWDIN_PERSONAL_TOKEN"
3 | "base_path": "."
4 | "base_url": "https://api.crowdin.com"
5 |
6 | "preserve_hierarchy": true
7 |
8 | files: [
9 | {
10 | "source": "/assets/l10n/en.arb",
11 | "translation": "/assets/l10n/%locale%.arb",
12 | "dest": "/paintroid-flutter/en.arb",
13 | "type": "arb",
14 | "update_option": "update_as_unapproved",
15 | "translate_attributes": 0,
16 | }
17 | ]
--------------------------------------------------------------------------------
/flutter_launcher_icons.yaml:
--------------------------------------------------------------------------------
1 | flutter_icons:
2 | image_path: "assets/icon/app_icon.png"
3 | android: true
4 | ios: true
5 | adaptive_icon_foreground: "assets/icon/app_icon_foreground.png"
6 | adaptive_icon_background: "#bff8fb"
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | **/dgph
2 | *.mode1v3
3 | *.mode2v3
4 | *.moved-aside
5 | *.pbxuser
6 | *.perspectivev3
7 | **/*sync/
8 | .sconsign.dblite
9 | .tags*
10 | **/.vagrant/
11 | **/DerivedData/
12 | Icon?
13 | **/Pods/
14 | **/.symlinks/
15 | profile
16 | xcuserdata
17 | **/.generated/
18 | Flutter/App.framework
19 | Flutter/Flutter.framework
20 | Flutter/Flutter.podspec
21 | Flutter/Generated.xcconfig
22 | Flutter/ephemeral/
23 | Flutter/app.flx
24 | Flutter/app.zip
25 | Flutter/flutter_assets/
26 | Flutter/flutter_export_environment.sh
27 | ServiceDefinitions.json
28 | Runner/GeneratedPluginRegistrant.*
29 |
30 | # Exceptions to above rules.
31 | !default.mode1v3
32 | !default.mode2v3
33 | !default.pbxuser
34 | !default.perspectivev3
35 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 12.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment this line to define a global platform for your project
2 | platform :ios, '13.0'
3 |
4 | # CocoaPods analytics sends network stats synchronously affecting flutter build latency.
5 | ENV['COCOAPODS_DISABLE_STATS'] = 'true'
6 |
7 | project 'Runner', {
8 | 'Debug' => :debug,
9 | 'Profile' => :release,
10 | 'Release' => :release,
11 | }
12 |
13 | def flutter_root
14 | generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
15 | unless File.exist?(generated_xcode_build_settings_path)
16 | raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
17 | end
18 |
19 | File.foreach(generated_xcode_build_settings_path) do |line|
20 | matches = line.match(/FLUTTER_ROOT\=(.*)/)
21 | return matches[1].strip if matches
22 | end
23 | raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
24 | end
25 |
26 | require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
27 |
28 | flutter_ios_podfile_setup
29 |
30 | target 'Runner' do
31 | use_frameworks!
32 | use_modular_headers!
33 |
34 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
35 | end
36 |
37 | post_install do |installer|
38 | installer.pods_project.targets.each do |target|
39 | flutter_additional_ios_build_settings(target)
40 |
41 | # https://pub.dev/packages/permission_handler
42 | target.build_configurations.each do |config|
43 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
44 |
45 | config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
46 | '$(inherited)',
47 | 'PERMISSION_PHOTOS=1',
48 | 'PERMISSION_PHOTOS_ADD_ONLY=1'
49 | ]
50 | end
51 | end
52 | end
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Catrobat/Paintroid-Flutter/135cf28db1ad631b7bdf93984e47d31480dab1ed/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/lib/core/commands/command_factory/command_factory.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:paintroid/core/commands/command_implementation/graphic/line_command.dart';
4 | import 'package:paintroid/core/commands/command_implementation/graphic/path_command.dart';
5 | import 'package:paintroid/core/commands/command_implementation/graphic/shape/circle_shape_command.dart';
6 | import 'package:paintroid/core/commands/command_implementation/graphic/shape/square_shape_command.dart';
7 | import 'package:paintroid/core/commands/command_implementation/graphic/spray_command.dart';
8 | import 'package:paintroid/core/commands/path_with_action_history.dart';
9 |
10 | class CommandFactory {
11 | const CommandFactory();
12 |
13 | PathCommand createPathCommand(
14 | PathWithActionHistory path,
15 | Paint paint,
16 | ) =>
17 | PathCommand(path, paint);
18 |
19 | LineCommand createLineCommand(
20 | PathWithActionHistory path,
21 | Paint paint,
22 | Offset startPoint,
23 | Offset endPoint,
24 | ) =>
25 | LineCommand(path, paint, startPoint, endPoint);
26 |
27 | SquareShapeCommand createSquareShapeCommand(
28 | Paint paint,
29 | Offset topLeft,
30 | Offset topRight,
31 | Offset bottomLeft,
32 | Offset bottomRight,
33 | ) =>
34 | SquareShapeCommand(paint, topLeft, topRight, bottomLeft, bottomRight);
35 |
36 | CircleShapeCommand createCircleShapeCommand(
37 | Paint paint,
38 | double radius,
39 | Offset center,
40 | ) =>
41 | CircleShapeCommand(paint, radius, center);
42 |
43 | SprayCommand createSprayCommand(List points, Paint paint) {
44 | return SprayCommand(points, paint);
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/lib/core/commands/command_factory/command_factory_provider.dart:
--------------------------------------------------------------------------------
1 | import 'package:paintroid/core/commands/command_factory/command_factory.dart';
2 | import 'package:riverpod_annotation/riverpod_annotation.dart';
3 |
4 | part 'command_factory_provider.g.dart';
5 |
6 | @Riverpod(keepAlive: true)
7 | class CommandFactoryProvider extends _$CommandFactoryProvider {
8 | @override
9 | CommandFactory build() {
10 | return const CommandFactory();
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/lib/core/commands/command_factory/command_factory_provider.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'command_factory_provider.dart';
4 |
5 | // **************************************************************************
6 | // RiverpodGenerator
7 | // **************************************************************************
8 |
9 | String _$commandFactoryProviderHash() =>
10 | r'03be76e2b66c068d6868cd1482f29ff39591a6f0';
11 |
12 | /// See also [CommandFactoryProvider].
13 | @ProviderFor(CommandFactoryProvider)
14 | final commandFactoryProvider =
15 | NotifierProvider.internal(
16 | CommandFactoryProvider.new,
17 | name: r'commandFactoryProvider',
18 | debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
19 | ? null
20 | : _$commandFactoryProviderHash,
21 | dependencies: null,
22 | allTransitiveDependencies: null,
23 | );
24 |
25 | typedef _$CommandFactoryProvider = Notifier;
26 | // ignore_for_file: type=lint
27 | // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
28 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/command.dart:
--------------------------------------------------------------------------------
1 | import 'package:equatable/equatable.dart';
2 | import 'package:paintroid/core/commands/command_implementation/graphic/line_command.dart';
3 | import 'package:paintroid/core/commands/command_implementation/graphic/path_command.dart';
4 | import 'package:paintroid/core/commands/command_implementation/graphic/shape/circle_shape_command.dart';
5 | import 'package:paintroid/core/commands/command_implementation/graphic/shape/square_shape_command.dart';
6 | import 'package:paintroid/core/json_serialization/versioning/serializer_version.dart';
7 |
8 | abstract class Command with EquatableMixin {
9 | const Command();
10 |
11 | Map toJson();
12 |
13 | factory Command.fromJson(Map json) {
14 | String type = json['type'] as String;
15 | switch (type) {
16 | case SerializerType.PATH_COMMAND:
17 | return PathCommand.fromJson(json);
18 | case SerializerType.LINE_COMMAND:
19 | return LineCommand.fromJson(json);
20 | case SerializerType.SQUARE_SHAPE_COMMAND:
21 | return SquareShapeCommand.fromJson(json);
22 | case SerializerType.CIRCLE_SHAPE_COMMAND:
23 | return CircleShapeCommand.fromJson(json);
24 | default:
25 | return PathCommand.fromJson(json);
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/draw_path_command.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'path_command.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | PathCommand _$PathCommandFromJson(Map json) => PathCommand(
10 | const PathWithActionHistoryConverter()
11 | .fromJson(json['path'] as Map),
12 | const PaintConverter().fromJson(json['paint'] as Map),
13 | type: json['type'] as String? ?? SerializerType.PATH_COMMAND,
14 | version: (json['version'] as num?)?.toInt(),
15 | );
16 |
17 | Map _$PathCommandToJson(PathCommand instance) =>
18 | {
19 | 'paint': const PaintConverter().toJson(instance.paint),
20 | 'type': instance.type,
21 | 'version': instance.version,
22 | 'path': const PathWithActionHistoryConverter().toJson(instance.path),
23 | };
24 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/graphic_command.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | import 'package:paintroid/core/commands/command_implementation/command.dart';
4 | import 'package:paintroid/core/json_serialization/converter/paint_converter.dart';
5 |
6 | abstract class GraphicCommand extends Command {
7 | const GraphicCommand(this.paint);
8 |
9 | @PaintConverter()
10 | final Paint paint;
11 |
12 | void call(Canvas canvas);
13 | }
14 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/line_command.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'line_command.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | LineCommand _$LineCommandFromJson(Map json) => LineCommand(
10 | const PathWithActionHistoryConverter()
11 | .fromJson(json['path'] as Map),
12 | const PaintConverter().fromJson(json['paint'] as Map),
13 | const OffsetConverter()
14 | .fromJson(json['startPoint'] as Map),
15 | const OffsetConverter()
16 | .fromJson(json['endPoint'] as Map),
17 | type: json['type'] as String? ?? SerializerType.LINE_COMMAND,
18 | version: (json['version'] as num?)?.toInt(),
19 | )..isSourcePath = json['isSourcePath'] as bool;
20 |
21 | Map _$LineCommandToJson(LineCommand instance) =>
22 | {
23 | 'paint': const PaintConverter().toJson(instance.paint),
24 | 'type': instance.type,
25 | 'version': instance.version,
26 | 'isSourcePath': instance.isSourcePath,
27 | 'path': const PathWithActionHistoryConverter().toJson(instance.path),
28 | 'startPoint': const OffsetConverter().toJson(instance.startPoint),
29 | 'endPoint': const OffsetConverter().toJson(instance.endPoint),
30 | };
31 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/path_command.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'path_command.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | PathCommand _$PathCommandFromJson(Map json) => PathCommand(
10 | const PathWithActionHistoryConverter()
11 | .fromJson(json['path'] as Map),
12 | const PaintConverter().fromJson(json['paint'] as Map),
13 | type: json['type'] as String? ?? SerializerType.PATH_COMMAND,
14 | version: (json['version'] as num?)?.toInt(),
15 | );
16 |
17 | Map _$PathCommandToJson(PathCommand instance) =>
18 | {
19 | 'paint': const PaintConverter().toJson(instance.paint),
20 | 'type': instance.type,
21 | 'version': instance.version,
22 | 'path': const PathWithActionHistoryConverter().toJson(instance.path),
23 | };
24 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/shape/circle_shape_command.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'circle_shape_command.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | CircleShapeCommand _$CircleShapeCommandFromJson(Map json) =>
10 | CircleShapeCommand(
11 | const PaintConverter().fromJson(json['paint'] as Map),
12 | (json['radius'] as num).toDouble(),
13 | const OffsetConverter().fromJson(json['center'] as Map),
14 | version: (json['version'] as num?)?.toInt(),
15 | type: json['type'] as String? ?? SerializerType.CIRCLE_SHAPE_COMMAND,
16 | );
17 |
18 | Map _$CircleShapeCommandToJson(CircleShapeCommand instance) =>
19 | {
20 | 'paint': const PaintConverter().toJson(instance.paint),
21 | 'radius': instance.radius,
22 | 'center': const OffsetConverter().toJson(instance.center),
23 | 'version': instance.version,
24 | 'type': instance.type,
25 | };
26 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/shape/shape_command.dart:
--------------------------------------------------------------------------------
1 | import 'package:paintroid/core/commands/command_implementation/graphic/graphic_command.dart';
2 |
3 | abstract class ShapeCommand extends GraphicCommand {
4 | ShapeCommand(super.paint);
5 | }
6 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/shape/square_shape_command.g.dart:
--------------------------------------------------------------------------------
1 | // GENERATED CODE - DO NOT MODIFY BY HAND
2 |
3 | part of 'square_shape_command.dart';
4 |
5 | // **************************************************************************
6 | // JsonSerializableGenerator
7 | // **************************************************************************
8 |
9 | SquareShapeCommand _$SquareShapeCommandFromJson(Map json) =>
10 | SquareShapeCommand(
11 | const PaintConverter().fromJson(json['paint'] as Map),
12 | const OffsetConverter().fromJson(json['topLeft'] as Map),
13 | const OffsetConverter()
14 | .fromJson(json['topRight'] as Map),
15 | const OffsetConverter()
16 | .fromJson(json['bottomLeft'] as Map),
17 | const OffsetConverter()
18 | .fromJson(json['bottomRight'] as Map),
19 | version: (json['version'] as num?)?.toInt(),
20 | type: json['type'] as String? ?? SerializerType.SQUARE_SHAPE_COMMAND,
21 | );
22 |
23 | Map _$SquareShapeCommandToJson(SquareShapeCommand instance) =>
24 | {
25 | 'paint': const PaintConverter().toJson(instance.paint),
26 | 'topLeft': const OffsetConverter().toJson(instance.topLeft),
27 | 'topRight': const OffsetConverter().toJson(instance.topRight),
28 | 'bottomLeft': const OffsetConverter().toJson(instance.bottomLeft),
29 | 'bottomRight': const OffsetConverter().toJson(instance.bottomRight),
30 | 'version': instance.version,
31 | 'type': instance.type,
32 | };
33 |
--------------------------------------------------------------------------------
/lib/core/commands/command_implementation/graphic/spray_command.dart:
--------------------------------------------------------------------------------
1 | // ignore_for_file: must_be_immutable
2 |
3 | import 'dart:ui';
4 |
5 | import 'package:freezed_annotation/freezed_annotation.dart';
6 | import 'package:paintroid/core/commands/command_implementation/graphic/graphic_command.dart';
7 | import 'package:paintroid/core/json_serialization/converter/offset_converter.dart';
8 | import 'package:paintroid/core/json_serialization/converter/paint_converter.dart';
9 | import 'package:paintroid/core/json_serialization/versioning/serializer_version.dart';
10 | import 'package:paintroid/core/json_serialization/versioning/version_strategy.dart';
11 |
12 | part 'spray_command.g.dart';
13 |
14 | @JsonSerializable()
15 | class SprayCommand extends GraphicCommand {
16 | final String type;
17 | final int version;
18 |
19 | @OffsetConverter()
20 | List points;
21 |
22 | SprayCommand(
23 | this.points,
24 | super.paint, {
25 | this.type = SerializerType.SPRAY_COMMAND,
26 | int? version,
27 | }) : version =
28 | version ?? VersionStrategyManager.strategy.getSprayCommandVersion();
29 |
30 | @override
31 | void call(Canvas canvas) {
32 | canvas.drawPoints(PointMode.points, points, paint);
33 | }
34 |
35 | @override
36 | List