I'm starting to experiment with NiGui. I'm trying to create "widgets" that 
maintain some state and that can communicate events between the child widgets 
they contain. I also want to modularise the code into separate functions and 
objects. Here's my first hack on your example 10 (see also a question in the 
code & notes after the code): 
    
    
    {.experimental: "codeReordering".}
    
    import nigui
    
    type
        MainWindow = object
            window: Window
            statusLabel: Label
        CustomControl = object
            control: Control
    
    proc main(): void =
        app.init()
        var mainWindow = newMainWindow("Test #2")
        mainWindow.statusLabel.text = "Click..."
        mainWindow.window.show()
        app.run()
    
    proc newMainWindow(title: string): MainWindow =
        result.window = newWindow(title)
        result.window.width = 500
        result.window.height = 500
        var vbox = newLayoutContainer(LayoutVertical)
        result.window.add(vbox)
        result.statusLabel = newLabel()
        vbox.add(result.statusLabel)
        
        # pass in the label so that the new control can "talk: to it: is there 
a better way?
        var control = newCustomControl(result.statusLabel)
        control.control.width = 400
        control.control.height = 400
        vbox.add(control.control)
        control.control.widthMode = WidthMode_Fill
        control.control.heightMode = HeightMode_Fill
    
    proc newCustomControl(label: Label): CustomControl =
        result.control = newControl()
        
        result.control.onDraw = proc (event: DrawEvent) =
            let canvas = event.control.canvas
            canvas.areaColor = rgb(30, 30, 30) # dark grey
            canvas.fill()
            canvas.setPixel(0, 0, rgb(255, 0, 0))
            canvas.areaColor = rgb(255, 0, 0) # red
            canvas.drawRectArea(10, 10, 30, 30)
            canvas.lineColor = rgb(255, 0, 0) # red
            canvas.drawLine(60, 10, 110, 40)
            let text = "Hello World!"
            canvas.textColor = rgb(0, 255, 0) # lime
            canvas.fontSize = 20
            canvas.fontFamily = "Arial"
            canvas.drawText(text, 10, 70)
            canvas.drawRectOutline(10, 70, canvas.getTextWidth(text),
                                   canvas.getTextLineHeight())
        
        result.control.onMouseButtonDown = proc (event: MouseEvent) =
            label.text = $event.button & " (" & $event.x & ", " & $event.y & ")"
            # Shows where the mouse is clicked in control-relative coordinates
    
    main()
    
    
    Run

You'll notice that I had to drop the images since I couldn't get them to work 
(even though they work fine in your original example). Oh, and this runs fine 
on Windows & Linux:-)

PS I use 4 spaces for indents because I read years ago in _Code Complete_ that 
comparative studies had shown that a minimum of 3 is needed for clarity, and 
I'm used to 4 from Python;-}

Reply via email to