fix: Popup menu without elevation

This commit is contained in:
Christian Pauly 2022-09-10 12:11:11 +02:00
parent 0b90e1ff88
commit 7f6c914fca
10 changed files with 80 additions and 30 deletions

View File

@ -10,6 +10,7 @@ import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import '../../widgets/m2_popup_menu_button.dart';
import 'chat.dart'; import 'chat.dart';
import 'input_bar.dart'; import 'input_bar.dart';
@ -89,7 +90,7 @@ class ChatInputRow extends StatelessWidget {
alignment: Alignment.center, alignment: Alignment.center,
clipBehavior: Clip.hardEdge, clipBehavior: Clip.hardEdge,
decoration: const BoxDecoration(), decoration: const BoxDecoration(),
child: PopupMenuButton<String>( child: M2PopupMenuButton<String>(
icon: const Icon(Icons.add_outlined), icon: const Icon(Icons.add_outlined),
onSelected: controller.onAddPopupMenuButtonSelected, onSelected: controller.onAddPopupMenuButtonSelected,
itemBuilder: (BuildContext context) => itemBuilder: (BuildContext context) =>
@ -295,7 +296,7 @@ class _ChatAccountPicker extends StatelessWidget {
padding: const EdgeInsets.all(8.0), padding: const EdgeInsets.all(8.0),
child: FutureBuilder<Profile>( child: FutureBuilder<Profile>(
future: controller.sendingClient!.fetchOwnProfile(), future: controller.sendingClient!.fetchOwnProfile(),
builder: (context, snapshot) => PopupMenuButton<String>( builder: (context, snapshot) => M2PopupMenuButton<String>(
onSelected: _popupMenuButtonSelected, onSelected: _popupMenuButtonSelected,
itemBuilder: (BuildContext context) => clients itemBuilder: (BuildContext context) => clients
.map((client) => PopupMenuItem<String>( .map((client) => PopupMenuItem<String>(

View File

@ -21,6 +21,7 @@ import 'package:fluffychat/widgets/connection_status_header.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import 'package:fluffychat/widgets/unread_badge_back_button.dart'; import 'package:fluffychat/widgets/unread_badge_back_button.dart';
import '../../utils/stream_extension.dart'; import '../../utils/stream_extension.dart';
import '../../widgets/m2_popup_menu_button.dart';
import 'chat_emoji_picker.dart'; import 'chat_emoji_picker.dart';
import 'chat_input_row.dart'; import 'chat_input_row.dart';
@ -65,7 +66,7 @@ class ChatView extends StatelessWidget {
tooltip: L10n.of(context)!.pinMessage, tooltip: L10n.of(context)!.pinMessage,
), ),
if (controller.selectedEvents.length == 1) if (controller.selectedEvents.length == 1)
PopupMenuButton<_EventContextAction>( M2PopupMenuButton<_EventContextAction>(
onSelected: (action) { onSelected: (action) {
switch (action) { switch (action) {
case _EventContextAction.info: case _EventContextAction.info:

View File

@ -16,6 +16,7 @@ import 'package:fluffychat/widgets/content_banner.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import '../../utils/url_launcher.dart'; import '../../utils/url_launcher.dart';
import '../../widgets/m2_popup_menu_button.dart';
class ChatDetailsView extends StatelessWidget { class ChatDetailsView extends StatelessWidget {
final ChatDetailsController controller; final ChatDetailsController controller;
@ -197,7 +198,7 @@ class ChatDetailsView extends StatelessWidget {
Text(L10n.of(context)!.setCustomEmotes), Text(L10n.of(context)!.setCustomEmotes),
onTap: controller.goToEmoteSettings, onTap: controller.goToEmoteSettings,
), ),
PopupMenuButton( M2PopupMenuButton(
onSelected: controller.setJoinRulesAction, onSelected: controller.setJoinRulesAction,
itemBuilder: (BuildContext context) => itemBuilder: (BuildContext context) =>
<PopupMenuEntry<JoinRules>>[ <PopupMenuEntry<JoinRules>>[
@ -231,7 +232,7 @@ class ChatDetailsView extends StatelessWidget {
), ),
), ),
), ),
PopupMenuButton( M2PopupMenuButton(
onSelected: onSelected:
controller.setHistoryVisibilityAction, controller.setHistoryVisibilityAction,
itemBuilder: (BuildContext context) => itemBuilder: (BuildContext context) =>
@ -284,7 +285,7 @@ class ChatDetailsView extends StatelessWidget {
), ),
), ),
if (room.joinRules == JoinRules.public) if (room.joinRules == JoinRules.public)
PopupMenuButton( M2PopupMenuButton(
onSelected: controller.setGuestAccessAction, onSelected: controller.setGuestAccessAction,
itemBuilder: (BuildContext context) => itemBuilder: (BuildContext context) =>
<PopupMenuEntry<GuestAccess>>[ <PopupMenuEntry<GuestAccess>>[

View File

@ -9,6 +9,7 @@ import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import '../../utils/matrix_sdk_extensions.dart/device_extension.dart'; import '../../utils/matrix_sdk_extensions.dart/device_extension.dart';
import '../../widgets/m2_popup_menu_button.dart';
class ChatEncryptionSettingsView extends StatelessWidget { class ChatEncryptionSettingsView extends StatelessWidget {
final ChatEncryptionSettingsController controller; final ChatEncryptionSettingsController controller;
@ -73,7 +74,7 @@ class ChatEncryptionSettingsView extends StatelessWidget {
deviceKeys[i].userId != deviceKeys[i].userId !=
deviceKeys[i - 1].userId) ...{ deviceKeys[i - 1].userId) ...{
const Divider(height: 1, thickness: 1), const Divider(height: 1, thickness: 1),
PopupMenuButton( M2PopupMenuButton(
onSelected: (dynamic action) => controller onSelected: (dynamic action) => controller
.onSelected(context, action, deviceKeys[i]), .onSelected(context, action, deviceKeys[i]),
itemBuilder: (c) { itemBuilder: (c) {
@ -115,7 +116,7 @@ class ChatEncryptionSettingsView extends StatelessWidget {
), ),
), ),
}, },
PopupMenuButton( M2PopupMenuButton(
onSelected: (dynamic action) => controller onSelected: (dynamic action) => controller
.onSelected(context, action, deviceKeys[i]), .onSelected(context, action, deviceKeys[i]),
itemBuilder: (c) { itemBuilder: (c) {

View File

@ -9,6 +9,7 @@ import 'package:vrouter/vrouter.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart'; import 'package:fluffychat/widgets/matrix.dart';
import '../../utils/fluffy_share.dart'; import '../../utils/fluffy_share.dart';
import '../../widgets/m2_popup_menu_button.dart';
import 'chat_list.dart'; import 'chat_list.dart';
class ClientChooserButton extends StatelessWidget { class ClientChooserButton extends StatelessWidget {
@ -191,12 +192,7 @@ class ClientChooserButton extends StatelessWidget {
onKeysPressed: () => _previousAccount(matrix, context), onKeysPressed: () => _previousAccount(matrix, context),
child: Container(), child: Container(),
), ),
Theme( M2PopupMenuButton<Object>(
data: Theme.of(context),
child: PopupMenuButton<Object>(
shape: Border.all(
color: Theme.of(context).dividerColor,
),
onSelected: (o) => _clientSelected(o, context), onSelected: (o) => _clientSelected(o, context),
itemBuilder: _bundleMenuItems, itemBuilder: _bundleMenuItems,
child: Material( child: Material(
@ -211,7 +207,6 @@ class ClientChooserButton extends StatelessWidget {
), ),
), ),
), ),
),
], ],
), ),
); );

View File

@ -14,6 +14,7 @@ import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/utils/string_color.dart';
import 'package:fluffychat/utils/url_launcher.dart'; import 'package:fluffychat/utils/url_launcher.dart';
import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/avatar.dart';
import '../../widgets/m2_popup_menu_button.dart';
class StoryView extends StatelessWidget { class StoryView extends StatelessWidget {
final StoryPageController controller; final StoryPageController controller;
@ -101,7 +102,7 @@ class StoryView extends StatelessWidget {
icon: Icon(Icons.adaptive.share_outlined), icon: Icon(Icons.adaptive.share_outlined),
onPressed: controller.share, onPressed: controller.share,
), ),
PopupMenuButton<PopupStoryAction>( M2PopupMenuButton<PopupStoryAction>(
color: Colors.white, color: Colors.white,
onSelected: controller.onPopupStoryAction, onSelected: controller.onPopupStoryAction,
itemBuilder: (context) => [ itemBuilder: (context) => [

View File

@ -9,6 +9,7 @@ import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/fluffy_share.dart';
import '../../utils/matrix_sdk_extensions.dart/presence_extension.dart'; import '../../utils/matrix_sdk_extensions.dart/presence_extension.dart';
import '../../widgets/content_banner.dart'; import '../../widgets/content_banner.dart';
import '../../widgets/m2_popup_menu_button.dart';
import '../../widgets/matrix.dart'; import '../../widgets/matrix.dart';
import 'user_bottom_sheet.dart'; import 'user_bottom_sheet.dart';
@ -43,7 +44,7 @@ class UserBottomSheetView extends StatelessWidget {
title: Text(user.calcDisplayname()), title: Text(user.calcDisplayname()),
actions: [ actions: [
if (user.id != client.userID) if (user.id != client.userID)
PopupMenuButton( M2PopupMenuButton(
itemBuilder: (_) => [ itemBuilder: (_) => [
if (controller.widget.onMention != null) if (controller.widget.onMention != null)
PopupMenuItem( PopupMenuItem(

View File

@ -14,6 +14,7 @@ import 'package:vrouter/vrouter.dart';
import 'package:fluffychat/pages/chat/cupertino_widgets_bottom_sheet.dart'; import 'package:fluffychat/pages/chat/cupertino_widgets_bottom_sheet.dart';
import 'package:fluffychat/pages/chat/edit_widgets_dialog.dart'; import 'package:fluffychat/pages/chat/edit_widgets_dialog.dart';
import 'package:fluffychat/pages/chat/widgets_bottom_sheet.dart'; import 'package:fluffychat/pages/chat/widgets_bottom_sheet.dart';
import 'm2_popup_menu_button.dart';
import 'matrix.dart'; import 'matrix.dart';
class ChatSettingsPopupMenu extends StatefulWidget { class ChatSettingsPopupMenu extends StatefulWidget {
@ -125,7 +126,7 @@ class ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
onKeysPressed: _showWidgets, onKeysPressed: _showWidgets,
child: Container(), child: Container(),
), ),
PopupMenuButton( M2PopupMenuButton(
onSelected: (String choice) async { onSelected: (String choice) async {
switch (choice) { switch (choice) {
case 'widgets': case 'widgets':

View File

@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'm2_popup_menu_button.dart';
class LogViewer extends StatefulWidget { class LogViewer extends StatefulWidget {
const LogViewer({Key? key}) : super(key: key); const LogViewer({Key? key}) : super(key: key);
@ -32,7 +34,7 @@ class LogViewerState extends State<LogViewer> {
icon: const Icon(Icons.zoom_out_outlined), icon: const Icon(Icons.zoom_out_outlined),
onPressed: () => setState(() => fontSize--), onPressed: () => setState(() => fontSize--),
), ),
PopupMenuButton<Level>( M2PopupMenuButton<Level>(
itemBuilder: (context) => Level.values itemBuilder: (context) => Level.values
.map((level) => PopupMenuItem( .map((level) => PopupMenuItem(
value: level, value: level,

View File

@ -0,0 +1,46 @@
import 'package:flutter/material.dart';
class M2PopupMenuButton<T> extends StatelessWidget {
final List<PopupMenuEntry<T>> Function(BuildContext) itemBuilder;
final T? initialValue;
final void Function(T)? onSelected;
final void Function()? onCanceled;
final Widget? icon;
final Color? color;
final Widget? child;
const M2PopupMenuButton({
Key? key,
required this.itemBuilder,
this.initialValue,
this.onSelected,
this.onCanceled,
this.icon,
this.color,
this.child,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Theme(
data: theme.copyWith(
useMaterial3: false,
popupMenuTheme: PopupMenuThemeData(
color: theme.colorScheme.surface,
elevation: theme.appBarTheme.scrolledUnderElevation,
textStyle: theme.textTheme.bodyText1,
),
),
child: PopupMenuButton<T>(
itemBuilder: itemBuilder,
initialValue: initialValue,
onSelected: onSelected,
onCanceled: onCanceled,
icon: icon,
color: color,
child: child,
),
);
}
}