# Conflicts:
#	shadowsocks-csharp/Controller/Service/TCPRelay.cs
#	shadowsocks-csharp/Controller/ShadowsocksController.cs
#	shadowsocks-csharp/View/MenuViewController.cs
This commit is contained in:
Noisyfox He
2016-08-08 21:21:53 +10:00
20 changed files with 763 additions and 472 deletions
+68 -6
View File
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using ZXing;
@@ -25,6 +26,8 @@ namespace Shadowsocks.View
private UpdateChecker updateChecker;
private NotifyIcon _notifyIcon;
private Bitmap icon_baseBitmap;
private Icon icon_base, icon_in, icon_out, icon_both, targetIcon;
private ContextMenu contextMenu1;
private bool _isFirstRun;
@@ -46,6 +49,7 @@ namespace Shadowsocks.View
private MenuItem editOnlinePACItem;
private MenuItem autoCheckUpdatesToggleItem;
private MenuItem proxyItem;
private MenuItem VerboseLoggingToggleItem;
private ConfigForm configForm;
private ProxyForm proxyForm;
private List<LogForm> logForms = new List<LogForm>();
@@ -63,6 +67,7 @@ namespace Shadowsocks.View
controller.PACFileReadyToOpen += controller_FileReadyToOpen;
controller.UserRuleFileReadyToOpen += controller_FileReadyToOpen;
controller.ShareOverLANStatusChanged += controller_ShareOverLANStatusChanged;
controller.VerboseLoggingStatusChanged += controller_VerboseLoggingStatusChanged;
controller.EnableGlobalChanged += controller_EnableGlobalChanged;
controller.Errored += controller_Errored;
controller.UpdatePACFromGFWListCompleted += controller_UpdatePACFromGFWListCompleted;
@@ -76,6 +81,7 @@ namespace Shadowsocks.View
_notifyIcon.MouseClick += notifyIcon1_Click;
_notifyIcon.MouseDoubleClick += notifyIcon1_DoubleClick;
_notifyIcon.BalloonTipClosed += _notifyIcon_BalloonTipClosed;
controller.TrafficChanged += controller_TrafficChanged;
this.updateChecker = new UpdateChecker();
updateChecker.CheckUpdateCompleted += updateChecker_CheckUpdateCompleted;
@@ -96,6 +102,32 @@ namespace Shadowsocks.View
}
}
private void controller_TrafficChanged(object sender, EventArgs e)
{
if (icon_baseBitmap == null)
return;
Icon newIcon;
bool hasInbound = controller.traffic.Last.inboundIncreasement > 0;
bool hasOutbound = controller.traffic.Last.outboundIncreasement > 0;
if (hasInbound && hasOutbound)
newIcon = icon_both;
else if (hasInbound)
newIcon = icon_in;
else if (hasOutbound)
newIcon = icon_out;
else
newIcon = icon_base;
if (newIcon != this.targetIcon)
{
this.targetIcon = newIcon;
_notifyIcon.Icon = newIcon;
}
}
void controller_Errored(object sender, System.IO.ErrorEventArgs e)
{
MessageBox.Show(e.GetException().ToString(), String.Format(I18N.GetString("Shadowsocks Error: {0}"), e.GetException().Message));
@@ -107,26 +139,32 @@ namespace Shadowsocks.View
Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
dpi = (int)graphics.DpiX;
graphics.Dispose();
Bitmap icon = null;
icon_baseBitmap = null;
if (dpi < 97)
{
// dpi = 96;
icon = Resources.ss16;
icon_baseBitmap = Resources.ss16;
}
else if (dpi < 121)
{
// dpi = 120;
icon = Resources.ss20;
icon_baseBitmap = Resources.ss20;
}
else
{
icon = Resources.ss24;
icon_baseBitmap = Resources.ss24;
}
Configuration config = controller.GetConfigurationCopy();
bool enabled = config.enabled;
bool global = config.global;
icon = getTrayIconByState(icon, enabled, global);
_notifyIcon.Icon = Icon.FromHandle(icon.GetHicon());
icon_baseBitmap = getTrayIconByState(icon_baseBitmap, enabled, global);
icon_base = Icon.FromHandle(icon_baseBitmap.GetHicon());
targetIcon = icon_base;
icon_in = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssIn24).GetHicon());
icon_out = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssOut24).GetHicon());
icon_both = Icon.FromHandle(AddBitmapOverlay(icon_baseBitmap, Resources.ssIn24, Resources.ssOut24).GetHicon());
_notifyIcon.Icon = targetIcon;
string serverInfo = null;
if (controller.GetCurrentStrategy() != null)
@@ -179,6 +217,19 @@ namespace Shadowsocks.View
return iconCopy;
}
private Bitmap AddBitmapOverlay(Bitmap original, params Bitmap[] overlays)
{
Bitmap bitmap = new Bitmap(original.Width, original.Height, PixelFormat.Format64bppArgb);
Graphics canvas = Graphics.FromImage(bitmap);
canvas.DrawImage(original, new Point(0, 0));
foreach (Bitmap overlay in overlays)
{
canvas.DrawImage(new Bitmap(overlay, original.Size), new Point(0, 0));
}
canvas.Save();
return bitmap;
}
private MenuItem CreateMenuItem(string text, EventHandler click)
{
return new MenuItem(I18N.GetString(text), click);
@@ -219,6 +270,7 @@ namespace Shadowsocks.View
this.ShareOverLANItem = CreateMenuItem("Allow Clients from LAN", new EventHandler(this.ShareOverLANItem_Click)),
new MenuItem("-"),
CreateMenuItem("Show Logs...", new EventHandler(this.ShowLogItem_Click)),
this.VerboseLoggingToggleItem = CreateMenuItem( "Verbose Logging", new EventHandler(this.VerboseLoggingToggleItem_Click) ),
CreateMenuGroup("Updates...", new MenuItem[] {
CreateMenuItem("Check for Updates...", new EventHandler(this.checkUpdatesItem_Click)),
new MenuItem("-"),
@@ -247,6 +299,10 @@ namespace Shadowsocks.View
ShareOverLANItem.Checked = controller.GetConfigurationCopy().shareOverLan;
}
void controller_VerboseLoggingStatusChanged(object sender, EventArgs e) {
VerboseLoggingToggleItem.Checked = controller.GetConfigurationCopy().isVerboseLogging;
}
void controller_EnableGlobalChanged(object sender, EventArgs e)
{
globalModeItem.Checked = controller.GetConfigurationCopy().global;
@@ -323,6 +379,7 @@ namespace Shadowsocks.View
globalModeItem.Checked = config.global;
PACModeItem.Checked = !config.global;
ShareOverLANItem.Checked = config.shareOverLan;
VerboseLoggingToggleItem.Checked = config.isVerboseLogging;
AutoStartupItem.Checked = AutoStartup.Check();
onlinePACItem.Checked = onlinePACItem.Enabled && config.useOnlinePac;
localPACItem.Checked = !onlinePACItem.Checked;
@@ -550,6 +607,11 @@ namespace Shadowsocks.View
logForms.Add(f);
}
private void VerboseLoggingToggleItem_Click( object sender, EventArgs e ) {
VerboseLoggingToggleItem.Checked = ! VerboseLoggingToggleItem.Checked;
controller.ToggleVerboseLogging( VerboseLoggingToggleItem.Checked );
}
private void StatisticsConfigItem_Click(object sender, EventArgs e)
{
StatisticsStrategyConfigurationForm form = new StatisticsStrategyConfigurationForm(controller);