New thread + spinner instead of freeze when opening big logs

This commit is contained in:
Hylke Bons 2011-03-16 14:48:15 +00:00
parent 35bca303ba
commit dbf5d1158a
4 changed files with 96 additions and 50 deletions

View file

@ -15,13 +15,14 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
using Meebey.SmartIrc4net;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Security.Cryptography; using System.Security.Cryptography;
using Meebey.SmartIrc4net;
namespace SparkleLib { namespace SparkleLib {
// A persistent connection to the server that // A persistent connection to the server that

View file

@ -363,7 +363,7 @@ namespace SparkleShare {
Deletable = true; Deletable = true;
Application.Invoke (delegate { Application.Invoke (delegate {
ShowSuccessPage (name); ShowSuccessPage (name); // FIXME: doesn't always get called on big repos
}); });
}; };
@ -371,7 +371,6 @@ namespace SparkleShare {
SparkleShare.Controller.FolderFetchError += delegate { SparkleShare.Controller.FolderFetchError += delegate {
Deletable = true; Deletable = true;
Application.Invoke (delegate { ShowErrorPage (); }); Application.Invoke (delegate { ShowErrorPage (); });
}; };
@ -637,7 +636,7 @@ namespace SparkleShare {
AddButton (button); AddButton (button);
SparkleSpinner spinner = new SparkleSpinner (22); // SparkleSpinner spinner = new SparkleSpinner (22);
Table table = new Table (3, 2, false) { Table table = new Table (3, 2, false) {
RowSpacing = 12, RowSpacing = 12,
@ -646,7 +645,7 @@ namespace SparkleShare {
HBox box = new HBox (false, 0); HBox box = new HBox (false, 0);
table.Attach (spinner, 0, 1, 0, 1); // table.Attach (spinner, 0, 1, 0, 1);
table.Attach (header, 1, 2, 0, 1); table.Attach (header, 1, 2, 0, 1);
table.Attach (information, 1, 2, 1, 2); table.Attach (information, 1, 2, 1, 2);

View file

@ -19,6 +19,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading;
using Gtk; using Gtk;
using Mono.Unix; using Mono.Unix;
@ -36,6 +37,8 @@ namespace SparkleShare {
private MenuBar MenuBar; private MenuBar MenuBar;
private WebView WebView; private WebView WebView;
private string LinkStatus; private string LinkStatus;
private SparkleSpinner Spinner;
private string HTML;
// Short alias for the translations // Short alias for the translations
@ -69,12 +72,44 @@ namespace SparkleShare {
Title = String.Format(_("Events in {0}"), name); Title = String.Format(_("Events in {0}"), name);
IconName = "folder-sparkleshare"; IconName = "folder-sparkleshare";
DeleteEvent += Close; DeleteEvent += Close;
LayoutVertical = new VBox (false, 0);
CreateEventLog (); CreateEventLog ();
}
private void CreateEventLog () {
LayoutVertical = new VBox (false, 0);
ScrolledWindow = new ScrolledWindow ();
WebView = new WebView () {
Editable = false
};
WebView.HoveringOverLink += delegate (object o, WebKit.HoveringOverLinkArgs args) {
LinkStatus = args.Link;
};
WebView.NavigationRequested += delegate (object o, WebKit.NavigationRequestedArgs args) {
if (args.Request.Uri == LinkStatus) {
Process process = new Process ();
process.StartInfo.FileName = "xdg-open";
process.StartInfo.Arguments = args.Request.Uri.Replace (" ", "\\ "); // Escape space-characters
process.Start ();
}
// FIXME: webview should stay on the same page
};
ScrolledWindow.AddWithViewport (WebView);
LayoutVertical.PackStart (ScrolledWindow, true, true, 0); LayoutVertical.PackStart (ScrolledWindow, true, true, 0);
UpdateEventLog (); UpdateEventLog ();
@ -115,65 +150,76 @@ namespace SparkleShare {
} }
public void CreateEventLog () { public void UpdateEventLog ()
{
WebView = new WebView () { if (HTML == null) {
Editable = false
};
WebView.HoveringOverLink += delegate (object o, WebKit.HoveringOverLinkArgs args) { LayoutVertical.Remove (ScrolledWindow);
LinkStatus = args.Link; Spinner = new SparkleSpinner (22);
}; LayoutVertical.PackStart (Spinner, true, true, 0);
WebView.NavigationRequested += delegate (object o, WebKit.NavigationRequestedArgs args) { }
if (args.Request.Uri == LinkStatus) { Thread thread = new Thread (new ThreadStart (delegate {
Process process = new Process (); GenerateHTML ();
process.StartInfo.FileName = "xdg-open"; AddHTML ();
process.StartInfo.Arguments = args.Request.Uri.Replace (" ", "\\ "); // Escape space-characters
process.Start ();
} }));
// FIXME: webview should stay on the same page thread.Start ();
};
ScrolledWindow = new ScrolledWindow ();
ScrolledWindow.AddWithViewport (WebView);
} }
public void UpdateEventLog () private void GenerateHTML () {
{
string html = SparkleShare.Controller.GetHTMLLog (System.IO.Path.GetFileName (LocalPath)); HTML = SparkleShare.Controller.GetHTMLLog (System.IO.Path.GetFileName (LocalPath));
html = html.Replace ("<!-- $body-font-size -->", (Style.FontDescription.Size / 1024 + 0.5) + "pt"); HTML = HTML.Replace ("<!-- $body-font-size -->", (Style.FontDescription.Size / 1024 + 0.5) + "pt");
html = html.Replace ("<!-- $body-font-family -->", "\"" + Style.FontDescription.Family + "\""); HTML = HTML.Replace ("<!-- $body-font-family -->", "\"" + Style.FontDescription.Family + "\"");
html = html.Replace ("<!-- $body-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Normal))); HTML = HTML.Replace ("<!-- $body-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Normal)));
html = html.Replace ("<!-- $body-background-color -->", SparkleUIHelpers.GdkColorToHex (new TreeView ().Style.Base (StateType.Normal))); HTML = HTML.Replace ("<!-- $body-background-color -->", SparkleUIHelpers.GdkColorToHex (new TreeView ().Style.Base (StateType.Normal)));
html = html.Replace ("<!-- $day-entry-header-background-color -->", SparkleUIHelpers.GdkColorToHex (Style.Background (StateType.Normal))); HTML = HTML.Replace ("<!-- $day-entry-header-background-color -->", SparkleUIHelpers.GdkColorToHex (Style.Background (StateType.Normal)));
html = html.Replace ("<!-- $secondary-font-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive))); HTML = HTML.Replace ("<!-- $secondary-font-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive)));
html = html.Replace ("<!-- $small-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive))); HTML = HTML.Replace ("<!-- $small-color -->", SparkleUIHelpers.GdkColorToHex (Style.Foreground (StateType.Insensitive)));
html = html.Replace ("<!-- $no-buddy-icon-background-image -->", "file://" + HTML = HTML.Replace ("<!-- $no-buddy-icon-background-image -->", "file://" +
SparkleHelpers.CombineMore (Defines.PREFIX, "share", "sparkleshare", "icons", SparkleHelpers.CombineMore (Defines.PREFIX, "share", "sparkleshare", "icons",
"hicolor", "32x32", "status", "avatar-default.png")); "hicolor", "32x32", "status", "avatar-default.png"));
WebView.LoadString (html, null, null, "file://"); }
LayoutVertical.Remove (ScrolledWindow);
ScrolledWindow = new ScrolledWindow ();
Viewport viewport = new Viewport ();
WebView.Reparent (viewport);
ScrolledWindow.Add (viewport);
(ScrolledWindow.Child as Viewport).ShadowType = ShadowType.None;
LayoutVertical.PackStart (ScrolledWindow, true, true, 0);
LayoutVertical.ReorderChild (ScrolledWindow, 0);
LayoutVertical.ShowAll (); private void AddHTML ()
{
Application.Invoke (delegate {
WebView.LoadString (HTML, null, null, "file://");
if (Spinner.Active) {
LayoutVertical.Remove (Spinner);
Spinner.Stop ();
} else {
LayoutVertical.Remove (ScrolledWindow);
}
ScrolledWindow = new ScrolledWindow ();
Viewport viewport = new Viewport ();
WebView.Reparent (viewport);
ScrolledWindow.Add (viewport);
(ScrolledWindow.Child as Viewport).ShadowType = ShadowType.None;
LayoutVertical.PackStart (ScrolledWindow, true, true, 0);
LayoutVertical.ReorderChild (ScrolledWindow, 0);
LayoutVertical.ShowAll ();
});
} }

View file

@ -85,7 +85,7 @@ namespace SparkleShare {
else else
CurrentStep = 0; CurrentStep = 0;
// Application.Invoke (delegate { SetImage (); }); Application.Invoke (delegate { SetImage (); });
} }