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