O1Library Docs
Fall 2023
Docs API

# ViewFrame

o1.gui.mutable$.ViewFrame
abstract class ViewFrame[Model <: AnyRef](val initialModel: Model, tickRate: Double, title: String, initialDelay: Int, terminateOnClose: Boolean, closeWhenDone: Boolean, refreshPolicy: RefreshPolicy) extends ViewFrameImpl[Model], Controls[Model]

This class provides a framework for building simple GUIs. Each instance of the class is a graphical view to an object that represents a particular domain; that object is the model of the view. A `ViewFrame` displays the model as graphics within a GUI frame.

This class is available under the alias `View` in the top-level package o1, so students can access it simply by importing `o1.*`.

The key method in the class is `makePic`, which the view calls automatically and repeatedly to determine which Pic to display in the frame at each moment in time. Concrete view objects must add an implementation for this abstract method.

A view listens to GUI events within the frame, but it doesn’t really do anything when notified of an event; concrete instances of the class can override this behavior by overriding one of the “on methods” (`onClick`, `onMouseMove`, etc.). The view also runs an internal clock and can react to the passing of time (`onTick`).

Just creating a view object is not enough to display it onscreen and start the clock; see the start method.

## Type parameters

Model

  the type of the model object

## Parameters

closeWhenDone

  whether the `ViewFrame` should be hidden and its clock stopped once the view has reached a “done state” (as per `isDone`) (optional; defaults to `false`)

initialDelay

  an additional delay in milliseconds between calling start and the clock starting (optional; defaults to 600)

initialModel

  the model to be displayed in the view (the only required parameter). It usually makes sense to use a mutable object here and change its state via the event handlers (cf. o1.gui.immutable.ViewFrame).

refreshPolicy

  a policy for how eagerly the view should try to update the graphical representation of its model (optional; changing this may improve efficiency in some circumstances)

terminateOnClose

  whether the entire application should exit when the `ViewFrame` is closed (optional; defaults to `true`)

tickRate

  the clock of the view will tick roughly this many times per second (optional; defaults to 24)

title

  a string to be displayed in the frame’s title bar (optional)

## Attributes

Graph
Supertypes
  trait Controls[Model]
  trait Fast
  class ViewFrameImpl[Model]
  class Object
  trait Matchable
  class Any
  Show all
Known subtypes
  class Traced[TraceData]

## Members list

### Type members

#### Classlikes

final class Traced[TraceData](val extractTrace: Model => TraceData) extends ViewFrame[Model], TraceGeneratingView[Model, TraceData]

A view that wraps around another, collecting a log or trace of events while delegating its actual event-handling to the wrapped view. Provides additional methods for accessing such traces: trace, simulateAndGet, and startAndGet. A few examples of using these methods are given below.

A view that wraps around another, collecting a log or trace of events while delegating its actual event-handling to the wrapped view. Provides additional methods for accessing such traces: trace, simulateAndGet, and startAndGet. A few examples of using these methods are given below.

`simulate` 500 clock ticks on the trace-collecing view and print the trace of clock ticks accompanied by descriptions of the view’äs `model`.

    for (traceItem, traceEvent) <- myTracedView.simulateAndGet(500) do
       println(traceEvent + ": " + traceItem)

Or, equivalently:

    myTracedView.simulate(500)
     for (traceItem, traceEvent) <- myTracedView.trace do
       println(traceEvent + ": " + traceItem)

Alternatively, start the trace-collecting view and run it interactively until it is done or a tick limit is reached. Then print the trace of ticks and GUI events accompanied with descriptions of the view’s `model`.

    val futureTrace = myTracedView.startAndGet(tickLimit=100) recover {
       case Aborted(message, partialTrace) => partialTrace
     }
     for trace <- futureTrace; (traceItem, traceEvent) <- trace do
       println(traceEvent + ": " + traceItem)

## Type parameters

TraceData

  the type of the model-state descriptions in the trace

## Parameters

extractTrace

  a function that determines how to describe a model state in the generated trace

## Attributes

Supertypes
  trait TraceGeneratingView[Model, TraceData]
  trait GeneratesTrace[Model, TraceData]
  class ViewFrame[Model]
  trait Controls[Model]
  trait Fast
  class ViewFrameImpl[Model]
  class Object
  trait Matchable
  class Any
  Show all

### Value members

#### Constructors

def this(initialModel: Model, title: String)

An alternative constructor. Takes in just the model and the title; uses the defaults for all the other parameters. Please see the multi-parameter constructor for details.

An alternative constructor. Takes in just the model and the title; uses the defaults for all the other parameters. Please see the multi-parameter constructor for details.

## Parameters

initialModel

  the model to be displayed in the view

title

  a string to be displayed in the frame’s title bar

## Attributes

def this(initialModel: Model, tickRate: Double)

An alternative constructor. Takes in just the model and the tick rate; uses the defaults for all the other parameters. Please see the multi-parameter constructor for details.

An alternative constructor. Takes in just the model and the tick rate; uses the defaults for all the other parameters. Please see the multi-parameter constructor for details.

## Parameters

initialModel

  the model to be displayed in the view

tickRate

  the clock of the view will tick roughly this many times per second

## Attributes

#### Concrete methods

final def tracedWith[TraceData](extractTrace: Model => TraceData): Traced[TraceData]

Returns a view that collects of the ticks and GUI events that the `View`’s event handlers process, using the given function to generate that trace. That trace-collecting view, which an instance of the Traced subclass, delegates the actual event handling to this original view but provides an additional interface for tracing.

Returns a view that collects of the ticks and GUI events that the `View`’s event handlers process, using the given function to generate that trace. That trace-collecting view, which an instance of the Traced subclass, delegates the actual event handling to this original view but provides an additional interface for tracing.

## Type parameters

TraceData

  the type of the model-state descriptions in the trace

## Parameters

extractTrace

  a function that determines how to describe a model state in the generated trace

## Attributes

See also

  traced, tracedPics

#### Inherited methods

final def adjustSpeed(newTickRate: Double): Unit

Sets a new tick rate for the view, replacing any previously set by the constructor or this method.

Sets a new tick rate for the view, replacing any previously set by the constructor or this method.

## Attributes

Inherited from:
  ViewFrameImpl

final def close(): Unit

Closes the view: stops it (as per stop), does any onClose effects, hides the GUI window, and possibly terminates the entire application (as per the constructor parameter).

Closes the view: stops it (as per stop), does any onClose effects, hides the GUI window, and possibly terminates the entire application (as per the constructor parameter).

## Attributes

Inherited from:
  ViewFrameImpl

def icon: Option[Pic]

The icon to be displayed in the title bar of this view’s GUI frame.

The icon to be displayed in the title bar of this view’s GUI frame.

## Attributes

Inherited from:
  ViewFrameImpl

final def icon_=(icon: Pic): Unit

Sets the icon to be displayed in the title bar of this view’s GUI frame.

Sets the icon to be displayed in the title bar of this view’s GUI frame.

## Parameters

icon

  a picture to be used as the icon

## Attributes

Inherited from:
  ViewFrameImpl

final def icon_=(icon: Option[Pic]): Unit

Sets the icon to be displayed in the title bar of this view’s GUI frame.

Sets the icon to be displayed in the title bar of this view’s GUI frame.

## Parameters

icon

  a picture to be used as the icon; if `None`, en empty icon image will be displayed

## Attributes

Inherited from:
  ViewFrameImpl

def isDone: Boolean

Determines if the given state is a “done state” for the view. By default, this is never the case, but that behavior can be overridden.

Determines if the given state is a “done state” for the view. By default, this is never the case, but that behavior can be overridden.

Once done, the view stops reacting to events and updating its graphics and may close its GUI window, depending on the constructor parameters of the view.

## Attributes

Inherited from:
  Controls

override def isPaused: Boolean

Indicates whether the view is paused. By default, always returns `false`.

Indicates whether the view is paused. By default, always returns `false`.

## Attributes

See also

  HasPauseToggle

Definition Classes
  Controls -> Controls
Inherited from:
  Controls

def makePic: Pic

Returns a Pic that graphically represents the current state of the view’s `model` object. This method is automatically invoked by the view after GUI events and clock ticks. Left abstract by this class so any concrete view needs to add a custom implementation.

Returns a Pic that graphically represents the current state of the view’s `model` object. This method is automatically invoked by the view after GUI events and clock ticks. Left abstract by this class so any concrete view needs to add a custom implementation.

For best results, all invocations of this method on a single view object should return `Pic`s of equal dimensions.

## Attributes

Inherited from:
  Controls

def model: Model

the model object represented in the view.

the model object represented in the view.

## Attributes

Inherited from:
  HasModelField (hidden)

def onClick(event: MouseClicked): Unit

Causes an effect whenever a mouse button is clicked (pressed+released, possibly multiple times in sequence) above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is clicked (pressed+released, possibly multiple times in sequence) above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onClick(position: Pos): Unit

Causes an effect whenever a mouse button is clicked (pressed+released, possibly multiple times in sequence) above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is clicked (pressed+released, possibly multiple times in sequence) above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

position

  the position of the mouse cursor relative to the view’s top left-hand corner

## Attributes

Inherited from:
  Controls

def onClose(): Unit

Causes an effect when the view’s GUI window is closed for any reason. By default, this method does nothing.

Causes an effect when the view’s GUI window is closed for any reason. By default, this method does nothing.

## Attributes

Inherited from:
  ViewFrameImpl

def onKeyDown(event: KeyPressed): Unit

Causes an effect whenever a key on the keyboard is pressed down while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is pressed down while the view has the keyboard focus. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onKeyDown(key: Key): Unit

Causes an effect whenever a key on the keyboard is pressed down while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is pressed down while the view has the keyboard focus. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

key

  the key that was pressed down

## Attributes

Inherited from:
  Controls

def onKeyUp(event: KeyReleased): Unit

Causes an effect whenever a key on the keyboard is released while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is released while the view has the keyboard focus. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onKeyUp(key: Key): Unit

Causes an effect whenever a key on the keyboard is released while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is released while the view has the keyboard focus. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

key

  the key that was released

## Attributes

Inherited from:
  Controls

def onMouseDown(event: MousePressed): Unit

Causes an effect whenever a mouse button is pressed down above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is pressed down above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseDown(position: Pos): Unit

Causes an effect whenever a mouse button is pressed down above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is pressed down above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

position

  the position of the mouse cursor relative to the view’s top left-hand corner

## Attributes

Inherited from:
  Controls

def onMouseDrag(event: MouseDragged): Unit

Causes an effect whenever the mouse cursor is dragged above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor is dragged above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseDrag(position: Pos): Unit

Causes an effect whenever the mouse cursor is dragged above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor is dragged above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

position

  the position of the mouse cursor relative to the view’s top left-hand corner

## Attributes

Inherited from:
  Controls

def onMouseEnter(event: MouseEntered): Unit

Causes an effect whenever the mouse cursor enters the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor enters the view. Does nothing by default but can be overridden.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseExit(event: MouseExited): Unit

Causes an effect whenever the mouse cursor exits the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor exits the view. Does nothing by default but can be overridden.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseMove(event: MouseMoved): Unit

Causes an effect whenever the mouse cursor moves above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor moves above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseMove(position: Pos): Unit

Causes an effect whenever the mouse cursor moves above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse cursor moves above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

position

  the position of the mouse cursor relative to the view’s top left-hand corner

## Attributes

Inherited from:
  Controls

def onMouseUp(event: MouseReleased): Unit

Causes an effect whenever a mouse button is released above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is released above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onMouseUp(position: Pos): Unit

Causes an effect whenever a mouse button is released above the view. Does nothing by default but can be overridden.

Causes an effect whenever a mouse button is released above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

position

  the position of the mouse cursor relative to the view’s top left-hand corner

## Attributes

Inherited from:
  Controls

override def onStop(): Unit

Causes an additional effect when the view is stopped (with `stop()`). By default, this method does nothing.

Causes an additional effect when the view is stopped (with `stop()`). By default, this method does nothing.

## Attributes

Definition Classes
  Controls -> Controls
Inherited from:
  Controls

def onTick(time: Long): Unit

Causes an effect whenever the view’s internal clock ticks. Does nothing by default but can be overridden.

Causes an effect whenever the view’s internal clock ticks. Does nothing by default but can be overridden.

If you don’t need the number of the clock tick, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

time

  the running number of the clock tick (the first tick being number 1, the second 2, etc.)

## Attributes

Inherited from:
  Controls

def onTick(): Unit

Causes an effect whenever the view’s internal clock ticks. Does nothing by default but can be overridden.

Causes an effect whenever the view’s internal clock ticks. Does nothing by default but can be overridden.

## Attributes

Inherited from:
  Controls

def onType(event: KeyTyped): Unit

Causes an effect whenever a key on the keyboard is typed (pressed+released) while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is typed (pressed+released) while the view has the keyboard focus. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onType(character: Char): Unit

Causes an effect whenever a key on the keyboard is typed (pressed+released) while the view has the keyboard focus. Does nothing by default but can be overridden.

Causes an effect whenever a key on the keyboard is typed (pressed+released) while the view has the keyboard focus. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

character

  the key that was typed

## Attributes

Inherited from:
  Controls

def onWheel(event: MouseWheelMoved): Unit

Causes an effect whenever the mouse wheel is rotated above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse wheel is rotated above the view. Does nothing by default but can be overridden.

If you don’t need much information about the GUI event, you may find it simpler to implement the other method of the same name instead of this one.

## Parameters

event

  the GUI event that caused this handler to be called

## Attributes

Inherited from:
  Controls

def onWheel(rotation: Int): Unit

Causes an effect whenever the mouse wheel is rotated above the view. Does nothing by default but can be overridden.

Causes an effect whenever the mouse wheel is rotated above the view. Does nothing by default but can be overridden.

If the desired behavior depends on detailed information about the GUI event, you may want to implement the other method of the same name instead of this one.

## Parameters

rotation

  the number of steps the wheel rotated (negative means up, positive down)

## Attributes

Inherited from:
  Controls

final def refresh(): Unit

Programmatically requests an update to the graphics of the view (even though no clock tick or triggering GUI event occurred).

Programmatically requests an update to the graphics of the view (even though no clock tick or triggering GUI event occurred).

## Attributes

Inherited from:
  ViewFrameImpl

final def simulate(tickLimit: Int): Unit

Runs the view as if by calling start except that it runs “headless”, with no actual GUI window visible and independently of a real-time clock. A number of simulated clock ticks are immediately sent to the view; this continues until either the view determines it is done or a predetermined maximum number of ticks has been reached.

Runs the view as if by calling start except that it runs “headless”, with no actual GUI window visible and independently of a real-time clock. A number of simulated clock ticks are immediately sent to the view; this continues until either the view determines it is done or a predetermined maximum number of ticks has been reached.

## Parameters

tickLimit

  the maximum number of ticks to simulate; `Int.MaxValue` (which is the default) means there is no such limit

## Attributes

Inherited from:
  ViewFrameImpl

def sound: Option[Sound]

Determines whether the view should play a sound, given the current state of its model. By default, no sounds are played.

Determines whether the view should play a sound, given the current state of its model. By default, no sounds are played.

## Attributes

Returns

  a Sound that the view should play; `None` if no sound is appropriate for the current state

Inherited from:
  Controls

final def start(): Unit

Starts the view: loads the model in the GUI window, makes the window visible oncreen, and starts the clock. Cf. simulate.

Starts the view: loads the model in the GUI window, makes the window visible oncreen, and starts the clock. Cf. simulate.

## Attributes

Inherited from:
  ViewFrameImpl

final def stop(): Unit

Stops the view: stops the clock, stops listening to events, and disposes of the GUI window. A stopped view cannot be restarted.

Stops the view: stops the clock, stops listening to events, and disposes of the GUI window. A stopped view cannot be restarted.

## Attributes

Inherited from:
  ViewFrameImpl

override def toString: String

Returns a brief textual description of the view.

Returns a brief textual description of the view.

## Attributes

Definition Classes
  ViewFrameImpl -> Any
Inherited from:
  ViewFrameImpl

final def tooltip: String

the tooltip text to be displayed while the mouse hovers on the view

the tooltip text to be displayed while the mouse hovers on the view

## Attributes

Inherited from:
  ViewFrameImpl

final def tooltip_=(newText: String): Unit

Sets the tooltip text to be displayed while the mouse hovers on the view.

Sets the tooltip text to be displayed while the mouse hovers on the view.

## Attributes

Inherited from:
  ViewFrameImpl

final def traced: Traced[String]

Returns a `View` that stores a trace of the ticks and GUI events that its event handlers process. This parameterless method stores, at each event, the `toString` description of the `View`’s (mutable) model. This is equivalent to calling tracedWith and passing in that `toString` method.

Returns a `View` that stores a trace of the ticks and GUI events that its event handlers process. This parameterless method stores, at each event, the `toString` description of the `View`’s (mutable) model. This is equivalent to calling tracedWith and passing in that `toString` method.

## Attributes

Inherited from:
  Controls

final def tracedPics: Traced[Pic]

Returns a `View` that stores a pictorial trace of the ticks and GUI events that the `View`’s event handlers process. This is equivalent to calling tracedWith and passing in the `View`’s `makePic` method.

Returns a `View` that stores a pictorial trace of the ticks and GUI events that the `View`’s event handlers process. This is equivalent to calling tracedWith and passing in the `View`’s `makePic` method.

## Attributes

Inherited from:
  Controls

final def visible: Boolean

whether this view’s GUI frame is visible onscreen

whether this view’s GUI frame is visible onscreen

## Attributes

Inherited from:
  ViewFrameImpl

final def visible_=(desiredVisibility: Boolean): Unit

Sets whether this view’s GUI frame is visible onscreen.

Sets whether this view’s GUI frame is visible onscreen.

## Attributes

Inherited from:
  ViewFrameImpl