// scribblewindow.cs - Qt# scribblewindow // // Author: Adam Treat // (c) 2002 Adam Treat // Licensed under the terms of the GNU GPL namespace QtSamples { using Qt; using System; [DeclareQtSignal ("colorChanged(TTQColor)")] [DeclareQtSignal ("load(TTQString)")] [DeclareQtSignal ("save(TTQString)")] public class ScribbleWindow : TTQMainWindow { private TTQMenuBar menubar; private TTQPopupMenu filemenu; private TTQPopupMenu aboutmenu; private TTQScrollView scrollview; public ScribbleArea scribblearea; enum Color {Black, Red, Blue, Green, Yellow}; public static int Main (String[] args) { TTQApplication app = new TTQApplication (args); ScribbleWindow demo = new ScribbleWindow (); demo.SetGeometry (50, 500, 400, 400); app.SetMainWidget (demo); demo.SetCaption ("Qt# 0.7!"); demo.Show (); return app.Exec (); } ScribbleWindow () : base (null, null) { filemenu = new TTQPopupMenu (null, "filemenu"); filemenu.InsertItem ("&Load", this, TQT_SLOT ("SlotLoad()") ); filemenu.InsertItem ("&Save", this, TQT_SLOT ("SlotSave()") ); filemenu.InsertSeparator (); filemenu.InsertItem ("&Quit", qApp, TQT_SLOT ("quit()")); aboutmenu = new TTQPopupMenu (null, "helpmenu"); aboutmenu.InsertItem ("&About Qt-Sharp", this, TQT_SLOT ("SlotAboutQtSharp()")); aboutmenu.InsertItem ("&About Qt", this, TQT_SLOT ("SlotAboutQt()")); menubar = new TTQMenuBar (this, ""); menubar.InsertItem ("&File", filemenu); menubar.InsertItem ("&Color", this, TQT_SLOT("SlotColorChooser()")); menubar.InsertItem ("&About", aboutmenu); scrollview = new TTQScrollView (this); scrollview.SetGeometry (0, menubar.Height (), Width (), Height () - menubar.Height ()); scribblearea = new ScribbleArea (this); scribblearea.SetGeometry (0, 0, 1000, 1000); scrollview.AddChild (scribblearea); this.SetCentralWidget (scrollview); SetMaximumSize (Width (), Height () - menubar.Height ()); TTQObject.Connect (this, TQT_SIGNAL ("colorChanged(TTQColor)"), scribblearea, TQT_SLOT ("SlotSetColor(TTQColor)") ); TTQObject.Connect (this, TQT_SIGNAL ("load(TTQString)"), scribblearea, TQT_SLOT ("PerformLoad(TTQString)") ); TTQObject.Connect (this, TQT_SIGNAL ("save(TTQString)"), scribblearea, TQT_SLOT ("PerformSave(TTQString)") ); } public void SlotLoad () { string filename = TTQFileDialog.GetOpenFileName (".", "*.bmp", this, null, "Load File", TTQString.Null, true); if ( filename != null ) Emit ("load(TTQString)", (TTQString) filename); } public void SlotSave () { string filename = TTQFileDialog.GetSaveFileName (".", "*.bmp", this, null, "Save File", TTQString.Null, true); if ( filename != null ) { if ( ! filename.ToLower().EndsWith(".bmp") ) filename += ".bmp"; Emit ("save(TTQString)", (TTQString) filename); } } public void SlotAboutQtSharp () { TTQMessageBox.Information (this, "About Qt# 0.7", "A Qt (http://www.trolltech.com) to C# language binding. \n" + "Qt# is compatible with Mono (http://go-mono.org) and\n" + "Portable.NET (http://www.southern-storm.com.au/portable_net.html)\n" + "(c) 2002 Adam Treat. Licensed under the terms of the GNU GPL.\n" ); } public void SlotAboutQt () { TTQMessageBox.AboutQt (this, "About Qt"); } public void SlotColorChooser () { TTQColor chosenColor = TQColorDialog.GetColor(); if (chosenColor.IsValid()) Emit ("colorChanged(TTQColor)", chosenColor); } public class ScribbleArea : TTQFrame { private TTQPoint last; private TTQPixmap buffer; private TTQColor currentcolor = new TTQColor("Black"); private TTQPopupMenu popupmenu; public ScribbleArea (TTQWidget parent) : base (parent) { buffer = new TTQPixmap (); last = new TTQPoint (); SetBackgroundMode (Qt.BackgroundMode.NoBackground); popupmenu = new TTQPopupMenu(); popupmenu.InsertItem ("&Clear", this, TQT_SLOT ("SlotClearArea()") ); mouseMoveEvent += new MouseMoveEvent (MouseMoved); mousePressEvent += new MousePressEvent (MousePressed); paintEvent += new PaintEvent (PerformPaint); resizeEvent += new ResizeEvent (PerformResize); } public void PerformLoad (TTQString filename) { if ( ! buffer.Load(filename) ) TTQMessageBox.Warning (null, "Load error", "Could not load file"); Repaint(); } public void PerformSave (TTQString filename) { if ( ! buffer.Save (filename, "BMP") ) TTQMessageBox.Warning( null, "Save error", "Could not save file"); } public void SlotClearArea () { buffer.Fill( new TTQColor ("white") ); BitBlt (this, 0, 0, buffer, 0, 0, -1, -1, Qt.RasterOp.CopyROP, false); } public void SlotSetColor (TTQColor color) { currentcolor = color; } // Note, Dispose() is called on TQPoints here to increase performance // of the UI. Otherwise, the GC would let dead TTQPoint instances pile // up and delete them all at once, causing the UI to pause while it frees // memory. (This happens because the GC runs in the same thread as the // application.) protected void MousePressed (TTQMouseEvent e) { if (e.Button() == ButtonState.RightButton ) popupmenu.Exec (TTQCursor.Pos ()); else { last.Dispose (); last = e.Pos(); } } protected void MouseMoved (TTQMouseEvent e) { TTQPainter windowPainter = new TTQPainter (); TTQPainter bufferPainter = new TTQPainter (); windowPainter.Begin (this); bufferPainter.Begin (buffer); windowPainter.SetPen (currentcolor); bufferPainter.SetPen (currentcolor); windowPainter.DrawLine (last, e.Pos()); bufferPainter.DrawLine (last, e.Pos()); windowPainter.End (); bufferPainter.End (); last.Dispose (); last = e.Pos (); } protected void PerformPaint (TTQPaintEvent e) { BitBlt(this, 0, 0, buffer, 0, 0, -1, -1, RasterOp.CopyROP, false); } protected void PerformResize (TTQResizeEvent e) { TTQPixmap save = new TTQPixmap (buffer); buffer.Resize (e.Size()); buffer.Fill (new TTQColor("white")); BitBlt (buffer, 0, 0, save, 0, 0, -1, -1, RasterOp.CopyROP, false); } } } }