class ContainerWidget

Attributes

config[R]
content_widget[R]
label_text[R]
position[R]

Public Class Methods

new(pos, config=nil, parent = nil) click to toggle source
Calls superclass method
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 262
def initialize(pos, config=nil, parent = nil)
    super(parent)
    @config = config
    #set_size_policy(Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding)
    set_size_policy(Qt::SizePolicy::MinimumExpanding, Qt::SizePolicy::MinimumExpanding)
    @position = pos
    
    @listener = nil
    
    @disconnected = true
    
    @default_label_text = "#{@position}: No input"
    @label_text = @default_label_text
    
    # Vertical Layout containing label bar and container widget
    @layout = Qt::VBoxLayout.new(self)
    
    # Horizontal layout for the label bar
    @label_layout = Qt::HBoxLayout.new(self)
    
    @label = Qt::Label.new(label_text)
    @label.set_size_policy(Qt::SizePolicy::Preferred, Qt::SizePolicy::Maximum)
    @label.set_auto_fill_background(true)
    
    @disconnect_button = Qt::PushButton.new("X")
    @disconnect_button.set_minimum_width(20)
    @disconnect_button.set_maximum_width(20)
    @disconnect_button.set_size_policy(Qt::SizePolicy::Maximum, Qt::SizePolicy::Fixed)
    @disconnect_button.setEnabled(false)
    
    @label_layout.add_widget(@label)
    @label_layout.add_widget(@disconnect_button)
    
    @layout.add_layout(@label_layout)
    
    
    set_accept_drops(true)

    set_content_widget(content_widget) if content_widget
    
    @disconnect_button.connect(SIGNAL :clicked) do
        if @disconnected
            connect
        else
            disconnect
        end
    end
    
    # Define label palettes
    @standard_palette = Qt::Palette.new
    @label.set_palette(@standard_palette)
    
    @unreachable_palette = Qt::Palette.new
    @unreachable_palette.set_color(Qt::Palette::Window, Qt::Color.new(223, 49, 49)); # red

    self
end

Public Instance Methods

configure(task, port, widget, policy = Hash.new) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 320
def configure(task, port, widget, policy = Hash.new)
    @config = CompoundDisplayConfig.new(task, port, widget, policy)
end
configure_by_obj(config) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 324
def configure_by_obj(config)
    @config = config
end
connect() click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 328
def connect
    if @config.invalid?
        Vizkit.error "Invalid configuration for position #{@position}: #{@config}"
        return
    end
    
    disconnect

    puts "Trying to connect #{@config.task}.#{@config.port} to #{@config.widget} ..."
    widget = Vizkit.default_loader.create_plugin(@config.widget)
    set_content_widget(widget)

    task = Orocos::Async.proxy(@config.task)
    port = task.port(@config.port)
    
    port.on_reachable do
        Vizkit.warn "#{task.name}.#{port.name} is reachable"
        begin
            @listener = port.connect_to(widget) if task && port
            puts "#{task.name}.#{port.name} connected."
            @label.set_palette(@standard_palette)
            @label.set_tool_tip("")
        rescue Exception => e
            puts "Connection of #{@config.task}.#{@config.port} to #{@config.widget} failed!"
            Kernel.raise e
            @disconnected = false
            disconnect
            return
        end
    end
    port.on_unreachable do
        Vizkit.warn "#{task.name}.#{port.name} is unreachable."
        
        @label.set_palette(@unreachable_palette)
        @label.set_tool_tip("Port is unreachable.")
    end
    
    set_label_text("#{@config.task}.#{@config.port}")
    
    @disconnected = false
    @disconnect_button.setEnabled(true)
end
disconnect() click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 371
def disconnect
    return if @disconnected
    
    @listener.stop if @listener
    @listener = nil
    
    # Destroy old widget if any
    if @content_widget
        @layout.remove_widget(@content_widget)
        @content_widget.set_parent(nil)
        @content_widget = nil
    end

    set_label_text(@default_label_text)
    
    @disconnected = true
end
dragEnterEvent(event) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 431
def dragEnterEvent(event)
    event.accept_proposed_action
    if event.mime_data.has_format("text/plain")
        event.accept_proposed_action
    else
        msg_box = Qt::MessageBox.new
        msg_box.set_text("Bad format!")
        msg_box.set_standard_buttons(Qt::MessageBox::Ok)
        msg_box.set_informative_text("The only supported format is text/plain. Submit a valid Orocos URI.")
        event.ignore
    end
    nil
end
dropEvent(event) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 445
def dropEvent(event)
    text = event.mime_data.text
    unless text
        Vizkit.warn "No text dropped"
        return
    end
    
    begin
        msg_box = Qt::MessageBox.new
        msg_box.set_text("Bad drop text!")
        msg_box.set_standard_buttons(Qt::MessageBox::Ok)

        uri = URI.parse(text)

        unless uri.is_a? URI::Orocos
            msg_box.set_informative_text("Not a valid Orocos URI: '#{text}'")
            msg_box.exec
            return
        end
        
        # Display context menu at drop point to choose from available display widgets
        widget_name = widget_selection(map_to_global(event.pos), uri.port_proxy.type_name)
        return unless widget_name
        
        configure(uri.task_name, uri.port_name, widget_name)
        connect

        event.accept_proposed_action
    rescue ArgumentError => e
        msg_box.set_informative_text("Received an ArgumentError while parsing URI '#{text}'")
        msg_box.set_detailed_text("Error message: #{e.message}")
        msg_box.exec
    rescue URI::InvalidURIError => e
        msg_box.set_informative_text("Invalid URI: '#{text}'")
        msg_box.set_detailed_text("Error message: #{e.message}")
        msg_box.exec
    end
    
    nil
end
set_content_widget(widget) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 389
def set_content_widget(widget)
    disconnect
    @content_widget = widget
    @layout.add_widget(widget)
    widget.show
end
set_label_text(text) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 396
def set_label_text(text)
    @label.set_text(text)
    @label_text = text
end
set_position(pos) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 401
def set_position(pos)
    @position = pos
end
sizeHint() click to toggle source

reimplemented methods

# File lib/vizkit/widgets/compound_display/compound_display.rb, line 422
def sizeHint
    #if @content_widget
    #    @content_widget.size_hint
    #else
    #    Qt::Size.new(100, 100)
    #end
    Qt::Size.new(100, 100)
end
widget_selection(pos, type_name) click to toggle source
# File lib/vizkit/widgets/compound_display/compound_display.rb, line 405
def widget_selection(pos, type_name)
    menu = Qt::Menu.new(self)

    # Determine applicable widgets for the output port
    widgets = Vizkit.default_loader.find_all_plugin_names(:argument=>type_name, :callback_type => :display,:flags => {:deprecated => false})

    widgets.uniq!
    widgets.each do |w|
        menu.add_action(Qt::Action.new(w, parent))
    end
    # Display context menu at cursor position.
    action = menu.exec(pos)
    action.text if action
end