Rebrand to Lunaris and add CosBooru providers
This commit is contained in:
+2
-2
@@ -32,7 +32,7 @@ class GelRuleApp extends ConsumerWidget {
|
||||
home: _StartupErrorScreen(error: error),
|
||||
),
|
||||
data: (_) => MaterialApp.router(
|
||||
title: 'RuleGel',
|
||||
title: 'Lunaris',
|
||||
debugShowCheckedModeBanner: false,
|
||||
theme: buildTheme(Brightness.light),
|
||||
darkTheme: buildTheme(Brightness.dark),
|
||||
@@ -79,7 +79,7 @@ class _AppOverlayState extends ConsumerState<_AppOverlay> {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text('RuleGel ${info.version} is available'),
|
||||
title: Text('Lunaris ${info.version} is available'),
|
||||
content: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 520),
|
||||
child: SingleChildScrollView(
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
const appDisplayVersion = '1.0.2';
|
||||
const appBuildNumber = 10;
|
||||
const appDisplayVersion = '1.1.0';
|
||||
const appBuildNumber = 11;
|
||||
|
||||
+18
-7
@@ -1,5 +1,16 @@
|
||||
const ruleGelChangelog = [
|
||||
RuleGelChange(
|
||||
const lunarisChangelog = [
|
||||
LunarisChange(
|
||||
version: '1.1.0',
|
||||
title: 'Lunaris rebrand and CosBooru',
|
||||
bullets: [
|
||||
'RuleGel is now Lunaris while keeping the same package identity for updates.',
|
||||
'CosBooru now uses the working Danbooru-compatible API at cos.lycore.co.',
|
||||
'Xbooru was added as a default Gelbooru-compatible provider.',
|
||||
'Rule34 Paheal was removed from providers.',
|
||||
'Video player UI preferences are saved across fullscreen, details and restarts.',
|
||||
],
|
||||
),
|
||||
LunarisChange(
|
||||
version: '1.0.2',
|
||||
title: 'Realbooru safety fix',
|
||||
bullets: [
|
||||
@@ -8,7 +19,7 @@ const ruleGelChangelog = [
|
||||
'Existing enabled Realbooru configs are disabled on startup so the main feed is not polluted by a known-offline API.',
|
||||
],
|
||||
),
|
||||
RuleGelChange(
|
||||
LunarisChange(
|
||||
version: '1.0.1',
|
||||
title: 'Realbooru and mobile polish',
|
||||
bullets: [
|
||||
@@ -18,7 +29,7 @@ const ruleGelChangelog = [
|
||||
'Tag chip input no longer jumps while typing.',
|
||||
],
|
||||
),
|
||||
RuleGelChange(
|
||||
LunarisChange(
|
||||
version: '1.0.0',
|
||||
title: 'Stable 1.0',
|
||||
bullets: [
|
||||
@@ -28,7 +39,7 @@ const ruleGelChangelog = [
|
||||
'Windows portable package is published alongside APK and installer.',
|
||||
],
|
||||
),
|
||||
RuleGelChange(
|
||||
LunarisChange(
|
||||
version: '0.4.3',
|
||||
title: 'Bugfixes',
|
||||
bullets: [
|
||||
@@ -40,8 +51,8 @@ const ruleGelChangelog = [
|
||||
),
|
||||
];
|
||||
|
||||
class RuleGelChange {
|
||||
const RuleGelChange({
|
||||
class LunarisChange {
|
||||
const LunarisChange({
|
||||
required this.version,
|
||||
required this.title,
|
||||
required this.bullets,
|
||||
|
||||
@@ -168,7 +168,7 @@ final updateServiceProvider = Provider<UpdateService>((ref) {
|
||||
connectTimeout: const Duration(seconds: 12),
|
||||
receiveTimeout: const Duration(seconds: 12),
|
||||
headers: const {
|
||||
'User-Agent': 'RuleGel/1.0 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
'Accept': 'application/json',
|
||||
},
|
||||
),
|
||||
|
||||
@@ -88,7 +88,7 @@ class ProviderRepository {
|
||||
priority: 5,
|
||||
timeoutSeconds: 20,
|
||||
customHeaders: const {
|
||||
'User-Agent': 'RuleGel/0.2 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
},
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
@@ -102,7 +102,7 @@ class ProviderRepository {
|
||||
priority: 6,
|
||||
timeoutSeconds: 20,
|
||||
customHeaders: const {
|
||||
'User-Agent': 'RuleGel/0.2 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
},
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
@@ -119,6 +119,30 @@ class ProviderRepository {
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
),
|
||||
ContentProviderConfig(
|
||||
id: 'xbooru',
|
||||
name: 'Xbooru',
|
||||
baseUrl: 'https://xbooru.com',
|
||||
apiType: 'gelbooru',
|
||||
enabled: true,
|
||||
priority: 8,
|
||||
timeoutSeconds: 20,
|
||||
customHeaders: const {},
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
),
|
||||
ContentProviderConfig(
|
||||
id: 'cosbooru',
|
||||
name: 'CosBooru',
|
||||
baseUrl: 'https://cos.lycore.co',
|
||||
apiType: 'danbooru',
|
||||
enabled: true,
|
||||
priority: 9,
|
||||
timeoutSeconds: 20,
|
||||
customHeaders: const {},
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -128,10 +152,35 @@ class ProviderRepository {
|
||||
await isar.providerConfigEntitys.where().findAll();
|
||||
for (final provider in existingProviders) {
|
||||
if (provider.providerId == 'kemono' ||
|
||||
provider.providerId == 'coomer') {
|
||||
provider.providerId == 'coomer' ||
|
||||
provider.providerId == 'paheal') {
|
||||
await isar.providerConfigEntitys.delete(provider.isarId);
|
||||
}
|
||||
}
|
||||
await isar.providerHealthEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
await isar.providerDiagnosticsEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
await isar.cachedPostEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
await isar.favoriteEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
await isar.collectionPostEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
await isar.viewedPostEntitys
|
||||
.filter()
|
||||
.providerIdEqualTo('paheal')
|
||||
.deleteAll();
|
||||
final seeds = seedProviders();
|
||||
for (final seed in seeds) {
|
||||
final exists = await isar.providerConfigEntitys
|
||||
@@ -145,6 +194,17 @@ class ProviderRepository {
|
||||
exists.enabled = false;
|
||||
exists.updatedAt = DateTime.now();
|
||||
await isar.providerConfigEntitys.put(exists);
|
||||
} else if (seed.id == 'cosbooru' &&
|
||||
(exists.baseUrl != seed.baseUrl ||
|
||||
exists.apiType != seed.apiType)) {
|
||||
exists.name = seed.name;
|
||||
exists.baseUrl = seed.baseUrl;
|
||||
exists.apiType = seed.apiType;
|
||||
exists.enabled = seed.enabled;
|
||||
exists.priority = seed.priority;
|
||||
exists.timeoutSeconds = seed.timeoutSeconds;
|
||||
exists.updatedAt = DateTime.now();
|
||||
await isar.providerConfigEntitys.put(exists);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -32,6 +32,10 @@ class AppSettings {
|
||||
required this.mediaQualityMode,
|
||||
required this.motionRefreshMode,
|
||||
required this.autoBatterySaver60Hz,
|
||||
required this.videoPlayerMuted,
|
||||
required this.videoPlayerHalfVolume,
|
||||
required this.videoPlayerLoop,
|
||||
required this.videoPlayerCover,
|
||||
required this.hiddenPostKeys,
|
||||
required this.diagnosticLogLines,
|
||||
required this.lastFeedTags,
|
||||
@@ -64,6 +68,10 @@ class AppSettings {
|
||||
final String mediaQualityMode;
|
||||
final String motionRefreshMode;
|
||||
final bool autoBatterySaver60Hz;
|
||||
final bool videoPlayerMuted;
|
||||
final bool videoPlayerHalfVolume;
|
||||
final bool videoPlayerLoop;
|
||||
final bool videoPlayerCover;
|
||||
final List<String> hiddenPostKeys;
|
||||
final List<String> diagnosticLogLines;
|
||||
final List<String> lastFeedTags;
|
||||
@@ -96,6 +104,10 @@ class AppSettings {
|
||||
mediaQualityMode: 'auto',
|
||||
motionRefreshMode: 'auto',
|
||||
autoBatterySaver60Hz: true,
|
||||
videoPlayerMuted: false,
|
||||
videoPlayerHalfVolume: false,
|
||||
videoPlayerLoop: false,
|
||||
videoPlayerCover: false,
|
||||
hiddenPostKeys: [],
|
||||
diagnosticLogLines: [],
|
||||
lastFeedTags: [],
|
||||
@@ -129,6 +141,10 @@ class AppSettings {
|
||||
String? mediaQualityMode,
|
||||
String? motionRefreshMode,
|
||||
bool? autoBatterySaver60Hz,
|
||||
bool? videoPlayerMuted,
|
||||
bool? videoPlayerHalfVolume,
|
||||
bool? videoPlayerLoop,
|
||||
bool? videoPlayerCover,
|
||||
List<String>? hiddenPostKeys,
|
||||
List<String>? diagnosticLogLines,
|
||||
List<String>? lastFeedTags,
|
||||
@@ -164,6 +180,11 @@ class AppSettings {
|
||||
mediaQualityMode: mediaQualityMode ?? this.mediaQualityMode,
|
||||
motionRefreshMode: motionRefreshMode ?? this.motionRefreshMode,
|
||||
autoBatterySaver60Hz: autoBatterySaver60Hz ?? this.autoBatterySaver60Hz,
|
||||
videoPlayerMuted: videoPlayerMuted ?? this.videoPlayerMuted,
|
||||
videoPlayerHalfVolume:
|
||||
videoPlayerHalfVolume ?? this.videoPlayerHalfVolume,
|
||||
videoPlayerLoop: videoPlayerLoop ?? this.videoPlayerLoop,
|
||||
videoPlayerCover: videoPlayerCover ?? this.videoPlayerCover,
|
||||
hiddenPostKeys: hiddenPostKeys ?? this.hiddenPostKeys,
|
||||
diagnosticLogLines: diagnosticLogLines ?? this.diagnosticLogLines,
|
||||
lastFeedTags: lastFeedTags ?? this.lastFeedTags,
|
||||
@@ -199,6 +220,10 @@ class AppSettings {
|
||||
'mediaQualityMode': mediaQualityMode,
|
||||
'motionRefreshMode': motionRefreshMode,
|
||||
'autoBatterySaver60Hz': autoBatterySaver60Hz,
|
||||
'videoPlayerMuted': videoPlayerMuted,
|
||||
'videoPlayerHalfVolume': videoPlayerHalfVolume,
|
||||
'videoPlayerLoop': videoPlayerLoop,
|
||||
'videoPlayerCover': videoPlayerCover,
|
||||
'hiddenPostKeys': hiddenPostKeys,
|
||||
'diagnosticLogLines': diagnosticLogLines,
|
||||
'lastFeedTags': lastFeedTags,
|
||||
@@ -259,6 +284,14 @@ class AppSettings {
|
||||
defaults.motionRefreshMode,
|
||||
autoBatterySaver60Hz: (json['autoBatterySaver60Hz'] as bool?) ??
|
||||
defaults.autoBatterySaver60Hz,
|
||||
videoPlayerMuted:
|
||||
(json['videoPlayerMuted'] as bool?) ?? defaults.videoPlayerMuted,
|
||||
videoPlayerHalfVolume: (json['videoPlayerHalfVolume'] as bool?) ??
|
||||
defaults.videoPlayerHalfVolume,
|
||||
videoPlayerLoop:
|
||||
(json['videoPlayerLoop'] as bool?) ?? defaults.videoPlayerLoop,
|
||||
videoPlayerCover:
|
||||
(json['videoPlayerCover'] as bool?) ?? defaults.videoPlayerCover,
|
||||
hiddenPostKeys: List<String>.from(
|
||||
(json['hiddenPostKeys'] as List?) ?? defaults.hiddenPostKeys,
|
||||
),
|
||||
@@ -448,7 +481,7 @@ class SettingsService {
|
||||
return Success(
|
||||
const JsonEncoder.withIndent(' ').convert({
|
||||
'app': {
|
||||
'name': 'RuleGel',
|
||||
'name': 'Lunaris',
|
||||
'version': appVersion,
|
||||
'build': buildNumber,
|
||||
'generatedAt': DateTime.now().toIso8601String(),
|
||||
|
||||
@@ -40,7 +40,7 @@ class DioClient {
|
||||
receiveTimeout: timeout,
|
||||
sendTimeout: timeout,
|
||||
headers: {
|
||||
'User-Agent': 'GelRuleApp/0.1 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
'Accept': 'application/json, text/xml;q=0.9, */*;q=0.8',
|
||||
...?headers,
|
||||
},
|
||||
|
||||
@@ -188,6 +188,13 @@ class PostDetailsScreen extends ConsumerWidget {
|
||||
key: ValueKey(post.cacheKey),
|
||||
post: post,
|
||||
qualityMode: qualityMode,
|
||||
initialLoop: settings.videoPlayerLoop,
|
||||
initialMuted: settings.videoPlayerMuted,
|
||||
initialCoverVideo: settings.videoPlayerCover,
|
||||
initialHalfVolume:
|
||||
settings.videoPlayerHalfVolume,
|
||||
onPlaybackPreferencesChanged: (snapshot) =>
|
||||
_saveVideoPreferences(ref, snapshot),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -290,6 +297,12 @@ class PostDetailsScreen extends ConsumerWidget {
|
||||
key: ValueKey(post.cacheKey),
|
||||
post: post,
|
||||
qualityMode: qualityMode,
|
||||
initialLoop: settings.videoPlayerLoop,
|
||||
initialMuted: settings.videoPlayerMuted,
|
||||
initialCoverVideo: settings.videoPlayerCover,
|
||||
initialHalfVolume: settings.videoPlayerHalfVolume,
|
||||
onPlaybackPreferencesChanged: (snapshot) =>
|
||||
_saveVideoPreferences(ref, snapshot),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -479,6 +492,30 @@ class PostDetailsScreen extends ConsumerWidget {
|
||||
}
|
||||
context.go('/');
|
||||
}
|
||||
|
||||
Future<void> _saveVideoPreferences(
|
||||
WidgetRef ref,
|
||||
VideoPlaybackSnapshot snapshot,
|
||||
) async {
|
||||
final result = await ref.read(settingsServiceProvider).getSettings();
|
||||
if (result is! Success<AppSettings>) return;
|
||||
final settings = result.data;
|
||||
if (settings.videoPlayerMuted == snapshot.muted &&
|
||||
settings.videoPlayerHalfVolume == snapshot.halfVolume &&
|
||||
settings.videoPlayerLoop == snapshot.loopVideo &&
|
||||
settings.videoPlayerCover == snapshot.coverVideo) {
|
||||
return;
|
||||
}
|
||||
await ref.read(settingsServiceProvider).updateSettings(
|
||||
settings.copyWith(
|
||||
videoPlayerMuted: snapshot.muted,
|
||||
videoPlayerHalfVolume: snapshot.halfVolume,
|
||||
videoPlayerLoop: snapshot.loopVideo,
|
||||
videoPlayerCover: snapshot.coverVideo,
|
||||
),
|
||||
);
|
||||
ref.invalidate(appSettingsProvider);
|
||||
}
|
||||
}
|
||||
|
||||
class _MobilePostPager extends StatefulWidget {
|
||||
@@ -573,7 +610,7 @@ class _MobilePostPagerState extends State<_MobilePostPager> {
|
||||
|
||||
Map<String, String> _headersFor(Post post) {
|
||||
return {
|
||||
'User-Agent': 'RuleGel/0.2 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
'Accept': '*/*',
|
||||
if (post.providerName.toLowerCase().contains('gelbooru') ||
|
||||
post.fileUrl.contains('gelbooru.com') ||
|
||||
|
||||
@@ -27,6 +27,7 @@ class PostMediaViewer extends StatefulWidget {
|
||||
this.initialHalfVolume = false,
|
||||
this.qualityMode = MediaQualityMode.auto,
|
||||
this.onPlaybackSnapshot,
|
||||
this.onPlaybackPreferencesChanged,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@@ -40,6 +41,7 @@ class PostMediaViewer extends StatefulWidget {
|
||||
final bool initialHalfVolume;
|
||||
final MediaQualityMode qualityMode;
|
||||
final ValueChanged<VideoPlaybackSnapshot>? onPlaybackSnapshot;
|
||||
final ValueChanged<VideoPlaybackSnapshot>? onPlaybackPreferencesChanged;
|
||||
|
||||
@override
|
||||
State<PostMediaViewer> createState() => _PostMediaViewerState();
|
||||
@@ -161,12 +163,14 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
onRetry: _retryVideo,
|
||||
onToggleFit: () {
|
||||
setState(() => _coverVideo = !_coverVideo);
|
||||
_emitPlaybackPreferences();
|
||||
_showControls();
|
||||
},
|
||||
onToggleMute: () async {
|
||||
final nextMuted = !_muted;
|
||||
setState(() => _muted = nextMuted);
|
||||
await _applyVolume();
|
||||
_emitPlaybackPreferences();
|
||||
_showControls();
|
||||
},
|
||||
onToggleHalfVolume: () async {
|
||||
@@ -175,6 +179,7 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
if (_halfVolume) _muted = false;
|
||||
});
|
||||
await _applyVolume();
|
||||
_emitPlaybackPreferences();
|
||||
_showControls();
|
||||
},
|
||||
onToggleLoop: () async {
|
||||
@@ -183,6 +188,7 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
await _player!.setPlaylistMode(
|
||||
nextLoop ? PlaylistMode.single : PlaylistMode.none,
|
||||
);
|
||||
_emitPlaybackPreferences();
|
||||
_showControls();
|
||||
},
|
||||
onFullscreen: widget.fullscreen
|
||||
@@ -342,7 +348,7 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
|
||||
Map<String, String> _headersFor(Post post) {
|
||||
return {
|
||||
'User-Agent': 'RuleGel/0.2 Flutter local booru browser',
|
||||
'User-Agent': 'Lunaris/1.1 Flutter local booru browser',
|
||||
'Accept': '*/*',
|
||||
if (post.providerName.toLowerCase().contains('gelbooru') ||
|
||||
post.fileUrl.contains('gelbooru.com') ||
|
||||
@@ -394,6 +400,7 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
coverVideo: _coverVideo,
|
||||
errorMessage: _videoError,
|
||||
onRetry: _retryVideo,
|
||||
onChanged: (_) => _emitPlaybackPreferences(),
|
||||
),
|
||||
transitionsBuilder: (_, animation, __, child) => FadeTransition(
|
||||
opacity: animation,
|
||||
@@ -414,6 +421,7 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
await player.setPlaylistMode(
|
||||
_loopVideo ? PlaylistMode.single : PlaylistMode.none,
|
||||
);
|
||||
_emitPlaybackPreferences();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -438,6 +446,13 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
: 100);
|
||||
}
|
||||
|
||||
void _emitPlaybackPreferences() {
|
||||
final snapshot = _snapshot();
|
||||
_playbackMemory[widget.post.cacheKey] = snapshot;
|
||||
widget.onPlaybackSnapshot?.call(snapshot);
|
||||
widget.onPlaybackPreferencesChanged?.call(snapshot);
|
||||
}
|
||||
|
||||
Future<void> _togglePlay() async {
|
||||
final player = _player;
|
||||
if (player == null) return;
|
||||
@@ -750,6 +765,7 @@ class _FullscreenVideoPage extends StatefulWidget {
|
||||
required this.coverVideo,
|
||||
required this.errorMessage,
|
||||
required this.onRetry,
|
||||
required this.onChanged,
|
||||
});
|
||||
|
||||
final Player player;
|
||||
@@ -761,6 +777,7 @@ class _FullscreenVideoPage extends StatefulWidget {
|
||||
final bool coverVideo;
|
||||
final String? errorMessage;
|
||||
final VoidCallback onRetry;
|
||||
final ValueChanged<VideoPlaybackSnapshot> onChanged;
|
||||
|
||||
@override
|
||||
State<_FullscreenVideoPage> createState() => _FullscreenVideoPageState();
|
||||
@@ -849,11 +866,13 @@ class _FullscreenVideoPageState extends State<_FullscreenVideoPage> {
|
||||
onRetry: widget.onRetry,
|
||||
onToggleFit: () {
|
||||
setState(() => _coverVideo = !_coverVideo);
|
||||
widget.onChanged(_snapshot());
|
||||
_showControls();
|
||||
},
|
||||
onToggleMute: () async {
|
||||
setState(() => _muted = !_muted);
|
||||
await _applyVolume();
|
||||
widget.onChanged(_snapshot());
|
||||
_showControls();
|
||||
},
|
||||
onToggleHalfVolume: () async {
|
||||
@@ -862,6 +881,7 @@ class _FullscreenVideoPageState extends State<_FullscreenVideoPage> {
|
||||
if (_halfVolume) _muted = false;
|
||||
});
|
||||
await _applyVolume();
|
||||
widget.onChanged(_snapshot());
|
||||
_showControls();
|
||||
},
|
||||
onToggleLoop: () async {
|
||||
@@ -869,6 +889,7 @@ class _FullscreenVideoPageState extends State<_FullscreenVideoPage> {
|
||||
await widget.player.setPlaylistMode(
|
||||
_loopVideo ? PlaylistMode.single : PlaylistMode.none,
|
||||
);
|
||||
widget.onChanged(_snapshot());
|
||||
_showControls();
|
||||
},
|
||||
onFullscreen: () => Navigator.of(
|
||||
|
||||
@@ -392,7 +392,7 @@ class _SettingsContent extends ConsumerWidget {
|
||||
final update = (result as Success<AppUpdateInfo?>).data;
|
||||
if (update == null) {
|
||||
messenger.showSnackBar(
|
||||
const SnackBar(content: Text('RuleGel is up to date')),
|
||||
const SnackBar(content: Text('Lunaris is up to date')),
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -407,7 +407,7 @@ class _SettingsContent extends ConsumerWidget {
|
||||
await showDialog<void>(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: Text('RuleGel ${info.version} is available'),
|
||||
title: Text('Lunaris ${info.version} is available'),
|
||||
content: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 520),
|
||||
child: SingleChildScrollView(
|
||||
@@ -454,7 +454,7 @@ class _SettingsContent extends ConsumerWidget {
|
||||
return showDialog<void>(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
title: const Text('RuleGel changelog'),
|
||||
title: const Text('Lunaris changelog'),
|
||||
content: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 560),
|
||||
child: SingleChildScrollView(
|
||||
@@ -462,7 +462,7 @@ class _SettingsContent extends ConsumerWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
for (final change in ruleGelChangelog) ...[
|
||||
for (final change in lunarisChangelog) ...[
|
||||
Text(
|
||||
'${change.version} - ${change.title}',
|
||||
style: Theme.of(context).textTheme.titleMedium,
|
||||
|
||||
Reference in New Issue
Block a user