windows statusicon: update to new controller logic

This commit is contained in:
Hylke Bons 2012-03-24 02:08:05 +00:00
parent 7ff7d5e7ba
commit a90420b3bf
3 changed files with 60 additions and 128 deletions

View file

@ -70,7 +70,7 @@ namespace SparkleShare {
{ {
using (var a = new NSAutoreleasePool ()) using (var a = new NSAutoreleasePool ())
{ {
CreateAnimation (); CreateAnimationFrames ();
this.status_item = NSStatusBar.SystemStatusBar.CreateStatusItem (28); this.status_item = NSStatusBar.SystemStatusBar.CreateStatusItem (28);
this.status_item.HighlightMode = true; this.status_item.HighlightMode = true;
@ -81,11 +81,6 @@ namespace SparkleShare {
this.status_item.AlternateImage = this.animation_frames_active [0]; this.status_item.AlternateImage = this.animation_frames_active [0];
this.status_item.AlternateImage.Size = new SizeF (16, 16); this.status_item.AlternateImage.Size = new SizeF (16, 16);
this.error_image = new NSImage (NSBundle.MainBundle.ResourcePath +
"/Pixmaps/sparkleshare-syncing-error-mac.png");
this.error_image_active = new NSImage (NSBundle.MainBundle.ResourcePath +
"/Pixmaps/sparkleshare-syncing-error-mac-active.png");
this.folder_image = NSImage.ImageNamed ("NSFolder"); this.folder_image = NSImage.ImageNamed ("NSFolder");
this.caution_image = NSImage.ImageNamed ("NSCaution"); this.caution_image = NSImage.ImageNamed ("NSCaution");
this.sparkleshare_image = NSImage.ImageNamed ("sparkleshare-mac"); this.sparkleshare_image = NSImage.ImageNamed ("sparkleshare-mac");
@ -328,7 +323,7 @@ namespace SparkleShare {
} }
private void CreateAnimation () private void CreateAnimationFrames ()
{ {
this.animation_frames = new NSImage [] { this.animation_frames = new NSImage [] {
new NSImage (Path.Combine (NSBundle.MainBundle.ResourcePath, new NSImage (Path.Combine (NSBundle.MainBundle.ResourcePath,
@ -355,6 +350,11 @@ namespace SparkleShare {
new NSImage (Path.Combine (NSBundle.MainBundle.ResourcePath, new NSImage (Path.Combine (NSBundle.MainBundle.ResourcePath,
"Pixmaps", "process-syncing-sparkleshare-mac-iiiii-active.png")) "Pixmaps", "process-syncing-sparkleshare-mac-iiiii-active.png"))
}; };
this.error_image = new NSImage (NSBundle.MainBundle.ResourcePath +
"/Pixmaps/sparkleshare-syncing-error-mac.png");
this.error_image_active = new NSImage (NSBundle.MainBundle.ResourcePath +
"/Pixmaps/sparkleshare-syncing-error-mac-active.png");
} }
} }

View file

@ -297,7 +297,7 @@ namespace SparkleShare {
}; };
TextBlock address_help_label = new TextBlock () { TextBlock address_help_label = new TextBlock () {
Text = "", Text = Controller.SelectedPlugin.AddressExample,
FontSize = 11, FontSize = 11,
Foreground = new SolidColorBrush (Color.FromRgb (128, 128, 128)) Foreground = new SolidColorBrush (Color.FromRgb (128, 128, 128))
}; };
@ -315,7 +315,7 @@ namespace SparkleShare {
}; };
TextBlock path_help_label = new TextBlock () { TextBlock path_help_label = new TextBlock () {
Text = "", Text = Controller.SelectedPlugin.PathExample,
FontSize = 11, FontSize = 11,
Width = 200, Width = 200,
Foreground = new SolidColorBrush (Color.FromRgb (128, 128, 128)) Foreground = new SolidColorBrush (Color.FromRgb (128, 128, 128))

View file

@ -31,13 +31,12 @@ namespace SparkleShare {
public SparkleStatusIconController Controller = new SparkleStatusIconController(); public SparkleStatusIconController Controller = new SparkleStatusIconController();
private Forms.Timer Animation; private Drawing.Bitmap [] animation_frames;
private Drawing.Bitmap [] AnimationFrames; private Drawing.Bitmap error_icon;
private Drawing.Bitmap ErrorIcon;
private int FrameNumber;
private string StateText;
private ContextMenu context_menu; private ContextMenu context_menu;
private SparkleMenuItem status_item;
private SparkleMenuItem state_item;
private SparkleMenuItem exit_item; private SparkleMenuItem exit_item;
private SparkleNotifyIcon notify_icon = new SparkleNotifyIcon (); private SparkleNotifyIcon notify_icon = new SparkleNotifyIcon ();
@ -52,123 +51,40 @@ namespace SparkleShare {
public SparkleStatusIcon () public SparkleStatusIcon ()
{ {
AnimationFrames = CreateAnimationFrames (); CreateAnimationFrames ();
Animation = CreateAnimation ();
ErrorIcon = SparkleUIHelpers.GetBitmap ("sparkleshare-syncing-error-windows");
this.notify_icon.Icon = AnimationFrames [0]; this.notify_icon.Icon = animation_frames [0];
this.notify_icon.HeaderText = "SparkleShare"; this.notify_icon.HeaderText = "SparkleShare";
StateText = _("Welcome to SparkleShare!");
CreateMenu (); CreateMenu ();
Controller.UpdateQuitItemEvent += delegate (bool enable) { Controller.UpdateIconEvent += delegate (int icon_frame) {
Dispatcher.Invoke ((Action) delegate { Dispatcher.Invoke ((Action) delegate {
this.exit_item.IsEnabled = enable; this.notify_icon.Icon = animation_frames [icon_frame];
this.exit_item.UpdateLayout ();
}); });
}; };
Controller.UpdateStatusItemEvent += delegate (string state_text) {
Dispatcher.Invoke ((Action) delegate {
this.state_item.Header = state_text;
this.state_item.UpdateLayout ();
this.notify_icon.HeaderText = "SparkleShare\n" + state_text;
});
};
Controller.UpdateMenuEvent += delegate (IconState state) { Controller.UpdateMenuEvent += delegate (IconState state) {
Dispatcher.Invoke ((Action) delegate { Dispatcher.Invoke ((Action) delegate {
switch (state) {
case IconState.Idle: {
Animation.Stop ();
if (Controller.Folders.Length == 0)
this.notify_icon.Text = StateText = "Welcome to SparkleShare!";
else
this.notify_icon.Text = StateText = "Files up to date" + Controller.FolderSize;
this.status_item.Header = StateText;
this.notify_icon.Icon = AnimationFrames [0];
CreateMenu (); CreateMenu ();
break;
}
default: {
string state_text;
if (state == IconState.SyncingUp)
state_text = "Sending files…";
else if (state == IconState.SyncingDown)
state_text = "Receiving files…";
else
state_text = "Syncing…";
this.notify_icon.Text = StateText = state_text + " " +
Controller.ProgressPercentage + "% " +
Controller.ProgressSpeed;
this.status_item.Header = StateText;
if (!Animation.Enabled)
Animation.Start ();
break;
}
case IconState.Error: {
Animation.Stop ();
this.notify_icon.Text = StateText = _("Not everything is synced");
this.status_item.Header = StateText;
CreateMenu ();
this.notify_icon.Icon = ErrorIcon;
break;
}
}
this.status_item.UpdateLayout ();
}); });
}; };
}
private Drawing.Bitmap [] CreateAnimationFrames ()
{
return new Drawing.Bitmap [] {
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-i"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-ii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iiii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iiiii")
};
}
// Creates the Animation that handles the syncing animation
private Forms.Timer CreateAnimation ()
{
FrameNumber = 0;
Forms.Timer Animation = new Forms.Timer () {
Interval = 35
};
Animation.Tick += delegate {
if (FrameNumber < AnimationFrames.Length - 1)
FrameNumber++;
else
FrameNumber = 0;
Controller.UpdateQuitItemEvent += delegate (bool exit_item_enabled) {
Dispatcher.Invoke ((Action) delegate { Dispatcher.Invoke ((Action) delegate {
this.notify_icon.Icon = AnimationFrames [FrameNumber]; this.exit_item.IsEnabled = exit_item_enabled;
this.exit_item.UpdateLayout ();
}); });
}; };
return Animation;
} }
@ -176,11 +92,13 @@ namespace SparkleShare {
{ {
this.context_menu = new ContextMenu (); this.context_menu = new ContextMenu ();
status_item = new SparkleMenuItem () { this.state_item = new SparkleMenuItem () {
Header = StateText, Header = Controller.StateText,
IsEnabled = false IsEnabled = false
}; };
this.notify_icon.HeaderText = "SparkleShare\n" + Controller.StateText;
Image folder_image = new Image () { Image folder_image = new Image () {
Source = SparkleUIHelpers.GetImageSource ("folder-sparkleshare-windows-16"), Source = SparkleUIHelpers.GetImageSource ("folder-sparkleshare-windows-16"),
Width = 16, Width = 16,
@ -237,7 +155,7 @@ namespace SparkleShare {
Controller.AboutClicked (); Controller.AboutClicked ();
}; };
exit_item = new SparkleMenuItem () { this.exit_item = new SparkleMenuItem () {
Header = "Exit" Header = "Exit"
}; };
@ -247,7 +165,7 @@ namespace SparkleShare {
}; };
this.context_menu.Items.Add (status_item); this.context_menu.Items.Add (this.state_item);
this.context_menu.Items.Add (new Separator ()); this.context_menu.Items.Add (new Separator ());
this.context_menu.Items.Add (folder_item); this.context_menu.Items.Add (folder_item);
@ -312,6 +230,20 @@ namespace SparkleShare {
} }
private void CreateAnimationFrames ()
{
this.animation_frames = new Drawing.Bitmap [] {
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-i"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-ii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iiii"),
SparkleUIHelpers.GetBitmap ("process-syncing-sparkleshare-windows-iiiii")
};
this.error_icon = SparkleUIHelpers.GetBitmap ("sparkleshare-syncing-error-windows");
}
// A method reference that makes sure that opening the // A method reference that makes sure that opening the
// event log for each repository works correctly // event log for each repository works correctly
private RoutedEventHandler OpenFolderDelegate (string folder_name) private RoutedEventHandler OpenFolderDelegate (string folder_name)