a4be542ea8f8967c76701b8772f21f12cb661616
[WebThing.git] / plugins / LoadProgress.cs
1 using System;
2 using Gtk;
3 using WebKit;
4 using bytex64.WebThing;
5
6 public class LoadThrobber : Gtk.DrawingArea {
7     public enum Mode {
8         LoadStarted,
9         LoadInProgress,
10         LoadFinished
11     };
12     public Mode LoadState;
13     int r;
14     uint idletimer;
15
16     public LoadThrobber(WebThing wt) {
17         LoadState = Mode.LoadStarted;
18
19         wt.WebView.LoadStarted += WebView_LoadStarted;
20         wt.WebView.LoadCommitted += WebView_LoadCommitted;
21         wt.WebView.LoadProgressChanged += WebView_LoadProgressChanged;
22         wt.WebView.LoadFinished += WebView_LoadFinished;
23
24         SetSizeRequest(64, 64);
25     }
26
27     protected override bool OnExposeEvent(Gdk.EventExpose e) {
28         Gdk.Window w = e.Window;
29         Gdk.GC gc = new Gdk.GC(w);
30         int width, height;
31         w.GetSize(out width, out height);
32
33         gc.Foreground = new Gdk.Color(0, 0, 0);
34         gc.SetLineAttributes(3, Gdk.LineStyle.Solid, Gdk.CapStyle.Butt, Gdk.JoinStyle.Round);
35         w.Clear();
36
37         switch(LoadState) {
38         case Mode.LoadStarted:
39             w.DrawArc(gc, false, 4, 4, width-8, width-8, -r*64, 90*64);
40             w.DrawArc(gc, false, 4, 4, width-8, width-8, -r*64 + 180*64, 90*64);
41             r += 5;
42             break;
43         case Mode.LoadInProgress:
44         case Mode.LoadFinished:
45             w.DrawArc(gc, false, 4, 4, width-8, width-8, 90*64, -r*64);
46             break;
47         }
48         return true;
49     }
50
51     void WebView_LoadStarted(object o, LoadStartedArgs e) {
52         this.Show();
53         Console.WriteLine("Loading Started");
54         LoadState = Mode.LoadStarted;
55         idletimer = GLib.Timeout.Add(100, delegate {
56             QueueDraw();
57             return true;
58         });
59     }
60
61     void WebView_LoadCommitted(object o, LoadCommittedArgs e) {
62         Console.WriteLine("Loading Committed");
63         LoadState = Mode.LoadInProgress;
64         GLib.Source.Remove(idletimer);
65         r = 0;
66         QueueDraw();
67     }
68
69     void WebView_LoadProgressChanged(object o, LoadProgressChangedArgs e) {
70         Console.WriteLine("Loading Progress: {0}", e.Progress);
71         r = (int) ((e.Progress / 100.0) * 360);
72         QueueDraw();
73     }
74
75     void WebView_LoadFinished(object o, LoadFinishedArgs e) {
76         Console.WriteLine("Loading Finished");
77         LoadState = Mode.LoadFinished;
78         this.Hide();
79     }
80 }
81
82 public class LoadThrobberPlugin : WebThingPlugin {
83     public void Init(WebThing wt) {
84         LoadThrobber lt = new LoadThrobber(wt);
85         wt.AttachWidget(lt, CompassDirection.Interior);
86     }
87 }