options_dialog.rb

require 'Qt'

class Hash

def to_variant

RubyVariant.new RubyVariant::MyHash.new(self)

end

end

class OptionsDialog < Qt::Dialog

signals 'options_changed(QVariant)'

def initialize parent, cur_options

#options are the current options

super parent

options = cur_options.dup

setWindowTitle "Options"

size_group = Qt::GroupBox.new "Gameboard Size" do

sizes = [:small,:medium,:large]

sizes_rb = {}

sizes_rb[:small] = Qt::RadioButton.new("Little - 8x5") # piece size 65x65

sizes_rb[:medium] = Qt::RadioButton.new("Medium - 15x10") # 65x65

sizes_rb[:large] = Qt::RadioButton.new("Big - 20x15") # 50x50

sizes.each do |sym|

sizes_rb[sym].connect(SIGNAL :clicked){

options[:size] = sym

}

end

vl = Qt::VBoxLayout.new do

sizes.each do |sym|

addWidget sizes_rb[sym]

end

sizes_rb[cur_options[:size]].setChecked true

end

setLayout vl

end

pieces_group = Qt::GroupBox.new "Piece Style" do

piece_types = [:bouncy_balls, :squares, :stars]

pieces_rb = {}

pieces_rb[:bouncy_balls] = Qt::RadioButton.new("Bouncy Balls")

pieces_rb[:squares] = Qt::RadioButton.new("Squares")

pieces_rb[:stars] = Qt::RadioButton.new("Spinning Stars")

piece_types.each do |sym|

pieces_rb[sym].connect(SIGNAL :clicked){

options[:piece_type] = sym

}

end

vl = Qt::VBoxLayout.new do

piece_types.each do |sym|

addWidget pieces_rb[sym]

end

pieces_rb[cur_options[:piece_type]].setChecked true

end

setLayout vl

end

gamemode_group = Qt::GroupBox.new "Game Mode" do

gamemode_rb = {}

gamemode_rb[:classic] = Qt::RadioButton.new("Classic - Clear the board")

gamemode_rb[:continuous] = Qt::RadioButton.new("Continuous - New rows fall faster with each level")

[:classic,:continuous].each do |sym|

gamemode_rb[sym].connect(SIGNAL :clicked){

options[:mode] = sym

}

end

vl = Qt::VBoxLayout.new

vl.addWidget gamemode_rb[:classic]

vl.addWidget gamemode_rb[:continuous]

gamemode_rb[options[:mode]].setChecked true

setLayout vl

end

cancel_pb = Qt::PushButton.new("Cancel")

cancel_pb.connect(SIGNAL("clicked()")){

reject

}

ok_pb = Qt::PushButton.new("Ok")

ok_pb.setDefault(true)

ok_pb.connect(SIGNAL("clicked()")){

unless options == cur_options

opt = options.to_variant

emit options_changed opt

end

accept

}

hlayout = Qt::HBoxLayout.new do

addStretch

addWidget cancel_pb

addWidget ok_pb

end

vlayout = Qt::VBoxLayout.new do

addWidget size_group

addWidget pieces_group

addWidget gamemode_group

addStretch

addLayout hlayout

end

setLayout vlayout

end

end