class Syskit::GUI::WidgetList

Constants

ListItem

Public Class Methods

new(parent = nil, auto_resize: true) click to toggle source
Calls superclass method
# File lib/syskit/gui/widget_list.rb, line 18
def initialize(parent = nil, auto_resize: true)
    super(parent)

    @main_layout = Qt::VBoxLayout.new(self)
    @widgets = Array.new
    @main_layout.size_constraint = Qt::Layout::SetMinAndMaxSize
    @auto_resize = auto_resize
    if auto_resize
        @main_layout.add_stretch(1)
    end
    @separators = Hash.new
end

Public Instance Methods

add_after(widget, after, permanent: false) click to toggle source
# File lib/syskit/gui/widget_list.rb, line 49
def add_after(widget, after, permanent: false)
    if after.respond_to?(:to_str)
        after = @separators.fetch(after)
    end

    if i = @widgets.index { |w| w.widget == after }
        @main_layout.insert_widget(i + 1, widget)
        @widgets.insert(i + 1, ListItem.new(widget, permanent))
    else Kernel.raise ArgumentError, "#{after} is not part of #{self}"
    end
end
add_before(widget, before, permanent: false) click to toggle source
# File lib/syskit/gui/widget_list.rb, line 37
def add_before(widget, before, permanent: false)
    if before.respond_to?(:to_str)
        before = @separators.fetch(before)
    end

    if i = @widgets.index { |w| w.widget == before }
        @main_layout.insert_widget(i, widget)
        @widgets.insert(i, ListItem.new(widget, permanent))
    else Kernel.raise ArgumentError, "#{before} is not part of #{self}"
    end
end
add_separator(name, label, permanent: true) click to toggle source
# File lib/syskit/gui/widget_list.rb, line 31
def add_separator(name, label, permanent: true)
    add_widget(w = Qt::Label.new(label, self), permanent: permanent)
    @separators[name] = w
    w
end
add_widget(w, permanent: false) click to toggle source
# File lib/syskit/gui/widget_list.rb, line 61
def add_widget(w, permanent: false)
    @widgets << ListItem.new(w, permanent)
    if auto_resize?
        @main_layout.insert_widget(@widgets.size - 1, w)
    else
        @main_layout.add_widget(w)
    end
end
auto_resize?() click to toggle source
# File lib/syskit/gui/widget_list.rb, line 4
def auto_resize?
    @auto_resize
end
children_size_updated() click to toggle source
# File lib/syskit/gui/widget_list.rb, line 70
def children_size_updated
    s = self.size
    new_height = @widgets.inject(0) do |h, w|
        h + if w.widget.hidden? then 0
            else w.widget.contents_height
            end
    end
    if new_height != s.height
        self.size = s
    end
end
clear_widgets(&filter) click to toggle source

Clear widgets for which the given filter returns true

It removes all widgets if no filter is given

@yieldparam [ListItem] item

# File lib/syskit/gui/widget_list.rb, line 102
def clear_widgets(&filter)
    filter ||= ->(w) { true }
    separators = @separators.values

    kept_widgets = Array.new
    while !@widgets.empty?
        w = @widgets.last
        if !separators.include?(w.widget) && !w.permanent? && filter[w.widget]
            @main_layout.remove_widget(w.widget)
            w.widget.dispose
        else
            kept_widgets.unshift w
        end
        @widgets.pop
    end
ensure
    @widgets.concat(kept_widgets)
end
each_widget() { |widget| ... } click to toggle source

Enumerate the widgets in the list

# File lib/syskit/gui/widget_list.rb, line 90
def each_widget
    return enum_for(__method__) if !block_given?
    @widgets.each do |item|
        yield(item.widget)
    end
end
resizeEvent(event) click to toggle source
# File lib/syskit/gui/widget_list.rb, line 82
def resizeEvent(event)
    s = self.size
    s.width = event.size.width
    self.size = s
    event.accept
end