Vibrating rectangles: Difference between revisions

Content added Content deleted
(Added Wren)
Line 394: Line 394:
end
end
</lang>
</lang>

=={{header|Nim}}==
{{libheader|gintro}}
Should work on any platform where Gtk is available. Tested on Linux.
<lang Nim>import sugar

import gintro/[gobject, gdk, gtk, gio, cairo]
import gintro/glib except Pi

const
Width = 640
Height = 480
X0 = Width div 2 - 1
Y0 = Height div 2 - 1
Colors = [(0.0, 0.0, 0.0), (255.0, 0.0, 0.0), (0.0, 255.0, 0.0), (0.0, 0.0, 255.0),
(255.0, 0.0, 255.0), (0.0, 255.0, 255.0), (255.0, 255.0, 0.0), (255.0, 255.0, 255.0)]
Sizes = collect(newSeq, for size in countdown(Width, 4, 16): float(size))

type

# Description of the simulation.
Simulation = ref object
area: DrawingArea # Drawing area.
isize: Natural # Size index.
icolor: Natural # Color index.

#---------------------------------------------------------------------------------------------------

proc newSimulation(area: DrawingArea): Simulation =
## Allocate and initialize the simulation object.

new(result)
result.area = area
result.isize = 0

#---------------------------------------------------------------------------------------------------

proc draw(sim: Simulation; context: cairo.Context) =
## Draw the rectangles.

context.setSource(Colors[sim.icolor])
let width = Sizes[sim.isize]
let height = width * 3 / 4
context.rectangle(X0 - width * 0.5, Y0 - height * 0.5, width, height)
context.stroke()

#---------------------------------------------------------------------------------------------------

proc update(sim: Simulation): gboolean =
## Update the simulation state.

sim.isize = (sim.isize + 1) mod Sizes.len
if sim.isize == 0:
# Change color for next cycle.
sim.icolor = (sim.icolor + 1) mod Colors.len
sim.draw(sim.area.window.cairoCreate())
result = gboolean(1)

#---------------------------------------------------------------------------------------------------

proc activate(app: Application) =
## Activate the application.

let window = app.newApplicationWindow()
window.setSizeRequest(Width, Height)
window.setTitle("Vibrating rectangles")

let area = newDrawingArea()
window.add(area)

let sim = newSimulation(area)
timeoutAdd(40, update, sim)
window.showAll()

#———————————————————————————————————————————————————————————————————————————————————————————————————

let app = newApplication(Application, "Rosetta.vibrating_rectangles")
discard app.connect("activate", activate)
discard app.run()</lang>


=={{header|Objeck}}==
=={{header|Objeck}}==