class Rgw::PropertyEditor

Attributes

selectedElement[R]

Public Class Methods

new(props, type) click to toggle source
Calls superclass method
# File lib/rgw/property-editor.rb, line 32
def initialize props, type
    super(:orientation => :vertical)
    @widgetDefaults = []
    @selectedElement = nil
    table = create_prop_editor props, type
    pack_start table, :expand => false, :fill => false, :padding => 4
end

Public Instance Methods

create_prop_editor(props, type=nil) click to toggle source
# File lib/rgw/property-editor.rb, line 43
def create_prop_editor props, type=nil
    table = Gtk::Table.new props.length() + 1, 2
    table.column_spacings = 8
    table.row_spacings = 4

    unless type.nil?
        headline = Gtk::Label.new
        headline.markup = '<b><big>' + type + '</big></b>'
        headline.xalign = 0.1
        table.attach headline, 0, 2, 0, 1, Gtk::AttachOptions::EXPAND | Gtk::AttachOptions::FILL,
                                       Gtk::AttachOptions::EXPAND | Gtk::AttachOptions::FILL
    end

    0.upto(props.length()-1) { |a| create_prop_entry props[a], table, a + 1}
    table.show_all
    table
end
create_prop_entry(data, table, row) click to toggle source
# File lib/rgw/property-editor.rb, line 62
        def create_prop_entry data, table, row
            label = Gtk::Label.new
            label.xalign = 1.0
            widget = nil

            case data[:type]
            when :iRadio
                label.text = data[:label]
                hbox = Gtk::Box.new :horizontal

                i = 0
                while true do
                    sym = ('img' + i.to_s).to_sym
                    break if data[sym].nil?
                    i += 1
                end

                group = nil
                0.upto(i-1) do |n|
                    if n == 0
                        button = Gtk::RadioButton.new
                        group = button
                    else
                        button = Gtk::RadioButton.new group
                    end
                    hbox.pack_start button, :expand => false, :fill => false, :padding => 2
                    button.draw_indicator = false
                    sym = ('img' + n.to_s).to_sym
#                    img = Gtk::Image.new(:file => Rgw::PIXMAP_PATH + data[sym] + '.png')
                    button.image = img
                    button.signal_connect(:toggled) do |widget|
                        0.upto(widget.group.length() - 1) do |m|
                            if widget.group[m].active?
                                signal_emit :property_changed, data[:id0], widget.group.length() - 1 - m
                                break
                            end
                        end
                    end
                end
                group.group[i - 1 - data[:default0]].active = true
                @widgetDefaults << [group, data]
                hbox.show_all
                widget = hbox
            when :sSpin
                label.text = data[:label]
                widget = Rgw::SyncedSpinButton.new data[:range].first, data[:range].last, data[:step], data[:synced]
                @widgetDefaults << [widget, data]
                widget.set_values data[:default0], data[:default1]
                widget.signal_connect(:value1_changed) {|wid, val| signal_emit :property_changed, data[:id0], val}
                widget.signal_connect(:value2_changed) {|wid, val| signal_emit :property_changed, data[:id1], val}
            when :spin
                label.text = data[:label]
                widget = Gtk::SpinButton.new data[:range].first, data[:range].last, data[:step]
                widget.value = data[:default0]
                @widgetDefaults << [widget, data]
                widget.signal_connect(:value_changed) do |wid|
                    signal_emit :property_changed, data[:id0], wid.value
                end
            when :toggle
                label.text = data[:label].split[0..-2].join(' ')
                widget = Gtk::ToggleButton.new data[:label].split[-1]
                widget.active = data[:default0]
                @widgetDefaults << [widget, data]
                widget.signal_connect(:toggled) do |wid|
                    signal_emit :property_changed, data[:id0], wid.active?
                end
            when :entry
                label.text = data[:label]
                widget = Gtk::Entry.new
                widget.text = data[:default0]
                @widgetDefaults << [widget, data]
                widget.signal_connect(:changed) do |wid|
                    signal_emit :property_changed, data[:id0], wid.text
                end
            when :color
                label.text = data[:label]
                # fix for ruby gtk 2.2.0
                col = data[:default0].map{|c| c * 0xffff}.take(3)
                color = Gdk::Color.new *col
                #color = Gdk::RGBA.new(*data[:default0])
                widget = Gtk::ColorButton.new color
                widget.use_alpha = true
                @widgetDefaults << [widget, data]
                widget.signal_connect(:color_set) do |wid|
                    cl = wid.rgba
                    signal_emit :property_changed, data[:id0], [cl.red, cl.green, cl.blue, cl.alpha]
                end
            when :combo
                label.text = data[:label]
                widget = Gtk::ComboBoxText.new
                data[:entries].each {|entry| widget.append nil, entry}
                @widgetDefaults << [widget, data]
                widget.signal_connect(:changed) do |wid|
                    signal_emit :property_changed, data[:id0], wid.active
                end
            when :label
                widget = Gtk::Label.new
                widget.set_xalign 0.0
                @widgetDefaults << [widget, data]
                table.attach widget, 0, 2, row, row+1, nil, nil, 6, 0
                return
            when :radioRevealer
                rbox = Gtk::Box.new :vertical
                table.attach_defaults rbox, 0, 2, row, row+1
                rbox.pack_start Gtk::Separator.new(:horizontal), :expand => :false, :fill => :false
                label.set_xalign(0.5)
                label.markup = '<span size="large" weight="bold">' + data[:label] + '</span>'
                rbox.pack_start label, :expand => :false, :fill => :false
                widget = Rgw::RadioRevealer.new
                rbox.pack_start widget, :expand => :false, :fill => :false
                @widgetDefaults << [widget, data]
                data[:revealSections].each do |section|
                    revealerChild = create_prop_editor section[:data]
                    label = Gtk::Label.new
                    label.markup = '<span size="medium" weight="bold">' + section[:section] + '</span>'
                    widget.create_entry label, revealerChild
                    widget.signal_connect(:revealed) do |wid, idx|
                        signal_emit :property_changed, data[:id0], idx
                    end
                end
                return
            else
                raise RuntimeError, 'invalid property type'
            end
            table.attach_defaults label, 0, 1, row, row+1
            table.attach_defaults widget, 1, 2, row, row+1
        end
set_defaults() click to toggle source
# File lib/rgw/property-editor.rb, line 226
def set_defaults
    @widgetDefaults.each do |data|
        # set from defaults
        if data[1][:useDefault]
            if data[1][:type] == :iRadio
                # the buttons in a radio button group are orderd reverse. strange...
                data[0].group[data[0].group.length() - 1 - data[1][:default0]].active = true
            elsif data[1][:type] == :toggle
                data[0].active = data[1][:default0]
            elsif data[1][:type] == :spin
                data[0].value = data[1][:default0]
            elsif data[1][:type] == :sSpin
                data[0].set_values data[1][:default0], data[1][:default1]
            elsif data[1][:type] == :entry
                data[0].text = data[1][:default0]
            elsif data[1][:type] == :color
                col = Gdk::RGBA.new(*data[1][:default0])
                data[0].rgba = col
            elsif data[1][:type] == :combo
                data[0].active = data[1][:default0]
            elsif data[1][:type] == :label
                data[0].markup = data[1][:default0]
            elsif data[1][:type] == :radioRevealer
                data[0].active = data[1][:default0]
            else
                raise RuntimeError, 'invalid type in set_defaults useDefault'
           end
        # move from the widget into the data store
        else
            if data[1][:type] == :iRadio
                nb = data[0].group.length
                0.upto(nb - 1) do |i|
                    if data[0].group[i].active?
                        signal_emit :property_changed, data[1][:id0], nb - 1 - i
                        break
                    end
                end
            elsif data[1][:type] == :toggle
                f = data[0].active? ? 1.0 : 0.0
                signal_emit :property_changed, data[1][:id0], f
            elsif data[1][:type] == :spin
                signal_emit :property_changed, data[1][:id0], data[0].value
            elsif data[1][:type] == :sSpin
                s1, s2 = *data[0].get_values
                signal_emit :property_changed, data[1][:id0], s1 if s1 >= 0.0
                signal_emit :property_changed, data[1][:id1], s2 if s2 >= 0.0
            elsif data[1][:type] == :entry
                signal_emit :property_changed, data[1][:id0], data[0].text
            elsif data[1][:type] == :color
                cl = data[0].rgba
                signal_emit :property_changed, data[1][:id0], [cl.red, cl.green, cl.blue, cl.alpha]
            elsif data[1][:type] == :combo
                signal_emit :property_changed, data[1][:id0], data[0].active
            elsif data[1][:type] == :label
                # do nothing, because a label doesn't generate events
            elsif data[1][:type] == :radioRevealer
                signal_emit :property_changed, data[1][:id0], data[0].active
            else
                raise RuntimeError, 'invalid type in set_defaults !useDefault'
           end
        end
    end
end
set_from_data() click to toggle source
# File lib/rgw/property-editor.rb, line 196
def set_from_data
    @widgetDefaults.each do |data|
        val1 = @selectedElement.get_by_name data[1][:id0]
        if data[1][:type] == :iRadio
            data[0].group[data[0].group.length() - 1 - val1].active = true
        elsif data[1][:type] == :toggle
            data[0].active = val1
        elsif data[1][:type] == :spin
            data[0].value = val1
        elsif data[1][:type] == :sSpin
            val2 = @selectedElement.get_by_name data[1][:id1]
            data[0].set_values val1, val2
        elsif data[1][:type] == :entry
            data[0].text = val1
        elsif data[1][:type] == :color
            col = Gdk::RGBA.new *val1
            data[0].rgba = col
        elsif data[1][:type] == :combo
            data[0].active = val1
        elsif data[1][:type] == :label
            data[0].markup = val1
        elsif data[1][:type] == :radioRevealer
            data[0].active = val1
        else
            raise RuntimeError, 'invalid type in set_from_data'
       end
    end
end
set_selected_element(element) click to toggle source
# File lib/rgw/property-editor.rb, line 191
def set_selected_element element
    @selectedElement = element
end
signal_do_property_changed(foo, bla;) click to toggle source
# File lib/rgw/property-editor.rb, line 30
def signal_do_property_changed foo, bla; end