Prevent Layout Errors Caused By Pathological Unicode
This commit is contained in:
parent
8ef40af6ad
commit
af2815957d
|
@ -159,7 +159,6 @@ class CwtchFfi implements Cwtch {
|
||||||
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
|
cwtchDir = envVars['CWTCH_HOME'] ?? path.join(envVars['HOME']!, ".cwtch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (await File("linux/Tor/tor").exists()) {
|
if (await File("linux/Tor/tor").exists()) {
|
||||||
bundledTor = "linux/Tor/tor";
|
bundledTor = "linux/Tor/tor";
|
||||||
} else if (await File("lib/Tor/tor").exists()) {
|
} else if (await File("lib/Tor/tor").exists()) {
|
||||||
|
@ -788,7 +787,6 @@ class CwtchFfi implements Cwtch {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String? defaultDownloadPath() {
|
String? defaultDownloadPath() {
|
||||||
|
|
||||||
Map<String, String> envVars = Platform.environment;
|
Map<String, String> envVars = Platform.environment;
|
||||||
String nominalPath = path.join(envVars[Platform.isWindows ? 'UserProfile' : 'HOME']!, "Downloads");
|
String nominalPath = path.join(envVars[Platform.isWindows ? 'UserProfile' : 'HOME']!, "Downloads");
|
||||||
if (Directory(nominalPath).existsSync() == false) {
|
if (Directory(nominalPath).existsSync() == false) {
|
||||||
|
|
|
@ -71,7 +71,6 @@ class FlwtchState extends State<Flwtch> with WindowListener {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
initState() {
|
initState() {
|
||||||
|
|
||||||
globalSettings = Settings(Locale("en", ''), CwtchDark());
|
globalSettings = Settings(Locale("en", ''), CwtchDark());
|
||||||
globalErrorHandler = ErrorHandler();
|
globalErrorHandler = ErrorHandler();
|
||||||
globalTorStatus = TorStatus();
|
globalTorStatus = TorStatus();
|
||||||
|
@ -204,7 +203,8 @@ class FlwtchState extends State<Flwtch> with WindowListener {
|
||||||
print("Exiting...");
|
print("Exiting...");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt
|
// Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt
|
||||||
|
|
|
@ -69,5 +69,4 @@ class ProfileServerListState extends ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<RemoteServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
List<RemoteServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,6 @@ class ServerListState extends ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
List<ServerInfoState> get servers => _servers.sublist(0); //todo: copy?? dont want caller able to bypass changenotifier
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class ServerInfoState extends ChangeNotifier {
|
class ServerInfoState extends ChangeNotifier {
|
||||||
|
|
|
@ -154,7 +154,6 @@ class NixNotificationManager implements NotificationsManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
NotificationsManager newDesktopNotificationsManager(Future<void> Function(String profileOnion, int convoId) notificationSelectConvo) {
|
NotificationsManager newDesktopNotificationsManager(Future<void> Function(String profileOnion, int convoId) notificationSelectConvo) {
|
||||||
|
|
||||||
// We don't want notifications in Dev Mode
|
// We don't want notifications in Dev Mode
|
||||||
if (EnvironmentConfig.TEST_MODE) {
|
if (EnvironmentConfig.TEST_MODE) {
|
||||||
return NullNotificationsManager();
|
return NullNotificationsManager();
|
||||||
|
|
|
@ -294,47 +294,50 @@ class SelectableLinkify extends StatelessWidget {
|
||||||
linkifiers: linkifiers,
|
linkifiers: linkifiers,
|
||||||
);
|
);
|
||||||
|
|
||||||
return SelectableText.rich(
|
return Container(
|
||||||
buildTextSpan(
|
clipBehavior: Clip.hardEdge,
|
||||||
elements,
|
decoration: BoxDecoration(),
|
||||||
style: Theme.of(context).textTheme.bodyText2?.merge(style),
|
child: SelectableText.rich(
|
||||||
codeStyle: Theme.of(context).textTheme.bodyText2?.merge(codeStyle),
|
buildTextSpan(
|
||||||
onOpen: onOpen,
|
elements,
|
||||||
context: context,
|
style: Theme.of(context).textTheme.bodyText2?.merge(style),
|
||||||
linkStyle: Theme.of(context)
|
codeStyle: Theme.of(context).textTheme.bodyText2?.merge(codeStyle),
|
||||||
.textTheme
|
onOpen: onOpen,
|
||||||
.bodyText2
|
context: context,
|
||||||
?.merge(style)
|
linkStyle: Theme.of(context)
|
||||||
.copyWith(
|
.textTheme
|
||||||
color: Colors.blueAccent,
|
.bodyText2
|
||||||
decoration: TextDecoration.underline,
|
?.merge(style)
|
||||||
)
|
.copyWith(
|
||||||
.merge(linkStyle),
|
color: Colors.blueAccent,
|
||||||
),
|
decoration: TextDecoration.underline,
|
||||||
textAlign: textAlign,
|
)
|
||||||
textDirection: textDirection,
|
.merge(linkStyle),
|
||||||
minLines: minLines,
|
),
|
||||||
maxLines: maxLines,
|
textAlign: textAlign,
|
||||||
focusNode: focusNode,
|
textDirection: textDirection,
|
||||||
strutStyle: strutStyle,
|
minLines: minLines,
|
||||||
showCursor: showCursor,
|
maxLines: maxLines,
|
||||||
textScaleFactor: textScaleFactor,
|
focusNode: focusNode,
|
||||||
autofocus: autofocus,
|
strutStyle: strutStyle,
|
||||||
toolbarOptions: toolbarOptions,
|
showCursor: showCursor,
|
||||||
cursorWidth: cursorWidth,
|
textScaleFactor: textScaleFactor,
|
||||||
cursorRadius: cursorRadius,
|
autofocus: autofocus,
|
||||||
cursorColor: cursorColor,
|
toolbarOptions: toolbarOptions,
|
||||||
dragStartBehavior: dragStartBehavior,
|
cursorWidth: cursorWidth,
|
||||||
enableInteractiveSelection: enableInteractiveSelection,
|
cursorRadius: cursorRadius,
|
||||||
onTap: onTap,
|
cursorColor: cursorColor,
|
||||||
scrollPhysics: scrollPhysics,
|
dragStartBehavior: dragStartBehavior,
|
||||||
textWidthBasis: textWidthBasis,
|
enableInteractiveSelection: enableInteractiveSelection,
|
||||||
textHeightBehavior: textHeightBehavior,
|
onTap: onTap,
|
||||||
cursorHeight: cursorHeight,
|
scrollPhysics: scrollPhysics,
|
||||||
selectionControls: selectionControls,
|
textWidthBasis: textWidthBasis,
|
||||||
onSelectionChanged: onSelectionChanged,
|
textHeightBehavior: textHeightBehavior,
|
||||||
style: style,
|
cursorHeight: cursorHeight,
|
||||||
);
|
selectionControls: selectionControls,
|
||||||
|
onSelectionChanged: onSelectionChanged,
|
||||||
|
style: style,
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -128,7 +128,7 @@ class _GlobalSettingsViewState extends State<GlobalSettingsView> {
|
||||||
items: AppLocalizations.supportedLocales.map<DropdownMenuItem<String>>((Locale value) {
|
items: AppLocalizations.supportedLocales.map<DropdownMenuItem<String>>((Locale value) {
|
||||||
return DropdownMenuItem<String>(
|
return DropdownMenuItem<String>(
|
||||||
value: value.toString(),
|
value: value.toString(),
|
||||||
child: Text( key: Key("dropdownLanguage" + value.languageCode), getLanguageFull(context, value.languageCode, value.countryCode)),
|
child: Text(key: Key("dropdownLanguage" + value.languageCode), getLanguageFull(context, value.languageCode, value.countryCode)),
|
||||||
);
|
);
|
||||||
}).toList()))),
|
}).toList()))),
|
||||||
SwitchListTile(
|
SwitchListTile(
|
||||||
|
|
|
@ -46,7 +46,11 @@ class _GroupSettingsViewState extends State<GroupSettingsView> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(Provider.of<ContactInfoState>(context).nickname + " " + AppLocalizations.of(context)!.conversationSettings),
|
title: Container(
|
||||||
|
height: 24,
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
decoration: BoxDecoration(),
|
||||||
|
child: Text(Provider.of<ContactInfoState>(context).nickname + " " + AppLocalizations.of(context)!.conversationSettings)),
|
||||||
),
|
),
|
||||||
body: _buildSettingsList(),
|
body: _buildSettingsList(),
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
import 'dart:ui';
|
import 'dart:ui';
|
||||||
import 'package:crypto/crypto.dart';
|
import 'package:crypto/crypto.dart';
|
||||||
import 'package:cwtch/cwtch/cwtch.dart';
|
import 'package:cwtch/cwtch/cwtch.dart';
|
||||||
|
@ -208,10 +209,15 @@ class _MessageViewState extends State<MessageView> {
|
||||||
width: 10,
|
width: 10,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Container(
|
||||||
Provider.of<ContactInfoState>(context).nickname,
|
height: 24,
|
||||||
overflow: TextOverflow.ellipsis,
|
clipBehavior: Clip.hardEdge,
|
||||||
))
|
decoration: BoxDecoration(),
|
||||||
|
child: Text(
|
||||||
|
Provider.of<ContactInfoState>(context).nickname,
|
||||||
|
overflow: TextOverflow.clip,
|
||||||
|
maxLines: 1,
|
||||||
|
)))
|
||||||
]),
|
]),
|
||||||
actions: appBarButtons,
|
actions: appBarButtons,
|
||||||
),
|
),
|
||||||
|
@ -574,7 +580,7 @@ class _MessageViewState extends State<MessageView> {
|
||||||
keyboardType: TextInputType.multiline,
|
keyboardType: TextInputType.multiline,
|
||||||
enableIMEPersonalizedLearning: false,
|
enableIMEPersonalizedLearning: false,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
maxLength: (isGroup ? GroupMessageLengthMax : P2PMessageLengthMax) - numberOfBytesMoreThanChar,
|
maxLength: max(1, (isGroup ? GroupMessageLengthMax : P2PMessageLengthMax) - numberOfBytesMoreThanChar),
|
||||||
maxLengthEnforcement: MaxLengthEnforcement.enforced,
|
maxLengthEnforcement: MaxLengthEnforcement.enforced,
|
||||||
maxLines: 3,
|
maxLines: 3,
|
||||||
onFieldSubmitted: _sendMessage,
|
onFieldSubmitted: _sendMessage,
|
||||||
|
|
|
@ -47,7 +47,7 @@ class _PeerSettingsViewState extends State<PeerSettingsView> {
|
||||||
}
|
}
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(handle + " " + AppLocalizations.of(context)!.conversationSettings),
|
title: Container(height: 24, clipBehavior: Clip.hardEdge, decoration: BoxDecoration(), child: Text(handle + " " + AppLocalizations.of(context)!.conversationSettings)),
|
||||||
),
|
),
|
||||||
body: _buildSettingsList(),
|
body: _buildSettingsList(),
|
||||||
);
|
);
|
||||||
|
|
|
@ -44,42 +44,47 @@ class _CwtchButtonTextFieldState extends State<CwtchButtonTextField> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Consumer<Settings>(builder: (context, theme, child) {
|
return Consumer<Settings>(builder: (context, theme, child) {
|
||||||
return TextFormField(
|
return Container(
|
||||||
key: widget.testKey,
|
clipBehavior: Clip.antiAlias,
|
||||||
controller: widget.controller,
|
decoration: BoxDecoration(),
|
||||||
readOnly: widget.readonly,
|
child: TextFormField(
|
||||||
showCursor: !widget.readonly,
|
key: widget.testKey,
|
||||||
focusNode: _focusNode,
|
controller: widget.controller,
|
||||||
enableIMEPersonalizedLearning: false,
|
readOnly: widget.readonly,
|
||||||
onChanged: widget.onChanged,
|
showCursor: !widget.readonly,
|
||||||
decoration: InputDecoration(
|
focusNode: _focusNode,
|
||||||
labelText: widget.labelText,
|
enableIMEPersonalizedLearning: false,
|
||||||
labelStyle: TextStyle(color: theme.current().mainTextColor, backgroundColor: theme.current().textfieldBackgroundColor),
|
onChanged: widget.onChanged,
|
||||||
suffixIcon: IconButton(
|
maxLines: 1,
|
||||||
onPressed: widget.onPressed,
|
style: TextStyle(overflow: TextOverflow.clip),
|
||||||
icon: widget.icon,
|
decoration: InputDecoration(
|
||||||
splashRadius: Material.defaultSplashRadius / 2,
|
labelText: widget.labelText,
|
||||||
padding: EdgeInsets.fromLTRB(0.0, 4.0, 2.0, 2.0),
|
labelStyle: TextStyle(color: theme.current().mainTextColor, backgroundColor: theme.current().textfieldBackgroundColor),
|
||||||
tooltip: widget.tooltip,
|
suffixIcon: IconButton(
|
||||||
enableFeedback: true,
|
onPressed: widget.onPressed,
|
||||||
color: theme.current().mainTextColor,
|
icon: widget.icon,
|
||||||
highlightColor: theme.current().defaultButtonColor,
|
splashRadius: Material.defaultSplashRadius / 2,
|
||||||
focusColor: theme.current().defaultButtonActiveColor,
|
padding: EdgeInsets.fromLTRB(0.0, 4.0, 2.0, 2.0),
|
||||||
splashColor: theme.current().defaultButtonActiveColor,
|
tooltip: widget.tooltip,
|
||||||
),
|
enableFeedback: true,
|
||||||
floatingLabelBehavior: FloatingLabelBehavior.never,
|
color: theme.current().mainTextColor,
|
||||||
filled: true,
|
highlightColor: theme.current().defaultButtonColor,
|
||||||
fillColor: theme.current().textfieldBackgroundColor,
|
focusColor: theme.current().defaultButtonActiveColor,
|
||||||
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0)),
|
splashColor: theme.current().defaultButtonActiveColor,
|
||||||
focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
),
|
||||||
errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
floatingLabelBehavior: FloatingLabelBehavior.never,
|
||||||
errorStyle: TextStyle(
|
filled: true,
|
||||||
color: theme.current().textfieldErrorColor,
|
fillColor: theme.current().textfieldBackgroundColor,
|
||||||
fontWeight: FontWeight.bold,
|
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0)),
|
||||||
),
|
focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
||||||
contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
|
errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
||||||
enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0))),
|
errorStyle: TextStyle(
|
||||||
);
|
color: theme.current().textfieldErrorColor,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
|
||||||
|
enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0))),
|
||||||
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,17 +64,22 @@ class _ContactRowState extends State<ContactRow> {
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Container(
|
||||||
contact.nickname, //(contact.isInvitation ? "invite " : "non-invite ") + (contact.isBlocked ? "blokt" : "nonblokt"),//
|
height: 24,
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
decoration: BoxDecoration(),
|
||||||
|
child: Text(
|
||||||
|
contact.nickname, //(contact.isInvitation ? "invite " : "non-invite ") + (contact.isBlocked ? "blokt" : "nonblokt"),//
|
||||||
|
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: Provider.of<Settings>(context).theme.contactOnionTextSize(),
|
fontSize: Provider.of<Settings>(context).theme.contactOnionTextSize(),
|
||||||
color: contact.isBlocked
|
color: contact.isBlocked
|
||||||
? Provider.of<Settings>(context).theme.portraitBlockedTextColor
|
? Provider.of<Settings>(context).theme.portraitBlockedTextColor
|
||||||
: Provider.of<Settings>(context).theme.mainTextColor), //Provider.of<FlwtchState>(context).biggerFont,
|
: Provider.of<Settings>(context).theme.mainTextColor), //Provider.of<FlwtchState>(context).biggerFont,
|
||||||
softWrap: true,
|
softWrap: true,
|
||||||
overflow: TextOverflow.visible,
|
overflow: TextOverflow.clip,
|
||||||
),
|
maxLines: 1,
|
||||||
|
)),
|
||||||
syncStatus ?? Container(),
|
syncStatus ?? Container(),
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: !Provider.of<Settings>(context).streamerMode,
|
visible: !Provider.of<Settings>(context).streamerMode,
|
||||||
|
|
|
@ -144,8 +144,12 @@ class FileBubbleState extends State<FileBubble> {
|
||||||
return LayoutBuilder(builder: (bcontext, constraints) {
|
return LayoutBuilder(builder: (bcontext, constraints) {
|
||||||
var wdgSender = Visibility(
|
var wdgSender = Visibility(
|
||||||
visible: widget.interactive,
|
visible: widget.interactive,
|
||||||
child: SelectableText(senderDisplayStr + '\u202F',
|
child: Container(
|
||||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor)));
|
height: 11,
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
decoration: BoxDecoration(),
|
||||||
|
child: SelectableText(senderDisplayStr + '\u202F',
|
||||||
|
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor))));
|
||||||
var isPreview = false;
|
var isPreview = false;
|
||||||
var wdgMessage = !showFileSharing
|
var wdgMessage = !showFileSharing
|
||||||
? Text(AppLocalizations.of(context)!.messageEnableFileSharing)
|
? Text(AppLocalizations.of(context)!.messageEnableFileSharing)
|
||||||
|
|
|
@ -42,8 +42,17 @@ class MessageBubbleState extends State<MessageBubble> {
|
||||||
senderDisplayStr = Provider.of<MessageMetadata>(context).senderHandle;
|
senderDisplayStr = Provider.of<MessageMetadata>(context).senderHandle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var wdgSender = SelectableText(senderDisplayStr,
|
var wdgSender = Container(
|
||||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor));
|
height: 11,
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
decoration: BoxDecoration(),
|
||||||
|
child: SelectableText(senderDisplayStr,
|
||||||
|
maxLines: 1,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 9.0,
|
||||||
|
overflow: TextOverflow.clip,
|
||||||
|
color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor,
|
||||||
|
)));
|
||||||
|
|
||||||
var wdgMessage = SelectableLinkify(
|
var wdgMessage = SelectableLinkify(
|
||||||
text: widget.content + '\u202F',
|
text: widget.content + '\u202F',
|
||||||
|
|
|
@ -44,13 +44,17 @@ class _ProfileRowState extends State<ProfileRow> {
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Container(
|
||||||
profile.nickname,
|
height: 24,
|
||||||
semanticsLabel: profile.nickname,
|
clipBehavior: Clip.hardEdge,
|
||||||
style: Provider.of<FlwtchState>(context).biggerFont,
|
decoration: BoxDecoration(),
|
||||||
softWrap: true,
|
child: Text(
|
||||||
overflow: TextOverflow.ellipsis,
|
profile.nickname,
|
||||||
),
|
semanticsLabel: profile.nickname,
|
||||||
|
style: Provider.of<FlwtchState>(context).biggerFont,
|
||||||
|
softWrap: true,
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
)),
|
||||||
Visibility(
|
Visibility(
|
||||||
visible: !Provider.of<Settings>(context).streamerMode,
|
visible: !Provider.of<Settings>(context).streamerMode,
|
||||||
child: ExcludeSemantics(
|
child: ExcludeSemantics(
|
||||||
|
|
|
@ -43,8 +43,12 @@ class QuotedMessageBubbleState extends State<QuotedMessageBubble> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var wdgSender = SelectableText(senderDisplayStr,
|
var wdgSender = Container(
|
||||||
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor));
|
height: 11,
|
||||||
|
clipBehavior: Clip.hardEdge,
|
||||||
|
decoration: BoxDecoration(),
|
||||||
|
child: SelectableText(senderDisplayStr,
|
||||||
|
style: TextStyle(fontSize: 9.0, color: fromMe ? Provider.of<Settings>(context).theme.messageFromMeTextColor : Provider.of<Settings>(context).theme.messageFromOtherTextColor)));
|
||||||
|
|
||||||
var showClickableLinks = Provider.of<Settings>(context).isExperimentEnabled(ClickableLinksExperiment);
|
var showClickableLinks = Provider.of<Settings>(context).isExperimentEnabled(ClickableLinksExperiment);
|
||||||
var formatMessages = Provider.of<Settings>(context).isExperimentEnabled(FormattingExperiment);
|
var formatMessages = Provider.of<Settings>(context).isExperimentEnabled(FormattingExperiment);
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
@ -42,37 +43,41 @@ class _CwtchTextFieldState extends State<CwtchTextField> {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Consumer<Settings>(builder: (context, theme, child) {
|
return Consumer<Settings>(builder: (context, theme, child) {
|
||||||
return TextFormField(
|
return Container(
|
||||||
key: widget.testKey,
|
clipBehavior: Clip.antiAlias,
|
||||||
controller: widget.controller,
|
decoration: BoxDecoration(),
|
||||||
validator: widget.validator,
|
child: TextFormField(
|
||||||
onChanged: widget.onChanged,
|
key: widget.testKey,
|
||||||
autofocus: widget.autofocus,
|
controller: widget.controller,
|
||||||
autovalidateMode: AutovalidateMode.onUserInteraction,
|
validator: widget.validator,
|
||||||
textAlign: widget.number ? TextAlign.end : TextAlign.start,
|
onChanged: widget.onChanged,
|
||||||
keyboardType: widget.multiLine
|
autofocus: widget.autofocus,
|
||||||
? TextInputType.multiline
|
autovalidateMode: AutovalidateMode.onUserInteraction,
|
||||||
: widget.number
|
textAlign: widget.number ? TextAlign.end : TextAlign.start,
|
||||||
? TextInputType.number
|
keyboardType: widget.multiLine
|
||||||
: TextInputType.text,
|
? TextInputType.multiline
|
||||||
inputFormatters: widget.number ? <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly] : null,
|
: widget.number
|
||||||
maxLines: widget.multiLine ? null : 1,
|
? TextInputType.number
|
||||||
scrollController: _scrollController,
|
: TextInputType.text,
|
||||||
enableIMEPersonalizedLearning: false,
|
inputFormatters: widget.number ? <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly] : null,
|
||||||
focusNode: _focusNode,
|
maxLines: widget.multiLine ? null : 1,
|
||||||
decoration: InputDecoration(
|
scrollController: _scrollController,
|
||||||
errorMaxLines: 2,
|
enableIMEPersonalizedLearning: false,
|
||||||
hintText: widget.hintText,
|
focusNode: _focusNode,
|
||||||
floatingLabelBehavior: FloatingLabelBehavior.never,
|
style: TextStyle(overflow: TextOverflow.clip),
|
||||||
filled: true,
|
decoration: InputDecoration(
|
||||||
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0)),
|
errorMaxLines: 2,
|
||||||
focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
hintText: widget.hintText,
|
||||||
errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
floatingLabelBehavior: FloatingLabelBehavior.never,
|
||||||
errorStyle: TextStyle(color: theme.current().textfieldErrorColor, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),
|
filled: true,
|
||||||
fillColor: theme.current().textfieldBackgroundColor,
|
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0)),
|
||||||
contentPadding: EdgeInsets.fromLTRB(10.0, 5.0, 10.0, 5.0),
|
focusedErrorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
||||||
enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0))),
|
errorBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldErrorColor, width: 1.0)),
|
||||||
);
|
errorStyle: TextStyle(color: theme.current().textfieldErrorColor, fontWeight: FontWeight.bold, overflow: TextOverflow.visible),
|
||||||
|
fillColor: theme.current().textfieldBackgroundColor,
|
||||||
|
contentPadding: EdgeInsets.fromLTRB(10.0, 5.0, 10.0, 5.0),
|
||||||
|
enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(6.0), borderSide: BorderSide(color: theme.current().textfieldBorderColor, width: 1.0))),
|
||||||
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue