todo-curses 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CONTRIBUTING.md +34 -0
- data/Gemfile +0 -5
- data/Gemfile.lock +28 -9
- data/README.md +120 -0
- data/README.rdoc +10 -92
- data/Rakefile +65 -28
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/todo-curses +37 -40
- data/images/todo-curses-demo.gif +0 -0
- data/lib/TodoCurses.rb +16 -0
- data/lib/{todo-txt → TodoCurses}/list.rb +21 -20
- data/lib/{todo-txt → TodoCurses}/logger.rb +2 -2
- data/lib/{todo-txt → TodoCurses}/task.rb +20 -20
- data/lib/TodoCurses/version.rb +3 -0
- data/lib/TodoCurses/view.rb +261 -0
- data/todo-curses.gemspec +26 -19
- metadata +148 -34
- data/features/step_definitions/todo_steps.rb +0 -6
- data/features/support/env.rb +0 -15
- data/features/todo.feature +0 -8
- data/lib/todo-txt.rb +0 -7
- data/lib/todo.rb +0 -6
- data/lib/todo/todo_viewer.rb +0 -283
- data/lib/todo/version.rb +0 -3
- data/reset.sh +0 -2
- data/run.sh +0 -2
- data/test/default_test.rb +0 -14
- data/test/test_helper.rb +0 -9
- data/todo.rdoc +0 -5
data/todo-curses.gemspec
CHANGED
@@ -1,20 +1,27 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'TodoCurses/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "todo-curses"
|
8
|
+
spec.license = "GPL-3.0"
|
9
|
+
spec.version = TodoCurses::VERSION
|
10
|
+
spec.authors = ["Loren Rogers"]
|
11
|
+
spec.email = ["loren@lorentrogers.com"]
|
12
|
+
spec.summary = %q{An interactive terminal application for managing todo.txt files.}
|
13
|
+
spec.homepage = "https://github.com/lorentrogers/todo-curses"
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
15
|
+
spec.bindir = "bin"
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency('rdoc', '~> 4.2', '>= 4.2.2')
|
22
|
+
spec.add_development_dependency('aruba', '~> 0.14.1')
|
23
|
+
spec.add_dependency('methadone', '~> 1.9', '>= 1.9.2')
|
24
|
+
spec.add_dependency('ncursesw', '~> 1.4', '>= 1.4.9')
|
25
|
+
spec.add_development_dependency('test-unit', '~> 3.1', '>= 3.1.8')
|
26
|
+
spec.add_development_dependency('rubocop', '~> 0.39.0')
|
20
27
|
end
|
metadata
CHANGED
@@ -1,74 +1,188 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-curses
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Loren Rogers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '1.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rdoc
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4.2'
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 4.2.2
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '4.2'
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 4.2.2
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: aruba
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.14.1
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.14.1
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: methadone
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '1.9'
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.9.2
|
20
85
|
type: :runtime
|
21
86
|
prerelease: false
|
22
87
|
version_requirements: !ruby/object:Gem::Requirement
|
23
88
|
requirements:
|
24
|
-
- -
|
89
|
+
- - "~>"
|
25
90
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
91
|
+
version: '1.9'
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 1.9.2
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: ncursesw
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - "~>"
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.4'
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 1.4.9
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '1.4'
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: 1.4.9
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: test-unit
|
117
|
+
requirement: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - "~>"
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '3.1'
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 3.1.8
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.1'
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 3.1.8
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: rubocop
|
137
|
+
requirement: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - "~>"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.39.0
|
142
|
+
type: :development
|
143
|
+
prerelease: false
|
144
|
+
version_requirements: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - "~>"
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: 0.39.0
|
27
149
|
description:
|
28
|
-
email:
|
150
|
+
email:
|
151
|
+
- loren@lorentrogers.com
|
29
152
|
executables:
|
153
|
+
- console
|
154
|
+
- setup
|
30
155
|
- todo-curses
|
31
156
|
extensions: []
|
32
|
-
extra_rdoc_files:
|
33
|
-
- README.rdoc
|
34
|
-
- todo.rdoc
|
157
|
+
extra_rdoc_files: []
|
35
158
|
files:
|
36
159
|
- ".gitignore"
|
160
|
+
- CONTRIBUTING.md
|
37
161
|
- Gemfile
|
38
162
|
- Gemfile.lock
|
39
163
|
- LICENSE.txt
|
164
|
+
- README.md
|
40
165
|
- README.rdoc
|
41
166
|
- Rakefile
|
167
|
+
- bin/console
|
168
|
+
- bin/setup
|
42
169
|
- bin/todo-curses
|
43
|
-
-
|
44
|
-
-
|
45
|
-
-
|
46
|
-
- lib/
|
47
|
-
- lib/
|
48
|
-
- lib/
|
49
|
-
- lib/
|
50
|
-
- lib/todo.rb
|
51
|
-
- lib/todo/todo_viewer.rb
|
52
|
-
- lib/todo/version.rb
|
53
|
-
- reset.sh
|
54
|
-
- run.sh
|
55
|
-
- test/default_test.rb
|
56
|
-
- test/test_helper.rb
|
170
|
+
- images/todo-curses-demo.gif
|
171
|
+
- lib/TodoCurses.rb
|
172
|
+
- lib/TodoCurses/list.rb
|
173
|
+
- lib/TodoCurses/logger.rb
|
174
|
+
- lib/TodoCurses/task.rb
|
175
|
+
- lib/TodoCurses/version.rb
|
176
|
+
- lib/TodoCurses/view.rb
|
57
177
|
- todo-curses.gemspec
|
58
|
-
- todo.rdoc
|
59
178
|
homepage: https://github.com/lorentrogers/todo-curses
|
60
|
-
licenses:
|
179
|
+
licenses:
|
180
|
+
- GPL-3.0
|
61
181
|
metadata: {}
|
62
182
|
post_install_message:
|
63
|
-
rdoc_options:
|
64
|
-
- "--title"
|
65
|
-
- todo-curses
|
66
|
-
- "--main"
|
67
|
-
- README.rdoc
|
68
|
-
- "-ri"
|
183
|
+
rdoc_options: []
|
69
184
|
require_paths:
|
70
185
|
- lib
|
71
|
-
- lib
|
72
186
|
required_ruby_version: !ruby/object:Gem::Requirement
|
73
187
|
requirements:
|
74
188
|
- - ">="
|
data/features/support/env.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'aruba/cucumber'
|
2
|
-
|
3
|
-
ENV['PATH'] = "#{File.expand_path(File.dirname(__FILE__) + '/../../bin')}#{File::PATH_SEPARATOR}#{ENV['PATH']}"
|
4
|
-
LIB_DIR = File.join(File.expand_path(File.dirname(__FILE__)),'..','..','lib')
|
5
|
-
|
6
|
-
Before do
|
7
|
-
# Using "announce" causes massive warnings on 1.9.2
|
8
|
-
@puts = true
|
9
|
-
@original_rubylib = ENV['RUBYLIB']
|
10
|
-
ENV['RUBYLIB'] = LIB_DIR + File::PATH_SEPARATOR + ENV['RUBYLIB'].to_s
|
11
|
-
end
|
12
|
-
|
13
|
-
After do
|
14
|
-
ENV['RUBYLIB'] = @original_rubylib
|
15
|
-
end
|
data/features/todo.feature
DELETED
data/lib/todo-txt.rb
DELETED
data/lib/todo.rb
DELETED
data/lib/todo/todo_viewer.rb
DELETED
@@ -1,283 +0,0 @@
|
|
1
|
-
# TODO: Refactor into proper size functions
|
2
|
-
# A curses based todo.txt file viewer
|
3
|
-
class TodoViewer
|
4
|
-
|
5
|
-
# Run the ncurses application
|
6
|
-
def interact
|
7
|
-
while true
|
8
|
-
result = true
|
9
|
-
c = Ncurses.getch
|
10
|
-
case c
|
11
|
-
when 'J'.ord
|
12
|
-
result = priority_down
|
13
|
-
when 'K'.ord
|
14
|
-
result = priority_up
|
15
|
-
when 'x'.ord
|
16
|
-
toggle_item_completion
|
17
|
-
when 'n'.ord
|
18
|
-
new_item
|
19
|
-
when 'j'.ord
|
20
|
-
result = scroll_down
|
21
|
-
when 'k'.ord
|
22
|
-
result = scroll_up
|
23
|
-
# when '\s'.ord # white space
|
24
|
-
# for i in 0..(@screen.getmaxy - 2)
|
25
|
-
# if( ! scroll_down )
|
26
|
-
# if( i == 0 )
|
27
|
-
# result = false
|
28
|
-
# end
|
29
|
-
# break
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
# when Ncurses::KEY_PPAGE
|
33
|
-
# for i in 0..(@screen.getmaxy - 2)
|
34
|
-
# if( ! scroll_up )
|
35
|
-
# if( i == 0 )
|
36
|
-
# result = false
|
37
|
-
# end
|
38
|
-
# break
|
39
|
-
# end
|
40
|
-
# end
|
41
|
-
when 'h'.ord
|
42
|
-
while( scroll_up )
|
43
|
-
end
|
44
|
-
when 'l'.ord
|
45
|
-
while( scroll_down )
|
46
|
-
end
|
47
|
-
when 'q'.ord
|
48
|
-
break
|
49
|
-
else
|
50
|
-
@screen.mvprintw(0,0, "[unknown key `#{Ncurses.keyname(c)}'=#{c}] ")
|
51
|
-
end
|
52
|
-
if( !result )
|
53
|
-
Ncurses.beep
|
54
|
-
end
|
55
|
-
# TODO: Catch ctrl+c for graceful exit
|
56
|
-
end
|
57
|
-
|
58
|
-
# TODO: Confirm exit
|
59
|
-
clean_done_tasks
|
60
|
-
close_ncurses
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
# Create a new fileviewer, and view the file.
|
66
|
-
def initialize(filename)
|
67
|
-
@log = Logger.new 'log.txt'
|
68
|
-
@log.debug 'Run Started'
|
69
|
-
init_curses
|
70
|
-
load_file(filename)
|
71
|
-
interact
|
72
|
-
# TODO: Save a copy of the todo.txt list to backup file.
|
73
|
-
end
|
74
|
-
|
75
|
-
# Perform the curses setup
|
76
|
-
def init_curses
|
77
|
-
@screen = Ncurses.initscr
|
78
|
-
Ncurses.nonl
|
79
|
-
Ncurses.cbreak
|
80
|
-
Ncurses.noecho
|
81
|
-
@screen.scrollok(true)
|
82
|
-
end
|
83
|
-
|
84
|
-
# Loads the given file as a todo.txt array. Sets the view to the top
|
85
|
-
# and redraws the list view.
|
86
|
-
# @param filename [String] path to the text file to be loaded
|
87
|
-
def load_file(filename)
|
88
|
-
@done_file = File.dirname(filename) + '/done.txt'
|
89
|
-
@list = Todo::List.new filename
|
90
|
-
@list.sort! { |x,y| y <=> x } # Reverse sort
|
91
|
-
items = []
|
92
|
-
last_priority = nil
|
93
|
-
last_selection = @menu.current_item.user_object if @menu
|
94
|
-
current_selection = nil
|
95
|
-
|
96
|
-
# Build the menu item list
|
97
|
-
@list.each do |item|
|
98
|
-
# Insert dividers on priority change
|
99
|
-
if item.priority != last_priority
|
100
|
-
divider_priority = item.priority.nil? ? 'N/A' : item.priority.to_s
|
101
|
-
divider = Ncurses::Menu::ITEM.new(divider_priority, '')
|
102
|
-
items << divider
|
103
|
-
last_priority = item.priority
|
104
|
-
end
|
105
|
-
|
106
|
-
# Build the todo menu item
|
107
|
-
menu_item = Ncurses::Menu::ITEM.new(item.to_s, '') # name, description
|
108
|
-
menu_item.user_object = item
|
109
|
-
items << menu_item
|
110
|
-
|
111
|
-
# Set the current selection
|
112
|
-
current_selection = menu_item if item.to_s == last_selection.to_s
|
113
|
-
end
|
114
|
-
|
115
|
-
# Build the final menu object
|
116
|
-
# TODO: Possible memory leak from resetting object over top?
|
117
|
-
@menu = Ncurses::Menu::MENU.new items
|
118
|
-
@menu.set_menu_win(@screen)
|
119
|
-
@menu.set_menu_sub(@screen.derwin(@screen.getmaxx, @screen.getmaxy, 0, 0))
|
120
|
-
@menu.set_menu_format(@screen.getmaxy, 1)
|
121
|
-
|
122
|
-
# Set dividers to non-interactive
|
123
|
-
@menu.menu_items.select{ |i| i.user_object.nil? }.each do |divider|
|
124
|
-
divider.item_opts_off Menu::O_SELECTABLE
|
125
|
-
end
|
126
|
-
|
127
|
-
# Show the menu
|
128
|
-
@screen.clear
|
129
|
-
@menu.post_menu
|
130
|
-
|
131
|
-
# Set selection position
|
132
|
-
@menu.set_current_item current_selection if current_selection
|
133
|
-
@menu.menu_driver(Ncurses::Menu::REQ_DOWN_ITEM) if @menu.current_item.user_object.nil?
|
134
|
-
|
135
|
-
# Refresh
|
136
|
-
@screen.refresh
|
137
|
-
end
|
138
|
-
|
139
|
-
# Moves the current selection's priority up by one unless it is at Z.
|
140
|
-
def priority_up
|
141
|
-
item = @menu.current_item.user_object
|
142
|
-
item.priority_inc
|
143
|
-
save_list
|
144
|
-
end
|
145
|
-
|
146
|
-
# Moves the current selection's priority down by one unless it is at A.
|
147
|
-
def priority_down
|
148
|
-
item = @menu.current_item.user_object
|
149
|
-
item.priority_dec
|
150
|
-
save_list
|
151
|
-
end
|
152
|
-
|
153
|
-
# Scroll the display up by one line
|
154
|
-
# @return [Boolean] true if the action completed successfully.
|
155
|
-
def scroll_up
|
156
|
-
# Move to the next item if it's not the first in the list
|
157
|
-
unless @menu.menu_items[0].user_object.nil? &&
|
158
|
-
@menu.current_item.item_index < 2
|
159
|
-
result = @menu.menu_driver(Ncurses::Menu::REQ_UP_ITEM)
|
160
|
-
end
|
161
|
-
# Move to the next item if it's not a divider
|
162
|
-
result = @menu.menu_driver(Ncurses::Menu::REQ_UP_ITEM) unless @menu.current_item.user_object
|
163
|
-
return true if result == E_OK
|
164
|
-
false
|
165
|
-
end
|
166
|
-
|
167
|
-
# Scroll the display down by one line
|
168
|
-
# @return [Boolean] true if the action completed successfully.
|
169
|
-
def scroll_down
|
170
|
-
result = @menu.menu_driver(Ncurses::Menu::REQ_DOWN_ITEM)
|
171
|
-
result = @menu.menu_driver(Ncurses::Menu::REQ_DOWN_ITEM) unless @menu.current_item.user_object
|
172
|
-
return true if result == E_OK
|
173
|
-
false
|
174
|
-
end
|
175
|
-
|
176
|
-
# Collects a new todo item from the user and saves
|
177
|
-
# it to the text file.
|
178
|
-
def new_item
|
179
|
-
field = FIELD.new(1, @screen.getmaxx-1, 2, 1, 0, 0)
|
180
|
-
field.set_field_back(A_UNDERLINE)
|
181
|
-
fields = [field]
|
182
|
-
my_form = FORM.new(fields);
|
183
|
-
my_form.user_object = "My identifier"
|
184
|
-
|
185
|
-
# Calculate the area required for the form
|
186
|
-
rows = Array.new()
|
187
|
-
cols = Array.new()
|
188
|
-
my_form.scale_form(rows, cols);
|
189
|
-
|
190
|
-
# Create the window to be associated with the form
|
191
|
-
my_form_win = WINDOW.new(rows[0] + 3, cols[0] + 14, 1, 1);
|
192
|
-
my_form_win.keypad(TRUE);
|
193
|
-
|
194
|
-
# Set main window and sub window
|
195
|
-
my_form.set_form_win(my_form_win);
|
196
|
-
my_form.set_form_sub(my_form_win.derwin(rows[0], cols[0], 2, 12));
|
197
|
-
|
198
|
-
my_form.post_form();
|
199
|
-
|
200
|
-
# Print field types
|
201
|
-
my_form_win.mvaddstr(4, 2, "New item")
|
202
|
-
my_form_win.wrefresh();
|
203
|
-
|
204
|
-
stdscr.refresh();
|
205
|
-
|
206
|
-
new_item_text = capture_text_field_input(my_form_win, my_form, field)
|
207
|
-
|
208
|
-
# Save results
|
209
|
-
save_new_item(new_item_text)
|
210
|
-
|
211
|
-
# Clean up
|
212
|
-
my_form.unpost_form
|
213
|
-
my_form.free_form
|
214
|
-
|
215
|
-
field.free_field
|
216
|
-
# fields.each {|f| f.free_field()}
|
217
|
-
end
|
218
|
-
|
219
|
-
# Adds a new item to the list and saves the file
|
220
|
-
# @param task [String] the task to be added
|
221
|
-
# @return [Todo::List] the updated list
|
222
|
-
def save_new_item(task)
|
223
|
-
@list << Todo::Task.new(task)
|
224
|
-
save_list
|
225
|
-
@list
|
226
|
-
end
|
227
|
-
|
228
|
-
# Saves the current state of the list. Overrides the current file.
|
229
|
-
# Reloads the newly saved file.
|
230
|
-
def save_list
|
231
|
-
File.open(@list.path, 'w') { |file| file << @list.join("\n") }
|
232
|
-
load_file @list.path
|
233
|
-
end
|
234
|
-
|
235
|
-
# Marks the currently selected menu item as complete and saves the list.
|
236
|
-
def toggle_item_completion
|
237
|
-
@menu.current_item.user_object.toggle!
|
238
|
-
save_list
|
239
|
-
end
|
240
|
-
|
241
|
-
# Saves done tasks to done.txt and removes them from todo.txt
|
242
|
-
def clean_done_tasks
|
243
|
-
done_tasks = @list.select { |task| !task.completed_on.nil? }
|
244
|
-
File.open(@done_file, 'a') { |file|
|
245
|
-
file << "\n"
|
246
|
-
file << done_tasks.join("\n")
|
247
|
-
}
|
248
|
-
remaining_tasks = @list.select { |task| task.completed_on.nil? }
|
249
|
-
File.open(@list.path, 'w') { |file| file << remaining_tasks.join("\n") }
|
250
|
-
end
|
251
|
-
|
252
|
-
# put the screen back in its normal state
|
253
|
-
def close_ncurses
|
254
|
-
Ncurses.echo()
|
255
|
-
Ncurses.nocbreak()
|
256
|
-
Ncurses.nl()
|
257
|
-
Ncurses.endwin()
|
258
|
-
end
|
259
|
-
|
260
|
-
# Captures text input into a form and returns the resulting string.
|
261
|
-
# @param window [Window] the form window
|
262
|
-
# @param form [FORM] the form to be captured
|
263
|
-
# @param field [FIELD] the form to be captured
|
264
|
-
# @return [String] the captured input
|
265
|
-
def capture_text_field_input(window, form, field)
|
266
|
-
# Capture typing...
|
267
|
-
while((ch = window.getch()) != 13) # return is ascii 13
|
268
|
-
case ch
|
269
|
-
when KEY_LEFT
|
270
|
-
form.form_driver(REQ_PREV_CHAR);
|
271
|
-
when KEY_RIGHT
|
272
|
-
form.form_driver(REQ_NEXT_CHAR);
|
273
|
-
when KEY_BACKSPACE
|
274
|
-
form.form_driver(REQ_DEL_PREV);
|
275
|
-
else
|
276
|
-
# If this is a normal character, it gets Printed
|
277
|
-
form.form_driver(ch);
|
278
|
-
end
|
279
|
-
end
|
280
|
-
form.form_driver REQ_NEXT_FIELD # Request next to set 0 buffer in field
|
281
|
-
Ncurses::Form.field_buffer(field, 0)
|
282
|
-
end
|
283
|
-
end
|