GtkSharp/sample/GtkDemo/DemoCssBasics.cs
Bertrand Lorentz f6003f94a4 GtkDemo: Add a CssBasics demo to demonstrate CSS theming
The main difference with the C demo is that we can't use GResource, as
it's only in gio 2.32 and later, so '@import url("resource://...' won't
work. Instead, we use a separate CssProvider to apply reset.css.
2014-05-29 21:44:49 +02:00

100 lines
2.4 KiB
C#

/* CSS Theming/CSS Basics
*
* Gtk themes are written using CSS. Every widget is build of multiple items
* that you can style very similarly to a regular website.
*
*/
using System;
using System.IO;
using System.Reflection;
using Gtk;
namespace GtkDemo
{
[Demo ("CSS Basics", "DemoCssBasics.cs", "CSS Theming")]
public class DemoCssBasics : Window
{
TextBuffer buffer;
CssProvider provider;
CssProvider provider_reset;
public DemoCssBasics () : base ("CSS Basics")
{
SetDefaultSize (600, 500);
buffer = new TextBuffer (null);
var warning = new TextTag ("warning");
warning.Underline = Pango.Underline.Single;
buffer.TagTable.Add (warning);
var error = new TextTag ("error");
error.Underline = Pango.Underline.Error;
buffer.TagTable.Add (error);
provider = new CssProvider ();
provider_reset = new CssProvider ();
var container = new ScrolledWindow ();
Add (container);
var view = new TextView (buffer);
container.Add (view);
buffer.Changed += OnCssTextChanged;
using (Stream stream = Assembly.GetExecutingAssembly ().GetManifestResourceStream ("reset.css"))
using (StreamReader reader = new StreamReader(stream))
{
provider_reset.LoadFromData (reader.ReadToEnd());
}
using (Stream stream = Assembly.GetExecutingAssembly ().GetManifestResourceStream ("css_basics.css"))
using (StreamReader reader = new StreamReader(stream))
{
buffer.Text = reader.ReadToEnd();
}
// TODO: Connect to "parsing-error" signal in CssProvider, added in GTK+ 3.2
ApplyCss (this, provider_reset, 800);
ApplyCss (this, provider, UInt32.MaxValue);
ShowAll ();
}
private void ApplyCss (Widget widget, CssProvider provider, uint priority)
{
widget.StyleContext.AddProvider (provider, priority);
var container = widget as Container;
if (container != null) {
foreach (var child in container.Children) {
ApplyCss (child, provider, priority);
}
}
}
private void OnCssTextChanged (object sender, EventArgs e)
{
var start = buffer.StartIter;
var end = buffer.EndIter;
buffer.RemoveAllTags (start, end);
string text = buffer.Text;
try {
provider.LoadFromData (text);
} catch (GLib.GException) {
// Ignore parsing errors
}
StyleContext.ResetWidgets (Gdk.Screen.Default);
}
protected override bool OnDeleteEvent (Gdk.Event evt)
{
Destroy ();
return true;
}
}
}