aboutsummaryrefslogtreecommitdiff
path: root/tests/untried/pos/gui.scala
diff options
context:
space:
mode:
Diffstat (limited to 'tests/untried/pos/gui.scala')
-rw-r--r--tests/untried/pos/gui.scala101
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/untried/pos/gui.scala b/tests/untried/pos/gui.scala
new file mode 100644
index 000000000..0504fb435
--- /dev/null
+++ b/tests/untried/pos/gui.scala
@@ -0,0 +1,101 @@
+object Geom {
+ trait Shape
+ case class Point(x: Int, y: Int) extends Shape
+ case class Rectangle(ll: Point, ur: Point) extends Shape {
+ def inset(delta: Int) =
+ Rectangle(Point(ll.x - delta, ll.y - delta), Point(ur.x + delta, ur.y + delta));
+ }
+}
+
+object Color {
+ type Color = Int
+ val black = 0x000000
+ val grey = 0x808080
+}
+
+trait Screen {
+ type Color = Int
+ def drawRect(r: Geom.Rectangle, c: Color): Unit
+ def fillRect(r: Geom.Rectangle, c: Color): Unit
+}
+
+object DummyScreen extends Screen {
+ def drawRect(r: Geom.Rectangle, c: Color): Unit = {
+ Console.println("draw " + r + " with " + c)
+ }
+ def fillRect(r: Geom.Rectangle, c: Color): Unit = {
+ Console.println("fill " + r + " with " + c)
+ }
+}
+
+object GUI {
+
+ object Controller {
+ def addMouseCtl(c: MouseCtl) = ()
+ }
+
+ trait Glyph {
+ def getRect: Geom.Rectangle
+ def setLoc(p: Geom.Point): Unit
+ def draw(): Unit = { Console.println("draw " + this) }
+ }
+
+ class Label(scr: Screen, p: Geom.Point, name: String) extends Glyph {
+ private var origin = p
+ def getRect = Geom.Rectangle(origin, origin).inset(10);
+ def setLoc(p: Geom.Point) = { origin = p }
+ }
+
+ trait Ctl {
+ def getGlyph: Glyph
+ def enable(b: Boolean): this.type
+ }
+
+ trait MouseCtl extends Ctl {
+ def mouseDown(p: Geom.Point): Unit
+ }
+
+ abstract class Button(scr: Screen, p: Geom.Point, name: String)
+ extends Glyph with MouseCtl {
+ var enabled: Boolean = false
+ val label = new Label(scr, p, name)
+
+ /* Glyph methods */
+ override def draw(): Unit = {
+ if (enabled) scr.drawRect(getRect, Color.black)
+ else scr.fillRect(getRect, Color.grey);
+ label.draw();
+ }
+ def setLoc(p: Geom.Point) = label.setLoc(p);
+ def getRect = label.getRect.inset(-2);
+
+ /* Ctl methods */
+ def enable(b: Boolean): this.type = { enabled = b; draw(); this }
+ def getGlyph = label
+ final def mouseDown(p: Geom.Point): Unit = {
+ if (enabled) doit() else Console.println("button is disabled");
+ }
+ /* deferred method to be specified by client */
+ def doit(): Unit
+ }
+}
+
+object GUIClient {
+
+ class App {
+ def quit(): Unit = { Console.println("application exited") }
+ }
+
+ class QuitButton (scr: Screen, p: Geom.Point, name: String, a: App)
+ extends GUI.Button(scr, p, name) {
+ def doit(): Unit = { a.quit() }
+ }
+
+ def main(args: Array[String]): Unit = {
+ val b = new QuitButton(
+ DummyScreen, Geom.Point(1, 1), "quit", new App);
+ b.draw();
+ b.enable(true).mouseDown(Geom.Point(1, 2));
+ }
+}
+