1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-26 06:49:22 +00:00

Can change conversation color

This commit is contained in:
Pierre HUBERT 2021-03-13 10:09:17 +01:00
parent d8b2dd2599
commit f54cc22fc6
5 changed files with 117 additions and 1 deletions

View File

@ -0,0 +1,54 @@
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
/// Color picker dialog
///
/// @author Pierre Hubert
Future<Color> showColorPickerDialog(
BuildContext context, Color initialColor) async =>
await showDialog(
context: context,
builder: (c) => _ColorPickerDialog(initialColor: initialColor),
);
class _ColorPickerDialog extends StatefulWidget {
final Color initialColor;
const _ColorPickerDialog({Key key, @required this.initialColor})
: super(key: key);
@override
__ColorPickerDialogState createState() => __ColorPickerDialogState();
}
class __ColorPickerDialogState extends State<_ColorPickerDialog> {
Color _newColor;
@override
void initState() {
_newColor = widget.initialColor;
super.initState();
}
@override
Widget build(BuildContext context) {
return AlertDialog(
content: MaterialPicker(
pickerColor: _newColor ?? Colors.blue.shade900,
onColorChanged: (c) => setState(() => _newColor = c),
),
actions: [
MaterialButton(
onPressed: () => Navigator.pop(context, widget.initialColor),
child: Text(tr("Cancel").toUpperCase()),
),
MaterialButton(
onPressed: () => Navigator.pop(context, _newColor),
child: Text(tr("Ok").toUpperCase()),
),
],
);
}
}

View File

@ -1,9 +1,13 @@
import 'package:comunic/lists/users_list.dart'; import 'package:comunic/lists/users_list.dart';
import 'package:comunic/models/conversation.dart'; import 'package:comunic/models/conversation.dart';
import 'package:comunic/models/user.dart'; import 'package:comunic/models/user.dart';
import 'package:comunic/ui/dialogs/color_picker_dialog.dart';
import 'package:comunic/ui/tiles/simple_user_tile.dart'; import 'package:comunic/ui/tiles/simple_user_tile.dart';
import 'package:comunic/ui/widgets/pick_user_widget.dart'; import 'package:comunic/ui/widgets/pick_user_widget.dart';
import 'package:comunic/utils/color_utils.dart';
import 'package:comunic/utils/dart_color.dart';
import 'package:comunic/utils/intl_utils.dart'; import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/log_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// Create / Update conversation screen /// Create / Update conversation screen
@ -28,10 +32,24 @@ class UpdateConversationScreen extends StatefulWidget {
class _UpdateConversationScreen extends State<UpdateConversationScreen> { class _UpdateConversationScreen extends State<UpdateConversationScreen> {
TextEditingController _nameController = TextEditingController(); TextEditingController _nameController = TextEditingController();
TextEditingController _colorController = TextEditingController();
UsersList _members = UsersList(); UsersList _members = UsersList();
bool _followConversation = true; bool _followConversation = true;
bool _canEveryoneAddMembers = true; bool _canEveryoneAddMembers = true;
String get _conversationColor => _colorController.text;
Color get _color {
if (_conversationColor == null || _conversationColor.isEmpty) return null;
try {
return HexColor(_conversationColor);
} catch (e, s) {
logError(e, s);
return null;
}
}
get isUpdating => widget.initialSettings != null; get isUpdating => widget.initialSettings != null;
get isAdmin => !isUpdating || widget.initialSettings.isAdmin; get isAdmin => !isUpdating || widget.initialSettings.isAdmin;
@ -64,12 +82,27 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
TextField( TextField(
controller: _nameController, controller: _nameController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: tr("Conversation name (optionnal)"), labelText: tr("Conversation name (optional)"),
alignLabelWithHint: true, alignLabelWithHint: true,
enabled: isAdmin, enabled: isAdmin,
), ),
), ),
// Conversation color
TextField(
controller: _colorController,
onChanged: (s) => setState(() {}),
decoration: InputDecoration(
labelText: tr("Conversation color (optional)"),
alignLabelWithHint: true,
enabled: isAdmin,
suffixIcon: IconButton(
icon: Icon(Icons.colorize),
color: _color,
onPressed: isAdmin ? _pickColor : null,
)),
),
// Follow conversation ? // Follow conversation ?
Row( Row(
children: <Widget>[ children: <Widget>[
@ -149,6 +182,12 @@ class _UpdateConversationScreen extends State<UpdateConversationScreen> {
); );
} }
void _pickColor() async {
final color = await showColorPickerDialog(context, _color);
setState(() =>
_colorController.text = color == null ? "" : "#${colorToHex(color)}");
}
/// An option of the members menu has been selected /// An option of the members menu has been selected
void _membersMenuItemSelected(User user, _MembersMenuChoices choice) { void _membersMenuItemSelected(User user, _MembersMenuChoices choice) {
if (choice == null) return; if (choice == null) return;

View File

@ -0,0 +1,13 @@
import 'dart:ui';
/// Color utilities
///
/// @author Pierre Hubert
String colorToHex(Color color) {
if (color == null) return "";
return color.red.toRadixString(16).padLeft(2, '0') +
color.green.toRadixString(16).padLeft(2, '0') +
color.blue.toRadixString(16).padLeft(2, '0');
}

View File

@ -237,6 +237,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
flutter_colorpicker:
dependency: "direct main"
description:
name: flutter_colorpicker
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
flutter_emoji: flutter_emoji:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -121,6 +121,9 @@ dependencies:
# Emojies picker # Emojies picker
emoji_picker: ^0.1.0 emoji_picker: ^0.1.0
# Color picker
flutter_colorpicker: ^0.3.5
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter