summaryrefslogtreecommitdiffstats
path: root/qtsharp/src/examples/samples
diff options
context:
space:
mode:
Diffstat (limited to 'qtsharp/src/examples/samples')
-rw-r--r--qtsharp/src/examples/samples/Makefile.am24
-rw-r--r--qtsharp/src/examples/samples/display.cs65
-rw-r--r--qtsharp/src/examples/samples/emit.cs41
-rw-r--r--qtsharp/src/examples/samples/eventhandling.cs52
-rw-r--r--qtsharp/src/examples/samples/hello.cs36
-rw-r--r--qtsharp/src/examples/samples/mandelbrot.cs264
-rw-r--r--qtsharp/src/examples/samples/mandelbrot2.cs309
-rw-r--r--qtsharp/src/examples/samples/qstring-slot.cs38
-rw-r--r--qtsharp/src/examples/samples/quantumfractals.cs828
-rw-r--r--qtsharp/src/examples/samples/samples.build86
-rw-r--r--qtsharp/src/examples/samples/scribblewindow.cs212
11 files changed, 1955 insertions, 0 deletions
diff --git a/qtsharp/src/examples/samples/Makefile.am b/qtsharp/src/examples/samples/Makefile.am
new file mode 100644
index 00000000..eae1d7cc
--- /dev/null
+++ b/qtsharp/src/examples/samples/Makefile.am
@@ -0,0 +1,24 @@
+all:
+ csant -D$(CSC_NAME)=$(CSC) -C $(CSC_NAME)
+ chmod 0755 *.exe
+
+clean:
+ rm -rf *.exe
+
+distclean: clean
+
+install:
+ mkdir -p $(DESTDIR)$(datadir)/doc/qtcsharp/samples
+ cat display.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/display.cs.gz
+ cat eventhandling.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/eventhandling.cs.gz
+ cat hello.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/hello.cs.gz
+ cat scribblewindow.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/scribblewindow.cs.gz
+ cat mandelbrot.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/mandelbrot.cs.gz
+ cat quantumfractals.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/quantumfractals.cs.gz
+ cat mandelbrot2.cs | gzip -9c > $(DESTDIR)$(datadir)/doc/qtcsharp/samples/mandelbrot2.cs.gz
+
+uninstall:
+ rm -rf $(datadir)/doc/qtcsharp/samples/*.cs.gz
+ rm -rf $(datadir)/doc/qtcsharp/samples/*.cs
+
+.PHONY: all clean distclean install
diff --git a/qtsharp/src/examples/samples/display.cs b/qtsharp/src/examples/samples/display.cs
new file mode 100644
index 00000000..b1c7ca10
--- /dev/null
+++ b/qtsharp/src/examples/samples/display.cs
@@ -0,0 +1,65 @@
+namespace QtSamples {
+
+ using Qt;
+ using System;
+
+ public class Display : QMainWindow {
+
+ private TextArea textarea;
+ private QScrollView scrollview;
+ private QMenuBar menubar;
+ private QPopupMenu filemenu, aboutmenu;
+
+ private class TextArea : QTextEdit {
+
+ public TextArea (QWidget parent) : base (parent)
+ {
+ QFile file = new QFile ("display.cs");
+ if ( file.Open(1) ) {
+ QTextStream ts = new QTextStream (file);
+ this.SetText (ts.Read ());
+ this.SetTabStopWidth (30);
+ }
+ }
+ }
+
+ public Display ()
+ {
+ filemenu = new QPopupMenu (null, "filemenu");
+ filemenu.InsertItem ("&Quit", qApp, SLOT ("quit()"));
+
+ aboutmenu = new QPopupMenu(null, "aboutmenu");
+ aboutmenu.InsertItem("&About Qt-Sharp", this, SLOT("slotAbout()"));
+
+ menubar = new QMenuBar(this, "");
+ menubar.InsertItem("&File", filemenu);
+ menubar.InsertItem("&About", aboutmenu);
+
+ textarea = new TextArea (this);
+ textarea.SetGeometry(0, menubar.Height(), Width(), Height() - menubar.Height());
+ this.SetCentralWidget (textarea);
+ }
+
+ public void slotAbout ()
+ {
+ QMessageBox.Information (
+ this, "About Qt-Sharp-0.7",
+ "A Qt (http://www.trolltech.com) to C# language binding.\n" +
+ "Qt-Sharp 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 static void Main (String[] args)
+ {
+ QApplication app = new QApplication (args);
+ Display demo = new Display ();
+ demo.SetCaption ("Qt-Sharp-0.7!");
+ app.SetMainWidget (demo);
+ demo.Show ();
+ app.Exec ();
+ return;
+ }
+ }
+}
diff --git a/qtsharp/src/examples/samples/emit.cs b/qtsharp/src/examples/samples/emit.cs
new file mode 100644
index 00000000..e9c3c40a
--- /dev/null
+++ b/qtsharp/src/examples/samples/emit.cs
@@ -0,0 +1,41 @@
+// Illustrates basic usage of custom signals.
+// Also see the t7 tutorial.
+
+namespace QtSamples {
+ using System;
+ using Qt;
+
+ [DeclareQtSignal ("MySignal()")]
+ public class EmitSample: QVBox {
+ public EmitSample (): this (null, "") {}
+
+ public EmitSample (QWidget parent, string name): base ()
+ {
+ QPushButton pb = new QPushButton ("Papa Smurf", this);
+
+ Connect (pb, SIGNAL ("clicked ()"), SLOT ("DoEmit ()"));
+ Connect (this, SIGNAL ("MySignal ()"), SLOT ("PrintStuff ()"));
+ }
+
+ public void DoEmit ()
+ {
+ Emit ("MySignal()");
+ }
+
+ public void PrintStuff ()
+ {
+ Console.WriteLine ("Emitted MySignal");
+ }
+
+ public static int Main (string[] args)
+ {
+ QApplication app = new QApplication (args);
+ EmitSample es = new EmitSample ();
+ app.SetMainWidget (es);
+ es.Show ();
+ int ret = app.Exec ();
+ es.Dispose();
+ return ret;
+ }
+ }
+}
diff --git a/qtsharp/src/examples/samples/eventhandling.cs b/qtsharp/src/examples/samples/eventhandling.cs
new file mode 100644
index 00000000..ee410dd3
--- /dev/null
+++ b/qtsharp/src/examples/samples/eventhandling.cs
@@ -0,0 +1,52 @@
+// eventhandling.cs - qt-sharp Hello World
+//
+// Author: Adam Treat <manyoso@yahoo.com>
+//
+// (c) 2002 Adam Treat
+//
+// Licensed under the terms of the GNU GPL
+
+namespace QtSamples {
+
+ using Qt;
+ using System;
+
+ public class EventHandling : QVBox {
+
+ public static void Main (String[] args)
+ {
+ QApplication app = new QApplication (args);
+ EventHandling evh = new EventHandling ();
+ app.SetMainWidget (evh);
+ evh.Show ();
+ app.Exec ();
+ }
+
+ public EventHandling () : base (null)
+ {
+ // This is the global event handler for QMouseEvents
+ mouseHandler += new QMouseHandler(mouseEvents);
+
+ MyButton pb = new MyButton (this);
+ }
+
+ public void mouseEvents (QObject sender, QEventArgs e)
+ {
+ Console.WriteLine ("Mouse event: " + e.Name);
+ }
+
+ class MyButton : QPushButton {
+
+ public MyButton (QWidget parent) : base ("Hello Qt-Sharp-0.7!", parent)
+ {
+ // This is the local event handler for mousePressEvents
+ mousePressEvent += new MousePressEvent (pressEvent);
+ }
+
+ public void pressEvent (QMouseEvent e)
+ {
+ Console.WriteLine ("I've been clicked");
+ }
+ }
+ }
+}
diff --git a/qtsharp/src/examples/samples/hello.cs b/qtsharp/src/examples/samples/hello.cs
new file mode 100644
index 00000000..db6890e5
--- /dev/null
+++ b/qtsharp/src/examples/samples/hello.cs
@@ -0,0 +1,36 @@
+// helloworld.cs - qt-sharp Hello World
+//
+// Author: Adam Treat <manyoso@yahoo.com>
+//
+// (c) 2002 Adam Treat
+//
+// Licensed under the terms of the GNU GPL
+
+namespace QtSamples {
+
+ using Qt;
+ using System;
+
+ public class HelloWorld : QVBox {
+
+ public static void Main (String[] args)
+ {
+ QApplication app = new QApplication (args);
+ HelloWorld hello = new HelloWorld ();
+ app.SetMainWidget (hello);
+ hello.Show ();
+ app.Exec ();
+ }
+
+ public HelloWorld () : base (null)
+ {
+ QPushButton pb = new QPushButton ("Hello Qt-Sharp-0.7!", this);
+ QObject.Connect (pb, SIGNAL ("clicked()"), this, SLOT("SlotClicked()"));
+ }
+
+ public void SlotClicked ()
+ {
+ Console.WriteLine ("QPushButton Clicked!");
+ }
+ }
+}
diff --git a/qtsharp/src/examples/samples/mandelbrot.cs b/qtsharp/src/examples/samples/mandelbrot.cs
new file mode 100644
index 00000000..5dbd9b85
--- /dev/null
+++ b/qtsharp/src/examples/samples/mandelbrot.cs
@@ -0,0 +1,264 @@
+// Mandelbrot 0.1: A demonstration of Qt#
+//
+// Copyright 2002 Marcus Urban
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+// NOTE:
+// Variables with names like PlotXMin are in the cartesian coordinate plane.
+// Those with names like ImageXMin was in a translated coordinate system
+// where (0, 0) is the upper-left corner.
+
+
+using System;
+using Qt;
+
+
+// This struct is a simple implementation of complex numbers.
+// It was originally in a separate file because it is useful
+// in its own right. It is included here file only to make the
+// compilation process simpler of new users.
+
+public struct Complex {
+
+ private double re, im;
+ //private int x;
+
+ public Complex (double re, double im)
+ {
+ this.re = re;
+ this.im = im;
+ }
+
+ public static implicit operator Complex (double re)
+ {
+ return new Complex (re, 0.0);
+ }
+
+ public double Re
+ {
+ get { return re; }
+ }
+
+ public double Im
+ {
+ get { return im; }
+ }
+
+ public static double Abs (Complex a)
+ {
+ return Math.Abs (a.re) >= Math.Abs (a.im) ?
+ Math.Abs (a.re) * Math.Sqrt( 1.0 + (a.im/a.re)*(a.im/a.re) ) :
+ Math.Abs (a.im) * Math.Sqrt( 1.0 + (a.re/a.im)*(a.re/a.im) );
+ }
+
+ public static Complex operator + (Complex a, Complex b)
+ {
+ return new Complex (a.re + b.re, a.im + b.im);
+ }
+
+ public static Complex operator - (Complex a, Complex b)
+ {
+ return new Complex (a.re - b.re, a.im - b.im);
+ }
+
+ public static Complex operator * (Complex a, Complex b)
+ {
+ return new Complex ( a.re*b.re - a.im*b.im, a.im*b.re + a.re*b.im );
+ }
+
+ // Division isn't pretty. Do it later.
+
+ public override string ToString ()
+ {
+ return this.re.ToString () + "+" + this.im.ToString () + "i";
+ }
+}
+
+
+public class Mandelbrot {
+
+ public static int Iterations ( Complex c )
+ {
+ const int MaximumIterations = 16;
+ Complex value = c;
+ int currentDepth = 1;
+
+ while ( Complex.Abs(value) < 2.0 && currentDepth <= MaximumIterations ) {
+ ++currentDepth;
+ value = (value * value) + c;
+ }
+ return currentDepth;
+ }
+
+
+ public static void Main (string[] args)
+ {
+ QApplication app = new QApplication (args);
+
+ ImageDialog dialog = new ImageDialog (null, "Mandelbrot", false, 0);
+ dialog.Show ();
+ app.SetMainWidget (dialog);
+ app.Exec ();
+
+ }
+}
+
+
+public class ImageDialog : QDialog {
+
+ const double DefaultPlotXMin = -2.0;
+ const double DefaultPlotXMax = 2.0;
+ const double DefaultPlotYMin = -1.5;
+ const double DefaultPlotYMax = 1.5;
+
+ QHBoxLayout dialogLayout;
+ QGridLayout gridLayout;
+ QVBoxLayout leftLayout;
+ QHBoxLayout buttonLayout;
+ QPushButton redrawButton;
+ QLabel pixmapLabel;
+ QSizePolicy fixedSizePolicy;
+
+ QLabel XMinLabel, XMaxLabel, YMinLabel, YMaxLabel;
+ QLineEdit editXMin, editXMax, editYMin, editYMax;
+
+ public ImageDialog (QWidget parent, string name, bool modal, WidgetFlags fl):
+ base (parent, name, modal, fl)
+ {
+ if (name == string.Empty)
+ SetName ("imageDialog");
+ SetCaption ("Mandelbrot Image");
+
+ dialogLayout = new QHBoxLayout (this, 11, 6);
+ gridLayout = new QGridLayout (null, 1, 1, 0, 6, "gridLayout");
+ leftLayout = new QVBoxLayout (null, 0, 6, "leftLayout");
+
+ fixedSizePolicy = new QSizePolicy ();
+ fixedSizePolicy.SetHorData (QSizePolicy.SizeType.Fixed);
+ fixedSizePolicy.SetVerData (QSizePolicy.SizeType.Fixed);
+
+ XMinLabel = new QLabel ("Xmin", this);
+ XMinLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (XMinLabel, 0, 0);
+
+ XMaxLabel = new QLabel ("Xmax", this);
+ XMaxLabel.SetSizePolicy(fixedSizePolicy);
+ gridLayout.AddWidget (XMaxLabel, 1, 0);
+
+ YMinLabel = new QLabel ("Ymin", this);
+ YMinLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (YMinLabel, 2, 0);
+
+ YMaxLabel = new QLabel ("Ymax", this);
+ YMaxLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (YMaxLabel, 3, 0);
+
+ QDoubleValidator validator = new QDoubleValidator (this);
+
+ editXMin = new QLineEdit (this, "editXMin");
+ editXMin.SetText (Convert.ToString (DefaultPlotXMin));
+ editXMin.SetValidator (validator);
+ gridLayout.AddWidget (editXMin, 0, 1);
+
+ editXMax = new QLineEdit (this, "editXMax");
+ editXMax.SetText (Convert.ToString(DefaultPlotXMax));
+ editXMax.SetValidator (validator);
+ gridLayout.AddWidget (editXMax, 1, 1);
+
+ editYMin = new QLineEdit (this, "editYMin");
+ editYMin.SetText (Convert.ToString(DefaultPlotYMin));
+ editYMin.SetValidator (validator);
+ gridLayout.AddWidget (editYMin, 2, 1);
+
+ editYMax = new QLineEdit (this, "editYMax");
+ editYMax.SetText (Convert.ToString(DefaultPlotYMax));
+ editYMax.SetValidator (validator);
+ gridLayout.AddWidget (editYMax, 3, 1);
+
+ leftLayout.AddLayout (gridLayout);
+ QSpacerItem spacer1 = new QSpacerItem (0, 0, 0, 0);
+ leftLayout.AddItem (spacer1);
+
+ buttonLayout = new QHBoxLayout (null, 0, 6, "buttonLayout");
+ QSpacerItem spacer2 = new QSpacerItem (0, 0, 0, 0);
+ buttonLayout.AddItem (spacer2);
+
+ redrawButton = new QPushButton ("Redraw", this);
+ redrawButton.SetDefault (true);
+ buttonLayout.AddWidget (redrawButton);
+
+ QSpacerItem spacer3 = new QSpacerItem (0, 0, 0, 0);
+ buttonLayout.AddItem (spacer3);
+
+ leftLayout.AddLayout (buttonLayout);
+
+ dialogLayout.AddLayout (leftLayout);
+ QSpacerItem spacer4 = new QSpacerItem (0, 0, 0, 0);
+ dialogLayout.AddItem (spacer4);
+
+ pixmapLabel = new QLabel (this, "pixmapLabel", 0);
+ pixmapLabel.SetScaledContents (true);
+ dialogLayout.AddWidget (pixmapLabel);
+
+ QObject.Connect (redrawButton, SIGNAL ("clicked()"), this, SLOT ("Redraw()"));
+
+ Redraw ();
+ }
+
+
+ QImage MandelbrotImage ()
+ {
+ int depth;
+ double real, imag;
+
+ double PlotXMin = Convert.ToDouble ( editXMin.Text () );
+ double PlotXMax = Convert.ToDouble ( editXMax.Text () );
+ double PlotYMin = Convert.ToDouble ( editYMin.Text () );
+ double PlotYMax = Convert.ToDouble ( editYMax.Text () );
+
+ int ImageXMax = pixmapLabel.Width ();
+ int ImageYMax = pixmapLabel.Height ();
+
+ QImage image = new QImage (ImageXMax, ImageYMax, 32, 0);
+
+ for (int x = 0; x <= ImageXMax - 1; x+=1) {
+ for (int y = 0; y <= ImageYMax - 1; y+=1) {
+ real = (PlotXMax - PlotXMin)/ImageXMax * x + PlotXMin;
+ imag = (PlotYMin - PlotYMax)/ImageYMax * y + PlotYMax;
+ depth = Mandelbrot.Iterations ( new Complex (real, imag) );
+ image.SetPixel ( x, y, (uint) depth*16 );
+ }
+ }
+
+ return image;
+ }
+
+ public void Redraw ()
+ {
+ QSize s = pixmapLabel.BaseSize ();
+ pixmapLabel.Resize (400,300);
+ QApplication.SetOverrideCursor ( new QCursor( (int) CursorShape.WaitCursor ));
+ QImage image = MandelbrotImage ();
+ QPixmap pixmap = new QPixmap (image);
+ pixmapLabel.SetPixmap( pixmap);
+ image.Dispose ();
+ pixmap.Dispose ();
+ this.AdjustSize ();
+ QApplication.RestoreOverrideCursor ();
+ }
+}
+
+
diff --git a/qtsharp/src/examples/samples/mandelbrot2.cs b/qtsharp/src/examples/samples/mandelbrot2.cs
new file mode 100644
index 00000000..bcb0a360
--- /dev/null
+++ b/qtsharp/src/examples/samples/mandelbrot2.cs
@@ -0,0 +1,309 @@
+// Mandelbrot 0.1: A demonstration of Qt#
+//
+// Copyright 2002 Marcus Urban
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+// NOTE:
+// Variables with names like PlotXMin are in the cartesian coordinate plane.
+// Those with names like ImageXMin was in a translated coordinate system
+// where (0, 0) is the upper-left corner.
+
+
+using System;
+using Qt;
+
+
+// This struct is a simple implementation of complex numbers.
+// It was originally in a separate file because it is useful
+// in its own right. It is included here file only to make the
+// compilation process simpler of new users.
+
+public struct Complex {
+
+ private double re, im;
+ //private int x;
+
+ public Complex (double re, double im)
+ {
+ this.re = re;
+ this.im = im;
+ }
+
+ public static implicit operator Complex (double re)
+ {
+ return new Complex (re, 0.0);
+ }
+
+ public double Re
+ {
+ get { return re; }
+ }
+
+ public double Im
+ {
+ get { return im; }
+ }
+
+ public static double Abs (Complex a)
+ {
+ return Math.Abs (a.re) >= Math.Abs (a.im) ?
+ Math.Abs (a.re) * Math.Sqrt( 1.0 + (a.im/a.re)*(a.im/a.re) ) :
+ Math.Abs (a.im) * Math.Sqrt( 1.0 + (a.re/a.im)*(a.re/a.im) );
+ }
+
+ public static Complex operator + (Complex a, Complex b)
+ {
+ return new Complex (a.re + b.re, a.im + b.im);
+ }
+
+ public static Complex operator - (Complex a, Complex b)
+ {
+ return new Complex (a.re - b.re, a.im - b.im);
+ }
+
+ public static Complex operator * (Complex a, Complex b)
+ {
+ return new Complex ( a.re*b.re - a.im*b.im, a.im*b.re + a.re*b.im );
+ }
+
+ // Division isn't pretty. Do it later.
+
+ public override string ToString ()
+ {
+ return this.re.ToString () + "+" + this.im.ToString () + "i";
+ }
+}
+
+
+public class Mandelbrot
+{
+ public static ImageDialog dialog;
+
+ public static int Iterations ( Complex c )
+ {
+ const int MaximumIterations = 16;
+ Complex value = c;
+ int currentDepth = 1;
+
+ while ( Complex.Abs(value) < 2.0 && currentDepth <= MaximumIterations ) {
+ ++currentDepth;
+ value = (value * value) + c;
+ }
+ return currentDepth;
+ }
+
+
+ public static void Main (string[] args)
+ {
+ QApplication app = new QApplication (args);
+
+ dialog = new ImageDialog (null, "Mandelbrot", false, 0);
+ dialog.SetGeometry(0, 0, 550, 300 );
+ dialog.Show();
+ app.SetMainWidget (dialog);
+ app.Exec ();
+
+ }
+}
+
+
+public class PicLabel: QFrame
+{
+ QPixmap newPixmap;
+ int newWidth = 400;
+ int newHeight = 300;
+
+ public PicLabel( QWidget parent, string name, WidgetFlags flags ):
+ base( parent, name, flags )
+ {
+ SetBackgroundMode (Qt.BackgroundMode.NoBackground);
+ resizeEvent += new ResizeEvent (PerformResize);
+ paintEvent += new PaintEvent (PerformPaint);
+
+ }
+
+ protected void PerformResize (QResizeEvent e)
+ {
+ Console.WriteLine("Resizing to {0} by {1}",
+ e.Size().Width(), e.Size().Height() );
+
+ newWidth = e.Size().Width();
+ newHeight = e.Size().Height();
+
+ }
+
+
+ protected void PerformPaint(QPaintEvent e )
+ {
+ Console.WriteLine("Making a new image {0} by {1}", newWidth, newHeight );
+
+ QImage image = Mandelbrot.dialog.MandelbrotImage( newWidth, newHeight );
+ newPixmap = new QPixmap( image );
+
+ BitBlt(this, 0, 0, newPixmap,
+ 0, 0, -1, -1, RasterOp.CopyROP, false);
+ Console.WriteLine("PerformPaint");
+ }
+}
+
+
+
+public class ImageDialog : QDialog {
+
+ const double DefaultPlotXMin = -2.0;
+ const double DefaultPlotXMax = 2.0;
+ const double DefaultPlotYMin = -1.5;
+ const double DefaultPlotYMax = 1.5;
+
+ QHBoxLayout dialogLayout;
+ QGridLayout gridLayout;
+ QVBoxLayout leftLayout;
+ QHBoxLayout buttonLayout;
+ QPushButton redrawButton;
+ public PicLabel pixmapLabel;
+ QSizePolicy fixedSizePolicy;
+
+ QLabel XMinLabel, XMaxLabel, YMinLabel, YMaxLabel;
+ QLineEdit editXMin, editXMax, editYMin, editYMax;
+
+
+ public ImageDialog (QWidget parent, string name, bool modal, WidgetFlags fl):
+ base (parent, name, modal, fl)
+ {
+ if (name == string.Empty)
+ SetName ("imageDialog");
+ SetCaption ("Mandelbrot Image");
+
+ dialogLayout = new QHBoxLayout (this, 11, 6);
+ gridLayout = new QGridLayout (null, 1, 1, 0, 6, "gridLayout");
+ leftLayout = new QVBoxLayout (null, 0, 6, "leftLayout");
+
+ fixedSizePolicy = new QSizePolicy ( QSizePolicy.SizeType.Fixed,
+ QSizePolicy.SizeType.Fixed, false );
+
+ XMinLabel = new QLabel ("Xmin", this);
+ XMinLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (XMinLabel, 0, 0);
+
+ XMaxLabel = new QLabel ("Xmax", this);
+ XMaxLabel.SetSizePolicy(fixedSizePolicy);
+ gridLayout.AddWidget (XMaxLabel, 1, 0);
+
+ YMinLabel = new QLabel ("Ymin", this);
+ YMinLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (YMinLabel, 2, 0);
+
+ YMaxLabel = new QLabel ("Ymax", this);
+ YMaxLabel.SetSizePolicy (fixedSizePolicy);
+ gridLayout.AddWidget (YMaxLabel, 3, 0);
+
+ QDoubleValidator validator = new QDoubleValidator (this);
+
+ editXMin = new QLineEdit (this, "editXMin");
+ editXMin.SetSizePolicy( fixedSizePolicy );
+ editXMin.SetText (Convert.ToString (DefaultPlotXMin));
+ editXMin.SetValidator (validator);
+ gridLayout.AddWidget (editXMin, 0, 1);
+
+ editXMax = new QLineEdit (this, "editXMax");
+ editXMax.SetSizePolicy( fixedSizePolicy );
+ editXMax.SetText (Convert.ToString(DefaultPlotXMax));
+ editXMax.SetValidator (validator);
+ gridLayout.AddWidget (editXMax, 1, 1);
+
+ editYMin = new QLineEdit (this, "editYMin");
+ editYMin.SetSizePolicy( fixedSizePolicy );
+ editYMin.SetText (Convert.ToString(DefaultPlotYMin));
+ editYMin.SetValidator (validator);
+ gridLayout.AddWidget (editYMin, 2, 1);
+
+ editYMax = new QLineEdit (this, "editYMax");
+ editYMax.SetSizePolicy( fixedSizePolicy );
+ editYMax.SetText (Convert.ToString(DefaultPlotYMax));
+ editYMax.SetValidator (validator);
+ gridLayout.AddWidget (editYMax, 3, 1);
+
+ leftLayout.AddLayout (gridLayout);
+ QSpacerItem spacer1 = new QSpacerItem (0, 0, 0, 0);
+ leftLayout.AddItem (spacer1);
+
+ buttonLayout = new QHBoxLayout (null, 0, 6, "buttonLayout");
+ QSpacerItem spacer2 = new QSpacerItem (0, 0, 0, 0);
+ buttonLayout.AddItem (spacer2);
+
+ redrawButton = new QPushButton ("Redraw", this);
+ redrawButton.SetSizePolicy ( fixedSizePolicy );
+ redrawButton.SetDefault (true);
+ buttonLayout.AddWidget (redrawButton);
+
+ QSpacerItem spacer3 = new QSpacerItem (0, 0, 0, 0);
+ buttonLayout.AddItem (spacer3);
+
+ leftLayout.AddLayout (buttonLayout);
+
+ dialogLayout.AddLayout (leftLayout);
+ QSpacerItem spacer4 = new QSpacerItem (0, 0, 0, 0);
+ dialogLayout.AddItem (spacer4);
+
+ pixmapLabel = new PicLabel (this, "pixmapLabel", 0);
+ //pixmapLabel.SetScaledContents (true);
+ pixmapLabel.SetSizePolicy( QSizePolicy.SizeType.Minimum,
+ QSizePolicy.SizeType.Minimum, false );
+ pixmapLabel.SetGeometry( 0, 0, 400, 300 );
+ pixmapLabel.Show();
+ pixmapLabel.Resize(400,300);
+ dialogLayout.AddWidget (pixmapLabel);
+
+
+ //QImage image = MandelbrotImage( 400, 300 );
+ //pixmapLabel.SetPixmap( new QPixmap( image ) );
+
+
+ QObject.Connect (redrawButton, SIGNAL ("clicked()"), pixmapLabel, SLOT ("Repaint()"));
+
+ //Redraw ();
+ }
+
+ public QImage MandelbrotImage ( int width, int height)
+ {
+ int depth;
+ double real, imag;
+
+ double PlotXMin = Convert.ToDouble ( editXMin.Text () );
+ double PlotXMax = Convert.ToDouble ( editXMax.Text () );
+ double PlotYMin = Convert.ToDouble ( editYMin.Text () );
+ double PlotYMax = Convert.ToDouble ( editYMax.Text () );
+
+ int ImageXMax = width;
+ int ImageYMax = height;
+
+ QImage image = new QImage (ImageXMax, ImageYMax, 32, 0);
+
+ for (int x = 0; x <= ImageXMax - 1; x+=1) {
+ for (int y = 0; y <= ImageYMax - 1; y+=1) {
+ real = (PlotXMax - PlotXMin)/ImageXMax * x + PlotXMin;
+ imag = (PlotYMin - PlotYMax)/ImageYMax * y + PlotYMax;
+ depth = Mandelbrot.Iterations ( new Complex (real, imag) );
+ image.SetPixel ( x, y, (uint) depth*16 );
+ }
+ }
+
+ return image;
+ }
+
+}
+
+
diff --git a/qtsharp/src/examples/samples/qstring-slot.cs b/qtsharp/src/examples/samples/qstring-slot.cs
new file mode 100644
index 00000000..e6d5110a
--- /dev/null
+++ b/qtsharp/src/examples/samples/qstring-slot.cs
@@ -0,0 +1,38 @@
+// Demo of a QString slot
+// Implemented by Marcus Urban
+
+using System;
+using Qt;
+
+public class MyWidget : QVBox
+{
+ QLineEdit lineEdit;
+ QLabel label;
+
+ public MyWidget (QWidget parent, String name) : base (parent, name)
+ {
+ lineEdit = new QLineEdit( this, "lineEdit" );
+ label = new QLabel( this, "label" );
+ label.SetText("Default");
+
+ QObject.Connect( lineEdit, SIGNAL("textChanged(QString)"),
+ label, "SetText(QString)" );
+ }
+
+
+ public MyWidget (QWidget parent) : this (parent, "") {}
+ public MyWidget () : this (null, "") {}
+}
+
+public class Example {
+
+ public static int Main (String[] args)
+ {
+ QApplication a = new QApplication (args);
+
+ MyWidget w = new MyWidget ();
+ a.SetMainWidget (w);
+ w.Show ();
+ return a.Exec ();
+ }
+}
diff --git a/qtsharp/src/examples/samples/quantumfractals.cs b/qtsharp/src/examples/samples/quantumfractals.cs
new file mode 100644
index 00000000..56898912
--- /dev/null
+++ b/qtsharp/src/examples/samples/quantumfractals.cs
@@ -0,0 +1,828 @@
+// quantumfractals.cs - Port of eeqt to Qt#
+// Author: Adam Treat <manyoso@yahoo.com>
+// (c) 2002 Adam Treat
+// Licensed under the terms of the GNU GPL
+
+namespace Qf {
+
+ using Qt;
+ using System;
+ using System.Threading;
+
+ public class FractalViewer : QMainWindow {
+
+ //Menuing
+ private QMenuBar menubar;
+ private QPopupMenu filemenu;
+ private QPopupMenu shapemenu;
+ private QPopupMenu settingsmenu;
+
+ public static int Main (string[] args)
+ {
+ //Initialize and start the main event loop
+ QApplication app = new QApplication (args);
+ FractalViewer view = new FractalViewer ();
+ app.SetMainWidget (view);
+ view.Show ();
+ return app.Exec ();
+ }
+
+ public FractalViewer (): base (null, "main")
+ {
+ SetCaption ("Quantum Fractals");
+
+ //Setup the display
+ Display display = new Display (this);
+ SetCentralWidget (display);
+
+ //Setup the filemenu
+ filemenu = new QPopupMenu (null, "filemenu");
+ filemenu.InsertItem ("&Screenshot", display, SLOT ("SlotScreenshot()"));
+ filemenu.InsertSeparator ();
+ filemenu.InsertItem ("&Quit", qApp, SLOT ("quit()"));
+
+ //Setup the shapemenu
+ shapemenu = new QPopupMenu (null, "typemenu");
+ shapemenu.InsertItem( "&Tetrahedron", 0);
+ shapemenu.InsertItem( "&Cube", 1);
+ shapemenu.InsertItem( "&Octahedron", 2);
+ shapemenu.InsertItem( "&Icosahedron", 3);
+ shapemenu.InsertItem( "&Dodecahedron", 4);
+ shapemenu.InsertItem( "&Double Tetrahedron", 5);
+ shapemenu.InsertItem( "&Icosidodecahedron", 6);
+
+ //Connect the shapemenu
+ QObject.Connect (shapemenu, SIGNAL ("activated(int)"),
+ display, SLOT("SlotShapeMenu(int)"));
+
+ //Setup the settingsmenu
+ settingsmenu = new QPopupMenu (null, "settingsmenu");
+ settingsmenu.InsertItem ("&Alpha", display, SLOT ("SlotSetAlpha()"));
+
+ //Setup the menubar
+ menubar = new QMenuBar (this, "");
+ menubar.InsertItem ("&File", filemenu);
+ menubar.InsertItem ("&Shape", shapemenu);
+ menubar.InsertItem ("&Settings", settingsmenu);
+ }
+ }
+
+ public class Display: QWidget, IQuantumFractal {
+
+ //Labels
+ QLabel count;
+ QLabel shape;
+ QLabel alpha;
+
+ //Buttons
+ QPushButton start;
+ QPushButton stop;
+ QPushButton reset;
+ QPushButton gray;
+ QPushButton intense;
+
+ //Drawable region
+ QPaintBuffer buffer;
+
+ //Layouts
+ QVBoxLayout layout;
+ QHBoxLayout buttons;
+ QVBoxLayout labels;
+
+ //Engine controller variables
+ int[] topDensity = new int[0];
+ int[] bottomDensity = new int[0];
+ int resolution = 400;
+ int scale = 1;
+ double centerX = 0;
+ double centerY = 0;
+ int i = 0;
+ bool Grayscale = true;
+ bool Intense = false;
+ bool Running = false;
+ bool WasRunning = false;
+
+ //The engine
+ QuantumFractals qf;
+ Thread engine;
+
+ public Display (QWidget parent): base (parent)
+ {
+ //Setup the sizes
+ QSize size = new QSize (resolution, resolution);
+ parent.SetBaseSize (size);
+
+ //Some nice colors
+ SetPaletteBackgroundColor (new QColor ("Black"));
+ SetPaletteForegroundColor (new QColor ("LightBlue"));
+
+ //Setup the buttons
+ start = new QPushButton ("Start", this);
+ stop = new QPushButton ("Stop", this);
+ reset = new QPushButton ("Reset", this);
+ gray = new QPushButton ("Color", this);
+ intense = new QPushButton ("Intensity", this);
+
+ //Setup the labels
+ count = new QLabel (this);
+ alpha = new QLabel (this);
+ shape = new QLabel (this);
+
+ //Setup the drawable
+ buffer = new QPaintBuffer (this);
+ buffer.SetMinimumSize (size);
+
+ //Create the layouts
+ layout = new QVBoxLayout (this);
+ buttons = new QHBoxLayout (layout);
+
+ //Add some buttons
+ buttons.AddWidget (start);
+ buttons.AddWidget (stop);
+ buttons.AddWidget (reset);
+ buttons.AddWidget (gray);
+ buttons.AddWidget (intense);
+
+ //Connect the buttons and SlotQuit
+ QObject.Connect (start, SIGNAL ("clicked()"),
+ this, SLOT ("SlotStart()"));
+ QObject.Connect (stop, SIGNAL ("clicked()"),
+ this, SLOT ("SlotStop()"));
+ QObject.Connect (reset, SIGNAL ("clicked()"),
+ this, SLOT ("SlotReset()"));
+ QObject.Connect (gray, SIGNAL ("clicked()"),
+ this, SLOT ("SlotGray()"));
+ QObject.Connect (intense, SIGNAL ("clicked()"),
+ this, SLOT ("SlotIntense()"));
+ QObject.Connect (buffer, SIGNAL ("Painted()"),
+ this, SLOT ("SlotSetLabels()"));
+ QObject.Connect (qApp, SIGNAL ("lastWindowClosed ()"),
+ this, SLOT ("SlotQuit ()"));
+
+ //Layout labels
+ labels = new QVBoxLayout (layout);
+ labels.AddWidget (count);
+ labels.AddWidget (shape);
+ labels.AddWidget (alpha);
+
+ //Layout buffer
+ layout.AddWidget (buffer, 1);
+
+ //Finally create the data engine
+ qf = new QuantumFractals (this);
+
+ //Handle resize events
+ resizeEvent += new ResizeEvent (TouchResize);
+ }
+
+ //This is where the controller receives data from the engine
+ public void UpdateData (double[] d)
+ {
+ i++; //Keep track of the number of points
+
+ //Set the density arrays to match the resolution
+ if (resolution * resolution != topDensity.Length) {
+ topDensity = new int[resolution * resolution];
+ bottomDensity = new int[resolution * resolution];
+ }
+
+ //setup the sphere
+ int res = resolution;
+ int res2 = res / 2;
+ int x = res / 2 + (int)(res2 * scale * (d[0] - centerX));
+ int y = res / 2 + (int)(res2 * scale * (d[1] - centerY));
+ double z = d[2];
+
+ if ((x < res) && (x >= 0) && (y >= 0) && (y < res)) {
+
+ if (z >= 0)
+ topDensity[y * resolution + x]++;
+ else
+ bottomDensity[y * resolution + x]++;
+
+ }
+
+ //Convert the density into a color
+ int top = topDensity[y * resolution + x];
+ //int bot = bottomDensity[y * resolution + x];
+ top = Math.Min (top, 255);
+ //bot = Math.Min (bot, 255);
+
+ //Log color system not working well :(
+ if (Intense) {
+ top = (int)(Math.Log (top + 1));
+ //bot = (int)(Math.Log (bot + 1));
+ }
+
+ int topdepth = RGB (top,top,top);
+ //int botdepth = RGB (bot,bot,bot);
+
+ //Finally draw the pixel
+ SetPixel (x, y, topdepth);
+ //SetPixel (x, y, botdepth);
+ }
+
+ //Calls the drawable
+ public void SetPixel (int x, int y, int depth)
+ {
+ buffer.PaintPixel (x, y, depth);
+ }
+
+ //Convert the color into a depth
+ public int RGB (int r, int g, int b)
+ {
+ if (!Grayscale) {
+
+ r = Intensity (r < 128 ? 128 - r : 0);
+ g = Intensity (128 - Math.Abs (g - 128));
+ b = Intensity (b < 128 ? 0 : b - 128);
+
+ } else {
+
+ r = Intensity (r);
+ g = Intensity (g);
+ b = Intensity (b);
+
+ }
+ //Console.WriteLine ("{0} {1} {2}", r,g,b);
+ return 256 * 256 * r + 256 * g + b;
+ }
+
+ //This provides more detail
+ private int Intensity(int val)
+ {
+ int ret;
+
+ double bases = 64;
+ double scale = 256.0 / (256.0 - bases);
+ ret = (int)(bases + ((double)val) / scale);
+
+ //if gray then black, if color then white
+ if (val == 0 && Grayscale)
+ ret = 0;
+ else if (val == 0)
+ ret = 255;
+ return ret;
+ }
+
+ //Draw the labels
+ private void SlotSetLabels ()
+ {
+ count.SetText ("Count: " + i.ToString ());
+ shape.SetText ("Shape: " + qf.GetPolytope ());
+ alpha.SetText ("Alpha: " + qf.Alpha.ToString ());
+ }
+
+ //Start the engine
+ private void SlotStart ()
+ {
+ engine = new Thread(new ThreadStart(qf.Start));
+ engine.Start ();
+ Running = true;
+ }
+
+ //Stop the engine
+ private void SlotStop ()
+ {
+ if (engine != null)
+ if (engine.IsAlive)
+ engine.Abort ();
+ Running = false;
+ }
+
+ //Reset everything
+ private void SlotReset ()
+ {
+ SlotStop ();
+ ResetBuffer ();
+ SlotStart ();
+ }
+
+ //Reset the drawable
+ private void ResetBuffer ()
+ {
+ i = 0;
+ SlotSetLabels ();
+ topDensity = new int[0];
+ bottomDensity = new int[0];
+ buffer.Reset ();
+ }
+
+ //Toggles the color scheme
+ private void SlotGray ()
+ {
+ Grayscale = !Grayscale;
+ }
+
+ //Toggles log color scheme
+ //Not working so well :(
+ private void SlotIntense ()
+ {
+ Intense = !Intense;
+ }
+
+ //Change the platonic shape
+ private void SlotShapeMenu (int item)
+ {
+ WasRunning = Running ? true : false;
+
+ SlotStop ();
+ ResetBuffer ();
+
+ switch(item) {
+
+ case 0:
+ qf.SetPolytope (0);
+ break;
+ case 1:
+ qf.SetPolytope (1);
+ break;
+ case 2:
+ qf.SetPolytope (2);
+ break;
+ case 3:
+ qf.SetPolytope (3);
+ break;
+ case 4:
+ qf.SetPolytope (4);
+ break;
+ case 5:
+ qf.SetPolytope (5);
+ break;
+ case 6:
+ qf.SetPolytope (6);
+ break;
+ Default:
+ qf.SetPolytope (0);
+ break;
+ }
+
+ if (WasRunning)
+ SlotStart ();
+ }
+
+ //Save the drawable as a screenshot
+ private void SlotScreenshot ()
+ {
+ WasRunning = Running ? true : false;
+
+ SlotStop ();
+ string filename = QFileDialog.GetSaveFileName (
+
+ QDir.HomeDirPath (), "*", this, "save",
+ "Save Screenshot", "*.png", true
+ );
+
+ if (filename != null)
+ buffer.Save (filename);
+
+ if (WasRunning)
+ SlotStart ();
+ }
+
+ //Set the alpha engine variable
+ private void SlotSetAlpha ()
+ {
+ WasRunning = Running ? true : false;
+
+ SlotStop ();
+ qf.Alpha = QInputDialog.GetDouble (
+
+ "Set Alpha", "Alpha: ", qf.Alpha, 0, 2, 32
+ );
+
+ if (WasRunning)
+ SlotStart ();
+ else
+ SlotSetLabels ();
+ }
+
+ //Make sure to quit all threads upon exit
+ private void SlotQuit ()
+ {
+ SlotStop ();
+ buffer.Stop ();
+ }
+
+ //Need to reset the resolution upon resize
+ private void TouchResize (QResizeEvent e)
+ {
+ int height = buffer.Size ().Height ();
+ int width = buffer.Size ().Width ();
+
+ resolution = height > width ? width : height;
+ }
+ }
+
+ [DeclareQtSignal ("Painted()")]
+ public class QPaintBuffer : QFrame {
+
+ //Drawables
+ private QPixmap buffer;
+ private QImage image;
+
+ //Timer
+ private TimerCallback call;
+ private Timer timer;
+
+ public QPaintBuffer (QWidget parent) : base (parent)
+ {
+ SetBackgroundMode (Qt.BackgroundMode.NoBackground);
+
+ //Create drawables
+ buffer = new QPixmap ();
+ image = new QImage (Size (), 32);
+
+ //Setup the event handlers
+ paintEvent += new PaintEvent (TouchPaint);
+ resizeEvent += new ResizeEvent (TouchResize);
+ focusInEvent += new FocusInEvent (TouchFocus);
+ focusOutEvent += new FocusOutEvent (TouchFocus);
+
+ //Start the timer
+ call = new TimerCallback(PaintImage);
+ timer = new Timer(call, null, 1000, 1000);
+
+ }
+
+ //Resets the drawables
+ public void Reset ()
+ {
+ buffer = new QPixmap ();
+ image = new QImage (Size (), 32);
+ PaintImage (null);
+ }
+
+ //Paints a pixel to the image
+ public void PaintPixel (int x, int y, int depth)
+ {
+ lock (this) {
+ if (x < image.Width () && y < image.Height ())
+ image.SetPixel (x, y, (uint)depth);
+ }
+ }
+
+ //Saves the image to a file
+ public void Save (string filename)
+ {
+ image.Save (filename, "PNG");
+ }
+
+ //Paints the image to the screen and emits Painted
+ private void PaintImage (object state)
+ {
+ buffer.ConvertFromImage (image);
+ PerformPaint ();
+ Emit ("Painted()");
+ }
+
+ //The actual bitblt to the screen
+ private void PerformPaint ()
+ {
+ BitBlt(this, 0, 0, buffer,
+ 0, 0, -1, -1, RasterOp.CopyROP, false);
+ }
+
+ //Receive focus events
+ private void TouchFocus (QFocusEvent e)
+ {
+ PerformPaint ();
+ }
+
+ //Receive paint events
+ private void TouchPaint (QPaintEvent e)
+ {
+ PerformPaint ();
+ }
+
+ //Receive resize events
+ private void TouchResize (QResizeEvent e)
+ {
+ image = new QImage (e.Size (), 32);
+ buffer.Resize (e.Size());
+ buffer.Fill (new QColor("black"));
+ BitBlt (buffer, 0, 0, new QPixmap (buffer),
+ 0, 0, -1, -1, RasterOp.CopyROP, false);
+ }
+
+ //Dispose of the timer
+ public void Stop ()
+ {
+ timer.Dispose ();
+ }
+ }
+
+ public interface IQuantumFractal {
+
+ void UpdateData (Double [] data);
+ }
+
+ //Polytope types
+ public enum Shapes {
+ TETRAHEDRON = 0,
+ CUBE = 1,
+ OCTAHEDRON = 2,
+ ICOSAHEDRON = 3,
+ DODECAHEDRON = 4,
+ DOUBLE_TETRAHEDRON = 5,
+ ICOSIDODECAHEDRON = 6
+ }
+
+ public class QuantumFractals {
+
+ private int t = 0;
+ private double[] p; //Detector probabilities
+ private double[] fp; //Fractal point
+ private double[][] n; //Detector points
+ private double[] counter; //Detect counter
+ private double alpha = 0.61803398874989288039384209090709; //Initialize to 1/phi
+
+ private Random random;
+ private Shapes polytope;
+ private IQuantumFractal consumer;
+
+ public QuantumFractals (IQuantumFractal consumer)
+ {
+ this.consumer = consumer;
+ SetPolytope (0);
+ Init ();
+ }
+
+ public double Alpha
+ {
+ get { return alpha; }
+ set { alpha = value; }
+ }
+
+ private void Init ()
+ {
+ random = new Random ();
+
+ //Default values
+ t = 0;
+
+ counter = new double[n.Length]; //Detect counter
+ fp = new double[3]; //Fractal point
+ p = new double[n.Length];
+
+ //Initial state
+ fp[0] = random.NextDouble () -0.5;
+ fp[1] = random.NextDouble () -0.5;
+ fp[2] = random.NextDouble () -0.5;
+
+ double sum = Math.Sqrt (Product (fp, fp));
+
+ fp[0] = fp[0] / sum;
+ fp[1] = fp[1] / sum;
+ fp[2] = fp[2] / sum;
+ }
+
+ //Main fractal generator loop
+ public void Start ()
+ {
+ Init ();
+
+ //double n1 = (1.0) / n.Length as double;
+ double n1 = (1.0) / n.Length;
+
+ double alpha12 = 2 * alpha / (n.Length * (1 + alpha * alpha));
+
+ do {
+ //Increase t
+ t++;
+
+ //Calculate detector click probabilities
+ for (int i = 0; i < p.Length; i++)
+ p[i] = n1 + alpha12 * Product (n[i], fp);
+
+ //Get next random number
+ double r = random.NextDouble ();
+
+ //Check which detector that clicked
+ double ptmp = 0;
+ double[] detector = null;
+
+ for (int i = 0; i < p.Length; i++) {
+
+ ptmp += p[i];
+
+ if (r <= ptmp) {
+ //We found which detector clicked
+ detector = n[i];
+ counter[i]++;
+ break;
+ }
+ }
+
+ if (detector == null)
+ detector = n[p.Length - 1];
+
+ //Project
+ double sc = Product (fp, detector);
+
+ for (int j = 0; j < 3; j++)
+ fp[j]= (1 - alpha * alpha) * fp[j] + 2 * alpha * (1 + alpha * sc) * detector[j];
+
+ //Normalize
+ double norm = Math.Sqrt (Product (fp, fp));
+
+ for (int j=0; j<3; j++)
+ fp[j] /= norm;
+
+ consumer.UpdateData (fp);
+
+ } while (true);
+ }
+
+
+ //Calculate the scalar product of two vectors
+ private double Product (double[] v1, double[] v2)
+ {
+ double sc = 0;
+ for(int i=0; i < v1.Length; i++)
+ sc += v1[i] * v2[i];
+ return sc;
+ }
+
+ public string GetPolytope ()
+ {
+ string ret = String.Empty;
+ switch (polytope) {
+ case Shapes.TETRAHEDRON:
+ ret = "Tetrahedron";
+ break;
+ case Shapes.CUBE:
+ ret = "Cube";
+ break;
+ case Shapes.OCTAHEDRON:
+ ret = "Octahedron";
+ break;
+ case Shapes.ICOSAHEDRON:
+ ret = "Icosahedron";
+ break;
+ case Shapes.DODECAHEDRON:
+ ret = "Dodecahedron";
+ break;
+ case Shapes.DOUBLE_TETRAHEDRON:
+ ret = "Double Tetrahedron";
+ break;
+ case Shapes.ICOSIDODECAHEDRON:
+ ret = "Icosidodecahedron";
+ break;
+ Default:
+ ret = "Unknown";
+ break;
+ }
+ return ret;
+ }
+
+ public void SetPolytope (int type)
+ {
+ polytope = (Qf.Shapes)type;
+
+ switch (type) {
+
+ case 0: {
+
+ n = new double[4][];
+ n[0] = new double[] {0,0,1.0};
+ n[1] = new double[] {0.9428090415820634,0,-0.3333333333333333};
+ n[2] = new double[] {-0.4714045207910317,0.816496580927726,-0.3333333333333333};
+ n[3] = new double[] {-0.4714045207910317, -0.816496580927726, -0.3333333333333333};
+
+ break;
+ }
+
+ case 1: {
+
+ n = new double[8][];
+ n[0] = new double[] {0, 0, 1.0};
+ n[1] = new double[] {0.9428090415820634, 0, 0.3333333333333333};
+ n[2] = new double[] {-0.4714045207910317, 0.816496580927726, 0.3333333333333333};
+ n[3] = new double[] {-0.4714045207910317, -0.816496580927726, 0.3333333333333333};
+ n[4] = new double[] {0.4714045207910317, 0.816496580927726, -0.3333333333333333};
+ n[5] = new double[] {0.4714045207910317, -0.816496580927726, -0.3333333333333333};
+ n[6] = new double[] {-0.9428090415820634, 0, -0.3333333333333333};
+ n[7] = new double[] {0, 0, -1.0};
+ break;
+ }
+
+ case 2: {
+
+ n = new double[6][];
+ n[0] = new double[] {0, 0, 1.0};
+ n[1] = new double[] {1.0, 0, 0};
+ n[2] = new double[] {0, 1.0, 0};
+ n[3] = new double[] {-1.0, 0, 0};
+ n[4] = new double[] {0, -1.0, 0};
+ n[5] = new double[] {0, 0, -1.0};
+
+ break;
+ }
+
+ case 3: {
+
+ n = new double[12][];
+ n[0] = new double[] {0, 0, 1.0};
+ n[1] = new double[] {0.8944271909999159, 0, 0.4472135954999579};
+ n[2] = new double[] {0.276393202250021, 0.85065080835204, 0.4472135954999579};
+ n[3] = new double[] {-0.723606797749979, 0.5257311121191336, 0.4472135954999579};
+ n[4] = new double[] {-0.723606797749979, -0.5257311121191336, 0.4472135954999579};
+ n[5] = new double[] {0.276393202250021, -0.85065080835204, 0.4472135954999579};
+ n[6] = new double[] {0.723606797749979, 0.5257311121191336, -0.4472135954999579};
+ n[7] = new double[] {0.723606797749979, -0.5257311121191336, -0.4472135954999579};
+ n[8] = new double[] {-0.276393202250021, 0.85065080835204, -0.4472135954999579};
+ n[9] = new double[] {-0.8944271909999159, 0, -0.4472135954999579};
+ n[10] = new double[] {-0.276393202250021, -0.85065080835204, -0.4472135954999579};
+ n[11] = new double[] {0, 0, -1.0};
+
+ break;
+ }
+
+ case 4: {
+
+ n = new double[20][];
+ n[0] = new double[] {0, 0, 1.0};
+ n[1] = new double[] {0.6666666666666666, 0, 0.7453559924999299};
+ n[2] = new double[] {-0.3333333333333333, 0.5773502691896257, 0.7453559924999299};
+ n[3] = new double[] {-0.3333333333333333, -0.5773502691896257, 0.7453559924999299};
+ n[4] = new double[] {0.7453559924999299, 0.5773502691896257, 0.3333333333333333};
+ n[5] = new double[] {0.7453559924999299, -0.5773502691896257, 0.3333333333333333};
+ n[6] = new double[] {-0.8726779962499649, 0.35682208977308993, 0.3333333333333333};
+ n[7] = new double[] {0.12732200375003502, 0.9341723589627157, 0.3333333333333333};
+ n[8] = new double[] {0.12732200375003502, -0.9341723589627157, 0.3333333333333333};
+ n[9] = new double[] {-0.8726779962499649, -0.35682208977308993, 0.3333333333333333};
+ n[10] = new double[] {0.8726779962499649, 0.35682208977308993, -0.3333333333333333};
+ n[11] = new double[] {0.8726779962499649, -0.35682208977308993, -0.3333333333333333};
+ n[12] = new double[] {-0.7453559924999299, 0.5773502691896257, -0.3333333333333333};
+ n[13] = new double[] {-0.12732200375003502, 0.9341723589627157, -0.3333333333333333};
+ n[14] = new double[] {-0.12732200375003502, -0.9341723589627157, -0.3333333333333333};
+ n[15] = new double[] {-0.7453559924999299, -0.5773502691896257, -0.3333333333333333};
+ n[16] = new double[] {0.3333333333333333, 0.5773502691896257, -0.7453559924999299};
+ n[17] = new double[] {0.3333333333333333, -0.5773502691896257, -0.7453559924999299};
+ n[18] = new double[] {-0.6666666666666666, 0, -0.7453559924999299};
+ n[19] = new double[] {0, 0, -1.0};
+ break;
+ }
+
+ case 5: {
+
+ n = new double[8][];
+ n[0] = new double[] {0,0,1.0};
+ n[1] = new double[] {0.9428090415820634,0,-0.3333333333333333};
+ n[2] = new double[] {-0.4714045207910317,0.816496580927726,-0.3333333333333333};
+ n[3] = new double[] {-0.4714045207910317, -0.816496580927726, -0.3333333333333333};
+ n[4] = new double[] {0,0,-1.0};
+ n[5] = new double[] {-0.9428090415820634,0,0.3333333333333333};
+ n[6] = new double[] {0.4714045207910317,-0.816496580927726,0.3333333333333333};
+ n[7] = new double[] {0.4714045207910317, 0.816496580927726, 0.3333333333333333};
+
+ break;
+ }
+
+ case 6: {
+
+ double u=0.5;
+ double v=0.8090169943749475; // (1/2)*phi
+ double w=0.3090169943749474; // (1/2)/phi
+
+ n = new double[30][];
+ n[0] = new double[] {1,0,0};
+ n[1] = new double[] {-1,0,0};
+ n[2] = new double[] {0,1,0};
+ n[3] = new double[] {0,-1,0};
+ n[4] = new double[] {0,0,1};
+ n[5] = new double[] {0,0,-1};
+ n[6] = new double[] {u,v,w};
+ n[7] = new double[] {-u,v,w};
+ n[8] = new double[] {u,-v,w};
+ n[9] = new double[] {u,v,-w};
+ n[10] = new double[] {-u,-v,w};
+ n[11] = new double[] {u,-v,-w};
+ n[12] = new double[] {-u,v,-w};
+ n[13] = new double[] {-u,-v,-w};
+ n[14] = new double[] {v,w,u};
+ n[15] = new double[] {v,w,-u};
+ n[16] = new double[] {-v,w,u};
+ n[17] = new double[] {v,-w,u};
+ n[18] = new double[] {-v,w,-u};
+ n[19] = new double[] {-v,-w,u};
+ n[20] = new double[] {v,-w,-u};
+ n[21] = new double[] {-v,-w,-u};
+ n[22] = new double[] {w,u,v};
+ n[23] = new double[] {w,-u,v};
+ n[24] = new double[] {w,u,-v};
+ n[25] = new double[] {-w,u,v};
+ n[26] = new double[] {w,-u,-v};
+ n[27] = new double[] {-w,u,-v};
+ n[28] = new double[] {-w,-u,v};
+ n[29] = new double[] {-w,-u,-v};
+ break;
+ }
+
+ Default:
+ break;
+ }
+ }
+ }
+}
diff --git a/qtsharp/src/examples/samples/samples.build b/qtsharp/src/examples/samples/samples.build
new file mode 100644
index 00000000..08a314ab
--- /dev/null
+++ b/qtsharp/src/examples/samples/samples.build
@@ -0,0 +1,86 @@
+<?xml version="1.0">
+<project name="Qt# Samples" default="all">
+ <target name="all">
+ <compile output="hello.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="hello.cs" />
+ </sources>
+ </compile>
+
+ <compile output="display.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="display.cs" />
+ </sources>
+ </compile>
+
+ <compile output="emit.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="emit.cs" />
+ </sources>
+ </compile>
+
+ <compile output="eventhandling.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="eventhandling.cs" />
+ </sources>
+ </compile>
+
+ <compile output="mandelbrot.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="mandelbrot.cs" />
+ </sources>
+ </compile>
+
+ <compile output="scribblewindow.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="scribblewindow.cs" />
+ </sources>
+ </compile>
+
+ <compile output="qfractals.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="quantumfractals.cs" />
+ </sources>
+ </compile>
+
+ <compile output="mandelbrot2.exe" target="exe" optimize="true">
+ <references>
+ <file name="../../bindings/Qt.dll" />
+ </references>
+
+ <sources>
+ <file name="mandelbrot2.cs" />
+ </sources>
+ </compile>
+
+
+ </target>
+</project>
diff --git a/qtsharp/src/examples/samples/scribblewindow.cs b/qtsharp/src/examples/samples/scribblewindow.cs
new file mode 100644
index 00000000..6b594eb8
--- /dev/null
+++ b/qtsharp/src/examples/samples/scribblewindow.cs
@@ -0,0 +1,212 @@
+// scribblewindow.cs - Qt# scribblewindow
+//
+// Author: Adam Treat <manyoso@yahoo.com>
+// (c) 2002 Adam Treat
+// Licensed under the terms of the GNU GPL
+
+namespace QtSamples {
+
+ using Qt;
+ using System;
+
+ [DeclareQtSignal ("colorChanged(QColor)")]
+ [DeclareQtSignal ("load(QString)")]
+ [DeclareQtSignal ("save(QString)")]
+ public class ScribbleWindow : QMainWindow {
+
+ private QMenuBar menubar;
+ private QPopupMenu filemenu;
+ private QPopupMenu aboutmenu;
+ private QScrollView scrollview;
+ public ScribbleArea scribblearea;
+
+ enum Color {Black, Red, Blue, Green, Yellow};
+
+ public static int Main (String[] args)
+ {
+ QApplication app = new QApplication (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 QPopupMenu (null, "filemenu");
+ filemenu.InsertItem ("&Load", this, SLOT ("SlotLoad()") );
+ filemenu.InsertItem ("&Save", this, SLOT ("SlotSave()") );
+ filemenu.InsertSeparator ();
+ filemenu.InsertItem ("&Quit", qApp, SLOT ("quit()"));
+
+ aboutmenu = new QPopupMenu (null, "helpmenu");
+ aboutmenu.InsertItem ("&About Qt-Sharp", this, SLOT ("SlotAboutQtSharp()"));
+ aboutmenu.InsertItem ("&About Qt", this, SLOT ("SlotAboutQt()"));
+
+ menubar = new QMenuBar (this, "");
+ menubar.InsertItem ("&File", filemenu);
+ menubar.InsertItem ("&Color", this, SLOT("SlotColorChooser()"));
+ menubar.InsertItem ("&About", aboutmenu);
+
+ scrollview = new QScrollView (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 ());
+
+ QObject.Connect (this, SIGNAL ("colorChanged(QColor)"),
+ scribblearea, SLOT ("SlotSetColor(QColor)") );
+ QObject.Connect (this, SIGNAL ("load(QString)"),
+ scribblearea, SLOT ("PerformLoad(QString)") );
+ QObject.Connect (this, SIGNAL ("save(QString)"),
+ scribblearea, SLOT ("PerformSave(QString)") );
+ }
+
+ public void SlotLoad ()
+ {
+ string filename = QFileDialog.GetOpenFileName (".", "*.bmp", this,
+ null, "Load File", QString.Null, true);
+
+ if ( filename != null )
+ Emit ("load(QString)", (QString) filename);
+ }
+
+ public void SlotSave ()
+ {
+ string filename = QFileDialog.GetSaveFileName (".", "*.bmp", this,
+ null, "Save File", QString.Null, true);
+
+ if ( filename != null )
+ {
+ if ( ! filename.ToLower().EndsWith(".bmp") )
+ filename += ".bmp";
+ Emit ("save(QString)", (QString) filename);
+ }
+ }
+
+ public void SlotAboutQtSharp ()
+ {
+ QMessageBox.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 ()
+ {
+ QMessageBox.AboutQt (this, "About Qt");
+ }
+
+ public void SlotColorChooser ()
+ {
+ QColor chosenColor = QColorDialog.GetColor();
+ if (chosenColor.IsValid())
+ Emit ("colorChanged(QColor)", chosenColor);
+ }
+
+ public class ScribbleArea : QFrame {
+ private QPoint last;
+ private QPixmap buffer;
+ private QColor currentcolor = new QColor("Black");
+ private QPopupMenu popupmenu;
+
+ public ScribbleArea (QWidget parent) : base (parent)
+ {
+ buffer = new QPixmap ();
+ last = new QPoint ();
+ SetBackgroundMode (Qt.BackgroundMode.NoBackground);
+
+ popupmenu = new QPopupMenu();
+ popupmenu.InsertItem ("&Clear", this, SLOT ("SlotClearArea()") );
+
+ mouseMoveEvent += new MouseMoveEvent (MouseMoved);
+ mousePressEvent += new MousePressEvent (MousePressed);
+ paintEvent += new PaintEvent (PerformPaint);
+ resizeEvent += new ResizeEvent (PerformResize);
+ }
+
+ public void PerformLoad (QString filename)
+ {
+ if ( ! buffer.Load(filename) )
+ QMessageBox.Warning (null, "Load error", "Could not load file");
+ Repaint();
+ }
+
+ public void PerformSave (QString filename)
+ {
+ if ( ! buffer.Save (filename, "BMP") )
+ QMessageBox.Warning( null, "Save error", "Could not save file");
+ }
+
+ public void SlotClearArea ()
+ {
+ buffer.Fill( new QColor ("white") );
+ BitBlt (this, 0, 0, buffer, 0, 0, -1, -1, Qt.RasterOp.CopyROP, false);
+ }
+
+
+ public void SlotSetColor (QColor color)
+ {
+ currentcolor = color;
+ }
+
+ // Note, Dispose() is called on QPoints here to increase performance
+ // of the UI. Otherwise, the GC would let dead QPoint 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 (QMouseEvent e)
+ {
+ if (e.Button() == ButtonState.RightButton )
+ popupmenu.Exec (QCursor.Pos ());
+ else {
+ last.Dispose ();
+ last = e.Pos();
+ }
+ }
+
+ protected void MouseMoved (QMouseEvent e)
+ {
+ QPainter windowPainter = new QPainter ();
+ QPainter bufferPainter = new QPainter ();
+
+ 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 (QPaintEvent e)
+ {
+ BitBlt(this, 0, 0, buffer,
+ 0, 0, -1, -1, RasterOp.CopyROP, false);
+ }
+
+ protected void PerformResize (QResizeEvent e)
+ {
+ QPixmap save = new QPixmap (buffer);
+ buffer.Resize (e.Size());
+ buffer.Fill (new QColor("white"));
+ BitBlt (buffer, 0, 0, save,
+ 0, 0, -1, -1, RasterOp.CopyROP, false);
+ }
+ }
+ }
+}