{-# OPTIONS -fglasgow-exts #-}
-----------------------------------------------------------------------------
{-| Program   : widgets.hs
    Copyright : (c) David Harley 2010
    Project   : qtHaskell
    Version   : 1.1.4
    Modified  : 2010-09-02 17:02:47
    
    Warning   : this file is machine generated - do not modify.
--}
-----------------------------------------------------------------------------

module Main where

import Qtc.ClassTypes.Core
import Qtc.ClassTypes.Gui
import Qtc.Classes.Base
import Qtc.Classes.Qccs
import Qtc.Classes.Qccs_h
import Qtc.Classes.Core
import Qth.ClassTypes.Core
import Qth.Core.Size
import Qth.Core.Rect
import Qtc.Core.QSize
import Qtc.Classes.Gui
import Qtc.Enums.Base
import Qtc.Enums.Classes.Core
import Qtc.Core.Base
import Qtc.Gui.Base
import Qtc.Core.QCoreApplication
import Qtc.Gui.QApplication
import Qtc.Gui.QDialog
import Qtc.Gui.QMenuBar
import Qtc.Gui.QMenu
import Qtc.Gui.QLayout
import Qtc.Gui.QGroupBox
import Qtc.Gui.QDialogButtonBox
import Qtc.Enums.Gui.QDialogButtonBox
import Qtc.Gui.QVBoxLayout
import Qtc.Gui.QHBoxLayout
import Qtc.Gui.QGridLayout
import Qtc.Gui.QTextEdit
import Qtc.Gui.QLineEdit
import Qtc.Gui.QLabel
import Qtc.Gui.QWidget
import Qtc.Gui.QPushButton
import Qtc.Gui.QPushButton_h
import Qtc.Gui.QAbstractButton
import Qtc.Gui.QMessageBox
import Qtc.Enums.Core.Qt

type MyQDialog = QWidgetSc (CMyQDialog)
data CMyQDialog = CMyQDialog

myQDialog :: IO (MyQDialog)
myQDialog = qSubClass $ qWidget ()

type MyQPushButton = QPushButtonSc (CMyQPushButton)
data CMyQPushButton = CMyQPushButton

myQPushButton :: String -> IO (MyQPushButton)
myQPushButton t = qSubClass $ qPushButton t

main :: IO ()
main
  = do
    app <- qApplication ()
    dialog <- myQDialog
    mb <- qMessageBox dialog
    mainLayout <- qVBoxLayout ()
    setMenuBar mainLayout =<< add_menuBar dialog
    let wfl = [(add_horizontal mb dialog),
               (add_grid),
               (add_bigEditor),
               (add_buttonBox dialog)]
    mapM_ (m1 mainLayout) wfl
    setLayout dialog mainLayout
    setWindowTitle dialog "Basic Layouts"
    qshow dialog ()
    ok <- qApplicationExec ()
    return()

m1 :: QVBoxLayout () -> (IO (QWidget a)) -> IO ()
m1 mainLayout wf
  = do
    w <- wf
    addWidget mainLayout w

add_menuBar :: MyQDialog -> IO (QMenuBar ())
add_menuBar dlg
  = do
    menuBar <- qMenuBar ()
    fileMenu <- qMenu ("&File", dlg)
    exitAction <- addAction fileMenu "E&xit"
    addMenu menuBar fileMenu 
    app <- qCoreApplicationInstance ()
    connectSlot exitAction "triggered()" app "quit()" ()
    return menuBar

add_horizontal :: QMessageBox () -> MyQDialog -> IO (QWidget a)
add_horizontal mb dlg
  = do
    horizontalGroupBox <- qGroupBox "Horizontal layout"
    horizontalLayout <- qHBoxLayout ()
    add_buttons mb dlg horizontalLayout "Button" 4 0
    setLayout horizontalGroupBox horizontalLayout
    return $ objectCast horizontalGroupBox

add_grid :: IO (QWidget a)
add_grid
  = do
    gridGroupBox <- qGroupBox "Grid layout"
    gridLayout <- qGridLayout ()
    add_lablins gridLayout "Lines" 3 0
    smallEditor <- qTextEdit ()
    setPlainText smallEditor "This widget takes up about two thirds of the grid layout."
    addWidget gridLayout (smallEditor, 0::Int, 2::Int, 4::Int, 1::Int)
    setColumnStretch gridLayout (2, 20)
    setLayout gridGroupBox gridLayout
    return $ objectCast gridGroupBox

add_bigEditor :: IO (QWidget a)
add_bigEditor
  = do
    bigEditor <- qTextEdit ()
    setPlainText bigEditor "This widget takes up all the remaining space in the top-level layout."
    return $ objectCast bigEditor

add_buttonBox :: MyQDialog -> IO (QWidget a)
add_buttonBox dlg
  = do
    buttonBox <- qDialogButtonBox ((fOk + fCancel)::QDialogButtonBoxStandardButtons)
    connectSlot buttonBox "accepted()" dlg "close()" ()
    connectSlot buttonBox "rejected()" dlg "close()" ()
    return $ objectCast buttonBox

add_buttons :: QMessageBox () -> MyQDialog -> QHBoxLayout () -> String -> Int -> Int -> IO ()
add_buttons _ _ _ _ nb cn | cn >= nb = return ()
add_buttons mb dlg qlt bs nb cn
  = do
    let cc = cn + 1
    tb <- myQPushButton $ bs ++ show cc
    connectSlot tb "clicked()" tb "click()" $ on_button_clicked mb dlg
    addWidget qlt tb
    add_buttons mb dlg qlt bs nb cc

add_lablins :: QGridLayout () -> String -> Int -> Int -> IO ()
add_lablins _ _ nl cn | cn >= nl = return () 
add_lablins qlt ls nl cn
  = do
    let cc = cn + 1
    nlb <- qLabel $ ls ++ show cc
    nln <- qLineEdit ()
    addWidget qlt (nlb, cc, 0::Int)
    addWidget qlt (nln, cc, 1::Int)
    add_lablins qlt ls nl cc

on_button_clicked :: QMessageBox () -> MyQDialog -> MyQPushButton -> IO ()
on_button_clicked mb dlg this
  = do
    tt <- text this ()
    setText mb $ "You have clicked " ++ show tt
    qshow mb ()
    returnGC

