Module: Cosmos::Widget

Overview

The Widget module must be included by all widget classes used to display telemetry by COSMOS. It provides methods to process settings applied in Telemetry Viewer screen definitions as well as adding a context menu for all widgets which take a value.

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#itemObject (readonly)

Returns the value of attribute item.



32
33
34
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 32

def item
  @item
end

#item_nameObject (readonly)

Returns the value of attribute item_name.



31
32
33
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 31

def item_name
  @item_name
end

#limits_setObject

Returns the value of attribute limits_set.



34
35
36
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 34

def limits_set
  @limits_set
end

#limits_stateObject

Returns the value of attribute limits_state.



24
25
26
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 24

def limits_state
  @limits_state
end

#packetObject (readonly)

Returns the value of attribute packet.



33
34
35
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 33

def packet
  @packet
end

#packet_nameObject (readonly)

Returns the value of attribute packet_name.



30
31
32
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 30

def packet_name
  @packet_name
end

#polling_periodObject

Returns the value of attribute polling_period.



26
27
28
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 26

def polling_period
  @polling_period
end

#screenObject

Returns the value of attribute screen.



27
28
29
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 27

def screen
  @screen
end

#settingsObject

Returns the value of attribute settings.



25
26
27
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 25

def settings
  @settings
end

#target_nameObject (readonly)

Returns the value of attribute target_name.



29
30
31
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 29

def target_name
  @target_name
end

#valueObject

Returns the value of attribute value.



35
36
37
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 35

def value
  @value
end

#value_typeObject

Returns the value of attribute value_type.



23
24
25
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 23

def value_type
  @value_type
end

Class Method Details

.included(base) ⇒ Object



88
89
90
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 88

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#context_menuObject



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 215

def context_menu
  menu = Qt::Menu.new
  details = Qt::Action.new("Details #{@target_name} #{@packet_name} #{@item_name}", menu)
  details.connect(SIGNAL('triggered()')) do
    if @target_name and @packet_name and @item_name
      if @packet_name.upcase == Telemetry::LATEST_PACKET_NAME
        packets = System.telemetry.latest_packets(@target_name, @item_name)
        offset = 0
        packets.each do |packet|
          dialog = TlmDetailsDialog.new(nil, @target_name, packet.packet_name, @item_name)
          dialog.move(dialog.x + offset, dialog.y + offset)
          @dialogs << dialog
          offset += 30
        end
      else
        @dialogs << TlmDetailsDialog.new(nil, @target_name, @packet_name, @item_name)
      end
    end
  end
  menu.addAction(details)

  edit = Qt::Action.new("Edit #{@target_name} #{@packet_name} #{@item_name}", menu)
  edit.connect(SIGNAL('triggered()')) do
    if @packet_name.upcase != Telemetry::LATEST_PACKET_NAME
      @dialogs << TlmEditDialog.new(self.window, @target_name, @packet_name, @item_name)
    end
  end
  menu.addAction(edit)

  graph = Qt::Action.new("Graph #{@target_name} #{@packet_name} #{@item_name}", menu)
  graph.connect(SIGNAL('triggered()')) do
    TlmGraphDialog.new(self, target_name, packet_name, item_name, @screen.replay_flag.visible)
  end
  menu.addAction(graph)

  point = Qt::Point.new(0,0)
  menu.exec(mapToGlobal(point))
  point.dispose
  menu.dispose
end

#get_image(image_name) ⇒ Object

Requires the @screen to be set so must not be called in initialize()



257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 257

def get_image(image_name)
  return nil unless @screen
  target_screen_dir = File.join(::Cosmos::USERPATH, 'config', 'targets', @screen.original_target_name.upcase, 'screens')

  if File.exist?(File.join(target_screen_dir, image_name))
    return Qt::Image.new(File.join(target_screen_dir, image_name))
  elsif Cosmos.data_path(image_name)
    return Qt::Image.new(Cosmos.data_path(image_name))
  else
    raise "Can't find the file #{image_name} in #{target_screen_dir} or the cosmos data directory."
  end
end

#get_tooltip_textObject



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 116

def get_tooltip_text
  tooltip_text = ''
  if @item
    if @item.limits.values
      limits = @item.limits.values[@limits_set]
      limits = @item.limits.values[:DEFAULT] unless limits
      if limits
        red_low = limits[0]
        yellow_low = limits[1]
        yellow_high = limits[2]
        red_high = limits[3]
        green_low = limits[4]
        green_high = limits[5]
        if green_low and green_high
          tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}\nRed High Limit = #{red_high}\nYellow High Limit = #{yellow_high}\nGreen High Limit = #{green_high}\nGreen Low Limit = #{green_low}\nYellow Low Limit = #{yellow_low}\nRed Low Limit = #{red_low}"
        else
          tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}\nRed High Limit = #{red_high}\nYellow High Limit = #{yellow_high}\nYellow Low Limit = #{yellow_low}\nRed Low Limit = #{red_low}"
        end
      else
        tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}"
      end
    else
      tooltip_text = "#{@target_name} #{@packet_name} #{@item_name}\n#{@item.description}"
    end
  end
  return tooltip_text
end

#initialize(target_name = nil, packet_name = nil, item_name = nil, value_type = :CONVERTED, *args) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 37

def initialize(target_name = nil, packet_name = nil, item_name = nil, value_type = :CONVERTED, *args)
  super(*args)
  @target_name = ConfigParser.handle_nil(target_name)
  @packet_name = ConfigParser.handle_nil(packet_name)
  @item_name = ConfigParser.handle_nil(item_name)
  @item = nil
  if @item_name
    if @target_name == 'LOCAL' and @packet_name == 'LOCAL'
      @packet = nil
      @item = nil
    else
      @packet, @item = System.telemetry.packet_and_item(@target_name, @packet_name, @item_name)
    end
  end
  if value_type
    @value_type = value_type.to_s.upcase.to_sym
    Kernel::raise "Unknown value type #{@value_type} given to #{self.class}" unless [:RAW, :CONVERTED, :FORMATTED, :WITH_UNITS].include?(@value_type)
  else
    raise "Nil value type given to #{self.class}" if @item_name
    @value_type = nil
  end
  @value = nil
  @limits_state = nil
  @limits_set = :DEFAULT
  @settings = {'RAW'=>['']}
  @polling_period = nil
  @screen = nil
  @dialogs = []

  if self.is_a? Qt::Widget
    setToolTip(get_tooltip_text())
  end

  if self.class.takes_value? and self.kind_of?(Qt::Widget)
    setContextMenuPolicy(Qt::CustomContextMenu)
    connect(SIGNAL('customContextMenuRequested(const QPoint&)')) do
      context_menu()
    end
  end
end

#process_settingsObject



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 156

def process_settings
  sheet = []
  @settings.each do |setting_name, setting_values|
    case setting_name
    when 'TEXTALIGN'
      sheet << "qproperty-alignment:Align#{setting_values[0].capitalize}"
    when 'PADDING'
      sheet << "padding:#{setting_values[0]}"
    when 'MARGIN'
      sheet << "margin:#{setting_values[0]}"
    when 'BACKCOLOR'
      case setting_values.size
      when 1 # color name
        sheet << "background-color:#{setting_values[0]}"
      when 3 # RGB values
        sheet << "background-color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
      end
    when 'TEXTCOLOR'
      case setting_values.size
      when 1 # color name
        sheet << "color:#{setting_values[0]}"
      when 3 # RGB values
        sheet << "color:rgb(#{setting_values[0].to_i},#{setting_values[1].to_i},#{setting_values[2].to_i})"
      end
    when 'BORDERCOLOR'
      # Setting the color requires a defined width and style
      sheet << "border-width:1px"
      sheet << "border-style:solid"
      case setting_values.size
      when 1 # color name
        sheet << "border-color:#{setting_values[0]}"
      when 3 # RGB values
        sheet << "border-color:rgb(#{setting_values[0].to_i}, #{setting_values[1].to_i}, #{setting_values[2].to_i})"
      end
    when 'WIDTH'
      sheet << "min-width:#{setting_values[0].to_i}px"
      sheet << "max-width:#{setting_values[0].to_i}px"
    when 'HEIGHT'
      sheet << "min-height:#{setting_values[0].to_i}px"
      sheet << "max-height:#{setting_values[0].to_i}px"
    when 'RAW'
      next if setting_values[0] == '' # ignore the blank default
      sheet << setting_values[0]
    end
  end
  # Only apply the stylesheet if we have settings to apply and this is a widget (not a layout)
  unless sheet.empty?
    if self.is_a? Qt::Widget
      # Set the object name so we can uniquely assign the stylesheet to it
      setObjectName(self.object_id.to_s)
      setStyleSheet("QWidget##{self.objectName} { #{sheet.join(';')} }")
    elsif parentWidget
      pw = parentWidget
      pw.setObjectName(pw.object_id.to_s)
      pw.setStyleSheet("QWidget##{pw.objectName} { #{sheet.join(';')} }")
    end
  end
end

#set_setting(setting_name, setting_values) ⇒ Object



144
145
146
147
148
149
150
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 144

def set_setting(setting_name, setting_values)
  if setting_name.upcase == 'RAW'
    @settings['RAW'] = [@settings['RAW'][0] + setting_values[0]]
  else
    @settings[setting_name.to_s.upcase] = setting_values
  end
end

#set_subsetting(widget_index, setting_name, setting_values) ⇒ Object



152
153
154
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 152

def set_subsetting(widget_index, setting_name, setting_values)
  # Only Multi-Widgets have subsettings - Ignore
end

#shutdownObject



92
93
94
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 92

def shutdown
  # Normally do nothing
end

#update_widgetObject

This is called for widgets without values in case they need some form of periodic update



98
99
100
# File 'lib/cosmos/tools/tlm_viewer/widgets/widget.rb', line 98

def update_widget
  # Normally do nothing
end