Skip to content

Commit e20890c

Browse files
committed
Implemented a bunch of controls
1 parent 5172873 commit e20890c

26 files changed

+167
-68
lines changed
7.5 KB
Binary file not shown.

SyncPlayWPF/SyncPlayWPF/CustomControls/ChatMessage.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ public string MessageSender {
6666
get { return (string)GetValue(MessageSenderProperty); }
6767
set { SetValue(MessageSenderProperty, value); }
6868
}
69-
public string IsInitialMessage {
70-
get { return (string)GetValue(IsInitialMessageProperty); }
69+
public bool IsInitialMessage {
70+
get { return (bool)GetValue(IsInitialMessageProperty); }
7171
set { SetValue(IsInitialMessageProperty, value); }
7272
}
7373
}

SyncPlayWPF/SyncPlayWPF/Pages/SessionPages/ChatSession.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<!-- Chat Messages -->
2020
<ScrollViewer Style="{StaticResource FavsScrollViewer}">
2121
<StackPanel Grid.Row="0" Margin="20,10,10,10" x:Name="MessageStack">
22-
22+
2323
</StackPanel>
2424
</ScrollViewer>
2525

SyncPlayWPF/SyncPlayWPF/Pages/SessionPages/ChatSession.xaml.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,49 @@ namespace SyncPlayWPF.Pages.SessionPages {
2020
public partial class ChatSession : UserControl {
2121
public ChatSession() {
2222
InitializeComponent();
23-
2423
this.Loaded += OnPageLoad;
2524
}
2625

26+
private bool LastAdditionWasChatInfo = false;
27+
private SyncPlay.User LastSender = null;
28+
2729
private void OnPageLoad(object sender, RoutedEventArgs e) {
2830
Common.Shared.Wrapper.SyncPlayClient.OnNewChatMessage += NewChatMessage;
31+
Common.Shared.Wrapper.SyncPlayClient.OnChatInfoEvent += NewChatEvent;
32+
}
33+
34+
private void NewChatEvent(SyncPlay.SyncPlayClient sender, SyncPlay.EventArgs.ChatInfoMessageArgs e) {
35+
Console.WriteLine("_________-----__" + e.Message);
36+
Dispatcher.Invoke(() => {
37+
if (!LastAdditionWasChatInfo) {
38+
var spacer = new Border();
39+
spacer.Style = (Style)this.FindResource("ChatInfoSpacer");
40+
LastAdditionWasChatInfo = true;
41+
MessageStack.Children.Add(spacer);
42+
}
43+
var msgblock = new TextBlock();
44+
msgblock.Text = e.Message;
45+
msgblock.Style = (Style)this.FindResource("ChatInfo");
46+
MessageStack.Children.Add(msgblock);
47+
});
2948
}
3049

3150
private void NewChatMessage(SyncPlay.SyncPlayClient sender, SyncPlay.EventArgs.ChatMessageEventArgs e) {
3251
Dispatcher.Invoke(() => {
52+
if (LastAdditionWasChatInfo) {
53+
var spacer = new Border();
54+
spacer.Style = (Style)this.FindResource("ChatInfoSpacer");
55+
LastAdditionWasChatInfo = false;
56+
}
3357
var msgballoon = new CustomControls.ChatMessage();
3458
msgballoon.Style = e.LocallySentMessage ? (Style)this.FindResource("OutgoingMessage") : (Style)this.FindResource("IncomingMessage");
3559
msgballoon.MessageSender = e.Sender.Username;
3660
msgballoon.MessageContent = e.Message;
61+
msgballoon.IsInitialMessage = LastSender == null || LastSender != e.Sender;
3762
msgballoon.MessageTime = DateTime.Now.ToString("hh:mm tt");
3863

64+
LastSender = e.Sender;
65+
3966
var text = new TextBlock();
4067
text.Text = e.Message;
4168

SyncPlayWPF/SyncPlayWPF/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,5 @@
5151
// You can specify all the values or you can default the Build and Revision Numbers
5252
// by using the '*' as shown below:
5353
// [assembly: AssemblyVersion("1.0.*")]
54-
[assembly: AssemblyVersion("2021.201.75.0")]
55-
[assembly: AssemblyFileVersion("2021.201.75.0")]
54+
[assembly: AssemblyVersion("2021.201.82.0")]
55+
[assembly: AssemblyFileVersion("2021.201.82.0")]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace SyncPlay.EventArgs {
8+
public class ChatInfoMessageArgs {
9+
public string Message;
10+
public SyncPlay.User User;
11+
12+
public ChatInfoMessageArgs(User u, string msg) {
13+
this.Message = msg;
14+
this.User = u;
15+
}
16+
}
17+
}

SyncPlayWPF/SyncPlayWPF/SyncPlay/SyncPlayClient.cs

Lines changed: 73 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,10 @@ public void AddFileToPlayList(string path) {
100100
Playlist.Add(mfile);
101101
nclient.SendMessage(Packets.CraftSetFileMessage(mfile.FilePath, mfile.Duration, mfile.Size));
102102
}
103-
103+
/// <summary>
104+
/// Sends a message to the server
105+
/// </summary>
106+
/// <param name="message">Message to send</param>
104107
public void SendChatMessage(string message) {
105108
nclient.SendMessage(Packets.CraftOutgoingChatMessage(message));
106109
}
@@ -169,6 +172,13 @@ public SyncPlayClient(String serverip, int port, String username, String passwor
169172
/// </summary>
170173
public event PlayerSeekHandler OnPlayerStateChange;
171174
public delegate void PlayerSeekHandler(SyncPlayClient sender, EventArgs.RemoteStateChangeEventArgs e);
175+
176+
/// <summary>
177+
/// This event will be triggered when an even that is note worthy of notifying the user via chat
178+
/// occurs. Such as someone joining a chat, leaving a chat, seeking or switching files
179+
/// </summary>
180+
public event ChatMessageEvent OnChatInfoEvent;
181+
public delegate void ChatMessageEvent(SyncPlayClient sender, EventArgs.ChatInfoMessageArgs e);
172182
#endregion
173183

174184

@@ -192,13 +202,16 @@ public void IncrementPosition() {
192202
/// <param name="username">Username to add</param>
193203
/// <returns></returns>
194204
private User AddNewUser(string username) {
195-
var user = new User();
196-
user.Username = username;
197-
this.UserDictionary.Add(username, user);
198-
var eventargs = new EventArgs.UserRoomStateEventArgs();
199-
eventargs.EventType = EventArgs.UserRoomStateEventArgs.EventTypes.JOINED;
200-
eventargs.User = user;
201-
OnUserRoomEvent?.Invoke(this, eventargs);
205+
User user;
206+
if (!this.UserDictionary.TryGetValue(username, out user)) {
207+
user = new User();
208+
user.Username = username;
209+
this.UserDictionary.Add(username, user);
210+
var eventargs = new EventArgs.UserRoomStateEventArgs();
211+
eventargs.EventType = EventArgs.UserRoomStateEventArgs.EventTypes.JOINED;
212+
eventargs.User = user;
213+
OnUserRoomEvent?.Invoke(this, eventargs);
214+
}
202215
return user;
203216
}
204217

@@ -316,11 +329,11 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
316329
Misc.Common.PrintInColor(statusmessage, ConsoleColor.Green);
317330

318331

332+
var chatinfomsg = readystatus ? $"{agent} is ready to play" : $"{agent} is not ready to play";
333+
OnChatInfoEvent?.Invoke(this, new EventArgs.ChatInfoMessageArgs(GetUserFromDictionary(agent), chatinfomsg));
319334
OnDebugLog?.Invoke(this, statusmessage);
320-
if (OnNewReadyPacket != null) {
321-
var EventArgs = new EventArgs.UserReadyEventArgs(userobj, manuallyinitiated, readystatus);
322-
OnNewReadyPacket(this, EventArgs);
323-
}
335+
OnNewReadyPacket?.Invoke(this, new EventArgs.UserReadyEventArgs(userobj, manuallyinitiated, readystatus));
336+
324337
return;
325338
}
326339
#endregion
@@ -337,11 +350,13 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
337350
switch (eventName) {
338351
case "joined":
339352
OnDebugLog?.Invoke(this, $"The user {username} has joined the room");
353+
OnChatInfoEvent?.Invoke(this, new EventArgs.ChatInfoMessageArgs(GetUserFromDictionary(username), $"{username} has joined the party!"));
340354
AddNewUser(username);
341355
break;
342356

343357
case "left":
344358
OnDebugLog?.Invoke(this, $"The user {username} has left the room");
359+
OnChatInfoEvent?.Invoke(this, new EventArgs.ChatInfoMessageArgs(GetUserFromDictionary(username), $"{username} has left the party"));
345360
RemoveUser(username);
346361
break;
347362

@@ -386,64 +401,70 @@ private void NewIncomingMessage(NetworkClient sender, string message) {
386401
if (setByUserString != null) {
387402

388403

389-
var setByUser = GetUserFromDictionary(setByUserString);
390-
if (playstatekey.Value<Boolean>("paused") != isPaused) {
404+
var setByUser = GetUserFromDictionary(setByUserString);
405+
if (playstatekey.Value<Boolean>("paused") != isPaused) {
391406

392-
isPaused = playstatekey.Value<Boolean>("paused");
393-
OnDebugLog?.Invoke(this, isPaused ? "Remote pause requested" : "Remote resume requested");
407+
isPaused = playstatekey.Value<Boolean>("paused");
408+
OnDebugLog?.Invoke(this, isPaused ? "Remote pause requested" : "Remote resume requested");
394409

395-
// Create an even args object to notify the player that it needs to change its pause state
396-
// because someone paused or unpaused
397-
var remotepauseeventargs = new EventArgs.RemoteStateChangeEventArgs();
398-
remotepauseeventargs.Agent = setByUser;
399-
remotepauseeventargs.Paused = isPaused;
400-
remotepauseeventargs.Position = serverPosition;
401-
remotepauseeventargs.Seeked = false;
410+
// Create an even args object to notify the player that it needs to change its pause state
411+
// because someone paused or unpaused
412+
var remotepauseeventargs = new EventArgs.RemoteStateChangeEventArgs();
413+
remotepauseeventargs.Agent = setByUser;
414+
remotepauseeventargs.Paused = isPaused;
415+
remotepauseeventargs.Position = serverPosition;
416+
remotepauseeventargs.Seeked = false;
402417

403-
OnPlayerStateChange?.Invoke(this, remotepauseeventargs);
404-
}
418+
var chtmsg = isPaused ? $"{setByUser.Username} has paused" : $"{setByUser.Username} has resumed playback";
405419

406-
if (playstatekey.ContainsKey("doSeek")) {
407-
try {
408-
if ((bool)playstatekey["doSeek"]) {
420+
this.OnChatInfoEvent?.Invoke(this, new EventArgs.ChatInfoMessageArgs(setByUser, chtmsg));
421+
this.OnPlayerStateChange?.Invoke(this, remotepauseeventargs);
422+
}
409423

410-
playPosition = serverPosition;
411-
OnDebugLog?.Invoke(this, $"Seeking to {Misc.Common.ConvertSecondsToTimeStamp((int)playPosition)}");
424+
if (playstatekey.ContainsKey("doSeek")) {
425+
try {
426+
if ((bool)playstatekey["doSeek"]) {
412427

413-
// Create an even args object to notify the player that it needs to seek because someone on the
414-
// server side seeked
415-
var remoteseekingeventargs = new EventArgs.RemoteStateChangeEventArgs();
416-
remoteseekingeventargs.Agent = setByUser;
417-
remoteseekingeventargs.Paused = isPaused;
418-
remoteseekingeventargs.Position = serverPosition;
419-
remoteseekingeventargs.Seeked = true;
428+
playPosition = serverPosition;
429+
OnDebugLog?.Invoke(this, $"Seeking to {Misc.Common.ConvertSecondsToTimeStamp((int)playPosition)}");
420430

431+
// Create an even args object to notify the player that it needs to seek because someone on the
432+
// server side seeked
433+
var remoteseekingeventargs = new EventArgs.RemoteStateChangeEventArgs();
434+
remoteseekingeventargs.Agent = setByUser;
435+
remoteseekingeventargs.Paused = isPaused;
436+
remoteseekingeventargs.Position = serverPosition;
437+
remoteseekingeventargs.Seeked = true;
421438

422-
OnPlayerStateChange?.Invoke(this, remoteseekingeventargs);
423-
}
424-
} catch (Exception e) {
439+
var seekinfomsg = $"{setByUser.Username} has seeked to {serverPosition} seconds";
440+
this.OnChatInfoEvent?.Invoke(this, new EventArgs.ChatInfoMessageArgs(setByUser, seekinfomsg));
441+
425442

443+
OnPlayerStateChange?.Invoke(this, remoteseekingeventargs);
426444
}
445+
} catch (Exception e) {
427446

428-
} else if (Math.Abs(serverPosition - playPosition) > 5) {
447+
}
429448

430-
playPosition = serverPosition;
431-
OnDebugLog?.Invoke(this, $"Seeking to {Misc.Common.ConvertSecondsToTimeStamp((int)playPosition)} sync with server");
449+
} else if (Math.Abs(serverPosition - playPosition) > 5) {
432450

433-
// Create an event args object to notify the player that it needs to seek to sync with the
434-
// other users
435-
var syncseekingeventargs = new EventArgs.RemoteStateChangeEventArgs();
436-
syncseekingeventargs.Agent = setByUser;
437-
syncseekingeventargs.Paused = isPaused;
438-
syncseekingeventargs.Position = serverPosition;
439-
syncseekingeventargs.Seeked = true;
451+
playPosition = serverPosition;
452+
OnDebugLog?.Invoke(this, $"Seeking to {Misc.Common.ConvertSecondsToTimeStamp((int)playPosition)} sync with server");
440453

454+
// Create an event args object to notify the player that it needs to seek to sync with the
455+
// other users
456+
var syncseekingeventargs = new EventArgs.RemoteStateChangeEventArgs();
457+
syncseekingeventargs.Agent = setByUser;
458+
syncseekingeventargs.Paused = isPaused;
459+
syncseekingeventargs.Position = serverPosition;
460+
syncseekingeventargs.Seeked = true;
441461

442-
OnPlayerStateChange?.Invoke(this, syncseekingeventargs);
443462

463+
OnPlayerStateChange?.Invoke(this, syncseekingeventargs);
444464

445465

446-
}
466+
467+
}
447468

448469
}
449470
}

SyncPlayWPF/SyncPlayWPF/SyncPlayWPF.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
<SubType>Designer</SubType>
7878
</ApplicationDefinition>
7979
<Compile Include="CustomControls\MediaFileControl.cs" />
80+
<Compile Include="SyncPlay\EventArgs\ChatInfoMessageArgs.cs" />
8081
<Compile Include="SyncPlay\SyncPlayClient.cs" />
8182
<Compile Include="SyncPlay\EventArgs\ChatMessageEventArgs.cs" />
8283
<Compile Include="SyncPlay\EventArgs\LocalSetFileEventArgs.cs" />

SyncPlayWPF/SyncPlayWPF/Themes/Generic.xaml

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,12 @@
753753
</Setter.Value>
754754
</Setter>
755755
</Style>
756+
757+
<!-- TextBlocks -->
758+
<Style TargetType="TextBlock" x:Key="ChatInfo">
759+
<Setter Property="HorizontalAlignment" Value="Center"/>
760+
<Setter Property="Foreground" Value="{StaticResource DarkMode_TextColorE}"/>
761+
</Style>
756762

757763
<!-- Checkboxes -->
758764
<Style TargetType="{x:Type custom:ChatMessage}" x:Key="IncomingMessage">
@@ -1123,8 +1129,38 @@
11231129
</Setter>
11241130
</Style>
11251131

1132+
<!-- Expander -->
1133+
<Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
1134+
<Setter Property="Focusable" Value="False"/>
1135+
<Setter Property="Template">
1136+
<Setter.Value>
1137+
<ControlTemplate TargetType="ToggleButton">
1138+
<Grid Width="14" Height="14">
1139+
<Rectangle Fill="{DynamicResource primaryBackgroundBrush}" />
1140+
<Border Name="ExpandBorder" RenderOptions.EdgeMode="Aliased" BorderBrush="Black" BorderThickness="2">
1141+
<Path RenderOptions.EdgeMode="Aliased" Name="ExpandPath" Stroke="Black" Margin="0" StrokeThickness="2" Data="M 5 1 L 5 9 M 1 5 L 9 5" />
1142+
</Border>
1143+
</Grid>
1144+
<ControlTemplate.Triggers>
1145+
<Trigger Property="IsChecked" Value="True">
1146+
<Setter Property="Data" TargetName="ExpandPath" Value="M 1 5 L 9 5"/>
1147+
</Trigger>
1148+
<Trigger Property="IsEnabled" Value="False">
1149+
<Setter TargetName="ExpandBorder" Property="BorderBrush" Value="Gray" />
1150+
<Setter TargetName="ExpandPath" Property="Stroke" Value="Gray" />
1151+
<Setter Property="Data" TargetName="ExpandPath" Value=""/>
1152+
</Trigger>
1153+
</ControlTemplate.Triggers>
1154+
</ControlTemplate>
1155+
</Setter.Value>
1156+
</Setter>
1157+
</Style>
1158+
1159+
<Style TargetType="Border" x:Key="ChatInfoSpacer">
1160+
<Setter Property="Height" Value="10"/>
1161+
</Style>
1162+
11261163

11271164

11281165

1129-
11301166
</ResourceDictionary>
3 KB
Binary file not shown.

0 commit comments

Comments
 (0)