X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=TextDisplay.cs;h=282fc7fb4435b6346c4e24220871e89c76c866a0;hb=HEAD;hp=4e753de028af45c11f848411cccf364fc857b31a;hpb=822c67be52521bd601cd01b66974bb6c0df967bf;p=Nebula.git diff --git a/TextDisplay.cs b/TextDisplay.cs index 4e753de..282fc7f 100644 --- a/TextDisplay.cs +++ b/TextDisplay.cs @@ -1,22 +1,30 @@ using System; +using System.Timers; using Cairo; using Pango; +using Gdk; using Gtk; public class TextDisplay : DrawingArea, IKeyPress { private TextDocument doc = null; - private Font font; + private Pango.Font font; // FIXME: Proportional fonts? - private float fontwidth; - private float fontheight; + private float fontWidth; + private float fontHeight; + + private Timer helpTimer; + private HelpBox controlHelp; + private bool showHelp; public TextDisplay() { FontDescription fd = Pango.FontDescription.FromString("Courier 12"); font = this.PangoContext.LoadFont(fd); FontMetrics fm = font.GetMetrics(null); - fontheight = Pango.Units.ToPixels(fm.Ascent + fm.Descent); - fontwidth = fontheight * 0.5333f; - Console.WriteLine("Using {0} {1}pt ({2}x{3}px)", fd.Family, fd.Size, fontwidth, fontheight); + fontHeight = Pango.Units.ToPixels(fm.Ascent + fm.Descent); + fontWidth = fontHeight * 0.5333f; + Console.WriteLine("Using {0} {1}pt ({2}x{3}px)", fd.Family, fd.Size, fontWidth, fontHeight); + + controlHelp = new HelpBox(this.PangoContext, "control_help"); ModifyBg(StateType.Normal, new Gdk.Color(0xFF, 0xFF, 0xFF)); } @@ -37,14 +45,17 @@ public class TextDisplay : DrawingArea, IKeyPress { gr.MoveTo(0, 0); Pango.CairoHelper.ShowLayout(gr, layout); - gr.Operator = Operator.Xor; + gr.SetSourceRGB(0.0, 0.0, 0.0); gr.NewPath(); - gr.Rectangle((doc.cursor.x - doc.textorigin.x)*fontwidth, (doc.cursor.y - doc.textorigin.y)*fontheight, fontwidth, fontheight); + gr.Rectangle((doc.cursor.x - doc.textorigin.x)*fontWidth, (doc.cursor.y - doc.textorigin.y)*fontHeight, fontWidth, fontHeight); gr.Fill(); + + if (showHelp) { + controlHelp.draw(gr, width, height); + } } - protected override bool OnExposeEvent(Gdk.EventExpose args) - { + protected override bool OnExposeEvent(Gdk.EventExpose args) { Gdk.Window win = args.Window; #if OLD_SYSTEMS @@ -74,17 +85,61 @@ public class TextDisplay : DrawingArea, IKeyPress { protected override void OnSizeAllocated(Gdk.Rectangle r) { base.OnSizeAllocated(r); if (doc != null) - doc.SetPageSize((int)(r.Width / fontwidth) - 1, (int)(r.Height / fontheight) - 1); + doc.SetPageSize((int)(r.Width / fontWidth) - 1, (int)(r.Height / fontHeight) - 1); } public void Update() { QueueDraw(); } + public void ShowHelp() { + showHelp = true; + helpTimer = null; + QueueDraw(); + } + + public void HideHelp() { + if (helpTimer != null) { + helpTimer.Stop(); + helpTimer = null; + } + if (showHelp) + showHelp = false; + QueueDraw(); + } [GLib.ConnectBefore ()] public void KeyPress(object o, KeyPressEventArgs args) { if (doc == null) return; + if ((args.Event.State & ModifierType.ControlMask) != 0) { + switch(args.Event.Key) { + default: + HideHelp(); + break; + } + } else { + switch(args.Event.Key) { + case Gdk.Key.Control_L: + case Gdk.Key.Control_R: + helpTimer = new Timer(); + helpTimer.Elapsed += delegate(object o2, ElapsedEventArgs e) { + ShowHelp(); + }; + helpTimer.AutoReset = false; + helpTimer.Interval = 1000; + helpTimer.Start(); + break; + } + } doc.KeyPress(o, args); } + + public void KeyRelease(object o, KeyReleaseEventArgs e) { + switch(e.Event.Key) { + case Gdk.Key.Control_L: + case Gdk.Key.Control_R: + HideHelp(); + break; + } + } }