Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added toolbar position dropdown #272

Merged
merged 5 commits into from
Dec 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions lib/core/pages/settings_details.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'package:dairy_app/features/auth/presentation/bloc/auth_session/auth_sess
import 'package:dairy_app/features/auth/presentation/widgets/security_settings.dart';
import 'package:dairy_app/features/notes/presentation/widgets/daily_reminders.dart';
import 'package:dairy_app/features/notes/presentation/widgets/export_notes.dart';
import 'package:dairy_app/features/notes/presentation/widgets/toolbar_position_dropdown.dart';
import 'package:dairy_app/features/sync/presentation/widgets/sync_settings.dart';
import 'package:dairy_app/generated/l10n.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -157,12 +158,14 @@ class _SettingsDetailPageState extends State<SettingsDetailPage> {
return [
const SizedBox(height: 10),
const ThemeDropdown(),
const SizedBox(height: 15),
const SizedBox(height: 20),
const FontDropdown(),
const SizedBox(height: 15),
const SizedBox(height: 20),
const LanguageDropDown(),
const SizedBox(height: 15),
const SizedBox(height: 20),
const VoiceDropdown(),
const SizedBox(height: 20),
const ToolbarPositionDropdown()
];
case SettingCategoriesConstants.importAndExport:
return [
Expand Down
7 changes: 4 additions & 3 deletions lib/core/widgets/voice_dropdown.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:dairy_app/app/themes/theme_extensions/note_create_page_theme_extensions.dart';
import 'package:dairy_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_tts/flutter_tts.dart';
Expand All @@ -18,15 +19,15 @@ class _VoiceDropdownState extends State<VoiceDropdown> {
final FlutterTts _flutterTts = FlutterTts();
List<Map>? _voices;
Map? selectedVoice;
final bool _isInitialized = false;
bool _isInitialized = false;

@override
void didChangeDependencies() {
super.didChangeDependencies();

if (!_isInitialized) {
_initTts();
// _isInitialized = true;
_isInitialized = true;
}
}

Expand Down Expand Up @@ -68,7 +69,7 @@ class _VoiceDropdownState extends State<VoiceDropdown> {
return Row(
children: [
Text(
'Select Voice',
S.current.selectVoice,
style: TextStyle(
fontSize: 16.0,
color: mainTextColor,
Expand Down
1 change: 1 addition & 0 deletions lib/features/auth/core/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class UserConfigConstants {
static String noteSortType = "note_sort_type";
static String nextCloudUserInfo = "next_cloud_user_info";
static String lastNextCloudSync = "last_next_cloud_sync";
static String toolbarPosition = "toolbar_position";
}

class SyncConstants {
Expand Down
71 changes: 38 additions & 33 deletions lib/features/auth/data/models/user_config_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ class UserConfigModel extends Equatable {
final String? nextCloudUserInfo;
final DateTime? lastNextCloudSync;
final Map<String, dynamic>? prefKeyVoice;
final String? toolbarPosition;

const UserConfigModel({
required this.userId,
Expand All @@ -60,6 +61,7 @@ class UserConfigModel extends Equatable {
this.nextCloudUserInfo,
this.lastNextCloudSync,
this.prefKeyVoice,
this.toolbarPosition,
});
@override
List<Object?> get props => [
Expand All @@ -79,6 +81,7 @@ class UserConfigModel extends Equatable {
nextCloudUserInfo,
lastNextCloudSync,
prefKeyVoice,
toolbarPosition,
];

static TimeOfDay? getTimeOfDayFromTimeString(String? timeString) {
Expand Down Expand Up @@ -112,39 +115,40 @@ class UserConfigModel extends Equatable {

factory UserConfigModel.fromJson(Map<String, dynamic> jsonMap) {
return UserConfigModel(
prefKeyVoice: jsonMap[UserConfigConstants.prefKeyVoice],
userId: jsonMap[UserConfigConstants.userId],
preferredSyncOption: jsonMap[UserConfigConstants.preferredSyncOption],
lastGoogleDriveSync:
jsonMap[UserConfigConstants.lastGoogleDriveSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastGoogleDriveSync])
: null,
lastDropboxSync: jsonMap[UserConfigConstants.lastDropboxSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastDropboxSync])
: null,
googleDriveUserInfo: jsonMap[UserConfigConstants.googleDriveUserInfo],
dropBoxUserInfo: jsonMap[UserConfigConstants.dropBoxUserInfo],
isAutoSyncEnabled: jsonMap[UserConfigConstants.isAutoSyncEnabled],
isFingerPrintLoginEnabled:
jsonMap[UserConfigConstants.isFingerPrintLoginEnabled],
isPINLoginEnabled: jsonMap[UserConfigConstants.isPINLoginEnabled],
isAutoSaveEnabled: jsonMap[UserConfigConstants.isAutoSaveEnabled],
isDailyReminderEnabled:
jsonMap[UserConfigConstants.isDailyReminderEnabled],
reminderTime:
getTimeOfDayFromTimeString(jsonMap[UserConfigConstants.reminderTime]),
noteSortType: jsonMap[UserConfigConstants.noteSortType] != null
? NoteSortType.fromStringValue(
jsonMap[UserConfigConstants.noteSortType])
: null,
nextCloudUserInfo: jsonMap[UserConfigConstants.nextCloudUserInfo],
lastNextCloudSync: jsonMap[UserConfigConstants.lastNextCloudSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastNextCloudSync])
: null,
);
prefKeyVoice: jsonMap[UserConfigConstants.prefKeyVoice],
userId: jsonMap[UserConfigConstants.userId],
preferredSyncOption: jsonMap[UserConfigConstants.preferredSyncOption],
lastGoogleDriveSync:
jsonMap[UserConfigConstants.lastGoogleDriveSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastGoogleDriveSync])
: null,
lastDropboxSync: jsonMap[UserConfigConstants.lastDropboxSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastDropboxSync])
: null,
googleDriveUserInfo: jsonMap[UserConfigConstants.googleDriveUserInfo],
dropBoxUserInfo: jsonMap[UserConfigConstants.dropBoxUserInfo],
isAutoSyncEnabled: jsonMap[UserConfigConstants.isAutoSyncEnabled],
isFingerPrintLoginEnabled:
jsonMap[UserConfigConstants.isFingerPrintLoginEnabled],
isPINLoginEnabled: jsonMap[UserConfigConstants.isPINLoginEnabled],
isAutoSaveEnabled: jsonMap[UserConfigConstants.isAutoSaveEnabled],
isDailyReminderEnabled:
jsonMap[UserConfigConstants.isDailyReminderEnabled],
reminderTime: getTimeOfDayFromTimeString(
jsonMap[UserConfigConstants.reminderTime]),
noteSortType: jsonMap[UserConfigConstants.noteSortType] != null
? NoteSortType.fromStringValue(
jsonMap[UserConfigConstants.noteSortType])
: null,
nextCloudUserInfo: jsonMap[UserConfigConstants.nextCloudUserInfo],
lastNextCloudSync:
jsonMap[UserConfigConstants.lastNextCloudSync] != null
? DateTime.fromMillisecondsSinceEpoch(
jsonMap[UserConfigConstants.lastNextCloudSync])
: null,
toolbarPosition: jsonMap[UserConfigConstants.toolbarPosition]);
}

Map<String, dynamic> toJson() {
Expand All @@ -168,6 +172,7 @@ class UserConfigModel extends Equatable {
UserConfigConstants.nextCloudUserInfo: nextCloudUserInfo,
UserConfigConstants.lastNextCloudSync:
lastNextCloudSync?.millisecondsSinceEpoch,
UserConfigConstants.toolbarPosition: toolbarPosition
};
}
}
51 changes: 38 additions & 13 deletions lib/features/notes/presentation/widgets/rich_text_editor.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import 'dart:async';
import 'dart:io';
import 'dart:ui';

import 'package:dairy_app/app/themes/theme_extensions/note_create_page_theme_extensions.dart';
import 'package:dairy_app/core/widgets/glass_dialog.dart';
import 'package:dairy_app/core/widgets/glassmorphism_cover.dart';
import 'package:dairy_app/features/auth/presentation/bloc/font/font_cubit.dart';
import 'package:dairy_app/features/auth/presentation/bloc/user_config/user_config_cubit.dart';
import 'package:dairy_app/features/notes/data/models/notes_model.dart';
import 'package:dairy_app/features/notes/presentation/bloc/notes/notes_bloc.dart';
import 'package:dairy_app/features/notes/presentation/widgets/audio_recorder_popup.dart';
Expand Down Expand Up @@ -86,6 +88,11 @@ class _RichTextEditorState extends State<RichTextEditor> {
.extension<NoteCreatePageThemeExtensions>()!
.titleTextBoxBorderColor;

final userConfigCubit = context.watch<UserConfigCubit>();

final _isToolbarPositionTop =
userConfigCubit.state.userConfigModel?.toolbarPosition != 'Bottom';

return Expanded(
child: Container(
decoration: BoxDecoration(
Expand All @@ -102,22 +109,31 @@ class _RichTextEditorState extends State<RichTextEditor> {
),
child: Column(
mainAxisSize: MainAxisSize.min,
verticalDirection: _isToolbarPositionTop
? VerticalDirection.down
: VerticalDirection.up,
children: [
GlassMorphismCover(
displayShadow: false,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
topRight: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
bottomLeft: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
bottomRight: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
),
child: Container(
child: Toolbar(
controller: widget.controller!,
notesBloc: notesBloc,
),
decoration: BoxDecoration(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
topRight: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
bottomLeft:
Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
bottomRight:
Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
),
gradient: LinearGradient(
colors: [
Expand Down Expand Up @@ -469,19 +485,28 @@ class GlassPaneForEditor extends StatelessWidget {

final fontCubit = BlocProvider.of<FontCubit>(context);

final userConfigCubit = context.watch<UserConfigCubit>();

final _isToolbarPositionTop =
userConfigCubit.state.userConfigModel?.toolbarPosition != 'Bottom';

return GlassMorphismCover(
displayShadow: false,
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(16.0),
bottomRight: Radius.circular(16.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
topRight: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
bottomLeft: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
bottomRight: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
),
child: Container(
height: MediaQuery.of(context).size.height,
padding: const EdgeInsets.only(left: 10, right: 10, top: 0, bottom: 5),
padding: const EdgeInsets.only(left: 10, right: 10, top: 15, bottom: 5),
decoration: BoxDecoration(
borderRadius: const BorderRadius.only(
bottomLeft: Radius.circular(16.0),
bottomRight: Radius.circular(16.0),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
topRight: Radius.circular(_isToolbarPositionTop ? 0 : 16.0),
bottomLeft: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
bottomRight: Radius.circular(_isToolbarPositionTop ? 16.0 : 0),
),
gradient: LinearGradient(
colors: [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import 'package:dairy_app/app/themes/theme_extensions/note_create_page_theme_extensions.dart';
import 'package:dairy_app/features/auth/core/constants.dart';
import 'package:dairy_app/features/auth/presentation/bloc/user_config/user_config_cubit.dart';
import 'package:dairy_app/generated/l10n.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class ToolbarPositionDropdown extends StatelessWidget {
const ToolbarPositionDropdown({Key? key}) : super(key: key);

@override
Widget build(BuildContext context) {
final userConfigCubit = context.watch<UserConfigCubit>();
final mainTextColor = Theme.of(context)
.extension<NoteCreatePageThemeExtensions>()!
.mainTextColor;

return Row(
children: [
Text(
S.current.toolbarPosition,
style: TextStyle(
fontSize: 16.0,
color: mainTextColor,
),
),
const Spacer(),
PopupMenuButton<String>(
padding: const EdgeInsets.only(bottom: 0.0),
onSelected: (value) async {
userConfigCubit.setUserConfig(
UserConfigConstants.toolbarPosition, value);
},
itemBuilder: (context) => ["Top", "Bottom"].map((toolbarPosition) {
return PopupMenuItem<String>(
value: toolbarPosition,
child: Text(
toolbarPosition,
style: TextStyle(color: mainTextColor),
),
);
}).toList(),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
userConfigCubit.state.userConfigModel?.toolbarPosition ?? 'Top',
style: TextStyle(
color: mainTextColor,
fontSize: 16,
),
),
const SizedBox(width: 10),
Icon(
Icons.keyboard_arrow_down,
color: mainTextColor,
),
],
),
),
],
);
}
}
3 changes: 3 additions & 0 deletions lib/generated/intl/messages_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ class MessageLookup extends MessageLookupByLibrary {
"security": MessageLookupByLibrary.simpleMessage("Security"),
"securitySettings":
MessageLookupByLibrary.simpleMessage("Security Settings"),
"selectVoice": MessageLookupByLibrary.simpleMessage("Select Voice"),
"sendFeedback": MessageLookupByLibrary.simpleMessage("Send feedback"),
"settings": MessageLookupByLibrary.simpleMessage("Settings"),
"setupYourAccount":
Expand Down Expand Up @@ -202,6 +203,8 @@ class MessageLookup extends MessageLookupByLibrary {
"to": MessageLookupByLibrary.simpleMessage("To"),
"tooManyWrongAttempts": MessageLookupByLibrary.simpleMessage(
"Too many wrong attempts, please login with password"),
"toolbarPosition":
MessageLookupByLibrary.simpleMessage("Toolbar Position"),
"unexpectedErrorOccured":
MessageLookupByLibrary.simpleMessage("Unexpected error occured"),
"video": MessageLookupByLibrary.simpleMessage("Video"),
Expand Down
20 changes: 20 additions & 0 deletions lib/generated/l10n.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion lib/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -127,5 +127,7 @@
"security": "Security",
"reminders": "Reminders",
"themeFontsAndLanguage": "Customize Theme, Fonts and Language",
"importAndExportNotes": "Import and Export Notes"
"importAndExportNotes": "Import and Export Notes",
"selectVoice": "Select Voice",
"toolbarPosition": "Toolbar Position"
}
Loading