Class: Minder::MessageFrame

Inherits:
Frame
  • Object
show all
Defined in:
lib/minder/cli/message_frame.rb

Instance Attribute Summary collapse

Attributes inherited from Frame

#height, #left, #lines, #min_height, #pomodoro_runner, #task_manager, #top, #width, #window

Instance Method Summary collapse

Methods inherited from Frame

#build_window, #erase, #focus, #focused?, #handle_non_char_keypress, #has_cursor?, #hidden?, #hide, #listen, #move, #parse_template, #print_line, #refresh, #resize, #set_text, #unfocus, #unhide, #window_refresh

Constructor Details

#initializeMessageFrame

Returns a new instance of MessageFrame.



9
10
11
12
13
14
# File 'lib/minder/cli/message_frame.rb', line 9

def initialize(*)
  super
  self.height = desired_height
  @minimized = false
  @editing = false
end

Instance Attribute Details

#current_lineObject (readonly)

Returns the value of attribute current_line.



6
7
8
# File 'lib/minder/cli/message_frame.rb', line 6

def current_line
  @current_line
end

#task_editorObject (readonly)

Returns the value of attribute task_editor.



6
7
8
# File 'lib/minder/cli/message_frame.rb', line 6

def task_editor
  @task_editor
end

Instance Method Details

#allocated_tasks_heightObject



91
92
93
# File 'lib/minder/cli/message_frame.rb', line 91

def allocated_tasks_height
  height - header_text_lines.length - 3
end

#desired_heightObject



84
85
86
87
88
89
# File 'lib/minder/cli/message_frame.rb', line 84

def desired_height
  return 3 if minimized?

  # TODO: figure out what this magic 3 number is
  header_text_lines.length + tasks_text_lines.length + 3
end

#doing_messageObject



103
104
105
106
# File 'lib/minder/cli/message_frame.rb', line 103

def doing_message
  header_text +
    offset_tasks_text
end

#editing?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/minder/cli/message_frame.rb', line 29

def editing?
  @editing
end

#handle_char_keypress(key) ⇒ Object



154
155
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
# File 'lib/minder/cli/message_frame.rb', line 154

def handle_char_keypress(key)
  event =
    case key
    when 'j' then :select_next_task
    when 'k' then :select_previous_task
    when 'd' then :complete_task
    when 'x' then :delete_task
    when 's' then :start_task
    when 'u' then :unstart_task
    when 'G' then :select_last_task
    when 'e'
      @editing = true
      @task_editor = TaskEditor.new(task_manager.selected_task, self)
      @task_editor.add_observer(self, :handle_task_editor_event)
      :edit_task
    when '?' then :help
    when '/' then :search
    when 'm'
      minimize
      :redraw
    when 'n' then :next_search
    when 'N' then :previous_search
    when 'f' then :open_filter
    when 'g'
      @keypress_memory ||= []
      @keypress_memory << 'g'
      if @keypress_memory == ['g', 'g']
        @keypress_memory = []
        :select_first_task
      end
    when ' '
      if minimized?
        unminimize
        :redraw
      end
    end

  changed
  notify_observers(event)
end

#handle_keypress(key) ⇒ Object



132
133
134
135
136
137
138
# File 'lib/minder/cli/message_frame.rb', line 132

def handle_keypress(key)
  if editing?
    task_editor.handle_keypress(key)
  else
    super
  end
end

#handle_task_editor_event(event, data = {}) ⇒ Object



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/minder/cli/message_frame.rb', line 140

def handle_task_editor_event(event, data = {})
  if event == :stop_editing
    @editing = false
    @task_editor = nil
  elsif event == :update_task
    task_manager.update_task(task_manager.selected_task, data)
    @editing = false
    @task_editor = nil
  end

  changed
  notify_observers(event)
end

#header_textObject



57
58
59
60
61
62
# File 'lib/minder/cli/message_frame.rb', line 57

def header_text
<<-TEXT
Tasks         ? to see commands

TEXT
end

#header_text_linesObject



80
81
82
# File 'lib/minder/cli/message_frame.rb', line 80

def header_text_lines
  header_text.split("\n")
end

#minimizeObject



16
17
18
# File 'lib/minder/cli/message_frame.rb', line 16

def minimize
  @minimized = true
end

#minimized?Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/minder/cli/message_frame.rb', line 25

def minimized?
  @minimized
end

#minimized_messageObject



43
44
45
46
47
# File 'lib/minder/cli/message_frame.rb', line 43

def minimized_message
<<-TEXT
Space to see tasks
TEXT
end

#offset_tasks_textObject



95
96
97
# File 'lib/minder/cli/message_frame.rb', line 95

def offset_tasks_text
  tasks_text_lines[visible_tasks_range].join("\n")
end

#prompt_messageObject



49
50
51
52
53
54
55
# File 'lib/minder/cli/message_frame.rb', line 49

def prompt_message
  <<-TEXT
What are you working on?

Press (e) to open editor.
TEXT
end

#scroll_offsetObject



123
124
125
126
127
128
129
130
# File 'lib/minder/cli/message_frame.rb', line 123

def scroll_offset
  position = task_manager.selected_task_index + 1
  if position > allocated_tasks_height
    position - allocated_tasks_height
  else
    0
  end
end

#set_cursor_positionObject



108
109
110
111
112
113
114
115
116
117
# File 'lib/minder/cli/message_frame.rb', line 108

def set_cursor_position
  if minimized?
    window.setpos(1, 20)
  elsif editing?
    window.setpos(3 + task_manager.selected_task_index - scroll_offset,
                  task_editor.cursor_position + 6)
  else
    window.setpos(3 + task_manager.selected_task_index - scroll_offset, 3)
  end
end

#tasks_textObject



64
65
66
67
68
69
70
71
72
73
74
# File 'lib/minder/cli/message_frame.rb', line 64

def tasks_text
  text = ''
  task_manager.tasks.each do |task|
     if task.started?
      text += "-[*] #{task}\n"
    else
      text += "-[ ] #{task}\n"
    end
  end
  text
end

#tasks_text_linesObject



76
77
78
# File 'lib/minder/cli/message_frame.rb', line 76

def tasks_text_lines
  tasks_text.split("\n")
end

#templateObject



33
34
35
36
37
38
39
40
41
# File 'lib/minder/cli/message_frame.rb', line 33

def template
  if minimized?
    minimized_message
  elsif task_manager.tasks?
    doing_message
  else
    prompt_message
  end
end

#total_tasks_heightObject



119
120
121
# File 'lib/minder/cli/message_frame.rb', line 119

def total_tasks_height
  task_manager.tasks.length
end

#unminimizeObject



20
21
22
23
# File 'lib/minder/cli/message_frame.rb', line 20

def unminimize
  @minimized = false
  self.height = desired_height
end

#visible_tasks_rangeObject



99
100
101
# File 'lib/minder/cli/message_frame.rb', line 99

def visible_tasks_range
  (scroll_offset..(allocated_tasks_height + scroll_offset - 1))
end