Init repo

This commit is contained in:
PartyDonut 2024-09-15 14:12:28 +02:00
commit 764b6034e3
566 changed files with 212335 additions and 0 deletions

View file

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
class SettingsLabelDivider extends ConsumerWidget {
final String label;
const SettingsLabelDivider({required this.label, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8).add(
EdgeInsets.symmetric(
horizontal: MediaQuery.paddingOf(context).horizontal,
),
),
child: Text(
label,
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.primary,
),
),
);
}
}

View file

@ -0,0 +1,47 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
enum MessageType {
info,
warning,
error;
Color color(BuildContext context) {
switch (this) {
case info:
return Theme.of(context).colorScheme.surface;
case warning:
return Theme.of(context).colorScheme.primaryContainer;
case error:
return Theme.of(context).colorScheme.errorContainer;
}
}
}
class SettingsMessageBox extends ConsumerWidget {
final String message;
final MessageType messageType;
const SettingsMessageBox(this.message, {this.messageType = MessageType.info, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
return SizedBox(
width: double.infinity,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8).add(
EdgeInsets.symmetric(
horizontal: MediaQuery.paddingOf(context).horizontal,
),
),
child: Card(
elevation: 2,
color: messageType.color(context),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(message),
),
),
),
);
}
}

View file

@ -0,0 +1,94 @@
import 'package:fladder/models/settings/subtitle_settings_model.dart';
import 'package:fladder/providers/settings/subtitle_settings_provider.dart';
import 'package:fladder/providers/settings/video_player_settings_provider.dart';
import 'package:fladder/screens/video_player/components/video_subtitle_controls.dart';
import 'package:fladder/util/adaptive_layout.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/widgets/navigation_scaffold/components/fladder_appbar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// ignore: depend_on_referenced_packages
class SubtitleEditor extends ConsumerStatefulWidget {
const SubtitleEditor({super.key});
@override
ConsumerState<ConsumerStatefulWidget> createState() => _SubtitleEditorState();
}
class _SubtitleEditorState extends ConsumerState<SubtitleEditor> {
@override
Widget build(BuildContext context) {
final settings = ref.watch(subtitleSettingsProvider);
final fillScreen = ref.watch(videoPlayerSettingsProvider.select((value) => value.fillScreen));
final padding = MediaQuery.of(context).padding;
final fakeText = context.localized.subtitleConfiguratorPlaceHolder;
double lastScale = 0.0;
return Scaffold(
body: Dialog.fullscreen(
child: GestureDetector(
onScaleUpdate: (details) {
lastScale = details.scale;
},
onScaleEnd: (details) {
if (lastScale < 1.0) {
ref.read(videoPlayerSettingsProvider.notifier).setFillScreen(false, context: context);
} else if (lastScale > 1.0) {
ref.read(videoPlayerSettingsProvider.notifier).setFillScreen(true, context: context);
}
lastScale = 0.0;
},
child: Stack(
children: [
Padding(
padding: (fillScreen ? EdgeInsets.zero : EdgeInsets.only(left: padding.left, right: padding.right)),
child: const Center(
child: AspectRatio(
aspectRatio: 2.1,
child: Card(
child: Image(
image: BlurHashImage('LEF}}|0000~p8w~W%N4n~pIU4o%g'),
fit: BoxFit.fill,
),
),
),
),
),
SubtitleText(subModel: settings, padding: padding, offset: settings.verticalOffset, text: fakeText),
Align(
alignment: Alignment.topCenter,
child: Padding(
padding:
MediaQuery.paddingOf(context).add(const EdgeInsets.all(32).add(const EdgeInsets.only(top: 48))),
child: SizedBox(
width: MediaQuery.sizeOf(context).width * 0.95,
child: const VideoSubtitleControls(),
),
),
),
Padding(
padding: MediaQuery.paddingOf(context),
child: Column(
children: [
if (AdaptiveLayout.of(context).isDesktop) const FladderAppbar(),
Row(
children: [
const BackButton(),
Text(
context.localized.subtitleConfigurator,
style: Theme.of(context).textTheme.headlineMedium,
)
],
)
],
),
),
],
),
),
),
);
}
}