Skip to content
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
4 changes: 4 additions & 0 deletions commet/lib/config/preferences.dart
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,10 @@ class Preferences {
DoublePreference emojiPickerHeight =
DoublePreference("emoji_picker_height", defaultValue: 300);

DoublePreference customOnscreenKeyboardViewOffset = DoublePreference(
"custom_onscreen_keyboard_view_offset",
defaultValue: 0.0);

StringPreference proxyUrl =
StringPreference("proxy_url", defaultValue: "proxy.commet.chat");

Expand Down
66 changes: 36 additions & 30 deletions commet/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ import 'package:commet/ui/pages/login/login_page.dart';
import 'package:commet/ui/pages/main/main_page.dart';
import 'package:commet/ui/pages/setup/menus/check_for_updates.dart';
import 'package:commet/utils/android_intent_helper.dart';
import 'package:commet/utils/custom_safe_area.dart';
import 'package:commet/utils/custom_uri.dart';
import 'package:commet/utils/background_tasks/background_task_manager.dart';
import 'package:commet/utils/database/database_server.dart';
import 'package:commet/utils/emoji/unicode_emoji.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:commet/utils/first_time_setup.dart';
import 'package:commet/utils/focus_node_monitor.dart';
import 'package:commet/utils/scaled_app.dart';
import 'package:commet/utils/shortcuts_manager.dart';
import 'package:commet/utils/system_wide_shortcuts/system_wide_shortcuts.dart';
Expand Down Expand Up @@ -310,36 +312,40 @@ class App extends StatelessWidget {

@override
Widget build(BuildContext context) {
return TextScaleChanger(
child: ThemeChanger(
shouldFollowSystemTheme: () =>
preferences.shouldFollowSystemTheme.value,
getDarkTheme: () {
return preferences.resolveTheme(
overrideBrightness: Brightness.dark);
},
getLightTheme: () {
return preferences.resolveTheme(
overrideBrightness: Brightness.light);
},
initialTheme: initialTheme ?? ThemeDark.theme,
materialAppBuilder: (context, theme) {
return MaterialApp(
title: 'Commet',
theme: theme,
debugShowCheckedModeBanner: false,
navigatorKey: navigator,
builder: (context, child) => Provider<ClientManager>(
create: (context) => clientManager,
child: child,
),
home: AppView(
clientManager: clientManager,
initialClientId: initialClientId,
initialRoom: initialRoom,
),
);
}),
return CustomSafeArea(
child: FocusNodeMonitor(
child: TextScaleChanger(
child: ThemeChanger(
shouldFollowSystemTheme: () =>
preferences.shouldFollowSystemTheme.value,
getDarkTheme: () {
return preferences.resolveTheme(
overrideBrightness: Brightness.dark);
},
getLightTheme: () {
return preferences.resolveTheme(
overrideBrightness: Brightness.light);
},
initialTheme: initialTheme ?? ThemeDark.theme,
materialAppBuilder: (context, theme) {
return MaterialApp(
title: 'Commet',
theme: theme,
debugShowCheckedModeBanner: false,
navigatorKey: navigator,
builder: (context, child) => Provider<ClientManager>(
create: (context) => clientManager,
child: child,
),
home: AppView(
clientManager: clientManager,
initialClientId: initialClientId,
initialRoom: initialRoom,
),
);
}),
),
),
);
}
}
Expand Down
1 change: 1 addition & 0 deletions commet/lib/ui/molecules/direct_message_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class _DirectMessageListState extends State<DirectMessageList> {
return ImplicitlyAnimatedList(
itemData: rooms,
initialAnimation: false,
padding: EdgeInsets.zero,
itemBuilder: (context, room) {
final component = room.client.getComponent<DirectMessagesComponent>();
final id = component?.getDirectMessagePartnerId(room);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@ class _RoomQuickAccessMenuViewDesktopState
}

void onChanged(event) {
setState(() {});
if (mounted) setState(() {});
}
}
2 changes: 2 additions & 0 deletions commet/lib/ui/pages/main/main_page_view_desktop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,8 @@ class MainPageViewDesktop extends StatelessWidget {
Widget buildRoomPicker(BuildContext context) {
if (state.currentSpace == null) {
return ScaledSafeArea(
top: true,
bottom: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:commet/main.dart';
import 'package:commet/ui/navigation/navigation_utils.dart';
import 'package:commet/ui/pages/developer/benchmarks/timeline_viewer_benchmark.dart';
import 'package:commet/ui/pages/settings/categories/app/boolean_toggle.dart';
import 'package:commet/ui/pages/settings/categories/app/double_preference_slider.dart';
import 'package:commet/ui/pages/settings/categories/developer/cumulative_diagnostics_widget.dart';
import 'package:commet/utils/background_tasks/background_task_manager.dart';
import 'package:commet/utils/background_tasks/mock_tasks.dart';
Expand Down Expand Up @@ -52,7 +53,15 @@ class _DeveloperSettingsPageState extends State<DeveloperSettingsPage> {
title: "Disable Text Cursor Management",
description:
"As part of the implementaton for the rich text editor, we sometimes have to make automated changes to the text cursor. This disables that",
)
),
DoublePreferenceSlider(
preference: preferences.customOnscreenKeyboardViewOffset,
title: "Keyboard Offset",
min: 0.0,
max: 1000,
description:
"Amount to shift the app view up by when the onscreen keyboard is shown",
)
],
),
)
Expand Down Expand Up @@ -145,6 +154,10 @@ class _DeveloperSettingsPageState extends State<DeveloperSettingsPage> {
text: "1280x720",
onTap: () => windowManager.setSize(const Size(1280, 720)),
),
tiamat.Button(
text: "1280x800 (Steamdeck)",
onTap: () => windowManager.setSize(const Size(1280, 800)),
),
tiamat.Button(
text: "1920x1080",
onTap: () => windowManager.setSize(const Size(1920, 1080)),
Expand Down
49 changes: 49 additions & 0 deletions commet/lib/utils/custom_safe_area.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import 'package:commet/main.dart';
import 'package:commet/utils/event_bus.dart';
import 'package:flutter/material.dart';

class CustomSafeArea extends StatefulWidget {
const CustomSafeArea({required this.child, super.key});
final Widget child;

@override
State<CustomSafeArea> createState() => _CustomSafeAreaState();
}

class _CustomSafeAreaState extends State<CustomSafeArea> {
bool isTextFieldFocused = false;

@override
void initState() {
EventBus.onTextFieldFocused.stream.listen(onTextFieldFocused);
super.initState();
}

@override
Widget build(BuildContext context) {
if (preferences.customOnscreenKeyboardViewOffset.value == 0) {
return widget.child;
}

var query = MediaQuery.of(context);

return MediaQuery(
data: query.copyWith(
viewPadding: EdgeInsets.fromLTRB(
0,
0,
0,
isTextFieldFocused
? preferences.customOnscreenKeyboardViewOffset.value
: 0)),
child: widget.child);
}

void onTextFieldFocused(bool event) {
if (event != isTextFieldFocused) {
setState(() {
isTextFieldFocused = event;
});
}
}
}
3 changes: 3 additions & 0 deletions commet/lib/utils/event_bus.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ class EventBus {
static StreamController<Client?> setFilterClient =
StreamController.broadcast();

static StreamController<bool> onTextFieldFocused =
StreamController.broadcast();

/// Called when the user initially logs in to the app, or on app startup when atleast one user account is already logged in
static StreamController<BuildContext> onLoggedIn =
StreamController<BuildContext>.broadcast();
Expand Down
43 changes: 43 additions & 0 deletions commet/lib/utils/focus_node_monitor.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:commet/utils/event_bus.dart';
import 'package:flutter/material.dart';

class FocusNodeMonitor extends StatefulWidget {
const FocusNodeMonitor({required this.child, super.key});
final Widget child;

@override
State<FocusNodeMonitor> createState() => _FocusNodeMonitorState();
}

class _FocusNodeMonitorState extends State<FocusNodeMonitor> {
@override
void initState() {
FocusManager.instance.addListener(onFocusChanged);
super.initState();
}

@override
Widget build(BuildContext context) {
return widget.child;
}

void onFocusChanged() {
var focus = FocusManager.instance.primaryFocus;
bool isText = isEditableTextFocused(focus);
EventBus.onTextFieldFocused.add(isText);
}

bool isEditableTextFocused(FocusNode? focus) {
if (focus?.context?.widget case Focus widget) {
if (widget.child case NotificationListener listener) {
if (listener.child case Scrollable scrollable) {
if (scrollable.restorationId == "editable") {
return true;
}
}
}
}

return false;
}
}