You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tcpipSocket/Chat/Client/RoomListForm.cs

137 lines
3.0 KiB

using Core;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Client
{
public partial class RoomListForm : Form
{
private delegate void InvokedMethod();
public RoomListForm()
{
InitializeComponent();
InitInstance();
}
private void InitInstance()
{
Singleton.Instance.CreateRoomResponsed += CreateRoomResponsed;
Singleton.Instance.RoomListResponsed += Instance_RoomListResponsed;
}
private void btnEnter_Click(object sender, EventArgs e)
{
if (lbxRoom.SelectedItem == null)
{
MessageBox.Show("Please select a room.");
return;
}
IAsyncResult ar = null;
ar = BeginInvoke(() =>
{
ChatRoomForm chatRoomForm = new ChatRoomForm();
chatRoomForm.Text = lbxRoom.SelectedItem.ToString();
chatRoomForm.ShowDialog();
EndInvoke(ar);
});
}
private async void btnCreate_Click(object sender, EventArgs e)
{
string roomName = tbxRoomName.Text;
if (string.IsNullOrEmpty(roomName))
{
MessageBox.Show("Please input a room name.");
return;
}
CreateRoomRequestPacket packet = new CreateRoomRequestPacket(roomName);
await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None);
}
private void RoomListForm_Activated(object sender, EventArgs e)
{
btnRefresh_Click(sender, e);
}
private void InvokeMethod(InvokedMethod method)
{
if (InvokeRequired)
{
lbxRoom.Invoke(new MethodInvoker(() =>
{
method();
}));
}
else
{
method();
}
}
private void CreateRoomResponsed(object? sender, EventArgs e)
{
if (sender == null)
return;
CreateRoomResponsePacket packet = (CreateRoomResponsePacket)sender;
if (packet.Code == StatusCode.Success)
{
string roomName = tbxRoomName.Text;
InvokeMethod(() =>
{
lbxRoom.Items.Add(roomName);
tbxRoomName.Text = "";
});
IAsyncResult ar = null;
ar = BeginInvoke(() =>
{
ChatRoomForm chatRoomForm = new ChatRoomForm();
chatRoomForm.Text = roomName;
chatRoomForm.ShowDialog();
EndInvoke(ar);
});
}
}
private void Instance_RoomListResponsed(object? sender, EventArgs e)
{
if (sender == null)
return;
RoomListResponsePacket packet = (RoomListResponsePacket)sender;
InvokeMethod(() =>
{
foreach (string item in packet.RoomNames)
{
lbxRoom.Items.Add(item);
}
});
}
private async void btnRefresh_Click(object sender, EventArgs e)
{
lbxRoom.Items.Clear();
RoomListRequestPacket packet = new RoomListRequestPacket();
await Singleton.Instance.SendAsync(packet.Serialize(), SocketFlags.None);
}
private void RoomListForm_FormClosing(object sender, FormClosingEventArgs e)
{
Singleton.Instance.CreateRoomResponsed -= CreateRoomResponsed;
Singleton.Instance.RoomListResponsed -= Instance_RoomListResponsed;
Singleton.Instance.Socket.Shutdown(SocketShutdown.Send);
}
}
}