diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml index 147f546..51158f7 100644 --- a/.github/workflows/auto-release.yml +++ b/.github/workflows/auto-release.yml @@ -43,12 +43,34 @@ jobs: echo "Generated version: ${version}" - name: Setup Flutter - uses: subosito/flutter-action@v2 - with: - flutter-version: "3.41.1" - - - name: Enable Windows Desktop - run: flutter config --enable-windows-desktop + shell: pwsh + run: | + # プリインストールのFlutter(3.44.0)との競合を避けるため、公式アーカイブから直接取得 + $flutterVersion = "3.41.1" + $flutterUrl = "https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/flutter_windows_${flutterVersion}-stable.zip" + $installDir = "C:\flutter-sdk" + + Write-Host "Flutter SDK ${flutterVersion} をダウンロード中..." + Invoke-WebRequest -Uri $flutterUrl -OutFile flutter.zip -UseBasicParsing + + Write-Host "展開中..." + Expand-Archive flutter.zip -DestinationPath $installDir -Force + Remove-Item flutter.zip + + $flutterRoot = "$installDir\flutter" + $flutterBin = "$flutterRoot\bin" + + # 環境変数 FLUTTER_ROOT を上書き + echo "FLUTTER_ROOT=$flutterRoot" | Out-File -FilePath $env:GITHUB_ENV -Append + + # flutter.bat --version を実行して dart-sdk などを初期化 + & "$flutterBin\flutter.bat" --version + & "$flutterBin\flutter.bat" config --enable-windows-desktop + + # PATH に flutter\bin と dart-sdk\bin を両方追加して最優先にする + $dartBin = "$flutterRoot\bin\cache\dart-sdk\bin" + echo $flutterBin | Out-File -FilePath $env:GITHUB_PATH -Append + echo $dartBin | Out-File -FilePath $env:GITHUB_PATH -Append - name: Update Version Files shell: pwsh @@ -77,7 +99,8 @@ jobs: run: flutter pub get - name: Build Windows (includes License Generation) - run: dart run rps build:windows + run: | + dart run rps build:windows - name: Create Zip Archive shell: pwsh diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 5c5fbf1..d7b3a8b 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -9,12 +9,35 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: subosito/flutter-action@v2 - with: - channel: "stable" + - name: Setup Flutter + shell: pwsh + run: | + # プリインストールのFlutter(3.44.0)との競合を避けるため、公式アーカイブから直接取得 + $flutterVersion = "3.41.1" + $flutterUrl = "https://storage.googleapis.com/flutter_infra_release/releases/stable/windows/flutter_windows_${flutterVersion}-stable.zip" + $installDir = "C:\flutter-sdk" + + Write-Host "Flutter SDK ${flutterVersion} をダウンロード中..." + Invoke-WebRequest -Uri $flutterUrl -OutFile flutter.zip -UseBasicParsing + + Write-Host "展開中..." + Expand-Archive flutter.zip -DestinationPath $installDir -Force + Remove-Item flutter.zip + + $flutterRoot = "$installDir\flutter" + $flutterBin = "$flutterRoot\bin" + + # 環境変数 FLUTTER_ROOT を上書き + echo "FLUTTER_ROOT=$flutterRoot" | Out-File -FilePath $env:GITHUB_ENV -Append + + # flutter.bat --version を実行して dart-sdk などを初期化 + & "$flutterBin\flutter.bat" --version + & "$flutterBin\flutter.bat" config --enable-windows-desktop - - name: Enable Windows Desktop - run: flutter config --enable-windows-desktop + # PATH に flutter\bin と dart-sdk\bin を両方追加して最優先にする + $dartBin = "$flutterRoot\bin\cache\dart-sdk\bin" + echo $flutterBin | Out-File -FilePath $env:GITHUB_PATH -Append + echo $dartBin | Out-File -FilePath $env:GITHUB_PATH -Append - name: Install Dependencies run: flutter pub get diff --git a/.gitignore b/.gitignore index 5c1fcde..cf19654 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,4 @@ temp_diff.txt .env docs/comfyui_migration_analysis* full_history.patch +logs_69598121678 diff --git a/lib/core/layout_preferences.dart b/lib/core/layout_preferences.dart index 8a822f4..94ea57c 100644 --- a/lib/core/layout_preferences.dart +++ b/lib/core/layout_preferences.dart @@ -119,6 +119,25 @@ class LayoutPreferences { await _prefs?.setString(_apiUrlKey, url); } + // Generation Settings + static Map? getGenerationSettings() { + final jsonString = _prefs?.getString('generation_settings'); + if (jsonString != null) { + try { + return json.decode(jsonString) as Map; + } catch (e) { + return null; + } + } + return null; + } + + static Future setGenerationSettings(Map settings) async { + await init(); + final jsonString = json.encode(settings); + await _prefs?.setString('generation_settings', jsonString); + } + // Clear all preferences static Future clearAll() async { await init(); diff --git a/lib/features/preview/ui/preview_pane.dart b/lib/features/preview/ui/preview_pane.dart index 6f6706f..dc690c4 100644 --- a/lib/features/preview/ui/preview_pane.dart +++ b/lib/features/preview/ui/preview_pane.dart @@ -752,6 +752,7 @@ class _PreviewPaneState extends ConsumerState { initial: TextEditingValue(text: ref.read(apiUrlProvider)), onChange: (value) { ref.read(apiUrlProvider.notifier).state = value.text; + LayoutPreferences.setApiUrl(value.text); }, ), ), diff --git a/lib/features/settings/models/generation_settings.dart b/lib/features/settings/models/generation_settings.dart index 6a82f20..03aa51d 100644 --- a/lib/features/settings/models/generation_settings.dart +++ b/lib/features/settings/models/generation_settings.dart @@ -114,4 +114,48 @@ class GenerationSettings { return map; } + + factory GenerationSettings.fromMap(Map map) { + return GenerationSettings( + samplerName: map['samplerName'] as String? ?? 'Euler a', + width: map['width'] as int? ?? 512, + height: map['height'] as int? ?? 512, + steps: map['steps'] as int? ?? 20, + cfgScale: (map['cfgScale'] as num?)?.toDouble() ?? 7.0, + seed: map['seed'] as int? ?? -1, + scheduler: map['scheduler'] as String? ?? 'Automatic', + saveImages: map['saveImages'] as bool? ?? true, + batchSize: map['batchSize'] as int? ?? 1, + batchCount: map['batchCount'] as int? ?? 1, + sdMode: map['sdMode'] as String? ?? 'SD', + uiDebugMode: map['uiDebugMode'] as bool? ?? false, + enableHires: map['enableHires'] as bool? ?? false, + hiresUpscaler: map['hiresUpscaler'] as String?, + hiresSteps: map['hiresSteps'] as int? ?? 20, + denoisingStrength: (map['denoisingStrength'] as num?)?.toDouble() ?? 0.7, + hrScale: (map['hrScale'] as num?)?.toDouble() ?? 2.0, + ); + } + + Map toMap() { + return { + 'samplerName': samplerName, + 'width': width, + 'height': height, + 'steps': steps, + 'cfgScale': cfgScale, + 'seed': seed, + 'scheduler': scheduler, + 'saveImages': saveImages, + 'batchSize': batchSize, + 'batchCount': batchCount, + 'sdMode': sdMode, + 'uiDebugMode': uiDebugMode, + 'enableHires': enableHires, + 'hiresUpscaler': hiresUpscaler, + 'hiresSteps': hiresSteps, + 'denoisingStrength': denoisingStrength, + 'hrScale': hrScale, + }; + } } diff --git a/lib/features/settings/store/settings_store.dart b/lib/features/settings/store/settings_store.dart index f30441a..e735044 100644 --- a/lib/features/settings/store/settings_store.dart +++ b/lib/features/settings/store/settings_store.dart @@ -7,6 +7,7 @@ import '../models/sampler.dart'; import '../models/scheduler.dart'; import '../models/sd_model.dart'; import '../models/upscaler.dart'; +import '../../../core/layout_preferences.dart'; final sdModelsProvider = FutureProvider>((ref) async { final client = ref.watch(forgeApiClientProvider); @@ -36,7 +37,21 @@ final upscalersProvider = FutureProvider>((ref) async { final selectedModelProvider = StateProvider((ref) => null); class GenerationSettingsNotifier extends StateNotifier { - GenerationSettingsNotifier() : super(GenerationSettings()); + GenerationSettingsNotifier() : super(_loadInitialSettings()); + + static GenerationSettings _loadInitialSettings() { + final saved = LayoutPreferences.getGenerationSettings(); + if (saved != null) { + return GenerationSettings.fromMap(saved); + } + return GenerationSettings(); + } + + @override + set state(GenerationSettings value) { + super.state = value; + LayoutPreferences.setGenerationSettings(value.toMap()); + } void updateSampler(String sampler) { state = state.copyWith(samplerName: sampler); diff --git a/lib/features/settings/ui/detailed_settings_dialog.dart b/lib/features/settings/ui/detailed_settings_dialog.dart index d995664..d6bdd67 100644 --- a/lib/features/settings/ui/detailed_settings_dialog.dart +++ b/lib/features/settings/ui/detailed_settings_dialog.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:forui/forui.dart'; import '../../../core/l10n.dart'; +import '../../../core/layout_preferences.dart'; import '../../../core/providers.dart'; import '../store/settings_store.dart'; @@ -36,6 +37,7 @@ class DetailedSettingsDialog extends ConsumerWidget { initial: TextEditingValue(text: ref.read(apiUrlProvider)), onChange: (value) { ref.read(apiUrlProvider.notifier).state = value.text; + LayoutPreferences.setApiUrl(value.text); }, ), ),