├── .editorconfig
├── .github
├── ISSUE_TEMPLATE
│ └── bug_report.md
└── workflows
│ └── build.yml
├── .gitignore
├── .metadata
├── .vscode
└── extensions.json
├── CHANGELOG.md
├── CHANGELOG_JP.md
├── LICENSE
├── README.md
├── README_JP.md
├── analysis_options.yaml
├── android
├── .gitignore
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── tiny_vcc
│ │ │ │ └── MainActivity.kt
│ │ └── res
│ │ │ ├── drawable-v21
│ │ │ └── launch_background.xml
│ │ │ ├── drawable
│ │ │ └── launch_background.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
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── assets
├── images
│ ├── app_icon-1024x1024.png
│ └── app_icon_mac-1024x1024.png
└── texts
│ └── LICENSE_NOTICE
├── installer
└── TinyVccInstaller
│ ├── .gitignore
│ ├── TinyVccInstaller.sln
│ └── TinyVccInstaller
│ ├── TinyVccInstaller.vdproj
│ └── files.txt
├── ios
├── .gitignore
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Podfile
├── 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
├── caches
│ └── simple_cache.dart
├── data
│ ├── exceptions.dart
│ ├── tiny_vcc_data.dart
│ └── vcc_data.dart
├── globals.dart
├── i18n
│ ├── strings.g.dart
│ ├── strings.i18n.json
│ ├── strings_ja.i18n.json
│ ├── strings_ko.i18n.json
│ └── strings_zh-CN.i18n.json
├── main.dart
├── main_drawer.dart
├── providers.dart
├── repos
│ ├── requirements_repository.dart
│ ├── tiny_vcc_settings_repository.dart
│ ├── vcc_projects_repository.dart
│ ├── vcc_settings_repository.dart
│ ├── vcc_templates_repository.dart
│ └── vpm_packages_repository.dart
├── routes
│ ├── legacy_project_route.dart
│ ├── main_route.dart
│ ├── new_project_route.dart
│ ├── project_route.dart
│ └── requirements_route.dart
├── services
│ ├── dotnet_service.dart
│ ├── tiny_vcc_service.dart
│ ├── unity_hub_service.dart
│ ├── updater_service.dart
│ └── vcc_service.dart
├── utils.dart
├── utils
│ ├── file_output.dart
│ ├── layout_util.dart
│ ├── platform_feature.dart
│ └── system_info.dart
└── widgets
│ ├── console_dialog.dart
│ ├── copyable_text.dart
│ ├── m3_speed_dial.dart
│ ├── navigation_scaffold.dart
│ ├── new_project_dialog.dart
│ ├── new_project_form.dart
│ ├── package_list_item.dart
│ ├── projects_page.dart
│ └── settings_page.dart
├── linux
├── .gitignore
├── CMakeLists.txt
├── flutter
│ ├── CMakeLists.txt
│ ├── generated_plugin_registrant.cc
│ ├── generated_plugin_registrant.h
│ └── generated_plugins.cmake
├── functions.cc
├── functions.h
├── main.cc
├── my_application.cc
└── my_application.h
├── macos
├── .gitignore
├── Flutter
│ ├── Flutter-Debug.xcconfig
│ ├── Flutter-Release.xcconfig
│ └── GeneratedPluginRegistrant.swift
├── Podfile
├── Podfile.lock
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── Runner
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── app_icon_1024.png
│ │ ├── app_icon_128.png
│ │ ├── app_icon_16.png
│ │ ├── app_icon_256.png
│ │ ├── app_icon_32.png
│ │ ├── app_icon_512.png
│ │ └── app_icon_64.png
│ ├── Base.lproj
│ └── MainMenu.xib
│ ├── Configs
│ ├── AppInfo.xcconfig
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── Warnings.xcconfig
│ ├── DebugProfile.entitlements
│ ├── Functions.swift
│ ├── Info.plist
│ ├── MainFlutterWindow.swift
│ └── Release.entitlements
├── pubspec.lock
├── pubspec.yaml
├── scripts
├── bump-version.sh
├── create-dmg.sh
├── generate-releasenote.sh
└── update-product-code.ps1
├── slang.yaml
├── test
├── services
│ └── unity_hub_service_test.dart
├── utils
│ └── system_info_test.dart
├── widget_test.dart
└── widgets
│ └── new_project_form_test.dart
├── web
├── favicon.png
├── icons
│ ├── Icon-192.png
│ ├── Icon-512.png
│ ├── Icon-maskable-192.png
│ └── Icon-maskable-512.png
├── index.html
└── manifest.json
└── windows
├── .gitignore
├── CMakeLists.txt
├── flutter
├── CMakeLists.txt
├── generated_plugin_registrant.cc
├── generated_plugin_registrant.h
└── generated_plugins.cmake
└── runner
├── CMakeLists.txt
├── Runner.rc
├── flutter_window.cpp
├── flutter_window.h
├── functions.cpp
├── functions.h
├── main.cpp
├── resource.h
├── resources
└── app_icon.ico
├── runner.exe.manifest
├── utils.cpp
├── utils.h
├── win32_window.cpp
└── win32_window.h
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [lib/**.json]
4 | indent_style = space
5 | indext_size = 2
6 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS and Version [e.g. Windows 10 22H2]
28 | - Tiny VCC Version
29 | - VPM CLI Version (`vpm --version` in terminal)
30 |
31 | **Additional context**
32 | Add any other context about the problem here.
33 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 |
3 | # Controls when the workflow will run
4 | on:
5 | push:
6 | # pull_request:
7 |
8 | workflow_dispatch:
9 |
10 | jobs:
11 | build-windows:
12 | runs-on: windows-latest
13 | steps:
14 | - uses: actions/checkout@v3
15 | - uses: subosito/flutter-action@v2
16 | with:
17 | flutter-version: '3.7.0'
18 | cache: true
19 | cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:'
20 | cache-path: '${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:'
21 | - run: flutter config --enable-windows-desktop
22 | - run: flutter pub get
23 | - run: flutter pub run slang
24 | - run: flutter build windows
25 | - uses: actions/upload-artifact@v3
26 | with:
27 | name: windows
28 | path: build/windows/runner/Release
29 |
30 | build-msi:
31 | needs: [build-windows]
32 | runs-on: windows-latest
33 | steps:
34 | - uses: actions/checkout@v3
35 | - uses: actions/download-artifact@v3
36 | with:
37 | name: windows
38 | path: build/windows/runner/Release
39 |
40 | - run: ls -n -r .\\build\\windows\\runner\\Release > built-files.txt
41 | - run: diff (type .\\installer\\TinyVccInstaller\\TinyVccInstaller\\files.txt) (type built-files.txt)
42 |
43 | - uses: ilammy/msvc-dev-cmd@v1
44 | - run: devenv .\\installer\\TinyVccInstaller\\TinyVccInstaller.sln /build Release
45 | - uses: actions/upload-artifact@v3
46 | with:
47 | name: msi
48 | path: installer/TinyVccInstaller/TinyVccInstaller/Release
49 |
50 | build-macos:
51 | runs-on: macos-latest
52 | steps:
53 | - uses: actions/checkout@v3
54 | - uses: subosito/flutter-action@v2
55 | with:
56 | flutter-version: '3.7.0'
57 | cache: true
58 | cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:'
59 | cache-path: '${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:'
60 | - run: flutter config --enable-macos-desktop
61 | - run: flutter pub get
62 | - run: flutter pub run slang
63 | - run: flutter test
64 | - run: flutter build macos
65 | - run: brew install create-dmg
66 | - run: ./scripts/create-dmg.sh "build/macos/Build/Products/Release/Tiny VCC.app" TinyVCC.dmg
67 | - uses: actions/upload-artifact@v3
68 | with:
69 | name: macos
70 | path: TinyVCC.dmg
71 |
72 | build-linux:
73 | runs-on: ubuntu-latest
74 | steps:
75 | - uses: actions/checkout@v3
76 | - uses: subosito/flutter-action@v2
77 | with:
78 | flutter-version: '3.7.0'
79 | cache: true
80 | cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:'
81 | cache-path: '${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:'
82 | - run: |
83 | sudo apt-get update -y
84 | sudo apt-get install -y ninja-build libgtk-3-dev
85 | - run: flutter config --enable-linux-desktop
86 | - run: flutter pub get
87 | - run: flutter pub run slang
88 | - run: flutter build linux
89 | - uses: actions/upload-artifact@v3
90 | with:
91 | name: linux
92 | path: build/linux/x64/release/bundle
93 |
94 | test-unity-hub:
95 | runs-on: macos-latest
96 | steps:
97 | - run: uname -a
98 | - run: curl -L https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.dmg -o UnityHubSetup.dmg
99 | - run: hdiutil mount UnityHubSetup.dmg
100 | - run: ls /Volumes
101 | - run: cp -r /Volumes/Unity\ Hub\ */Unity\ Hub.app /Applications/
102 | - run: hdiutil unmount /Volumes/Unity\ Hub\ *
103 | - run: /Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless install --version 2019.4.31f1 -c bd5abf232a62
104 | - run: /Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless editors --installed
105 |
106 | test-unity-hub-m1:
107 | runs-on: macos-latest-xlarge
108 | if: false
109 | steps:
110 | - run: uname -a
111 | - run: curl -L https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.dmg -o UnityHubSetup.dmg
112 | - run: hdiutil mount UnityHubSetup.dmg
113 | - run: ls /Volumes
114 | - run: cp -r /Volumes/Unity\ Hub\ */Unity\ Hub.app /Applications/
115 | - run: hdiutil unmount /Volumes/Unity\ Hub\ *
116 | - run: /Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless install --version 2019.4.31f1 -c bd5abf232a62 --architecture arm64
117 | - run: /Applications/Unity\ Hub.app/Contents/MacOS/Unity\ Hub -- --headless editors --installed
118 |
119 | release:
120 | if: startsWith(github.ref, 'refs/tags/')
121 | needs: [build-msi, build-macos, build-linux]
122 | runs-on: ubuntu-latest
123 | steps:
124 | - uses: actions/checkout@v3
125 |
126 | - uses: actions/download-artifact@v3
127 | with:
128 | name: msi
129 | path: build/windows/runner/Release
130 |
131 | - uses: actions/download-artifact@v3
132 | with:
133 | name: macos
134 |
135 | - uses: actions/download-artifact@v3
136 | with:
137 | name: linux
138 | path: build/linux/x64/release/bundle
139 |
140 | - run: ls
141 |
142 | - name: Create windows release
143 | run: |
144 | NAME=tiny_vcc-${GITHUB_REF#refs/tags/}
145 | mv build/windows/runner/Release ${NAME}
146 | cp LICENSE* ${NAME}/
147 | cp README*.md ${NAME}/
148 | zip -r ${NAME}.zip ${NAME}
149 |
150 | - name: Create macos release
151 | run: mv TinyVCC.dmg TinyVCC-${GITHUB_REF#refs/tags/}.dmg
152 |
153 | - name: Create release note
154 | run: ./scripts/generate-releasenote.sh ${GITHUB_REF#refs/tags/v} | tee ${{ github.workspace }}-release.txt
155 |
156 | - uses: softprops/action-gh-release@v1
157 | with:
158 | draft: true
159 | body_path: ${{ github.workspace }}-release.txt
160 | files: |
161 | *.zip
162 | *.dmg
163 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 | migrate_working_dir/
12 |
13 | # IntelliJ related
14 | *.iml
15 | *.ipr
16 | *.iws
17 | .idea/
18 |
19 | # The .vscode folder contains launch configuration and tasks you configure in
20 | # VS Code which you may wish to be included in version control, so this line
21 | # is commented out by default.
22 | #.vscode/
23 |
24 | # Flutter/Dart/Pub related
25 | **/doc/api/
26 | **/ios/Flutter/.last_build_id
27 | .dart_tool/
28 | .flutter-plugins
29 | .flutter-plugins-dependencies
30 | .packages
31 | .pub-cache/
32 | .pub/
33 | /build/
34 |
35 | # Symbolication related
36 | app.*.symbols
37 |
38 | # Obfuscation related
39 | app.*.map.json
40 |
41 | # Android Studio will place build artifacts here
42 | /android/app/debug
43 | /android/app/profile
44 | /android/app/release
45 |
--------------------------------------------------------------------------------
/.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: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
8 | channel: unknown
9 |
10 | project_type: app
11 |
12 | # Tracks metadata for the flutter migrate command
13 | migration:
14 | platforms:
15 | - platform: root
16 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
17 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
18 | - platform: android
19 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
20 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
21 | - platform: ios
22 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
23 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
24 | - platform: linux
25 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
26 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
27 | - platform: macos
28 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
29 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
30 | - platform: web
31 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
32 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
33 | - platform: windows
34 | create_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
35 | base_revision: b8f7f1f9869bb2d116aa6a70dbeac61000b52849
36 |
37 | # User provided section
38 |
39 | # List of Local paths (relative to this file) that should be
40 | # ignored by the migrate tool.
41 | #
42 | # Files that are not part of the templates will be ignored by default.
43 | unmanaged_files:
44 | - 'lib/main.dart'
45 | - 'ios/Runner.xcodeproj/project.pbxproj'
46 |
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": [
3 | "dart-code.flutter",
4 | "luanpotter.dart-import"
5 | ]
6 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## [0.6.1] - 2023-12-06
9 |
10 | ### Fixed
11 | - Fix packages list may not properly appears.
12 | - Fix repositories not updated to the latest information.
13 |
14 | ## [0.6.0] - 2023-10-18
15 |
16 | ### Removed
17 | - Remove version pinning of VPM CLI installation.
18 |
19 | ### Fixed
20 |
21 | - [macOS] Fix Unity installation not working on Apple Silicon.
22 | - [Windows] Fix architecture detection not working on Windows 11 with AMD CPU.
23 | - Fix Unity path not properly saved even when manually selected.
24 | - Fix Unity version check
25 |
26 | ## [0.5.0] - 2023-10-01
27 |
28 | ### Added
29 |
30 | - Add Korean translation. (by [Kieaer](https://github.com/Kieaer))
31 |
32 | ## [0.4.0] - 2023-03-21
33 |
34 | ### Added
35 |
36 | - Add dark theme.
37 | - Add Japanese translation.
38 | - Add Simplified Chinese translation. (by [Sonic853](https://github.com/Sonic853))
39 |
40 | ### Changed
41 |
42 | - New layout for the main page.
43 |
44 | ## [0.3.0] - 2023-01-09
45 |
46 | ### Added
47 |
48 | - Automate installation of required software.
49 | - [Windows] Added installer, setup.exe.
50 |
51 | ### Changed
52 |
53 | - New layout for required software page.
54 |
55 | ## [0.2.0] - 2023-01-04
56 |
57 | ### Added
58 |
59 | - Add dark mode.
60 | - Add new layouts for wide window size.
61 | - Add menu to move project to the Recycle Bin or Trash.
62 |
63 | ### Changed
64 |
65 | - Change internal state management to improve app responses.
66 |
67 | ### Fixed
68 |
69 | - Fix app couldn't add StarterVPM project.
70 | - Fix app couldn't start when settings.json of VCC is missng.
71 | - [macOS] Fix backup folder select dialog not opended.
72 |
73 | ## [0.1.0] - 2022-12-31
74 |
75 | ### Added
76 |
77 | - Add button to open settings folder in settings page.
78 | - Add requirements page to show required software.
79 | - Add logging feature. Logs are written to following folders.
80 | - Windows: `%USERPROFILE%\AppData\Loaming\kurotu\Tiny VCC\logs`
81 | - macOS: `~/Library/Application Support/com.github.kurotu.tiny-vcc/logs`
82 | - Add button to detect installed Unity Editors.
83 |
84 | ### Changed
85 |
86 | - Reduce times to execute Unity Hub for requirements check.
87 |
88 | ### Fixed
89 |
90 | - Fix app crashed when adding AvatarGit or WorldGit project.
91 | - Fix a case where app may crash even when .NET and VPM CLI are installed.
92 | - Fix last project location not saved when creating a new project.
93 |
94 | ## [0.0.2] - 2022-12-22
95 |
96 | ### Fixed
97 |
98 | - [macOS] Fix installed Unity editors not properly detected.
99 | - Fix text fields of new project screen not properly working.
100 | - Fix update checker not properly initialized.
101 |
102 | ## [0.0.1] - 2022-12-21
103 |
104 | - Initial release.
105 |
--------------------------------------------------------------------------------
/CHANGELOG_JP.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7 |
8 | ## [0.6.1] - 2023-12-06
9 |
10 | ### 修正
11 | - パッケージリストが正しく表示されないことがある問題を修正。
12 | - リポジトリが最新の情報に更新されない問題を修正。
13 |
14 | ## [0.6.0] - 2023-10-18
15 |
16 | ### 削除
17 | - VPM CLI のインストール時のバージョン固定をしないように変更。
18 |
19 | ### 修正
20 |
21 | - [macOS] Apple Silicon で Unity のインストールができない問題を修正。
22 | - [Windows] AMD CPU の Windows 11 でアーキテクチャの検出ができない問題を修正。
23 | - Unity のパスを手動選択しても正しく保存されない問題を修正。
24 | - Unity のバージョンチェックを修正。
25 |
26 | ## [0.5.0] - 2023-10-01
27 |
28 | ### 追加
29 |
30 | - 韓国語表示を追加。 (by [Kieaer](https://github.com/Kieaer))
31 |
32 | ## [0.4.0] - 2023-03-21
33 |
34 | ### 追加
35 |
36 | - ダークテーマを追加。
37 | - 日本語表示を追加。
38 | - 簡体字中国語表示を追加。 (by [Sonic853](https://github.com/Sonic853))
39 |
40 | ### 変更
41 |
42 | - メインページを新しいレイアウトに変更。
43 |
44 | ## [0.3.0] - 2023-01-09
45 |
46 | ### 追加
47 |
48 | - 必須ソフトウェアのインストールを自動化
49 | - [Windows] インストーラー setup.exe を追加。
50 |
51 | ### 変更
52 |
53 | - 必須ソフトウェアページを新しいレイアウトに変更。
54 |
55 | ## [0.2.0] - 2023-01-04
56 |
57 | ### 追加
58 |
59 | - ダークモードを追加。
60 | - ウィンドウの幅が広い場合のレイアウトを追加。
61 | - プロジェクトをごみ箱に移動するメニューを追加。
62 |
63 | ### 変更
64 |
65 | - 内部の状態管理を変更し、アプリの応答を改善。
66 |
67 | ### 修正
68 |
69 | - StarterVPM プロジェクトを追加できない問題を修正。
70 | - VCC の settings.json がない場合に正常に起動しない問題を修正。
71 | - [macOS] バックアップフォルダの選択ダイアログが開かない問題を修正。
72 |
73 | ## [0.1.0] - 2022-12-31
74 |
75 | ### 追加
76 |
77 | - 設定画面に設定フォルダを開くボタンを追加。
78 | - 必要ソフトウェアを表示する画面を追加。
79 | - ログ機能を追加。ログは以下のフォルダに保存されます。
80 | - Windows: `%USERPROFILE%\AppData\Loaming\kurotu\Tiny VCC\logs`
81 | - macOS: `~/Library/Application Support/com.github.kurotu.tiny-vcc/logs`
82 | - インストールされた Unity を検出するボタンを追加。
83 |
84 | ### 変更
85 |
86 | - 必須ソフトウェアのチェックで Unity Hub を実行する回数を減少。
87 |
88 | ### 修正
89 |
90 | - AvatarGit または WorldGit プロジェクトを追加するとアプリがクラッシュする問題を修正。
91 | - .NET や VPM CLI がインストールされていてもアプリがクラッシュすることがある問題を修正。
92 | - プロジェクトを作成するとき最後のプロジェクト保存場所が保存されていない問題を修正。
93 |
94 | ## [0.0.2] - 2022-12-22
95 |
96 | ### 修正
97 |
98 | - [macOS] インストールされた Unity を正しく検出できない問題を修正。
99 | - 新しいプロジェクトを作成する画面でテキスト入力欄が正しく動作しない問題を修正。
100 | - 更新確認が正しく初期化されない問題を修正。
101 |
102 | ## [0.0.1] - 2022-12-21
103 |
104 | - 初版。
105 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > [!CAUTION]
2 | > Archived repository. This project is no longer maintained.
3 | > Consider using [vrc-get-gui](https://github.com/vrc-get/vrc-get) as an alternative.
4 |
5 | # Tiny VCC
6 |
7 |
8 |
9 |
10 |
11 |
12 | Yet Another VRChat Creator Companion for macOS and Windows.
13 |
14 | [ [Download](https://github.com/kurotu/tiny_vcc/releases/latest) ]
15 |
16 | [ English | [日本語](./README_JP.md) ]
17 |
18 | ## Introduction
19 | Tiny VCC is a VCC alternative application for macOS and Windows.
20 | It behaves as a GUI wrapper of VPM CLI and provides these core features of VCC.
21 |
22 | - Project and package management
23 | - Project migration from legacy project
24 | - Back Up Your Projects
25 |
26 | ## Installation
27 |
28 | Other required software will be installed by the app.
29 |
30 | ### Windows
31 | 1. Download `tiny_vcc-vX.X.X.zip` from [the latest release](https://github.com/kurotu/tiny_vcc/releases/latest), then extract it to a desired location.
32 | 2. Execute `setup.exe` in the extracted folder.
33 |
34 | ### macOS
35 | 1. Download `TinyVCC-vX.X.X.dmg` from [the latest release](https://github.com/kurotu/tiny_vcc/releases/latest), then open it.
36 | 2. Drag & drop `Tiny VCC` into `Applications` folder.
37 | 3. Open `Applications` folder, then select *Open* from right-click menu of `Tiny VCC`.
38 |
39 | ## Verified Environments
40 | - Windows 10 21H2
41 | - macOS Big Sur 11.7.2 (Intel)
42 | - VPM CLI 0.1.13
43 |
44 | ## License
45 | Licensed under the [GPLv3](./LICENSE).
46 |
47 | ## Cantacts and Feedback
48 | - VRCID: kurotu
49 | - Twitter: [@kurotu](https://twitter.com/kurotu)
50 | - GitHub: [kurotu/tiny_vcc](https://github.com/kurotu/tiny_vcc)
51 |
--------------------------------------------------------------------------------
/README_JP.md:
--------------------------------------------------------------------------------
1 | > [!CAUTION]
2 | > アーカイブされたリポジトリです。このプロジェクトはメンテナンスされていません。
3 | > 代替として [vrc-get-gui](https://github.com/vrc-get/vrc-get) を検討してください。
4 |
5 | # Tiny VCC
6 |
7 |
8 |
9 |
10 |
11 |
12 | Yet Another VRChat Creator Companion for macOS and Windows.
13 |
14 | [ [ダウンロード](https://github.com/kurotu/tiny_vcc/releases/latest) ]
15 |
16 | [ [English](./README.md) | 日本語 ]
17 |
18 | ## 概要
19 |
20 | macOS/Windows で使用可能な VCC の代替アプリケーションです。
21 | VPM CLI の GUI ラッパーとして動作し、 VCC のコア機能のうち以下の機能を提供します。
22 |
23 | - プロジェクトとパッケージの管理
24 | - レガシープロジェクトから VCC 対応プロジェクトへの移行
25 | - プロジェクトのバックアップ
26 |
27 | ## インストール
28 |
29 | 他の必須ソフトウェアはアプリによってインストールされます。
30 |
31 | ### Windows
32 | 1. [最新のリリース](https://github.com/kurotu/tiny_vcc/releases/latest) から `tiny_vcc-vX.X.X.zip` をダウンロードし、任意の場所に展開します。
33 | 2. 展開したフォルダの中にある `setup.exe` を実行します。
34 |
35 | ### macOS
36 | 1. [最新のリリース](https://github.com/kurotu/tiny_vcc/releases/latest) から `TinyVCC-vX.X.X.dmg` をダウンロードし、開きます。
37 | 2. 表示されたウィンドウにある `Tiny VCC` を `Applications` フォルダにドラッグ&ドロップします。
38 | 3. `Applications` フォルダを開き、 `Tiny VCC` を右クリックして「開く」を選択します。
39 |
40 | ## 動作確認済み環境
41 | - Windows 10 21H2
42 | - macOS Big Sur 11.7.2 (Intel)
43 | - VPM CLI 0.1.13
44 |
45 | ## ライセンス
46 | [GPLv3](./LICENSE) で提供されます。
47 |
48 | ## 連絡先・フィードバック
49 | - VRCID: kurotu
50 | - Twitter: [@kurotu](https://twitter.com/kurotu)
51 | - GitHub: [kurotu/tiny_vcc](https://github.com/kurotu/tiny_vcc)
52 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # This file configures the analyzer, which statically analyzes Dart code to
2 | # check for errors, warnings, and lints.
3 | #
4 | # The issues identified by the analyzer are surfaced in the UI of Dart-enabled
5 | # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
6 | # invoked from the command line by running `flutter analyze`.
7 |
8 | # The following line activates a set of recommended lints for Flutter apps,
9 | # packages, and plugins designed to encourage good coding practices.
10 | include: package:flutter_lints/flutter.yaml
11 |
12 | linter:
13 | # The lint rules applied to this project can be customized in the
14 | # section below to disable rules from the `package:flutter_lints/flutter.yaml`
15 | # included above or to enable additional rules. A list of all available lints
16 | # and their documentation is published at
17 | # https://dart-lang.github.io/linter/lints/index.html.
18 | #
19 | # Instead of disabling a lint rule for the entire project in the
20 | # section below, it can also be suppressed for a single line of code
21 | # or a specific dart file by using the `// ignore: name_of_lint` and
22 | # `// ignore_for_file: name_of_lint` syntax on the line or in the file
23 | # producing the lint.
24 | rules:
25 | # avoid_print: false # Uncomment to disable the `avoid_print` rule
26 | # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
27 |
28 | # Additional information about this file can be found at
29 | # https://dart.dev/guides/language/analysis-options
30 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 | **/*.keystore
13 | **/*.jks
14 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion flutter.compileSdkVersion
30 | ndkVersion flutter.ndkVersion
31 |
32 | compileOptions {
33 | sourceCompatibility JavaVersion.VERSION_1_8
34 | targetCompatibility JavaVersion.VERSION_1_8
35 | }
36 |
37 | kotlinOptions {
38 | jvmTarget = '1.8'
39 | }
40 |
41 | sourceSets {
42 | main.java.srcDirs += 'src/main/kotlin'
43 | }
44 |
45 | defaultConfig {
46 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
47 | applicationId "com.example.tiny_vcc"
48 | // You can update the following values to match your application needs.
49 | // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration.
50 | minSdkVersion flutter.minSdkVersion
51 | targetSdkVersion flutter.targetSdkVersion
52 | versionCode flutterVersionCode.toInteger()
53 | versionName flutterVersionName
54 | }
55 |
56 | buildTypes {
57 | release {
58 | // TODO: Add your own signing config for the release build.
59 | // Signing with the debug keys for now, so `flutter run --release` works.
60 | signingConfig signingConfigs.debug
61 | }
62 | }
63 | }
64 |
65 | flutter {
66 | source '../..'
67 | }
68 |
69 | dependencies {
70 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
71 | }
72 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
15 |
19 |
23 |
24 |
25 |
26 |
27 |
28 |
30 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/example/tiny_vcc/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.example.tiny_vcc
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable-v21/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values-night/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.6.10'
3 | repositories {
4 | google()
5 | mavenCentral()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.1.2'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | mavenCentral()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
6 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/assets/images/app_icon-1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/assets/images/app_icon-1024x1024.png
--------------------------------------------------------------------------------
/assets/images/app_icon_mac-1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/assets/images/app_icon_mac-1024x1024.png
--------------------------------------------------------------------------------
/assets/texts/LICENSE_NOTICE:
--------------------------------------------------------------------------------
1 | This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
2 |
3 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
4 |
5 | You should have received a copy of the GNU General Public License along with this program. If not, see .
--------------------------------------------------------------------------------
/installer/TinyVccInstaller/TinyVccInstaller.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.4.33110.190
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "TinyVccInstaller", "TinyVccInstaller\TinyVccInstaller.vdproj", "{035261A3-215D-41C1-9621-D5DB4AF553E0}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Default = Debug|Default
11 | Release|Default = Release|Default
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {035261A3-215D-41C1-9621-D5DB4AF553E0}.Debug|Default.ActiveCfg = Debug
15 | {035261A3-215D-41C1-9621-D5DB4AF553E0}.Debug|Default.Build.0 = Debug
16 | {035261A3-215D-41C1-9621-D5DB4AF553E0}.Release|Default.ActiveCfg = Release
17 | {035261A3-215D-41C1-9621-D5DB4AF553E0}.Release|Default.Build.0 = Release
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {37D7FE3D-D9B0-4BD1-A0A9-4CAA4643C5D9}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/installer/TinyVccInstaller/TinyVccInstaller/files.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/installer/TinyVccInstaller/TinyVccInstaller/files.txt
--------------------------------------------------------------------------------
/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 | 11.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, '11.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 | end
41 | end
42 |
--------------------------------------------------------------------------------
/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.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
37 |
38 |
39 |
40 |
41 |
42 |
52 |
54 |
60 |
61 |
62 |
63 |
69 |
71 |
77 |
78 |
79 |
80 |
82 |
83 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/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/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/kurotu/tiny_vcc/7d938238d55fb34dfc83a2dc4b4ed3c192a79d4c/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/LaunchScreen.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 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/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/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | Tiny Vcc
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | tiny_vcc
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | $(FLUTTER_BUILD_NAME)
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | $(FLUTTER_BUILD_NUMBER)
25 | LSRequiresIPhoneOS
26 |
27 | UILaunchStoryboardName
28 | LaunchScreen
29 | UIMainStoryboardFile
30 | Main
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 | UIViewControllerBasedStatusBarAppearance
45 |
46 | CADisableMinimumFrameDurationOnPhone
47 |
48 | UIApplicationSupportsIndirectInputEvents
49 |
50 |
51 |
52 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/lib/caches/simple_cache.dart:
--------------------------------------------------------------------------------
1 | class SimpleCache {
2 | T? _data;
3 |
4 | bool get hasCache => _data != null;
5 |
6 | T get() {
7 | return _data!;
8 | }
9 |
10 | void set(T data) {
11 | _data = data;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/data/exceptions.dart:
--------------------------------------------------------------------------------
1 | import '../services/vcc_service.dart';
2 |
3 | class NonZeroExitException implements Exception {
4 | NonZeroExitException(this.executable, this.arguments, this.exitCode);
5 |
6 | final String executable;
7 | final List arguments;
8 | final int exitCode;
9 |
10 | @override
11 | String toString() {
12 | final argStr =
13 | arguments.map((arg) => arg.contains(' ') ? '"$arg"' : arg).join(' ');
14 | final exeStr = executable.contains(' ') ? '"$executable"' : executable;
15 | final command = argStr == '' ? exeStr : '$exeStr $argStr';
16 | return 'NonZeroExitException: $command returned non-zero exit code $exitCode.';
17 | }
18 | }
19 |
20 | class VccProjectTypeException implements Exception {
21 | VccProjectTypeException(message, this.projectType) : _message = message;
22 |
23 | final String _message;
24 | final VccProjectType projectType;
25 |
26 | @override
27 | String toString() {
28 | return 'VccProjectTypeException: $_message';
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/lib/data/tiny_vcc_data.dart:
--------------------------------------------------------------------------------
1 | enum TinyVccThemeMode {
2 | system,
3 | light,
4 | dark,
5 | }
6 |
7 | enum RequirementState { ok, ng, notChecked }
8 |
9 | class TinyVccSettings {
10 | TinyVccSettings({
11 | required this.themeMode,
12 | required this.locale,
13 | });
14 |
15 | TinyVccSettings.defaultValues()
16 | : themeMode = TinyVccThemeMode.system,
17 | locale = 'auto';
18 |
19 | final TinyVccThemeMode themeMode;
20 | final String locale;
21 | }
22 |
--------------------------------------------------------------------------------
/lib/data/vcc_data.dart:
--------------------------------------------------------------------------------
1 | /// VCC settings.json
2 | class VccSettings {
3 | VccSettings({
4 | required this.pathToUnityExe,
5 | required this.pathToUnityHub,
6 | required this.projectBackupPath,
7 | required this.userProjects,
8 | required this.unityEditors,
9 | required this.defaultProjectPath,
10 | required this.userPackageFolders,
11 | required this.showPrereleasePackages,
12 | required this.userRepos,
13 | });
14 |
15 | final String pathToUnityExe;
16 | final String pathToUnityHub;
17 | final String projectBackupPath;
18 | final List userProjects;
19 | final List unityEditors;
20 | final String defaultProjectPath;
21 | final List userPackageFolders;
22 | final bool showPrereleasePackages;
23 | final List userRepos;
24 |
25 | VccSettings copyWith({
26 | String? pathToUnityExe,
27 | String? pathToUnityHub,
28 | String? projectBackupPath,
29 | List? userProjects,
30 | List? unityEditors,
31 | String? defaultProjectPath,
32 | List? userPackageFolders,
33 | bool? showPrereleasePackages,
34 | List? userRepos,
35 | }) {
36 | return VccSettings(
37 | pathToUnityExe: pathToUnityExe ?? this.pathToUnityExe,
38 | pathToUnityHub: pathToUnityHub ?? this.pathToUnityHub,
39 | projectBackupPath: projectBackupPath ?? this.projectBackupPath,
40 | userProjects: userProjects ?? [...this.userProjects],
41 | unityEditors: unityEditors ?? [...this.unityEditors],
42 | defaultProjectPath: defaultProjectPath ?? this.defaultProjectPath,
43 | userPackageFolders: userPackageFolders ?? [...this.userPackageFolders],
44 | showPrereleasePackages:
45 | showPrereleasePackages ?? this.showPrereleasePackages,
46 | userRepos: userRepos ?? [...this.userRepos],
47 | );
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/lib/globals.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:logger/logger.dart';
3 | import 'package:pub_semver/pub_semver.dart';
4 |
5 | final RouteObserver> routeObserver =
6 | RouteObserver>();
7 | final scaffoldKey = GlobalKey();
8 | const vpmPackageId = 'vrchat.vpm.cli';
9 | final requiredVpmVersion = Version(0, 1, 13);
10 | const requiredUnityVersion = '2019.4.31f1';
11 | const requiredUnityChangeset = 'bd5abf232a62';
12 |
13 | /// Logger to output logs.
14 | Logger? logger;
15 |
--------------------------------------------------------------------------------
/lib/i18n/strings_zh-CN.i18n.json:
--------------------------------------------------------------------------------
1 | {
2 | "lang_name": "简体中文",
3 | "common": {
4 | "labels": {
5 | "yes": "是",
6 | "no": "否",
7 | "ok": "确定",
8 | "cancel": "取消",
9 | "dismiss": "关闭"
10 | }
11 | },
12 | "navigation": {
13 | "new_project": "新建项目",
14 | "projects": "项目",
15 | "settings": "设置",
16 | "about": "关于 Tiny VCC"
17 | },
18 | "actions": {
19 | "add_project": {
20 | "tooltip": "添加现有项目"
21 | },
22 | "create_project": {
23 | "tooltip": "创建新项目"
24 | },
25 | "open_vcc_settings_folder": {
26 | "label": "打开 VCC 设置文件夹"
27 | },
28 | "open_logs_folder": {
29 | "label": "打开日志文件夹"
30 | }
31 | },
32 | "projects": {
33 | "labels": {
34 | "open_folder": "打开文件夹",
35 | "remove_from_list": "从列表中移除",
36 | "move_to_recycle_bin": "移动到回收站",
37 | "move_to_trash": "移动到废纸篓"
38 | },
39 | "dialogs": {
40 | "remove_project": {
41 | "title": "移除 $projectName",
42 | "content_win": "你确定要将 $projectPath 移动到回收站吗?",
43 | "content_others": "你确定要将 $projectPath 移动到废纸篓吗?"
44 | }
45 | },
46 | "info": {
47 | "failed_to_remove": "无法移除 $projectPath。",
48 | "error_project_not_supported": "项目 \"$path\" 不受支持。",
49 | "error_add_project": "添加项目时发生错误。",
50 | "error_project_not_exist": "$projectPath 不存在。",
51 | "avatar_git_not_supported": "Avatar Git 项目 ($projectPath) 不受 Tiny VCC 支持。",
52 | "world_git_not_supported": "World Git 项目 ($projectPath) 不受 Tiny VCC 支持。",
53 | "project_is_sdk2": "$projectPath 是 VRCSDK2 项目。",
54 | "project_is_invalid": "$projectPath 是无效项目。"
55 | }
56 | },
57 | "settings": {
58 | "headers": {
59 | "tiny_vcc_preferences": "Tiny VCC 首选项",
60 | "vcc_settings": "VCC 设置"
61 | },
62 | "labels": {
63 | "theme": "主题",
64 | "language": "语言",
65 | "unity_editors": "Unity 编辑器",
66 | "backups": "备份",
67 | "user_packages": "用户包"
68 | },
69 | "theme": {
70 | "auto": "自动",
71 | "light": "浅色",
72 | "dark": "深色"
73 | },
74 | "lang": {
75 | "auto": "自动"
76 | }
77 | },
78 | "new_project": {
79 | "title": "新项目",
80 | "labels": {
81 | "project_template": "项目模板",
82 | "project_name": "项目名称",
83 | "location": "位置",
84 | "create": "创建"
85 | },
86 | "errors": {
87 | "select_project_template": "请选择项目模板。",
88 | "enter_project_name": "请输入项目名称。",
89 | "enter_location_path": "请输入位置路径。",
90 | "failed_to_create_project": "创建项目失败。"
91 | },
92 | "info": {
93 | "creating_project": "正在 $location 此路径创建 $template 项目 \"$name\"。",
94 | "created_project": "$template 项目 \"$name\" 已在 $projectLocation 路径创建。"
95 | }
96 | },
97 | "project": {
98 | "labels": {
99 | "open_project": "打开项目",
100 | "open_folder": "打开文件夹",
101 | "make_backup": "创建备份",
102 | "add": "添加",
103 | "update": "更新",
104 | "downgrade": "降级",
105 | "remove": "移除"
106 | },
107 | "info": {
108 | "packages_changed": "包已更改。关闭并重新打开 Unity 项目以应用更改。",
109 | "unity_not_found": "VCC 设置中未找到 Unity $editorVersion。"
110 | },
111 | "dialogs": {
112 | "progress_backup": {
113 | "title": "正在备份 $name"
114 | },
115 | "made_backup": {
116 | "title": "已创建备份",
117 | "labels": {
118 | "show_me": "显示"
119 | }
120 | },
121 | "backup_error": {
122 | "title": "备份错误",
123 | "content": "无法备份 $projectName。\n\n$error"
124 | }
125 | }
126 | },
127 | "legacy_project": {
128 | "labels": {
129 | "migrate": "迁移",
130 | "open_folder": "打开文件夹",
131 | "make_backup": "创建备份"
132 | },
133 | "dialogs": {
134 | "confirm": {
135 | "title": "项目迁移",
136 | "content": "需要迁移。",
137 | "labels": {
138 | "migrate_a_copy": "迁移副本",
139 | "migrate_in_place": "迁移\n我已备份"
140 | }
141 | },
142 | "progress_backup": {
143 | "title": "正在备份 $name"
144 | },
145 | "made_backup": {
146 | "title": "已创建备份",
147 | "labels": {
148 | "show_me": "显示"
149 | }
150 | },
151 | "backup_error": {
152 | "title": "备份错误",
153 | "content": "无法备份 $projectName。\n\n$error"
154 | },
155 | "progress_migration": {
156 | "title": "正在迁移 $name"
157 | }
158 | }
159 | },
160 | "requirements": {
161 | "title": "要求",
162 | "labels": {
163 | "dotnet6sdk": ".NET 6.0 SDK",
164 | "vpm_cli": "VPM CLI",
165 | "unity_hub": "Unity Hub",
166 | "unity": "Unity",
167 | "install": "安装",
168 | "check_again": "再次检查"
169 | },
170 | "info": {
171 | "downloading_dotnet": "正在下载 .NET 6.0 SDK 安装程序。",
172 | "installing_dotnet": "正在安装 .NET 6.0 SDK。",
173 | "installing_dotnet_with_brew": "正在使用 Homebrew 安装 .NET 6.0 SDK",
174 | "see_terminal_to_continue": "请查看终端应用程序以继续安装。",
175 | "installing_vpm": "正在安装 VPM CLI",
176 | "downloading_unity_hub": "正在下载 Unity Hub 安装程序。",
177 | "installing_unity_hub": "正在安装 Unity Hub。",
178 | "installing_unity": "正在安装 Unity"
179 | },
180 | "description": {
181 | "dotnet": "安装 .NET 6.0 SDK。您也可以从网页下载 SDK 安装程序。",
182 | "dotnet_brew": "使用 Homebrew 安装 .NET 6.0 SDK。您也可以使用以下命令安装。",
183 | "dotnet_linux": "使用包管理器安装 .NET 6.0 SDK。请参阅以下说明。",
184 | "vpm": "安装 VPM CLI。您也可以使用以下命令安装。",
185 | "unity_hub": "安装 Unity Hub。您也可以从网页下载安装程序。",
186 | "unity_hub_linux": "安装 Unity Hub。请参阅以下说明。",
187 | "unity": "使用 Unity Hub 安装 Unity。您也可以从归档文件安装,但应安装 VRChat 指定的确切版本。",
188 | "unity_modules": "在手动安装中,您必须一起安装以下模块:",
189 | "unity_modules_android": "Android Build Support(用来上传到 Quest)",
190 | "unity_modules_mono": "Windows Build Support (mono)(用来从 macOS 或 Linux 上传到 PC)"
191 | },
192 | "errors": {
193 | "failed_to_isntall_dotnet": ".NET SDK 安装失败",
194 | "failed_to_isntall_vpm": "VPM CLI 安装失败",
195 | "failed_to_isntall_unity_hub": "Unity Hub 安装失败",
196 | "failed_to_isntall_unity": "Unity 安装失败"
197 | }
198 | }
199 | }
--------------------------------------------------------------------------------
/lib/main_drawer.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_riverpod/flutter_riverpod.dart';
3 |
4 | import 'providers.dart';
5 |
6 | class MainDrawer extends ConsumerWidget {
7 | const MainDrawer(
8 | {super.key, required this.selectedIndex, required this.onItemSelected});
9 |
10 | final int selectedIndex;
11 | final Function(int selectedIndex) onItemSelected;
12 |
13 | void _didSelectItem(BuildContext context, int index) {
14 | Navigator.pop(context);
15 | onItemSelected(index);
16 | }
17 |
18 | @override
19 | Widget build(BuildContext context, WidgetRef ref) {
20 | final t = ref.watch(translationProvider);
21 | return Drawer(
22 | child: ListView(
23 | children: [
24 | _DrawerListTile(
25 | index: 0,
26 | selectedIndex: selectedIndex,
27 | selectedLeading: const Icon(Icons.folder_special),
28 | leading: const Icon(Icons.folder_special_outlined),
29 | title: Text(t.navigation.projects),
30 | onSelect: (value) {
31 | _didSelectItem(context, value);
32 | },
33 | ),
34 | _DrawerListTile(
35 | index: 1,
36 | selectedIndex: selectedIndex,
37 | selectedLeading: const Icon(Icons.settings),
38 | leading: const Icon(Icons.settings_outlined),
39 | title: Text(t.navigation.settings),
40 | onSelect: (value) {
41 | _didSelectItem(context, value);
42 | },
43 | ),
44 | const Divider(),
45 | _AboutListTile(),
46 | ],
47 | ),
48 | );
49 | }
50 | }
51 |
52 | class _DrawerListTile extends StatelessWidget {
53 | const _DrawerListTile(
54 | {required this.index,
55 | required this.selectedIndex,
56 | required this.selectedLeading,
57 | required this.leading,
58 | required this.title,
59 | required this.onSelect});
60 |
61 | final int index;
62 | final int selectedIndex;
63 | final Widget selectedLeading;
64 | final Widget leading;
65 | final Widget title;
66 |
67 | final Function(int index) onSelect;
68 |
69 | @override
70 | Widget build(BuildContext context) {
71 | bool selected = selectedIndex == index;
72 | return ListTile(
73 | title: title,
74 | leading: selected ? selectedLeading : leading,
75 | selected: selected,
76 | onTap: () {
77 | onSelect(index);
78 | },
79 | );
80 | }
81 | }
82 |
83 | class _AboutListTile extends ConsumerWidget {
84 | @override
85 | Widget build(BuildContext context, WidgetRef ref) {
86 | final info = ref.watch(packageInfoProvider);
87 | final notice = ref.watch(licenseNoticeProvider);
88 | return AboutListTile(
89 | icon: const Icon(Icons.info_outline),
90 | applicationVersion: info.value?.version,
91 | applicationIcon: Image.asset(
92 | 'assets/images/app_icon-1024x1024.png',
93 | width: 64,
94 | height: 64,
95 | ),
96 | applicationLegalese: notice.value,
97 | );
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/lib/repos/requirements_repository.dart:
--------------------------------------------------------------------------------
1 | import 'dart:io';
2 |
3 | import 'package:pub_semver/pub_semver.dart';
4 |
5 | import '../services/dotnet_service.dart';
6 | import '../services/vcc_service.dart';
7 |
8 | class RequirementsRepository {
9 | RequirementsRepository(DotNetService dotnet, VccService vcc)
10 | : _dotnet = dotnet,
11 | _vcc = vcc;
12 |
13 | final DotNetService _dotnet;
14 | final VccService _vcc;
15 |
16 | Future checkDotNetCommand() async {
17 | return _dotnet.isInstalled();
18 | }
19 |
20 | Future checkDotNet6Sdk() async {
21 | final sdks = await _dotnet.listSdks();
22 | const missingVersion = 'MISSING';
23 | final sdk6Version = sdks.keys
24 | .firstWhere((v) => v.startsWith('6.'), orElse: () => missingVersion);
25 | if (sdk6Version == missingVersion) {
26 | return false;
27 | }
28 | return true;
29 | }
30 |
31 | Future checkVpmCommand() async {
32 | return _vcc.isInstalled();
33 | }
34 |
35 | Future checkVpmVersion(Version requiredVersion) async {
36 | try {
37 | final version = await _vcc.getCliVersion();
38 | if (version < requiredVersion) {
39 | false;
40 | }
41 | return true;
42 | } on ProcessException {
43 | return false;
44 | }
45 | }
46 |
47 | Future checkUnityHub() async {
48 | return _vcc.checkHub();
49 | }
50 |
51 | Future checkUnity() async {
52 | return _vcc.checkUnity();
53 | }
54 |
55 | Future installVpmCli(Version version) async {
56 | await _dotnet.installGlobalTool('vrchat.vpm.cli', version.toString());
57 | if (!_vcc.isInstalled()) {
58 | throw Exception('Installed vpm not detected.');
59 | }
60 | await _vcc.installTemplates();
61 | await _vcc.listRepos();
62 | }
63 |
64 | Future updateVpmCli(Version version) async {
65 | await _dotnet.updateGlobalTool('vrchat.vpm.cli', version.toString());
66 | await _vcc.installTemplates();
67 | await _vcc.listRepos();
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/lib/repos/tiny_vcc_settings_repository.dart:
--------------------------------------------------------------------------------
1 | import '../data/tiny_vcc_data.dart';
2 | import '../services/tiny_vcc_service.dart';
3 |
4 | class TinyVccSettingsRepository {
5 | TinyVccSettingsRepository(TinyVccService tinyVcc) : _tinyVcc = tinyVcc;
6 | final TinyVccService _tinyVcc;
7 |
8 | Future fetchSettings() async {
9 | return _tinyVcc.loadSettings();
10 | }
11 |
12 | Future setThemeMode(TinyVccThemeMode mode) async {
13 | await _tinyVcc.writeSettings(themeMode: mode);
14 | }
15 |
16 | Future setLocale(String locale) async {
17 | await _tinyVcc.writeSettings(locale: locale);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/lib/repos/vcc_projects_repository.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:io';
3 |
4 | import '../services/vcc_service.dart';
5 |
6 | class VccProjectsRepository {
7 | VccProjectsRepository(VccService vcc) : _vcc = vcc;
8 |
9 | final VccService _vcc;
10 |
11 | List? _projects;
12 |
13 | Future> fetchVccProjects() async {
14 | final setting = await _vcc.getSettings();
15 | _projects = setting.userProjects.map((e) => VccProject(e)).toList();
16 | _sortProjects();
17 | return _projects!;
18 | }
19 |
20 | Future createVccProject(
21 | VpmTemplate template, String name, String location) async {
22 | final project = await _vcc.createNewProject(template, name, location);
23 | await fetchVccProjects();
24 | return project;
25 | }
26 |
27 | Future addVccProject(VccProject project) async {
28 | await _vcc.addUserProject(Directory(project.path));
29 | await fetchVccProjects();
30 | }
31 |
32 | Future deleteVccProject(VccProject project) async {
33 | await _vcc.deleteUserProject(project);
34 | await fetchVccProjects();
35 | }
36 |
37 | Future checkProjectType(VccProject project) {
38 | return _vcc.checkUserProject(project);
39 | }
40 |
41 | Future migrateCopy(VccProject project) {
42 | return _vcc.migrateProject(project, false);
43 | }
44 |
45 | Future migrateInPlace(VccProject project) {
46 | return _vcc.migrateProject(project, true);
47 | }
48 |
49 | Future backup(VccProject project) async {
50 | return _vcc.backupProject(project);
51 | }
52 |
53 | void _sortProjects() {
54 | _projects?.sort(((a, b) => a.name.compareTo(b.name)));
55 | }
56 |
57 | Future migrateProjectWithStream(
58 | VccProject project,
59 | bool inPlace, {
60 | required Null Function(dynamic text) onStdout,
61 | required Null Function(dynamic text) onStderr,
62 | }) async {
63 | return _vcc.migrateProjectWithStream(
64 | project,
65 | inPlace,
66 | onStdout: onStdout,
67 | onStderr: onStderr,
68 | );
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/lib/repos/vcc_settings_repository.dart:
--------------------------------------------------------------------------------
1 | import 'package:pub_semver/pub_semver.dart';
2 |
3 | import '../caches/simple_cache.dart';
4 | import '../data/vcc_data.dart';
5 | import '../services/vcc_service.dart';
6 |
7 | class VccSettingsRepository {
8 | VccSettingsRepository(VccService vcc) : _vcc = vcc;
9 |
10 | final VccService _vcc;
11 |
12 | final _settingsCache = SimpleCache();
13 |
14 | Future fetchCliVersion() async {
15 | return _vcc.getCliVersion();
16 | }
17 |
18 | Future fetchSettings({bool refresh = false}) async {
19 | if (_settingsCache.hasCache && !refresh) {
20 | return _settingsCache.get();
21 | }
22 | final setting = await _vcc.getSettings();
23 | _settingsCache.set(setting);
24 | return setting;
25 | }
26 |
27 | Future setPreferredEditor(String path) async {
28 | await _vcc.addUnityEditor(path);
29 | return _setSettings(pathToUnityExe: path);
30 | }
31 |
32 | Future setBackupFolder(String path) async {
33 | return _setSettings(projectBackupPath: path);
34 | }
35 |
36 | Future addUnityEditor(String path) async {
37 | await _vcc.addUnityEditor(path);
38 | await fetchSettings(refresh: true);
39 | }
40 |
41 | Future setUnityEditors(List paths) async {
42 | await _vcc.setUnityEditors(paths);
43 | await fetchSettings(refresh: true);
44 | }
45 |
46 | Future getUnityEditor(String version) async {
47 | final settings = await fetchSettings();
48 | final editor = settings.unityEditors.firstWhere(
49 | (editorPath) => editorPath.contains(version),
50 | orElse: () => '',
51 | );
52 | if (editor == '') {
53 | return null;
54 | }
55 | return editor;
56 | }
57 |
58 | Future setDefaultProjectPath(String path) async {
59 | await _vcc.setSettings(defaultProjectPath: path);
60 | await fetchSettings(refresh: true);
61 | }
62 |
63 | Future addUserPackageFolder(String path) async {
64 | final settings = await fetchSettings(refresh: false);
65 | if (settings.userPackageFolders.contains(path)) {
66 | return;
67 | }
68 | await _vcc.addUserPackageFolder(path);
69 | await fetchSettings(refresh: true);
70 | }
71 |
72 | Future deleteUserPackageFolder(String path) async {
73 | await _vcc.deleteUserPackageFolder(path);
74 | await fetchSettings(refresh: true);
75 | }
76 |
77 | Future _setSettings({
78 | String? pathToUnityExe,
79 | String? projectBackupPath,
80 | }) async {
81 | await _vcc.setSettings(
82 | pathToUnityExe: pathToUnityExe,
83 | projectBackupPath: projectBackupPath,
84 | );
85 | await fetchSettings(refresh: true);
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/lib/repos/vcc_templates_repository.dart:
--------------------------------------------------------------------------------
1 | import '../services/vcc_service.dart';
2 |
3 | class VccTemplatesRepository {
4 | VccTemplatesRepository(VccService vcc) : _vcc = vcc;
5 |
6 | final VccService _vcc;
7 |
8 | Future> fetchTemplates() async {
9 | final templates = await _vcc.getTemplates();
10 | templates.removeWhere((element) => element.name == 'Base');
11 | return templates;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/lib/repos/vpm_packages_repository.dart:
--------------------------------------------------------------------------------
1 | import 'package:pub_semver/pub_semver.dart';
2 |
3 | import '../services/vcc_service.dart';
4 |
5 | class VpmPackagesRepository {
6 | VpmPackagesRepository(VccService vcc) : _vcc = vcc;
7 |
8 | final VccService _vcc;
9 |
10 | List? _packages;
11 | List? get packages => _packages;
12 |
13 | Future> fetchPackages({bool refresh = false}) async {
14 | if (_packages == null || refresh) {
15 | _packages = await _vcc.getVpmPackages();
16 | }
17 | return _packages!;
18 | }
19 |
20 | List getVersions(
21 | String name, Version? installedVersion, bool showPrerelease) {
22 | final list = _packages!.where((element) => element.name == name).toList();
23 | if (!showPrerelease) {
24 | list.removeWhere((element) =>
25 | element.version.isPreRelease && element.version != installedVersion);
26 | }
27 | list.sort(((a, b) => b.version.compareTo(a.version)));
28 | return list;
29 | }
30 |
31 | VpmPackage? getLatest(
32 | String name, Version? installedVersion, bool showPrerelease) {
33 | final versions = getVersions(name, installedVersion, showPrerelease);
34 | if (versions.isEmpty) {
35 | return null;
36 | }
37 | return versions.first;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/lib/services/dotnet_service.dart:
--------------------------------------------------------------------------------
1 | import 'dart:async';
2 | import 'dart:io';
3 |
4 | import 'package:http/http.dart' as http;
5 |
6 | import '../data/exceptions.dart';
7 | import '../utils/system_info.dart';
8 |
9 | class DotNetService {
10 | DotNetService() {
11 | _findDotNet();
12 | }
13 |
14 | /// Use full path to avoid crash.
15 | /// https://stackoverflow.com/questions/69139808/
16 | String _dotnetCommand = '';
17 |
18 | static const _feed = 'https://dotnetcli.azureedge.net';
19 |
20 | String? _findDotNet() {
21 | if (Platform.isWindows) {
22 | final result = Process.runSync('where', ['dotnet']);
23 | if (result.exitCode == 0) {
24 | _dotnetCommand = result.stdout.toString().trim();
25 | return _dotnetCommand;
26 | }
27 | final defaultDotNet = File('C:\\Program Files\\dotnet\\dotnet.exe');
28 | if (defaultDotNet.existsSync()) {
29 | _dotnetCommand = defaultDotNet.path;
30 | return _dotnetCommand;
31 | }
32 | _dotnetCommand = '';
33 | return null;
34 | }
35 | if (Platform.isMacOS) {
36 | final result = Process.runSync('which', ['dotnet']);
37 | if (result.exitCode == 0) {
38 | _dotnetCommand = result.stdout.toString().trim();
39 | return _dotnetCommand;
40 | }
41 | const defaultDotNet = '/usr/local/share/dotnet/dotnet';
42 | if (File(defaultDotNet).existsSync()) {
43 | _dotnetCommand = defaultDotNet;
44 | return defaultDotNet;
45 | }
46 | const brewDotNet6 = '/usr/local/opt/dotnet@6/bin/dotnet';
47 | if (File(brewDotNet6).existsSync()) {
48 | _dotnetCommand = brewDotNet6;
49 | return brewDotNet6;
50 | }
51 | _dotnetCommand = '';
52 | return null;
53 | }
54 | final result = Process.runSync('which', ['dotnet']);
55 | if (result.exitCode == 0) {
56 | _dotnetCommand = result.stdout.toString().trim();
57 | return _dotnetCommand;
58 | }
59 | _dotnetCommand = '';
60 | return null;
61 | }
62 |
63 | Future isInstalled() async {
64 | final dotnet = _findDotNet();
65 | _dotnetCommand = dotnet ?? 'dotnet';
66 | return dotnet != null;
67 | }
68 |
69 | Future getLatestVersion() async {
70 | final versionUri = Uri.parse('$_feed/dotnet/Sdk/6.0/latest.version');
71 | return (await http.read(versionUri)).trim();
72 | }
73 |
74 | Uri getWindowsInstallerUri(String version, Architecture arch) {
75 | return Uri.parse(
76 | '$_feed/dotnet/Sdk/$version/dotnet-sdk-$version-win-${arch.name}.exe');
77 | }
78 |
79 | Uri getMacInstallerUri(String version, Architecture arch) {
80 | return Uri.parse(
81 | '$_feed/dotnet/Sdk/$version/dotnet-sdk-$version-osx-${arch.name}.pkg');
82 | }
83 |
84 | Future