From 3f57dc43c51c43e8dbee280bd86857368bfec9d6 Mon Sep 17 00:00:00 2001 From: MrMelon Date: Wed, 23 Sep 2020 20:22:51 +0100 Subject: [PATCH] GUI code LOL --- MelonVPNClient/MainWindow.cs | 264 ++++++++++++++++++++--------------- 1 file changed, 154 insertions(+), 110 deletions(-) diff --git a/MelonVPNClient/MainWindow.cs b/MelonVPNClient/MainWindow.cs index 98b4328..ebe8f8e 100644 --- a/MelonVPNClient/MainWindow.cs +++ b/MelonVPNClient/MainWindow.cs @@ -1,132 +1,173 @@ using System; -using System.Net.NetworkInformation; -using System.Threading; -using Gtk; -using MelonVPNCore; - -public partial class MainWindow : Window +using System.IO; +using System.Net.NetworkInformation; +using System.Reflection; +using System.Threading; +using Gtk; +using MelonVPNCore; + +public partial class MainWindow : Window { private Label statusLabel; private Button startBtn; private Button stopBtn; private Button refreshBtn; - private Button viewClientsBtn; + private ScrolledWindow clientsListScroller; + private TextView clientsListText; private Thread startupCheckThread; private ThreadWrapper wrapper; - - public MainWindow() : base(WindowType.Toplevel) - { + private StatusIcon statusIcon; + public static readonly string MelonIconImg = "MiniMelonVPNIcon.png"; + public static readonly string MelonOnlineImg = "MiniMelonVPNOnline.png"; + + public MainWindow() : base(WindowType.Toplevel) + { Build(); Title = "Melon VPN"; + UpdateIcon(MelonIconImg); SetSizeRequest(300, 300); SetDefaultSize(300, 300); - SetPosition(WindowPosition.Center); + SetPosition(WindowPosition.CenterAlways); Resizable = false; TypeHint = Gdk.WindowTypeHint.Normal; Present(); - statusLabel = new Label - { + statusLabel = new Label + { Visible = true, - Text = "Loading..." + Text = "Loading..." }; - fixed1.Put(statusLabel, 10, 10); - - startBtn = new Button - { - Visible = true, - Label = "Start" + fixed1.Put(statusLabel, 10, 10); + + startBtn = new Button + { + Visible = true, + Label = "Start" }; startBtn.SetSizeRequest(80, 30); startBtn.Clicked += OnStartClicked; fixed1.Put(startBtn, 10, 40); - stopBtn = new Button - { - Visible = true, - Label = "Stop" + stopBtn = new Button + { + Visible = true, + Label = "Stop" }; stopBtn.SetSizeRequest(80, 30); stopBtn.Clicked += OnStopClicked; fixed1.Put(stopBtn, 100, 40); - refreshBtn = new Button - { + refreshBtn = new Button + { Visible = true, - Label = "Refresh" + Label = "Refresh" }; refreshBtn.SetSizeRequest(80, 30); refreshBtn.Clicked += OnRefreshClicked; fixed1.Put(refreshBtn, 190, 40); - viewClientsBtn = new Button + clientsListText = new TextView { Visible = true, - Label = "View Clients" + Editable = false }; - viewClientsBtn.SetSizeRequest(100, 30); - viewClientsBtn.Clicked += OnViewClientsClicked; - fixed1.Put(viewClientsBtn, 10, 80); - GUISocketServer.Receive += delegate (object sender, ClientResponseState s) + clientsListScroller = new ScrolledWindow + { + Visible = true + }; + clientsListScroller.SetSizeRequest(280, 200); + clientsListScroller.Add(clientsListText); + fixed1.Put(clientsListScroller, 10, 80); + + GUISocketServer.Receive += delegate (object sender, ClientResponseState s) { Console.WriteLine(s); - Application.Invoke(delegate - { - UpdateStatus(s); + Application.Invoke(delegate + { + UpdateStatus(s); }); }; - GUISocketServer.ClientListUpdate += delegate (object sender, ConnectedClient[] clients) - { + GUISocketServer.ClientListUpdate += delegate (object sender, ConnectedClient[] clients) + { Console.WriteLine(clients.Length); - foreach (ConnectedClient c in clients) - { - Console.WriteLine(c.name + "--" + c.ip); - } - }; + string[][] a = new string[clients.Length][]; + for (int i = 0; i < clients.Length; i++) a[i] = new string[] { clients[i].name, clients[i].ip }; + clientsListText.Buffer.Text = GenerateTable(a); + }; wrapper = new ThreadWrapper(GUISocketServer.StartServer); - - startupCheckThread = new Thread(StartupCheckMethod) - { + + startupCheckThread = new Thread(StartupCheckMethod) + { IsBackground = true }; - startupCheckThread.Start(); + startupCheckThread.Start(); + + statusIcon = new StatusIcon + { + Visible = true + }; } - string GetVpnInternalIp() - { - if (NetworkInterface.GetIsNetworkAvailable()) + void UpdateIcon(string file) + { + DirectoryInfo ExeLocation = Directory.GetParent(Assembly.GetEntryAssembly().Location); + string IconPath = System.IO.Path.Combine(ExeLocation.FullName, file); + Console.WriteLine("Trying to update icon to: " + IconPath); + if (File.Exists(IconPath)) { - foreach (NetworkInterface f in NetworkInterface.GetAllNetworkInterfaces()) - { + Icon = new Gdk.Pixbuf(IconPath); + if (statusIcon != null) statusIcon.Icon = new Gdk.Pixbuf(IconPath); + } + } + + string GenerateTable(string[][] a) + { + if (a.Length == 0) return ""; + int maxlength = a[0][0].Length; + foreach (string b in a[0]) + { + if (b.Length > maxlength) maxlength = b.Length; + } + string[] c = new string[a.Length]; + for (int i = 0; i < a.Length; i++) c[i] = a[i][0].PadRight(maxlength, ' ') + a[i][1]; + return string.Join("\n", c); + } + + string GetVpnInternalIp() + { + if (NetworkInterface.GetIsNetworkAvailable()) + { + foreach (NetworkInterface f in NetworkInterface.GetAllNetworkInterfaces()) + { IPInterfaceProperties p = f.GetIPProperties(); IPAddressInformationCollection addressesColl = p.AnycastAddresses; - foreach (IPAddressInformation ip in addressesColl) + foreach (IPAddressInformation ip in addressesColl) { - if (ip.Address.ToString().StartsWith("10.137.248.", StringComparison.CurrentCulture)) - { - return ip.Address.ToString(); - } - } - } + if (ip.Address.ToString().StartsWith("10.137.248.", StringComparison.CurrentCulture)) + { + return ip.Address.ToString(); + } + } + } } - return ""; + return ""; } - void StartupCheckMethod() - { + void StartupCheckMethod() + { ClientResponseState s = Client.SendDataMessage(DataMessage.Status); Console.WriteLine(s); - Application.Invoke(delegate - { - UpdateStatus(s); - }); + Application.Invoke(delegate + { + UpdateStatus(s); + }); } - void Refresh() - { + void Refresh() + { ClientResponseState s = Client.SendDataMessage(DataMessage.Status); switch (s) { @@ -143,70 +184,73 @@ public partial class MainWindow : Window case ClientResponseState.Offline: UpdateStatus(s); break; - } + } } - void UpdateStatus(ClientResponseState s) - { + void UpdateStatus(ClientResponseState s) + { switch (s) { - case ClientResponseState.Error: + case ClientResponseState.Error: statusLabel.Text = "Client Error"; - break; + UpdateIcon(MelonIconImg); + break; case ClientResponseState.ServerError: statusLabel.Text = "Server Error"; + UpdateIcon(MelonIconImg); break; case ClientResponseState.Blank: statusLabel.Text = "No reply"; + UpdateIcon(MelonIconImg); break; case ClientResponseState.Online: statusLabel.Text = "Online - " + GetVpnInternalIp(); + UpdateIcon(MelonOnlineImg); break; case ClientResponseState.Offline: statusLabel.Text = "Offline"; - break; - default: - statusLabel.Text = "Unknown"; + UpdateIcon(MelonIconImg); break; - } - } - - protected void OnDeleteEvent(object sender, DeleteEventArgs a) + } + } + + protected void OnDeleteEvent(object sender, DeleteEventArgs a) { - if (wrapper != null) - { + if (wrapper != null) + { wrapper.Kill(); - wrapper.Join(); - } - Application.Quit(); - a.RetVal = true; - } - - void OnStartClicked(object sender, EventArgs e) + wrapper.Join(); + } + if (statusIcon != null) statusIcon.Dispose(); + Application.Quit(); + a.RetVal = true; + } + + void OnStartClicked(object sender, EventArgs e) { ClientResponseState s = Client.SendDataMessage(DataMessage.Start); - switch (s) - { - case ClientResponseState.Error: - case ClientResponseState.ServerError: + switch (s) + { + case ClientResponseState.Error: + case ClientResponseState.ServerError: case ClientResponseState.Offline: UpdateStatus(s); MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Error, - ButtonsType.Ok, "Error starting VPN. Is the daemon running?"); - md.Run(); + ButtonsType.Ok, "Error starting VPN. Is the daemon running?"); + md.Run(); md.Destroy(); - break; - } - } - - void OnStopClicked(object sender, EventArgs e) + break; + } + } + + void OnStopClicked(object sender, EventArgs e) { ClientResponseState s = Client.SendDataMessage(DataMessage.Stop); - switch (s) - { - case ClientResponseState.Error: - case ClientResponseState.ServerError: + switch (s) + { + case ClientResponseState.Error: + case ClientResponseState.ServerError: case ClientResponseState.Online: UpdateStatus(s); MessageDialog md = new MessageDialog(this, @@ -214,8 +258,8 @@ public partial class MainWindow : Window ButtonsType.Ok, "Error stopping VPN. Is the daemon running?"); md.Run(); md.Destroy(); - break; - } + break; + } } void OnRefreshClicked(object sender, EventArgs e) @@ -223,8 +267,8 @@ public partial class MainWindow : Window Refresh(); } - void OnViewClientsClicked(object sender, EventArgs e) + void OnViewClientsClicked(object sender, EventArgs e) { - Refresh(); - } -} + Refresh(); + } +}