pomo-ruby 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,11 @@
1
+ =Pomo-ruby
2
+ Pomo-ruby is an standalone application written in Ruby/GTK with simple GUI to manage your time based on the Pomodoro technique.
3
+ It was developed under the need of an application as such for GNU/Linux.
4
+
5
+ =Install on Ubuntu / Linux
6
+
7
+ sudo aptitude install libgtk2-ruby
8
+ sudo gem install pomo-ruby
9
+
10
+ =Running
11
+ pomo-ruby
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "pomo-ruby"
5
+ gemspec.summary = "A simple application to run your Pomodoros in linux writen in GTK."
6
+ gemspec.description = "Pomo-ruby is an standalone application written in Ruby/GTK with simple GUI to manage your time based on the Pomodoro technique."
7
+
8
+ gemspec.email = "pedro.capaca@gmail.com"
9
+ gemspec.homepage = "http://github.com/capaca/pomo-ruby"
10
+ gemspec.authors = ["Pedro Dias"]
11
+ end
12
+ rescue LoadError
13
+ puts "Jeweler not available. Install it with: gem install jeweler"
14
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3
data/bin/pomo-ruby ADDED
@@ -0,0 +1,2 @@
1
+ require 'rubygems'
2
+ require 'pomo_ruby'
@@ -0,0 +1,42 @@
1
+ class CycleRunner
2
+
3
+ def initialize cycles, pomodoro_time, pause_time, break_time
4
+ @timer_pomodoro = Timer.new pomodoro_time
5
+ @timer_pause = Timer.new pause_time
6
+ @timer_break = Timer.new break_time
7
+ @cycles = cycles
8
+ end
9
+
10
+ def run
11
+ @thread = Thread.new do
12
+ begin
13
+ @cycles.times do |i|
14
+ Window.instance.pop_up
15
+ @timer_pomodoro.run
16
+
17
+ if i + 1 != @cycles
18
+ Window.instance.panel.button_start.label = "Time for a litle pause..."
19
+ Window.instance.pop_up
20
+ @timer_pause.run
21
+ end
22
+ end
23
+ Window.instance.panel.button_start.label = "Now it's time to rest..."
24
+ Window.instance.pop_up
25
+ @timer_break.run
26
+ rescue => e
27
+ puts e
28
+ Thread.stop
29
+ end
30
+ Window.instance.pop_up
31
+ Window.instance.panel.button_start.enable
32
+ end
33
+
34
+ end
35
+
36
+ def stop
37
+ @thread.kill
38
+ Window.instance.panel.button_start.enable
39
+ Window.instance.panel.progress_bar.text = "Canceled"
40
+ Window.instance.panel.progress_bar.fraction = 0
41
+ end
42
+ end
@@ -0,0 +1,17 @@
1
+ class InputValidator
2
+ def self.validate *args
3
+ args.each do |arg|
4
+ unless validate_integer arg
5
+ return false
6
+ end
7
+ end
8
+ true
9
+ end
10
+
11
+ def self.validate_integer str
12
+ if str.to_i > 0
13
+ return true
14
+ end
15
+ false
16
+ end
17
+ end
data/lib/core/timer.rb ADDED
@@ -0,0 +1,50 @@
1
+ class Timer
2
+
3
+ # Initialize de timer informing how much time it must take in SECONDS
4
+ def initialize duration
5
+ @duration = duration
6
+ end
7
+
8
+ def run
9
+ @now = Time.now.to_i
10
+ @future = @now + @duration
11
+
12
+ while @now < @future
13
+ @now = Time.now.to_i
14
+ Window.instance.panel.progress_bar.fraction = fraction
15
+ Window.instance.panel.progress_bar.text = "Remaining time: #{remaining_time}"
16
+ sleep 1
17
+ end
18
+ end
19
+
20
+ def diference
21
+ @future - @now
22
+ end
23
+
24
+ def fraction
25
+ diference.to_f/@duration
26
+ end
27
+
28
+ def minutes
29
+ (diference/60).to_i
30
+ end
31
+
32
+ def seconds
33
+ seconds = (diference % 60).to_i
34
+ end
35
+
36
+ def add_leadind_zero integer
37
+ if integer.to_s.length == 1
38
+ return "0#{integer}"
39
+ end
40
+
41
+ integer.to_s
42
+ end
43
+
44
+ def remaining_time
45
+ minutes_str = add_leadind_zero minutes
46
+ seconds_str = add_leadind_zero seconds
47
+ "#{minutes_str}:#{seconds_str}"
48
+ end
49
+
50
+ end
@@ -0,0 +1,17 @@
1
+ class ButtonCancel < Gtk::Button
2
+
3
+ def initialize text
4
+ super text
5
+
6
+ @text = text
7
+ add_click_event
8
+ end
9
+
10
+ private
11
+
12
+ def add_click_event
13
+ self.signal_connect "clicked" do
14
+ Window.instance.panel.button_start.runner.stop
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,47 @@
1
+ class ButtonStart < Gtk::Button
2
+
3
+ attr_reader :runner
4
+
5
+ def initialize text
6
+ super text
7
+
8
+ @text = text
9
+ add_click_event
10
+ end
11
+
12
+ def disable text
13
+ self.sensitive = false
14
+ self.label = text
15
+ end
16
+
17
+ def enable
18
+ self.sensitive = true
19
+ self.label = @text
20
+ end
21
+
22
+ private
23
+
24
+ def add_click_event
25
+ self.signal_connect "clicked" do
26
+ cycles = break_time = Window.instance.panel.tf_cycles.text.to_i
27
+
28
+ pomodoro_time = Window.instance.panel.tf_pomodoro.text.to_i
29
+ pomodoro_time *= 60
30
+
31
+ pause_time = Window.instance.panel.tf_pause.text.to_i
32
+ pause_time *= 60
33
+
34
+ break_time = Window.instance.panel.tf_pause.text.to_i
35
+ break_time *= 60
36
+
37
+ unless InputValidator.validate pomodoro_time, pause_time, break_time, cycles
38
+ Window.instance.show_warning_dialog "Please, inform valid data for the pomodoro cycle."
39
+ else
40
+ disable "Running pomodoro..."
41
+
42
+ @runner = CycleRunner.new cycles, pomodoro_time, pause_time, break_time
43
+ @runner.run
44
+ end
45
+ end
46
+ end
47
+ end
data/lib/gui/panel.rb ADDED
@@ -0,0 +1,29 @@
1
+ class Panel < Gtk::VBox
2
+
3
+ attr_reader :tf_pomodoro, :tf_pause, :tf_break, :tf_cycles,
4
+ :hb_start, :progress_bar, :button_start
5
+
6
+ def initialize
7
+ super true, 2
8
+
9
+ @tf_pomodoro = TextField.new "Pomodoro time: ", "25"
10
+ @tf_pause = TextField.new "Pause time: ", "5"
11
+ @tf_break = TextField.new "Break time: ", "30"
12
+ @tf_cycles = TextField.new "How many pomodoros until break? ", "2"
13
+ @hb_buttons = Gtk::HBox.new true, 10
14
+ @button_start = ButtonStart.new "Start!"
15
+ @button_cancel = ButtonCancel.new "Cancel"
16
+ @progress_bar = ProgressBar.new
17
+
18
+ @hb_buttons.add @button_start
19
+ @hb_buttons.add @button_cancel
20
+
21
+ self.add @tf_pomodoro
22
+ self.add @tf_pause
23
+ self.add @tf_break
24
+ self.add @tf_cycles
25
+ self.add @hb_buttons
26
+ self.add @progress_bar
27
+ end
28
+
29
+ end
@@ -0,0 +1,8 @@
1
+ class ProgressBar < Gtk::ProgressBar
2
+
3
+ def initialize
4
+ super
5
+ self.fraction = 0
6
+ end
7
+
8
+ end
@@ -0,0 +1,18 @@
1
+ class TextField < Gtk::HBox
2
+
3
+ def initialize label_text, value
4
+ super true, 10
5
+
6
+ @label = Gtk::Label.new label_text
7
+ @entry = Gtk::Entry.new
8
+ @entry.text = value
9
+
10
+ self.add @label
11
+ self.add @entry
12
+ end
13
+
14
+ def text
15
+ @entry.text
16
+ end
17
+
18
+ end
data/lib/gui/window.rb ADDED
@@ -0,0 +1,58 @@
1
+ class Window < Gtk::Window
2
+
3
+ include Singleton
4
+
5
+ attr_reader :panel
6
+
7
+ def initialize title = "Pomo-ruby"
8
+ super
9
+
10
+ @panel = Panel.new
11
+
12
+ self.add panel
13
+ self.show_all
14
+ self.title = title
15
+ self.allow_grow = false
16
+ self.window_position = Gtk::Window::POS_CENTER_ALWAYS
17
+
18
+ icon_path = File.dirname(__FILE__)+"/../images/tomato.png"
19
+
20
+ self.icon = Gdk::Pixbuf.new icon_path
21
+
22
+ add_close_event
23
+ end
24
+
25
+ def pop_up
26
+ self.keep_above = true
27
+ self.keep_above = false
28
+ end
29
+
30
+ def show_warning_dialog message
31
+ dialog = create_warning_dialog message
32
+ dialog.run
33
+ dialog.destroy
34
+ end
35
+
36
+ private
37
+
38
+ def create_warning_dialog message
39
+ dialog = Gtk::MessageDialog.new(
40
+ self,
41
+ Gtk::Dialog::MODAL,
42
+ Gtk::MessageDialog::WARNING,
43
+ Gtk::MessageDialog::BUTTONS_CLOSE,
44
+ message
45
+ )
46
+
47
+ dialog.window_position = Gtk::Window::POS_CENTER_ALWAYS
48
+ dialog
49
+ end
50
+
51
+ def add_close_event
52
+ self.signal_connect "destroy" do
53
+ puts "Exiting pomo-ruby..."
54
+ Gtk.main_quit
55
+ end
56
+ end
57
+
58
+ end
Binary file
Binary file
Binary file
data/lib/pomo_ruby.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'singleton'
2
+ require 'gtk2'
3
+ require 'core/timer'
4
+ require 'core/cycle_runner'
5
+ require 'core/input_validator'
6
+ require 'gui/button_start'
7
+ require 'gui/button_cancel'
8
+ require 'gui/text_field'
9
+ require 'gui/panel'
10
+ require 'gui/window'
11
+ require 'gui/progress_bar'
12
+
13
+ window = Window.instance
14
+ Gtk.main
data/pomo-ruby.gemspec ADDED
@@ -0,0 +1,56 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{pomo-ruby}
8
+ s.version = "0.0.3"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Pedro Dias"]
12
+ s.date = %q{2010-10-23}
13
+ s.default_executable = %q{pomo-ruby}
14
+ s.description = %q{Pomo-ruby is an standalone application written in Ruby/GTK with simple GUI to manage your time based on the Pomodoro technique.}
15
+ s.email = %q{pedro.capaca@gmail.com}
16
+ s.executables = ["pomo-ruby"]
17
+ s.extra_rdoc_files = [
18
+ "README.rdoc"
19
+ ]
20
+ s.files = [
21
+ "README.rdoc",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "bin/pomo-ruby",
25
+ "lib/core/cycle_runner.rb",
26
+ "lib/core/input_validator.rb",
27
+ "lib/core/timer.rb",
28
+ "lib/gui/button_cancel.rb",
29
+ "lib/gui/button_start.rb",
30
+ "lib/gui/panel.rb",
31
+ "lib/gui/progress_bar.rb",
32
+ "lib/gui/text_field.rb",
33
+ "lib/gui/window.rb",
34
+ "lib/images/tomato.ico",
35
+ "lib/images/tomato.jpg",
36
+ "lib/images/tomato.png",
37
+ "lib/pomo_ruby.rb",
38
+ "pomo-ruby.gemspec"
39
+ ]
40
+ s.homepage = %q{http://github.com/capaca/pomo-ruby}
41
+ s.rdoc_options = ["--charset=UTF-8"]
42
+ s.require_paths = ["lib"]
43
+ s.rubygems_version = %q{1.3.7}
44
+ s.summary = %q{A simple application to run your Pomodoros in linux writen in GTK.}
45
+
46
+ if s.respond_to? :specification_version then
47
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ else
52
+ end
53
+ else
54
+ end
55
+ end
56
+
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pomo-ruby
3
+ version: !ruby/object:Gem::Version
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 3
10
+ version: 0.0.3
11
+ platform: ruby
12
+ authors:
13
+ - Pedro Dias
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-23 00:00:00 -02:00
19
+ default_executable: pomo-ruby
20
+ dependencies: []
21
+
22
+ description: Pomo-ruby is an standalone application written in Ruby/GTK with simple GUI to manage your time based on the Pomodoro technique.
23
+ email: pedro.capaca@gmail.com
24
+ executables:
25
+ - pomo-ruby
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.rdoc
30
+ files:
31
+ - README.rdoc
32
+ - Rakefile
33
+ - VERSION
34
+ - bin/pomo-ruby
35
+ - lib/core/cycle_runner.rb
36
+ - lib/core/input_validator.rb
37
+ - lib/core/timer.rb
38
+ - lib/gui/button_cancel.rb
39
+ - lib/gui/button_start.rb
40
+ - lib/gui/panel.rb
41
+ - lib/gui/progress_bar.rb
42
+ - lib/gui/text_field.rb
43
+ - lib/gui/window.rb
44
+ - lib/images/tomato.ico
45
+ - lib/images/tomato.jpg
46
+ - lib/images/tomato.png
47
+ - lib/pomo_ruby.rb
48
+ - pomo-ruby.gemspec
49
+ has_rdoc: true
50
+ homepage: http://github.com/capaca/pomo-ruby
51
+ licenses: []
52
+
53
+ post_install_message:
54
+ rdoc_options:
55
+ - --charset=UTF-8
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ requirements: []
77
+
78
+ rubyforge_project:
79
+ rubygems_version: 1.3.7
80
+ signing_key:
81
+ specification_version: 3
82
+ summary: A simple application to run your Pomodoros in linux writen in GTK.
83
+ test_files: []
84
+