#131 viewer max brightness option

This commit is contained in:
Thibault Deckers 2021-11-25 14:50:53 +09:00
parent 005339094b
commit b3500edd10
16 changed files with 207 additions and 81 deletions

View file

@ -797,20 +797,10 @@
"settingsSectionViewer": "Viewer",
"@settingsSectionViewer": {},
"settingsViewerShowOverlayOnOpening": "Show overlay on opening",
"@settingsViewerShowOverlayOnOpening": {},
"settingsViewerShowMinimap": "Show minimap",
"@settingsViewerShowMinimap": {},
"settingsViewerShowInformation": "Show information",
"@settingsViewerShowInformation": {},
"settingsViewerShowInformationSubtitle": "Show title, date, location, etc.",
"@settingsViewerShowInformationSubtitle": {},
"settingsViewerShowShootingDetails": "Show shooting details",
"@settingsViewerShowShootingDetails": {},
"settingsViewerEnableOverlayBlurEffect": "Overlay blur effect",
"@settingsViewerEnableOverlayBlurEffect": {},
"settingsViewerUseCutout": "Use cutout area",
"@settingsViewerUseCutout": {},
"settingsViewerMaximumBrightness": "Maximum brightness",
"@settingsViewerMaximumBrightness": {},
"settingsImageBackground": "Image background",
"@settingsImageBackground": {},
@ -827,6 +817,23 @@
"settingsViewerQuickActionEmpty": "No buttons",
"@settingsViewerQuickActionEmpty": {},
"settingsViewerOverlayTile": "Overlay",
"@settingsViewerOverlayTile": {},
"settingsViewerOverlayTitle": "Overlay",
"@settingsViewerOverlayTitle": {},
"settingsViewerShowOverlayOnOpening": "Show on opening",
"@settingsViewerShowOverlayOnOpening": {},
"settingsViewerShowMinimap": "Show minimap",
"@settingsViewerShowMinimap": {},
"settingsViewerShowInformation": "Show information",
"@settingsViewerShowInformation": {},
"settingsViewerShowInformationSubtitle": "Show title, date, location, etc.",
"@settingsViewerShowInformationSubtitle": {},
"settingsViewerShowShootingDetails": "Show shooting details",
"@settingsViewerShowShootingDetails": {},
"settingsViewerEnableOverlayBlurEffect": "Blur effect",
"@settingsViewerEnableOverlayBlurEffect": {},
"settingsVideoPageTitle": "Video Settings",
"@settingsVideoPageTitle": {},
"settingsSectionVideo": "Video",

View file

@ -375,13 +375,8 @@
"settingsCollectionSelectionQuickActionEditorBanner": "Maintenez votre doigt appuyé pour déplacer les boutons et choisir les actions affichées lors de la sélection déléments.",
"settingsSectionViewer": "Visionneuse",
"settingsViewerShowOverlayOnOpening": "Afficher les incrustations à louverture",
"settingsViewerShowMinimap": "Afficher la mini-carte",
"settingsViewerShowInformation": "Afficher les détails",
"settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.",
"settingsViewerShowShootingDetails": "Afficher les détails de prise de vue",
"settingsViewerEnableOverlayBlurEffect": "Effets de flou des incrustations",
"settingsViewerUseCutout": "Utiliser la zone dencoche",
"settingsViewerMaximumBrightness": "Luminosité maximale",
"settingsImageBackground": "Arrière-plan de limage",
"settingsViewerQuickActionsTile": "Actions rapides",
@ -391,6 +386,15 @@
"settingsViewerQuickActionEditorAvailableButtons": "Boutons disponibles",
"settingsViewerQuickActionEmpty": "Aucun bouton",
"settingsViewerOverlayTile": "Incrustations",
"settingsViewerOverlayTitle": "Incrustations",
"settingsViewerShowOverlayOnOpening": "Afficher à louverture",
"settingsViewerShowMinimap": "Afficher la mini-carte",
"settingsViewerShowInformation": "Afficher les détails",
"settingsViewerShowInformationSubtitle": "Afficher les titre, date, lieu, etc.",
"settingsViewerShowShootingDetails": "Afficher les détails de prise de vue",
"settingsViewerEnableOverlayBlurEffect": "Effets de flou",
"settingsVideoPageTitle": "Réglages vidéo",
"settingsSectionVideo": "Vidéo",
"settingsVideoShowVideos": "Afficher les vidéos",

View file

@ -22,6 +22,7 @@
"showTooltip": "보기",
"hideTooltip": "숨기기",
"removeTooltip": "제거",
"resetButtonTooltip": "복원",
"doubleBackExitMessage": "종료하려면 한번 더 누르세요.",
@ -373,13 +374,8 @@
"settingsCollectionSelectionQuickActionEditorBanner": "버튼을 길게 누른 후 이동하여 항목 선택할 때 표시될 버튼을 선택하세요.",
"settingsSectionViewer": "뷰어",
"settingsViewerShowOverlayOnOpening": "열릴 때 오버레이 표시",
"settingsViewerShowMinimap": "미니맵 표시",
"settingsViewerShowInformation": "상세 정보 표시",
"settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시",
"settingsViewerShowShootingDetails": "촬영 정보 표시",
"settingsViewerEnableOverlayBlurEffect": "오버레이 흐림 효과",
"settingsViewerUseCutout": "컷아웃 영역 사용",
"settingsViewerMaximumBrightness": "최대 밝기",
"settingsImageBackground": "이미지 배경",
"settingsViewerQuickActionsTile": "빠른 작업",
@ -389,6 +385,15 @@
"settingsViewerQuickActionEditorAvailableButtons": "추가 가능한 버튼",
"settingsViewerQuickActionEmpty": "버튼이 없습니다",
"settingsViewerOverlayTile": "오버레이",
"settingsViewerOverlayTitle": "오버레이",
"settingsViewerShowOverlayOnOpening": "열릴 때 표시",
"settingsViewerShowMinimap": "미니맵 표시",
"settingsViewerShowInformation": "상세 정보 표시",
"settingsViewerShowInformationSubtitle": "제목, 날짜, 장소 등 표시",
"settingsViewerShowShootingDetails": "촬영 정보 표시",
"settingsViewerEnableOverlayBlurEffect": "흐림 효과",
"settingsVideoPageTitle": "동영상 설정",
"settingsSectionVideo": "동영상",
"settingsVideoShowVideos": "미디어에 동영상 표시",

View file

@ -373,12 +373,6 @@
"settingsCollectionSelectionQuickActionEditorBanner": "Нажмите и удерживайте, чтобы переместить кнопки и выбрать, какие действия будут отображаться при выборе элементов.",
"settingsSectionViewer": "Просмотрщик",
"settingsViewerShowOverlayOnOpening": "Показывать наложение при открытии",
"settingsViewerShowMinimap": "Показать миникарту",
"settingsViewerShowInformation": "Показывать информацию",
"settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.",
"settingsViewerShowShootingDetails": "Показать детали съёмки",
"settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия",
"settingsViewerUseCutout": "Использовать область выреза",
"settingsImageBackground": "Фон изображения",
@ -389,6 +383,15 @@
"settingsViewerQuickActionEditorAvailableButtons": "Доступные кнопки",
"settingsViewerQuickActionEmpty": "Нет кнопок",
"settingsViewerOverlayTile": "Наложение",
"settingsViewerOverlayTitle": "Наложение",
"settingsViewerShowOverlayOnOpening": "Показывать наложение при открытии",
"settingsViewerShowMinimap": "Показать миникарту",
"settingsViewerShowInformation": "Показывать информацию",
"settingsViewerShowInformationSubtitle": "Показать название, дату, местоположение и т.д.",
"settingsViewerShowShootingDetails": "Показать детали съёмки",
"settingsViewerEnableOverlayBlurEffect": "Наложение эффекта размытия",
"settingsVideoPageTitle": "Настройки видео",
"settingsSectionVideo": "Видео",
"settingsVideoShowVideos": "Показывать видео",

View file

@ -65,6 +65,7 @@ class SettingsDefaults {
static const showOverlayShootingDetails = false;
static const enableOverlayBlurEffect = true; // `enableOverlayBlurEffect` has a contextual default value
static const viewerUseCutout = true;
static const viewerMaxBrightness = false;
// video
static const videoQuickActions = [

View file

@ -81,6 +81,7 @@ class Settings extends ChangeNotifier {
static const showOverlayShootingDetailsKey = 'show_overlay_shooting_details';
static const enableOverlayBlurEffectKey = 'enable_overlay_blur_effect';
static const viewerUseCutoutKey = 'viewer_use_cutout';
static const viewerMaxBrightnessKey = 'viewer_max_brightness';
// video
static const videoQuickActionsKey = 'video_quick_actions';
@ -352,6 +353,10 @@ class Settings extends ChangeNotifier {
set viewerUseCutout(bool newValue) => setAndNotify(viewerUseCutoutKey, newValue);
bool get viewerMaxBrightness => getBoolOrDefault(viewerMaxBrightnessKey, SettingsDefaults.viewerMaxBrightness);
set viewerMaxBrightness(bool newValue) => setAndNotify(viewerMaxBrightnessKey, newValue);
// video
List<VideoAction> get videoQuickActions => getEnumListOrDefault(videoQuickActionsKey, SettingsDefaults.videoQuickActions, VideoAction.values);
@ -587,6 +592,7 @@ class Settings extends ChangeNotifier {
case showOverlayShootingDetailsKey:
case enableOverlayBlurEffectKey:
case viewerUseCutoutKey:
case viewerMaxBrightnessKey:
case enableVideoHardwareAccelerationKey:
case enableVideoAutoPlayKey:
case subtitleShowOutlineKey:

View file

@ -132,6 +132,11 @@ class Constants {
license: 'Apache 2.0',
sourceUrl: 'https://github.com/DavBfr/dart_pdf',
),
Dependency(
name: 'Screen Brightness',
license: 'MIT',
sourceUrl: 'https://github.com/aaassseee/screen_brightness',
),
Dependency(
name: 'Shared Preferences',
license: 'BSD 3-Clause',

View file

@ -0,0 +1,91 @@
import 'package:aves/model/settings/settings.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart';
class ViewerOverlayTile extends StatelessWidget {
const ViewerOverlayTile({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(context.l10n.settingsViewerOverlayTile),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
settings: const RouteSettings(name: ViewerOverlayPage.routeName),
builder: (context) => const ViewerOverlayPage(),
),
);
},
);
}
}
class ViewerOverlayPage extends StatelessWidget {
static const routeName = '/settings/viewer_overlay';
const ViewerOverlayPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(context.l10n.settingsViewerOverlayTitle),
),
body: SafeArea(
child: ListView(
children: [
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayOnOpening,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayOnOpening = v,
title: Text(context.l10n.settingsViewerShowOverlayOnOpening),
),
),
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayMinimap,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayMinimap = v,
title: Text(context.l10n.settingsViewerShowMinimap),
),
),
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayInfo,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayInfo = v,
title: Text(context.l10n.settingsViewerShowInformation),
subtitle: Text(context.l10n.settingsViewerShowInformationSubtitle),
),
),
Selector<Settings, Tuple2<bool, bool>>(
selector: (context, s) => Tuple2(s.showOverlayInfo, s.showOverlayShootingDetails),
builder: (context, s, child) {
final showInfo = s.item1;
final current = s.item2;
return SwitchListTile(
value: current,
onChanged: showInfo ? (v) => settings.showOverlayShootingDetails = v : null,
title: Text(context.l10n.settingsViewerShowShootingDetails),
);
},
),
Selector<Settings, bool>(
selector: (context, s) => s.enableOverlayBlurEffect,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.enableOverlayBlurEffect = v,
title: Text(context.l10n.settingsViewerEnableOverlayBlurEffect),
),
),
],
),
),
);
}
}

View file

@ -7,10 +7,10 @@ import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:aves/widgets/common/identity/aves_expansion_tile.dart';
import 'package:aves/widgets/settings/common/tile_leading.dart';
import 'package:aves/widgets/settings/viewer/entry_background.dart';
import 'package:aves/widgets/settings/viewer/overlay.dart';
import 'package:aves/widgets/settings/viewer/viewer_actions_editor.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tuple/tuple.dart';
class ViewerSection extends StatelessWidget {
final ValueNotifier<String?> expandedNotifier;
@ -32,52 +32,16 @@ class ViewerSection extends StatelessWidget {
showHighlight: false,
children: [
const ViewerActionsTile(),
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayOnOpening,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayOnOpening = v,
title: Text(context.l10n.settingsViewerShowOverlayOnOpening),
),
),
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayMinimap,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayMinimap = v,
title: Text(context.l10n.settingsViewerShowMinimap),
),
),
Selector<Settings, bool>(
selector: (context, s) => s.showOverlayInfo,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.showOverlayInfo = v,
title: Text(context.l10n.settingsViewerShowInformation),
subtitle: Text(context.l10n.settingsViewerShowInformationSubtitle),
),
),
Selector<Settings, Tuple2<bool, bool>>(
selector: (context, s) => Tuple2(s.showOverlayInfo, s.showOverlayShootingDetails),
builder: (context, s, child) {
final showInfo = s.item1;
final current = s.item2;
return SwitchListTile(
value: current,
onChanged: showInfo ? (v) => settings.showOverlayShootingDetails = v : null,
title: Text(context.l10n.settingsViewerShowShootingDetails),
);
},
),
Selector<Settings, bool>(
selector: (context, s) => s.enableOverlayBlurEffect,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.enableOverlayBlurEffect = v,
title: Text(context.l10n.settingsViewerEnableOverlayBlurEffect),
),
),
const ViewerOverlayTile(),
const _CutoutModeSwitch(),
Selector<Settings, bool>(
selector: (context, s) => s.viewerMaxBrightness,
builder: (context, current, child) => SwitchListTile(
value: current,
onChanged: (v) => settings.viewerMaxBrightness = v,
title: Text(context.l10n.settingsViewerMaximumBrightness),
),
),
Selector<Settings, EntryBackground>(
selector: (context, s) => s.imageBackground,
builder: (context, current, child) => ListTile(

View file

@ -1,5 +1,6 @@
import 'dart:async';
import 'dart:math';
import 'dart:ui';
import 'package:aves/model/entry.dart';
import 'package:aves/model/settings/settings.dart';
@ -12,6 +13,7 @@ import 'package:aves/widgets/viewer/info/notifications.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:screen_brightness/screen_brightness.dart';
class ViewerVerticalPageView extends StatefulWidget {
final CollectionLens? collection;
@ -42,6 +44,7 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
final ValueNotifier<bool> _isVerticallyScrollingNotifier = ValueNotifier(false);
Timer? _verticalScrollMonitoringTimer;
AvesEntry? _oldEntry;
Future<double>? _systemBrightness;
CollectionLens? get collection => widget.collection;
@ -49,10 +52,16 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
AvesEntry? get entry => widget.entryNotifier.value;
static const double maximumBrightness = 1.0;
@override
void initState() {
super.initState();
_registerWidget(widget);
if (settings.viewerMaxBrightness) {
_systemBrightness = ScreenBrightness().system;
}
}
@override
@ -144,9 +153,18 @@ class _ViewerVerticalPageViewState extends State<ViewerVerticalPageView> {
}
void _onVerticalPageControllerChanged() {
final opacity = min(1.0, widget.verticalPager.page!);
final page = widget.verticalPager.page!;
final opacity = min(1.0, page);
_backgroundColorNotifier.value = _backgroundColorNotifier.value.withOpacity(opacity * opacity);
if (page <= 1 && settings.viewerMaxBrightness) {
_systemBrightness?.then((system) {
final transition = max(system, lerpDouble(system, maximumBrightness, page / 2)!);
ScreenBrightness().setScreenBrightness(transition);
});
}
_isVerticallyScrollingNotifier.value = true;
_stopScrollMonitoringTimer();
_verticalScrollMonitoringTimer = Timer(Durations.infoScrollMonitoringTimerDelay, () {

View file

@ -34,6 +34,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:screen_brightness/screen_brightness.dart';
class EntryViewerStack extends StatefulWidget {
final CollectionLens? collection;
@ -83,6 +84,9 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
if (!settings.viewerUseCutout) {
windowService.setCutoutMode(false);
}
if (settings.viewerMaxBrightness) {
ScreenBrightness().setScreenBrightness(1);
}
if (settings.keepScreenOn == KeepScreenOn.viewerOnly) {
windowService.keepScreenOn(true);
}
@ -521,6 +525,9 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
if (!settings.viewerUseCutout) {
windowService.setCutoutMode(true);
}
if (settings.viewerMaxBrightness) {
ScreenBrightness().resetScreenBrightness();
}
if (settings.keepScreenOn == KeepScreenOn.viewerOnly) {
windowService.keepScreenOn(false);
}

View file

@ -115,7 +115,7 @@ packages:
source: sdk
version: "0.0.99"
stack_trace:
dependency: transitive
dependency: "direct main"
description:
name: stack_trace
url: "https://pub.dartlang.org"

View file

@ -13,6 +13,7 @@ dependencies:
path: ../aves_report
firebase_core:
firebase_crashlytics:
stack_trace:
dev_dependencies:
flutter_lints:

View file

@ -861,6 +861,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1+1"
screen_brightness:
dependency: "direct main"
description:
name: screen_brightness
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.1"
screen_brightness_platform_interface:
dependency: transitive
description:
name: screen_brightness_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.2"
shared_preferences:
dependency: "direct main"
description:
@ -986,7 +1000,7 @@ packages:
source: hosted
version: "2.0.1+1"
stack_trace:
dependency: "direct main"
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"

View file

@ -57,9 +57,9 @@ dependencies:
permission_handler:
printing:
provider:
screen_brightness:
shared_preferences:
sqflite:
stack_trace:
streams_channel:
git:
url: git://github.com/deckerst/aves_streams_channel.git

View file

@ -1,6 +1,5 @@
{
"ko": [
"resetButtonTooltip",
"entryInfoActionEditTags",
"tagEditorPageTitle",
"tagEditorPageNewTagFieldLabel",
@ -10,6 +9,7 @@
"ru": [
"resetButtonTooltip",
"entryInfoActionEditTags",
"settingsViewerMaximumBrightness",
"tagEditorPageTitle",
"tagEditorPageNewTagFieldLabel",
"tagEditorPageAddTagTooltip"