rndk 0.0.1
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 +7 -0
- data/.gitignore +23 -0
- data/COPYING +137 -0
- data/Gemfile +4 -0
- data/README.md +100 -0
- data/Rakefile +3 -0
- data/TODO +68 -0
- data/demos/appointment.rb +346 -0
- data/demos/clock.rb +56 -0
- data/examples/01-hello-world.rb +56 -0
- data/examples/05-position-widget.rb +108 -0
- data/lib/rndk.rb +912 -0
- data/lib/rndk/alphalist.rb +572 -0
- data/lib/rndk/button.rb +370 -0
- data/lib/rndk/buttonbox.rb +359 -0
- data/lib/rndk/calendar.rb +766 -0
- data/lib/rndk/core/display.rb +63 -0
- data/lib/rndk/core/draw.rb +238 -0
- data/lib/rndk/core/quick_widgets.rb +106 -0
- data/lib/rndk/core/screen.rb +269 -0
- data/lib/rndk/core/traverse.rb +289 -0
- data/lib/rndk/core/widget.rb +506 -0
- data/lib/rndk/dialog.rb +367 -0
- data/lib/rndk/dscale.rb +13 -0
- data/lib/rndk/entry.rb +575 -0
- data/lib/rndk/fscale.rb +61 -0
- data/lib/rndk/fselect.rb +940 -0
- data/lib/rndk/fslider.rb +80 -0
- data/lib/rndk/graph.rb +401 -0
- data/lib/rndk/histogram.rb +412 -0
- data/lib/rndk/itemlist.rb +474 -0
- data/lib/rndk/label.rb +218 -0
- data/lib/rndk/marquee.rb +244 -0
- data/lib/rndk/matrix.rb +1189 -0
- data/lib/rndk/mentry.rb +619 -0
- data/lib/rndk/menu.rb +478 -0
- data/lib/rndk/radio.rb +538 -0
- data/lib/rndk/scale.rb +538 -0
- data/lib/rndk/scroll.rb +633 -0
- data/lib/rndk/scroller.rb +183 -0
- data/lib/rndk/selection.rb +630 -0
- data/lib/rndk/slider.rb +545 -0
- data/lib/rndk/swindow.rb +766 -0
- data/lib/rndk/template.rb +560 -0
- data/lib/rndk/uscale.rb +14 -0
- data/lib/rndk/uslider.rb +14 -0
- data/lib/rndk/version.rb +6 -0
- data/lib/rndk/viewer.rb +825 -0
- data/rndk.gemspec +35 -0
- metadata +141 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a5b6103e3b2539bf72321942974536d2688cdf41
|
4
|
+
data.tar.gz: 5890e72b066792bf7c11e0810aa6fec292c287d8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4236e304d133df93247638b65dba122a1b434f6934f6635e4de784aa169696e773c874efdcb2835713390ee10e7c683b53a71594d9d1eb8b8f01d26d5a3d5af5
|
7
|
+
data.tar.gz: 18585b599021f220cc26fb9e2127b04727ef7d757b965be78b8e33d66ea27e3ef11f83a0f8013d53cd01b733eb7bc88925a9a40539ffbccf6b7647a946d0e5ec
|
data/.gitignore
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Files starting with 'NOPE' are a way for me
|
2
|
+
# to ignore files that I'm still converting from
|
3
|
+
# old CDK style to current RNDK format.
|
4
|
+
NOPE*
|
5
|
+
|
6
|
+
# "regular" files to ignore
|
7
|
+
*.gem
|
8
|
+
*.rbc
|
9
|
+
.bundle
|
10
|
+
.config
|
11
|
+
.yardoc
|
12
|
+
Gemfile.lock
|
13
|
+
InstalledFiles
|
14
|
+
_yardoc
|
15
|
+
coverage
|
16
|
+
doc/
|
17
|
+
lib/bundler/man
|
18
|
+
pkg
|
19
|
+
rdoc
|
20
|
+
spec/reports
|
21
|
+
test/tmp
|
22
|
+
test/version_tmp
|
23
|
+
tmp
|
data/COPYING
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
RNDK copyright Alexandre Dantas 2013
|
2
|
+
|
3
|
+
Normally I'd use GPL, but since I don't know if I can simply do that,
|
4
|
+
I'll keep the same license as Chris Sauro on his original ruby CDK port.
|
5
|
+
See right below.
|
6
|
+
|
7
|
+
================================================================================
|
8
|
+
|
9
|
+
Original Ruby CDK port copyright Chris Sauro 2013
|
10
|
+
|
11
|
+
Like Thomas, I am keeping this under a BSD license but I am changing to the
|
12
|
+
3-clause version rather than the old 4-clause version. The text of this
|
13
|
+
license is copied below and the original COPYING file is available below
|
14
|
+
that. -CS
|
15
|
+
|
16
|
+
================================================================================
|
17
|
+
|
18
|
+
Copyright (c) 2013, Chris Sauro
|
19
|
+
All rights reserved.
|
20
|
+
|
21
|
+
Redistribution and use in source and binary forms, with or without
|
22
|
+
modification, are permitted provided that the following conditions are met:
|
23
|
+
* Redistributions of source code must retain the above copyright
|
24
|
+
notice, this list of conditions and the following disclaimer.
|
25
|
+
* Redistributions in binary form must reproduce the above copyright
|
26
|
+
notice, this list of conditions and the following disclaimer in the
|
27
|
+
documentation and/or other materials provided with the distribution.
|
28
|
+
* Neither the name of Chris Sauro nor the
|
29
|
+
names of its contributors may be used to endorse or promote products
|
30
|
+
derived from this software without specific prior written permission.
|
31
|
+
|
32
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
33
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
34
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
35
|
+
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
|
36
|
+
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
37
|
+
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
38
|
+
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
39
|
+
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
40
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
41
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
42
|
+
|
43
|
+
================================================================================
|
44
|
+
|
45
|
+
Modifications copyright Thomas Dickey 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
46
|
+
|
47
|
+
The software and documentation are still under the same licensing are the
|
48
|
+
original Cdk, but noting that substantial work and enhancements have been made,
|
49
|
+
I've added my name as needed -TD
|
50
|
+
|
51
|
+
The original COPYING file follows (with corrections as noted in CHANGES).
|
52
|
+
|
53
|
+
================================================================================
|
54
|
+
|
55
|
+
Cdk Copying Guide
|
56
|
+
Copyright Mike Glover, 1995, 1996, 1997, 1998, 1999
|
57
|
+
-------------------------------------------------------------------------------
|
58
|
+
In order to copy Cdk around I have some requirements that will protect me,
|
59
|
+
and possibly even you. First thing, I feel I should say that this little project
|
60
|
+
of mine has taken quite a bit 'free' time and I have put a lot of work
|
61
|
+
into it. I do ask that if anyone asks you about Cdk, tell them where you got it
|
62
|
+
and who wrote it. If you see Cdk installed without this file on the system
|
63
|
+
somewhere, then assume the copy the person has is a 'corrupt' version. I will
|
64
|
+
not be responsible for any unfortunate results if someone else makes a personal
|
65
|
+
modification to the Cdk library. I will also not be responsible if for some
|
66
|
+
reason the installation of Cdk creates a negative effect on your machine. You
|
67
|
+
do have my word that there are no "Trojan horses", worms, or other security
|
68
|
+
worries lurking in this code. If there are I did not put them there and you
|
69
|
+
should remove the version of Cdk you have and go get a proper copy. I hate
|
70
|
+
virus writers as much as anyone else!
|
71
|
+
|
72
|
+
Instead of writing my own license (I'm a programmer, not a lawyer!) I'm going
|
73
|
+
to adapt the BSD public license on public software. If you do not agree to
|
74
|
+
this license then remove the Cdk distribution and we all will be happier in
|
75
|
+
the end. Here is the complete BSD public license in its true form, for
|
76
|
+
reference.
|
77
|
+
|
78
|
+
I will say one thing, Cdk is my copyright. I will continue to support any
|
79
|
+
released versions out there as long as they are in their released form. I am
|
80
|
+
releasing this into the "public" because I feel I have benefited from other
|
81
|
+
people's hard work, I'd like to chip into the pot as well. This does NOT make
|
82
|
+
Cdk public domain though. Cdk is still my copyright, and owned by me, I am
|
83
|
+
merely stating this so I don't see 40 different versions of my code floating
|
84
|
+
around with other people's names attached.
|
85
|
+
|
86
|
+
With that ugly stuff said, I will happily take any comments or questions about
|
87
|
+
Cdk. Input is more than welcomed. In fact I encourage it. Feel free to mail
|
88
|
+
me and ask questions you think the supplied documents don't cover. If I get
|
89
|
+
enough I may build a FAQ to help newcomers. (We'll see how Cdk is accepted
|
90
|
+
though).
|
91
|
+
|
92
|
+
For you Perl programmers, there is a Perl5 extension to Cdk. Look at your
|
93
|
+
closest CPAN site under authors/id/GLOVER.
|
94
|
+
|
95
|
+
If you want to get a hold of me mail me at one of the following:
|
96
|
+
glover@credit.erin.utoronto.ca
|
97
|
+
mike@vexus.ca
|
98
|
+
|
99
|
+
The CDK Web page has several homes. They are:
|
100
|
+
http://www.vexus.ca/CDK.html (official)
|
101
|
+
http://www.datasoft.on.ca/~cdk (Sponsored by the nice folks at Datasoft)
|
102
|
+
|
103
|
+
ttfn,
|
104
|
+
Mike
|
105
|
+
-------------------------------------------------------------------------------
|
106
|
+
|
107
|
+
Copyright (c) 1999, Mike Glover
|
108
|
+
All rights reserved.
|
109
|
+
|
110
|
+
Redistribution and use in source and binary forms, with or without
|
111
|
+
modification, are permitted provided that the following conditions
|
112
|
+
are met:
|
113
|
+
1. Redistributions of source code must retain the above copyright
|
114
|
+
notice, this list of conditions and the following disclaimer.
|
115
|
+
2. Redistributions in binary form must reproduce the above copyright
|
116
|
+
notice, this list of conditions and the following disclaimer in the
|
117
|
+
documentation and/or other materials provided with the distribution.
|
118
|
+
3. All advertising materials mentioning features or use of this software
|
119
|
+
must display the following acknowledgment:
|
120
|
+
This product includes software developed by Mike Glover
|
121
|
+
and contributors.
|
122
|
+
4. Neither the name of Mike Glover, nor the names of contributors
|
123
|
+
may be used to endorse or promote products derived from this software
|
124
|
+
without specific prior written permission.
|
125
|
+
|
126
|
+
THIS SOFTWARE IS PROVIDED BY MIKE GLOVER AND CONTRIBUTORS ``AS IS'' AND
|
127
|
+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
128
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
129
|
+
ARE DISCLAIMED. IN NO EVENT SHALL MIKE GLOVER OR CONTRIBUTORS BE LIABLE
|
130
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
131
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
132
|
+
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
133
|
+
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
134
|
+
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
135
|
+
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
136
|
+
SUCH DAMAGE.
|
137
|
+
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
# Ruby Ncurses Development Kit (RNDK)
|
2
|
+
|
3
|
+
`rndk` aims to be a powerful, well-documented and easy-to-use
|
4
|
+
Ncurses Development Kit in Ruby. Besides abstracting away Ncurses'
|
5
|
+
details, it provides some widgets for rapid console app development.
|
6
|
+
|
7
|
+
It means that you'll be able to master the dark arts of text-based
|
8
|
+
applications, easily creating nice apps for the console.
|
9
|
+
|
10
|
+
`RNDK` is a fork from `tawny-cdk`, a [Chris Sauro Ruby port][tawny]
|
11
|
+
of [Thomas Dickey's Curses Development Kit][cdk] (in C).
|
12
|
+
|
13
|
+
Currently implemented widgets:
|
14
|
+
|
15
|
+
* Alphalist
|
16
|
+
* Button
|
17
|
+
* Buttonbox
|
18
|
+
* Calendar
|
19
|
+
* Dialog
|
20
|
+
* Entry
|
21
|
+
* File Selector
|
22
|
+
* Graph
|
23
|
+
* Histogram
|
24
|
+
* Item List
|
25
|
+
* Label
|
26
|
+
* Matrix
|
27
|
+
* Marquee
|
28
|
+
* Menu
|
29
|
+
* Multiple Line Entry
|
30
|
+
* Radio List
|
31
|
+
* Scale
|
32
|
+
* Scrolling List
|
33
|
+
* Scrolling Window
|
34
|
+
* Selection List
|
35
|
+
* Slider
|
36
|
+
* Template
|
37
|
+
* Viewer
|
38
|
+
|
39
|
+
## WARNING
|
40
|
+
|
41
|
+
This is a very unstable Work-in-Progress library.
|
42
|
+
|
43
|
+
I'm currently reviewing `tawny-cdk`'s API, so a lot of things are
|
44
|
+
changing real fast.
|
45
|
+
|
46
|
+
Be sure to know that whenever I remove this notice, things will be
|
47
|
+
nicer.
|
48
|
+
|
49
|
+
For now, I recommend you to **not** use `rndk` for production
|
50
|
+
programs!
|
51
|
+
|
52
|
+
## Requirements
|
53
|
+
|
54
|
+
`rndk` requires the gem `ffi-ncurses`.
|
55
|
+
|
56
|
+
## Installation
|
57
|
+
|
58
|
+
Add this line to your application's Gemfile:
|
59
|
+
|
60
|
+
gem 'rndk'
|
61
|
+
|
62
|
+
And then execute:
|
63
|
+
|
64
|
+
$ bundle
|
65
|
+
|
66
|
+
Or install it yourself as:
|
67
|
+
|
68
|
+
$ gem install rndk
|
69
|
+
|
70
|
+
## Usage
|
71
|
+
|
72
|
+
The `examples` directory contains lots of sample usages for every
|
73
|
+
widget available. To execute them, go to the `rndk` root folder
|
74
|
+
and run:
|
75
|
+
|
76
|
+
ruby -Ilib examples/YOUR_EXAMPLE_HERE
|
77
|
+
|
78
|
+
There's also some more comples demo applications under the `demos`
|
79
|
+
directory. Do the same:
|
80
|
+
|
81
|
+
ruby -Ilib demos/YOUR_DEMO_HERE
|
82
|
+
|
83
|
+
## Contributing
|
84
|
+
|
85
|
+
Currently `rndk` has a C-like API, since it was directly taken
|
86
|
+
from `cdk`. The top priority is to make it more rubyish (maybe
|
87
|
+
studying [rbcurse]?).
|
88
|
+
|
89
|
+
Also, see the `TODO` file.
|
90
|
+
|
91
|
+
1. Fork it
|
92
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
93
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
94
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
95
|
+
5. Create new Pull Request
|
96
|
+
|
97
|
+
[tawny]:https://github.com/masterzora/tawny-cdk
|
98
|
+
[cdk]:http://invisible-island.net/cdk/
|
99
|
+
[rbcurse]:https://github.com/rkumar/rbcurse
|
100
|
+
|
data/Rakefile
ADDED
data/TODO
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
RNDK TODO List
|
2
|
+
(forked from Tawny-Cdk's TODO List)
|
3
|
+
------------------------------------------------------------------------------
|
4
|
+
|
5
|
+
Now that Tawny CDK is basically a complete copy of Thomas Dickey version of
|
6
|
+
Mike Glover's CDK it is essentially usable, but there's still a lot to do:
|
7
|
+
|
8
|
+
* Documentation
|
9
|
+
- Most of the original comments from the .c files were preserved but many
|
10
|
+
of those are less than helpful and some areas where they might be more
|
11
|
+
helpful are lacking. Further, the .h files have a few potentially
|
12
|
+
useful comments that were not preserved. Further, module, class, and
|
13
|
+
method docs are either lacking or nonexistent in most places. Tawny CDK
|
14
|
+
won't see a major version release until some better docs are in place.
|
15
|
+
* Code cleanup
|
16
|
+
- This project was how I learned Ruby so there are probably a fair number
|
17
|
+
of Ruby conventions being broken all over the place. This goes double
|
18
|
+
since I stayed fairly close to the original C in some places where it
|
19
|
+
wasn't necessarily appropriate.
|
20
|
+
* Continue restructuring
|
21
|
+
- Related to but distinct from the cleanup. The original C code was a
|
22
|
+
very impressive approximation of polymorphic object-oriented code.
|
23
|
+
Since Ruby is actually object-oriented I've mostly translated this into
|
24
|
+
this paradigm but some work still remains. Some of the codebase can
|
25
|
+
definitely benefit from a more aggressive approach to the object
|
26
|
+
orientation and polymorphic behaviour. Further, I need to take a more
|
27
|
+
critical eye at seeing what works better as inherited classes and what
|
28
|
+
works better as mixins since apparently those are different things in
|
29
|
+
Ruby.
|
30
|
+
* Error handling
|
31
|
+
- In part to allow for more rapid development and in part because I still
|
32
|
+
need to get more familiar with Ruby's exception handling but the code
|
33
|
+
is nowhere near as robust as it should be. In some cases, such as a lot
|
34
|
+
of the file handling, this means implementing intelligent rescues. In
|
35
|
+
other cases this means dealing more robustly with sensible but unexpected
|
36
|
+
parameter types.
|
37
|
+
* Package it all up
|
38
|
+
- Tawny CDK won't see a major version release until I work on packaging it
|
39
|
+
all up.
|
40
|
+
* Compatiblity version
|
41
|
+
- Right now I've significantly renamed and restructured a lot of things to
|
42
|
+
better facilitate development but have still attempted to remain somewhat
|
43
|
+
faithful to the original version. At some point I'd like to fix this with
|
44
|
+
a sort of split: a less faithful 'primary' version that makes more sense
|
45
|
+
in Ruby and a as-faithful-as-possible 'compatibility' version that wraps
|
46
|
+
the primary version into the same (more-or-less) names and structure as
|
47
|
+
the original.
|
48
|
+
* Support other Curses packages
|
49
|
+
- Right now this is all developed for a very specific Ncurses package.
|
50
|
+
Ruby has multiple Curses packages so it would be nice to provide broader
|
51
|
+
support.
|
52
|
+
* Fixes
|
53
|
+
- The code has a few "FIXME(original)" tags strewn around. Some of these
|
54
|
+
appear to be significantly easier to fix in Ruby and might even provide
|
55
|
+
some insight to allow me to kick fixes back to Thomas's project.
|
56
|
+
* The Cdk TODO List
|
57
|
+
- The Dickey/Glover version has its own TODO list with several items that
|
58
|
+
would be interesting to add. As with fixes, some of them may be easier
|
59
|
+
to implement in the Ruby version and then use the insights gained to
|
60
|
+
kick back to the C.
|
61
|
+
* Collections
|
62
|
+
- It's simple: a widget that is really a collection of widgets. Fully take
|
63
|
+
advantage of real object-orientation and polymorphism and make a widget
|
64
|
+
that collects widgets and handles them as one. Have its activate really
|
65
|
+
activate the focused widget, move affect all widgets in the collection as
|
66
|
+
one, and things like that. Basically, make it really easy to combine
|
67
|
+
widgets in useful manners
|
68
|
+
|
@@ -0,0 +1,346 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Shows a book where you can create appointments of different
|
4
|
+
# kinds, save and restore them on a file.
|
5
|
+
#
|
6
|
+
# The keybindings are:
|
7
|
+
#
|
8
|
+
# * 'm' create appointment at selected day
|
9
|
+
# * 'r' remove appointment at selected day
|
10
|
+
# * '?' displays appointment for selected day
|
11
|
+
# * 'enter' or 'tab' quits
|
12
|
+
#
|
13
|
+
# It automatically creates file `/tmp/appointments.dat` on the
|
14
|
+
# current directory
|
15
|
+
require 'ostruct'
|
16
|
+
require 'rndk/calendar'
|
17
|
+
require 'rndk/itemlist'
|
18
|
+
require 'rndk/entry'
|
19
|
+
|
20
|
+
class Appointment
|
21
|
+
MAX_MARKERS = 2000
|
22
|
+
GPAppointmentAttributes = [
|
23
|
+
Ncurses::A_BLINK,
|
24
|
+
Ncurses::A_BOLD,
|
25
|
+
Ncurses::A_REVERSE,
|
26
|
+
Ncurses::A_UNDERLINE,
|
27
|
+
]
|
28
|
+
|
29
|
+
AppointmentType = [
|
30
|
+
:BIRTHDAY,
|
31
|
+
:ANNIVERSARY,
|
32
|
+
:APPOINTMENT,
|
33
|
+
:OTHER,
|
34
|
+
]
|
35
|
+
|
36
|
+
# This reads a given appointment file.
|
37
|
+
def Appointment.readAppointmentFile(filename, app_info)
|
38
|
+
appointments = 0
|
39
|
+
segments = 0
|
40
|
+
lines = []
|
41
|
+
|
42
|
+
# Read the appointment file.
|
43
|
+
lines_read = RNDK.readFile(filename, lines)
|
44
|
+
if lines_read == -1
|
45
|
+
app_info.count = 0
|
46
|
+
return
|
47
|
+
end
|
48
|
+
|
49
|
+
# Split each line up and create an appointment.
|
50
|
+
(0...lines_read).each do |x|
|
51
|
+
temp = lines[x].split(RNDK.CTRL('V').chr)
|
52
|
+
segments = temp.size
|
53
|
+
|
54
|
+
# A valid line has 5 elements:
|
55
|
+
# Day, Month, Year, Type, Description.
|
56
|
+
if segments == 5
|
57
|
+
app_info.appointment << OpenStruct.new
|
58
|
+
e_type = Appointment::AppointmentType[temp[3].to_i]
|
59
|
+
|
60
|
+
app_info.appointment[appointments].day = temp[0].to_i
|
61
|
+
app_info.appointment[appointments].month = temp[1].to_i
|
62
|
+
app_info.appointment[appointments].year = temp[2].to_i
|
63
|
+
app_info.appointment[appointments].type = e_type
|
64
|
+
app_info.appointment[appointments].description = temp[4]
|
65
|
+
appointments += 1
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Keep the amount of appointments read.
|
70
|
+
app_info.count = appointments
|
71
|
+
end
|
72
|
+
|
73
|
+
# This saves a given appointment file.
|
74
|
+
def Appointment.saveAppointmentFile(filename, app_info)
|
75
|
+
# TODO: error handling
|
76
|
+
fd = File.new(filename, 'w')
|
77
|
+
|
78
|
+
# Start writing.
|
79
|
+
app_info.appointment.each do |appointment|
|
80
|
+
if appointment.description != ''
|
81
|
+
fd.puts '%d%c%d%c%d%c%d%c%s' % [
|
82
|
+
appointment.day, RNDK.CTRL('V').chr,
|
83
|
+
appointment.month, RNDK.CTRL('V').chr,
|
84
|
+
appointment.year, RNDK.CTRL('V').chr,
|
85
|
+
Appointment::AppointmentType.index(appointment.type),
|
86
|
+
RNDK.CTRL('V').chr, appointment.description]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
fd.close
|
90
|
+
end
|
91
|
+
|
92
|
+
# This program demonstrates the Rndk calendar widget.
|
93
|
+
def Appointment.main
|
94
|
+
|
95
|
+
# Get the current dates and set the default values for
|
96
|
+
# the day/month/year values for the calendar.
|
97
|
+
date_info = Time.now.gmtime
|
98
|
+
day = date_info.day
|
99
|
+
month = date_info.mon
|
100
|
+
year = date_info.year
|
101
|
+
|
102
|
+
title = "<C></U>RNDK Appointment Book\nPress 'h' for help\n<C><#HL(30)>\n"
|
103
|
+
|
104
|
+
filename = ''
|
105
|
+
|
106
|
+
# Create the appointment book filename.
|
107
|
+
filename = "/tmp/appointments.dat"
|
108
|
+
|
109
|
+
appointment_info = OpenStruct.new
|
110
|
+
appointment_info.count = 0
|
111
|
+
appointment_info.appointment = []
|
112
|
+
|
113
|
+
# Read the appointment book information.
|
114
|
+
readAppointmentFile(filename, appointment_info)
|
115
|
+
|
116
|
+
# Set up RNDK
|
117
|
+
curses_win = Ncurses.initscr
|
118
|
+
rndkscreen = RNDK::Screen.new(curses_win)
|
119
|
+
|
120
|
+
# Set up RNDK colors
|
121
|
+
RNDK::Draw.initRNDKColor
|
122
|
+
|
123
|
+
# Create the calendar widget.
|
124
|
+
calendar = RNDK::CALENDAR.new(rndkscreen,
|
125
|
+
RNDK::CENTER,
|
126
|
+
RNDK::CENTER,
|
127
|
+
title, day, month, year,
|
128
|
+
Ncurses::A_NORMAL, Ncurses::A_NORMAL, Ncurses::A_NORMAL, Ncurses::A_REVERSE,
|
129
|
+
true, false)
|
130
|
+
|
131
|
+
# Is the widget nil?
|
132
|
+
if calendar.nil?
|
133
|
+
rndkscreen.destroy
|
134
|
+
RNDK::Screen.end_rndk
|
135
|
+
|
136
|
+
puts "Cannot create the calendar. Is the window too small?"
|
137
|
+
exit 1
|
138
|
+
end
|
139
|
+
|
140
|
+
# This adds a marker to the calendar.
|
141
|
+
create_calendar_mark_cb = lambda do |object_type, calendar, info, key|
|
142
|
+
items = [
|
143
|
+
'Birthday',
|
144
|
+
'Anniversary',
|
145
|
+
'Appointment',
|
146
|
+
'Other',
|
147
|
+
]
|
148
|
+
|
149
|
+
# Create the itemlist widget.
|
150
|
+
itemlist = RNDK::ITEMLIST.new(calendar.screen,
|
151
|
+
RNDK::CENTER, RNDK::CENTER, '', 'Select Appointment Type: ',
|
152
|
+
items, items.size, 0, true, false)
|
153
|
+
|
154
|
+
# Get the appointment type from the user.
|
155
|
+
selection = itemlist.activate([])
|
156
|
+
|
157
|
+
# They hit escape, kill the itemlist widget and leave.
|
158
|
+
if selection == -1
|
159
|
+
itemlist.destroy
|
160
|
+
calendar.draw(calendar.box)
|
161
|
+
return false
|
162
|
+
end
|
163
|
+
|
164
|
+
# Destroy the itemlist and set the marker.
|
165
|
+
itemlist.destroy
|
166
|
+
calendar.draw(calendar.box)
|
167
|
+
marker = Appointment::GPAppointmentAttributes[selection]
|
168
|
+
|
169
|
+
# Create the entry field for the description.
|
170
|
+
entry = RNDK::ENTRY.new(calendar.screen, RNDK::CENTER, RNDK::CENTER,
|
171
|
+
'<C>Enter a description of the appointment.',
|
172
|
+
'Description: ', Ncurses::A_NORMAL, '.'.ord, :MIXED, 40, 1, 512,
|
173
|
+
true, false)
|
174
|
+
|
175
|
+
# Get the description.
|
176
|
+
description = entry.activate([])
|
177
|
+
if description == 0
|
178
|
+
entry.destroy
|
179
|
+
calendar.draw(calendar.box)
|
180
|
+
return false
|
181
|
+
end
|
182
|
+
|
183
|
+
# Destroy the entry and set the marker.
|
184
|
+
description = entry.info
|
185
|
+
entry.destroy
|
186
|
+
calendar.draw(calendar.box)
|
187
|
+
|
188
|
+
# Set the marker.
|
189
|
+
calendar.setMarker(calendar.day, calendar.month, calendar.year, marker)
|
190
|
+
|
191
|
+
# Keep the marker.
|
192
|
+
info.appointment << OpenStruct.new
|
193
|
+
current = info.count
|
194
|
+
|
195
|
+
info.appointment[current].day = calendar.day
|
196
|
+
info.appointment[current].month = calendar.month
|
197
|
+
info.appointment[current].year = calendar.year
|
198
|
+
info.appointment[current].type = Appointment::AppointmentType[selection]
|
199
|
+
info.appointment[current].description = description
|
200
|
+
info.count += 1
|
201
|
+
|
202
|
+
# Redraw the calendar.
|
203
|
+
calendar.draw(calendar.box)
|
204
|
+
return false
|
205
|
+
end
|
206
|
+
|
207
|
+
# This removes a marker from the calendar.
|
208
|
+
remove_calendar_mark_cb = lambda do |object_type, calendar, info, key|
|
209
|
+
info.appointment.each do |appointment|
|
210
|
+
if appointment.day == calendar.day &&
|
211
|
+
appointment.month == calendar.month &&
|
212
|
+
appointment.year == calendar.year
|
213
|
+
appointment.description = ''
|
214
|
+
break
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
# Remove the marker from the calendar.
|
219
|
+
calendar.removeMarker(calendar.day, calendar.month, calendar.year)
|
220
|
+
|
221
|
+
# Redraw the calendar.
|
222
|
+
calendar.draw(calendar.box)
|
223
|
+
return false
|
224
|
+
end
|
225
|
+
|
226
|
+
# This displays the marker(s) on the given day.
|
227
|
+
display_calendar_mark_cb = lambda do |object_type, calendar, info, key|
|
228
|
+
found = 0
|
229
|
+
type = ''
|
230
|
+
mesg = []
|
231
|
+
|
232
|
+
# Look for the marker in the list.
|
233
|
+
info.appointment.each do |appointment|
|
234
|
+
# Get the day month year.
|
235
|
+
day = appointment.day
|
236
|
+
month = appointment.month
|
237
|
+
year = appointment.year
|
238
|
+
|
239
|
+
# Determine the appointment type.
|
240
|
+
if appointment.type == :BIRTHDAY
|
241
|
+
type = 'Birthday'
|
242
|
+
elsif appointment.type == :ANNIVERSARY
|
243
|
+
type = 'Anniversary'
|
244
|
+
elsif appointment.type == :APPOINTMENT
|
245
|
+
type = 'Appointment'
|
246
|
+
else
|
247
|
+
type = 'Other'
|
248
|
+
end
|
249
|
+
|
250
|
+
# Find the marker by the day/month/year.
|
251
|
+
if day == calendar.day && month == calendar.month &&
|
252
|
+
year == calendar.year && appointment.description != ''
|
253
|
+
# Create the message for the label widget.
|
254
|
+
mesg << '<C>Appointment Date: %02d/%02d/%d' % [
|
255
|
+
day, month, year]
|
256
|
+
mesg << ' '
|
257
|
+
mesg << '<C><#HL(35)>'
|
258
|
+
mesg << ' Appointment Type: %s' % [type]
|
259
|
+
mesg << ' Description :'
|
260
|
+
mesg << ' %s' % [appointment.description]
|
261
|
+
mesg << '<C><#HL(35)>'
|
262
|
+
mesg << ' '
|
263
|
+
mesg << '<C>Press space to continue.'
|
264
|
+
|
265
|
+
found = 1
|
266
|
+
break
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# If we didn't find the marker, create a different message.
|
271
|
+
if found == 0
|
272
|
+
mesg << '<C>There is no appointment for %02d/%02d/%d' % [calendar.day, calendar.month, calendar.year]
|
273
|
+
mesg << '<C><#HL(30)>'
|
274
|
+
mesg << '<C>Press space to continue.'
|
275
|
+
end
|
276
|
+
|
277
|
+
# Create the label widget
|
278
|
+
label = RNDK::LABEL.new(calendar.screen, RNDK::CENTER, RNDK::CENTER, mesg, mesg.size, true, false)
|
279
|
+
label.draw(label.box)
|
280
|
+
label.wait(' ')
|
281
|
+
label.destroy
|
282
|
+
|
283
|
+
# Redraw the calendar
|
284
|
+
calendar.draw(calendar.box)
|
285
|
+
return false
|
286
|
+
end
|
287
|
+
|
288
|
+
# Shows a help popup with keybindings.
|
289
|
+
show_help = lambda do |object_type, calendar, info, key|
|
290
|
+
msg = ["Keybindings:",
|
291
|
+
" 'm' create appointment at selected day",
|
292
|
+
" 'r' remove appointment at selected day",
|
293
|
+
" '?' displays appointment for selected day",
|
294
|
+
" 'enter' or 'tab' quits"]
|
295
|
+
|
296
|
+
rndkscreen.popupLabel msg
|
297
|
+
end
|
298
|
+
|
299
|
+
# Now we bind actions to the calendar.
|
300
|
+
# Create a key binding to mark days on the calendar.
|
301
|
+
calendar.bind(:CALENDAR, 'm', create_calendar_mark_cb, appointment_info)
|
302
|
+
calendar.bind(:CALENDAR, 'M', create_calendar_mark_cb, appointment_info)
|
303
|
+
calendar.bind(:CALENDAR, 'r', remove_calendar_mark_cb, appointment_info)
|
304
|
+
calendar.bind(:CALENDAR, 'R', remove_calendar_mark_cb, appointment_info)
|
305
|
+
calendar.bind(:CALENDAR, '?', display_calendar_mark_cb, appointment_info)
|
306
|
+
calendar.bind(:CALENDAR, 'h', show_help, nil)
|
307
|
+
|
308
|
+
# Set all the appointments read from the file.
|
309
|
+
appointment_info.appointment.each do |appointment|
|
310
|
+
marker = Appointment::GPAppointmentAttributes[Appointment::AppointmentType.index(appointment.type)]
|
311
|
+
|
312
|
+
calendar.setMarker(appointment.day,
|
313
|
+
appointment.month,
|
314
|
+
appointment.year,
|
315
|
+
marker)
|
316
|
+
end
|
317
|
+
|
318
|
+
# Draw the calendar widget.
|
319
|
+
calendar.draw(calendar.box)
|
320
|
+
|
321
|
+
# Let the user play with the widget.
|
322
|
+
calendar.activate([])
|
323
|
+
|
324
|
+
# Save the appointment information.
|
325
|
+
Appointment.saveAppointmentFile(filename, appointment_info)
|
326
|
+
|
327
|
+
# Clean up.
|
328
|
+
calendar.destroy
|
329
|
+
rndkscreen.destroy
|
330
|
+
RNDK::Screen.end_rndk
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
|
335
|
+
begin
|
336
|
+
Appointment.main
|
337
|
+
|
338
|
+
# In case something goes wrong
|
339
|
+
rescue Exception => e
|
340
|
+
RNDK::Screen.end_rndk
|
341
|
+
|
342
|
+
puts e
|
343
|
+
puts e.inspect
|
344
|
+
puts e.backtrace
|
345
|
+
end
|
346
|
+
|