Method: CDK::SCALE#initialize

Defined in:
lib/cdk/scale.rb

#initialize(cdkscreen, xplace, yplace, title, label, field_attr, field_width, start, low, high, inc, fast_inc, box, shadow) ⇒ SCALE

Returns a new instance of SCALE.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/cdk/scale.rb', line 5

def initialize(cdkscreen, xplace, yplace, title, label, field_attr,
    field_width, start, low, high, inc, fast_inc, box, shadow)
  super()
  parent_width = cdkscreen.window.getmaxx
  parent_height = cdkscreen.window.getmaxy
  bindings = {
      'u'           => Ncurses::KEY_UP,
      'U'           => Ncurses::KEY_PPAGE,
      CDK::BACKCHAR => Ncurses::KEY_PPAGE,
      CDK::FORCHAR  => Ncurses::KEY_NPAGE,
      'g'           => Ncurses::KEY_HOME,
      '^'           => Ncurses::KEY_HOME,
      'G'           => Ncurses::KEY_END,
      '$'           => Ncurses::KEY_END,
  }

  self.setBox(box)

  box_height = @border_size * 2 + 1
  box_width = field_width + 2 * @border_size

  # Set some basic values of the widget's data field.
  @label = []
  @label_len = 0
  @label_win = nil

  # If the field_width is a negative value, the field_width will
  # be COLS-field_width, otherwise the field_width will be the
  # given width.
  field_width = CDK.setWidgetDimension(parent_width, field_width, 0)
  box_width = field_width + 2 * @border_size

  # Translate the label string to a chtype array
  unless label.nil?
    label_len = []
    @label = CDK.char2Chtype(label, label_len, [])
    @label_len = label_len[0]
    box_width = @label_len + field_width + 2
  end

  old_width = box_width
  box_width = self.setTitle(title, box_width)
  horizontal_adjust = (box_width - old_width) / 2

  box_height += @title_lines

  # Make sure we didn't extend beyond the dimensions of the window.
  box_width = [box_width, parent_width].min
  box_height = [box_height, parent_height].min
  field_width = [field_width,
      box_width - @label_len - 2 * @border_size].min

  # Rejustify the x and y positions if we need to.
  xtmp = [xplace]
  ytmp = [yplace]
  CDK.alignxy(cdkscreen.window, xtmp, ytmp, box_width, box_height)
  xpos = xtmp[0]
  ypos = ytmp[0]

  # Make the widget's window.
  @win = Ncurses::WINDOW.new(box_height, box_width, ypos, xpos)

  # Is the main window nil?
  if @win.nil?
    self.destroy
    return nil
  end

  # Create the widget's label window.
  if @label.size > 0
    @label_win = @win.subwin(1, @label_len,
        ypos + @title_lines + @border_size,
        xpos + horizontal_adjust + @border_size)
    if @label_win.nil?
      self.destroy
      return nil
    end
  end

  # Create the widget's data field window.
  @field_win = @win.subwin(1, field_width,
      ypos + @title_lines + @border_size,
      xpos + @label_len + horizontal_adjust + @border_size)

  if @field_win.nil?
    self.destroy
    return nil
  end
  @field_win.keypad(true)
  @win.keypad(true)

  # Create the widget's data field.
  @screen = cdkscreen
  @parent = cdkscreen.window
  @shadow_win = nil
  @box_width = box_width
  @box_height = box_height
  @field_width = field_width
  @field_attr = field_attr
  @current = low
  @low = low
  @high = high
  @current = start
  @inc = inc
  @fastinc = fast_inc
  @accepts_focus = true
  @input_window = @win
  @shadow = shadow
  @field_edit = 0

  # Do we want a shadow?
  if shadow
    @shadow_win = Ncurses::WINDOW.new(box_height, box_width,
        ypos + 1, xpos + 1)
    if @shadow_win.nil?
      self.destroy
      return nil
    end
  end

  # Setup the key bindings.
  bindings.each do |from, to|
    self.bind(self.object_type, from, :getc, to)
  end

  cdkscreen.register(self.object_type, self)
end