linux statusicon: Implement per repo status and resume

This commit is contained in:
Hylke Bons 2014-10-31 19:56:02 +00:00
parent 840ef0b961
commit ee5f6e862e
3 changed files with 67 additions and 20 deletions

View file

@ -16,6 +16,7 @@
using System;
using System.Collections.Generic;
using Gtk;
#if HAVE_APP_INDICATOR
@ -32,6 +33,7 @@ namespace SparkleShare {
private MenuItem recent_events_item;
private MenuItem quit_item;
private MenuItem state_item;
private SparkleMenuItem [] state_menu_items;
#if HAVE_APP_INDICATOR
private Indicator indicator;
@ -89,6 +91,13 @@ namespace SparkleShare {
Application.Invoke (delegate {
(this.state_item.Child as Label).Text = state_text;
this.state_item.ShowAll ();
if (Controller.Projects.Length == this.state_menu_items.Length) {
for (int i = 0; i < Controller.Projects.Length; i++) {
(this.state_menu_items [i].Child as Label).Text = Controller.Projects [i].StatusMessage;
this.state_menu_items [i].ShowAll ();
}
}
});
};
@ -117,35 +126,68 @@ namespace SparkleShare {
this.menu.Add (new SeparatorMenuItem ());
this.menu.Add (folder_item);
if (Program.Controller.Folders.Count > 0) {
this.state_menu_items = new SparkleMenuItem [Controller.Projects.Length];
if (Controller.Projects.Length > 0) {
int i = 0;
foreach (string folder_name in Controller.Folders) {
ImageMenuItem item = new SparkleMenuItem (folder_name);
foreach (ProjectInfo project in Controller.Projects) {
SparkleMenuItem item = new SparkleMenuItem (project.Name);
Gdk.Pixbuf folder_icon;
folder_icon = IconTheme.Default.LoadIcon ("folder", 16, IconLookupFlags.GenericFallback);
if (!string.IsNullOrEmpty (Controller.FolderErrors [i])) {
folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16, IconLookupFlags.GenericFallback);
item.Submenu = new Menu ();
item.Submenu = new Menu ();
this.state_menu_items [i] = new MenuItem (project.StatusMessage) { Sensitive = false };
(item.Submenu as Menu).Add (this.state_menu_items [i]);
(item.Submenu as Menu).Add (new SeparatorMenuItem ());
if (project.IsPaused) {
MenuItem resume_item;
if (project.UnsyncedChangesInfo.Count > 0) {
string icons_path = new string [] {SparkleUI.AssetsPath, "icons", "hicolor", "12x12", "status"}.Combine ();
foreach (KeyValuePair<string, string> pair in project.UnsyncedChangesInfo)
(item.Submenu as Menu).Add (new MenuItem (pair.Key) {
Image = new Image () {
File = new string [] {icons_path, pair.Value.Replace ("-12", ""))}.Combine () },
Sensitive = false
});
MenuItem error_item = new MenuItem (Controller.FolderErrors [i]) { Sensitive = false };
MenuItem try_again_item = new MenuItem ("Try Again");
try_again_item.Activated += Controller.TryAgainDelegate (folder_name);
(item.Submenu as Menu).Add (error_item);
(item.Submenu as Menu).Add (new SeparatorMenuItem ());
(item.Submenu as Menu).Add (try_again_item);
(item.Submenu as Menu).Add (new SeparatorMenuItem ());
resume_menu_items = new MenuItem ("Sync and Resume…");
} else {
resume_item = new MenuItem ("Resume");
}
resume_item.Activated += Controller.ResumeDelegate (project.Name);
(item.Submenu as Menu).Add (resume_item);
} else {
folder_icon = IconTheme.Default.LoadIcon ("folder", 16, IconLookupFlags.GenericFallback);
item.Activated += Controller.OpenFolderDelegate (folder_name);
if (Controller.Projects [i].HasError) {
folder_icon = IconTheme.Default.LoadIcon ("dialog-warning", 16, IconLookupFlags.GenericFallback);
MenuItem try_again_item = new MenuItem ("Try Again");
try_again_item.Activated += Controller.TryAgainDelegate (project.Name);
(item.Submenu as Menu).Add (try_again_item);
} else {
MenuItem pause_item = new MenuItem ("Pause");
pause_item.Activated += Controller.PauseDelegate (project.Name);
(item.Submenu as Menu).Add (pause_item);
}
}
(item.Child as Label).UseUnderline = false;
item.Image = new Image (folder_icon);
this.menu.Add (item);
i++;
}
};
}
this.recent_events_item = new MenuItem ("Recent Changes…");

View file

@ -221,12 +221,13 @@ namespace SparkleShare {
this.try_again_menu_items [i] = new NSMenuItem ();
this.try_again_menu_items [i].Title = "Try Again";
this.try_again_menu_items [i].Activated += Controller.TryAgainDelegate (project.Name);
item.Submenu.AddItem (this.try_again_menu_items [i]);
} else {
this.pause_menu_items [i] = new NSMenuItem ("Pause");
this.pause_menu_items [i].Activated += Controller.PauseDelegate (project.Name);
item.Submenu.AddItem (this.pause_menu_items [i]);
}
}

View file

@ -183,6 +183,10 @@ namespace SparkleShare {
this.context_menu.Items.Add (new Separator ());
this.context_menu.Items.Add (folder_item);
/*
if (Controller.Folders.Length > 0) {
int i = 0;
foreach (string folder_name in Controller.Folders) {
@ -226,7 +230,7 @@ namespace SparkleShare {
this.context_menu.Items.Add (subfolder_item);
i++;
}
}
}*/
folder_item.Items.Add (this.log_item);
folder_item.Items.Add (add_item);