SparkleStatusIcon: update coding style
This commit is contained in:
parent
1755c3636b
commit
38d3d083ac
236
SparkleShare/SparkleStatusIcon.cs
Normal file
236
SparkleShare/SparkleStatusIcon.cs
Normal file
|
@ -0,0 +1,236 @@
|
|||
// SparkleShare, an instant update workflow to Git.
|
||||
// Copyright (C) 2010 Hylke Bons <hylkebons@gmail.com>
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
using Gtk;
|
||||
using Mono.Unix;
|
||||
using SparkleShare;
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Timers;
|
||||
|
||||
namespace SparkleShare {
|
||||
|
||||
public class SparkleStatusIcon : StatusIcon
|
||||
{
|
||||
|
||||
private Timer Timer;
|
||||
private int SyncingState;
|
||||
|
||||
// Short alias for the translations
|
||||
public static string _ (string s) {
|
||||
return Catalog.GetString (s);
|
||||
}
|
||||
|
||||
public EventHandler CreateWindowDelegate (SparkleRepo SparkleRepo)
|
||||
{
|
||||
return delegate {
|
||||
SparkleWindow SparkleWindow = new SparkleWindow (SparkleRepo);
|
||||
SparkleWindow.ShowAll ();
|
||||
};
|
||||
}
|
||||
|
||||
public SparkleStatusIcon () : base ()
|
||||
{
|
||||
|
||||
Timer = new Timer ();
|
||||
Activate += ShowMenu;
|
||||
|
||||
// 0 = Everything up to date
|
||||
// 1 = Syncing in progress
|
||||
// -1 = Error syncing
|
||||
SyncingState = 0;
|
||||
|
||||
SetIdleState ();
|
||||
|
||||
}
|
||||
|
||||
public void ShowMenu (object o, EventArgs Args)
|
||||
{
|
||||
|
||||
Menu Menu = new Menu ();
|
||||
|
||||
string StateText = "";
|
||||
switch (SyncingState) {
|
||||
case -1:
|
||||
StateText = _("Error syncing");
|
||||
break;
|
||||
case 0:
|
||||
StateText = _("Everything is up to date");
|
||||
break;
|
||||
case 1:
|
||||
StateText = _("Syncing…");
|
||||
break;
|
||||
}
|
||||
|
||||
MenuItem StatusMenuItem = new MenuItem (StateText);
|
||||
StatusMenuItem.Sensitive = false;
|
||||
|
||||
Menu.Add (StatusMenuItem);
|
||||
Menu.Add (new SeparatorMenuItem ());
|
||||
|
||||
Action FolderAction = new Action ("", "SparkleShare");
|
||||
FolderAction.IconName = "folder-sparkleshare";
|
||||
FolderAction.IsImportant = true;
|
||||
FolderAction.Activated += delegate {
|
||||
Process Process = new Process ();
|
||||
switch (SparklePlatform.Name) {
|
||||
case "GNOME":
|
||||
Process.StartInfo.FileName = "xdg-open";
|
||||
break;
|
||||
case "OSX":
|
||||
Process.StartInfo.FileName = "open";
|
||||
break;
|
||||
}
|
||||
Process.StartInfo.Arguments = SparklePaths.SparklePath;
|
||||
Process.Start ();
|
||||
};
|
||||
Menu.Add (FolderAction.CreateMenuItem ());
|
||||
|
||||
Action [] FolderItems =
|
||||
new Action [SparkleShare.Repositories.Length];
|
||||
|
||||
int i = 0;
|
||||
foreach (SparkleRepo SparkleRepo in SparkleShare.Repositories) {
|
||||
FolderItems [i] = new Action ("", SparkleRepo.Name);
|
||||
FolderItems [i].IconName = "folder";
|
||||
FolderItems [i].IsImportant = true;
|
||||
FolderItems [i].Activated += CreateWindowDelegate (SparkleRepo);
|
||||
Menu.Add (FolderItems [i].CreateMenuItem ());
|
||||
i++;
|
||||
}
|
||||
|
||||
MenuItem AddItem = new MenuItem (_("Add a Remote Folder…"));
|
||||
AddItem.Activated += delegate {
|
||||
SparkleDialog SparkleDialog = new SparkleDialog ("");
|
||||
SparkleDialog.ShowAll ();
|
||||
};
|
||||
Menu.Add (AddItem);
|
||||
Menu.Add (new SeparatorMenuItem ());
|
||||
|
||||
CheckMenuItem NotifyCheckMenuItem = new CheckMenuItem (_("Show Notifications"));
|
||||
Menu.Add (NotifyCheckMenuItem);
|
||||
Menu.Add (new SeparatorMenuItem ());
|
||||
|
||||
string NotifyChangesFileName = SparkleHelpers.CombineMore (SparklePaths.SparkleConfigPath,
|
||||
"sparkleshare.notify");
|
||||
|
||||
if (System.IO.File.Exists (NotifyChangesFileName))
|
||||
NotifyCheckMenuItem.Active = true;
|
||||
|
||||
NotifyCheckMenuItem.Toggled += delegate {
|
||||
if (System.IO.File.Exists (NotifyChangesFileName)) {
|
||||
File.Delete (NotifyChangesFileName);
|
||||
} else {
|
||||
System.IO.File.Create (NotifyChangesFileName);
|
||||
}
|
||||
};
|
||||
|
||||
MenuItem AboutItem = new MenuItem (_("Visit Website"));
|
||||
AboutItem.Activated += delegate {
|
||||
Process Process = new Process ();
|
||||
switch (SparklePlatform.Name) {
|
||||
case "GNOME":
|
||||
Process.StartInfo.FileName = "xdg-open";
|
||||
break;
|
||||
case "OSX":
|
||||
Process.StartInfo.FileName = "open";
|
||||
break;
|
||||
}
|
||||
Process.StartInfo.Arguments = "http://www.sparkleshare.org/";
|
||||
Process.Start ();
|
||||
};
|
||||
Menu.Add (AboutItem);
|
||||
|
||||
Menu.Add (new SeparatorMenuItem ());
|
||||
MenuItem QuitItem = new MenuItem (_("Quit"));
|
||||
QuitItem.Activated += Quit;
|
||||
Menu.Add (QuitItem);
|
||||
Menu.ShowAll ();
|
||||
Menu.Popup (null, null, SetPosition, 0, Global.CurrentEventTime);
|
||||
}
|
||||
|
||||
public void SetIdleState ()
|
||||
{
|
||||
Timer.Stop ();
|
||||
Pixbuf = SparkleHelpers.GetIcon ("folder-sparkleshare", 24);
|
||||
SyncingState = 0;
|
||||
}
|
||||
|
||||
// Changes the status icon to the syncing animation
|
||||
// TODO: There are UI freezes when switching back and forth
|
||||
// bewteen syncing and idle state
|
||||
public void SetSyncingState ()
|
||||
{
|
||||
|
||||
SyncingState = 1;
|
||||
|
||||
int CycleDuration = 250;
|
||||
int CurrentStep = 0;
|
||||
int Size = 24;
|
||||
|
||||
Gdk.Pixbuf SpinnerGallery = SparkleHelpers.GetIcon ("process-syncing-sparkleshare", Size);
|
||||
|
||||
int FramesInWidth = SpinnerGallery.Width / Size;
|
||||
int FramesInHeight = SpinnerGallery.Height / Size;
|
||||
int NumSteps = FramesInWidth * FramesInHeight;
|
||||
Gdk.Pixbuf [] Images = new Gdk.Pixbuf [NumSteps - 1];
|
||||
|
||||
int i = 0;
|
||||
for (int y = 0; y < FramesInHeight; y++) {
|
||||
for (int x = 0; x < FramesInWidth; x++) {
|
||||
if (!(y == 0 && x == 0)) {
|
||||
Images [i] = new Gdk.Pixbuf (SpinnerGallery, x * Size, y * Size, Size, Size);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Timer = new Timer ();
|
||||
Timer.Interval = CycleDuration / NumSteps;
|
||||
Timer.Elapsed += delegate {
|
||||
if (CurrentStep < NumSteps)
|
||||
CurrentStep++;
|
||||
else
|
||||
CurrentStep = 0;
|
||||
Pixbuf = Images [CurrentStep];
|
||||
};
|
||||
Timer.Start ();
|
||||
|
||||
}
|
||||
|
||||
// Changes the status icon to the error icon
|
||||
public void SetErrorState ()
|
||||
{
|
||||
IconName = "folder-sync-error";
|
||||
SyncingState = -1;
|
||||
}
|
||||
|
||||
public void SetPosition (Menu menu, out int x, out int y, out bool push_in)
|
||||
{
|
||||
PositionMenu (menu, out x, out y, out push_in, Handle);
|
||||
}
|
||||
|
||||
// Quits the program
|
||||
public void Quit (object o, EventArgs args)
|
||||
{
|
||||
System.IO.File.Delete (SparkleHelpers.CombineMore (SparklePaths.SparkleTmpPath, "sparkleshare.pid"));
|
||||
Application.Quit ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue