GtkSharp/Source/sample/ScribbleXInput.cs
2017-09-04 22:36:28 -03:00

167 lines
4.8 KiB
C#

// ScribbleXInput.cs - port of Gtk+ scribble demo
//
// Author: Manuel V. Santos <mvsl@telefonica.net>
//
// (c) 2002 Rachel Hestilow
// (c) 2004 Manuel V. Santos
namespace GtkSamples {
using Gtk;
using Gdk;
using System;
public class ScribbleXInput {
private static Gtk.Window win;
private static Gtk.VBox vBox;
private static Gtk.Button inputButton;
private static Gtk.Button quitButton;
private static Gtk.DrawingArea darea;
private static Gdk.Pixmap pixmap = null;
private static Gtk.InputDialog inputDialog = null;
public static int Main (string[] args) {
Application.Init ();
win = new Gtk.Window ("Scribble XInput Demo");
win.DeleteEvent += new DeleteEventHandler (WindowDelete);
vBox = new VBox (false, 0);
win.Add (vBox);
darea = new Gtk.DrawingArea ();
darea.SetSizeRequest (200, 200);
darea.ExtensionEvents=ExtensionMode.Cursor;
vBox.PackStart (darea, true, true, 0);
darea.ExposeEvent += new ExposeEventHandler (ExposeEvent);
darea.ConfigureEvent += new ConfigureEventHandler (ConfigureEvent);
darea.MotionNotifyEvent += new MotionNotifyEventHandler (MotionNotifyEvent);
darea.ButtonPressEvent += new ButtonPressEventHandler (ButtonPressEvent);
darea.Events = EventMask.ExposureMask | EventMask.LeaveNotifyMask |
EventMask.ButtonPressMask | EventMask.PointerMotionMask;
inputButton = new Button("Input Dialog");
vBox.PackStart (inputButton, false, false, 0);
inputButton.Clicked += new EventHandler (InputButtonClicked);
quitButton = new Button("Quit");
vBox.PackStart (quitButton, false, false, 0);
quitButton.Clicked += new EventHandler (QuitButtonClicked);
win.ShowAll ();
Application.Run ();
return 0;
}
static void InputButtonClicked (object obj, EventArgs args) {
if (inputDialog == null) {
inputDialog = new InputDialog ();
inputDialog.SaveButton.Hide ();
inputDialog.CloseButton.Clicked += new EventHandler(InputDialogClose);
inputDialog.DeleteEvent += new DeleteEventHandler(InputDialogDelete);
}
inputDialog.Present ();
}
static void QuitButtonClicked (object obj, EventArgs args) {
Application.Quit ();
}
static void WindowDelete (object obj, DeleteEventArgs args) {
Application.Quit ();
args.RetVal = true;
}
static void InputDialogClose (object obj, EventArgs args) {
inputDialog.Hide ();
}
static void InputDialogDelete (object obj, DeleteEventArgs args) {
inputDialog.Hide ();
args.RetVal = true;
}
static void ExposeEvent (object obj, ExposeEventArgs args) {
Gdk.Rectangle area = args.Event.Area;
args.Event.Window.DrawDrawable (darea.Style.ForegroundGC(darea.State),
pixmap,
area.X, area.Y,
area.X, area.Y,
area.Width, area.Height);
args.RetVal = false;
}
static void ConfigureEvent (object obj, ConfigureEventArgs args) {
Gdk.EventConfigure ev = args.Event;
Gdk.Window window = ev.Window;
Gdk.Rectangle allocation = darea.Allocation;
pixmap = new Gdk.Pixmap (window, allocation.Width, allocation.Height, -1);
pixmap.DrawRectangle (darea.Style.WhiteGC, true, 0, 0,
allocation.Width, allocation.Height);
args.RetVal = true;
}
static void DrawBrush (Widget widget, InputSource source,
double x, double y, double pressure) {
Gdk.GC gc;
switch (source) {
case InputSource.Mouse:
gc = widget.Style.BlackGC;
break;
case InputSource.Pen:
gc = widget.Style.BlackGC;
break;
case InputSource.Eraser:
gc = widget.Style.WhiteGC;
break;
default:
gc = widget.Style.BlackGC;
break;
}
Gdk.Rectangle update_rect = new Gdk.Rectangle ();
update_rect.X = (int) (x - 10.0d * pressure);
update_rect.Y = (int) (y - 10.0d * pressure);
update_rect.Width = (int) (20.0d * pressure);
update_rect.Height = (int) (20.0d * pressure);
pixmap.DrawRectangle (gc, true,
update_rect.X, update_rect.Y,
update_rect.Width, update_rect.Height);
darea.QueueDrawArea (update_rect.X, update_rect.Y,
update_rect.Width, update_rect.Height);
}
static void ButtonPressEvent (object obj, ButtonPressEventArgs args) {
Gdk.EventButton ev = args.Event;
if (ev.Button == 1 && pixmap != null) {
double pressure;
ev.Device.GetAxis (ev.Axes, AxisUse.Pressure, out pressure);
DrawBrush ((Widget) obj, ev.Device.Source, ev.X, ev.Y, pressure);
}
args.RetVal = true;
}
static void MotionNotifyEvent (object obj, MotionNotifyEventArgs args) {
Gdk.EventMotion ev = args.Event;
Widget widget = (Widget) obj;
if ((ev.State & Gdk.ModifierType.Button1Mask) != 0 && pixmap != null) {
double pressure;
if (!ev.Device.GetAxis (ev.Axes, AxisUse.Pressure, out pressure)) {
pressure = 0.5;
}
DrawBrush (widget, ev.Device.Source, ev.X, ev.Y, pressure);
}
args.RetVal = true;
}
}
}