Class: Syskit::GUI::WidgetList

Inherits:
Qt::Widget
  • Object
show all
Defined in:
lib/syskit/gui/widget_list.rb

Direct Known Subclasses

BatchManager, ExpandedJobStatus

Defined Under Namespace

Classes: ListItem

Instance Method Summary collapse

Constructor Details

#initialize(parent = nil, auto_resize: true) ⇒ WidgetList

Returns a new instance of WidgetList



18
19
20
21
22
23
24
25
26
27
28
29
# 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

Instance Method Details

#add_after(widget, after, permanent: false) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# 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) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# 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) ⇒ Object



31
32
33
34
35
# 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) ⇒ Object



61
62
63
64
65
66
67
68
# 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?Boolean

Returns:

  • (Boolean)


4
5
6
# File 'lib/syskit/gui/widget_list.rb', line 4

def auto_resize?
    @auto_resize
end

#children_size_updatedObject



70
71
72
73
74
75
76
77
78
79
80
# 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 {|item| ... } ⇒ Object

Clear widgets for which the given filter returns true

It removes all widgets if no filter is given

Yield Parameters:



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# 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_widgetObject

Enumerate the widgets in the list



90
91
92
93
94
95
# 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) ⇒ Object



82
83
84
85
86
87
# 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