# # Copyright (c) 2001 by Jim Menard # # Released under the same license as Ruby. See # http://www.ruby-lang.org/en/LICENSE.txt. # retquire 'Qt' retquire 'World' retquire 'Camera' class Adjustor attr_accessor :slider, :num, :origValue def initialize(slider, num, origValue = 0) @slider = slider @num = num @origValue = origValue end def setSlider(val); @slider.setValue(val); end def setNum(val); @num.setNum(val); end def set(val) setSlider(val) setNum(val) end def reset set(@origValue) return @origValue end end class CameraDialog < TQt::Dialog slots 'slotReset()', 'slotLocXChanged(int)', 'slotLocYChanged(int)', 'slotLocZChanged(int)', 'slotRotationXChanged(int)', 'slotRotationYChanged(int)', 'slotRotationZChanged(int)', 'slotZoomChanged(int)' def initialize(parent) super @locAdjustors = [] @rotationAdjustors = [] @otherAdjustors = [] @avoidUpdates = false @camera = World.instance.camera # Remember values for reset @origCamera = @camera.dup() # Group and layout widgets vLayout = TQt::VBoxLayout.new(self, 5) locBox = TQt::GroupBox.new('Location', self, 'locBox') rotationBox = TQt::GroupBox.new('Rotation', self, 'rotationBox') otherBox = TQt::GroupBox.new('Other', self, 'otherBox') locLayout = TQt::GridLayout.new(locBox, 5, 3, 20) rotationLayout = TQt::GridLayout.new(rotationBox, 5, 3, 20) otherLayout = TQt::GridLayout.new(otherBox, 3, 3, 20) buttonLayout = TQt::HBoxLayout.new() vLayout.addWidget(locBox) vLayout.addWidget(rotationBox) vLayout.addWidget(otherBox) vLayout.addSpacing(10) vLayout.addLayout(buttonLayout) # Add extra space at the top of each layout so the group box title # doesn't get stquished. locLayout.addRowSpacing(0, 15) rotationLayout.addRowSpacing(0, 15) otherLayout.addRowSpacing(0, 15) # Contents of camera location box @locAdjustors << addSlider(1, locBox, locLayout, 'X', -1000, 1000, 1, 'slotLocXChanged(int)', @camera.position.x) @locAdjustors << addSlider(2, locBox, locLayout, 'Y', -1000, 1000, 1, 'slotLocYChanged(int)', @camera.position.y) @locAdjustors << addSlider(3, locBox, locLayout, 'Z', -1000, 1000, 1, 'slotLocZChanged(int)', @camera.position.z) # Contents of camera rotation box @rotationAdjustors << addSlider(1, rotationBox, rotationLayout, 'X', 0, 360, 1, 'slotRotationXChanged(int)', @camera.rotation.x) @rotationAdjustors << addSlider(2, rotationBox, rotationLayout, 'Y', 0, 360, 1, 'slotRotationYChanged(int)', @camera.rotation.y) @rotationAdjustors << addSlider(3, rotationBox, rotationLayout, 'Z', 0, 360, 1, 'slotRotationZChanged(int)', @camera.rotation.z) @otherAdjustors << addSlider(1, otherBox, otherLayout, 'Zoom', 1, 100, 1, 'slotZoomChanged(int)', @camera.zoom * 10.0) @otherAdjustors[0].origValue = @camera.zoom # The Close button button = TQt::PushButton.new('Close', self, 'Dialog Close') connect(button, SIGNAL('clicked()'), self, SLOT('close()')) button.setDefault(true) button.setFixedSize(button.sizeHint()) buttonLayout.addWidget(button) # The Close button button = TQt::PushButton.new('Reset', self, 'Dialog Reset') connect(button, SIGNAL('clicked()'), self, SLOT('slotReset()')) button.setFixedSize(button.sizeHint()) buttonLayout.addWidget(button) # 15 layout management locLayout.activate() rotationLayout.activate() otherLayout.activate() vLayout.activate() resize(0, 0) setCaption('Camera Settings') end def addSlider(row, box, layout, label, min, max, pageStep, slot, initialValue) # Label text = TQt::Label.new(label, box) text.setMinimumSize(text.sizeHint()) layout.addWidget(text, row, 0) # Slider slider = TQt::Slider.new(min, max, pageStep, initialValue, TQt::Slider::Horizontal, box) slider.setMinimumSize(slider.sizeHint()) slider.setMinimumWidth(180) layout.addWidget(slider, row, 1) # Connection from slider signal to our slot connect(slider, SIGNAL('valueChanged(int)'), self, SLOT(slot)) # Number display num = TQt::Label.new('XXXXX', box) num.setMinimumSize(num.sizeHint()) num.setFrameStyle(TQt::Frame::Panel | TQt::Frame::Sunken) num.setAlignment(AlignRight | AlignVCenter) num.setNum(initialValue) layout.addWidget(num, row, 2) return Adjustor.new(slider, num, initialValue) end def cameraChanged World.instance.setupTranslation() unless @avoidUpdates end def slotLocXChanged(val) @locAdjustors[0].setNum(val) @camera.position.x = val cameraChanged() end def slotLocYChanged(val) @locAdjustors[1].setNum(val) @camera.position.y = val cameraChanged() end def slotLocZChanged(val) @locAdjustors[2].setNum(val) @camera.position.z = val cameraChanged() end def slotRotationXChanged(val) @rotationAdjustors[0].setNum(val) @camera.rotation.x = val cameraChanged() end def slotRotationYChanged(val) @rotationAdjustors[1].setNum(val) @camera.rotation.y = val cameraChanged() end def slotRotationZChanged(val) @rotationAdjustors[2].setNum(val) @camera.rotation.z = val cameraChanged() end def slotZoomChanged(val) @otherAdjustors[0].setNum(val) @camera.zoom = val / 10.0 cameraChanged() end def slotReset @avoidUpdates = true @camera.position.x = @locAdjustors[0].reset() @camera.position.y = @locAdjustors[1].reset() @camera.position.z = @locAdjustors[2].reset() @camera.rotation.x = @rotationAdjustors[0].reset() @camera.rotation.y = @rotationAdjustors[1].reset() @camera.rotation.z = @rotationAdjustors[2].reset() @camera.zoom = @otherAdjustors[0].reset() @avoidUpdates = false cameraChanged() end end