Skip to content

Commit 6fdcafa

Browse files
committed
Merge branch 'master' into add-contact-page
2 parents ac0b8ae + 01a9eb0 commit 6fdcafa

16 files changed

+502
-205
lines changed

Signal-Windows/Controls/Conversation.xaml

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,37 +12,16 @@
1212
d:DesignWidth="400">
1313

1414
<Control.Resources>
15-
<Style TargetType="ListBoxItem" x:Key="NormalMessageStyle">
16-
<Setter Property="Template">
17-
<Setter.Value>
18-
<ControlTemplate TargetType="ListBoxItem">
19-
<local:Message x:Name="ListBoxItemContent" />
20-
</ControlTemplate>
21-
</Setter.Value>
22-
</Setter>
23-
</Style>
24-
<Style TargetType="ListBoxItem" x:Key="UnreadMarkerStyle">
25-
<Setter Property="Template">
26-
<Setter.Value>
27-
<ControlTemplate TargetType="ListBoxItem">
28-
<local:UnreadMarker />
29-
</ControlTemplate>
30-
</Setter.Value>
31-
</Setter>
32-
</Style>
33-
<Style TargetType="ListBoxItem" x:Key="IdentityKeyChangeStyle">
34-
<Setter Property="Template">
35-
<Setter.Value>
36-
<ControlTemplate TargetType="ListBoxItem">
37-
<local:IdentityKeyChangeMessage />
38-
</ControlTemplate>
39-
</Setter.Value>
40-
</Setter>
41-
</Style>
15+
<DataTemplate x:Key="NormalMessageTemplate" x:DataType="models:SignalMessage">
16+
<local:Message x:Name="ListBoxItemContent" />
17+
</DataTemplate>
18+
<DataTemplate x:Key="UnreadMarkerTemplate">
19+
<local:UnreadMarker />
20+
</DataTemplate>
4221
<DataTemplate x:Key="IdentityKeyChangeTemplate">
4322
<local:IdentityKeyChangeMessage />
4423
</DataTemplate>
45-
<local:MessageStyleSelector x:Key="MessageDataStyleSelector" NormalMessage="{StaticResource NormalMessageStyle}" UnreadMarker="{StaticResource UnreadMarkerStyle}" IdentityKeyChangeMessage="{StaticResource IdentityKeyChangeStyle}" />
24+
<local:MessageTemplateSelector x:Key="MessageDataTemplateSelector" NormalMessage="{StaticResource NormalMessageTemplate}" UnreadMarker="{StaticResource UnreadMarkerTemplate}" IdentityKeyChangeMessage="{StaticResource IdentityKeyChangeTemplate}" />
4625
</Control.Resources>
4726
<Grid Background="White">
4827
<Grid.RowDefinitions>
@@ -57,7 +36,13 @@
5736
<TextBlock Name="Username" IsTextSelectionEnabled="True" HorizontalAlignment="Center" Text="{x:Bind ThreadUsername, Mode=OneWay}" Visibility="{x:Bind ThreadUsernameVisibility, Mode=OneWay}" />
5837
</StackPanel>
5938
</Border>
60-
<ListBox Grid.Row="1" Name="ConversationItemsControl" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="White" ScrollViewer.VerticalScrollBarVisibility="Visible" Padding="0 0 15 0" ItemContainerStyleSelector="{StaticResource MessageDataStyleSelector}" />
39+
<ListView Grid.Row="1" Name="ConversationItemsControl" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="White" ScrollViewer.VerticalScrollBarVisibility="Visible" Padding="0 0 15 0" ItemTemplateSelector="{StaticResource MessageDataTemplateSelector}" SelectionMode="None">
40+
<ListView.ItemContainerStyle>
41+
<Style TargetType="ListViewItem">
42+
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
43+
</Style>
44+
</ListView.ItemContainerStyle>
45+
</ListView>
6146
<Grid Grid.Row="2" BorderBrush="{ThemeResource TextBoxBorderThemeBrush}" BorderThickness="0,1,0,0">
6247
<Grid.ColumnDefinitions>
6348
<ColumnDefinition Width="*"/>

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ public sealed partial class Conversation : UserControl, INotifyPropertyChanged
2222
public event PropertyChangedEventHandler PropertyChanged;
2323
private bool SendingMessage = false;
2424
private Dictionary<long, SignalMessageContainer> OutgoingCache = new Dictionary<long, SignalMessageContainer>();
25-
//private SignalUnreadMarker UnreadMarker = new SignalUnreadMarker();
2625
private SignalConversation SignalConversation;
27-
//private bool UnreadMarkerAdded = false;
2826
private VirtualizedCollection Collection;
2927

3028
private string _ThreadDisplayName;
@@ -128,7 +126,6 @@ private void UpdateHeader(SignalConversation thread)
128126
public void Load(SignalConversation conversation)
129127
{
130128
SignalConversation = conversation;
131-
//UnreadMarkerAdded = false;
132129
InputTextBox.IsEnabled = false;
133130
DisposeCurrentThread();
134131
UpdateHeader(conversation);
@@ -145,7 +142,7 @@ public void Load(SignalConversation conversation)
145142
ConversationItemsControl.ItemsSource = Collection;
146143
UpdateLayout();
147144
InputTextBox.IsEnabled = conversation.CanReceive;
148-
ScrollToBottom();
145+
ScrollToUnread();
149146
}
150147

151148
public void DisposeCurrentThread()
@@ -183,21 +180,27 @@ public void UpdateMessageBox(SignalMessage updatedMessage)
183180
if (OutgoingCache.ContainsKey(updatedMessage.Id))
184181
{
185182
var m = OutgoingCache[updatedMessage.Id];
186-
var item = (ListBoxItem) ConversationItemsControl.ContainerFromIndex(m.Index);
187-
var message = FindElementByName<Message>(item, "ListBoxItemContent");
188-
bool retain = message.HandleUpdate(updatedMessage);
189-
if (!retain)
183+
var item = (ListViewItem) ConversationItemsControl.ContainerFromIndex(Collection.GetVirtualIndex(m.Index));
184+
if (item != null)
190185
{
191-
OutgoingCache.Remove(m.Index);
186+
var message = FindElementByName<Message>(item, "ListBoxItemContent");
187+
bool retain = message.HandleUpdate(updatedMessage);
188+
if (!retain)
189+
{
190+
OutgoingCache.Remove(m.Index);
191+
}
192192
}
193193
}
194194
}
195195

196196
public void Append(SignalMessageContainer sm, bool forceScroll)
197197
{
198-
Collection.Add(sm);
199-
if (forceScroll || true) //TODO
198+
var sourcePanel = (ItemsStackPanel)ConversationItemsControl.ItemsPanelRoot;
199+
bool bottom = sourcePanel.LastVisibleIndex == Collection.Count - 2; /* -2 because we already incremented Count */
200+
Collection.Add(sm, true);
201+
if (forceScroll || bottom)
200202
{
203+
UpdateLayout();
201204
ScrollToBottom();
202205
}
203206
}
@@ -223,11 +226,11 @@ private async void TextBox_KeyDown(object sender, KeyRoutedEventArgs e)
223226

224227
private void ScrollToBottom()
225228
{
226-
if (ConversationItemsControl.Items.Count == 0)
227-
return;
228-
var lastMsg = ConversationItemsControl.Items[ConversationItemsControl.Items.Count - 1] as SignalMessageContainer;
229-
Debug.WriteLine($"scroll to {lastMsg}");
230-
ConversationItemsControl.ScrollIntoView(lastMsg);
229+
if (Collection.Count > 0)
230+
{
231+
var lastUnreadMsg = ConversationItemsControl.Items[Collection.Count - 1];
232+
ConversationItemsControl.ScrollIntoView(lastUnreadMsg, ScrollIntoViewAlignment.Leading);
233+
}
231234
}
232235

233236
private async void SendMessageButton_Click(object sender, RoutedEventArgs e)
@@ -240,30 +243,48 @@ private void InputTextBox_TextChanged(object sender, TextChangedEventArgs e)
240243
TextBox t = sender as TextBox;
241244
SendEnabled = t.Text != string.Empty;
242245
}
243-
}
244246

245-
public class SignalUnreadMarker
246-
{
247-
public UnreadMarker View { get; set; }
247+
private void ScrollToUnread()
248+
{
249+
if (Collection.Count > 0)
250+
{
251+
if (Collection.UnreadMarkerIndex > 0)
252+
{
253+
var lastUnreadMsg = ConversationItemsControl.Items[Collection.UnreadMarkerIndex];
254+
ConversationItemsControl.ScrollIntoView(lastUnreadMsg, ScrollIntoViewAlignment.Leading);
255+
}
256+
else
257+
{
258+
var lastUnreadMsg = ConversationItemsControl.Items[Collection.Count - 1];
259+
ConversationItemsControl.ScrollIntoView(lastUnreadMsg, ScrollIntoViewAlignment.Leading);
260+
}
261+
}
262+
}
248263
}
249-
public class MessageStyleSelector : StyleSelector
264+
265+
public class MessageTemplateSelector : DataTemplateSelector
250266
{
251-
public Style NormalMessage { get; set; }
252-
public Style UnreadMarker { get; set; }
253-
public Style IdentityKeyChangeMessage { get; set; }
267+
public DataTemplate NormalMessage { get; set; }
268+
public DataTemplate UnreadMarker { get; set; }
269+
public DataTemplate IdentityKeyChangeMessage { get; set; }
254270

255-
protected override Style SelectStyleCore(object item, DependencyObject container)
271+
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
256272
{
257273
FrameworkElement element = container as FrameworkElement;
258274
if (item is SignalMessageContainer)
259275
{
260-
SignalMessage sm = ((SignalMessageContainer)item).Message;
276+
SignalMessageContainer smc = (SignalMessageContainer)item;
277+
SignalMessage sm = smc.Message;
261278
if (sm.Type == SignalMessageType.IdentityKeyChange)
262279
{
263280
return IdentityKeyChangeMessage;
264281
}
265282
return NormalMessage;
266283
}
284+
if (item is SignalUnreadMarker)
285+
{
286+
return UnreadMarker;
287+
}
267288
return null;
268289
}
269290
}

Signal-Windows/Controls/IdentityKeyChangeMessage.xaml.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ public IdentityKeyChangeMessage()
2525
this.InitializeComponent();
2626
DataContextChanged += IdentityKeyChangeMessage_DataContextChanged;
2727
}
28-
public SignalMessage Model
28+
public SignalMessageContainer Model
2929
{
3030
get
3131
{
32-
return this.DataContext as SignalMessage;
32+
return this.DataContext as SignalMessageContainer;
3333
}
3434
set
3535
{
@@ -41,7 +41,7 @@ private void IdentityKeyChangeMessage_DataContextChanged(FrameworkElement sender
4141
{
4242
if (Model != null)
4343
{
44-
MessageTextBlock.Text = Model.Content.Content;
44+
MessageTextBlock.Text = Model.Message.Content.Content;
4545
}
4646
else
4747
{

Signal-Windows/Controls/Message.xaml.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public SignalMessageContainer Model
1818
{
1919
get
2020
{
21-
return (SignalMessageContainer) this.DataContext;
21+
return DataContext as SignalMessageContainer;
2222
}
2323
set
2424
{
@@ -75,7 +75,7 @@ private void UpdateUI()
7575
CheckImage.Visibility = Visibility.Collapsed;
7676
DoubleCheckImage.Visibility = Visibility.Collapsed;
7777
ResendTextBlock.Visibility = Visibility.Collapsed;
78-
if (Model.Message.ThreadId[0] != '+')
78+
if (Model.Message.ThreadId.EndsWith("="))
7979
{
8080
MessageAuthor.Visibility = Visibility.Visible;
8181
MessageAuthor.Text = Model.Message.Author.ThreadDisplayName;
@@ -99,13 +99,12 @@ private void UpdateUI()
9999

100100
private void MessageBox_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
101101
{
102-
103102
UpdateUI();
104103
}
105104

106105
private void ResendTextBlock_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
107106
{
108-
throw new NotImplementedException();
107+
App.ViewModels.MainPageInstance.OutgoingQueue.Add(Model.Message);
109108
}
110109

111110
internal bool HandleUpdate(SignalMessage updatedMessage)

Signal-Windows/Controls/UnreadMarker.xaml.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.IO;
45
using System.Linq;
56
using System.Runtime.InteropServices.WindowsRuntime;
@@ -35,7 +36,10 @@ public SignalUnreadMarker Model
3536

3637
private void UnreadMarker_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
3738
{
38-
Model.View = this;
39+
if (Model != null)
40+
{
41+
UnreadText.Text = Model.Text;
42+
}
3943
}
4044

4145
public void SetText(string text)

0 commit comments

Comments
 (0)