Class: SKUI::Listbox

Inherits:
Control show all
Defined in:
src/SKUI/listbox.rb

Overview

Since:

  • 1.0.0

Instance Attribute Summary

Attributes inherited from Control

#rect

Attributes inherited from Base

#properties, #window

Instance Method Summary collapse

Methods inherited from Control

#enabled, #left, #name, #position, #release, #stretch, #tab_index, #tooltip, #visible, #width, #z_index

Methods inherited from Base

#background_color, #font, #foreground_color, #inspect, #parent, #release, #to_js, #typename, #ui_id

Methods included from Events

#add_event_handler, included, #release_events, #trigger_event

Constructor Details

#initialize(list = []) ⇒ Listbox

Returns a new instance of Listbox.

Parameters:

  • list (Array<String>) (defaults to: [])

Since:

  • 1.0.0



27
28
29
30
31
32
33
34
35
36
37
# File 'src/SKUI/listbox.rb', line 27

def initialize( list = [] )
  unless list.is_a?( Array )
    raise( ArgumentError, 'Not an array.' )
  end
  # (?) Check for String content? Convert to strings? Accept #to_a objects?
  super()
   # (?) Should the :items list be a Hash instead? To allow key/value pairs.
  @properties[ :items ] = list.dup
  @properties[ :multiple ] = false # Select multiple.
  @properties[ :size ] = 1 # Makes no sense!
end

Instance Method Details

#add_item(string, ...) ⇒ Integer #add_item(array) ⇒ Integer

Overloads:

  • #add_item(string, ...) ⇒ Integer

    Parameters:

    • string (String)
  • #add_item(array) ⇒ Integer

    Parameters:

    • array (Array<String>)

Returns:

  • (Integer)

Since:

  • 1.0.0



48
49
50
51
52
53
54
55
# File 'src/SKUI/listbox.rb', line 48

def add_item( *args )
  args = args[0] if args.size == 1 && args[0].is_a?( Array )
  @properties[ :items ].concat( args )
  for string in args
    window.bridge.call( 'UI.Listbox.add_item', ui_id, string )
  end
  args.length
end

#clearNil

Returns:

  • (Nil)

Since:

  • 1.0.0



59
60
61
62
63
# File 'src/SKUI/listbox.rb', line 59

def clear
  @properties[ :items ].clear
  window.bridge.call( 'UI.Listbox.clear', ui_id )
  nil
end

#insert(index, string, ...) ⇒ Integer

Parameters:

  • string (String)

Returns:

  • (Integer)

Since:

  • 1.0.0



70
71
72
73
74
75
76
77
78
79
# File 'src/SKUI/listbox.rb', line 70

def insert( index, *args )
  unless index.is_a?(Integer)
    raise( ArgumentError, 'Index must be an integer.' )
  end
  for string in args.reverse
    @properties[ :items ].insert( index, string )
    window.bridge.call( 'UI.Listbox.add_item', ui_id, string, index )
  end
  args.length
end

#itemsArray<String>

Returns:

  • (Array<String>)

Since:

  • 1.0.0



11
# File 'src/SKUI/listbox.rb', line 11

prop_reader( :items )

#move_selected_downBoolean

Returns:

  • (Boolean)

Since:

  • 1.0.0



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'src/SKUI/listbox.rb', line 102

def move_selected_down
  return false if items.empty?
  cache_value = self.value
  return false unless cache_value
  values = cache_value.is_a?( Array ) ? cache_value : [cache_value]
  values.sort! { |a, b| items.index(a) <=> items.index(b) }
  values.reverse!
  values.each { |value|
    index = items.index( value )
    return false if index >= items.length - 1
    new_index = index + 2
    insert( new_index, value )
    remove_item( index )
  }
  self.value = cache_value
  true
end

#move_selected_upBoolean

Returns:

  • (Boolean)

Since:

  • 1.0.0



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'src/SKUI/listbox.rb', line 83

def move_selected_up
  return false if items.empty?
  cache_value = self.value
  return false unless cache_value
  values = cache_value.is_a?( Array ) ? cache_value : [cache_value]
  values.sort! { |a, b| items.index(a) <=> items.index(b) }
  values.each { |value|
    index = items.index( value )
    return false if index == 0
    new_index = index - 1
    remove_item( index )
    insert( new_index, value )
  }
  self.value = cache_value
  true
end

#multipleBoolean

Returns:

  • (Boolean)

Since:

  • 1.0.0



15
# File 'src/SKUI/listbox.rb', line 15

prop_reader_bool( :multiple, &TypeCheck::BOOLEAN )

#multiple=(value) ⇒ Boolean

Parameters:

  • value (Boolean)

Returns:

  • (Boolean)

Since:

  • 1.0.0



124
125
126
127
128
129
130
131
132
133
# File 'src/SKUI/listbox.rb', line 124

def multiple=( value )
  value = TypeCheck::BOOLEAN.call( value )
  if value && self.size < 2
    raise( ArgumentError,
      'Can only select multiple when size is greater than 1.' )
  end
  @properties[ :multiple ] = value
  update_properties( :multiple )
  value
end

#remove_item(string) ⇒ Nil #remove_item(index) ⇒ Nil

Overloads:

  • #remove_item(string) ⇒ Nil

    Parameters:

    • string (String)
  • #remove_item(index) ⇒ Nil

    Parameters:

    • index (Integer)

Returns:

  • (Nil)

Since:

  • 1.0.0



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# File 'src/SKUI/listbox.rb', line 143

def remove_item( arg )
  if arg.is_a?( String )
    index = @properties[ :items ].index( arg )
    unless index
      raise( ArgumentError, 'Invalid item.' )
    end
  elsif arg.is_a?( Integer )
    index = arg
  else
    raise( ArgumentError, 'Invalid argument.' )
  end
  if index < 0 || index >= @properties[ :items ].length
    raise( ArgumentError, 'Index out of range.' )
  end
  @properties[ :items ].delete_at( index )
  window.bridge.call( 'UI.Listbox.remove_item', ui_id, index )
  nil
end

#rename(index, value) ⇒ Boolean

Parameters:

  • index (Integer)
  • value (String)

Returns:

  • (Boolean)

Since:

  • 1.0.0



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'src/SKUI/listbox.rb', line 167

def rename( index, value )
  unless index.is_a?(Integer)
    raise( ArgumentError, 'Index must be an integer.' )
  end
  unless value.is_a?(String)
    raise( ArgumentError, 'Value must be a string.' )
  end
  puts "rename"
  if index > 0 && index < @properties[ :items ].size
    @properties[ :items ][ index ] = value
    window.bridge.call( 'UI.Listbox.rename', ui_id, index, value )
    true
  else
    false
  end
end

#sizeInteger

Returns:

  • (Integer)

Since:

  • 1.0.0



19
# File 'src/SKUI/listbox.rb', line 19

prop( :size, &TypeCheck::INTEGER )

#size=(value) ⇒ Integer

Parameters:

  • value (Integer)

Returns:

  • (Integer)

Since:

  • 1.0.0



188
189
190
191
192
193
194
195
196
197
198
199
# File 'src/SKUI/listbox.rb', line 188

def size=( value )
  value = TypeCheck::INTEGER.call( value )
  if value < 2
    @properties[ :size ] = value
    @properties[ :multiple ] = false
    update_properties( :size, :multiple )
  else
    @properties[ :size ] = value
    update_properties( :size )
  end
  value
end

#valueString

Returns:

  • (String)

Since:

  • 1.0.0



203
204
205
206
207
# File 'src/SKUI/listbox.rb', line 203

def value
  data = window.bridge.get_value( "##{ui_id} select" )
  @properties[ :value ] = data
  data
end

#value=(string) ⇒ String #value=(string, ...) ⇒ Array<String> #value=(strings) ⇒ Array<String>

Overloads:

  • #value=(string) ⇒ String

    Parameters:

    • string (String)

    Returns:

    • (String)
  • #value=(string, ...) ⇒ Array<String>

    Parameters:

    • string (String)

    Returns:

    • (Array<String>)
  • #value=(strings) ⇒ Array<String>

    Parameters:

    • strings (Array<String>)

    Returns:

    • (Array<String>)

Since:

  • 1.0.0



221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
# File 'src/SKUI/listbox.rb', line 221

def value=( *args )
  if args.size == 1 && args[0].is_a?( Array )
    #return self.value=( *args[0] )
    return send( :value=, *args[0] )
  end

  unless args.all? { |item| item.is_a?( String ) }
    raise( ArgumentError, 'Arguments must be strings.' )
  end

  if !self.multiple? && args.size > 1
    raise( ArgumentError, 'Not configured to select multiple items.' )
  end

  items = @properties[ :items ]
  unless (items | args).length == items.length
    not_in_list = (args - items).join(', ')
    raise( ArgumentError, "'#{not_in_list}' not valid values in list." )
  end

  @properties[ :value ] = args.dup
  update_properties( :value )
  args
end