Skip to content

Commit cee4e73

Browse files
committed
Redesign send message area
1 parent 8ac1bfd commit cee4e73

File tree

3 files changed

+98
-45
lines changed

3 files changed

+98
-45
lines changed

Signal-Windows/Controls/Conversation.xaml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
</DataTemplate>
2424
<local:MessageTemplateSelector x:Key="MessageDataTemplateSelector" NormalMessage="{StaticResource NormalMessageTemplate}" UnreadMarker="{StaticResource UnreadMarkerTemplate}" IdentityKeyChangeMessage="{StaticResource IdentityKeyChangeTemplate}" />
2525
</Control.Resources>
26-
<Grid>
26+
<Grid Background="White">
2727
<Grid.RowDefinitions>
2828
<RowDefinition Height="50" />
2929
<RowDefinition Height="*" />
30-
<RowDefinition Height="40" />
30+
<RowDefinition Height="50" />
3131
</Grid.RowDefinitions>
3232
<Border Grid.Row="0" Background="{x:Bind HeaderBackground, Mode=OneWay}">
3333
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
@@ -45,6 +45,15 @@
4545
</ItemsControl.ItemsPanel>
4646
</ItemsControl>
4747
</ScrollViewer>
48-
<TextBox Grid.Row="2" Name="InputTextBox" VerticalAlignment="Bottom" KeyDown="TextBox_KeyDown"></TextBox>
48+
<Grid Grid.Row="2" BorderBrush="{ThemeResource TextBoxBorderThemeBrush}" BorderThickness="0,1,0,0">
49+
<Grid.ColumnDefinitions>
50+
<ColumnDefinition Width="*"/>
51+
<ColumnDefinition Width="Auto"/>
52+
</Grid.ColumnDefinitions>
53+
<TextBox Grid.Column="0" Name="InputTextBox" VerticalAlignment="Center" KeyDown="TextBox_KeyDown" PlaceholderText="Type a message" BorderBrush="{x:Null}" BorderThickness="0"/>
54+
<Button x:Name="SendMessageButton" Grid.Column="1" Click="SendMessageButton_Click" IsEnabled="{x:Bind SendEnabled, Mode=OneWay}" Background="{x:Bind HeaderBackground}" VerticalAlignment="Center" Width="50" Height="49">
55+
<SymbolIcon Symbol="Send"/>
56+
</Button>
57+
</Grid>
4958
</Grid>
5059
</UserControl>

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public sealed partial class Conversation : UserControl, INotifyPropertyChanged
2626
public RangeObservableCollection<object> Messages { get; set; } = new RangeObservableCollection<object>();
2727
private SignalUnreadMarker UnreadMarker = new SignalUnreadMarker();
2828
private bool UnreadMarkerAdded = false;
29+
private bool SendingMessage = false;
2930

3031
private string _ThreadDisplayName;
3132

@@ -67,12 +68,24 @@ public Brush HeaderBackground
6768
set { _HeaderBackground = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(HeaderBackground))); }
6869
}
6970

71+
private bool _SendEnabled;
72+
public bool SendEnabled
73+
{
74+
get { return _SendEnabled; }
75+
set
76+
{
77+
_SendEnabled = value;
78+
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SendEnabled)));
79+
}
80+
}
81+
7082
public Conversation()
7183
{
7284
this.InitializeComponent();
7385
Displayname.Foreground = Utils.ForegroundIncoming;
7486
Separator.Foreground = Utils.ForegroundIncoming;
7587
Username.Foreground = Utils.ForegroundIncoming;
88+
SendEnabled = false;
7689
}
7790

7891
public MainPageViewModel GetMainPageVm()
@@ -200,10 +213,21 @@ public void AddToOutgoingMessagesCache(SignalMessage sm)
200213
throw new Exception("Attempt to add null view to OutgoingCache");
201214
}
202215
}
203-
216+
204217
private async void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
205218
{
206-
await GetMainPageVm().TextBox_KeyDown(sender, e);
219+
TextBox t = sender as TextBox;
220+
SendEnabled = t.Text != string.Empty;
221+
if (e.Key == Windows.System.VirtualKey.Enter)
222+
{
223+
// this fixes double send by enter repeat
224+
if (!SendingMessage)
225+
{
226+
SendingMessage = true;
227+
await GetMainPageVm().TextBox_KeyDown(sender, e);
228+
SendingMessage = false;
229+
}
230+
}
207231
}
208232

209233
public void RemoveUnreadMarker()
@@ -214,6 +238,11 @@ public void RemoveUnreadMarker()
214238
UnreadMarkerAdded = false;
215239
}
216240
}
241+
242+
private async void SendMessageButton_Click(object sender, RoutedEventArgs e)
243+
{
244+
await GetMainPageVm().SendMessageButton_Click(InputTextBox);
245+
}
217246
}
218247

219248
public class SignalUnreadMarker

Signal-Windows/ViewModels/MainPageViewModel.cs

Lines changed: 55 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -235,61 +235,76 @@ internal async void ContactsList_SelectionChanged(object sender, SelectionChange
235235

236236
internal async Task TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
237237
{
238+
if (e.Key == VirtualKey.Enter)
239+
{
240+
TextBox t = (TextBox)sender;
241+
await SendMessageButton_Click(t);
242+
}
243+
}
244+
245+
private async Task<bool> SendMessage(string messageText)
246+
{
247+
Debug.WriteLine("starting sendmessage");
238248
try
239249
{
240-
if (e.Key == VirtualKey.Enter)
250+
if (messageText != string.Empty)
241251
{
242-
TextBox t = (TextBox)sender;
243-
if (t.Text != "")
252+
var now = Util.CurrentTimeMillis();
253+
SignalMessage message = new SignalMessage()
244254
{
245-
var text = t.Text;
246-
t.Text = "";
247-
var now = Util.CurrentTimeMillis();
248-
SignalMessage message = new SignalMessage()
255+
Author = null,
256+
ComposedTimestamp = now,
257+
Content = new SignalMessageContent() { Content = messageText },
258+
ThreadId = SelectedThread.ThreadId,
259+
ReceivedTimestamp = now,
260+
Direction = SignalMessageDirection.Outgoing,
261+
Read = true,
262+
Type = SignalMessageType.Normal
263+
};
264+
Debug.WriteLine("keydown lock await");
265+
using (await ActionInProgress.LockAsync())
266+
{
267+
Debug.WriteLine("keydown lock grabbed");
268+
View.Thread.Append(message);
269+
View.Thread.ScrollToBottom();
270+
SelectedThread.LastMessage = message;
271+
SelectedThread.View.UpdateConversationDisplay(SelectedThread);
272+
MoveThreadToTop(SelectedThread);
273+
await Task.Run(() =>
249274
{
250-
Author = null,
251-
ComposedTimestamp = now,
252-
Content = new SignalMessageContent() { Content = text },
253-
ThreadId = SelectedThread.ThreadId,
254-
ReceivedTimestamp = now,
255-
Direction = SignalMessageDirection.Outgoing,
256-
Read = true,
257-
Type = SignalMessageType.Normal
258-
};
259-
Debug.WriteLine("keydown lock await");
260-
using (await ActionInProgress.LockAsync())
275+
SignalDBContext.SaveMessageLocked(message);
276+
SignalDBContext.ClearUnreadLocked(SelectedThread.ThreadId);
277+
});
278+
SelectedThread.LastMessageId = message.Id;
279+
SelectedThread.LastSeenMessageId = message.Id;
280+
if (SelectedThread != null && SelectedThread.ThreadId == message.ThreadId)
261281
{
262-
Debug.WriteLine("keydown lock grabbed");
263-
View.Thread.Append(message);
264-
View.Thread.ScrollToBottom();
265-
SelectedThread.LastMessage = message;
266-
SelectedThread.View.UpdateConversationDisplay(SelectedThread);
267-
MoveThreadToTop(SelectedThread);
268-
await Task.Run(() =>
269-
{
270-
SignalDBContext.SaveMessageLocked(message);
271-
SignalDBContext.ClearUnreadLocked(SelectedThread.ThreadId);
272-
});
273-
SelectedThread.LastMessageId = message.Id;
274-
SelectedThread.LastSeenMessageId = message.Id;
275-
if (SelectedThread != null && SelectedThread.ThreadId == message.ThreadId)
276-
{
277-
View.Thread.AddToOutgoingMessagesCache(message);
278-
}
279-
OutgoingQueue.Add(message);
280-
var after = Util.CurrentTimeMillis();
281-
Debug.WriteLine("ms until out queue: " + (after - now));
282-
View.Thread.RemoveUnreadMarker();
282+
View.Thread.AddToOutgoingMessagesCache(message);
283283
}
284-
Debug.WriteLine("keydown lock released");
284+
OutgoingQueue.Add(message);
285+
var after = Util.CurrentTimeMillis();
286+
Debug.WriteLine("ms until out queue: " + (after - now));
287+
View.Thread.RemoveUnreadMarker();
285288
}
289+
Debug.WriteLine("keydown lock released");
286290
}
291+
return true;
287292
}
288293
catch (Exception ex)
289294
{
290295
Debug.WriteLine(ex);
291296
Debug.WriteLine(ex.Message);
292297
Debug.WriteLine(ex.StackTrace);
298+
return false;
299+
}
300+
}
301+
302+
internal async Task SendMessageButton_Click(TextBox messageTextBox)
303+
{
304+
bool sendMessageResult = await SendMessage(messageTextBox.Text);
305+
if (sendMessageResult)
306+
{
307+
messageTextBox.Text = string.Empty;
293308
}
294309
}
295310

0 commit comments

Comments
 (0)